Problema con mia creazione Robot

//variabili per loop ULTRASUONO
const byte Echo(30);
const byte Trig(31);
int Tempo=0; 
int Distanza=0;
int Cm=0;
byte MediaCm=0;
byte Direzione=0;

//variabili per loop RILEVA_DISTANZE
#include <Stepper.h>
const int Giro=200;
Stepper myStepper(Giro,41, 43, 45, 47);
unsigned long tempoMot=0;
boolean VerificaInCorso=0;
int Posizione=0;

//variabili per loop MEMORIZZA_DISTANZE
byte MemorizzaDistanza[7]={};
byte PuntaDistanza=0;

void setup()
{
 Serial.begin(9600);//velocita Serial Monitor 

 pinMode(Echo,INPUT);//ULTRASUONO
 pinMode(Trig,OUTPUT);//ULTRASUONO 

 myStepper.setSpeed(150);//PASSOPASSO 
}

void ULTRASUONO()
{ 
  digitalWrite(Trig,LOW);
  delay(1);//aspetta(ma non ho capito bene per quale motivo)
  digitalWrite(Trig,HIGH);     
  delay(2);//aspetta(ma non ho capito bene per quale motivo)
  digitalWrite(Trig,LOW);
   
  Tempo=pulseIn(Echo,HIGH);//tempo uguale a pulseIn
  Cm=Tempo*0.0165725;//verifica la distanza in millimetri stando attento alla temperatura
  Distanza=Distanza+Cm;
  MediaCm++;

  if( MediaCm==10)
    {
     Distanza=Distanza/10;     
     MediaCm=0;
     MemorizzaDistanza[PuntaDistanza]=Distanza;
    } 
   
}

 void  RILEVA_DISTANZE()
{ 
  if(VerificaInCorso==1)
    {
     if(millis()-tempoMot>=1200)//SE il cronometro riaggunge il valore scelto
       {
        if(Posizione==0){myStepper.step(0);}// SE=0 Guarda Avanti
        if(Posizione==1){myStepper.step(100);}// SE=1 Guarda Destra 1\2  
        if(Posizione==2){myStepper.step(100);}//SE=2 Guarda Destra 1 
        if(Posizione==3){myStepper.step(-300);}//SE=3 Torna Avanti venendo da Destra(aggiustato passo per meccanica sgranata)
        if(Posizione==4){myStepper.step(-100);}// SE=4 Guarda Sinistra 1\2 
        if(Posizione==5){myStepper.step(-100);}//SE=5 Guarda Sinistra 1 
        if(Posizione==6){myStepper.step(300);}//SE=6 Torna Avanti venendo da Sinistra(aggiustato passo per meccanica sgranata) 
        
        ULTRASUONO();
        
        
        if(millis()-tempoMot>=1500)//SE il cronometro riaggunge il valore scelto
          {
           if(Posizione>6)
             { 
              Posizione=0;
              PuntaDistanza=0;
             }
          
        Serial.println(MemorizzaDistanza[PuntaDistanza]);             
           Posizione++;  
           PuntaDistanza++;
           tempoMot=millis();//azzera il cronometro
          }
       }
    }
}

 void  MEMORIZZA_DISTANZE()
{ 

}

void loop()
{
 VerificaInCorso=1; 
   RILEVA_DISTANZE();  
}

