Контроллер для кордовых электричек
сегодня целый день воевал с “траблой” от дребезга контактов кнопок. вроде как ее “купировал”.
нужен совет, изменение параметра в данный момент возможно на единицу за одно нажатие кнопки.
при значениях 300 секунд (например 5 минут полета) это надо нажать триста раз на кнопку,
понятно, что менять от базового, ну типа было 240 секунд, но все равно, может быть шестьдесят раз и больше.
рассматриваю два варианта,
- менять по знакам в числе, типа тысячи, сотни, десятки и единица, в принципе реализуемо.
- второй вариант придумать как ускорить удержанием кнопки, пока не придумал.
Шаг в 10 секунд, я думаю, будет достаточно, это примерно два круга.
Делаем длинное нажатие минуты, короткое секунды Или разносим на разные кнопки минуты и секунды
int Stack [] { // программирумые параметры
Motor_ESC_Normall_THR, // нормальные обороты мотора
Motor_ESC_Landing_THR, // обороты мотора при посадке
InFly, // общее время полета с момента уборки шасси
Takeoff, // время на "убежать к ручке"
GearUp, // момент уборки шасси с момента старта
Landing // время на посадку.
};
так выглядит список изменяемых параметров
char* menu [] {
"THR Norm Level ", // нормальные обороты мотора
"THR Land Level ", // обороты мотора при посадке
"Flight time ", // общее время полета с момента уборки шасси
"Time for start ", // время на "убежать к ручке"
"Time for GUp ", // момент уборки шасси с момента старта
"Time for landing", // время на посадку.
"Read data ", // прочитать данные с таймера
"Write data " // записать данные в таймер
};
сейчас так выглядит Меню программатора.
Red/Write - чтение/запись параметров в таймер, подключенный по i2c,
пока стоят заглушки, но таймер уже отвечает ))
Делаем длинное нажатие минуты, короткое секунды Или разносим на разные кнопки минуты и секунды
на аналоговых кнопках, тем более их там сразу пять штук ),
я пока не придумал как это сделать, голова продолжает думать, если придумаю - реализую
хотя, вот прямо сейчас пришла в голову мысль, на кнопку SELECT прикрутить множитель и его выводить в строку параметра
- х1/х5/х10/х50/х100 и менять его по кругу.
и тогда изменение параметра будет на 1/5/10/50/100
Или разносим на разные кнопки минуты и секунды
сейчас LEFT/RIGHT - смена параметра, UP/DOWN - изменение значения
пока список параметров выглядит так
в список просится delta для оборотов мотра при изменении тангажа.
на кнопку SELECT прикрутить множитель и его выводить в строку параметра
- х1/х5/х10/х50/х100 и менять его по кругу.
и тогда изменение параметра будет на 1/5/10/50/100
прикрутил и даже работает, сделал х1/х10/х100, вывожу в сроку со значением, что бы было видно, думаю достаточно
через часок вернусь с прогулки с собакой, сделаю маленькую видюшку
Можно сделать следующим образом.
Выделили пункт меню, нажали селект, вверх/вниз -минуты, влево/вправо - секунды, повторное нажатие селект - сохранение и возврат к списку параметров. И отображение хорошо бы не просто в секундах, а в секундах и минутах
я конечно подумаю, но что то мне подсказывает, что это очень сильно усложнит программу.
пока это работает так. заменить секунды на минуты:секунды вполне возможно и даже не очень трудно )
Просто при настройке каждый раз надо в голове пересчитывать секунды в минуты, переключать множитель, не удобно и можно запутаться. В таймер пусть заливаются секунды, а программатор отображает минуты:секунды. Т. Е. В программаторе просто заменить отображение, а на кнопки назначить шаг в 60 и 1 секунду. Т. Е. Вверх/вниз -шаг 60, влево/вправо -шаг 1
А когда закончим настройки, жмем меню записать и данные заливаются в таймер.
Кстати онлайн запись в таймер не нужна, записывать, я думаю лучше, после настройки всех параметров
Кстати онлайн запись в таймер не нужна, записывать, я думаю лучше, после настройки всех параметров
Это само собой, крайний пункт меню, до которого я не до листал, как раз WRITE.
про секунды и минуты, все понял, это сделать не трудно, я могу сделать например
при изменении временных параметров множитель будет переключать секунды, десятки секунд, минуты.
т.е. х1 - секунды, х10 - десятки секунд до 60, х100 - минуты,
Вверх/вниз -шаг 60, влево/вправо -шаг 1
совсем не просто менять логику работы кнопок,
сейчас - вправо/влево - листаем пункты, вверх/вниз - меняем значения,
что бы поменять назначение кнопок, придется делать второй уровень вложенности программы.
а смысла в этом большого нет ), на мое скромное ИМХО.
завтра попробую поправить минуты и секунды
в общем, предлагаю пока ограничится - AS IS (как есть), а потом всегда можно доработать ))
завтра сделаю минуты/секунды и займусь обменом с таймером.
есть еще вариант, SELECT выбирает разряд, который надо поменять, он начинает мигать, UP/DOWN его меняют.
как заставить мигать я знаю, надо подумать про алгоритм )
Да, можно как в часах селект минуты, селект секунды и кнопка ввод (сохранить) . Это не принципиально. Если разделить на минуты и секунды, и избавиться от миллисекунд, то это то что надо.
Как бы основное назначение программатора, это облегчить настройку таймера, то как отказ от ноута, и упрощенная визуализация параметров.
Желательно получить обратную связь по программируемым параметра,
достаточно тех что есть или я что то важное упустил ?
Потом добавить будет сложнее, чем прямо сейчас “напихать лишних и ненужных”,
я могу, на всякий случай, впиндюрить в код штуки по три временных и числовых параметров,
ну и парочку булевых (включен/выключен), обозвать их Plug(заглушка)1-Plug(заглушка)8 например.
Наверное так и сделаю, пусть будут про запас
Моё видение: подключились к таймеру, прочитали настройки, изменили настройки, записали в таймер.
int Stack [] { // программирумые параметры Motor_ESC_Normall_THR, // нормальные обороты мотора Motor_ESC_Landing_THR, // обороты мотора при посадке InFly, // общее время полета с момента уборки шасси Takeoff, // время на "убежать к ручке" GearUp, // момент уборки шасси с момента старта Landing // время на посадку. };
нет параметра “выпуск шасси”
нет параметра “выпуск шасси”
в программе таймера выпуск шасси происходит после уменьшения оборотов двигателя до Motor_ESC_Landing_THR.
Параметр выпуска уборки шасси , можно сделать отключаемым, в спорте не используют. Это чисто для понтов)) Обороты мотора при посадке, так же надо добавить вкл выкл, так как посадка происходит с выключенным мотором. За работающий мотор судьи могут наказать. У многих на таймерах по окончании полета, включается тормоз мотора, и при планировании винт не вращается даже от набегающего потока.
Параметр выпуска уборки шасси , можно сделать отключаемым, в спорте не используют.
функционал есть в программе таймера, был изначально заложен “по просьбе”
все что касается шасси очень просто убирается,
#define Landing_Gear // если ретрактов нет, ставим коммент на эту стоку строку
но вот временные параметры в настройках убрать нельзя,
их достаточно игнорировать, они ни на что влиять не будут )
Обороты мотора при посадке, так же надо добавить вкл выкл, так как посадка происходит с выключенным мотором.
это лишнее, достаточно изменить параметр
Motor_ESC_Landing_THR
и сделать его равным
#define Motor_ESC_Min_THR 800 // двигатель стоп
но на самом деле, изначально “посадочные обороты” были сделаны для того,
что бы показать пилоту, что время полета истекает, пора подумать о посадке )
так что вполне можно сделать пониженными, но при этом уменьшить параметр
#define Landing 20 // время в секундах отводимое на посадку, в течении этого времени будут выпущены шасси и снижены обороты мотора до посадочных
кста, в скетче увеличение оборотов при старте и уменьшение при посадке происходит плавно,
постоянная времени тоже настраиваемая.
за изменение оборотов двигателя отвечает
boolean Engine_Proc(int j1, int i1)
ИМХО: по окончании полётного времени делаем три коротких сброса оборотов (0,75 от номинала на 1 сек с промежутками 1 сек.)
пример того как это сделано у меня на учебной
speedController.writeMicroseconds(fullPower * 0.75); //1500 мксек//
delay(500);
speedController.writeMicroseconds(fullPower * 0.95); //1900 мксек//
delay(500);
speedController.writeMicroseconds(fullPower * 0.75); //1500 мксек//
delay(500);
speedController.writeMicroseconds(fullPower * 0.95); //1900 мксек//
delay(500);
speedController.writeMicroseconds(fullPower); //2000 мксек//
и через 10 секунд глушим двигатель (примерно 2 круга, больше не надо). Тормоз настраивается в ESC (обязательно! Если винт при касании земли будет вращаться, то посадка в зачёт не пойдёт).