Сегодня ночью появилось время и я продолжил.
PHP код:
#include <TimerOne.h>
#include <TinyGPS.h>
#include <EEPROM.h>
#include <Servo.h>
volatile uint16_t timerCount;
#define BTNPIN 2 //Входной сигнал PPM
int ppmImpuls[9]; // Массив импульсов для паузы и 8 каналов
int chImpuls[9] = {1000, 100, 100, 100, 100, 100, 100, 100, 100}; // Массив средних значений для паузы и 8 каналов
int chanel = 0 ; // Номер канала
int minImpuls = 45 ; // Минимальный импульс (450 us)
int maxImpuls = 155; // Максимальный импульс (1550 us)
int minPausa = 500; // Минимальная пауза (5000 us)
int maxPausa = 1300; // Максимальная пауза (13000 us)
Servo servo1;
Servo servo2;
void setup()
{
servo1.attach(37);
servo2.attach(36);
servo1.writeMicroseconds(1500); // устанавливает привод в среднее положение
servo2.writeMicroseconds(1500); // устанавливает привод в среднее положение
Serial.begin(115200);
pinMode (BTNPIN, INPUT);
Timer1.initialize(10);
Timer1.attachInterrupt(callback);
attachInterrupt(0, impDown, RISING);
}
void loop()
{
for (int i=0; i <= 8; i++)
{
chImpuls[i] = (4 * chImpuls[i] + ppmImpuls[i]) / 5 ; // усреднение 3 импульсов
//Serial.print(i); Serial.print("=");
//Serial.print(chImpuls[i]); Serial.print(" ");
}
Serial.println("");
//delay (200);
servo1.writeMicroseconds(chImpuls[1]*10);
servo2.writeMicroseconds(chImpuls[2]*10);
}
void callback() { timerCount++; } //--------- Счетчик------------
void impUp() //---------- Функция обработки положительного импульса
{
detachInterrupt(0);
timerCount=0;
attachInterrupt(0, impDown, RISING);
}
void impDown() // Функция обработки отрицательного импульса
{
int ppm = timerCount;
detachInterrupt(0);
if( ppm > minPausa ) { chanel=0 ; } else { chanel ++ ; }
ppmImpuls[chanel] = ppm ;
attachInterrupt(0, impUp, FALLING);
}
Файл-сафе теперь нужно реализовывать.
Что можно сделать с контролем над сигналом, шум подвешивает порт. Также перестают сервы следить за положением стиков. Резет при вкл. передатчике, все работает, но до выключения передатчика.