Sinihammas juhtmevaba side Robootika Kodulaboris

Autor: Raivo Sell

Käesolev õpiobjekt tutvustab Bluetooth (Sinihammas) mooduli kasutamist Robootika Kodulaboriga.

Bluetooth (eesti keeles Sinihammas) on tööstusstandard seadmete juhtmevaba ühenduse loomiseks. Bluetooth on eelkõige mõeldud arvutite ja mobiiltelefonide ühendamiseks erinevate perifeeriaseadmetega, nagu näiteks kõrvaklapid, printerid, GPS vastuvõtjad, jne. Samuti on Blutooth ühenduse abil võimalik lihtsalt ja turvaliselt vahetada kahe seadme vahel andmeid. Bluetooth on kahetasandiline standard, mis määrab ära füüsilise kihi (raadiosignaalide sageduse) ning samuti protokolli kihi (kuidas andmeid edastatakse).

Robootika Kodulaboris on Bluetooth seadmeks Bluetooth Bee moodul, mis on ühendatud Kommunikatsiooni plaadile. Andmevahetuseks mikrokontrolleriga kasutab Bluetooth Bee moodul UART jadaliidest.

ESF

Õpiobjekti nimi: Sinihammas juhtmevaba side Robootika Kodulaboris

Õpiväljundid:

Pärast mooduli läbimist õpilane:

  • Kirjeldab Bluetooth mooduli tööprintsiipi
  • Kirjeldab Bluetooth ühenduse loomist
  • Ühendab vajalikud moodulid õigesti

Kasutusjuhend:

  • Teoreetilise taustamaterjaliga tutvumine
  • Õppevideo vaatamine
  • Enesekontrolli küsimustele vastamine

Õpetatav osa: Lugeda teoreetilist ülevaadet enne riistvara reaalset ühendamist ja pingestamist. Vaadata õpivideosid korrektse riistvara käsitlemise tagamiseks. Õpitu kinnistamiseks tuleb praktilised näited reaalselt läbi teha.

Seoste loomine: Läbi õppevideo ja sõnalise selgituse järgimise.

Kinnistav osa: Iseseisev praktika reaalse riistvarakomplekti baasil.

TEOREETILINE OSA

Bluetooth

Bluetooth on juhtmevaba andmevahetusstandard, mis kasutab andmeedastuseks raadiosignaale vahemikus 2,402 - 2,480 GHz. Samal sagedusel töötavad ka paljud teised laiatarbe raadioseadmed. Bluetooth kasutab madala võimsusega raadiosignaale, mis piirab seadmete leviulatuse ca 10 meetrile. Andmevahetuseks ei ole vaja kahe seadme otsenähtavust, kuigi seinad ja muud takistused vähendavad seadmete leviulatust. Korraga võib ühendada kuni 8 Bluetooth seadet ilma, et need omavahel andmevahetust segama hakkaksid. Selle tagab nn. spread-spectrum frequency hopping tehnoloogia, mis tagab, et ühendunud seadmed kasutavad natuke erinevat sagedust ning muudavad seda pidevalt.

Bluetooth ühendus

Bluetooth ühenduse üheks omaduseks on tema automaatne ühenduvus. Kui Bluetooth seade ilmub teise seadme nähtavuspiirkonda toimub automaatne elektrooniline infovahetus, selgitamaks välja, kas on vaja alustada andmevahetust või peab üks seade võtma üle teise seadme juhtimise. Selline infovahetus toimub automaatselt, ilma et kasutajal oleks vaja selleks eraldi käsklusi anda. Kui infovahetuse käigus selgub, et seadmed on autoriseeritud üksteisega suhtlema, luuakse automaatselt PAN (Personal-Area Network) võrk või nõnda nimetatud Piconet, mis on ülem-alluv stiilis väike võrk - näiteks mobiiltelefon ja kõrvaklapid. Kui võrk on loodud, valivad selle liikmed omale sageduse, et mitte interfereeruda teiste, ruumis olevate Bluetooth seadmetega, kes ei kuulu samasse võrku. Olles ühes võrgus, ignoreerived võrgu liikmeid teisi seadmeid, isegi kui need üritavad alustada andmevahetussessiooni.

Bluetooth turvalisus

Bluetooth protokolli juures on turvalisus oluline tegur ja erinevaid reziimid tagavad andmevahetuse ja ühenduse turvalisuse. Üldjuhul saab kasutaja määrata usaldatud seadmed (trusted devices), millega võib ühendusi luua ilma, et küsitakse eraldi parooli. Kui uus seade üritab luua ühendust on kasutajal võimalus seda lubada või keelata. Turvameetmed sisaldavad endas autoriseerimist ja seadme indentifitseerimist enne, kui alustatakse andevahetust.

Kasutamine

Bluetooth Bee on Bluetooth SPP (Bluetooth Serial Port Profile) tüüpi moodul, mis sobib Robootika Kodulabori sidemooduli plaadi „XBee“ pesasse. Analoogselt ZigBee mooduliga, toimub mikrokontrolleri ja Bluetooth Bee mooduli suhtlus UART liidese kaudu. Tavaliselt kasutatakse Bluetooth sidet arvuti ja mikrokontrolleri vahelise side tekitamiseks, kuigi Bluetooth mooduleid või samahästi kasutada ka kahe mikrokontrolleri vaheliseks sideks.

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 (slave)ja alustada ühendust arvutist või seadistada see ülemaks (master) 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.

NÄITEKOOD

Näitekood 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 <homelab/usart.h>
#include <homelab/module/lcd_gfx.h>
#include <homelab/delay.h>
#include <homelab/pin.h>
 
//Lisame ZigBee mooduli toe
#include <homelab/module/zigbee.h>
 
// 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;
}

ENESEKONTROLL

Vastates alljärgnevatele küsimustele, saad proovida oma teadmisi antud teema kohta

Millist andmevahetusprotokolli kasutab Bluetooth Bee mikrokontrolleriga suhtlemisel?
Vali õige vastus

SPI
UART
USB
Ethernet

Kuidas toimub Bluetooth seadmete omavaheline ühendus?
Vali õiged vastused

Seadmed ühenduvad kasutaja spetsiifilise käsuga
Autoriseeritud seadmed ühenduvad automaatselt, kui on sattunud üksteise leviulatusse
Ühenduvad ainult autoriseeritud ja indentifitseeritud seadmed
Kui seadmed on võrgu juba loonud ignoreerivad nad teiste seadmete andmevahetuse algatusi
Ülem (master) tüüpi seade ühendab alati kõik alluv (slave) tüüpi seadmed

Mida tähendab lühend PAN?
Vastus sisesta suurte algustähtedega või kõik väikesed tähed


Kui suur on tüüpiline Bluetooth seadmete leviulatus?
Vali õige vastus

10 meetrit
60 meetrit
1 meeter

Millises reziimis saab Bluetooth Bee moodulit kasutada?
Vali õiged vastused

Ülem (master)
Alluv (slave)
Koordinaator

LISAMATERJAL

  1. Robootika Kodulabor - Kommunikatsioonimoodul
  2. Robootika Kodulabor - Bluetooth juhtmevaba side
  3. Seeed Studios - Bluetooth Bee dokumentatsioon

Teoreetilise osa ja näitekoodi algtekstide autor: Raivo Sell ja Eero Väljaots