Operácie

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

Zo stránky SensorWiki

StudentMIPS (diskusia | príspevky)
Bez shrnutí editace
StudentMIPS (diskusia | príspevky)
 
(13 medziľahlých úprav od rovnakého používateľa nie je zobrazených.)
Riadok 6: Riadok 6:
Ovládanie rýchlosti otáčania jednosmerného motora pomocou Bluetooth aplikácie
Ovládanie rýchlosti otáčania jednosmerného motora pomocou Bluetooth aplikácie


[[Obrázok:ardu.jpg|400px|thumb|center|Vývojová doska ACROB.]]
[[Obrázok:ardu.jpg|400px|thumb|center|Arduino Uno.]]


'''Literatúra:'''  
'''Literatúra:'''  
* [http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description Dokumentácia k doske Acrob]
* [https://docs.arduino.cc/resources/datasheets/A000066-datasheet.pdf Datasheet k Arduino uno]
* [http://www.humanbenchmark.com/tests/reactiontime/index.php Vyskúšajte si zmerať reakciu on-line]
* [https://www.onsemi.com/pdf/datasheet/tip122-d.pdf Datasheet k Darlington NPN tranzistor TIP120]
* [https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf Datasheet k ATmega328P]
* [https://components101.com/wireless/hc-05-bluetooth-module Informácie k Bluetooth modulu HC-05]




Riadok 17: Riadok 19:
== Analýza  a opis riešenia ==
== Analýza  a opis riešenia ==


Opíšte sem čo a ako ste spravili, ak treba, doplňte obrázkami...
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í.
Podrobne opíšte použité komponenty (okrem základnej dosky s ATmega328P procesorom), pridajte linky na datasheety alebo opis obvodu.  
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.


[[Súbor:GeminiAI-image3.jpg|400px|thumb|center|Celkový pohľad na zariadenie.]]


Nezabudnite doplniť schému zapojenia! V texte by ste mali opísať základné veci zo zapojenia, samotná schéma nie je dostačujúci opis.
[[Súbor:Bluetooth_modul.jpg|400px|thumb|center|Bluetooth modul HC-05.]]


[[Súbor:GeminiAI-image2.jpg|400px|thumb|center|Schéma zapojenia.]]
[[Súbor:TIP120.jpg|400px|thumb|center|Darlington NPN tranzistor TIP120 60V/5A.]]


[[Súbor:DCmotor.jpg|400px|thumb|center|DC motorček FF-180SH 3-12V.]]
[[Súbor:330r.jpg|400px|thumb|center|330 ohm rezistor.]]
[[Súbor:schemazapojenia_galik.jpg|400px|thumb|center|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 ===
=== Algoritmus a program ===


Algoritmus programu využíva toto a toto, základné funkcie sú takéto a voláma ich tuto...  
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ýpis kódu je nižšie...
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.


<tabs>
<tabs>
<tab name="AVR C-code"><syntaxhighlight  lang="c++" style="background: LightYellow;">
<tab name="AVR C-code"><syntaxhighlight  lang="c++" style="background: LightYellow;">
#include <avr/io.h>
#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 main(void)
{
{
  unsigned int measuredValue;
int a; int i;
    char ReceivedChar;
int nas[3] = {100, 10, 1,};
uart_init();


  while (1)
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE);
  {
    /*  relax  */ 
  }


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);
   return(0);
}
}


</syntaxhighlight ></tab>
</syntaxhighlight ></tab>
<tab name="filename.h"><syntaxhighlight  lang="c++" style="background: LightYellow;">
<tab name="urat.c"><syntaxhighlight  lang="c++" style="background: LightYellow;">
/*
* urat.c
*
* Created: 12. 3. 2025 13:04:54
*  Author: student
*/
 
#include <avr/io.h>
#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 adc_init(void);                                  // A/D converter initialization


unsigned int adc_read(char a_pin);
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;
}
 
</syntaxhighlight ></tab>
<tab name="urat.h"><syntaxhighlight  lang="c++" style="background: LightYellow;">
/*
* 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_ */
</syntaxhighlight ></tab>
</syntaxhighlight ></tab>
</tabs>
</tabs>


Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x ''zdrojaky.zip'':
Zdrojový kód: [[Médiá:projektSamuelGalik.zip|zdrojaky.zip]]
 
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]


=== Overenie ===
=== Overenie ===


Ako ste overili funkciu, napríklad... Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia.
Na videu je možne vidieť, že  po zmene jazdca v aplikácii sa mení rýchlosť otáčok motora.  
Na konci uvádzame fotku hotového zariadenia.  


[[Súbor:GeminiAI-image1.jpg|400px|thumb|center|Aplikácia.]]
[[Súbor:projekt_galik.jpg|400px|thumb|center|Projekt.]]


'''Video:'''
'''Video:'''
<center><youtube>D0UnqGm_miA</youtube></center>
<center><youtube>aVL0mL2OK6Y</youtube></center>





Aktuálna revízia z 12:57, 13. 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);
}
/*
 * 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.

Projekt.

Video:



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