Stepper motor

Salve Creativi ,

Ho recuperato da vari surplus uno stepper descritto come segue:

“Sankyo 0.9deg/step 9VDC”

Dalla descrizione se non erro il motorino dovrebbe avere 400 passi ( 360°/0.9) ?

Chiedo perchè ho collegato l’albero ad una piccola basetta mille fori nel modo più preciso possibile

facendo una sorta di posizione zero.

ma quando lo faccio ruotare di 180° non sembra essere sufficiente infatti devo impostare 200°C

per fargli fare 180 ma ritorna sempre alla stessa posizione zero .

Non credo di aver sbagliato di 20° alla posizione zero sarebbe troppo evidente

Ho utilizzato la libreria :

Stepper  stepper(STEPS,A1,A2,A3,A4);
stepper.setSpeed(step_Speed);

dove STEPS = 400 e Step_Speed = 50 ( velocità massima è 105)

quindi

digitalWrite(A0,HIGH);
digitalWrite(A5,HIGH);
stepper.step(180);
delay(1000);
stepper.step(-180);
delay(1000);

Potete darmi un dritta ? :smiley:
Forse mi sto perdendo in un bicchidere d’acqua :slight_smile:

#include <Stepper.h>
#include <NewPing.h>
#define TRIGGER_PIN 9 // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define ECHO_PIN 10 // Arduino pin tied to echo pin on the ultrasonic sensor.
#define MAX_DISTANCE 40 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.
#define STEPS 400
#define step_Speed 0

unsigned int pingSpeed = 50; // How frequently are we going to send out a ping (in milliseconds). 50ms would be 20 times a second.
unsigned long pingTimer;     // Holds the next ping time.



NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
Stepper  stepper(STEPS,A1,A2,A3,A4);

int SetDistance = 0;
int ValueDist = 0;


void setup() {
   Serial.begin(115200); // Open serial monitor at 115200 baud to see ping results.
   pingTimer = millis(); // Start now.
   
  // put your setup code here, to run once:
  stepper.setSpeed(step_Speed);

  
  pinMode(A0,OUTPUT);
  pinMode(A5,OUTPUT);
  
}

void loop() {

if (millis() >= pingTimer) {   // pingSpeed milliseconds since last ping, do another ping.
    pingTimer += pingSpeed;      // Set the next ping time.
    sonar.ping_timer(echoCheck); // Send out the ping, calls "echoCheck" function every 24uS where you can check the ping status.
  }
  // Do other stuff here, really. Think of it as multi-tasking.
          
        digitalWrite(A0,HIGH);
        digitalWrite(A5,HIGH);
        stepper.step(180);          
        delay(1000);
        stepper.step(-180);              
        delay(1000);

       
   
}
void echoCheck() { // Timer2 interrupt calls this function every 24uS where you can check the ping status.
  // Don't do anything here!
  if (sonar.check_timer()) { // This is how you check to see if the ping was received.
    // Here's where you can add code.
    Serial.print("Ping: ");
    Serial.print(sonar.ping_result / US_ROUNDTRIP_CM); // Ping returned, uS result in ping_result, convert to cm with US_ROUNDTRIP_CM.
    Serial.println("cm");

  }
  // Don't do anything here!
}

stepper.step(180);

se è un 400 step a giro, se vuoi fare mezzo giro, sono 200 step

il valore dentro alla stepper.step(xx);

sono i passi, mica i Gradi

Che circuito di pilotaggio usi? Ciao Uwe

Brunello: se è un 400 step a giro, se vuoi fare mezzo giro, sono 200 step

il valore dentro alla stepper.step(xx);

sono i passi, mica i Gradi

che sbadato ! Grazie !

uwefed: Che circuito di pilotaggio usi? Ciao Uwe

Uso la "Keyes L298"

Cosa hai attacato ai pin A0 e A5?

Il Tuo Sketch fa una misura poi muove lo stepper di 180passi e poi rimuove lo tepper di 1980 passi indietro.

Arduino non ha nessun multitasking.

