"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 И видео:
|
|
| |
Doniak | Дата: Воскресенье, 27.09.2009, 16:52 | Сообщение # 31 |
Язык программированя: CodeVisionAVR Си
Зарегистрирован 19.03.2008
Группа: Модераторы
Сообщений: 584
Город: Кривой Рог (Днепропетровск)
Статус: Offline
| класный акум литиевый, а ёмкость больше чем у свинцового
|
|
| |
Space | Дата: Понедельник, 05.10.2009, 00:06 | Сообщение # 32 |
Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
| ага. 2.7 А, а у свинцового было 1.3А. И заряжается этот аккум один час и 30 минут. Может даже чуть больше, но не больше 2 часов Добавлено (05.10.2009, 00:06) --------------------------------------------- Ура!!! Теперь прога по обнаружению препятствия работает так как я хотел. То есть пока нет препятствия крутим сервой и едим вперёд, если есть останавливаем серву в том месте где было обнаружено препятствие и разворачиваемся в одну из сторон(зависит от датчик где он в этот момент, справа или слева). Затем если препятствие исчезло, то снова едим вперёд. Два дня парился над прогой, чуть мозг себе не вынес . Пока один человек не помог . Если бы не он может и не сделал бы. Поэтому спасибо ему огромное. Видео:
|
|
| |
Space | Дата: Воскресенье, 11.10.2009, 23:08 | Сообщение # 33 |
Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
| Ну вот прикрепил голову. Видео правда пока загрузить на ятуб не могу. ПВХ вспененного пока нет ещё ( Добавлено (11.10.2009, 23:08) --------------------------------------------- Чтож на ютуб по каким то не понятным причинам видео не грузится, поэтому загрузил на ютубру. ТОЛЬКО ЗВУК ЗАРАНЕЕ ВЫКЛЮЧИТЕ. Почему то после загрузки вместо звука шум.
|
|
| |
danger | Дата: Среда, 14.10.2009, 07:40 | Сообщение # 34 |
Язык программированя: пока нет
Зарегистрирован 17.07.2009
Группа: Новички
Сообщений: 168
Город: Чебоксары
Статус: Offline
| Quote (Space) бред. у меня по 300 сервы стоят и лишь одна за 620 и то из-за что в ней металлические шестерёнки. Я себе купил 4 по 300 и пользуюсь ими. Новых я не покупал уже больше года дайка ссылку в интернет магазин где сервы по 300 руб стоят
http://vkontakte.ru/club13643816 тыркни по ссылке
|
|
| |
Space | Дата: Среда, 14.10.2009, 11:02 | Сообщение # 35 |
Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
| они столько стоят у меня в городе. В интернет магазине они дороже
|
|
| |
ALHIMIK | Дата: Среда, 14.10.2009, 21:30 | Сообщение # 36 |
Язык программированя: C - вот Истинная вера для МК
Зарегистрирован 23.12.2008
Группа: Опытные
Сообщений: 83
Город: СПб
Статус: Offline
| http://rc-model.ru/modules.php?name=Shop&go=goods&pid=11 Покупал не раз 10шт собрали и отправил быстро
|
|
| |
pashteet | Дата: Четверг, 29.10.2009, 19:21 | Сообщение # 37 |
Зарегистрирован 21.09.2009
Группа: Новички
Сообщений: 225
Город: Волжский
Статус: Offline
| Кирилл, Чет давненько новостей не слыхать, да и на форуме редко появляешся, занят чем-то?
|
|
| |
Space | Дата: Четверг, 29.10.2009, 21:28 | Сообщение # 38 |
Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
| Пока не когда заниматься этим. Учусь пока что... А с этим я продолжу позже. Продолжение будет обещаю. Хорошие и объёмные проекты всегда долго развиваются
|
|
| |
Space | Дата: Суббота, 30.01.2010, 00:53 | Сообщение # 39 |
Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
| Народ мож кто идейку подкинет . Уже всю голову сломал как лучше будет управлять 3-мя дальномерами работающих на объезд препятствий. Значит 3 датчика зафиксировано на платформе один прямо другие в направлены вправо и влево под углом 45. Один на подвижной туреле(движения влево-вправо, вверх-вниз, но он скорей всего будет на измерения расстояния работать, поэтому по возможности его не трогаем). С боковым всё понятно препятствие слева поворачиваем вправо и т.д. А как быть с центральным. Допустим ножка стула, не делать же отъезд назад чтоб робот поехал снова вперёд и наткнулся на эту ножку снова. А разворот лишь в одну сторону не то. Если есть идеи внимательно слушаю, видели алгоритмы для управления шарпами кидайте посмотрим, видели видео с таким же количеством дальномеров тож кидайте ссылку.
|
|
| |
Doniak | Дата: Суббота, 30.01.2010, 14:27 | Сообщение # 40 |
Язык программированя: CodeVisionAVR Си
Зарегистрирован 19.03.2008
Группа: Модераторы
Сообщений: 584
Город: Кривой Рог (Днепропетровск)
Статус: Offline
| Quote А разворот лишь в одну сторону не то разворот не подходит отъехать назад тоже остается одно перепрыгнуть стул у тебя сверху датчик расстояния который может поворачивать может на основе сделать подобее радара? который бы анализировал ширину препятствия спереди а дальше уже применялбы какой то алгоритм отъехать или объехать в ту сторону где нет препятствия о.О
|
|
| |
Space | Дата: Суббота, 30.01.2010, 14:34 | Сообщение # 41 |
Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
| ну вообще думал его так использовать. но хочу сделать как то проще. Ща на робофоруме подкинули идейку. Поэтому попробую сначало так сделать, если не понравится, то до ума доведу способ с радаром: Quote Можно попробовать сделать переменную которая будет изменяться. Типо первый раз перед сабой видит стену, поворачивает влево и изменяет переменную с 0 на 1. А в след. раз когда увидит препятствие уже будет проверять чему равна данная переменная если 0, значит влево, если 1 значит вправо, затем обнуляем переменную.
|
|
| |
Doniak | Дата: Суббота, 30.01.2010, 15:10 | Сообщение # 42 |
Язык программированя: CodeVisionAVR Си
Зарегистрирован 19.03.2008
Группа: Модераторы
Сообщений: 584
Город: Кривой Рог (Днепропетровск)
Статус: Offline
| Quote Типо первый раз перед сабой видит стену, поворачивает влево и изменяет переменную с 0 на 1. А в след. раз когда увидит препятствие уже будет проверять чему равна данная переменная если 0, значит влево, если 1 значит вправо, затем обнуляем переменную. и получим = видит стену поворачивает влево, слева ещо одно препятствие поворачивает вправо, справа стена поворачивает влево. while(1) получили :) хотя может я не до конца понял идеи.
|
|
| |
Space | Дата: Суббота, 30.01.2010, 16:14 | Сообщение # 43 |
Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
| блин об этом не подумал, ладно тогда добавляем сначало отъезд назад от стены, а после уже всё в норме будет. Боковые датчики должны будут сыграть уже свою роль.
|
|
| |
Doniak | Дата: Суббота, 30.01.2010, 20:13 | Сообщение # 44 |
Язык программированя: CodeVisionAVR Си
Зарегистрирован 19.03.2008
Группа: Модераторы
Сообщений: 584
Город: Кривой Рог (Днепропетровск)
Статус: Offline
| кстати идейку с робофорума ти не так понял. Там предлагалось сделать довольно сложный алгоритм построения карты по найденным препятствиям ну и дальнейшей ориентацией по ней.
|
|
| |
Space | Дата: Суббота, 30.01.2010, 23:35 | Сообщение # 45 |
Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
| ды не я в курсе, но я ж сказал, что навели на нужные мысли. Правда пока чёт не выходит. пробовал во внешнюю память записать изменение переменной не выходит пока... Code $regfile = "m16def.dat" $crystal = 16000000
Config Adc = Single , Prescaler = Auto , Reference = Internal
Config Pind.2 = Output : M1f Alias Portd.2 Config Pind.3 = Output : M1b Alias Portd.3 Config Pind.4 = Output : M2f Alias Portd.4 Config Pind.5 = Output : M2b Alias Portd.5
Enable Interrupts
Dim АЦП As Word , Q As Byte Q = Inp(&H800) 'Q равняется ячеки памяти по адресу &H800 Do
If АЦП >= 500 Then If Q = 0 Then : Gosub Разворот_вправо : End If If Q = 1 Then : Gosub Разворот_влево : End If Else : Gosub Вперёд : End If Loop
Вперёд:
M1f = 1 : M2f = 1 M1b = 0 : M2b = 0 Return
Разворот_вправо: Out &H800 , 1 ' записать 1 по адресу &H800 M1f = 1 : M2f = 0 M1b = 0 : M2b = 1 Return
Разворот_влево: Out &H800 , 0 M1f = 0 : M2f = 1 M1b = 1 : M2b = 0 Return Добавлено (30.01.2010, 23:35) --------------------------------------------- Готовенько, работает: Code $regfile = "m16def.dat" $crystal = 16000000
Config Adc = Single , Prescaler = Auto , Reference = Internal
Config Pind.2 = Output : M1f Alias Portd.2 Config Pind.3 = Output : M1b Alias Portd.3 Config Pind.4 = Output : M2f Alias Portd.4 Config Pind.5 = Output : M2b Alias Portd.5
Enable Interrupts
Dim АЦП As Word , Q As Bit
Q = 0
Do Start Adc : АЦП = Getadc(2) If АЦП >= 500 Then : Gosub Отъехать_от_препятствия_спереди : Else : Gosub Вперёд : End If
Loop
Вперёд: M1f = 1 : M2f = 1 M1b = 0 : M2b = 0 Return
Отъехать_от_препятствия_спереди: M1f = 0 : M2f = 0 M1b = 1 : M2b = 1 Wait 1
If Q = 0 Then M1f = 1 : M2f = 0 Else M2f = 1 : M1f = 0 End If Wait 1 If Q = 0 Then M2f = 1 : M1f = 0 Else M1f = 1 : M2f = 0 End If 'переустанавливаем переменную If Q = 0 Then Q = 1 Else Q = 0 End If
|
|
| |