Технический форум по робототехнике.
setar » 16 фев 2016, 12:39
набросал логику алгоритма который работает при постоянном регулировании мощи лазера:
сначала находит полку минимального значения регулирования путем таймаута при известной скорости приближения,
а при втором приближении ждет начала найденного порога.
Добавлено спустя 11 минут 37 секунд:
обновил
- Вложения
-

-
logic.xls
- (68.5 КиБ) Скачиваний: 239
ilalexey » 16 фев 2016, 12:53
dccharacter писал(а):..добавлять не только описания успешных опытов в шапку, но и испробованные, но отвергнутые варианты. Ае?
Языком простым суть дела чётко изложил
ales2k » 16 фев 2016, 15:45
setar писал(а):набросал логику алгоритма который работает при постоянном регулировании мощи лазера:
сначала находит полку минимального значения регулирования путем таймаута при известной скорости приближения,
а при втором приближении ждет начала найденного порога.
Добавлено спустя 11 минут 37 секунд:
обновил
Может лучше не в 2 прохода делать,а при выходе лазера за кадр? На входе калибруешь, на выходе сигналишь.
Или я чего не так понял?
setar » 16 фев 2016, 16:09
идея основана на вот этих двух графиках
forum107/topic15929-720.html#p347528и контрольные точки тут такие:
в общем пытаюсь привязаться к концу первого фронта регулирования лазера, для того чтобы знать уровень полки даю паузу от первого срабатывания для гарантированного нахождения пятна в центре датчика
Добавлено спустя 6 минут 29 секунд:ales2k писал(а):Может лучше не в 2 прохода делать,а при выходе лазера за кадр? На входе калибруешь, на выходе сигналишь.
Или я чего не так понял?
тут есть нюансик. от входа до выхода большое расстояние, в зависимости от геомертии сенсора от 3 до 10-15 мм
это во первых очень долгое тестирование одной точки,
а во вторых у меня вообще точка за область не выходит - в стол сопло упирается (зазор между фокусом оптики и соплом =5мм)
Добавлено спустя 1 минуту 5 секунд:для того чтобы эти графики снять я уровень стола накладкой поднимал, на видео видно
ales2k » 16 фев 2016, 16:20
А Max почему ровный??? Ты же на его изменение ориентируешься?
Ну да, в стол упираешься потому, что фокус у линзочек от мелких лазеров 5мм.
Ты все таки в 2 прохода ходишь? Может сделать 2 лазера одинаковых на расстоянии 2-3мм и последовательно включать?
setar » 16 фев 2016, 16:37
два раза работает стандартная прошивка марлина:
первое срабатывание, откат, и возврат с медленной скоростью
а макс ровный это признак того что регулирование проходит успешно, я сначала регулирую мощность а затем уж замеры остальных параметров делаю.
там обрати внимание и регулирование лазера не 255, а ниже. просто график взят не из далека, а около границы поля зрения.
Добавлено спустя 1 минуту 26 секунд:
два лазера мне ставить не хочется, я пока не исчерпал задумки на простой схеме
ales2k » 16 фев 2016, 16:39
Я к марлину еще не прикручивал.
Тогда не понимаю по какому параметру срабатывание.
setar » 16 фев 2016, 16:50
наброски логики, пока не стабильно, но суть думаю понятна
конфиг
- Код: Выделить всё • Развернуть
#define Algo_TimeBased // режим обнаружения минимума регулирования мощности лазера основаный на ожидаемом времени попадания пятна в центр датчика
// экспериментальный, базируется на геометрических размерах датчика и скорости Z 3D принтера
#define TimeBased_wait_center 250 // время в милисекундах за которое пятно перемещается от срабатывания по алгоритму Algo_MaxPix до центра датчика
#define TimeBased_wait_second 5000 // время в милисекундах в течении которого ожидаем второго замера (на молой скорости)
логика
- Код: Выделить всё • Развернуть
#if defined(laser_power_pwm_target)
void RefrPowerLaser(uint8_t power)
{
if (power > laser_power_pwm_target && RegPowLaser > 1){
RegPowLaser--;
analogWrite(LASER_VCC_PIN,RegPowLaser);
}
if (power < laser_power_pwm_target && RegPowLaser < 255){
RegPowLaser++;
analogWrite(LASER_VCC_PIN,RegPowLaser);
}
}
#endif
- Код: Выделить всё • Развернуть
#if defined(Algo_TimeBased)
unsigned long SensedTime;
byte BasePowLaser;
typedef enum {
START,
WAIT_FIRST,
FIRST_TIMER,
ERR_OUT,
FIRST_SENSED,
WAIT_SECOND,
SECOND_SEARCH,
SECOND_SENSED
}state_machine;
state_machine state=START;
#endif//Algo_TimeBased
//-------------------------------------------------------------------------------------------
#if defined(Algo_TimeBased)
//порегулируем мощность лазера
while( (dataMax = ADNS_read(ADNS_MAX_PIX)) &&
( dataMax > laser_power_pwm_target ||
( dataMax < laser_power_pwm_target && RegPowLaser < 255) ) ){
RefrPowerLaser(dataMax);
delay(2);
}
if (RegPowLaser < 255 ) { // лазер в поле зрения
switch(state){
case START:
PIN_HIGH(LED); // сбросим сигнал срабатывания
// помигаем в знак ожидания работы 255=включить лазер , 0=выключить
analogWrite(LASER_VCC_PIN, 0);
delay(250);
analogWrite(LASER_VCC_PIN, RegPowLaser);
delay(250);
break;
case WAIT_FIRST:
SensedTime=millis(); // начинаем замер времени
state=FIRST_TIMER; // работает таймер
break;
case FIRST_TIMER:
currentTime=millis(); // текущее время
if (currentTime >= (SensedTime + TimeBased_wait_center)){ // время вышло, останавливаемся
PIN_LOW(LED); // сигнал срабатывания
BasePowLaser=RegPowLaser; // запоминаем значение регулировки лазера
SensedTime=currentTime; // начинаем замер времени
state=FIRST_SENSED; // первый подход сработал
}
break;
case FIRST_SENSED:
if (RegPowLaser >= (BasePowLaser + 50)){ // отошли от базового уровня на достаточное расстояние
PIN_HIGH(LED); // отключаем сигнал срабатывания
state=SECOND_SEARCH; // второй этап
}
currentTime=millis(); // текущее время
if (currentTime >= (SensedTime + TimeBased_wait_second)){ // время вышло, повторно не тестировали
state=START; // начинаем цикл по новой
}
break;
case WAIT_SECOND:
SensedTime=millis(); // начинаем замер времени
state=SECOND_SEARCH; // возврат пятна после удаления на первое срабатывание
break;
case SECOND_SEARCH:
if (RegPowLaser <= (BasePowLaser+5)){// подошли близко к базовому уровню : срабатываем
PIN_LOW(LED); // включаем сигнал срабатывания
state=SECOND_SENSED; // второй подход сработал
delay(10);
PIN_HIGH(LED); // отключаем сигнал срабатывания
}
currentTime=millis(); // текущее время
if (currentTime >= (SensedTime + TimeBased_wait_second)){ // время вышло, порог не найден
state=START; // начинаем цикл по новой
}
break;
} // end switch
}else{ // лазер вне поля зрения
switch(state){
case START:
PIN_HIGH(LED); // сбросим сигнал срабатывания
state=WAIT_FIRST; // переходим к ожиданию первого вхождения
break;
case FIRST_TIMER:
PIN_LOW(LED); // сигнал срабатывания
state=START; // пролетели поле зрения, авария!
break;
case FIRST_SENSED:
PIN_HIGH(LED); // отключаем сигнал срабатывания
state=WAIT_SECOND; // было удаление после первого срабатывания
break;
case WAIT_SECOND:
PIN_HIGH(LED); // отключаем сигнал срабатывания
state=SECOND_SEARCH; // возврат пятна после удаления на первое срабатывание
break;
/*
case SECOND_SEARCH:
PIN_LOW(LED); // сигнал срабатывания
state=START; // пролетели поле зрения, авария!
break;
*/
case SECOND_SENSED:
PIN_HIGH(LED); // отключаем сигнал срабатывания
state=START; // цикл замера успешно завершен
break;
} // end switch
}
#endif //Algo_TimeBased
Добавлено спустя 3 минуты 47 секунд:первое срабатывание как 250мс от времени начала уменьшения мощности лазера.
второе при приближении этой мощности к ожидаемому минимуму
Добавлено спустя 1 минуту 51 секунду:я наверное запутал названием переменной laser_power_pwm_target
ее нужно было назвать laser_power_MaxPix_target
ales2k » 16 фев 2016, 17:10
Вот теперь понял. Спасибо за пояснение.
Как на разных поверхностях работает? Допустим одну половину стола полили лаком/пивом чуть больше чем другую и она темнее.
setar » 16 фев 2016, 17:17
за одинаковость срабатывания на разных поверхностях и борюсь,
надеюсь что фронты на разных поверхностях совпадают по дистанции.
но пока ответа нету.
Dmitry__ » 16 фев 2016, 18:24
ilalexey писал(а):Языком простым суть дела чётко изложил
Йо майо, я приветствую вас магистр на планете Земля.
Вот теперь все сходится
Нате вам шиповника плодов сироп, самый любимый ваш из всех...


ilalexey » 16 фев 2016, 19:09
Dmitry__ писал(а):Нате вам шиповника плодов сироп, самый любимый ваш из всех
В точку. Ох люблю, ужас просто ..но курить больше(с)

ales2k » 17 фев 2016, 00:00
Что то с калибровкой на белом не ладится
В начале все как у Сергея на графике
Снижаем мощность лазера - чуть падает MaxPix
Продолжаем снижать мощность а MaxPix растет - похоже чип регулирует свою чувствительность...
Добавлено спустя 3 минуты 46 секунд:Причем на темном поле при повышении мощности лазера ничего такого не наблюдается...
Не нравится мне это
dccharacter » 17 фев 2016, 01:06
Посмотри на частоту этих "ростов maxPix", не 50 ли герц
Dmitry__ » 17 фев 2016, 01:19
ales2k писал(а):Что то с калибровкой на белом не ладится
Так ты даже близко еще не подошел к линейному режиму пзс. Вот данные мощности лазера от типа поверхности:
- Код: Выделить всё • Развернуть
Мощность лазера на разных поверхностях:
белая 12
черный сплошной тонер 120
черный пластик 170
Белый фон - мощность 12, а у тебя график закончился на 75.
