Макетку собрал - попробовал. Правда фотодиодов не оказалось, одни ТСОПы. Попытка заменить светодиодом - неудачно. Надо утром заехать в магазин. Один цикл измерений - 20 миллисекунд. Попробую уменьшить.
Нищета... Фотодиод оказался инфракрасным. Из-за отсутствия вариантов вскрыл транзистор МП37. Результаты. Чем сильнее отраженный сигнал - тем меньше значение. На белом: sensor OFF = 159 sensor Blu = 98 sensor Red = 89 sensor ON = 43 sensor interval = 116
на синем: sensor OFF = 152 sensor Blu = 125 sensor Red = 139 sensor ON = 111 sensor interval = 41
На красном: sensor OFF = 151 sensor Blu = 118 sensor Red = 97 sensor ON = 70 sensor interval = 81
И это со спиленным транзистором. %) Придумаю алогоритм автокалибровки, каждое измерение будет состоять из четырех циклов: sensor OFF - компенсируем фоновую засветку. Измеряем при выключенных светодиодах. sensor Blu - сигнал при синей подсветке. sensor Red - при красной sensor ON - при обоих, для контроля на ошибку, "баланс красно-синего", лень подстроечники на светодиоды ставить, пусть МК считает.
Добавлено спустя 1 час 39 минут 49 секунд: Скетч для подбора резистора (максимальный интервал значений) и наводки светодиодов:
int ledPin = 13; // LED connected to digital pin 13 int Rled0 = 2; // Red LED connected to digital pin 0 int Bled0 = 3; // Blue LED connected to digital pin 1 int analogValue0; int analogValueB; int analogValueR; int analogValueRB;
// read the analog input into a variable: analogValue0 = analogRead(0); // wait 10 milliseconds for the analog-to-digital converter // to settle after the last reading: delay(10);
digitalWrite(Bled0, HIGH); // set the Bled on delay(1); analogValueB = analogRead(0); digitalWrite(Bled0, LOW); // set the Bled off // wait 10 milliseconds for the analog-to-digital converter delay(10);
digitalWrite(Rled0, HIGH); // set the Rled on delay(1); analogValueR = analogRead(0); digitalWrite(Rled0, LOW); // set the Rled off // wait 10 milliseconds for the analog-to-digital converter
delay(10); digitalWrite(Bled0, HIGH); // set the Bled on digitalWrite(Rled0, HIGH); // set the Rled on delay(1); analogValueRB = analogRead(0); // print the result: delay(1000); digitalWrite(Bled0, LOW); // set the Bled ff digitalWrite(Rled0, LOW); // set the Rled ff
Serial.print("sensor OFF = " ); Serial.println(analogValue0);
RootAdmin писал(а):на синем: sensor Blu = 125 sensor Red = 139 На красном: sensor Blu = 118 sensor Red = 97
Разницы в дельте от освещения нет -- это плохо. "Дрожание" по высоте даст разброс значений, перекрывающий дельту... Я потому и настроен хоть на какой-то видимый диапазон, чтобы дельта в определении цвета была значительная. Иначе гарантированно определить не получится. Скорость какая получилась?
В общем - идея жизнеспособна. Транзистор плохо реагирует на синий светодиод... Почти никак Скорость - без вывода на UART около 50 в секунду. DimRoboForum, попробуйте свой фотодиод, как будет работать на синий и красный светодиоды?
Добавлено спустя 10 минут 56 секунд: Проверил, все ж распознает. Полоски синей и красной изоленты на столе. Зажигает светодиод если красный. И другой - если синий. Высотой игрался плюс-минус 10 мм.
Добавлено спустя 4 минуты 15 секунд: Подогнал яркость светодиодов резисторами. Жаль, нет одинаковых, красный - от оптической мыши, мощный. В "нормальном состоянии" от фотодиода до поверхности 10 мм Если поднимаешь больше чем на 25 мм - светодиод начинает помаргивать над синей. Красную распознает четко. Попробуйте...
Ок. Замечательно! Буду пробовать. Только получится поэкспериментировать после 1-го числа. До 1-го нужно готовиться к судейству на Московском кубке по Евроботу... Номиналы, как на схеме? (Конденсатор 100мкф?)
Схему с номиналами завтра вывешу. Конденсатор - да, можно меньше. И шунтирован керамикой на 0,1. Транзисторы-ключи светодиодов - npn 9014, можно любые.
Датчик цвета S371. Опрос + sprintf + выгрузка в УАРТ - около 20 мс. Очень чувствителен к расстоянию до объекта. По даташиту 4 мм - так, примерно, и есть. Но это чтобы воспроизводить похожий цвет. А если просто выделять доминирующий, то область действия увеличится.
Во время тестов как-то печально сдох i2c в ОРдуине. Пришлось на ПИКе мастырить (заодно проверил i2c библиотеку, которую HiTech поставляет в семплах. Редкостный идиотизм, к тому же неработающий...)
В смысле "дорого"? Это смотря как считать, и где покупать... На мой дилетантский взгляд применимо. Астраханская команда использует, и вроде успешно. У камеры лучше дальность, и распознаваемость сигнала слабо зависит от засветок, вспышек и импульсных осветителей, а на соревнованиях их хватает.
Eruman писал(а):А на цветном видеоглазке не вариант датчик сделать? И ковырять RGB-сигнал с выхода.
Я посмотрю, как на финале видеокамеры работают На следующий год, если найду желающего с видеосигналом поработать, может и "замутю". А на датчики цвета я купил по ардуине нано: 8х700=5600, так что цена сопоставима Проблема оказалась в i2c: на ардуине 5В (даже не очень понятно, когда подаю 7 с лишним Вольт питания {рекомендовано от 7В до 12В}, то на цифровых выходах те же 7 с лишним; что же на шине???), а на датчике цвета от 2.6В до 3.5В.
RootAdmin писал(а):Схему с номиналами завтра вывешу.
Eruman писал(а):А на цветном видеоглазке не вариант датчик сделать? И ковырять RGB-сигнал с выхода.
Я посмотрю, как на финале видеокамеры работают На следующий год, если найду желающего с видеосигналом поработать, может и "замутю". А на датчики цвета я купил по ардуине нано: 8х700=5600, так что цена сопоставима Проблема оказалась в i2c: на ардуине 5В (даже не очень понятно, когда подаю 7 с лишним Вольт питания {рекомендовано от 7В до 12В}, то на цифровых выходах те же 7 с лишним; что же на шине???), а на датчике цвета от 2.6В до 3.5В.
Я бы рекомендовал купить горсть пиков pic16f1827 за 40 руб штука (они работают от 3,3В, толерантные к 5В), прошивку я легко адаптирую с 18-го пика на 16-й, а данные по цвету выкидывать на УАРТ. Было бы вообще зашибись сделать эти пики i2c слейвами и повесить их все на одну шину (в pic16f1827 два i2c - один мастером опрашивает датчик, другой слейвом сливает инфу в общую шину), но у меня что-то не получилось заставить i2c slave работать.
Будет команда -- можно работать "В одного" я повёлся на лёгкость программирования Ардуино и подключения к ней периферии. (Тем более, что паяльник до сего момента, я брал в руки лет 20 назад...)