Braccio Robotico memorizzazione sequenze

Ho realizzato un semplice braccio robotico sia in versione servo che con motori passo passo.
Ho visto che c'è la possibilità di pilotare il braccio con dei joystick e poi memorizzare la sequenza di posizioni. Purtroppo non essendo molto esperto di programmazione vorrei sapere se qualcuno può darmi uno sketch che possa quindi memorizzare le sequenze e poi ripeterle.
Grazie

Certamente bisognerebbe vedere il programma

Anzi
I programmi

Dubito che la versione "servo" sia uguale a quella "passo passo"

Cominciamo prima dalla versione servo

Poi ci saranno tanti punti da chiarire, ma cominciamo col vedere il programma

Certo lo sketch dei servi è differente da quello relativo ai passo passo. Comunque sono programmi semplici. Ho visto su you tube alcuni esempi di memorizzazione dei movimenti e sono sketch che hanno tutt'altra impostazione rispetto a quelli che ho realizzato. Se pensi che sia utile li posto ma penso che non serva a molto.Speravo di trovare in rete qualcosa di già funzionante ma quei pochi esempi che ho trovato non sono open source.

Io dico sempre:

Se lo hai visto sul tubo chiedi sul tubo
Chi lo ha fatto saprà consigliare e si prenderà la responsabilità delle sue affermazioni

Se invece vuoi il mio aiuto sai cosa fare

Forse non sono stato chiaro sui filmati si vedeva il processo ma non ti davano accesso alla fonte.Per questo sto chiedendo aiuto. Comunque ora ti posto lo sketch con i servi

include <Adafruit_PWMServoDriver.h>
#include <Servo.h>
 
Servo mioservo1;
Servo mioservo2;
Servo mioservo3;
Servo mioservo4;
Servo mioservo;
int angolo =0;
 
void setup() {
  mioservo.attach(8);
  mioservo1.attach(9); 
  mioservo2.attach(10);
  mioservo3.attach(11);
  mioservo4.attach(12);
}
 
