Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified 3d_model/Latency_IPCam.SLDASM
Binary file not shown.
Binary file modified 3d_model/Latency_IPCam.SLDPRT
Binary file not shown.
Binary file added 3d_model/Latency_IPCam_detail2.SLDPRT
Binary file not shown.
Binary file added 3d_model/Latency_IPCam_detail3.SLDPRT
Binary file not shown.
Binary file modified 3d_model/STL/Latency_IPCam.STL
Binary file not shown.
Binary file modified 3d_model/STL/Latency_IPCam2.STL
Binary file not shown.
Binary file added 3d_model/STL/Latency_IPCam_detail2.STL
Binary file not shown.
Binary file added 3d_model/STL/Latency_IPCam_detail3.STL
Binary file not shown.
674 changes: 674 additions & 0 deletions LICENSE.md

Large diffs are not rendered by default.

10 changes: 7 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
# Latency Meter Camera
# Latency Meter FPV-systems & Camera

Устройство для измерения раздержки различных камер и FPV-систем. Оно построено на плате Ардуино Нано и 4х разрядном 7ми-сегментном индиаторе LED 5461AS-1.

**Кнопка:** Длинное нажатие на кнопку запускает процесс измерения сначала. Короткое - переключает показания индикатора между real-time, min, max, sma.
Отличие от [версии 1.0](https://github.com/githubniko/LatencyMeter/tree/master) поддержкой 2х-цветного светодиода. Если взять синий и красный цвета, то фотодатчик будет их различать при одинаковой яркости. Это позволяет производить измерения с авто-выдержкой, автоэкспозицией и т.п.

Видео по сборке: [https://www.youtube.com/watch?v=69uGeqPZ3CI](https://www.youtube.com/watch?v=69uGeqPZ3CI)
*PS Данная программа будет работать с одним цветом как и версия 1.0, но требуется тестирование перед слиянием.*

**Функции Кнопки:** Длинное нажатие на кнопку запускает процесс измерения сначала. Короткое - переключает показания индикатора между real-time, min, max, median.

Видео по сборке и изменениям: [https://www.youtube.com/watch?v=aBIbjmPU78k](https://www.youtube.com/watch?v=aBIbjmPU78k)

![1701351332899](images/README/1701351332899.png)![1701351013962](images/README/1701351013962.png)
93 changes: 0 additions & 93 deletions SCH_Latencycam_2023-11-22.json

This file was deleted.

101 changes: 101 additions & 0 deletions SCH_Latencycam_2024-05-11.json

Large diffs are not rendered by default.

Binary file not shown.
2 changes: 1 addition & 1 deletion latencymeter/button.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ class Button
_flagEvent = false;
return;
}
if (time >= 80 && !_flagEvent) // Одинарно нажатие
if (time >= 100 && !_flagEvent) // Одинарно нажатие
{
onKeyUp();
onClick();
Expand Down
62 changes: 55 additions & 7 deletions latencymeter/latencymeter.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#define PIN_IN 7
#define PIN_OUT 3
#define PIN_OUT2 2

#include "include/AbstractEventHandler.h"

Expand All @@ -9,6 +10,10 @@ class LatencyMeter
bool _flagMeasuring = false; // когда true, то идет процесс измерения
bool _flagStatus = false; // Управляет запуском/остановкой процесса измерения
List<uint16_t> _listValue; // массив измерений
byte _pinOut = PIN_OUT, _pinOut2 = PIN_OUT2;
float _spread = 0; // разброс значений при измерении
float _hist = 0; // промежуток на который должно изм. напряжение на фотодатчике, чтобы остановить измерение
bool _sw = 0; // низкий потенциал на светодиоде

public:
float startVoltage = 0;
Expand All @@ -25,6 +30,7 @@ class LatencyMeter
{
analogReference(EXTERNAL); // внешнее опорное напряжение 3.3В
pinMode(PIN_OUT, OUTPUT);
pinMode(PIN_OUT2, OUTPUT);
}

void Start()
Expand All @@ -39,15 +45,50 @@ class LatencyMeter
_flagMeasuring = false;
_listValue.clear();

float high = 32767, low = 0;

ledSwitch(_sw);
delay(2000);

// Проверяем какой из цветов дает меньший сигнал и инвертируем при необходимости
ledSwitch(!_sw);
delay(500);
high = getVoltage();

ledSwitch(_sw);
delay(500);
low = getVoltage();

if (low > high)
{ // меняем местами цвета
_sw = !_sw;
}

_hist = abs(high-low) / 4;

// Вычисляем разброс измерений
low = 32767, high = 0;
for (int i = 0; i < 500; i++)
{
float voltage = getVoltage();
if (voltage < low)
low = voltage;
if (voltage > high)
high = voltage;
delay(1);
}
_spread = (high - low ) /2;

onUpdate();
minTime = 32767;
digitalWrite(PIN_OUT, LOW);
ledSwitch(_sw);
delay(1000);
startVoltage = getVoltage() + 0.05f; // / 2;
// delay(2000);
startVoltage = getVoltage() + _spread; // / 2;


_flagStatus = true;

digitalWrite(PIN_OUT, LOW); // Выкл. светодиод
ledSwitch(_sw); // Выкл. светодиод
}
void Stop() { _flagStatus = false; }
void Restart()
Expand All @@ -70,13 +111,13 @@ class LatencyMeter

_flagMeasuring = true;
_timer = micros();
digitalWrite(PIN_OUT, HIGH); // Зажигаем светодиод
ledSwitch(!_sw); // Зажигаем светодиод
}
// Ждем, сигнал от фотодатчика
else
{
float voltage = getVoltage();
if (voltage > startVoltage + 0.5f)
if (voltage > startVoltage + _hist)
{ // Если сигнал поступил, то
count++;
valueTime = (micros() - _timer) / 1000; // Считаем задержку
Expand All @@ -92,7 +133,7 @@ class LatencyMeter

onUpdate();

digitalWrite(PIN_OUT, LOW); // Выкл. светодиод
ledSwitch(_sw); // Выкл. светодиод
_flagMeasuring = false;
}
}
Expand Down Expand Up @@ -177,4 +218,11 @@ class LatencyMeter
}
return median1;
}
/// @brief Переключает светодиод
/// @param in
void ledSwitch(bool in)
{
digitalWrite(_pinOut2, !in);
digitalWrite(_pinOut, in);
}
};