int motor; // Переменная для обработки данных ШИМ по скорости
int left_right; // Переменная для приема обработки данных ШИМ по стику поворота
int PWM_1 = 0; // Переменная для PWM на мотор 1
int PWM_2 = 0; // Переменная для PWM на мотор 2
int duration_1; // Переменная направления вращения мотора 1
int duration_2; // Переменная направления вращения мотора 1
// Переменные назначения пинов:
int in_elev = 6; // Пин для подключения к клеммам ELEV приемника
int in_aile = 8; // Пин для подключения к клеммам AILE приемника
int duration_1_pin = 9; // Пин для подключения к драйверу, мотор 1 (направление вращения)
int duration_2_pin = 12; // Пин для подключения к драйверу, мотор 2 (направление вращения)
int PWM_1_pin = 10; // Пин для подключения к драйверу, мотор 1 (скорость вращения)
int PWM_2_pin = 11; // Пин для подключения к драйверу, мотор 2 (скорость вращения)
void setup()
{
// Назначаем 2 пина на вход (прием сигнала с приемника)
// и 4 пина на выход (управление драйвером моторов)
Serial.begin(9600);
pinMode(in_elev, INPUT);
pinMode(in_aile, INPUT);
pinMode(PWM_1_pin, OUTPUT);
pinMode(PWM_2_pin, OUTPUT);
pinMode(duration_1_pin, OUTPUT);
pinMode(duration_2_pin, OUTPUT);
}
void loop()
{
// Измеряем длину ипульса ШИМ на входах с приемника в микроксек.:
motor = pulseIn(in_elev, HIGH);
left_right = pulseIn(in_aile, HIGH);
// Вывод данных в монитор порта потребуется для настройки триммеров передатчика (оставлю)
Serial.print(motor);
Serial.print(" left_right=");
Serial.print(left_right);
// Задаем соответствие между длиной импульса с приемника и управляющего сигнала на драйвер моторов
motor = map (motor, 1070, 1850, -255, 255); // Сигнал по скорости
left_right = map (left_right, 1070, 1850, -abs(motor*2), abs(motor*2)); // Сигнал по управлению направлением
// Для отключения моторов при стике в среднем положении - стоит на месте
if ( motor <= 15 && motor >= -15 )
{
left_right = 0;
PWM_1 = 0;
PWM_2 = 0;
}
// Для движения назад - влево
if ( motor < -15 && left_right <= motor/12)
{
PWM_1 = abs(motor - left_right);
if ( (motor - left_right) < 0 )
{
duration_1 = 0;
}
else
{
duration_1 = 1;
}
PWM_2 = abs(motor);
duration_2 = 0;
}
// Для движения назад - вправо
if ( motor < -15 && left_right >= -motor/12)
{
PWM_2 = abs(motor + left_right);
if ( (motor + left_right) < 0 )
{
duration_2 = 0;
}
else
{
duration_2 = 1;
}
PWM_1 = abs(motor);
duration_1 = 0;
}
// Для движеня назад прямо
if ( motor < -15 && (left_right < -motor/12 && left_right > motor/12))
{
PWM_1 = abs(motor);
PWM_2 = abs(motor);
duration_1 = 0;
duration_2 = 0;
}
// Для движения вперед - влево
if ( motor > 15 && left_right <= -motor/12)
{
PWM_1 = abs(motor + left_right);
if ( (motor + left_right) > 0 )
{
duration_1 = 1;
}
else
{
duration_1 = 0;
}
PWM_2 = abs(motor);
duration_2 = 1;
}
// Для движения вперед - направо
if ( motor > 15 && left_right >= motor/12)
{
PWM_2 = abs(motor - left_right);
if ( (motor - left_right) > 0 )
{
duration_2 = 1;
}
else
{
duration_2 = 0;
}
PWM_1 = abs(motor);
duration_1 = 1;
}
// Для движения прямо вперед
if ( motor > 15 && (left_right < motor/12 && left_right > -motor/12))
{
PWM_1 = abs(motor);
PWM_2 = abs(motor);
duration_1 = 1;
duration_2 = 1;
}
// Вывод значений в монитор порта - для проверки и настройки (оставлю)
Serial.print(" left_right2=");
Serial.print(left_right);
Serial.print(" PWM_1=");
Serial.print(PWM_1);
Serial.print(" duration_1=");
Serial.print(duration_1);
Serial.print(" PWM_2=");
Serial.print(PWM_2);
Serial.print(" duration_2=");
Serial.println(duration_2);
// Передаем команды управления на драйвер моторов:
digitalWrite(duration_1_pin, duration_1);
digitalWrite(duration_2_pin, duration_2);
analogWrite(PWM_1_pin, PWM_1);
analogWrite(PWM_2_pin, PWM_2);
}