Ich versuche, eine Klasse mit Arduino zum Laufen zu bringen, aber es scheint nicht richtig auszulösen. Der Code wird perfekt kompiliert und soll das Bein eines Hexapods steuern . Auch der Beispiel-Sweep funktioniert mit diesem Servo, also hier kein Problem. Das Servo bewegt sich jedoch nicht wirklich. Ich denke, es hat etwas mit der Reihenfolge der Deklaration der Variablen zu tun:
#include <Servo.h>
// Abstract each leg, so only those functions can be accessed
class Leg {
// Actions that can be triggered from outside
public:
Leg(int hipPin, int kneePin);
void up();
// These should be only available for the leg
private:
Servo hip;
Servo knee;
};
Leg::Leg(int hipPin, int kneePin) {
hip.attach(hipPin);
knee.attach(kneePin);
}
// Testing the leg: move it up
void Leg::up() {
for(int pos = 0; pos < 180; pos += 1) {
hip.write(pos);
delay(15);
}
}
// Initialize the leg
Leg topLeft(9, 10);
void setup() {
}
// Test the function up()
void loop() {
topLeft.up();
}
Ich teste nur den Pin 9 (lasse die 10 leer). Es scheint Schmerzen zu haben , was bedeutet, dass Sie sehen können, wie das Servo zittert, sich aber bei 0 Grad nicht wirklich bewegt.
arduino-uno
c++
class
Francisco Presencia
quelle
quelle
Antworten:
Es sieht so aus, als ob dieses Problem auf eine schlechte Reihenfolge der Initialisierungsaufrufe für globale Variablen zurückzuführen ist.
In C ++ ist die Reihenfolge der globalen Variableninitialisierung für verschiedene Kompilierungseinheiten (dh C ++ - Quelldateien, keine Headerdateien) nicht vorhersehbar. Die Initialisierungsreihenfolge wird nur innerhalb einer Kompilierungseinheit eingehalten .
In Ihrem Programm gibt es mehrere globale Variablen, die, wenn sie in der falschen Reihenfolge initialisiert werden, Ihr Programm zum Scheitern bringen:
Leg topLeft;
Dies ist Ihre Klasseninstanzservo_t servos[MAX_SERVOS];
,int8_t Channel[_Nbr_16timers ];
Unduint8_t ServoCount = 0;
alle definiert inServo.cpp
Für den Aufruf
Servo.attach()
müssen die drei oben genannten Variablen bereits initialisiert worden sein, was Sie nicht sicher sein können.Wie können Sie das beheben?
Indem Sie den
attach()
in-Leg
Konstruktor nicht ausführen, sondern an eineinit()
Methode delegieren, von der aus Sie Folgendes aufrufen könnensetup()
:quelle