Se vuoi una scansione devi muovere lo stepper di poco, fare la misura muovere lo stepper fare misura ecc.

Ciao Uwe

Buongiorno ,

Avevo continuato qui per errore. http://forum.arduino.cc/index.php?topic=415558.0

Grazie per le dritte. Ho eliminato le librerie e ho provato a fare da me. In un primo momento ho usato pulsein per misurare l'eco ma poi ho scoperto che anche esso blocca l'esecuzione.

Sto usando due interrupt, uno per leggere l'eco ed uno per richiedere la lettura dell'eco ( trigger) ogni 10ms I ritardi per le fasi dello stepper li ho creati con le while anche se è brutto ma per ora mi basta :)

Ora funziona tutto ed è fluido. Se vi può interessare vi posto il codice che essendo il primo programma forse non ha un gran che di stile,

Per voi può andare bene ? Grazie ,Ciao

http://pastebin.com/Hinx57ZN

uwefed: Cosa hai attacato ai pin A0 e A5?

Il Tuo Sketch fa una misura poi muove lo stepper di 180passi e poi rimuove lo tepper di 1980 passi indietro.

Arduino non ha nessun multitasking.

Se vuoi una scansione devi muovere lo stepper di poco, fare la misura muovere lo stepper fare misura ecc.

Ciao Uwe

A0 e A5 sono ENA e ENB , la scheda se non erro può pilotare anche due motori DC essndo un ponte H

uwefed: Se vuoi una scansione devi muovere lo stepper di poco, fare la misura muovere lo stepper fare misura ecc. Ciao Uwe

Il fare la misura mi variava il tempo sulle fasi e mi faceva scattare lo stepper

Fa la misura senza biblioteca. La misura deve essere teminata prima che il sensore viene mosso. Ciao Uwe

Ci ritornerò ma ora sono impantanato su un'altra cosa.

Sto realizzando questo scanner ad ultrasuoni a scopo didattico.Vorrei ricavare le misure dei lati di un triangolo conoscendo un angolo acuto e l'ipotenusa. Non me ne vogliano i matematici ma sono passati un bel pò di anni :D

Lo scanner dovrebbe individuare un oggetto sul piano e virtualmente formare un triangolo rettangolo come se fosse su un diagramma cartesiano. all'origine (0;0) c'è il sonar e la distanza misurata è l'ipotenusa del triangolo . Il tutto si sviluppa nei soli due quadranti in alto.

Conoscendo l'ipotenusa ( distanza misurata tra sonar e oggetto) e il numero di passi dello stepper ricavare i cateti.

Per esempio : ipotenusa = 8,5cm n_passi = 30 moltiplicati per 0.9 = 27° ( ogni passo impostato sullo stepper è uguale a 0,9°)

Di seguito i calcoli. Se mi ricordo qualcosa della scuola , dovrebbe essere giusto :) Utilizzando la relazione che c'è tra elementi del triangolo sulla carta funziona , ma non su arduino

  float ipotenusa =  distanza/58.0; // conversione in cm
   
   float alfa = n_Passi * 0.9; // ogni passo sono 0,9° , alfa è l'angolo impostato sullo stepper
   float alfa_rad = alfa*3.14159/180.0;
   
   float beta = 90.0 - alfa;
   float beta_rad = beta*3.14159/180.0;
   
   float y0 = ipotenusa * sin (alfa_rad);
   float x0 = ipotenusa * sin (beta_rad);

mi date una vostra opinione Grazie mille

Non funziona per il semplice motivo che i sonar low cost hanno un ampio angolo di emissione/ricezione, non meno di 60°, l'eco arriva da un qualunque ostacolo all'interno del cono e non puoi sapere dove si trova esattamente.

astrobeed:
Non funziona per il semplice motivo che i sonar low cost hanno un ampio angolo di emissione/ricezione, non meno di 60°, l’eco arriva da un qualunque ostacolo all’interno del cono e non puoi sapere dove si trova esattamente.

Ciao Astrobeed , puoi consigliarmi un sonar adatto allo scopo?

