Сергей Михайлович Сергей Михайлович Добавил запись в Персональный блог 413,48 Россия, Ярославль
Замер времени (предварительная версия 001)
16

 Проект по автоматическому замеру времени круга на трассе. Всё находится на стадии идеи, никогда этим не занимался, прошу по возможности помочь и не закидывать помидорами.

Основная идея заключается в использовании ик-приёмника и ик-передатчика.
Ик-передатчик устанавливается на модель излучением вверх. Ик-приёмник устанавливается на ворота, через которые проезжает или пролетает модель. Приёмник подключается к Arduino Nano. Arduino запоминает ик сигнал и в зависимости от срабатывания зажигает индикацию диоды, показывая свою работу, и передаёт сигнал на ноутбук по usb. На компьютере запускается программа, которая фиксирует время срабатывания и заносит их в соответствующий файл. Предварительное условие замеряется от 1 до 4 моделей и от 1 до 6 кругов.

 Проект разбивается на несколько частей.
1. Ик-передатчик
1.1. Компоненты.

Инфракрасный Светодиод, NE555N Timers DIP-8

 

 

1.2. Схема.

Предварительный экземпляр для настройки и тестирования.

Плата Ик-передатчика будет питаться от 5В, от приёмника, либо от платы распределения питания, либо от контроллера полётов, либо от понижающего модуля.

2. Приёмник

2.1. Компоненты.

LED диоды, TSOP4838 DIP-3 Module 38KHz

 

 

Arduino ATmega328P Nano V3

На стационарном компьютере Arduino Nano 3.0 отработала хорошо, при подключении Arduino к нетбуку Arduino не определялась. Чтобы операционная система компьютера увидела плату как COM-порт, установил сторонний драйвер driver-ch340. Драйвер для прочих операционных систем можно скачать тут.

2.2. Схема устройства.

Предварительный экземпляр для настройки и тестирования.


2.3. Скетч для Arduino.

Для написания скетча будет использоваться библиотека IRremote.

Исходник первая версия Sketch Arduino_006

int pin = 7;
unsigned long duration;
int a=0; // Номер модели
int ogonek=0;
int t1=0;
int m=0;
//jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
void setup()
{
Serial.begin(9600); // Выставляем скорость COM порта
pinMode(11, INPUT);
pinMode (13, OUTPUT);
digitalWrite (13, LOW);
}
//jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
void loop()
{
a=0;
m=millis();
duration = pulseIn(11, LOW,300);
if (duration>110&duration;<150&(m-t1)>10000)
{
ogonek=ogonek+1;
t1=millis();
a=1;
}
if (ogonek==1){digitalWrite (13, HIGH);} else if (ogonek==2){digitalWrite (13, LOW);ogonek=ogonek-2;}
if (a>0){Serial.println(a);} // Отправляем полученную данную в консоль
}

3. Программа для компьютера
3.1. Скетч в processing

