Датчик цвета TSC3200 и Ардуино Мега2560 как лучше?
- Войдите на сайт для отправки комментариев
Наконец-то мы с ребенком добрались до датчика цвета TSC3200. Типа такого: http://ru.aliexpress.com/item/1PCS-TCS230-TCS3200-Color-Recognition-Sens...
Типовой пример есть тут: http://forum.arduino.cc/index.php?topic=188494.0
В целом он понятен: включаем датчик как источник прерываний уровня INT0 и тупо инкрементируем счетчик импульсов от датчика, а второй таймер в интервальный режим в 10мсек и по его переполнению, каждый 10мсек сохраняем значение текущего цвета и переключаем проверяемый цвет на датчике. Заодно и печатаем его.
Не очень понятно почему работа со вторям таймером обозвана как timer0_init(), нулевой таймер там вовсе не при делах и зачем в loop каждый раз надо вызывать перенастройку таймера .. ну да ладно. Общая идея понятна. Также понятно что данный подход обеспечивает подсчет всех цветов каждые 40мсек или частота опроса датчика .. 25Гц. Ну и то что "абсолютно черное" для такого способа подсчета - это минимальная частота датчика в 100гц., несмотря на то что в даташит указано "темновая засветка .. 2-5 герц" .. то есть освещенность с 2-5 .. до 99гц такой способ будет ловить как "слишком темно" .. но, может этого и достаточно для надежного исключения фоновых шумов, не знаю.
Для использования в Меге, вижу что можно применить 5-й таймер и даже в нескольких режимах:
1. Также подсчет пришедших импульсов за время:
Подаем выход датчика на счетный вход T5 и по прерыванию от таймера, каждые 1, 10, 100мсек смотрим сколько 5-й таймер успел насчитать импульсов от датчика. Оцень хорошо ложится на макрос everyMillis() или его упрощенный вариант everyOvf(). Какое-либо прочее использование таймера в этом случае исключается полностью;
2. Решение наоборот. Подсчет импульсов внутренней частоты Ардуино, укладываемых в один импульс от датчика по сигналу T5 ICP (сигнал захвата таймера). В этом случае, сам счетчик можно ставить в делитель 1/8 (2Мгц) или 1/64 (250кГц), а выход датчика подключать к ICP таймера, по сигналу прерывания которого можно выгружать результат подсчета в переменную в ОЗУ и выбирать следующий цвет. По завершению цикла перебора цветов переносить данные в окончательное хранение для использование в основной части loop() или где ещё.
В этом случае, мы гарантированно считаем 1 период частоты от датчика, независимо от освещенности, но итоговое время реакции будет сильно зависеть от освещенности датчика от микросекунд при ярком освещении до долей секунды при предельно слабых освещениях. Тут также можно организовать таймаут по сигналу прерывания от переполнения счетчика, а равно использовать выходы счетчика для "прочих работ"
Вопрос: а можно ли организовать взаимодействие таймера и датчика так, чтобы переключение цветов тоже управлялось не программно, а аппаратно, например теми же ножками COM5A..COM5B?
Или: есть идеи как ещё можно принимать частотный сигнал от датчика, минимизировав программные и аппаратные расходы без потери чевствительности датчика?
В общем, ищу предложения как работать с датчиком, не особо напрягая loop().
Не могу разобраться с даташитом в этой части:
Если счетчик работает в нормальном режиме, то управляет ли он своими выходными сигналами через регистры сравнения? То, что он тупо считает через переполнение - понятно. А вот как будут вести себя выхода, если установить режим "toggle"(1) и значение, скажем 32767? Он будет переключаться по достижению значения в регистре или по факту переполнения счетчика?
И второй вариант: Если в нормальном режиме счета, установить режим выхода в "Clear"(2) или "Set"(3), то как понял, он должен по переполнению сделать обратную установку: если было Clear, то поставить на выходе лог.1 и наоборот; а при достижении значения регистра OCR ноги сделать то, что требуется по режиму: если Clear, то сбросить в лог.0 и наоборот..
Аналогично он должен вести себя и в режиме CTC по каналу А или по регистру захвата ICP ..
Кто детально разбирался с режимами 16-и битных таймеров, можете пояснить их работу?
P.S.
Просто получается, что если в регистры управления ногами записать OCR5B = OCR5C = 32767, а их режимы выставить как B - "toggle", C - "Clear/Set" то можно каналами B,C управлять сигналами выбора цвета анализа датчиком S2,S3 .. и менять измеряемый цвет аппаратно. Но тогда требуется, чтобы изменение значений происходило "одновременно", по одному и тому же условию: переполнению счетчика таймера, по крайней мере для сочетаний режима toggle на одной ноге и сброса/установки другой ноги.
Так можно или нет?
Все празднуют или никто не знает ответов на вопросы?
Всем спасибо, всё работает. Тему можно закрыть.
Вот так оформлен теперь датчик цвета:
