Paso 5: escribir. Código INO
Arduino debe recibir el comando de velocidad y enviar el nivel de batería actual.
Cambio R1 y R2 junto con los valores de resistencias, usé un multímetro para encontrar los valores exactos de la mina. Voltaje de la batería se calcula con 9 V fuente regulada por un LM7806, así que tenemos aproximadamente 3 V de "margen" antes de voltaje alcanza el umbral de 6 V y la salida de LM7806 empieza a disminuir.
const float R1 = 26600.0; const float R2 = 26600.0; const float VBATT = 3; const int refreshRate = 10000; int south = 1; int batteryTimeout = 0;
En la configuración de pines del Arduino, asegúrese de que el batteryPin es un tipo análogo.
int batteryPin = 0; int enableCheckPin = 7; int enableMotorPin = 3; int in1Pin = 2; int in2Pin = 4;
En configuración, Arduino esperará hasta que DTR está activada.
void setup() { pinMode(batteryPin, INPUT); pinMode(tempPin, INPUT); pinMode(enableCheckPin, OUTPUT); pinMode(in1Pin, OUTPUT); pinMode(in2Pin, OUTPUT); pinMode(enableMotorPin, OUTPUT); Serial.begin(9600); while (!Serial); delay(1000); Serial.println("-------ARDUINO-------"); }
Aquí hay un voltímetro básico para la medida de nivel de batería, si la carga es mayor que 100% significa que la batería se desconecta (he añadido un 5% adicional para la prevención de error de ruido). En mi caso la medida se toma cada 10000 ms (10 s), pero obviamente se puede cambiar. De lo contrario se puede cambiar la velocidad DC en modo "tiempo real".
void loop() { if (batteryTimeout == 0) { batteryTimeout = refreshRate; digitalWrite(enableCheckPin, HIGH); delay(500); float Vout = (analogRead(batteryPin) * 5.0) / 1024.0; digitalWrite(enableCheckPin, LOW); float Vin = Vout / (R2 / (R1 + R2)); int charge = (Vin * 100) / VBATT; Serial.print("Current charge: 0"); if (charge > 105) { Serial.println(" - "); } else { Serial.print(charge); Serial.println("%"); } } digitalWrite(in1Pin, !south); digitalWrite(in2Pin, south); if (Serial.available()) { int speed = Serial.parseInt(); if (speed >= 0 && speed <= 255) { analogWrite(enableMotorPin, speed); Serial.print("New speed set: 00"); Serial.println(speed); } } batteryTimeout--; delay(1); }
Este código necesita ser optimizado, es apenas un bosquejo básico para comenzar con pruebas al aire libre.