Hola a todos. Este es mi primer post en el foro, hace poco que me he inmerso en el mundo Arduino.
Mi primer proyecto controlará el arranque y parada de un generador eléctrico Genery jaca de gasolina con arranque electrónico. Será necesario controlatar la palanca del aire del carburador para arrancar en frio. El generador esta conectado a un inversor- regulador voltronic para realizar la carga de baterías cuando hay varios días sin sol. Utilizaré una señal de contacto seco a 220v que posee el inversor para controlar el arranque y parada del generador. Cuando las baterías presenten un voltaje bajo el contacto esta cerrado y hay voltaje, cuando las baterías alcance el voltaje de flotación el contacto se abre.
Los materiales serán:
-placa arduino UNO
-servo motor 9g SG90
-modulo sensor de infrarrojos
-relé de 220v
-2 modulo rele 5v
-resistencia 10 Ohms
-protoboard
El funcionamiento será:
1º el relé de 220 se cerrará y funcionara como el interruptor de inicio de programa.
3º el servo motor moverá la palanca del aire del motor del generador a la posición de cerrado.
2º el relé de 5v se cerrará y pulsara el botón de arranque durante 2 seg.
4º el sensor de infrarrojos comprobará que hay arranque a través de las revoluciones.
5º si hay revoluciones la palanca volverá a la posición de abierto, de lo contrario se repetirá el punto 2.
6º cuando el relé de 220 se abra, el relé de 5 v pulsara el botón de parada 3 seg.
Adjunto imagen de un diseño aproximado en protoboard.
Este sería el codigo:
// SISTEMA DE ARRANQUE DE GENERADOR ELECTRICO DE GASOLINA CON PALANCA DE AIRE
#include <Servo.h> // incluimos la libreria de servo
Servo myservo; // Crear el objeto servo para controlar el servo
// Constantes que no cambian:
const int releOn = 2; // EL pin del rele de inicio de sistema
const int releArranque = 13; // El pin del rele de arranque
const int releParo = 6; // El pin del rele de paro
const int sensor = 5; // El pin del sensor de infrarrojoS RPM PARA DETERMINAR SI EL MOTOR HA ARRANCADO
// variables que cambiarán:
int estadoReleOn = 0; // variable para leer el stado del rele de inicio
int posServo = 0; // variable para almacenar la posicion del servo
int rpm ; // variable del cuenta kilometro
void setup() {
// seleccionamos los pines que sera de salida:
pinMode(releArranque, OUTPUT); //
pinMode(releParo, OUTPUT);
myservo.attach(9); // el servo se atacara por el pin 9
// seleccionamos los pines de entrada:
pinMode(releOn, INPUT);
pinMode(sensor, INPUT);
}
void loop() {
// leer el estado del valor de rele de inicio de sistema
estadoReleOn= digitalRead(releOn);
rpm= digitalRead(sensor);
// chequear si el rele de inicio esta cerrado. Si lo está, el estadoRele es HIGH:
if (estadoReleOn == HIGH) {
//1º paso: mover la palanca del aire a cerrado a través del servo. Pasar de 0(abierto) grados a 90º(cerrado)
for (posServo = 0; posServo <= 90; posServo += 1) ; //ir de 0 a 90 grados // en pasos de un grado
myservo.write(posServo); // decirle al servo que vaya a la posicion 'posServo'
delay(2000); //esperar 2 seg para que el servo alcance la posicion
// 2º paso: pulsar el boton de arranque mediante el rele 1,5 seg y soltarlo.
digitalWrite(releArranque, HIGH);
delay(1500);
digitalWrite(releArranque,LOW);
// 3º paso: conprobar si hay revoluciones en el motor y por lo tanto ha arrancado. si no hay revoluciones volver al 2º paso y repetir 3 veces.
if (rpm >=100) { // las rpm son mayores a 100 y entonces ha arrancado
// 4º paso: mover la palanca de aire a abierto a traves del servo. Pasar de 90º( cerrado) a 0º (abierto)
for (posServo = 90; posServo <= 0; posServo += 1) ; //ir de 90 a 0 grados // en pasos de un grado
myservo.write(posServo); // decirle al servo que vaya a la posicion 'posServo'
delay(500); //esperar 2 mseg para que el servo alcance la posicio
}
else { // repetir el proceso otra vez
digitalWrite(releArranque, HIGH);
delay(1500);
digitalWrite(releArranque,LOW);
if (rpm >=100) { // las rpm son mayores a 100 y entonces ha arrancado
// 4º paso: mover la palanca de aire a abierto a traves del servo. Pasar de 90º( cerrado) a 0º (abierto)
for (posServo = 90; posServo <= 0; posServo += 1) ; //ir de 90 a 0 grados // en pasos de un grado
myservo.write(posServo); // decirle al servo que vaya a la posicion 'posServo'
delay(500); //esperar 2 mseg para que el servo alcance la posicion
}
}
}
else {
// soltar el boton de arranque mediante rele
digitalWrite(releParo, HIGH);
delay(4000);
digitalWrite(releParo,LOW);
}
}
He verificado el código y no presenta errores, pero necesito que me echéis una mano con una dudas.
La primera es si el proceso" loop" se va a efectuar solo una vez, o se repetirá.
El servo seleccionado no se si tendrá la suficiente fuerza, ya que nunca lo he probado y la palanca necesita un poco de fuerza para moverse.
Quisiera que intentara hacer el proceso de arranque y comprobación de rpm unas 5 veces ; en el código se repite el proceso solo una vez a través de" if "copiado en el código. ¿Existe otra manera de repetir un proceso sin utilizar varias veces "if" en el mismo código?.
Espero vuestras opiniones.
Un Saludo.
