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