Ccd sensor arduino: Linear CCD | Hackaday

Получаем изображение с оптического сенсора комьютерной мыши с помощью Arduino / Хабр

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

Подготовка и немного теории

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

Погуглив информацию по этой теме и разобрав старую PS/2 мышку Logitech, я увидел знакомую по статьям из интернета картину.

Не очень сложная схема «мышей первого поколения», оптический сенсор по центру и чип интерфейса PS/2 чуть выше. Попавшийся мне оптический сенсор является аналогом «популярных» моделей ADNS2610/ADNS2620/PAN3101. Я думаю, они и их аналоги были массово произведены на одном и том же китайском заводе, получив на выходе разную маркировку. Документация на него нашлась очень легко, даже вместе с различными примерами кода.

Документация гласит, что этот сенсор до 1500 раз в секунду получает изображение поверхности размером 18×18 точек (разрешение 400cpi), запоминает его и с помощью алгоритмов сравнения изображений вычисляет смещение по координатам Х и Y, относительно предыдущей позиции.

Реализация

Для «общения с сенсором» я использовал популярную вычислительную платформу Arduino, а припаяться решил прямо к ножкам чипа.

Подключаем 5V и GND к соответствующим выходам Arduino, а ножки сенсора SDIO и SCLK к цифровым пинам 8 и 9.

Для получения смещения по координатам нужно прочитать значение регистра чипа по адресу 0x02 (X) и 0x03 (Y), а для дампа картинки нужно, сначала записать значение 0x2A по адресу 0x08, а потом 18×18 раз его прочитать оттуда же. Это и будет последнее «запомненное» значение матрицы яркости изображения с оптического сенсора.

Как я реализовал это на Arduino можно посмотреть тут: http://pastebin.com/YpRGbzAS (всего ~100 строк кода).

А для получения и отображения картинки была написана программа на Processing.

Исходник тут: http://pastebin.com/XqGyP5EA.

Результат

После небольшого «допиливания» программы для своего проекта, я смог получать картинку прямо с оптического сенсора и производить над ней все необходимые вычисления.

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

Если начать приподнимать мышку над поверхностью даже на пару миллиметров, четкость сразу пропадает.

Если вы вдруг захотите повторить это дома, для нахождения мышки с аналогичным сенсором рекомендую искать старые девайсы с интерфейсом PS/2.

Заключение

Хотя получаемое изображение и не очень большое, этого вполне хватило для решения моей задачи (сканнер штрих кода). Получилось очень даже экономично и быстро (мышка за ~100р + Arduino + пару дней на написание кода).

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

Теория

http://www.ixbt.com/peripheral/mice-sensor.shtml

Аналогичные работы

http://spritesmods.com/?art=mouseeye&page=1
http://www.bidouille.org/hack/mousecam

Документация

http://www. avagotech.com/docs/AV02-1184EN

Исходники

http://pastebin.com/YpRGbzAS
http://pastebin.com/XqGyP5EA

UPD от 23.09: добавил немного информации про линзу и номера пинов для ардуины.

Сделайте оптический датчик потока, используя Arduino, элементы CdS и коробку из-под обуви! — Блоги

Сделайте оптический датчик потока, используя Arduino, элементы CdS и коробку из-под обуви!

Автор: Джеффри Л. Бэрроуз, 5 декабря 2011 г., 15:25

Это устройство не может сравниться с датчиком Рэнди, но работает (минимально). Думайте об этом маленьком проекте как о забавном хаке больше, чем о чем-либо еще. Но с некоторой настройкой и уменьшением размера кто-то, вероятно, мог бы реализовать иногда работающий датчик удержания высоты для самолета с неподвижным крылом RC.

Этот оптический датчик потока использует ячейки CdS в качестве светочувствительных элементов. Напомним, что ячейка CdS — это, по сути, резистор, значение которого изменяется в зависимости от освещения — больше света приводит к меньшему сопротивлению. Фундаментальная чувствительная структура здесь представляет собой пару ячеек CdS, соединенных последовательно, чтобы сформировать делитель напряжения. Средний узел между ячейками CdS формирует выход. Когда обе ячейки освещены одинаково, выходное напряжение находится посередине между питанием и землей (при условии, что ячейки CdS совпадают). Если одна ячейка освещена больше, чем другая, соответственно изменяется выходное напряжение. Интересное качество этой пары ячеек CdS заключается в том, что если вы, скажем, удвоите количество света, падающего на обе ячейки, выходной сигнал изменится очень мало.

Девять из этих пар ячеек CdS расположены в ряд, как показано на видео. Обратите внимание на фото ниже, чтобы увидеть, как расположены ячейки CdS и как они перекрываются внутри массива. Девять результирующих выходов поступают на порты с A0 по A8 (аналоговые входы с 0 по 8) Arduino Mega. Для этого проекта потребовался Mega из-за большого количества аналоговых входных сигналов.

Для тех из вас, кто имеет опыт обработки изображений, вы можете сказать, что пара ячеек CdS образует простой аналоговый детектор краев, а соседние детекторы краев сдвинуты по фазе на 120 градусов.

По мере того, как световые узоры перемещаются по массиву CdS, девять аналоговых сигналов будут соответственно изменяться и могут быть интерпретированы с помощью базового алгоритма одномерного оптического потока. Например, если тень перемещается по массиву слева направо, импульсная или ступенчатая функция последовательно появляется через порты от A0 до A8 (или в другом направлении), что указывает на визуальное движение.

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

Я закрепил всю электронику в обувной коробке с помощью клейкой ленты. (Для более профессиональной и прочной версии используйте клейкую ленту!) Я также поместил темную плотную бумагу внутрь коробки, чтобы свет не отражался. Я вырезал щель в верхней части коробки, как показано, чтобы расположить ее над массивом CdS.

Выходной сигнал может быть прочитан двумя способами: порт Arduino D3 генерирует ШИМ-сигнал, который при подключении к показанной сети RC может генерировать аналоговый выходной сигнал, представляющий оптический поток (5 В = максимальное положительное значение, 0 В = максимальное отрицательное значение, 2,5 V = ноль). В качестве альтернативы вы можете прочитать его, используя последовательный дисплей среды Arduino.

Датчик несовершенен, но работает. Для работы ему требуется много света — он должен работать в ярко освещенном помещении, но лучше работает при естественном наружном освещении, скажем, в несколько сотен люкс и выше.

Эскиз Arduino прикреплен здесь: CdS_OF_Sensor_r1.pde

Удачи!

arduino — CD-ROM открываются/закрываются в ответ на датчики

Задай вопрос

спросил

Изменено 8 лет назад

Просмотрено 4к раз

\$\начало группы\$

Общий вопрос:

Как я могу открывать и закрывать приводы CD-Rom (около 20-30) в ответ на различные сигналы датчиков?

Несколько более конкретных вопросов (исходя из предположения, что я должен решить это с помощью Arduino):

Как мне выяснить, какие контакты на разъеме IDE должны принимать сигнал?

Как мне понять, какой сигнал нужно отправить на эти контакты? И как мне заставить ардуино отправлять этот сигнал?

Некоторый контекст:

Я работаю над кинетической скульптурой сосны, сделанной из старых приводов CD-ROM. По сути, каждая «ветвь» дерева представляет собой дисковод компакт-дисков, направленный в сторону от ствола. Приводы будут открываться и закрываться в зависимости от обратной связи через:

  1. Микрофон. Алгоритм будет открывать и закрывать диски на основе анализа аудиовхода. Одна идея, дуя в микрофон (как ветер), будет имитировать ветер, дующий ветками сосны (они будут открывать и закрывать ставни)
  2. Альтернативный (или, возможно, дополнительный ввод): маленькая модель дерева с сенсорными датчиками. Если обхватить рукой все маленькое дерево и закрыть все датчики, все приводы закроются. В основном каждый датчик сопоставляется с одним диском, закрываешь его и диск закрывается.
  • ардуино

\$\конечная группа\$

1

\$\начало группы\$

Как это идет здесь грязный путь. У каждого компакт-диска есть кнопка извлечения, верно? Вырвите кнопку и подключите ее напрямую, используя любой вход, который у вас есть.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *