En talande färgsensor, baserad på AIY Voice Kit: 4 steg
En talande färgsensor, baserad på AIY Voice Kit: 4 steg
Anonim
En talande färgsensor, baserad på AIY Voice Kit
En talande färgsensor, baserad på AIY Voice Kit
En talande färgsensor, baserad på AIY Voice Kit
En talande färgsensor, baserad på AIY Voice Kit
En talande färgsensor, baserad på AIY Voice Kit
En talande färgsensor, baserad på AIY Voice Kit
En talande färgsensor, baserad på AIY Voice Kit
En talande färgsensor, baserad på AIY Voice Kit

Efter att ha lärt mig lite om punktskrift nyligen undrade jag om jag kunde bygga något med AIY-röstsatsen för Raspberry Pi, som kan ha en verklig nytta för synskadade. Så beskrivet i det följande hittar du en prototyp av en enkel färgdetekteringsenhet som läser sina fynd högt.

En mer genomarbetad version av detta system kan vara användbar för personer med nedsatt syn eller färgblindhet.

Systemet använder en Raspberry Pi med en AIY -rösthatt ansluten. En TCS34725 RGB -sensorbrytning är ansluten till I2C -porten på HAT. Utbrytningen innehåller en ljus varm varm vit lysdiod för att belysa objektet som ska analyseras. Utbrottet placerades i ett hölje för att optimera och standardisera mätförhållanden.

De tre färgsensorerna mäter ungefär samma tre frekvensområden som färgsensorerna i dina ögon. Sedan används de röda, gröna och blå (RGB) värdena för att beräkna det totala färgavtrycket.

Det fina med det här speciella systemet är att det nu berättar färgen verbalt, med hjälp av AIY -röstsatsens "säga" -kommando. Ta en titt på den medföljande videon.

Enheten kan också vara användbar som exempel för en I2C -sensorenhet ansluten till AIY -rösthatten.

Steg 1: Material som används

Raspberry Pi 3. ~ 35 US $ eller EUR

AIY -röstsats, med rubriker lödda på hatten. ~ 25US $ eller EUR

Adafruit TCS34725 breakout, med en rubrik lödad. ~ 8 US $ eller EUR

Startkablar.

En brödbräda (tillval)

För sensorhuset:- en begagnad "Dolce Gusto" kaffekapsel- en liten rund bit av 2 mm Forex (PVC-skumplatta), ca 37 mm diameter- ett icke-reflekterande svart material för att täcka husets innerväggar. Jag använde självhäftande svart gummiskum.

Valfritt: en liten switch för att framkalla mätningarna

Några droppar plastlim och en skärkniv.

Steg 2: Montering och användning

Montering och användning
Montering och användning
Montering och användning
Montering och användning
Montering och användning
Montering och användning

Raspberry Pi med AIY -rösthatten konfigurerades enligt beskrivningen i AIY -manualen. Före montering löddes rubriker till portarna på HAT. För sensorns hölje tömdes en "Dulce Gusto" kaffekapsel, rengördes och en del av botten avlägsnades försiktigt med en kniv. Du kan använda något annat för detta ändamål, kaffekapseln hade precis rätt storlek och form. En rund bit på 2 mm Forex skars från en platta, utbrytningen placerades sedan centralt på Forex -plattan, positionen markerad med en filtpenna och en plats för rubriken på breakouten klipptes vid lämplig position.

Nu limmades Forex -biten på huset och sensorutbrottet fästes på Forex -plattan med en kardborreband. Sedan täcktes innerväggarna med ett lättabsorberande svart material, jag använde ett självhäftande gummiskum. Svart kartong borde fungera också. Nu, med hjälp av bygelkablar, var I2C "3.3V" -porten på HAT ansluten till "V in" på sensorn, Ground to Gnd, sda to sda and scl to scl. Jag hade använt en brödbräda för att ansluta båda delarna, men det är inte nödvändigt.

Placera AIY_TCS34725 python -skriptet i src -mappen och kör skriptet från dev -terminalen och ange "sec/AIY_TCS34752.py". Du kan behöva göra python -skriptet körbart först. När du blir ombedd placerar du sensorenheten över objektet som ska mätas, trycker på knappen i AIY -enheten och väntar en sekund eller två.

