PPM Signal

Hallo,

Ich versuche seit längerem ein PPM Signal zu erzeugen.

Ich weis, dass es dazu einige Beträge gibt, aber ich bin langsam am verzweifeln, da ich kaum Erfahrung habe und mich daher schwer tue die Skripte zu meinem Nutzen umzuschreiben.

Jetzt komme ich auch gleich zu meinem Problem:

Ich habe eine MX-20 Hott von Graupner. Diese hat hinten eine DSC Buchse, worüber ein Schülersignal eingespeist werden kann. Ich möchte mir darüber einen dritten Kreuzknüppel ermöglichen. Dazu müsste man das analoge Signal des Knüppels wohl in ein PPM Signal umwandel? Auch da bin ich mir nicht sicher, ob das überhaupt so funktioniert. Ich habe allerdings mit einem Oziloskop herausgefunden, dass an der DSC Buchse ein PPM Signal ausgegeben wird.

Daher bitte ich dringend um Hilfe, da ich das Bord nur geliehen habe (Arduino UNO).

Mit freundlichen Grüßen

Ein PPM Signal zu erzeugen ist einfach: man benutzt die servo.h Bibliothek.
Brauchst Du wirklich ein PPM Signal oder ein Signal wo mehrere Servo-Kanäle hintereinander gesendet werden? Ein Kreuzknüppel hat ja 2 Potis bzw Kanäle.
Grüße Uwe

Die Servo.h ist für das Servo Typische PWM Signal zuständig. Das PPM Signal besteht aus einem z.B. ~20ms Frame fur 8Kanäle das darf man nicht mit dem "normalen" Servo-Signal verwechseln. Schaue mal hier:

Gruß
DerDani

Also ich kann mit der Servo.h "normale" Servos betreiben.
Weil die eben genau den Puls alle 20ms erzeugt.

man kann es aber auch zu Fuß machen:

/*************************************************************************************************
**  _Servo()											**
**************************************************************************************************
** muß in der loop stehen (ohne DELAY!) sollte  mindestens alle 20ms aufgerufen werden!		**
** gibt >= alle 20ms einen Servopuls am Servopin aus						**
** wenn pulseabstand > 20ms ist, wird das Servo langsamer.					**
** based on Two-Servo-Test by 'jurs' for German Arduino Forum					**
**  												**
**  											   	**
**  Input:  Winkel 										**
**  Output:											**
**  genutzte Globale Variablen:  								**
**************************************************************************************************/
void _Servo(int _angle)
{
  const int pulseabstand = 20;       // Definition der Kenngrößen
  const int Servo_minpulse = 800;    // der Servoansteuerung
  const int Servo_maxpulse = 2400;
  const int Servo_minW = 20;        // kleinster und größter Winkel
  const int Servo_maxW = 160;
  // berechnen der Geradengleichung des Servos 
  const float m = ((Servo_maxpulse - Servo_minpulse)*1.0/(Servo_maxW - Servo_minW)*1.0);
  const int b = Servo_minpulse - m * Servo_minW;
  
  static unsigned long lastRefresh;
  if (millis()-lastRefresh < pulseabstand) return; // noch keine 20 ms vergangen
  lastRefresh = millis(); // Zeit des erfolgten Refresh merken
  
  _angle = constrain(_angle, Servo_minW, Servo_maxW); // Stellwinkel begrenzen
  int pulselength = _angle * m + b;
  //Serial.print("Winkel = ");Serial.print(_angle);Serial.print("   Puls: ");Serial.println(pulselength);
  noInterrupts();
  digitalWrite(ServoPin,HIGH); // Ersten Refresh-Impuls starten
  delayMicroseconds(pulselength);
  digitalWrite(ServoPin,LOW);
  interrupts(); 
}  // end _Servo

Hallo,

Vielen Dank für die schnellen Antworten.

Wie ich gesagt habe bin ich mir selber nicht sicher wie ich das Signal der Knüppel in die Fernbedienung bekomme.

Ich habe das Programm mal getestet und bekomme folgenden Fehler:

C:\Users****\AppData\Local\Temp\untitled1672452053.tmp\sketch_nov04a\sketch_nov04a.ino: In function 'void _Servo(int)':

sketch_nov04a:43: error: 'ServoPin' was not declared in this scope

digitalWrite(ServoPin,HIGH); // Ersten Refresh-Impuls starten

^

exit status 1
'ServoPin' was not declared in this scope

Wenn das eine dumme Frage ist, nehmt es mir nicht übel, da ich keine Erfahrung habe.

Mit freundlichen Grüßen

ttaus:
Wenn das eine dumme Frage ist, nehmt es mir nicht übel, da ich keine Erfahrung habe.

Nun ja, eigentlich ...

Dein Sketch könnte diese Zeile gebrauchen (die 5 ist willkürlich):

