Хронограф на DigiSpark
- Войдите на сайт для отправки комментариев
Доброго дня.
Помогите пожалуйста с реализацией хронографа на DigiSpark.
Ситуация: давно хотел начать знакомство с ардуино. Делать что-то бесполезное смысла не видел. Недавно на глаза попалась статья "Дешевый хронограф своими руками" на хабре и я решился попробовать. Закупил все необходимое, дождался посылки, собрал в кучку, нашел несколько ошибок в скетче (видимо сделанных намеренно) и даже записал скетч в плату, но оно не желает работать. Повторюсь - опыта микроэлектроники нет, только поверхностные знания принципов работы.
Теперь к сути: Если в скетче который приведен в статье, в цикл старта добавить вывод уровня analogRead на дисплей (для тестирования, что плата вообще видит изменения датчиков), что видимо замедляет скорость чтения, то схема начинает работать (ну почти), т.е. она видит скачок уровня и вываливается из первого цикла, но уже не успевает отследить второй скачек и вываливается по таймауту из цикла конца и появляется сообщение об ошибке. А если его закомментировать, то вся конструкция перестает реагировать на внешние раздражители (кидал разные детальки, тыкал карандашем и пр.) Может она работает "слишком быстро" и успевает отследить изменение уровня с датчиков с малым шагом? Т.е. надо просто использовать бОльшую скорость предмета для тестирования?
Подскажите пожалуйста: в какую сторону еще рыть, чтоб это все поехало?
Зы: Комменты к статье прочитал и то, что оно будет показывать погоду на луне меня особо не волнует, просто хочется доделать игрушку до конца.
Получился такой код
/* * Хронограф для измерения скорости движения пули, © SinuX 23.03.2016 */ #include <TM1637.h> #define CLK 0 // Пин дисплея #define DIO 1 // Пин дисплея #define ANALOG_PIN 1 // Аналоговый пин #define LEV 50 // Порог срабатывания старта #define TIMEOUT 10000 // Время ожидания финиша в микросекундах #define BULLET_WEIGHT 0.00051 // Масса пули в килограммах (для вычисления энергии) #define ENCODER_DIST 0.1 // Расстояние между датчиками в метрах (10см = 0.1м) #define SHOW_DELAY 3000 // Время показа результата // Для ускорения analogRead #ifndef cbi #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) #endif #ifndef sbi #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) #endif // Служебные переменные int prevVal, curVal; unsigned long startTime, endTime; TM1637 tm1637(CLK, DIO); /* Переделанная функция TM1637::display(), которая позволяет зажигать отдельные сегменты * Нумерация сегментов: младший бит - верхний сегмент и т.д. по часовой стрелке * Центральный сегмент - старший бит */ void setSegments(byte addr, byte data) { tm1637.start(); tm1637.writeByte(ADDR_FIXED); tm1637.stop(); tm1637.start(); tm1637.writeByte(addr|0xc0); tm1637.writeByte(data); tm1637.stop(); tm1637.start(); tm1637.writeByte(tm1637.Cmd_DispCtrl); tm1637.stop(); } // Инициализация void setup() { // Устанавливаем prescaler на 8 для ускорения analogRead cbi(ADCSRA,ADPS2); sbi(ADCSRA,ADPS1); sbi(ADCSRA,ADPS0); // Инициализация дисплея tm1637.init(); tm1637.set(6); // Отображение приветствия setSegments(0, 118); setSegments(1, 121); setSegments(2, 54); setSegments(3, 63); delay(1000); } // Главный цикл void loop() { // Заставка ожидания showReady(); // Ожидание старта curVal = analogRead(ANALOG_PIN); do { prevVal = curVal; curVal = analogRead(ANALOG_PIN); tm1637.display(0, curVal / 1000 % 10); tm1637.display(1, curVal / 100 % 10); tm1637.display(2, curVal / 10 % 10); tm1637.display(3, curVal % 10); } while (curVal - prevVal < LEV); startTime = micros(); // Ожидание финиша curVal = analogRead(ANALOG_PIN); do { prevVal = curVal; curVal = analogRead(ANALOG_PIN); // Если превышен интервал ожидания - показ ошибки и выход из цикла if (micros() - startTime >= TIMEOUT) { showError(); return; } } while (curVal - prevVal < LEV); endTime = micros(); // Вычисление и отображение результата showResult(); } // Отображение заставки ожидания выстрела void showReady() { setSegments(0, 73); setSegments(1, 73); setSegments(2, 73); setSegments(3, 73); delay(100); } // Вычисление и отображение скорости, энергии пули void showResult() { // Вычисление скорости пули в м/с и вывод на дисплей float bulletSpeed = ENCODER_DIST * 1000000 / (endTime - startTime); tm1637.display(0, (int)bulletSpeed / 100 % 10); tm1637.display(1, (int)bulletSpeed / 10 % 10); tm1637.display(2, (int)bulletSpeed % 10); setSegments(3, 84); delay(SHOW_DELAY); // Вычисление энергии в джоулях и вывод на дисплей float bulletEnergy = BULLET_WEIGHT * bulletSpeed * bulletSpeed / 2; tm1637.point(1); // Вместо точки ':' - костыль, но пойдет) tm1637.display(0, (int)bulletEnergy / 10 % 10); tm1637.display(1, (int)bulletEnergy % 10); tm1637.display(2, (int)(bulletEnergy * 10) % 10); setSegments(3, 30); delay(SHOW_DELAY); tm1637.point(0); } // Вывод ошибки при превышении времени ожидания пули void showError() { setSegments(0, 121); setSegments(1, 80); setSegments(2, 80); setSegments(3, 0); delay(SHOW_DELAY); }
Sylver, вы бы ссылку на исходную статью выложили, а то вообще непонятно, что вы делаете. И что за Дигиспарк? - для меня Дигиспарк - это Аттини85 - неужели вы все это делаете на восьминогой тиньке?
Просто иногда админы банят за ссылки - решил не рисковать, т.к. правила не читал - каюсь (
https://habr.com/post/372315/
И да, Дигиспарк - это Аттини85 и делаю именно на ней.
Просто решил, что чем меньше платка - тем проще с ней разобраться будет, а потом глядишь и Ардуину приобрету ))
Буду благодарен за любые идеи.... Даже самые бредовые )))
Делать что-то бесполезное смысла не видел.
В том, чтобы чему-то научиться, смысл есть?
Сейчас Вы попыталсь взяться за проект, который Вам не по зубам.
Так что самый разумный совет: выберите проект попроще - такой, с которым сможете справиться.
Буду благодарен за любые идеи.... Даже самые бредовые )))
Идея первая - подробно опишите, что именно по Вашему мнению должна делать программа.
Вероятнее всего, Вы сами в процессе обнаружите источник проблемы.
Ну а если нет, у нас будет возможность сравнить описание с кодом и понять, что не совпадает.
Ведь, как известно, программа всегда работает в точности так, как она написана. Но не всегда это совпадает с тем, как ее хотели написать. Когда Вы публикуете код, мы можем узнать лишь "как написана", но откуда мы можем узнать "как ее хотели написать"?
Добрался до дома и решил протестить девайс в реальных условиях: а оно возьми и покажи цифры :-)
Не уверен в 100% верности результата, но цифры похожи на правду.
Видимо мое предположение про быструю дискретизацию было близко от верности, т.к. на манипуляции руками девайс так и не реагирует.
Всем спасибо.
Сейчас Вы попыталсь взяться за проект, который Вам не по зубам.
Так что самый разумный совет: выберите проект попроще - такой, с которым сможете справиться.
Спасибо за поддержку и совет :-Р
У меня такая штука работает. Смысл программы был в ожидании прерывания на цифровой ноге, при пролёте пули по прерыванию запускался таймер. Прерывание на второй ноге таймер останавливало. Скорость расчитывается как расстояние между датчиками делённое на время таймера. Калибровка по свободному падению свинцового шарика с разной высоты. Измеренная скорость при падении с высоты 1 метр отличается от расчетной не более 5%, среднее отклонение результата в 10 опытах около 1%. Для регистрации пролёта пули на больших скоростях пришлось поставить компараторы и подбирать пороги к фотодиодам иначе изменение уровня сигнала не хватало для срабатывания.
nik182 все верно описал, спасибо.
Разница с этим устройством, в том, что данные берутся с аналогового входа и отслеживается скачок повышения уровня на 50 единиц (честно не знаю чего т.к. напряжение 1,5в соответствует значению ~350) Повышение уровня (а не понижение) наверное связано с исключением влияния засветки, хотя я в этом не уверен. Первый скачок запускает таймер, второй инициализирует остановку и вычисления значений, во избежание зацикливания добавлен таймаут.
Про погрешности пока сказать ничего не могу, надо будет провести сравнительный анализ.
Предполагаю, что для большей точности перед светодиодами необходимо сделать щелевой ограничитель, но места внутри трубки крайне мало, а если шель нарисовать на светодиоде, то это не приведет к желаемому результату из-за линзы фокусирующей пучок.
Пролёт пули из воздушки между датчиками около милисекунды. Одного датчика несколько десятков микросекунд. Ваш цикл проверки уровня больше 10 милисекунд. Что вы собрались мерить?
Пусть скорость пули 120 м/с = 0,12 мм/мкс и длинна пули 5мм, путем деления подучаем 41,6 мкс на прохождение пулей геометрической точки датчика (для упрощения расчетов). Согласно статьи после изменения множителя prescaler на 16, одно аналого-цифровое преобразование будет занимать ~17 мкс. Итого за 41 мкс АЦП успеет сделать два преобразования.
Доказательство от противного ))
Собрал - работает, значит железяка успевает увидеть пулю и просчитать данные - все просто)))
Думаете, что кроме преобразований МК ничем больше не занимается?
У вас кроме ацп в цикле вывод на дисплей, сравнения, переходы, присваивания. Просто посчитайте сколько времени всё это занимает и поймёте что вывод на дисплей в цикле не нужен.
Извините, но в начале поста написано...
Естественно, что в боевом скетче это будет закомментировано или вообще удалено.
Вот так и вижу, как Вы приходите к Плющенко и говорите, что "вот тут я посчитал... согласно статье человек может повернуться на 360 градусов за полсекунды. Так что если разогнаться с такой-то скоростью, подпрыгнуть и крутиться, то восьмерной тулуп можно будет сделать". А он Вам ботинком по жопе - хрясь!
Потому что если думаешь, что знаешь, как сделать что-то лучше тех, кто уже через это прошел - просто сделай, измерь и покажи, а не рассказывай, как когда-нибудь ты закомментируешь там, как ранее никто не догадался, и всё - МК сразу начнет пули хватать лапами.
Господа, я действительно не понимаю, чего Вы все пытаетесь мне доказать?
ЭТО НЕ МОЙ РОПЕКТ, я просто его собрал и не удосужился проверить в боевых условиях!!!!
ВСЕ!!!! СЕЙЧАС ОНО РАБОТАЕТ!!! ПОТОМУ ЧТО Я ХЗ ПОЧЕМУ, НО ОНО РАБОТАЕТ!!!
Господа, я действительно не понимаю, чего Вы все пытаетесь мне доказать?
пытаемся подсказать. что в проекте есть принципиальная ошибка, которая сводит на нет ценность любых полученных в нем данных. Но доказывать ничего никому не нужно, это же ты сюда пришел, а не мы ввалились к тебе в гостинную с коньком и бабами...
"РАБОТАЕТ" - это когда данные точные, правильные и воспроизводимые... а не просто цифры на экране.
Только не надо нам впаривать, что ты что-то там в скетче закомментировал - ничего ты этого не делал, ибо иначе и данных никких на экране (каком экране? :) не было бы.
"РАБОТАЕТ" - это когда данные точные, правильные и воспроизводимые... а не просто цифры на экране.
Означает, что после того, как я проверил верность подключения полярности светодиодов и фотодиодов мультиметром и выводом данных уровня аналогового сигнала с оптических датчиков после АЦП на 4-х сегментный дисплей, глазами считал пороговые данные при наличии и отсутсвии препятсвия между датчиками, убрал вывод более бесполезной информации с дисплея из скетча и залил готовый скетч в китайский DigiSpark, прицепил все это в собранном виде на ствол старенького ИЖ-60м с расчетной скоростью около 120-130 м/с и после выстрела получил на дисплее цифру 125 м/с, а после 10 повторов получил разброс показаний от 120 до 135 м/с - что меня полностью устраивает по точности т.к. нет необходимости настраивать плато РСР с точностью до 2-3 м/с и основной целью проекта было: "получение приближенных данных о скорости пули из древнего ИЖа и получение первоначального опыта с программированием микроконтроллера типа "ардуино".
В связи с выше изложенным, считаю, что цели проекта полностью достигнуты.
Только не надо нам впаривать, что ты что-то там в скетче закомментировал - ничего ты этого не делал, ибо иначе и данных никких на экране (каком экране? :) не было бы.
Не пытаюсь никому, ничего "впаривать". Почему? - потому, что см. выше.
это когда данные точные, правильные и воспроизводимые... а не просто цифры на экране.
Если есть желание, то можем обсудить: необходимую, допустимую и достаточную точности, абсолютную, отностительную, инструментальную, методическую, субьективную погрешности, а так же характер их проявления и методологию оценки.
Не надо считать себя умнее всех, даже если у Вас просят совета.....
Здравствуйте, а можете скинуть свой рабочий код?
И библиотека не та, и сам код не компилируется уже
Вот исправленный код
А вот код библиотеки TM1637.h
Собрал хронограф по вышеприведенной ссылке и тоже не работает: даже дисплей не светится.
Первое что обнаружил уже в скетче выложенном на этом сайте:
007
#define CLK 0 // Пин дисплея
008
#define DIO 1 // Пин дисплея
009
#define ALG 1 // Аналоговый пин
Разве верно, что пин дисплея назначен -1, и Аналоговый пин -1. Ведь вход с фототранзисторов согласно схемы идет на пин -2 (Р2). Исправил, дисплей стал высвечивать HELLO, затем полоски (готовность) и... все. Error не отображается (в ошибку не уходит). Что еще не так? Или "правила хорошего тона" скетчеписателей специально закладывают ошиПки, чтоб нам, неопытным "повторителям" их поделок сладко не жилось? Стрелял, ничего не показывает, так полоски (режим ожидания) бесконечно светятся.
Help
Правила хорошего тона скетчеписателей подразумевают, что скетчеповторитель должен обладать некоторым минимальным уровнем знаний и умений.
А правила хорошего тона на форуме предполагают, что вопрошающий должен разместить на форуме же полностью скетч и схему конкретно того устройства, которое у него (без ссылок типа "по адресу расположена схема ... только у меня резистор подпаян к D1" или "скетч расположен по адресу ..., только я заменил третий выход на пятый").
ЗЫ. И пин 1 и аналговый пин 1 - это совсем не одно и то же. А пинов с отрицательными номерами (тип -1) вообще нет.
Собрал хронограф по вышеприведенной ссылке и тоже не работает: даже дисплей не светится.....
А кто мешает хотя бы ссылку привести? Вышеприведённых ссылок несколько какая из них? Вы тоже на DigiSpark собрали? Подключение правильное? Скетч изпервого сообщения запускали и пальцем светодиоды перекрывали, что бы убедиться что срабатывает первый цикл while? Там специально внуть вставлен вывод значения АЦП. С ним мерить не будет, но проверка работоспособности схемы работает.
for andriano: от вас я вразумного ответа и не ожидал, только критика и недовольство нами, простыми "повторителями". Считаю форум(ы) и существуют для таких как я, начинающих, чтобы более опытные товарищи помогли нам в освоении нового.
по существу для уважаемого nik182 и др., желающих помочь:
1. ссылка на источник приведена буквально в третьем посту (сообщении) топикстартера, поэтому посчитал излишним повторяться, простите. Вот она https://habr.com/post/372315/
2. да, на Digispark.
3. Схема собрана верно, напряжение на пине P2 меняется: с 0.8 вольт до 0,1 вольт при вставлении ручки пишушей
3. Счетч запускал и из "оригинала", того, чья ссылка приведена выше. Сейчас попробую скетч тот, что вначале статьи.
(Вообще то меня беспокоит, почему в ошибку не вываливается, при бездействии, не пишет Error.)
Error он может написать только если из первого while выйдет. Именно проверка выхода и визиализируется в #1
Считаю форум(ы) и существуют для таких как я, начинающих, чтобы более опытные товарищи помогли нам в освоении нового.
И, если бы Вы не пренебрегали правилами сетевой этики, это было бы Вам известно.
Собрал хронограф по вышеприведенной ссылке и тоже не работает: даже дисплей не светится.....
... Скетч изпервого сообщения запускали и пальцем светодиоды перекрывали, что бы убедиться что срабатывает первый цикл while? ...
А меня больше напрягает вот это:
Закупил все необходимое, дождался посылки, собрал в кучку, нашел несколько ошибок в скетче (видимо сделанных намеренно) и даже записал скетч в плату, но оно не желает работать.
Видимо, потому и не работает
Ой, даладно... Всё работает. Пулей не перекрывается датчик. Измените lev. Сделайте меньше. Так, чтобы сам не срабатывал а с пулей да. Гдето 10 или 20.
Сейчас попробую.
Менял level на значения 50 и 80, 10 не пробовал...
Меня все таки волнует, почему при заливке окончательного кода из поста #19 хронограф при бездействии не показывает ошибку, так на полосочках и висит. Ошибка, я думаю, где то в скетче, а именно в строках начинающихся с //Главный цикл и до //Вычисления результата.
Я думаю, парни, вам, спецам, не составит найти в чем проблема, а у меня знаний в этих скетчах ноль. Но пытаюсь...
Ещё раз повторю. ( Просто обидно, что вам трудно прочитать, то что вам пишут. ) Ошибка на экране возникает если пуля пролетела через первый датчик, а через второй нет, за время TIMEOUT. С чего бы возникать ошибке, если плата ждёт первого срабатывания? Это ж нормальный режим работы. Вы сами писали, что если затемнить первый датчик, то на экране пишет ошибку. Затемните первый, затем второй датчик за время меньше TIMEOUT и на экране будет время между двумя затемнениями.
nik182, Спасибо, за толковые ответы.
Пострелял, скорость определяется, но как то нестабильно. И явно завышена.
(изменил параметр масса пули, показания стали близкие к правде :-)
Буду еще что то "крутить".
для стабильности оптопалы вдвинул в трубу поглубже, непомогло.
Видимо, надо трубу заново делать, и поточнее размечать, особенно соосность светодиодов и фототранзисторов.
У меня шарики из воздушки летают от 120 до 200 м/с . Самый простой метод проверки - в трубку кинуть свинцовый шарик с высоты 1 метр. Скорость шарика хорошо близка к расчитанной по формуле из школьного учебника физики.
Доброго дня.
Да, в начальном скетче ноги вообще были местами поменяны и еще что-то - уже не помню.
Видимо вы повторили весь мой путь ))) так же тыкал ручкой и ничего не происходило.
Потом покурил разные статьи на эту тему: луч - широкий и большая частота снятия сигнала как следствие малый шаг изменения значения при считывании (это только мои мысли) порог в 50 слишком большой, у меня вроде 20 или 30 заработало. Ошибок в скетче специально не делал, но они могли остаться т.к. скетч выкладывал последний сохраненный и не совсем уверен, что ничего в нем не правил после того как залил в железо.
На покрутить: для увеличения точности надо сужать луч от светодиода, в идеале - щелью.
приветствую, тож пытаюсь сделать сия хронограф, и тоже столкнулся с рядом проблем...
он то постоянно что-то измеряет, а если поднять значение LEV больше 20 то вообще из режима старта не выходит...
подскажите, вы спаивали всё точно так же по схеме? или всё таки нет..