====== Bluetooth ====== //Vajalikud teadmised: [HW] [[et:hardware:homelab:controller]], [AVR] [[et:avr:usart]], [LIB] [[et:software:homelab:library:usart]], \\ [LIB] [[et:software:homelab:library:module:lcd_graphic]]// **Eunistone mooduli puhul vaata siia:** [[et/examples/communication/bluetooth/eunistone|Eunistone moodul]] ===== Teooria ===== [{{ ::examples:communication:bt.jpg?220|BT moodul.}}] Bluetooth on tööstusstandard seadmete omavaheliseks traadita ühenduseks. Selle eesmärgiks on juhtmeühenduste asendamine mobiiltelefonide, arvutite jt. suhtlemisel perifeeriaseadmetega. ===== Praktika ===== Bluetooth Bee moodul sobib Kodulabori sidemooduli plaadile „XBee" pesasse. Analoogselt ZigBee mooduliga, toimub suhtlus ka Bluetooth Bee mooduliga kasutades kontrolleri USART liidest. Moodul läheb toite sisselülitamisel vaikimisi käsurežiimi. Bluetoot Bee moodul loeb käsu õigeks, kui see on alustatud ja lõpetatud ASCII märkidega CR (13 ehk ’\r’) ja LF (10 ehk ’\n’). Moodulit on võimalik testimiseks ühendada ka arvuti jadaliidesesse. Suhtlemiseks näiteks Hyper Terminali abil tuleb seal valida //Properties//, //Settings tab//, //ASCII Setup...// ning märkida linnukesega //Send line ends with line feeds// ja //Echo typed characters locally//. Enne käsu kirjutamist vajutada korra ENTER klahvile ja kirjutada ainult käsk ilma muude märkideta (näiteks „+INQ=1“) ja veelkord ENTER. Vale käsu saatmisel vastab moodul „ERROR“, vastasel juhul „OK“. Kontrollerist moodulile käsu saatmisel on vajalik lisada siiski algusesse ja lõppu ka CR ja LF ehk käsk tuleb saata kujul „\r\n+INQ=1\r\n“ ja selleks koostatakse string esimese elemendiga ’\r\’ jne. Kui mooduli saab toite ja on jadaliidese pordi kaudu suhtlemiseks saadaval, siis vilgub roheline LED kiirelt kaks korda sekundis. Selles vaikimisi olekus ei ole Bluetooth Bee arvutist leitav, kui sealt ümberringi asuvaid Bluetooth seadmeid otsida. Bluetooth Bee moodulit saab ühendada arvutiga kahel viisil: kas seadistada Bluetooth Bee alluvaks seadmeks ja alustada ühendust arvutist või seadistada see ülemaks seadmeks, detekteerida Bluetooth toega arvuti ja ühendada see endaga. Esmalt tuleb määrata mooduli pin-kood Bluetooth seadmete paarimiseks. See toimub käsuga „\r\n+STPIN=0000\r\n“, kus 0000 on pin-koodina vaikimisi kasutusel. Käsk „\r\n+STWMOD=0\r\n“ seab Bluetooth Bee mooduli alluvaks seadmeks. „\r\n+INQ=1\r\n“ lubab moodulit leida teistest seadmetest (punane ja roheline LED hakkavad vaheldusmisi vilkuma). Arvutist on seade nüüd leitav, selle saab paarida ja luua ühenduse virtuaalse jadaliidese kaudu. Moodul küsib ühenduse loomisel arvutist ka pin-koodi. Aktiivse ühenduse olemasolul vilgub mooduli roheline LED kord kahe sekundi jooksul. Teisel juhul viib „\r\n+STWMOD=1\r\n“ Bluetooth Bee ülema seadme režiimi. „\r\n+INQ=1\r\n“ paneb mooduli teisi seadmeid otsima. Leitud Bluetooth seadmete või arvutite aadressid saadab moodul tagasi näiteks kujul „\r\n+RTINQ=0,11,67,AF,95,7E;LAPTOP\r\n“. Leitud aadresside abil saab luua ühenduse soovitud seadmega „\r\n+CONN=0,11,67,AF,95,7E\r\n“. Kui ühendus on loodud virtuaalse jadaliidese abil, siis on võimalik arvutist saata Hyper Terminali vms. kaudu andmeid Bluetooth Bee vahendusel kontrollerile. Ühenduse katkestamiseks tuleb seda teha arvutist või tekitada kontrolleriga Bluetooth Bee PIO0 sisendisse tõusev front. Järgnev kood selgitab mooduli kasutamist analoogselt ZigBee näitele. Siin seatakse Bluetooth Bee ülemaks seadmeks (seda on vaja teha ainult esimesel korral, nagu ka pin-koodi, mooduli nime jm. seadete sisestust) ja luuakse selle abil ühendus mõne muu seadmega. #include #include #include #include //Lisame ZigBee mooduli toe #include // USART liidese määramine usart port = USART(1); // LEDid ja nupud määrata pin leds[3] = { PIN(C, 3), PIN(C, 4), PIN(C, 5) }; pin buttons[3] = { PIN(C, 0), PIN(C, 1), PIN(C, 2) }; int8_t wait_button(uint16_t ms); void bluetooth_read_string(usart port, char *text, char chr); //Ühendatavad seadme Bluetooth aadress char btadr[16] = {'0',',','1','1',',','6','7',',','A','F', ',','9','5',',','7','E'}; int main(void) { char tekst[24]; int a = 0; // seadista LEDide ja nuppude I/O pordid for (int i=0; i<3; i++) { pin_setup_output(leds[i]); pin_setup_input(buttons[i]); } // USART liidese seadistamine Bluetooth side jaoks usart_init_async(port, USART_DATABITS_8, USART_STOPBITS_ONE, USART_PARITY_NONE, USART_BAUDRATE_ASYNC(38400)); // LCD ekraani algseadistamine lcd_gfx_init(); // Taustavalgustuse tööle lülitamine lcd_gfx_backlight(true); // Bluetooth Bee seadistamine ülemaks seadmeks // seda on vaja teha ainult üks kord, // järgmine kord moodul juba mäletab seadeid lcd_gfx_clear(); // saada moodulile käsk usart_send_string(port,"\r\n+STWMOD=1\r\n"); // loeb kuni õige vastus tuleb while (tekst[9] != '1') { //loe üks mooduli saadetud string bluetooth_read_string(port,tekst,10); //kirjuta ekraanile lcd_gfx_goto_char_xy(0, a>>1); lcd_gfx_write_string(tekst); a++; } hw_delay_ms(3000); // Ühendamine soovitud seadmega lcd_gfx_clear(); //saada käsk usart_send_string(port,"\r\n+CONN="); // saada ühendatava seadme aadress usart_send_string(port,btadr); // lõpeta käsk usart_send_string(port,"\r\n"); //oota vastuseid for (a=0; a<8; a++) { bluetooth_read_string(port,tekst,10); lcd_gfx_goto_char_xy(0, a>>1); lcd_gfx_write_string(tekst); } hw_delay_ms(3000); // Joonistab ekraanile infot lcd_gfx_clear(); lcd_gfx_goto_char_xy(0, 0); lcd_gfx_write_string("Bluetooth demo"); lcd_gfx_goto_char_xy(0, 1); lcd_gfx_write_string("Nupp1: LED roh"); lcd_gfx_goto_char_xy(0, 2); lcd_gfx_write_string("Nupp2: LED kol"); lcd_gfx_goto_char_xy(0, 3); lcd_gfx_write_string("Nupp2: LED pun"); // Hoia meeles eelmist nuppu selleks, et vältida olukorda, // kus nuppu all hoides tuleb sada nupuvajutusi järjest. // Algatuseks olgu see -1 ehk ükski nupp pole all. int8_t previousButton = -1; // Lõputu tsükkel moodulite andmetevahetuse näitamiseks while (true) { int8_t button; //muutuja nupuvajutuse registreerimiseks // Oota nuppu 1 millisekund button = wait_button(1); // Kui eelmises tsüklis oli nupp üleval ja nüüd on all if (previousButton == -1 && button != -1) { // teisenda nupu indeks liites A täht // ja saada teisele moodulile // A täht on esimene nupp, B täht teine nupp jne usart_send_char(port, 'A' + button); } // Loe USART'st if (usart_has_data(port)) { // loe bait, teisenda leds massiivi indeksiks //ja muuda väljundit. pin_toggle(leds[usart_read_char(port) - 'A']); } // Jäta meelde mis nupp oli hetkel alla vajutatud previousButton = button; } } // Ootab nupu vajutust ms millisekundit. //Kui tuleb nupu vajutus, tagastab vastava nupu järjekorra nr-i int8_t wait_button(uint16_t ms) { // Vaikimisi -1 tähendab, et ükski nupp pole vajutatud. int8_t button_nr = -1; uint16_t counter = 0; do { // vaata kas mõni nupp on all for (uint8_t i=0; i<3; i++) { if (!pin_get_value(buttons[i])) { button_nr = i; break; } } // oota 1 millisekund hw_delay_ms(1); // suurenda millisekundi loendurit counter++; } while (button_nr == -1 && (counter < ms)); return button_nr; } void bluetooth_read_string(usart port, char *text, char chr) { char buf = 0; int end = 0; int lnd = 0; // salvestab vajaliku osa saadud stringist while (end < 2) { // oota saabuvat baiti while (!usart_has_data(port)); // lae ringi saadud bait buf = usart_read_char(port); // kui lubatud salvestada if (end == 1) { // lõpeta CR peale, muul juhul salvesta if (buf == 13) end = 2; else text[lnd] = buf; // kohaloendur lnd++; } // kui on õige tähemärk, siis salvestama if (buf == chr) end = 1; } // stringi terminaator lõppu text[lnd-1] = 0; }