8 (800) 350-30-16

Датчик цвета. Подключение к Arduino

Дата: / Категория: Светодиоды / Автор: DOC_tr

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

А теперь немного про его подключение. В отличии от многих датчиков, для подключения нам потребуются все ноги (8 проводов папа-мама).

Подключаем его по следующей схеме:

Конечно, подключить так, как на схеме, не получится, так как датчик просто не встанет на макетную плату, поэтому он у меня во время сборки и экспериментов болтался в воздухе примерно так:

Так как библиотеку для этого дела я не нашел, нам придется считывать все сигналы ручками:

int s0 = 8; 
int s1 = 9;
int s2 = 12;
int s3 = 11;
int out = 10;
int red = 0;
int green = 0;
int blue = 0;

void setup()
{
pinMode(s0, OUTPUT);
pinMode(s1, OUTPUT);
pinMode(s2, OUTPUT);
pinMode(s3, OUTPUT);
pinMode(out, INPUT);
Serial.begin(9600);
digitalWrite(s0, HIGH);
digitalWrite(s1, HIGH);
}

void loop()
{
color();
// выводим значения цветов
Serial.print(" RED :" + String(red));
Serial.print(" GREEN : " + String(green));
Serial.println(" BLUE : " + String(blue));
delay(500);
}

void color()
{
// если 11 и 12 порты отключить, то мы получим красный цвет
digitalWrite(s2, LOW);
digitalWrite(s3, LOW);
red = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
// если 11 порт включить, а 12 отключить, то синий
digitalWrite(s3, HIGH);
blue = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
// если 12 включить, а 11 отключить, то зеленый
digitalWrite(s2, HIGH);
green = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
}

С помощью данного скетча мы можем получить значения цветов из цветовой модели RGB (red, blue, green) и, если мы откроем консоль, то увидим следующее:

Значения будут меняться, если подносить к датчику вещи различных цветов.

А теперь перейдем к более интересному занятию - у нас есть 3 цвета, и 3 светодиода. Попробуем сделать так, чтобы при определении какого-либо цвета загорался определенный светодиод.

Идея есть, приступим к ее реализации. Для начала изменим немного нашу схему подключения:

И соберем ее:

После подправим наш скетч примерно следующим образом:

int s0 = 8; 
int s1 = 9;
int s2 = 12;
int s3 = 11;
int out = 10;
// порты светодиодов
int pinred = 2;
int pinblue = 3;
int pingreen = 4;
int red = 0;
int green = 0;
int blue = 0;

void setup()
{
pinMode(s0, OUTPUT);
pinMode(s1, OUTPUT);
pinMode(s2, OUTPUT);
pinMode(s3, OUTPUT);
pinMode(out, INPUT);
pinMode(pinred, OUTPUT);
pinMode(pinblue, OUTPUT);
pinMode(pingreen, OUTPUT);
Serial.begin(9600);
digitalWrite(s0, HIGH);
digitalWrite(s1, HIGH);
// включаем их, чтобы проверить работоспособность.
digitalWrite(pinred, HIGH);
digitalWrite(pinblue, HIGH);
digitalWrite(pingreen, HIGH);
delay(2000);
}

void loop()
{
color();
// выводим значение в консоль
Serial.print(" RED :" + String(red));
Serial.print(" GREEN : " + String(green));
Serial.println(" BLUE : " + String(blue));

// условия, при которых включаются определенные светодиоды
if (red < blue && red < green && red < 10) {
Serial.println(" RED");
svet(pinred);
}
else if (blue < red && blue < green) {
Serial.println(" GREEN");
svet(pingreen);
}
else if (green < red && green < blue) {
Serial.println(" BLUE");
svet(pinblue);
}
else {
svet(0);
}
delay(500);
}

// функция, включающая определенный светодиод
void svet(int pin){
digitalWrite(pinred, pin == pinred ? HIGH : LOW);
digitalWrite(pinblue, pin == pinblue ? HIGH : LOW);
digitalWrite(pingreen, pin == pingreen ? HIGH : LOW);
}

void color()
{
digitalWrite(s2, LOW);
digitalWrite(s3, LOW);
red = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
digitalWrite(s3, HIGH);
blue = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
digitalWrite(s2, HIGH);
green = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
}

С условиями можно экспериментировать - моя калибровка далека от идеала, но все-таки она что-то, да показывает ;)

Включение цветов происходит при следующем условии: если значение данного цвета меньше всех остальных, то включаем светодиод того цвета. Во всех случаях кроме красного. Красный по умолчанию меньше, чем синий или зеленый. Но если цвет не определяется, то значения находятся на уровне 15-20. Поэтому в условие включения красного добавляем еще одно - "и если красный меньше 10".

А теперь проверим все это дело на красной тетрадке с сердечками (ничего не подумайте - она принадлежит моей девушке ;), синем пакете, и зеленой точилке:


К сожалению, когда я фоткал, светодиод зеленого цвета среагировал медленно, а я это понял только когда разобрал всю конструкцию. Так что фотки с горящим зеленым светодиодом у меня нет, а вам придется поверить мне на слово ;)

Теги: #Светодиоды, #датчик цвета, #папа-мама

Ваша оценка:

Рейтинг: 9.9 (Оценок: 4)

Комментарии (1):

odd
2016-08-27 19:54
Ну почему, можно еще подключить дисплей и выводить значения на экран. Получится некое подобие колориметра. Печатники и полиграфисты меня поймут. Причем устройство будет стоить в десятки раз дешевле аналогов. Правда точность измерения вызывает сомнения, но во всяком случае можно внести корректировки в программу так чтобы значения мало отличались от профессионального колориметра.

Комментарий:

Copyright © RobOM.ru 2016 г. Все права защищены