void loop() {
   //Posizione iniziale//
   mioservo.write(90);
   mioservo1.write(110);
   mioservo2.write(50);
   mioservo3.write(90);
   mioservo4.write(20);
   delay(2000);
 
   // inizio presentazione movimenti//

    for(angolo = 110; angolo < 170; angolo += 1)  { 
    mioservo1.write(angolo);
    delay(10);
   }
   delay(2000); 
    
    for(angolo = 10; angolo <  50; angolo += 1)  { 
    mioservo4.write(angolo);
    delay(10);
   }
   delay(2000); 
        
    for(angolo = 50; angolo > 5; angolo -= 1)  { 
    mioservo2.write(angolo);
    delay(10);
   }
   delay(2000);
   
    for(angolo = 50; angolo >  20; angolo -= 1)  { 
    mioservo4.write(angolo);
    delay(10);
   }
   delay(2000);
   
    for(angolo = 5; angolo < 50; angolo += 1) { 
    mioservo2.write(angolo);
    delay(10);
   } 
   delay(2000);
   
   for(angolo = 90; angolo > 10; angolo -= 1) { 
    mioservo.write(angolo);
    delay(10);
   }  
   delay(2000);
   
    for(angolo = 50; angolo > 5; angolo -= 1)  { 
    mioservo2.write(angolo);
    delay(10);
   }
   delay(2000);
   
   for(angolo = 20; angolo <  50; angolo += 1)  { 
    mioservo4.write(angolo);
    delay(10);
   }   
   delay(2000);
   
   for(angolo = 5; angolo < 50; angolo += 1) { 
    mioservo2.write(angolo);
    delay(10); 
   }
   delay(2000);
     for(angolo = 50; angolo >  20; angolo -= 1)  { 
    mioservo4.write(angolo);
    delay(10);
    
   }
   delay(2000);
   
    for(angolo = 10; angolo < 130; angolo += 1) { 
    mioservo.write(angolo);
    delay(30);
   }  
   delay(2000);

   for(angolo = 90; angolo < 180; angolo += 1) { 
    mioservo3.write(angolo);
    delay(10);
}
 delay(2000);
 }
    
   // dimostrazione di rotazione//
   for(angolo = 150; angolo > 120; angolo -= 1) { 
    mioservo.write(angolo);
    delay(20);
   } 
   delay(500);
  
   for(angolo = 120; angolo > 90; angolo -= 1) { 
    mioservo.write(angolo);
    delay(20);
   } 
   delay(500);
  
   for(angolo = 90; angolo > 60; angolo -= 1) { 
    mioservo.write(angolo);
    delay(20);
   }
   delay(500);
  
   for(angolo = 60; angolo > 30; angolo -= 1) { 
    mioservo.write(angolo);
    delay(20);
   }
   delay(500);
  
   for(angolo = 30; angolo > 1; angolo -= 1) { 
    mioservo.write(angolo);
    delay(20);
   }
   delay(2000);
   
   for(angolo = 155; angolo > 35; angolo -= 1) { 
    mioservo.write(angolo);
    delay(40);
   }
   delay(2000);
    
   for(angolo = 30; angolo < 75; angolo += 1) { 
    mioservo3.write(angolo);
    delay(50);
   }
 
   for(angolo = 26; angolo < 150; angolo += 1) { 
    mioservo2.write(angolo);
    delay(10);
   }
   delay(1000);
 
   for(angolo = 85; angolo < 145; angolo += 1) { 
    mioservo1.write(angolo);
    delay(50);
   }
 
   for(angolo = 35; angolo < 155; angolo += 1) { 
    mioservo.write(angolo);
    delay(30);
   }
   delay(1000);
 
   mioservo4.write(150);
   delay(1000);
   mioservo4.write(5);
   delay(1000);
 
   // giro con alzamento braccio//
   for(angolo = 145; angolo > 125; angolo -= 1) { 
    mioservo1.write(angolo);
    delay(40);
  }
  for(angolo = 155; angolo > 125; angolo -= 1) { 
    mioservo2.write(angolo);
    delay(40);
  }
  for(angolo = 150; angolo > 100; angolo -= 1) { 
    mioservo.write(angolo);
    delay(60);
  }
  for(angolo = 125; angolo > 105; angolo -= 1) { 
    mioservo1.write(angolo);
    delay(40);
  }
     
  for(angolo = 125; angolo > 100; angolo -= 1) { 
    mioservo2.write(angolo);
    delay(40);
  }
  for(angolo = 100; angolo > 50; angolo -= 1) { 
    mioservo.write(angolo);
    delay(25);
  }
  for(angolo = 105; angolo > 85; angolo -= 1) { 
    mioservo1.write(angolo);
    delay(40);
  }
  for(angolo = 100; angolo > 75; angolo -= 1) { 
    mioservo2.write(angolo);
    delay(40);
  }
  for(angolo = 50; angolo > 5; angolo -= 1) { 
    mioservo.write(angolo);
    delay(10);
  }
  delay(500);
   
  for(angolo = 5; angolo < 150; angolo += 1) { 
    mioservo.write(angolo);
    delay(30);
  }
  delay(2000);
 
  // riposizionamento //
 
  mioservo.write(150);
  mioservo1.write(85);
  mioservo2.write(35);
  mioservo3.write(35);
  mioservo4.write(5);
   
  // recupero pezzo //
  // angolo di presa pezzo //
   
  for(angolo = 150; angolo > 30; angolo -= 1)  { 
    mioservo.write(angolo);
    delay(25);
  }
  delay(500);
  for(angolo = 35; angolo < 75; angolo += 1) { 
    mioservo3.write(angolo);
    delay(25);
  }
  delay(500);
  for(angolo = 35; angolo < 150; angolo += 1) { 
    mioservo2.write(angolo);
    delay(25);
  }
   
  // abassamento braccio //
  for(angolo = 85; angolo < 149; angolo += 1) { // angolo abbassa// 
    mioservo1.write(angolo);
    delay(40);
  }
  delay(500);
   
  mioservo4.write(150);
  delay(1000);
  for(angolo = 75; angolo < 95; angolo += 1) { 
    mioservo3.write(angolo);
    delay(30);
  }
  delay(500);
  mioservo4.write(16);   // gradi presa  //
  delay(500);
 
  // rialzamento braccio //
  for(angolo = 149; angolo > 105 ; angolo -= 1) { 
    mioservo1.write(angolo);
    delay(30);
  }
  for(angolo = 150; angolo > 120; angolo -= 1) { 
    mioservo2.write(angolo);
    delay(30);
  }
  for(angolo = 95; angolo > 80; angolo -= 1) { 
    mioservo3.write(angolo);
    delay(30);
  }
  for(angolo = 120; angolo > 100; angolo -= 1) { 
    mioservo2.write(angolo);
    delay(40);
  }
  for(angolo = 80; angolo > 50; angolo -= 1) { 
    mioservo3.write(angolo);
    delay(30);
  }
  for(angolo = 100; angolo > 70; angolo -= 1) { 
    mioservo2.write(angolo);
    delay(40);
  }
  for(angolo = 50; angolo > 35; angolo -= 1) { 
    mioservo3.write(angolo);
    delay(30);
  }
   
  // rotazione //
  for(angolo = 30; angolo < 128; angolo += 1) { 
    mioservo.write(angolo);
    delay(30);
  }
  // abbassamento pezzo //
   
  delay(1000);
  for(angolo = 70; angolo < 100; angolo += 1) { 
    mioservo2.write(angolo);
    delay(40);
  }
  for(angolo = 35; angolo < 100; angolo += 1) { 
    mioservo3.write(angolo);
    delay(30);
  }
  for(angolo = 100; angolo < 130; angolo += 1) { 
    mioservo2.write(angolo);
    delay(40);
  }
  for(angolo = 105; angolo < 130; angolo += 1) { 
    mioservo1.write(angolo);
    delay(40);
  }
  delay(1000);
  mioservo4.write(150);
  delay(1000);
 
  for(angolo = 100; angolo > 35; angolo -= 1) { 
    mioservo3.write(angolo);
    delay(2);
  }
  for(angolo = 130; angolo > 85; angolo -= 1) { 
    mioservo1.write(angolo);
    delay(25);
  }
  for(angolo = 130; angolo > 33; angolo -= 1) { 
    mioservo2.write(angolo);
    delay(25);
  }
  delay(1000);

   //Posizione finale//
   mioservo.write(90);
   mioservo1.write(85);
   mioservo2.write(77);
   mioservo3.write(75);
   mioservo4.write(5);
   delay(20000);
 
}`

Questo è lo sketch dei servo come vedi devi impostare i movimenti direttamente dal programma.

Ah

ma hai solo un demo che muove su punti preprogrammati
quindi non hai un programma che permette di muovere il braccio usando dei joystick

questo non lo avevi scritto, sembrava che invece tu avessi un programma di movimentazione del manipolatore

lo devi scrivere, sei capace?
hai qualche idea?

i joystick li hai?
li hai già usati?
sai come usarli

oppure preferisci programmare come sugli OTC, con una bottoniera?

Si ho usato i joystick ma al momento non trovo lo sketch relativo.Ho ristrutturato il PC e non ricordo dove ho messo alcuni file appena lo trovo te lo invio.

Cosa sono gli OTC ?

dovremo partire da quello...

una marca di robot...

ma tu come pensavi di pilotarlo il braccio?

/**
* Source code:
* https://www.italiantechproject.it/progetti-arduino/braccio-robotico
*/

#include <Adafruit_PWMServoDriver.h>
 
#define JOYSTICK1_X_PIN A1
#define JOYSTICK1_Y_PIN A0
#define JOYSTICK2_X_PIN A3
#define JOYSTICK2_Y_PIN A2
#define THRESHOLD 30
#define SERVO_MIN 150
#define SERVO_MAX 600 
 
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
 
float positions[4] = {60, 140, 85, 100}; // RIGHT, TOP, BOTTOM, LEFT
 
void setup() {
  pwm.begin();
  pwm.setPWMFreq(60);
}
 
void loop() {
  moveServo(0, analogRead(JOYSTICK2_X_PIN), true);
  moveServo(1, analogRead(JOYSTICK2_Y_PIN), false);
  moveServo(2, analogRead(JOYSTICK1_Y_PIN), false);
  moveServo(3, analogRead(JOYSTICK1_X_PIN), true);
  delay(50);
}
 
void moveServo(int index, int value, bool reverse) {
  if (abs(value - 512) > THRESHOLD) {
    float delta = (float) (value - 512) / 100;
    if (reverse) {
      positions[index] -= delta;
    } else {
      positions[index] += delta;
    }
    positions[index] = constrain(positions[index], 0, 179);
  }
  
  int pulse = map(positions[index], 0, 179, SERVO_MIN, SERVO_MAX);
  pwm.setPWM(index, 0, pulse);
}

Trovato questo è il codice con i joystick ora come detto dopo aver eseguito una sequenza con i joystick vorrei memorizzare i parametri in un file e poi eseguirlo quando voglio.

Ma io una cosa non capisco:

Il primo braccio era a 5 assi
Questo a 4

Sicuro sei ?

Anche lo hardware di controllo dei servo è differente

Direi che prima metti a posto bene la parte fisica, poi si parla del programma

Come in un file?

È la prima volta che parli di file...

Hai un modulo SD?
Sai usarlo?

Vale questa ultima versione le altre erano test di prova.Questa ultima è quella in uso

Ho detto file genericamente ma possiamo memorizzare i dati anche sulla memoria di arduino.

Per me è sufficiente memorizzare una sequenza per volta, non sono molti byte

Quindi un 4 assi con 2 joystick

Ok, non è difficile

Vediamo di capire cosa vuoi

Per programmare un nuovo punto della sequenza va bene premere un pulsante?

Quanti punti vuoi per una sequenza?

La sequenza va ripetuta di continuo o solo a comando?

Ci deve essere un tempo di attesa tra un punto e il successivo?

Per separare il modo 'programmazione' dal modo 'esecuzione' va bene un deviatore?

Sai fare il de-bounce dei pulsanti?

Punto primo potrebbe andar bene un pulsante se ci rende la vita piu facile. A me piacerebbe eseguire la sequenza con i joystick in modo fluido e continuo ma se complica le cose usiamo i pulsanti.
Punto secondo al massimo avrò bisogno di dieci sequenze
Punto terzo una volta memorizzata la sequenza e avviata deve avvenire tutto senza pause o al massimo con qualche secondo di pausa.
Il deviatore è perfetto quanto al de-bounce forse ho visto qualcosa ma spiegamelo se puoi.

PS Una volta avviata la sequenza procede di continuo iniziando di nuovo dal primo step salvo fermarla con un comando ad hoc