חיישן שמסוגל לזהות צבע על ידי פוטו-דיודות שנותנות ערכים של אדום, ירוק, כחול.
- מתח עבודה: 3V-5V
- זיהוי צבע עד טווח של כמה סנטימטרים, טווח אופטימלי 1 ס"מ
- חיישן: TCS3200
- טוב לפרויקטים בסיסיים של חישת צבע
הסבר הפעלה:
החיישן נותן ערכים גולמיים ומושפע מאוד מתאורת החדר לכן זה די מסובך לפרש אותם אבל אפשר לבצע זיהוי בסיסי.
S0,S1 שולטים ברמת הסקאלה של הנתונים. S2,S3 קובעים את הפילטר של אדום ירוק או כחול, אפשר רק צבע אחד בכל קריאה. OUT מוציא אות דיגיטלי לפי הערך וארדואינו מקבל אותו כפלט. הערכים הגולמיים אינם ב- 0 עד 255 לכן צריך לעשות להם מיפוי לפי תנאי החדר והצבע.
הנה קוד שעבד אצלי אבל צריך לכייל אותו כל פעם מחדש לפי תנאי החדר וצבע העצם שמנסים לזהות.
int red = 0; int green = 0; int blue = 0; void setup() { // Setting the rgb led outputs pinMode(9, OUTPUT); pinMode(10, OUTPUT); pinMode(11, OUTPUT); pinMode(S0, OUTPUT); // pin 4 pinMode(S1, OUTPUT); // pin 5 pinMode(S2, OUTPUT); // pin 6 pinMode(S3, OUTPUT); // pin 7 pinMode(8, INPUT); // out pin // Setting frequency scaling digitalWrite(S0,HIGH); digitalWrite(S1,LOW); // Begins serial communication Serial.begin(9600); } void loop() { // Setting RED (R) filtered photodiodes to be read digitalWrite(S2,LOW); digitalWrite(S3,LOW); // Reading the output frequency red = pulseIn(8, LOW); red = map(red, 84, 43, 0, 255); // Printing the RED (R) value Serial.print("R = "); Serial.print(red); // Setting GREEN (G) filtered photodiodes to be read digitalWrite(S2,HIGH); digitalWrite(S3,HIGH); // Reading the output frequency green = pulseIn(sensorOut, LOW); green = map(green, 132, 62, 0, 255); // Printing the GREEN (G) value Serial.print(" G = "); Serial.print(green); // Setting BLUE (B) filtered photodiodes to be read digitalWrite(S2,LOW); digitalWrite(S3,HIGH); // Reading the output frequency blue = pulseIn(sensorOut, LOW); blue = map(blue, 44, 33, 0, 255); // Printing the BLUE (B) value Serial.print(" B = "); Serial.println(blue); if(blue > 200){ if(green > 100){ digitalWrite(10, HIGH); delay(5000); digitalWrite(10, LOW); } else if(red > 100){ digitalWrite(9, HIGH); delay(5000); digitalWrite(9, LOW); } else{ digitalWrite(11, HIGH); delay(5000); digitalWrite(11, LOW); } } delay(1000); }