Dispozitiv ble cu senzori mems? – ușor, cu pachetul software bluemicrosystem1. Placi de baza STM32 Nucleo

Acum aproximativ un an l-am comandat pe Ali modul bluetooth HC-05. În acel moment nu știam de ce aș putea avea nevoie de el, dar tehnologii fără fir mi-a făcut semn cu misterul lor.
La momentul comenzii, a fost prezentată pe piață o întreagă linie de module bluetooth de la HC-03 la HC-09, dar unele dintre ele pot funcționa în orice mod maestru(HC-04-M), sau în modul sclav (HC-06-S), A HC-05 poate funcționa în ambele moduri, așa că alegerea a căzut pe ea.

Să aruncăm o privire rapidă asupra caracteristicilor sale:

  • Cip Bluetooth – BC417143 fabricat de firma CSR;
  • protocol de comunicare – Bluetooth Specification v2.0+EDR;
  • raza de actiune – pana la 10 metri, in apartamentul meu prinde prin 2 pereti de beton;
  • compatibil cu toate adaptoarele Bluetooth care acceptă SPP;
  • capacitatea memoriei flash (pentru stocarea firmware-ului și setărilor) – 8 Mbit;
  • frecvența semnalului radio – 2,40 .. 2,48 GHz;
  • interfață gazdă – USB 1.1/2.0 sau UART;
  • consumul de energie – curentul în timpul comunicării este de 30–40 mA. Valoarea medie a curentului este de aproximativ 25 mA. După stabilirea comunicării, consumul de curent este de 8 mA. Nu există un mod de repaus.
De obicei, modulele DIY sunt vândute ca două plăci lipite, dintre care cea mai mică este ea însăși modul bluetooth, mare - un adaptor pe care se află stabilizatorul și alte cablaje, permițându-vă să utilizați modulul pentru bricolaj.

Fixarea modulului DIY:

  • VCC – sursă de alimentare +5V
  • GND – masă
  • TXD, RXD – concluzii interfață UART pentru a comunica cu MK.
  • CHEIE – pin pentru intrarea în modul de comandă AT
  • LED – puteți conecta un LED cu o rezistență de limitare a curentului dacă se stabilește o conexiune între module, LED-ul se va aprinde;
Imediat după ce a sosit modulul, am încercat să-l lansez, dar încercarea a eșuat. Prin urmare, s-a decis să se îndepărteze termocontractia și să o lipize. După lipire, modulul a început să funcționeze, dar după ce s-a pus termocontractul a încetat din nou să funcționeze. Cred că cititorii au ghicit deja că motivul pentru aceasta a fost contracția termică de pe antenă. Problema a fost rezolvată prin îndepărtarea termocontractiei de pe antenă.

Pentru a verifica modulul aveți nevoie de:

  • hrănește-l
  • conectați ieșirea tx cu ieșire rx adaptor usb-uart
  • descărcați programul Terminal v1.9b de Bray
  • stabiliți o conexiune cu adaptorul usb-uart la viteza 9600. Această viteză este setată implicit la bluetooth modul.

Dacă programul nu vede adaptorul, atunci cel mai probabil i s-a atribuit un număr port com peste 10, îl puteți schimba în managerul de dispozitive. După aceste manipulări, putem primi și trimite date prin bluetooth de la un computer.

Acum trebuie să configurați un al doilea dispozitiv pentru schimbul de date, un astfel de dispozitiv poate fi un telefon, laptop sau tabletă. Alegerea a căzut pe o tabletă cu sistem de operare Android, apoi voi descrie cum să-l configurez pentru a face schimb de date prin bluetooth.
Pentru sarcina noastră descarcăm Cu piata de joaca aplicarea terminal bluetooth din Qwerty și instalați-l. Porniți bluetoothși căutați modulul nostru printre dispozitive.




Încercăm să ne conectăm la acesta, când vi se solicită o parolă, introduceți 1234. După ce am stabilit o conexiune cu modulul, vor apărea în terminalul de pe computer caracterele pe care le vom trimite de la terminalul de pe tabletă.

După ce vă asigurați că modulul funcționează, conectați-l la Atmega16și a scris un program care, la primirea anumitor caractere, va efectua unele acțiuni, de exemplu, aprinde un LED.
#define F_CPU 8000000UL #include #include ISR(USART_RXC_vect) ( switch(UDR) (case "f": //aici puteți aprinde întreruperea LED-ului; case "r": //și apoi opriți-l break; ) ) int main(void) ( DDRD &= ~(1<<0); //rx на вход DDRD |= (1<<1); //tx на выход //разрешаем прием, передачу, прерывание по приёму UCSRB = (1<După ce am aprins LED-ul de mai multe ori, mi-am dat seama că ar fi mult mai convenabil să nu dai clic pe tastatura din terminal, ci să creez o interfață primitivă pe tabletă pentru trimiterea comenzilor. Practic nu am experiență în programare pentru Android, dar totuși am reușit să-mi creez o interfață. Puteți vedea rezultatul în

Astăzi vom testa modulele Bluetooth deja utilizate pe scară largă HC-04. Cred că nu mă voi înșela dacă spun că s-au răspândit datorită prietenilor noștri chinezi, preț scăzut și livrare gratuită cu Dealextreme)))

În cel mai simplu caz, modulul este o punte Bluetooth-RS232: orice octeți au fost trimiși la intrare au fost transmisi prin canalul radio - de fapt, un extender de port radio, totul este foarte simplu și ușor de integrat în sistemele existente cu RS232.

