radar con led e motore passo passo

ciao a tutti, sono nuovo quindi mi presento. sono alcatrak e sono alle prime armi con arduino.
è tutto il pomeriggio che sto impazzendo con un progetto, si tratta di un radar ove il motore è uno stepper motor e il display è formato da quattro led rossi e quattro verdi. funziona cosi il motore gira per circa un angolo di 45 gradi ove si alternano 4 funzioni, uno per un led. completato il giro torna indietro e si alternato le funzioni inverse, ma niente non funziona, il motore si muove sempre in un'unica direzione e i led si accendono di rosso. aiuto!!

//other
int val = 0;

//motor
#include <Stepper.h>
#define STEPS 80
Stepper myStepper(STEPS, 2, 3, 4, 5);

//sensore
const int TRIG_PIN = 6;
const int ECHO_PIN = 7;      

//led
const int ledv1 = 8;
const int ledv2 = 9;
const int ledv3 = 10;
const int ledv4 = 11;
const int ledr1 = 14;
const int ledr2 = 15;
const int ledr3 = 13;
const int ledr4 = 12;

//funzioni
void f1() {
   if(val = HIGH){
    long durata, distanza;
    digitalWrite(TRIG_PIN, LOW);
    delayMicroseconds(2);
    digitalWrite(TRIG_PIN, HIGH);
    delayMicroseconds(10);
    digitalWrite(TRIG_PIN, LOW);
    durata = pulseIn(ECHO_PIN,HIGH);
    distanza = durata / 29.1 / 2 ;
    if(distanza <= 15) {
      digitalWrite(ledv1,HIGH);
      digitalWrite(ledr1,LOW);
    }
    else if(distanza >= 35) {
      digitalWrite(ledv1,HIGH);
      digitalWrite(ledr1,LOW);
    }
    else{
      digitalWrite(ledv1,LOW);
      digitalWrite(ledr1,HIGH);
    }
  }
  else{
    digitalWrite(ledv1,HIGH);
    digitalWrite(ledr1,LOW);
  }
}
void f2() {
   if(val = HIGH){
    long durata, distanza;
    digitalWrite(TRIG_PIN, LOW);
    delayMicroseconds(2);
    digitalWrite(TRIG_PIN, HIGH);
    delayMicroseconds(10);
    digitalWrite(TRIG_PIN, LOW);
    durata = pulseIn(ECHO_PIN,HIGH);
    distanza = durata / 29.1 / 2 ;
    if(distanza <= 15) {
      digitalWrite(ledv2,HIGH);
      digitalWrite(ledr2,LOW);
    }
    else if(distanza >= 35) {
      digitalWrite(ledv2,HIGH);
      digitalWrite(ledr2,LOW);
    }
    else{
      digitalWrite(ledv2,LOW);
      digitalWrite(ledr2,HIGH);
    }
  }
  else{
    digitalWrite(ledv2,HIGH);
    digitalWrite(ledr2,LOW);
  }
}
void f3() {
   if(val = HIGH){
    long durata, distanza;
    digitalWrite(TRIG_PIN, LOW);
    delayMicroseconds(2);
    digitalWrite(TRIG_PIN, HIGH);
    delayMicroseconds(10);
    digitalWrite(TRIG_PIN, LOW);
    durata = pulseIn(ECHO_PIN,HIGH);
    distanza = durata / 29.1 / 2 ;
    if(distanza <= 15) {
      digitalWrite(ledv3,HIGH);
      digitalWrite(ledr3,LOW);
    }
    else if(distanza >= 35) {
      digitalWrite(ledv3,HIGH);
      digitalWrite(ledr3,LOW);
    }
    else{
      digitalWrite(ledv3,LOW);
      digitalWrite(ledr3,HIGH);
    }
  }
  else{
    digitalWrite(ledv3,HIGH);
    digitalWrite(ledr3,LOW);
  }
}
void f4() {
   if(val = HIGH){
    long durata, distanza;
    digitalWrite(TRIG_PIN, LOW);
    delayMicroseconds(2);
    digitalWrite(TRIG_PIN, HIGH);
    delayMicroseconds(10);
    digitalWrite(TRIG_PIN, LOW);
    durata = pulseIn(ECHO_PIN,HIGH);
    distanza = durata / 29.1 / 2 ;
    if(distanza <= 15) {
      digitalWrite(ledv4,HIGH);
      digitalWrite(ledr4,LOW);
    }
    else if(distanza >= 35) {
      digitalWrite(ledv4,HIGH);
      digitalWrite(ledr4,LOW);
    }
    else{
      digitalWrite(ledv4,LOW);
      digitalWrite(ledr4,HIGH);
    }
  }
  else{
    digitalWrite(ledv4,HIGH);
    digitalWrite(ledr4,LOW);
  }
}
//
void setup() {
  //sensore
  pinMode(TRIG_PIN,OUTPUT);
  pinMode(ECHO_PIN,INPUT);

  //led
  pinMode(ledv1, OUTPUT);
  pinMode(ledv2, OUTPUT);
  pinMode(ledv3, OUTPUT);
  pinMode(ledv4, OUTPUT);
  pinMode(ledr1, OUTPUT);
  pinMode(ledr2, OUTPUT);
  pinMode(ledr3, OUTPUT);
  pinMode(ledr4, OUTPUT);
}
void loop() {
  myStepper.step(5);
  val = digitalRead(myStepper);
  f1();
  delay(1);
  myStepper.step(5);
  f2();
  delay(1);
  myStepper.step(5);
  f3();
  delay(1);
  myStepper.step(5);
  f4();
  delay(1);
  myStepper.step(-5);
  f4();
  delay(1);
  myStepper.step(-5);
  f3();
  delay(1);
  myStepper.step(-5);
  f2();
  delay(1);
  myStepper.step(-5);
  f1();
}

