A Talking Color Sensor, Βασισμένο στο AIY Voice Kit: 4 Βήματα
A Talking Color Sensor, Βασισμένο στο AIY Voice Kit: 4 Βήματα
Anonim
Ένας αισθητήρας χρώματος που μιλάει, βασισμένος στο κιτ φωνής AIY
Ένας αισθητήρας χρώματος που μιλάει, βασισμένος στο κιτ φωνής AIY
Ένας αισθητήρας χρώματος που μιλάει, βασισμένος στο κιτ φωνής AIY
Ένας αισθητήρας χρώματος που μιλάει, βασισμένος στο κιτ φωνής AIY
A Talking Color Sensor, Βασισμένο στο AIY Voice Kit
A Talking Color Sensor, Βασισμένο στο AIY Voice Kit
A Talking Color Sensor, Βασισμένο στο AIY Voice Kit
A Talking Color Sensor, Βασισμένο στο AIY Voice Kit

Έχοντας μάθει λίγο για τη γραφή Braille πρόσφατα, αναρωτιόμουν αν θα μπορούσα να δημιουργήσω κάτι χρησιμοποιώντας το κιτ φωνής AIY για το Raspberry Pi, το οποίο μπορεί να έχει πραγματικό όφελος για άτομα με προβλήματα όρασης. Έτσι περιγράφεται παρακάτω, θα βρείτε ένα πρωτότυπο μιας απλής συσκευής ανίχνευσης χρώματος που διαβάζει δυνατά τα ευρήματά της.

Μια πιο περίτεχνη έκδοση αυτού του συστήματος μπορεί να είναι χρήσιμη για άτομα με μειωμένη όραση ή αχρωματοψία.

Το σύστημα χρησιμοποιεί Raspberry Pi με συνημμένο AIY voice HAT. Μια θραύση αισθητήρα TCS34725 RGB είναι συνδεδεμένη στη θύρα I2C του HAT. Το ξεμπλοκάρισμα περιέχει ένα φωτεινό ζεστό λευκό LED για να φωτίζει το προς ανάλυση αντικείμενο. Το ξεμπλοκάρισμα τοποθετήθηκε σε ένα περίβλημα για βελτιστοποίηση και τυποποίηση των συνθηκών μέτρησης.

Ο αισθητήρας τριών χρωμάτων μετρά περίπου τις ίδιες τρεις περιοχές συχνοτήτων με τους αισθητήρες χρώματος στα μάτια σας. Στη συνέχεια, οι τιμές κόκκινου, πράσινου και μπλε (RGB) χρησιμοποιούνται για τον υπολογισμό της συνολικής εντύπωσης χρώματος.

Το ωραίο με αυτό το ειδικό σύστημα είναι ότι τώρα σας λέει το χρώμα προφορικά, χρησιμοποιώντας την εντολή "say" των φωνητικών κιτ AIY. Ρίξτε μια ματιά στο συνοδευτικό βίντεο.

Η συσκευή μπορεί επίσης να είναι χρήσιμη ως παράδειγμα για μια συσκευή αισθητήρα I2C συνδεδεμένη στο φωνητικό καπάκι AIY.

Βήμα 1: Υλικά που χρησιμοποιούνται

Raspberry Pi 3. ~ 35 US $ ή EUR

Κιτ φωνής AIY, με επικεφαλίδες συγκολλημένες στο HAT. US 25 US $ ή EUR

Adafruit TCS34725 breakout, με μια κεφαλίδα συγκολλημένη. US 8 US $ ή EUR

Καλώδια βραχυκύκλωσης.

Μια σανίδα ψωμιού (προαιρετικά)

Για το περίβλημα του αισθητήρα:- μεταχειρισμένη κάψουλα καφέ "Dolce Gusto"- ένα μικρό στρογγυλό κομμάτι 2 mm Forex (πλάκα αφρού PVC), διαμέτρου περίπου 37 mm- ένα μαύρο υλικό που δεν αντανακλάται για να καλύψει τα εσωτερικά τοιχώματα του περιβλήματος. Χρησιμοποίησα αυτοκόλλητο αφρώδες μαύρο καουτσούκ.

