Ovládanie rýchlosti jednosmerného motora cez bluetooth
Zo stránky SensorWiki
Záverečný projekt predmetu MIPS / LS2025 - Samuel Gálik
Zadanie
Ovládanie rýchlosti otáčania jednosmerného motora pomocou Bluetooth aplikácie

Literatúra:
Analýza a opis riešenia
Pomocou aplikácie Bluetooth Electronics budem ovládať otáčky DC motora. Aplikácia komunikuje s Bluetooth modulom HC-05 pomocou grafického rozhrania aplikácie cez jazdca (slider), ktorý pri zmene hodnoty vyšle 5 znakov. V poradí ide najprv znak „*“, ktorý označuje začiatok posielanej informácie, následne 3 číslice, ktoré predstavujú otáčky motora a nakoniec znak „#“, ktorý označuje koniec vysielaných informácií. Nachádzajú sa tam aj dve tlačidlá jedno vyšle znak F, čo znamená zastavenie motora a druhé vyšle znak N, čo znamená nastavenie motora na polovicu maximálnych otáčok. Bluetooth modul má 6 pinov, z ktorých sa použijú 4: RX a TX na komunikáciu s Arduino Uno, VCC na napájanie 5V a GND na pripojenie k zemi. Následne prijatý signál pomocou Arduina spracujeme. Pomocou Timer1 v mikroprocesore ATmega328p vytvorí PWM signál, ktorý následne pošleme cez ochranný rezistor s hodnotou 330 Ohmov na NPN tranzistor. Tento signál umožní ovládať náš jednosmerný motor.





RX pin z Bluetooth modulu zapojíme na TX na Arduine a TX z Bluetooth modulu na RX na Arduine. Bluetooth modul je napájaný z Arduina, ktoré je v našom prípade napájané cez USB kábel. Na napájanie samotného jednosmerného motora použijeme externý 12 V zdroj, ktorý sme pripojili na tranzistor. Tranzistor ovládame PWM signálmi z Arduina.
Algoritmus a program
Na začiatku pridáme knižnice, potom inicializujeme sériovú komunikáciu a časovač Timer1. Potom kód čaká, kým nepríde znak. Po prijatí znaku skontroluje, či sa nejedná o znak „*“. Ak áno, vynuluje premenné a a i, potom vojde do cyklu while, kde začne načítavať ďalšie prichádzajúce znaky. V tomto cykle zostane dovtedy, kým neprečíta tri znaky alebo kým neprečíta znak „#“. Vnútri cyklu program kontroluje, či je znak medzi 0 až 9. Ak áno, priradí ho k správnej cifre v premennej a. Pomocou premennej i vieme priradiť číslo na správnu cifru vzhľadom na to, že máme string nas z hodnotami: 100, 10 a 1. Premenná i teda určuje, ktorú cifru vyberieme. Následne kód prepočíta hodnotu a nastaví ju do OCR1A, čím sa zmení hodnota pre PWM. Nakoniec ešte kód kontroluje, či neprišiel znak „N“ alebo „F“, ktoré buď nastavia motor na polovicu otáčok, alebo ho úplne zastavia.
#include <avr/io.h>
#define F_CPU 16000000UL
#include <stdio.h>
#include "urat.h"
#include <util/delay.h>
#define set_bit(ADDRESS,BIT) (ADDRESS |=(1<<BIT))
#define clear_bit(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))
#define toggle_bit(ADDRESS,BIT) (ADDRESS ^=(1<<BIT))
int main(void)
{
int a; int i;
char ReceivedChar;
int nas[3] = {100, 10, 1,};
uart_init();
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE);
stdout = &mystdout;
DDRB|=(1<<PB1)|(1<<PB2);
TCNT1 = 0;
ICR1 = 4000;
OCR1A = 2000;
TCCR1A|=(1<<COM1A1)|(1<<WGM11);
TCCR1B|=(1<<CS11);
TCCR1B|=(1<<WGM12)|(1<<WGM13);
while(1)
{
ReceivedChar = uart_getc();
if(ReceivedChar == '*'){
a=0;i=0;
while(ReceivedChar != '#' && i < 3){
ReceivedChar = uart_getc();
if (ReceivedChar >= '0' && ReceivedChar <= '9'){
a= (nas[i] * (ReceivedChar - '0')) + a;
i++;
}
else{break;}
}
}
if (ReceivedChar == 'N'){
a=150;
}
if (ReceivedChar == 'F'){
a=100;
}
OCR1A = (40 * a)-4000;
printf(" %d ",a);
printf(" %d ",OCR1A);
}
return(0);
}
/*
* urat.c
*
* Created: 12. 3. 2025 13:04:54
* Author: student
*/
#include <avr/io.h>
#include "urat.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)
{
/* toto je vasa uloha */
}
char uart_getc(void) {
loop_until_bit_is_set(UCSR0A, RXC0); /* Wait until data exists. */
return UDR0;
}
/*
* urat.h
*
* Created: 12. 3. 2025 13:06:03
* Author: student
*/
#ifndef URAT_H_
#define URAT_H_
#define SW1_ON bit_is_clear(PIND, SW1)
#define LED1_ON set_bit(PORTB,LED1)
#define LED1_OFF clear_bit(PORTB,LED1)
#define F_CPU 16000000UL
#define BAUD 9600
#define BAUD_PRESCALE (((F_CPU / (BAUD * 16UL))) - 1)
void uart_init( void );
void uart_putc( char c );
void uart_puts( const char *s );
char uart_getc( void );
#endif /* URAT_H_ */
Zdrojový kód: zdrojaky.zip
Overenie
Na videu je možne vidieť, že po zmene jazdca v aplikácii sa mení rýchlosť otáčok motora.

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