Хронограф : измеритель скорости пули. От простого к сложному

han2001
Offline
Зарегистрирован: 09.01.2015

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну вот) но можно было и из старого кода взять графику для батареи, а то непонятно неподготовленному человеку что это за квадратики))

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

моргает потому что надо оптимальнее написать. не перерисовывать весь экран а только нужную часть. сначала все квадраты зарисовать, а потом нарисовать нужное

или еще оптимальнее. запоминать старое значение и если изменилось нарисовать квардрат/квадраты, или наоборот ненужные затереть

хотя глаз наверно и не видит этих морганий

han2001
Offline
Зарегистрирован: 09.01.2015

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

во вкладке LCD замени функцию Sendbyte на эту, дожно быть без мерцаний

void SendByte(byte mode, byte c){
  dWrite(CS, 0);
  (mode)? dWrite(Data,1) : dWrite(Data,0);
  dWrite(Clock, 1);
  for(byte i=0;i<8;i++){
    dWrite(Clock,0);
    (c & 0x80)? dWrite(Data,1) : dWrite(Data,0);
    dWrite(Clock,1);
    c <<= 1;
  }
  dWrite(Clock, 0);
}

в исходниках тоже поправил

han2001
Offline
Зарегистрирован: 09.01.2015

Уже было сделано сразу еще со страници 6 этой ветки в этом посте и да оказалось, что менюшка быстрей переключаются.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну значит надо делать как в 303 посте

han2001
Offline
Зарегистрирован: 09.01.2015

jeka_tm не подскажешь, как cделать шаг перемещения индикатора батареи по оси Y плавно (попиксельно), а не скачкообразно при использовании функции Goto_XY(x,y) ? По оси X перемещается свободно и точно, а по оси Y меняешь значения на пару едениц и индикатор уходит сразу в середину экрана или в конец

void Goto_XY(char x, char y){
  SendByte(0,(0xb0|(y&0x0F)));      // установка адреса по Y: 0100 yyyy
  SendByte(0,(0x00|(x&0x0F)));      // установка адреса по X: 0000 xxxx - биты (x3 x2 x1 x0)
  SendByte(0,(0x10|((x>>4)&0x07))); // установка адреса по X: 0010 0xxx - биты (x6 x5 x4)
}

void napr(){
  U = analogRead(accum);
  U = constrain(U, 650, 855);
  U = map(U, 650, 855, 0, 9);
Goto_XY(78,3);

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Goto_XY это для перехода по строкам. она тебе вроде как и не нужна. разве что если твой уместится по высоте в 8 писелей в одной из строк. в коде почти все графические фукнции имеют возможность задать координаты вывода

han2001
Offline
Зарегистрирован: 09.01.2015

Я прошу прощения, но я выдрал индикатор из вашего прошлого проекта и воткнул в текущий, подвинул немного левее среднию скорость, а в этоже окно правее индикатор, только индикатор начинается с 0-го пикселя по Y и перемещяется функцией Goto_XY,т.е. по строкам , а символы с третъего пиксела и перемещаются по пиксельно. Но спасибо, что прояснили по функции  Goto_XY, значит буду думать как переместить индикатор другой функцией.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

в том проекте было сделано по другому, и там достаточно было меги8

ellcroww
Offline
Зарегистрирован: 18.12.2015

Здравствуйте, хотел сказать спасибо автору за идею дипломного проекта)

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

))) даже так. заработай пятерку

Helgi000
Offline
Зарегистрирован: 11.03.2015

А нельзя дописать в код проверку скорострельности? Было бы суперски удобно замерять

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

честно сказать не то чтобы долго, надо куда то это выводить, еще один экран наверно делать, в смысле окно, хз как описать попроще

но времени у меня свободного почти нет, не то что раньше, поэтому я врядли как то модернизировать его буду, если кто то будет допиливать, как недавно индикацию питания к нему приделали вместо количества измерений

Asad500098
Offline
Зарегистрирован: 06.01.2016

