Воскресенье, 23.06.2024, 21:17
| RSS
[SEARCH_TITLE]
[SEARCH_FORM]
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 3 из 5
  • «
  • 1
  • 2
  • 3
  • 4
  • 5
  • »
Архив - только для чтения
"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. Причём сделать всякие дополнительные табл. с выводом разных данных. Например Акб, температура среды, экран для обработки видео с робби и т.д.

Что из этого уже начал. А начал я со второго пункта. Так как ПВХ пока не купил. Ну собственно результаты есть. Хотя не совсем устраивают. Над программой надо работать ещё. Бывают глюки с задержками. Например повороты дольше чем надо длятся.

Для любопытных wink :
Основа:

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

И видео:

Прикрепления: 7909925.jpg (205.5 Kb) · 1730524.jpg (229.9 Kb) · Robbe_Version_1.rar (25.9 Kb)
 
DoniakДата: Воскресенье, 27.09.2009, 16:52 | Сообщение # 31








Язык программированя: CodeVisionAVR Си
Зарегистрирован 19.03.2008
Группа: Модераторы
Сообщений: 584
Город: Кривой Рог (Днепропетровск)
Статус: Offline
класный акум литиевый, а ёмкость больше чем у свинцового good
 
SpaceДата: Понедельник, 05.10.2009, 00:06 | Сообщение # 32








Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
ага. 2.7 А, а у свинцового было 1.3А. И заряжается этот аккум один час и 30 минут. Может даже чуть больше, но не больше 2 часов

Добавлено (05.10.2009, 00:06)
---------------------------------------------
Ура!!! dance4 Теперь прога по обнаружению препятствия работает так как я хотел. То есть пока нет препятствия крутим сервой и едим вперёд, если есть останавливаем серву в том месте где было обнаружено препятствие и разворачиваемся в одну из сторон(зависит от датчик где он в этот момент, справа или слева). Затем если препятствие исчезло, то снова едим вперёд. Два дня парился над прогой, чуть мозг себе не вынес wacko . Пока один человек не помог smile3 . Если бы не он может и не сделал бы. Поэтому спасибо ему огромное. yes3
Видео:

 
SpaceДата: Воскресенье, 11.10.2009, 23:08 | Сообщение # 33








Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
Ну вот прикрепил голову. Видео правда пока загрузить на ятуб не могу. ПВХ вспененного пока нет ещё (

Добавлено (11.10.2009, 23:08)
---------------------------------------------
Чтож на ютуб по каким то не понятным причинам видео не грузится, поэтому загрузил на ютубру. ТОЛЬКО ЗВУК ЗАРАНЕЕ ВЫКЛЮЧИТЕ. Почему то после загрузки вместо звука шум.

Прикрепления: 9502254.jpg (81.3 Kb) · 7490963.jpg (79.1 Kb)
 
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
Пока не когда заниматься этим. Учусь пока что...
А с этим я продолжу позже. Продолжение будет обещаю. Хорошие и объёмные проекты всегда долго развиваются ext_book phil_25 kolobok_cool
 
SpaceДата: Суббота, 30.01.2010, 00:53 | Сообщение # 39








Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
Народ мож кто идейку подкинет help . Уже всю голову сломал wacko wacko как лучше будет управлять 3-мя дальномерами работающих на объезд препятствий. Значит 3 датчика зафиксировано на платформе один прямо другие в направлены вправо и влево под углом 45. Один на подвижной туреле(движения влево-вправо, вверх-вниз, но он скорей всего будет на измерения расстояния работать, поэтому по возможности его не трогаем). С боковым всё понятно препятствие слева поворачиваем вправо и т.д. А как быть с центральным. Допустим ножка стула, не делать же отъезд назад чтоб робот поехал снова вперёд и наткнулся на эту ножку снова. А разворот лишь в одну сторону не то. Если есть идеи внимательно слушаю, видели алгоритмы для управления шарпами кидайте посмотрим, видели видео с таким же количеством дальномеров тож кидайте ссылку.
Прикрепления: 4917262.jpg (191.2 Kb)
 
DoniakДата: Суббота, 30.01.2010, 14:27 | Сообщение # 40








Язык программированя: CodeVisionAVR Си
Зарегистрирован 19.03.2008
Группа: Модераторы
Сообщений: 584
Город: Кривой Рог (Днепропетровск)
Статус: Offline
Quote
А разворот лишь в одну сторону не то

разворот не подходит отъехать назад тоже остается одно перепрыгнуть стул smile3
у тебя сверху датчик расстояния который может поворачивать может на основе сделать подобее радара? который бы анализировал ширину препятствия спереди а дальше уже применялбы какой то алгоритм отъехать или объехать в ту сторону где нет препятствия о.О
 
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
ды не я в курсе, но я ж сказал, что навели на нужные мысли. Правда пока чёт не выходит. пробовал во внешнюю память записать изменение переменной не выходит пока... sad
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)
---------------------------------------------
Готовенько, работает: dance4

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
 
  • Страница 3 из 5
  • «
  • 1
  • 2
  • 3
  • 4
  • 5
  • »
Поиск: