Наверное, каждый, создавая собственного автономного робота, хотел определять уровень заряда аккумуляторов и выводить их на дисплей или в консоль. Эта функция в основном необходима для отладки, однако в некоторых случаях определение заряда — важная часть функционала робота. Сложность в выполнении этой задачи составляет ограничение максимального входного напряжения на аналогово-цифровом преобразователе (5В), а также огромные скачки полученного значения. В этом посте я хотел бы показать свой способ считывания напряжения с аккумуляторов и определение заряда.
В первую очередь необходимо припаять к штекеру питания два резистора по 1 кΩ вот этой схеме делителя напряжения:
Таким образом, если выходное напряжение полностью заряженных аккумуляторов не превышает 10В, то напряжение после делителя будет меньше 5В, а значит, будет адекватно распознаваться аналого-цифровым преобразователем.
Теперь необходимо подключить выход делителя к любому аналоговому входу на Arduino. В моем случае это ножка А5. Затем попробуем считать напряжение с батареек:
void setup() { Serial.begin(9600); pinMode(A5, INPUT); } void loop() { float k = 2; float voltage = k*analogRead(A5); }
Получается непонятно что, так как мы забыли конвертировать значение в десятеричную систему счисления. Для этого делим все на 1024:
void loop() { float k = 2/1024; float voltage = k*analogRead(A5); }
Теперь подбираем при помощи вольтметра коэффициент, при котором voltage будет примерно равно реальному напряжению:
float k = 2*1.12; float voltage = k*4.5f/1024*analogRead(A5);
Мы получили сильно прыгающее вверх-вниз напряжение, зачастую не схожее с требуемым. Для исправления этой ошибки добавляем низкочастотную фильтрацию с наиболее оптимальным для вашего проекта коэффициентом сглаживания:
void loop() { float k = 2*1.12; float voltage = k*4.5f/1024*analogRead(A5); float chargeLevel_procents; float chargeLevel; float y; int z; //Сглаживание значения заряда батареи float A_v = voltage; //Значение float A_K = 0.3; //Коэффициент сглаживания static float A_y; //Выходное значение A_y = A_y - A_K * (A_y - A_v); }
Теперь осталось измерить напряжение на полностью заряженных аккумуляторах и полностью разряженных. В моем случае разница составляет ровно 1В.
После этого необходимо найти заряд аккумулятора в процентах:
y = A_y / 8.4 * 100; chargeLevel_procents = y; chargeLevel = z;
Нам осталось только перевести это в значок батарейки (или в квадратики, как у меня) и вывести в консоль:
if(chargeLevel_procents >= 0 && chargeLevel_procents < 33) { z = 1; // 1/3 заряда } else if(chargeLevel_procents >= 33 && chargeLevel_procents < 66) { z = 2; // 2/3 заряда } else if(chargeLevel_procents >= 66 && chargeLevel_procents <= 100) { z = 3; // Полный заряд }
Serial.print("\t Voltage: "); Serial.print(A_y); Serial.print(" V "); Serial.print("\t Charge: "); if(z == 1) { Serial.print("■"); } else if(z == 2) { Serial.print("■■"); } else if(z == 3) { Serial.print("■■■"); } else { Serial.print("ERROR"); } Serial.print("\r\n");
Для просмотра результата рекомендую использовать PuTTY, т. к. она поддерживает любые кодировки, в отличие от обычного «монитора порта» в Arduino IDE.
ссылка на оригинал статьи https://geektimes.ru/post/271562/
Добавить комментарий