Практична робота №6

Тема: Робота з датчиком визначення кольору

 

         В даній практичній роботі ми розглянемо роботу датчика визначення кольору за допомогою Arduino. На приклад по транспортеру рухаються штучні вироби різних кольорів. За допомогою програми описаної в даній практичній роботі ми можемо відсортовувати вироби по кольорах, за допомогою сервоприводу вироби будуть переміщуватися по транспортеру в необхідне положення.

Необхідне обладнання:

·       Arduino;

·       RGB світлодіод;

·       Два резистори номіналом 51Ом, 1 резистор 120Ом, і 1 резистор 120кОм;

·       Макетна плата;

·       Сервопривод.

Біле світло складається з усіх кольорів веселки. Коли світло падає на поверхню, деякі кольори поглинаються, а деякі відбиваються. Відбиті кольори - це кольори які сприймаються нами.

Для вимірювання та визначення кількості кольору за допомогою електронної схеми, вам необхідно виміряти інтенсивність різних довжин хвиль світла, відбитого від поверхні. Найпростіший спосіб зробити це - висвітлити одним кольором світла поверхню за один раз, потім виміряти загальну інтенсивність відбитого світла.

Як мінімум, необхідно використовувати кожен первинний колір світла (червоний, синій і зелений). Тому датчик базового кольору матиме червоний, синій і зелений світлодіоди, і світлочутливий датчик, такий як фоторезистор. Вимірюючи відбите світло для кожного кольору можна обчислити колір об'єкта.

http://cxem.net/arduino/images/arduino135-3.jpg

http://cxem.net/arduino/images/arduino135-4.jpg

 

Датчик кольору має два основних компоненти - світлодіоди, які випромінюють червоний, синій і зелений світло, а також світлочутливий датчик, який визначає інтенсивність світла.

Для світлодіодів  використовуємо RGB світлодіод, який випромінює всі три кольори. Зазвичай, це чотири світлодіода в одному. У ньому чотири виведення, і кожен колір має свій власний вихід для катода (негативний). Четвертий вихід - загальний анод (позитивний) для всіх трьох світлодіодів.

В якості світлочутливого датчика використовуємо фоторезистор (світлочутливий резистор). Він змінює свій опір залежно від кількості світла, що потрапляє на його лицьову сторону.

Щоб використовувати ці компоненти в якості датчика кольору, необхідно з'єднати пару резисторів і дротів. Світлодіод кожного кольору потребує свого номіналу резистора, щоб забезпечити падіння напруги до необхідного рівня. Використаємо резистор номіналом 51 Ом для синього, ще один резистор 51 Ом для зеленого і резистор 120 Ом для червоного. Для фоторезистора також потрібен резистор, щоб зробити дільник напруги і виміряти напругу на виході датчика. Номінал цього резистора буде залежати від типу використовуваного фоторезистора, ми використаємо резистор номіналом 100 кОм.

http://cxem.net/arduino/images/arduino135-9.jpg

Тепер під’єднуємо датчик до Arduino. Спочатку підключіть три катодних виходи світлодіода до цифрових пінів 8, 9 і 10. Потім підключіть загальний анод світлодіода до піну 5В.

Далі підключіть світлочутливий датчик. Підключіть вільний пін фоторезистора до піну GND. Підключіть вільний вихід постійного резистора до піну 5В. І, нарешті, підключіть центральний вихід між двома резисторами до аналогового вхідного піну 0.

 

Під’єднуємо сервопривод безпосередньо до Arduino. Для цього спочатку підключіть коричневий провід на серводвигуні до піну GND на Arduino. Потім підключіть червоний провід на серводвигуні до піну 5В на Arduino, підключіть помаранчевий провід на серводвигуні до цифрового піну 6 на Arduino.

 

Код:

include Servo myservo; // Підключаємо бібліотеку сервоприводу

 

int GreenLedPin = 8; // Зелений світлодіод на пін 8

int RedLedPin = 9; // червоний світлодіод на пін 9

int BlueLedPin = 10; // синій світлодіод на пін 10

 

int analogPin = 0; // фоторезистор на пін  0

int GreenVal = 0; // перемінна для зберігання значення зеленого кольору

int RedVal = 0; // перемінна для зберігання значення червоного кольору

int BlueVal = 0; // перемінна для зберігання значення синього кольору

 

int GreenRedDifference = 0;

int GreenBlueDifference = 0;

 

int GreenRedLockCode = -31; // значення червоного

int GreenBlueLockCode = 47; // значення синього

 

int sensitivity = 5; // встановимо чутливість сенсору

 

void setup() {

 

myservo.attach(6); // прив’язуємо сервопривід до 6 піну

 

Serial.begin(9600); // запускаємо серійний порт

  pinMode(GreenLedPin, OUTPUT); // встановимо цифрові піни як виходи

  pinMode(RedLedPin, OUTPUT); // встановимо цифрові піни як виходи

  pinMode(BlueLedPin, OUTPUT); // встановимо цифрові піни як виходи

}

}

 

void loop() {

         delay(1000);

         digitalWrite(GreenLedPin, HIGH); // включимо зелений світлодіод

         digitalWrite(RedLedPin, HIGH); // включимо червоний світлодіод

         digitalWrite(BlueLedPin, HIGH); // включимо синій світлодіод

         delay(1000); // затримка 1с.

         digitalWrite(GreenLedPin, LOW); // вимкнемо зелений світлодіод

         delay(100);

         GreenVal = 1023 - analogRead(analogPin); // зчитуємо вхідний пін

         Serial.println();

         Serial.print("Green ");

         Serial.println(GreenVal);

         digitalWrite(GreenLedPin, HIGH); // включимо зелений світлодіод

         delay(1000); // затримка 1с.

        

         digitalWrite(RedLedPin, LOW); // вимкнемо червоний світлодіод

         delay(100);

         RedVal = 1023 - analogRead(analogPin); // зчитуємо вхідний пін

         Serial.print("Red ");

         Serial.println(RedVal);

         delay(1000); // затримка 1с.

         digitalWrite(RedLedPin, HIGH); // увімкнемо червоний світлодіод

         delay(1000); // затримка 1с.

        

         digitalWrite(BlueLedPin, LOW); // вимкнемо синій світлодіод

         delay(100);

         BlueVal = 1023 - analogRead(analogPin); // зчитуємо вхідний пін

         Serial.print("Blue ");

         Serial.println(BlueVal);

         elay(1000); // затримка 1с.

         digitalWrite(BlueLedPin, HIGH); // увімкнемо синій світлодіод

        

         GreenRedDifference = GreenVal - RedVal;

         Serial.print("Green-Red Difference ");

         Serial.println(GreenRedDifference);

         GreenBlueDifference = GreenVal - BlueVal;

         Serial.print("Green-Blue Difference ");

         Serial.println(GreenBlueDifference);

        

         if((abs(GreenRedLockCode-GreenRedDifference) < sensitivity) && (abs(GreenBlueLockCode-GreenBlueDifference) < sensitivity)) //compare measured color value to code value {     Serial.println("Unlock"); // переміщуємо сервопривід

                   myservo.write(45); }

         else {

                   Serial.println("Lock"); // lock the box myservo.write(135);

         }

        

         delay(2000);

}