Provavelmente todo mundo, criando seu próprio robô autônomo, queria determinar o nível de carga da bateria e exibi-lo no monitor ou no console. Essa função é principalmente necessária para depuração, mas em alguns casos, determinar a cobrança é uma parte importante da funcionalidade do robô. A dificuldade em executar esta tarefa é a limitação da tensão máxima de entrada no conversor analógico-digital ( 5V ), bem como os grandes saltos no valor obtido. Neste post, gostaria de mostrar minha maneira de ler a tensão das baterias e determinar a carga.Antes de tudo, é necessário soldar dois resistores de 1 kΩ no plugue de energia deste circuito divisor de tensão:
assim, se a tensão de saída das baterias totalmente carregadas não exceder 10V , a tensão após o divisor será menor que 5V, o que significa que será adequadamente reconhecido por um conversor analógico-digital .Agora você precisa conectar a saída do divisor a qualquer entrada analógica no Arduino. No meu caso, esta é a perna A5. Em seguida, tente ler a voltagem das baterias:void setup() {
Serial.begin(9600);
pinMode(A5, INPUT);
}
void loop() {
float k = 2;
float voltage = k*analogRead(A5);
}
Acontece que não está claro isso, pois esquecemos de converter o valor em um sistema de números decimais. Para fazer isso, divida tudo por 1024:void loop() {
float k = 2/1024;
float voltage = k*analogRead(A5);
}
Agora, selecionamos com um voltímetro um coeficiente no qual a voltagem será aproximadamente igual à voltagem real: float k = 2*1.12;
float voltage = k*4.5f/1024*analogRead(A5);
Temos uma forte tensão de subida e descida, geralmente não semelhante ao necessário. Para corrigir esse erro, adicione filtragem passa-baixo com o fator de suavização mais apropriado para o seu projeto:
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);
}
Agora resta medir a tensão em baterias totalmente carregadas e totalmente descarregadas. No meu caso, a diferença é exatamente 1V.Depois disso, você precisa encontrar a carga da bateria em porcentagem: y = A_y / 8.4 * 100;
chargeLevel_procents = y;
chargeLevel = z;
Só precisamos traduzir isso no ícone da bateria (ou nos quadrados, como o meu) e enviá-lo para o console:
if(chargeLevel_procents >= 0 && chargeLevel_procents < 33) {
z = 1;
}
else if(chargeLevel_procents >= 33 && chargeLevel_procents < 66) {
z = 2;
}
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");
Para visualizar o resultado, recomendo usar o PuTTY, pois ele suporta qualquer codificação, diferente do habitual "monitor de porta" no Arduino IDE.