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

RandomJ

Попробуем чуток по оффтопить…
По умолчанию используем Arduino nano от братьев китайцев. подключаем платку к усб либо просто подаём питание на соответствующие выводы (+5v, GND).
Если при включении светодиод “L” несколько раз коротко мигает, а потом начинает мигать редко, то радуемся - плата работает, загрузчик присутствует (для нас важно), тестовая программа “Blink” загружена. Устанавливаем драйвера для CH340(341). Проверяем в диспетчере устройств наличие СОМ-порта от СН340, в параметрах порта устанавливаем скорость 115200. Запускаем ARDUINO IDE. заходим файл > настройки, ставим “галочки” на “компиляция”, “загрузка” и “показать номера строк” (сие на любителя, мне так удобнее), закрываем настройки. Заходим в “инструменты” выбираем нашу плату “Arduino Nano” с процессором ATmega328P (название читаем на корпусе микросхемы на верхней части платы). Выбираем наш СОМ-порт(номер порта в свойствах порта) Выбираем нужный скетч и загружаем его в ардуинку. если нам не повезло и загрузчика в ардуинке нет, то слегка материм китайцев и приобретаем программатор USBASP (благо он не так дорого стоит). Но это уже будет другая история.

user11

Рома, большое спасибо за науку!.. 😃 Придётся раздобыть программатор однако!.. 😦

Только один вопрос: какой версии?!

RandomJ

чем свежее, тем лучше выбирай вариант с переходником с 10 на 6 ног, у нано isp порт шестиногий(разъём 2*3 ноги)

как вариант aliexpress.ru/item/32670511994.html
бери сразу два программатора, можно будет обновить прошивку в одном программаторе при помощи другого.😛

по теме:
Собрал сию конструкцию, но на arduino pro mini. Не всё пошло гладко. Не хочет, имеющийся под руками, Turnigy TY-P1 25Amp HEXFET

проходить калибровку. Подключил вместо регулятора серву, серва отклоняется ,условно, от 0 до 180 градусов. Подключил серву к сервотестеру - серва отклоняется от 45 до 135 градусов… задумался: а в чём подвох? пойду почитаю Маркса… в смысле RTFM…

RandomJ

Ага, копнул чуть глубже, почитал описание библиотеки “SERVO” у неё оказывается 0 градусов это импульс длиной 544 мкс по выходу, 180 градусов это импульс длиной 2400 мкс. А регулятор понимает от 1000 до 2000 мкс. Как говорилось в одном фильме: “… учите матчасть, товарищи…”

user11

Ромка привет! Заказал эту гульку с алишки. Теперь ждём!..������������������☕☕

woodprop
RandomJ:

А регулятор понимает от 1000 до 2000 мкс.

Да, сталкивались с таким. Примерно 1 из 10 моделей регуляторов не подходила под диапазон по-умолчанию и нужно поиграться с этими переменными:
int idle = 10; // Нулевое значение газа
int fullPower = 150; // Максимальная мощность

Сами ардуинки я брал здесь: aliexpress.ru/item/4000587268145.html?spm=a2g0v.12…
и здесь:
aliexpress.ru/item/32341832857.html?spm=a2g0s.9042…

Для них нужен драйвер CH340 - windows 10 сама находит, для 7 надо искать
И, как уже подсказали - нужно в настройках указать корректный тип процессора и “Old bootloader”

15 days later
Марат
woodprop:

Все временные интервалы настраиваются перед заливкой прошивки

Т.е. в поле без компа изменить, например время полёта будет невозможно?

Paladin:

Я делал калибровку регуля встроенной.

Не нашли прошивку?😒

RandomJ

Марат ,

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

Мой вариант кода, копируем код, вставляем в скетч arduino ide, радуемся…
не много изменён способ записи значений в переменные согласно описанию библиотеки.
[code]
#include <Servo.h>

Servo speedController;
// ---------- ПОЛЬЗОВАТЕЛЬСКИЕ НАСТРОЙКИ ---------- //////////////////////
int flyTime = 60; // Время полёта, сек //
int delayCutOff = 10; // Задержка перед отключением, сек //
int idle = 1000; // Нулевое значение газа //
int fullPower = 2000; // Максимальная мощность //
//////////////////////////////////////////////////////////////////////////
int throttle;

void setup() {
pinMode(A0, INPUT_PULLUP); // Вход кнопки
speedController.attach(3,1000,2000); // Сигнал на регулятор с цифрового выхода 2, минимальное значение, максимальное значение//

if (!digitalRead(A0)) { // Если при включении зажата кнопка
calibration(); // Переходим в режим калибровки
}
}

void loop() {
throttle = idle;
speedController.writeMicroseconds(idle);
delay(1000);

if (!digitalRead(A0)) {
btnHold();
}
}

// ---------- Проверка удержания кнопки ----------
void btnHold() {
int time2go = 3; // Сколько нужно держать кнопку, сек.
float timePast = 0.0; // Счётчик времени

while (!digitalRead(A0)) {
delay(100); // 0,1 сек интервал
timePast += 0.1;
if (timePast >= time2go) {
motorStart();
}
}

}

void motorStart() {
while (throttle < fullPower) {
speedController.writeMicroseconds(throttle++);
delay(10);
}

flyingTimer();
}

// ---------- Режим полёта ----------
void flyingTimer() {
int timePast = 0;

while(timePast < flyTime) {
delay(1000);
timePast++;
}

alarm(); // Предупреждение
delay(delayCutOff * 1000); // Задержка перед отключением
speedController.writeMicroseconds(idle);
}

// ---------- Предупреждение о скором отключении ----------
void alarm() {
speedController.writeMicroseconds(fullPower * 0.75); //1500 мксек//
delay(500);
speedController.writeMicroseconds(fullPower * 0.85); //1700 мксек//
delay(500);
speedController.writeMicroseconds(fullPower * 0.75); //1500 мксек//
delay(500);
speedController.writeMicroseconds(fullPower * 0.85); //1700 мксек//
delay(500);
speedController.writeMicroseconds(fullPower); //2000 мксек//
}

// ---------- Калибровка рабочего диапазона регулятора ----------
void calibration() {
digitalWrite(13, HIGH);
speedController.writeMicroseconds(fullPower);
delay(3000);
speedController.writeMicroseconds(idle);
digitalWrite(13, LOW);

while (!digitalRead(A0)) { // Если зажата кнопка
digitalWrite(13, HIGH); // не даём выйти
delay(100); // и мигаем светодиодом
digitalWrite(13, LOW);
delay(100);
}

}
[end of code]

Марат
RandomJ:

int fullPower = 2000; // Максимальная мощность //

А в реальности если вписать 1500 - это будет 50 процентов мощности?
Предыдущий скеч залил - всё работает как и обещано.
А разница в вашем с ним по функционалу есть?

RandomJ

Разницы в функционале никакой. Да 1500 мксек это как на радио середина газа. А по мощности (оборотам) будет зависеть от конкретного двигателя и регулятора. Изменение прошивки было сделано только по тому, что у меня регуляторы не понимают расширенного диапазона сигнала управления.
библиотека Servo позволяет задавать диапазон управляющего сигнала от 544 мксек (0°) до 2400 мксек (180°), а номинальный диапазон для сервомашинок (ещё на заре пропорционального управления с максимум 8 каналами) от 1000 мксек до 2000 мксек это примерно от 45° до 135°.

Марат

Только что в личке переписывался с Николаем (Paladin) и он любезно предоставил свой скетч для всеобщего использования. За что ему большое спасибо!
Вот его текст: "Добрый день.
www.dropbox.com/s/9bjrjqdimhixlfe/MyTimer_v1.ino?d…
Тут скетч для прошивки в ардуинку.
Я брал обычную Nano с нераспаянными ногами(120-200р у китайцев).
Далее. Земля и питание с разъёма регуля - на соответствующие пины ардуинки. 9 порт - сигнал на регуль.
Кнопку - на 3-ий.
Всё можно поменять как удобно.
Базовые настройки - с компа при заливке(например время ожидания запуска мотора после нажатия на кнопку).
А вот полётное время - сколько раз нажали на кнопку - столько минут мотор и будет работать.

\главное отличие от множества аналогичных прошивок - калибровка регулятора при старте.
Будете пробовать - обязательно проверьте сначала на сервомашинке, потом на силовой установке без винта… и если раз 10 всё прошл как надо - тогда уже в полёт…
Надеюсь, что материал будет кому-то полезен."

Марат
RandomJ:

speedController.attach(3,1000,2000); // Сигнал на регулятор с цифрового выхода 2, минимальное значение, максимальное значение//

А здесь всё верно? выход объявлен 3, а в коментах стоит 2 ??

Paladin

В моём варианте скетча ещё используется библиотечка для предотвращения дребезга кнопки, обратите внимание… может кто у себя в проектах тоже применит - полезная штука.

4 months later
Yan72

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

VitalikV
Yan72:

а оказывается то пин не соответствует то в проге косяк.

Ардуина, это для разработчиков, поэтому надо либо мало мальски разбираться в коде (ничего трудного нет пару вечеров убить, почитать), или покупать такую же плату , под которую написан код.

RandomJ
Yan72:

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

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

RandomJ

12 // порт к которому подключена кнопка старт/стоп или перемычка
2 // порт к которому подключен ESC
6 // порт к которому подключена серва ретракта левого шасси
7 // порт к которому подключена серва ретракта правого шасси

То, что увидел в этом скетче. А вот куда цеплять гироскоп не увидел. Надо автора спросить.

Yan72
RandomJ:

12 // порт к которому подключена кнопка старт/стоп или перемычка

А второй конец?

RandomJ:

2 // порт к которому подключен ESC

Это D2 или А2

Yan72
RandomJ:

void setup() {
pinMode(A0, INPUT_PULLUP); // Вход кнопки
speedController.attach(3,1000,2000); // Сигнал на регулятор с цифрового выхода 2, минимальное значение, максимальное значение//

Почему разнятся показатели,у него нет в строке INPUT_PULLUP а просто INPUT,
У меня при зажатой кнопки срабатывает режим калибровки,а когда просто вкл. отрабатывают шасси-я нажимаю кнопку и ничего не происходит.

Yan72

RandomJ;
Твой скетч тоже ругается при компиляции на строку (void calibration() {) что не так ?😵