UA RU
Мобільна версія Гарантійні умови Співпраця
Зворотний зв'язок Мапа сайту
0 0
Графік роботи магазину:
Пн-Пт: 8.00 - 19.00
Сб: 10.00 - 19.00
Нд: вихідний
Каталог
Напиши статтю і отримай знижку!

Робот Arduino – ПЕС

2014-03-05

Всі статті →

Робот Arduino – ПЕС.
Кравченко А.В. г Киев

Робот из готовых узлов серии Arduino (рис. 1)

Рис. 2

Вашему вниманию предоставляется робот похожий на собаку - на четырех ногах и с головой. Внешняя схожесть на собаку послужила названием для робота – Arduino ПЕС. Для передвижения, робот использует четыре лапы и два средних шарнира. Лапы передвигаются вперед, назад, а шарниры заставляют наклонятся в бок передние и задние узлы лап. Повторив этот проект, можно быстро собрать из готовых элементов робота и запрограммировать ходить. Что бы упростить электронику робота, в основе управления заложены две платы: Arduino nano (рис. 2), nano-IO Shield (рис. 3).

Рис. 2 Рис. 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).

Рис. 4 полная версия →

Плата nano-IO Shield предназначена для установки платы Arduino nano а так же коммутации ее с внешними устройствами, серводвигателями, фотодатчиками и.т.д. Плата nano-IO Shield позволяет подключить до 12-ти серводвигателей и до 8-ми датчиков. Плата nano-IO Shield имеет отдельно шину для земли и для напряжения 5,0 В, а также коннектор, для внешнего питания. Плата nano-IO Shield очень удобна для конструирования несложных роботов или устройств.


Доработка платы nano-IO Shield.
К сожалению, разработчики платы недоработали подключение к серводвигателям. Ток серводвигателей может быть от 100 мА до 1500 мА в нагруженном состоянии, а разводка платы и фильтрация по питанию не соответствует такому току. Что бы избежать перегрева и выхода из строя стабилизатора U1 необходимо провод VDD5 отсоединить от питания +5,0 В и подсоединить напрямую к контакту 1 разъема J14, то есть к входному питающему источнику (рис. 5).

Рис. 5

Причем сечение провода должно быть около 1 мм2. Кроме этого, емкости конденсаторов С1-С19 недостаточно, для фильтрации скачков тока во время работы серводвигателей. Для этого необходимо к шине питания добавить емкость в 10000 мкфХ16.0 В. Конечно прямое добавление такой емкости вызовет короткое замыкание во время включения питания робота, поэтому последовательно с емкостью необходимо соединить резистор 14 Ом 2 Вт на заряд емкости, и диод Шоттки 1N5222 на разряд емкости (рис. 6).

Рис. 6

Во время включения ток заряда будет ограничен сопротивлением 14 Ом. Во время работы при резком пуске серводвигателя ток разряда емкости пройдет через диод Шоттки (диод с малым падением напряжения на диодном барьере), тем самым, поддержав общее напряжение питание на плате nano-IO Shield на одном уровне. Далее емкость опять заряжается через резистор 14 Ом. Во время работы серводвигателей емкость будет разряжаться, а в паузах заряжаться.

Управление роботом от света.
Управление роботом возможно только с помощью фотодатчиков встроенных в глаза. Глаза находятся на поворотном механизме серводвигателей. Схема датчиков представлена на (рис. 7).

Рис. 7

При включении питания робота, программа опрашивает фотодатчик канала А0. Если фотодатчик уменьшил сопротивление под воздействием света, то программа продолжает работать и через 3- секундную паузу робот начнет идти. В полной темноте робот не двигается. Во время движения робот поворачивает голову влево, прямо и вправо. Оба фотодатчика считывают данные об уровне освещенности комнаты. Дальнейшая разработка программы предполагает движение робота на наиболее освещенный участок.

Силовая плата.
К роботу подключается аккумулятор. Питание схемы робота осуществляется от литий ионного аккумулятора 6,0 В емкостью 4000 мАч (или более). Вес аккумулятора должен быть не более 300 гр. Аккумулятор включается через силовую плату, схема (рис. 8).

Рис. 8

