01 окт 2017, 10:17
plotnik писал(а):Не совсем...
Обманул всех - болтал, болтал, а ссылку на прошивку не дал, поэтому и никто там не регистрируется...
20 дек 2017, 10:43
15 мар 2018, 15:03
06 апр 2018, 10:47
12 апр 2018, 10:43
17 май 2018, 18:53
21 авг 2018, 19:06
Летящий писал(а):доброго времени суток. Собрал хронограф на ардуино. И казалось бы все идеально рабоает, но сравнил его показания с рамочным - отличаются довольно сильно. На скоростях около 270м/с скорость скачет хаотично до +-7м/с (когда рамочник показывает разброс +-2м/с). На скоростях 20м/с (плевок бумажкой) ардуино занижает скорость на 6-9м/с также хаотично.
Схемотехника простая - светодиоды светят на фототранзисторы, которые подтянуты к земле резисторами (кажется на 10кОм, точно не помню - паял полгода назад). Т.е. пока транзистор освещен, на сигнальном проводе лог. 1, в темноте лог. 0. Сигнал идет на контакты внешнего прерывания INT0 и INT1.
Ардуино nano запитана от преобразователя напряжением 5,5в.
текст программы:
#include <util/delay.h> // библиотека
#include "TM1637.h" // библиотека экрана
#define CLK 5 // пины подключения к экрану
#define DIO 4
TM1637 tm1637(CLK,DIO); // создаем экземпляр объекта типа «TM1637», с которым будем работать и задаем пины.можно было и не определять константы, а написать проще — вместо трёх предыдущих строк одну:
// TM1637 tm1637(5,4);, но так как мы сделали наглядней
int l = 100; // длинна между воротами в мм
int u = 0; // переменная для скорости
volatile boolean g1 = 0; // переменная для ворот1
volatile boolean g2 = 0; // переменная для ворот 2
volatile int t = 0;
void Timer1 ( void ) // функция инициализаици таймера1
{
TCCR1A = 0; //обычный режим
TCCR1B = 0; // таймер остановлен
TCNT1 = 0; // таймер обнулен
TIMSK1 = 0; //сбросили флаги
TIMSK1 |= (1<<TOIE1); //Разрешение прерывания по переполнению Т1.
}
void external_interrupts () // функция инициализаици внешних прерываний
{
EICRA = 0; // выставляем 0 во всем регистре
EICRA |= (1 << ISC11) | (1 << ISC01); // падающий фронт вызывает прерывания по INT1 и INT0
EIMSK |= (1 << INT1) | (1<<INT0); // разрешили внешние прерывания
}
ISR(INT0_vect) // функция прерывания 0
{
TCNT1 = 0; // обнуляем таймер
TCCR1B |= (1 << CS10); // запускаем таймер1
g1 = 1; // ставим метку, что 1 ворота пройдены
g2 = 0; // на всякий снимаем флаг со 2 ворот.
}
ISR(INT1_vect) // функция прерывания 1
{
TCCR1B = 0; // останавливаем таймер1
g2 = 1; // ставим метку, что ворота 2 пройдены
}
ISR(TIMER1_OVF_vect) // функция прерывания по переполнению таймера1
{
// g1 = 0;
// g2 = 0;
// TCCR1B = 0; // останавливаем таймер1
// TCNT1 = 0; // таймер обнулен
// t = 1;
t = t + 1;
}
void setup() {
Timer1(); // инициализировали таймер1
external_interrupts(); // инициализация внених прерываний
sei(); // разрешили глобальные прерывания
tm1637.init(); // инициализировали библиотеку экрана
tm1637.set(BRIGHT_TYPICAL); // выбираем значение яркости экрана BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;
Serial.begin(9600); // сериал соединение с компом
Serial.println("Hello"); // говорим привет компу
for (int i=9999; i > 0; i = i - 1111){ // покажем на дисплее цифры от 9 до 1 для проверки
tm1637.display( i );
_delay_ms(100);
}
tm1637.display(0); // ноль на дисплей
}
void loop()
{
if (g1 == 1 && g2 == 1) // если пуля пролетела все ворота посчитать скорость, сообщить эту скорость, сбросить маркеры ворот, сбросить счетчик
{
u = 16000000/(65535*t+TCNT1); // u = l*v/x u больше в 10 раз для удобства
Serial.print( "speed = " );
Serial.println( u );
tm1637.display( u );
t = 0;
g1 = 0;
g2 = 0;
TCNT1 = 0; // обнуляем таймер
for (int i=0; i < 3; i++){ // помигаем значением
tm1637.clearDisplay();
_delay_ms(100);
tm1637.display( u );
_delay_ms(200);
}
}
}
Вот вроде бы все просто как валенок и обязано работать. Где искать косяки?
void loop()
{
if (g1 == 1 && g2 == 1) // если пуля пролетела все ворота посчитать скорость, сообщить эту скорость, сбросить маркеры ворот, сбросить счетчик
{
u = 16000000/(65535*t+TCNT1); // u = l*v/x u больше в 10 раз для удобства
Serial.print( "speed = " );
Serial.println( u );
tm1637.display( u );
t = 0;
g1 = 0;
g2 = 0;
TCNT1 = 0; // обнуляем таймер
for (int i=0; i < 3; i++){ // помигаем значением
tm1637.clearDisplay();
_delay_ms(100);
tm1637.display( u );
_delay_ms(200);
}
}
07 окт 2018, 19:35
03 ноя 2018, 21:39
12 ноя 2018, 01:51
12 ноя 2018, 07:27
28 мар 2019, 10:10
28 мар 2019, 11:41
28 мар 2019, 11:58
28 мар 2019, 13:11
VROON писал(а):библеотеки все стоят
28 мар 2019, 19:35
22 апр 2019, 22:16
23 май 2019, 22:30
05 сен 2019, 18:31
08 сен 2019, 07:57
GenFail писал(а):Прошивка для хронографа с дисплеем на чипе TM1637.
Измерение скорости + сохранение результатов в EEPROM (до 50).
Полностью совместима с хронографом от AlexGyver.
Работает на Atmega168/328 (возможно, будет работать и на Atmega8, с ней я проверял только на запуск).
Используется таймер1 без предделителя, также можно настраивать напряжение на датчиках без мультиметра (удерживая кнопку включить хронограф - войдет в сервисный режим).
13 сен 2019, 01:15
14 фев 2020, 13:40
25 июн 2020, 17:22
Gilbert888 писал(а):Доработал немного датчик. Использовал вот такую штуку
https://umnaya-elektronika.ru/datchiki/ ... pyatstviy/
диод и транзистор использовал с датчика, немного удлиннив провода.
Платы закрепил к трубе обычными стяжками.
30 июн 2020, 16:12
30 июн 2020, 23:09
michman_Hab писал(а):доброго времени.
вопрос по датчикам, если использовать от принтеров датчики с энкодеров?
их у меня накопилось разных.
01 июл 2020, 05:00
01 июл 2020, 07:10
01 июл 2020, 09:27
michman_Hab писал(а):вот нашел в закромах Ардуино Pro mini 5V / 16M она на ATmega328 но без юсб порта
можно ли на ней собрать?
01 июл 2020, 09:39
michman_Hab писал(а):вопрос по датчикам, если использовать от принтеров датчики с энкодеров?
Rishelie писал(а):Среди меня бродит мнение, что любой оптический датчик по быстродействию справится.