În general, aceste module au destul de multe nume (cel puțin pot fi găsite la vânzare sub diferite denumiri): HC-04, HC-05, BC04, BC05, BC06, RF-BT0417C, BT0417 și o serie de altele. Cu toate acestea, nucleul rămâne comun tuturor, și anume microcontrolerului BC417143B de la Cambridge Silicon Radio (CSR). Această soluție se numește BlueCore4 și toate modulele bazate pe ea sunt chiar foarte asemănătoare ca aspect, deoarece se bazează aparent pe un design de referință. Am revizuit destul de multe fotografii ale modulelor, diferențele sunt minime: un aranjament ușor diferit de cuarț și 1-2 componente pasive, o dimensiune standard diferită a oricărui element - nu mai mult.

BC417143B în sine are un set destul de bogat de interfețe și capabilități:

În această situație, ca de obicei, funcționalitatea unui anumit modul este determinată în primul rând de firmware-ul său, prin urmare, aparent, o astfel de varietate de nume diferite a apărut pentru același set de hardware.

Dealextreme mi-a trimis o duzină dintre aceste module nemarcate:

Dimensiuni - 27x13mm, piesa de fier este alimentată la 3.3V, consumă până la 30mA în timpul instalării conexiunii și aproximativ 8mA în condiții stabile de conectare. Suporta Bluetooth 2.0. Poate funcționa în două moduri: comenzi AT (pentru configurare și control) și transmisie de date (pur și simplu transmite prostesc tot ce primește prin interfața serială), comutarea între moduri este hardware (în funcție de starea unui anumit picior al modulului. UART viteza a din gama standard 1200 – 115200, configurată folosind comenzi AT (implicit – 9600 8N1).

Scopul știfturilor este următorul:

Sau există această imagine frumoasă:

În cel mai simplu caz, tot ce trebuie să faceți este să conectați sursa de alimentare și pinii Rx-Tx - asta este, puteți comunica cu dispozitivul.

Modulul este comutat în modul de comandă AT prin tragerea pinului PIO11 la alimentare și apoi resetarea acestuia în modul de transfer de date, acest pin este împământat sau atârnă în aer.

De fapt, din cutie acest modul nu poate face aproape nimic, comenzile sunt limitate la setul minim (toate comenzile se termină cu trimiterea caracterelor 0x0D și 0x0A):

AT – răspuns OK

AT+BAUDx, unde (x = 1..8, care corespunde vitezei 1200..115200) – setarea vitezei interfeței, răspuns – OKxxx, unde xxx – setarea vitezei

AT+NAMEname – setați numele modulului numele, răspunsul – OKname

AT+PINxxxx – setați un cod PIN pentru conexiune xxxxx, răspuns – OKxxxxx

Asta e tot. Mai mult, în această formă, modulul nu poate acționa ca inițiator de conexiune sau master poate fi doar un slave. Desigur, se poate găsi o utilizare, dar cumva se dovedește plictisitor.

Opțiuni? Clipește, ce altceva... Dar mai întâi vom face mai multe plăci pentru a ușura lucrul cu modulul.

Opțiunea 1

Diagrama plăcii din imagine:

Există un stabilizator liniar pentru alimentarea modulului la 3.3V, toți pinii sunt conectați la conectori pini, au fost adăugate mai multe LED-uri de stare (la momentul fabricării plăcii, încă nu știam cum va funcționa de fapt, așa că am încercat să ținem cont de toate comenzile și indicațiile pe care le-am văzut pe diverse scheme de conectare a modulelor - de aici și abundența din diagramă).

Când este asamblat, arată astfel:

După ce (privind înainte) modulul a fost re-flash, a fost realizată o placă conform celei de-a doua opțiuni:

Esența este aceeași, au fost adăugate butoane pentru a reseta și a comuta modul modulului pentru confortul experimentelor. Nu am avut timp să fac fotografii ale modulului asamblat, l-am instalat imediat în dispozitiv, așa că iată o captură de ecran a plăcii pentru claritate:

Pe spatele plăcii sunt sursa de alimentare și circuitele externe de resetare, totul este deasupra.

Opțiunea nr. 3 a fost făcută practic după aceeași schemă:

Ideea aici este că această placă este concepută pentru a înlocui modulele MaxStream Xbee și XbeePro (acesta este ZigBee, le folosesc și eu uneori) și este compatibilă cu ele în ceea ce privește pinii:

După cum sa dovedit mai târziu, astfel de eșarfe sunt deja produse în masă...

Acum despre intermiterea modulului. Mulți cititori, sunt sigur, au observat că pe toate plăcile am păstrat interfața SPI a modulului: prin aceasta este instalat firmware-ul. Ai nevoie de un programator simplu pentru portul LPT al computerului tău, aproape 5 fire pentru AVR:

În esență, aceasta este pur și simplu o potrivire de nivel între un LPT de 5V și un modul de 3,3V.

Când este asamblat, arată astfel:

Am instalat o serie de conectori pentru o conexiune ușoară. Pentru a programa modulul, trebuie furnizată alimentare externă.

Toate manipulările sunt efectuate sub controlul Casira BlueSuite sau Casira BlueLab. Din câte am înțeles, acestea sunt evoluții direct din CSR, iar anterior îți permiteau să te înregistrezi pe site-ul lor, după care puteai descărca acest software și tot felul de exemple, firmware gata făcut, etc. soluții pentru produsele lor. Totuși, în acest moment, se pare, acest lucru a încetat să funcționeze (pentru Rusia, cel puțin, dar dacă reușește cineva, anunță-mă). Cu toate acestea, pe internet rămân multe lucruri, așa că cu ceva efort totul poate fi găsit. Abia recent am pus mâna pe BlueLab și nu l-am încercat încă, dar este un mediu întreg pentru dezvoltarea propriilor aplicații, plus documentație și exemple, așa că există multe de explorat acolo dacă doriți. Dar după instalarea BlueSuite, pe computerul tău apar o mulțime de tot felul de utilitare, concepute să funcționeze, inclusiv cu pacientul nostru. Prin urmare, conectăm modulul la programator, programatorul la computer, alimentarea modulului cu energie, fără a uita să ne asigurăm cu grijă că terenurile sunt conectate... Altfel, nu se știe niciodată;)

Blue Flash este destinat direct pentru firmware:

După pornire, selectați metoda de conectare la modul (LPT1) și indicați fișierul firmware. După cum a devenit deja clar, vom afișa intermitent ceva numit „HC-05”.

După aceea, faceți clic pe „Opriți procesorul” (nu vă faceți griji, este vorba despre modul și nu despre computerul dvs. preferat)), butoanele rămase devin active:

Aș recomanda salvarea firmware-ului existent prin „Dump” pentru orice eventualitate, deși acest lucru nu este necesar în principiu... Ei bine, apoi faceți clic pe „Descărcare” și în câteva minute obținem un dispozitiv complet diferit. Desigur, puteți, de asemenea, să faceți clic pe „Verificați” pentru a vă asigura că totul este în regulă.

Acum să lansăm PSTool.

În primul rând, trebuie să specificați metoda de conectare a modulului:

Se deschide fereastra principală:

În partea stângă există nenumărați parametri, ale căror valori pot fi modificate în orice mod posibil. Există într-adevăr o mulțime de setări, așa că este loc de experimentare, sinceră, nu m-am adâncit prea mult în el.

Ar trebui să schimbați imediat adresa dispozitivului:

După ce firmware-ul este instalat, este același pentru toate dispozitivele, așa că dacă apoi doriți să vă conectați la un anumit modul, pot apărea neînțelegeri. Așa că recomand să-l schimbați în ceva mai mult sau mai puțin semnificativ (cel puțin ora și data intermitenței) în formă hexazecimală și să îl scrieți direct pe modul (lipește o etichetă sau altceva) - va fi mai convenabil.

Acum, doar pentru distracție, puteți rula BlueTest3. Din nou, alegeți metoda de conectare:

Și ajungem la fereastra principală:

Acesta este un anumit set de teste care sunt selectate din lista din partea stângă sus a ferestrei. Modulul răspunde cu bucurie la lovituri, raportează finalizarea cu succes a testelor, toate acestea sunt scrise în jurnalul din partea de jos a ferestrei, toată lumea este mulțumită - în general, puteți, de asemenea, modifica și vedea cu un osciloscop ce se va întâmpla în timpul diverselor teste pe bornele modulului.

Pentru ce au fost toate acestea? Drept urmare, am primit un set foarte extins de comenzi AT. Acum puteți scana undele de emisie, puteți seta dispozitive de încredere, puteți schimba clasa modulului și multe altele. Una dintre cele mai utile calități dobândite este capacitatea de a configura modulul în modul master. Acestea. Acum, având două astfel de module, puteți crea un pod radio cu drepturi depline fără participarea unei terțe părți. O descriere completă a comenzilor poate fi găsită în fișa de date a modulului, disponibilă la sfârșitul articolului.

Un avertisment. Momentan am flashat 4 module și după ce am flashat viteza interfeței seriale din anumite motive a luat o valoare aleatorie: pentru unii era 9600, pentru alții - 115200. Motivele fenomenului nu îmi sunt clare, dar după reglare corespunzătoare cu comenzi AT totul revine la canalul normal Da, în modul de comandă viteza interfeței este 38400.

În general, am asamblat câteva plăci, am învățat cum să stabilim o conexiune, am trimis biții înainte și înapoi prin aer - totul părea să funcționeze, stabil, raza în aer este de până la 20 de metri, pătrunde într-un perete de beton, funcționează in interiorul apartamentului. Acum vreau să fac ceva mai mult sau mai puțin semnificativ.

De multă vreme mi-a venit ideea să fac un fel de sistem de sincronizare a timpului pentru mai multe ceasuri de acasă din camere diferite (DS1307, desigur, este destul de precis în sine, și alte cipuri RTC, dar cuarț și altele Componentele ceasului încă duc la o oarecare fugă la nivelul de 10-15s/lună: nu critic, dar cumva neglijent). Acest lucru este destul de fezabil pe astfel de module, deci de ce nu? Deci, trebuie să instalăm un modul în fiecare ceas pe care vrem să schimbăm ora, precum și un fel de transmițător de timp exact. Ca un astfel de transmițător, este destul de logic să folosim un computer cu sincronizare de timp din rețea (desigur, nu este un standard atomic, ei bine, la urma urmei, nu încercăm pentru industria de precizie în acest caz). În principiu, un fel de dongle USB ar fi destul de potrivit ca transmițător, dar nu aveam unul (și, în plus, am vrut să mă chinuiesc cu STM32, care era nou pentru mine, și să testez alte soluții), așa că asta s-a născut schema:

Concluzia este aceasta: microcontrolerul STM32F100C4T6 se uită printr-unul dintre UART-urile sale prin convertorul de interfață în USB-ul computerului, iar celălalt în modulul Bluetooth. În plus, există o grămadă de LED-uri indicatoare și mai multe butoane (nefolosite). De asemenea, este posibil să resetați forțat modulul și să îl puneți în modul comandă/date - pinii corespunzători sunt conectați la microcontroler.