На силовой плате есть выключатель питания, а также светодиод включения питания. Так же для аварийного питания МК установлен резервный аккумулятор схемы управления G1 3.6 B 100 мАч в пальчиковом исполнении (тип АА).

Помехи платы управления.
Так как хождение робота состоит из постоянно меняющихся нагрузок на лапы, то питание на плате Arduino nano будет постоянно пульсировать, изменяясь в пределах 3,0- 6,0 В. Такая пульсация может привести к сбросу МК и перезапуску программы управления заново. Или к зависанию МК. Поэтому необходимо резервное питание схемы МК. В шине ISP (2 вывод) платы Arduino nano, питание подключено напрямую к МК. Поэтому дополнительную аккумуляторную батарею питания 3,6 В (100 мАч) через резистор 33 Ом подключаем к 6-му (GND) и 2-му (+3,6 В) выводу ISP платы Arduino nano. Во время включения питания батарея будет заряжаться, во время пульсации напряжения, батарея будет разряжаться, поддерживая питание МК и не давая сбрасываться в начальное состояние. Единственный недостаток такой схемы заключается в том, что после окончания пользования роботом, ее необходимо отсоединить от платы. При постоянной ходьбе робота, дополнительная батарея будет выполнять роль фильтра по питанию. Но, к сожалению, существует вероятность ее перезаряда. Поэтому этот узел необходимо дорабатывать.

Принципы работы серводвигателей. Прежде всего, усилие которое развивает серводвигатель, должно быть как минимум в два раза больше собственного веса конструкции. Для полноценной работы сервопривода необходимо иметь импульсы управления в 1 mS поворот 0 грд, 1.5 mS-90 грд, 2.0 mS-180 грд с периодом повторения в 20 mS (рис. 9а).

Рис. 9a

Для исключения высокого потребления тока одновременно всеми сервоприводами, импульсы управления двигателями разнесены во времени (рис. 9б).

Рис. 9b

Сначала, включаются средние сервоприводы шарниров, и только затем, по очереди включаются сервоприводы ног. Такой способ управления позволяет избежать тока нагрузки более 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].
В программе используются два таймера Timer 0, Timer 1. Timer 0 предназначен для паузы в начале программы. Для включения выключения робота предусмотрен тумблер. Для этой операции включения необходимо время около 0.5 С, что бы успеть отвести руку от робота. Именно паузу в 0.5 С формирует таймер 0. Робот может начать ходить. У него есть фотодатчики в районе глаз, для реагирования на свет. При включении питания, робот ожидает пока на фоторезисторах начнет уменьшаться сопротивление, за счет воздействия света, до определенного уровня. Уровень освещенности измеряет подпрограмма adcn. Проведя рукой перед источником небольшого освещения и глазами робота, можно добиться срабатывания уровня и дальнейшего продолжения программы. Иначе, пока робот не увидит свет, программа зацикливается и робот остается неподвижным. После этапа определения освещенности и паузы в программе, начинаются фазы движения робота. Фазы разделены на управление отдельными поворотными узлами рис 10, узлы- E, Q, L, R, P, S, G.

Рис. 10

Управление фазами приведено в таблице 1. Для простоты обработки угла поворота серводвигателя выбраны значения 10 – 1 мС, 15 – 1.5 мС, 20 – 2.0 мС. Число 15 является средним положением серводвигателя. Как уже ранее говорилось, для выполнения поворота от начального положения до заданного, серводвигателю необходимо время около 0.62 С. Поэтому фаза повторяется несколько раз, количество циклов задается значением - prg2 (таблица 1).

Таблица 1

Описание   Правая передняя нога Передний шарнир Левая передняя нога Правая задняя нога Задний шарнир Левая задняя нога Голова Пауза
  Плата I/O D7 D6 D10 D8 D9 D11 D12 prg2
  Порт МК PORTD7 PORTD6 PORTB2 PORTB0 PORTB1 PORTB3 PORTB4 prg2
  Фаза № E L Q P R S G prg2
