Bezdrôtová komunikácia v pásme 433 MHz.: Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
Bez shrnutí editace |
||
(25 medziľahlých úprav od rovnakého používateľa nie je zobrazených.) | |||
Riadok 10: | Riadok 10: | ||
== Zadanie == | == Zadanie == | ||
Naším zadaním bolo navrhnúť a zrealizovať bezdrôtovú komunikáciu vo frekvenčnom pasme 433MHz. | |||
Charakteristika LPD pásma - 433MHz: | |||
* Frekvenčný rozsah pásma: 433,050 - 434,790 MHz | |||
* Maximálny vyžiarený výkon / intenzita poľa: 10 mW ERP | |||
* Jeden súvislý časový interval vysielania neprekročí 5 s. | |||
* V priebehu 10 min. môžu byť vysielané max.3 intervaly po 5 s. | |||
* Celková doba vysielania v priebehu 24 hod. neprekročí 15 min. | |||
'''Bezdrôtový prenos informácii sa v súčasnosti s obľubou využíva:''' | |||
* '''v zabezpečovacej technike -''' alarmy, bezpečnostné systémy, bezdrôtové ústredne – používa sa na komunikáciu senzorov, detektorov, klávesníc a kľúčeniek s hlavnou jednotkou | |||
* '''na diaľkové ovládanie -''' automatizované a diaľkovo ovládané brány, závory, zariadenia v priemysle, automatizácia domácnosti, zvončeky, hračky – používa sa na posielanie riadiacich signálov, na komunikáciu s akčnými členmi | |||
* '''v telemetrii -''' domáce meteorologické stanice, meranie v priemysle, vzdialený dohľad - prenos nameraných veličín do hlavnej jednotky | |||
* '''rádiomodemy -''' prenos údajov, komunikácia medzi dvomi terminálmi | |||
* '''v automobilových aplikáciách''' | |||
'''Modulácie v preloženom pásme''' | |||
Modulácie v preloženom pásme sú modulácie využívané na diaľkových alebo vzdušných prenosoch. Sú taktiež nazývané nosné modulácie (carrier modulation). Pri týchto moduláciách sa využíva samotná postupnosť digitálnych symbolov na ovplyvnenie a tým samotné určenie parametrov stochastického vysokofrekvenčného harmonického signálu. | |||
Tento nosný signál má 3 základné parametre, ktoré moduláciami ovplyvňujeme: | |||
* amplitúda | |||
* frekvencia | |||
* fáza | |||
Moduláciou sa dosahuje zmena základných parametrov. Vo všeobecnosti poznáme tieto základné typy modulácie uvedené: | |||
* '''Amplitúdová modulácia(ASK):''' ľahko realizovateľná ale malo odolná proti nelineárnemu skresleniu aj proti rušeniu. Vhodná je najmä na moduláciu zdrojov svetla na optických spojoch. Príklad modulácie je na Obr. 1.2. | |||
* '''Frekvenčná modulácia(FSK):''' oproti amplitúdovej je odolnejšia proti skresleniu i rušivým signálom. Vyžaduje však väčšiu šírku pásma. Používa sa pri prenose údajov telefónnymi spojmi a rádiovými kanálmi. Príklad modulácie je na Obr. 1.3. | |||
* '''Fázová modulácia(PSK):''' dobre využíva frekvenčné pásmo. Používa sa pri prenose údajov telefónnymi kanálmi. Niekedy môže byt' kombinovaná s amplitúdovou moduláciou. | |||
* '''Kvadratúrna amlitúdová modulácia''' (QAM), kombinácia ASK a PSK. | |||
* '''Rastrovo kódovaná modulácia''' (TCM, trellis coded modulation) | |||
* (CPCA, Carrier-Present Carrier-Absent) | |||
[[Súbor:AM12.jpg|500px|center]] | |||
Treba popísať teóriu okolo bezdrôtovej komunikácie v tomto pásme, spôsoby prenosu dát, princíp AM a CPCA moduácie, RSSI a pod. | Treba popísať teóriu okolo bezdrôtovej komunikácie v tomto pásme, spôsoby prenosu dát, princíp AM a CPCA moduácie, RSSI a pod. | ||
V našom zadaní sme použili 433Mhz Transciever od firmy Paralax ktorý využíva CPCA moduláciu a s indikátorom sily prijatého signálu(RSSI). | |||
[[Obrázok:Parallax_TrX.jpg|300px|center]] | [[Obrázok:Parallax_TrX.jpg|300px|center]] | ||
'''CPCA modulácia:''' | |||
Jej hlavnou výhodou je jednocuchosť modulácie a hardvérová nenárošnosť (lacné riešenie). | |||
'''Princíp CPCA modulácie:''' | |||
CPCA modulácia je založená na AM (amplitúdovej modulácii) to zn. zdroj modulácie je napätový generátor ktorý môže mať dva stavy: "on" alebo "off". | |||
Keď zdroj modulácie je "on" reprezentuje to logickú 1 a naopak. | |||
[[Súbor:Cpca.jpg|400px|center]] | |||
Obr.2 Princíp CPCA modulácie | |||
Ako už bolo spomenuté, výhodou CPCA modulácie je hardwérová nenárošnosť - demoduláciu prijatého AM signálu je možné vykonať len s použitím fotodiódy odporu a kondenzátoru v zapojení podľa obr 3. | |||
[[Súbor:Cpca_detect.jpg|400px|center]] | |||
Obr.3 Schéma demodulátora CPCA modulácie | |||
Viac o CPCA modulácii [http://www.linxtechnologies.com/resources/documents/an-00130.pdf tu.] | |||
'''Literatúra:''' | '''Literatúra:''' | ||
* [http://www.parallax.com/product/27982 433 MHz RF Transceiver - prehlaď] (parallax.com) | * [http://www.parallax.com/product/27982 433 MHz RF Transceiver - prehlaď] (parallax.com) | ||
* [http://www.parallax.com/sites/default/files/downloads/27982-433-MHz-RF-Transceiver-Documentation-v1.1.pdf 433 MHz RF Transceiver - Datasheet] (.pdf) | * [http://www.parallax.com/sites/default/files/downloads/27982-433-MHz-RF-Transceiver-Documentation-v1.1.pdf 433 MHz RF Transceiver - Datasheet] (.pdf) | ||
__TOC__ | __TOC__ | ||
Riadok 60: | Riadok 103: | ||
'''Vysielacia časť (Transmitter)''' je riadiacou časťou konštrukcie, ktorá vysiela riadiace signály pre prijímaciu časť (Receiver). | '''Vysielacia časť (Transmitter)''' je riadiacou časťou konštrukcie, ktorá vysiela riadiace signály pre prijímaciu časť (Receiver). | ||
Ako bolo vyššie spomenuté, základ tvorí vývojová doska ACROB, ktorá disponuje mikroprocesorom ATmega328P ktorý sníma pozíciu dvoch analógových joyistickov, na základe čoho je vysielaný reťazec znakov do RF modulu. | Ako bolo vyššie spomenuté, základ tvorí vývojová doska ACROB, ktorá disponuje mikroprocesorom ATmega328P ktorý sníma pozíciu dvoch analógových joyistickov, na základe čoho je vysielaný reťazec znakov do RF modulu. | ||
[[Súbor:Transmitter zapojenie.png|300px|center]] | |||
Snímanie pozície analógového joysticku je založené na snímaní analógového napätia v rozsahu 0 ÷ 5V (pri napájaní 5V), ktoré je snímané z bežca 10KOhm potenciometru umiestnenom v konštrukcii spomínaného joysticku. Pre každé z kolies je vyhradený jeden joystick. V pôvodnom stave je bežec nastavený na stred dráhy, čím je na výstupe napätie 2,5V. Tento signál je privedený na piny PC4 a PC5 na ktorých sa nachádza aj periféria analógovo digitálneho prevodníka so vstupmi ADC4 a ADC. | Snímanie pozície analógového joysticku je založené na snímaní analógového napätia v rozsahu 0 ÷ 5V (pri napájaní 5V), ktoré je snímané z bežca 10KOhm potenciometru umiestnenom v konštrukcii spomínaného joysticku. Pre každé z kolies je vyhradený jeden joystick. V pôvodnom stave je bežec nastavený na stred dráhy, čím je na výstupe napätie 2,5V. Tento signál je privedený na piny PC4 a PC5 na ktorých sa nachádza aj periféria analógovo digitálneho prevodníka so vstupmi ADC4 a ADC. | ||
Riadok 67: | Riadok 112: | ||
Pre komunikáciu s RF modulom je použitá sériová linka, ktorá komunikuje na prenosovej rýchlosti 9600 Bd. Pin RF modulu s názvom Serial Data bol pripojený k PD1 (TxD). Reťazec ktorý je posielaný z mikroprocesoru do RF modulu vyzerá nasledovne. | Pre komunikáciu s RF modulom je použitá sériová linka, ktorá komunikuje na prenosovej rýchlosti 9600 Bd. Pin RF modulu s názvom Serial Data bol pripojený k PD1 (TxD). Reťazec ktorý je posielaný z mikroprocesoru do RF modulu vyzerá nasledovne. | ||
[[Súbor:Rámec reťazca.png|300px|center]] | |||
Na začiatku vysielaného reťazca sa vysiela identifikátor, ktorý je konštantný a skladá sa zo znakov '''5A*'''. Za ním nasleduje znak, ktorý rozhoduje o výbere pravého, resp. ľavého motora. Za ním nasleduje znak '''M''' (Motor) a znak '''S''' (speed). Za týmito znakmi sú vyslané 2 posledné znaky, ktoré reprezentujú percentuálne číslo rýchlosti. Tieto rámce sú vysielané s 10 ms odstupom, ktorý bol experimentálne zvolený. | Na začiatku vysielaného reťazca sa vysiela identifikátor, ktorý je konštantný a skladá sa zo znakov '''5A*'''. Za ním nasleduje znak, ktorý rozhoduje o výbere pravého, resp. ľavého motora. Za ním nasleduje znak '''M''' (Motor) a znak '''S''' (speed). Za týmito znakmi sú vyslané 2 posledné znaky, ktoré reprezentujú percentuálne číslo rýchlosti. Tieto rámce sú vysielané s 10 ms odstupom, ktorý bol experimentálne zvolený. | ||
Riadok 78: | Riadok 123: | ||
Pri frekvencii 50Hz a šírke impulzu 1,5ms sa motor neotáča. Pre maximálnu rýchlosť otáčania v smere hodinových ručičiek je potrebná šírka 1,3ms a v protismere hodinových ručičiek je šírka impulzu 1,7ms pri tej istej frekvencii. Maximálne otáčky dosiahnuté pri napájacom napätí 5 V sú 50 min-1. Podrobné informácie o serve viď [http://parallax.com/sites/default/files/downloads/900-00008-Continuous-Rotation-Servo-Documentation-v2.2.pdf Parallax Continuous Rotation Servo Datasheet] | Pri frekvencii 50Hz a šírke impulzu 1,5ms sa motor neotáča. Pre maximálnu rýchlosť otáčania v smere hodinových ručičiek je potrebná šírka 1,3ms a v protismere hodinových ručičiek je šírka impulzu 1,7ms pri tej istej frekvencii. Maximálne otáčky dosiahnuté pri napájacom napätí 5 V sú 50 min-1. Podrobné informácie o serve viď [http://parallax.com/sites/default/files/downloads/900-00008-Continuous-Rotation-Servo-Documentation-v2.2.pdf Parallax Continuous Rotation Servo Datasheet] | ||
[[Súbor:Receiver zapojenie.png|300px|center]] | |||
=== Algoritmus a program: Transmitter === | |||
Štruktra algoritmu zobrazená na vývojovom diagrame štručne ukazuje, že hlavnou úlohou vysielača je snímanie analógovej veličiny a následné vysielanie dát cez sériovú linku do RF modulu. | |||
Program bol tvorený v prostredí AVRstudio 4. | |||
'''Vývojový diagram''' | |||
[[Súbor:Transmitter vyvojovy diagram.png|200px|center]] | |||
'''Zdrojový kód''': | |||
<source lang="c"> | <source lang="c"> | ||
#include <avr/interrupt.h> | #include <avr/interrupt.h> | ||
Riadok 237: | Riadok 275: | ||
=== Algoritmus a program: Receiver === | === Algoritmus a program: Receiver === | ||
Štruktra algoritmu zobrazená na vývojovom diagrame štručne ukazuje, že hlavnou úlohou prijímača je prijímanie dát pomocou RF modulu, poslanie dát UARTom do mikroprocesoru, spracovanie prijatých dát a nastavenie správneho PWM signálu. | |||
Program bol tvorený v prostredí AVRstudio 4. | |||
'''Vývojový diagram''' | |||
[[Súbor:Receiver vyvojovy diagram.png|200px|center]] | |||
'''Zdrojový kód''': | |||
<source lang="c"> | <source lang="c"> | ||
#include <avr/interrupt.h> | #include <avr/interrupt.h> | ||
Riadok 387: | Riadok 434: | ||
== Fotogaléria == | == Fotogaléria == | ||
Nasledujúce fotky dokumentujú fungujúci projekt, ktorý bol otestovaný na 2 rôznych typoch podvozkoch (kolesový a pásový). | |||
Myslíme, že nepotrebujú komentáre :D | |||
[[Súbor:10893614 1010921505601566 435412085 n.jpg|300px|center]] | |||
[[Súbor:10881313 1010921495601567 1641912954 n.jpg|300px|center]] | |||
[[Súbor:10884746 1010921372268246 1355763143 n.jpg|300px|center]] | |||
[[Súbor:IMAG0222.jpg|300px|center]] | |||
[[Súbor:IMAG0225.jpg|300px|center]] | |||
[[Category:AVR]] [[Category:DVPS]] | [[Category:AVR]] [[Category:DVPS]] |
Aktuálna revízia z 11:50, 3. január 2015
Autori: | Vladislav Bača |
Marcel Galovič | |
Študijný odbor: | Aplikovaná mechatronika |
Ročník: | 2. Ing. (2014) |
Zadanie
Naším zadaním bolo navrhnúť a zrealizovať bezdrôtovú komunikáciu vo frekvenčnom pasme 433MHz. Charakteristika LPD pásma - 433MHz:
- Frekvenčný rozsah pásma: 433,050 - 434,790 MHz
- Maximálny vyžiarený výkon / intenzita poľa: 10 mW ERP
- Jeden súvislý časový interval vysielania neprekročí 5 s.
- V priebehu 10 min. môžu byť vysielané max.3 intervaly po 5 s.
- Celková doba vysielania v priebehu 24 hod. neprekročí 15 min.
Bezdrôtový prenos informácii sa v súčasnosti s obľubou využíva:
- v zabezpečovacej technike - alarmy, bezpečnostné systémy, bezdrôtové ústredne – používa sa na komunikáciu senzorov, detektorov, klávesníc a kľúčeniek s hlavnou jednotkou
- na diaľkové ovládanie - automatizované a diaľkovo ovládané brány, závory, zariadenia v priemysle, automatizácia domácnosti, zvončeky, hračky – používa sa na posielanie riadiacich signálov, na komunikáciu s akčnými členmi
- v telemetrii - domáce meteorologické stanice, meranie v priemysle, vzdialený dohľad - prenos nameraných veličín do hlavnej jednotky
- rádiomodemy - prenos údajov, komunikácia medzi dvomi terminálmi
- v automobilových aplikáciách
Modulácie v preloženom pásme Modulácie v preloženom pásme sú modulácie využívané na diaľkových alebo vzdušných prenosoch. Sú taktiež nazývané nosné modulácie (carrier modulation). Pri týchto moduláciách sa využíva samotná postupnosť digitálnych symbolov na ovplyvnenie a tým samotné určenie parametrov stochastického vysokofrekvenčného harmonického signálu.
Tento nosný signál má 3 základné parametre, ktoré moduláciami ovplyvňujeme:
- amplitúda
- frekvencia
- fáza
Moduláciou sa dosahuje zmena základných parametrov. Vo všeobecnosti poznáme tieto základné typy modulácie uvedené:
- Amplitúdová modulácia(ASK): ľahko realizovateľná ale malo odolná proti nelineárnemu skresleniu aj proti rušeniu. Vhodná je najmä na moduláciu zdrojov svetla na optických spojoch. Príklad modulácie je na Obr. 1.2.
- Frekvenčná modulácia(FSK): oproti amplitúdovej je odolnejšia proti skresleniu i rušivým signálom. Vyžaduje však väčšiu šírku pásma. Používa sa pri prenose údajov telefónnymi spojmi a rádiovými kanálmi. Príklad modulácie je na Obr. 1.3.
- Fázová modulácia(PSK): dobre využíva frekvenčné pásmo. Používa sa pri prenose údajov telefónnymi kanálmi. Niekedy môže byt' kombinovaná s amplitúdovou moduláciou.
- Kvadratúrna amlitúdová modulácia (QAM), kombinácia ASK a PSK.
- Rastrovo kódovaná modulácia (TCM, trellis coded modulation)
- (CPCA, Carrier-Present Carrier-Absent)
Treba popísať teóriu okolo bezdrôtovej komunikácie v tomto pásme, spôsoby prenosu dát, princíp AM a CPCA moduácie, RSSI a pod.
V našom zadaní sme použili 433Mhz Transciever od firmy Paralax ktorý využíva CPCA moduláciu a s indikátorom sily prijatého signálu(RSSI).
CPCA modulácia: Jej hlavnou výhodou je jednocuchosť modulácie a hardvérová nenárošnosť (lacné riešenie). Princíp CPCA modulácie: CPCA modulácia je založená na AM (amplitúdovej modulácii) to zn. zdroj modulácie je napätový generátor ktorý môže mať dva stavy: "on" alebo "off". Keď zdroj modulácie je "on" reprezentuje to logickú 1 a naopak.
Obr.2 Princíp CPCA modulácie
Ako už bolo spomenuté, výhodou CPCA modulácie je hardwérová nenárošnosť - demoduláciu prijatého AM signálu je možné vykonať len s použitím fotodiódy odporu a kondenzátoru v zapojení podľa obr 3.
Obr.3 Schéma demodulátora CPCA modulácie
Viac o CPCA modulácii tu.
Literatúra:
- 433 MHz RF Transceiver - prehlaď (parallax.com)
- 433 MHz RF Transceiver - Datasheet (.pdf)
Analýza
V rámci projektu sme mali zadanú úlohu, ktorá mala byť riešená na vývojovej doske ACROB (ACROB dokumentácia), ktorá disponuje mikroprocesorom ATmega328P. Bezdrôtová komunikácia mala byť riešená pomocou komunikačných modulou Parallax 433 MHz RF Transceiver (Parallax 433MHz transceiver), ktorý komunikuje s mikroprocesorom pomocou periférie UART.
Schéma zapojenia vývodov RF modulu:
Našou snahou bolo vytvoriť jednoduchú aplikáciu s dostupným materiálom. Z tohto hľadiska sme sa rozhodli pre vytvorenie diaľkovo ovládaného jednoduchého 3 kolesového vozidla, ktoré bude poháňané dvomi Parallax Continuous Rotation Servo (Parallax Continuous Rotation Servo).
Pre riadenie tohto vozidla bol zvolený Joystick Dualshock 2 z hernej konzoly Playstation 2, ktorý obsahuje 2 analógové joysticky ktoré snímajú pohyb v 2 osiach. Princíp tohto mechanizmu je znázornený nižšie.
Schéma zapojenia analógového joysticku:
Popis riešenia
Celý projekt je možné rozdeliť na 2 časti, ktoré budú popísané postupne
- 1. Transmitter
- 2. Receiver
Transmitter
Vysielacia časť (Transmitter) je riadiacou časťou konštrukcie, ktorá vysiela riadiace signály pre prijímaciu časť (Receiver). Ako bolo vyššie spomenuté, základ tvorí vývojová doska ACROB, ktorá disponuje mikroprocesorom ATmega328P ktorý sníma pozíciu dvoch analógových joyistickov, na základe čoho je vysielaný reťazec znakov do RF modulu.
Snímanie pozície analógového joysticku je založené na snímaní analógového napätia v rozsahu 0 ÷ 5V (pri napájaní 5V), ktoré je snímané z bežca 10KOhm potenciometru umiestnenom v konštrukcii spomínaného joysticku. Pre každé z kolies je vyhradený jeden joystick. V pôvodnom stave je bežec nastavený na stred dráhy, čím je na výstupe napätie 2,5V. Tento signál je privedený na piny PC4 a PC5 na ktorých sa nachádza aj periféria analógovo digitálneho prevodníka so vstupmi ADC4 a ADC. Tieto analógové hodnoty sú procesorom spracované a prevedené na číslo, ktoré zodpovedá hodnote rýchlosti v %. Skutočnosť, že použitý typ serva je konštruovaný tak, aby sa mohol kontinuálne otáčať jedným, alebo druhým smerom, sme museli ošetriť rozdelením rozsahu na 2 polovice. Analógové napätie zodpovedajúce hodnote 0 ÷ 2,5 V je prepočítané na hodnotu 0-49% a napätie 2,5 ÷ 5V je prepočítané na hodnotu 49-99%. Pre komunikáciu s RF modulom je použitá sériová linka, ktorá komunikuje na prenosovej rýchlosti 9600 Bd. Pin RF modulu s názvom Serial Data bol pripojený k PD1 (TxD). Reťazec ktorý je posielaný z mikroprocesoru do RF modulu vyzerá nasledovne.
Na začiatku vysielaného reťazca sa vysiela identifikátor, ktorý je konštantný a skladá sa zo znakov 5A*. Za ním nasleduje znak, ktorý rozhoduje o výbere pravého, resp. ľavého motora. Za ním nasleduje znak M (Motor) a znak S (speed). Za týmito znakmi sú vyslané 2 posledné znaky, ktoré reprezentujú percentuálne číslo rýchlosti. Tieto rámce sú vysielané s 10 ms odstupom, ktorý bol experimentálne zvolený.
Receiver
Prijímacia časť (Receiver) je riadenou časťou konštrukcie, ktorá vysielané dáta prijíma a spracováva. Je podobne ako vysielacia postavená na vývojovej doske ACROB s mikroprocesorom ATmega328P, ktorá je umiestnená na 3 kolesovom podvozku robota ACROB. Príjmanie dát zabezpečuje RF modul, ktorý je zapojený podľa obrázku nižšie. Dáta sú privedené na pin PD0 (RxD). Tieto dáta sú spracované a dekódované mikroprocesorom tak, aby bolo možné definovať, ktorý z motorov a akou rýchlosťou sa majú točiť. Tieto inštrukcie sú prevedené na šírku pulzu PWM signálu príslušného motoru, ktorý má byť riadený. Pri frekvencii 50Hz a šírke impulzu 1,5ms sa motor neotáča. Pre maximálnu rýchlosť otáčania v smere hodinových ručičiek je potrebná šírka 1,3ms a v protismere hodinových ručičiek je šírka impulzu 1,7ms pri tej istej frekvencii. Maximálne otáčky dosiahnuté pri napájacom napätí 5 V sú 50 min-1. Podrobné informácie o serve viď Parallax Continuous Rotation Servo Datasheet
Algoritmus a program: Transmitter
Štruktra algoritmu zobrazená na vývojovom diagrame štručne ukazuje, že hlavnou úlohou vysielača je snímanie analógovej veličiny a následné vysielanie dát cez sériovú linku do RF modulu. Program bol tvorený v prostredí AVRstudio 4.
Vývojový diagram
Zdrojový kód:
#include <avr/interrupt.h>
#include <avr/io.h>
#include <stdio.h>
#include "serial.h"
FILE uart_output = FDEV_SETUP_STREAM(sendchar, NULL, _FDEV_SETUP_WRITE); //potrebný príkaz pre komunikáciu cez UART
FILE uart_input = FDEV_SETUP_STREAM(NULL, recchar, _FDEV_SETUP_READ); //potrebný príkaz pre komunikáciu cez UART
void posli_lavy(void); //definovanie funkcie na vysielanie znaku pre lavy motor
void posli_pravy(void); //definovanie funkcie na vysielanie znaku pre pravy motor
void delay_ms(int ms); //definovanie funkcie oneskorenia/cakania
unsigned int buffer; //vytvorenie premennej buffer, ktorá slúži pri dočasnom odkladaí hodnoty z ADC
float pomocna; //vytvorenie premennej pomocna
char jed_znak; //vytvorenie premennej jed_znak, ktorá obsahuje jednotkovú hodnotu vysielaného percentuálneho čísla
char des_znak; //vytvorenie premennej des_znak, ktorá obsahuje desiatkovú hodnotu vysielaného percentuálneho čísla
//****************************************************************************************************
//********************************* MAIN *******************************************************
//****************************************************************************************************
int main()
{
//Inicializacia seriovej linky
inituart();
stdout = &uart_output;
stdin = &uart_input;
while(1) //nekonečný cyklus
{
posli_lavy(); //Volanie funkcie na vysielanie reťazca pre lavý motor
posli_pravy(); //Volanie funkcie na vysielanie reťazca pre pravý motor
delay_ms(10); //čakacia slučka 10ms
}
}
//--------------------------------------------------------------------------------------------------------------------
//------------------------------------Funkcia na vyslanie udaju rychlosti laveho motora-------------------------------
//--------------------------------------------------------------------------------------------------------------------
void posli_lavy(void)
{
adc2_init(); //funkcia pre inicializáciu ADC pre kanál 5
ADCSRA |= (1<<ADSC); //Štart A/D prevodu
while ( !(ADCSRA & (1<<ADIF))); //čakanie, kým AD prevod nie je ukončený
buffer = ADC; //dočasné uloženie výsledku z AD prevodu
pomocna=buffer; //uloženie buffer do pomocnej
pomocna = (pomocna/1024)*100; //prepočet dat z ADC
des_znak=(pomocna/10)+48; //výpočet desiatok
jed_znak=(pomocna-(10*(des_znak-48)))+48; //výpočet jednotiek
delay_ms(10); //čakacia slučka 10ms
printf("5A*LMS%c%c",des_znak,jed_znak); //vyslanie dát po sériovej linke do RF modulu
}
//--------------------------------------------------------------------------------------------------------------------
//------------------------------------Funkcia na vyslanie udaju rychlosti praveho motora-------------------------------
//--------------------------------------------------------------------------------------------------------------------
void posli_pravy(void)
{
adc1_init(); //funkcia pre inicializáciu ADC pre kanál 4
ADCSRA |= (1<<ADSC); // Štart A/D prevodu
while ( !(ADCSRA & (1<<ADIF))); // čakanie, kým AD prevod nie je ukončený
buffer = ADC; //dočasné uloženie výsledku z AD prevodu
pomocna=buffer; //uloženie buffer do pomocnej
pomocna = (pomocna/1024)*100; //prepočet dat z ADC
des_znak=(pomocna/10)+48; //výpočet desiatok
jed_znak=(pomocna-(10*(des_znak-48)))+48; //výpočet jednotiek
delay_ms(10); //čakacia slučka 10ms
printf("5A*RMS%c%c",des_znak,jed_znak); //vyslanie dát po sériovej linke do RF modulu
}
//--------------------------------------------------------------------------------------------------------------------
//------------------------------------Inicializacia ADC4 vstupu-------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------
void adc1_init(void) // Inicializácia AD prevodu pre kanál 4
{
ADMUX = 0b01000100; // externá referencia, kanál 4 (ADC4) - NTC
ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); // =0b10000111, A/D zapnutý, delička = 128
}
//--------------------------------------------------------------------------------------------------------------------
//------------------------------------Inicializacia ADC5 vstupu-------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------
void adc2_init(void) // Inicializácia AD prevodu pre kanál 5
{
ADMUX = 0b01000101; // externá referencia, kanál 4 (ADC4) - NTC
ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); // =0b10000111, A/D zapnutý, delička = 128
}
//--------------------------------------------------------------------------------------------------------------------
//------------------------------------Funkcia oneskorenia/cakania-----------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------
void delay_ms(int ms)
{
unsigned int index;
while (ms)
{
index = 4*799;
while(index)
{
asm volatile ("nop");
index --;
}
ms--;
}
}
Zdrojový kód: Transmitter.c
Algoritmus a program: Receiver
Štruktra algoritmu zobrazená na vývojovom diagrame štručne ukazuje, že hlavnou úlohou prijímača je prijímanie dát pomocou RF modulu, poslanie dát UARTom do mikroprocesoru, spracovanie prijatých dát a nastavenie správneho PWM signálu. Program bol tvorený v prostredí AVRstudio 4.
Vývojový diagram
Zdrojový kód:
#include <avr/interrupt.h>
#include <avr/io.h>
#include <stdio.h>
#include "serial.h"
#define Pravy_ON PORTB |= 0x02; //Zapne Pravy motor
#define Pravy_OFF PORTB &= ~0x02; //Vypne Pravy motor
#define Lavy_ON PORTB |= 0x04; //Zapne Lavy motor
#define Lavy_OFF PORTB &= ~0x04; //Vypne Lavy motor
FILE uart_output = FDEV_SETUP_STREAM(sendchar, NULL, _FDEV_SETUP_WRITE); //potrebný príkaz pre komunikáciu cez UART
FILE uart_input = FDEV_SETUP_STREAM(NULL, recchar, _FDEV_SETUP_READ); //potrebný príkaz pre komunikáciu cez UART
int input=0; //vytvorenie premennej input
unsigned char Prijate_data[8]; //vytvorenie pola znakov o veľkosti 8
unsigned int Speed_L=0; //vytvorenie premennej Speed_L (počiatočná hodnota = 0)
unsigned int Speed_R=0; //vytvorenie premennej Speed_R (počiatočná hodnota = 0)
void nastav_motorceky(int L,int R); //definovanie funkcie na nastavenie motorov so vstupnými hodontami L a R
void delay_ms(int ms); //definovanie funkcie oneskorenia/cakania
//*****************************************************************************************************************************
//************************************** MAIN ***************************************************************************
//*****************************************************************************************************************************
int main()
{
unsigned char i=0; //definovanie lokálnej premennej i
for(i=0;i<8;i++) // vynulovanie pola Prijate_data - sem sa budú ukladat prijate data z komunikacie a tie budu vyhodnocované
{
Prijate_data[i]=0;
}
//*****************************************************************************************************************************
//************************************* FORMAT pola Prijate_data: ****************************************************
//FORMAT pola Prijate_data:
//
// 5 A * L/R M S x x
// |___|___|___|___|___|___|___|___|
//
//Vysvetlivky: 5A* -> synchronizacia (kvoli problemom s pociatocnym prijatym znakom a rozpoznaním vysielaca )
// L/R -> výber laveho alebo praveho motora
// M -> motor (konstantny znak)
// S -> rýchlos (speed - konstantny znak)
// xx -> rychlost otacania motora v % (0-99)
//*****************************************************************************************************************************
//*****************************************************************************************************************************
//Inicializacia seriovej linky
inituart();
stdout = &uart_output;
stdin = &uart_input;
//Inicializacia PWM motorcekov
DDRB |= 0x06; //Nastavenie pinov PB1 a PB2
PORTB |= 0x01; //Nastavenie výstupu na log. 0
TCCR1A = 0b10100010; // Mód: PWM, Phase Correct, 9-bit
TCCR1B = 0b00011011; // Delička 1:1024
ICR1= 0x1388 ; // nastavenie 20ms = 50Hz
TCNT1 = 0x00;
while(1)
{
i=0;
do {
input = getchar(); //cakaj az kym nacita priate data z UART
Prijate_data[i]=input; //uloz prijate data do pola na poziciu i
i++; //inkrementuj premenu i o 1
}
while(input>='!' && input<='~' && i<8); //testuje sa na podmienku, či je prijaty znak znak z intervalu '!' az '~' a ci je pole uz uplne obsadene
//testovanie prijateho retazca
if(Prijate_data[3]=='L' && Prijate_data[4]=='M' && Prijate_data[5]=='S' && i==8) //Je splnená ak je 3. znak písmeno L a zároveň 4. znak písmeno M a zároveň je 5. znak písmeno S a zároveň je počet zankov 8
{
Speed_L=((Prijate_data[6]-48)*10)+(Prijate_data[7]-48); //potom premenná speed_L je vypočítaná zo 7. a 8. znaku poľa
}
if(Prijate_data[3]=='R' && Prijate_data[4]=='M' && Prijate_data[5]=='S' && i==8) //Je splnená ak je 3. znak písmeno R a zároveň 4. znak písmeno M a zároveň je 5. znak písmeno S a zároveň je počet zankov 8
{
Speed_R=((Prijate_data[6]-48)*10)+(Prijate_data[7]-48); //potom premenná speed_R je vypočítaná zo 7. a 8. znaku poľa
}
nastav_motorceky(Speed_L,Speed_R); //volanie funkcie na nastavenie rýchlosti motorov
}
}
//-----------------------------------------------------------------------------------------------------------------------------
//--------------------------------------Funkcia na nastavenie motorcekov-------------------------------------------------
void nastav_motorceky(int L,int R)
{
OCR1A=420-R-1; //nastavenie šírky impulzu pre pravý motor
OCR1B=321+L; //nastavenie šírky impulzu pre lavý motor
}
Zdrojový kód: Receiver.c
Overenie: Transmitter
Pre oživenie časti transmitter je potrebné pripojiť RF modul a analógový JOYSTICK k vývojovej doske ACROB tak ako to bolo zobrazené pri popise Transmittra. Otvorením súboru Transmitter.c v programe AVRstudio a správnym priradením knižníc by mal byť vygenerovaný .hex súbor bez komplikácií, ktorý je nahraný do mikroprocesora na doske ACROB. Po vykonaní týchto úkonov by malo byť na pine DATA RF modulu možné pomocou log. analyzátoru vidieť UART priebeh niekoľkých znakov nasledujúcich za sebou, ktorý má tvar popísaný v časti Receiver ( |5|A|*|L/R|M|S|x|x|). Teda 8 bajov celkovo za sebou nasledujúcich. Tieto priebehy by sa mali opakovať s odstupom každých 10 ms. Pri zmene polohy JOYSTICKu by sa mal meniť hodnota posledných 2 bajtov. Ak tomu tak nie je, je nutné skontrolovať, či sa mení napätie na výstupe z JOYSTICKu pri zmene polohy. Ďalej je nutné skontrolovať správnosť zapojenia a prípadné zlé kontakty na kontaktnom poli.
Ovládanie vysielača:
Ak sme namerali správne dáta na pine DATA RF modulu, jedinou potrebnou obsluhou je menenie polohy joysticku pre pravý/ľavý motor. Vzhľadom na skutočnosť, že sme využívali iba jednu os z každého joysticku, "páčky" reagujú iba na pohyb smerom dopredu/dozadu.
Overenie: Receiver
Pre oživenie časti transmitter je potrebné pripojiť RF modul a servá k vývojovej doske ACROB tak ako to bolo zobrazené pri popise Receivera. Otvorením súboru Transmitter.c v programe AVRstudio a správnym priradením knižníc by mal byť vygenerovaný .hex súbor bez komplikácií, ktorý je nahraný do mikroprocesora na doske ACROB. Po nahratí programu do mikroprocesoru je potrebné odpojiť programátor z dosky, pretože pri jeho ponechaní na doske nedokáže RF modul stiahnuť signál na pine RxD na úroveň log.0 čím je znemožnené mikroprocesoru vyhodnotiť prijaté dáta. Po vykonaní týchto krokov by malo všetko fungovať na prvý pokus. Ak sa vyskytne chyba, je možné opäť log. analyzátorom odsledovať dáta na pine DATA RF modulu. Mali by sa tam vyskytovať rovnaké dáta aké boli vysielané. V niektorých prípadoch sa výnimočne stane, že prvý bajt komunikácie je zmenený. To však program nijak neovplyvňuje, nakoľko je tento problém ošetrený. Pri pretrvávajúcom probléme je vhodné skontrolovať zapojenie a prípadné prerušenie kontaktu na kontaktnom poli. (Pozn: pre prácu so servami, ktoré sú pripojené ku konektoru X5 je potrebné, aby bol prepínač „power switch“ nachádajúci sa pod tlačidlom reset, v polohe 2)
Ovládanie prijímača:
Ak je všetko v poriadku a vyššie spomenuté kritéria sú splnené, obsluha tohto modulu nie je. O všetko riadenie sa stará modul vysielača.
Nezabudnite napísať čosi ako užívateľský návod. Z neho by malo byť jasné čo program robí, ako sa prejavuje a aké má užívateľské rozhranie (čo treba stlačiť, čo sa kde zobrazuje). Ak ste namerali nejaké signály, sem s nimi. Ak je výsledkom nejaký údaj na displeji, odfotografujte ho.
Fotogaléria
Nasledujúce fotky dokumentujú fungujúci projekt, ktorý bol otestovaný na 2 rôznych typoch podvozkoch (kolesový a pásový).
Myslíme, že nepotrebujú komentáre :D