
Ένας από τους πλέον ασυνήθιστους αισθητήρες του οικοσυστήματος αισθητήρων της Polytech, είναι ο AJS09 (αισθητήρας ανίχνευσης χρώματος). Η εταιρία δίνει πληροφορίες σε [αυτή] τη σελίδα. Διαβάζοντας τα παραπάνω, περιμένει κανείς ότι είναι ένας αισθητήρας TCS34725. Έλα όμως που τελικά δεν είναι…
Αρχικά το πράσινο χρώμα υποδεικνύει επικοινωνία I2C με το Arduino και φύσικα σύνδεση στην αντίστοιχη θύρα του S1. Προδοκώντας να τον εντάξω στα blocks [s1-extensions], αρχικά δοκίμασα τη βιβλιοθήκη [Adafruit_TCS34725]. Καμία τύχη. Παρόλο που μόλις συνδέεται στην I2C ανάβει ένα λευκό led, που υποδυκνύει ότι τροφοδοτείται κανονικά, είναι αδύνατος ο εντοπισμός του στη διεύθυνση 0x29 που θα έπρεπε κανονικά να έχει. Ένα I2C scanner sketch εντοπίζει κάτι στην 0x10. Με τη βοήθεια του AI και μετά από κάποιες αποτυχημένες δοκιμές, κατέληξα στον αισθητήρα VEML6040 οι I2C υλοποιήσεις του οποίου χρησιμοποιούν την I2C διεύθυνση 0x10. Arduino βιβλιοθήκη [εδώ].
Ο αισθητήρας λειτούργησε αμέσως και διάβασε το χρώμα σε μια σειρά lego τουβλάκια. Τέλεια ακρίβεια δεν μπορείς να πεις ότι έχει, σαφώς ο αισθητήρας χρώματος του κιτ Lego Spike είναι πολύ αποτελεσματικότερος, αλλά σε ένα περιβάλλον ελεγχόμενου φωτισμού και με τις κατάλληλες ρυθμίσεις μπορεί να κάνει τη δουλειά με αξιοπρέπεια και μάλιστα δωρεάν 🙂
Η παραπάνω βιβλιοθήκη δίνει ως έξοδο τις παρακάτω 5 τιμές:
- Συνιστώσες χρώματικές Red, Green, Blue μέσω των μεθόδων getRed(), getGreen() και getBlue()
- Συσχετισμένη θερμοκρασία χρώματος μέσω της μεθόδου getCCT()
- Περιβαλλοντικό φως μετρημένο σε Lux μέσω της μεθόδου getAmbientLight()
Η απόσταση του αντικειμένου από τον αισθητήρα πρέπει να είναι περίπου στα 0,5 εκατοστά.
Ζήτησα από το [claude] να μου ετοιμάσει μια συνάρτηση μετατροπής των παραπάνω τιμών σε λεκτικές τιμές χρωμάτων και μου έδωσε το παρακάτω.
uint16_t red = sensor.getRed();
uint16_t green = sensor.getGreen();
uint16_t blue = sensor.getBlue();
uint16_t maxVal = max(r, max(g, b));
uint16_t minVal = min(r, min(g, b));
if (maxVal < 200) return "BLACK";
if (minVal > 500 && (maxVal - minVal) < 100) return "WHITE";
if (r > g && r > b) {
return (r > g * 1.3) ? "RED" : "YELLOW";
}
else if (g > r && g > b) {
return (g > r * 1.3) ? "GREEN" : "YELLOW";
}
else if (b > r && b > g) {
return (b > g * 1.2) ? "BLUE" : "CYAN";
}
return "UNKNOWN";
Η ενσωμάτωση στο [s1-extensions], ώστε να μπορεί να χρησιμοποιηθεί σε έργα Mind+, εντός των επόμενων ημερών.
Καλή διασκέδαση!