Con un sonar, scordatelo, a meno di non utilizzare una testa di lettura "CHIRP" ad almeno 1MHz accoppiata ad un'elettronica fuori di testa (detto in Euro, sei fra i 15000 ed i 20000, se non hanno cambiato i prezzi dall'anno scorso)

Pero' potresti usare un piccolo laser a bassa potenza, modulato, con un fotodiodo collimato con lenti, e costruirti l'equivalente di un LIDAR molto artigianale (ma serve sempre una buona elettronica, per via dei tempi) ... oppure, sempre con un piccolo laser modulato, utilizzare una camera a righe o un sensore recuperato da uno scanner, per realizzarci una specie di telemetro (si monta il laser su un supporto che regge anche il sensore con la sua ottica, parallelo, e leggendo il punto in cui viene a cadere il riflesso del puntino del laser sul sensore lineare, per parallasse si calcola la distanza ... piu complesso da realizzare ,ma decisamente piu semplice come elettronica e gestione, dato che non serve un DSP straveloce ...

O più semplicemente usare questo, è la soluzione più economica e funziona anche in esterno, la v2 non è più disponibile, a breve arriva la v3 con prestazioni maggiori.

Grazie per tutti commenti vedo se riesco a reperire il lidar , comunque mi sembra una bella sfida :D

Se lo vuoi io ne ho uno della versione 1, unica differenza con la v2 è la velocità di lettura che è di 100 Hz contro 500 Hz della v2, da dare via, posso farti un ottimo prezzo. Il Lidar lavora tramite I2C e non richiede tempo CPU per fare le misure, basta leggere periodicamente la distanza rilevata, p.e. fai tot step, leggi il Lidar, fai altri step leggi il Lidar, così via per tutto l'angolo che vuoi misurare.

Cosa hai realizzato con quell' oggetto ?

Ho letto su internet che la versone 1 ha dei "bug" sull'I2C ma è utilizzabile in altro modo

Ho appena fatto un grosso acquisto di altro genere , purtroppo ho visto solo ora il tuo post :confused: ,mandami comunque un pm con l'offerta :)

Io comunque ero dell'idea di aspettare il 3

Victor795: Cosa hai realizzato con quell' oggetto ?

Ne ho usati diversi per lavoro, ci ho realizzato sistemi di misura posizione per carrelli su rotaie.

Ho letto su internet che la versone 1 ha dei "bug" sull'I2C ma è utilizzabile in altro modo

Non è vero, non c'è nessun bug sulla I2C, la differenza con la versione 2 è solo nella velocità di lettura, per il resto sono identici. Semmai il bug c'è sulla versione 2, infatti è stata ritirata rapidamente, per quanto riguarda l'uso in esterno va facilmente va in tilt segnando distanze assurde, solo se si lavora oltre i 200 Hz, sulla versione 3 hanno cambiato il dsp per ovviare al problema.

astrobeed: Se lo vuoi io ne ho uno della versione 1, unica differenza con la v2 è la velocità di lettura che è di 100 Hz contro 500 Hz della v2, da dare via, posso farti un ottimo prezzo. Il Lidar lavora tramite I2C e non richiede tempo CPU per fare le misure, basta leggere periodicamente la distanza rilevata, p.e. fai tot step, leggi il Lidar, fai altri step leggi il Lidar, così via per tutto l'angolo che vuoi misurare.

Giusto per dare un seguito al topic volevo dirvi che ho montato il Lidar sul motorino. Entrambi funzionano in modo fluido.

L'unica cosa e che non so dove punta con esattezza il laser e quindi non posso verificare i calcoli che fa arduino. Diciamo che 'a occhio sembra giusto'. Che faccio monto un laser visibile per utilizzarlo come mirino?:D :D

Stavo pensando di fargli misurare la larghezza dell'oggetto memorizzando la posizione ,quindi posizionare il laser da un lato e da li capire dove punta il laser . Mi sembra un pò troppo complicato , forse c'e un soluzione pìù semplice ?

ciao , grazie scusate se le domande vi sembrano banali :)