Jump to content
Schiffsmodell.net

Graupner Hott dritter Knüppel


Guest tt99

Recommended Posts

Ja das habe ich ja gemacht. Ich habe zwei impulse erstellt und diese dann in die Fernbedienung gegeben. Das Problem dabei ist, dass er dann sagt, dass er kein schülersignal empfangen kann. Vielleicht liegt es aber auch an dem Programm.

Link to comment
  • Replies 62
  • Created
  • Last Reply

Top Posters In This Topic

  • Ralph Cornell

    8

  • Achim_LSG

    7

  • MiSt

    2

  • Frankenmatrose

    1

Hi,ich bin jetzt endlich am testen und muss feststellen, das es so nicht geht.Jetzt wird es spannend...

Der Lehrersender funktioniert einwandfrei per Kabel mit einem zweiten HoTT-Sender.

Laut Oszi geben die HOTT Sender negative Pulse aus. Möglicherweise ist der Pegel von

einem 5V-Arduino zu hoch. Ebenso würde ich mal mit 6 Pulsen testen.

Das Telegramm muss mindestens 20mS lang sein.

Edited by Achim_LSG
Link to comment
Guest LostInSpace

Hi,

ich habe mit 4, 6 und 8 Kanälen getestet und Framezeit bis über 20ms. Alternativ auch mal invertiert. Ehrlich gesagt ist mir nicht klar, welche Spannungspegel die DSC Buchse sehen will. Ich habe auch schon etwas von teilweise negativen gelesen.

 

Offensichtlich gehen die "klassischen" 0V,5V Pegel nicht. Absenken auf zB 3,3V wird es wohl auch nicht bringen.

 

Ich muss mal die DSC-Buchse im Schüler-Modus messen und dann so ein Signal nachbauen.

 

Gibt es denn nirgends eine offizielle Doku über DSC mit Pegeln usw?

Link to comment

Hi,

 

Ich habe auch mit mehreren Kanälen getestet, nur habe ich leider keine zweite Fernbedienung um das Lehrer/Schüler Signal direkt zu messen. Eine offizielle Doku habe ich nicht gefunden.

 

Viele Grüße

Link to comment
Guest LostInSpace

So, es funktioniert!

 

Ich hätte nicht gedacht, das ich für eine so einfache Aufgabenstellung so viel Zeit verplempern muss.

 

Das von Dir oben gepostete Programm funktioniert so leider nicht. Man müsste hier und da an den Timings etwas ändern. Da Du eine ganz spezielle Lösung benötigst, habe ich extra dafür ein kleines Programm geschrieben.

 

Das Listing folgt heute Abend oder morgen früh. Ich möchte hier und da noch etwas testen.

 

Kurz zur DSC Buchse. Ich habe eine 3,5mm Stereo-Buchse benutzt. Auf der Spitze liegt das PPM-Signal, am Schaft die Masse. Der Ring muss nicht mit etwas verbunden werden. Der Spannungspegel kann locker auf 1V runter gezogen werden. 5V vom Arduino funktionieren aber auch.

 

Der Rest dann im Listing

 

 

Link to comment

Das ist eine super Nachricht!!!!!!!!

 

Dafür schon mal vielen Dank an dich und alle anderen die mir geholfen haben und Zeit investiert haben!!!

 

Wenn du mir dann noch den Code für das Arduino hochladen kannst, dann kann ich es auch ausprobieren. Hast du noch eine andere Bibliothek benutzt oder wie hast du es gemacht?

 

Viele Grüße

Link to comment
Guest LostInSpace

Hier nun das Programm.

Alles ist mehrfach getestet und läuft. Es werden 4 Kanäle übertragen. Die Potis an A0 und A1 werden in die Kanäle 3 und 4 eingespeist. Interessant ist, das die Servomitte bei mir nicht bei 1,5ms, sonder bei 1,15ms liegt. 

 

Du brauchst keine separaten LIBs. Der Code ist direkt nur unter einem UNO mit 16Mhz Takt lauffähig. Für das Programm habe ich die Arduino IDE 1.6.12 benutzt.

 

Ich wünsche viel Spaß und wenn etwas unklar ist, dann fragen

/*
 * ppmSchueler
 * erzeugen eines PPM Signals für Graupner DSC
 * Hardware ist Arduino UNO, keine speziellen LIBs
 * !!! Dies ist Demonstrationscode, nicht direkt für den produktiven Einsatz !!!
 * (c) l2hf.de 2016
 * r0.1.73
 */
