Ich möchte mit einen Sketch per sbus einen Servo schaltet. Der Sketch ist soweit anscheinend in Ordnung, jedenfalls zeigt die ide keinen Fehler an.
Das Ergebnis ist leider negativ. Der Servo dreht automatisch beim Start auf 90 Grad. Eine Veränderung der sbus Werte mittels Fernsteuerung ändert nichts.
Und noch ein Problem.
Die erste if abfragen im loop, die auskommentiert ist, wird als Fehler in der ide angezeigt. Die darunter funktioniert, aber eigentlich sollte das mit failsafe und lostframe laufen...
Kann mir jemand helfen?
Vielen lieben Dank!
#include "sbus.h"
#include <Servo.h>
bfs::SbusRx sbus_rx(&Serial2);
bfs::SbusData data;
uint16_t channels[16];
bool failSafe;
bool lostFrame;
Servo Servo1;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
sbus_rx.Begin();
Servo1.attach(2);
}
void loop() {
// if (sbus_rx.Read(&channels[0], &failSafe, &lostFrame)) {
if (sbus_rx.Read()) {
/* Grab the received data */
data = sbus_rx.data();
/* Display the received data */
for (int8_t i = 0; i < data.NUM_CH; i++) {
Serial.print(data.ch[i]);
Serial.print("\t");
}
if (channels[9] > 1050)
Servo1.write(90); }
else if (channels[9] < 1000) {
} Servo1.write(0);
}
Überprüfe Deine öffnenden und schliessenden klammern also die { und } bei deinen if Anweisungen. zum teil fehlen die schliessenden Klammern (darum auch die Fehlermeldung, wenn du die erste if Anweisung aktivierst. Und der kann nicht funktionieren, weil beim Letzten else if die klammer falsch gesetzt ist. so bekommt dein servo in sehr sehr hohem tempo andauernd die anweisung zwischen 90° und 0° zu wechseln. und das sehr viel schneller, als der Servo die positionen erreichen kann, also bleibt er einfach stehen.
Da hilft einmal drüber schlafen um den kopf frei zu bekommen und dann mit neuem Elan so dran gehen, als sähe man den Sketch zum ersten mal. Zeile für Zeile , Funktion für Funktion durchgehen,
Fehler durch Auskommentieren beheben ohne den Fehlertext zu lesen, ist auf Dauer nicht zielführend. In deinem Fall bleibt dadurch der Inhalt von channels 0.
Mein Vorhaben ist "eigentlich" ganz einfach:
Ich möchte, wenn ich den rechten Steurknüppel auf meinem Sender bediene, einen Servo um 90 Grad drehen.
Wenn ich den in die andewre Richtung drücke, soll er wieder auf 0 Grad zurückfahren.
Grundsätzlich bin ich gerade mit dem SBUS angefangen und hab da so meine Probleme mit.
Failsafe und Lostframe brauche ich eigelich nicht. Lasse ich dann weg.
Ich brauch nur die Werte der einzelnen Kanäle
Ich habe den Sketch nochmal überarbeitet, aber ich komme nicht weiter.
Wie gesagt, es soll der Servo bis 90 Grad fahren, solage der rechte Hebel hoch ist und die Position halten.
Wenn ich den Knüppel nach unten ziehe, solld er Servo wieder auf 0 Grad fahren.
#include "sbus.h"
#include <Servo.h>
/* SBUS object, reading SBUS */
bfs::SbusRx sbus_rx(&Serial2);
/* SBUS data */
bfs::SbusData data;
Servo Servo1;
void setup() {
Serial.begin(9600);
sbus_rx.Begin();
Servo1.attach(2);
}
void loop() {
if (sbus_rx.Read()) {
/* Grab the received data */
bfs::SbusData data = sbus_rx.data();
data.ch[0];
/* Display the received data */
for (int8_t i = 0; i < data.NUM_CH; i++) {
Serial.print(data.ch[i]);
Serial.print("\t");
}
/* Display lost frames and failsafe data */
Serial.print(data.lost_frame);
Serial.print("\t");
Serial.println(data.failsafe);
}
if (data.ch[8] > 1050) {
Servo1.write(90);
}
else if (data.ch[8] < 1000) {
Servo1.write(0);
}
}
Hab den PC gerade ausgeschaltet. Also, der Monitor zeigt korrekt die Werte pro Kanal an. Bei Mittelstellung 1024. Unterer Wert liegt bei 221, der obere bei 1824.
Der sbus ist vom Empfänger über einen Inverter an Pin 17 des arduino mega 2560 angeschlossen.
Der Servo liegt auf Pin 2.
Die Stromversorgung kaktuell über den USB Anschluss.
Der Servo macht überhaupt nichts. Beim Start einmal eine Position angenommen. Die ändert sich aber nie.
Also kannst du nicht richtig zählen ( data.ch[8] ist der neunte Wert deiner Ausgabe, die mindestens elf Werte haben muss )
Oder der Servo macht nicht was er soll, was man sehen kann, wenn du zum Test folgende loop hochlädst (void setup und so wie gehabt).
Doch, doch. Richtig zählen kann ich schon. Kanal 0 ist ja der erste .
Wäre aber nicht schlimm gewesen, da ich im Sender mehrere Kanäle parallel mit dem Knüppel gelegt hatte. Differenzierung über diverse Schalter. Und die hatte ich alle aktiviert. Daher bri Gen ch8 bis 11 die gleichen Werte