Robot esapode con molti servi ; software

Chiuso il cofano dell insetto ! E venuta l ora di ispirargli la vita , :joy: si comincia !

ragazzi ..buogiorno sto cercando di mettere insieme uno strafalcione di codice che mi permetta di alzarsi sulle sue 6 zampe contemporaneamente , per il momento mi basterebbe solo quello :smiley: per vedere l effetto che fa !!
in pratica sto cercando di collegare insieme stralci di codice e sistemarci i gradi dei miei servi e le uscite appropriate delle due adafruit , ora la domanda ,chiedo venia in anticipo :face_with_peeking_eye: vi posto un codice che ho aggiustato in base alle mie non competenze che sarebbe ancora da aggiustare nei gradi di ogni singola uscita delle adafruit ..secondo voi quanto è giusto qua dentro ? i servo sono 19 .

#include <Wire.h>

#include <Adafruit_PWMServoDriver.h>

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
Adafruit_PWMServoDriver pwm1 = Adafruit_PWMServoDriver(0x41);

#define SERVOMIN 125
#define SERVOMAX 600

int servonum = 0;


void setup() {

  Serial.begin(9600);

  Serial.println("18 channel Servo test!");

  pwm.begin(9600);

  pwm.setPWMFreq(60);

  delay(10);
}

void loop() {
  pwm.setPWMFreq(60);
  pwm.setPWM(0, 0, 214);
  pwm.setPWM(1, 0, 214);
  pwm.setPWM(2, 0, 214);
  pwm.setPWM(3, 0, 214);
  pwm.setPWM(4, 0, 214);
  pwm.setPWM(5, 0, 214);
  pwm.setPWM(6, 0, 214);
  pwm.setPWM(7, 0, 214);
  pwm.setPWM(8, 0, 214);
  pwm.setPWM(9, 0, 214);
  pwm.setPWM(10, 0, 214);
  pwm.setPWM(11, 0, 214);
  pwm.setPWM(12, 0, 214);
  pwm.setPWM(13, 0, 214);
  pwm.setPWM(14, 0, 214);
  pwm.setPWM(15, 0, 214);

  pwm1.begin();
  pwm1.setPWMFreq(60);
  pwm1.setPWM(0, 1, 214);
  pwm1.setPWM(1, 1, 214);
  pwm1.setPWM(2, 1, 214);
  

if (servonum > 18) servonum = 0;


}
digita o incolla il codice qui

... fosse anche per una sola riga, come richiesto al punto 7 del REGOLAMENTO, il codice va racchiuso tra i tag CODE, per cui, cortesemente edita il tuo post qui 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 <code/> 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 farlo al più presto. :wink:

ma come si fa ??
ho seguito le indicazioni di Guglielmo ..piu di cosi !! è gia identato nn si modifica ulteriormente .. è formattato automaticamente ! spiegatemi nn capisco

... ma cosa? Il post #2 ora mi sembra corretto ... tag CODE messi, codice indentato ... cosa altro vuoi fare?

Guglielmo

O ma Guglielmo !! :joy: Da quando sono arrivato ho un santo protettore !! Sembrava che fossi destinato all espulsione con cartellino rosso dopo due ammonizioni e poi d un tratto !! ...:rofl: Adesso mi son salvato di nuovo !!.. ma son proprio baciato !! Ahahahaha :grin: ciao Guglielmo .. buonaserata .. imparero' ee !!:grinning:

Emm ... magari comincia con lo studiare il ciclo for che ...
... secondo me, semplifichi un po' il codice :wink:

Guglielmo

Mi sembra anche strano che vada tutto nel loop...

P.S.: ogni volta che leggo il titolo della discussione, per un attimo leggo "Robot esplode con molti servo"! :smile:

