Радиоуправление на Arduino

Радиоуправление на Arduino Машинки

Ardu remote: очень простая и дешёвая аппаратура управления своими руками

Всем привет. Захотелось мне однажды маленькую удобную аппаратуру для дрона/крыла; usb-джойстик для симуляторов и Open.HD; найти оправдание построенной дельте (3d-принтеру) и пострадать ардуино. Сразу фото итога:

Радиоуправление на Arduino

Размышления и гуглеж привели к выбору BetaFPV Lite radio как образца для внешнего вида. Хотелось, конечно, Taranis X-Lite, но стики были только крупные, от подаренной товарищем бесполезной ввиду древности аппаратуры. Переключатели на 60% были использованы от неё же.
Изначально делал только USB-версию. Оно отлично работало в симуляторе FPV Freerider и как управление в Open.HD линке, но мысль прилепить QCZEK и автономное питание уже овладела мной бесповоротно.

В итоге вышло что вышло.

→ Гитхаб

Видео:

На гитхабе скетч, схема, используемые библиотеки и всякое полезное, включая 3d-модели и исходники для solid.

Схема относительно проста и требует только пайки проводов за исключением резистивного делителя и светодиодов. Работу с qczek lrs я обойду стороной, для этого есть сайт разработчика и неплохие видеотуториалы в ютубе от Юлиана и Сани areyouroo.

Радиоуправление на Arduino

Можно ограничиться только usb-версией без питания и lrs, в качестве lrs можно использовать другие проекты, где принимают на вход CPPM 8/10ch сигнал. При выборе QCZEK появляется выбор между 0.1 и 1вт модулями и частотами 433/868/915 МГц. Я не рекомендую 433, наводки от них дикие. Также не увидел смысла в 1вт, при 100мвт вполне реально пульнуть на 10км. Если планируете покупать антенны — смотрите на версии 915мгц и готовые антенны для популярных дальнобоек frsky. Недорого и какая-то гарантия попадания в приемлемый КСВ. Я же просто подпаял к хвосту с ipex два отрезка медной проволоки D0.4mm, длиной 8.21см и заложил это всё в корпус антенны прямо в середине печати на 3д-принтере. Побегал с аппаратурой по этажам многоквартирного дома — обрыва или падения rssi на модели в квартире не добился, устроило.

Для Open.HD (usb-версия) пока нет смысла в свичах sw4 и sw5, так как число каналов ограничено 8-ю. Возможно, в дальнейшем это ограничение будет снято. Имейте ввиду, что подключение к Open.HD с модулем зарядки даёт дополнительную нагрузку на usb-порт наземной raspberry по питанию. Имеет смысл заюзать хаб с внешним питанием.

Калибровка аппаратуры: подаём питание с зажатой SW_CALIBRATE при средних положениях yaw/roll/pitch и минимальных throttle/aux1; ждём гудка; двигаем всё с осями от минимума до максимума, пока есть пищание. Когда пищать уже не может — выключаем, калибровка завершена.

Также есть защита от высоких значений каналов при включении, пока не переместите первые три свича и газ вниз — будет коротко попискивать.

Каждые 30 секунд, если значения не изменились — короткий ненавязчивый писк. Естественно, все это легко изменить/отключить в скетче. Например, просто закоментировав дефайн.

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

Также я прилепил блютус-модуль jdy-30 к qczek и гоню в него мавлинк телеметрию, которую принимает DroidPlanner 2.8 или Telemetry Viewaver на андроид-смартфоне. Наверное, также засуну и mavlink-display. Пусть будет красиво, как у дорогих crossfire xD

Спасибо за внимание, жду вопросов и повторений / развитий сего рукожопства.

Let’s hook it up!

Alright, that’s the spirit! We’ll hook up a few channels from the RC receiver to get a feel for what the input from the transmitter looks like. The RC transmitter/receiver pair that I have is six channels, but we’ll just hook up three for now. This means we need three digital pins to read the input, as well as 5V power to the receiver. Here’s a diagram of how I hooked mine up:

Notice that the RC receiver is upside-down, I flipped it to make it easier to trace my wires. You’ll need to use male-female jumpers if you have them. If not, you can use some male and female jumpers stuck together. The digital pins that I chose are pretty much arbitrary; you should be able to use any digital input on the Arduino that you like, but the above should correspond to the code below.

