Помогите "Научить" датчик определения цветов TCS230 определять все цвета помимо RGB
- Войдите на сайт для отправки комментариев
Привет форумчане! Недавно зарегистрировался на этом сайте, так как понадобилась помощь в программировании, не хватает знаний, да и вообще я новичок в этом деле, ардуино только осваиваю. Вопрос состоит в том что у меня есть датчик определения цвета TCS230, определять основные цвета RGB Красный, зелёный и синий я научился вот есть скетч для этого:
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);
}
Данный скетч 100 процентов работает, проверял, но возник вопрос как теперь сделать так, чтобы датчик помимо Красного, Зелёного и Синего, определял ещё кучу цветов: Жёлтый, Коричневый, Чёрный, Белый, Фиолетовый, Оранжевый, Розовый, Голубой. Возможно ли скорректировать данный скетч внеся в него дополнения и как это сделать? Или же нужно писать иную программу. Перелопатил кучу информации в инете но толкового ответа не нашёл. Повторюсь, я новичок и мне трудно разбираться в программах многое не понимаю. большинство скетчей данных в сети нерабочие выдают ошибку компиляции и в плату ArduinoUNO не грузятся. Компилятор у меня версии 1.8.5 Очень прошу помощи в написании программы для определения цветов!
http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...
roborus86, Вам бы для начала с физикой разобраться, т.е. понять, что такое " Жёлтый, Коричневый, Чёрный, Белый, Фиолетовый, Оранжевый, Розовый, Голубой".
как теперь сделать так, чтобы датчик помимо Красного, Зелёного и Синего, определял ещё кучу цветов: Жёлтый, Коричневый, Чёрный, Белый, Фиолетовый, Оранжевый, Розовый, Голубой.
Открою страшную тайну: все перечисленные цвета можно составить из комбинаций R G B.
определять все цвета помимо RGB
Помимо не получится - это как "капусту помимо водки кушать".
1. Функцией PulseIn() Вы определяете цветность в канале только для достаточно слабых диапазонов освещений. На ярком свету там достаточно большие частоты и полезнее замерять частоту (кол-во импульсов в ед. времени). Хитрость датчика в том, что при разной освещенности корректно работают или тот или иной методы, соответственно, программно надо иметь оба для работы в широком диапазоне.
2. Любой "цвет" есть смесь базовых RGB, что Вам уже отписали. Так 100(R) + 100(G) даст практически "оранжевый". Практически - сильно зависит от т.н. "передаточной характеристики как приемной матрицы, силы освещения светодиодами, цветностью иного источника освещения и .. характеристикой вашего глаза - его особенностями типа "а я так вижу".
Последнее - чисто субъективно и приборы как правило настраиваются по некоему "эталону" - тут требуется "лаборатория" с таковым. Есть под руками?
Передаточная характеристика приемника - есть в даташите на прибор. По тем данным можно составить обратную пересчетную матрицу и "выровнять" ТТХ. Но, там большой разброс +-20% от экземпляра, что также для большей точности требует поверку конкретного датчика в лаборатории. Есть такая?
Светодиоды якобы "белого" цвета, что идут с датчиком точно также далеко не линейны, в частности в области синей части спектра .. в общем, тоже в лабораторию. Есть? :)
Я поступал так: брал средние значения из даташита, строил матрицу цветности и находил обратную матрицу. Её использовал как восстановление цветности. Далее, проводил измерения по ней с освещением солнечным светом закрывая свои светодиоды, и зная его спектр корректировал матрицу. Потом проводил измерения тех же эталонных поверхностей (брал эталоны у знакомых фотографов, щас уже не помню, они там как-то маркируются) с освещением встроенными светодиодами и получал "корректирующую матрицу цветности" для них.
В целом, итог меня более чем устроил. Общий канал яркости выдает люксы практически 1:1 в широком диапазоне засветок, канал цветности вполне адекватен тому что подсунуто. Кстати, датчик обладает неплохой чувствительностью и способен замерять от единиц люксов вполне надежно после всех "выкрутасов", рекомендую. :)
Arhat109-2, а куда такой девайс нужен, если не сектрет ?
Да фиг его знает. Мы его пгобовали как датчик цвета в нашем Ардуино как Лего по аналогии с леговским датчиком. В целом очень классный приборчик и гораздо лучше леговских или аналогов. Цвет "серой кошки" в темной комнате определяет вполне устойчиво. В смысле датчик, поставленный под днище робота цвет видит очень неплохо. Но, без "цветокоррекции" родных светодиодов - ниочем: все синеватое. Как экспонометр, неплохо терпит чуть ли не прямой солнечный свет, во всяком случае в солнечный день - работает что-то вроде до 30к люксов, не помню уже, но там практически "мегагерцы" и без входа ICP таймера ловить нечего. Поэтому и делал драйвер к нему, который можно включать и так и этак с автоматическим пересчетом цветокоррекции.
Но, как датчик линии он слишком тормозной. 4-16мсек - это фактически "пердел" при низкой освещенности.
APDS-9960 - 160р у RobotDyn, отдает сразу цифру по I2C. Делает вроде как всё, что требовалось, калибруется на заводе.
Кстати, может кто-то подскажет недорогой модуль с датчиком освещенности и цифровым выходом, который быстро (с конверсией менее чем за 10мс, у BH1750 - 16мс) ловил бы в диапазоне 10-100 lx. Спасибо.
Да, неплохой датчик, но на 3.3в, как понял. Когда покупал свои, таких не было или я не нашел. Года 2 с лишним назад бралось многое для Ардуино..
Да многие датчики на 3,3V, но роботдин на модулях обычно согласователи ставит. Мой экземпляр не сгорел, во всяком случае.
Посмотрел даташит внимательнее. Да, интересный датчик, может решать и вопросы яркости, цветности освещенности и даже вопросы направления перемещений и много чего ещё полезного можно придумать. Но:
1. Он такой же медленный, мин. время оцифровки 2.8мсек. Как понял, в реальности до 16мсек.
2. Напруга даже не 3.3, а только 3 вольта + отдельная напруга до 4.5в куда-то там ещё.
А так .. ещё и мелкий и легкий.. :)
1) Я так и не понял, как посчитать скорострельность. Вроде как можно выставить интеграцию за один степ на 2,8мс, но при этом автоматически рассчитывается кол-во отсчетов что ли... Вобщем, лежит у меня он - не могу собраться и замучать как следует.
2) 4.5V, как я понимаю, это на светодиод подсветки, чтобы проксимити и жесты определять. Но можно и 3V дать.
Года полтора назад мы смотрели применимость датчика цвета для поиска линии и прочих плюшек, когда планировали участвовать среди леговцев на соревнованиях. TCS3200 себя показал с самой лучшей стороны, за исключением скорострельности. А этот датчик я тогда не видел... впрочем, со скорострельностью у него похоже тоже напряги. Во всем остальном - описание мне понравилось, но как там со временем - тоже нифига не понял, кроме того что минимально 2.78мсек. Это тоже много для скоростной линии.
Но .. леговцы нас "забрили", поскольку это Ардуино, а с прошлого года и у ардуинщиков "забрили", поскольку "любые лего детали - запрещены в конструкции роботов". Увы, вот такой он "маркетинг". Сейчас вроде прорисовывается расширение применимости нашего "Ардуино как лего", возможно будем организовывать свои "открытые" соревнования. Но, все равно, теперь уже не раньше чем через год.
Все это хорошо и складно, но хочется ближе к программированию, как правильно скетч написать для определения цветов помими RGB
То что все цвета состоят из RGB это дело ясное но как правильно составить прогу для их распознавания? Собственно для этого тема и создавалась, чтобы у знающих людей хоть какой-то адекватный ответ получить
Так в чём проблема-то, господи? Все цвета в палитре RGB состоят из смешения каналов R, G и B, очевидно. Проверять/сравнивать - тоже, очевидно, как - также, как сравнивают числа, только с учётом попадания в диапазон. Вот у вас есть переменные red, green, blue - их надо загнать в одно число, чтобы получить RGB-цвет:
Всё - получили цвет в одном числе. Теперь его можно сравнивать с чем хошь, например, считаем, что числа от 0xD0D0D0 до 0xFFFFFF - относятся к белому цвету:
if(color >= 0xD0D0D0 && color <= 0xFFFFFF) { Serial.println(F("WHITE detected!")); }Аналогично - с любыми другими цветами: в фотошопе выбираете диапазон цветов (там есть их чиселки), который будет считаться за нужный вам цвет, подставляете в скетч - profit.
roborus86, Вы новые вопросы задаете, а на уточняющие, что были заданы Вам, не отвечаете. Что, например, по Вашему мнению, означает "желтый"?
Ну а по поводу написания скетчей - то правильно они пишутся ручками, а неправильно - попыткой объединить два или более фрагмента, утянутые из И-нета.
2DIYMan: прежде, чем проводить подобное сравнение я бы перевел RGB->HSV. И сравнивать цвет не единственным числом, а индивидуально по компонентам. В частности, иначе получается, что В Вашем примере число 0xD10000 следует считать белым.
Пост №6 чем непонятен? Собственно как написать скетч и какие вопросы вам надо решить, там изложено полностью. Что не хватает для того, чтобы Вы написали программу?
В частности, иначе получается, что В Вашем примере число 0xD10000 следует считать белым.
Ну да, вы правы, негодный пример, писанный в ночном угаре.
ИМХО кажись это ТС спрашивал:
UPD может здесь чего интересного по теме есть
Можно наименовыание стандарта (кем, когда принят) или хотя бы ссылочку?
Можно наименовыание стандарта (кем, когда принят) или хотя бы ссылочку?
к сожалению не заморачивался, могу предложить статью в википедии и
калькулятор цветов
сего мне достаточно... а текст дернул из какой-то статьи, чтоб самому не набирать.
UPD В одном вы правы, как такового "стандарта RGB" нет - в полном смысле этого слова...