Исходное состояние 1 15 15 15 15 15 15 15 $1F
Поворот головы влево 1 15 15 15 15 15 15 20 $1F
Поворот головы вправо 1 15 15 15 15 15 15 10 $1F
Исходное состояние 1 15 15 15 15 15 15 15 $1F
Лавая назад, шарнир на левый бок 2 15 10 20 15 15 15 15 $1F
Исходное состояние 3 15 15 15 15 15 15 15 $10
Правая нога назад, шарнир на правый бок 4 10 20 15 15 15 15 15 $1F
Исходное состояние 5 15 15 15 15 15 15 15 $10
Левая задняя назад, зад шарн на лев бок 6 15 15 15 15 20 20 15 $1F
Исходное состояние 7 15 15 15 15 15 15 15 $10
Правая задняя назад, зад шарн на прав бок 8 15 15 15 10 10 15 15 $1F
Исходное состояние 9 15 15 15 15 15 15 15 $10

 

Уменьшение времени повтора может привести к неоконченному повороту серводвигателя. Запуск таймера 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).

Рис. 11 полная версия →

Вторая конструктивная особенность – применение легкого и хорошо обрабатываемого пластика полиморфус. Для робота узлы из пластмассы уменьшают вес всей конструкции и позволяют быстро без особых затрат изготовить любую деталь в домашних условиях.

Перед сборкой конструкции необходимо собрать всю электронику и проверить работоспособность серводвигателей. К сожалению, у серводвигателей бывают недоработки. Например, когда происходит заклинивание шестеренок, возникает слишком большой пусковой ток более 1 А. Иногда ограничитель крайнего положения ломается и происходит вращение без останова, иногда возникает дергание вала в крайних позициях (плохо откалиброванная электроника). Собирается робот согласно чертежа (рис/ 10).

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

Технология лепки узлов. Для начала, если Вы раньше не лепили никогда детали, лучше купить пластилин и вылепить макет всех деталей робота. Соединить временно с роботом, проверить расположение узлов. Все узлы должны быть симметричны относительно плоскости проходящей по центру робота. Прежде всего, необходимо лепить небольшими кусочками пластика, так как он имеет два нехороших свойства: быстро застывать – при этом желаемая форма детали может быть недостигнута. Второе свойство, если деталь небольшая, отрывая кусочки, в горячем состоянии они быстро липнут, когда необходимо исправить деталь и разогреть, деталь может прилипнут к оторванным остаткам. Тогда придется опять отрывать и лепить заново деталь. Лучше делать несколько небольших деталей, скрепляемых затем другими элементами конструкции. Например: для платы nano-IO Shield устанавливаются стойки из винтов М3 и пластиковых шайб (рис/ 12).

Рис. 12 полная версия →

Предварительно нарезаются отрезки длиной 55 мм из любого материала (например, зубочисток или гигиенических палочек). На плате, головки винтов немного прослабляются, так что бы между головкой винта и шайбой был зазор около0,5 мм. После чего нагреваем в воде пластик и берем кусочек так чтобы обмотать стойку платы и отрезок гигиенической палочки 55 мм (рис/ 13).

Рис. 13

посмотреть полную версию фотографии

Далее изготавливаем средние шарниры. Для этого на любой доске рисуем контуры будущих конечностей робота и раскладываем серводвигатели так что бы ноги находились симметрично относительно центральной линии робота. Средние серводвигатели установлены так, что бы совпадала ось поворота шарнира для передних и задних ног. Поэтому корпуса сервоприводов расположены несимметрично рис 11. Корпуса средних серводвигателей соединены между собой кусочком пластика а боковой крепеж серводвигателя соединен трубочкой, согнутой в виде буквы П (рис. 14).

Рис. 14

На съемные рычаги серводвигателя вкручиваются по два шурупа, идущие в комплекте с серводвигателем. Желательно шурупы вкручивать подальше друг от друга на неполную глубину. Далее лепится задняя часть робота. Для этого в ушки крепления серводвигателя вставляются два винта М2 длиной 16 мм с гайками. Вокруг гайки облепливается пластик и прижимается к выступающей кромке серводвигателя. Гайки должны попасть внутрь пластика. Таким образом, выполняются две стойки заднего узла робота (рис. 15).

Рис. 15

После высыхания аналогично изготавливается передняя часть робота (рис. 16).

Рис. 16

Собрав переднюю часть и заднюю часть робота, получим плоскую конструкцию без ног (рис. 17).

