Aumentare precisione motore passo passo

Salve a tutti, come potete leggere dal titolo ho bisogno di aumentare la precisione di un motore passo passo…vi spiego meglio: Dato che all’esame devo portare un progetto ho deciso di usare arduino e porterò un piccolo braccio robotico formato da 2 motori nel quale un motore server per muovere la penna a destra e a sinistra e un altro motore per muovere la penna avanti e dietro e che scriva una parola data in input. Il problema è che per scrivere la A certe volte la scrive bene ma certe volte la scrive male perchè il motore non lavora sempre bene e per risolvere ciò volevo aumetarne la precisione ma in modo software…vi faccio vedere il programma che sto facendo per scrivere la A

i=0;   
while (i<=50) {
  i++;
 digitalWrite(motorino4, LOW);
digitalWrite(motorino5, LOW); 
digitalWrite(motorino6, LOW); 
digitalWrite(motorino7, HIGH);
delay(10);

  digitalWrite(motorino4, LOW);
digitalWrite(motorino5, LOW);  //scrive sopra
digitalWrite(motorino6, HIGH); 
digitalWrite(motorino7, LOW); 
delay(10);
  digitalWrite(motorino4, LOW);
digitalWrite(motorino5, HIGH); 
digitalWrite(motorino6, LOW); 
digitalWrite(motorino7, LOW); 
delay(10);
digitalWrite(motorino4, HIGH);
digitalWrite(motorino5, LOW); 
digitalWrite(motorino6, LOW); 
digitalWrite(motorino7, LOW); 
delay(10);
if (i==50){
  while (i<=55){
    i++;
  digitalWrite(motorino, HIGH);
digitalWrite(motorino1, LOW); 
digitalWrite(motorino2, LOW); 
digitalWrite(motorino3, LOW);
delay(10);

  digitalWrite(motorino, LOW);
digitalWrite(motorino1, HIGH); 
digitalWrite(motorino2, LOW); 
digitalWrite(motorino3, LOW); 
delay(10);
  digitalWrite(motorino, LOW); //scrive a destra
digitalWrite(motorino1, LOW); 
digitalWrite(motorino2, HIGH); 
digitalWrite(motorino3, LOW); 
delay(10);
  digitalWrite(motorino, LOW);
digitalWrite(motorino1, LOW); 
digitalWrite(motorino2, LOW); 
digitalWrite(motorino3, HIGH); 
delay(10);

if (i==55){
  while(i<=80){ 
    i++;
    digitalWrite(motorino4, HIGH);
digitalWrite(motorino5, LOW); 
digitalWrite(motorino6, LOW); 
digitalWrite(motorino7, LOW);
delay(10);

  digitalWrite(motorino4, LOW);
digitalWrite(motorino5, HIGH); 
digitalWrite(motorino6, LOW); 
digitalWrite(motorino7, LOW); 
delay(10);
  digitalWrite(motorino4, LOW);
digitalWrite(motorino5, LOW); 
digitalWrite(motorino6, HIGH); 
digitalWrite(motorino7, LOW); //scrive giù
delay(10);
digitalWrite(motorino4, LOW);
digitalWrite(motorino5, LOW); 
digitalWrite(motorino6, LOW); 
digitalWrite(motorino7, HIGH); 
delay(10);

if(i==80){
  
  while (i<=101){
    i++;
      digitalWrite(motorino, LOW);
digitalWrite(motorino1, LOW); 
digitalWrite(motorino2, LOW); 
digitalWrite(motorino3, HIGH);
delay(10);

  digitalWrite(motorino, LOW);
digitalWrite(motorino1, LOW); 
digitalWrite(motorino2, HIGH); 
digitalWrite(motorino3, LOW); 
delay(10);
  digitalWrite(motorino, LOW);
digitalWrite(motorino1, HIGH); 
digitalWrite(motorino2, LOW);  //scrive a sinistra
digitalWrite(motorino3, LOW); 
delay(10);
  digitalWrite(motorino, HIGH);
digitalWrite(motorino1, LOW); 
digitalWrite(motorino2, LOW); 
digitalWrite(motorino3, LOW); 
delay(10);
if(i==101){ 
  while (i<=121){
    i++;
 digitalWrite(motorino, HIGH);
digitalWrite(motorino1, LOW); 
digitalWrite(motorino2, LOW); 
digitalWrite(motorino3, LOW);
delay(10);

  digitalWrite(motorino, LOW);
digitalWrite(motorino1, HIGH); 
digitalWrite(motorino2, LOW); 
digitalWrite(motorino3, LOW); 
delay(10);
  digitalWrite(motorino, LOW); //scrive a destra
digitalWrite(motorino1, LOW); 
digitalWrite(motorino2, HIGH); 
digitalWrite(motorino3, LOW); 
delay(10);
  digitalWrite(motorino, LOW);
digitalWrite(motorino1, LOW); 
digitalWrite(motorino2, LOW); 
digitalWrite(motorino3, HIGH); 
delay(10); 
   if(i==121){
     while (i<=146){
       i++;
digitalWrite(motorino4, HIGH);
digitalWrite(motorino5, LOW); 
digitalWrite(motorino6, LOW); 
digitalWrite(motorino7, LOW);
delay(10);

  digitalWrite(motorino4, LOW);
digitalWrite(motorino5, HIGH); 
digitalWrite(motorino6, LOW); 
digitalWrite(motorino7, LOW); 
delay(10);
  digitalWrite(motorino4, LOW);
digitalWrite(motorino5, LOW); 
digitalWrite(motorino6, HIGH); 
digitalWrite(motorino7, LOW); //scrive giù
delay(10);
digitalWrite(motorino4, LOW);
digitalWrite(motorino5, LOW); 
digitalWrite(motorino6, LOW); 
digitalWrite(motorino7, HIGH); 
delay(10);
if (i==146){ delay(1000000);
}}}}}}}}}}}}}