Ciao Datman ahahahqhq​:joy: se ti dicessero fai una torta per un matrimonio .. sai quelle a tanti piani ..!:grin: Da che parte cominceresti ? Magari cercheresti prima i cerchi ? :grin: O forse la piantana ? Cosi guadagneresti tempo :rofl: magari trovi la ricetta della nonna in qualche baule ahahha :joy: ee io sono messo uguale !! .. nel senso che ci sto pensando neo frattempo sfoglio un sacco di codici .. libri .. ... Oggi mi ci metto ! Se vedete brillare un sole in piu !! E il robot in orbita !!:rofl: Vqbbe dai seriamente .. ce nessuno che puo suggerirmi un loop un pochino a posto ? Gliene sarei grato ..! Piu che altro qualcosa per iniziare poi piano piano me lo correggo modifico .. giusto per capire quali sono le cose piu sostanziali !! Grazie comunque ragazzi ciao Datman :grinning:

... mah, per quel poco che hai scritto, il suggerimento te l'ho già dato al post #9 :roll_eyes:

Guglielmo

Io ti suggerisco di concentrarti su una sola gamba. Da quel che scrivi nel post dove avete parlato dell'hardware, ogni zampa ha 3 snodi [anca][femore][tibia].
Ma rispetto ai numeri che devi usare nel comando setPWM() sai quali numeri usare ?
questi ad esempio sono i tre snodi della prima zampa ?

pwm.setPWM(0, 0, x);  // anca 1 ??
pwm.setPWM(1, 0, x);  // femore 1 ??
pwm.setPWM(2, 0, x);  // tibia 1 ??

E che valore devi dare a x per alzarlo ? Mi pare che il primo snodo (anca) non debba muoversi.

Io suggerirei anche una attenta lettura dei sorgenti della libreria, perchè mi sembra che tu abbia scritto cose a caso, tipo:

Se guardiamo il prototipo della funzione:

bool Adafruit_PWMServoDriver::begin(uint8_t prescale)

Quindi quel 9600 è ovviamente errato, il valore non dovrebbe essere maggiore di 255 per essere valido. Ancora più grave, passando il parametro si abilita di fatto il clock esterno per il chip, e se tale clock non è presente mi sa che non funziona proprio.
Poi ci sarebbe il pwm1.begin() e pwm1.setPWMFreq() messi nel loop(), quando dovrebbero stare nel setup().
Da ultimo, ma non meno importante, la gestione del setPWM, che, per quanto conosco io i servo (poco) non è un semplice valore a salire o scendere, come fareste per il controllo di velocità di un motore CC, ma un pò più complesso .

Ciao, Ale.

Innanzitutto sono onorato di aver l intervento di persone di cui "leggendo molti post sul forum " ho visto impegnate in casi parecchio piu complicati del mio a dare opinioni in modo molto competente quindi si .. rispondo a Guglielmo ..sto aspettando quel libro che mi avevi consigliato .. perche quelli che ho sono orientati ai compiuter ..a me serve qualcosa che sia molto vicino all hardware con cui ora posso sporcarmi le mani !! Soprattutto perche adesso sto e ho il tempo di rimettermi un po in discussione .. con la passione che ho sempre avuto molto forte !! ..poi rispondendo a Nid69ita .. si certo che so come impostare i gradi dei 18 servo !! Uno ad uno molto dettagliatamente !! Li ho preventivamente sistemati meccanicamente dopo averli impostati sulla posizione di riposo/partenza uno dopo l altro ! Curandomi anche del senso di rotazione rispetto allo 0/180 ..che cambia se li installi a dx o a sx !! Tutto dettagliato ! Nid.. grazie per la domanda .. e l intervento di Guargua e' a ragione ! Perche e' un codice che ho copiato in giro sicuramente non appropriato all uso che devo farne io .. .. ma comunque grazie a questo codice " per sbagliato che sia " io vorrei riuscire a fare o trovare un codice dove siano chiari e manipolabili i tempi o i gradi di tutti i servi ! .. perche si che anche altri mi hanno proposto un array ma adesso sinceramente ..sono un po alle prime armi con il codice .. avrei bisogno una cosina semplice da manipolare e "vedere anche come si comportano i servi la struttura.. i sensori ..! Ragazzi vi ringrazio davvero tutti per il vostro intervento ! Sono contento d esser qua ..grazie !

