roboforum.ru

Технический форум по робототехнике.


Датчик касания оптический, триангуляция

Обсуждение технологии печати на 3D принтерах. Самостоятельное изготовление и приобретение. RepRap и его последователи.

Re: Датчик касания оптический, триангуляция

Сообщение dccharacter » 09 янв 2016, 23:03

Спагетти-код обычно возникает:

от неопытности разработчиков;
от серьёзного прессинга по срокам, как установленного руководством (например, в принятой в компании системе мотивации на работу быстрее), так и установленного разработчиком самому себе (желание все сделать наиболее быстрым способом).


Если не получится сделать нормальный рабочий алгоритм, то какая разница, какой код
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Датчик касания оптический, триангуляция

Сообщение Dmitry__ » 09 янв 2016, 23:28

om2804 писал(а):Извиняюсь, что влезаю, но код, конечно, жесть

Вы хотите об этом поговорить? :)

Непонятный код часто означает неподготовленность читателя. Угадай откуда я это скопипастил:
Код: Выделить всёРазвернуть
#define CHECK_ENDSTOPS  if(check_endstops)

// intRes = intIn1 * intIn2 >> 16
// uses:
// r26 to store 0
// r27 to store the byte 1 of the 24 bit result
#define MultiU16X8toH16(intRes, charIn1, intIn2) \
asm volatile ( \
"clr r26 \n\t" \
"mul %A1, %B2 \n\t" \
"movw %A0, r0 \n\t" \
"mul %A1, %A2 \n\t" \
"add %A0, r1 \n\t" \
"adc %B0, r26 \n\t" \
"lsr r0 \n\t" \
"adc %A0, r26 \n\t" \
"adc %B0, r26 \n\t" \
"clr r1 \n\t" \
: \
"=&r" (intRes) \
: \
"d" (charIn1), \
"d" (intIn2) \
: \
"r26" \
)