Προαιρετικό: ένας μικρός διακόπτης για να προκαλέσει τις μετρήσεις

Λίγες σταγόνες πλαστική κόλλα και ένα μαχαίρι κοπής.

Βήμα 2: Συναρμολόγηση και χρήση

Συναρμολόγηση και χρήση
Συναρμολόγηση και χρήση
Συναρμολόγηση και χρήση
Συναρμολόγηση και χρήση
Συναρμολόγηση και χρήση
Συναρμολόγηση και χρήση

Το Raspberry Pi με το AIY voice HAT είχε ρυθμιστεί όπως περιγράφεται στο εγχειρίδιο του AIY. Πριν από τη συναρμολόγηση, οι επικεφαλίδες συγκολλήθηκαν στα λιμάνια του HAT. Για το περίβλημα του αισθητήρα, μια κάψουλα καφέ "Dulce Gusto" αδειάστηκε, καθαρίστηκε και ένα μέρος του πυθμένα αφαιρέθηκε προσεκτικά με ένα μαχαίρι. Μπορείτε να χρησιμοποιήσετε κάτι άλλο για αυτό το σκοπό, η κάψουλα καφέ είχε ακριβώς το σωστό μέγεθος και σχήμα. Ένα στρογγυλό κομμάτι Forex 2mm κόπηκε από μια πλάκα, το ξεμπλοκάρισμα τοποθετήθηκε στη συνέχεια κεντρικά στην πλάκα Forex, η θέση σημειώθηκε με ένα στυλό τσόχας και μια σχισμή για την κεφαλίδα στο ξεμπλοκάρισμα κόπηκε στην κατάλληλη θέση.

Τώρα το κομμάτι Forex ήταν κολλημένο στο περίβλημα και το άνοιγμα του αισθητήρα προσαρτήθηκε στην πλάκα Forex, χρησιμοποιώντας μια ταινία Velcro. Στη συνέχεια, οι εσωτερικοί τοίχοι ήταν καλυμμένοι με ένα μαύρο απορροφητικό υλικό, χρησιμοποίησα ένα αυτοκόλλητο αφρώδες καουτσούκ. Το μαύρο χαρτόνι πρέπει επίσης να λειτουργεί. Τώρα, χρησιμοποιώντας καλώδια βραχυκυκλωτήρων, η θύρα I2C "3.3V" του HAT συνδέθηκε με "V in" στον αισθητήρα, Ground to Gnd, sda σε sda και scl σε scl. Είχα χρησιμοποιήσει ένα breadboard για να συνδέσω και τα δύο μέρη, αλλά αυτό δεν είναι απαραίτητο.

Τοποθετήστε το σενάριο python AIY_TCS34725 στο φάκελο src και εκτελέστε το σενάριο από το τερματικό dev, εισάγοντας "sec/AIY_TCS34752.py". Σως χρειαστεί να κάνετε πρώτα το σενάριο python εκτελέσιμο. Όταν σας ζητηθεί, τοποθετήστε τη μονάδα αισθητήρα πάνω στο αντικείμενο που θα μετρηθεί, πατήστε το κουμπί στη συσκευή AIY και περιμένετε ένα ή δύο δευτερόλεπτα.

Στη συνέχεια, με βάση τις μετρημένες τιμές RGB και λευκού, η συσκευή υπολογίζει πρώτα την αντίστοιχη τιμή απόχρωσης, στη συνέχεια εκτιμά το χρώμα με βάση αυτήν την τιμή και τα επικοινωνεί προφορικά μέσω του φωνητικού συστήματος AIY, π.χ. σολ. ως "σκούρο κόκκινο", αλλά δίνει επίσης την απόχρωση. Οι τιμές RGB, απόχρωσης και φωτεινότητας (φωτεινότητα, για την ακρίβεια) εκτυπώνονται επίσης στην οθόνη.

Για να απλοποιηθεί η διαδικασία σχολιασμού χρώματος, οι τιμές RGB μετατρέπονται σε μορφή HSV (απόχρωση, κορεσμός, τιμή). Αυτό σας επιτρέπει να σχολιάσετε ένα χρώμα σε ένα συγκεκριμένο εύρος γωνιών (δηλαδή μια φέτα πίτας) και να επιλέξετε το χρώμα με βάση την υπολογισμένη τιμή απόχρωσης.

Πρέπει να ομαλοποιήσετε τη συσκευή σας σε σχέση με μια λευκή και μια μαύρη αναφορά. Απλώς μετρήστε τα πιο λευκά και μαύρα κομμάτια χαρτιού που έχετε στη διάθεσή σας, κάντε μια μέτρηση το καθένα και τοποθετήστε αυτές τις τιμές ως μέγιστες και ελάχιστες τιμές στον κώδικα. Μόνο οι βέλτιστες τιμές αναφοράς θα δώσουν μια καλή αναγνώριση χρώματος.

Ένα βασικό πρόβλημα είναι ο προβληματισμός. Εάν έχετε ένα αντικείμενο με γυαλιστερή ή γυαλισμένη επιφάνεια, θα αντανακλά πολύ το φως που εκπέμπεται από το LED, φαίνεται πολύ ελαφρύτερο από ό, τι είναι στην πραγματικότητα. Μπορείτε να χρησιμοποιήσετε ένα φύλλο μεμβράνης για να διασκορπίσετε το φως, αλλά μπορεί να χρειαστεί να εφαρμόσετε έναν συντελεστή διόρθωσης.

Στην περίπτωση ημιδιαφανών αντικειμένων, μπορεί να είναι βολικό να τα τοποθετήσετε σε λευκό χαρτί, διαφορετικά η ποσότητα του ανακλώμενου φωτός θα είναι μικρή και το αντικείμενο αναφέρεται ως "μαύρο".

Εάν θέλετε να μετρήσετε το χρώμα των αντικειμένων που εκπέμπουν φως, θα πρέπει να απενεργοποιήσετε το LED στο ξεμπλοκάρισμα συνδέοντας τη θύρα "LED" στο ξεμπλοκάρισμα με το "Ground". Τώρα ορίστε τις τιμές κανονικοποίησης ανάλογα.

Ένα άλλο γενικό πρόβλημα είναι ο φωτισμός του αντικειμένου. Το ζεστό λευκό LED στο ξεμπλοκάρισμα εκπέμπει ένα μη συνεχές φάσμα φωτός. Επομένως, ορισμένα χρώματα ενδέχεται να υπερεκπροσωπούνται ή να υποεκπροσωπούνται στο φάσμα RGB. Για περισσότερες πληροφορίες σχετικά με αυτό το θέμα, παρακαλώ ρίξτε μια ματιά στις προηγούμενες οδηγίες μου σχετικά με ένα χρωτόμετρο/ φωτόμετρο και φασματόμετρο:

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

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

Βήμα 3: Ο κώδικας

Ο κώδικας
Ο κώδικας

Ο κωδικός είναι ένας συνδυασμός μιας τροποποίησης ενός κώδικα από το φωνητικό εγχειρίδιο AIY και του κωδικού αισθητήρα TCS34725 από τον Bradspi.

Είχα επίσης προσπαθήσει να χρησιμοποιήσω τον κώδικα python TCS34725 από το Adafruit, αλλά αντιμετώπισα προβλήματα με αυτόν και μερικούς άλλους κωδικούς που χρησιμοποιούν εξωτερικές βιβλιοθήκες σε συνδυασμό με το AIY HAT. Οποιαδήποτε βοήθεια ευπρόσδεκτη.

Όπως αναφέρθηκε προηγουμένως, ο σχολιασμός χρώματος βασίζεται σε έναν μετασχηματισμό των τιμών RGB σε απόχρωση. Πρέπει να ορίσετε ρυθμίσεις κανονικοποίησης βάσει πειραματικών μετρήσεων λευκών και μαύρων υλικών ευλάβειας. Συμπληρώστε τις απόλυτες τιμές για R, G και B min ή max αντίστοιχα.

Το σενάριο χρησιμοποιεί μια νέα έκδοση της εντολής "say" που επιτρέπει τη ρύθμιση της έντασης και της έντασης. Σε περίπτωση, ίσως χρειαστεί να ενημερώσετε τα αρχεία προγράμματος οδήγησης audio.py και tty ή να διαγράψετε τα "μέρη έντασης και έντασης" από το σενάριο.

#!/usr/bin/env python3 # Αυτό το σενάριο είναι μια προσαρμογή του servo_demo.py σεναρίου για το AIY voice HAT, # βελτιστοποιημένο για την αναγνώριση χρωμάτων μέσω της εισαγωγής breakout του Afafruit TCS34725 aiy.audio import aiy.cloudspeech import aiy.voicehat # από LED εισαγωγής gpiozero # θα μπορούσε να είναι χρήσιμο για εξωτερική λυχνία LED σε σερβο-θύρα # από κουμπί εισαγωγής gpiozero # θα μπορούσε να είναι χρήσιμη για εξωτερικό κουμπί σε ώρα εισαγωγής σερβο-θύρας εισαγωγή smbus bus = smbus. SMBus (1) εισαγωγή colorsys def hue2color (απόχρωση): # ερμηνεία χρώματος με βάση τις υπολογισμένες τιμές απόχρωσης εάν ((απόχρωση> 12) και (απόχρωση 25) και (απόχρωση 69) και (απόχρωση 164) και (απόχρωση 194) και (απόχρωση 269) και (απόχρωση 319) ή (απόχρωση <20)): χρώμα = "κόκκινο" επιστρέφει χρώμα άλλο: εκτύπωση ("κάτι πήγε στραβά")

def tcs34725 (): # μέτρηση και ερμηνεία.

# Η μέτρηση πραγματοποιείται με το σενάριο Bradspi TCS34725: # https://bradsrpi.blogspot.com/2013/05/tcs34725-rg… bus.write_byte (0x29, 0x80 | 0x12) ver = bus.read_byte (0x29) # έκδοση # θα πρέπει να είναι 0x44 εάν ver == 0x44: print ("Device found / n") bus.write_byte (0x29, 0x80 | 0x00) # 0x00 = ΕΝΕΡΓΟΠΟΙΗΣΗ εγγραφής bus.write_byte (0x29, 0x01 | 0x02) # 0x01 = Ενεργοποίηση, 0x02 αισθητήρες RGB ενεργοποιημένοι bus.write_byte (0x29, 0x80 | 0x14) # Τα αποτελέσματα ανάγνωσης ξεκινούν την εγγραφή 14, LSB και μετά MSB data = bus.read_i2c_block_data (0x29, 0) clear = clear = data [1] << 8 | δεδομένα [0] κόκκινο = δεδομένα [3] << 8 | δεδομένα [2] πράσινο = δεδομένα [5] << 8 | δεδομένα [4] μπλε = δεδομένα [7] << 8 | δεδομένα [6] crgb = "Απόλυτοι μετρήσεις: C: %s, R: %s, G: %s, B: %s / n" %(διαυγής, κόκκινος, πράσινος, μπλε) εκτύπωση (crgb) time.sleep (1) else: print ("Η συσκευή δεν βρέθηκε / n") # κανονικοποίηση και μετατροπή των μετρημένων τιμών RGBW col = "" # Μέγιστες τιμές Οι συντελεστές κανονικοποίησης, πρέπει να καθοριστούν πειραματικά # π.χ. έναντι ενός λευκού φύλλου χαρτιού. Ελέγξτε και διορθώστε κατά καιρούς. max_bright = 5750 max_red = 1930 max_green = 2095 max_blue = 1980 # Ιστορικό/Ελάχιστες τιμές συντελεστές εξομάλυνσης, πρέπει να ορίζονται πειραματικά # π.χ. έναντι μαύρου φύλλου χαρτιού. Ελέγξτε και διορθώστε κατά καιρούς. min_bright = 750 min_red = 340 min_green = 245 min_blue = 225 # κανονικοποιημένες τιμές, μεταξύ 0 και 1 rel_bright = ((καθαρό - min_bright)/(max_bright - min_bright)) rel_red = ((κόκκινο - min_red)/(max_red - min_red)) rel_green = ((πράσινο - min_green)/(max_green - min_green)) rel_blue = ((μπλε - min_blue)/(max_blue - min_blue)) hsv_col = colorsys.rgb_to_hsv (rel_red, rel_green, rel_blv_ 35) 9 hue = αν rel_bright> 0.9: col = "white" # αν είναι πολύ φωτεινό -> λευκό elif rel_bright μαύρο else: col = hue2color (απόχρωση) # επιλογή χρώματος με τιμές απόχρωσης # print ("σχετικές τιμές φωτεινό, κόκκινο, πράσινο, μπλε:") # print (rel_bright, rel_red, rel_green, rel_blue) # print ("HSV values (hue, saturation, value):", hsv_col) # print ("hue in °", hue) return [col, rel_bright, rel_red, rel_green, rel_blue, απόχρωση]

def main ():

κουμπί = aiy.voicehat.get_button () # αλλαγή Κατάσταση κουμπιού led = aiy.voicehat.get_led () # αλλαγή Κουμπί-κατάσταση LED aiy.audio.get_recorder (). Έναρξη () # buttoni = Κουμπί (5) # αισθητήρας απόστασης ή άλλο εξωτερικό κουμπί, συνδεδεμένο στο servo3/GPIO 05

aiy.audio.say ("Hello!",, volume = 50, pitch = 100) # ένταση και κλίση απαιτούν αναθεώρηση Νοεμβρίου 2017 του προγράμματος οδήγησης audio.py και _tty.py!

aiy. ") ενώ True: led.set_state (aiy.voicehat. LED. ON) button.wait_for_press () # για εξωτερικό κουμπί, αντικαταστήστε το κουμπί με buttoni led.set_state (aiy.voicehat. LED. BLINK) aiy.audio.say (" Μέτρηση ",, όγκος = 50, pitch = 100) αποτέλεσμα = tcs34725 () # προκαλεί μέτρηση και ερμηνεία col = αποτέλεσμα [0] # χρώμα, ως απόχρωση κειμένου = str (int (αποτέλεσμα [5])) # απόχρωση σε °, ως κείμενο r_red = str (int (αποτέλεσμα [2]*255)) # Τιμή R, ως κείμενο r_green = str (int (αποτέλεσμα [3]*255)) # τιμή G, ως κείμενο r_blue = str (int (αποτέλεσμα [4]*255)) # B τιμή, ως κείμενο r_bright = str (int (αποτέλεσμα [1]*100)) # W τιμή, ως κείμενο led.set_state (aiy.voicehat. LED. OFF) αν col == "white "ή col ==" black ": bright =" "elif (αποτέλεσμα [1]> 0.69): #φωτεινότητα/φωτεινότητα χρώματος bright =" light "elif (αποτέλεσμα [1] <0.25): bright =" σκοτεινό "άλλο: bright = "medium" # communing t προκύπτει color_text = ("Το χρώμα του αντικειμένου είναι" + φωτεινό + "" + col) εκτύπωση (color_text) aiy.audio.say (color_text,, volume = 75, pitch = 100) hue_text = ("Η τιμή της απόχρωσης είναι "+ απόχρωση+" μοίρες ") εκτύπωση (hue_text) aiy.audio.say (hue_text,, volume = 75, pitch = 100)

αν _name_ == '_main_': main ()

Βήμα 4: Μερικοί σύνδεσμοι και παρατηρήσεις

Μπορείτε να βρείτε το φύλλο δεδομένων αισθητήρα TCS34725 εδώ:

Ο κώδικας για την ανάγνωση του αισθητήρα που χρησιμοποίησα περιγράφτηκε εδώ:

Μπορείτε να βρείτε μερικές πρόσθετες πληροφορίες σχετικά με τις μετρήσεις χρώματος με αυτόν και έναν άλλο αισθητήρα στις προηγούμενες οδηγίες μου:

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

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