Baserat på de uppmätta RGB- och vita värdena beräknar enheten först motsvarande nyansvärde, uppskattar sedan färgen baserat på detta värde och kommunicerar dem verbalt via AIY -röstsystemet, t.ex. g. som "mörkröd", men ger också nyansvärdet. RGB, färgton och ljusstyrka (ljushet, för att vara exakt) skrivs också ut på skärmen.

För att förenkla färgannotationsprocessen omvandlas RGB -värdena till HSV -format (nyans, mättnad, värde). Detta gör det möjligt att kommentera en färg till ett visst område av vinklar (dvs. en pajskiva) och välja färgen baserat på det beräknade nyansvärdet.

Du måste normalisera din enhet mot en vit och en svart referens. Mät bara de vitaste och svartaste pappersbitar du har tillgängliga, gör en mätning var och placera dessa värden som maximi- och minimivärden i koden. Endast optimala referensvärden ger ett bra färgigenkänning.

Ett grundproblem är reflektion. Om du har ett föremål med en blank eller blank yta kommer det att reflektera mycket av ljuset som lyser från LED: n, vilket verkar mycket ljusare än det verkligen är. Du kan använda ett membranark för att sprida ljuset, men du kan behöva implementera en korrigeringsfaktor.

För genomskinliga föremål kan det vara praktiskt att placera dem på ett vitt papper, annars blir mängden reflekterat ljus för litet och objektet rapporteras som "svart".

Om du vill mäta färgen på föremål som avger ljus bör du stänga av lysdioden på breakout genom att ansluta "LED" -porten på breakout till "Ground". Ställ nu in normaliseringsvärdena därefter.

Ett annat generellt problem är belysningen av objektet. Den varmvita lysdioden på brytningen avger ett icke-kontinuerligt ljusspektrum. Därför kan vissa färger vara över- eller underrepresenterade i RGB-spektrumet. För mer information om detta ämne, ta en titt på mina tidigare instruktioner om kolorimetrar/ fotometrar och spektrometrar:

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

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

Steg 3: Koden

Koden
Koden

Koden är en kombination av en modifiering av en kod från AIY -röstmanualen och TCS34725 -sensorkoden från Bradspi.

Jag hade också försökt använda TCS34725 pythonkoden från Adafruit, men hade problem med att köra detta och några andra koder som använder externa bibliotek i kombination med AIY HAT. All hjälp välkommen.

Som nämnts tidigare är färgkommentaren baserad på en omvandling av RGB till nyansvärden. Du måste ställa in normaliseringsinställningar baserat på experimentella mätningar av vita och svarta vördnadsmaterial. Fyll i de absoluta värdena för R, G och B min eller max därefter.

Skriptet använder en ny version av kommandot "say" som gör det möjligt att reglera volym och tonhöjd. I så fall kan du behöva uppdatera drivrutinsfilerna audio.py och tty eller radera "volymen och tonhöjdsdelarna" från skriptet.

#!/usr/bin/env python3 # Detta skript är en anpassning av servo_demo.py -skriptet för AIY -rösthatten, # optimerad för färgigenkänning av Afafruit TCS34725 breakout import aiy.audio import aiy.cloudspeech import aiy.voicehat # från gpiozero-import-LED # kan vara till hjälp för en extern lysdiod på servoport (nyans): # färgtolkning baserad på de beräknade nyansvärdena om ((nyans> 12) och (nyans 25) och (nyans 69) och (nyans 164) och (nyans 194) och (nyans 269) och (nyans 319) eller (nyans <20)): color = "röd" returfärg annars: print ("något gick fel")

def tcs34725 (): # mätning och tolkning.

# Mätningen utförs av Bradspi TCS34725-skriptet: # https://bradsrpi.blogspot.com/2013/05/tcs34725-rg… bus.write_byte (0x29, 0x80 | 0x12) ver = bus.read_byte (0x29) # version # ska vara 0x44 om ver == 0x44: print ("Enhet hittad / n") bus.write_byte (0x29, 0x80 | 0x00) # 0x00 = AKTIVERA registrera bus.write_byte (0x29, 0x01 | 0x02) # 0x01 = Slå på, 0x02 RGB -sensorer aktiverade bus.write_byte (0x29, 0x80 | 0x14) # Läsresultat startar register 14, LSB sedan MSB data = bus.read_i2c_block_data (0x29, 0) clear = clear = data [1] << 8 | data [0] red = data [3] << 8 | data [2] grön = data [5] << 8 | data [4] blå = data [7] << 8 | data [6] crgb = "Absolut antal: C: %s, R: %s, G: %s, B: %s / n" %(klar, röd, grön, blå) tryck (crgb) time.sleep (1) else: print ("Enhet hittades inte / n") # normalisering och transformation av de uppmätta RGBW -värdena col = "" # Maximala värden Normaliseringsfaktorer, måste definieras experimentellt # t.ex. kontra ett vitt papper. Kontrollera och korrigera då och då. max_bright = 5750 max_red = 1930 max_green = 2095 max_blue = 1980 # Bakgrund/minimivärden normaliseringsfaktorer, måste definieras experimentellt # t.ex. kontra svart papper. Kontrollera och korrigera då och då. min_bright = 750 min_red = 340 min_green = 245 min_blue = 225 # normaliserade värden, mellan 0 och 1 rel_bright = ((clear - min_bright)/(max_bright - min_bright)) rel_red = ((röd - min_röd)/(max_röd - min_röd)) rel_green = ((green - min_green)/(max_green - min_green)) rel_blue = ((blue - min_blue)/(max_blue - min_blue)) hsv_col = colorsys.rgb_to_hsv (rel_red, rel_green, rel_blue) hue = hsv_col [0] *9 if rel_bright> 0,9: col = "white" # if very bright -> white elif rel_bright black else: col = hue2color (hue) # färgval med nyansvärden # print ("relativa värden ljus, röd, grön, blå:") # print (rel_bright, rel_red, rel_green, rel_blue) # print ("HSV -värden (nyans, mättnad, värde):", hsv_col) # print ("nyans i °", nyans) return [col, rel_bright, rel_red, rel_green, rel_blue, nyans]

def main ():

button = aiy.voicehat.get_button () # change Button status led = aiy.voicehat.get_led () # change Button-LED status aiy.audio.get_recorder (). start () # buttoni = Button (5) # distance sensor or annan extern knapp, ansluten till servo3/GPIO 05

aiy.audio.say ("Hej!",, volym = 50, tonhöjd = 100) # volym och tonhöjd kräver november 2017 revision av audio.py och _tty.py driver!

aiy.audio.say ("För att starta, flytta sensorn ovanför objektet. Tryck sedan på den blå knappen",, volym = 50, tonhöjd = 100) print ("För att aktivera färgmätningsställsensorn ovanför objektet, tryck sedan på den blå knappen ") medan True: led.set_state (aiy.voicehat. LED. ON) button.wait_for_press () # för extern knapp, ersätt knapp med buttoni led.set_state (aiy.voicehat. LED. BLINK) aiy.audio.say (" Mätning ",, volym = 50, tonhöjd = 100) resultat = tcs34725 () # framkallar mätning och tolkning col = resultat [0] # färg, eftersom textfärg = str (int (resultat [5])) # nyans i °, som text r_red = str (int (resultat [2]*255)) # R -värde, som text r_green = str (int (resultat [3]*255)) # G -värde, som text r_blue = str (int (resultat [4]*255)) # B -värde, som text r_bright = str (int (resultat [1]*100)) # W -värde, som textled.set_state (aiy.voicehat. LED. OFF) om col == "vit "eller col ==" black ": bright =" "elif (resultat [1]> 0,69): #ljusstyrka/ljusstyrka i färg bright =" light "elif (resultat [1] <0,25): bright =" dark "annars: bright = "medium" # kommunicerar t han resultat color_text = ("Objektets färg är" + bright + "" + col) print (color_text) aiy.audio.say (color_text,, volume = 75, pitch = 100) hue_text = ("Nyansvärdet är "+ nyans+" grader ") print (hue_text) aiy.audio.say (hue_text,, volym = 75, pitch = 100)

om _name_ == '_main_': main ()

Steg 4: Några länkar och anmärkningar

Sensordatabladet TCS34725 hittar du här:

Koden för att läsa sensorn som jag har använt beskrivs här:

Du kan hitta ytterligare information om färgmätningar med denna och en annan sensor i mina tidigare instruktioner:

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

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