Controllo servomotori con potenziometro ed arduino BRACCIO MECCANICO

Salve, sto facendo un braccio meccanico con 4 servomotori, 3 mobilità + il mini servo per la mano, utilizzo dei potenziometri da 10k, uno per servo quindi 4. Il tutto è collegato ad arduino con alimentazione da presa usb poichè devo utilizzare un servo alla volta.
Ho stillato questo programmino, preso da una base trovata su questo forum:

#include <Servo.h>


Servo myservo; // Crea l'oggetto servo
Servo myservo2;
Servo myservo3;
Servo myservo4;
int triggerPin = A0;  // Pin analogico per il potenziometro
int triggerPin = A1;
int triggerPin = A2;
int triggerPin = A3; 

void setup() 
{ 
  myservo.attach(9); // Attacca l'oggetto servo al pin 9
  myservo2.attach(10);
  myservo3.attach(11);
  myservo4.attach(6);
  pinMode(triggerPin,INPUT); // Imposto il potenziometro come input
}

void loop() 
{ 
  int posizione = analogRead(triggerPin); // Leggo il potenziometro
  int gradi = calcolaRotazione(posizione); // Converto in gradi
  myservo.write(gradi); // Faccio muovere il servo
  myservo2.write(gradi)
  myservo3.write(gradi)
  myservo4.write(gradi)
}

int calcolaRotazione(int posToDeg)
{
  // Converte la lettura del potenziometro (da 0 a 1023) in gradi
  return (map(posToDeg,0,1023,0,180));
}

è giusto? Non ho ancora la possibilità di testarlo ]:smiley: ]:smiley:

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento se non lo hai già fatto: Regolamento
Qui una serie di link utili, non inerenti al tuo problema:

Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare ( pulsante </> ).
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.

pinMode(triggerPin,INPUT); // Imposto il potenziometro come input

e gli altri 3 potenziometri?

Alcuni servo possono assorbire oltre 300mA alla partenza: ti conviene pensare da subito ad una alimentazione esterna.

Non comprendo perché hai inserito dei potenziometri, visto che conosci con i servo la posizione angolare.

int triggerPin = A0;  // Pin analogico per il potenziometro
int triggerPin = A1;
int triggerPin = A2;
int triggerPin = A3;

questi sono gli input di arduino per i 4 potenziometri.. rispettivamente il pin a0,a1,a2 ed a3, uno per potenziometro..

Utilizzo i potenziometri in quanto mi danno la possibilità di controllare istantaneamente la posizione dei servo, altrimenti dovrei creare o un loop che quindi non fa al caso mio, o attraverso il monitor seriale fornire i vari comandi magari da tastiera, ma non otterrei un movimento regolare con l'input, per capirci, il movimento e lo "stop" del servo al pressare e al rilascio del tasto.

Per quanto riguarda l'alimentazione verificherò, anche se provando il servo con un loop della libreria arduino non ho avuto problemi, comunque il data sheet del servo riguarda la potenza è questa:

Power requirements: 4 to 6 VDC*; Maximum current draw is 140 +/- 50 mA at 6 VDC when operating in no load conditions, 15 mA when in static state

consigli sono ben accetti 8)

leleallariscossa: int triggerPin = A0;  // Pin analogico per il potenziometro int triggerPin = A1; int triggerPin = A2; int triggerPin = A3;

questi sono gli input di arduino per i 4 potenziometri.. rispettivamente il pin a0,a1,a2 ed a3, uno per potenziometro..

Appunto. Ma tu nel codice ne dichiari solo uno come input (era questo che cyberhs voleva farti notare):

pinMode(triggerPin,INPUT); // Imposto il potenziometro come input

E poi ne leggi solo uno, nel codice. E gli altri devi ancora implementarli o te ne sei dimenticato?

Appunto. Ma tu nel codice ne dichiari solo uno come input (era questo che cyberhs voleva farti notare):

pinMode(triggerPin,INPUT); // Imposto il potenziometro come input

E poi ne leggi solo uno, nel codice. E gli altri devi ancora implementarli o te ne sei dimenticato?

Semplicemente ho poca esperienza di programmazione ahahah

Dato che devo utilizzare un servo alla volta pensavo di inserire un solo input, preso da uno dei 4 pin analogici, in base al potenziometro che volevo usare, quindi di conseguenza anche un solo pinMode ma evidentemente devo impostarne uno per ogni potenziometro da come mi dite.. Come faccio? Devo modificare anche le variabili degli input analogici dei potenziometri? Visto che sono tutti in Int triggerpin.. Per capirci, ci sarebbero altri 3 pinMode(triggerPin,INPUT); // Imposto il potenziometro come input visto che le variabili iniziali non hanno alcuna differenza di nome..

