RSS лента

alexeykozin

Переключатель режимов ардупилота

Рейтинг: 4.67. Голосов: 6.
16.05.2012 в 15:49 (24471 Показов)

При управлении летательным аппаратом с полетным контроллером помимо 4 стандартных каналов управления требуется дополнительный для выбора режима, к этому каналу есть требование чтобы по нему передавалось несколько уровней сигнала, каждому из уровней соответствует определенный режим работы автопилота.

Однако во всех известных мне пультах многоступенчатые переключатели отсутствуют, поэтому подобную проблему решают двумя способами:
- микширование нескольких переключателей, при этом каждой комбинации переключателей соотвествует какой либо режим
- использование аналогового регулятора "крутилки"

Комбинации из микшированных переключателей крайне неудобны тем что в ответственный момент начинаешь теряться в управлении и совсем уже нет времени вспоминать нужную комбинацию для режима.
"крутилки" - ими можно выбирать любой из режимов, но отсутствие дискретности делает их использование крайне неудобным, кроме того невозможно из первого режима переключиться сразу в пятый - необходимо прокрутить все промежуточные режимы. Мне ка начинающему "пилоту" показалось крайне сложным одновременно следить за моделью отслеживать высоту и положение модели и одновременно не теряться выставляя нужную позицию у "крутилки"


Собственно дальше речь пойдет о том как сделать дискретный переключатель.
У многих пультов есть входы управляемые напряжением, в такой цепи включен резистор - одной стороной он подключен к +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;
BtnLevels[15] = 84;
BtnLevels[16] = 127;
BtnLevels[17] = 169;
BtnLevels[18] = 255;


//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]);
}

Благодаря разгону PWM до 30кгц возможно более быстрое переключение, вместо трех каскадов сглаживания выходного напряжения достаточно одного-двух


Подключение вместо переменного резистора ("крутилки") пульта Hobby King 2.4Ghz 6Ch :

вариант размещения платы:
Три провода снятые с переменного резистора отлично достают до платы установленной снаружи.
через штыревой разъем сверху возможно залить персонализированный вариант скетча или настроек.
на заднем фоне MissionPlaner в котором отображается что включен режима rtl




на фото включен режим стабилизации и он же на заднем фоне MissionPlaner

уровни напряжения для каждой из кнопок задаются в скетче установкой переменных
BtnLevels[14] = 0; // первая кнопка, 0 вольт
BtnLevels[15] = 84; // вторая кнопка, настроено на попадание в середину 5 режима
BtnLevels[16] = 127; // третья кнопка, середина 4 режима
BtnLevels[17] = 169; // четвертая кнопка, середина 3 режима
BtnLevels[18] = 255; // пятая кнопка, 5 вольт, 1 режим

Возможно вы заметили что в планере 6 режимов а переключатель 5-кнопочный. дело в том что пока я разрабатывал эту плату разработчики ардупилота увеличити число режимов до 6, в моем случае я не использую режим 2.

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

Актуальный вариант схемы, чертеж печатной платы в формате eagle можно скачать у меня на сайте.
зы. я заказывал печатную платку на заводе, еще несколько штучек осталось.

Дополнение 7.01.14
6 кнопочная версия
лицевая сторона



обратная сторона



карбоновая накладка, дюралевые кнопки, пульт hk6ch



Юхимюк Сергей выбрал выбрал такое решение:
Нажмите на изображение для увеличения
Название: picture1.jpg
Просмотров: 648
Размер:	59.2 Кб
ID:	950558
Это позволяет переустанавливать ее при необходимости на другой передатчик.
Соединительный разъем- обычный мини-джек от стереонаушников, врезанный в корпус,
с встроенными переключателями, позволяющими при отключении пульта восстанавливать прежнюю цепь крутилки.
Нажмите на изображение для увеличения
Название: picture2.jpg
Просмотров: 303
Размер:	59.5 Кб
ID:	950559
Нажмите на изображение для увеличения
Название: picture3.jpg
Просмотров: 184
Размер:	52.6 Кб
ID:	950560
Корпус использовал от ПДУ подходящего размера, удалив внутренности.
Табличка нарисована в Фотошопе и напечатана на цветном принтере на чертежной бумаге.
Обклеил с двух сторон обычным прозрачным скотчем.
Нажмите на изображение для увеличения
Название: picture4.jpg
Просмотров: 515
Размер:	65.2 Кб
ID:	950561