Atmega8 cu implementare software USB este folosit ca convertor USB-RS232. Sincer să fiu, nu-mi amintesc de unde am descărcat această soluție, dar toate sursele sunt disponibile la sfârșitul articolului (acest circuit stă de mult timp pe șurub, încă nu am ajuns încercând cum funcționează). Desigur, soluția este redundantă, dar a fost doar interesantă. Nu este necesar să utilizați doar un astfel de adaptor; Vitezele de schimb între computer, microcontroler și modul sunt egale și se ridică la 38400 kbit/s. Ceea ce îmi place la STM-uri este flexibilitatea sistemului de ceas: am instalat cuarțul la 4,433619 MHz (am cumpărat 1000 buc ieftine ocazional, acum îl folosesc)), frecvența ceasului de bază este de 26,601714 MHz, dar orice schimb standard. tarifele pot fi obținute destul de ușor UART.

Totul este ambalat într-o cutie de plastic BOX-KC01:

Placa de circuit imprimat a fost dezvoltată direct pentru ea și, atunci când este asamblată, arată cam așa:

Nu am instalat un conector USB: nu am suficient miniUSB și sunt multe cozi cu un USB-A tată la capăt și sunt libere – doar am lipit un cablu de aproximativ un metru lungime de bord.

Butoanele, așa cum am spus deja, nu au fost utile, până la urmă totul arată așa:

După conectarea dispozitivului la computer, va fi detectat un nou dispozitiv și va trebui să instalați driverul sub forma unui fișier inf. După aceasta, în sistem va apărea un nou port COM virtual, cu care puteți lucra folosind instrumente standard. Pentru a fi mai precis, vom numi caseta noastră controler.

Deci, controlerul poate funcționa și în două moduri - modul de comandă și modul de transfer de date.

Indiferent de modul de funcționare, tot ce apare la ieșirea modulului BT (mă refer la interfața lui serială, desigur) este transmis către computer. Evident, în modul de transfer de date al controlerului, tot ceea ce este transmis de la computer la controler ajunge la intrarea modulului BT și apoi în aer. Trecerea de la modul de date la modul de comandă are loc dacă controlerul primește o secvență de trei caractere „+” la rând.

Următoarele comenzi sunt acceptate în acest mod (toate cu caractere latine):

„c0” - comută controlerul în modul de date, revine „Modul de date OK”

„c1” - resetează modulul VT, returnează „VT Reset OK”

„c2” - comută modulul BT în modul comandă, returnează „Modul comandă BT OK”

„c3” - comută modulul BT în modul de date, returnează „Modul de date BT OK”

„c4” - resetați setările modulului BT, returnează „BT Reiit Completed”

„с5ххххххххххх” - setarea unei noi adrese slave (ххххххххххх este adresa însăși), returnează „Setarea unei noi adrese de legare finalizată”

„c6” - starea conexiunii în conformitate cu starea LED-ului de stare a modulului BT, returnează „Conexiune trecută” sau „Conexiune eșuată”

„c9” - resetarea controlerului, returnează „Resetare MCU...”

Iată o captură de ecran a comunicării cu controlerul:

După pornire, controlerul, precum și modulul VT, sunt în modul de transfer de date. Controlerul solicită modulului VT setările și parametrii actuali, toate informațiile sunt transmise la terminal.

După aceasta, modulul VT stabilește o conexiune cu dispozitivul cu care a lucrat ultima dată înainte de a se opri.

LED-urile afișează fluxul de date prin interfața serială a modulului BT și conexiunea la PC (Rx și Tx), starea modulului BT (Stat, vezi fișa tehnică), starea conexiunii (Conn) și starea controlerului ( Mod control: clipește în modul de comandă și se repetă Conn în modul de date)

Folosind controlerul, puteți lucra complet transparent cu modulul VT, îl puteți controla cu comenzi AT și puteți efectua tot felul de experimente folosind orice program terminal.

Pentru a sincroniza direct ora de pe ceas, un mic program a fost „scris” pe HiAsm:

Totul este extrem de simplu: selectați portul com de care se agăță controlerul, apoi conectați-vă la dispozitivul țintă (OrbitLED (a trebuit să corectez firmware-ul să funcționeze prin UART) sau GreenClock (unul dintre proiectele mele deja destul de vechi, a fost făcut ca timpul permite de câțiva ani, sper că îl voi posta în curând pe Radiokot)) și fie dați clic pe „Sync Time” pentru sincronizare, fie pe „Set Time” pentru a seta orice altă oră și dată configurată în „Time and Data Setup” câmpuri.

Scopul butoanelor din partea de jos a ferestrei este clar din numele lor. Este puțin probabil ca unele dintre ele să fie necesare vreodată și au fost folosite exclusiv în scopuri de testare. În general, desigur, acest program trebuie refăcut, astfel încât sincronizarea să aibă loc conform unui program în modul automat. Apoi, plasându-l în încărcare automată pe serverul dvs. de acasă 24/7, puteți rezolva complet problema acelorași citiri ale ceasului în întregul apartament. Este exact ceea ce intenționez să fac în viitorul apropiat.

Toate întrebările în .

Ce parere aveti de acest articol?

Bună ziua.
Astăzi voi încerca să vorbesc despre încercarea mea de a construi un sistem de control de la distanță pentru PC într-o cameră.

Voi nota imediat pentru cei care spun bicicletă. Da, este o bicicletă. Și am fost interesat să o construiesc. Pentru cateva motive. Una dintre ele este dorința de a o face singur și de a nu o cumpăra.

fundal

