Каталог
|
Робот Arduino – ПЕС2014-03-05 Все статьи →
Робот Arduino – ПЕС. Робот из готовых узлов серии Arduino (рис. 1)
Вашему вниманию предоставляется робот похожий на собаку - на четырех ногах и с головой. Внешняя схожесть на собаку послужила названием для робота – Arduino ПЕС. Для передвижения, робот использует четыре лапы и два средних шарнира. Лапы передвигаются вперед, назад, а шарниры заставляют наклонятся в бок передние и задние узлы лап. Повторив этот проект, можно быстро собрать из готовых элементов робота и запрограммировать ходить. Что бы упростить электронику робота, в основе управления заложены две платы: Arduino nano (рис. 2), nano-IO Shield (рис. 3).
На плате управления Arduino nano [1] имеется микроконтроллер ATmega328Р (рис. 2), и собственный стабилизатор напряжения. Плата имеет расстановку контактов согласно версии V3.0 [1], более подробно описание платы можно найти на [2]. Плата управления Arduino nano исполняет роль логически программируемого контроллера. Контроллер выполняет пошагово заданную программу Листинг 1, Листинг 2.
.include "D:\Program Files\Atmel\AVR Studio\Appnotes\m328Pdef.inc" ;Автор: Кравченко А.В. ;Дата: 9.01.2014 ;Версия: 1.1.21 ;Имя файла: hoddod8.asm ;Микроконтроллер: AVR mega328P. ;Тактовая частота: 16 мГц ;Питание: стабилизированное 5 В .list .def adr = r0 ; Рабочий регистр .def prg1 = r18 ; Рабочий регистр .def prg2 = r28 ; Рабочий регистр .def tmp =r27 ; Общий регистр .def DN =r29 ; Рабочий регистр .def tmp2 = r20 ; Рабочий регистр .def R = r21 ; Рабочий регистр .def L = r22 ; Рабочий регистр .def S = r23 ; Рабочий регистр .def E = r24 ; Рабочий регистр .def P = r25 ; Рабочий регистр .def Q = r19 ; Рабочий регистр .def G = r20 ; Рабочий регистр .def XN = r26 ; Рабочий регистр .def YN = r17 ; Рабочий регистр .def MN = r16 ; Рабочий регистр .def tmp3 = r30 ; Рабочий регистр .def adc1 = r31 ; Рабочий регистр .cseg .org 0 rjmp RESET nop ;rjmp EXT_INT0 ; nop nop ;rjmp EXT_INT1 ; nop nop ;rjmp PCINT0 прерывание не используется nop nop ;rjmp PCINT1 прерывание не используется nop nop ;rjmp PCINT0 прерывание не используется nop nop ;rjmp WDT ; nop nop ;rjmp TIMER2_COMPA прерывание от таймера nop nop ;rjmp TIMER2_COMPB прерывание от таймера nop ;rjmp TIMER2_OTOIE0 0 78VF ;прерывание от таймера T2 nop nop ;rjmp TIMER1_CAPT прерывание от таймера nop nop ;rjmp TIMER1_COMPA прерывание от таймера22 nop nop nop nop rjmp TIMER1_COMPB ;прерывание от таймера nop ;rjmp TIMER1_OVF ;прерывание от таймера1 nop nop ;rjmp TIMER0_COMPA прерывание от таймера nop nop ;rjmp TIMER0_COMPB прерывание от таймера nop rjmp TIMER0_OVF ;прерывание от таймера0 nop nop ;rjmp SPI_STC прерывание не используется nop nop ;rjmp UCASRT_RXC прерывание от USART nop nop ;rjmp UCASRT_UDRE прерывание от USART nop nop ;rjmp UCASRT_TXC прерывание от USART nop nop ;rjmp ADC прерывание от АЦП nop nop ;rjmp EE_RDY прерывание от таймера nop nop ;rjmp ANA_COMP прерывание от компаратора nop nop ;rjmp TWI прерывание от TWI nop nop ;rjmp SPM_RDY прерывание не используется .org 64 RESET: nop ;***************************************************** ;настройка портов ввода - вывода clr tmp ldi tmp, $00 ; out DDRC, tmp out PORTC, tmp ;обнулить порт C clr tmp ldi tmp, $E0 ;PD5-PD8 -выход out DDRD, tmp clr tmp out PORTD, tmp ;обнулить порт D ldi tmp, $3F ;PB0-PB3, PB4,PB5 -выход out DDRB, tmp clr tmp out PORTB, tmp ;обнулить порт B ;******************************************************** ;Исходные данные clr tmp ldi L, $15 ldi R, $15 ldi S, $15 ldi E, $15 ldi P, $15 ldi Q, $15 ;**************************************************** ;настройка программного стека ldi tmp, low(RAMEND) ;указатель стека out SPL, tmp ;полный стек ldi tmp, high(RAMEND) out SPH, tmp ;*************************************************************** sei ;Начало программы nStart: nop ;сброс всех значений clr tmp clr tmp2 clr prg1 clr prg2 clr adr ;************************************************* ;Ждем свет, считываем с ADC0 фотодатчик менее 1/3 Uпит qazx: nop sbi PORTB, 5 ;установить в 1 PORTB5 nop rcall zader05 nop rcall adcn nop clc clz cls subi tmp2, $73 cbi PORTB, 5 ;установить в 1 PORTB5 brsh qazx nop cbi PORTB, 5 ;установить в 1 PORTB5 sei ;Свет есть, робот стоит ;************************************Пауза в 100 мс clr tmp out TCCR0A,tmp ldi tmp,$05 out TCCR0B,tmp ;деление СК/1024 ldi tmp, $01 out TCNT0, tmp ldi tmp, $01 sts TIMSK0,tmp ;разрешаем прерывания по переполнению от Т0 clr DN reewv: nop ;Сброс портов rcall sbros nop clz cln cpi DN, $D2 breq ddwv rjmp reewv nop ddwv: nop sbi PORTB, 5 ;установить в 1 PORTB5 ;робот идет ;********************************** ldi tmp,$00 out TCCR0B,tmp ;счетчик остановлен clr prg1 clr prg2 ;Запуск таймера 20 мС ldi tmp,$00 out TIFR1, tmp sts TCCR1A,tmp ;режим работы нормальный ldi tmp,$04 ;режим работы нормальный, запуск таймера sts TCCR1B,tmp ; ldi tmp,$04 sts OCR1BH,tmp ldi tmp,$F0 sts OCR1BL,tmp ldi tmp, $00 sts TCNT1H, tmp ldi tmp, $4F sts TCNT1L, tmp ldi tmp, $04 sts TIMSK1,tmp ;разрешаем прерывания по совпадению от Т1 ;*************************************************************** sei ;разрешение прерываний ;сброс всех величин ;*************************************************************** ;Первая часть ;Запись в ОЗУ данных фазы sbi PORTB, 5 ;установить в 1 PORTB5 ldi L, $15 ldi R, $15 ldi S, $15 ldi E, $15 ldi P, $15 ldi Q, $15 ldi G, $15 mov r2, L mov r3, R mov r4, S mov r5, E mov r6, P mov r7, Q mov r8, G clr prg1 clr prg2 ree: nop ;Сброс портов rcall sbros nop clz cln cpi prg1, $1D breq dd rjmp ree nop dd: nop clr prg1 clz cln ;Проверка 50 раз выполнена фаза (для суммы 1С) cpi prg2, $10 ;20 раз breq ren rjmp ree fdd2: nop ;начало цикла установка в исходное сосстояние 90-90 грд ;фаза голова влево ;*********************************************************** ren: nop; sei ;разрешение прерываний clr prg1 clr prg2 rel23: nop;Сброс портов rcall sbros cbi PORTB, 0 ;установить в 0 PORTB5 ldi L, $15 ldi R, $15 ldi S, $15 ldi E, $15 ldi P, $15 ldi Q, $15 ldi G, $20 mov r2, L mov r3, R mov r4, S mov r5, E mov r6, P mov r7, Q mov r8, G ;Сброс портов rcall sbros nop clz cln cpi prg1, $1D breq dd123 rjmp rel23 nop dd123: nop clr prg1 clz cln ;Проверка 6 раз выполнена фаза (для суммы 120 mС) cpi prg2, $1F ;20 раз breq ren3 rjmp rel23 ;********************************************************** ren3: nop; sei ;разрешение прерываний clr prg1 clr prg2 rel2: nop;Сброс портов rcall sbros sbi PORTB, 0 ;установить в 0 PORTB5 ldi L, $15 ldi R, $15 ldi S, $15 ldi E, $15 ldi P, $15 ldi Q, $15 ldi G, $10 mov r2, L mov r3, R mov r4, S mov r5, E mov r6, P mov r7, Q mov r8, G ;Сброс портов rcall sbros nop clz cln cpi prg1, $1D breq dd12 rjmp rel2 nop dd12: nop clr prg1 clz cln ;Проверка 6 раз выполнена фаза (для суммы 120 mС) cpi prg2, $1F ;20 раз breq ren2 rjmp rel2 ;********************************************************** ;Идем прямо фаза 1 ren2: nop; sei ;разрешение прерываний clr prg1 clr prg2 rel: nop;Сброс портов rcall sbros cbi PORTB, 5 ;установить в 0 PORTB5 ldi L, $15 ldi R, $15 ldi S, $15 ldi E, $15 ldi P, $15 ldi Q, $15 ldi G, $15 mov r2, L mov r3, R mov r4, S mov r5, E mov r6, P mov r7, Q mov r8, G ;Сброс портов rcall sbros nop clz cln cpi prg1, $1D breq dd1 rjmp rel nop dd1: nop clr prg1 clz cln ;Проверка 6 раз выполнена фаза (для суммы 120 mС) cpi prg2, $1F ;20 раз breq res rjmp rel ;********************************************************** ;фаза 2 res: nop sei ;разрешение прерываний clr prg1 clr prg2 rets: nop;Сброс портов rcall sbros sbi PORTB, 5 ;установить в 1 PORTB5 ldi L, $10 ldi R, $15 ldi S, $15 ldi E, $15 ldi P, $15 ldi Q, $20 mov r2, L mov r3, R mov r4, S mov r5, E mov r6, P mov r7, Q nop clz cln cpi prg1, $1D breq ds rjmp rets nop ds: nop clr prg1 clz cln ;Проверка 6 раз выполнена фаза (для суммы 120 mС) cpi prg2, $1F ;20 раз breq ree112 rjmp rets ;****************************************************** ;фаза 3 ree112: nop sei ;разрешение прерываний clr prg1 clr prg2 rew: nop;Сброс портов cbi PORTB, 5 ;установить в 0 PORTB5 ldi L, $15 ldi R, $15 ldi S, $15 ldi E, $15 ldi P, $15 ldi Q, $15 mov r2, L mov r3, R mov r4, S mov r5, E mov r6, P mov r7, Q clz cln cpi prg1, $1D breq dd13 rjmp rew nop dd13: nop clr prg1 clz cln ;Проверка 6 раз выполнена фаза (для суммы 120 mС) cpi prg2, $10 ;20 раз breq ree21 rjmp rew ;****************************************************** ;фаза 4 ree21: nop sei ;разрешение прерываний clr prg1 clr prg2 remm: nop sbi PORTB, 5 ;установить в 1 PORTB5 ldi L, $20 ldi R, $15 ldi S, $15 ldi E, $10 ldi P, $15 ldi Q, $15 mov r2, L mov r3, R mov r4, S mov r5, E mov r6, P mov r7, Q ;Сброс портов rcall sbros nop clz cln cpi prg1, $1D breq ddl77 rjmp remm nop ddl77: nop clr prg1 clz cln ;Проверка 6 раз выполнена фаза (для суммы 120 mС) cpi prg2, $1F ;20 раз breq ree31 rjmp remm ;*********************************************************** ;Фаза 5 ree31: nop sei ;разрешение прерываний clr prg1 clr prg2 reyu: nop cbi PORTB, 5 ;установить в 1 PORTB5 ldi L, $15 ldi R, $15 ldi S, $15 ldi E, $15 ldi P, $15 ldi Q, $15 mov r2, L mov r3, R mov r4, S mov r5, E mov r6, P mov r7, Q ;Сброс портов rcall sbros nop clz cln cpi prg1, $1D breq ddyu rjmp reyu nop ddyu: nop clr prg1 clz cln ;Проверка 6 раз выполнена фаза (для суммы 120 mС) cpi prg2, $10 ;20 раз breq ree312 rjmp reyu ree312: nop ;************************************************** ;Фаза 6 sei ;разрешение прерываний clr prg1 clr prg2 resm2: nop sbi PORTB, 5 ;установить в 1 PORTB5 ldi L, $15 ldi R, $20 ldi S, $20 ldi E, $15 ldi P, $15 ldi Q, $15 mov r2, L mov r3, R mov r4, S mov r5, E mov r6, P mov r7, Q ;Сброс портов rcall sbros nop clz cln cpi prg1, $1D breq ddl27t rjmp resm2 nop ddl27t: nop clr prg1 clz cln ;Проверка 6 раз выполнена фаза (для суммы 120 mС) cpi prg2, $1F ;20 раз breq ree314r rjmp resm2 ;*********************************************************** fdd: nop rjmp fdd2 ;Фаза 7 ree314r: nop sei ;разрешение прерываний clr prg1 clr prg2 remm3: nop cbi PORTB, 5 ;установить в 1 PORTB5 ldi L, $15 ldi R, $15 ldi S, $15 ldi E, $15 ldi P, $15 ldi Q, $15 mov r2, L mov r3, R mov r4, S mov r5, E mov r6, P mov r7, Q ;Сброс портов rcall sbros nop clz cln cpi prg1, $1D breq ddl47r rjmp remm3 nop ddl47r: nop clr prg1 clz cln ;Проверка 6 раз выполнена фаза (для суммы 120 mС) cpi prg2, $10 ;20 раз breq ree315r rjmp remm3 ree315r: nop sei ;разрешение прерываний clr prg1 clr prg2 ;*********************************************************** ;Фаза 8 reyuq: nop sbi PORTB, 5 ;установить в 1 PORTB5 ldi L, $15 ldi R, $10 ldi S, $15 ldi E, $15 ldi P, $10 ldi Q, $15 mov r2, L mov r3, R mov r4, S mov r5, E mov r6, P mov r7, Q ;Сброс портов rcall sbros nop clz cln cpi prg1, $1D breq ddyuq rjmp reyuq nop ddyuq: nop clr prg1 clz cln ;Проверка 6 раз выполнена фаза (для суммы 120 mС) cpi prg2, $1F ;20 раз breq ree312q rjmp reyuq ree312q: nop ;*********************************************************** ;фаза 9 sei ;разрешение прерываний clr prg1 clr prg2 reyuww: nop cbi PORTB, 5 ;установить в 1 PORTB5 ldi L, $15 ldi R, $15 ldi S, $15 ldi E, $15 ldi P, $15 ldi Q, $15 mov r2, L mov r3, R mov r4, S mov r5, E mov r6, P mov r7, Q ;Сброс портов rcall sbros nop clz cln cpi prg1, $1D breq ddyuwws rjmp reyuww nop ddyuwws: nop clr prg1 clz cln ;Проверка 6 раз выполнена фаза (для суммы 120 mС) cpi prg2, $10 ;20 раз breq reewws rjmp reyuww reewws: nop clr prg1 clr prg2 nop sei ;разрешение прерываний rjmp fdd ;*********************************************************** ;Дальше программа работает только по прерыванию ;****************************************** ;Обработка прерывания по Т 1 20 мС TIMER1_COMPB: nop cli ldi tmp,$00 out TIFR1, tmp sts TCCR1A,tmp ;режим работы нормальный ldi tmp,$04 ;режим работы нормальный, запуск таймера sts TCCR1B,tmp ; ldi tmp,$04 sts OCR1BH,tmp ldi tmp,$F0 sts OCR1BL,tmp ldi tmp, $00 sts TCNT1H, tmp ldi tmp, $4F sts TCNT1L, tmp ldi tmp, $04 sts TIMSK1,tmp ;разрешаем прерывания по совпадению от Т1 nop ldi prg1, $1D inc prg2 sbi PORTD, 6 ;установить в 1 PORTD6 ;Запуск отсчета 0,5 мС rcall zader05 nop ;Запуск отсчета 0,5мС rcall zader05 nop rcall trim cls clz ;Проверка 1,0 мС subi L, $10 brne sit nop rcall trim nop rcall trim nop rcall trim nop rcall trim nop rcall trim nop rcall trim nop rcall trim cbi PORTD, 6 ;установить в 0 PORTD6 sit: nop ;************************************************************** 1 mS ;Запуск отсчета 0,5 мС rcall zader05 nop ;Проверка 1,5 мС cls clz subi L, $05 brne sit1 cbi PORTD, 6 ;установить в 0 PORTD6 sit1: nop ;************************************************************** 1,5 mS rcall zader025 nop ; rcall trim ;-0,25 mS ;Проверка 2,0 мС rcall sbros nop ;***************************************************************вторая нога sbi PORTB, 1 ;Запуск отсчета 0,5 мС rcall zader05 nop ;Запуск отсчета 0,5мС rcall zader05 nop rcall trim cls clz subi R, $10 brne dicc nop rcall trim nop rcall trim nop rcall trim nop rcall trim nop rcall trim nop rcall trim nop rcall trim ;1,25 mS cbi PORTB, 1 ;сбросить в 0 PORTB1 dicc: nop ;************************************************************** 1 mS ;Запуск отсчета 0,5 мС rcall zader05 nop ;Проверка 1,5 мС cls clz subi R, $05 brne dicc1 cbi PORTB, 1 ;сбросить в 0 PORTB1 dicc1: nop ;************************************************************** 1,5 mS rcall zader025 nop ; rcall trim ;-0,25 MS ;Проверка 2,0 мС cls clz subi R, $05 brne dicc2 cbi PORTB, 1 ;сбросить в 0 PORTB1 dicc2: nop ;************************************************************** 2,0 mS ;Сброс портов rcall sbros nop ;****************************************************третья нога sbi PORTB, 3 ;Запуск отсчета 0,5 мС rcall zader05 nop ;Запуск отсчета 0,5мС rcall zader05 nop rcall trim cls clz subi S, $10 brne dics cbi PORTB, 3 ;сбросить в 0 PORTB3 dics: nop ;************************************************************** 1 mS ;Запуск отсчета 0,5 мС rcall zader05 nop ;Проверка 1,5 мС cls clz subi S, $05 brne dicn cbi PORTB, 3 ;сбросить в 0 PORTB3 dicn: nop ;************************************************************** 1,5 mS rcall zader05 nop rcall trim ;Проверка 2,0 мС cls clz subi S, $05 brne dicl cbi PORTB, 3 ;сбросить в 0 PORTB3 dicl: nop ;************************************************************** 2,0 mS rcall sbros ;*********************************************************четвертая нога sbi PORTB, 0 ;Запуск отсчета 0,5 мС rcall zader05 nop ;Запуск отсчета 0,5мС rcall zader05 nop rcall trim cls clz subi P, $10 brne dier cbi PORTB, 0 ;сбросить в 0 PORTB1 dier: nop ;************************************************************** 1 mS ;Запуск отсчета 0,5 мС rcall zader05 nop ;Проверка 1,5 мС cls clz subi P, $05 brne dirt cbi PORTB, 0 ;сбросить в 0 PORTB1 dirt: nop ;************************************************************** 1,5 mS rcall zader05 nop rcall trim ;Проверка 2,0 мС cls clz subi P, $05 brne dity cbi PORTB, 0 ;сбросить в 0 PORTB1 dity: nop ;************************************************************** 2,0 mS ;Сброс портов rcall sbros nop ;***********************************************************пятая нога sbi PORTD, 7 ;Запуск отсчета 0,5 мС rcall zader05 nop ;Запуск отсчета 0,5мС rcall zader05 nop rcall trim cls clz subi E, $10 brne diyu cbi PORTD, 7 ;сбросить в 0 PORTB1 diyu: nop ;************************************************************** 1 mS ;Запуск отсчета 0,5 мС rcall zader05 nop ;Проверка 1,5 мС cls clz subi E, $05 brne diui cbi PORTD, 7 ;сбросить в 0 PORTB1 diui: nop ;************************************************************** 1,5 mS rcall zader05 nop rcall trim ;Проверка 2,0 мС cls clz subi E, $05 brne dicc29 cbi PORTD, 7 ;сбросить в 0 PORTB1 dicc29: nop ;************************************************************** 2,0 mS ;Сброс портов rcall sbros nop ;*********************************************************шестая нога sbi PORTB, 2 ;Запуск отсчета 0,5 мС rcall zader05 nop ;Запуск отсчета 0,5мС rcall zader05 nop rcall trim cls clz subi Q, $10 brne diop cbi PORTB, 2 ;сбросить в 0 PORTB1 diop: nop ;************************************************************** 1 mS ;Запуск отсчета 0,5 мС rcall zader05 nop ;Проверка 1,5 мС cls clz subi Q, $05 brne dipp cbi PORTB, 2 ;сбросить в 0 PORTB1 dipp: nop ;************************************************************** 1,5 mS rcall zader05 nop rcall trim ;Проверка 2,0 мС cls clz subi Q, $05 brne diqq cbi PORTB, 2 ;сбросить в 0 PORTB1 diqq: nop ;************************************************************** 2,0 mS ;Сброс портов rcall sbros nop ;*********************************************************голова sbi PORTB, 4 ;Запуск отсчета 0,5 мС rcall zader05 nop ;Запуск отсчета 0,5мС rcall zader05 nop rcall trim cls clz subi G, $10 brne diopx cbi PORTB, 4 ;сбросить в 0 PORTB1 diopx: nop ; rjmp bbb ;************************************************************** 1 mS ;Запуск отсчета 0,5 мС rcall zader05 nop ;Проверка 1,5 мС cls clz subi G, $05 brne dippx cbi PORTB, 4 ;сбросить в 0 PORTB1 dippx: nop ;************************************************************** 1,5 mS rcall zader05 nop rcall trim ;Проверка 2,0 мС cls clz subi Q, $05 brne bbb cbi PORTB, 4 ;сбросить в 0 PORTB1 ;************************************************************** 2,0 mS ;Сброс портов bbb: nop rcall sbros nop mov L, r2 mov R, r3 mov S, r4 mov E, r5 mov P, r6 mov Q, r7 mov G, r8 sei ;разрешить прерывание reti ;**************************************Подпрограммы ;прерывание от таймера0 TIMER0_OVF: nop nop inc DN wdr reti ;**************************************Подпрограммы ;Сброс портов sbros: nop cbi PORTD, 6 ;установить в 0 PORTD6 cbi PORTB, 1 ;установить в 0 PORTB1 cbi PORTB, 3 ;установить в 0 PORTB3 cbi PORTD, 7 ;установить в 0 PORTD6 cbi PORTB, 0 ;установить в 0 PORTB1 cbi PORTB, 2 ;установить в 0 PORTB2 cbi PORTB, 4 ;установить в 0 PORTB4 ret ;Подпрограмма регулировки задержки включения mS trim : nop wdr ldi YN, $12 ldi MN, $02 ldi XN, $02 dm1: nop nop nop nop dv1: nop wdr nop dx1: nop cln dec YN brpl dx1 cln dec XN brpl dv1 cln dec MN brne dm1 ret ;Подпрограмма задержки включения 0,5 mS zader05 : nop wdr ldi YN, $76 ldi MN, $76 ldi XN, $76 dm: nop nop nop dv: nop wdr nop dx: nop nop nop nop nop nop nop nop cln dec YN brpl dx cln dec XN brpl dv cln dec MN brne dm ret ;***************************************************** ;Подпрограмма задержки включения 0,25 mS zader025 : nop wdr ldi YN, $16 ldi MN, $46 ldi XN, $76 dmvv: nop nop nop dvvv: nop wdr nop dxvv: nop nop nop nop nop nop nop nop cln dec YN brpl dxvv cln dec XN brpl dvvv cln dec MN brne dmvv ret ;***************************************************** ;Подпрограмма АЦП обработки данных ;Настройка АЦП adcn: nop cli ;отключение цифровых входов ldi tmp, $3F sts DIDR0, tmp nop nop nop clr tmp awe: nop cpi tmp, $04 brsh ass ;коммутация входов АЦП ADC0 REF=Uпит ldi adc1, $40 sts ADMUX, adc1 clr tmp2 clr tmp3 nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop ldi adc1, $C7 nop nop ;запуск АЦП на непрерыв преобразование, 125 кГц sts ADCSRA, adc1 clr tmp3 sts ADCSRB, tmp3 fln: nop lds prg1, ADCSRA sbrs prg1, 4 rjmp fln ;Сохранение данных АЦП lds tmp2, ADCL lds tmp3, ADCH mov r10, tmp2 mov r11, tmp3 mov r12, r10 mov r13, r11 mov r14, r12 mov r15, r13 inc tmp rjmp awe ;среднее арифметическое действие ass: nop clr r8 clc add tmp2, r10 adc r9, r8 add tmp2, r12 adc r9, r8 add tmp2, r14 adc r9, r8 clc lsr r9 ror tmp2 lsr r9 ror tmp2 clr r9 clc add tmp3, r11 adc r9, r8 add tmp3, r13 adc r9, r8 add tmp3, r15 adc r9, r8 clc lsr r9 ror tmp3 lsr r9 ror tmp3 nop ret .EXIT
:020000020000FC :100000003FC00000000000000000000000000000F1 :1000100000000000000000000000000000000000E0 :1000200000000000000000000000000000000000D0 :10003000000022C2000000000000000000000000DC :100040002BC30000000000000000000000000000C2 :1000500000000000000000000000000000000000A0 :060060000000000000009A :100080000000BB27B0E0B7B9B8B9BB27B0EEBAB92A :10009000BB27BBB9BFE3B4B9BB27B5B9BB2765E183 :1000A00055E175E185E195E135E1BFEFBDBFB8E010 :1000B000BEBF78940000BB2744272227CC2700240A :1000C00000002D9A00000DD3000045D30000889455 :1000D0009894C89443572D9898F700002D987894D9 :1000E000BB27B4BDB5E0B5BDB1E0B6BDB1E0B093DE :1000F0006E00DD270000D5D200009894A894D23D70 :1001000011F0F8CF000000002D9AB0E0B5BD222715 :10011000CC27B0E0B6BBB0938000B4E0B0938100D0 :10012000B4E0B0938B00B0EFB0938A00B0E0B0932E :100130008500BFE4B0938400B4E0B0936F0078947E :100140002D9A65E155E175E185E195E135E145E1FE :10015000262E352E472E582E692E732E842E2227BA :10016000CC2700009ED200009894A8942D3111F065 :10017000F8CF0000000022279894A894C03111F015 :10018000F0CF0000000078942227CC27000089D20D :10019000289865E155E175E185E195E135E140E2B9 :1001A000262E352E472E582E692E732E842E79D268 :1001B00000009894A8942D3111F0E8CF00000000C1 :1001C00022279894A894CF3109F0E0CF00007894CA :1001D0002227CC27000065D2289A65E155E175E118 :1001E00085E195E135E140E1262E352E472E582E4A :1001F000692E732E842E55D200009894A8942D3128 :1002000011F0E8CF0000000022279894A894CF3185 :1002100009F0E0CF000078942227CC27000041D2DB :100220002D9865E155E175E185E195E135E145E11F :10023000262E352E472E582E692E732E842E31D21F :1002400000009894A8942D3111F0E8CF0000000030 :1002500022279894A894CF3109F0E0CF0000789439 :100260002227CC2700001DD22D9A60E155E175E1CF :1002700085E195E130E2262E352E472E582E692E47 :10028000732E00009894A8942D3111F0EBCF00004C :10029000000022279894A894CF3109F0E3CF000002 :1002A00078942227CC2700002D9865E155E175E16F :1002B00085E195E135E1262E352E472E582E692E03 :1002C000732E9894A8942D3111F0EDCF000000000A :1002D00022279894A894C03109F0E5CF00007894C3 :1002E0002227CC2700002D9A60E255E175E180E1DC :1002F00095E135E1262E352E472E582E692E732E88 :10030000D0D100009894A8942D3111F0EBCF0000CB :10031000000022279894A894CF3109F0E3CF000081 :1003200078942227CC2700002D9865E155E175E1EE :1003300085E195E135E1262E352E472E582E692E82 :10034000732EAFD100009894A8942D3111F0EBCF0B :100350000000000022279894A894C03109F0E3CF50 :10036000000078942227CC2700002D9A65E150E206 :1003700070E285E195E135E1262E352E472E582E87 :10038000692E732E8ED100009894A8942D3111F00F :10039000EBCF0000000022279894A894CF3119F0E9 :1003A000E3CF0000EECE000078942227CC27000097 :1003B0002D9865E155E175E185E195E135E1262E60 :1003C000352E472E582E692E732E6BD1000098942F :1003D000A8942D3111F0EBCF000000002227989453 :1003E000A894C03109F0E3CF000078942227CC27ED :1003F00000002D9A65E150E175E185E190E135E17C :10040000262E352E472E582E692E732E4AD10000E7 :100410009894A8942D3111F0EBCF00000000222712 :100420009894A894CF3109F0E3CF00007894222764 :10043000CC2700002D9865E155E175E185E195E156 :1004400035E1262E352E472E582E692E732E29D1B2 :1004500000009894A8942D3111F0EBCF000000001B :1004600022279894A894C03109F0E3CF00002227F6 :10047000CC270000789495CF0000F894B0E0B6BB8C :10048000B0938000B4E0B0938100B4E0B0938B00EF :10049000B0EFB0938A00B0E0B0938500BFE4B093B2 :1004A0008400B4E0B0936F0000002DE1C3955E9A24 :1004B00018D1000016D10000FDD0C8949894605166 :1004C00079F40000F7D00000F5D00000F3D0000070 :1004D000F1D00000EFD00000EDD00000EBD05E982E :1004E0000000FFD00000C8949894655009F45E980D :1004F000000014D10000D5D00000299AF2D00000ED :10050000F0D00000D7D0C8949894505179F40000EE :10051000D1D00000CFD00000CDD00000CBD0000063 :10052000C9D00000C7D00000C5D029980000D9D09C :100530000000C8949894555009F429980000EED012 :100540000000C8949894555009F429980000A9D047 :1005500000002B9AC6D00000C4D00000ABD0C894D5 :100560009894705109F42B980000BBD00000C894F7 :100570009894755009F42B980000B3D000009AD0DD :10058000C8949894755009F42B9800008AD0289A42 :10059000A8D00000A6D000008DD0C89498949051A7 :1005A00009F4289800009DD00000C89498949550B4 :1005B00009F42898000095D000007CD0C894989445 :1005C000955009F4289800006CD000005F9A89D0FB :1005D000000087D000006ED0C8949894805109F430 :1005E0005F9800007ED00000C8949894855009F46C :1005F0005F98000076D000005DD0C8949894855034 :1006000009F45F9800004DD000002A9A6AD00000DB :1006100068D000004FD0C8949894305109F42A98BB :1006200000005FD00000C8949894355009F42A98CF :10063000000057D000003ED0C8949894355009F47B :100640002A9800002ED000002C9A4BD0000049D0F0 :10065000000030D0C8949894405109F42C980000C0 :1006600040D00000C8949894455009F42C9800009C :1006700038D000001FD0C8949894355009F42C98B5 :1006800000000FD00000622D532D742D852D962D66 :10069000372D482D7894189500000000D395A89523 :1006A000189500005E9829982B985F9828982A98AA :1006B0002C9808950000A89512E102E0A2E0000045 :1006C0000000000000000000A89500000000A894B1 :1006D0001A95E2F7A894AA95B2F7A8940A9579F723 :1006E00008950000A89516E706E7A6E700000000B9 :1006F00000000000A89500000000000000000000BD :100700000000000000000000A8941A95AAF7A89421 :10071000AA957AF7A8940A9549F708950000A89534 :1007200016E106E4A6E70000000000000000A8951E :1007300000000000000000000000000000000000B9 :100740000000A8941A95AAF7A894AA957AF7A894F5 :100750000A9549F708950000F894BFE3B0937E002E :10076000000000000000BB270000B43070F5F0E48A :10077000F0937C004427EE270000000000000000FA :100780000000000000000000000000000000000069 :100790000000000000000000F7EC00000000F093F3 :1007A0007A00EE27E0937B00000020917A0024FF7E :1007B000FBCF40917800E0917900A42EBE2ECA2C88 :1007C000DB2CEC2CFD2CB395CFCF00008824889433 :1007D0004A0D981C4C0D981C4E0D981C88949694AC :1007E00047959694479599248894EB0D981CED0DA8 :1007F000981CEF0D981C88949694E7959694E7952D :040800000000089557 :00000001FF
На контроллер на выводы А0-А7, подаются аналоговые сигналы, после чего контроллер обрабатывает информацию и формирует сигналы управления на своих выходах D0-D12. Исполнительная плата nano-IO Shield (рис. 3) изготовляется компанией [3] и имеет схему (рис. 4).
Плата nano-IO Shield предназначена для установки платы Arduino nano а так же коммутации ее с внешними устройствами, серводвигателями, фотодатчиками и.т.д. Плата nano-IO Shield позволяет подключить до 12-ти серводвигателей и до 8-ми датчиков. Плата nano-IO Shield имеет отдельно шину для земли и для напряжения 5,0 В, а также коннектор, для внешнего питания. Плата nano-IO Shield очень удобна для конструирования несложных роботов или устройств.
Причем сечение провода должно быть около 1 мм2. Кроме этого, емкости конденсаторов С1-С19 недостаточно, для фильтрации скачков тока во время работы серводвигателей. Для этого необходимо к шине питания добавить емкость в 10000 мкфХ16.0 В. Конечно прямое добавление такой емкости вызовет короткое замыкание во время включения питания робота, поэтому последовательно с емкостью необходимо соединить резистор 14 Ом 2 Вт на заряд емкости, и диод Шоттки 1N5222 на разряд емкости (рис. 6).
Во время включения ток заряда будет ограничен сопротивлением 14 Ом. Во время работы при резком пуске серводвигателя ток разряда емкости пройдет через диод Шоттки (диод с малым падением напряжения на диодном барьере), тем самым, поддержав общее напряжение питание на плате nano-IO Shield на одном уровне. Далее емкость опять заряжается через резистор 14 Ом. Во время работы серводвигателей емкость будет разряжаться, а в паузах заряжаться.
Управление роботом от света.
При включении питания робота, программа опрашивает фотодатчик канала А0. Если фотодатчик уменьшил сопротивление под воздействием света, то программа продолжает работать и через 3- секундную паузу робот начнет идти. В полной темноте робот не двигается. Во время движения робот поворачивает голову влево, прямо и вправо. Оба фотодатчика считывают данные об уровне освещенности комнаты. Дальнейшая разработка программы предполагает движение робота на наиболее освещенный участок.
Силовая плата.
На силовой плате есть выключатель питания, а также светодиод включения питания. Так же для аварийного питания МК установлен резервный аккумулятор схемы управления G1 3.6 B 100 мАч в пальчиковом исполнении (тип АА).
Помехи платы управления. Принципы работы серводвигателей. Прежде всего, усилие которое развивает серводвигатель, должно быть как минимум в два раза больше собственного веса конструкции. Для полноценной работы сервопривода необходимо иметь импульсы управления в 1 mS поворот 0 грд, 1.5 mS-90 грд, 2.0 mS-180 грд с периодом повторения в 20 mS (рис. 9а).
Для исключения высокого потребления тока одновременно всеми сервоприводами, импульсы управления двигателями разнесены во времени (рис. 9б).
Сначала, включаются средние сервоприводы шарниров, и только затем, по очереди включаются сервоприводы ног. Такой способ управления позволяет избежать тока нагрузки более 2,5А. Что дает возможность выбрать негабаритные легкие батареи питания. Выбранный способ включения управляющих импульсов не влияет на последовательность действий сервоприводов. Это объясняется тем, что отработка импульса длится около 0,62-0,925 секунды. То есть, для выполнения команды повернуть ногу вперед, необходимо выполнить 31 цикл по 20 мС, что займет 0.62 секунды. Циклы можно уменьшить до 0.2 секунд, тогда нога не успеет повернутся на 90 градусов, но возникнет эффект дергания робота. В данном роботе, среднее положение сервоприводов выбрано как 90 грд поворота. Поэтому для ходьбы вперед надо отработать правой ноге 0 грд, а для ходьбы назад -180 грд. Точно так, для наклона на левый бок передний сервопривод должен отработать 0 грд, для среднего положения 90 грд, для наклона на правый бок – 180 грд video 1. Можно изменить угол поворота серводвигателя, например, на угол 25 грд или 160 грд. Для этого надо изменить длительность импульса управления, например на 1.25 mS или 1.75 mS. В Листинге 1 приведен пример, но точно выбрать заданный нестандартный угол можно, только установив данные в программе экспериментальным способом. При таких экспериментах возникает эффект дребезга сервопривода в нестандартном угле поворота. Дребезг вызывает большое потребление тока и может перегреть серводвигатель. Поэтому нестандартный угол поворота индивидуален для каждого серводвигателя и подбирается экспериментально. Для этого в программе есть подпрограмма trim которая регулируется программистом.
Программа написана на ассемблере согласно документации на микроконтроллер [4].
Управление фазами приведено в таблице 1. Для простоты обработки угла поворота серводвигателя выбраны значения 10 – 1 мС, 15 – 1.5 мС, 20 – 2.0 мС. Число 15 является средним положением серводвигателя. Как уже ранее говорилось, для выполнения поворота от начального положения до заданного, серводвигателю необходимо время около 0.62 С. Поэтому фаза повторяется несколько раз, количество циклов задается значением - prg2 (таблица 1). Таблица 1
Уменьшение времени повтора может привести к неоконченному повороту серводвигателя. Запуск таймера 1 начинает циклы длительностью в 20 мС. В течение одного периода в 20 мС формируются последовательно импульсы с максимальной длительностью в 2.0 мС. Всего за один период можно сформировать 10 импульсов по 2.0 мС рис 9б. В программе максимальное количество импульсов девять. Как только таймер 1 отсчитал 20 мС, программа переходит по вектору прерывания в подпрограмму TIMER1_COMPB. В этой подпрограмме выполняется перезапуск таймера 1 и формирование импульсов управления серводвигателями рис 9а. Подпрограмма TIMER1_COMPB, последовательно проверяет значение 10, 15, 20 на каждом узле поворота E, Q, L, R, P, S, G. Время импульсов формируется программным путем. Для этого формируются подпрограммы пауз Zader05, Zader025, trim. Разное время подпрограмм пауз необходимо для точной регулировки угла поворота серводвигателя. По окончанию фаз движения робота, подпрограмма переходит в начало на метку fdd, fdd2. Программа Листинг 1, Листинг 2 написана в симуляторе AVR Studio 4, на микроконтроллер записывалась программатором AVR DRAGON через шину ISP. Можно использовать Flip программу прошивки через ISP. Для записи другим путем, можно Listing2.hex файл вызвать из программы на языке С. В программе задействованы все регистры, поэтому добавление кода на языке С, может вызвать нарушение работы узлов робота. Конструктивные особенности: Первая конструктивная особенность связана с продольными нагрузками, можно сказать на хребет робота. Средние шарнирные серводвигатели принимают на себя очень большую продольную нагрузку, из-за сосредоточения веса всей конструкции на поворотные узлы. Поворотный узел изготовленный из пластмассы не выдержит вес аккумуляторов, платы управления, а так же крутящий момент во время ходьбы. Поэтому в средних шарнирах конструкции применены серводвигатели с металлическими сердечниками фирмы Tower Pro (MG90S). Такой шаг увеличивает расход энергии, но придает роботу большую нагрузочную способность и дает возможность поворачивать конечностями безболезненно (рис/ 11). Остальные серводвигатели конечностей робота от фирмы HEXTRONIC (HXT900).
Вторая конструктивная особенность – применение легкого и хорошо обрабатываемого пластика полиморфус. Для робота узлы из пластмассы уменьшают вес всей конструкции и позволяют быстро без особых затрат изготовить любую деталь в домашних условиях. Перед сборкой конструкции необходимо собрать всю электронику и проверить работоспособность серводвигателей. К сожалению, у серводвигателей бывают недоработки. Например, когда происходит заклинивание шестеренок, возникает слишком большой пусковой ток более 1 А. Иногда ограничитель крайнего положения ломается и происходит вращение без останова, иногда возникает дергание вала в крайних позициях (плохо откалиброванная электроника). Собирается робот согласно чертежа (рис/ 10). Плата на роботе может сниматься и устанавливаться. Так же узлы шарниров и ног сделаны съемными, что позволяет менять детали в случае выхода их из строя. Технология лепки узлов. Для начала, если Вы раньше не лепили никогда детали, лучше купить пластилин и вылепить макет всех деталей робота. Соединить временно с роботом, проверить расположение узлов. Все узлы должны быть симметричны относительно плоскости проходящей по центру робота. Прежде всего, необходимо лепить небольшими кусочками пластика, так как он имеет два нехороших свойства: быстро застывать – при этом желаемая форма детали может быть недостигнута. Второе свойство, если деталь небольшая, отрывая кусочки, в горячем состоянии они быстро липнут, когда необходимо исправить деталь и разогреть, деталь может прилипнут к оторванным остаткам. Тогда придется опять отрывать и лепить заново деталь. Лучше делать несколько небольших деталей, скрепляемых затем другими элементами конструкции. Например: для платы nano-IO Shield устанавливаются стойки из винтов М3 и пластиковых шайб (рис/ 12).
Предварительно нарезаются отрезки длиной 55 мм из любого материала (например, зубочисток или гигиенических палочек). На плате, головки винтов немного прослабляются, так что бы между головкой винта и шайбой был зазор около0,5 мм. После чего нагреваем в воде пластик и берем кусочек так чтобы обмотать стойку платы и отрезок гигиенической палочки 55 мм (рис/ 13).
посмотреть полную версию фотографии Далее изготавливаем средние шарниры. Для этого на любой доске рисуем контуры будущих конечностей робота и раскладываем серводвигатели так что бы ноги находились симметрично относительно центральной линии робота. Средние серводвигатели установлены так, что бы совпадала ось поворота шарнира для передних и задних ног. Поэтому корпуса сервоприводов расположены несимметрично рис 11. Корпуса средних серводвигателей соединены между собой кусочком пластика а боковой крепеж серводвигателя соединен трубочкой, согнутой в виде буквы П (рис. 14).
На съемные рычаги серводвигателя вкручиваются по два шурупа, идущие в комплекте с серводвигателем. Желательно шурупы вкручивать подальше друг от друга на неполную глубину. Далее лепится задняя часть робота. Для этого в ушки крепления серводвигателя вставляются два винта М2 длиной 16 мм с гайками. Вокруг гайки облепливается пластик и прижимается к выступающей кромке серводвигателя. Гайки должны попасть внутрь пластика. Таким образом, выполняются две стойки заднего узла робота (рис. 15).
После высыхания аналогично изготавливается передняя часть робота (рис. 16).
Собрав переднюю часть и заднюю часть робота, получим плоскую конструкцию без ног (рис. 17).
Затем на рычаги ног (идущие в комплекте с серводвигателем.) навинчиваются по два шурупа. На серводвигатели надеваются рычаги, так что бы они смотрели вертикально вниз по отношению к спине робота. Серводвигатели в выключенном состоянии можно понемногу без усилий поворачивать. Если придать усилие на поворот, можно сломать ограничители. На листочке бумаги рисуются контуры верхней части ноги. По этому контуру лепится нога и облепливается рычаг. Ноги лепятся на снятых с робота рычагах. Ноги необходимо делать одинаковые, левая и правая сторона отличается зеркальным расположением элементов детали. После чего ноги устанавливаются на робота (рис. 17). Конструкция должна стоять на всех четырех ногах одновременно. Не допускается перекоса или наклона конструкции в бок. Если сделан брак, то ногу опять помещают в кипяток, размягчают и переделывают. У ног есть стопа. Ее желательно делать отдельно (рис. 18).
Нижняя часть ноги нагревается и вставляется винт М2 длиной 16 мм.. В стопе сверлится отверстие диаметром 2,1 мм и продевается винт (рис. 19). На изгибах ноги и стопы сверлится отверстие и прикручивается шурупами пружина от авторучки. Аналогично делаются все четыре ноги. Ноги прикрепляют к серводвигателям робота (рис. 19).
Ноги должны стоять строго вертикально, а спина робота должна быть параллельна плоскости земли. В случае перекосов, необходимо расплавить короткую ногу и придать нужную высоту. На последок, для робота делается голова. Сначала, необходимо заготовить проволоку диаметром 0,8 мм длиной 340 мм. Проволока должна быть пружинной (используется в рыболовецких снастях). Сгибаем проволоку пополам под углом 25 грд. После чего свободные концы проволоки вставляем (в передней части робота) в трубочки рамы (рис. 20), так что бы концы выглядывали на 7 мм (в задней части робота) (рис. 15). У основания платы загибаем вверх проволоку. Получится сломанная в горизонтальной плоскости буква Л, если смотреть сбоку.
В верхней части проволоки сгибаем кончик под крепеж серводвигателя (рис. 20 - (обведен красным кругом), концы в задней части сгибаем, так чтобы проволока не выезжала из трубочек (рис. 15 - обведен красным кругом). На проволоке устанавливаем горизонтально серводвигатель и лепим крепеж спереди серводвигателя и сзади. В заднем крепеже залепливаем винт 1, так что бы он мог держать силовую плату с резервным аккумулятором. Для платы фотодатчиков изготавливаем глаза (рис. 21, 22).
К серводвигателю головы крепится плата с фотодатчиками. Далее к винту 1 крепим силовую плату. Соединяем провода от серводвигателей к плате I/O согласно таблице 1 (стока плата I/O). На плате I/O нанесены надписи рядом с штырьками для подключения серводвигателей. G –земля соответствует темно коричневому проводу от серводвигателя, V – питание соответствует красному проводу, S – управление соответствует желтому проводу (рис. 23).
Аккумуляторную батарею выбираем LI-ION 6,0 В 4000 мАч. Присоединяем стяжкой под брюхом робота. Или любой другой аккумулятор на 6.0 В можно носить отдельно от конструкции. Робот готов. Общий вес конструкции с аккумуляторами около 500 грамм (рис. 24).
Литература:
Благодарим Вас за обращение! Ваш отзыв появится после модерации администратором.
Пока нет отзывов на эту статью.
|