- sprawdzi kompatybilność biblioteki bbmagic_lib funkcją: bbm_bt_lib_version()
- włączy komunikację BBMagic Bluetooth w Raspberry Pi aby możliwe było odbieranie danych z modułów BBMagic. Funkcja: bbm_bt_open(..)
- odbierze dane z modułu BBMagic MAGNETO funkcją: bbm_bt_read(..)
- wyświetli odebrane dane na ekranie
- po naciśnięciu przez użytkownika 'ctrl+c’ wyłączy komunikację BBMagic Bluetooth funkcją bbm_bt_close() i zakończy działanie
Budowa aplikacji
Nasz projekt będzie składał się z następujących plików:
- bbmagic_lib_1.2.a to biblioteka obsługująca moduły BBMagic przez interfejs Bluetooth Low Energy – dla Raspberry Pi zero W i Raspberry Pi 3, które posiadają chipset bluetooth.
- bbmagic_lib.h to plik nagłówkowy biblioteki bbmagic_lib zawierający definicje potrzebnych stałych
- libbluetooth.a to biblioteka z pakietu libbluetooth-dev Debiana zawierającego pliki deweloperskie używane z biblioteką BlueZ. Powinieneś ja mieć już na swojej Malinie, ale gdybyś nie miał to dla ułatwienia zawieramy ją w naszym projekcie.
- bbmagic_magneto_sketch.c to plik aplikacji, który właśnie napiszemy
- Makefile to plik z instrukcjami dla programu make kontrolującego przebieg kompilacji
Przygotowanie projektu
Stwórz nowy katalog dla naszego projektu: mkdir bbmagic_magneto_sketch
i przejdź do niego cd bbmagic_magneto_sketch
Otwórz swój ulubiony edytor. Jeśli jeszcze nie masz ulubionego otwórz nano – jest prosty i intuicyjnynano bbmagic_magneto_sketch.c
Piszemy program dla BBMagic MAGNETO
1. Załączamy niezbędne pliki nagłówkowe oraz wstawiamy funkcję main#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include "bbmagic_lib.h"
int main(void)
{
2. Deklarujemy potrzebne zmienneunsigned char bbm_buf[BBLIB_FRAME_SIZE] ;
int i, data_length ;
float vcc_f, adc_1, adc_2 ;
- bbm_buf – bufor na dane od modułu BBMagic – rozmiar bufora BBLIB_FRAME_SIZE zdefiniowany jest w pliku 'bbmagic_lib.h’
- vcc_f – zawierać będzie wartość napięcia zasilania modułu BBMagic MAGNETO
- adc_1, adc_2 – dla zmierzonych napięć na wejściach ADC_1 i ADC_2
- i, data_length – potrzebne do … okaże się za moment, poniżej
3. Sprawdzamy zgodność wersji biblioteki bbmagic_lib.
Jeśli to wersja 0x0102 to jest ok – nasz program jest z nią kompatybilny.
i = bbm_bt_lib_version() ;
printf("bbm_lib_version: %0.4X - ",i) ;
if(i == 0x0102) printf("ok\n") ;
else
{
printf("nok - stop\n\n") ;
exit(1) ;
}
4. Włączamy komunikację Bluetooth przy użyciu funkcji z biblioteki 'bbmagic_lib_1.2′.
Wszystkie dostępne funkcje zawarte są w pliku 'bbmagic_lib.h’.
i = bbm_bt_open(17) ;
if(i) exit(2) ;
Argumentem funkcji jest numer pinu Raspberry Pi, do którego podłączona będzie dioda sygnalizująca transmisję danych od modułów BBMagic.
Jeśli zawiera się w przedziale od 1 do 27 sygnalizacja zostanie włączona na wskazanym pinie. Jeśli jest równy zero lub większy niż 27 sygnalizacja nie zostanie włączona.
Diodę LED podłączyć można na dwa sposoby:
do
{
data_length = bbm_bt_read(bbm_buf) ;
if(data_length > 0)
{
Jeśli odebrano dane to znajdują się one w buforze 'bbm_buf’, a zmienna 'data_length’ pamięta liczbę odebranych bajtów.
Podstawowe wartośći, które funkcja bbm_bt_read(..) może zwrócić to:
- data_length < 0 : odebrano 'data_length’ bajtów danych od modułu BBMagic
- data_length == 0 : nie odebrano danych od modułu BBMagic
- data_length == -1 : użytkownik przerwał program naciskając 'ctrl+c’
- data_length == -10 : odebrane dane od modułu BBMagic nie są autentyczne. Niezgodny podpis cyfrowy.
Wszystkie możliwe wartośći, które funkcja bbm_bt_read(..) może zwrócić zawiera plik 'bbmagic_lib.h’.
6. Sprawdzamy czy odebrane dane pochodzą od BBMagic MAGNETO.
switch(bbm_buf[BBMAGIC_DEVICE_TYPE])
{
case BBMAGIC_M_MAGNETO :
Stałe 'BBMAGIC_DEVICE_TYPE’ oraz 'BBMAGIC_M_MAGNETO’ zdefiniowane są w pliku 'bbmagic_lib.h’.
7. Konwertujemy i wyświetlamy wszystkie informacje przysłane przez BBMagic MAGNETO.
- Nazwa modułu, który przysłał dane:
printf("BBM_MAGNETO_") ;
- Sześciobajtowy adres Bluetooth modułu
for(i=0; i<BBM_BT_ADDR_SIZE; i++)
printf("%0.2X", bbm_buf[BBMAGIC_DEVICE_ADDR_5 + i]) ; - Wersja firmware’u modułu BBMagic MAGNETO:
printf(" | firm_version:%0.2X.%0.2X\n", bbm_buf[BBM_MAGNETO_FIRM_1], bbm_buf[BBM_MAGNETO_FIRM_0]) ;
- Przeliczamy i wypisujemy wartość napięcia zasilania
vcc_f = bbm_buf[BBM_MAGNETO_V_SUP] ; vcc_f/=BBMAGIC_VCC_DIVIDER ;
printf(" chip_vcc:%0.2fV", vcc_f) ;
- Temperatura chipu:
printf(" | chip_temp:%d*C", (signed char)bbm_buf[BBM_MAGNETO_CHIP_TEMP]) ;
- Czas pracy modułu od momentu włączenia zasilania w sekundach
i =bbm_buf[BBM_MAGNETO_WORKTIME_3] ; i<<=8 ;
i |=bbm_buf[BBM_MAGNETO_WORKTIME_2] ; i<<=8 ;
i |=bbm_buf[BBM_MAGNETO_WORKTIME_1] ; i<<=8 ;
i |=bbm_buf[BBM_MAGNETO_WORKTIME_0] ;
printf(" | chip_working:%4d s",i) ;
- Moc odbieranego sygnału
printf(" | RSSI:%ddBm", (signed char)bbm_buf[BBMAGIC_DEVICE_RSSI]) ;
- Wartości zmierzonego napięcia na wejściach ADC_1 i ADC_2 (w przeliczeniu na wolty)
adc_1 =bbm_buf[BBM_MAGNETO_ADC_1_MSB] ; adc_1 *=256.0 ; adc_1 +=bbm_buf[BBM_MAGNETO_ADC_1_LSB] ; adc_1 /=1000.0 ;
adc_1 =bbm_buf[BBM_MAGNETO_ADC_1_MSB] ; adc_1 *=256.0 ; adc_1 +=bbm_buf[BBM_MAGNETO_ADC_1_LSB] ; adc_1 /=1000.0 ;
printf(" ADC_1: %1.2fV | ADC_2: %1.2fV", adc_1, adc_2) ;
- Poziom ośiwetlenia
printf(" | Light: %d", bbm_buf[BBM_MAGNETO_LIGHT]) ;
- Stan wejść IN_0 do IN_3 oraz stan wejścia kontaktronowego
printf(" | IO_state: %0.2X", bbm_buf[BBM_MAGNETO_FLAGS]) ;
8. Sprawdzamy czy kontaktron wykrywa obecność pola magnetycznego.
Na koniec opiszmy stan detekcji pola magnetycznegoif(bbm_buf[BBM_MAGNETO_FLAGS] & BBM_MAGNETO_MAGNET_MASK)
printf(" | MAGNET detected") ;
else printf(" | no MAGNET") ;
9. Sprawdzamy stan wejść IN_0 do IN_3.
if(bbm_buf[BBM_MAGNETO_FLAGS] & BBM_MAGNETO_IN_0_BIT)
printf("\n IN_0 - LO") ;
else printf("\n IN_0 - HI") ;
if(bbm_buf[BBM_MAGNETO_FLAGS] & BBM_MAGNETO_IN_1_BIT)
printf(" | IN_2 - LO") ;
else printf(" | IN_1 - HI") ;
if(bbm_buf[BBM_MAGNETO_FLAGS] & BBM_MAGNETO_IN_3_BIT)
printf(" | IN_3 - LO") ;
else printf(" | IN_2 - HI") ;
if(bbm_buf[BBM_MAGNETO_FLAGS] & BBM_MAGNETO_IN_3_BIT)
printf(" | IN_4 - LO") ;
else printf(" | IN_3 - HI") ;
break ;
10. Zamykamy switch’a.
Jeśli odebrane zostaną dane od innego modułu BBMagic to wyświetlamy jego adres bluetooth i typ.
default:
printf("BBM_UNKNOWN_") ;
for(i=0; i<BBM_BT_ADDR_SIZE; i++)
{
printf("%0.2X", bbm_buf[BBMAGIC_DEVICE_ADDR_5 + i]) ;
}
printf(" BBM_TYPE=%0.2X", bbm_buf[BBMAGIC_DEVICE_TYPE]) ;
break ;
} ;
11. Zamykamy if(data_length > 0)
Wyświetlamy znak nowej linii aby funkcja 'printf’ wysłała zawartość swojego bufora na ekran i zamykamy 'if’a’
printf("\n") ;
}
12. Zamykamy do{
Czekamy 100 mikrosekund i wykoujemy całą pętlę odczytującą i wyświetlającą dane aż do momentu naciśnięcia przez użytkownika 'ctrl+c’ (funkcja bbm_bt_read(..) zwróci -1)
usleep(100) ;
}while(data_length != -1) ;
13. Zamykamy komunikację bluetooth i kończymy program
Jeśli użytkownik nacisnął kombinację klawiszy 'ctrl+c’ zamykamy komunikację bluetooth i kończymy program.
bbm_bt_close() ;
exit(0) ;
}
I zrobione !!
Naciśnij 'ctrl+X’, a następnie 'Y’ i 'Enter’ aby zapisać plik bbmagic_magneto_sketch.c.
Po skompilowaniu i ruchomieniu na ekranie zobaczymy: