LDR + светодиод RGB = датчик цвета. Как его откалибровать?

1$ датчик цвета.

Мои приключения в электронике продолжаются. Разговаривая с другом о цветах, он рассказал мне о датчиках цвета. Позже я вспомнил видео, где умников сортируют, и мне захотелось узнать больше. Просматривая несколько видео, я нашел один с LDR и светодиодом RGB. Говорят, что это не точно. Глядя на различные сборки этих датчиков, я думаю, что часть проблем связана с корпусом, который скрепляет все вместе. У большинства из них между LDR и цветной поверхностью есть большое пространство, у некоторых светодиоды расположены перед LDR... это не работает.

  1. Не должно быть никаких других источников света, кроме светодиода RGB. Поместите LDR и RGB светодиод в небольшую трубку, внутри она должна быть черной. Я не смог найти трубку из этого материала . поэтому я взял толстую ручку.
  2. Следует избегать прямого освещения rgb. Чтобы получить хороший однородный цвет, я поставил перед светодиодом белый полупрозрачный кусок пластика.

  3. LDR должен получать только отраженный свет. Поместите датчик поверх белого пластика. Свет должен быть позади LDR!.

  4. Это не может работать для всего. Вы можете использовать его только для определенных поверхностей. Например, я использую глянцевую фотобумагу. Непрозрачный, наверное, лучше. но у меня было немного фотобумаги в принтере, поэтому я напечатал цветовую палитру и черно-белую палитру.

  5. Вам нужно знать больше о Led & LDR. Это в основном проблема. Красный, зеленый и синий, излучаемые светодиодом, не являются на 100% красным, зеленым и синим. LDR не может идеально поглощать все цвета.

Не глядя на другие коды, я подключил этот датчик цвета к Arduino... и измерил, сколько времени ему нужно, чтобы включить разные цвета. Я закончил с 50 мс для каждого цвета. Готово, я просто позволяю LDR печатать некоторые значения на экране. Черное и белое... какой у меня диапазон от черного до белого? Я написал код, в котором он автоматически калибрует черный и белый. В основном я измерял поглощение света на ранее напечатанной черно-белой фотобумаге. Я был действительно впечатлен тем, насколько большой диапазон я мог бы иметь. Из общего диапазона 1023, доступных на Arduino, я выбираю черный около 30-50 для всех цветов и белый около 700. Это означает, что датчик цвета теоретически имеет точность, скажем, средний диапазон 650 для каждого цвета, 650 * 650 * 650 = 274 625 000, около 270 миллионов цветов. Это много... RGB имеет 16 миллионов цветов. Я лично знаю около 5-6 цветов. В этот момент я начал тестировать. чтобы упростить задачу, я поместил на плату еще один RGB-светодиод, а на светодиод — белую пластиковую насадку. Цвета казались уже похожими, но слишком светлыми. Также на темных поверхностях у меня включается светодиод. Затем я уменьшил диапазон примерно на 10% внизу и на 10% сверху. И ничего себе .. цвет выглядит так же. Но давайте посмотрим на цифры. Печать значений rgb на экране дала числа, отличные от тех, которые я измерил... но открытие селектора цветов rgb на экране и его отображение... показало примерно правильный цвет... так что на самом деле это было очень правильно. Даже если мой принтер фотопринтер это не значит, что цвета печатаются правильно. Я никогда не калибровал принтер или монитор... Так что может быть большая разница. Поэтому я попытался откалибровать различные цвета на основе распечатанной палитры. Включил красный свет и уменьшил диапазон зеленого и синего до 0 при включенном красном... то же самое для зеленого и синего. Наконец-то я нашел настоящие проблемы. Красный почти идеален. Синий немного смещен в сторону красного. Зеленому не хватает света? Когда на зеленом мне нужно поставить уровни красного и синего очень низко. Но это сильно снижает точность. Я получаю идеальный красный (255,0,0), синий (0,0,255), зеленый (0,255,0), желтый (255,255,0), фуксия (255,0,255), цвет морской волны (0,255,255). диапазон каждого цвета падает настолько, что в конце я, вероятно, могу измерить только около 10-15 основных цветов. Зеленому не хватает света? Когда на зеленом мне нужно поставить уровни красного и синего очень низко. Но это сильно снижает точность. Я получаю идеальный красный (255,0,0), синий (0,0,255), зеленый (0,255,0), желтый (255,255,0), фуксия (255,0,255), цвет морской волны (0,255,255). диапазон каждого цвета падает настолько, что в конце я, вероятно, могу измерить только около 10-15 основных цветов. Зеленому не хватает света? Когда на зеленом мне нужно поставить уровни красного и синего очень низко. Но это сильно снижает точность. Я получаю идеальный красный (255,0,0), синий (0,0,255), зеленый (0,255,0), желтый (255,255,0), фуксия (255,0,255), цвет морской волны (0,255,255). диапазон каждого цвета падает настолько, что в конце я, вероятно, могу измерить только около 10-15 основных цветов.

Как я могу откалибровать датчик цвета за 1 доллар?

  1. Каждый цвет светодиода немного смещается.

  2. Зеленый не дает достаточно света.

  3. Мой принтер печатал не те цвета.

  4. LDR не считывает правильно каждый цвет (длина волны, свет....)

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

Я разместил это здесь, потому что это обширный вопрос, требующий основ электроники. Хотя я думаю, что большинство проблем можно решить с помощью сложной математической функции, я могу ошибаться и решить проблему с помощью простого затемнения светодиода, добавления дополнительных светодиодов, возможно, фильтрации источника света или просто перемещения датчика вверх или вниз внутри трубки. а если просто поменять резисторы? Во всех случаях требуется инженер-электронщик. То, как светодиоды излучают свет, а датчик поглощает его, связано с индивидуальной длиной волны ... я не инженер-электронщик.

Я думаю, что также стоит спросить из-за того, что датчики цвета обычно не такие уж и дешевые.

Светодиод RGB: LL0548RGB

LDR: FW300

Короткий ролик, показывающий датчик

Можете ли вы сделать свой вопрос более кратким? Кстати, вы смотрели даташит на светодиод и фоторезистор. В таблице данных светодиодов будет указана длина волны каждого компонента R, G и B, а в таблице данных LDR будет указана их спектральная характеристика.
да именно так!! я не знаю, как применить эти значения.
на светодиодах мне нужен только нм ... верно? не mcd. С другой стороны, у LDR не так много информации в таблице данных.
также у светодиодов не самая лучшая информация ... например, какое лучшее напряжение для каждого цвета ??? там написано только от 2.1 до 3.2. поэтому также трудно выбрать правильный резистор ... обычно r = 2,1 g = 3,1 b = 3,2
Не хочу омрачать ваш парад, но датчики цвета в наши дни стали очень дешевыми.
@Spehro Pefhany, лол, конечно ... это всегда зависит от того, насколько они точны и насколько легко вы можете их откалибровать
Датчик цвета, который вы покупаете, почти автоматически будет лучше, чем все, что вы собираете вместе.

Ответы (2)

Вы пытаетесь сопоставить тройку значений (отклики LDR на ваши светодиоды RGB) с другой тройкой (значения RGB, которые вы использовали для печати цветов на бумаге). Есть множество значений окружающей среды, которые будут влиять на это отображение. ИМО лучшее, что вы можете сделать, это

  • Убедитесь, что каждый светодиод дает достойный и сравнимый эффект. В зависимости от ваших светодиодов и чувствительности вашего LDR к различным цветам это может означать, что вам придется использовать разные токи (последовательные резисторы) для светодиодов.

  • Установите калибровочные значения для ваших цветов (как вы это сделали) и используйте их для «линеаризации» значений R, G и B.

  • Сведите внешние воздействия к минимуму. (вы, кажется, сделали это)

Именно это я использую в качестве упражнения для своих учеников. У меня репутация человека, который не любит своих учеников. Они проходят, когда уверенно различают 3 цвета :) Один лист из этого задания:

введите описание изображения здесь