quindi, invece di pensare "al tutto", pensa ai vari pezzetti di codice. Concentrati su UNA zampa.
Scrivi un codice che fa alzare la gamba 1 e poi un codice che la fa abbassare dopo 2 secondi anche con un brutale delay(2000). Provalo, e poi postalo quando ti funziona.
Poi potremo pensare di "duplicare" l'alza/abbassa per le varie zampe

E' precisamente questo che voglio fare .. ma devo trovare un un codice che passi neccessariamente dalle adafruit, a quel punto e' evidente che debba essere ...anche un piccolo codice .. ma manipolabile ..tipo quel loop che saggiamente guargua dice che sia sbagliato essere nel loop !! .. comunque adesso sono qui e ci provo !! .. grazie mille Nid !!:grinning:

Allora, intanto leggi, se già non lo sai, come funzionano i servo. Se vedi, tutto si basa sulla lunghezza dell'impulso inviato, con 1.5 ms il servo è a "riposo", cioè in posizione 90°, portando l'impulso a 1ms il servo si posiziona a 0°, con 2 ms si porta a 180°. Questa è l'escursione totale (teorica) del servo. Assumiamo una frequenza "standard" di 50 hz, la durata quindi del ciclo pwm sarà di 20 ms. Il chip che usi accetta vali di PWM a 12 bit, cioè nel range 0-4095. Se dividiamo i 20 ms per 4095 otteniamo 0,00488 che arrotonderemo a 0,005, cioe 5 us (microsecondi). Questa è la durata minima dell'impulso ottenibile. Per ottenere quindi la posizione 0° abbiamo visto che l'impulso dovrà essere di 1 ms, che equivale a 1000 us, quindi il valore desiderato diventa 1000 / 5 = 200, per 1.5 ms 1500 / 5 = 300 e per i 2 ms del 180° 2000 / 5 = 400.
Ora abbiamo quasi tutto il necessario, conoscendo gli estremi possiamo tentare di usare la funzione map() per ottenere i valoro intermedi, tipo:

pwm = map(gradi,0,180,200,400);

Fai un po di prove e vedi se i ragionamenti tornano, poi ci risentiamo.

Ciao, Ale.

1 Like

Direi qualcosa del genere:

#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
Adafruit_PWMServoDriver pwm1 = Adafruit_PWMServoDriver(0x41);

#define SERVOMIN 200
#define SERVOMAX 400
#define K_FEMORE_6 1

int gradi,impulso;

void setup() 
{ delay(1000); 
  Serial.begin(9600);
  Serial.println("18 channel Servo test!");
  pwm.begin();
  pwm1.begin();
  pwm.setPWMFreq(60);
  pwm1.setPWMFreq(60);
  delay(10);
}

void loop()
{ gradi=0;
  impulso=map(gradi,0,180,SERVOMIN,SERVOMAX);
  pwm.setPWM(K_FEMORE_6, 0, impulso);  // femore 6 ??
  delay(2000);
  gradi=90;
  impulso=map(gradi,0,180,SERVOMIN,SERVOMAX);
  pwm.setPWM(K_FEMORE_6, 0, impulso);  // femore 6 ??
  delay(2000);
}
1 Like

ma lo provo subitooo !! :grin:

Wuauu Nid sei un grande !! :grinning: Mi hai rimesso in carreggiata !! Grandee !! Funziona !! E da correggere e da modificare ma almeno funziona .. ! Ero pronto a staccare l usb .. e difatti !! E' partito in tromba il femore 6 ..essendo tutto montato su un piccolo cavalletto per fortuna e' andata giu sotto il " livello " .. ma non ce problema !! Innanzi tutto ho potuto constatare che ha una forza eccezionale !! Non trema !! E risponde immediatamente !! Grande cosa Nid :grin: :+1: ti ringrazio tanto davvero !! .. sei stato molto gentile e premuroso ad aiutarmi ! Te ne sono grato Nid ! Ero arenato ..adesso ho una rampa di lancio !! Grazie un milione !! :grin::+1::joy:

Appena saro riuscito a moderare e limitare il movimento e a portarlo sulla zampa 1 ti posto un video Nid