Контроллер для кордовых электричек
ДВС отстраивается на максимальные обороты
Мотор отстраивается на обороты, обеспечивающие нормальные условия для полета, это не максимальные, иначе режим меняться не будет.
Кордовые пилотажные ДВС работают в максимально щедящем режиме и этого режима достаточно для взлета, полета и выполнения фигур.
дребезг контактов не может “стронуть мотор”,
он не может запустить мотор, потому что на разомкнутых контактах дребезга не бывает.
Я вас не понимаю, вы говорите, что замкнуто, это выключено, а теперь говорите что выключено это разомкнуто???
резюмирую по вопросу управления.
Вы можете поставить тумблер, но в выключенном Вы должны будете использовать
нормально замкнутую пару контактов из трех.
После подключения питания модели, для активации полетного режимы Вы будете должны разомкнуть эти контакты.
Для остановки процедуры старта их требуется замкнуть.
При использовании кнопки,
для активации режима запуска надо будет нажать и удерживать кнопку нажатой не меньше 0,5 секунды
для остановки процедуры кнопку потребуется нажать на любое время,
даже случайное касание кнопки приведет к остановке двигателя.
Все мое нутро инженера противится нормально замкнутым контактам при нормальной работе,
чем больше таких контактов, тем больше вероятность отказа, это я еще в “школе” проходил.
вы говорите, что замкнуто, это выключено, а теперь говорите что выключено это разомкнуто???
я не оперирую понятиями включено выключено
потому что, далеко не всегда, ВКЛ обозначает замкнутое,
у тумблеров, как правило, контактов три, и если одна пара замкнута, вторая всегда разомкнута
поставьте выключатель, если Вам так удобнее, но рабочее состояние разомкнуто.
есть кнопка, нормально разомкнутое состояние,
рабочее разомкнутое состояние ?
переход из замкнуто в состояние разомкнуто - таймер стартует
если в первой фазе, опять стало замкнуто, программа останавливается
Хорошо, тогда , в таком понимании , для безопасности, на столе по умолчанию должно быть разомкнуто.
Так как дребезг контактов в полете, нам не так страшен, чем когда дребезг контактов на столе, где рядом с винтом могут быть наши части тела. Надеюсь мысль донес))
если кнопка, то разомкнута, если тумблер, то все равно, но лучше разомкнуто.
хотя при постоянно замкнутых контактах тумблера все равно программа не запустится.
хотя при постоянно замкнутых контактах тумблера все равно программа не запустится
Да, но в этом положении, малейшее размыкание, стартует программу, например нечаянно выдернули разъем с тумблера, и таймер стартовал.
оставляйте тумблер в разомкнутом состоянии.
я потому про кнопку и говорю, с кнопкой все однозначно.
В чем то да, в чем то нет, везде есть недостатки. Есть у меня таймеры и с кнопкой и с тумблером, с тумблером удобнее и точно понимаешь включено или выключено. С кнопкой можно не дожать или не до держать или передержать.
в компьютера, планшетах, смартфонах, даже у жены на кухонной технике нету тумблеров )
уже давно все управляется кнопками, на каждой может быть масса функций.
на осциллографе у меня только одна кнопка с фиксацией, включение питания
и та логическая, фиксация чистая фикция ))
и два десятка кнопок без фиксации с кучей функционала на каждой.
нельзя “совершенно случайно” нажать на пол секунды кнопку )
это из категории - “я к такому привык”,
но с точки зрения надежности, чем меньше контактов, тем надежнее.
туго идет, на каждом шаге приходится совместимость проверять.
программатор к гувернеру уже пристегнул,
осталось этот сэндвич “вкрячить” в программу таймера, или наоборот.
в общем скрестить ежа и ужа )) и что бы оно работало
при этом выходной на работе совсем не означает, что меня не дергают ))
удаленка мать ее так, дернул меня черт в дом 300Мбит от Ростелекома завести.
раньше 40 км от города, интернет только мобильный ), снега по колено, все идут лесом.
перенес программатор и гувернер в основную программу таймера,
хотя проще было таймер и программатор вставить в модуль гувернер.
потому как повылазили ошибки компиляции, но это все не беда ).
завтра попробую вычистить баги, их не так много на самом деле.
похоже “допилил”, завтра окончательно проверю все в комплексе
выложу видео и все материалы по проекту для повторения и тестирования.
пока без гироскопа, только программирование, работа циклограммы и гувернера.
сделал два “спец модуля”, надоело каждый раз “изобретать велосипед”,
модуль чтения кнопки с программируемой задержкой на нажатие и отпускание (от дребезга).
и модуль “моргульчика” светодиодом с изменением длительностей горит/не горит.
В свете последнего обсуждения изменил настройки прогграммы
//************************************************************************************
// массив настроек программы (скоро уберу)
//************************************************************************************
uint16_t stack[14]
{
Motor_RPM, // обороты мотора в полете
Motor_ESC_Min_THR, // минимальный уровень газа, в процентах от максимального
Motor_ESC_Start_THR, // уровень газа на старте в процентах от максимального
Engine_POL, // полюсов у мотора
0,
Start, // время на "убежать к ручке" в секундах
Takeoff, // время разгона и взлета
GearUp, // момент уборки шасси с момента начала разгона
InFly, // общее время полета с момента старта двигателя минуты секунды
0,
0,
0,
0,
0
};
Добавил
//#define _landingGear // если ретрактов нет, ставим коммент на эту стоку строку
//#define _debugOn // если отладка нужна убрать коммент
//#define _gyroOn // если гироскопа нет, ставим коммент на эту стоку строку
#define CLEAR_EEPROM
что бы не плодить флаги
нижний обозначает, что перед стартом программы она очистит EEPROM и запишет данные из стека.
нужно что бы при отладке гироскопа на компьютере каждый раз не очищать EEPROM
//****************************************************************************************
// обработка нажатия/отпускания кнопки
//****************************************************************************************
#include <Arduino.h>
volatile boolean lastButState;
volatile uint32_t lastButtTime;
void _setupButton (int port)
{
pinMode(port, INPUT_PULLUP);
}
boolean _button (int port, int timeOut)
{
if (lastButState && digitalRead(port) && millis()-lastButtTime > timeOut)
{
lastButState = 0;
lastButtTime = millis();
return (lastButState);
}
if (!lastButState && !digitalRead(port) && millis()-lastButtTime > timeOut)
{
lastButState = 1;
lastButtTime = millis();
return (lastButState);
}
if (!lastButState && digitalRead(port) || lastButState && !digitalRead(port)) lastButtTime = millis();
// lastButtTime = millis();
return (lastButState);
}
обработка кнопки теперь “умная”, но требует инициализации
зато при вызове можно определить минимальное время нажатия или отпускания,
которое будет считаться за действие
//****************************************************************************************
// моргульчик с/диодом
//****************************************************************************************
#include <Arduino.h>
volatile boolean lastLedState;
volatile uint32_t lastLedTime;
void _setupLed (int port)
{
pinMode(port, OUTPUT);
digitalWrite(port, LOW);
}
void _blinker (int port, int i, int j)
{
if (lastLedState && millis()-lastLedTime > i)
{
lastLedTime = millis();
lastLedState = !lastLedState;
digitalWrite(port, HIGH);
return;
}
if (!lastLedState && millis()-lastLedTime > j)
{
lastLedTime = millis();
lastLedState = !lastLedState;
digitalWrite(port, LOW);
return;
}
}
добавил программу моргульчика, в параметрах порт кнопки, время не горим, время горим
Timer_for_Plane_v6.1_wo_Gyro.zip
С ПРОГРАММАТОРОМ ПОКА ИЩУ ПОСЛЕДНИЙ БАГ,
по какой то причине, если два раза подряд считать данные с таймера, данные получаются кривыми
и при записи в таймер все начинает сыпаться, включая таймер, разбираюсь
ну и маленькое видео
photos.app.goo.gl/MQAKVWtpDVgAVDC49
сейчас можно все определить в
#define pinButton 11 // порт сервисной кнопки
#define pinMotorESC 9 // порт к которому подключен ESC
#define Motor_RPM 4000 // номинальные обороты мотора в полете об/мин
#define Motor_ESC_Min_THR 10 // минимальны уровень газа, что бы гувернер не остановил мотор, в процентах
#define Motor_ESC_Start_THR 70 // уровень газа при старте модели, в процентах
#define Start 5 // время отведенное на добежать до ручки, в течении этого времени процедура старта может быть отменена, в секундах
#define Takeoff 5 // время отведенное на разгон и взлет, в течении этого времени процедура старта может быть отменена, в секундах
#define GearUp 5 // время после начала разгона, начало уборки шасси - 5 секунд
#define InFly 20 // время полета в секундах с момента завершения процедуры старта - сейчас стоит 20 секунд
#define delay_g 100 // коэффициент торможения ))
#define Engine_POL 7 // количество полюсов у мотора разделенное на два
#ifdef _landingGear
#define Port_Left_Wheel 6 // порт к которому подключена серва ретракта левого шасси
#define Port_Right_Wheel 7 // порт к которому подключена серва ретракта правого шасси
#define Left_Wheel_Down 2000
#define Left_Wheel_Up 1000
#define Right_Wheel_Down 1000
#define Right_Wheel_Up 2000
#define Up 1
#define Down 0
#endif
Что сейчас можно делать, даже если у Вас нет кросс платы
- прописать в дефайны порты и временные параметры
- прошить в любую ардуинку,
- подключить кнопку на порт, назначенный в дефайне
- подключить регулятор к порту
- поставить стартовый уровень газа в процентах
И МОЖНО ЛЕТАТЬ, но без гувернера
по гироскопу снимать комментарии тоже пока не стоит, я его работоспособность не проверял.
но чисто теоретически, управление оборотами двигателя сейчас немного поменялось,
так что скорее всего он все равно не будет.
а это схема и чертеж кросс платы на любую Pro Mini
с номиналами радиодеталей все вроде правильно
Кросс плата EasyEDA.zip
С ПРОГРАММАТОРОМ ПОКА ИЩУ ПОСЛЕДНИЙ БАГ,
нашел и слегка напрягся. в общем от UART надо избавляться ((
помехи приводят к рассинхронизации, лишние биты рушат весь обмен,
даже простое ожидание, пока правятся данные приводит к сбою при записи.
ну или думать, как изменить обмен
вплоть до того, что передавать каждый байт данных из пакета двумя байтами,
первый с номером байта в пакете, второй сам байт ((
или на самом деле валить от UART в сторону i2c а еще лучше на ESP32
в общем, ошибка в том, что если просто подождать несколько минут,
то при записи данных из программатора в таймер вылезает ошибка.
причина в накапливающихся “данных” в буфере приема, по сути помех.
А как эти помехи туда попадают? В принципе мы подключились, считали , и отключились,редактируем, подключаемся и записываем, записали отключились. Или как то работает не так?
Второй вариант не хранить в программаторе ничего, а просто на нем отображать вводимые данные.
А как эти помехи туда попадают?
да х его з, этого я тоже пока не понимаю,
есть еще предположение, что в какой то момент в буфере приема таймера “зависает” байт или несколько,
сейчас буду прикручивать Софт сериал и смотреть что читает таймер от программатора.
Сегодня пол дня дома, буду ковырять дальше.
Или как то работает не так?
Примерно так, но физического отключения нет. Хотя на этапе корректировки вполне можно отключиться.
В общем есть мысль, чистить буферы перед началом обмена.
Но я же инициирую обмен со стороны программатора,
- отправляю команду на чтение,
- жду подтверждение,
- передаю данные,
- передаю контрольную сумму,
- жду ответ от программатора о получении пакета
- таймер присылает ответ - CRC ERROR.
Т.е. он принимает пакет, принимает переданную CRC сравнивает и видит ошибку приема.
Ни хрена не понимаю.
Если бы данных было мало, программатор бы не получил ответа и была ба ошибка тайм аута T/O ERROR