Главная цель покупки — минимум проводов, максимум удобства использования. Эта плата расширения подошла идеально.
Забегая вперед, скажу, что у этой платы есть разъем под блютус модуль, и в сочетании с ардуино уно получается шикарный бутерброд.
Единственный минус, контакты блютус модуля придется заменить с угловых на прямые или, как сделал я, выпрямить их пассатижами. Варварство, конечно, но ведь работает же.
Садится драйвер на ардуино весьма уверенно, выпасть не должен, блютус тоже неплохо держится, поэтому в планах крепить только нижнюю плату, для этого подобрал несколько латунных стоек. К сожалению расположение отверстий у данных плат очень неудобное, поэтому сверлить основание, скорее всего, придется.
Теперь про сам драйвер:
Напряжение питания моторов до 12В, максимальный рабочик ток 2А. Запитывать можно сразу драйвер двигателя или, в случае, если потребляемый ток меньше 1А при напряжении 5В, непосредственно ардуину. Вращает двумя DC моторами или одним шаговиком.
Задействованные порты:
PD4 — Buzzer (пищалка, довольно громкая, можно организовать простую мелодию, при желании)
PB2(OC1B) — ШИМ первого мотора (при подаче 1 мотор просто включен, 0 выключен)
PB3(OC2A) — ШИМ второго мотора
Если мотор активен (PB2 или PB3=1) он крутится, в каком направлении задается следующим образом:
PB4 — 0/1 движение вперед/назад первого мотора, зеленый/желтый диод
PB5 — 0/1 движение вперед/назад второго мотора
Направление движения можно посмотреть на диодах, у каждого канала их два, желтый и зеленый. Т.е. для отладки мотор не так уж и важен, двигатель стоит — диоды погашены, крутится вперед — горит, например, зеленый, назад — желтый.
Для теста собранного бутерброда написал немного кода, цель в зависимости от положения джойстика зажигать нужные диоды = вращать мотор в правильную сторону. Джойстик я уже ранее описывал,
mysku.club/blog/aliexpress/37049.html
код на С++, писал в Atmel Studio
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#include <avr/interrupt.h>
#define FOSC 16000000UL // Clock Speed
#define BAUD 9600
#define MYUBRR FOSC/16/BAUD-1
volatile char data=0, sp, N=1;//N - будет переключателем скорости 1,2,3. Работаю над этим
volatile bool i=0;
void USART_Init( unsigned int ubrr)
{
//Set baud rate
UBRR0H = (unsigned char)(ubrr>>8);
UBRR0L = (unsigned char)ubrr;
//Enable Receiver
UCSR0B |= (1<<RXEN0);
// Разрешение прерываний по приему
UCSR0B |= (1<<RXCIE0);
// Set frame format: 8data, Odd Parity, 2stop bit
UCSR0C|= (1<<UCSZ00)|(1<<UCSZ01)|(1<<UPM00)|(1<<UPM01)|(1<<USBS0);
}
ISR (USART_RX_vect)
{
data=UDR0;
}
void timer0_init (void)
{
//Normal port operation, Normal
TCCR0B=(1<<CS01);//
OCR0A=150;//
TIMSK0|=(1<<OCIE0A)|(1<<TOIE0);//Timer/Counter0 Output Compare Match A Interrupt Enable, Overflow Interrupt Enable
}
ISR (TIMER0_COMPA_vect)
{
if ((PORTB&0b00001100)==0b00001100)
{
PORTB=PORTB&0b11110011;
}
}
ISR (TIMER0_OVF_vect)
{
if (i==1)
{
PORTB=PORTB|0b00001100;
}
else
{
PORTB=PORTB&0b11110011;
}
}
void timer1_init (void)
{
TCCR1B|=(1<<WGM12);//CTC, Normal port operation, OC1A/OC1B disconnected.
TCCR1B|=(1<<CS10)|(1<<CS11);//prescaling 64
OCR1A=0xffff;//TOP
TIMSK1|=(1<<OCIE1A);//Output Compare A Match Interrupt Enable
}
ISR (TIMER1_COMPA_vect)
{//если долго нет сигнала от пульта все данные останавливаем моторы
if ((UCSR0A&0b10000000)==0)
{
PORTB=0x00;
i=0;
}
}
int main(void)
{
DDRB=0xff;
PORTB=0x00;
DDRD=0xff;
PORTD=0x00;
timer0_init();
timer1_init();
USART_Init(MYUBRR);
sei();
while(1)
{
cli();
if (data!=0)
{
if ((data & (1<<5)) == 0)//кнопка не нажата
{
switch (data>>6)
{
case 0b01:
PORTB=0b00001100;i=1;
OCR0A=(data&0b00011111)*N+160; //160 чтобы мотор стронулся с места
break;
case 0b00:
PORTB=0b00111100;i=1;
OCR0A=(data&0b00011111)*N+160;
break;
case 0b11:
PORTB=0b00101100;i=1;
OCR0A=(data&0b00011111)*N+160;
break;
case 0b10:
PORTB=0b00011100;i=1;
OCR0A=(data&0b00011111)*N+160;
break;
}
}
if ((data & (1<<5)) != 0)//кнопка нажата
{
switch (data&0b00000111)//здесь просто звук нажатия на клавишу, ничего более
{
case 0b001:
PORTD=0xff;
_delay_ms(100);
PORTD=0x00;
break;
case 0b010:
PORTD=0xff;
_delay_ms(100);
PORTD=0x00;
PORTD=0xff;
_delay_ms(100);
PORTD=0x00;
break;
case 0b111:
for (int i=0; i<3; i++)
{
PORTD=0xff;
_delay_ms(100);
PORTD=0x00;
_delay_ms(100);
}
break;
case 0b110:
for (int i=0; i<4; i++)
{
PORTD=0xff;
_delay_ms(100);
PORTD=0x00;
_delay_ms(100);
}
break;
}
}
data=0;
}
sei();
}
}
Получил вот такой результат:
движение джойстиком вверх, кстати ШИМ работает нормально, даже повращал мотором от разбитого ребенком акрилового шасси.
вниз
влево
вправо
по диагонали (из-за издержек кода, когда горит два светодиода мотор попеременно дергается вперед — назад, по факту на обоих контактах будут плюсы и двигатель остановится)
Прошу прощения за случайно выложенный ранее недописанный обзор. Написал все, что успел сам узнать об этом драйвере, перед этим я подержал в руках несколько других, в том числе и выполненных как отдельные модули, и остановился на этом, как наименее трудозатратном и не требующим целого пучка разноцветных проводов. Надеюсь мой опыт кому-то пригодится. В общем все работает, появится время — буду играться дальше.
Случайно выложен недописанный обзор?
Но судя по выводам(ШИМ), то для обычных двух, постоянного тока.
Недоделанный обзор!
Сейчас выложил логическое продолжение
Т.е. работа с джойстиком находит отклик в драйвере двигателя.
Код чисто на СИ, от С++ ничего нет
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.