Или это :)
Код: Выделить всёРазвернуть
    case 90: // G90
      relative_mode = false;
      break;
    case 91: // G91
      relative_mode = true;
      break;
    case 92: // G92
      if(!code_seen(axis_codes[E_AXIS]))
        st_synchronize();
      for(int8_t i=0; i < NUM_AXIS; i++) {
        if(code_seen(axis_codes[i])) {
           if(i == E_AXIS) {
             current_position[i] = code_value();
             plan_set_e_position(current_position[E_AXIS]);
           }
           else {
#ifdef SCARA
      if (i == X_AXIS || i == Y_AXIS) {
                   current_position[i] = code_value(); 
      }
      else {
                current_position[i] = code_value()+add_homing[i]; 
               } 
#else
      current_position[i] = code_value()+add_homing[i];
#endif
            plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
           }
        }
      }
      break;
    }
  }

  else if(code_seen('M'))
  {
    switch( (int)code_value() )
    {
#ifdef ULTIPANEL
    case 0: // M0 - Unconditional stop - Wait for user button press on LCD
    case 1: // M1 - Conditional stop - Wait for user button press on LCD
    {
      char *src = strchr_pointer + 2;

      codenum = 0;

      bool hasP = false, hasS = false;
      if (code_seen('P')) {
        codenum = code_value(); // milliseconds to wait
        hasP = codenum > 0;
      }
      if (code_seen('S')) {
        codenum = code_value() * 1000; // seconds to wait
        hasS = codenum > 0;
      }
      starpos = strchr(src, '*');
      if (starpos != NULL) *(starpos) = '\0';
      while (*src == ' ') ++src;
      if (!hasP && !hasS && *src != '\0') {
        lcd_setstatus(src);
      } else {
        LCD_MESSAGEPGM(MSG_USERWAIT);
      }
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Датчик касания оптический, триангуляция

Сообщение setar » 10 янв 2016, 00:11

dccharacter писал(а):Сергей, у тебя лазер плохо сфокусирован, от этого maxPixel даже не доходит до 60

тут вероятнее другое - сенсор не в фокусе, у меня линза получается у самого датчика, буду пробовать другую
А еще смущает пила сильная на черной бумаге - у тебя лазер постоянно включен или пыхает?

лазер включен постоянно, общее освещение лампой дневного света, может из за этого ?
Аватара пользователя
setar
Site Admin
 
Сообщения: 10989
Зарегистрирован: 04 окт 2004, 12:58
Откуда: St.Petersburg
Skype: taranenko.sergey
ФИО: Сергей Тараненко

Re: Датчик касания оптический, триангуляция

Сообщение om2804 » 10 янв 2016, 00:13

Ассемблерные вставки тут ни при чём, это оптимизация или маньячество, как хотите
Что касается Марлина, он тоже не идеален, но вполне себе читается

Давайте поговорим, если хотите.
Всё это как обычно спорно и это только мои доводы и опыт.
Не воспринимайте за критику. Я понимаю, что всё делается на коленке, но и понимаю, что делается в комманде:

Макросы. Вообще макросы, которые выполняют какие-то действия фиговая идея в том, что макрос pin_led_LOW не отличить от переменной pin_led_LOW. А вот вызов функции pin_led_LOW() уже понятнее.
Т.к. это действие, в названии нужен глагол, хотя бы pin_led_SET_LOW().

Magic. Всякая магия в виде непонятно откуда берущихся констант, разбросанных по всему коду. Типа:
Код: Выделить всёРазвернуть
byte Frame[NUM_PIXS + 6];

Что за +6? Откуда взялось? А самое главное, что если потребуется поменять на +8, то придётся бегать по всему коду и менять везде. Все константы надо дефайнить и комментировать

Спагетти-код. Понимаю, что Arduino предлагает почти весь код пихать в loop(), но можно ж разбить на функции, хотяб по уловной компиляции с debug_type. Кстати, условная компиляция тоже усложняет чтение, но без неё не обойтись в данном случае.


Поясните вкратце, если вам не сложно, в чём у вас проблема возникла. На гитхабе вижу, что "заявленная точность уже получена"
Аватара пользователя
om2804
 
Сообщения: 2044
Зарегистрирован: 30 апр 2012, 20:03
Откуда: Архангельск
Skype: om2804
прог. языки: С/С++/C#

Re: Датчик касания оптический, триангуляция

Сообщение dccharacter » 10 янв 2016, 00:35

Да все правильно говорит om, че тут выделываться
сам чуть ли не каждый день матюгаюсь на макрос squal. Пытаешь переменную объявить squal, получаешь мат от компилятора. Почему не SQUAL, как все остальные PIN_MAX и т.д.
Но все это не важно.
Я вот сделал что (без хорошего результата, к сожалению).
-Создал переменную FR_DELAY = CLOCK/FRAME_RATE (на 24МГц при 3кГц получается где-то 330мкс)
-В каждом раунде измерений:
--Пишем в FRAME_GRAB (обнуляем счетчик, запускаем оцифровку нового кадра)
--Читаем из FRAME_GRAB до получения первого нормального пикселя while (!(temp_byte & Pixel_data_valid));
--Ждем FR_DELAY - кадр за эти 350мкс должен полностью оцифроваться, регистры типа МАКС_ПИКС должны обновиться
--Вычитываем шесть стат-регистров
Включаем лазер, делаем все то же самое, выключаем лазер.
Дальше выплевываем оба наборра данных в порт.

Добавлено спустя 2 минуты 46 секунд:
setar писал(а):тут вероятнее другое - сенсор не в фокусе

Почему я грешу на лазер - пятно четко очерченное, но тусклое. Я бы визуально сфокусировал лазер, при правильной фокусировке на белой бумаге на точку неприятно смотреть, отсвечивает дай боже.
А потом уже фокусировать объектив матрицы - можно, например фокусировать, выводя на минимальное значение shutter.
Можно и наоборот - вывести shutter в минимум объективом матрицы, а потом фокусировать лазер, пытаясь увести shutter еще ниже.

Добавлено спустя 6 минут 34 секунды:
Вот на картинке центральный участок данных - видно, что шум сильный. А он и должен быть сильный. Питание через резистор - собираем все подряд из сети, всякие розовые шумы, вся эта прелесть - вот она, на картинке. А нам надо за одно измерение, желательно не имея никакой предыдущей информации, принять решение. Печалька
Вложения
noizemc.jpg
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Датчик касания оптический, триангуляция

Сообщение Dmitry__ » 10 янв 2016, 00:48

Зачем писать мелким полупрозрачным шрифтом? это не флуд, да и флуд легче читать контрастным :)

om2804 писал(а):Макросы. Вообще макросы, которые выполняют какие-то действия фиговая идея в том, что макрос pin_led_LOW не отличить от переменной pin_led_LOW. А вот вызов функции pin_led_LOW() уже понятнее.
Т.к. это действие, в названии нужен глагол, хотя бы pin_led_SET_LOW().

Я же говорил неподготовленность читателя :). dccharacter уже хотел так сделать, читайте форум. Макрос тут единственный вариант, т.к. он компилится в одну - две команды ассемблера, а работать с пзс надо на максимальной скорости доступной авр. Любое переделывание в () обернет ассемблерные команды в call, return, а это около 10 тактов контроллера (вместо 2-х тактов макроса). Работа со spi должна быть около 8мгц, а avr работает на 16 мгц.

om2804 писал(а):Magic. Всякая магия в виде непонятно откуда берущихся констант, разбросанных по всему коду. Типа: byte Frame[NUM_PIXS + 6];
Что за +6? Откуда взялось? А самое главное, что если потребуется поменять на +8

Это точно тестовый код. Есно его не будет в релизе. А означает он +6 байт для передачи компу кроме самой картинки, которая красиво оформлена в NUM_PIXS :) Где еще куча констант разбросанных по всему коду?

