"Robbe"
|
|
Space | Дата: Воскресенье, 20.09.2009, 19:24 | Сообщение # 1 |
Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
| В самом низу сообщения, исходники в архиве Robbe Version 1.1..... И так этот проект был задуман уже давно. Но начал я его с тех пор как стал воять отдельные модули+приобрёл шарп (робо-контроллер, блок стабилизированного напряжения, драйвер двигателей(микросхема, реле)и это не всё. Есть ещё готовые модули, а не котрые пока только в моих фантазиях ))) ). Если порыскать на форуме, то можно найти не сколько тем, которые имеют прямое отношение к моему проекту. Например: Драйвер двигателей на реле, Будующий корпус, ИК-дальномер Sharp GP2Y0A02 (20-120см) Основные модули готовы, да и время на выходных появилось свободное. Вот и занялся на конец то. О целях проекта... - 1. Сделать корпус из ПВХ
- 2. Научить объезжать препятствия благодаря Шарпу
- 3. Контроль разряда акб
- 4. Забобахать ОС для Robbe.
- 5. Научить работать с флешкой(использовать в качестве хранения памяти).
- 6. Возможно сделать 4 колёсную платформу в дальнейшем, но врятле.
- 7. Добавить звуковых датчиков(микрофоны, динамики)
- 8. Добавить контактные бамперы. Ведь если откажут основные датчики, то бамперы это единственное с помощью чего робот не будет потерянным.
- 9. Написать программу для управления Robbe с компьютера по Bluetooth.
- 10. Написать удобную терминальную программу(с помощью delphi) для управления робби как по Bluetooth так и по Uart. Причём сделать всякие дополнительные табл. с выводом разных данных. Например Акб, температура среды, экран для обработки видео с робби и т.д.
Что из этого уже начал. А начал я со второго пункта. Так как ПВХ пока не купил. Ну собственно результаты есть. Хотя не совсем устраивают. Над программой надо работать ещё. Бывают глюки с задержками. Например повороты дольше чем надо длятся. Для любопытных : Основа: Code '******************************************************************************* ' Автор: Кирилл Игоревич (Space) ' Сайт: www.robptsspace.ucoz.ru ' Дата начала: 20.09.2009 г. ' CPU: ATmega16 ' Тактовая частота: 16000000 Hz ' Компилятор: BASCOM-AVR 1.11.9.0 ' Версия программы для Robbe 1.0 '******************************************************************************* ' Программируемые Fuse: ' SUT0 ' BOOTSZ0, BOOTSZ1 ' CKORT ' SPIEN '-------------------------------------------------------------------------------
$regfile = "m16def.dat" 'используем мк ATmega16 $crystal = 16000000 'частота кварцевого резонатора 16mHz
$include "config ports.bas"
$lib "lcd4.lbx" 'используем 4-х битное подключение дисплея с помощью альтернативной библиотеки
Cursor Off Cls '---------------------------------Переменные------------------------------------ Dim Minimum As Byte , Maximum As Byte , Center As Byte , Speed As Byte : Speed = 200 Dim X As Integer , I As Integer
Minimum = 80 : Maximum = 160 : Center = Maximum - Minimum 'подсчитываем разворот в градусах для сервопривода
Const Wait1 = 500 : Const Top = 30 : Const Top1 = 75 '-------------------------------------------------------------------------------
1: Do
Gosub Вперёд
For I = 30 To Top Step 10 X = Center + I Servo(1) = X Waitms Wait1 Gosub Sharp_left Next
For I = 30 To Top Step 10 Servo(1) = Center Waitms Wait1 Gosub Sharp_center Next
For I = 30 To Top Step 10 X = Center - I Servo(1) = X Waitms Wait1 Gosub Sharp_right Next
For I = 30 To Top Step 10 Servo(1) = Center Waitms Wait1 Gosub Sharp_center Next
Loop
$include "gosub.bas" Метки на которые осущевствляются переходы: Code Sharp_right: Declare Function Sharp_a02(byval 0 As Byte) As Byte Function Sharp_a02(byval 0 As Byte) As Byte Local Vout As Word Start Adc : Vout = Getadc(0) 'Sharp connected for example to PA=0(ADC0) Stop Adc If Vout < 700 Then : Sharp_a02 = 0 : Else : Sharp_a02 = 1 : End If If Sharp_a02 = 1 Then : Gosub Разворот_влево : Waitms 400 : End If If Sharp_a02 = 1 Then : Gosub 1 : End If End Function Return
Sharp_left: Declare Function Sharp_a0(byval 0 As Byte) As Byte Function Sharp_a0(byval 0 As Byte) As Byte Local Vout As Word Start Adc : Vout = Getadc(0) 'Sharp connected for example to PA=0(ADC0) Stop Adc If Vout < 700 Then : Sharp_a0 = 0 : Else : Sharp_a0 = 1 : End If If Sharp_a0 = 1 Then : Gosub Разворот_вправо : Waitms 400 : End If If Sharp_a0 = 1 Then : Gosub 1 : End If End Function Return
Sharp_center: Declare Function Sharp(byval 0 As Byte) As Byte Function Sharp(byval 0 As Byte) As Byte Local Vout As Word Start Adc : Vout = Getadc(0) 'Sharp connected for example to PA=0(ADC0) Stop Adc If Vout < 700 Then : Sharp = 0 : Else : Sharp = 1 : End If If Sharp = 1 Then : Gosub Стоп : Waitms 1000 : Gosub Разворот_вправо : Waitms 700 : End If If Sharp = 1 Then : Gosub 1 : End If End Function Return
'' ----------------------------------------------------------------------------- '' Включение комбинации моторов для движения в заданном направлении '' ----------------------------------------------------------------------------- Стоп: ' стоим на месте M1f = 0 : M1b = 0 : Pwm1a = 0 M2f = 0 : M2b = 0 : Pwm1b = 0 Return
Вперёд: ' едим вперёд на заданной скорости M1f = 1 : M1b = 0 : Pwm1a = Speed M2f = 1 : M2b = 0 : Pwm1b = Speed Return
Вперёд_вправо: ' поварачиваем вправо на заданной скорости M1f = 1 : M1b = 0 : Pwm1a = Speed M2f = 0 : M2b = 0 : Pwm1b = 0 Return
Вперёд_влево: ' поворачиваем влево на заданной скорости M1f = 0 : M1b = 0 : Pwm1a = 0 M2f = 1 : M2b = 0 : Pwm1b = Speed Return
Назад: ' едим назад на заданной скорости M1f = 0 : M1b = 1 : Pwm1a = Speed M2f = 0 : M2b = 1 : Pwm1b = Speed Return
Назад_вправо: ' поворачиваем назад-вправо на заданной скорости M1f = 0 : M1b = 1 : Pwm1a = Speed M2f = 1 : M2b = 0 : Pwm1b = 0 Return
Назад_влево: ' поворачиваем назад-влево на заданной скорости M1f = 0 : M1b = 0 : Pwm1a = 0 M2f = 0 : M2b = 1 : Pwm1b = Speed Return
Разворот_вправо: ' делаем Разворот_вправо на заданной скорости M1f = 1 : M1b = 0 : Pwm1a = Speed M2f = 0 : M2b = 1 : Pwm1b = Speed Return
Разворот_влево: ' делаем Разворот_влево на заданной скорости M1f = 0 : M1b = 1 : Pwm1a = Speed M2f = 1 : M2b = 0 : Pwm1b = Speed Return И видео:
|
|
| |
Space | Дата: Воскресенье, 31.01.2010, 00:53 | Сообщение # 46 |
Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
| Для интересующихся код всей программы. Всё работает. Объезд препятствий с помощью 3 дальномеров. P.S Будет время напишу пару статеек на тему дальномеров
|
|
| |
Space | Дата: Четверг, 04.02.2010, 23:11 | Сообщение # 47 |
Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
| Вот теперь он работает отлично. Единственное изменение надо ещё внести в программу при отъезде от препятствия спереди, а то в углах бывает начинает плутать туда сюда, а так в целом всё очень даже не плохо. Терь буду разбираться с USB-UART. Несколько фото и видео, на 1-ой фотке зарядка для аккума и программатор которыми я пользуюсь :
|
|
| |
Doniak | Дата: Четверг, 04.02.2010, 23:41 | Сообщение # 48 |
Язык программированя: CodeVisionAVR Си
Зарегистрирован 19.03.2008
Группа: Модераторы
Сообщений: 584
Город: Кривой Рог (Днепропетровск)
Статус: Offline
| Нечо так хорошенький роботик получился :) Но жужжание раздражает жуть . Quote (Space) Терь буду разбираться с USB-UART управляющую программу будиш сам писать?
|
|
| |
Space | Дата: Пятница, 05.02.2010, 00:32 | Сообщение # 49 |
Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
| Quote (Doniak) управляющую программу будиш сам писать? ага. для начало при подключение usb он должен будет остановить работу программы и напечатать сообщение в терминале. После сделаю нескеолько команд для теста всей его системы. Например покрутить моторами несколько секунд. или проверить работу шарпов и т.д.Добавлено (05.02.2010, 00:29) ---------------------------------------------
Quote (Doniak) Нечо так хорошенький роботик получился :) главное маленький и укомплектованный Добавлено (05.02.2010, 00:32) ---------------------------------------------
Quote (Doniak) Но жужжание раздражает жуть . кстати эт всё ютуб портит не знаю почему. с этой камеры когда записываю звук нормальный, как перенашу видео в ютуб так он его карявит.
|
|
| |
Doniak | Дата: Пятница, 05.02.2010, 17:34 | Сообщение # 50 |
Язык программированя: CodeVisionAVR Си
Зарегистрирован 19.03.2008
Группа: Модераторы
Сообщений: 584
Город: Кривой Рог (Днепропетровск)
Статус: Offline
| Quote (Space) главное маленький и укомплектованный ges_up ppl_cylon можно былоб еще меньше сделать. Микросхемы в СМД корпусах ставить, компактнее разводить плату, акум поставить другим боком, плату на плату установить, убрать радиатор...
|
|
| |
Bass85 | Дата: Суббота, 06.02.2010, 00:25 | Сообщение # 51 |
Зарегистрирован 12.02.2009
Группа: Опытные
Сообщений: 422
Статус: Offline
| Понравилось что без не какого дерганья поворачивает от препятствий. Да и действительно зачем радиатор, да еще и немаленький, там что стабилизатор стоит?
|
|
| |
S-T-A-L-K-E-R | Дата: Суббота, 06.02.2010, 09:42 | Сообщение # 52 |
Язык программированя: Мурманская область
Зарегистрирован 11.06.2009
Группа: Модераторы
Сообщений: 367
Город: Никель
Статус: Offline
| Хорош бот. Молодец.
|
|
| |
Space | Дата: Вторник, 23.02.2010, 16:57 | Сообщение # 53 |
Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
| Quote (Bass85) Понравилось что без не какого дерганья поворачивает от препятствий. Да и действительно зачем радиатор, да еще и немаленький, там что стабилизатор стоит? там два стабилизатора, один для драйвера, другой дляконтроллера. когда свинцовый аккум подключал стабилизаторы всё время грелись. щас стоит литьевый всё нормально поэтому после сниму его.Добавлено (09.02.2010, 00:07) --------------------------------------------- Ну вот понеслась душа в рай Набросок проги для терминала. Часть с моторами уже проверил работает отлично Code '******************************Настройки**************************************** Dim ПодтверждениеРаботыТерминала As Bit , Tim As Integer , T As Integer Dim ВнешнииПодключения As Byte , ВключениеМоторов As Byte Tim = 500 '***************************Работа в терминале********************************** Print : Print "***************************{144}{160}{161}{174}{226}{160} {162} {226}{165}{224}{172}{168}{173}{160}{171}{165}**********************************" Print : Print "Hello. I am Robbe." : Waitms Tim $timeout = 5000000 'ждём ввода команды 5 секунд Input , ПодтверждениеРаботыТерминала If ПодтверждениеРаботыТерминала = 1 Then : Goto РаботаТерминала : Else : Print "Perexod k osnovnoi programme" : Goto ОсновнаяПрограмма : End If ' если ввели команду 1, значит работаем в терминале иначе переход в основную программу Do РаботаТерминала: $timeout = 100000000 : Print : Input "Chto testiryem? " , ВнешнииПодключения Print "Ok," ; ВнешнииПодключения If ВнешнииПодключения = 1 Then : Wait 5 : Goto ОсновнаяПрограмма Elseif ВнешнииПодключения = 2 Then : Gosub ТестируемДальномеры Elseif ВнешнииПодключения = 3 Then : Gosub ВариантыДвижений Else : Print : Print "Error. Nevernai komanda" : End If Loop '*********************Выполняемые команды в терминале*************************** ТестируемДальномеры: Print : Print "Proverka dal'nomerov" Return
'*******************************************************************************
'******************************* ************************************************ ВариантыДвижений: Print : Print "Proverka motorov" Wait 1 : Print "Perechen' komand:" : Print "0-K rabote terminala, posle vvoda komandi enter" Print "1-Stop v techenii" : Print "2-Vpered" : Print "3-VperedVpravo" Print "4-VperedVlevo" : Print "5-Nazad" : Print "6-NazadVpravo" Print "7-NazadVlevo" : Print "8-RazvorotVpravo" : Print "9-RazvorotVlevo" Do $timeout = 100000000 Gosub Стоп Print : Input "Vvedi komandy napravleni and dlitel'nost' " , ВключениеМоторов , T If ВключениеМоторов = 1 Then : Print "Stop v techenii " ; T ; " sekynd" : Gosub Стоп : Wait T Elseif ВключениеМоторов = 2 Then : Print "Vpered v techenii " ; T ; " sekynd" : Gosub Вперёд : Wait T Elseif ВключениеМоторов = 3 Then : Print "VperedVpravo v techenii " ; T ; " sekynd" : Gosub Вперёд_вправо : Wait T Elseif ВключениеМоторов = 4 Then : Print "VperedVlevo v techenii " ; T ; " sekynd" : Gosub Вперёд_влево : Wait T Elseif ВключениеМоторов = 5 Then : Print "Nazad v techenii " ; T ; " sekynd" : Gosub Назад : Wait T Elseif ВключениеМоторов = 6 Then : Print "NazadVpravo v techenii " ; T ; " sekynd" : : Gosub Назад_вправо : Wait T Elseif ВключениеМоторов = 7 Then : Print "NazadVlevo v techenii " ; T ; " sekynd" : Gosub Назад_влево : Wait T Elseif ВключениеМоторов = 8 Then : Print "RazvorotVpravo v techenii " ; T ; " sekynd" : Gosub Разворот_вправо : Wait T Elseif ВключениеМоторов = 9 Then : Print "RazvorotVlevo v techenii " ; T ; " sekynd" : Gosub Разворот_влево : Wait T Elseif ВключениеМоторов = 0 Then : Gosub РаботаТерминала : End If Loop '******************************************************************************* Добавлено (23.02.2010, 16:57) --------------------------------------------- Эм... народ ни кто не в курсе как сделать так чтобы робот распознал, что к нему подключили usb(uart)? Это похоже на подключение тех же наушников к мобильнику при их подключение высвечивается либо надпись с сообщением о подключение наушников либо значок. Или новые устройства к компу. P. S. мож глупый вопрос, но всё же интересует вообще как комп распознаёт подключение новых устройств?
|
|
| |
DeepBlack | Дата: Вторник, 23.02.2010, 17:10 | Сообщение # 54 |
Язык программированя: C/C++
Зарегистрирован 27.07.2009
Группа: Модераторы
Сообщений: 189
Город: Зеленоград
Статус: Offline
| USB распознает по наличию резистора между одной из информационных линий и линией питания. Причем, от того на первой, второй или на двух сразу стоят резистор(ы), определяется скорость работы устройства. В устройстве можно сделать, например, разъем с 4 контактами - 2 отвечают за обмен информацией, 2 просто замкнуты между собой. Когда разъем подключен, между двумя выводами МК будет перемычка. Определить наличие перемычки элементарно. Можно на одном из выводов МК держать высокий уровень, и постоянно (по таймеру) проверять, что там высокий уровень - в при подключении к компу кинуть этот вывод через резистор на землю. При очередной проверке выяснится, что есть подключение. Можно поизощреннее поступить: использовать 2 линии всего. Пока контроллер ожидает подключения, он раз в N промежуток времени посылает на USART какое-нибудь слово (например, PING) а программа в компе как только увидит PING сразу же должна ответить PONG. При приеме ответа МК понимает, что он подключен к компьютеру. Вот как-то так)
|
|
| |
Space | Дата: Суббота, 27.02.2010, 16:51 | Сообщение # 55 |
Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
| ок. спасиб. буду пробовать Добавлено (27.02.2010, 16:51) --------------------------------------------- Сделал измерение акб в вольтах и процентах. Не идеал конечно да и вообще не уверен, что правильно, но приблизительно определить напряжение более менее по выводимым данным можно. Разница ток бывает парой в 0,5, а то и в целый вольт. Code Dim Volt As Single , Volt1 As Single , Volt2 As Single , Напряжение_Акб As Single Dim Procent As Integer , Коифицент As Single '*******************************************************************************
Do Akb:
Start Adc : Акб = Getadc(0) : Stop Adc Коифицент = 45 / 2 Volt = Коифицент * Акб Volt1 = Volt * 10 Volt2 = Volt1 / 1023 Напряжение_Акб = Volt2 / 10 Procent = Volt2 + 15
If Акб > 375 Then : Gosub 1 : Else : Gosub 2 : End If Input , Q If Q = 1 Then : Goto РаботаТерминала : End If Loop 1: Print : Print "Заряд аккумулятора 100%" : Waitms 500 Return 2: Print : Print "1-Возврат" : Print "Заряд аккумулятора состовляет " ; Procent ; "%" Print Напряжение_Акб ; " Вольт" : Waitms 500 Return
'*******************************************************************************
|
|
| |
Cudi | Дата: Воскресенье, 27.06.2010, 09:53 | Сообщение # 56 |
Язык программированя: Асамблер
Зарегистрирован 17.03.2010
Группа: Новички
Сообщений: 49
Город: Ростов-н/Д
Статус: Offline
| Space, красавец. Ты мог бы дать схему готового робота. А то всё разбросано не поиму где что. и мог бы перечень деталей вывесить :)) буду очень благодарен.
|
|
| |
Space | Дата: Воскресенье, 27.06.2010, 11:58 | Сообщение # 57 |
Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
| спасиб мог бы но честно говоря я принципиальную схему не рисовал для управляющей платы, поэтому если где-то и есть, то только печатная плата. Единственное что драйвер использовал этот Можно собрать любой контроллер, 1 или 2 лучше 2, там стабилизатор напряжения есть, и RS-232 И защшить программу, подключить всё необходимое из датчиков и серв, и всё будет так же работать
|
|
| |
Cudi | Дата: Четверг, 08.07.2010, 17:41 | Сообщение # 58 |
Язык программированя: Асамблер
Зарегистрирован 17.03.2010
Группа: Новички
Сообщений: 49
Город: Ростов-н/Д
Статус: Offline
| Space, вопрос как ты вырезал отверстия для SHARP, я пробывал вырезать не получилось :(
|
|
| |
Space | Дата: Пятница, 09.07.2010, 11:16 | Сообщение # 59 |
Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
| как не странно сверлом
|
|
| |
Cudi | Дата: Пятница, 09.07.2010, 15:27 | Сообщение # 60 |
Язык программированя: Асамблер
Зарегистрирован 17.03.2010
Группа: Новички
Сообщений: 49
Город: Ростов-н/Д
Статус: Offline
| Space, сверлом ? я думал концелярским ножом.
|
|
| |
|