Проверить мне не начем , так что пробуй и отпишись по результатам.
PHP код:
#include <TimerOne.h>
#define BTNPIN 2 // Вход сигнала
#define L 5 // Выход на H-Мост вращение в лево
#define R 6 // Выход на H-Мост вращение в право
volatile uint16_t lengthImpuls, timerCount;
void setup()
{
/* LOW — вызов прерывания всякий раз,
когда на порту низкий уровень напряжения;
CHANGE – прерывание вызывается при изменении
значения на входе;
RISING – вызов прерывания при изменении уровня
напряжения с низкого (LOW) на высокое(HIGH)
FALLING – вызов прерывания при изменении уровня
напряжения с высокого (HIGH) на низкое (LOW)*/
lengthImpuls=0;
pinMode (BTNPIN, INPUT);
pinMode (L, OUTPUT);
pinMode (R, OUTPUT);
analogWrite (L, 0);
analogWrite (R, 0);
Timer1.initialize(2);
Timer1.attachInterrupt(callback);
attachInterrupt(0, fireUp, RISING);
}
void callback() { timerCount++; }
void loop()
{
uint16_t li = lengthImpuls;
if (li > 499 && li < 1001)
{
if (li >= 750) {analogWrite (R, 255-(1000-li)); analogWrite (L, 0);}
if (li < 750) {analogWrite (L, 750-li); analogWrite (R, 0);}
lengthImpuls=0;
}
}
// Функция обработки прерывания на подъем
void fireUp()
{
timerCount=0;
detachInterrupt(0);
attachInterrupt(0, fireDown, FALLING);
}
// Функция обработки прерывания на падение
void fireDown()
{
lengthImpuls = timerCount;
detachInterrupt(0);
attachInterrupt(0, fireUp, RISING);
}