المقدمة
تستخدم مستشعرات الألوان في العديد من الصناعات مثل الصناعات الغذائية والمشروبات والسيارات، لأغراض مختلفة مثل اكتشاف اللون أو التحقق من الخطوات في عملية التصنيع. يمكن أن تستخدم حساس الألوان لتطبيقات مختلفة في هذا الدرس سنتعلم توصيل الأردوينو و برمجته مع حساس الألوان و محرك السيرفو بحيث يتمكن الأردوينو من التعرف على ألوان قطع الحلوى وتوزيعها حسب لونها في علب مختلفة
المواد والأدوات
مجموعة أسلاك توصيل (ذكر / ذكر)
مجموعة أسلاك توصيل (أنثى/ ذكر)
1 X لوح أكليريك ( ملم 3*600*600)
حساس الألوان
يتكون الضوء الأبيض من ثلاثة ألوان أساسية (الأحمر والأخضر والأزرق)، والتي لها أطوال موجية مختلفة. تتحد هذه الألوان مع بعضها البعض لتشكيل الألوان المختلفة. عندما يسقط الضوء الأبيض على سطح أي جسم، يمتص الجسم جزء من الطول الموجي ويعكس جزء آخر حسب خصائص السطح. وبالتالي اللون الذي نراه هو نتيجة انعكاس الأطوال الموجية.
و بناء على هذا يعمل حساس الألوان حيث أنه يحول شدة الضوء الطول الموجي المنعكس من الأجسام إلى تردد، و يتكون حساس الألوان من مصدر ضوء (LED) أبيض يضيء عند تشغيل الوحدة ويستخدم لإضاءة الكائن الذي يتم استشعاره ثم وحدة استشعار اللون TCS230 وهي عبارة عن شبكة 8*8 من الصمامات الثنائية الضوئية مغطاة بمرشح حساس للألوان بحيث تكون 16 صمامًا ضوئيًا عليه مرشحات حمراء ، و 16 صمامًا ضوئيًا عليه مرشحات خضراء ، و 16 صمامًا ضوئيًا عليه مرشحات زرقاء ، و 16 صمامًا ضوئيًا متبقيًا بدون مرشحات.
تمكنك دبابيس التحكم S2 وS3 من اختيار أي من الصمامات تريد قراءته. على سبيل المثال، إذا كنت ترغب في اكتشاف اللون الأحمر فقط، فيمكنك تحديد 16 صمامًا ضوئيًا عليه المرشح باللون الأحمر عن طريق ضبط دبابيس التحكم S2 وS3 على LOW وفقًا للجدول.
photodiodes | S3 | S2 |
احمر | LOW | LOW |
ازرق | HIGH | LOW |
اخضر | HIGH | HIGH |
بدون لون | LOW | HIGH |
توصيل الدائرة
الاردوينو | حساس الألوان |
2 | S0 |
3 | S1 |
4 | S2 |
5 | S3 |
6 | OUT |
5V | VCC |
GND | GUN |
الهيكل
توجد تقنيات متعدده ممكن أن تساعدك على بناء الهيكل المناسب، يمكن أن تكون قاطع الليزر أو جهاز التفريز و غيرها يمكنك تحميل الهيكل من خلال الرابط
و تحتاج إلى تحميل القطع ثلاثية الأبعاد التي تم استخدامها بالمشروع من خلال الرابط
الشفرة البرمجية
#include <Servo.h> #define S0 2 #define S1 3 #define S2 4 #define S3 5 #define sensorOut 6 Servo topServo; Servo bottomServo; int frequency = 0; int color=0; void setup() { pinMode(S0, OUTPUT); pinMode(S1, OUTPUT); pinMode(S2, OUTPUT); pinMode(S3, OUTPUT); pinMode(sensorOut, INPUT); digitalWrite(S0, HIGH); digitalWrite(S1, LOW); topServo.attach(9); bottomServo.attach(10); Serial.begin(9600); } void loop() { topServo.write(115); delay(500); for(int i = 115; i > 35; i--) { topServo.write(i); delay(4); } delay(1000); color = readColor(); delay(10); switch (color) { case 1: bottomServo.write(50); break; case 2: bottomServo.write(90); break; case 3: bottomServo.write(120); break; } delay(300); for(int i = 35; i > 4; i--) { topServo.write(i); delay(2); } delay(200); for(int i = 4; i < 115; i++) { topServo.write(i); delay(2); } color=0; } int readColor() { // Setting red filtered photodiodes to be read digitalWrite(S2, LOW); digitalWrite(S3, LOW); // Reading the output frequency frequency = pulseIn(sensorOut, LOW); int R = frequency; // Printing the value on the serial monitor Serial.print("R= ");//printing name Serial.print(frequency);//printing RED color frequency Serial.print(" "); delay(50); // Setting Green filtered photodiodes to be read digitalWrite(S2, HIGH); digitalWrite(S3, HIGH); // Reading the output frequency frequency = pulseIn(sensorOut, LOW); int G = frequency; // Printing the value on the serial monitor Serial.print("G= ");//printing name Serial.print(frequency);//printing RED color frequency Serial.print(" "); delay(50); // Setting Blue filtered photodiodes to be read digitalWrite(S2, LOW); digitalWrite(S3, HIGH); // Reading the output frequency frequency = pulseIn(sensorOut, LOW); int B = frequency; // Printing the value on the serial monitor Serial.print("B= ");//printing name Serial.print(frequency);//printing RED color frequency Serial.println(" "); delay(50); if(R<50 & R>46 & B<92 & B>80){ color = 1; // Red } if(G<89 & G>80 & B<96 & B>105){ color = 2; // Yellow } if(G<89 & G>80 & B<97 &B>93){ color = 3; // Orange } return color; }
شرح الشفرة البرمجية
في بداية سيتم استعداء مكتبة محرك السيرفو ثم نقوم بتعريف منافذ حساس الألوان وتعريف محرك السيرفو
#include <Servo.h> #define S0 2 #define S1 3 #define S2 4 #define S3 5 #define sensorOut 6 Servo topServo; Servo bottomServo;
انشاء متغيرين للتردد و اللون و تكون بالبداية قيمة 0
int frequency = 0; int color=0;
نحدد منافذ الدخل و الخرج في حساس الألوان
void setup() { pinMode(S0, OUTPUT); pinMode(S1, OUTPUT); pinMode(S2, OUTPUT); pinMode(S3, OUTPUT); pinMode(sensorOut, INPUT);
لتحديد عامل تحجيم التردد 20%
digitalWrite(S0, HIGH); digitalWrite(S1, LOW);
نحدد المنفذ المتصل مع كل محرك سيرفو
topServo.attach(9); bottomServo.attach(10);
لتحديد معدل نقل البيانات من الاردوينو إلى اللابتوب
Serial.begin(9600); }
سوف نحتاج إلى تحريك المحرك الأول في ثلاث زاوية الزاوية الأولى حتى يأخذ قطعة حلوى واحدة ثم ينقلها للزاوية الصانية و تكون الزاوية الموافقة لموقع الحساس و يتم قراءة تردد اللون ثم الزاوية الثالثة لنقل قطعة الحلوى إلى المحرك التالي
أولا الزاوية الأولى نحددها بقية 115
void loop() { topServo.write(115); delay(500);
نعرف متغير (i) والذي يمثل قيمة الزاوية تتناقص قيمة (i) إلى أن تصل إلى 35 و التي تعد زاوية قراءة التردد
for(int i = 115; i > 35; i--) { topServo.write(i); delay(4); } delay(1000);
نحدد 3 زواية مختلفة لمحرك السيرفو الثاني حسب موقع الكوب الذي سنفصل فيه قطع الحلوى حسب لونها
color = readColor(); delay(10); switch (color) { case 1: bottomServo.write(50); break; case 2: bottomServo.write(90); break; case 3: bottomServo.write(120); break; } delay(300);
نغير قيمة الزاوية (i) الى 4 والتي تمثل موقع نقل قطعة الحلوى إلى المحرك الثاني
for(int i = 35; i > 4; i--) { topServo.write(i); delay(2); } delay(200);
نعيد قيمة (i) إلى 115 و هي أول زاوية و يتم عندها أخذ قطعة حلوى جديدة
for(int i = 4; i < 115; i++) { topServo.write(i); delay(2); } color=0; }
انشاء متغير باسم (readColor) لقراءة الألوان
int readColor() {
لقراءة اللون الأحمر نفعل الصمام الثنائي الضوئي المرشح باللون الأحمر عن طريق جعل قيمة s2 و s3 loW
digitalWrite(S2, LOW); digitalWrite(S3, LOW);
لقراءة قيمة التردد و طباعته على شاشة العرض
frequency = pulseIn(sensorOut, LOW); int R = frequency; // Printing the value on the serial monitor Serial.print("R= ");//printing name Serial.print(frequency);//printing RED color frequency Serial.print(" "); delay(50);
لقراءة اللون الأخضر نفعل الصمام الثنائي الضوئي المرشح باللون الأخضر عن طريق جعل قيمة s2 و s3 HIGH
digitalWrite(S2, HIGH); digitalWrite(S3, HIGH);
لقراءة قيمة التردد و طباعته على شاشة العرض
frequency = pulseIn(sensorOut, LOW); int G = frequency; // Printing the value on the serial monitor Serial.print("G= ");//printing name Serial.print(frequency);//printing RED color frequency Serial.print(" "); delay(50);
لقراءة اللون الأزرق نفعل الصمام الثنائي الضوئي المرشح باللون الأزرق عن طريق جعل قيمة S2 LOW و S3 HIGH
digitalWrite(S2, LOW); digitalWrite(S3, HIGH);
لقراءة قيمة التردد و طباعته على شاشة العرض
frequency = pulseIn(sensorOut, LOW); int B = frequency; // Printing the value on the serial monitor Serial.print("B= ");//printing name Serial.print(frequency);//printing RED color frequency Serial.println(" "); delay(50);
نحدد نطاق اللون لكل قطعة حلوى حسب التي تم قراءة في شاشة العرض ثم نحدد الزاوية التي يتجة لها محرك السيرفو الثاني
if(R<50 & R>46 & B<92 & B>80){ color = 1; // Red } if(G<89 & G>80 & B<96 & B>105){ color = 2; // Yellow } if(G<89 & G>80 & B<97 &B>93){ color = 3; // Orange } return color; }