После первых полетов ардукоптера у меня сложилось устойчивое желание поиметь 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;
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кгц возможно более быстрое переключение, вместо трех каскадов сглаживания выходного напряжения достаточно одного-двух
Подключение вместо переменного резистора ("крутилки") хоббикинговского пульта:
подключение платы:
Три провода снятые с переменного резистора отлично достают до платы установленной снаружи.
через штыревой разъем сверху возможно залить персонализированный вариант скетча или настроек.
на заднем фоне 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.
Для подбора режима используется миссион планер, в разделе калибрвоки стиков отображены длительности импульсов в милисекундах, я подобрал уровни сигнала таким образом чтобы каждая кнопка попадала в середину диапазона и обеспечивала стабильность.
Ниже приведен актуальный вариант схемы, чертеж печатной платы