الشفرة البرمجية
#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; }