Tengo una placa Arduino ProMicro 5V 16MHz de sparkfun.
Tengo un LiPo de 3 celdas que lo alimenta todo (a través del regulador relevante que lo reduce a 5V). Esto es parte de un TriCopter. Toco el pin positivo de 12 V a través de un divisor de voltaje en el pin A1 (si el USB está apuntando hacia arriba y los pines lejos de usted, este es el sexto pin desde la parte inferior derecha).
¿Cómo me refiero a este pin en mi programa? A1 es: static const uint8_t A1 = 19U
. Esto lee 0V de mi batería.
Mi código es el siguiente:
/*
* Battery Sensor
* Battery Voltage monitor
*/
const float ReferenceVoltage = 5; //default reference on a 5-volt board
const float R1 = 54350;//49200; //55K2 Ohm resister
const float R2 = 32600;//31000; //32K6 Ohm resister
const float ResistorFactor = 1023.0*(R2/(R1+R2));
const int BatteryPin = A1; // V(out) of Voltage devider circuit is attached to analog pin A1
/// <summary>
/// Reads the current Battery voltage
/// </sumary>
void ReadBatteryVoltage()
{
int Value = analogRead(BatteryPin); //read the value from the Analog Pin
//Serial.println(Value);
float BatteryVoltage = (Value/ResistorFactor)*ReferenceVoltage; //Calculate the ratio
}
Sé que este es un foro de electrónica y estoy haciendo una pregunta de programación, pero esto es electrónica. Apreciaría cualquier sugerencia. Esto me está volviendo loco.
actualización: Gracias a PeterJ por ayudarme a confirmar lo que sabía sobre qué Pin leer y también por la sintaxis mejorada. Sin embargo, el problema estaba en la línea 8 a continuación:
1: /// <summary>
2: /// Reads the current Battery voltage
3: /// </sumary>
4: void ReadBatteryVoltage()
5: {
6: int Value = analogRead(BATTERY_PIN); //read the value from the Analog Pin
7: //Serial.println(Value);
8: BatteryVoltage = (Value/ResistorFactor)*ReferenceVoltage; //Calculate the ratio
9: }
Esa variable local fue la que se completó con el voltaje de la batería que se leyó desde BATTERY_PIN, dejando la variable global con un nombre similar, en otra parte de mi aplicación en su estado predeterminado de 0.0;
Acabo de eliminar la declaración de tipo que hizo que usara la variable global como debería y todo funcionó bien.
Este es el tipo de cosas que vuelven locos a los programadores. El hardware es difícil... ¡pfff! el hardware es difícil porque la mayoría del hardware ahora requiere software. ;-)... que, por supuesto, está mal creado por el software húmedo.
Puede haber otros problemas, pero de acuerdo con la documentación de Arduino analogRead
Sintaxis
lectura analógica (pin)
Parámetros
pin: el número del pin de entrada analógica para leer (0 a 5 en la mayoría de las placas, 0 a 7 en Mini y Nano, 0 a 15 en Mega)
Entonces, como A1 se define como 19U, debe cambiar:
const int BatteryPin = A1;
A lo siguiente:
const int BatteryPin = 1;
Personalmente, también echaría un vistazo al uso de declaraciones #define del preprocesador en esos casos en lugar de constantes, que pueden consumir memoria adicional dependiendo de las optimizaciones del compilador, por lo que podría usar lo siguiente:
#define BatteryPin 1
Aunque por convención para preprocesador define normalmente sería:
#define BATTERY_PIN 1
Ingeniero
PedroJ
Ingeniero