import processing.serial.*; //Импортируем Serial библиотеку
Serial port; //Создаем объект Serial под названием port
PrintWriter textFile;
float com = 0; //Создаем переменную float типа a. Это значение мы будем получать с Arduino
int znh=0; //Номера датчика
int xod=1;
int min=0;
int sek=0;
int misek=0;
int min1=0;
int sek1=0;
int misek1=0;
int finih=0;
int yhasnik=0;
int kryg=0;
int [][] arr;
String fi;
//jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
void setup()
{
background(255); //заливаем фон белым цветом
size(640, 480); //Создаем окно с размерами 640х480 пикселей
textSize(15); //Размер шрифта
port = new Serial(this,«COM6»,9600); //Инициализируем наш порт.
port.bufferUntil('\n'); //проверяем, поступает ли на наш порт что-нибудь
fill(0); //цвет текста чёрный
text(day()+"-"+month()+"-"+year(),540,20);//Отображение даты
fi=«rezultat/»+day()+month()+year()+"-"+hour()+minute()+second()+".txt";
text(«Введите количество кругов от 1 до 6:»,10,40);
text(«Таймер»,10,20); //Отображение времени
text(«Датчик 0»,280,20); //Последний сработавший датчик
text(«Дата»,500,20); //Дата
textFile = createWriter(fi); //Функция createWriter создает текстовый файл
}
//jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
void draw()
{
fill(255); //заливка для прямоугольника
noStroke();//рисуем прямоугольник без контура
rect (66,5,80,16); //рисуем прямоугольник по определенным координатам
fill(0); //цвет текста чёрный
min=millis()/60000;
sek=(millis()-(min*60000))/1000;
misek=(millis()-(min*60000))-(sek*1000);
text(min+":"+sek+":"+misek,70,20); //Отображение времени
if (com>0)
{
fill(255); //заливка для прямоугольника
noStroke();//рисуем прямоугольник без контура
rect (338,5,14,16); //рисуем прямоугольник по определенным координатам
fill(0); //цвет текста чёрный
znh = (int)com;
text(znh,340,20); //Отображение номера датчика
}
if (xod==3)
{
fill(0);
stroke(0); //рисуем чёрный контур
line(0,65,640,65); //рисуем линию горизонтально
for (int i = 1; i<yhasnik+1; i = i+1)
{
line(0,65+(i*30),640,65+(i*30)); //рисуем линию горизонтально
text(«Участник „+i,10,55+(i*30)); //Отображение участника
}
line(100,65,100,65+(30*yhasnik)); //рисуем линию вертикально
for (int i = 1; i<kryg+1; i = i+1)
{
line(100+(90*i),65,100+(90*i),65+(30*yhasnik)); //рисуем линию вертикально
}
arr=new int[yhasnik][kryg+1]; //создаём массив под данные
xod=4;
println(“xod „+xod);
}
else if(xod==4)
{
if (com>0&&znh;<=yhasnik)
{
for (int j=0; j<(kryg+1); j++)
{
if (arr[znh-1][j]==0)
{
arr[znh-1][j]=millis();
if (j>0)
{
min1=(arr[znh-1][j]-arr[znh-1][(j-1)])/60000;
sek1=((arr[znh-1][j]-arr[znh-1][(j-1)])-(min1*60000))/1000;
misek1=((arr[znh-1][j]-arr[znh-1][j-1])-(min1*60000))-(sek1*1000);
text(min1+“:»+sek1+":"+misek1,107+((j-1)*90),85+((znh-1)*30)); //Отображение данных массива
}
j=kryg;
}
}
com=0;
}
finih=0;
for (int j=0; j<(yhasnik); j++)
{
if (arr[j][kryg]>0)finih=finih+1;
}
if (finih==yhasnik)xod=5;
println(«xod „+xod);
}
else if(xod==5)
{
for (int i=0; i<(yhasnik); i++)
for (int j=0; j<(kryg); j++)
if (j<(kryg-1))textFile.print(arr[i][j]+“,»);else textFile.println(arr[i][j]);//выводит строки текста в файл
textFile.flush(); //Файл сохраняется методом flush
textFile.close(); //затем идет метод close Для того, чтобы файлы были созданы без ошибок,
xod=6;
println(«xod „+xod);
}
}
//jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
void keyReleased() {
if (keyCode >48&xod;==1&keyCode;<55) //Введите количество кругов от 1 до 6
{
fill(0);
text(key, 300, 40);
xod=2;
text(“Введите количество участников от 1 до 4:»,10,60);
kryg=key-48;
}
else
{
//Введите количество участников от 1 до 4
if (keyCode >48&xod;==2&keyCode;<53)
{
text(key, 330, 60);
yhasnik=key-48;
xod=3;
}
}
}
//jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
void serialEvent(Serial port)
{
com = float (port.readStringUntil ('\n'));
}

Исходник первая версия Sketch processing_010.pde

Выражаю благодарность Андрею(Zumanoid) за помощь в проекте.

Критика и пожелания по проекту приветствуются.

Плюсануть! 16
6 Комментировать
Комментарии
avatar
1691,03 Россия, Москва
+2 + -
Ниче не понял, но чую, что это адова круто! =)
avatar
413,48 Россия, Ярославль
+1 + -
Это новый способ изобрести велосипед.
avatar
4302,52 Россия, Тверь
+1 + -
Есть такая уже собранная система от Файнал лапп, работает нормально, сбоев не наблюдал.
avatar
413,48 Россия, Ярославль
+1 + -
Поделись ссылкой на неё.
avatar
4302,52 Россия, Тверь
+1 + -
avatar
413,48 Россия, Ярославль
+1 + -
Как-то так, вот такое приложение получилось, пожелания, предложения?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.