Перейти к основному содержимому

FlySky i6

Пульт FlySky i6 управляет мобильным роботом через приёмник

FlySky i6 — это готовая аппаратура радиоуправления: передатчик с двумя стиками держит оператор, а приёмник стоит на роботе. Для первого мобильного робота такой пульт удобен тем, что не нужно писать приложение для телефона или настраивать Wi-Fi сеть. Пульт уже формирует команды, а Arduino остаётся только прочитать каналы и превратить их в скорость моторов.

Коротко

Пульт FlySky i6 сам не управляет мотором. Он передаёт положения стиков на приёмник. Приёмник выдаёт сигналы каналов, Arduino читает эти сигналы, а драйвер L298P уже подаёт питание на мотор. Обязательно проверяют направление, диапазон канала, нейтраль стика и остановку при потере связи.

Зачем это нужно

Телефонный Bluetooth-пульт хорош для первых опытов, но экранные кнопки не всегда удобны для точного движения. У FlySky i6 есть стики, которые возвращаются в центр, отдельные тумблеры и настройка каналов. Поэтому такой пульт часто используют для учебных машинок, роботов с манипулятором и стендов, где оператору нужно плавно менять скорость.

При этом пульт не отменяет программу безопасности. Если приёмник потерял связь или провод канала выпал, робот должен остановиться, а не продолжать последнюю команду.

Примеры аппаратуры

АппаратураЧем похожаЧто проверить перед проектом
FlySky i6базовый учебный пульт на несколько каналовкакой приёмник в комплекте и какие выходы он даёт
FlySky i6Xпохожий пульт из той же линейкирежимы приёмника, настройку каналов и совместимость
Turnigy 9Xраспространённая аппаратура для хобби-проектовтип модуля, приёмник и питание
Radiolink T8FBкомпактный многоканальный пультспособ настройки и формат выходных сигналов
RadioMaster Pocketсовременный компактный пультпротокол, приёмник и сложность настройки

Главный вопрос не в форме корпуса пульта, а в том, что именно выдаёт приёмник: отдельные PWM-каналы, общий iBUS/SBUS-поток или другой протокол.

Главная идея

Цепочка управления состоит из нескольких частей:

стик пульта -> радиоканал -> приёмник -> Arduino -> драйвер мотора -> мотор

Если стик отклонён вперёд, приёмник не подаёт питание на мотор. Он только сообщает контроллеру новое значение канала. Поэтому направление, ограничение скорости, плавность и аварийная остановка задаются в программе.

PWM и iBUS

У приёмников FlySky часто встречаются два удобных для Arduino варианта.

ВариантКак выглядит для ArduinoКогда удобно
PWM-каналыкаждый канал подключается отдельным проводом к отдельному пинупростой опыт с 1–3 каналами на Arduino Uno
iBUSмного каналов идут одним последовательным потокомкогда каналов много или нужна более аккуратная проводка

PWM проще объяснить: один провод канала даёт импульсы примерно от 1000 до 2000 микросекунд. Библиотека считывает длительность импульса и переводит её в удобный диапазон, например от -255 до 255.

iBUS удобнее для большого робота, но требует подходящего приёмника и свободного последовательного порта. На Arduino Mega или ESP32 это проще, чем на Arduino Uno.

Подключение одного PWM-канала

Для первого опыта достаточно одного канала газа и одного мотора.

Приёмник FlySkyArduino UnoЗачем
VCC5Vпитание приёмника, если это разрешено его документацией
GNDGNDобщий провод с Arduino и драйвером
CH2 или канал газаD2вход, где Arduino измеряет PWM-импульс

У драйвера L298P питание мотора подключают отдельно от логики Arduino. Земля силового питания, драйвера, Arduino и приёмника должна быть общей.

Пример: FlySky i6 и мотор через L298P

Пример ниже рассчитан на один PWM-канал приёмника и один мотор на L298P-совместимом шилде. В библиотеке FlySky_pwm.h функция readChannel() читает импульс канала и сразу масштабирует его в заданный диапазон.

#include <FlySky_pwm.h>

const int rcPin = 2;

const int dirPin = 12;
const int pwmPin = 3;
const int brakePin = 9;