om2804 писал(а):Спагетти-код. Понимаю, что Arduino предлагает почти весь код пихать в loop(), но можно ж разбить на функции, хотяб по уловной компиляции с debug_type. Кстати, условная компиляция тоже усложняет чтение, но без неё не обойтись в данном случае.

Круто, вот на что тут отвечать? условная компиляция - плохо, но без нее тут нельзя. У нас подключается туча разных пзс, туча тестовых юстировочных функций, плюс мелкий авр, в котором 6 кб. памяти, отсутствие аппаратного rs232/spi из-за мапинга пинов, и в конечном датчике надо выпиливать все принтфы...
Понять и простить... :)

Добавлено спустя 2 минуты 18 секунд:
dccharacter писал(а):Да все правильно говорит om, че тут выделываться
сам чуть ли не каждый день матюгаюсь на макрос squal. Пытаешь переменную объявить squal, получаешь мат от компилятора. Почему не SQUAL, как все остальные PIN_MAX и т.д.

Так поменяй! Покажи силу гитхаба. Я склеивал код из нескольких источников + мое...

Добавлено спустя 4 минуты 31 секунду:
dccharacter писал(а):Почему я грешу на лазер - пятно четко очерченное, но тусклое. Я бы визуально сфокусировал лазер, при правильной фокусировке на белой бумаге на точку неприятно смотреть, отсвечивает дай боже.

adns5020 значительно темнее adns2610/2620, я же говорил об этом. adns2610/2620 надо обязательно загруБЛЯть.:) adns5020 не увидит фон от подсветки фонарем как adns2610/2620...
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Датчик касания оптический, триангуляция

Сообщение dccharacter » 10 янв 2016, 01:02

Слуш, если это взлетит, код потом народ причешет
Я сижу и быдлокодю у себя не стесняясь - с кодом в 300 строк можно себе это позволить

Добавлено спустя 10 минут 28 секунд:
Код: Выделить всёРазвернуть
40
41
32
40
41
32
33
41
42
34
42
43
34
36
44
45
36
45
46
36

Явно какая-то фигня. Надо замерить частоту провалов :-) Прям как-то совсем идеально

Добавлено спустя 3 минуты 31 секунду:
4мс период измерений у меня получился
Т.е. это сеть таки наводит?
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Датчик касания оптический, триангуляция

Сообщение Dmitry__ » 10 янв 2016, 01:14

