Sensor Daten über Smart Port versenden mit dem Arduino
Der Empfänger, den ich für meinen FPV RC Crawler verwende, hat einen Smartport an dem z.B. Sensoren angeschlossen werden können. Die Anzahl der verfügbaren Sensoren von Frsky ist übersichtlich, aber speziell für meinen Bedarf war keiner dabei. Wie gut, dass hier bereits eine Lösung mit dem Arduino vorhanden ist und ich dazu auf den Arduino Webseite den Eintrag "S.Port sensor library for FrSky" gefunden habe.
Verwendet
- Arduino Mini
- Temperatur Sensor
Diode- FrSky Empfänger mit Smartport
- Fernsteuerung mit OpenTX
Ziel
Die erfasste Temperatur des Sensors soll auf der Fernsteuerung umgerechnet
und auf dem Display angezeigt werden.
Funktioniert das wirklich?
Wie bei jeder neuen Sache, prüfe ich mit wenig Aufwand, ob das Zielvorhaben
erreichbar ist. Praktisch ein PoC. Im Grunde formuliere ich meine
Blogeinträge anfangs als "Proof of Concept", bevor daraus ein Beispiel wird
und das gilt auch wieder für diesen Eintrag. Nur diesmal beschreibe ich das
Testen mit.
In den Sourcen zur Bibliothek für den SmartPort, sind, wie auch bei den anderen Beispiele Codes vorhanden. Für mich ist der ein feststehender Wert zu wenig und deshalb ändere ich den zu sendenden Wert in der Loop Methode.
#include <SPort.h>
SPortHub hub(0x12, 3);
CustomSPortSensor sensor(getSensorData);
int mSendingValue = 0;
int mCurrentMillis;
void setup() {
hub.registerSensor(sensor);
hub.begin();
}
void loop() {
hub.handle();
int current = millis();
if(current - mCurrentMillis < 100) {
return;
}
mCurrentMillis = current;
mSendingValue++;
}
sportData getSensorData(CustomSPortSensor* sensor) {
sportData data;
data.applicationId = 0x5900;
data.value = mSendingValue;
return data;
}
Ist der Code auf dem Arduino geschrieben, muss eine Verkabelung zum Smartport hergestellt werden. Hierfür soll die Diode verwendet werden, aber vielleicht sollte ich die Beschreibung nochmal durchgehen, wofür die Diode gut ist. (Später habe ich die Diode doch nicht verwendet)
Sensor einbinden
Die Fernsteuerung mit dem OpenTX Betriebssystem kann nun eingeschaltet
werden. Im Menü TELEMETRY (Abschnitt 11 auf der Xlite pro) für Sensoren,
kann nun die Suche gestartet werden. Wenn der Arduino mit dem Code als
Sensor funktioniert, sollte schon nach wenigen Sekunden der Sensor in OpenTX
gefunden werden.
Display Wiedergabe
Für den Bildschirm können mehrere Seiten eingerichtet werden, auf denen die
Sensor Ergebnisse ausgegeben werden. Dazu muss über das Menü DISPLAY
(Abschnitt 12 auf der Xlite pro) der Screen auf "Nums" eingestellt werden
und dann muss darunter ein Feld mit "---" auf den neuen Sensor eingestellt
werden.
Ist die Fernsteuerung auf den Hauptbildschirm geschaltet, muss man in meinem
Fall den Stick für eine Sekunde nach unten ziehen, damit das eingerichtete
DISPLAY gezeigt wird.
Echten Sensor anschließen
Das war schon alles, um sich an den SmartPort ran zuhängen. Natürlich macht
der Anschluss nur Sinn mit einem echten Sensor.
Für dieses Beispiel verwende ich einen Temperatur Sensor, der über die I²C Schnittstelle angesprochen wird. An der Stelle hätte ich auch einen interessanteren Sensor nehmen können, dennoch soll das Beispiel schlicht bleiben. Und der Code für den Temperatur Sensor lässt sich in wenigen Zeilen eingeben.
#include <SPort.h>
#include <Wire.h>
SPortHub hub(0x12, 3);
CustomSPortSensor sensor(getSensorData);
#define TMP102_ADD 0x48
void setup() {
Wire.begin();
hub.registerSensor(sensor);
hub.begin();
}
void loop() {
hub.handle();
}
sportData getSensorData(CustomSPortSensor* sensor) {
sportData data;
data.applicationId = 0x5900;
int raw = getTemperatureValue();
float result = raw * 0.0625;
data.value = raw;
return data;
}
int getTemperatureValue() {
Wire.beginTransmission(TMP102_ADD);
Wire.write(0x00);
delay(100);
Wire.endTransmission();
Wire.requestFrom(TMP102_ADD, 2);
while(Wire.available() < 2) { }
return ((Wire.read() << 8) | Wire.read()) >> 4;
}
Wert-Ausgabe nur Ganzzahl
Nun haben wir einen Rohwert, der einem so nichts sagt. Eigentlich könnte der
Wert am Arduino umgerechnet werden, aber ich hatte aus den Source Code
gelesen, dass nur Ganzzahlen übermittelt werden.
LUA Script
Die Antwort für das Umrechnen der Ganzzahlen in einen Wert mit
Nachkommastellen ist die Unterstützung von Lua Script auf OpenTX. Statt den
Rohwert auf dem Display auszugeben, kann dieser durch einen Script
umgerechnet werden und dann auf dem Display als lesbaren Wert ausgegeben
werden.
Aber kommen wir zunächst zu dem Teil, was eigentlich ein LUA Script haben
muss. Im Wesentlichen hilft hier die Dokumentation
Telemetry Scripts.
Vorraussetzung
- Das Lua Script muss auf der SD Karte in das Unterverzeichnis "SCRIPTS\TELEMETRY\".
- Das Script muss die Namenserweiterung ".lua" haben.
- Der Name des Lua Script darf nicht länger als sechs Zeichen lang sein, ansonsten wird das Script in der DISPLAY Einrichtung nicht angezeigt. Die Namenserweiterung ".lua" wird an der Stelle nicht mit gezählt.
Im Grunde sollte das Script mindestens die 'local function run' enthalten. Die "Init" Funktion ist optional und eigentlich sollte das auch ohne eine Background-Funktion funktionieren. Wichtig ist, dass die Methode am Ende einen Return-Wert ausgibt.
local function run_func(event)
lcd.clear()
local receivedValue = getValue('TEMP')
local toDecValue = receivedValue * 0.0625;
lcd.drawText(10, 10, "Temperature", MIDSIZE)
lcd.drawText(10, 25, string.format("%.2f", toDecValue), MIDSIZE)
return 0
end
return { run=run_func }
Einbinden des Scripts
Nun kann das Script auf die SD Karte und in die Fernsteuerung mit OpenTX gesteckt werden. Nach dem Einschalten kann über das Menü DISPLAY (auf der Xlite Pro befindet sich dieses in Abschnitt 12), auf Screen 1 von Nums gewechselt werden. Rechts von der Script Einstellung, kann man nun das Script myVal.lua auswählen.
Anschließen geht’s zurück auf den Hauptscreen. Mit dem 1 bis 2 Sek nach
unten gezogenen Stick kann man vom Hauptdisplay auf den gescripteten
Bildschirm (Display) wechseln. Fertig!
Schlusswort
Irgendwie habe ich im Internet keine Beschreibung gefunden, die in wenigen
Schritten aufzeigt, was zu tun ist, um einen Wert auf dem Display
anzuzeigen. Am Ende ist der Aufbau sehr übersichtlich, aber die kleinen
Details, die man wissen muss, halten einen auf.
Natürlich werde ich an den Sensor mehr als nur ein Temperatur Sensor
anschließen, schließlich kann man die Lage noch ermitteln und Abstände
messen.
Was ich vermisse, ist ein Designer für die Bildschirm Ausgabe. Entweder habe
ich den nicht gefunden oder für diesen Zweck gibt’s einfach keinen. Dabei
wäre ein Designer nicht schwierig, aber es wäre zeitaufwendig diesen zu
entwickeln (womit ich mir praktisch die Frage selbst beantworte).
Eintrag zu meinem Repository:
Sourcen
Kommentare