jeka_tm , подскажи, пожалуйста, от какой нокии  лучше использовать дисплей.  http://ru.aliexpress.com/item/New-Pro-Mini-Atmega-328-5V-16M-Improved-Version-Module-Replace-Arduino-Nano-Board/1602482574.html эта плата подойдет для хронометра ?

han2001
Offline
Зарегистрирован: 09.01.2015

Я например в настоящее время мучаю такую плату (arduino pro micro). Прошивку заливать удобно сразу через microUSB порт.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

если дальше ардуину не будешь изучать то возьми такую или такую

я за первую, хоть у самого пяток вторых. просто до этого не попадались с microusb. arduino pro micro без необходимости в проекте usb (клавиатуры, геймпады) не стал бы ставить

а дисплей в проекте у меня только 1202. есть еще несколько, но там либо размер меньше либо паять гемор. была мысль под такой переделать. но мелковат, да и разбираться с ним наверно пришлось бы для других шрифтов и другой высоте

Angbor
Angbor аватар
Offline
Зарегистрирован: 26.10.2015

не знаю, как подписаться на тему без того, чтобы написать пост :)

интересный проект

cahgep
Offline
Зарегистрирован: 07.02.2016

Здравствуйте! а по деньгам что выходит на сборку платы с датчиками?

ну и нет желающих взяться за изготовление, за денюжку естественно =)

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

там все недорогое. кто собирать будет не знаю

cahgep
Offline
Зарегистрирован: 07.02.2016

Ну примерно какие суммы?

han2001
Offline
Зарегистрирован: 09.01.2015

За электронную часть в районе 1т.р, ну может чуть меньше, с учетом себестоимости одной платы 300р. Правдв китайцы по одной плате не делают + 500р токарю за трубку.

Итого себистоимость моего аппарата мне обошлась около 1500р.

Angbor
Angbor аватар
Offline
Зарегистрирован: 26.10.2015

красиво

Bkmz62
Offline
Зарегистрирован: 19.02.2016

Здравствуйте! Отличный нужный проект,спасибо за схему. Не подскажете,последняя прошивка подойдет к Atmega168PA? 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

привет. нет. в 168 оперативной памяти вроде не хватит даже если попробовать скомпилировать. да ардуина нано 130 р стоит

Bkmz62
Offline
Зарегистрирован: 19.02.2016

Спасибо за ответ

Buldakov
Offline
Зарегистрирован: 17.01.2016

Первый вопрос по схеме. В качестве датчика используем l32p3c.  Открываем даташит на него по ссылке

http://lib.chipdip.ru/195/DOC000195379.pdf

и на второй странице читаем параметр TF и TR. Типичное значение 15 мкс для фронта и спада. Итого лучше 30 кгц мы ничего не получим. И компаратор здеся не поможет. Выход сдесь один. Использовать не фототранзистор , а фотодиод. Быстродействие схемы только за счет этого можно увеличить в сотни раз. Ну и естественно оставить компаратор.

Ну и для начала проверьте быстродействие датчика. На излучающий датчик подаем прямоугольные импульсы частотой например 10 кгц.  И смотрим эти же импульсы на приемном датчике после компаратора. Подаем это на двухканальный осцилограф. На первый вход сигнал с генератора. На второй вход сигнал с выхода компаратора. И смотрим задержку между импульсами. Меняя наименования деталей и последовательно увеличивая частоту генератора до 1000 кгц добиваемся минимальной задержки. Простыми способами можно получить задержку порядка 100 нс.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

да это накладывает ограничение на минимальное расстояние между датчиками

например самый сложный случай время между импульсами 30мкс. расстояние между датчиками 70мм.

70мм/30мкс=2333м/с. ну это гораздо выше максимальной измеряемой скорости

уже и ардуина не успеет такие скорости измерить, так как каждое прерывание это еще запоминание времени текущего

кстати компаратора нет в последней версии

проблема быстродействия датчиков возникнет не в данном хронографе

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

