roboforum.ru

Технический форум по робототехнике.
Текущее время: 21 фев 2025, 18:11

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 57 ]  На страницу 1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения: Код робота-пылесоса версия 1.х
СообщениеДобавлено: 23 ноя 2009, 10:34 
Не в сети
Аватара пользователя

Зарегистрирован: 28 дек 2004, 20:33
Сообщения: 10211
Откуда: Тольятти
Skype: Ed_Gull
прог. языки: Bascom AVR Basic
ФИО: Гуль Эдуард Викторович
Т.к. разработка механики на основе автомобильного пылесоса подходит к концу viewtopic.php?f=58&t=6794 , то пора писать код.
Здесь будем выкладывать все этапы программирования робота-пылесоса.
За основу будет браться заводская тестовая прошивка, но переносить будем по частям.

Допускаются небольшие обсуждения, но только в свете кода.
Категориеские запрещен троллинг, филосовствование и т.д.

И так, что хотелось бы сделать:
1. Управление с ИК-пульта по прерываниям
2. Запись и исполнение программ с пришедших с пульта
3. Поиск зарядки


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Первый код робота-пылесоса
СообщениеДобавлено: 23 ноя 2009, 11:12 
Не в сети
Аватара пользователя

Зарегистрирован: 23 окт 2007, 22:03
Сообщения: 3037
Откуда: Москва
прог. языки: С
ФИО: Евгений Яковец
Цитата:
3. Поиск зарядки

Каков тип зарядки будет использоваться. В смысле на МК или нет?

_________________
- Этот человек - не человек! это робот!
- Как? уже делают?!
- Делают!!!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Первый код робота-пылесоса
СообщениеДобавлено: 23 ноя 2009, 11:18 
Не в сети
Аватара пользователя

Зарегистрирован: 28 дек 2004, 20:33
Сообщения: 10211
Откуда: Тольятти
Skype: Ed_Gull
прог. языки: Bascom AVR Basic
ФИО: Гуль Эдуард Викторович
С зарядных усов пойдет на свинец и на 7806 для МАх1555
Свинцовый будет заряжаться 14В через лампочку (ламочка на базе)
Литиевый будет заряжаться стандартными средствами т.е. МАХ1555


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Первый код робота-пылесоса
СообщениеДобавлено: 23 ноя 2009, 11:38 
Не в сети
Аватара пользователя

Зарегистрирован: 15 сен 2007, 13:03
Сообщения: 6338
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович
речь о наличии МК в зарядке для задачи навигации на зарядку, имхо...

_________________
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Первый код робота-пылесоса
СообщениеДобавлено: 23 ноя 2009, 11:40 
Не в сети
Аватара пользователя

Зарегистрирован: 23 окт 2007, 22:03
Сообщения: 3037
Откуда: Москва
прог. языки: С
ФИО: Евгений Яковец
Понял. Но я имел ввиду не это. Принцип, как пылесос будет находить базу. По ИК лучу или с помощью видеокамеры или ещё как. От этого код зависит. И будет ли пылесос контролировать степень заряда аккумов стоя на зарядке чтобы знать: аккумулятор заряжен, можно продолжать работу.

Добавлено спустя 1 минуту 8 секунд:
Цитата:
речь о наличии МК в зарядке для задачи навигации на зарядку, имхо...
Угу.

_________________
- Этот человек - не человек! это робот!
- Как? уже делают?!
- Делают!!!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Первый код робота-пылесоса
СообщениеДобавлено: 23 ноя 2009, 12:01 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
115200 это не слишком большая скорость ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Первый код робота-пылесоса
СообщениеДобавлено: 23 ноя 2009, 13:30 
Не в сети
Аватара пользователя

Зарегистрирован: 28 дек 2004, 20:33
Сообщения: 10211
Откуда: Тольятти
Skype: Ed_Gull
прог. языки: Bascom AVR Basic
ФИО: Гуль Эдуард Викторович
На базе естественно буде стоять МК
Заход будет по одному из вариантов:
1. ИК
2. ИК-УЗ
3. Видеокамера по методу Michael_K
В Миниботе естественно есть датчики напряжениея на акб.

Добавлено спустя 1 минуту 5 секунд:
а почему ты решил что большая? помоему обычная.
процент ошибок на этой частоте 0%

Добавлено спустя 1 час 25 минут 27 секунд:
дополнительная платка для того чтобы из стандартной электроники МиниБота получился робот-пылесос

Вложение:
1.PNG
1.PNG [ 15.96 КиБ | Просмотров: 3552 ]


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Первый код робота-пылесоса
СообщениеДобавлено: 23 ноя 2009, 13:35 
Не в сети
Аватара пользователя

Зарегистрирован: 15 сен 2007, 13:03
Сообщения: 6338
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович
включалка турбины ?

_________________
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Первый код робота-пылесоса
СообщениеДобавлено: 23 ноя 2009, 13:39 
Не в сети
Аватара пользователя

Зарегистрирован: 28 дек 2004, 20:33
Сообщения: 10211
Откуда: Тольятти
Skype: Ed_Gull
прог. языки: Bascom AVR Basic
ФИО: Гуль Эдуард Викторович
ага
и измерилка напруги свинцового акб.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Первый код робота-пылесоса
СообщениеДобавлено: 23 ноя 2009, 14:34 
Не в сети
Аватара пользователя

Зарегистрирован: 29 окт 2007, 18:11
Сообщения: 1866
Откуда: Пермь
прог. языки: Brainfuck/Basic/Delphi/C++/Lisp/x86asm/JavaScript
управление с пульта по прерыванию на основе кода Александра.
Код:
'$prog &HFF , &HBD , &HC9 , &H00
$regfile = "m32def.dat"                                     ' файл спецификации Меги32
$crystal = 7372800                                          ' указываем на какой частоте будем работать
$baud = 115200


Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Config Pinc.2 = Output : Drl Alias Portc.2                  'ногу сконфигурировали как выход и обозвали Drl
Config Pinc.3 = Output : Drr Alias Portc.3                  'ногу сконфигурировали как выход и обозвали Drr
Config Pind.4 = Output                                      'ногу ШИМа левого движка сконфигурировали как выход
Config Pind.5 = Output                                      'ногу ШИМа правого движка  сконфигурировали как выход

Config Pinc.4 = Output : Led_1red Alias Portc.4
Config Pinc.5 = Output : Led_1green Alias Portc.5
Config Pinc.6 = Output : Led_2red Alias Portc.6
Config Pinc.7 = Output : Led_2green Alias Portc.7

Config Pind.2 = Input : Knopka Alias Pind.2
Config Pinb.2 = Input : Power_in Alias Pinb.2

Config Pind.7 = Output : Portd.7 = 0                        ' динамик

' Прерывание по спаду уровня для обработки команд RC5
Config Int1 = Falling
On Int1 Learn_rc5
Enable Int1
Config Rc5 = Pind.3

' Глобальные переменные
Dim Speed As Byte : Speed = 250
Dim Address_rc5 As Byte , Command_rc5 As Byte
Dim Adc_temp As Word , Akb As Single
Dim Errbyte As Byte

' Процедуры
Declare Sub Processcommand()

' Запуск
Enable Interrupts

Waitms 200
Print "Start MiniBot v2.1"



Do

Loop


Прямо:
   Gosub Стоп : Waitms 10
   Drl = 1 : Drr = 0 : Pwm1b = Speed : Pwm1a = Speed:
Return

Назад:
   Gosub Стоп : Waitms 10
   Drl = 0 : Drr = 1 : Pwm1b = Speed : Pwm1a = Speed:
Return

Влево:
   Gosub Стоп : Waitms 10
   Drl = 0 : Drr = 0 : Pwm1b = Speed : Pwm1a = Speed:
Return

Вправо:
   Gosub Стоп : Waitms 10
   Drl = 1 : Drr = 1 : Pwm1b = Speed : Pwm1a = Speed:
Return

Стоп:
   Drl = 0 : Drr = 0 : Pwm1b = 0 : Pwm1a = 0:
Return


Learn_rc5:
   Disable Int1
   Enable Interrupts
   Getrc5(address_rc5 , Command_rc5)
   Enable Interrupts
   If Address_rc5 <> 255 And Command_rc5 <> 255 Then
      Command_rc5 = Command_rc5 And &B01111111
      Print Chr(12);
      Print "Address - " ; Address_rc5
      Print "Command - " ; Command_rc5
   End If
  ' обработка команды
  Gosub Processcommand
  Gifr = Gifr Or &B10000000                                 'Clear Flag Int1
  Enable Int1
Return

Sub Processcommand()
   Select Case Command_rc5
      Case 32:
         Gosub Прямо
      Case 33:
         Gosub Назад
      Case 17:
         Gosub Влево
      Case 16:
         Gosub Вправо
      Case 12:
         Gosub Стоп
      Case Else:
         ' ни одна из вышеперечисленных кнопок
   End Select
End Sub


Добавлено спустя 8 минут 59 секунд:
команды может в еппром складывать? ведь для пылесоса карточку врядли стоит покупать :unknown:

_________________
Tomorrow will be. Better


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Первый код робота-пылесоса
СообщениеДобавлено: 23 ноя 2009, 14:40 
Не в сети
Аватара пользователя

Зарегистрирован: 28 дек 2004, 20:33
Сообщения: 10211
Откуда: Тольятти
Skype: Ed_Gull
прог. языки: Bascom AVR Basic
ФИО: Гуль Эдуард Викторович
я конечно вечером проверю, но вчера его код не работал
поэтому и написал потупому


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Первый код робота-пылесоса
СообщениеДобавлено: 23 ноя 2009, 14:42 
Не в сети
Аватара пользователя

Зарегистрирован: 04 дек 2008, 22:44
Сообщения: 4363
Откуда: Камышин
Skype: galk-aleksandr1
прог. языки: Kotlin, Java, C, C++, Assm, BasCom, VB, php
ФИО: Галкин Александр Владимирович
Эд, код проверил - работает

_________________
if(!Operate) Read(pDatasheet);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Первый код робота-пылесоса
СообщениеДобавлено: 23 ноя 2009, 14:47 
Не в сети
Аватара пользователя

Зарегистрирован: 28 дек 2004, 20:33
Сообщения: 10211
Откуда: Тольятти
Skype: Ed_Gull
прог. языки: Bascom AVR Basic
ФИО: Гуль Эдуард Викторович
буду проверять еще раз


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Первый код робота-пылесоса
СообщениеДобавлено: 24 ноя 2009, 00:06 
Не в сети
Аватара пользователя

Зарегистрирован: 28 дек 2004, 20:33
Сообщения: 10211
Откуда: Тольятти
Skype: Ed_Gull
прог. языки: Bascom AVR Basic
ФИО: Гуль Эдуард Викторович
MiBBiM проверил, твой код работает.
Значит от него дальше и пляшем.

Добавлено спустя 3 часа 15 минут 25 секунд:
Почему если пылесос едет прямо и получает команду "налево", он поворачивает и останавливается, хотя должен продолжить ехать прямо?

Код:
'$prog &HFF , &HBD , &HC9 , &H00
$regfile = "m32def.dat"                                     ' файл спецификации Меги32
$crystal = 7372800                                          ' указываем на какой частоте будем работать
$baud = 115200


Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Config Pinc.2 = Output : Drl Alias Portc.2                  'ногу сконфигурировали как выход и обозвали Drl
Config Pinc.3 = Output : Drr Alias Portc.3                  'ногу сконфигурировали как выход и обозвали Drr
Config Pind.4 = Output                                      'ногу ШИМа левого движка сконфигурировали как выход
Config Pind.5 = Output                                      'ногу ШИМа правого движка  сконфигурировали как выход

Config Pinc.4 = Output : Led_1red Alias Portc.4
Config Pinc.5 = Output : Led_1green Alias Portc.5
Config Pinc.6 = Output : Led_2red Alias Portc.6
Config Pinc.7 = Output : Led_2green Alias Portc.7

Config Pind.2 = Input : Knopka Alias Pind.2
Config Pinb.2 = Input : Power_in Alias Pinb.2

Config Pind.7 = Output : Portd.7 = 0                        ' динамик