Чем вам ответ, так вы говорите, что если я поменяю резисторы, я получу разные тональности RGB? это начало. в остальном я думаю, что сборка, показанная на вашей фотографии, имеет гораздо больше экологических проблем, чем трубка, которую я использую. Кстати, как я уже сказал, я не инженер-электронщик. И, говоря мне «линеаризовать» значения R, G и B, проблемы наверняка не будут решены. «Убедитесь, что каждый светодиод дает достойный и сравнимый эффект», такой же, как указано выше... КАК?
как я уже сказал, я получил очень хорошие результаты от черного до белого 60-70% от максимума. красный, зеленый и синий не откалиброваны... я также думаю, что в конце нужно использовать кривую для идеального смешивания цветов... так что ничего линейного, пока не будет идеальных красного, зеленого и синего.
@geometrikal говорил о спектральном отклике и длине волны отдельных цветов... это то, что более реалистичный разговор может иметь значение.

1) На самом деле вам не нужно знать точное напряжение для каждого цвета. Просто выберите удобный набор чисел и придерживайтесь его. Скорее всего, вы используете одно напряжение для всех трех светодиодов с разными резисторами для каждого цвета. Вам не нужно использовать одинаковое сопротивление для каждого светодиода. В частности, вы можете использовать меньший резистор на зеленом, чтобы получить большую яркость. Насколько мал? Это будет зависеть от светодиода, и вы ДОЛЖНЫ научиться рассчитывать соотношение между напряжением, током и сопротивлением. Он называется Законом Ома, и этот ответ не место для его преподавания.

2) Вам также не нужно знать точный ответ для LDR. Все, что вам нужно знать, это относительная реакция на разные уровни освещенности каждого цвета. Вы можете сделать это, откалибровав свои ответы. Поскольку вы используете Arduino, не просто включайте и выключайте 3 светодиода, как вы делаете сейчас. Вместо этого используйте ШИМ, чтобы получить разные уровни освещенности, и используйте «стандартную» белую мишень (она стандартна, потому что вы говорите, что это ВАШ стандарт). Управляйте светодиодами с разными уровнями освещенности, равными рабочему циклу ШИМ, и записывайте выходной сигнал LDR. LDR довольно медленные. Я рекомендую увеличить время включения для каждого цвета до 0,1 секунды и измерить показания LDR в конце этого времени. Исходя из этого, вы можете составить таблицу того, сколько света данного цвета соответствует каждому показанию LDR.

3) Вы можете использовать LDR для калибровки выходных светодиодов. Посветите выходным светодиодом в ваш LDR (убедитесь, что окружающий свет не проникает в них с помощью рукава вокруг них). Переведите выходные светодиоды на разные уровни и запишите выходной сигнал LDR. Вы можете использовать это для компенсации выходного сигнала, чтобы для заданного показания LDR датчика вы получали такое же показание, когда LDR смотрит на выходной сигнал.

4) Наконец, вы никогда не сможете получить идеальный отклик в реальном мире, особенно с вашей настройкой. Подумайте, что произошло бы, если бы ваш образец цвета был чисто желтым. Он отражает только желтый цвет, поэтому не будет реагировать ни на один из ваших трех светодиодов, а датчик сообщит, что он черный. В этом случае хорошо, что ваши светодиоды не являются чистыми цветами, и что очень немногие реальные материалы обладают сверхчистым отражением цвета. Как бы то ни было, человеческий глаз не имеет чрезвычайно избирательных цветовых рецепторов. Из http://en.wikipedia.org/wiki/Color_visionвведите описание изображения здесь вы можете видеть, что между тремя типами рецепторов существует много совпадений цветов. И просто для того, чтобы сделать жизнь интереснее, есть некоторые цвета, которые просто невозможно воспроизвести с помощью 3-х цветных светодиодов, например, коричневый.