Рис. 17

Затем на рычаги ног (идущие в комплекте с серводвигателем.) навинчиваются по два шурупа. На серводвигатели надеваются рычаги, так что бы они смотрели вертикально вниз по отношению к спине робота. Серводвигатели в выключенном состоянии можно понемногу без усилий поворачивать. Если придать усилие на поворот, можно сломать ограничители. На листочке бумаги рисуются контуры верхней части ноги. По этому контуру лепится нога и облепливается рычаг. Ноги лепятся на снятых с робота рычагах. Ноги необходимо делать одинаковые, левая и правая сторона отличается зеркальным расположением элементов детали. После чего ноги устанавливаются на робота (рис. 17). Конструкция должна стоять на всех четырех ногах одновременно. Не допускается перекоса или наклона конструкции в бок. Если сделан брак, то ногу опять помещают в кипяток, размягчают и переделывают. У ног есть стопа. Ее желательно делать отдельно (рис. 18).

Рис. 18

Нижняя часть ноги нагревается и вставляется винт М2 длиной 16 мм.. В стопе сверлится отверстие диаметром 2,1 мм и продевается винт (рис. 19). На изгибах ноги и стопы сверлится отверстие и прикручивается шурупами пружина от авторучки. Аналогично делаются все четыре ноги. Ноги прикрепляют к серводвигателям робота (рис. 19).

Рис. 19

Ноги должны стоять строго вертикально, а спина робота должна быть параллельна плоскости земли. В случае перекосов, необходимо расплавить короткую ногу и придать нужную высоту. На последок, для робота делается голова. Сначала, необходимо заготовить проволоку диаметром 0,8 мм длиной 340 мм. Проволока должна быть пружинной (используется в рыболовецких снастях). Сгибаем проволоку пополам под углом 25 грд. После чего свободные концы проволоки вставляем (в передней части робота) в трубочки рамы (рис. 20), так что бы концы выглядывали на 7 мм (в задней части робота) (рис. 15). У основания платы загибаем вверх проволоку. Получится сломанная в горизонтальной плоскости буква Л, если смотреть сбоку.

Рис. 20

В верхней части проволоки сгибаем кончик под крепеж серводвигателя (рис. 20 - (обведен красным кругом), концы в задней части сгибаем, так чтобы проволока не выезжала из трубочек (рис. 15 - обведен красным кругом). На проволоке устанавливаем горизонтально серводвигатель и лепим крепеж спереди серводвигателя и сзади. В заднем крепеже залепливаем винт 1, так что бы он мог держать силовую плату с резервным аккумулятором. Для платы фотодатчиков изготавливаем глаза (рис. 21, 22).

Рис. 21
Рис. 22

К серводвигателю головы крепится плата с фотодатчиками. Далее к винту 1 крепим силовую плату. Соединяем провода от серводвигателей к плате I/O согласно таблице 1 (стока плата I/O). На плате I/O нанесены надписи рядом с штырьками для подключения серводвигателей. G –земля соответствует темно коричневому проводу от серводвигателя, V – питание соответствует красному проводу, S – управление соответствует желтому проводу (рис. 23).

Рис. 23

Аккумуляторную батарею выбираем LI-ION 6,0 В 4000 мАч. Присоединяем стяжкой под брюхом робота. Или любой другой аккумулятор на 6.0 В можно носить отдельно от конструкции. Робот готов. Общий вес конструкции с аккумуляторами около 500 грамм (рис. 24).

Рис. 24

 

Литература:

  1. http// www.arduino.cc. User manual. Arduino Nano (V2.3) 2008.
  2. http//www.pighixxx.com
  3. http//Deek-Robot.com
  4. Евстифеев А.В. Микроконтроллеры AVR семейства Tiny и Mega фирмы ATMEL. 2-е издание. М: Додэка-XXI, 2005.
  5. http//www.polymorfus.ru

Ваша оцінка статті:

Відмінно
Добре
Задовільно
Погано
Дуже погано

Дякуємо Вам за звернення! Ваш відгук з'явиться після модерації адміністратором.
Поки немає відгуків на цю статтю.
оплата картами Visa і MasterCard