Potenziometro per gestire avanzamento motore Arduino UNO

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.

Proprio nessunoche ppuò aiutarmi??

ciao.
Se ho capito bene il tuo problema è nei 2 ultimi if e devi muovere il motore senza i delay ma leggendo il valore di sensorValue.
Una soluzione potrebbe essere quella di utilizzare do ... while all'interno dell'if.
una cosa tipo:

if (limitemax-precisione < sensorValue && limitemax+precisione > sensorValue && buttonState2 == HIGH) {
    Serial.println("Esecuzione2");
    do { 
    int a = analogRead(potenziometro); // leggo valore pot
     digitalWrite (avanti, LOW);// qui sai tu se devi andare avanti o indietro con il motore.
         } while (a>800);
    // eventuali altri do ... while se devi fare altri spostamenti del motore
    }

ciao
pippo72

ho provato ad inserire la tua stringa, ma sorge un problema.. Se metto il comando do..while che mi hai suggerito te, dopo che il motore ha fato appena un movimento, l'if del comando non si avvera più... mi servirebbe qualcosa del tipo "wait until" come nei comandi di alcuni robot

paro95:
ho provato ad inserire la tua stringa...

ciao.
Mi sono spiegato male, la parte di codice che ho postato era solo un esempio di come implementare il comando do...while, non era da prendere e "inserire" nel tuo codice, effettivamente non la ho provata e non so se possa funzionare, infatti quando mi dici che

paro95:
l'if del comando non si avvera più...

questo non è vero nel senso che non è l'if che non si avvera più ma è che sei rimasto bloccato all'interno del ciclo do...while.
Do...while è bloccante nel senso che rimani all'interno di quel ciclo finchè la condizione messa dopo il while diventa falsa.
io ho scritto:

do { 
    int a = analogRead(potenziometro); // leggo valore pot
     digitalWrite (avanti, LOW);// qui sai tu se devi andare avanti o indietro con il motore.
         } while (a>800);

adesso in non so se quel comando è corretto ovvero non so se con digitalWrite (avanti, LOW) il valore del potenziometro aumenta o diminuisce. Io ho ipotizzato (sbagliando) che con il motore in posizione 0 il valore del pot sia minore di 800 e che a te servisse muovere il motore in quella direzione.
Se però con digitalWrite (avanti, LOW) il valore dell pot diminuisce la condizione while (a>800) non divenrterà mai falsa e non uscirai mai da quel ciclo.
Sperando di non aver aumentato la confusione...
ciao
pippo72