Практична
робота №6
Тема:
Робота з датчиком визначення кольору
В даній практичній роботі ми
розглянемо роботу датчика визначення кольору за допомогою Arduino.
На приклад по транспортеру рухаються штучні вироби різних кольорів. За
допомогою програми описаної в даній практичній роботі ми можемо відсортовувати
вироби по кольорах, за допомогою сервоприводу вироби
будуть переміщуватися по транспортеру в необхідне положення.
Необхідне
обладнання:
· Arduino;
· RGB світлодіод;
· Два резистори номіналом 51Ом, 1 резистор 120Ом, і 1 резистор 120кОм;
· Макетна
плата;
· Сервопривод.
Біле
світло складається з усіх кольорів веселки. Коли світло падає на поверхню,
деякі кольори поглинаються, а деякі відбиваються. Відбиті кольори - це кольори які
сприймаються нами.
Для
вимірювання та визначення кількості кольору за допомогою електронної схеми, вам
необхідно виміряти інтенсивність різних довжин хвиль світла, відбитого від
поверхні. Найпростіший спосіб зробити це - висвітлити одним кольором світла
поверхню за один раз, потім виміряти загальну інтенсивність відбитого світла.
Як
мінімум, необхідно використовувати кожен первинний колір світла (червоний,
синій і зелений). Тому датчик базового кольору матиме червоний, синій і зелений
світлодіоди, і світлочутливий датчик, такий як фоторезистор.
Вимірюючи відбите світло для кожного кольору можна обчислити колір об'єкта.
Датчик
кольору має два основних компоненти - світлодіоди, які випромінюють червоний,
синій і зелений світло, а також світлочутливий датчик, який визначає
інтенсивність світла.
Для
світлодіодів використовуємо RGB світлодіод, який
випромінює всі три кольори. Зазвичай, це чотири світлодіода
в одному. У ньому чотири виведення, і кожен колір має свій власний вихід для
катода (негативний). Четвертий вихід - загальний анод (позитивний) для всіх
трьох світлодіодів.
В
якості світлочутливого датчика використовуємо фоторезистор
(світлочутливий резистор). Він змінює свій опір залежно від кількості світла,
що потрапляє на його лицьову сторону.
Щоб
використовувати ці компоненти в якості датчика кольору, необхідно з'єднати пару
резисторів і дротів. Світлодіод кожного кольору потребує свого номіналу резистора,
щоб забезпечити падіння напруги до необхідного рівня. Використаємо резистор
номіналом 51 Ом для синього, ще один резистор 51 Ом для зеленого і резистор 120 Ом
для червоного. Для фоторезистора також потрібен
резистор, щоб зробити дільник напруги і виміряти напругу на виході датчика.
Номінал цього резистора буде залежати від типу використовуваного фоторезистора, ми використаємо резистор номіналом 100 кОм.
Тепер під’єднуємо датчик до 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);
}