Ad Clicks : Ad Views : Ad Clicks : Ad Views :

Переключатель режимов по схеме Алексея Козина для Turnigy 9x

В статье будет рассказано об удобном переключателе полетных режимов для контроллера APM, разработанным Алексеем Козиным. Основой переключателя является микроконтроллер ATmega328, входящий в Arduino Pro Mini.

Алексей Козин предложил отличный вариант (ссылки на дневник и сайт) переключателя полетных режимов APM для аппаратуры радиоуправления. Подойдет, наверно, практически ко всем аппаратурам, имеющим хотя бы один аналоговый регулятор (переменный резистор) — «крутилку». Предполагается его замена на изготавливаемый переключатель. О плюсах переключателя по сравнению с другими способами организации переключения режимов  и настройке описано в дневнике. На аппаратуре надо заранее настроить «крутилку» на выход канала 5. Этот канал с аппаратуры подключить на 5й входной канал APM и проверить работу. Лучше будет установить прошивку er9x (источник на прошивку можно найти в статье «Настройка переключателя режимов на прошивке er9x для Turnigy 9x»).

Схема переключателя в первом исполнении (на момент разработки у APM было 5 режимов):

Схема переключателя на 5 режимов
Схема переключателя на 5 режимов
Исходный код переключателя (5 режимов)
/*
s1 - s5 & LEDS connected to analog pins 1-5
its numbers from 14 to 18
*/
#define AnalogOut 10 // PWM out
int SelBtn = 14; // default
int BtnLevels[19];
void setup()
{
Serial.begin(9600);
//5 of 6 modes
BtnLevels[14] = 0; // 1 кнопка
BtnLevels[15] = 84;
BtnLevels[16] = 127;
BtnLevels[17] = 169;
BtnLevels[18] = 255; // 5 кнопка
//force pwm
TCCR1B = 0x01;
delay(100); 
pinMode(SelBtn, OUTPUT);
digitalWrite(SelBtn,0);
analogWrite (AnalogOut, BtnLevels[SelBtn]);
}
void loop()
{
ScanBtns();
delay(10);
}
void ScanBtns()
{
for  (int i=14; i <= 18; i++)
     ScanBtn(i);
}
void ScanBtn(int ScanPin)
{
if (SelBtn != ScanPin) 
{
pinMode(ScanPin, INPUT);
if (digitalRead(ScanPin)==0)
  {
      SelBtn = ScanPin;
      unsetOther(ScanPin);
      while (digitalRead(ScanPin)==0); // hold scaning until relise button
      pinMode(ScanPin, OUTPUT);
      digitalWrite(ScanPin,LOW);
  }
}
}
void unsetOther(int excludePin)
{
for  (int i=14; i <= 18; i++)
    {
    if (i != excludePin)
        pinMode(i, INPUT);
        digitalWrite(i,HIGH); 
    } 
analogWrite (AnalogOut, BtnLevels[excludePin]);
Serial.println(BtnLevels[excludePin]);  
}

Добавление 6й кнопки (6 режимов):

