Проект по автоматическому замеру времени круга на трассе. Всё находится на стадии идеи, никогда этим не занимался, прошу по возможности помочь и не закидывать помидорами.
Основная идея заключается в использовании ик-приёмника и ик-передатчика.
Ик-передатчик устанавливается на модель излучением вверх. Ик-приёмник устанавливается на ворота, через которые проезжает или пролетает модель. Приёмник подключается к 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) за помощь в проекте.
Критика и пожелания по проекту приветствуются.