Braccio robotico per scuola

Ciao a tutti da poco poco ho comprato un Arduino uno per fare un progetto a scuola. Non ho ancora ancora imparato bene il linguaggio c\c++. Ma per scuola come compito di tecnologia dobbiamo costruire un piccolo braccio robotico. Avevo in mente di utilizzare 1 servo motore e 1 motore Stepper. Si posso usare questi motori insieme? Volevo poi comandarli con la tastiera. Ho provato con il servo motore e funziona l'unica cosa è che per utilizzarlo con la tastiera ho dovuto scaricarmi un programma perché per comandarlo con il monitor seriale bisogna premere invio per ogni tasto. Quindi ho installato Tera Term per non mi fa connettere alla porta com 3 di Arduino dicendo: accesso negato. Come posso fare? si possono comandare tutti e 2 i motori contemporaneamente anche se sono motori diversi ?
Grazie mille in anticipo e buona serata.

si è possibile.

assicurati di aver chiuso il monitor seriale se provi a utilizzare TeraTerm. Può esistere solo una connessione alla porta COM.


Ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta esso è stato spostato, da un moderatore della sezione di lingua Inglese, nella sezione di lingua Italiana ... la prossima volta potrebbe venire direttamente eliminato

1 Like

@Mark_00:

:warning:
Ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta esso è stato spostato, da un moderatore della sezione di lingua Inglese, nella sezione di lingua Italiana ... la prossima volta potrebbe venire direttamente eliminato. Grazie.

Guglielmo

1 Like

Aggiusta l'indentazione e le virgolette della visualizzazione del codice.
Anche questo ti abitua a essere preciso affinché sia comprensibile e poi tutto funzioni! :slight_smile:

@Mark_00:

Come richiesto al punto 7 del REGOLAMENTO , per favore edita il tuo post poco sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone a forma di piccola matita :pencil2: che si trova in basso del tuo post), seleziona la parte di codice e premi l'icona </> nella barra degli strumenti per contrassegnarla come codice. Inoltre, così com'è, non è molto leggibile ... assicurati di averlo correttamente indentato nell'IDE prima di inserirlo (questo lo si fa premendo ctrlT su un PC o cmd T su un Mac, sempre all'interno del IDE).