Схема переключателя режимов
Схема переключателя режимов
Исходный код переключателя (6 режимов)
/*
s1 - s6 & LEDS connected to analog pins 1-6
its numbers from 14 to 19
*/
#include <EEPROM.h>
#define AnalogOut 10 // PWM out
#define SoundOut 7 //d7 speaker out
int SelBtn = 14; // default
//int BtnLevels[20];
void setup()
{
Serial.begin(9600);
pinMode(8, INPUT); //tune up button
pinMode(9, INPUT); //tune down button
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
if  (EEPROM.read(1)!=124 || digitalRead(9) == LOW ) // if pin 9 short to 0 start reset defaults
reset_eprom();
//force pwm
TCCR1B = 0x01;
delay(100);
pinMode(SelBtn, OUTPUT);
digitalWrite(SelBtn,0);
analogWrite (AnalogOut, BtnLevel(SelBtn));
tone(SoundOut, 2000, 150);
delay (200);
tone(SoundOut, 1000, 400);
}
void loop()
{
ScanBtns();
TuneLevel();
delay(10);
}
void ScanBtns()
{
for  (int i=14; i <= 19; i++)
ScanBtn(i);
}
void ScanBtn(int ScanPin)
{
if (SelBtn != ScanPin)
{
pinMode(ScanPin, INPUT);
digitalWrite(ScanPin,HIGH);
if (digitalRead(ScanPin)==0)
{
SelBtn = ScanPin;
unsetOther(ScanPin);
tone(SoundOut, 5500, 150);
while (digitalRead(ScanPin)==0); // hold scaning until relise button
pinMode(ScanPin, OUTPUT);
digitalWrite(ScanPin,LOW);
}
}
}
void unsetOther(int excludePin)
{
for  (int i=14; i <= 19; i++)
{
if (i != excludePin)
pinMode(i, INPUT);
digitalWrite(i,HIGH);
}
analogWrite (AnalogOut, BtnLevel(excludePin));
Serial.println(BtnLevel(excludePin));
}
void reset_eprom()
{
EEPROM.write(1, 124); //mark eeprom inited
EEPROM.write(14, 0);
EEPROM.write(15, 84);
EEPROM.write(16, 127);
EEPROM.write(17, 160);
EEPROM.write(18, 190);
EEPROM.write(19, 255);
}
byte BtnLevel(int pin)
{
return EEPROM.read(pin);
}
void TuneLevel()
{
byte newlevel = 0;
if  ( digitalRead(9) == LOW)
{
newlevel = constrain(BtnLevel(SelBtn) - 1 ,0,255);
EEPROM.write(SelBtn, newlevel);
showpin(newlevel);
}
if  ( digitalRead(8) == LOW)
{
newlevel = constrain(BtnLevel(SelBtn) + 1 ,0,255);
showpin(newlevel);
}
}
void showpin(byte newlevel)
{
EEPROM.write(SelBtn, newlevel);
analogWrite (AnalogOut, newlevel);
Serial.println(newlevel);
if (newlevel >1 && newlevel < 254 )
digitalWrite(SelBtn,HIGH);
delay(200);
digitalWrite(SelBtn,LOW);
}

Актуальная прошивка позволяет удобно подстраивать уровни каждого из каналов.

Возможности:

  • при замыкании пина D9 на GND после инициализации контролера происходит регулировка уровня выбранного канала в меньшую сторону, уменьшение индицируется миганием светодиода если светодиод перестал мигать — достигнуто максимальное или минимальное значение
  • при замыкании пина D8 на GND после инициализации контролера происходит регулировка уровня выбранного канала в большую сторону, уменьшение индицируется миганием светодиода если светодиод перестал мигать — достигнуто максимальное или минимальное значение
  • при замыкании пина D9 на GND в момент включения питания происходит сброс параметров на те что указаны в прошивке по умолчанию
  • На вывод D7 можно подключить пьезо — пищалку, при этом переключение каналов подтверждается писком. (Индуктивные пищалки следует зашунтировать защитным диодом параллельно пищалке, анодом на GND)

Это расширение возможностей позволит избежать трудоемкой процедуры калибровки аппаратуры и прошивки.

После изготовления платы с кнопками и загрузки прошивки в Arduino приступаем к сборке. Спаиваем все согласно схеме. Далее разбираем аппаратуру и снимаем понравившуюся/ненужную «крутилку». Мультиметром ищем провода земли и питания +5В. Третий провод — «сигнальный». Подпаиваем собранный переключатель к этим трем проводам. Далее монтируем переключатель на аппаратуре удобным для вас способом и собираем аппаратуру (до сборки можно предварительно включить и проверить работу). Проверяем работу переключателя и показания в Mission Planner.

Более подробную информацию можно найти в дневнике или сайте Алексея Козина (см. ссылки выше) и сказать ему «Спасибо»!

Update 04.06.2014: Имеется аналогичный девайс, сделанный за бугром.

Update 10.08.2014: Видеоматериал от Юлиана.

Юлиан доработал свою аппаратуру платой, сделанной Александром Мининым по схеме Алексея Козина (в видео оговорка). Смотрим процесс подключения на видео!

Update 10.04.2015: Заметка от пилота Dimon по поводу уровней сигнала.

Развернуть

Код из 6 (канального) надо поправить. Объясню почему — по умолчанию взяты данные режимов из 5 канального и в результате получаем

