Jump to content

Meinolf Höhler

admGlobal
  • Content Count

    1,212
  • Joined

  • Last visited

About Meinolf Höhler

  • Rank
    Administrator

Freiwillige Angaben

  • Wohnort
    Düsseldorf

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. ...und das kleine Detail der Umkehrklappe muss man für 30 Schleifen dazu kaufe. Komisches Angebot.
  2. Ich glaube da bleibt nur Marke Eigenbau und selber was zusammen programmieren. Ist die Frage, wie weit du dich mit Arduino und Co auskennst. Ich kann man versuchen ein Konzept zu schreiben, aber das braucht ein bisschen Zeit.
  3. Schlimmer noch, die SRBs sind sogar noch im Einsatz
  4. Ja nur die Aussage, die Graupner mir gegenüber getroffen hat, auf die Frage nach einer Lieferzeit fand ich kundenunfreundlich. Ich hatte gefragt, ob die einen Liefertermin haben. Antwort: "Sie geben im Moment keinen Termin an, aber man kann die bestellen und bekommt die auch Zeitnah." Man möchte damit sehen, wie viel Interesse besteht. Wenn man kein Lieferdatum angibt, wie kann man dann erwarten, dass die Kunden ins blaue bestellen? Ich hatte vor die Hecht zu bestellen wenn verfügbar, aber so eine Verkaufsstrategie unterstütze ich nicht!
  5. Die waren im Keller und haben laut gerufen FLUUUUUUUUUTEN!
  6. Knickschutz oder Kabeltülle kenne ich da nur.
  7. Nein, das funktioniert wahrscheinlich nicht. Die Platine vom großen C wird schon ein verstärktes Signal ausgeben, was aber nicht zu dem Eingang der Endstufe passen wird.
  8. @bulli hilft das System weiter? Ein bisschen Anpassung ist natürlich nötig.
  9. Fehlt noch die Funktion handleRoot(): void handleRoot() { char html[1500]; // Build an HTML page to display on the web-server root address snprintf ( html, 1000, "<html>\ <head>\ <meta http-equiv='refresh' content='10'/>\ <title>SK33 Theodor Storm</title>\ <style>\ body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; font-size: 1.5em; Color: #000000; }\ h1 { Color: #AA0000; }\ </style>\ </head>\ <body>\ <h1>SK33 Theodor Storm</br>\ mit Nis Puk</h1>\ </br>\ <h2>\ <p>Fahrtbeleuchtung:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"/FON\">EIN</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"/FOFF\">AUS</a><p>\ <p>Schleppbeleuchtung:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"/SON\">EIN</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"/SOFF\">AUS</a><p>\ <p>Blaulicht:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"/BON\">EIN</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"/BOFF\">AUS</a><p>\ <p>Man&ouml;vrierbehindert:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"/MON\">EIN</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"/MOFF\">AUS</a><p>\ </h2>\ </body>\ </html>"); server.send ( 200, "text/html", html ); } Das große sprintf() ist der HTML Code für die gelieferte Webseite. Hier ist alles nötige aufgeschrieben. Es ist nur Text mit den Links für die Schaltfunktionen drin, aber es funktioniert einwandfrei. Eine Winzigkeit habe ich bis jetzt noch verschwiegen. Das Signal vom Sender könnte ja was anderes sagen, als was über den Webserver kommt. Damit die sich nicht gegenseitig überschreiben habe ich an Eingang 13 einen Schalter gelötet, mit dem ich zwischen beiden umschalten kann. SK33MultiswitchESP8266.zip
  10. Weiter geht die wilde Fahrt... Im August wurde eine neue Version von der S.Port Bibliothek heraus gegeben, in der der beliebte ESP8266 unterstützt wird. Wem das im Moment nichts sagt, der 8266 ist ein Chip bzw Board von Espressif, was einen leistungsfähigen Microcontroller mit einem WLAN Modul vereint. Das Ding ist entweder mit Lua programmierbar, oder mit C. Da ich schon alles mit C geschrieben habe, und mein ESP8266 für Lua eine neue Firmware gebraucht hätte, bin ich bei C geblieben, und hab das Programm umgebaut. Ich verwende (wen wunderts ) von Adafruit das Board Feather Huzzah ESP8266. Warum der Wechsel zu dem Board? Verrückte Ideen sind noch genug vorhanden, der ESP liegt hier im Moment nutzlos rum, warum also nicht die Lichtorgel über das Mobiltelefon steuern, wenn das Boot irgendwo einfach gut aussehen soll, zur Not zu Hause im Regal. Also was war zu tun? Natürlich müssen in die Arduino IDE das Board und die Bibliotheken für das ESP eingebunden werden. Das eigene Programm verwendet davon #include <ESP8266WiFi.h> #include <ESP8266WebServer.h> Die Namen der Headerfiles sagen schon, was der Inhalt ist. Es wird ein ESP8266WebServer Objekt benötigt, damit wir einen Webserver bauen können, der auf das Handy reagiert, außerdem zwei char-Konstanten, in denen die SSID und das Passwort des WLAN gespeichert sind. In setup() sind die folgenden Zeilen dazu gekommen: WiFi.mode(WIFI_AP_STA); WiFi.softAP(ssid, password); IPAddress myIP = WiFi.softAPIP(); Diese erstellen einen Soft-AccessPoint, der vom Handy gefunden und geöffnet werden kann. Durch einige Hintergrundmagie (die ich nicht weiter hinterfrage) bekommt man sogar eine IP, sodass alle Zutaten für einen Netzwerkzugriff au den ESP gegeben sind. Das oben genannte Webserver-Objekt wird mit ESP8266WebServer server(80); erstellt, wobei 80 der Port ist, auf dem der Server lauschen soll. Jetzt muss der Server wissen, was er machen soll, bzw worauf er wie reagieren soll. server.on ( "/", handleRoot ); server.on ( "/FON", handleFahrtOn ); server.on ( "/FOFF", handleFahrtOff ); server.on ( "/SON", handleSchleppOn ); server.on ( "/SOFF", handleSchleppOff ); server.on ( "/BON", handleBluelightOn ); server.on ( "/BOFF", handleBluelightOff ); server.on ( "/MON", handleManeuverOn ); server.on ( "/MOFF", handleManeuverOff ); server.onNotFound ( handleNotFound ); server.begin(); Die Parameter für die Anweisung server.on sind ein String aus der Adresse, mit der im Prinzip eine Webseite ausgewählt wird. Der zweite String ist ein Callback auf eine Funktion, die ausgeführt werden soll, wenn ein bestimmter Aufruf erfolgt. Die letzte Anweisung startet dann den Webserver. Da jetzt so viele Funktionen dazu kommen, habe ich mich entschlossen, eine weitere Änderung im Code durchzuführen. Die Arduino IDE lässt zu den Code auf Dateien zu verteilen. Die müssen im gleiche Ordner, wie die Projektdatei liegen, und sollen auch die Endung .INO haben. In einer der Dateien sind nun die Funktionen für die Auswertung verschwunden, in der Anderen die Callback-Funktionen für den Webserver. Die Callback-Funktionen erledigen das Gleiche, was im Sender das Lua-Script macht. Es setzt bei einer bestimmten Funktion einen bestimmten Wert in den "empfangenen Byte". Der Ort, wo der Wert ankommt, bleibt für die nachgelagerte Auswertung also gleich, nur die "Quelle" ändert sich. void handleFahrtOn() { uiValue[0] |= B00000001; //Fahrtlicht EIN uiValue[0] &= B11111101; //Schlepplicht AUS bValuesUpdated = true; handleRoot(); } Beispielhaft ist hier mal eine der Funktionen hineinkopiert. Sie soll das Licht für Fahrt schalten. Das versteckt sich bei Byte 1 in Bit 1. Über eine Bitmaske wird mit einem bitweisen ODER Bit 1 eingeschaltet. Da in meinem Sender das Fahrtlicht auf dem gleichen Schalter, wie das Schlepplicht liegt, schaltet die zweite Zeile das Schlepplicht aus. Dazu wird eine Bitmaske mit einem bitweisen UND auf das Byte angewendet. Die Funktion handleRoot() am Ende schickt dem Handy die Webseite wieder zu, sodass weitere Funktionen geschaltet werden können.
  11. Ich kann Achims Aussage aus eigener Erfahrung bestätigen. #1&2 hab ich genau so falsch gemacht und mich gewundert, warum ich die Litze nicht angelötet bekomme.
  12. So weiter im Tex...Programm. Das Programm im Arduino ist schwieriger zu erklären, daher versuche ich die wichtigsten Punkte abzudecken. Ich hoffe die Kommentierung des Quelltexts ist ausreichend. // Sensor definition to initialize telemetry FrSkySportSensorAss ass(FrSkySportSensor::ID14); //create a sensor Auch wenn das Programm funktioniert, ohne, dass der Sender in dem Arduino einen Sensor erkennt, muss trotzdem irgend einer der Sensoren instantiiert werden, damit die Telemetriebibliothek compiliert werden kann. Ich habe den Erstbesten genommen, und das ist der AirSpeedSensor ASS. // configure telemetry serial port telemetry.begin(FrSkySportSingleWireSerial::SOFT_SERIAL_PIN_4, &ass); Das Telemetrieobjekt bekommt zwei Parameter übergeben. Der Erste ist der Pin, an dem der S.Port angeschlossen ist. Hier hat sich anscheinend Pin 4 als am besten geeignet (so ist es in dem Beispiel von Pawelsky beschrieben). Der zweite Parameter ist der „Pseudo-Sensor“, der zu Anfang instantiiert wurde. if (telemetry.available && ((uiValue[0] != telemetry.aUiRxValue[0]) || (uiValue[1] != telemetry.aUiRxValue[1]) || (uiValue[2] != telemetry.aUiRxValue[2]) || (uiValue[3] != telemetry.aUiRxValue[3]))) { uiValue[0] = telemetry.aUiRxValue[0]; uiValue[1] = telemetry.aUiRxValue[1]; uiValue[2] = telemetry.aUiRxValue[2]; uiValue[3] = telemetry.aUiRxValue[3]; telemetry.available = false; bValuesUpdated = true; } Weiter oben wurde ja schon das available Flag beschrieben, und das kommt hier nun zu seinem Einsatz. Nur wenn Daten verfügbar sind, und sich eines der 4 Byte von den vorher empfangenen unterscheidet, genau dann werden die neuen Daten in den eigenen Puffer übernommen, und die Auswertung mit bValuesUpdated = true; freigegeben. Wichtig für die nachfolgende Auswertung ist nun die Beziehung zwischen den Empfangenen Bytes und den LEDs an den PWM Modulen. Für diese Beziehung habe ich eine Tabelle in LibreOffice gebaut, wo in den Spalten die 32 möglichen Schaltwerte stehen, und in den Zeilen die 32 Kanäle der PWM Module. Nebenbei, die LED sind gleichmäßig auf die PWM Module verteilt, damit nicht eines zu viel Last auf einmal hat. Wichtig ist nun, dass jedes der PWM Module einen Zwischenpuffer in Form eines Array aus 16 Booleanwerten bekommen hat, welcher den Zustand jeder LED speichert. bool module1onOff[16]; bool module2onOff[16]; Kommt z.B. über den Empfänger das Signal für die Beleuchtung „in Fahrt“ (Byte 1 = 0x01), sollen die folgenden LED eingeschaltet sein: - Topplicht (Modul 2, Kanal 0) - Hecklicht (Modul 1, Kanal 0) - Backbordlaterne (Modul 2, Kanal 2) - Steuerbord (Modul 1, Kanal 2) Um zu ermitteln, ob 0x01 in dem Signal des Empfängers vorhanden ist, anders ausgedrückt der gesendete Wert gerade oder ungerade ist, wird die Bitmaske 0x01 (binär 00000001) mit einem bitweisen UND auf den Puffer angewendet. Ist der Wert ungleich 0, ist der gewünschte Schalter an. Für die anderen Schaltzustände ist die Bitmaske entsprechend 0x02, 0x04, 0x08, 0x10 etc. //fahrt if ((uiValue[0] & 0x01) != 0) { module1onOff[0] = true; //heck module1onOff[2] = true; //navSB module2onOff[0] = true; //topp module2onOff[2] = true; //navBB } In den Arrays werden dann Wert 0 und 2 jeweils auf TRUE gesetzt. Soll zusätzlich noch das Schlepplicht an sein (Byte 1 = 0x02), werden die Werte von oben, und zusätzlich jeweils Wert 1 auch auf TRUE für Topp- und Heckschlepplicht gesetzt. Der Befehl, der die Werte in die Kanäle der PWM-Module schreibt benötigt als ersten Parameter die Nummer des Kanals. Da das Array genau so viele Werte hat, wie das Modul Kanäle hat, können die Werte über einfache for-Schleife geschrieben werden. //write ledState to PWM modules for (int i = 0; i < 16; i++) { if (module1onOff[i]) { pwmLed1.setPin(i, (uint16_t)pgm_read_word(&mappingModule1[i]), false); } else { pwmLed1.setPin(i, 0, false); } if (module2onOff[i]) { pwmLed2.setPin(i, (uint16_t)pgm_read_word(&mappingModule2[i]), false); } else { pwmLed2.setPin(i, 0, false); } }
  13. Ich habe die beiden Posts mal abgetrennt, weil die eigentlich nichts mehr direkt mit dem ursprünglichen Thema zu tun haben.
  14. Leider nicht, aber ist mal eine Idee, die ich die Woche testen kann. Warum sollte man nur 6 Schalter abfragen können? Der Schalter ist ja auch nur ein Wert von -100 - +100? Da müsste ich nochmal die Handbücher durchsuchen.
  15. cool, Infos über das Arduinoprogramm schreibe ich noch.
×
×
  • 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.