//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();
}
>:( >:( >:( >:( >:(
Ok sono calmissimo >:( >:( >:( >:( ..ho una mazza da 15KG pronta a distruggere tutto,ma sto facendo yoga,quindi sono calmissimo
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.
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
//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);
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".