#define TX_CHANNELS   6  // Anzahl Kanaele total
#define TR_CHANNELS   2  // Anzahl Kanaele, die eingelesen werden
#define CH_OFFSET     2  // Ab welchem Kanal werden gelesene Werte eingespeist, ab 0
#define PPM_CENTER 1150
#define PPM_RANGE   400

volatile uint16_t txChannel[ TX_CHANNELS];
volatile uint16_t pause_len = 600;   // Pause zwischen 2 Pulsen Angabe in us/2, also 500=250us
                                     // muss > 570 (285us) sein, sonst DSC Problem
volatile uint16_t sync_len = 16000;  // kompletter frame, also 16ms=16000us
uint8_t  poti[] = {A0, A1}; 

// Hilfsvariablen
volatile uint16_t pa_len;
volatile uint8_t  channel_cnt = 0;
uint16_t x = 0, v;

ISR(TIMER1_OVF_vect)
{
 if( channel_cnt == TX_CHANNELS)
 {
  ICR1 = (pa_len*2) + pause_len;
  channel_cnt = 0;
  pa_len = sync_len - (TX_CHANNELS * pause_len);
 }
 else
  ICR1 = (txChannel[ channel_cnt++] * 2) + pause_len;
}


ISR(TIMER1_COMPA_vect)
{
 if( channel_cnt == TX_CHANNELS)
  OCR1A = pa_len*2; 
 else 
 {
  OCR1A = txChannel[ channel_cnt] * 2;
  pa_len -= txChannel[ channel_cnt];
 } 
}


void setup() 
{
 for( int i = 0; i < TX_CHANNELS; ++i)
  txChannel[ i] = PPM_CENTER;
 
 pinMode( 9, OUTPUT);  // Ausgabe des PPM Signals

 // init 16bit Timer1 des UNO
 TCCR1A = (1<<COM1A1) | (1<<WGM11); //  |(1<<COM1A0) Mode 14
 TCCR1B = (1<<WGM12) | (1<<WGM13) | (1<<CS11); // Teiler/8
 TCCR1C = 0;
 
 OCR1A = txChannel[channel_cnt] * 2;
 ICR1 = (txChannel[channel_cnt] * 2) + pause_len;
 pa_len = sync_len - txChannel[ 0] - (TX_CHANNELS * pause_len);;  
 TIMSK1 = (1<<OCIE1A) | (1<<TOIE1);

 sei();
}

void loop() 
{
 if( channel_cnt - x == CH_OFFSET - 1)
 {   // wir lesen nur 1x pro Kanal/Frame
  v = analogRead( poti[ x]); // Analog einlesen (0-1023)
  txChannel[ channel_cnt + 1] = map( v, 0, 1023, PPM_CENTER - PPM_RANGE, PPM_CENTER + PPM_RANGE); 
  x = ++x % TR_CHANNELS;
 }
}

Natürlich alles ohne Gewähr

Link to comment

Hallo,

 

Der Code funktioniert sehr gut. Dafür nochmal vielen Dank. Er erzeugt ein Signal, welches die Fernbedienung auch annimmt. Nur habe ich jetzt zwei weitere Probleme:

 

1. Wenn ich durch den Knüppel die Kanäle 3+4 "ersetzte", so funktioniert die erstmal. Diese beiden Kanäle sind bei der MX-20 in Mode 1 der linke Kreuzknüppel. Aber dort habe ich dann das Problem, das ich über den externen Knüppel nur ausschläge von ca. 60% bekomme, während der eingebaute Knüppel mit den gleichen Einstellungen auf 100% kommt. Zum testen habe ich mal was aufgebaut und ein Foto angehängt (hoffe er lädt es jetzt hoch). Ich habe als externen Knüppel einen aus einem alten billigen Flugsimulator. Daher denke ich das entweder der Knüppel kaputt ist oder die Ohm Zalh nicht stimmt. Für den zweiten Fall: Könnte man da einfach widerstände einlöten?

 

2. Für die Lösung meines Problems möchte ich gerne mit den externen Knüppel die Geber 5+6 ansteuern bzw. über Lehrer Schüler ersetzten. Wenn ich allerdings versuche die Geber 5+6 zu erstetzen, so reagiert die Fernbedienung nicht auf das Signal. Liegt das vielleicht an den Ohmzahlen? Weil ich ja die Geber auch über die internen Drehpoti ansteuern kann. Oder kann ich über einen Kreuzknüppel überhaupt Geber ansteuern?

 

 

Und dann habe ich noch eine Frage, kann ich zusätzlich zu den zwei Signalen des Knüppels noch ein drittes Signal durchgeben, wie z.B. einen Schlater? Wenn ja muss ich dann in Code einfach die Anzahl der Kanäle ändern?

 

 

