Технический форум по робототехнике.
EdGull » 23 ноя 2009, 10:34
Т.к. разработка механики на основе автомобильного пылесоса подходит к концу
viewtopic.php?f=58&t=6794 , то пора писать код.
Здесь будем выкладывать все этапы программирования робота-пылесоса.
За основу будет браться заводская тестовая прошивка, но переносить будем по частям.
Допускаются небольшие обсуждения, но только в свете кода.
Категориеские запрещен троллинг, филосовствование и т.д.
И так, что хотелось бы сделать:
1. Управление с ИК-пульта по прерываниям
2. Запись и исполнение программ с пришедших с пульта
3. Поиск зарядки
yak-40 » 23 ноя 2009, 11:12
3. Поиск зарядки
Каков тип зарядки будет использоваться. В смысле на МК или нет?
EdGull » 23 ноя 2009, 11:18
С зарядных усов пойдет на свинец и на 7806 для МАх1555
Свинцовый будет заряжаться 14В через лампочку (ламочка на базе)
Литиевый будет заряжаться стандартными средствами т.е. МАХ1555
Duhas » 23 ноя 2009, 11:38
речь о наличии МК в зарядке для задачи навигации на зарядку, имхо...
yak-40 » 23 ноя 2009, 11:40
Понял. Но я имел ввиду не это. Принцип, как пылесос будет находить базу. По ИК лучу или с помощью видеокамеры или ещё как. От этого код зависит. И будет ли пылесос контролировать степень заряда аккумов стоя на зарядке чтобы знать: аккумулятор заряжен, можно продолжать работу.
Добавлено спустя 1 минуту 8 секунд:речь о наличии МК в зарядке для задачи навигации на зарядку, имхо...
Угу.
avr123.nm.ru » 23 ноя 2009, 12:01
115200 это не слишком большая скорость ?
EdGull » 23 ноя 2009, 13:30
На базе естественно буде стоять МК
Заход будет по одному из вариантов:
1. ИК
2. ИК-УЗ
3. Видеокамера по методу
Michael_KВ Миниботе естественно есть датчики напряжениея на акб.
Добавлено спустя 1 минуту 5 секунд:а почему ты решил что большая? помоему обычная.
процент ошибок на этой частоте 0%
Добавлено спустя 1 час 25 минут 27 секунд:дополнительная платка для того чтобы из стандартной электроники МиниБота получился робот-пылесос
Duhas » 23 ноя 2009, 13:35
включалка турбины ?
EdGull » 23 ноя 2009, 13:39
ага
и измерилка напруги свинцового акб.
MiBBiM » 23 ноя 2009, 14:34
управление с пульта по прерыванию на основе кода Александра.
- Код: Выделить всё • Развернуть
'$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 секунд:команды может в еппром складывать? ведь для пылесоса карточку врядли стоит покупать

EdGull » 23 ноя 2009, 14:40
я конечно вечером проверю, но вчера его код не работал
поэтому и написал потупому
galex1981 » 23 ноя 2009, 14:42
Эд, код проверил - работает
EdGull » 23 ноя 2009, 14:47
буду проверять еще раз
EdGull » 24 ноя 2009, 00:06
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
он нашел мои ошибки
исправленный код
- Код: Выделить всё • Развернуть
'$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
EdGull » 24 ноя 2009, 10:46
итак, первый пункт пройден.
теперь нужно "Запись и исполнение программ с пришедших с ИК-пульта"
отсюда вопрос, в чём будем измерять попугаев?
Добавлено спустя 11 минут 56 секунд:
какие у нас есть варианты?:
1. милисекунды
2. тики
3. по тикам энкодеров (которых у нас нет)
4. по количеству принятых команд
5. что еще?