Обновлено 19.06.2014 в 08:49 [ARG:5 UNDEFINED]

Категории
Без категории

Комментарии

  1. Аватар для SovGVD
    Спасибо =) надо будет себе сделать на досуге
  2. Аватар для kren-DEL
    а не проще сделать на отечественном? просто наставить делителей и всё, как такой вариант?
  3. Аватар для SovGVD
    проще, можно любую переключалку взять и резисторы разным номиналом, но это не так прикольно =)
  4. Аватар для Covax
    Алексей, круто!
    А нельзя придумать ответную часть, которая подключалась бы к каналу приемника и при различных значениях pwm вкл/выкл ту или иную цепь?
  5. Аватар для kren-DEL
    не, тут тока прямой канал, без обратной связи) хотя можно намудрить с логикой... и светодиодами, тогда получится тоже самое что и дуиной, но проще)
  6. Аватар для SovGVD
    Цитата Сообщение от Covax
    Алексей, круто!
    А нельзя придумать ответную часть, которая подключалась бы к каналу приемника и при различных значениях pwm вкл/выкл ту или иную цепь?
    в том же multiwii прописать if-ы для AUX канала по аналогии с переключением режимов, а уже с арудинки рулить цепями, даже при самой плохой аппе (+-10 скачет сигнал, ну и если подобная схема даст нужную расрешающую способность) выйдет аж 50 режимов + если поставить таймер (чтобы как бы пакет данных собирался на определенное время), 50 одновременных режимов
  7. Аватар для Covax
    Не, я хочу такую же красивую законченную схему как у Алексея)
  8. Аватар для alexeykozin
    Спасибо всем за отзывы.
    кстати переключатель можно реализовать на обычной мини - ардуинке (мало ли у кого без дела валяется) а "навес" из кнопок и светодиодов можно будет крепить напрямую в корпус пульта. может даже симатичнее внешне будет.

    по поводу п2к или галетника я в первую очередь подумал, но не решился из эстетических соображений)

    ответную часть тоже можно сделать - примеров кода ппм декодера в изобилии
    в данном примере логика так как в переключателе п2к - тоесть одновременно лишь один канал активен но если делать не под пилот а "расширение числа каналов" то и на пульте можно сделать отдельные кнопки независимыми
  9. Аватар для Andrew Stick
    Сергей, если все еще хотите, стукнитесь ко мне в личку
  10. Аватар для Covax
    Я в принципе понимаю как это реализовать в железе и софте, так как делал нечто похожее в учисенном варианте, но вдруг кто-то это уже доделал в реальной жизни!
  11. Аватар для SovGVD
    Люди, а никто случайно не встречал схему подключения ардуинки к trainer порту пульта? Теоретически можно же будет смодулировать любые сигналы на любом канале... или trainer порт не для подключения еще одного пульта?
  12. Аватар для targetorsk
    для уточнения так как прописано
    #define AnalogOut 10 // PWM out
    то выход схемы подключается к отброшенному центральному проводу, выбранной для замены крутилки?
  13. Аватар для alexeykozin
    да, конечно выход подключается на центальный пин крутилки, у этой же крутилки крайние пины общий и +5
  14. Аватар для Compage
    не осталось ли еще платок?
  15. Аватар для alexeykozin
    есть еще, пишите kozin@mail.ru
  16. Аватар для targetorsk
    как нужно подправить скетч если надо подключить шестую кнопку скажем на ADC5 и задействовать второй выход (например PB1) ? Далее логически разделить набор кнопок как два по три кнопки и выводить в зависимости от нажатия кнопок №№1-3 в канал PB2 значения напряжения 0-127-255 соответственно и аналогично для кнопочек №№4-6 в канал PB1 ?
    Или тупо описать (по аналогии) шестой вход и второй выход
    #define AnalogOut 10 // PWM out первый
    #define AnalogOut2 9 // PWM out дополнительный
    BtnLevels[14] = 0; // 1 кнопка
    BtnLevels[15] = 127;
    BtnLevels[16] = 255;
    BtnLevels[17] = 0;
    BtnLevels[18] = 127; //
    BtnLevels[19] = 255; // 6 кнопка

    и сделать второй цикл
    первый for (int i=14; i <= 16; i++)
    второй for (int i=17; i <= 19; i++)
    дублируя вложения конструкции с изменениями выходов?

    И будет ли корректно работать скетч если не ставить кварцевый резонатор, а зашить фьюзы для работы от внутреннего 8Мгц генератора?
    Обновлено 16.09.2012 в 03:06 [ARG:5 UNDEFINED]
  17. Аватар для EduardNN
    Я как то так поправил, чтобы добавить шестой режим:


    /*
    s1 - s6 & LEDS connected to analog pins 1-6
    its numbers from 14 to 19


    */

    #define AnalogOut 10 // PWM out

    int SelBtn = 14; // default
    int BtnLevels[20];


    void setup()
    {

    Serial.begin(9600);

    //5 of 6 modes

    BtnLevels[14] = 0;
    BtnLevels[15] = 51;
    BtnLevels[16] = 102;
    BtnLevels[17] = 153;
    BtnLevels[18] = 204;
    BtnLevels[19] = 255;


    //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 <= 19; 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 <= 19; i++)
    {
    if (i != excludePin)
    pinMode(i, INPUT);
    digitalWrite(i,HIGH);
    }

    analogWrite (AnalogOut, BtnLevels[excludePin]);
    Serial.println(BtnLevels[excludePin]);
    }


    Может чего не правильно, т.к. в программировании полный ноль, но работает.
    Не понял зачем доп выход?
    Режимы по одному каналу управляются.
    Доп кнопку повесил на 28ю ногу меги.
    Единственное , скорее всего, нужно будет править/подгонять уровни режимов...
    Обновлено 20.09.2012 в 10:24 [ARG:5 UNDEFINED]
  18. Аватар для alexeykozin
    Плиз, кто повторил переключалку на ардуино поделитесь фотками,
    очень интересны фотки подключения к ардуино "для чайников"
    и дизайнерских решений по корпусному оформлению
  19. Аватар для EduardNN
    Я собрал такой вариант , только руки не дойдут засунуть это в турнигу...
  20. Аватар для alexeykozin
    Пришло несколько идей по усовершенстврованию прошивки
    новый скетч в конце странички http://hobby.msdatabase.ru/project-u...rsurvey/modesw
    в архиве

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

    За15 минут на коленке сделал.
  22. Аватар для alexeykozin
    Браво!, спасибо за фотку!
  23. Аватар для HATUUL
    Решил пьезик поставить,заодно пофоткать.


    https://lh3.googleusercontent.com/-p...04_010319.jpg]
    Гордиться нечем,просто на заметку.
    Перемычка,для калибровки.Пьезик,пищит в самый как раз,и не тихо , и не громко.
    Ещё раз,спасибо за проект!
  24. Аватар для alexeykozin
    а смонтировано проводом который самозачищается при пайке или обычная обмоточная жилка?
  25. Аватар для HATUUL
    ХЗ.Походу обычный эмалированый,мы таким на работе обрывы соединяем.
  26. Аватар для alexeykozin
    а лудишь его как? кислота? аспирин?
  27. Аватар для svir
    здравствуйте. собрал контроллер, заливал ваш некс и на 6 кнопок, сам контроллер работает, уровень в вольтах получается 0 0,9 1,9 2,9 3,9 4,9 на шести кнопках, но в аппе, туринга с ер9х, уровень сигнала получается совсем по другому, 1 кнопка 0 вольт- PWM 1100 2кнопка 0,9 вольт PWM 1460 3 кнопка 1,9 вольт PWM скачет до конца 2000 и на всех остальных кнопках 4 5 6 получается PWM 2000. что я мог не то сделать?
  28. Аватар для alexeykozin
    в моем последнем скетче что находится по ссылке внизу страницы в архиве есть возможность подстройки уровней каждой кнопки замыкая перемычками "тюнинг" - попробуйте подстроить под ваш диапазон.
    если уровень "скачет" - тут возможно что плохое питание платы или неверно выбраны резисторы - конденсаторы в выходном фильтре. я в последнее время ставлю только 2 контура из трех резисторы 3килоома кондеры по 2,2мкф
  29. Аватар для alexeykozin
    вот прямая ссылка, внизу описан новый функционал и архив со скетчем http://hobby.msdatabase.ru/project-u...rsurvey/modesw
  30. Аватар для svir
    Цитата Сообщение от alexeykozin
    вот прямая ссылка, внизу описан новый функционал и архив со скетчем http://hobby.msdatabase.ru/project-u...rsurvey/modesw
    Благодарю, прочитал, теперь появился такой вопрос , где находится на атмеге пин D9 и D8, на схеме их вроде нет или не нашёл их а по номерам ног на атмеге вроде не подходят?
  31. Аватар для EduardNN
    Посмотри схему\мы на ардуинки

    D8 --> PB0(12)
    D9 --> PB1(13)
  32. Аватар для HATUUL
    Цитата Сообщение от alexeykozin
    а лудишь его как? кислота? аспирин?
    Тупо 480 градусов сжигают эмаль за доли секунды,и в этот момент происходит лужение.
    Алексей.А никак нельзя вернуть в строй и потенциометр.
    Конечно можно микропереключателем.Но имелось в виду через доп. кнопку.
    П.с.Да простит меня создатель проекта.Не удржался и сделал 6 кнопочек.
    Код:
    /*
    s1 - s6 & LEDS connected to analog pins 0-5
    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[19];
     
    
    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)!=123 || 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, 4000, 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);
     
    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, 123); //mark eeprom inited
    EEPROM.write(14, 0);
    EEPROM.write(15, 84);
    EEPROM.write(16, 127);
    EEPROM.write(17, 169);
    EEPROM.write(18, 255);
    EEPROM.write(19, 0);
    }
    
    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);
    
    }
    Доп.кнопка на А5 висит.
    Обновлено 05.02.2013 в 17:01 [ARG:5 UNDEFINED]
  33. Аватар для alexeykozin
    распиновки ардуинок http://hobby.msdatabase.ru/project-updates
    желтая заливка- нумерация цифровыходов

    любые предложения и тем более наработки по коду приветствуются!
  34. Аватар для -Serj-
    Алексей, вот мое оформление Вашей платки

    Выложите, пожалуйста, фотографию платы с обратной стороны, а то я ее приклеил, теперь не знаю распиновку выводов.
    Обновлено 12.02.2013 в 12:06 [ARG:5 UNDEFINED]
  35. Аватар для alexeykozin


    а, что это за корпус? фултяр от sd-card?
  36. Аватар для -Serj-
    Спасибо!
    От СF, он без перегородок внутри.
  37. Аватар для romushock
    "очень интересны фотки подключения к ардуино "для чайников""

    ОООО, их есть у меня!



    Обновлено 01.03.2013 в 21:10 [ARG:5 UNDEFINED]
  38. Аватар для alexeykozin
    неожидано эффектно с "линзами" вышло!
    кстати я забыл отписаться что на сайте теперь выложен скетч и под 5 и под 6 кнопок.
    подправил маленький недочет который приводил к тому что если на 6 кнопочный скетч повесить не все светодиоды, то режим перещелкивался на неподключенный канал
  39. Аватар для svir
    здравствуйте. у меня получилось исправить не правильные уровни сигнала на выходе, косяк как всегда был прост до безобразия, оказывается в аппе помимо стиков надо калибровать ещё и крутилки, откалибровал их и всё сразу заработало. в инструкции наверное надо написать что бы ещё кто то не парился потом с этим или я один такой.
  40. Аватар для romushock
    Ну вот, есть чем похвалиться...