контроль разряда аккумуляторов по простому
- Войдите на сайт для отправки комментариев
Чт, 06/12/2018 - 11:26
Модернизирую квадропода, при эксплуатации-экспериментировании редко и неожиданно одна из конечностей начинает заворачиваться на "слом". Причина в разрядке аккумуляторов. Есть замысел контролировать напряжение на Vin с помощью вывода А2 через делитель резисторный. При определённом, экспериментально полученном значении блокировать работу квадропода и подавать световой или звуковой сигнал через самодельные модули. Правильно я мыслю про делитель? 
А что смущает?
А что смущает?
Смущает программная часть. Как рационально выбрать порог сигнала - ведь возможны?, кратковременные скачки напряжения вниз с дальнейшим восстановлением - внешне никак не проявляемые. И второе.., смущает кратковременная потеря контакта (во время хождения) между минусом и оттягивающе-подтягивающим резистором из-за штырькового соединения, а паять не хочется и в то же время на А2 подавать 7-7,5 Вольт тоже страшно.
Первое, усреднение или несколько низких значений подряд. Второе, сделать нормальный контакт, хоть и не хочется. ИМХО.)))))
P/S с другой стороны, если граунд исчез, так хоть киловольт подавай.
Смущает программная часть.
Как рационально выбрать порог сигнала - ведь возможны?, кратковременные скачки напряжения вниз с дальнейшим восстановлением - внешне никак не проявляемые.
Т.е. именно "кратковременные скачки напряжения вниз". Как только такой будет обнаружен, включать индикацию разряда батареи и отключать всю прочую нагрузку.
И второе.., смущает кратковременная потеря контакта (во время хождения) между минусом и оттягивающе-подтягивающим резистором из-за штырькового соединения, а паять не хочется и в то же время на А2 подавать 7-7,5 Вольт тоже страшно.
Вот так я предполагал... Скетч счас сброшу, но он самописный-против правил.
////////////////////////// скетч для управления 8 сервоприводами квадропода ///////////////// #include <Servo.h> //используем библиотеку Servo myservoK3 ; //указываем сервопривод заднего левого колена Servo myservoB4; //указываем сервопривод заднего левого бедра Servo myservoK5 ; //указываем сервопривод переднего левого колена Servo myservoB6; //указываем сервопривод переднего левого бедра Servo myservoK7 ; //указываем сервопривод заднего правого колена Servo myservoB8; //указываем сервопривод заднего правого бедра Servo myservoK9 ; //указываем сервопривод переднего правого колена Servo myservoB10; //указываем сервопривод переднего правого бедра int n=15;//единица временного интервала int a03=110;int a04=75;int a05=55;int a06=97;int a07=80;int a08=75;int a09=73;int a010=85;//переменные для углов начального положения конечностей int da=10;//переменная амплитуды изменения угла в градусах для колен int db=12;//переменная амплитуды изменения угла в градусах для бёдер int i; int a3=a03;int a4=a04;int a5=a05;int a6=a06;int a7=a07;int a8=a08;int a9=a09;int a10=a010;// переменные для хранения значений текущих углов //////при увеличении значения угла сервоприводы движут лапы :B4,B6-вперёд B8,B10-назад K3,K9-вниз K5,K7-вверх //////// //////////////////////////////// String inputString;// строки данных byte K=2;//счётчик выбора команд для движений boolean f=true;//переменная для флага byte r=0;// счётчик для пауз в мигании подсветки при остановке квадропода //////////////////////////////// const int echoPin=11; //ВЫВОДЫ ПОД УЗ ДАТЧИК const int trigPin=12; unsigned int x,x1;// ПЕРЕМЕННЫЕ ДЛЯ РАБОТЫ С УЗ ДАТЧИКОМ //////////////////////////////// int u = 0;//переменная смены нот,длительностей и пауз int h = 20;//переменная смены темпа мелодии long Y=0;long Y1=0;long Y2=0; int tabl [189] ={ 532,6,3, 532,6,3, 440,6,3, 523,12,3, 440,6,3, 523,12,3, 440,6,3, 494,12,6, 494,6,3, 494,6,3, 415,6,3, 494,12,3, 415,6,3, 494,12,3, 415,6,3, 440,12,6, 659,6,3, 659,6,3, 554,6,3, 659,12,3, 554,6,3, 659,12,3, 554,6,3, 587,12,6, 698,6,3, 587,6,3, 494,6,3, 523,12,3, 440,6,3, 415,6,3, 370,6,3, 415,6,3, 440,12,24, 523,4,2, 523,4,2, 494,4,2, 440,4,2, 494,4,2, 523,4,2, 587,8,2, 523,4,2, 587,12,2, 587,8,2, 523,4,2, 587,12,2, 523,8,2, 494,4,2, 523,12,2, 523,4,2, 523,4,2, 494,4,2, 440,4,2, 494,4,2, 523,4,2, 587,8,2, 523,4,2, 587,12,2, 587,8,2, 523,4,2, 494,4,2, 440,4,2, 415,4,2, 440,12,24}; // зашифрованные данные нот, длительности нот и пауз мелодии походной //////////////////////////////// void setup() { //////////////////////////////// pinMode(2, OUTPUT);//ВЫВОД ДЛЯ УПРАВЛЕНИЯ ПОДСВЕТКОЙ СВЕТОДИОДНОЙ digitalWrite(2,LOW); //////////////////////////////// pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); digitalWrite(trigPin, LOW); Serial.begin(9600); //////////////////////////////////////////// pinMode(14, OUTPUT);//"вывод на котором играет мелодия" digitalWrite(14, LOW); pinMode(15, OUTPUT);//управляющий вывод (1-мелодия звучит, 0-нет) digitalWrite(15, HIGH); //////////////////////////////////////////// myservoK3.attach(3);//выводы для подключения 1-8 сервоприводов myservoB4.attach(4); myservoK5.attach(5); myservoB6.attach(6); myservoK7.attach(7); myservoB8.attach(8); myservoK9.attach(9); myservoB10.attach(10); myservoK3.write(a03); delay(n);// начальная установка-настройка углов поворота валов серв myservoB4.write(a04); delay(n); myservoK5.write(a05); delay(n); myservoB6.write(a06); delay(n); myservoK7.write(a07); delay(n); myservoB8.write(a08); delay(n); myservoK9.write(a09); delay(n); myservoB10.write(a010); delay(n); delay(250*n); } void loop() { CheckSerial();//ЖДЁМ ПОСТУПЛЕНИЯ КОМАНДЫ НА ИЗМЕНЕНИЕ ВЫПОЛНЕНИЯ ДВИЖЕНИЙ if (K!=2) {if (f==true){digitalWrite(2,HIGH );}else {digitalWrite(2, LOW);}}// ПЕРЕКЛЮЧЕНИЕ ПОДСВЕТКИ СВЕТОДИОДНОЙ if (K==1){F1();}//ШАГ ВПЕРЁД if (K==2){delay(n);noTone(14);r++;if(r>25){r=0;}if(f==true&&r>20){r=0;digitalWrite(2,!digitalRead (2));}}//ОСТАНОВКА И МИГАНИЕ ПОДСВЕТКОЙ КОГДА ОНА ВКЛЮЧЕНА if (K==3){F2();}//ШАГ НАЗАД if (K==4){F4();}//ПОВОРОТ ВПРАВО if (K==5){F3();}//ПОВОРОТ ВЛЕВО ///////////////////ДВИЖЕНИЕ В АВТОНОМНОМ РЕЖИМЕ ПО УЗ ДАТЧИКУ/////////////////////////// if (K==6){F1(); digitalWrite(trigPin, HIGH);//излучение звука в течении 15 микросекунд delayMicroseconds(15); digitalWrite(trigPin, LOW); x = pulseIn(echoPin, HIGH,4000);//подсчёт длительности отражённого сигнала с ограничением в 4 мс x1 = x / 58;//дистанция до преграды в сантиметрах if(x1>10&&x1<30){byte i1=random(0,2);if(i1==1){F2();F2();F3();F3();F3();F3();} else {F2();F2();F4();F4();F4();F4();}}//условие псевдослучайного направления поворота на 4-несколько шагов с отходом назад на 2 шага } /////////////////////////////////////////////////////////////////////////////////////// //F1();//шаг вперёд //F2();//шаг назад //F3();//шаг-разворот влево //F4();//шаг-разворот вправо } void F1() { ///////////////////////////////////////////// ПРЯМОХОЖДЕНИЕ ///////////////////////////////////////////// ///////////// K5,K7 вверх/////////// for(i = 0 ; i<=da; i++) {myservoK5.write(a5+i); myservoK7.write(a7+i); delay_(n);} ///////////// B6,B8- вперёд B4,B10- назад //////// for(i = 0 ; i<=db; i++) {myservoB6.write(a6+i); myservoB8.write(a8-i); myservoB4.write(a4-i); myservoB10.write(a10+i); delay_(n);} /////////////K5,K7 вниз ///////////// for(i = 0 ; i<=da; i++) {myservoK5.write(a5-i); myservoK7.write(a7-i); delay_(n);} ////////////K3,K9 вверх ///////////// for(i = 0 ; i<=da; i++) {myservoK3.write(a3-i); myservoK9.write(a9-i); delay_(n);} ///////////// B6,B8- назад B4,B10- вперёд //////// for(i = 0 ; i<=db; i++) {myservoB6.write(a6-i); myservoB8.write(a8+i); myservoB4.write(a4+i); myservoB10.write(a10-i); delay_(n);} //////////////K3,K9 вниз ///////////// for(i = 0 ; i<=da; i++) {myservoK3.write(a3+i); myservoK9.write(a9+i); delay_(n);} ///////////////////////////////////////////////////////////////////////////////////////// } void F2() { ///////////////////////////////////////////// ДВИЖЕНИЕ НАЗАД ///////////////////////////////////////////// ////////////K3,K9 вверх ///////////// for(i = 0 ; i<=da; i++) {myservoK3.write(a3-i); myservoK9.write(a9-i); delay_(n);} ///////////// B6,B8- вперёд B4,B10- назад //////// for(i = 0 ; i<=db; i++) {myservoB6.write(a6+i); myservoB8.write(a8-i); myservoB4.write(a4-i); myservoB10.write(a10+i); delay_(n);} //////////////K3,K9 вниз ///////////// for(i = 0 ; i<=da; i++) {myservoK3.write(a3+i); myservoK9.write(a9+i); delay_(n);} ///////////// K5,K7 вверх/////////// for(i = 0 ; i<=da; i++) {myservoK5.write(a5+i); myservoK7.write(a7+i); delay_(n);} ///////////// B6,B8- назад B4,B10- вперёд //////// for(i = 0 ; i<=db; i++) {myservoB6.write(a6-i); myservoB8.write(a8+i); myservoB4.write(a4+i); myservoB10.write(a10-i); delay_(n);} /////////////K5,K7 вниз ///////////// for(i = 0 ; i<=da; i++) {myservoK5.write(a5-i); myservoK7.write(a7-i); delay_(n);} ///////////////////////////////////////////////////////////////////////////////////////// } void F3() { ///////////////////////////////////////////// РАЗВОРОТ ВЛЕВО ///////////////////////////////////////////// ////////////K3,K9 вверх ///////////// for(i = 0 ; i<=da; i++) {myservoK3.write(a3-i); myservoK9.write(a9-i); delay_(n);} ///////////// B6,B10- вперёд B4,B8- назад //////// for(i = 0 ; i<=db; i++) {myservoB6.write(a6+i); myservoB8.write(a8+i); myservoB4.write(a4-i); myservoB10.write(a10-i); delay_(n);} //////////////K3,K9 вниз ///////////// for(i = 0 ; i<=da; i++) {myservoK3.write(a3+i); myservoK9.write(a9+i); delay_(n);} ///////////// K5,K7 вверх/////////// for(i = 0 ; i<=da; i++) {myservoK5.write(a5+i); myservoK7.write(a7+i); delay_(n);} ///////////// B6,B10- назад B4,B8- вперёд //////// for(i = 0 ; i<=db; i++) {myservoB6.write(a6-i); myservoB8.write(a8-i); myservoB4.write(a4+i); myservoB10.write(a10+i); delay_(n);} /////////////K5,K7 вниз ///////////// for(i = 0 ; i<=da; i++) {myservoK5.write(a5-i); myservoK7.write(a7-i); delay_(n);} ///////////////////////////////////////////////////////////////////////////////////////// } void F4() { ///////////////////////////////////////////// РАЗВОРОТ ВПРАВО ///////////////////////////////////////////// ///////////// K5,K7 вверх/////////// for(i = 0 ; i<=da; i++) {myservoK5.write(a5+i); myservoK7.write(a7+i); delay_(n);} ///////////// B6,B10- вперёд B4,B8- назад //////// for(i = 0 ; i<=db; i++) {myservoB6.write(a6+i); myservoB8.write(a8+i); myservoB4.write(a4-i); myservoB10.write(a10-i); delay_(n);} /////////////K5,K7 вниз ///////////// for(i = 0 ; i<=da; i++) {myservoK5.write(a5-i); myservoK7.write(a7-i); delay_(n);} ////////////K3,K9 вверх ///////////// for(i = 0 ; i<=da; i++) {myservoK3.write(a3-i); myservoK9.write(a9-i); delay_(n);} ///////////// B6,B10- назад B4,B8- вперёд //////// for(i = 0 ; i<=db; i++) {myservoB6.write(a6-i); myservoB8.write(a8-i); myservoB4.write(a4+i); myservoB10.write(a10+i); delay_(n);} //////////////K3,K9 вниз ///////////// for(i = 0 ; i<=da; i++) {myservoK3.write(a3+i); myservoK9.write(a9+i); delay_(n);} ///////////////////////////////////////////////////////////////////////////////////////// } ///////////////////////////////////////////////////////////////////////////////////////////////// //ФУНКЦИИ ПРИЁМА И ОБРАБОТКИ ДАННЫХ void CheckSerial() { ////////////////////////////////////////////////////////////////////////////// while (Serial.available())//считываем строку данных пока они поступают { char inChar = (char)Serial.read(); if (inChar == '\n') //если окончание строки { MakeCmd();//обрабатываем её данной функцией break; } else inputString += inChar;// иначе удлиняем строку на один символ } } ///////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// void MakeCmd() { int y=inputString.length();// присваиваем переменной у число символов в строке if (y<1||y>1)return;//если их меньше 1 или больше, выходим из функции String cmd=inputString;// передаём строку другой переменной inputString = "";//"обнуляем переменную" if (cmd=="1"){K=1;}//ШАГ ВПЕРЁД if (cmd=="2"){K=2;}//ОСТАНОВКА if (cmd=="3"){K=3;}//ШАГ НАЗАД if (cmd=="4"){K=4;}//ПОВОРОТ ВПРАВО if (cmd=="5"){K=5;}//ПОВОРОТ ВЛЕВО if (cmd=="6"){n=10;}//ДВИГАЕМСЯ БЫСТРО if (cmd=="7"){n=25;}//ДВИГАЕМСЯ МЕДЛЕННО if (cmd=="0"){n=15;db=12;}//ВОССТАНАВЛИВАЕМ ИСХОДНЫЕ ПАРАМЕТРЫ ДВИЖЕНИЯ if (cmd=="8"){db=20;}//ДВИГАЕМСЯ ШИРОКИМ ШАГОМ if (cmd=="9"){db=8;}//ДВИГАЕМСЯ МЕЛКИМ ШАГОМ if (cmd=="A"){K=6;}//ДВИГАЕМСЯ В АВТОНОМНОМ РЕЖИМЕ ПО УЗ ДАТЧИКУ if (cmd=="S"){f=!f;}//МЕНЯЕМ СОСТОЯНИЕ ФЛАГА НА ПРОТИВОПОЛОЖНОЕ (ВКЛЮЧАЕМ-ВЫКЛЮЧАЕМ СВЕТОДИОДНУЮ ПОДСВЕТКУ) if (cmd=="M"){digitalWrite(15,!digitalRead (15));}//ПЕРЕКЛЮЧАЕМ СОСТОЯНИЕ УПРАВЛЯЮЩЕГО МЕЛОДИЕЙ ВЫВОДА НА ПРОТИВОПОЛОЖНОЕ } /////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////// //// ФУНКЦИИ ОПИСАНИЕ // вместо задержки времени через delay и в ожидании смены играемых нот мелодии ////////////////////////////////////////////////////////////////// void delay_(int T1) { Y2=millis();metka:Y1=millis();if(Y1-Y2>=T1){} else { if(millis()-Y>h*(tabl[u+1]+tabl[u+2])) {Y=millis();u=u+3;if(u>=189){u=0;h=h+10;} if(h>40){h=20;} // tabl[u]; нота-частота звука //tabl[u+1]; условная длительность звучания //tabl[u+2]; условная длительность паузы tone (14,tabl[u],h*tabl[u+1]);} goto metka;} } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Дывлюся я на схему и думку гадаю, чому я не Клапауций и чому не посылаю. Кто вас надоумил вешать кренку на аккумулоры литиевые. Сейчас так не "носят", не модно.
Дывлюся я на схему и думку гадаю, чому я не Клапауций и чому не посылаю. Кто вас надоумил вешать кренку на аккумулоры литиевые. Сейчас так не "носят", не модно.
Это про потерянные 2,5 Вольта? В импортном аналоге (в скобках - по схеме всего 2)...Ну и аккумуляторы давно в ноутбуке уже отработали - не жалко. А что посоветуете наперёд из модулей доступных в цене с кпд 93-97 процентов (неужели такое бывает?).
П.С. Из извратства по безопасному замеру напряжения чего то кроме измерения на одном аккумуляторе ничего не видится :( выключатель надо тогда переставлять.
https://www.youtube.com/watch?v=lXKELGFo79o
https://ru.aliexpress.com/item/Free-Shipping-1PCS-XM1584-Ultra-small-siz...
Вот, вместо стабилизатора - прямо так и пишут "супер 92 процента".
это не то, для "92 процента" с батареи должен быть синхронны выпрямитель
Вот так я предполагал... Скетч счас сброшу, но он самописный-против правил.
1. Зачеркивание убери.
На вход (параллельно 4к7) повесь конденсатор, 0.1 - 1 нф.
и добавь программную фильтрацию. Например, замеряешь напряжение 3 раза подряд и крайние результаты игнорируешь. Или же находишь в интернетах (в том числе на этом форуме) более приличные методы - их куча.
2. Ты уверен, что напряжение свежего аккумулятора не будет превышать 7,5в? Не увеличить ли номинал верхнего резистора?
Вот так я предполагал... Скетч счас сброшу, но он самописный-против правил.
1. Зачеркивание убери.
На вход (параллельно 4к7) повесь конденсатор, 0.1 - 1 нф.
и добавь программную фильтрацию. Например, замеряешь напряжение 3 раза подряд и крайние результаты игнорируешь. Или же находишь в интернетах (в том числе на этом форуме) более приличные методы - их куча.
2. Ты уверен, что напряжение свежего аккумулятора не будет превышать 7,5в? Не увеличить ли номинал верхнего резистора?
Да, про номинал согласен, надо увеличить и кондёр добавить. Про зачёркивание-обрыв контакта считаю, что если он потеряется кратковременно то аналоговый вход накроется тазом.
Другие методы, думаю не проще..,потому как замышляю не только отключение ходилок квадропода при снижении напряжения, но и передачу информации о событии на смартфон (как пульт управления использую).
void setup() { Serial.begin(9600); } void loop() { delay(2000); Serial.println("BOB"); delay(2000); Serial.println("ADA"); }Пробую-тестирую связь через блютуз модуль кстати, создавая приложение в "мит апп инвенторе". Кто нибудь может помочь?, в таком вопросе: слова-команды высвечивает на экране смартфона т.е. связь установлена, но сравнить значение переменной в которой меняются команды "боб" и "ада" с значениями "BOB" '"ADA" не получается...
Картинку блока могу приложить.
Да, про номинал согласен, надо увеличить и кондёр добавить. Про зачёркивание-обрыв контакта считаю, что если он потеряется кратковременно то аналоговый вход накроется тазом.
если поднять номинал в верхнем плече, то не накроется. По входу стоит защита из быстродейстыующих диодов и если ток не великий они его высадят на себя. вообще в таких моментах я ставлю быстродействующие диоды со входа на питание МК... первое, что попалось в гугле
Да, про номинал согласен, надо увеличить и кондёр добавить. Про зачёркивание-обрыв контакта считаю, что если он потеряется кратковременно то аналоговый вход накроется тазом.
если поднять номинал в верхнем плече, то не накроется. По входу стоит защита из быстродейстыующих диодов и если ток не великий они его высадят на себя. вообще в таких моментах я ставлю быстродействующие диоды со входа на питание МК... первое, что попалось в гугле
Ну тогда рационально поставить пару одинаковых резисторов по 47 кОм-100 кОм, чтоб отслеживать напряжение как бы на одном аккумуляторе. Какой номинал конденсатора взять к резистору в нижнем плече чтобы сгладить пульсации максимально и в то же время оперативно получать достоверные значения примерно через 1-5 секунд?
Да, про номинал согласен, надо увеличить и кондёр добавить. Про зачёркивание-обрыв контакта считаю, что если он потеряется кратковременно то аналоговый вход накроется тазом.
если поднять номинал в верхнем плече, то не накроется. По входу стоит защита из быстродейстыующих диодов и если ток не великий они его высадят на себя. вообще в таких моментах я ставлю быстродействующие диоды со входа на питание МК... первое, что попалось в гугле
Ну тогда рационально поставить пару одинаковых резисторов по 47 кОм-100 кОм,
Да, про номинал согласен, надо увеличить и кондёр добавить. Про зачёркивание-обрыв контакта считаю, что если он потеряется кратковременно то аналоговый вход накроется тазом.
если поднять номинал в верхнем плече, то не накроется. По входу стоит защита из быстродейстыующих диодов и если ток не великий они его высадят на себя. вообще в таких моментах я ставлю быстродействующие диоды со входа на питание МК... первое, что попалось в гугле
Ну тогда рационально поставить пару одинаковых резисторов по 47 кОм-100 кОм,
Да отпугивает Англицкий, на русском не всегда верно трактуешь прочитанное, а с переводом мне полный нихт ферштейн.
Да отпугивает Англицкий, на русском не всегда верно трактуешь прочитанное, а с переводом мне полный нихт ферштейн.
Да отпугивает Англицкий, на русском не всегда верно трактуешь прочитанное, а с переводом мне полный нихт ферштейн.
Перевёл.., но я уже поставил по 56 кОм, подключился к акуумуляторам, врубил все ходилки-пищалки-моргалки и вход А2 Ардуино на смартфоне показал 751 из 1023 возможных при 5 В.