EEPROM.write(14, 0); — Минимальное значение 988
EEPROM.write(15, 84); — 1320
EEPROM.write(16, 127); — 1495
EEPROM.write(17, 160); — 1629
EEPROM.write(18, 190); — 1751
EEPROM.write(19, 255); — максимальное значение 2010

у меня получилось так да и у всех примерно так-же. теперь смотрим режимы в MP

  • 1 0 -1230
  • 2 1231 — 1360
  • 3 1361 — 1490
  • 4 1491 — 1620
  • 5 1621 — 1749
  • 6 1750 +

И получаем что последних 2 режима попадают на одну и туже позицию в МР так как 6 режим начинается 1750 + . и нет попадания в 3 режим Да и 5 режим на грани что тоже не очень хорошо. Можно конечно подрегулировать кнопками, но я например не собирался их делать — но пришлось.

А вот и нашел ответ в другом месте :)

EEPROM.write(14, 0);
EEPROM.write(15, 51);
EEPROM.write(16, 102);
EEPROM.write(17, 153);
EEPROM.write(18, 204);
EEPROM.write(19, 255);

Для аппаратуры Turnigy 9xr необходимо применять Arduino на 3.3В (либо колхозить из Arduino на 5В) с уровнем сигнала 3.3В, т.к. на аппаратуре на резистор поступает 3.3 вместо 5В. Хоть и 16МГц от 3.3В не документируется, но работает нормально. Проверено.

Update 06.04.2016: Модифицированная версия прошивки для переключателя на 3 режима от пользователя Kalerva

Трехкнопочный переключатель режимов (делался под naza m lite v1 прошитый во второй).

Т.к. в naza всего пять режимов полетов, два из которых промежуточный failsafe. А режим manual аналог режима камикадзе.
Было решено собрать переключатель всего лишь трех полетных режимов  (GPS, Attitude и FS).
a10 — PWM
d7 — buzzerr
d8* — tune up * — зажатая при включении сбросит настройки свитчера
d9 — tune down
a0 — led1
a1 — led2
a2 — led3

Схема переключателя на 3 режима
Схема переключателя на 3 режима
Исходный код переключателя (3 режима)

/*
***********************************************************************************************
***************************** Created by Aleksey Kozin ****************************************
***********************************************************************************************
********************************** mod by Kalerva *********************************************
***********************************************************************************************

s1 — s3 & LEDS connected to analog pins 0-2
its numbers from 14 to 16
*/
#include <EEPROM.h>
#define AnalogOut 10 // PWM out
#define SoundOut 7 //d7 speaker out
int SelBtn = 14; // default
//int BtnLevels[20];

void setup()
{
Serial.begin(9600);
pinMode(8, INPUT); //tune up button
pinMode(9, INPUT); //tune down button
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
if (EEPROM.read(1)!=124 || digitalRead(9) == LOW ) // if pin 9 short to 0 start reset defaults
reset_eeprom();
//force pwm
TCCR1B = 0x01;
delay(100);
pinMode(SelBtn, OUTPUT);
digitalWrite(SelBtn,0);
analogWrite (AnalogOut, BtnLevel(SelBtn));
tone(SoundOut, 4000, 150);
delay (200);
tone(SoundOut, 1000, 400);
}
void loop()
{
ScanBtns();
TuneLevel();
delay(10);
}
void ScanBtns()
{
for (int i=14; i <= 16; i++)
ScanBtn(i);
}
void ScanBtn(int ScanPin)
{
if (SelBtn != ScanPin)
{
pinMode(ScanPin, INPUT);
if (digitalRead(ScanPin)==0)
{
SelBtn = ScanPin;
unsetOther(ScanPin);
tone(SoundOut, 5500, 150);
while (digitalRead(ScanPin)==0); // hold scaning until relise button
pinMode(ScanPin, OUTPUT);
digitalWrite(ScanPin,LOW);
}
}
}
void unsetOther(int excludePin)
{
for (int i=14; i <= 16; i++)
{
if (i != excludePin)
pinMode(i, INPUT);
digitalWrite(i,HIGH);
}
analogWrite (AnalogOut, BtnLevel(excludePin));
Serial.println(BtnLevel(excludePin));
}
void reset_eeprom()
{
EEPROM.write(1, 124); //mark eeprom inited
EEPROM.write(14, 0);                                                //значения выставленные по-умолчанию при сбросе первого,
EEPROM.write(15, 127);                                            //второго и
EEPROM.write(16, 255);                                            //третьего полетных режимов
}
byte BtnLevel(int pin)
{
return EEPROM.read(pin);
}
void TuneLevel()
{
byte newlevel = 0;
if ( digitalRead(9) == LOW)
{
newlevel = constrain(BtnLevel(SelBtn) — 1 ,0,255);
EEPROM.write(SelBtn, newlevel);
showpin(newlevel);
}
if ( digitalRead(8) == LOW)
{
newlevel = constrain(BtnLevel(SelBtn) + 1 ,0,255);
showpin(newlevel);
}
}
void showpin(byte newlevel)
{
EEPROM.write(SelBtn, newlevel);
analogWrite (AnalogOut, newlevel);
Serial.println(newlevel);
if (newlevel >1 && newlevel < 254 )
digitalWrite(SelBtn,HIGH);
delay(200);
digitalWrite(SelBtn,LOW);
}


