Драйвер двигателя


Главная цель покупки — минимум проводов, максимум удобства использования. Эта плата расширения подошла идеально.

Забегая вперед, скажу, что у этой платы есть разъем под блютус модуль, и в сочетании с ардуино уно получается шикарный бутерброд.
все в сборе

Единственный минус, контакты блютус модуля придется заменить с угловых на прямые или, как сделал я, выпрямить их пассатижами. Варварство, конечно, но ведь работает же.
HC-05 после обработки

Садится драйвер на ардуино весьма уверенно, выпасть не должен, блютус тоже неплохо держится, поэтому в планах крепить только нижнюю плату, для этого подобрал несколько латунных стоек. К сожалению расположение отверстий у данных плат очень неудобное, поэтому сверлить основание, скорее всего, придется.
Вариант как буду крепить


Теперь про сам драйвер:

Напряжение питания моторов до 12В, максимальный рабочик ток 2А. Запитывать можно сразу драйвер двигателя или, в случае, если потребляемый ток меньше 1А при напряжении 5В, непосредственно ардуину. Вращает двумя DC моторами или одним шаговиком.
Задействованные порты:
PD4 — Buzzer (пищалка, довольно громкая, можно организовать простую мелодию, при желании)
PB2(OC1B) — ШИМ первого мотора (при подаче 1 мотор просто включен, 0 выключен)
PB3(OC2A) — ШИМ второго мотора
Если мотор активен (PB2 или PB3=1) он крутится, в каком направлении задается следующим образом:
PB4 — 0/1 движение вперед/назад первого мотора, зеленый/желтый диод
PB5 — 0/1 движение вперед/назад второго мотора
Направление движения можно посмотреть на диодах, у каждого канала их два, желтый и зеленый. Т.е. для отладки мотор не так уж и важен, двигатель стоит — диоды погашены, крутится вперед — горит, например, зеленый, назад — желтый.
Для теста собранного бутерброда написал немного кода, цель в зависимости от положения джойстика зажигать нужные диоды = вращать мотор в правильную сторону. Джойстик я уже ранее описывал, mySKU.me/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();
	}
}


Получил вот такой результат:
движение джойстиком вверх, кстати ШИМ работает нормально, даже повращал мотором от разбитого ребенком акрилового шасси.

вниз

влево

вправо

по диагонали (из-за издержек кода, когда горит два светодиода мотор попеременно дергается вперед — назад, по факту на обоих контактах будут плюсы и двигатель остановится)


Прошу прощения за случайно выложенный ранее недописанный обзор. Написал все, что успел сам узнать об этом драйвере, перед этим я подержал в руках несколько других, в том числе и выполненных как отдельные модули, и остановился на этом, как наименее трудозатратном и не требующим целого пучка разноцветных проводов. Надеюсь мой опыт кому-то пригодится. В общем все работает, появится время — буду играться дальше.
Планирую купить +6 Добавить в избранное +3 +10
+
avatar
  • ksiman
  • 19 января 2016, 16:36
+3
Не очень понятно, для чего всё это…
Случайно выложен недописанный обзор?
+
avatar
0
Да
+
avatar
  • lolipop
  • 19 января 2016, 17:20
0
ну так спрячьте обзор в черновики и еще раз его потом опубликуете. не хватает применения в обзоре.
+
avatar
  • ksiman
  • 19 января 2016, 17:29
0
И после дописывания обзор окажется на 6 странице…
+
avatar
0
Сначала подумал, плата дла шаговика.
Но судя по выводам(ШИМ), то для обычных двух, постоянного тока.
Недоделанный обзор!
+
avatar
0
именно, но можно и одним шаговиком покрутить. Вот ответная часть со вторым блютус модулем
+
avatar
0
Скорость регулируется джойстиком?
+
avatar
+2
да, при нажатии на клавиши пищалка пищит
+
avatar
  • Stress
  • 19 января 2016, 16:40
0
соглашусь
+
avatar
0
Я хотел поделиться находкой, но вместо сохранить черновик нажал опубликовать. Я уже соединил пульт и драйвер. Пульт обозревал здесь mySKU.me/blog/aliexpress/37049.html
Сейчас выложил логическое продолжение
Т.е. работа с джойстиком находит отклик в драйвере двигателя.
+
avatar
  • Dimon_
  • 19 января 2016, 16:45
0
del
+
avatar
0
Да пусть будет. Когда шасси стальное приедет все вместе соберу и покатаюсь. Тогда и код выложу, сейчас он все равно меняться будет.
+
avatar
0
Дописал обзор
+
avatar
0
Довольно старая микруха. Мне лично симпатизирует чипы от Alegro и Infenion. Рекомендую присмотреться к их предложениям в разделах на сайтах Motor Control
+
avatar
  • btx
  • 23 января 2016, 21:45
0
код на С++

Код чисто на СИ, от С++ ничего нет