Прототип цветового сенсора на Arduino — определение и отображение названий цветов
Компоненты
| Arduino UNO | 1 шт. |
| RGB-светодиод (общий анод, рассеивающий) | 1 шт. |
| Фоторезистор (CdS, LDR) | 1 шт. |
| LCD 16x2 (любой, совместимый с LiquidCrystal) | 1 шт. |
| Резисторы: 10 кОм (2 шт., для кнопки и CdS), 100 Ом (3 шт., для RGB) | — |
| Тактовая кнопка 12 мм | 1 шт. |
| Перемычки, макетная плата | 1 набор |
Инструменты разработки
- MLP Topology Workbench — для переобучения нейросетей под библиотеку Neurona.
О проекте
Упрощённая версия полной статьи. Видео проекта демонстрирует принцип работы.
Обзор проекта
Аналог человеческого цветовосприятия: RGB-модель (>16 млн цветов) представлена 3D-пространством (R,G,B = 0–255). Детекция цвета выполняется комбинацией RGB-светодиода и фоторезистора, изолированных от внешнего света (чёрная пленочная кассета идеально подходит). Светодиод последовательно светит красным, зелёным, синим — фоторезистор измеряет отражённую интенсивность каждого компонента.
Многослойный перцептрон (MLP)
MLP — прямой нейронный сеть с входным слоем (3 входа: R,G,B), одним скрытым слоем (6 нейронов) и выходным слоем (10 нейронов = 10 распознаваемых цветов). Обучение обратным распространением (supervised learning). Сеть уже обучена и готова к работе. Подробности обучения и датасет — в блоге автора и на GitHub.

Распознавание цвета
Во время обучения сеть отобрала области в RGB-пространстве, разделённые гиперплоскостями — каждая область соответствует цвету. Новый RGB-вектор попадает в область и классифицируется. Датасет (75 примеров) нормирован в диапазон [0,1] (деление на 255). На выходе сеть выдаёт float-значения; пост-обработка: нейрон с максимальным выходом → 1, остальные → 0.

Электрическая схема
Схема рассчитана на общий анод RGB-светодиод. Если у вас общий катод — инвертируйте логику в коде. Резистор установлен на общий анод (среднее значение) — для точности лучше ставить резисторы на каждый катод отдельно. RGB-светодиод и фоторезистор расположены рядом и изолированы от постороннего света.

Цветовая теория
Работаем с диффузным отражением (матовые поверхности). Луч цвета, падая на предмет, отражается пропорционально содержанию этого цвета в пигменте предмета. Красный свет на жёлтый объект отражается сильно (жёлтый = красный + зелёный), синий — слабо. Измеряя макс./мин. отражение для каждого цвета (на белом и чёрном эталонах), калибруем датчик и масштабируем показания в [0,255] и [0,1] для нейросети.

Совет: после калибровки не двигайте компоненты и экран от внешнего света — иначе сбится нулевая точка.
Программирование
Алгоритм: 3 итерации (R,G,B). В каждой — включаем цвет, ждём стабилизации фоторезистора (500 мс, подбирается экспериментально), читаем АЦП. Калибровка: два прохода — на чёрном и белном эталонах для нахождения мин/макс. Распознавание: собранные RGB [0,1] подаются в MLP (библиотека Neurona, ставится через Library Manager). Веса сети уже вшиты в код.
Тесты
Распознавание цветов, напечатанных на матовой бумаге струйным принтером. На диаграмме показаны верные определения и единичные ошибки (цифры внутри — индексы ошибочно определённых цветов).

Код
Полный скетч в папке colorSensor репозитория GitHub: moretticb/ColorSensor. Требуется установленная библиотека Neurona (Library Manager). Схема должна соответствовать приведённой выше.
Схемы

Кнопка используется согласно инструкциям на LCD-дисплее.
Производственный процесс
- Цветовая маркировка резисторов — полное руководство по расшифровке номинала, допуска и стандартов E-серий
- Умный датчик полива «Thirst Alert» на Arduino — DIY сигнализация засухи для растений
- Итальянские словесные часы на Arduino Nano, NeoPixel, LCD и RTC
- Простой ИК-датчик препятствий на Arduino: ИК-светодиод и фотодиод
- Надежный счетчик кВт·ч на Sigfox с Arduino MKR Fox 1200
- Bluetooth-монитор температуры на Arduino Nano с NTC-термистором
- Бесконтактный жестовый замок: APDS-9960 + Arduino для безопасного доступа
- Набор-компаньон для Arduino Nano — необходимые компоненты и инструменты для DIY-электроники
- Гальванически разделённый аналоговый вход для Arduino на LM331 и оптопаре 4N25
- Точный тест времени реакции на Arduino UNO