Now let’s upload a sketch and see what’s coming in on those pins. The “servo” language that the RC receiver is pushing out is really PWM, or Pulse Width Modulation. Arduino has a handy function built in for reading these pulses and returning their length in milliseconds.

     
/* RC PulseIn Serial Read out By: Nick Poole SparkFun Electronics Date: 5 License: CC-BY SA 3.0 - Creative commons share-alike 3.0 use this code however you'd like, just keep this license and attribute. Let me know if you make hugely, awesome, great changes. */
 
int ch1; // Here's where we'll keep our channel valuesint ch2;
int ch3;

voidsetup() {

  pinMode(5, INPUT); // Set our input pins as such
  pinMode(6, INPUT);
  pinMode(7, INPUT);

  Serial.begin(9600); // Pour a bowl of Serial

}

voidloop() {

  ch1 = pulseIn(5, HIGH, 25000); // Read the pulse width of 
  ch2 = pulseIn(6, HIGH, 25000); // each channel
  ch3 = pulseIn(7, HIGH, 25000);

  Serial.print("Channel 1:"); // Print the value of 
  Serial.println(ch1);        // each channel

  Serial.print("Channel 2:");
  Serial.println(ch2);

  Serial.print("Channel 3:");
  Serial.println(ch3);

  delay(100); // I put this here just to make the terminal 
              // window happier
}

The pulseIn() function takes three arguments: the first is the pin that your pulse is coming in on; the second is what type of pulse you’re looking for; and the third takes a time-out number, which is how long you’re willing to wait for a pulse. What this function returns is the length of the pulse in microseconds, and this is how we’re going to read the incoming PWM as if we were a servo.

When you run this code, you should get some numbers spitting out onto the terminal. The numbers probably won’t mean much to you but they should be somewhere between 1000 and 2000. What really matters is that when you move the control surface associated with that number, it should change.

Now that we have these values, we can code with them and do all kinds of things. The sketch below is my sketch after it’s been modified to put these pulseIn() values into context.

     
/* RC PulseIn Joystick By: Nick Poole SparkFun Electronics Date: 5 License: CC-BY SA 3.0 - Creative commons share-alike 3.0 use this code however you'd like, just keep this license and attribute. Let me know if you make hugely, awesome, great changes. */int ch1; // Here's where we'll keep our channel valuesint ch2;
int ch3;

voidsetup() {

pinMode(5, INPUT); // Set our input pins as suchpinMode(6, INPUT);
pinMode(7, INPUT);

Serial.begin(9600); // Pour a bowl of Serial

}

voidloop() {
  
  ch1 = pulseIn(5, HIGH, 25000); // Read the pulse width of 
  ch2 = pulseIn(6, HIGH, 25000); // each channel
  ch3 = pulseIn(7, HIGH, 25000);
  
  if(ch1>1000){Serial.println("Left Switch: Engaged");} 
  if(ch1<1000){Serial.println("Left Switch: Disengaged");}
  /* I found that Ch1 was my left switch and that it   floats around 900 in the off position and jumps to   around 1100 in the on position */Serial.print("Right Stick X:"); // Ch3 was x-axis Serial.println(map(ch3, 1000,2000,-500,500)); // center at 0Serial.print("Right Stick Y:"); // Ch2 was y-axisSerial.println(map(ch2, 1000,2000,-500,500)); // center at 0Serial.println(); //make some roomdelay(100);// I put this here just to make the terminal 
           // window happier
}

That sounds great but i’ve never touched an rc transmitter…

It’s no big deal, I’ll walk you through it. Radio-control transmitters and receivers are usually used to drive model cars or planes. A typical transmitter will have a few control surfaces, like wheels or joysticks, as well as some switches or dials. Each degree of freedom that the controller gives you is assigned a channel.

Since most RC models can be generalized as a fancy box of servos, that’s exactly what the receiver is set up to control. Although they come in various shapes and sizes, they all share a common feature: a row of servo headers. These headers are lined up so that the servos in your model can be plugged directly into the receiver.

Передатчик

// Библиотека передатчика
#include <VirtualWire.h>

void setup() 
{ 
    // Запуск передатчика
    vw_set_ptt_inverted(true);
    vw_setup(1000); // Bits per sec 
}

void loop() 
{
    // чтение показаний с переменного резистора
    int sensorValue = analogRead(A0);

    // отправляем значение
    send(sensorValue); 
}

