Salve a tutti,
sto cercando di gestire attraverso arduino un motore a CA, comandato tramite due relè, pilotati da arduino, con un sensore posizionato nello stesso motore, che non è altro che un potenziometro.
Il mio scopo è il seguente:
-all'avvio della scheda, la prima cosa che faccia sia di tornare allo 0, che viene impostato da me;
- successivamente, quando si darà un input (che per ora è un semplice HIGH di un pulsante) eseguira un ciclo di andata e di ritorno fino a raggiungere un certo valore;
- finito il ciclo, il motore ritorna allo 0;
fino ad ora ho scritto questa parte di codice:
const int buttonPin1 = 8;
const int buttonPin2 = 12; //bottone 2
const int indietro = 4; //relè per attivazione ritiro del perno
const int avanti =2; //relè attivazione avanzamento perno
const int limitemax = 200; //posizione dello 0
const int precisione = 10; // margine attorno allo zero per non far impazzire i relè
const int potenziometro = A0; //ingresso potenziometro
//const int corsa = 300; //lunghezza della corsa
int buttonState2 = 0;
int buttonState1 = 0;
int sensorValue = 0;
void setup () {
Serial.begin(9600);
pinMode (avanti, OUTPUT);
pinMode (indietro, OUTPUT);
pinMode (buttonPin1, INPUT);
pinMode (buttonPin2, INPUT);
digitalWrite (indietro, HIGH); //chiudo i relè con high dato che hanno una logica negata
digitalWrite (avanti, HIGH);
}
void loop (){
buttonState1 = digitalRead (buttonPin1);
buttonState2 = digitalRead (buttonPin2);
sensorValue = analogRead(potenziometro);
Serial.print("\t posizione = "); //pubblico valore del potenziometro
Serial.println(sensorValue);
if (sensorValue > limitemax+precisione) { // se la posizione iniziale del motore è superiore allo zero lo facci tornare indietro
Serial.print("\t Ritorno per azzeramento");
delay(1);
digitalWrite (indietro, LOW);
digitalWrite (avanti, HIGH);
delay (20);
}
if (sensorValue < limitemax-precisione) { // se la posizione iniziale del motore è inferiore allo zero lo facccio avanzare
Serial.print("Avanzamento per azzeramento");
delay (1);
digitalWrite (avanti, LOW);
digitalWrite (indietro, HIGH);
delay (20);
}
if (limitemax-precisione < sensorValue && limitemax+precisione > sensorValue && buttonState1 == LOW && buttonState2 == LOW) {
//se il motore è nel margine dello 0, chiude i relè
Serial.print("Macchina pronta");
digitalWrite (avanti, HIGH);
digitalWrite (indietro, HIGH);
delay (20);
}
if (limitemax-precisione < sensorValue && limitemax+precisione > sensorValue && buttonState1 == HIGH) {
//se il motore è nella posizione 0, e premo il pulsante 1 inizia con un tipo di ciclo
Serial.println("Esecuzione1");
digitalWrite (avanti, LOW);
delay (3000);
digitalWrite (avanti, HIGH);
delay (500);
digitalWrite (indietro, LOW);
delay (3000);
digitalWrite (indietro, HIGH);
delay (500);
}
if (limitemax-precisione < sensorValue && limitemax+precisione > sensorValue && buttonState2 == HIGH) {
Serial.println("Esecuzione2");
//se il motore è nella posizione 0, e premo il pulsante 2 inizia con un altro tipo di ciclo
digitalWrite (avanti, LOW);
delay (2000);
digitalWrite (avanti, HIGH);
delay (500);
digitalWrite (indietro, LOW);
delay (4000);
digitalWrite (indietro, HIGH);
delay (500);
}
}
il problema di questo ciclo è che l'avanzamento è temporizzato, e non con coordinate assolute. Dovrei poter dirgli che nel ciclo che sta facendo (in questo caso all'interno del comando if) abbia dei fine corsa in certi valori del sensore.
Come posso fare? Che comando dovrei usare?
Grazie.