Table of Contents

Bluetooth

Vajalikud teadmised: [HW] Kontrollermoodul, [AVR] USART, [LIB] Jadaliides,
[LIB] Graafiline LCD

Eunistone mooduli puhul vaata siia: Eunistone moodul

Teooria

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 <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;
}
et/examples/communication/bluetooth.txt · Last modified: 2020/07/20 09:00 by 127.0.0.1
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0