Buonasera,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie.

Guglielmo

P.S.: Qui una serie di link utili, NON necessariamente inerenti alla tua domanda:
- serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections
- pinout delle varie schede by xxxPighi: Pinout
- link generali utili: Link Utili

gpb01:
Buonasera,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie.

Guglielmo

P.S.: Qui una serie di link utili, NON necessariamente inerenti alla tua domanda:
- serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections
- pinout delle varie schede by xxxPighi: Pinout
- link generali utili: Link Utili

Oh scusami vado subito^.^

Ma lo stepper qual'è ?

brunello22:
Ma lo stepper qual'è ?

e con cosa lo piloti?

brunello22:
Ma lo stepper qual'è ?

28byj-48 ho solo questo

uwefed:
e con cosa lo piloti?

Deve andare da solo per giusto dopo un certo numero di passi deve ritornare indietro

questo è uno stepper da 5,625 gradi a step che significa 64 passi per giro...però ha un motoriduttore che lo porta ad avere in uscita 4096 step per giro quindi per fare 45 gradi devi fare 512 step. Questo per cominciare
ora serve sapere con cosa lo piloti, cioè come lo colleghi ad arduino?

questo è uno stepper da 5,625 gradi a step che significa 64 passi per giro.

Quasi, in FullStep sono 11.25°

