Собственно есть линзы адаптив от VV, в их основе стоят 2 шаговых двигателя и датчики холла(я так понял для калибровки). Нужно написать скетч который будет принимать сигнал с датчика угла поворота колес и давать пропорциональную сигналу команду на шаговик поворота линзы. Второй шаговик соответственно работает со шторкой дальний ближний, тут я думаю алгоритм понятен всем. Работать должно так: 1)Включаем свет, моторы двигают свои конструкции на точку калибровки, и возвращаются в центральное положение( количество шагов посчитаем) 2)Считываются данные с датчика положения руля, и делаются еще шаги в сторону поворота, на количество шагов указанное датчиком. 3)для включения калибровки нужна задержка(чтобы этот процесс не включался каждый раз как мы подаем сигнал например мигая встречному водителю. 4)шторка должна быть опущена всегда(режим дальнего), в режим ближнего она должна переходить только перед началом юстировки пункта 1( не к чему дергать мотор при моргании например днем) выслушаю предложения вот линза, запускал стандартной библеотекой степпер с ардуино а это датчик для калибровок Датчик угла поворота рулевого колеса: так же схема и видео с данными с этого датчика: левый мультик стоит на датчике положения "ровно"(stn), соответственно средний и правый(st1 и st2)
На первый взгляд ничего невероятно сложного. Что из себя представляет датчик положения руля? В каком виде данные передаются? Где вы находитесь, делать такое на расстоянии без этих фар довольно сложно.
Я и не говорил что невероятно, просто свет хочется не через пол года когда я освою МК на хорошем уровне а в ближайшее время. Нахожусь в Питере, датчик положения что представляет предстоит выяснить( завтра наверное полезу), но логично предположить что тоже на датчике холла он, работает с системой ESC, но если и делает это по кан шине врядли будет проще к ней цеплять. Понятно что девайс лучше в руках держать, но при невозможности я думаю что могу предоставить все необходимые данные, да и мне важен алгоритм, конечную настройку и калибровку я смогу сделать сам на месте. Желательно чтобы проект был под AVR или ардуину, Пики программировать нечем) p.s. вот схемка работы системы, думаю необработанные сигналы с датчика можно смело ловить
С движками разобраться не сложно. Сложно разобраться с датчиком поворота руля. Как вытащить информацию куда и на сколько руль повернут?
Я завтра посмотрю как там с доступностью этот датчик, если не сильно далеко попробую снять показания, скорее всего там будет аналоговый сигнал который можно притащить в мк апд.Из датчика три сигнальных линии ст1 ст2 и стн. Стн реагирует только на руль в положении прямо и дает примерно 1.7в, в любых других положениях 3.7в. С датчиками ст1 и 2 немного сложнее, по ним расчитывается угол поворота и направление лево-право. Уровни те же, 1.7 и 3.7, идут строго через определенный градус поворота, при этом ст1 и 2 имеют разные углы срабатывания(именно так по идее штатная система и понимает в какую сторону руль повернут, тоесть какой датчик первый сработает после положения прямо, в ту сторону руль и повернулся
В положении прямо все линии дают 1.7 вольта, и при градусе влево или вправо меняется на 3.7 показания только у ст1 или ст2 в зависимости от стороны поворота
да он осознанно показывает) просто осознаннее некуда) в прямом положении все датчики 1.7- ноль грубо говоря, при градусе влево сначала один датчик становится в положение "единица", тоесть 3.7, а потом каждый градус чередует ноль и еденицу с одинаковым интервалом. то же самое в другую сторону. левый мультик стоит на датчике положения "ровно", соответственно средний и правый на сторонах поворота
то что вы описали называется Энкодер. Подробнее тут: http://robocraft.ru/blog/technology/734.html на радуино вполне можно считывать эти данные, одна проблема - инициализация: при старте ардуино должно знать текущее положение руля. А дальше прибавляем/отнимаем градус в зависимости от того, какой пин поменялся.
проблемы нет, инициализация это положение "ровно", в него автомобиль попадает всегда, максимум в первые 5 секунд езды, нет необходимости после старта системы сразу знать в каком положении руль
Что за положение "равно"? Если это положение, когда обе ноги показывают ноль, то таких положений будет очень много (через каждые 2 градуса). Что, если при включении ардуины руль повернут вправо? Ардуина приравняет это положение за начальное и будет отчитывать от него?
А ты посмотри на видео)) сигналы как с "квадратурного" энкодера(да я прочитал статью что ты кинул) идут по 2 линиям, третья линия отвечает только за положение руля прямо и больше ни в каком положении не дает сигналов
А.. Извиняй, я не посмотрел на 3 линию.. Тогда приметно такой скетч определения положения: !!!Тут был не правильный код!!! Обманул не много. Чуть позже нормальный код выложу
Вот правильный скетч (по моим текущим ощущениям) Код (C++): #define RULEINITPIN 5 //Пин инициализации #define RULERPIN 6 //Пин поворота #define RULELPIN 7 //Пин поворота // Массив позиций руля (если бежим по нему направо, то позиция увеличивается; налево - уменьшается) const bool Pos[4][2] = {{0,0},{0,1},{1,1},{1,0}}; bool bNullPosition; bool bRuleR; bool bRuleL; bool bRuleInited = false; int iRulePosition = 0; // текущая позиция 0-середина void setup() { pinMode(RULEINITPIN,INPUT); pinMode(RULERPIN,INPUT); pinMode(RULELPIN,INPUT); bNullPosition = digitalRead(RULEINITPIN); bRuleR = digitalRead(RULERPIN); bRuleL = digitalRead(RULELPIN); } void loop() { // put your main code here, to run repeatedly: if(bRuleInited){ CheckRulePosition(); } else { RuleInit(); } } // Инициализация - при проходе через начальное положение, перестаём попадать сюда и летим в CheckPosition (считаем позицию = 0) void RuleInit (){ if (digitalRead(RULEINITPIN)!= bNullPosition){ bRuleInited = true; } } // Проверка поворота (Изменение в соответствующем пине должно изменить позицию) iRulePosition - текущая позиция. void CheckRulePosition(){ bool bCurRuleR = digitalRead(RULERPIN); bool bCurRuleL = digitalRead(RULELPIN); // Если изменился один пин (остальное неопределено, либо нет изменений) if( (bCurRuleR != bRuleR && bCurRuleL == bRuleL) || ((bCurRuleR == bRuleR && bCurRuleL != bRuleL) ){ // Определяем предыдущую и текущую позиции в массиве позиций int LastPos = findPositionInArray(bRuleR,bRuleL); int CurPos = findPositionInArray(bCurRuleR,bCurRuleL); if (LastPos>=0 && CurPos>=0 && CurPos == (LastPos+1)%4){ iRulePosition++; } else if (LastPos>=0 && CurPos>=0 && CurPos == (LastPos-1)%4){ iRulePosition--; } bRuleR = bCurRuleR; bRuleL = bCurRuleL; } } int findPositionInArray(byte R, byte L){ for (int i=0; i<4; i++){ if (Pos[i][0] == R && Pos[i][1] == L){ return i; } } // Тут попали в ошибку return -1; } P.S. Настоятельно рекомендую обвесить Serial.print и посмотреть данные на компьютере, ибо я мог где то что то не учесть.
Скетч работает, но некорректно. Разобрал датчик угла рулевого колеса, может так будет понятнее, фото добавил в первое сообщение
"Скетч работает, но некорректно" В Личку! Про логические нули и 1 цы: Естесственно, надо притянуть логические нули и единицы к нужным значениям (0 и 5в), ибо программно сделать это невозможно, если не использвоть аналоговых пинов.