–обот на платформе радиоуправл€емого "ћерседеса"


12.07.2010, 19:54



29.07.2004 датчик вращени€ ведущих колес

04.08.2004 » -сенсор (бампер)

—обрать самосто€тельно платформу - не такое простое дело. ѕоэтому пришлось вз€ть радиоуправл€емую машинку стоимостью примерно 10 долларов, сн€ть кузов, отпа€ть плату радиоуправлени€ и уже на базе готового шасси строить робота.  онечно, € знаю, что по канонам робототехники (читай статьи) это не совсем то, что требуетс€. Ќо всЄ-таки на «ападе купить мотор с редуктором, сервопривод или готову платформу проще простого. ” нас в ”краине это или очень сложно, или достаточно дорого. ѕоэтому прошу прощени€ за небольшое отступление от правил.

¬от как выгл€дел ћерседес (а это был именно он) после того, как € убрал радиоуправление (видно на фото пульт и плата) и поставил первую плату. ќна была достаточно проста€- AT90S2313, кварц, L293D, разъемы и выключатель питани€, шлейф к программатору.

¬начале плата работала нормально. “очнее, при простых операци€х вроде включить двигатель, включить поворот, и так далее, но потом начались сбои. я засомневалс€, может ли данна€ схема нормально работать? ѕотом был другой проект- ћонстр-1, у которого двигатели сильно "шумели" и не давали микроконтроллеру нормально работать.

ѕоэтому € зан€лс€ разработкой плат. ѕервой была плата управлени€ на основе AT90S2313. я сделал печатную плату. Ќе без проблем, конечно, но сделал. Ќе нашел пока что хорошей программы дл€ разводки. ќни либо слишком сложные, либо простые. “ак что € пока в поиске. ѕока использовал Layout 3.0, но проблема была в том, что "на глаз" трудно рассчитать установочные размеры деталей, в результате чего разъем программатора закрыл места дл€ 2-х светодиодов.

¬тора€ плата была плата управлени€ двигател€ми. я использовал ту же L293, только поставил 8 диодов N5819, сделал отводы дл€ применени€ раздельного питани€ логики этой микросхемы и питани€ двигателей и добавил схему опторазв€зки. ¬ результате на плате может быть до 3-х разъемов питани€. ѕока напр€жение питани€ невысокое, € сделал перемычку и логика питаетс€ вместе с двигател€ми. ѕосле тестовых испытаний оказалось, что эта схема может не сама€ дешева€, но зато очень надежна€.

“ретьей платой была тоже плата управлени€ двигател€ми, но на основе микросхемы L298, котора€ может управл€ть более мощными двигател€ми и идет сразу с теплоотводом ( L293 ещЄ нужно придумать, как охлаждать). ¬ плате используютс€ также диоды и опторазв€зка. Ќебольшое нововведение- плата двухсторонн€€, на нижней стороне € расположил диоды в SMD-исполнении. ѕолучилось очень даже неплохо.

‘ото не очень получились, но это всЄ, что есть.

“ак вот, € соедин€ю плату 1 (мозг) и плату 2 (двигатели) , подключаю всЄ это к платформе бывшего ћерседеса и € получаю как раз то, что и требовалось.

“еперь задача посложнее.  олЄса ћерса крут€тс€ очень быстро. ≈сли включить двигатель хот€ бы на 2-3 секунды, он разгон€етс€ так, что пролетает всю комнату и удар€етс€ о стену (дверь, шкаф, стул). ѕри этом может развить как саму платформу, так и платы. „то € делаю?  лассика, € делаю Ў»ћ (широтно-импульсную модул€цию). я попробую привести пример программы, но не уверен, что даже специалисты еЄ поймут. я писал программу по блок-схеме, но пока не смог нарисовать еЄ в редакторе. ƒа и не уверен пока, что программа действует. я еЄ прогнал, конечно на модели, но всЄ же...

¬ чем задумка. Ќаписать программу, котора€ работала бы так, как работали драйвера в ƒќ—е или как работают многозадачные операционные системы. ¬торой вариант мне кажетс€ предпочтительней. ѕрерывани€ в ћ  есть, но их моежт не хватить на все случаи жизни. » € рискнул работать не с прерывани€ми, а читать порт, просто делать это достаточно быстро. ƒребезг контактов можно отсекать и программным путем.

ѕрограмма разделена на блоки.  аждый блок имеет свои переменные (€чейки пам€ти) и свои константы (описаны в начале программы). Ќапример, мы устанавливаем константу работы двигател€ в режиме Ў»ћ- робот будет управл€ть работой двигател€. ¬ следующей версии программы € сделаю из константу переменную и программа сама сможет измен€ть скорость вращени€ колЄс. Ќапример, "глаза" робота вид€т преп€тствие, но он ещЄ не "доехал" до него. ѕрограмма может снизить скорость вращени€ двигател€, робот подъедет к преп€тствию, коснЄтс€ его, сработает либо контактный датчик, либо датчик вращени€ колЄс и робот будет точно знать что это именно преп€тствие, а не что-нибудь другое. “аким же образом можно сделать торможение- резко включить двигатель назад на короткое врем€. –обот резко остановитс€. –обот может двигатьс€ не по идеально гладкой поверхности, а по ковру, по наклонной поверхности вверх или вниз. ƒл€ движени€ по таким участкам робот может корректировать мощность, подаваемую на двигатели, ориентируюсь на датчик вращени€ колес (частота вращени€). ƒа, осциллографа у мен€ пока нет, поэтому если что-то не соответствует действительности, извините и поправьте.

¬от программа (просто управление двигател€ми, без датчиков).

я решил поставить дату 09.07.2004г. ≈сли сделаю новую программу, добавлю внизу.


.include "2313def.inc"
.EQU     c_go_forward=$04    ; оба вперед
.EQU    c_go_left=$01        ; левый 
.EQU    c_go_right=$02        ; правый 
.EQU    c_go_back=$08        ; оба назад

.EQU    c_motor_mode=$03
.EQU    c_motor_freq=$10

.EQU    c_sensor_shaft_pin=1
.EQU    c_sensor_shaft_wait1=$00
.EQU    c_sensor_shaft_wait2=$01

.EQU    c_sensor_contact_pin=2

.EQU    m_sensor_shaft_wait1=$0070
.EQU    m_sensor_shaft_wait2=$0071
;.EQU    m_sensor_shaft_bcount1=$0070

.EQU    m_motor=$0080
.EQU    m_motor_new=$0081
.EQU    m_motor_count1=$0082
.EQU    m_motor_count2=$0083
.EQU    m_motor_stage=$0084
.EQU    m_motor_bcount1=$0085
.EQU    m_motor_bcount2=$0086
.EQU    m_motor_bcount3=$0087


.EQU    c_wait1=$22
.EQU    c_wait2=$ff


.DEF    temp=R30
.DEF    temp2=R29

;====================================
;    I N I T 
;====================================
; готовим порт ¬ дл€ вывода
    ldi temp,$0F
    out DDRB,temp

; готовим порт D дл€ входа
    ldi temp,$00
    out DDRD,temp

; включаем резисторы- на входе будет 1
    ldi temp,$7F
    out PORTD,temp

; инициализаци€ стека
    ldi temp,RAMEND
    out SPL,temp

; инициализаци€ новых переменных
    ldi temp,1        ; 1
    sts m_motor_stage, temp    ; стади€ работы мотора

; начало
    ldi temp, c_go_forward    ; движение вперед
    sts m_motor, temp
    sts m_motor_new, temp

start:

;------- проверка режима работы
    ldi temp, c_motor_mode    ; загрузить режим работы мотора в темп
    cpi temp, 0        ; режим полный?
    brne l_motor2        
;------- режим полный
    lds temp, m_motor_new    ; загрузить переменную мотор новый в темп
    lds temp2, m_motor    ; загрузить текущее значение мотора
    sub temp, temp2        ; сравнить старое значение с новым
    breq l_motor_end

    lds temp, m_motor_new    ; загрузить переменную мотор новый в темп
    sts m_motor, temp
    out PORTB, temp        ; вывести temp в порт
    rjmp l_motor_end    

;------- режим Ў»ћ
l_motor2:
    lds temp, m_motor_stage    ; кака€ стади€ работы?
    cpi temp, 0        ; если 0-
    breq l_motor2_11 
    lds temp, m_motor    ; загрузить значение мотора
l_motor2_11:
    out PORTB, temp        ; вывести temp в порт
    ; минус счетчики
    lds temp, m_motor_count1    ; загрузить счетчик младший
    dec temp            ; минус 1
    sts m_motor_count1, temp ; сохранить младший байт    
    cpi temp, 0        ; равно 0 ?
    brne l_motor_end    ; если нет- на конец цикла
    ; eq 0 - init 
    ldi temp, c_motor_freq    ; загрузить константу младшей части 
    sts m_motor_count1, temp ; сохранить младший байт

    lds temp, m_motor_count2    ; загрузить старший байт
    dec temp            ; минус 1
    sts m_motor_count2,temp        ; save
    cpi temp, 0            
    brne l_motor_end        

    ; мен€ем стадию работы
;l_motor3_0:        
    lds temp, m_motor_stage    ; кака€ стади€ работы?
    cpi temp, 0     ; если=0
    brne l_motor3_1    ; если 1=
    ldi temp,1
    sts m_motor_stage, temp ; стади€=1
    ldi temp, c_motor_mode    ; частота - старша€ часть 
    rjmp l_motor3_2

l_motor3_1:    
    ldi temp,0
    sts m_motor_stage, temp ; стади€=0
    ldi temp2, c_motor_mode    ; частота - старша€ часть 
    ldi temp,10    ; если 0- пауза, врем€ паузы равно 10 минус врем€ работы
    sub temp, temp2    ;
    
l_motor3_2:    
    ; установка дл€ Ў»ћ
    lsl temp
    lsl temp
    lsl temp
    lsl temp
    sts m_motor_count2, temp ; частота - старша€ часть 

    ldi temp, c_motor_freq    ; частота - mладша€ часть 
    sts m_motor_count1, temp ;

l_motor_end:

    rjmp start

; подпрограмма задержки
f_wait:
loop71:    

    ldi r27,c_wait1
loop72:    
    
    ldi r26,c_wait2

loop73:    dec r26
    nop
    nop
    nop
    cpi r26,0
    brne loop73    ;---------------

    dec r27
    cpi r27,0
    brne loop72    ;----------------

    dec r28
    cpi r28,0
    brne loop71    ;----------------
    ret
    .exit    

29.07.2004 ƒатчик вращени€ ведущих колес

я приклеил маленький магнит к колесу, а на корпус установил геркон, контакты которого подключил к общему проводу и одному из входов.

–обот подъезжает к преп€тствию, останавливаетс€, примерно полсекунды уходит на то, чтобы пон€ть, что дальше ехать он не может, включаетс€ программа разворота или поворота.

ѕрограммно реализовано достаточно просто- использу€ 2 €чейки пам€ти (A“90S2313), € веду обратный отсчет от факта изменени€ датчика (1/0). ≈сли пауза зат€гиваетс€, идет переход на ту часть программы, котора€ отвечает за разворот (поворот). ѕри каждом изменении датчика € инициализирую переменные обратного отсчета.

¬ перспективе можно установить 2 магнита. “акже можно написать программу, котора€ будет контролировать именно скорость движени€, потому что робот может двигатьс€ и по наклонной плоскости. ¬ этом случае будет ложное срабатывание.

 

; инициализаци€
.EQU    c_sensor_shaft_pin=3        ; на каком пине shaft сенсор
.EQU    c_sensor_shaft_wait=$A0        ; задержка пока есть контакт


.EQU    m_sensor_shaft_wait1=$0070    ;counter
.EQU    m_sensor_shaft_wait2=$0071    ;counter
.EQU    m_sensor_shaft_mem=$0072     ; memory stage (1/0)


.DEF    temp=R30
.DEF    temp2=R29




; часть программы, котора€ обрабатывает данные с сенсора


    lds temp2, m_sensor_shaft_mem    
    in temp,PIND    ; прочитать порт ƒ

    sbrs temp, c_sensor_shaft_pin    ; если установлен сенсор
    rjmp l_ssensor2    

    cpi temp2,1
    breq l_ssensor3    

    ldi temp,1    
    sts m_sensor_shaft_mem, temp    ; save 1
    rjmp l_ssensor4


l_ssensor2:
    cpi temp2,0 
    breq l_ssensor3    

    clr temp
    sts m_sensor_shaft_mem, temp    ; save 0
    rjmp l_ssensor4


l_ssensor3:
    ; count  test jump


    lds temp, m_sensor_shaft_wait1    ; младша€ часть
    cpi temp,0
    brne l_ssensor31
    ldi temp, $ff    ; частота - mладша€ часть 

    sts m_sensor_shaft_wait1, temp ; сохранить младший байт

    lds temp, m_sensor_shaft_wait2    ; старша€ часть
    cpi temp,0
    brne l_ssensor32
    rjmp l_back    ; счетчики - нули, перейти на обработку разворота


l_ssensor31:
    dec temp
    sts m_sensor_shaft_wait1, temp ; сохранить младший байт
    rjmp l_ssensor5


l_ssensor32:
    dec temp
    sts m_sensor_shaft_wait2, temp ; сохранить st байт
    rjmp l_ssensor5


l_ssensor4:
    ; инициализировать счетчики
    ldi temp, $ff
    sts m_sensor_shaft_wait1, temp
    ldi temp,c_sensor_shaft_wait    
    sts m_sensor_shaft_wait2, temp     
l_ssensor5:


 


04.08.2004 » -сенсор (бампер)

¬ »нтернете € нашел множество схем » -сенсоров, но большинство их них были на ћ  PIC. я с ними близко не знаком, разбираюсь пока с Atmel, поэтому использовал схему от www.roboclub.ru, основанную на ATiny12. —енсор получаетс€ достаточно дорогосто€щим, но, думаю, что вскоре € разработаю свой вариант. √лавное- это стабильный генератор. ≈го можно собрать и на элементах Ћј3, и на микросхеме 555, но € не уверен, что сенсор будет работать стабильно. ” мен€ уже есть осциллгограф, поэтому буду наде€тьс€, что рани или поздно все получитс€. — этой схемой € разобралс€ в основном после того, как просмотрел все сигналы на осциллографе. ѕоэтому рекомендую приобрести или вз€ть в аренду (€ купил за $50 аппарат —1-49 выпуска 1970 года).

¬от тут € попыталс€ изобразить схему.

ѕечатна€ плата вам не нужна, да и не умею € делать красиво.  стати, платы € делаю по технологии "пленка-лазерный принтер-утюг-хлорное железо".

ќт плата:

¬от как это выгл€дит совместно с роботом:

–обот отлично "видит" стены, другие преп€тстви€. ≈сли он упираетс€ в какой-нибудь предмет и не может сам разобратьс€, € беру в руки пульт ƒ” и помогаю ему. ƒальнобойность пульта мен€ поражает (а может это наоборот, чувствительность датчика?) - если € вижу робота, то и робот видит сигнал. ј если робот уехал в коридор или другую комнату, то и там € его могу "достать" при помощи пульта ƒ”.

“ут по поводу пульта ƒ” у мен€ уже есть идеи. Ќужно как-то кодировать сигнал, потому что он будет пересекатьс€ с сигналами других роботов, а в случае боевого робота он должен наоборот, "идти" на вражеский сигнал, а если видит отражение своего, реагировать как на преп€тстви€. »нтересно, ведь от вражеского робото тоже будет отражатьс€ сигнал!?! “ут нужно подумать.

„асть программы € привожу, но она достаточно проста€. ≈ще не дошли руки до серьезной переработки.

;----- бампер начало

    in temp, c_sensor_bumper_inpin    ; прочитать порт bumper
    sbrc temp, c_sensor_bumper_pin1    ; если не установлен сенсор
;    rjmp l_bsensor2
    rjmp program_stop
    rjmp l_bsensor5


    sbrc temp, c_sensor_bumper_pin2    ; если не установлен сенсор
;    rjmp l_bsensor3
    rjmp program_stop
    rjmp l_bsensor5


l_bsensor5:
;----- бампер конец


 лючевые слова:
робот на платформе
–оботы своими руками
робот
робототехника


¬ернутьс€ в рубрику:

–оботы своими руками


≈сли вы хотите видеть на нашем сайте больше статей то кликните ѕоделитьс€ в социальных сет€х! —пасибо!
—мотрите также:

ќбратите внимание полезна€ информаци€.