Într-o zi, mi-a venit în minte ideea de a-mi controla computerul de la distanță, și anume, pe lângă comenzile simple către playerul media, primirea și feedback sub forma stării unei anumite aplicații și a sistemului în ansamblu. Cel mai apropiat analog al acestui dispozitiv este ceasul electronic la modă pentru smartphone-uri. Și din moment ce nu era nimic în apropiere care să fie similar ca funcționalitate, am decis, în scopul autoeducației și nu numai, să asamblam eu acest sistem.

O opțiune a folosit metoda de transmitere a datelor familiară telecomenzilor pentru aparatele electrocasnice moderne - IR, cunoscută și sub numele de IR. Cu toate acestea, datorită faptului că acest lucru nu este foarte convenabil și există o problemă cu distanțe lungi. De fapt, totul este mai simplu decât ați putea crede, modulul pe care l-am scos dintr-unul dintre „cadavrele” PDA-ului a fost conceput să funcționeze special ca transceiver, adică nu exista nici măcar un invertor de semnal. Deci, când l-am conectat direct la convertorul USB<->UART pe consola de depanare am văzut un flux continuu de caractere aleatorii.

Prin urmare, am decis să folosesc transceiver-ul BT care îmi devenise familiar. De asemenea, în coșuri se află și modulul ESD-200 rămas de la unul dintre teste (nu-l lua, este chiar incomod și puțin plictisitor și, de asemenea, un modul scump, plus pachetele încep să dispară pe distanțe lungi). Ca să nu mă plictisesc, am luat un ecran de la Siemens M55. Există, de asemenea, un bloc de șase butoane cărora le puteți atribui comenzi arbitrare. Am ales ca creier placa de depanare STM32F4DISCOVERY - există un depanator la bord și nu este nevoie să lipiți nimic.

Schema generala

Atenție: ceea ce este descris aici este în principal în teorie. În practică, unele puncte sunt simplificate pentru că aceasta este o machetă și pur și simplu pentru că a fost mai rapid să o faci în acest fel.
Pe partea de PC, pe care, apropo, Linux (pentru mine este Gentoo Linux, pentru tine ar putea fi orice altă distribuție) rulează un program - un server. Interogează lista de dispozitive disponibile și, după ce l-a găsit pe cel necesar, stabilește o conexiune cu aceasta.
Există un declanșator pe partea dispozitivului care controlează starea conexiunii. Când este detectată o conexiune, apelează modulul de interogare primar (un fel de ping). Ceea ce, la finalizarea cu succes, pune dispozitivul în modul interactiv.
Acest mod se caracterizează prin faptul că transferul este inițiat de oricare dintre cele două componente ale sistemului. Acest principiu de funcționare a sistemului a fost ales din două motive - timp scurt de reacție la orice acțiune, absența temporizatoarelor suplimentare (cu excepția cronometrului TIMEOUT de pe partea demonului de pe PC) și, desigur, un protocol de schimb relativ simplu. . Deși, în teorie, aveți nevoie de TIMEOUT pe partea dispozitivului deoarece Uneori apar probleme la lucrul cu modulul BT.

Implementarea

Acum să vedem ce am obținut conform diagramei de mai sus:
  • Un demon care rulează pe partea PC-ului. Deși ce fel de demon există, în implementarea actuală este un script de câteva sute de linii cu o gestionare minimă a erorilor. Una dintre cele mai interesante componente. Scris în întregime în Python. Una dintre caracteristicile acestui modul este că folosește sistemul de mesaje DBUS pentru a controla programele utilizatorului. Apropo, implementarea acestui protocol pentru limbajul Python este disponibilă în orice distribuție modernă. În continuare, voi descrie în detaliu cum funcționează acest cod.
  • Un protocol pentru schimbul de mesaje multi-threaded complet asincron, implementat deasupra unui port serial cu emularea conexiunilor multiple folosind un sistem de adresare a mesajelor. A fost inventat după ce am citit descrierea protocoalelor de rețea și a standardelor USB și l-am scris și pentru că. Mi-a fost lene să fumez MODBUS, sau mai degrabă trist să mă uit la implementarea lui.
  • Un dispozitiv cu firmware care, folosind modulul Bluetooth, transmite comenzi printr-un port serial atunci când utilizatorul apasă butoanele dispozitivului. Feedback-ul sub formă de informații afișate pe afișajul dispozitivului este, de asemenea, posibil. Dar, din păcate, acest lucru este făcut doar ca exemplu. Trimite comenzi fixe și nimic altceva.

Daemon

După ce căutăm dispozitivul, ne conectăm la el și așteptăm să sosească comenzile. Unele dintre solicitări vor primi răspuns, în timp ce altele vor fi pur și simplu îndeplinite.

Prototipul este conceput destul de simplu:
#!/usr/bin/python2 # -*- coding: utf-8 -*- import serial import dbus import subprocess import time import os # Aici am eliminat inițializarea inutilă a modulului BT, cei interesați îl pot lua de la codul meu complet al acestui modul, mai jos voi descrie de unde să obțineți codurile sursă. Am eliminat și acest cod pentru că a fost făcut strâmb și nu ar trebui făcut în acest fel într-un modul de lucru. # Conexiune normală la un port serial ser = serial.Serial("/dev/rfcomm0", 115200, timeout=1) # Conexiune la o sesiune de magistrală DBUS, de unde ne vom conecta la playerul media Amarok. bus = dbus.SessionBus() am = bus.get_object("org.kde.amarok", "/Player") # Un dicționar ale cărui chei sunt comenzile pe care le primim de la portul serial și, în cele din urmă, apelăm metodele corespunzătoare ale obiect jucător. comenzi = ("p": , ">": , "<": , "m": , "+": ], "-": ] } print "Connected" # бесконечный цикл в котором мы и будем работать. try: while 1: try: # принимаем первый байт нашего сообщения, при этом ждём его не более секунды, если ничего не пришло за этот промежуток значит нам ничего и не присылали. line = ser.read(1) # в этой части мы ловим специфичное исключение по которому судим что последовательный порт у нас отвалился except serial.serialutil.SerialException: # а так как нам надо работать, то мы закрываем этот порт, и ждём пол секунды пока завершится это действие. ser.close() time.sleep(0.5) while 1: try: # позже пытаемся установить соединение вновь ser = serial.Serial("/dev/rfcomm0", 115200, timeout=1) break # если же опять всё плохо, т.е. нам так и не удалось подключится к последовательному порту, то мы ожидаем 2 секунды и повторяем снова наш круг. except serial.serialutil.SerialException: time.sleep(2) # если мы действительно считали байт (а это может быть и не так, потому, что у нас стоит время ожидания этого байта) то, if len(line) == 1: # проверяем что это за байт, пока реализован только приём команд if line == "C": print "Command" # дочитываем оставшиеся 2 байта заголовка - адрес и размер сообщения line += ser.read(2) # не забываем проверить что мы считали именно 2 байта - т.е. размер заголовка должен быть равен 3 байтам. if len(line) == 3: print "0x%02x 0x%02x 0x%02x" % (ord(line), ord(line), ord(line)) # это захадкоженный ответ на ping, в реальном модуле он должен быть стандартным для любого адреса, т.к. этот ответ определяет готовность "ящика" к работе с ним. if ord(line) == 0x00 and ord(line) == 0x00: print "Device ping" ser.write("A") ser.write(chr(0x00)) ser.write(chr(0x02)) ser.write(chr(ord("O"))) ser.write(chr(ord("K"))) print "Ansver to device" # если мы обратились ко второму узлу, то это сообщения общего уровня. if ord(line) == 0x02: # получаем длину и считываем сообщение. mlen = ord(line) message = ser.read(mlen) # если сообщение есть в словаре команд то выполняем команду которая соответствует полученному сообщению if message in commands: current = commands current(*current) # при получении исключения - прерывание от клавиатуры выходим. except KeyboardInterrupt: ser.close() del am print "Exiting" # не забывая закрыть соединение с BT модулем. # cleaning cmd = "sudo rfcomm unbind all" runner(cmd)

Protocol

Protocolul este destul de simplu, constând dintr-un antet de trei octeți și un mesaj cu o lungime maximă de 255 de octeți, sau poate să nu aibă un mesaj - doar un antet. Antetul indică tipul mesajului, adresa destinatarului și dimensiunea mesajului. O descriere mai detaliată a protocolului este prezentată în acest document. Desigur, nu tot ceea ce este descris este implementat în practică, dar cel puțin funcționează. Deși există încă probleme cu primirea mesajelor și alte erori în timpul schimbului.

Dispozitiv

Iată tipul real de dispozitiv pe care l-am primit, precum și modulul din partea PC, acest dispozitiv a fost realizat ca prototip, ținând cont de experiența amară a defecțiunilor la construirea primei versiuni a sistemului:

Dispozitivul este controlat de firmware-ul scris în C;
/* funcția principală de lucru */ void work(void) ( unsigned short i, j; unsigned char mailbox_num = 0; volatil ProtoIOMBox * mbox; /* S-a eliminat din exemplu inițializarea perifericelor și a protocolului, precum și afișajul de imagini - logo-ul * // Verificarea stării portului înainte de lansare /* check status */ check_status( // Aici sunt pregătite „casetele” de mesaje, precum și setarea pregătirii flags, iar apoi un mesaj este afișat pe ecran dacă răspunsul de la server trece la modul de trimitere a comenzilor /* send ping */ mbox->outbox->header = "C"; ->outbox->size = 0x00; mbox->outbox_s = PROTO_IO_MBOX_READY; */ /* așteptați conexiunea stabilită * / while (status == 0 /* trimite mesaj ping */ proto_send_msg(mailbox_num) /* wait to send message */ while (mbox->outbox_s);<= PROTO_IO_MBOX_SEND); if (mbox->outbox_s == PROTO_IO_MBOX_COMPLETE) LCD_String("Con", 36, 6, 1, WHITE, GLASSY); else LCD_String("Un", 36, 6, 1, RED, GLASSY); /* primesc mesajul ping */ /* FIXME wtf? aceasta nu funcționează sau nu funcționează paritatea */ //proto_get_msg(mailbox_num); /* așteptați să primiți mesajul */ în timp ce (mbox->inbox_s<= PROTO_IO_MBOX_SEND); if (mbox->inbox_s == PROTO_IO_MBOX_COMPLETE) ( LCD_String ("OK", 36 + 3 * 7, 6, 1, VERDE, GLASSY); pentru (i = 0; i< mbox->inbox->dimensiune; i++) LCD_Char(mbox->inbox->message[i], 70 + i * 6, 6, 1, WHITE, GLASSY); ) else LCD_String("ERR", 36 + 3 * 7, 6, 1, RED, GLASSY); // O buclă nesfârșită în care interogăm butoanele și trimitem comenzi dacă unul dintre ele este apăsat. Sunt permise apăsări multiple de butoane, în acest caz vor fi trimise toate acele comenzi care corespund butoanelor apăsate. /* buclă infinită */ while (1) ( if (button_state.state == B_CLICK) ( sender("+"); button_state.state = B_RELEASE; ) /* codul este similar pentru celelalte butoane */ ) )

Aș dori să menționez separat și modulul pentru trimiterea și primirea mesajelor - în proiect acesta este modulul proto.o - codul sursă este proto.c și fișierul antet proto.h. Nu voi da codul pentru că este mare. Dar, în general, vă voi spune cum funcționează.
Modulul este proiectat în întregime pentru a funcționa pe întreruperi, dar transferul de date nu este implementat corect momentan și, prin urmare, necesită un apel de inițializare preliminară. Recepția și trimiterea mesajelor se realizează folosind 2 mașini cu stări finite, care își schimbă starea pe măsură ce sunt trimiși octeții. S-a implementat verificarea validității mesajelor și tratarea erorilor.

Atașez și un videoclip al sistemului în ansamblu care funcționează:

Bluetooth- Acesta este poate cel mai comun tip de comunicare pentru distanțe scurte, care este folosit de majoritatea dispozitivelor electronice moderne. Căști de telefon, căști, tastaturi și șoareci, imprimante și Dumnezeu știe ce alte gadget-uri. Cu ceva timp în urmă, bluetooth a fost popularizat ca mijloc de transfer de fișiere între telefoane.

Principalele avantaje ale BT includ rezistența bună la interferența în bandă largă și ușurința de implementare. Primul înseamnă că o grămadă de dispozitive situate într-un singur loc pot comunica simultan între ele fără a interfera între ele. Al doilea a ajutat la adoptarea pe scară largă a Bluetooth în mediul DIY și, în general, în toate mediile.

Personal, folosesc BT pentru a controla roboții de pe smartphone. Google Play are deja mai multe aplicații cu o interfață ușor de utilizat, special pentru aceste scopuri. Participanții la hackspace MakeItLab folosesc Bluetooth pentru a controla de la distanță lumina și pentru a colecta telemetria de la quadcoptere.

Cele mai accesibile module Bluetooth astăzi pot fi numite HC-05 și HC-06. Sunt prezente din abundență în magazinele online chinezești și pe ebay. Diferențele dintre ele sunt că primul poate funcționa atât în ​​modul slave, cât și în modul master. Al doilea este un dispozitiv pur slave (dar acest lucru poate fi reparat!). Cu alte cuvinte, HC-06 nu poate detecta el însuși un dispozitiv asociat și poate stabili comunicarea cu acesta;

Ambele dispozitive se bazează pe cipul CSR BC417, care acceptă Bluetooth versiunea 2.0 la viteze de până la 3 Mbit/s. Aceste module vor fi discutate în continuare.

1. Opțiuni de execuție

De obicei, modulele sunt vândute ca două plăci lipite împreună. Cel mai mic este un modul din fabrică, utilizat pe scară largă în diverse dispozitive electronice. Mare - o eșarfă cu design special pentru bricolaj. Iată cum arată placa mai mică cu cip BC417:

Și iată modulele DIY HC-05 și HC-06:

În scopurile mele viclene, de obicei iau HC-05, deoarece prețul nu diferă mult de HC-06 și vă permit să conectați două dispozitive împreună fără nicio bătaie de cap. De exemplu, puteți face un robot și o telecomandă pentru el. De obicei primesc module din China, exact ca cele din poza din stânga, dar uneori fără buton.

O altă versiune a eșarfei-machetă este, de asemenea, foarte comună. Spre deosebire de cele prezentate mai sus, acestea nu au picior EN, dar au un picior KEY, care este puțin mai confortabil.

Pinout

Deci, de ce sunt responsabile picioarele în toate opțiunile de modul?

  • RO - pornirea/oprirea modulului;
  • VCC - alimentare +5V;
  • GND - pământ;
  • TXD, RXD - interfață UART pentru comunicarea cu controlerul;
  • STARE - indicator de stare;
  • CHEIE - piciorul pentru intrarea în modul de comandă AT.

Modulul este configurat în modul de comandă AT, care este activat folosind piciorul KEY. Prin urmare, mulți proprietari fericiți ai modulului pot avea o întrebare: ce ar trebui să fac dacă dau peste un modul fără CHEIE?

De fapt, desigur că există acest picior pe placa mică, pur și simplu nu este direcționat pe placa mare. Dumnezeu știe de ce chinezii au făcut asta, dar problema se rezolvă ușor. Piciorul KEY crește de aici:

2. Conexiune la Arduino Uno

Nu sunt multe picioare, așa că nu te vei încurca. Ne conectăm la bluetooth la Arduino Uno conform următoarei scheme:

Bluetooth GND VCC TXD RXD CHEIE
Arduino Uno GND +5V 10 11

Conectăm TX și RX la picioarele GPIO 10 și 11, deoarece hardware-ul UART de pe segmentele 0 și 1 va fi ocupat să comunice cu computerul.

În modul de funcționare, KEY nu este conectat nicăieri, așa că în tabel nu l-am conectat la GPIO cu picioare Arduino.

3. Nivelurile de tensiune de împerechere

Mica placă de modul Bluetooth are o tensiune logică de 3,3 Volți. Aceasta înseamnă că Arduino Uno își poate arde porturile sau pur și simplu poate transmite semnale incorect. Din fericire, în cele mai multe cazuri, o placă mare are totul la bord pentru a evita acest lucru. Modulele de mai sus pot fi conectate cu ușurință la Arduino, fără bătăi de cap inutile. Chiar și în ciuda faptului că producătorii înșiși au scris un avertisment pe eșarfă despre nivelul semnalului de 3,3 volți.

Cu toate acestea, în unele situații poate fi necesară instalarea unui divizor de tensiune pe linia Arduino TX - BT RX pentru a scădea nivelurile logice. De fapt, chiar dacă totul funcționează fără un separator, este mai bine să puneți unul, de dragul ordinii. Circuitul divizor este mai jos:

4. Pregătirea Arduino

Pentru a începe configurarea, trebuie să încărcăm o schiță auxiliară în Arduino. În esență, este un program repetitor care va face schimb de date între terminalul de pe computer și modulul Bluetooth. Programul este extrem de simplu:

#include #include int gLedPin = 13; int gRxPin = 10; int gTxPin = 11; SoftwareSerial BTSerial (gRxPin, gTxPin); void setup() ( # 38400 - pentru metoda nr. 1, 9600 - pentru metoda nr. 2 BTSerial.begin(38400); Serial.begin(9600); delay(500); ) void loop() ( dacă (BTSerial. disponibil( )) ( Serial.write(BTSerial.read()); ) dacă (Serial.available()) ( BTSerial.write(Serial.read()); ) )

Încărcați schița în Arduino și treceți la pasul următor.

5. Pregătirea terminalului

Puteți utiliza monitorul de porturi încorporat în Arduino IDE ca terminal sau puteți utiliza oricare altul. Am folosit un terminal terță parte, TeraTerm. Înainte de a vă conecta, trebuie să efectuați două setări importante:

  • viteza de transmisie: 9600;
  • caracter de avans de linie: CR+LF.

Iată cum arată setările în TeraTerm:

Când totul este configurat corect, conectați-vă la portul COM și verificați conexiunea. Este rațional să împărțiți toate manipulările ulterioare în două părți: pentru modulul slave HC-06 și pentru masterul HC-05.

6. Configurarea HC-06

Verificarea conexiunii

După ce modulul este alimentat, LED-ul va începe să clipească puternic:

Acum mergeți la terminal și scrieți comanda: LA

Ca răspuns, modulul ar trebui să ne spună: Bine

Următoarea noastră comandă va cere modulului versiunea sa: AT+VERSIUNE?

Primim ceva de genul asta: OKLinvor1.5

S-a întâmplat? Dacă nu, atunci verificați:

  1. Viteza de conectare cu modulul, care este setată în programul translator: pentru comunicarea cu un slave, viteza trebuie să fie 9600.
  2. Setări de caractere pentru fluxul de linie: nu uitați de CR+LF!
  3. Apăsăm Enter după fiecare comandă? Nu stii niciodata...

Comenzi utile

Modulul slave Bluetooth are doar trei parametri de configurat:

  • comandă pentru a schimba parola de pe dispozitiv: AT+PIN<пароль>
  • schimbarea vitezei: AT+BAUD<скорость>
  • schimba numele dispozitivului: AT+NAME<имя>

De exemplu, pentru a schimba parola scriem: AT+PIN4321

În general, este gata! Acum vă puteți conecta la modul, de exemplu, de pe un smartphone. Acest lucru va fi discutat în a doua parte a poveștii mele.

7. Configurarea HC-05

Trecerea la modul de comandă AT

Pentru a accesa setările modulului principal, acesta trebuie să fie comutat în modul de comandă AT. Există două metode pe care le puteți folosi pentru a intra în acest mod (eu îl folosesc întotdeauna pe primul).

Prima metoda:

  1. Deconectați modulul de la sursa de alimentare.
  2. Aplicam un semnal KEY de +3,3V pe picior.
  3. Pornim modulul.

În această opțiune, cursul de schimb cu modulul este setat la 38400.

A doua metodă

  1. Pornim modulul.
  2. Aplicam un semnal KEY +3.3V pe picior;

În acest caz, cursul de schimb cu modulul va fi egal cu cel standard stabilit de setări. Implicit este 9600.

După intrarea cu succes în modul de comandă AT, LED-ul de pe modul va clipi o dată la două secunde.

Verificarea conexiunii HC

Să verificăm modul de comandă al HC-05 în același mod ca și în cazul unui modul slave:

>>: LA
<<: Bine
>>: AT+VERSIUNE?
<<: +VERSIUNEA:2.0-20100601

Configurarea HC-05 ca sclav

Pentru a transforma modulul într-un slave, va trebui să rulați mai multe comenzi:

Resetați setările anterioare: AT+ORGL

Resetarea dispozitivelor asociate: AT+RMAAD

Setarea unei parole: AT+PSWD=1234

Activarea modului slave: AT+ROLE=0

În plus, puteți afla adresa dispozitivului (necesară pentru a configura modulul asociat): AT+ADDR?

Ca răspuns, primim adresa în sine: ADDR=12:6:143117

După configurare, deconectați piciorul KEY de la +3,3 V și reporniți modulul. Gata!

Configurarea HC-05 ca master

Modulul vine din fabrică ca slave, iar pentru a-l face master va trebui să rulați următoarele comenzi.

Resetați setările anterioare: AT+ORGL

Resetarea dispozitivelor asociate: AT+RMAAD

Activarea modului principal: AT+ROLE=1

Reporniți după schimbarea rolului: AT+RESET

Dacă vrem să conectăm slave și master, scriem următoarele comenzi:

Setarea parolei slave: AT+PSWD=1234

Specificați dispozitivul asociat: AT+PERECHE=<адрес>,<таймаут> (exemplu: AT+PERECHE=12,6,143117,5)

Ne asociem cu o anumită adresă: AT+BIND=<адрес> (exemplu: AT+BIND=12,6,143117)

Interzicem conectarea la alte adrese: AT+CMODE=0

Gata! Acum modulul este conectat la slave și de fiecare dată când este pornit va încerca să se conecteze la el.