Самое смешное, что гитхаб не работает в таких случаях. Этот код одного программиста, вмешиваться в этот процесс - потерять время. Я это предвидел, но пошел на это. Теперь у нас 2 ветки - полурабочий код гитхаба и полностью рабочий мой код, который трудно понятен публике :)
Я уже работаю на ветке гитхаба, но изредко начинают вылезать косяки, т.к. код не инспектировали, но он красив...
Все что ты сейчас быдлокодишь с любыми регистрами кроме pixmax - трата времени и я это тоже предвидел :roll: Пока не сделаешь регулировку мощности лазера для поддержания регистра pixmax на одном значении - трата времени.
Я получил нормальный результат с регулировкой лазера, но полностью разобрал все стройные столбики программы. Твой инлайн, который подавал надежды, просто убил возможность дописывания кода. Попробуй с "pixel_and_params_grab(Frame);" вытащить единственный нужный регистр pixmax - для регулировки лазера. У меня теперь это выглядит так: "RefrPowerLaser(Frame[NUM_PIXS + 1]);" :o Т.к. теперь все стало относительным, ЗАЧЕМ-ТО на указателях и инлайнах. Авр тини с указателями - грызет кактус и плачет.
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Датчик касания оптический, триангуляция

Сообщение dccharacter » 10 янв 2016, 01:29

Ты чо, Дим? Нафиг граб-функции использовать для одного пикселя?
data = ADNS_read(Maximum_Pixel);
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Датчик касания оптический, триангуляция

Сообщение Dmitry__ » 10 янв 2016, 01:33

Патамучта ты уже сграбил все данные, картинка ушла на комп, осталось только вытащить pixmax для регулировки лазера, не буду же я из-за непонятного инлайн читать еще раз регистр пзс.
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Датчик касания оптический, триангуляция

Сообщение om2804 » 10 янв 2016, 01:34

Dmitry__ писал(а): Макрос тут единственный вариант ... а работать с пзс надо на максимальной скорости доступной авр.

Хм. Всё пихать в loop и везде делать delay тоже единственный вариант для работы на максимальной скорости?
Если же это так необходимо для оптимизации, то хотя б имена понятные нужны.

Dmitry__ писал(а): Где еще куча констант разбросанных по всему коду?

Вы их обязательно найдёте, если будете искать.
Код: Выделить всёРазвернуть
unsigned char Str[5];
if (motion > 127) {

К тому же это больше совет на будущее.

Dmitry__ писал(а): Понять и простить... :)

Рефакторинг. Только рефакторинг

Ещё раз повторю. Я понимаю, что всё делается на коленке. Это лишь советы на будущее
Аватара пользователя
om2804
 
Сообщения: 2044
Зарегистрирован: 30 апр 2012, 20:03
Откуда: Архангельск
Skype: om2804
прог. языки: С/С++/C#

Re: Датчик касания оптический, триангуляция

Сообщение dccharacter » 10 янв 2016, 01:37

Dmitry__ писал(а):Патамучта ты уже сграбил все данные, картинка ушла на комп, осталось только вытащить pixmax для регулировки лазера, не буду же я из-за непонятного инлайн читать еще раз регистр пзс.

ну йо майо, тебе все бантики
typedef enum...
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Датчик касания оптический, триангуляция

Сообщение Dmitry__ » 10 янв 2016, 01:42

om2804 писал(а):Вы их обязательно найдёте, если будете искать.

Опять мимо, т.к. это:
Код: Выделить всёРазвернуть
debug_type = 5  Данные перемещения мышки.

Проверялось на стадии первых подключений пзс к авр и больше никогда не поддерживался. Мопед не мой, скопипастен из инетов. Мышкой по коврику в датчике водить никто не будет. Оставлен для людей пилящих свои авр мышки на нашем коде.

Добавлено спустя 1 минуту 54 секунды:
dccharacter писал(а):ну йо майо, тебе все бантики
typedef enum...

Да, да, да. Еще один уровень абстракции. :)
Последний раз редактировалось Dmitry__ 10 янв 2016, 01:49, всего редактировалось 1 раз.
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Датчик касания оптический, триангуляция

Сообщение dccharacter » 10 янв 2016, 01:45

Дим, че ты брыкаешься? Код хреновый, забей. Датчик не работает - вот в чем проблема!
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Датчик касания оптический, триангуляция

Сообщение Dmitry__ » 10 янв 2016, 01:46

:)
У кого не работает? У меня работает, контраст 5 соток, думаю как довести контраст до 1-2 соток.
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Пред.След.

Вернуться в 3D печать

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 9