setar писал(а):по результатам экспериментов меняю концепт дизайн датчика:
Хм, интересная мысль, но пока не соображу какие преимущества/недостатки...
setar писал(а):Мысль следующая: лазер светит в стол перпендикулярно поверхности, в фокусе проектируется схождение оптических осей датчика и лазера.
при таком расположении пятно от лазера всегда круглое, и в проекции на датчик будет еще меньше коротким элипсом по длинной стороне равной диаметром сфокусированному пятну.
При расположении как было изначально лазер размазывает по столу в удлиненное пятно, почти черточку , от этого теряем границы.
Вообще, пятно лазера имеет форму кирпича, т.е. ровно такую, какую имеет торец излучающего тела. На стол лазер надо фокусировать так, чтоб продольная часть кирпича заходила в поле пзс. Тогда наклон лазера доведет этот кирпич до более-менее квадратного пятна. Это когда разрез латунной трубки лазера расположен вертикально. Не видите этот кирпич из-за огромной яркости точки. Чтоб увидеть - расфокусируйте точку лазера на стене, чтоб картинка была больше 10х10 см. Расфокусировка - неточное слово, луч лазера не расфокусируется ибо когерентен, просто увеличит картинку, повторяя форму торца лазера. Чтоб увидеть этот кирпич на наших расстояниях, надо понижать мощность лазера. Запитайте лазер от регулируемого бп. Регулировка бп еще даст много ответов, почему на разном контрасте имеем ошибку.
setar писал(а):как видно повторяемость хорошая (как сказал знакомый профессор - воспроизводимость)
а вот разница черное - белое велика = 0.38
Дима, колись как ты убрал эту зависимость ?
Регулировкой мощности лазера
Я разобрал всю программу и еще нахожусь в активной фазе доработок. Куда-то сливать полуживую прогу - нет смысла. Или надо какую-то тестовую ветку делать, чтоб было видно кауда я двигаюсь. На пальцах сделал так:
Инициируем аппаратный pwm, делаем его на макс. частоту, для дигиспарк это:
- Код: Выделить всё • Развернуть
FAVOR_PHASE_CORRECT_PWM set to 0
MS_TIMER_TICK_EVERY_X_CYCLES set to 1
FAVOR_PHASE_CORRECT_PWM to 0 in:
arduino-1.0x/hardware/digispark/cores/tiny/core_build_options.h
MS_TIMER_TICK_EVERY_X_CYCLES symbol in:
arduino-1.0x/hardware/digispark/cores/tiny/wiring.c
Pin0 = 64453 Hz:
закомментировать TIMER0_SUPPORTS_PHASE_CORRECT_PWM в вветке #if defined( __AVR_ATtinyX5__ )
.arduino15/packages/digistump/hardware/avr/1.6.5/cores/tiny/core_timers.h
Далее делаем интегратор:
- Код: Выделить всё • Развернуть
uint8_t RegPowLaser = 0;
void RefrPowerLaser(uint8_t power)
{
if(power < ConstMax && RegPowLaser < 255)
{
RegPowLaser++;
analogWrite(pin_HwPwm_bit, RegPowLaser);
}
else if(power > ConstMax && RegPowLaser > 0)
{
RegPowLaser--;
analogWrite(pin_HwPwm_bit, RegPowLaser);
}
}
Которому часто и постоянно скармливаем данные Maximum_Pixel
- Код: Выделить всё • Развернуть
while(!pin_TRIG_IN) //шаг1
{
dataMax = ADNS_read(Maximum_Pixel);
RefrPowerLaser(dataMax);
......
}
Тогда лазер будет все время поддерживать мощность на уровне ConstMax и вам сразу станет понятно почему уходит на 0.3мм на белых поверхностях
Я щаз сильно пилю марлин, делаю примитивный протокол перестукивания через стенку пинами pin_TRIG и pin_led. На марлине дебажу через штатную пищалку
- Код: Выделить всё • Развернуть
// move back down slowly to find bed
clean_up_after_endstop_move();
zPosition -= 0.3;
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], zPosition, current_position[E_AXIS], feedrate/600, active_extruder);
st_synchronize();
setup_for_endstop_move();
// we have to let the planner know where we are right now as it is not where we said to go.
zPosition = st_get_position_mm(Z_AXIS);
plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], zPosition, current_position[E_AXIS]);
st_synchronize();
Beep_my(500, 30);
delay(30);
Beep_my(500, 30);
delay(30);
zPosition += 0.6;
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], zPosition, current_position[E_AXIS], feedrate/1000, active_extruder);
st_synchronize();
current_position[Z_AXIS] = st_get_position_mm(Z_AXIS);
// make sure the planner knows where we are as it may be a bit different than we last said to move to
plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
st_synchronize();
Beep_my(500, 30);
delay(30);
Beep_my(500, 30);
delay(30);
Beep_my(500, 30);
delay(30);
...
void Beep_my(int beepS, int beepP)
{
if (beepS > 0)
{
#if BEEPER > 0
tone(BEEPER, beepS);
delay(beepP);
noTone(BEEPER);
#elif defined(ULTRALCD)
lcd_buzz(beepS, beepP);
#elif defined(LCD_USE_I2C_BUZZER)
lcd_buzz(beepP, beepS);
#endif
}
else
{
delay(beepP);
}
}
Синклеровские звуки разносятся по всей квартире, иногда в комнату заходит жена и визуально проверяет мое состояние
Скажите, от какой ветки марлина надо форкаться? Самая популярная версия марлина кто?