esiste un altro modo software per aumentare la precisione del motore 2(motorino 4,5,6,7)?
grazie mille e scusate per la lunghezza del post xD
P.s. ho letto che c’è un’altra combinazione in binario per scrivere( questo che uso è 8,4,2,1) e che serve proprio per diminuire i passi ma aumenta la precisione però non funge.

tanto per cominciare racchiudi quelle digitalWrtite in funzioni come sinistra() destra() ect..

poi i passo passo lavorano a passi, quindi sta a te ascoltare il numero di passi che il motore fa. Così hai una precisione perfetta, salvo chje il motore non salti passi, il che però è un grosso problema meccanico, vuol dire che il motore che usi non è abbastanza potente e si sta spaccando.

dovresti anche racchiudere il codice negli appositi tag, usa il pulsante con il # quando scrivi il codice
[ code]
codice
[/ code]

ho messo uno spazio per far vedere come fare, lo spazio naturalmente non ci deve essere

Lo sketch è un classico programma per movimentare uno stepper unipolare.

Anziché attivare un avvolgimento alla volta, puoi usare la tecnica del "mezzo passo" (half step)

Condizione per farlo, però, è quella di avere uno stepper a 6 fili.

www.cyberhs.it/Robotica/motori.htm

Come detto puoi pilotare il motore a mezzi passi avendo di conseguenza un passo piú piccolo. Non aumenta la precisione perché quella é data dalla meccanica del braccio, dal eventuale ingranaggio e dalle atri parti meccaniche che trasmettono la rotazione del motore a un moto del braccio.

Ciao Uwe

Si avete ragione...mi conviene cambiare i motorini dato che non ce la fanno e comunque ho provato la "tecnica" del mezzo passo ma i motori sono così deboli che la differenza dal passo normale non si vede! grazie per il vostro tempo :smiley: