Mantenere costante grandezza fisica (PID?)

Ciao a tutti, giusto per un esperimento vorrei far andare dritto il mio robottino mantenendo costante la sua distanza dal muro, misurata con sensore ad ultrasuoni.
L'algoritmo da utilizzare è il famoso PID? Ce ne sono altri? Se si come posso implementarlo nel mio programma?
Praticamente deve avanzare mantenendo costante la distanza dal muro spostandosi verso destra o sinistra.
Grazie

ciao
tipo di sensore?
errore ammesso?

stefa24:
ciao
tipo di sensore?
errore ammesso?

Ciao, il classico sensore HC-SR04

Nessun'altro?

Misuri la distanza tramite sensore ad ultrasuoni.
Se la distanza è minore o uguale al valore scelto.
Sterza a destra o a sinistra “la scelta si potrebbe fare anche con un sistema random”

int distanza=0;
long rdn=0;

void loop(){

....
....
    rdn=random(1, 3);
    distanza=leggiDistanza();
    if(distanza<=300){
         if(rdn==1){
             SterzaDestra();
         }
         else{

             SterzaSinistra();
        }

    }


}


int leggiDistanza(){




}


void SterzaDestra(){


}



void SterzaSinistra(){



}

Mi sembra di aver capito ora cosa vuoi fare, fare muovere un robottino parallelo a un muro, e vuoi che mantenga la distanza impostata, il programma precedente era per robottino con sensore frontale che evita gli ostacoli, modificando un po il codice potresti ottenere quello che vuoi…

int distanza=0;

boolean posizioneSensore=true; //true=destra, false=sinistra


void loop(){

....
....
   
    distanzaS=leggiDistanzaSinistra(); //se la parete è a sinistra
    distanzaD=leggiDistanzaDestra(); //se la parete è a destra
    if(distanzaS<30 && posizioneSensore==false){ // 30 cm
         SpostamentoDestra();

    }

    else if(distanzaS>30 && posizioneSensore==false){
           
         SpostamentoSinistra();
    }

   if(distanzaD<30 && posizioneSensore){ // 30 cm
         SpostamentoSinistra();

    }

    else if(distanzaD>30 && posizioneSensore){
           
         SpostamentoDestra();
    }
}


int leggiDistanzaSinistra(){




}
int leggiDistanzaDestra(){




}

void SpostamentoDestra(){
  
    //algoritmo
    ruota verso destra di valore x
    prosegui in line retta per 5 mm
   

}



void SpostamentoSinistra(){

    //algoritmo
    ruota verso sinistra di valore x
    prosegui in line retta per 5 mm
    


}

alex27riva:
L'algoritmo da utilizzare è il famoso PID?

Non puoi usare un pid perché il sistema non è di tipo lineare, il pid si applica solo a questa categoria sebbene in alcuni casi particolari è possible applicarlo a sistemi non lineari, questo perché non hai degli encoder su i motori che permettono di regolarne la velocità in modo preciso.
La mancanza di un preciso controllo velocità su i motori comporta un errore non prevedibile nella regolazione della velocità e l'impossibilità di usare un pid per tenere il robot a distanza costante da un oggetto.
Per contro la semplice presenza degli encoder su i motori ti permette di far avanzare perfettamente dritto il robot lungo una rotta prestabilita e mantenere costante la distanza da un muro, l'uso del sensore ultrasonico sarebbe solo per determinare questa distanza e la sua variazione da inserire come secondo anello nel pid controllo velocità motori.

Per muoverti lungo il muro, il PID deve controllare la distanza da esso e comandare la ruota sterzante così da mantenere la distanza costante.
Imposti il set-up del PID (distanza dal muro) e lui agisce sullo sterzo per mantenere il set-up.
Ovviamente avresti un andamento oscillante lungo il muro dipendente dalle costanti del PID.