void setup() {
pinMode(rcPin, INPUT);

pinMode(dirPin, OUTPUT);
pinMode(pwmPin, OUTPUT);
pinMode(brakePin, OUTPUT);

digitalWrite(brakePin, HIGH);
analogWrite(pwmPin, 0);

Serial.begin(9600);
}

void loop() {
int speed = flysky.readChannel(rcPin, -255, 255, 0, 20);

driveMotor(speed);

Serial.print("speed = ");
Serial.println(speed);

delay(20);
}

void driveMotor(int speed) {
speed = constrain(speed, -255, 255);

if (speed == 0) {
analogWrite(pwmPin, 0);
digitalWrite(brakePin, HIGH);
return;
}

digitalWrite(brakePin, LOW);

if (speed > 0) {
digitalWrite(dirPin, HIGH);
analogWrite(pwmPin, speed);
} else {
digitalWrite(dirPin, LOW);
analogWrite(pwmPin, -speed);
}
}

Что важно заметить:

  • rcPin подключён к каналу приёмника, а не к мотору;
  • диапазон -255...255 удобен для analogWrite();
  • последнее число 20 задаёт мёртвую зону около центра стика;
  • при speed == 0 мотор останавливается;
  • перед реальным заездом нужно проверить, какое направление считается вперёд.

Проверка перед запуском мотора

  1. Подключите только приёмник и Arduino.
  2. Откройте Serial Monitor на скорости 9600.
  3. Двигайте стик и убедитесь, что значение около центра равно 0.
  4. Проверьте, что крайние положения дают примерно -255 и 255.
  5. Только после этого подключайте питание мотора к L298P.
  6. Поставьте робота на подставку, чтобы колёса не касались стола.
  7. Проверьте направление и поменяйте провода мотора или направление в коде, если оно обратное.

Failsafe

Failsafe — это поведение при потере связи. Его проверяют отдельно: выключают пульт при поднятом роботе и смотрят, что приходит с приёмника. В хорошем варианте канал возвращается в нейтраль или Arduino получает значение по умолчанию.

В примере readChannel() возвращает 0, если импульс канала не прочитан. Но это не заменяет проверку конкретного приёмника: некоторые модели могут некоторое время удерживать последнее значение.

Что запомнить про FlySky i6

  • FlySky i6 передаёт положения стиков, а не питание моторов.
  • Arduino читает каналы приёмника и сама решает, что делать.
  • Для простого опыта удобны PWM-выходы каналов.
  • Для большого числа каналов лучше рассмотреть iBUS.
  • Перед заездом обязательно проверяют нейтраль, направление и failsafe.

Практика

  1. Выведите в Serial Monitor один канал приёмника и найдите его нейтраль.
  2. Измените мёртвую зону с 20 на 40 и сравните поведение около центра.
  3. Подключите второй канал и выведите два значения в одну строку.
  4. Опишите, что должен делать робот, если связь с пультом пропала.

Проверьте себя

  1. Почему пульт FlySky i6 нельзя подключить напрямую к мотору?
  2. Чем PWM-каналы отличаются от iBUS?
  3. Зачем нужна мёртвая зона около центра стика?
  4. Почему первую проверку мотора делают на подставке?
  5. Что нужно проверить при выключении пульта?
Ориентиры для самопроверки

Сначала ответьте без подсказки. Ответ можно считать полным, если вы:

  • формулируете основную мысль своими словами;
  • называете важные условия, ограничения или меры безопасности;
  • для схемы, кода или расчёта показываете ход решения и ожидаемый результат.

Если один из пунктов объяснить не получается, найдите соответствующую главу статьи, перечитайте её и повторите ответ.

Словарь статьи

  • Аппаратура радиоуправления — комплект из пульта, приёмника и радиоканала.
  • Передатчик — пульт в руках оператора.
  • Приёмник — модуль на роботе, который выдаёт каналы управления.
  • Канал — отдельное значение от стика, тумблера или регулятора.
  • PWM-сигнал приёмника — импульс, длительность которого кодирует значение канала.
  • iBUS — последовательный протокол, в котором несколько каналов передаются одним потоком.
  • Failsafe — заранее заданное поведение при потере связи.

Связанные темы

Источники