void send(int param) 
{ 
    // конвертируем int в массив из 2 байт
    uint8_t msg[2];
    int len = 2;
    msg[0] = highByte(param);
    msg[1] = lowByte(param);

    // отправляем непосредственно в радиоканал
    vw_send(msg, len);
    // ждем пока сообщение не уйдет целиком
    vw_wait_tx(); 

}

Питание

Радиомодуль MX-05V очень простой, из-за этого он очень восприимчив к внешним помехам. И даже такой маленький мотор как в серво-машинке способен нарушить его работу. Для того, чтобы минимизировать влияние электромотора (это касается только колекторных моторов), нужно разделить питание силовой части от приемника. При этом «минус» у них должен быть общий. Итоговая схема подключения приемника выглядит так.

Радиоуправление на ардуино

Используя arduino можно самостоятельно изготовить сложную систему радиоуправления не затрачивая, при этом, много усилий. Для популярной, на данный момент, платформы arduino существует огромное количество модулей расширяющих возможности данной платформы. Например модули nrf24l01 для радиосвязи. Существует некоторое колличество разновидностей данного модуля. Есть модули для связи на расстояниях до 100м они небольшие и недорогие

Если необходима компактность то можно использовать другие ардуины например:

Также можно использовать любое другое ардуино но эти два (описанных выше) проще всего. Есть например 

Теперь давайте рассмотрим схему передатчика:

Рисунок 1 – Передатчик на ардуино

У данного передатчика имеется 10 кнопок и 5 потенциометров. Допустим нам надо управлять дистанционно двумя серврмрторами, 3мя ШИМами, одним пьезодинамиком и 8ю цифровыми выходами для каких либо целей (напр. сделать 8 фонарей на радиоуправлямый автомобиль или 1 фонарь а 7 выводов оставить для чего нибудь на будущее). На схеме выше показна ардуино уно но аналогично можно соединить радиомодуль кнопки и потенциометры с другим ардуино для этого надо использовать надписи на плате ардуино. Давайте теперь рассмотрим приемник:

Рисунок 2 – Приемник на Ардуино

 Напрямую к выводам ардуино можно подключать только маломощный пьезодинамик иначе слишком большой нагрузкой можно ардуино сломать. То же самое относится и ко всем остальным выводам на приёмнике. К ним нельзя подключать слишком большую нагрузку для того чтобы Ардуино не испортилось. Для питания сервомоторов можно использовать отдельный источник питания. Если сервомоторы мощные то их вывод питания нельзя подключать к выводу питания ардуино. Теперь давайте рассмотрим скетчь передатчика:

В начале скетча подключаются заголовочные файлы для связи с радиомодулем потом назначаются пины для связи с радиомодулем по SPI, указывается идентификатор трубы который должен совпадать с идентификатором трубы указанном в скетче приемника (см. ниже), создаётся массив для передачи данных на приемник. Далее идёт функция инициализации в которой инициализируется и настраивается радиомодуль после чего он устанавливается на передачу данных, инициализируются входы ардуино и делается небольшая задержка на всякий случай. В основном цикле считываются значения с потенциометров для сервомоторов и преобразуются в градусы функцией map. Далее, в следующую ячейку массива, запихиваются состояния входов ардуино побитно. После чего считываются значения с потенциометров для управления ШИМами, делятс на 4 т.к. аппаратный ШИМ ардуино принимает 1 байт. Оставшиеся два состояния, с кнопок, пропихиваются в оставшуюся ячейку массива и он, наконец таки, отправляется на приемник.

Теперь скетчь приемника:

В приемнике помимо заголовочных файлов для связи с радиомодулем есть ещё заголовочный файл для работы с сервомоторами. Радиомодуль теперь настраивается на прием. В основном цикле происходит прием и раздача информации на периферию микроконтроллера ардуины. 

Посмотреть видео по данной теме с испытаниями системы радиоуправления на ардуино:

Результат

Данные радиомодуль слишком восприимчив к помехам, и управлять летательной техникой на нем нельзя. Но для игрушечной машинки или лодки вполне подойдет.

Смотрите про коптеры:  Бюджетная радиосвязь для микроконтроллеров AVR / AVR / Сообщество
Оцените статью
Радиокоптер.ру
Добавить комментарий