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

مبتدئ

image_pdf

المقدمة

حساس الألوان

تستخدم مستشعرات الألوان في العديد من الصناعات مثل الصناعات الغذائية والمشروبات والسيارات، لأغراض مختلفة مثل اكتشاف اللون أو التحقق من الخطوات في عملية التصنيع. يمكن أن تستخدم حساس الألوان لتطبيقات مختلفة في هذا الدرس سنتعلم توصيل الأردوينو و برمجته مع حساس الألوان و محرك السيرفو بحيث يتمكن الأردوينو من التعرف على ألوان قطع الحلوى وتوزيعها حسب لونها في علب مختلفة

المواد والأدوات

اردوينو

1X اردوينو 

حساس الألوان

1X سلك A-B USB 

حساس الألوان

1X حساس الألوان 

محرك سيرفو

2 X محرك السيرفو 

اسلاك توصيل

مجموعة أسلاك توصيل (ذكر / ذكر)

اسلاك توصيل

مجموعة أسلاك توصيل (أنثى/ ذكر)

حساس الألوان (ألواح أكليريك)

1 X لوح أكليريك ( ملم 3*600*600)

طابعة ثلاثية الأبعاد

طابعة ثلاثية الأبعاد 

حساس الألوان خيوط طباعة

1X خيط الطباعة 

arduino-automatic-candy-dispenser-machine

1× لوحة تجارب حجم صغير

حساس الألوان

 يتكون الضوء الأبيض من ثلاثة ألوان أساسية (الأحمر والأخضر والأزرق)، والتي لها أطوال موجية مختلفة. تتحد هذه الألوان مع بعضها البعض لتشكيل الألوان المختلفة. عندما يسقط الضوء الأبيض على سطح أي جسم، يمتص الجسم جزء من الطول الموجي ويعكس جزء آخر حسب خصائص السطح. وبالتالي اللون الذي نراه هو نتيجة انعكاس الأطوال الموجية.

حساس الألوان
و بناء على هذا يعمل حساس الألوان حيث أنه يحول شدة الضوء الطول الموجي المنعكس من الأجسام إلى تردد، و يتكون حساس الألوان من مصدر ضوء (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;
}
X
Product added to the cart