Domanda:
Arduino Servo non si muoverà durante l'utilizzo delle classi
Francisco Presencia
2014-08-07 00:30:42 UTC
view on stackexchange narkive permalink

Sto cercando di far funzionare una classe con Arduino, tuttavia non sembra attivarsi correttamente. Il codice si sta compilando perfettamente e dovrebbe controllare la gamba di un esapodo . Inoltre, lo sweep di esempio funziona su questo servo, quindi nessun problema qui. Tuttavia, il servo non si muove effettivamente. Penso che abbia qualcosa a che fare con l'ordine di dichiarazione delle variabili:

  #include <Servo.h> // Astratta ogni gamba, quindi è possibile accedere solo a quelle funzioni class Leg {// Actions che può essere attivato da un pubblico esterno: Leg (int hipPin, int kneePin); void up (); // Dovrebbero essere disponibili solo per la gamba privata: Servo hip; Ginocchio servo; }; Leg :: Leg (int hipPin, int kneePin) {hip.attach (hipPin); knee.attach (kneePin); } // Testare la gamba: spostala verso l'altovoid Leg :: up () {for (int pos = 0; pos < 180; pos + = 1) {hip.write (pos); ritardo (15); }} // Inizializza legLeg topLeft (9, 10); void setup () {} // Prova la funzione up () void loop () {topLeft.up (); }  

Sto testando solo il pin 9 (lasciando il 10 vuoto). sembra dolorante , il che significa che puoi vedere il servo tremare ma non muoversi realmente a 0 gradi.

Nota: domanda simile [a questa] (http://stackoverflow.com/q/18160980/938236), ma poiché la soluzione non ha funzionato per me, presumo che non sia lo stesso problema. Qualsiasi aiuto per il debug è anche il benvenuto (:
La stessa configurazione funziona con lo stesso pin quando provi solo il codice del servo dell'anca fuori dalla classe? Il problema si verifica solo quando il codice è all'interno della classe Leg?
Il tuo problema potrebbe essere simile a questa domanda: http://arduino.stackexchange.com/questions/830/timer2-does-not-work-as-it-should
Una risposta:
jfpoilpret
2014-08-07 03:11:18 UTC
view on stackexchange narkive permalink

Sembra che questo problema possa essere dovuto a un cattivo ordine delle chiamate agli inizializzatori per le variabili globali.

In C ++, l'ordine di inizializzazione delle variabili globali è imprevedibile tra le diverse unità di compilazione (cioè i file sorgente C ++, non l'intestazione File). L'ordine di inizializzazione viene rispettato solo all'interno di un'unità di compilazione.

Nel tuo programma ci sono diverse variabili globali che, se inizializzate nell'ordine sbagliato, falliranno nel tuo programma:

  • Leg topLeft; questa è l'istanza della tua classe
  • servo_t servos [MAX_SERVOS]; , int8_t Channel [_Nbr_16timers ]; e uint8_t ServoCount = 0; tutti definiti in Servo.cpp

Chiamando Servo.attach () richiede che le 3 variabili sopra siano già state inizializzate, cosa di cui non puoi essere sicuro.

Come puoi risolvere questo problema?

Non eseguendo il attach () nel costruttore Leg ma delegandolo a una sorta di metodo init () che puoi chiamare da setup () :

  class Leg {// Azioni che possono essere attivate dall'esterno del pubblico: void init (int hipPin, int kneePin); void up (); // Dovrebbero essere disponibili solo per la gamba privata: Servo hip; Servo ginocchio;}; Leg :: init (int hipPin, int kneePin) {hip.attach (hipPin); knee.attach (kneePin);} // Testare la gamba: spostala suvoid Leg :: up () {for (int pos = 0; pos < 180; pos + = 1) {hip.write (pos); ritardo (15); }} // Dichiara legLeg topLeft; void setup () {// Initialize the leg topLeft.init (9, 10);} // Prova la funzione up () void loop () {topLeft.up ();}  
Solo per chiarimento, l'ordine di inizializzazione delle variabili globali non è definito solo tra diverse unità di traduzione. Nella stessa unità di traduzione, è l'ordine delle loro definizioni.
+1 questo è oro, la spiegazione ha appena risolto circa il 100% dei problemi irrisolti che ho mai avuto con arduino e C ++. Grazie, lo proverò quando torno a casa.
@Omer ringrazia per il chiarimento che avevo dimenticato di includere. Ho appena modificato la mia risposta.


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...