Inhaltsverzeichnis:
- Schritt 1: Verwendete Materialien
- Schritt 2: Montage und Verwendung
- Schritt 3: Der Code
- Schritt 4: Einige Links und Anmerkungen
Video: Ein sprechender Farbsensor, basierend auf dem AIY Voice Kit - Gunook
2024 Autor: John Day | [email protected]. Zuletzt bearbeitet: 2024-01-30 07:21
Nachdem ich kürzlich ein wenig über Braille gelernt hatte, fragte ich mich, ob ich mit dem AIY Voice Kit für den Raspberry Pi etwas bauen könnte, das für Sehbehinderte einen echten Vorteil haben könnte. So beschrieben finden Sie im Folgenden einen Prototyp eines einfachen Farberkennungsgerätes, das seine Ergebnisse laut vorliest.
Eine aufwendigere Version dieses Systems könnte für Personen mit Sehbehinderung oder Farbenblindheit nützlich sein.
Das System verwendet einen Raspberry Pi mit einem angeschlossenen AIY Voice HAT. Ein TCS34725 RGB-Sensor-Breakout ist an den I2C-Port des HAT angeschlossen. Der Breakout enthält eine helle warmweiße LED zur Beleuchtung des zu analysierenden Objekts. Der Breakout wurde in einem Gehäuse platziert, um die Messbedingungen zu optimieren und zu standardisieren.
Die drei Farbsensoren messen ungefähr die gleichen drei Frequenzbereiche wie die Farbsensoren in Ihren Augen. Anschließend wird aus den Rot-, Grün- und Blauwerten (RGB) der Gesamtfarbeindruck berechnet.
Das Schöne an diesem speziellen System ist, dass es Ihnen jetzt die Farbe verbal mit dem "say"-Befehl des AIY Voice-Kits mitteilt. Bitte schauen Sie sich das dazugehörige Video an.
Das Gerät kann auch als Beispiel für ein I2C-Sensorgerät nützlich sein, das an den AIY Voice HAT angeschlossen ist.
Schritt 1: Verwendete Materialien
Raspberry Pi 3. ~ 35 US$ oder EUR
AIY Voice-Kit, mit Headern, die an den HAT gelötet sind. ~ 25US$ oder EUR
Adafruit TCS34725 Breakout, mit angelötetem Header. ~ 8 US$ oder EUR
Überbrückungskabel.
Ein Steckbrett (optional)
Für das Sensorgehäuse: - eine gebrauchte "Dolce Gusto" Kaffeekapsel - ein kleines rundes Stück 2 mm Forex (PVC-Schaumplatte), ca. 37 mm Durchmesser - ein nicht reflektierendes schwarzes Material zur Abdeckung der Innenwände des Gehäuses. Ich habe selbstklebenden schwarzen Gummischaum verwendet.
Optional: ein kleiner Schalter zum Aufrufen der Messungen
Ein paar Tropfen Plastikkleber und ein Cuttermesser.
Schritt 2: Montage und Verwendung
Der Raspberry Pi mit dem AIY voice HAT wurde wie im AIY Handbuch beschrieben eingerichtet. Vor der Montage wurden Header an die Ports des HAT gelötet. Für das Gehäuse des Sensors wurde eine „Dulce Gusto“Kaffeekapsel geleert, gereinigt und ein Teil des Bodens vorsichtig mit einem Messer entfernt. Sie können zu diesem Zweck auch etwas anderes verwenden, die Kaffeekapsel hatte einfach die richtige Größe und Form. Ein rundes Stück 2mm Forex wurde aus einer Platte geschnitten, der Breakout wurde dann mittig auf die Forex-Platte gelegt, die Position mit einem Filzstift markiert und an der entsprechenden Stelle ein Schlitz für den Header auf dem Breakout geschnitten.
Nun wurde das Forex-Stück auf das Gehäuse geklebt und der Sensor-Breakout mit einem Klettband an der Forex-Platte befestigt. Dann wurden die Innenwände mit einem lichtabsorbierenden schwarzen Material beklebt, ich habe einen selbstklebenden Gummischaum verwendet. Schwarzer Karton sollte auch funktionieren. Nun wurde mit Überbrückungskabeln der I2C-Port "3.3V" des HAT mit "V in" am Sensor verbunden, Masse mit Gnd, sda mit sda und scl mit scl. Ich hatte ein Steckbrett verwendet, um beide Teile zu verbinden, aber das ist nicht notwendig.
Platzieren Sie das Python-Skript AIY_TCS34725 im src-Ordner und führen Sie das Skript über das Entwicklungsterminal aus, indem Sie "sec/AIY_TCS34752.py" eingeben. Möglicherweise müssen Sie das Python-Skript zuerst ausführbar machen. Wenn Sie dazu aufgefordert werden, platzieren Sie die Sensoreinheit über dem zu messenden Objekt, drücken Sie die Taste im AIY-Gerät und warten Sie ein oder zwei Sekunden.
Anschließend berechnet das Gerät anhand der gemessenen RGB- und Weißwerte zunächst den entsprechenden Farbtonwert, schätzt dann anhand dieses Wertes die Farbe und kommuniziert diese verbal über das AIY-Sprachsystem, z. g. als "dunkelrot", sondern gibt auch den Farbtonwert an. RGB-, Farbton- und Helligkeitswerte (Helligkeit, um genau zu sein) werden ebenfalls auf den Bildschirm gedruckt.
Um den Farbanmerkungsprozess zu vereinfachen, werden die RGB-Werte in das HSV-Format (Farbton, Sättigung, Wert) umgewandelt. Dies ermöglicht es, eine Farbe mit Anmerkungen zu einem bestimmten Winkelbereich (z. B. einem Tortenstück) zu versehen und die Farbe basierend auf dem berechneten Farbtonwert auszuwählen.
Sie müssen Ihr Gerät gegen eine weiße und eine schwarze Referenz normalisieren. Messen Sie einfach das weißeste und schwärzeste Stück Papier, das Ihnen zur Verfügung steht, nehmen Sie jeweils eine Messung vor und geben Sie diese Werte als Maximal- und Minimalwerte in den Code ein. Nur optimale Referenzwerte ergeben eine gute Farberkennung.
Ein grundlegendes Problem ist die Reflexion. Wenn Sie ein Objekt mit einer glänzenden oder polierten Oberfläche haben, reflektiert es einen Großteil des von der LED emittierten Lichts und erscheint viel heller, als es tatsächlich ist. Sie können eine Membranfolie verwenden, um das Licht zu streuen, müssen jedoch möglicherweise einen Korrekturfaktor implementieren.
Bei durchscheinenden Objekten kann es praktisch sein, diese auf ein weißes Papier zu legen, da sonst die reflektierte Lichtmenge zu gering ist und das Objekt als "schwarz" gemeldet wird.
Wenn Sie die Farbe von lichtemittierenden Objekten messen möchten, sollten Sie die LED am Breakout ausschalten, indem Sie den „LED“-Port am Breakout mit „Masse“verbinden. Stellen Sie nun die Normalisierungswerte entsprechend ein.
Ein weiteres allgemeines Problem ist die Beleuchtung des Objekts. Die warmweiße LED am Breakout emittiert ein nicht kontinuierliches Lichtspektrum. Daher können bestimmte Farben im RGB-Spektrum über- oder unterrepräsentiert sein. Weitere Informationen zu diesem Thema finden Sie in meinen vorherigen Anleitungen zu Kolorimetern / Photometern und Spektrometern:
www.instructables.com/id/An-Inexpensive-Ph…
www.instructables.com/id/A-Mimimal-Six-Col…
Schritt 3: Der Code
Der Code ist eine Kombination aus einer Modifikation eines Codes aus dem AIY-Sprachhandbuch und dem TCS34725-Sensorcode von Bradspi.
Ich hatte auch versucht, den Python-Code TCS34725 von Adafruit zu verwenden, hatte jedoch Probleme, diesen und einige andere Codes auszuführen, die externe Bibliotheken in Kombination mit dem AIY HAT verwenden. Jede Hilfe willkommen.
Wie bereits erwähnt, basiert die Farbanmerkung auf einer Transformation der RGB- in Farbtonwerte. Sie müssen die Normalisierungseinstellungen basierend auf experimentellen Messungen von weißen und schwarzen Referenzmaterialien festlegen. Tragen Sie die absoluten Werte für R, G und B min bzw. max entsprechend ein.
Das Skript verwendet eine neue Version des "say"-Befehls, der es ermöglicht, Lautstärke und Tonhöhe zu regulieren. In diesem Fall müssen Sie möglicherweise entweder die Treiberdateien audio.py und tty aktualisieren oder die "Lautstärke- und Tonhöhenteile" aus dem Skript löschen.
#!/usr/bin/env python3# Dieses Skript ist eine Adaption des servo_demo.py-Skripts für den AIY voice HAT, # optimiert für die Farberkennung mit dem Afafruit TCS34725 Breakout import aiy.audio import aiy.cloudspeech import aiy.voicehat #from gpiozero import LED # könnte für eine externe LED am Servoport hilfreich sein #from gpiozero import Button # könnte für eine externe Taste am Servoport hilfreich sein Importzeit import smbus bus = smbus. SMBus(1) import colorsys def hue2color (hue): # Farbinterpretation basierend auf den berechneten Farbtonwerten if ((hue> 12) and (hue 25) and (hue 69) and (hue 164) and (hue 194) and (hue 269) and (hue 319) oder (hue< 20)): color="red" return color else: print ("etwas ist schief gelaufen")
def tcs34725(): # Messung und Interpretation.
# Die Messung wird mit dem Bradspi TCS34725-Skript durchgeführt: # https://bradsrpi.blogspot.com/2013/05/tcs34725-rg… bus.write_byte(0x29, 0x80|0x12) ver = bus.read_byte(0x29) # version # sollte 0x44 sein, wenn ver == 0x44: print ("Gerät gefunden\n") bus.write_byte(0x29, 0x80|0x00) # 0x00 = Register ENABLE bus.write_byte(0x29, 0x01|0x02) # 0x01 = Einschalten, 0x02 RGB-Sensoren aktiviert bus.write_byte(0x29, 0x80|0x14) # Leseergebnisse starten Register 14, LSB dann MSB data = bus.read_i2c_block_data(0x29, 0) clear = clear = data[1] << 8 | data[0] rot = data[3] << 8 | Daten[2] grün = Daten[5] << 8 | Daten[4] blau = Daten[7] << 8 | data[6] crgb = "Absolute Zählungen: C: %s, R: %s, G: %s, B: %s\n" % (klar, rot, grün, blau) print (crgb) time.sleep(1) sonst: print ("Gerät nicht gefunden\n") # Normierung und Transformation der gemessenen RGBW-Werte # Maximalwerte Normierungsfaktoren, müssen experimentell bestimmt werden # zB im Vergleich zu einem weißen Blatt Papier. Von Zeit zu Zeit überprüfen und korrigieren. max_bright = 5750 max_red = 1930 max_green = 2095 max_blue = 1980 # Normalisierungsfaktoren für Hintergrund/Minimalwerte, müssen experimentell bestimmt werden # z. B. vs. schwarzes Blatt Papier. Von Zeit zu Zeit überprüfen und korrigieren. min_bright = 750 min_red = 340 min_green = 245 min_blue = 225 # normalisierte Werte, zwischen 0 und 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 = "white" # if very bright -> white elif rel_bright black else: col = hue2color(hue) # Farbauswahl nach Farbtonwerten # print("Relative Werte hell, rot, grün, blau:") # print (rel_bright, rel_red, rel_green, rel_blue) # print("HSV-Werte (Farbton, Sättigung, Wert):", hsv_col) # print ("Farbton in °", Farbton) return [col, rel_bright, rel_red, rel_green, rel_blue, Farbton]
def main():
button = aiy.voicehat.get_button() # Button-Status ändern led = aiy.voicehat.get_led() # Button-LED-Status ändern aiy.audio.get_recorder().start() # buttoni= Button(5) # Distanzsensor oder andere externe Taste, verbunden mit Servo3/GPIO 05
aiy.audio.say("Hallo!",, volume=50, pitch=100) # Volume und Pitch erfordern eine November-2017-Überarbeitung der Treiber audio.py und _tty.py!
aiy.audio.say("Um zu starten, bewegen Sie den Sensor über dem Objekt. Dann drücken Sie die blaue Taste",, volume=50, Pitch = 100) print("Um die Farbmessung zu aktivieren, platzieren Sie den Sensor über dem Objekt, dann drücken Sie die blaue Taste ") während True: led.set_state(aiy.voicehat. LED. ON) button.wait_for_press() # für externe Taste, Taste ersetzen durch buttoni led.set_state(aiy.voicehat. LED. BLINK) aiy.audio.say(" Measurement",, volume=50, Pitch = 100) result = tcs34725() # ruft Messung und Interpretation hervor col = result[0] # color, as text hue = str(int(result[5])) # hue in °, als Text r_red = str(int(result[2]*255)) # R-Wert, als Text r_green = str(int(result[3]*255)) # G-Wert, als Text r_blue = str(int(result[4]*255)) # B-Wert, als Text r_bright = str(int(result[1]*100)) # W-Wert, als Text led.set_state(aiy.voicehat. LED. OFF) if col == "white " or col=="black": bright = "" elif (result[1] >0.69): #brightness/hellness of color bright ="light" elif (result[1] <0.25): bright ="dark" else: hell ="medium" # kommunizieren t Die Ergebnisse color_text =("Die Farbe des Objekts ist " + bright + " " + col) print (color_text) aiy.audio.say(color_text,, volume=75, pitch=100) hue_text = ("Der Farbtonwert ist "+ hue+ "degrees") print (hue_text) aiy.audio.say(hue_text,, volume=75, Pitch = 100)
if _name_ == '_main_': main()
Schritt 4: Einige Links und Anmerkungen
Das Datenblatt des TCS34725-Sensors finden Sie hier:
Der von mir verwendete Code zum Auslesen des Sensors wurde hier beschrieben:
In meinen vorherigen Anleitungen finden Sie möglicherweise einige zusätzliche Informationen zu Farbmessungen mit diesem und einem anderen Sensor:
www.instructables.com/id/An-Inexpensive-Ph…
www.instructables.com/id/A-Mimimal-Six-Col…
Empfohlen:
DIY So zeigen Sie die Zeit auf dem M5StickC ESP32 mit Visuino an - Einfach zu tun: 9 Schritte
DIY So zeigen Sie die Zeit auf dem M5StickC ESP32 mit Visuino an - Einfach zu machen: In diesem Tutorial lernen wir, wie Sie den ESP32 M5Stack StickC mit Arduino IDE und Visuino programmieren, um die Zeit auf dem LCD anzuzeigen
M5STACK So zeigen Sie Temperatur, Feuchtigkeit und Druck auf dem M5StickC ESP32 mit Visuino an - Einfach zu tun: 6 Schritte
M5STACK So zeigen Sie Temperatur, Luftfeuchtigkeit und Druck auf dem M5StickC ESP32 mit Visuino an - Einfach zu machen: In diesem Tutorial lernen wir, wie Sie den ESP32 M5Stack StickC mit Arduino IDE und Visuino programmieren, um Temperatur, Luftfeuchtigkeit und Druck mit dem ENV-Sensor (DHT12, BMP280, BMM150)
Präzise Temperaturkontrolle auf dem Raspberry Pi 4: 3 Schritte
Präzise Temperaturkontrolle auf dem Raspberry Pi 4: Das Pimoroni Fan Shim ist eine großartige Lösung, um die Temperatur Ihres Pi zu senken, wenn es heiß läuft. Die Hersteller liefern sogar eine Software, die den Lüfter auslöst, wenn die CPU-Temperatur über einen bestimmten Schwellenwert (z. B. 65 Grad) steigt. Die Temperatur q
Ein kostengünstiger IoT-Luftqualitätsmonitor basierend auf RaspberryPi 4: 15 Schritte (mit Bildern)
Ein kostengünstiger IoT-Luftqualitätsmonitor auf Basis von RaspberryPi 4: Santiago, Chile, hat während eines winterlichen Umweltnotstands das Privileg, in einem der schönsten Länder der Welt zu leben, aber leider sind es nicht nur Rosen. Chile leidet während der Wintersaison sehr unter Luftverschmutzung, Mai
Laptopständer (basierend auf IKEA Halterungen): 5 Schritte
Laptopständer (basierend auf IKEA Brackets): Die Erstellung dieses Ständers dauerte weniger als 20 Minuten. Ich habe zwei Halterungen VALTER aus IKEA Stück Holz, 2 Schrauben und altes Mauspad verwendet