Operácie

Ovládanie rýchlosti jednosmerného motora cez bluetooth: Rozdiel medzi revíziami

Zo stránky SensorWiki

StudentMIPS (diskusia | príspevky)
StudentMIPS (diskusia | príspevky)
Riadok 123: Riadok 123:


unsigned int adc_read(char a_pin);
unsigned int adc_read(char a_pin);
 
</syntaxhighlight ></tab>
</syntaxhighlight ></tabs>
 
<tab name="filename.h"><syntaxhighlight  lang="c++" style="background: LightYellow;">
<tab name="filename.h"><syntaxhighlight  lang="c++" style="background: LightYellow;">
#include <avr/io.h>
#include <avr/io.h>

Verzia z 13:22, 12. máj 2025

Záverečný projekt predmetu MIPS / LS2025 - Samuel Gálik


Zadanie

Ovládanie rýchlosti otáčania jednosmerného motora pomocou Bluetooth aplikácie

Arduino Uno.

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.


Bluetooth modul HC-05.
Darlington NPN tranzistor TIP120 60V/5A.
DC motorček FF-180SH 3-12V.
330 ohm rezistor.
Schéma zapojenia.

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);
}
#include <avr/io.h>

void adc_init(void);                                   // A/D converter initialization

unsigned int adc_read(char a_pin);
#include <avr/io.h>

void adc_init(void);                                   // A/D converter initialization

unsigned int adc_read(char a_pin);

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.

Projekt.

Video:



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