Grazie,

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà sistemato il codice come indicato, nel rispetto del regolamento nessuno ti risponderà (eventuali risposte o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farla al più presto. :wink:

Grazie mille dell'aiuto e di avermi fatto notare di aver scritto nella sezione inglese. Ho bisogno ancora di un aiuto. Su TeraTerm dopo che ho schiacciato un pulsante ci mette un pò per ricominciare a partire non è scattante. E' come se non rispondesse subito ai comandi. Come si può modificare la velocità del servomotore ? E poi il motore stepper non capisco perché non funziona. Come posso fare? Allego qua sotto lo sketch. Grazie mille.

#include<Servo.h>
#include<Stepper.h>
int pin_braccio = 13;
long int steps =0;
int incomingByte=0;
char commandbuffer[2];



char val;
int angbraccio;
Servo servo_braccio;
Stepper myStepper(48,6,7,8,9);

void setup() {
  servo_braccio.attach(pin_braccio);
  Serial.begin(9600);
  servo_braccio.write(10);
myStepper.setSpeed(600);
}

void loop() {

  if (Serial.available()) {

    val = Serial.read();

    if (val == 'a') {
      angbraccio +=1;
      servo_braccio.write(angbraccio);
      delay(15);
      val = "";
    }
    if (val == 'd') {
      angbraccio -= 1;
      servo_braccio.write(angbraccio);
      delay(15);
      val = "";

    } 
  }
  if (Serial.available() > 0) {
    
    incomingByte = Serial.read();

 
    Serial.print("Step = ");
    if(incomingByte == 'z'){ 
              myStepper.step(10000);
              steps = steps +10000;
              Serial.println(steps);              
            }
    if(incomingByte == 'x'){ 
              myStepper.step(-10000);
              steps = steps -10000;
              Serial.println(steps);              
            }
    if(incomingByte == 'm'){ 
              myStepper.step(100);
              steps = steps +100;
              Serial.println(steps);              
            }
            if(incomingByte == 'q'){          
              myStepper.step(1000);
              steps = steps +1000;
              Serial.println(steps);              
            }
            if(incomingByte == 'w'){
              myStepper.step(-1000);
              steps = steps -1000;
              Serial.println(steps);              
            }
            if(incomingByte == 's'){
              myStepper.step(-100);
              steps=steps-100; 
              Serial.println(steps);
            }
            if(incomingByte == 'r'){
            steps =0;
            Serial.println(steps);
            }
            
          if(incomingByte != 'r' && incomingByte != 'w' && incomingByte != 's' && incomingByte != 'z' && incomingByte != 'x' && incomingByte != 'a' && incomingByte != 'q'){
            Serial.println("wrong key");
          }
          }
     
}

Fatto.

Ciao. Non sono molto pratico coi motori e non conosco teraterm... Però guardando il programma secondo me conviene sistemare qualcosa.
Prova a fare un unico if Serial.available con dentro sia il sevo che lo stepper, altrimenti rischi di prendere alcune letture.
Inoltre in tutti quegli if converrebbe mettere else if o meglio ancora usate uno switch case.

Edit:
Puoi guardare qui per vedere come funziona else e qui per vedere switch case.

Grazie mille dei consigli. Sono un pò di giorni che vorrei cambiare velocità al movimento del servo ma non so come fare. Mi potreste aiutare ?

Come dicevo sui motori non sono molto ferrato.
Così a intuito per il servo potresti provare a togliere il delay e al limite provare a muovere più di un grado alla volta.
Per info più precise però è meglio che aspetti qualcuno più bravo.

Ho provato e non funziona molto bene. Non so perché tengo premuto il tasto e dopo un po' si blocca e non riparte subito.

Anche io non sono molto pratico di sero e stepper, ma...

  1. Arduino UNO, quindi perchè usi il pin 13 che ha anche il led on board collegato ?
    int pin_braccio = 13; ??? pin del led on board ???
  2. la seriale e teraterm puoi metterla a 115200 che è più veloce (ma non credo serva a molto)
  3. ma tu mandi sempre e solo 1 tasto alla volta ? a,d per il servo z,x,m,q,w,s,r per stepper?
    con due serial read mi pare fai un casotto, come ti han consigliato fa una unica lettura
  4. la velocità del servo non puoi cambiarla. Se è in posizione 45° lo puoi mandare ad esempio a 60° ma la velocità di come raggiunge quella posizione è fissa, mi pare solo per servo digitali costosi puoi regolare la velocità (non sono un esperto).
    Se però come fai tu ad ogni tasto fai +1 grado o -1 grado, la velocità dipende da quanto veloce spedisci i tasti a,d. P.S. dovresti anche verificare di non andare oltre i gradi ammessi dal servo!!
#include<Servo.h>
#include<Stepper.h>

const byte pinBraccio = 13;
long int steps = 0;
char incomingByte = 0;
int angBraccio;
Servo servoBraccio;
Stepper myStepper(48, 6, 7, 8, 9);

void setup() 
{ Serial.begin(115200);
  delay(1000);
  servoBraccio.attach(pinBraccio);
  servoBraccio.write(10);
  myStepper.setSpeed(600);
}

void loop() 
{ if (Serial.available()>0) 
  { incomingByte = (char)Serial.read();
    switch(incomingByte)
    { case 'a': cmdServo(+1); break;
      case 'd': cmdServo(-1); break;
      case 'z': cmdStepper(+10000); break;
      case 'x': cmdStepper(-10000); break;
      case 'm': cmdStepper(  +100); break;
      case 's': cmdStepper(  -100); break;
      case 'q': cmdStepper( +1000); break;
      case 'w': cmdStepper( -1000); break;
      case 'r': cmdStepper(     0); break;
      default:  Serial.println("wrong key");
    }
  }
}

void cmdStepper(int p_inc)
{ myStepper.step(p_inc);
  steps=steps+p_inc;
  Serial.print("Steps: ");
  Serial.println(steps);
}

void cmdServo(int p_inc)
{ angBraccio=angBraccio+p_inc;
  // controllare range angolo 0-180 da fare
  servoBraccio.write(angBraccio);
  Serial.print("Angolo: ");
  Serial.println(angBraccio); 
  //delay(15);
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.