Operácie

Ovládanie rýchlosti jednosmerného motora z BT aplikácie

Zo stránky SensorWiki

Záverečný projekt predmetu MIPS / LS2025 - Matúš Németh

DC motor speed control using the Bluetooth-based Android app https://www.engineersgarage.com/dc-motor-speed-control-using-the-bluetooth-based-android-app/

Zadanie

Cieľom môjho projektu bolo ovládanie rýchlosti otáčok DC motora cez Bluetooth aplikáciu.

Arduino nano použité na projekt.

Literatúra:


Analýza a opis riešenia

Základom projektu bolo Arduino nano a ako DC motor som konkrétne zvolil ventilátor na 12V s dvoma vodičmi. Ten budem ovládať pomocou PWM s 8 bitovým počítadlom T0. Kedže arduino vie napájať iba veľmi malé prúdy, tak som na spínanie ventilátora využil Darlington NPN tranzistor TIP120. Následne bolo potrebné zabezpečiť sériovú komunikáciu cez Bluetooth. Tá prebiehala cez Bluetooth modul HC-05.


Celkový pohľad na zariadenie.

Arduino a ventilátor sú napájané z 12V adaptéra

Bluetooth modul HC-05 je napájaný z 5V výstupu z arduina a komunikuje cez Tx a Rx piny ku ktorým je pripojený do kríža s Tx a Rx pinmi na arduine.

Pin D6 je výstupom PWM signálu, ktorý je posielaný na bázu tranzistora cez sériovo zapojený, prúd limitujúci, 330 ohmový rezistor.

Bluetooth modul HC-05.
Bluetooth modul HC-05.
Použitý ventilátor.
Schéma zapojenia.


Algoritmus a program

Algoritmus programu využíva sériovú komunikáciu UART a fast PWM s 8 bitovým počítadlom T0. V hlavnej časti programu ako prvé inicializujem UART a PWM výstup. Následne čítam znaky ktoré posiela aplikácia. Znaky Z / V znamenajú zapnúť / vypnúť ventilátor. Ak arduino prijme znak B, zavolá sa funkcia precitajRychlost() ktorá následne prečíta prijaté cifry čísla zľava a v každom opakovaní výsledné číslo vynásobí 10 a pripočíta ďalšiu cifru až po ukončujúci znak reťazcu E. Získaná hodnota sa ďalej vo funkcii nastavRychlost() zapíše do OCR0A a zároveň pošle naspäť do aplikácie v telefóne pre funkciu ukazovateľa rýchlosti


#define F_CPU 16000000UL
#define BAUD 9600

#include <avr/io.h>
#include <util/delay.h>
#include "uart.h"
#include <stdio.h>


FILE uart_output = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE);

int precitajRychlost(void) {	// Funkcia na precitanie znakov zo seriovej komunikacie a ich prevod na integer cislo
	int speed=0;
	char c;
	while ((c=uart_getc()) != 'E') {
		if (c >= '0' && c <= '9') {
			speed = speed * 10 + (c - '0');  // Cita cifry zlava a v kazdom cykle vynasobi 10 a pridu dalsiu
		}
	}
	return speed;
}

void pwm_init() {			// Zapnutie PWM vystupu
	DDRD |= (1 << PD6);		// Nastavi PD6 (OC0A) ako vystup

	TCCR0A |= (1 << COM0A1) | (1 << WGM01) | (1 << WGM00); 	// Nastavi T0 na Fast PWM mode
	TCCR0B |= (1 << CS01) | (1 << CS00);  // Prescaler = 64
}

void nastavRychlost(uint8_t value) {
	OCR0A = value;				// Nastavenie plnenia PWM (0–255)
	printf("*D%d*",value);		// Posle aplikacii aktualnu rychlost pre ukazovatel otacok
}

int main(void){
	uart_init();				// Inicializacia UART komunikacie
	stdout = &uart_output;
	pwm_init();					// Inicializacia PWM

	while(1)
	{
		char ReceivedChar = uart_getc();
		
		if (ReceivedChar == 'Z') {		// Zapne ventilator na 50 %
			nastavRychlost(160);		
		}
		if (ReceivedChar == 'V') {		// Vypne ventilator
			nastavRychlost(0);
		}
		if (ReceivedChar == 'B') {		// Ak precita znak oznacujuci zaciatok retazca s pozadovanou rychlostou
			nastavRychlost(precitajRychlost());		// Precita a nastavi pozadovanu rychlost 			
		}
	}
}
void uart_init( void );

void uart_putc( char c );
void uart_puts( const char *s );

char uart_getc( void );
#define F_CPU 16000000UL
#define BAUD 9600

#include <avr/io.h>
#include <util/setbaud.h>

void uart_init( void )
{
	UBRR0H = UBRRH_VALUE;
	UBRR0L = UBRRL_VALUE;

	#if USE_2X
	UCSR0A |= _BV(U2X0);
	#else
	UCSR0A &= ~(_BV(U2X0));
	#endif

	UCSR0C = _BV(UCSZ01) | _BV(UCSZ00); /* 8-bit data */
	UCSR0B = _BV(RXEN0) | _BV(TXEN0);   /* Enable RX and TX */
}


void uart_putc(char c)
{
	if (c == '\n')
	{
		uart_putc('\r');
	}
	loop_until_bit_is_set(UCSR0A, UDRE0); /* Wait until data register empty. */
	UDR0 = c;
}


void uart_puts(const char *s)
{
	while( *s!='\0')
	{
		uart_putc(*s);
		s++;
	}
}

char uart_getc(void) {
	loop_until_bit_is_set(UCSR0A, RXC0); /* Wait until data exists. */
	return UDR0;
}


Zdrojový kód: zdrojaky.zip

Overenie

Na ovládanie je v android aplikácií prepínač na zapnutie a vypnutie ventilátora, slider na určenie rýchlosti a ručičkový ukazovateľ rýchlosti v percentách plnenia PWM signálu

Aplikácia.

Video:



Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.