Inhoudsopgave:
2025 Auteur: John Day | [email protected]. Laatst gewijzigd: 2025-01-13 06:57
Nadat ik onlangs wat over braille had geleerd, vroeg ik me af of ik iets kon bouwen met behulp van de AIY-spraakkit voor de Raspberry Pi, dat een reëel voordeel kan hebben voor slechtzienden. Zoals hieronder beschreven, vindt u een prototype van een eenvoudig kleurdetectieapparaat dat zijn bevindingen hardop voorleest.
Een meer uitgebreide versie van dit systeem kan nuttig zijn voor personen met een verminderd gezichtsvermogen of kleurenblindheid.
Het systeem gebruikt een Raspberry Pi met een AIY voice HAT aangesloten. Een TCS34725 RGB-sensor breakout is aangesloten op de I2C-poort van de HAT. De breakout bevat een heldere warmwitte LED om het te analyseren object te verlichten. De breakout werd in een behuizing geplaatst om de meetomstandigheden te optimaliseren en te standaardiseren.
De driekleurensensor meet ongeveer dezelfde drie frequentiebereiken als de kleurensensoren in je ogen. Vervolgens worden de rode, groene en blauwe (RGB) waarden gebruikt om de algehele kleurindruk te berekenen.
Het leuke van dit speciale systeem is dat het je de kleur nu verbaal vertelt, met behulp van het "zeg"-commando van de AIY-spraakkits. Kijk dan eens naar de bijhorende video.
Het apparaat kan ook handig zijn als voorbeeld voor een I2C-sensorapparaat dat is aangesloten op de AIY voice HAT.
Stap 1: Gebruikte materialen
Raspberry Pi 3. ~ 35 US$ of EUR
AIY voice kit, met headers gesoldeerd aan de HAT. ~ 25US$ of EUR
Adafruit TCS34725 breakout, met een header gesoldeerd. ~ 8 US$ of EUR
Startkabels.
Een breadboard (optioneel)
Voor de sensorbehuizing: - een gebruikte "Dolce Gusto" koffiecapsule - een klein rond stuk 2 mm Forex (PVC-schuimplaat), ongeveer 37 mm diameter - een niet-reflecterend zwart materiaal om de binnenwanden van de behuizing te bedekken. Ik gebruikte zelfklevend zwart schuimrubber.
Optioneel: een kleine schakelaar om de metingen op te roepen
Een paar druppels plastic lijm en een snijmes.
Stap 2: Montage en gebruik
De Raspberry Pi met de AIY voice HAT is ingesteld zoals beschreven in de AIY handleiding. Voor de montage werden headers op de poorten op de HAT gesoldeerd. Voor de behuizing van de sensor is een "Dulce Gusto" koffiecapsule geleegd, schoongemaakt en een deel van de bodem voorzichtig verwijderd met een mes. Je kunt hiervoor iets anders gebruiken, de koffiecapsule had net de juiste maat en vorm. Een rond stuk van 2 mm Forex werd uit een plaat gesneden, de uitbraak werd vervolgens centraal op de Forex-plaat geplaatst, de positie gemarkeerd met een viltstift en een gleuf voor de kop op de uitbraak werd op de juiste positie gesneden.
Nu werd het Forex-stuk op de behuizing gelijmd en de sensoruitbraak bevestigd aan de Forex-plaat met behulp van een klittenband. Daarna werden de binnenwanden bekleed met een lichtabsorberend zwart materiaal, ik gebruikte een zelfklevend schuimrubber. Zwart karton zou ook moeten werken. Nu werd met behulp van startkabels de I2C "3.3V" -poort van de HAT aangesloten op "V in" op de sensor, Ground naar Gnd, sda naar sda en scl naar scl. Ik had een breadboard gebruikt om beide delen met elkaar te verbinden, maar dat is niet nodig.
Plaats het AIY_TCS34725 python-script in de src-map en voer het script uit vanaf de dev-terminal en voer "sec/AIY_TCS34752.py" in. Mogelijk moet u het python-script eerst uitvoerbaar maken. Plaats de sensoreenheid desgevraagd over het te meten object, druk op de knop in het AIY-apparaat en wacht een seconde of twee.
Vervolgens berekent het apparaat op basis van de gemeten RGB- en witwaarden eerst de bijbehorende tintwaarde, schat vervolgens de kleur op basis van deze waarde en communiceert deze mondeling via het AIY-spraaksysteem, bijv. G. als "donkerrood", maar geeft ook de tintwaarde. RGB-, tint- en helderheidswaarden (lichtheid, om precies te zijn) worden ook op het scherm afgedrukt.
Om het kleurannotatieproces te vereenvoudigen, worden de RGB-waarden omgezet in HSV-indeling (hue, saturation, value). Dit maakt het mogelijk om een kleur toe te voegen aan een bepaald bereik van hoeken (d.w.z. een taartpunt) en de kleur te kiezen op basis van de berekende tintwaarde.
U moet uw apparaat normaliseren tegen een witte en een zwarte referentie. Meet gewoon de witste en zwartste stukjes papier die je hebt, meet ze elk en plaats deze waarden als maximum- en minimumwaarden in de code. Alleen optimale referentiewaarden geven een goede kleurherkenning.
Een fundamenteel probleem is reflectie. Als u een object heeft met een glanzend of gepolijst oppervlak, zal het veel van het door de LED uitgestraalde licht reflecteren, waardoor het veel lichter lijkt dan het in werkelijkheid is. U kunt een membraan gebruiken om het licht te verstrooien, maar het kan zijn dat u een correctiefactor moet toepassen.
In het geval van doorschijnende objecten kan het handig zijn om ze op een wit papier te plaatsen, anders wordt de hoeveelheid gereflecteerd licht te klein en wordt het object als "zwart" gerapporteerd.
Als u de kleur wilt meten van objecten die licht uitstralen, moet u de LED op de breakout uitschakelen door de "LED"-poort op de breakout aan te sluiten op "Ground". Stel nu de normalisatiewaarden dienovereenkomstig in.
Een ander algemeen probleem is de verlichting van het object. De warmwitte LED op de breakout straalt een niet-continu lichtspectrum uit. Daarom kunnen bepaalde kleuren over- of ondervertegenwoordigd zijn in het RGB-spectrum. Voor meer informatie over dit onderwerp, neem een kijkje op mijn vorige instructables op een colorimeters/fotometers en spectrometers:
www.instructables.com/id/An-Inexpensive-Ph…
www.instructables.com/id/A-Mimimal-Six-Col…
Stap 3: De code
De code is een combinatie van een wijziging van een code uit de AIY-spraakhandleiding en de TCS34725-sensorcode van Bradspi.
Ik had ook geprobeerd de TCS34725 python-code van Adafruit te gebruiken, maar had problemen met het uitvoeren van deze en enkele andere codes die externe bibliotheken gebruiken in combinatie met de AIY HAT. Alle hulp welkom.
Zoals eerder vermeld, is de kleurannotatie gebaseerd op een transformatie van de RGB naar tintwaarden. U moet normalisatie-instellingen instellen op basis van experimentele metingen van witte en zwarte eerbiedigingsmaterialen. Vul de absolute waarden voor R, G en B min of max dienovereenkomstig in.
Het script gebruikt een nieuwe versie van het "say"-commando waarmee het volume en de toonhoogte kunnen worden geregeld. In het geval dat u de audio.py- en tty-stuurprogrammabestanden moet bijwerken of de "volume- en toonhoogtegedeelten" uit het script moet verwijderen.
#!/usr/bin/env python3# Dit script is een aanpassing van het servo_demo.py script voor de AIY voice HAT, # geoptimaliseerd voor de kleurherkenning met behulp van de Afafruit TCS34725 breakout import aiy.audio import aiy.cloudspeech import aiy.voicehat #from gpiozero import LED # kan handig zijn voor een externe LED op servo-poort #from gpiozero import Knop # kan handig zijn voor een externe knop op servo-poort import tijd import smbus bus = smbus. SMBus(1) import colorsys def hue2color (hue): # kleurinterpretatie op basis van de berekende tintwaarden als ((hue> 12) en (hue 25) en (hue 69) en (hue 164) en (hue 194) en (hue 269) en (hue 319) of (hue< 20)): color="red" return color else: print ("er ging iets mis")
def tcs34725(): # meting en interpretatie.
# De meting wordt uitgevoerd door het Bradspi TCS34725-script: # https://bradsrpi.blogspot.com/2013/05/tcs34725-rg… bus.write_byte(0x29, 0x80|0x12) ver = bus.read_byte(0x29) # version # moet 0x44 zijn als ver == 0x44: print ("Apparaat gevonden\n") bus.write_byte(0x29, 0x80|0x00) # 0x00 = ENABLE register bus.write_byte(0x29, 0x01|0x02) # 0x01 = Inschakelen, 0x02 RGB-sensoren ingeschakeld bus.write_byte(0x29, 0x80|0x14) # Leesresultaten start register 14, LSB dan MSB data = bus.read_i2c_block_data(0x29, 0) clear = clear = data[1] << 8 | data[0] rood = data[3] << 8 | data[2] groen = data[5] << 8 | data[4] blauw = data[7] << 8 | data[6] crgb = "Absolute tellingen: C: %s, R: %s, G: %s, B: %s\n" % (helder, rood, groen, blauw) print (crgb) time.sleep(1) anders: print ("Apparaat niet gevonden\n") # normalisatie en transformatie van de gemeten RGBW-waarden # Maximale waarden Normalisatiefactoren, moeten experimenteel worden gedefinieerd # bijv. versus een wit vel papier. Controleer en corrigeer van tijd tot tijd. max_bright = 5750 max_red = 1930 max_green = 2095 max_blue = 1980 # Normalisatiefactoren voor achtergrond/minimumwaarden, moeten experimenteel worden gedefinieerd # b.v. vs. zwart vel papier. Controleer en corrigeer van tijd tot tijd. min_bright = 750 min_red = 340 min_green = 245 min_blue = 225 # genormaliseerde waarden, tussen 0 en 1 rel_bright = ((clear - min_bright)/(max_bright - min_bright)) rel_red = ((red - min_red)/(max_red - min_red)) 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]*359 if rel_bright > 0.9: col = "wit" # if very bright -> white elif rel_bright black else: col = hue2color(hue) # kleurselectie op tintwaarden # print("relatieve waarden helder, rood, groen, blauw:") # print (rel_bright, rel_red, rel_green, rel_blue) # print("HSV values (hue, saturation, value):", hsv_col) # print ("hue in °", tint) return [col, rel_bright, rel_red, rel_green, rel_blauw, tint]
def hoofd():
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) # afstandssensor of andere externe knop, aangesloten op servo3/GPIO 05
aiy.audio.say("Hallo!",, volume=50, pitch=100) # volume en pitch vereisen een revisie van audio.py en _tty.py in november 2017!
aiy.audio.say("Beweeg de sensor om te beginnen boven het object. Druk vervolgens op de blauwe knop",, volume=50, pitch = 100) print("Om de kleurmeting plaatssensor boven het object te activeren, druk vervolgens op de blauwe knop ") while True: led.set_state(aiy.voicehat. LED. ON) button.wait_for_press() # voor externe knop, vervang knop door buttoni led.set_state(aiy.voicehat. LED. BLINK) aiy.audio.say(" Meten",, volume=50, toonhoogte = 100) resultaat = tcs34725() # roept meting en interpretatie op col = resultaat[0] # kleur, als teksttint = str(int(result[5])) # tint in °, als tekst r_red = str(int(result[2]*255)) # R-waarde, als tekst r_green = str(int(result[3]*255)) # G-waarde, als tekst r_blue = str(int(result[4]*255)) # B-waarde, als tekst r_bright = str(int(result[1]*100)) # W-waarde, als tekst led.set_state(aiy.voicehat. LED. OFF) als col == "wit " or col=="zwart": helder = "" elif (resultaat[1] >0.69): #brightness/lightness of colour bright ="light" elif (resultaat[1] <0.25): helder ="donker" else: helder ="medium" # communiceren t hij resultaten color_text =("De kleur van het object is " + bright + " " + col) print (color_text) aiy.audio.say(color_text,, volume=75, pitch=100) hue_text = ("De tintwaarde is "+ hue+ " graden") print (hue_text) aiy.audio.say(hue_text,, volume=75, pitch = 100)
if _name_ == '_main_': main()
Stap 4: Enkele links en opmerkingen
Het TCS34725 sensor datablad is hier te vinden:
De code om de sensor te lezen die ik heb gebruikt, werd hier beschreven:
Mogelijk vindt u wat aanvullende informatie over kleurmetingen met deze en een andere sensor in mijn vorige instructables:
www.instructables.com/id/An-Inexpensive-Ph…
www.instructables.com/id/A-Mimimal-Six-Col…