Uporabnike opozorite na smer, v katero boste ubrali, samo tako, da rečete »levo« ali »desno«.
Hackster Inc.
Avtor: Alvaro Gonzalez-Vila
204-304-42
Dobra praksa, ki jo morate upoštevati, ko ste v prometu, je, da druge uporabnike na cesti opozorite na smer, katero boste ubrali, preden zavijete ali spremenite pas. Ta navada prispeva k bolj nemotenemu prometu in zmanjšuje nenadne premike neozaveščenih voznikov. Pravzaprav avtomobili, motorna kolesa, tovornjaki, avtobusi in večina vozil, ki si jih lahko zamislite, vključujejo nekakšne naprave za smernike.
Komponente, ki jih potrebujemo za izdelavo:
Arduino Nano 33 BLE Sense
WS2813 RGB LED trak vodoodporen
Kateri koli RGB LED trak, ki se ga da naslavljati bo dober. Potrebna dolžina: 20 cm.
Povezovalne žice, 22 AWG
Plastično ravnilo, 30 cm
Katero koli ravnilo ali plošča ustreznih dimenzij
Audio / Video kabel s konektorjem 3,5mm 4 polna vtičnica, 3,5mm Stereo Phone Jack vtikač × 2
Nosilec ure za na kolo
Li Ion paket baterij – 2.5Ah (USB)
USB micro-B kabel – 1,5m
Kabelske vezice
Softverske aplikacije in spletne storitve:
Edge Impulse Studio
TensorFlow
Arduino IDE
Ročna orodja in stroji:
Spajkalnik
Spajkalni Flux,
Škarje
Držalo za TIV
Ta projekt je bil med petimi svetovnimi izbranci in je bil predstavljen na spletnem mestu Eksperimenti z Googlom [1].
Ta vsebina je samo za naročnike
Na trgu je mogoče najti nekaj dodatnih smernikov za kolesa, vendar običajno zahtevajo, da voznik pritisne gumb, da jih aktivira, in ponovno pritisne, da jih izklopi, podobno kot pri motorjih. In res jih je enostavno pozabiti izklopiti. Če dvakrat premislite, je to nekaj, kar je vredno izboljšati.
Od tu se rodi VoiceTurn, koncept osvetlitve smernikov, ki je bil sprva zasnovan za kolesa, ki bi ga lahko razširili tudi na druga vozila. Cilj tega projekta je uporabiti algoritem strojnega učenja, da bi majhen mikrokontroler naučil razumeti besedi »levo in »desno« in da bi ustrezno ukrepal tako, da prižge ustrezen smernik.
Plošča
Mikrokontrolerska plošča, ki bo uporabljena, je Arduino Nano 33 BLE Sense: cenovno ugodna plošča, ki vsebuje 32-bitni ARM® Cortex™-M4 CPU, ki deluje pri 64 MHz, kup vgrajenih senzorjev, vključno z digitalnim mikrofonom, in Bluetooth Low Energy (BLE) povezljivostjo.
Kar pa naredi to ploščo kot odličnega kandidata za ta projekt je možnost, da na njej izvajamo Edge Computing aplikacije z uporabo Tiny Machine Learning (TinyML). Skratka, potem ko ustvarite modele strojnega učenja s TensorFlow Lite, jih lahko preprosto naložite na ploščo z uporabo integriranega razvojnega okolja Arduino (IDE).
Za prepoznavanje govora na Edgeu ni treba poslati glasu v strežnik v oblaku za obdelavo, s čimer se zmanjša zakasnitev omrežja. Poleg tega deluje brez povezave, tako da ste lahko prepričani, da vaši smerniki ne bodo prenehali delovati, ko greste skozi predor. Nenazadnje ohranja zasebnost uporabnikov, saj vaš glas ni nikjer shranjen ali nikamor poslan.
Izučite model strojnega učenja
Model za prepoznavanje besed je bil ustvarjen z uporabo Edge Impulse [2] razvojne platforme za ugnezdeno strojno učenje, ki je osredotočena na zagotavljanje neverjetne uporabniške izkušnje (UX), odlične dokumentacije in odprtokodnih kompletov za razvoj programske opreme (SDK). Na njihovi spletni strani piše:
Edge Impulse je bil zasnovan za razvijalce programske opreme, inženirje in strokovnjake za področje za reševanje resničnih težav z uporabo strojnega učenja na robnih napravah brez doktorata iz strojnega učenja.
To pomeni, da lahko imate malo ali nič znanja o strojnem učenju in še vedno uspešno razvijate svoje aplikacije.
To vadnico [3] lahko uporabite kot izhodišče za klasifikacijo zvoka z Edge Impulse. Naslednji koraki bodo opisali, kako je bil ta projekt prilagojen posebnim potrebam VoiceTurn.
Prva stvar, ki jo morate storiti, je, da se prijavite na Edge Impulse, da ustvarite brezplačno naročnino za razvijalce. Po koraku potrditve računa se prijavite in ustvarite projekt. Pozval vas bo čarovnik, ki bo vprašal o vrsti projekta, ki ga želite ustvariti. Kliknite na Zvok.
V naslednjem koraku lahko izbirate med tremi možnostmi. Prva je, da sami sestavite nabor zvočnih podatkov po meri tako, da povežete razvojno ploščo, ki podpira mikrofon. Ta postopek zahteva snemanje velike količine zvočnih podatkov, da bi dosegli sprejemljive rezultate, zato ga bomo za zdaj prezrli. Druga možnost je nalaganje obstoječega nabora zvočnih podatkov, tretja pa sledenje vadnici. Kliknite Pojdi na nalagalnik v okviru možnosti Uvozi obstoječe podatke, da nadaljujete z VoiceTurn.
Zvočni nabor podatkov, ki ga bomo uporabili, je nabor podatkov Googlovih govornih ukazov [4], ki ga sestavlja 65.000 enosekundno dolgih izrekov s 30 kratkimi besedami, na tisoče različnih ljudi. S te povezave [5] lahko prenesete različico 2 tega nabora podatkov.
Lahko si predstavljamo, da bi bile za usposabljanje modela potrebne samo podmnožice zvočnih posnetkov, ki ustrezajo besedama levo in desno. Kot pa Pete Warden iz Google Brain navaja v članku [6], ki opisuje metode, uporabljene za zbiranje in vrednotenje nabora podatkov:
Ključna zahteva za opazovanje ključnih besed v resničnih izdelkih je razlikovanje med zvokom, ki vsebuje govor, in posnetki, ki ga ne vsebujejo.
Zato bomo uporabili tudi podmnožico zvočnih posnetkov, ki jih vsebuje mapa _background_noise_, da bi naš model obogatili z nekaj šuma v ozadju. Poleg tega bomo bazo šuma dopolnili z zvoki iz mape šuma iz vnaprej izdelanega nabora podatkov [7] za opazovanje ključnih besed, ki je na voljo kot del dokumentacije Edge Impulse.
Imeti nabor podatkov, ki vsebuje besede levo in desno ter nekaj šuma v ozadju, ni dovolj, saj moramo modelu zagotoviti tudi dodatne besede. Na ta način, če se sliši druga beseda, ne bo razvrščena kot levo ali desno, ampak bo šla v drugo kategorijo. Za to lahko izberemo naključno zbirko zvočnih posnetkov iz prvega nabora podatkov, ki smo ga prenesli. Upoštevajte le, da mora biti skupna količina dodatnih zvočnih posnetkov podobna skupni količini posnetkov vsake besede, ki vas zanima.
Ko so zvočni posnetki zbrani, jih naložite v svoj projekt Edge Impulse. Upoštevajte, da boste morali naložiti 4 različne nabore podatkov, od katerih vsak ustreza drugi kategoriji. Brskajte po datotekah, ročno vnesite oznake, kot so levo, desno, šum in druge, in se prepričajte, da je izbrano »Automatically split between training and testing«. To bo pustilo ob strani približno 20 % vzorcev, ki bodo uporabljeni za kasnejše testiranje modela. Kliknite Begin upload.
Kot lahko opazite, so vsi zvočni vzorci, ki ste jih naložili, na voljo za preverjanje in poslušanje. Poskrbite, da bodo vsi trajali eno sekundo. Če so daljši, kliknite na pike na desni strani vrstice z zvočnim vzorcem in kliknite na Split sample, pri čemer nastavite dolžino segmenta 1000 ms.
Posledično bi morali zdaj videti skupno trajanje vaših podatkov o usposabljanju in testiranju, kot tudi vaše podatke, razdeljene v štiri kategorije.
Prav tako lahko dvakrat preverite, ali je trajanje vaših testnih podatkov približno 20 % celotnega trajanja nabora podatkov.
Naslednji korak je oblikovanje impulza, ki je celoten niz operacij, ki se izvajajo na vhodnih glasovnih podatkih, dokler besede niso razvrščene. Kliknite Create Impulse v levem meniju. Naš impulz bo sestavljen iz vhodnega bloka za rezanje podatkov, bloka za obdelavo za njihovo predhodno obdelavo in učnega bloka, ki jih razvrsti v eno od štirih predhodno definiranih oznak.
Kliknite Add an input block in dodajte Time series data block, pri čemer nastavite velikost okna na 1000 ms. Nato kliknite Add a processing block in dodajte blok Audio Mel Frequency Cepstral Coefficients (MFCC), ki je primeren za podatke človeškega govora. Ta blok ustvari poenostavljeno obliko vhodnih podatkov, ki jih je lažje obdelati z naslednjim blokom. Na koncu kliknite Add a learning block in dodajte Classification (Keras) blok, ki je nevronska mreža (NN), ki izvaja klasifikacijo in zagotavlja izhod.
Možno je konfigurirati bloke za obdelavo in učenje. Kliknite na MFCC v levem meniju in videli boste vse parametre, povezane s stopnjo obdelave signala. V tem projektu bomo stvari poenostavili in zaupali privzetim parametrom tega bloka. Kliknite Generate features na vrhu in nato kliknite tipko Generate features, da ustvarite MFCC bloke, ki ustrezajo zvočnim oknom.
Ko je opravilo končano, boste pozvani k raziskovalcu funkcij, ki je 3D predstavitev vašega nabora podatkov. To orodje je uporabno za hitro preverjanje, ali so vaši vzorci lepo ločeni v kategorije, ki ste jih določili prej, tako da je vaš nabor podatkov primeren za strojno učenje. Na tej strani si lahko ogledate tudi oceno časa, ki ga bo faza obdelave signala podatkov (DSP) potrebovala za obdelavo vaših podatkov, kot tudi porabo RAM-a pri izvajanju v mikrokontrolerju.
Zdaj lahko kliknete na NN Classifier v levem meniju in začnete trenirati svojo nevronsko mrežo, nabor algoritmov, ki lahko prepoznajo vzorce v svojih učnih podatkih. Oglejte si ta videoposnetek [8] za hiter pregled o principu delovanja nevronskih mrež in nekaterih njihovih aplikacijah. Večino privzetih nastavitev nevronskega omrežja bomo pustili nespremenjeno, vendar bomo minimalno oceno zaupanja nekoliko povečali na 0,7.
To pomeni, da bodo med treningom veljavne samo napovedi z verjetnostjo zaupanja nad 70 %. Omogočite povečanje podatkov in nastavite Add noise na High, da bo naše nevronsko omrežje bolj robustno v resničnih življenjskih scenarijih. Kliknite Start training na dnu strani. Ko je usposabljanje končano, boste videli natančnost modela, izračunano z uporabo podmnožice 20 % podatkov o usposabljanju, dodeljenih za preverjanje. Prav tako lahko preverite Confusion matrix, ki je tabela, ki prikazuje razmerje med pravilno in napačno razvrščenimi besedami in oceno učinkovitosti v napravi.
Zdaj lahko preizkusite model, ki ste ga pravkar izučili z novimi podatki. Arduino ploščo je mogoče povezati z Edge Impulse [9] za izvedbo razvrščanja podatkov v živo. Vendar bomo model preizkusili s testnimi podatki, ki smo jih pustili ob strani med korakom pridobivanja podatkov. Kliknite Model testing v levem meniju in nato Classify all test data. Prejeli boste povratne informacije o delovanju vašega modela. Poleg tega vam bo Raziskovalec funkcij omogočil, da preverite, kaj se je zgodilo z vzorci, ki niso bili pravilno razvrščeni, tako da jih lahko po potrebi ponovno označite ali jih premaknete nazaj na usposabljanje, da izboljšate svoj model.
Končno lahko zgradite knjižnico, ki vsebuje vaš model in je pripravljena za uporabo v mikrokontrolerju. Kliknite Deployment v levem meniju, izberite ustvarjanje knjižnice Arduino in pojdite na dno strani. Tukaj je mogoče omogočiti prevajalniku EON™, da poveča zmogljivost v napravi za ceno zmanjšanja natančnosti. Ker pa poraba pomnilnika ni previsoka za Arduino Nano 33 BLE Sense, lahko to možnost onemogočimo, da bo delovala z najvišjo možno natančnostjo. Na koncu pustite izbrano možnost Quantized (int8) in kliknite gumb Build, da prenesete .zip datoteko, ki vsebuje vašo knjižnico.
Projekt VoiceTurn Edge Impulse [10] je javno dostopen, tako da ga lahko neposredno klonirate in delate na njem, če želite.
Preverite, kako so besede razvrščene
Arduino IDE lahko uporabite za namestitev knjižnice, zgrajene z Edge Impulse, na vašo ploščo. Če ga še niste namestili, prenesite najnovejšo različico s strani Arduino programske opreme [11]. Po tem boste morali dodati paket gonilnikov, ki podpira ploščo Arduino Nano 33 BLE Sense. Odprite Arduino IDE in kliknite Orodja > Plošča > Upravitelj plošč…
V iskalno polje vpišite nano 33 ble sense in namestite Arduino Mbed OS Nano Boards.
Zdaj je vaš IDE pripravljen za delo z vašo ploščo. Povežite Arduino Nano 33 BLE Sense z računalnikom in uporabite naslednje nastavitve:
- Kliknite Tools > Board > Arduino Mbed OS Nano Boards in izberite Arduino Nano 33 BLE kot svojo ploščo.
- Kliknite Tools > Port in izberite serijska vrata, na katera je povezana vaša plošča. To se bo razlikovalo glede na vaš OS in vaša določena vrata.
Če želite knjižnico VoiceTurn dodati v vaš Arduino IDE, kliknite Sketch > Include Library > Add.ZIP Library… in pojdite na pot, kjer ste shranili svojo .zip datoteko knjižnice. Po tem kliknite File > Examples > VoiceTurn_inferencing > nano_ble33_sense_microphone_continuous, da odprete program za glasovno sklepanje, ki ga ponuja Edge Impulse. Ta program lahko že prevedete in naložite na svojo ploščo s klikom na dve ikoni, ki se nahajata v zgornjem levem kotu Arduino IDE. Ko je naložen, kliknite ikono Serial Monitor v zgornjem desnem kotu in videli boste rezultat predhodno razvitega klasifikatorja strojnega učenja. Točnost programa lahko preizkusite tako, da izgovorite besede »levo« ali »desno« in preverite verjetnost, da ste znotraj ene ali druge skupine, ki jo izračuna program. Prav tako lahko poskusite izgovoriti druge besede in preverite, ali so pravilno razvrščene v drugo skupino.
Če želite izvedeti več o neprekinjenem vzorčenju zvoka, si oglejte to vadnico [12] v dokumentaciji Edge Impulse.
TensorFlow Lite za mikrokontrolerje
Na tej točki se morda sprašujete: ali niste omenili, da boste uporabljali TensorFlow? No, kot je omenjeno v tem zanimivem članku [13] iz bloga TensorFlow, TensorFlow sam po sebi uporablja
Edge Impulse
Edge Impulse uporablja ekosistem TensorFlow za usposabljanje, optimizacijo in uvajanje modelov globokega učenja v ugnezdene naprave.
Če se ozremo nazaj na prejšnje korake tega projekta, smo usposobili model za klasifikacijo besed, nato izvedli kvantizirano (int8) optimizacijo in končno zgradili Arduino knjižnico za namestitev na našo ploščo. V članku je navedeno tudi:
Razvijalci se lahko odločijo za izvoz knjižnice, ki za zagon modela uporablja TensorFlow Lite for Microcontrollers tolmač.
Skratka, VoiceTurn_inferencing knjižnica, ki je bila prej razvita z Edge Impulse, uporablja TensorFlow Lite tolmač [14] za mikrokontrolerje za izvajanje modela strojnega učenja za razvrščanje besed.
Pravzaprav je zelo enostavno sami preverite, ali ta knjižnica za izvajanje klasifikatorja uporablja TensorFlow Lite za mikrokontrolerje. V vašem Arduino IDE kliknite File > Preferences in preverite lokacijo Sketchbook. V raziskovalcu datotek pojdite na to lokacijo in z urejevalnikom besedil odprite VoiceTurn_inferencing/src/VoiceTurn_inferencing.h. V vrstici 41 boste našli:
#include “edge-impulse-sdk/classifier/ei_
run_classifier.h”
Zdaj se vrnite v mapo src in znova odprite edge-impulse-sdk/classifier/ei_run_classifier.h z uporabo urejevalnika besedil. V vrstici 45 boste našli:
#include “edge-impulse-sdk/tensorflow/lite/
micro/micro_interpreter.h”
Kar se nanaša na uporabo knjižnice TensorFlow Lite za mikrokontrolerje. Pravzaprav je Litelibrary TensorFlow del SDK Edge Impulse, vključno z njegovo podknjižnico Micro C++.
Zgradite hardver
Smerniki bodo sestavljeni iz dveh LED trakov: enega na levi in drugega na desni strani kolesa. Uporabil sem naslovljiv RGB LED trak, sestavljen iz LEDic WS2813. Uporabite lahko druge LED trakove, če ste pozorni na ožičenje in da naknadno prilagodite kodo. Prva stvar je, da LED trakove odrežete tako, da imajo želeno dolžino. V tem primeru sem uporabil 10 cm dolg kos za vsako stran, kar ustreza 6 LEDicam. Pazite, da LED trakove odrežite po črtkani črti, da ne poškodujete električnih kontaktov.
Kot izbirni korak zdaj izvrtajte dve luknji na ravnilu ali ravni površini po vaši izbiri. Če želite strogo upoštevati dimenzije projekta, uporabite 30 cm dolgo (približno 12 palcev) površino in izvrtajte luknje na položajih 11,5 cm oziroma 18,5 cm.
Da bi lahko LED trakove povezali s preostalimi komponentami, moramo na njihove priključke dodati žice za priklop. Najprej s škarjami odstranite majhen del gel materiala, ki pokriva električne kontakte. Nato uporabite spajkalnik skupaj s spajkalnim fluksom, da prispajkate tri žice na priključke vsakega LED traku. Priporočam, da sledite običajni barvni kodi, tako da bo rdeča žica spajkana na 5V pin, črna pa na GND pin.
Kar zadeva druge priključke, sem uporabil rumeno žico za desno stran in zeleno žico za levo stran. Čeprav ima LED trak WS2813 štiri priključke, lahko DI (podatkovni vhod) in BI (rezervni vhod) zaradi preprostosti spajkate skupaj. Ko je ta korak opravljen, odstranite trak z LED trakovi in jih prilepite na ravno površino na položajih 0-10 cm oziroma 20-30 cm. Če ste v prejšnjem koraku izvrtali luknje na površini, skoznje napeljite žice. Če ne, jih preprosto postavite okoli roba.
Celotna nastavitev bo razdeljena na dva dela, ki se bosta med seboj povezali s pomočjo 3,5 mm priključkov za vtikač/vtičnico. Vzemite ustrezne kable in jih razrežite na približno 20-80 % dolžine, tako da boste na koncu dobili 80 % dolžine kabla, ki vsebuje vtičnico iz enega kabla, in še 80 % odstotno dolžino kabla, ki vsebuje vtič iz drugega kabla. Odstranite majhen del zunanje prevleke in videli boste, da je vsak kabel sestavljen iz 4 priključkov: treh žic in opleta. Vse žice opleta zvijte skupaj, da jih boste lažje spajkali.
Primite dolg kos kabla, ki vsebuje 3,5 mm priključek, in spajkajte žice na naslednji način (če je barvna koda drugačna, jo prilagodite svojim potrebam):
- Rdeča žica kabla do obeh rdečih žic dveh LED trakov (5V).
- Zelena žica kabla do zelene žice levega LED traku (DI-BI).
- Rumena žica kabla do rumene žice desnega LED traku (DI-BI).
- Oplet kabla do obeh črnih žic dveh LED trakov (GND).
Posledično bi morali imeti končan prvi del nastavitve, ki je sestavljen iz ravne površine, ki vsebuje smerne luči in kos kabla, ki se konča na 3,5 mm vtičnici. Izogibajte se stika med električnimi kontakti, tako da vsakega posamezno pokrijete z izolirnim trakom ali termoskrčljivimi božirkami.
Drugi del namestitve je enostavnejši za izdelavo. Vzemite dolg kos kabla, ki vsebuje 3,5 mm vtičnico, in prispajkajte žice na Arduino ploščo po enaki barvni kodi kot v prejšnjem koraku in Arduino priključkih:
- Rdeča žica do 3V3 Arduino priključka.
- Zelena žica do D4 Arduino priključka.
- Rumena žica do D7 Arduino priključka.
- Črna žica do enega od GND Arduino priključkov.
Shemo ožičenja najdete v razdelku Shema.
Tako preprosto nastavitev lahko uspemo, ker uporabljamo kratke LED trakove, ki vsebujejo le nekaj LEDic. Če uporabljate daljše LED trakove, jih boste morda morali napajati z zunanjim virom, da ne presežete največjega toka, ki ga podpira plošča. Če to storite, ne pozabite prispajkati 1000 μF kondenzatorja med priključki 5V in GND vaših LED trakov, da zagotovite stabilnost napajalne napetosti.
Dodajte kodi funkcionalnost
Prej smo v Arduino serijskem monitorju preverili, kako so besede, ki jih izgovorimo, razvrščene v vsako od štirih vnaprej določenih skupin. Ko je strojna oprema izdelana, je zdaj čas, da dodate zahtevano funkcionalnost za vklop enega od smernikov, potem ko izgovorite besedo, ki ustreza tej strani.
Najprej boste morali namestiti knjižnico, ki jo zahteva VoiceTurn za nadzor naslovljivih LED trakov, ki jih bomo uporabljali za smernike. Kliknite Sketch > Include Library > Manage Libraries…
V iskalno polje vpišite NeoPixel in namestite knjižnico Adafruit NeoPixel.
Delali bomo na vzorčnem programu nano_ble33_sense_microphone_continuous, ki ga zagotavlja knjižnica VoiceTurn_inferencing, zgrajena in uvožena v prejšnjih korakih.
Za vsako smer je potreben en LED trak, levo ali desno, vsak LED trak pa ima skupaj 6 LEDic. Poleg tega bo vgrajena Arduino RGB LED plošča uporabljena, da bo kolesar hitro vedel, ali je plošča pripravljena poslušati besedo ali še vedno uporablja smernike. Določite razpored priključkov na začetnem delu programa, pri čemer si zapomnite priključke, ki ste jih uporabili za zelene in rumene žice, ko ste zgradili del strojne opreme:
/* LED strip pinout */
#define LED_PIN_LEFT 4
#define LED_PIN_RIGHT 7
#define LED_COUNT 6
/* Built-in RGB LED pinout */
#define RGB_GREEN 22
#define RGB_RED 23
#define RGB_BLUE 24
Vključite NeoPixel knjižnico poleg drugih že vključenih knjižnic:
#include <Adafruit_NeoPixel.h>
Deklarirajte dva LED trakova tako, da določite njuno število LEDic, podatkovni priključek, na katerega sta povezana, in vrsto traku. Tukaj bomo za vrsto traku uporabili NEO_GRB + NEO_KHZ800, saj ta ustreza LED trakom WS2812 in podobnim. To lahko spremenite s pomočjo knjižnične dokumentacije, če uporabljate drugo vrsto LED traku.
*/
/* LED strips forleft and right signals
Adafruit_NeoPixel left(LED_COUNT, LED_PIN_
LEFT, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel right(LED_COUNT, LED_PIN_RIGHT, NEO_GRB + NEO_KHZ800);
Deklarirajte dve konstanti, ki bosta koristni za nastavitev trajanja svetlobne signalizacije. Obdobje je približno čas čakanja med vklopom LED in naslednjim vklopom: višji kot je nastavljen ta čas, počasnejša bo animacija. Spremenljivka ciklov se nanaša na število ponovitev animacije vsakič, ko se zazna beseda levo ali desno.
static int period = 100;
static int cycles = 3;
Zdaj v funkciji setup() dodajte naslednje vrstice kode za inicializacijo dveh LED trakov in nastavite njuno raven svetlosti na približno 20%. Slednji deluje kot programsko voden nadzor toka, tako da pazimo, da ne uničimo LEDic ali ne prekoračimo maksimalnega toka, ki ga podpira Arduino plošča predvsem takrat, ko na priključke trakov ni prispajkan noben zaščitni zaporedno vezan upor.
// Initialization of LED strips:
left.begin();
right.begin();
left.show();
right.show();
// Set BRIGHTNESS to about 2/5 (max = 255)
left.setBrightness(100);
right.setBrightness(100);
Inicializirajte priključke LED RGB kot IZHOD.
pinMode(RGB_RED, OUTPUT);
pinMode(RGB_GREEN, OUTPUT);
pinMode(RGB_BLUE, OUTPUT);
Kot morda veste, koda znotraj loop() funkcije vsebuje programska navodila, ki se bodo izvajala znova in znova. Dodajte naslednjo vrstico na začetek funkcije, da kolesarju sporočite, da plošča posluša. Nato bo ustvarjena funkcija rgb_green().
rgb_green(); // Shows the board is READY
Po tem se izvede klasifikacija besed in izhod programa se shrani v spremenljivko result.classification. Ta spremenljivka je indeksirana po vrstnem redu označevanja, ki smo ga uporabili pri usposabljanju modela strojnega učenja z Edge Impulse. Ne pozabite, da smo v tem vrstnem redu uporabili oznake levo, desno, šum in drugo. Zato result.classification[0] vsebuje informacije, ki ustrezajo levi skupini, result.classification[0].value pa je verjetnost, da izgovorjena beseda pripada levi skupini. Podobno result.classification[1] vsebuje informacije, ki ustrezajo desni skupini, result.classification[1].value pa je verjetnost, da izgovorjena beseda pripada desni skupini. Indeksa 2 in 3 ustrezata skupini šuma oziroma drugim skupinam, čeprav ju v tem projektu ne bomo uporabljali.
Ustrezen LED trak želimo aktivirati, če je beseda zaznana z verjetnostjo nad določenim pragom. Za ta projekt je prag verjetnosti nastavljen na 80 % za besedo levo in na 85 % za besedo desno, da se čim bolj izognemo lažnim pozitivnim rezultatom. Pragovi so različni, saj so nastavljeni glede na izhod faze testiranja modela, opravljenega z Edge Impulse. Dodajte ta del kode na konec funkcije loop(), potem ko je vsa obdelava strojnega učenja končana.
// 0 ->LEFT; 1 -> RIGHT
if (result.classification[0].value>= 0.80) {
turn(left);
}
if (result.classification[1].value>= 0.85) {
turn(right);
}
Programu je treba dodati le funkcije, ki so zadolžene za aktiviranje LED trakov in nadzor nad vgrajeno RGB LED. Funkcija turn() sprejme LED trak, da se aktivira kot vhodni parameter, in vklopi LED eno za drugo v oranžni barvi po animaciji, podobni tistim v sodobnih avtomobilih. Ko je vnaprej določeno število ciklov končano, se LED trak izklopi. Poleg tega je kolesar opozorjen na stanje programa tako, da vgrajeno RGB LED nastavite v rdečo barvo. Ko se LED trakovi uporabljajo, vgrajeno RGB LED izklopi. Dodajte to funkcijo na konec programa, potem ko se funkcija loop() zaključi.
{
static void turn(Adafruit_NeoPixel&strip)
rgb_red(); // Shows the board is BUSY
for (int i = 0; i < cycles; i++) {
for (int j = 0; j <strip.numPixels(); j++) {
strip.setPixelColor(j, strip.Color(255, 104, 0)); // Color: Orange
strip.show();
delay(period);
}
strip.clear();
strip.show();
delay(2 * period);
}
rgb_off(); // The board has FINISHED lighting the LED strip
}
In končno dodajte tri preproste funkcije, ki nadzorujejo vgrajeno RGB LED.
{
voidrgb_red()
digitalWrite(RGB_RED, HIGH);
digitalWrite(RGB_GREEN, LOW);
digitalWrite(RGB_BLUE, LOW);
}
voidrgb_green(){
digitalWrite(RGB_RED, LOW);
digitalWrite(RGB_GREEN, HIGH);
digitalWrite(RGB_BLUE, LOW);
}
voidrgb_off(){
digitalWrite(RGB_RED, LOW);
digitalWrite(RGB_GREEN, LOW);
digitalWrite(RGB_BLUE, LOW);
}
Ko program prevedete, ga naložite na ploščo Arduino in povežite strojno opremo na svojo ploščo. Nato boste lahko sami preizkusili nastavitev VoiceTurn. Ko izgovorite besedo »levo«, naj se vklopi levi smernik in po besedi »desno« enako bi se moralo zgoditi z desnim smernikom.
Če vaši testi niso tako uspešni, kot ste pričakovali, boste morda morali prilagoditi občutljivost postopka klasifikacije besed vašim potrebam. To lahko storite tako, da nastavite dva parametra:
Verjetnost zaznave besede, ki je sprva nastavljena na 85 %: z znižanjem te številke boste povečali število odzivov naprave na vaš glas, povečali pa boste tudi količino lažno pozitivnih rezultatov.
Konstanta EI_CLASSIFIER_SLICES_PER_MODEL_WINDOW, definirana na začetku programa: to je število koščkov, na katere je okno modela razdeljeno. Več informacij o tem parametru najdete na tej povezavi [15].
Povezavo do GitHub, ki vsebuje kodo projekta, sem vključil v razdelek Code, zato jo preverite, če ste se kdaj izgubili ali če želite neposredno preizkusiti mojo kodo.
Nastavite VoiceTurn na kolesu
Preizkus koncepta VoiceTurn je bil izveden na kolesu. Za pritrditev vseh komponent nanj so bile uporabljene plastične vezice, tako da je nastavitev mogoče enostavno namestiti in odstraniti brez trajnih sprememb na kolesu. Če želite, da je nastavitev trajno nameščena, lahko uporabite druge načine.
Prvi del je sestavljen iz Arduino plošče in dveh kablov, ki sta nanjo pritrjena: tisti, ki vsebuje žice, spajkane na Arduino priključke in se konča na 3,5 mm vtičnici, in mikro-USB na USB kabel, ki ploščo priključi na napajalno baterijo. Postavljenih je nekaj vezic, s katerimi sta oba prej omenjena kabla pritrjena na zadnjo zavorno žico. Oba kabla sta dovolj trda, da Arduino plošča ostane v lebdečem in stabilnem položaju, pri čemer je mikrofon obrnjen proti kolesarju.
Oba kabla moramo pritrditi na kolo, tako da lahko 3,5 mm vtičnica doseže zadnji del kolesa, USB vtič pa do sedeža, kjer bo nameščena baterija. Kabli so pritrjeni vzdolž zgornje strani okvirja kolesa.
Sedaj namestimo nosilec kolesarske ure okoli palice za sedež, tako da dobimo ravno površino, kjer montiramo ravnilo, ki vsebuje smernike. Uporabite nekaj kabelskih vezic v križni razporeditvi, da pritrdite drugi del nastavitve na palico za sedež na mestu pritrditve nosilca ure. Preostale žice pritrdite tudi na palico za sedež.
Priključite 3,5 mm vtikač na ustrezno vtičnico in preostali kabel pritrdite okoli okvirja kolesa, da ju ne boste med vožnjo nenamerno razklenili.
Na koncu postavite power bank v režo pod sedežem, ga trdno pritrdite s kabelskimi vezicami in nanj priključite USB kabel in tako da je VoiceTurn pripravljen za uporabo.
Uživajte!
Zdaj je čas, da sestavite in preizkusite VoiceTurn sami. Lahko ga celo vzamete kot osnovni projekt in ga še naprej izboljšujete: zmanjšajte ožičenje z uporabo vgrajene Arduino BLE povezljivosti, dodajte besedo za bujenje, kot je Hey Bike!, razširite nabor besed in dodajte več funkcionalnosti … veliko različnih možnosti obstaja.
Viri:
https://experiments.withgoogle.com/voice-turn
https://www.edgeimpulse.com/
https://docs.edgeimpulse.com/docs/responding-to-your-voice
https://ai.googleblog.com/2017/08/launching-speech-commands-dataset.html
http://download.tensorflow.org/data/speech_commands_v0.02.tar.gz
https://arxiv.org/pdf/1804.03209.pdf
https://docs.edgeimpulse.com/docs/keyword-spotting
https://docs.edgeimpulse.com/docs/arduino-nano-33-ble-sense
https://studio.edgeimpulse.com/public/39038/latest
https://www.arduino.cc/en/software
https://docs.edgeimpulse.com/docs/continuous-audio-sampling
https://blog.tensorflow.org/2021/06/how-tensorflow-helps-edge-impulse-make-ml-accessible.html
https://www.tensorflow.org/lite/microcontrollers
https://docs.edgeimpulse.com/docs/continuous-audio-sampling
Povzeto po:
https://www.hackster.io/a_g_v/voiceturn-voice-controlled-turn-lights-for-a-safer-ride-3a8e78
https://hackster.io