В этой заметке речь пойдет о том, как массив светодиодов может быть использован в качестве «камеры» очень низкого разрешения (20 пикселей). Практического смысла в этом немного, но опыт применения светодиодов в качестве фотодатчиков может оказаться для кого-то полезным. В работе используется плата Arduino Blinkenlight Shield, изначально предназначенная для демонстрации световых эффектов.
Я упоминал о возможности подключения катодов всех светодиодов к шине +5 вольт. Сейчас расскажу, для чего эта возможность сделана [прим. перев.: автор статьи является разработчиком описанного шилда]. Этот эксперимент показывает, как превратить светодиоды в датчики освещенности. Так как Blinkenlight Shield содержит 20 светодиодов, его можно использовать как 20-пиксельную «камеру».
Прежде всего, нужно соединить перемычкой катоды светодиодов с +5 В. Не бойтесь, это им никак не повредит. Если светодиоды погасли — отлично, так и должно быть. Только не забудьте вернуть перемычку в исходное положение по окончании эксперимента.
Теперь светодиоды будут работать как фотодиоды. Так как они предназначены для излучения света, фотоприемники из них получатся неважные, фототок будет очень мал. Кроме того, число аналоговых выводов контроллера обычно ограничено, в то время как цифровых гораздо больше. То, что цифровые КМОП-входы имеют очень высокое сопротивление, дает нам другой путь снятия сигнала со светодиодов, который мы сейчас рассмотрим. Идея заключается в обратном смещении светодиода путем вывода на порт логического «0». В этом режиме светодиод не проводит ток и ведет себя как конденсатор. Когда он зарядится, мы переключаем вывод в Z-состояние, и наблюдаем, что произойдет. Если диод освещен, возникает очень малый фототок, который будет разряжать емкость. Чем выше освещенность, тем больше сила тока, и тем быстрее происходит разряд. В определенный момент времени вход зафиксирует переход из состояния «0» в «1». Измерение времени, прошедшего до момента этого перехода, даст возможность определить освещенность.
Если вы хотите детальнее разобраться в описанных явлениях, можете прочитать эту работу: www.merl.com/papers/docs/TR2003-35.pdf
Полный исходный код приведен здесь или здесь.
Функция setup() пробегает по всем выводам и устананаливает каждый в состояние «0». Также функция инициализирует массивы для хранения отсчетов времени. После этого выводы переключаются в режим входа. Так как прежде на них выводился «0», подтягивающие резисторы будут отключены [прим. перев.: в AVR один и тот же регистр PORTn отвечает в режиме вывода за выводимое значение, а в режиме ввода — за включение подтягивающих резисторов]. Теперь выводы находятся в Z-состоянии. Обратите внимание, что некоторые контакты исключены, они использованы в Arduino для подключения последовательного порта и индикаторного светодиода. Если на вашей плате можно отключить эти выводы от дополнительной нагрузки, можно использовать и их. В таком случае просто сделайте так, чтобы функция pin_is_ok() всегда возвращала истину. Перед тем, как отключать последовательный порт, задумайтесь, как вы будете переносить данные на компьютер.
Основной цикл программы выполняет следующее: для каждого светодиода отмечается переход от низкого уровня к высокому. Если это случилось, на светодиод снова подается 0 В, и вычисляется время с момента последнего перехода. Затем вывод снова переводится в Z-состояние. Здесь я явным образом опираюсь на то, что команда pinMode() выполняется довольно медленно, а значит у светодиода будет несколько тактов на заряд емкости.
После того, как все светодиоды обработаны, результат пересылается через последовательный порт. Вы можете задаться вопросом о функции преобразования. В теории и на практике он может быть опущен. Я просто представил результат в виде карты освещенности в виде одной строки. Поэтому я могу использовать монитор последовательного порта для визуализации выходных данных этой установки.
Это видео показывает «камеру» в действии. При написании прошивки я не учел, что Arduino будет располагаться «вверх ногами», USB-портом слева, поэтому данные на мониторе отображаются в обратном порядке. Тем не менее, работа фотодатчиков хорошо видна.