han2001
Offline
Зарегистрирован: 09.01.2015

jeka_tm а у вас првильно отображалась средняя скорость?

А то чего то у меня не правильно. И вроде бы формулы правильные, 

    for(byte i=0;i<n;i++){

      middle=middle+DATA[i];
    }
    if(n!=0) middle=middle/(n+1);
только данные средней скорости какие то кривые.
jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

вроде да. надо проверять раз возможно ошибка

han2001
Offline
Зарегистрирован: 09.01.2015

Если будет возможность проверьте пожалуйста. Может мой arduino pro micro считает чего то не того, хотя как мне кажется, что от платфрмы расчет арифметических операций зависить не должен.

maxiplus93
Offline
Зарегистрирован: 07.03.2016

Хочу купить это устройство,так как очень понравился хронограф,но сделать самому не получиться мало что я в этом понимаю.Можно без корпуса только начинка.Буду очень признателен.   Напиши мне в VK https://vk.com/maxiplus

han2001
Offline
Зарегистрирован: 09.01.2015

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

piratepike
Offline
Зарегистрирован: 18.03.2016

Доброго времени суток. Подскажите-закинул полный скетч в среду arduino 1.6.7. Выбрал в инструментах плату Arduino/Genuino Uno. Компиляция выдает ошибку. Следовательно не могу залить проект в Arduino Uno Rev3. В чем может быть проблема?

PS-тапками прошу не закидывать. поскольку с ардуино только начал знакомство и многие вещи ещё мною не изучены

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

я пользуюсь версией 1.0.6

piratepike
Offline
Зарегистрирован: 18.03.2016

jeka_tm пишет:

я пользуюсь версией 1.0.6

а фьюзы надо менять в файле boards.txt??? Я пользуюсь средой без всяких исправлений. Плюс заметил- для Micro компиляция проходит без проблем. А сейчас акцентировал внимание на фьюзы(почитал), и решил узнать про правку фьюзов в файле boards.txt для своей китайской Arduino Uno Rev.3. Нужно ли под этот скетч парвить фьюзы?  Если я прав, то после этих манипуляций не умрет ли платка для последующих экспериментов?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

фьюзы это только если будешь прошивать бутлоадер, а так они не нужны

piratepike
Offline
Зарегистрирован: 18.03.2016

jeka_tm пишет:

фьюзы это только если будешь прошивать бутлоадер, а так они не нужны

а я проверил-там такие же значения... ((( Попытаюсь найти версию 1.0.6 и скетч компильнуть для версии Arduino/Genuino Uno

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013
piratepike
Offline
Зарегистрирован: 18.03.2016

Спасибо. Уже сам нашел, скачал и проверил. И самое удивительное-скомпилило вообще без предупреждений и ошибок на версии 1.0.6. А как же так??? Чего то я не понимаю. Как такое может быть? )))

PS-дополнительно jeka_tm тебе отдельное большое СПАСИБО-за скетч, проект хрона и оперативную помощь )))

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

пожалуйста. да хз почему

по хорошему ты должен был приложить ошибку которую выдал компилятор

dekus
Offline
Зарегистрирован: 22.03.2016

Сам делаю проекты на 1202, поэтому решил поделиться. Делал замеры с помощью logic analyser. Частота меги 16МГц. Обновление (запись всего буфера в экран) экрана 1202 занимает 7.5 мс, если использовать как здесь програмный spi. Если развести аппаратный spi, то обновление всего экрана будет занимать 4.4 мс (на частоте spi 4МГц)

То есть теоритически (чистое обновление, без какой либо логики) получается:

программный spi - 133 Гц.

аппаратный spi - 222 Гц.

P. S. Цифры с моего кода, но похож на код автора.

P. P. S. Еще есть дисплей C1-00. 140р стоит. Он побольше и цветной. Но разъем точно такой же, подсветка так же один светодиод (по крайней мере у меня такие). То есть при желании можно перейти и на такой )

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