nessuna delucidazione? =(

ciao I triggerPin son 4 quindi devi avere 4 nomi diversi:

int triggerPin = A0;  // Pin analogico per il potenziometro
int triggerPin2 = A1;
int triggerPin3 = A2;
int triggerPin4 = A3;

sposta la definizione di gradi e posizione prima del setup:

int posizione;
int gradi;

quando vai a leggere il valore del pin devi farlo per tutti e 4, leggi 2 volte lo stesso ingresso e non considerare la prima lettura:

posizione = analogRead(triggerPin); // Leggo il potenziometro
posizione = analogRead(triggerPin); // Leggo il potenziometro
gradi = calcolaRotazione(posizione); // Converto in gradi
myservo.write(gradi); // Faccio muovere il servo
posizione = analogRead(triggerPin2); // Leggo il potenziometro
posizione = analogRead(triggerPin2); // Leggo il potenziometro
gradi = calcolaRotazione(posizione); // Converto in gradi
myservo2.write(gradi); // Faccio muovere il servo
...

ciao pippo72

Ciao pippo sei stato molto gentile come gli altri qui sopra :smiley: ho fatto le modifiche che mi hai consigliato (o imposto… vedi tu :sunglasses: ) e questo è il codice completo. Fatto giusto? Proverò appena possibile se funziona!

#include <Servo.h>


Servo myservo; // Crea l'oggetto servo
Servo myservo2;
Servo myservo3;
Servo myservo4;

int triggerPin = A0;  // Pin analogico per il potenziometro
int triggerPin2 = A1;
int triggerPin3 = A2;
int triggerPin4 = A3;

int posizione;
int gradi;

void setup() 
{ 
 myservo.attach(9); // Attacca l'oggetto servo al pin 9
 myservo2.attach(10);
 myservo3.attach(11);
 myservo4.attach(6);
 pinMode(triggerPin,INPUT); // Imposto il potenziometro come input
pinMode(triggerPin2,INPUT); // 
pinMode(triggerPin3,INPUT); // 
pinMode(triggerPin4,INPUT); // 
}

void loop() 
{ 
posizione = analogRead(triggerPin); // Leggo il potenziometro
posizione = analogRead(triggerPin); // Leggo il potenziometro
gradi = calcolaRotazione(posizione); // Converto in gradi
myservo.write(gradi); // Faccio muovere il servo
posizione = analogRead(triggerPin2); // Leggo il potenziometro
posizione = analogRead(triggerPin2); // Leggo il potenziometro
gradi = calcolaRotazione(posizione); // Converto in gradi
myservo2.write(gradi); // Faccio muovere il servo
posizione = analogRead(triggerPin3); // Leggo il potenziometro
posizione = analogRead(triggerPin3); // Leggo il potenziometro
gradi = calcolaRotazione(posizione); // Converto in gradi
myservo3.write(gradi); // Faccio muovere il servo
posizione = analogRead(triggerPin4); // Leggo il potenziometro
posizione = analogRead(triggerPin4); // Leggo il potenziometro
gradi = calcolaRotazione(posizione); // Converto in gradi
myservo4.write(gradi); // Faccio muovere il servo
}

int calcolaRotazione(int posToDeg)
{
 // Converte la lettura del potenziometro (da 0 a 1023) in gradi
 return (map(posToDeg,0,1023,0,180));
}

ciao

ho fatto le modifiche che mi hai consigliato (o imposto.. vedi tu :sunglasses: )

io non impongo ma consiglio (e senza nessuna garanzia :smiling_imp: )

Fatto giusto?

fatto giusto... SI.

Proverò appena possibile se funziona!

Fammi sapere se va. ciao pippo72

pippo72: ciaoio non impongo ma consiglio (e senza nessuna garanzia :smiling_imp: )fatto giusto... SI.Fammi sapere se va. ciao pippo72

funziona! :D il servo riceve gli impulsi un pò "a scattini" lasciando il potenziometro "fermo", ma non si muove ed il movimento è fluido al variare della posizione del potenziometro.. Penso siano i cavi traballanti in quanto ho fatto delle prove veloci, fra qualche giorno provo con bredboard e saldature varie, aggiorno qui 8)

Riscrittura dello sketch più elegante e funzionale (da provare).

#include <Servo.h>

#define Servo1Pin     9
#define Servo2Pin     10
#define Servo3Pin     11
#define Servo4Pin     6

#define Trimmer1Pin   A0
#define Trimmer2Pin   A1
#define Trimmer3Pin   A2
#define Trimmer4Pin   A3

#define Letture       10

Servo Servo1; // Crea l'oggetto servo
Servo Servo2;
Servo Servo3;
Servo Servo4;

int posizione;

void setup() { 
  Servo1.attach(Servo1Pin); // Attacca l'oggetto servo al pin 9
  Servo2.attach(Servo2Pin);
  Servo3.attach(Servo3Pin);
  Servo4.attach(Servo4Pin);

  pinMode(Trimmer1Pin, INPUT); // Imposto il potenziometro come input
  pinMode(Trimmer2Pin, INPUT);
  pinMode(Trimmer3Pin, INPUT);
  pinMode(Trimmer4Pin, INPUT); 
}

void loop() { 
  Servo1.write(Gradi(Trimmer1Pin)); // Faccio muovere il servo
  Servo2.write(Gradi(Trimmer2Pin)); // Faccio muovere il servo
  Servo3.write(Gradi(Trimmer3Pin)); // Faccio muovere il servo
  Servo4.write(Gradi(Trimmer4Pin)); // Faccio muovere il servo
}

int Gradi(byte Pin) {
  int Somma = 0;
  for (byte I = 0; I < Letture; I ++) {
    Somma += analogRead(Pin); 
  }
  Somma /= Letture;  // media letture
  return (map(Somma, 0, 1023, 0, 180));
}