Судя по всему главная проблема как идентифицировать точное положение не считывая картинку.
Что имеем:
1) Датчик не позволяет зафиксировать выдержку на определённом значении
2) У нас динамическая (нами не контролируемая) подстройка выдержки и (контролируемая подстройка) мощности лазера
3) О том какая картинка мы можем судить только по 6 параметрам
Алгоритм датчика ADNS-2610 примерно такой
- Код: Выделить всё • Развернуть
setup(){
Shutter=(24000000/1500)-3476;// Shutter max 12524;
}
loop(){
uint Pixel_Sum=0;
uint SQUAL=0;
uint Minimum_Pixel=63;
uint Maximum_Pixel=0;
for( i=0 ; i<324 ; i++){
Pixel_Sum+=Pixel_Data[i];
Maximum_Pixel=max(Maximum_Pixel,Pixel_Data[i]);
Minimum_Pixel=min(Minimum_Pixel,Pixel_Data[i]);
if(Pixel_Data[i] != Pixel_Data[i-1]){ //условно
SQUAL++;
}
}//for
Pixel_Sum=(uint)(Pixel_Sum/128);
if( Maximum_Pixel > 55 ){
if((Shutter+Shutter/16) < 12524)
Shutter=Shutter+Shutter/16;
}else if( Maximum_Pixel < 50 ){
if( (Shutter-Shutter/16) >0)
Shutter=Shutter-Shutter/16;
else
Shutter=1;
}
LED_CNTL=PWM(Shutter);
Update_registers();
}
4 параметра вычисляются по кадру и два динамических (автоматически подстраиваемых).
Maximum_Pixel и Minimum_Pixel могут быть в любом месте кадра, поэтому о положении мало что говорят.
Pixel_Sum мог бы однозначно сказать насколько жирное пятно мы видим если бы не зависел от динамической подстройки выдержки и мощности лазера
SQUAL из моего опыта доволно странная штука, как он вычисляется непонятно, бывало так что в кадре много довольно контрастных пикселей а SQUAL был низким, но мне показалось что он хорошо отрабатывает когда видит "предмет" ровно в один пиксель . т.е. когда один пиксель контрастирует с всеми окружающими его пикселями.
Если бы мы смотрели глазами на картинку то почти наверняка мы бы всегда идентифицировали одно и тоже положение по местонахождению и размеру точки от лазера, но картинку читать слишком накладно.
поэтому нужно найти другие способы идентификации положения.
Если посмотреть на фотки с лазерной точкой
post343755.html#p343755то мы видим круглое пятно определённого размера, такое пятно должно давать примерное одинаковое количество SQUAL
в общем идея в том чтобы повысить количество SQUAL по максимуму, и по этому параметру определять положение.
Решения?
1) повышать SQUAL, скажем если бы была возможность нарисовать не пятно а на например бублик или крестик, шахматную доску , полый квадрат , то по одному параметру SQUAL можно было бы судить о положении, значение SQUAL должно резко подскакивать когда шаблонная картинка займёт весь кадр
как вариант, выше я давал ссылку на проекты определения перемещений от "спеклов" (
http://laser-portal.ru/content_517) произвольного отражения лазера от поверхности, там на датчиках даже оптику не ставят (матрица открытая) т.к. хаотично отраженные лучи всегда как то лягут на матрицу так что будет контрастный белый шум, но картинка будет постоянна т.к. "шум" формируется шероховатостью поверхности, это тоже должно сработать, в качестве "трафарета".
2) Maximum_Pixel - может быть постоянным и по его величине можно судить целиком ли пятно в кадре или нет, если зафиксировать мощность лазера в момент как только Minimum_Pixel упадёт ниже определённого порога, это означает что пятно появилось в кадре, дальше важна стабильность параметнов, Shutter будет плясать но скорее всего значительно меньше чем если бы мы не зафиксировали мощность лазера.
как рассеять лазерное пятно:
В экранах любого мобильного телефона (ЖК монитора ПК) есть особая пленочка. А особенная она тем что в ваших мобильных экранчиках целая система призм и пленочек разного назначения, я насчитал их 4 , две из них раздваивают изображения по вертикали и горизонтали, одна как зеркало отражает, и вот последняя под призмой самая нам нужная, она очень здоровски и равномерно рассеивает свет, а ГЛАВНОЕ имеет КПД 90-95%, в отличии от всяких других пленок и оракалов которые имеют кпд 50-70%
Еще один вариант — т.н. «голографические рассеиватели» (holographic diffuser). Они представляют собой специальный полимер с задаваемой наносруктурой молекул. Любопытное свойство голографических диффузоров состоит в том, что, меняя геометрию кластеров молекул, можно, например, из круглого пучка света сделать овальный, квадратный или другой формы (отсюда еще одно их название light shaping diffusers).
Выпускает эти рассеиватели компания Physical Optics Corporation http://www.poc.com/lsd/default.asp в лице своей дочерней компании Luminit http://www.luminitco.com. У последних можно заказать коммерческие образцы их продукции. Однако есть более простой способ добыть голографический рассеиватель для своей самоделки — они используются для матирования подсветки в LCD дисплеях, КПК, мобильных телефонах и т.п. Если разобрать дисплей старого мобильного телефона, там в подложке обычно находится тонкая матовая пленка - это и есть голографический диффузор. Недостаток такого похода в том, что не угадаешь ни плотности пленки, ни угла рассеивания - у разных производителей по-разному, а некоторые и вовсе обходятся рассеивателями других технологий для наших целей непригодными. Однако, если у вас завалялся старый сломаный мобильник - вы ничего не теряете.
Делаем приватный монитор из старого LCD монитора http://habrahabr.ru/post/133473/ Чистим матрицу ноутбука от следов жидкости http://habrahabr.ru/post/62807/Добавлено спустя 10 минут 6 секунд:ещё пара слов про SQUAL
в документации сказано
Data Type: Upper 8 bits of a 9-bit integer.
т.е. внутри SQUAL 9ти битный, максимальное значение 511, при том что пикселей 324
что бы это могло значить?