у меня похожие цифры получались

http://arduino.ru/forum/obshchii/vremya-na-ispolnenie-raznykh-funktsii#c...

но позже узнал что void loop медленный. если внутри while(1) поставить и внутри крутить код получится быстрее

dekus
Offline
Зарегистрирован: 22.03.2016

А чего гадать то )). Благо arduino это же набор C функций, а не скомпилированные библиотеки.

Смотрим:

int main(void)
{
	init();

	initVariant();

#if defined(USBCON)
	USBDevice.attach();
#endif
	
	setup();
    
	for (;;) {
		loop();
		if (serialEventRun) serialEventRun();
	}
        
	return 0;
}

И видим что еще есть

if (serialEventRun) serialEventRun();

Если никакие данные от компьютера не приходят, то дает 1 ассемблерную команду проверки регистра ))

Так что это какие то сказки про while(1)

А если хочется посмотреть ассемблерный код своего проекта (с описаниями из C кода), то

avr-objdump -h -S xxx.elf > xxx.asm

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а эта 1 команда тоже отнимает время

dekus
Offline
Зарегистрирован: 22.03.2016

Использовать digitalRead/digitalWrite которые дают килогерцы быстродействие, вместо мегагерц прямого обращения к портам и писать про одну ассемблерную команду. Ну это не серьезно ))

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

не подожди мы же говорили о максимальной скорости отрисовки, а она будет если применить while(1)

dekus
Offline
Зарегистрирован: 22.03.2016

Да при  чем тут loop. Он работает один раз за один кадр.

Хочешь скорости, то в функции передачи кадра на дисплей убирай вызов функции, убирай проверку на дата/команда, убирай цикл передачи 8 бит. По коду конечно несколько больше, но получается 4.9 мс. Это у меня еще прерывания работают. Но мне влом убирать.

Я за 30 секунд работы сделал из 133Гц 201Гц )))

 

То есть твоим кодом. Я его не проверял, просто тут написал, чтобы понятно было. Сам цикл for передачи 8 бит тоже много ест времени.

void Update(){

uint8_t data;
	  for(byte p = 0; p < 9; p++){
	    SendByte(LCD_C, SetYAddr| p);
	    SendByte(LCD_C, SetXAddr4);
	    SendByte(LCD_C, SetXAddr3);
	 
	    for(byte col=0; col < LCD_X; col++){
	      data = LCD_RAM[(LCD_X * p) + col];
	      dWrite(Data,1);	      
	      dWrite(Clock, 1);
	      dWrite(Clock, 0);

	      (data & 0x80)? dWrite(Data,1) : dWrite(Data,0);
	      dWrite(Clock, 1);
	      dWrite(Clock, 0);
	      (data & 0x40)? dWrite(Data,1) : dWrite(Data,0);
	      dWrite(Clock, 1);
	      dWrite(Clock, 0);
	      (data & 0x20)? dWrite(Data,1) : dWrite(Data,0);
	      dWrite(Clock, 1);
	      dWrite(Clock, 0);
	      (data & 0x10)? dWrite(Data,1) : dWrite(Data,0);
	      dWrite(Clock, 1);
	      dWrite(Clock, 0);
	      (data & 0x08)? dWrite(Data,1) : dWrite(Data,0);
	      dWrite(Clock, 1);
	      dWrite(Clock, 0);
	      (data & 0x04)? dWrite(Data,1) : dWrite(Data,0);
	      dWrite(Clock, 1);
	      dWrite(Clock, 0);
	      (data & 0x02)? dWrite(Data,1) : dWrite(Data,0);
	      dWrite(Clock, 1);
	      dWrite(Clock, 0);
	      (data & 0x01)? dWrite(Data,1) : dWrite(Data,0);
	      dWrite(Clock, 1);
	      dWrite(Clock, 0);
	    }
	  }
	}

Еще у меня один цикл основной, а не два как у тебя. 2 цикла тоже кушают.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ладно чего спорить