جهاز تصنيف الألوان باستخدام الاردوينو

مبتدئ

image_pdf

الشفرة البرمجية

#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;
}
X
تم إضافة المنتج إلى السلة بنجاح