Viele Grüßepost-14151-0-15263800-1479318076_thumb.jpg

Edited by tt99
Link to comment
Guest LostInSpace

Der Code funktioniert sehr gut.

 

Das ist das einzig wichtige. Der Rest löst sich fast wie von selbst.

 

Zu 1:

Im Programm Zeile 76 muss der potibereich eingegrenzt werden.

Also zB auf map( v, 200, 823, ...

Hier musst Du etwas experimentieren

 

Zu 2:

folgende Änderungen im Code

#define TX_CHANNELS 8

#define CH_OFFSET   4
volatile uint16_t sync_len = 18000; 

Zu 3:

folgende Änderungen im Code

#define TR_CHANNELS 3
uint8_t poti[] = { A0, A1, A2}; 

Schalter dann mit entsprechenden Widerständen an A2 anschließen

 

 

Na denn

Edited by LostInSpace
Link to comment

Ok die drei Tips werde ich morgen versuchen umzusetzen.

 

Dann habe ich noch eine Frage:

 

Man kann doch bestimmt auch einen Joystick anstelle des Kreuzknüppels benutzen oder?

 

Etwas in der Art:

 

https://www.amazon.de/gp/aw/d/B01GJRPCR8/ref=ox_sc_act_image_1?smid=A2ZMD2OQ1M69UD&psc=1

 

Also damit meine ich dass ich durch die Bewegung den Ausgangswert plus z.b. 2 rechne und bei einem Druck auf den knopf wieder auf den Ausgangswert gesetzt wird.

Edited by tt99
Link to comment
Guest LostInSpace

Natürlich geht das und es ist auch leicht umzusetzen.

 

Dies sind aber Erweiterungswünsche, die mit der ursprünglichen Aufgabenstellung nichts mehr zu tun haben. Deshalb wird da von mir nichts kommen.

Link to comment
Ralph Cornell

Ich hatte mal einen Link zu diesem Thread im Nachbarforum (GH-Lounge) eingestellt. Die Angelegenheit wird von da aus mit Interesse verfolgt werden. Ich bitte auch tt99 darum, über Erfolg oder auch Mißerfolge ausführlich zu berichten.

Link to comment

Nein das ist klar. Du hast mir lit dem Code schon genug geholfen, ich war mir nur nicht sicher, ob das überhaupt funktioniert. Wie man das machen könnte weis ich glaube ich schon. Ich wollte mich nur überzeugen, dass das funktioniert.

 

Ich werde das heute Nachmittag mal richtig testen und dann natürlich einen Bericht auch ins Graupner Forum stellen.

 

Viele Grüße

Edited by tt99
Link to comment
Ralph Cornell

tt99: Hast Du daran gedacht, erst einmal die Kanäle 5 und 6 per "Gebereinstellung" aufzurufen? Wenn das Menü so aufgebaut ist, wie bei der MC-20, muß das erst einmal gemacht werden, ehe die Kanäle auf die Signale der Geber ansprechen. Und erst dann kannst Du sie durch entsprechende "Schülersignale" ersetzen.

Link to comment

Hallo nochmal,


Ich habe jetzt etwas rumprobiert und versucht die Tipps umzusetzen. Bevor ich lange herumrede: Es hat bei mir jetzt auch mit den Gebern geklappt!!! #Ralph die Geber habe ich auch belegt.

Noch eine kurze Frage nebenbei. Ich sollte ja nochmal im Graupner Forum von den Ergebniss berichten. Da ist jetzt meine Frage, ob es in Ordnung ist, wenn ich dort den Code nochmal hochlade?

Mit den Bereichen habe ich nun auch rumprobiert. Für die MX-20 und meinen Knüppel funktioniert es bei:

PPM_CENTER 1150 und den map Bereich zwischen 175 und 800. Dann bin ich bei Ausschlägen um die 100% .

Was ich dabei festgestellt habe ist, dass es wohl wirklich nur funktioniert, wenn PPM_CENTER auf 1150 steht. Ändere ich den Wert, so bekommt die Fernbedienung wieder kein Signal.

Zu dem dritten Punkt:

Ich habe mich mal rangewagt und versucht, den Code so zu ändern, dass ich auch einen Schalter bzw. Taster einlesen kann und das Signal an die Fernbedienung geben kann. Mit den internen Schaltern (zwei Stufen) schaltet das Signal zwischen -100% und +100% hin und her (feste Punkte also entweder -100 oder +100). Als ich das mal bei mir probiert habe, hat es mit den bereits hoch geladenen Code nicht funktioniert. Da denke ich mal, dass das daran liegt, das Drehpotis als Eingabe gedacht sind. Daher habe ich mal versucht den Code zu ändern, sodass ich auch Schalter, die wohl als digital gewertet werden zusätzlich zu den Potis einlesen kann. Das Signal des Schalters wird auch richtig eingelesen (sieht man sehr schön im Seriellen Plotter). Ich habe dabei allerdings das Problem, dass ich den Teil, in dem das Signal weitergegeben wird nicht richtig verstehe und daher nicht weis, wie ich das Signal des Schalters eingeben soll.

Ich habe das was ich verändert habe mal markiert (langer Strich hinter den Zeilen):

/*
 * ppmSchueler
 * erzeugen eines PPM Signals für Graupner DSC
 * Hardware ist Arduino UNO, keine speziellen LIBs
 * !!! Dies ist Demonstrationscode, nicht direkt für den produktiven Einsatz !!!
 * (c) l2hf.de 2016
 * r0.1.73
 */
#define TX_CHANNELS   8  // Anzahl Kanaele total
#define TR_CHANNELS   3  // Anzahl Kanaele, die eingelesen werden
#define CH_OFFSET     4  // Ab welchem Kanal werden gelesene Werte eingespeist, ab 0
#define PPM_CENTER 1150
#define PPM_RANGE   400
 
volatile uint16_t txChannel[ TX_CHANNELS];
volatile uint16_t pause_len = 600;   // Pause zwischen 2 Pulsen Angabe in us/2, also 500=250us
                                     // muss > 570 (285us) sein, sonst DSC Problem
volatile uint16_t sync_len = 18000;  // kompletter frame, also 18ms=18000us
uint8_t  poti[] = {A0, A1, A2}; 
 
// Hilfsvariablen
volatile uint16_t pa_len;
volatile uint8_t  channel_cnt = 0;
uint16_t x = 0, v, d;

const int buttonPin = 12;   // Mit einem Widerstand zwischen Masse und Pin 12 funktioniert es einwandfrei _________________________________________________________

 
ISR(TIMER1_OVF_vect)
{
 if( channel_cnt == TX_CHANNELS)
 {
  ICR1 = (pa_len*2) + pause_len;
  channel_cnt = 0;
  pa_len = sync_len - (TX_CHANNELS * pause_len);
 }
 else
  ICR1 = (txChannel[ channel_cnt++] * 2) + pause_len;
}
 
 
ISR(TIMER1_COMPA_vect)
{
 if( channel_cnt == TX_CHANNELS)
  OCR1A = pa_len*2; 
 else 
 {
  OCR1A = txChannel[ channel_cnt] * 2;
  pa_len -= txChannel[ channel_cnt];
 } 
}
 
 
void setup() 
{
 for( int i = 0; i < TX_CHANNELS; ++i)
  txChannel[ i] = PPM_CENTER;
 
 pinMode( 9, OUTPUT);  // Ausgabe des PPM Signals

 pinMode(buttonPin, INPUT); //_________________________________________________________
 Serial.begin(9600);        //_________________________________________________________

 // init 16bit Timer1 des UNO
 TCCR1A = (1<<COM1A1) | (1<<WGM11); //  |(1<<COM1A0) Mode 14
 TCCR1B = (1<<WGM12) | (1<<WGM13) | (1<<CS11); // Teiler/8
 TCCR1C = 0;
 
 OCR1A = txChannel[channel_cnt] * 2;
 ICR1 = (txChannel[channel_cnt] * 2) + pause_len;
 pa_len = sync_len - txChannel[ 0] - (TX_CHANNELS * pause_len);;  
 TIMSK1 = (1<<OCIE1A) | (1<<TOIE1);
 
 sei();
}
 
void loop() 
{
 if( channel_cnt - x == CH_OFFSET - 1)
 {   // wir lesen nur 1x pro Kanal/Frame
  v = analogRead( poti[ x]); // Analog einlesen (0-1023)



  
  if (digitalRead(buttonPin) == HIGH) { //_________________________________________________________
    d = HIGH;                           //_________________________________________________________
    Serial.println(1);                  //_________________________________________________________
  }                                     //_________________________________________________________
  else {                                //_________________________________________________________
    d = LOW;                            //_________________________________________________________
    Serial.println(0);                  //_________________________________________________________
  }
  
  
  
  txChannel[ channel_cnt + 1] = map( v, d, 175, 800, PPM_CENTER - PPM_RANGE, PPM_CENTER + PPM_RANGE); // d hinzugefügen???  _________________________________________________________
  x = ++x % TR_CHANNELS;
 }
}
Edited by tt99
Link to comment
Guest LostInSpace

Ich hatte mal einen Link zu diesem Thread im Nachbarforum (GH-Lounge) eingestellt. Die Angelegenheit wird von da aus mit Interesse verfolgt werden.

 

Mist,

das bedeutet, das wir Schiffsmodellbauer doch nochmal nachlegen müssen.

 

Das von mir gepostete Programm ist recht speziell auf die ursprüngliche Aufgabenstellung ausgelegt. Ich poste morgen noch eine Version, die etwas allgemeiner ist. Da ist es auch kein Problem, beliebige Schalter, Taster usw einzubinden.

Link to comment
Ralph Cornell

Ich schätze mal, das wird die Leute ziemlich überraschen. Ich vermute mal ganz frech, daß noch niemand, auch im Graupner-Forum nicht, auf die Idee gekommen ist, eine MX-20 auf die geschilderte Weise umzustricken.

Link to comment

Hallo,

 

ich habe mir den Code heute nochmal angeschaut und versucht einen Schalter zu den beiden Potis einzubauen, werde jedoch aus dem Code nicht schlau. Muss ich in den Code nur im Setup den Eingang des Schalter definieren und dann in der void Loop nochmal irgendwie den Wert von v verändern???

 

Ich habe dort mal versucht nachzuvollziehen was die einzelnen Variablen bewirken, konnte darin aber keine Lösung erkennen. Wenn ich das richtig verstanden habe, wird die if Schleife dann ja TR_CHANNELS Mal durchlaufen oder?? Also pro Kanal einmal???

 

Dann habe ich ja Mal versucht einen weiteren Wert in die map () einzufügen (wie z.B. die Variable d), was allerdings nicht funktioniert hat. Jetzt ist meine Frage, wo und was ich verändern muss um die beiden Potimeter und einen Schalter einzufügen. 

Muss ich da die Definition des Werts v verändern, oder etwas in der map (), oder etwas anderes??

 

Wenn ich dass dann gerade mit dem mehrfachen durchlaufen der if Schleife bedenke, funktioniert auch meine Idee mit den Joystick nicht so wie ich mir das gedacht habe, da ich dachte, ich kann da jedem Potimeter seinen eigenen Wert zuordnen. Daher ist es meiner Meinung nach leider doch nicht "so leicht", wie du es gesagt hast, da ich den unteren Abschnitt eben nicht so verstehe.

 

Ich habe zwar so schon das Programm für die Knüppel, komme aber mit dem Schalter nicht weiter und denke auch mit der Joysticksteuerung, daher benötige ich dort nochmal Hilfe.

 

 

Viele Grüße und vielen Dank schon im Voraus 

void loop() 
{
  if( channel_cnt - x == CH_OFFSET - 1)                                                                 // channel_cnt = variabel?;  x = 0, 1, oder 2?;  CH_OFFSET - 1 = 3
 {   // wir lesen nur 1x pro Kanal/Frame
  v = analogRead( poti[ x]); // Analog einlesen (0-1023)                                                // v = Wert des Potimeters?  
  
  txChannel[ channel_cnt + 1] = map( v, 175, 800, PPM_CENTER - PPM_RANGE, PPM_CENTER + PPM_RANGE);      // channel_cnt + 1 = zwischen 4, 5 oder 6
  x = ++x % TR_CHANNELS;                                                                                // x = x + 1 modulo TR_CHANNElS
 }
}
Edited by tt99
Link to comment

Ich habe noch mal ein bisschen probiert und bin auf das gekommen:

 

So meinte ich das mit dem Joysick, nur weis ich auch hier nicht, wie ich es in das andere Programm integrieren soll.

int potpin = A0;
int buttonPin = 12;   // Mit einem Widerstand zwischen Masse und Pin 12 funktioniert es einwandfrei


int val;
int x, y = 90;                         // y = 90 -> ist Servomitte




void setup() {
  Serial.begin(9600);


  pinMode(buttonPin, INPUT);
}


void loop() {
  val = analogRead(potpin);             // Potimeter auslesen


  x = (val - 516) / 100 * (-1);         // x ist zwischen -3 und 3


  if (x != 0){
    y = y + x;
  }
  if (y <= 0){
    y = 0;
  }
  if (y >= 180){
    y = 180;
  }


  if (digitalRead(buttonPin) == HIGH) {
    y = 90;
  }
    
  Serial.print("x: ");
  Serial.print(x);
  Serial.print("                                        y: ");
  Serial.println(y);
    
  delay(10);                            // Verzögerung zur Veranschauung der Werte
}
Link to comment

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.