хорошо .. получите +1 за хороший длинный ответ .. 1. led.linear1.org/1led.wiz я использовал это и сделал еще один для более точного расчета омов, чтобы я мог смешивать различные резисторы, чтобы получить максимум ... я измерьте эти значения с помощью моего мультиметра. но это также подразумевает больше чтений. С простым высоким низким я получаю очень стабильное значение после 3 показаний. с pwm... не знаю... стоит попробовать расскажу в ближайшие дни.3. трубка довольно нечувствительна к внешним воздействиям. свет приятно приглушен, а значения остаются точными.
я калибрую яркость с помощью ldr... но, как вы знаете, тональность неверна. 4. Естественно, он не может быть идеальным, но я думаю, что, учитывая большой диапазон от черного до белого, у меня есть хорошие шансы вывести, возможно, тысячи цветов, если я смогу правильно откалибровать красный, зеленый и синий. Я проверю это в ближайшие дни... с ШИМ и резисторами. затем я смотрю на эти кривые спектра...
@cocco «да, я мог бы использовать контакты 980 Гц на зеленом и синем, чтобы иметь больше игровой площадки, но это также подразумевает больше показаний». Сначала нужно сделать это на всех 3-х светодиодах. Во-вторых, да, требуется больше показаний, но вам нужно снять их только один раз, во время калибровки. На самом деле, вы можете написать программу, которая будет делать это автоматически, пока вы занимаетесь чем-то другим.
Arduino имеет только 2 контакта 980 Гц ... я мог бы умножить 480 Гц, но красные уже кажутся наиболее правильными. и при умножении 480 Гц у меня не будет точно такой же частоты на всех 3 светодиодах ... во всяком случае, если потребуется 50 мс, чтобы полностью включить светодиод, а также 50 Гц было бы достаточно, чтобы получить читаемый приглушенный свет. булавки используют разные таймеры... и некоторые из них используются для измерения времени! миллис(); лучше оставить как есть.
«Поскольку для полного включения светодиода требуется 50 мс, 50 ​​Гц будет достаточно». Ошибся по нескольким пунктам. Светодиод включится через микросекунду или меньше. 50 мс эквивалентны 20 Гц. И именно отклик LDR является ограничителем. Если вы измеряете сопротивление с точностью более 1% от доступного диапазона, 50 мс почти наверняка не хватит времени.
правильно.. в любом случае, читая LDR 100 или 10 раз, я получаю стабильные значения (более 700), только если я включаю светодиод и жду 50 мс ... даже если я жду 300 мс 1000 мс, я не получаю больше ... я получается 700 из 1023 максимум, и это уже много, учитывая белый пластик, который затемняет светодиод. если я наведу датчик на черную поверхность, я получу около 40... так что у меня есть диапазон 63% от максимальных значений. И все это с сильным цветом... не только яркостью. Но дайте мне немного времени, чтобы проверить ШИМ и различные резисторы. Надеюсь, мне удастся как-то сдвинуть тональности.
преобразование индивидуального отклика LDR в hsb/hsl позволит легко изменить цвет, просто изменив оттенок. Но я думаю, что это было бы легко, как я думаю? он всегда перевернут. Красный на красном должен быть белым. Это означает, что мне нужно сместить синий и зеленый, чтобы получить правильный красный...
«Подумайте, что произошло бы, если бы ваш образец цвета был чисто желтым». Дело в том, что он инвертирован, и именно поэтому желтый отлично работает ... даже с самым высоким диапазоном и красный, и зеленый дают мне высокие уровни белого. В то время как синий возвращает в основном очень низкое отражение света. И это хорошо. Это, с другой стороны, заставляет меня думать, что мне, вероятно, нужно больше приглушенных светодиодов, чтобы получить еще более сильный цвет для зеленого светодиода ... Сказал, что красный дает немного более низкие значения перед калибровкой (он самый тусклый) ... он самый сильный цвет.
установив автокалибровку (высокий/низкий) на красный l:177 h:539 зеленый l:265 h:637 синий l:272 h:613 , поэтому, добавив 10% диапазона с обеих сторон... если я поставлю LDR на желтом я получаю rgb (255,255,3); другие цвета, особенно оттенки зеленого, дают более высокие значения красного и синего, как и должно быть .... частично также может быть проблема с принтером, поскольку зеленая часть палитры на самом деле не выглядит по-разному в каждом квадрате .... может быть. Синий дает мне немного более низкие значения, только уравновешивая черный с белым. должно быть (0,0,255), но выдает (0,50,190).
дальнейшее уменьшение этого значения означает большую точность на меньшей палитре, но обнаружение меньшего количества цветов. Вот почему мне нужно как-то изменить цвета. А может быть, это возможно только виртуально. знание больше о спектральном отклике и длине волны очень помогло бы. Кроме того, цветовая палитра, напечатанная в профессиональной фотостудии, упростит задачу.
поэтому, **удалив 10% диапазона с обеих сторон