Контроллер для кордовых электричек

VitalikV
Маркс:

хотя при постоянно замкнутых контактах тумблера все равно программа не запустится

Да, но в этом положении, малейшее размыкание, стартует программу, например нечаянно выдернули разъем с тумблера, и таймер стартовал.

Маркс

оставляйте тумблер в разомкнутом состоянии.
я потому про кнопку и говорю, с кнопкой все однозначно.

VitalikV

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

Маркс

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

нельзя “совершенно случайно” нажать на пол секунды кнопку )

это из категории - “я к такому привык”,
но с точки зрения надежности, чем меньше контактов, тем надежнее.

Маркс

туго идет, на каждом шаге приходится совместимость проверять.
программатор к гувернеру уже пристегнул,
осталось этот сэндвич “вкрячить” в программу таймера, или наоборот.
в общем скрестить ежа и ужа )) и что бы оно работало

при этом выходной на работе совсем не означает, что меня не дергают ))
удаленка мать ее так, дернул меня черт в дом 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

Что сейчас можно делать, даже если у Вас нет кросс платы

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

И МОЖНО ЛЕТАТЬ, но без гувернера
по гироскопу снимать комментарии тоже пока не стоит, я его работоспособность не проверял.
но чисто теоретически, управление оборотами двигателя сейчас немного поменялось,
так что скорее всего он все равно не будет.

Маркс
Маркс:

С ПРОГРАММАТОРОМ ПОКА ИЩУ ПОСЛЕДНИЙ БАГ,

нашел и слегка напрягся. в общем от UART надо избавляться ((
помехи приводят к рассинхронизации, лишние биты рушат весь обмен,
даже простое ожидание, пока правятся данные приводит к сбою при записи.

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

Маркс

или на самом деле валить от UART в сторону i2c а еще лучше на ESP32

Маркс

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

VitalikV

А как эти помехи туда попадают? В принципе мы подключились, считали , и отключились,редактируем, подключаемся и записываем, записали отключились. Или как то работает не так?

Второй вариант не хранить в программаторе ничего, а просто на нем отображать вводимые данные.

Маркс
VitalikV:

А как эти помехи туда попадают?

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

VitalikV:

Или как то работает не так?

Примерно так, но физического отключения нет. Хотя на этапе корректировки вполне можно отключиться.

В общем есть мысль, чистить буферы перед началом обмена.
Но я же инициирую обмен со стороны программатора,

  • отправляю команду на чтение,
  • жду подтверждение,
  • передаю данные,
  • передаю контрольную сумму,
  • жду ответ от программатора о получении пакета
  • таймер присылает ответ - CRC ERROR.

Т.е. он принимает пакет, принимает переданную CRC сравнивает и видит ошибку приема.
Ни хрена не понимаю.
Если бы данных было мало, программатор бы не получил ответа и была ба ошибка тайм аута T/O ERROR

Маркс

В общем прикручу USB-UART на свободные ноги и буду смотреть,
что конкретно принимает таймер от программатора

Маркс

Источник ошибки обмена установлен и удален.
В архивах исправленные версия программатора и программы таймера
Programmer_v1.zip
Timer_for_Plane_v6.1_wo_Gyro.zip
Временные параметры пока ограничены 1800 секунд или 30 минут (так исторически сложилось)

Маркс

Следующим номером нашей программы “вкрячивание” MPU6050
выглядеть будет примерно так
ая кросс плата
J3 и J4 точки подключения модуля MPU6050
вот такого

ZY MPU-6050

Маркс

есть необходимость проверить гувернер на оборотах выше 9000,
на днях протравлю и распаяю новую кросс-плату, а старую, без гироскопа,
готов отправить в любую точку России почтой для тестирования
у меня просто нет мотора для тестирования на таких оборотах

vittek

Приветствую. Готов протестить ваш сетап по полной программе, главное чтобы был получен правильный результат.

Маркс

Для этого нужно иметь

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