:confused: :confused: :confused: >:( >:( >:( >:( >:(
Ok sono calmissimo >:( >:( >:( >:( ..ho una mazza da 15KG pronta a distruggere tutto,ma sto facendo yoga,quindi sono calmissimo :zipper_mouth_face: :zipper_mouth_face: :zipper_mouth_face:

Premetto che il tentativo è quello di far mettere in posizione un motorino passo passo con sopra incastrato un sensore ad ultrasuoni e memorizzarne le letture.

Il mio problema è questo se provo le funzioni separatamente sembrano funzionare abbastanza correttamente,ma se le unisco,il sensore comincia dare valori strani e se muovo qualkcosa per fargli leggere distanze diverse......dopo un poco si blocca pure il motorino. :frowning: :frowning: :confused: :confused:

queste non vanno bene!

digitalWrite(Trig,LOW);
  delay(1);//aspetta(ma non ho capito bene per quale motivo)
  digitalWrite(Trig,HIGH);     
  delay(2);//aspetta(ma non ho capito bene per quale motivo)
  digitalWrite(Trig,LOW);

cambiale con queste... occhio alle variabili diverse :slight_smile:

   //richiesta invio impulsi al sensore
    digitalWrite(trigPin,LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin,HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin,LOW);
    
    //restituisce il tempo di echo
    durata=pulseIn(echoPin,HIGH);

le attese sono in microsecondi non millisecondi!

e questo

tempoMot=millis();//azzera il cronometro

lo aggiorni solo nel caso in cui sia maggiore di 1500
quindi il primo if lavora su un tempo totale di 1800 ( 300 per arrivare a 1500 + altri 1200)

Ok grazie Patric_M, domani e nei prossimi giorni ci tono sù....per il momento ti ringrazio.

Off topic

Meglio usare un servo per muovere il sensore, se per qualche motivo manca l'alimentazione del robot, con un motore passo passo non sai più quale sia la posizione iniziale "devi posizionarlo manualmente" o altrimenti i movimenti non corrispondono a quelli voluti.
Con un servo questo problema non esiste "il servo sa la sua posizione".

OK fatte le dovute correzioni sembra funzionare :smiley: :smiley: :smiley: :smiley: posso meter via la mazza.
Grazie

Qui lo sketch completo......

//variabili per loop ULTRASUONO
const byte Echo(30);
const byte Trig(31);
int Tempo=0; 
int Distanza=0;
int Cm=0;
byte MediaCm=0;
byte Direzione=0;

//variabili per loop RILEVA_DISTANZE
#include <Stepper.h>
const int Giro=200;
Stepper myStepper(Giro,41, 43, 45, 47);
unsigned long tempoMot=0;
boolean MuoviStepper=0;
boolean VerificaInCorso=1;
boolean ControlloDistanza=1;
byte Posizione=0;
byte RicordaPosizione=0;
byte VerificaDistanza[7]={};
byte PuntaDistanza=0;

//variabili per loop MEMORIZZA_DISTANZE
boolean RichiediVerifica=0;
boolean MemorizzaDistanze=0;
byte MemoriaDistanza_1[7]={};
byte MemoriaDistanza_2[7]={};
byte MemoriaDistanza_3[7]={};
byte PuntaMemoria_1=0;
byte PuntaMemoria_2=0;
byte PuntaMemoria_3=0;
byte ConfrontoMemoria=0;

//variabili per loop MEDIA_DISTANZE()
byte MediaMemorieDistanze[7]={};
byte PuntaMediaMemorie=0;
byte PosizionaPuntatori=0;
int MediaMemorie=0;
boolean MediaDistanze=0;


void setup()
{
 Serial.begin(9600);//velocita Serial Monitor 
 pinMode(Echo,INPUT);//ULTRASUONO
 pinMode(Trig,OUTPUT);//ULTRASUONO 
 myStepper.setSpeed(150);//PASSOPASSO    
}

void ULTRASUONO()
{ 
  digitalWrite(Trig,LOW);
  delayMicroseconds(2);//aspetta(ma non ho capito bene per quale motivo)
  digitalWrite(Trig,HIGH);     
  delayMicroseconds(10);//aspetta(ma non ho capito bene per quale motivo)
  digitalWrite(Trig,LOW);  
  Tempo=pulseIn(Echo,HIGH);//tempo uguale a pulseIn
  Cm=Tempo*0.0165725;//verifica la distanza in millimetri stando attento alla temperatura
  Distanza=Distanza+Cm;
  MediaCm++;
  if(MediaCm>10)
    {
     Distanza=Distanza/10; 
     VerificaDistanza[PuntaDistanza]=Distanza;
     Distanza=0;
     MediaCm=0;
    }
}

 void  MEMORIZZA_DISTANZE()
{ 
  if(VerificaInCorso==1)
    {
     if(ConfrontoMemoria==0)
       {
        if(PuntaDistanza==0)
          { 
           Serial.println(""); 
           Serial.println("");
           Serial.print("ConfrontoMemoria ");
           Serial.print(ConfrontoMemoria);
           Serial.print("  ");
           Serial.print(VerificaDistanza[PuntaDistanza]);
           Serial.print(" ");
          }
        if(PuntaDistanza!=0)
          { 
           Serial.print(VerificaDistanza[PuntaDistanza]); 
           Serial.print(" "); 
          } 
       }
        
     if(ConfrontoMemoria==1)
       {
        PuntaMemoria_1=PuntaDistanza;
        MemoriaDistanza_1[PuntaMemoria_1]=VerificaDistanza[PuntaDistanza];

        if(PuntaMemoria_1==0)
          { 
           Serial.println(""); 
           Serial.println("");
           Serial.print("ConfrontoMemoria ");
           Serial.print(ConfrontoMemoria);
           Serial.print("  ");
           Serial.print(MemoriaDistanza_1[PuntaMemoria_1]);
           Serial.print(" ");
          }
        if(PuntaMemoria_1!=0)
          { 
           Serial.print(MemoriaDistanza_1[PuntaMemoria_1]); 
           Serial.print(" "); 
          } 
       }
       
     if(ConfrontoMemoria==2)
       {
        PuntaMemoria_2=PuntaDistanza;
        MemoriaDistanza_2[PuntaMemoria_2]=VerificaDistanza[PuntaDistanza];
        if(PuntaMemoria_2==0)
          { 
           Serial.println(""); 
           Serial.println("");
           Serial.print("ConfrontoMemoria ");
           Serial.print(ConfrontoMemoria);
           Serial.print("  ");
           Serial.print(MemoriaDistanza_2[PuntaMemoria_2]);
           Serial.print(" ");
          }
        if(PuntaMemoria_2!=0)
          { 
           Serial.print(MemoriaDistanza_2[PuntaMemoria_2]); 
           Serial.print(" "); 
          }
       }
     if(ConfrontoMemoria==3)
       {
        PuntaMemoria_3=PuntaDistanza;
        MemoriaDistanza_3[PuntaMemoria_3]=VerificaDistanza[PuntaDistanza];
        if(PuntaMemoria_3==0)
          { 
           Serial.println(""); 
           Serial.println("");
           Serial.print("ConfrontoMemoria ");
           Serial.print(ConfrontoMemoria);
           Serial.print("  ");
           Serial.print(MemoriaDistanza_3[PuntaMemoria_3]);
           Serial.print(" ");
          }
        if(PuntaMemoria_3!=0)
          { 
           Serial.print(MemoriaDistanza_3[PuntaMemoria_3]); 
           Serial.print(" "); 
          }
       }
    } 
}


 void  RILEVA_DISTANZE()
{ 
  
  PuntaDistanza=Posizione;     
  if(VerificaInCorso==1)
    {               
     if(Posizione>6)//SE  la posizione in cui mettersi supera la dimensione dell'array
       {
        Posizione=0;//riporta la posizione al punto di partenza
        ConfrontoMemoria++;      
       }

     if(ConfrontoMemoria>3)
       {
        VerificaInCorso=0;
        ConfrontoMemoria=0;      
        ControlloDistanza==0;//...................
        MediaDistanze=1;                           
       }
    
          
     if(MuoviStepper==1)//SE pronto al movimento
       {
        if(Posizione==0){myStepper.step(0);}// SE=0 resta Fermo Avanti
        if(Posizione==1){myStepper.step(150);}// SE=1 sposta Destra 1\2  
        if(Posizione==2){myStepper.step(150);}//SE=2 sposta Destra 1 
        if(Posizione==3){myStepper.step(-300);}//SE=3 torna Avanti venendo da Destra(aggiustato passo per meccanica sgranata)
        if(Posizione==4){myStepper.step(-150);}// SE=4 sposta Sinistra 1\2 
        if(Posizione==5){myStepper.step(-150);}//SE=5 sposta Sinistra 1 
        if(Posizione==6){myStepper.step(300);}//SE=6 torna Avanti venendo da Sinistra(aggiustato passo per meccanica sgranata)          
        MuoviStepper=0;//attiva il movimento(dopo la lettura) 
       }
              
     if(MuoviStepper==0)
       {  
        if(millis()-tempoMot>=200)
          {           
           ULTRASUONO();
           if(millis()-tempoMot>=800)
             {            
              MEMORIZZA_DISTANZE();
              Posizione++;
              MuoviStepper=1;   
              tempoMot=millis();//azzera il cronometro 
             }                 
          }         
       }
    }
}

void MEDIA_DISTANZE()
{
  if(MediaDistanze==1)
    {
     PuntaMemoria_1=PosizionaPuntatori;
     PuntaMemoria_2=PosizionaPuntatori;
     PuntaMemoria_2=PosizionaPuntatori;
     PuntaMediaMemorie=PosizionaPuntatori;
     MediaMemorie=MediaMemorie+MemoriaDistanza_1[PuntaMemoria_1];
     MediaMemorie=MediaMemorie+MemoriaDistanza_2[PuntaMemoria_2];
     MediaMemorie=MediaMemorie+MemoriaDistanza_3[PuntaMemoria_3];
     MediaMemorieDistanze[PuntaMediaMemorie]=MediaMemorie/3;
     if(PosizionaPuntatori==0)
       { 
        Serial.println(""); 
        Serial.println("");
        Serial.print("MediaMemorie        ");
        Serial.print(MediaMemorieDistanze[PuntaMediaMemorie]);
        Serial.print(" ");                     
       }
     if(PosizionaPuntatori!=0)
       { 
        Serial.print(MediaMemorieDistanze[PuntaMediaMemorie]); 
        Serial.print(" ");            
       }
     PosizionaPuntatori++;  
     if(PosizionaPuntatori>6)
       {
        PosizionaPuntatori=0;
        MediaDistanze=0;
       }
    }
}
     
void loop()
{
  if(ControlloDistanza==1){RichiediVerifica=1;}
  if(RichiediVerifica==1){RILEVA_DISTANZE();}
  MEDIA_DISTANZE();
}

In pratica il motorino sù cui è incastrato UltraSuono và in posizione,il sensore legge e memorizza.

Il tutto per 3 volte e fin qui tutto OK anche se le letture non sono il massimo della precisione.

Il problema sta qui

void MEDIA_DISTANZE()
{
  if(MediaDistanze==1)
    {
     PuntaMemoria_1=PosizionaPuntatori;
     PuntaMemoria_2=PosizionaPuntatori;
     PuntaMemoria_2=PosizionaPuntatori;
     PuntaMediaMemorie=PosizionaPuntatori;
     MediaMemorie=MediaMemorie+MemoriaDistanza_1[PuntaMemoria_1];
     MediaMemorie=MediaMemorie+MemoriaDistanza_2[PuntaMemoria_2];
     MediaMemorie=MediaMemorie+MemoriaDistanza_3[PuntaMemoria_3];
     MediaMemorieDistanze[PuntaMediaMemorie]=MediaMemorie/3;
     if(PosizionaPuntatori==0)
       { 
        Serial.println(""); 
        Serial.println("");
        Serial.print("MediaMemorie        ");
        Serial.print(MediaMemorieDistanze[PuntaMediaMemorie]);
        Serial.print(" ");                     
       }
     if(PosizionaPuntatori!=0)
       { 
        Serial.print(MediaMemorieDistanze[PuntaMediaMemorie]); 
        Serial.print(" ");            
       }
     PosizionaPuntatori++;  
     if(PosizionaPuntatori>6)
       {
        PosizionaPuntatori=0;
        MediaDistanze=0;
       }
    }
}

in pretica escono dei valori completamente senza senso.

OK..OK..ci sono arrivato da solo :smiley: :smiley: :smiley: ;D ;D ;D 8) 8) 8) :-* :-* :-* :money_mouth_face: :money_mouth_face: :sweat_smile: :sweat_smile: :sweat_smile: :zipper_mouth_face: :zipper_mouth_face: :zipper_mouth_face: ...il problema stava nella posizione in cui facevo avanzare "" PosizionaPuntatori++;""

Qui il void() modificato

void MEDIA_DISTANZE()
{
  if(MediaDistanze==1)
    {
      
     PuntaMemoria_1=PosizionaPuntatori;
     PuntaMemoria_2=PosizionaPuntatori;
     PuntaMemoria_3=PosizionaPuntatori;
     PuntaMediaMemorie=PosizionaPuntatori;
     MediaMemorie=MemoriaDistanza_1[PuntaMemoria_1]+MemoriaDistanza_2[PuntaMemoria_2]+MemoriaDistanza_3[PuntaMemoria_3];
     MediaMemorieDistanze[PuntaMediaMemorie]=MediaMemorie/3;
     if(PosizionaPuntatori==0)
       { 
        Serial.println(""); 
        Serial.println("");
        Serial.print("MediaMemorie        ");
        Serial.print(MediaMemorieDistanze[PuntaMediaMemorie]);
        Serial.print(" ");                     
       }
     if(PosizionaPuntatori!=0)
       { 
        Serial.print(MediaMemorieDistanze[PuntaMediaMemorie]); 
        Serial.print(" ");            
       }
      
     if(PosizionaPuntatori>6)
       {
        PosizionaPuntatori=0;
        MediaDistanze=0;
       }
    }
  PosizionaPuntatori++;   
}

:grinning: :grinning: :grinning: :cry: :cry: :cry: :grin: :grin: :grin: :grin:

Che stupido a non averlo ricordato prima...è la stessa solfa del Pulsante :kissing: :kissing: :kissing: :kissing: