Sbus-Servo-Test

Moin zusammen.

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.

Mhhh, da hab ich die Übersicht verloren...

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,

Vielen Dank. Ich setze mich heute noch mal ran.

Schau mal hier: Arduino Anfängerfragen | Facebook. Da wird auch so ein Problem behandelt.

Ich hätte da noch ein paar Puknte:

  1. Hast du mal den Link zu der Library?
  2. Lass mal die Autoformatierung über den Code laufen um zu schauen, ob die Einrückung dann noch dem entspricht, was du eigentlich machen willst
  3. if (channels[9] > 1050) -> Wo wird channels gesetzt? Oder muss das data.ch[9] heißen?

was genau hast du denn da vor?

wenn das logische UND Verknüpfungen werden sollen, dann wäre das vieleicht so:

if (sbus_rx.Read() && channels[0] && failSafe && lostFrame) {

da du aber failSafe und lostFrame nie setzt wird das nie true werden.

@Mephistoph : Bitte verlinke die exakte sbus.h Library die du verwendest. Jene die ich finde hat kein .Read() mit Parameter!

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.

Hallo zusammen,

vielen Dank für eure HIlfe,

hier erst einml der Link zur Library:

die hat den read parameter.

grafik

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

Lies noch mal deine Library. Die Member function .Read() erwartet KEINE Parameter.

Okay, das habe ich verstanden. Ich lasse die falschen Parameter nun weg.

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);
  }
}

Zeig mal die serielle ausgabe mit knüppelstellung unten - oben - mitte

Und beschreibe verbal was dein servo in den drei stellungen macht.

Jetzt ist ein Schaltplan schön...

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).

void loop() {
   Servo1.write(90);   delay(2000);
   Servo1.write(0);    delay(2000);
}

Doch, doch. Richtig zählen kann ich schon. Kanal 0 ist ja der erste :wink:.

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

und dann wenn ich mir dein Bild ansehe hapert es vieleicht doch am Zählen oder?

forum_pin3

Nö, wieso? liegt auf Pin 2
Die Lücke sah vielleicht wie eine Buchse aus...