Если вы нашли ошибку на странице, то нажмите Shift + Enter или нажмите здесь, чтобы уведомить нас.

60 Comments

    • Не сомневаюсь!
      Андрей, видать в этот раз вы не очень внимательно читали этот момент: «Подойдет наверно практически ко всем аппаратурам, имеющим хотя бы один аналоговый регулятор (переменный резистор) — «крутилку».» 🙂

  1. Отличное дело делаете, парни! Мегауважуха вам!
    Номиналы резюков и кондеров не увидел только.

  2. Тоже заказал у Александра Минина переключатель, он сейчас присылает с доп. комплектацией:
    — две наклейки на корпус уже с высечкой под надписи
    — сами наклейки с надписями режимов
    — пластиковые упоры и панельку подсветки (ту что Юлиан вырезал со старого экрана Нокии)

  3. Приветствую!
    Можно ли проверить работоспособность схемы не подключая к аппе? Собрал шестикнопочную схему. Судя по переключению СИДов робит, но не хочу рисковать.

    • По светодиодам смотреть не совсем правильно. Они показывают, что программа работает. А вот что на выходе ШИМ — это надо смотреть. Вариантов не много: смотреть осциллографом, либо подключить в канал APM и смотреть значение импульса канала в MP.
      Рисковать там особо нечем. Главное в разных положениях посмотрите мультиметром, чтобы не было превышения напряжения 5В, чего и не должно быть.

      • Я к сожалению далек от электроники такого уровня, но в проге «Блинк» и производных от нее яркость светодиода регулится как раз за счет ШИМа. Мож имеет смысл попробовать или там другой алгоритм модуляции?

  4. Подключил, работает, но только в первой половине диапазона. Т.е. первая кнопка 990, шестая 1470. Аппа 9XR, прошивка стоковая. Пробую настроить аппу, но т.к. я ее только недавно получил особыми познаниями не обладаю. Если подскажете куда копать, буду весьма признателен.

    забыл добавить: при нажатой шестой кнопке после фильтра, на выходе 4.2 В

    откалибровал стики, крутилки и переключатель на аппе, все встало на свои места.

  5. Добрый день посмотрел видео очень понравилось.
    Можно получить ссылку Александра Минина, чтобы связаться и приобрести эту плату для установки в аппу.

    • Добрый день. У меня есть только ссылки на сайт Алексея (в начале статьи). Разработчик он. А Александр видимо повторил его идею. А как связаться с Александром, наверно знает Юлиан, но мы с ним давно не связывались.

  6. Жаль в программировании пока не силён, а то было бы неплохо прикрутить к этому устройству ардуиновский OLED дисплейчик и выводить на него названия режимов. У кого-нибудь есть идеи на этот счёт?

    • А зачем оно надо? Светодиодов и их подписей думаю достаточно, а если хочется вообще круто, то можно на турнигу подключить телеметрию и поставить прошивку, где все это будет.

      • Т.е. получается в моём Таранисе это уже где то есть в недрах настроек и можно как то выводить названия режимов на штатный дисплей?

        • Про таранис ничего не подскажу. А на турнигу возможна доработка. Данные берутся с Mavlink телеметрии.

  7. Учтите, что этим переключаетелем невозможно пользоваться вслепую, т.е в ФТП очках! Думаю проще все таки настроить тумблеры!

    • А часто приходится пользоваться всеми режимами в FPV? Обычно это стаб/альтхолд, лоитер и ртл.
      Меня устраивает моя конструкция.

      • Был бы признателен за инструкцию и скорректированную схему, как подключить всё на Pro Mini, она у нас тоже продается и даже чуть дешевле nano.

        • А в чем затруднения? Берете вторую схему, подставляете номиналы компонентов из первой схемы. Собираете. Заливаете через FTDI прошивку и наслаждаетесь.

  8. Код из 6 (канального) надо поправить. Обьясню почему — по умолчанию взяты данные режимов из 5 канального и в результате получаем

    EEPROM.write(14, 0); — Минимальное значение 988
    EEPROM.write(15, 84); — 1320
    EEPROM.write(16, 127); — 1495
    EEPROM.write(17, 160); — 1629
    EEPROM.write(18, 190); — 1751
    EEPROM.write(19, 255); — максимальное значение 2010

    у меня получилось так да и у всех примерно так-же.

    теперь смотрим режимы в MP
    1 0 -1230
    2 1231 — 1360
    3 1361 — 1490
    4 1491 — 1620
    5 1621 — 1749
    6 1750 +
    И получаем что последних 2 режима попадают на одну и туже позицию в МР так как 6 режим начинается 1750 + .
    и нет попадания в 3 режим
    Да и 5 режим на грани что тоже не очень хорошо.
    Можно конечно подрегулировать кнопками, но я например не собирался их делать — но пришлось

    Я с Arduino имею дело в первые поэтому не знаю как вычитать данные с памяти и посмотреть как они расположились. Если кто подскажет как это сделать, то выложу более правильные данные для прошивки.
    Ну или ждать пока руки дойдут чтоб с этим разобраться.

    • А вот и нашел ответ в другом месте 🙂

      EEPROM.write(14, 0);
      EEPROM.write(15, 51);
      EEPROM.write(16, 102);
      EEPROM.write(17, 153);
      EEPROM.write(18, 204);
      EEPROM.write(19, 255);

      Может просто поправите код в основном сообщении.

      • Dimon, спасибо за замечания! Добавлю ваш комментарий в статью, что на это необходимо обратить внимание. А вот править код или нет — пусть пользователи сами решают. Этот код взят из дневника Алексея и я учел все, что предлагали в комментариях. С этим кодом у меня получилось, что значения попали примерно в середину диапазонов режимов. Если не ошибаюсь, то как раз выходные резисторы и конденсаторы за это отвечают.

        • Еще тогда добавляйте след информацию информацию:
          Для владельцев turnigy 9xr pro в этих аппах идет не 5в на переменные резисторы а 3.3в. Я использовал обычную китайскую pro mini на 5в. она с успехом завелась и работает, но не факт, что другие будут работать. Просто прежде чем делать надо проверить заведется ли ваша Arduino на 3.3 вольта. Или брать те которые сходу на 3.3в.

  9. Извините за вопрос не в тему, хотел написать и показать фото про то как я установил переключатель шести полетных режимов от Александра Минина, очень нужная вещь а Как фото выложить? Не пойму, установил его на радиолинк ат9

  10. Всем привет! После продолжительных исследований программирования наконец-то готов и мой вариант переключателя. Программа написана на баскоме, т.е. с нуля. В устройстве используется графический дисплей OLED 128*64.
    Немного внутренностей:
    http://s020.radikal.ru/i720/1603/2f/ca219015cd61.jpg
    http://s013.radikal.ru/i324/1603/17/aca75101e9fa.jpg
    http://s020.radikal.ru/i713/1603/dd/f4b135cd19cd.jpg
    http://s017.radikal.ru/i440/1603/c5/7be771f0dfd0.jpg
    Отверстие в корпусе пульта и панелька из оргстекла делались на самопальном чпу-станке.
    http://www.youtube.com/watch?v=NDB7Al5Z3i0
    А тут как это работает:
    http://www.youtube.com/watch?v=1XTRASQYw40
    Менюшку с выбором типа летательного аппарата сделал просто так, может пригодится, когда начну осваивать самолёты и полётные режимы будут другими. Пока у меня только коптер, поэтому после выбора того или другого программа попадает в коптерный список режимов. Это опционально и всегда можно удалить.
    Также есть вариант программы под символьный дисплей 16*2, но встроенного решения с ним уж точно не получится))

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

        • Можете пойти и по такому пути, просто не цеплять 2 кнопки. А можете и перечертить печатную плату, чтоб всё было в соответствии с вашими требованиями.

          • Ткните носом, пожалуйста, что убрать на плате. А с софтом разберусь.
            Требования: три кнопки, не четыре. (плюс две кнопки настройки и пищалка)

            • В шапке указан сайт А. Козина, где доступны чертежи печатной платы на 6 кнопок, если же будете использовать Ардуино Нано, там ещё проще — просто навешиваете нужное кол-во кнопок, прошиваете и пользуетесь.

  11. Вот такой скетч. Дубль 3.

    /*
    ***********************************************************************************************
    ***************************** Created by Aleksey Kozin ****************************************
    ***********************************************************************************************
    ********************************** mod by Kalerva *********************************************
    ***********************************************************************************************
    ********************************** flymodeswitcher v.3********************************************
    ***********************************************************************************************
    s1 — s3 & LEDS connected to analog pins 0-2
    its numbers from 14 to 16
    */
    #include
    #define AnalogOut 10 // PWM out
    #define SoundOut 7 //d7 speaker out
    int SelBtn = 14; // default
    //int BtnLevels[20];

    void setup()
    {
    Serial.begin(9600);
    pinMode(8, INPUT); //tune up button
    pinMode(9, INPUT); //tune down button
    digitalWrite(8,HIGH);
    digitalWrite(9,HIGH);
    if (EEPROM.read(1)!=124 || digitalRead(9) == LOW ) // if pin 9 short to 0 start reset defaults
    reset_eeprom();
    //force pwm
    TCCR1B = 0x01;
    delay(100);
    pinMode(SelBtn, OUTPUT);
    digitalWrite(SelBtn,0);
    analogWrite (AnalogOut, BtnLevel(SelBtn));
    tone(SoundOut, 4000, 150);
    delay (200);
    tone(SoundOut, 1000, 400);
    }
    void loop()
    {
    ScanBtns();
    TuneLevel();
    delay(10);
    }
    void ScanBtns()
    {
    for (int i=14; i <= 16; i++)
    ScanBtn(i);
    }
    void ScanBtn(int ScanPin)
    {
    if (SelBtn != ScanPin)
    {
    pinMode(ScanPin, INPUT);
    if (digitalRead(ScanPin)==0)
    {
    SelBtn = ScanPin;
    unsetOther(ScanPin);
    tone(SoundOut, 5500, 150);
    while (digitalRead(ScanPin)==0); // hold scaning until relise button
    pinMode(ScanPin, OUTPUT);
    digitalWrite(ScanPin,LOW);
    }
    }
    }
    void unsetOther(int excludePin)
    {
    for (int i=14; i 1 && newlevel < 254 )
    digitalWrite(SelBtn,HIGH);
    delay(200);
    digitalWrite(SelBtn,LOW);
    }

  12. Подскажите пожалуйста как подключить переключатель режимов полёта на аппаратуру fs-6i. На крутилке 3,22 в. Вроде пробовал подключить как тут написано, через крутилку, но при подключении аппаратура тухнет, а при отключении переключателя аппаратура включается. Переключатель покупал на сайте микрохобби.

    • Переключатель расчитан на 5В питания. От 3.3В может не запуститься микроконтроллер, но если запустится, то работать должно. Но если аппаратура отключается, то может происходит перегрузка по питанию? Быть такого не должно, т.к. МК потребляет мало (до 40мА) + светодиод пусть 30мА.

Комментировать

Ваш e-mail не будет опубликован. Обязательные поля помечены *

This div height required for enabling the sticky sidebar