const int ServoPin = 5;

PPM = Puls-Pausen-Modulation und dort die Grafik "PPM bei der Veränderung von zwei Stellpositionen"

uwefed:
Ein PPM Signal zu erzeugen ist einfach: man benutzt die servo.h Bibliothek.

Ich habe es mal mit drei Signalen versucht (das Signal ist gegenüber der Wiki-Grafik invertiert):

Die Zeit zwischen Signal1 und seiner Wiederholung beträgt 20 ms. Leider sind die Pausen zwischen den Signalen nur 12 µs anstelle 0,5 ms und ich finde keinen Parameter, dies einzustellen.

Mit einem Scope könnte man feststellen, wie die an der DSC Buchse ausgegebenen Signale des Senders aussehen. Vermutlich sind die für die möglichen Einstellungen (PPM 10-24) etwas unterschiedlich. Der Arduino müßte dann gleichartige Signale erzeugen.

Ich bin mir allerdings nicht sicher, ob sich damit weitere Kanäle hinzufügen lassen. Eher tippe ich darauf, daß nur die ausgewählten Kanäle durch die eingespeisten ersetzt werden.

ttaus:
Ich habe das Programm mal getestet und bekomme folgenden Fehler:

Ich habe ja auch kein Programm gepostet, sondern nur eine Funktion.

Die in ein geeignetes Progamm eingebettet werden muss.

Die Funktion gibt allerdings nur einen Puls zur Ansteuerung eines Servos aus.
Welches Protokoll genau die DSC Buchse von Graupner braucht, ist mir unbekannt.

Unabhängig davon wirst du nicht umhin kommen, dir die Grundlagen des Programmierens anzueignen.

Hallo,

Ich habe die Antworten gelesen und werde nochmal versuchen das Programm zu überarbeiten. Hoffentlich hat er die Fotos jetzt angehängt.

Im übrigen habe ich das singbar der DSC Buchse ausgelesen (steht auf PPM-24). Sieht schon ganz gut aus und wenn ich die Knüppel bewege verändern sich auch die Abstände. Dann müsste man burnish gucken, inwiefern das Arduino Board mit der MX-20 kommunizieren muss. Also ob es reicht einfach ein Signal einzuspeisen, oder ob das Board auf das Signal der MX-20 "antworten" muss.

Mit freundlichen Grüßen

ttaus:
Hallo,

Ich versuche seit längerem ein PPM Signal zu erzeugen.

Ich weis, dass es dazu einige Beträge gibt, aber ich bin langsam am verzweifeln, da ich kaum Erfahrung habe und mich daher schwer tue die Skripte zu meinem Nutzen umzuschreiben.

Jetzt komme ich auch gleich zu meinem Problem:

Ich habe eine MX-20 Hott von Graupner. Diese hat hinten eine DSC Buchse, worüber ein Schülersignal eingespeist werden kann. Ich möchte mir darüber einen dritten Kreuzknüppel ermöglichen. Dazu müsste man das analoge Signal des Knüppels wohl in ein PPM Signal umwandel? Auch da bin ich mir nicht sicher, ob das überhaupt so funktioniert. Ich habe allerdings mit einem Oziloskop herausgefunden, dass an der DSC Buchse ein PPM Signal ausgegeben wird.

Daher bitte ich dringend um Hilfe, da ich das Bord nur geliehen habe (Arduino UNO).

Mit freundlichen Grüßen

Soweit ich weiss, dient die DSC Buchse sowohl zum einspeisen (wenn als Lehrersender genutzt) als auch zum Ausgeben (wenn alsSchülersender genutzt) eines PPM Signals.
Wenn du darüber einen dritten Kreuzknüppel einspeisen willst, muss der z.B. auf Kanal 5 und 6 liegen, damit du andere Potis in deiner Funke dadurch "ersetzen" kannst. D.h., der Arduino mus die Kanäle 1 bis 4 mit z.B. 1500uS schicken und dann die beiden Werte vom Kreuzknüppel. In der MC20 sagst du dann, du willst nur die Funktion 5 und 6 an den Schüler übergeben und setzt einen "Dauer-On" als Schülerschalter.

Ich bin gerade dabei, was ähnliches zu realisieren, aber statt Kreuzknüppel einen Headtracker für eine FPV-Brille

Hallo,

Ich habe nochmal über das Wochenende rumprobiert, bekomme es jedoch nicht hin ein PPM Signal zu generieren.

Könnte mir daher nochmal jemand helfen? Mit dem Code, der vorher gesendet wurde, kann ich nicht viel anfangen.

Viele Grüße

Hallo,

wie sieht das Signal das gesendet werden soll aus?
Gibts davon Bilder? Eine konkrete Beschreibung?
Wo kommt das Signal her?
Was haste denn probiert?

Die Servo Lib geht dafür lt. meiner Überlegung nach nicht. Es soll doch die Pause und nicht das Signal zeitlich gesteuert werden. Irre ich mich?

Hallo,

Das Signal was aus der DSC Buchse der MX-20 kommt müsste ungefähr so aussehen. So wie ich das verstanden habe, werden einfach die Abstände und Längen der Impulse verändert. Bewegt man einen Knüppel verändern sich auch die Abstände der einzelnen Impulse, die Gesamtlänge bleibt allerdings gleich.

Daher denke ich, dass das Arduino so ein Signal (in meinem Fall mit nur 2 Kanälen) ausgeben müsste, sodass es als "Schülersender" wahrgenommen wird.

Ich habe einige Beispielcodes aus dem Internet ausprobiert, jedoch haben die nicht funktioniert (Fehler schon beim hochladen), oder haben kein PPM Signal ausgegeben. Dabei währe auch wichtig, dass das Signal so aussieht wie auf dem Foto, also die einzelnen Impulse oben.

Hast du sonst noch eine Idee oder ein Beispiel wie man das realisieren kann?

Viele Grüße

Doc_Arduino:
Die Servo Lib geht dafür lt. meiner Überlegung nach nicht.

Entsprechend #5 stimme ich Dir zu.

ttaus:
Das Signal was aus der DSC Buchse der MX-20 kommt müsste ungefähr so aussehen. So wie ich das verstanden habe, werden einfach die Abstände und Längen der Impulse verändert. Bewegt man einen Knüppel verändern sich auch die Abstände der einzelnen Impulse, die Gesamtlänge bleibt allerdings gleich.

Stimmt, siehe meinen Wiki-Link und die dort zu sehende Grafik.

ttaus:
Ich habe einige Beispielcodes aus dem Internet ausprobiert, jedoch haben die nicht funktioniert (Fehler schon beim hochladen), oder haben kein PPM Signal ausgegeben. Dabei währe auch wichtig, dass das Signal so aussieht wie auf dem Foto, also die einzelnen Impulse oben.

Bereits in #2 wurde Dir eine Bibliothek genannt, mit der ein PPM-Signal erzeugt werden kann. Hast Du die probiert?

Bei mir sieht es dann so aus:

  • Beide Poti auf 0
  • Poti 1 auf Max, poti 2 auf 0
  • Beide Poti auf Max

Hallo,

Vielen Dank für die Antwort.

Das mit der Bibliothek habe ich nicht ganz verstanden. Heißt das mit der Servo.h Bibliothek, dass ich eins von den Beispielen öffnen muss (Sweep/Knob) und die dann das PPM Signal erzeugen???

Oder muss ich dann noch die void Servo Funktion aus #3 anfügen?

Liegt das PPM Signal dann auf Pin 5 und GND oder auf Pin 9 und GND?

Habe das jetzt mal angehängt. Habt ihr das mit der Bibliothek so gemeint???

Viele Grüße

TEST_SERVO.ino (2.07 KB)

Die von mir in #13 benutzte ist die in #3 erwähnte RC-Bibliothek.

Ich habe mir die RC Lib runtergeladen.

Ich denke mal, dass du das PPM_OUT Example geladen hast oder??

Wenn ich das mache und da noch die void Servo Funktion anfüge kommt bei mir:

C:\Users****\Desktop\PPM_OUT\PPM_OUT.ino:14:20: fatal error: PPMOut.h: No such file or directory

#include <PPMOut.h>

^

compilation terminated.

exit status 1
Fehler beim Kompilieren für das Board Arduino/Genuino Uno.

Kannst du mir bitte die Datei hochladen mit der du es geschafft hast dieses Signal mit den beiden Drehpoti zu erzeugen???

PPM_OUT.ino (3.37 KB)

Die ppmout.h ist buggy. Ich musste meine Version patchen

Das bedeutet jetzt was?

Muss ich da noch irgendeine Bibliothek downloaden -> also die ppm_out.h?

Und was meinst du da mit patchen

ElEspanol:
Die ppmout.h ist buggy. Ich musste meine Version patchen

Das habe ich vermutet, da das Signal mir nicht sauber und zeitlich konstant erscheint. Also verwerfen oder weitermachen?

ttaus:
Und was meinst du da mit patchen

Reparieren :slight_smile:

ttaus:
Ich denke mal, dass du das PPM_OUT Example geladen hast oder??

Richtig.

ttaus:
C:\Users****\Desktop\PPM_OUT\PPM_OUT.ino:14:20: fatal error: PPMOut.h: No such file or directory

#include <PPMOut.h>

Die fehlermeldung bedeutet, Du hast die Bibliothek falsch installiert. Bei mir gibt es die Datei \libraries\RC\PPMOut.h neben vielen anderen (60) in diesem Verzeichnis.