#include <Stepper.h>
#define STEPS 32
#define stepMotor 32*64
Stepper myStepper(STEPS, 2, 4, 3, 5);
void loop() {
   myStepper.setSpeed(500);
  myStepper.step(stepMotor/8); // 45°

Quella riga

 val = digitalRead(myStepper);

cosa credi che faccia?

Anche ammettendo che ti dia la posizione del motore (ammettendo... ma è già impossibile infatti digitalRead ti darà solo 0 oppure 1), ti darebbe comunque sempre la stessa posizione, quella dopo il primo angolo.

Suggerimenti

1 - scriviti una funzione che ti restituisce la posizione del motore
2 - usala dopo OGNI SPOSTAMENTO

brunello22:
Quasi, in FullStep sono 11.25°

#include <Stepper.h>

#define STEPS 32
#define stepMotor 32*64
Stepper myStepper(STEPS, 2, 4, 3, 5);






void loop() {
  myStepper.setSpeed(500);
  myStepper.step(stepMotor/8); // 45°

Grazie mille

paulus1969:
Quella riga

 val = digitalRead(myStepper);

cosa credi che faccia?

Anche ammettendo che ti dia la posizione del motore (ammettendo... ma è già impossibile infatti digitalRead ti darà solo 0 oppure 1), ti darebbe comunque sempre la stessa posizione, quella dopo il primo angolo.

Suggerimenti

1 - scriviti una funzione che ti restituisce la posizione del motore
2 - usala dopo OGNI SPOSTAMENTO

Esattamente non so, il mio intento era capire se il motore funzionasse, e se stava girando allora si attiva va la funzione

Ammetto che non conosco i motori stepper, in quanto non mi è mai capitato di usarli praticamente. Dalle conoscenze che ho su di loro so che hanno una particolarità: si muovono facendo un passo alla volta. Di conseguenza per pilotarli non è necessario che si consideri la velocità, il tempo di funzionamento o altre cose, ma esclusivamente la necessità o meno di fare il passo successivo, in avanti o all'indietro. Ne consegue che in ogni libreria con la quale si possa far muovere uno stepper debbano comparire una o più funzioni che ordinino a tale motore di compiere un singolo passo, e questo senza parlare di posizione assoluta del motore o di velocità (alle quali spero pensi la libreria). Non avendo espresso bisogni e limiti in velocità e posizione assoluta, ma soltanto in posizione relativa (fare un giro avanti e uno indietro dal punto di inizio) non sarebbe sufficiente muovere il motore chiamando, all'interno di una for che conti le ripetizioni, la funzione "fai un passo avanti()" o "fai un passo indietro()"?
A patto che tali funzioni devono esistere (se no il motore non potrebbe muoversi) così facendo abbiamo risolto il problema del muoverlo e del sapere la sua posizione relativa (il punto del giro in cui si trova, che equivae al punto di giro in cui abbiamo calcolato si trovi).
Se funziona è la soluzione, se non funziona il danno è nel motore (e non credo lo sia). Se funziona ma non è soluzione quali altri limiti ci sono?

Sì ma a me interessa far muovere il motore di 11.50 gradi e contemporaneamente far misurare la distanza (di continuo) con il sensore posto sopra il motore, una volta che ha finito di muoversi, si deve muovere di nuovo di 11.50 gradi e far lo stesso. Una volta che son finiti i 45 gradi farlo ritornare indietro allo stesso modo.
Val = stepper.mystepper... serve a vedere se il motore si muoveva e un caso far calcolare di continuo la distanza

Allora. Sapendo che "in contemporanea" Arduino non fa nulla, ma fa sempre una cosa alla volta. Potresti ad esempio calcolare la distanza con il sensore (mediante funzione apposita), poi far muovere il motore di un passo, ricalcolare la distanza, farlo muovere di un altro passo, e via così fino a che il numero dei passi non sia quello che corrisponde a 45°, e da li riprendere al contrario.
Va bene cone idea?

You are the way. Fantastico, si può fare, ma come faccio a far ritornare indietro Arduino e a farlo andare a una velocità accettabile?

in un motore stepper il movimento viene dato alimentando i vari avvolgimenti da cui è composto in una precisa successione (le successioni possomo essere diverse in funzione del tipo di movimento full step, half step e microstep) a questi comandi appunto ci pensa la libreria, per quanto riguarda la velocità ci devi pensare tu, in pratica si tratta di definire il tempo di pausa tra uno step e l'altro (c'è la funzione speed o qualcosa del genere). In generale non puoi partire alla max velocità in quanto l'inerzia del motore farebbe perdere passi (il motore ronza e non si muove) per cui o ti scrivi una funzione adeguata che incrementi (e decrementi) la velocità oppure usi librerie avanzate che hanno le relative funzioni incluse (vedi AccelStepper) il problema è appunto come gestisci lo stepper? Hai un modulo di interfaccia o hai collegato direttamente i fili dallo stepper all'arduino?

Dico la mia...innazitutto mi sembra di aver capito che dovresti dividere le varie cose che vuoi fare:

1 Secondo me dovresti innanzitutto dare un punto di partenza al motorino poi una direzione per un certo periodo con una determinata velocità ( e scusatemi se insinsto ma non serve una libreria per fare prove con un semplice passo passo ).
E magari LEGGERE e RICORDARE la posizione.

2 Se per radar intendi un semplice sensore ad ultrasuono( neppure per questo serve una libreria ) ed idem magari LEGGERE e RICORDARE la posizione.

3 Confrontare i valori LETTI e RICORDATI.

Ma come faccio a far calcolare la distanza e contemporaneamente a far andare il motore?

Dipende cosa intendi per CONTEMPORANEA.....se intendi nello stesso istante,non è possibile,se intendi con uno scarto di tempo molto veloce ed accettabile allora si può fare,ma ricorda che stai sempre utilizzando 2 dispositivi (un motorino passo passo ed un sensore ad ultrasuoni) che lavorano e ragionano in modo diverso....ora sta in te farli comunicare tra loro,ma prima devi capire cosa fanno e dicono...poi semplicemente fai da traduttore e li fai lavorare assieme.

Potrei girarti un mio schetc funzionante simile a quello che vorresti fare tu....non lo faccio se no giustamente mi sgridano,ma se cerchi un" trenino innamorato nei Topic precedenti" potresti trovare qualkosa di utile.

alcatrak:
Ma come faccio a far calcolare la distanza e contemporaneamente a far andare il motore?

Salvo il caso di MCU/CPU multicore, NULLA è mai contemporaneamente, ma "sembra" contemporaneamente" grazie alla velocità della MCU.

Un ATmega328P esegue quasi tutte le microistruzioni in un ciclo macchina ... fossero anche due, lavorando a 16MHz effettua più di 8 milioni di operazioni al secondo ... quindi, cose fatte alternativamente, prima una e poi l'alta, molto velocemente, appaiono ad occhio umano "contemporanee" ... anche se NON o sono :wink:

Però, dato che NON c'è un Sistema Operativo che si occupa di gestire un "multitask", sarà il TUO programma a dover alternare le cose e a farle sembrare "contemporanee".

Fossi in te mi studierei come utilizzare la funzione millis(), prima QUI, poi QUI e QUI e QUI e tutti gli articoli che sono in QUESTA pagina ... vedrai che troverai risposte alle tue domande di "contemporaneità" :smiley:

Guglielmo