Cuprins:

Un senzor de culoare vorbitor, bazat pe kitul vocal AIY: 4 pași
Un senzor de culoare vorbitor, bazat pe kitul vocal AIY: 4 pași

Video: Un senzor de culoare vorbitor, bazat pe kitul vocal AIY: 4 pași

Video: Un senzor de culoare vorbitor, bazat pe kitul vocal AIY: 4 pași
Video: Idei la clasă și în afara ei: activități STEAM multidisciplinare. 6 ani de Meet and Code 2024, Noiembrie
Anonim
Un senzor de culoare vorbitor, bazat pe kitul vocal AIY
Un senzor de culoare vorbitor, bazat pe kitul vocal AIY
Un senzor de culoare vorbitor, bazat pe kitul vocal AIY
Un senzor de culoare vorbitor, bazat pe kitul vocal AIY
Un senzor de culoare vorbitor, bazat pe kitul vocal AIY
Un senzor de culoare vorbitor, bazat pe kitul vocal AIY
Un senzor de culoare vorbitor, bazat pe kitul vocal AIY
Un senzor de culoare vorbitor, bazat pe kitul vocal AIY

După ce am aflat puțin despre Braille recent, mă întrebam dacă aș putea construi ceva folosind kitul vocal AIY pentru Raspberry Pi, care ar putea avea un beneficiu real pentru persoanele cu deficiențe de vedere. Așa că este descris în cele ce urmează, veți găsi un prototip al unui dispozitiv simplu de detectare a culorilor care își citește constatările cu voce tare.

O versiune mai elaborată a acestui sistem ar putea fi utilă persoanelor cu tulburări de vedere sau de orbire a culorii.

Sistemul folosește un Raspberry Pi cu un HAT vocal AIY atașat. O ieșire a senzorului RGB TCS34725 este conectată la portul I2C al HAT. Breakout-ul conține un LED alb strălucitor pentru a ilumina obiectul de analizat. Breakout-ul a fost plasat într-o carcasă pentru a optimiza și standardiza condițiile de măsurare.

Cele trei senzori de culoare măsoară aproximativ aceleași trei game de frecvență ca senzorii de culoare din ochii tăi. Apoi, valorile roșu, verde și albastru (RGB) sunt utilizate pentru a calcula impresia generală de culoare.

Interesantul acestui sistem special este că acum îți spune culoarea verbal, folosind comanda „spune” a kiturilor vocale AIY. Vă rugăm să aruncați o privire la videoclipul însoțitor.

Dispozitivul ar putea fi, de asemenea, util ca exemplu pentru un dispozitiv senzor I2C conectat la AIY voice HAT.

Pasul 1: Materiale utilizate

Raspberry Pi 3. ~ 35 USD sau EUR

Set vocal AIY, cu anteturi lipite la HAT. ~ 25US $ sau EUR

Adafruit TCS34725 breakout, cu un antet lipit. ~ 8 USD sau EUR

Cabluri jumper.

O panou de testare (opțional)

Pentru carcasa senzorului: - o capsulă de cafea „Dolce Gusto” folosită- o bucată mică rotundă de 2 mm Forex (placă din spumă din PVC), cu diametrul de aproximativ 37 mm - un material negru care nu reflectă acoperirea pereților interiori ai carcasei. Am folosit spumă de cauciuc negru autoadeziv.

Opțional: un mic comutator pentru evocarea măsurătorilor

Câteva picături de lipici din plastic și un cuțit de tăiat.

Pasul 2: Asamblare și utilizare

Asamblare și utilizare
Asamblare și utilizare
Asamblare și utilizare
Asamblare și utilizare
Asamblare și utilizare
Asamblare și utilizare

Raspberry Pi cu AIY voice HAT a fost configurat așa cum este descris în manualul AIY. Înainte de asamblare, anteturile erau lipite în porturile de pe HAT. Pentru carcasa senzorului, o capsulă de cafea "Dulce Gusto" a fost golită, curățată și o parte a fundului îndepărtată cu atenție cu un cuțit. Puteți folosi altceva în acest scop, capsula de cafea avea doar dimensiunea și forma potrivite. O bucată rotundă de 2 mm Forex a fost tăiată dintr-o placă, ruptura a fost apoi plasată central pe placa Forex, poziția marcată cu un stilou și o fanta pentru antet pe ruptură a fost tăiată în poziția corespunzătoare.

Acum, piesa Forex a fost lipită pe carcasă și ruptura senzorului atașată la placa Forex, folosind o bandă Velcro. Apoi pereții interiori au fost acoperiți cu un material negru absorbant de lumină, am folosit o spumă de cauciuc autoadezivă. Cartonul negru ar trebui să funcționeze și el. Acum, folosind cabluri jumper, portul I2C "3.3V" al HAT a fost conectat la "V in" de pe senzor, la masă la Gnd, sda la sda și scl la scl. Folosisem un panou pentru conectarea ambelor părți, dar asta nu este necesar.

Plasați scriptul python AIY_TCS34725 în folderul src și rulați scriptul de la terminalul dev, introducând „sec / AIY_TCS34752.py”. Este posibil să fie necesar să faceți mai întâi executabil scriptul python. Când vi se cere, plasați unitatea senzorului peste obiectul de măsurat, apăsați butonul din dispozitivul AIY și așteptați o secundă sau două.

Apoi, pe baza valorilor RGB și albe măsurate, dispozitivul calculează mai întâi valoarea de nuanță corespunzătoare, apoi estimează culoarea pe baza acestei valori și le comunică verbal prin intermediul sistemului vocal AIY, e. g. ca „roșu închis”, dar dă și nuanței. Valorile RGB, nuanță și luminozitate (luminozitate, mai exact) sunt, de asemenea, imprimate pe ecran.

Pentru a simplifica procesul de adnotare a culorilor, valorile RGB sunt transformate în format HSV (nuanță, saturație, valoare). Acest lucru permite adnotarea unei culori într-un anumit interval de unghiuri (adică o felie de plăcintă) și alegerea culorii pe baza valorii de nuanță calculată.

Trebuie să vă normalizați dispozitivul împotriva unei referințe albe și negre. Măsoară doar cele mai albe și mai negre bucăți de hârtie pe care le ai la dispoziție, ia câte o măsurătoare și plasează aceste valori ca valori maxime și minime în cod. Numai valorile de referință optime vor oferi o bună recunoaștere a culorilor.

O problemă de bază este reflectarea. Dacă aveți un obiect cu o suprafață lucioasă sau lustruită, acesta va reflecta multă lumină emisă de LED-ul, apărând mult mai ușor decât este în realitate. Puteți utiliza o foaie de membrană pentru a împrăștia lumina, dar poate fi necesar să implementați un factor de corecție.

În cazul obiectelor translucide, ar putea fi util să le așezați pe o hârtie albă, altfel cantitatea de lumină reflectată va fi mică și obiectul raportat ca fiind „negru”.

Dacă doriți să măsurați culoarea obiectelor care emit lumină, ar trebui să opriți LED-ul de pe breakout conectând portul "LED" de pe breakout la "Ground". Acum setați valorile de normalizare în consecință.

O altă problemă generală este iluminarea obiectului. LED-ul alb cald de pe breakout emite un spectru non-continuu de lumină. Prin urmare, anumite culori ar putea fi supra sau subreprezentate în spectrul RGB. Pentru mai multe informații despre acest subiect, vă rugăm să aruncați o privire la instructabilele mele anterioare pe colorimetri / fotometri și spectrometre:

www.instructables.com/id/An-Inexpensive-Ph…

www.instructables.com/id/A-Mimimal-Six-Col…

Pasul 3: Codul

Codul
Codul

Codul este o combinație între o modificare a unui cod din manualul vocal AIY și codul senzorului TCS34725 de Bradspi.

De asemenea, încercasem să folosesc codul python TCS34725 de la Adafruit, dar am avut probleme la executarea acestui cod și a altor coduri care utilizează biblioteci externe în combinație cu AIY HAT. Orice ajutor este binevenit.

Așa cum am menționat anterior, adnotarea culorii se bazează pe o transformare pe RGB pentru a nuanța valorile. Trebuie să setați setările de normalizare pe baza măsurătorilor experimentale ale materialelor de reverență albă și neagră. Completați valorile absolute pentru R, G și B min sau max în consecință.

Scriptul folosește o nouă versiune a comenzii „spune” care permite reglarea volumului și a tonului. În cazul în care este posibil să fie necesar să actualizați fișierele driverului audio.py și tty sau să ștergeți „părțile de volum și pitch” din script.

#! / usr / bin / env python3 # Acest script este o adaptare a scriptului servo_demo.py pentru AIY voice HAT, # optimizat pentru recunoașterea culorilor folosind importul breakout Afafruit TCS34725 aiy.audio import aiy.cloudspeech import aiy.voicehat #de la LED-ul de importare gpiozero # ar putea fi util pentru un LED extern pe servo-port #de la butonul de importare gpiozero # ar putea fi util pentru un buton extern pe importul timpului de importare a servo-portului smbus bus = smbus. SMBus (1) import colorsys def hue2color (nuanță): # interpretarea culorii pe baza valorilor de nuanță calculate dacă ((nuanță> 12) și (nuanță 25) și (nuanță 69) și (nuanță 164) și (nuanță 194) și (nuanță 269) și (nuanță 319) sau (nuanță <20)): color = "roșu" returnează culoarea else: print ("ceva nu a mers bine")

def tcs34725 (): # măsurare și interpretare.