' Прерывание по спаду уровня для обработки команд RC5
Config Int1 = Falling
On Int1 Learn_rc5
Enable Int1
Config Rc5 = Pind.3

' Глобальные переменные
Dim Speed As Byte : Speed = 250
Dim Address_rc5 As Byte , Command_rc5 As Byte
Dim Adc_temp As Word , Akb As Single
Dim Errbyte As Byte
Dim Направление As Byte                                       ' 0=стоп, 1=прямо, 2=назад

' Процедуры
Declare Sub Processcommand()

' Запуск
Enable Interrupts

Waitms 200
Print "Start MiniBot v2.1"


'Gosub Прямо : Waitms 1000
'Gosub Назад : Waitms 1000
'Gosub Влево : Waitms 1000
'Gosub Вправо : Waitms 1000


Do
   Idle
Loop


Прямо:
   Gosub Стоп : Waitms 10
   Drl = 1 : Drr = 0 : Pwm1b = Speed : Pwm1a = Speed:
   Направление = 1
Return

Назад:
   Gosub Стоп : Waitms 500
   Drl = 0 : Drr = 1 : Pwm1b = Speed : Pwm1a = Speed:
   Направление = 2
Return

Влево:
   Gosub Стоп : Waitms 10
   Drl = 0 : Drr = 0 : Pwm1b = Speed : Pwm1a = Speed : Waitms 100
   If Направление = 1 Then Gosub Прямо
   If Направление = 2 Then Gosub Назад
   If Направление = 0 Then Gosub Стоп
Return

Вправо:
   Gosub Стоп : Waitms 10
   Drl = 1 : Drr = 1 : Pwm1b = Speed : Pwm1a = Speed : Waitms 100
   If Направление = 1 Then Gosub Прямо
   If Направление = 2 Then Gosub Назад
   If Направление = 0 Then Gosub Стоп
Return

Стоп:
   Drl = 0 : Drr = 0 : Pwm1b = 0 : Pwm1a = 0:
   Направление = 0
Return


Learn_rc5:
   Disable Int1
   Enable Interrupts
   Getrc5(address_rc5 , Command_rc5)
   Enable Interrupts
   If Address_rc5 <> 255 And Command_rc5 <> 255 Then
      Command_rc5 = Command_rc5 And &B01111111
      Print Chr(12);
      'Print "IR_Address - " ; Address_rc5
      Print "IR_command - " ; Command_rc5
   End If
  ' обработка команды
  Gosub Processcommand
  Gifr = Gifr Or &B10000000                                 'Clear Flag Int1
  Enable Int1
Return

Sub Processcommand()
   Select Case Command_rc5
      Case 32:
         Gosub Прямо
      Case 33:
         Gosub Назад
      Case 17:
         Gosub Влево
      Case 16:
         Gosub Вправо
      Case 12:
         Gosub Стоп
      Case Else:
         ' ни одна из вышеперечисленных кнопок
   End Select
End Sub


Добавлено спустя 34 минуты 57 секунд:
Спасибо UriShap :friends:
он нашел мои ошибки
исправленный код

Код:
'$prog &HFF , &HBD , &HC9 , &H00
$regfile = "m32def.dat"                                     ' файл спецификации Меги32
$crystal = 7372800                                          ' указываем на какой частоте будем работать
$baud = 115200


Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Config Pinc.2 = Output : Drl Alias Portc.2                  'ногу сконфигурировали как выход и обозвали Drl
Config Pinc.3 = Output : Drr Alias Portc.3                  'ногу сконфигурировали как выход и обозвали Drr
Config Pind.4 = Output                                      'ногу ШИМа левого движка сконфигурировали как выход
Config Pind.5 = Output                                      'ногу ШИМа правого движка  сконфигурировали как выход

Config Pinc.4 = Output : Led_1red Alias Portc.4
Config Pinc.5 = Output : Led_1green Alias Portc.5
Config Pinc.6 = Output : Led_2red Alias Portc.6
Config Pinc.7 = Output : Led_2green Alias Portc.7

Config Pind.2 = Input : Knopka Alias Pind.2
Config Pinb.2 = Input : Power_in Alias Pinb.2

Config Pind.7 = Output : Portd.7 = 0                        ' динамик

' Прерывание по спаду уровня для обработки команд RC5
Config Int1 = Falling
On Int1 Learn_rc5
Enable Int1
Config Rc5 = Pind.3

' Глобальные переменные
Dim Speed As Byte : Speed = 250
Dim Address_rc5 As Byte , Command_rc5 As Byte
Dim Adc_temp As Word , Akb As Single
Dim Errbyte As Byte
Dim Направление As Byte                                       ' 0=стоп, 1=прямо, 2=назад

' Процедуры
Declare Sub Processcommand()

' Запуск
Enable Interrupts

Waitms 200
Print "Start MiniBot v2.1"


'Gosub Прямо : Waitms 1000
'Gosub Назад : Waitms 1000
'Gosub Влево : Waitms 1000
'Gosub Вправо : Waitms 1000


Do
   Idle
Loop


Прямо:
   Drl = 0 : Drr = 0 : Pwm1b = 0 : Pwm1a = 0 : Waitms 10
   Gosub Стоп : Waitms 10
   Направление = 1
   Drl = 1 : Drr = 0 : Pwm1b = Speed : Pwm1a = Speed:
Return

Назад:
   Drl = 0 : Drr = 0 : Pwm1b = 0 : Pwm1a = 0: waitms 10
   Gosub Стоп : Waitms 500
   Направление = 2
   Drl = 0 : Drr = 1 : Pwm1b = Speed : Pwm1a = Speed:
Return

Влево:
   Drl = 0 : Drr = 0 : Pwm1b = 0 : Pwm1a = 0: waitms 10
   Drl = 0 : Drr = 0 : Pwm1b = Speed : Pwm1a = Speed : Waitms 100
   If Направление = 1 Then Gosub Прямо
   If Направление = 2 Then Gosub Назад
   If Направление = 0 Then Gosub Стоп
Return

Вправо:
   Drl = 0 : Drr = 0 : Pwm1b = 0 : Pwm1a = 0: waitms 10
   Drl = 1 : Drr = 1 : Pwm1b = Speed : Pwm1a = Speed : Waitms 100
   If Направление = 1 Then Gosub Прямо
   If Направление = 2 Then Gosub Назад
   If Направление = 0 Then Gosub Стоп
Return

Стоп:
   Drl = 0 : Drr = 0 : Pwm1b = 0 : Pwm1a = 0:
   Направление = 0
Return


Learn_rc5:
   Disable Int1
   Enable Interrupts
   Getrc5(address_rc5 , Command_rc5)
   Enable Interrupts
   If Address_rc5 <> 255 And Command_rc5 <> 255 Then
      Command_rc5 = Command_rc5 And &B01111111
      Print Chr(12);
      'Print "IR_Address - " ; Address_rc5
      Print "IR_command - " ; Command_rc5
   End If
  ' обработка команды
  Gosub Processcommand
  Gifr = Gifr Or &B10000000                                 'Clear Flag Int1
  Enable Int1
Return

Sub Processcommand()
   Select Case Command_rc5
      Case 32:
         Gosub Прямо
      Case 33:
         Gosub Назад
      Case 17:
         Gosub Влево
      Case 16:
         Gosub Вправо
      Case 12:
         Gosub Стоп
      Case Else:
         ' ни одна из вышеперечисленных кнопок
   End Select
End Sub


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Первый код робота-пылесоса
СообщениеДобавлено: 24 ноя 2009, 10:46 
Не в сети
Аватара пользователя

Зарегистрирован: 28 дек 2004, 20:33
Сообщения: 10211
Откуда: Тольятти
Skype: Ed_Gull
прог. языки: Bascom AVR Basic
ФИО: Гуль Эдуард Викторович
итак, первый пункт пройден.
теперь нужно "Запись и исполнение программ с пришедших с ИК-пульта"
отсюда вопрос, в чём будем измерять попугаев?

Добавлено спустя 11 минут 56 секунд:
какие у нас есть варианты?:
1. милисекунды
2. тики
3. по тикам энкодеров (которых у нас нет)
4. по количеству принятых команд
5. что еще?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 57 ]  На страницу 1, 2, 3, 4  След.

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO