|
Каталог
|
Робот 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).
Дякуємо Вам за звернення! Ваш відгук з'явиться після модерації адміністратором.
Поки немає відгуків на цю статтю.
|

Рис. 2
Рис. 2
Рис. 3
Рис. 4
Рис. 5
Рис. 6
Рис. 7
Рис. 8
Рис. 9a
Рис. 9b
Рис. 10
Рис. 11
Рис. 12
Рис. 13
Рис. 14
Рис. 15
Рис. 16
Рис. 17
Рис. 18
Рис. 19
Рис. 20
Рис. 21
Рис. 22
Рис. 23
Рис. 24