# Măsurarea este realizată de scriptul Bradspi TCS34725: # https://bradsrpi.blogspot.com/2013/05/tcs34725-rg… bus.write_byte (0x29, 0x80 | 0x12) ver = bus.read_byte (0x29) # version # ar trebui să fie 0x44 dacă ver == 0x44: print ("Dispozitiv găsit / n") bus.write_byte (0x29, 0x80 | 0x00) # 0x00 = ENABLE register bus.write_byte (0x29, 0x01 | 0x02) # 0x01 = Pornire, 0x02 Senzori RGB activate bus.write_byte (0x29, 0x80 | 0x14) # Rezultatele citirii încep registrul 14, LSB apoi MSB date = bus.read_i2c_block_data (0x29, 0) clear = clear = data [1] << 8 | date [0] roșu = data [3] << 8 | date [2] verde = date [5] << 8 | date [4] albastru = data [7] << 8 | data [6] crgb = "Număruri absolute: C:% s, R:% s, G:% s, B:% s / n"% (clar, roșu, verde, albastru) print (crgb) time.sleep (1) else: print ("Dispozitivul nu a fost găsit / n") # normalizarea și transformarea valorilor RGBW măsurate col = "" # Valori maxime Factori de normalizare, trebuie definiți experimental # de ex. vs. o foaie albă de hârtie. Verificați și corectați din când în când. max_bright = 5750 max_red = 1930 max_green = 2095 max_blue = 1980 # Fundal / Valori minime factori de normalizare, trebuie definiți experimental # de ex. vs. foaie de hârtie neagră. Verificați și corectați din când în când. min_bright = 750 min_red = 340 min_verde = 245 min_blue = 225 # valori normalizate, între 0 și 1 rel_bright = ((clar - min_bright) / (max_bright - min_bright)) rel_red = ((roșu - min_red) / (max_red - min_red)) rel_green = ((verde - min_green) / (max_green - min_green)) rel_blue = ((albastru - min_blue) / (max_blue - min_blue)) hsv_col = colorsys.rgb_to_hsv (rel_red, rel_green, rel_blue) hue = hsv_col [0] if rel_bright> 0.9: col = "white" # if very bright -> white elif rel_bright black else: col = hue2color (nuanță) # selecție culoare după valori de nuanță # print ("valori relative luminos, roșu, verde, albastru:") # print (rel_bright, rel_red, rel_green, rel_blue) # print ("valori HSV (nuanță, saturație, valoare):", hsv_col) # print ("nuanță în °", nuanță) return [col, rel_bright, rel_red, rel_green, rel_blue, nuanță]

def main ():

button = aiy.voicehat.get_button () # modificare Buton stare led = aiy.voicehat.get_led () # modificare Buton-LED stare aiy.audio.get_recorder (). start () # buttoni = Buton (5) # senzor de distanță sau alt buton extern, conectat la servo3 / GPIO 05

aiy.audio.say ("Bună ziua!",, volum = 50, pitch = 100) # volum și pitch necesită revizuirea în noiembrie 2017 a driverului audio.py și _tty.py!

aiy.audio.say ("Pentru a începe, mutați senzorul deasupra obiectului. Apoi apăsați butonul albastru",, volumul = 50, pitch = 100) print ("Pentru a activa măsurarea culorii, plasați senzorul deasupra obiectului, apoi apăsați butonul albastru ") în timp ce este adevărat: led.set_state (aiy.voicehat. LED. ON) button.wait_for_press () # pentru butonul extern, înlocuiți butonul cu buttoni led.set_state (aiy.voicehat. LED. BLINK) aiy.audio.say (" Măsurarea ",, volumul = 50, pitch = 100) rezultat = tcs34725 () # evocă măsurare și interpretare col = rezultat [0] # culoare, ca text nuanță = str (int (rezultat [5])) # nuanță în °, ca text r_red = str (int (result [2] * 255)) # valoare R, ca text r_green = str (int (result [3] * 255)) # valoare G, ca text r_blue = str (int (result [4] * 255)) # B valoare, ca text r_bright = str (int (rezultat [1] * 100)) # valoare W, ca text led.set_state (aiy.voicehat. LED. OFF) if col == "white "sau col ==" negru ": luminos =" "elif (rezultat [1]> 0.69): # luminozitate / lumină a culorii luminos =" luminos "elif (rezultat [1] <0.25): luminos =" întunecat "altceva: luminos = "mediu" # comunica t rezultă color_text = ("Culoarea obiectului este" + luminos + "" + col) print (color_text) aiy.audio.say (color_text,, volum = 75, pitch = 100) hue_text = ("Valoarea nuanței este "+ nuanță +" grade ") print (hue_text) aiy.audio.say (hue_text,, volum = 75, pitch = 100)

if _name_ == '_main_': main ()

Pasul 4: câteva link-uri și observații

Fișa tehnică a senzorului TCS34725 poate fi găsită aici:

Codul pentru citirea senzorului pe care l-am folosit a fost descris aici:

Puteți găsi câteva informații suplimentare despre măsurătorile de culoare cu acest senzor și cu un alt senzor în instructabilele mele anterioare:

www.instructables.com/id/An-Inexpensive-Ph…

www.instructables.com/id/A-Mimimal-Six-Col…

Recomandat: