PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : M-Link Sensor mit Arduino



MaOb
12.08.2011, 22:17
hab heute mal etwas mit einem arduino herumgespielt und einen Sensor für M-Link gebastelt, war gar nicht so schwer :cool:
weil's so schön funktioniert hat, wurde daraus gleich mal eine library für arduino erstellt
mit C und C++ hatte ich bisher nix zu tun, mit viel nachlesen ist das aber doch noch was geworden!

ein kleines demo-video, poti wird ausgelesen, sensor antwortet auf 3 adressen:

http://www.youtube.com/watch?v=VG_MYv7lHlU&feature=player_embedded

die doku zum msb kann man bei mpx anfordern, hat das sonst noch jemand gemacht und vielleicht auch schon mit dem MSB gespielt?
recht viel ist dazu im www leider noch nicht zu finden.....

wenn ich das ok von mpx bekomme, werde ich meinen code für arduino auch veröffentlichen!
eine anfrage dazu hab ich mal abgeschickt.....

lg, martin

Tempo
12.08.2011, 22:55
Hallo Martin,

habe zufällig Deinen Beitrag gesehen.

Ich habe gerade das Gegenteil realisiert, eine eigene frei programmierbare Auswerteeinheit
für den MSB am Boden:

685165
685166

Im nächsten Schritt habe ich das gleiche wie Du vor, nämlich einen Arduino als Sensor an Bord.
Hast eine PN !

Viele Grüße

Tempo

ingo_s
13.08.2011, 10:51
Hi Martin,

schön das sich mal wieder jemand zu diesem Thema meldet. Ich baue schon seit vorigem Jahr MSB Sensoren und hatte im Februar auch schon mal eine Rundfrage gestartet wer so im stillen Kämmerlein an Sensoren arbeitet. Schau dir mal meinen Thread an, besonders die Parametrierung:
http://www.rc-network.de/forum/showthread.php/250726
Leider gab es nur ganz wenig Resonanz.
Mittlerweile habe ich eine Sensor Demo, die auch das parametrier Verfahren beinhaltet erstellt und gebe sie auf Anfrage heraus.

@Tempo
die Anzeige ist doch für Dein ACT System oder?
Was für eine Anzeige setzt Du da ein?
Kennst Du schon die neuen I2C Diffdruck Sensoren (ab 2,5mBar) und den MS5611 von AMSYS?


Gruß Ingo

gecko_749
13.08.2011, 12:23
Moin Ingo,

bin zwar nicht Tempo, hätte aber gerne mehr zu den Differenzdrucksensoren erfahren.

Gruß

gecko

ingo_s
13.08.2011, 12:58
Hi gekko,

unter http://www.meas-spec.com/pressure-sensors.aspx
dann digitale Drucksensoren findest Du alles. Einige Typen sind allerdings noch nicht lieferbar.

Was hast du damit vor?

Gruß Ingo

MaOb
13.08.2011, 13:56
anscheinend bin ich doch kein 'einsamer ritter' am MSB:D
eure threads kannte ich bisher nicht....google findet doch nicht alles:eek:

@ingo: deine doku hätte ich natürlich sehr gerne! meine mailadr. schick ich dir als pm

so hab ich das aktuell in meiner lib implmentiert:
es gibt eine klasse MSB mit den funktionen msbCheck und msbSend

ein kleines beispiel wie das in arduino zu verwenden ist:

* lib mit #include einbinden

#include <msb.h>
* eine instanz von MSB erstellen (das ist unser sensor), z.b.: ein spannungssensor der auf adr. 3 antwortet

MSB sensor1(3, MSB_CLASS_VOLTAGE);
für die werteklassen die es gibt hab ich in der lib ein paar konstanten deffiniert, nicht unbeding nötig, macht das leben aber leichter.

* im setup-teil wird nur die ser. schnittstelle eingeschalten

void setup() {
Serial.begin (msb_speed);
}

* so schaut dann der loop aus:

void loop() {
if (sensor1.msbCheck()){
sensor1.msbSend(100,0);
}
}
msbCheck() --> ist true wenn der sensor vom master (=empfänger) abgefragt wurde
msbSend(100,0) --> sendet als antwort den wert 100, das alarmbit ist nicht gesetzt

das war's dann auch schon, der sensor ist fertig:D
mehr kann meine lib bisher auch (noch) nicht.....

haltet ihr das vom syntax her für ok? kann man was besser/anders machen?
man möge es mir verzeihen wenn das eine oder andere 'blödsinn' ist,
ist das 1. mal das ich was mit C/C++ gemacht habe, da gibt's noch viel zu lernen!

lg, martin

Nils_93
13.08.2011, 14:18
Hallo!

Entschuldigt bitte meine vermutlich sehr blöde Frage, aber was oder wer ist bitte ein "arduino"?

Mfg Nils

MaOb
13.08.2011, 14:20
was wichtiges vergessen.....
so schaut die schaltung für den msb aus, zum einspielen der software muss rx/tx am arduino getrennt werden!
685354

MaOb
13.08.2011, 14:25
Entschuldigt bitte meine vermutlich sehr blöde Frage, aber was oder wer ist bitte ein "arduino"?


ist keine blöde frage, sondern durchaus berechtigt!
http://www.arduino.cc/

praktisch nichts anderes als ein avr-prozessor mit usb
der dialekt ist (wie ich finde) recht einfach zu lernen.
ich verwende aktuell ein nano-board (http://arduino.cc/en/Main/ArduinoBoardNano)


lg, martin

Tk7
13.08.2011, 15:27
Hallo
ein arduino ist als ein avr
alles klar
Gruß tk7

foobar
13.08.2011, 20:00
...sehr guter Thread: Falls Multiplex nichts gegen eine oeffentliche Library hat, waere ich sehr interessiert; sonst aber auch:D Arduino ist fuer eine schnelle Sensorentwicklung bzw. fuer das Prototyping ja geradezu vorherbestimmt...

Danke und Gruesse,

Tempo
14.08.2011, 16:45
...

@Tempo
die Anzeige ist doch für Dein ACT System oder?
Was für eine Anzeige setzt Du da ein?
Kennst Du schon die neuen I2C Diffdruck Sensoren (ab 2,5mBar) und den MS5611 von AMSYS?


Gruß Ingo

Hallo Ingo,

Die Anzeige ist ein 12Spalten-4Zeilen-LCD.
Damit mache ich "Große Ziffern ca. 25mm groß" über 3 Zeilen, die sehr schnell zu erkennen sind.
Außerdem ist das eine reine Kontrollanzeige mit einzig der Information, die ich brauche.

Und dann hat das Ding natürlich noch einen akkustischen Alarm und noch besser
einen "Vibrationsalarm" aus einem alten Mobiltelefon.

Die Sensoren schaue ich mir noch an. Bin erst noch am Testen von anderen Modulen.

Viele Grüße

Tempo

P.S.: Hier scheinen sich ja die richtigen Leute zu treffen !
War wohl Zeit für dieses vereinende Thema.

gecko_749
15.08.2011, 21:27
Hi gekko,

unter http://www.meas-spec.com/pressure-sensors.aspx
dann digitale Drucksensoren findest Du alles. Einige Typen sind allerdings noch nicht lieferbar.

Was hast du damit vor?

Gruß Ingo

Moin,

heißen Dank erst mal.

Na zum einen die sündteuren SM-Sensoren ersetzen und zum anderen träume ich von einem Schiebewinkelsensor. Aber das dauert wohl noch ein bischen....

Gruß

gecko

Tempo
18.08.2011, 10:23
Moin,

heißen Dank erst mal.

Na zum einen die sündteuren SM-Sensoren ersetzen und zum anderen träume ich von einem Schiebewinkelsensor. Aber das dauert wohl noch ein bischen....

Gruß

gecko

Hallo Gecko,

ja, Segelflieger wollen immer nur das eine : Schiebefrei fliegen und vor allem schiebefrei Kreisen und das mit der optimalen Klappenstellung ! ;)

Ich bin gerade kurz davor meine Schiebewinkelsonde zu testen. Diese ist Bestandteil meiner
Anti-Schiebe-Automatik, welche wiederum ein Teil meiner Wölbklappenautomatik ist.
Die Automatik ist natürlich per Fernsteuerschalter nach Bedarf an/abschaltbar.
Als Schiebewinkelsonde benutze ich die entsprechenden Anschlüsse meiner 5-Loch-Sonde und Ultra-Low-Pressure-Sensoren für den unteren Geschwindigkeitsbereich, in dem unsere Segelflugzeuge kreisen. Und zur Kalibrierung benutze ich einen hochpräzisen Windfahnen-Winkelsensor (siehe auch dort: http://www.rclineforum.de/forum/board49-zubeh-r-elektronik-usw/elektronik-spezial-eigene-scha/280074-w-lbklappenautomatik-f-r-f3x-w/ ).

Viele Grüße

Tempo

MaOb
11.10.2011, 16:44
ich habe doch noch eine antwort von mpx erhalten:


bitte entschuldigen Sie die Verspätung, wie Sie sich sicher vorstellen können sind wir in der Entwicklung aktuell sehr beschäftigt, aber nun zu Ihrer Frage:

Gerne dürfen Sie den Code offen legen. Ich bitte Sie aber einen Hinweis in den Code zu Schreiben, dass das MSB-Logo geschützt ist und nur nach Rücksprache verwendet werden darf und das es bei Erweiterungen oder kommerziellen Anwendungen sinnvoll ist sich bei Multiplex offiziell das Protokoll geben zu lassen, denn nur so hat man die Chance mit seiner Software aktuell zu bleiben.

somit spricht nix dagegen sich über den MSB zu unterhalten;-)
allen die wirklich interesse daran haben empfehle ich die beschreibung zum MSB bei MPX anzufordern.
in dem pdf ist wunderbar erklärt wie das sende/antwort-spiel am MSB abläuft.

leider hab ich momentan recht wenig zeit, hab auch schon länger nichts daran gemacht....
meinen code habe ich zwischenzeitlich vollständig auf die beta von arduino 1.0 umgestellt.
http://code.google.com/p/arduino/wiki/Arduino1
hintergrund der aktion war das es in 1.0 mit 'serialEvent' eine funktion gibt die aufgerufen wird wenn daten angekommen sind.
mein code arbeitet somit noch immer mit dem uart des arduino, das hat ein paar nachteile:
*) die pin's sind vorgegeben
*) zum aufspielen der software muss die schaltung aus post #8 immer abgesteckt werden
*) die gesendeten daten werden durch die schaltung gleich wieder empfangen --> buffer muss nach dem senden gelöscht werden
*) serialFlush macht in arduino 1.0 nicht mehr das was es davor gemacht hat
Serial.flush() now waits for transmission of outgoing data rather than discarding received incoming data.
dadurch ist es nötig die originale HardwareSerial zu patchen um eine funktion 'flushRX' einzubauen

wirklich schön und einfach ist das aktuell also nicht.....
denke um das ganze wirklich praxistauglich zu machen und die einschränkungen durch arduino zu umgehen müsste man sich vom uart des arduino trennen, der sollte eigentlich schnell genug sein um das in software zu erledigen.
es gibt ja die SoftwareSerial library, auf ähnlicher basis sollte auch eine MSB library zu machen sein.

frage an die allgemeinheit: hat jemand schon mal was ähnliches gemacht?

lg, martin

ps: falls jemand unbedingt meinen aktuellen code haben möchte, bitte eine pm senden

thomasH
05.11.2011, 17:01
es gibt ja die SoftwareSerial library, auf ähnlicher basis sollte auch eine MSB library zu machen sein.

Hallo,

ich fange auch gerade an mich mit dem Thema MSB + Arduino zu beschäftigen. Wobei ich noch in der Phase der Informationssammlung befinde.
Mir wäre die Verwendung einer Software UART auch sympatischer - das erleichtert auch Entwicklung/Debugging da man die HW-UART dann über den Serial Monitor für Diagnosezwecke verwenden kann.

Ich habe noch keine MSB-Spec von Multiplex vorliegen - daher die Frage: Wie hoch ist den die Baudrate des MSB?

Gruß
Thomas

Tempo
05.11.2011, 17:32
Hallo Thomas,

die Datenübertragungsrate beim MSB ist 34800 Baud.

Ich habe für meine Zwecke mit einem Speicheroszilloskop die komplette Datenübertragung des MSB aufgezeichnet, wobei jedes Bit erkennbar ist.
Wenn Du Fragen hast, melde Dich.

Viele Grüße
Tempo

Tempo
05.11.2011, 17:51
Hallo,

und da geht es bei meinem TempoMat1 lang:

Starte gerade die Programmierung meines Menues.
Versuche es mit den Softwareelementen struct und pointer.

723723723724723725723726

Bei meinem TempoMat1 gibt es vier Taster, die gemeinsam an einem einzigen ADC-Pin jeweils verschiedene Spannungsteiler freigeben.
Dafür habe ich eine Funktion programmiert, die mir die Nummer des betätigten Schalters zurückgibt.

Viele Grüße

Tempo

Tempo
05.11.2011, 21:13
Hallo ,

und so sieht meine Anzeige z.B. der Bordspannung im Flugzeug aus, die per MSB-Telemetrie an den TempoMat1 am Boden geschickt wird.
Die Zifferngröße ist so groß wie ein 1 Cent Stück (16mm).

Sie ist sehr Kontrastreich und damit gut abzulesen.
Der TempoMat1 wird oben am Handsender befestigt, genauer an der ehemaligen 35MHz-Antenne.

Sebstverständlich wird auch ein Alarm bei einer frei wählbaren Schwellenspannung ausgegeben: Piezopiepser oder Vibrationsalarm und Farbwechsel auf Rot.

723857

Viele Grüße

Tempo

P.S.:
Auf der Basis des Arduino-Konzeptes www.arduino.cc lassen sich recht schnell Prototypengeräte mit Mikroprozessoren aufbauen.
Mein TempoMat1 ist so ein Prototyp und voll kompatibel mit einem arduino-pro-mini.

Als Schnittstelle habe ich mir meine alte Platine von ACT umgebaut, die zuvor für die Empfängerprogrammierung gedacht war.
Ich habe dazu mit Kupferlackdraht weitere Pins am FTDI232R-Chip abgegriffen und einen Umschalter von 5V auf 3V3-Signalpegel
bzw. Versorgung eingebaut.

So passt die Schnittstelle jetzt außerdem auf den www.openaltimeter.org, der ebenfalls auf dem arduino aufbaut und frei programmierbar ist. Und für die Ladegerät der Firma Bantam kann die Schnittstelle ebenfalls zusammen mit www.logview.info genutzt werden.

thomasH
26.11.2011, 20:22
Hallo zusammen,

nachdem ich vor ca. 3 Wochen auf diesen Thread gestossen bin, hat mich das Thema nicht mehr locker gelassen. Angefangen hat es eigentlich damit, dass ein Vereinskamerad von mir den Zündimplusausgang, den viele Benzinerzündungen bieten, direkt für einen M-Link Sensor nutzen wollte.
Gut, das würde man evtl. auch einfach dadurch hinbekommen, dass man den optischen Drehzahlsensor von MPX umbaut - aber die Idee gleich was komplett eigenes zu bauen war auch reizvoll.

Wir haben z.B. die Idee einen Mutlisensor - ähnlich der "General Air" Module von Graupner - zu bauen.

Aber erst mal ein Schritt nach dem anderen. Zunächst haben wir uns jeder ein Arduino Uno Board (http://arduino.cc/en/Main/ArduinoBoardUno) und ein wenig Zubehör zum Testen bestellt - außerdem ein Arduino Pro Mini (http://arduino.cc/en/Main/ArduinoBoardProMini) - das wollen wir später als Basis für Sensoren im Flieger verwenden.

Die letzten 1,5 Wochen habe ich nun damit verbracht eine Library für den Zugriff auf den MSB zu bauen. Mit dieser Library kann man zum einen auf dem MSB "mitlesen" und Daten anderer Sensoren holen (z.B. könnte man damit einen MSB Datenlogger bauen) - zum anderen kann sie Sensworwerte auf den Bus schreiben.
Dazu implementiert sie das "Idle Line Multiprozessor Protokoll" des MSB.

Die Libary nutzt die NewSoftSerial http://arduiniana.org/libraries/newsoftserial/ Library für die Kommunikation. Gegenüber der Hardware Serial Schnittstelle hat man zum einen den Vorteil das man viel komfortabler debuggen/testen kann (die Hardwareschnittstelle wird nur zur Kommunikation mit dem PC verwendet),
außerdem lassen sich einige Details damit besser beeinflussen, als mit der Hardwareblibliothek. Ich habe allerdings auch ein paar kleine Erweiterungen der NewSoftwareSerial Library vornehmen müssen damit alles sauber funktioniert.


Auf jeden Fall sind die ersten Tests nun erfolgreich gelaufen - einen einfachen Spannungssensor konnte ich erfolgreich implementieren.


Mehr dazu werde ich demnächst als Blog auf RC-Network veröffentlichen.


Gruß
Thomas

Tempo
26.12.2011, 10:44
Hallo,

für eigene Experimente eignet sich das http://openaltimeter.org/.
Es ist eine Platine mit komplettem Arduino-Mikrokontroller, einem 4Mbit-flash-Speicher, einem Drucksensor und einem Piezoalarm.
Alles ist für 3,3Volt Sensoren ausgelegt, sodaß auch mit kleinem Eingriff in die Platine weitere TWI-Sensoren angeschlossen werden können.

749179

Ich werde mein openaltimeter für erste Versuche bei meinem Wölbklappenautomatik-Projekt verwenden, bei dem ich folgende TWI-Sensoren
anschließen werde:
3 x Ultra-low-pressure-Sensoren
1 x Beschleunigungssensor
1 x Drehratensensor

Die Arduino-Programmierung des openaltimeter zum MSB-Sensor steht an !

Hallo Martin, Du hast eine Persönliche Nachricht !

Viele Grüße

Tempo

Tempo
26.12.2011, 22:48
Hallo zusammen,
...
Die letzten 1,5 Wochen habe ich nun damit verbracht eine Library für den Zugriff auf den MSB zu bauen. Mit dieser Library kann man zum einen auf dem MSB "mitlesen" und Daten anderer Sensoren holen (z.B. könnte man damit einen MSB Datenlogger bauen) - zum anderen kann sie Sensworwerte auf den Bus schreiben.
Dazu implementiert sie das "Idle Line Multiprozessor Protokoll" des MSB.

Die Libary nutzt die NewSoftSerial http://arduiniana.org/libraries/newsoftserial/ Library für die Kommunikation. Gegenüber der Hardware Serial Schnittstelle hat man zum einen den Vorteil das man viel komfortabler debuggen/testen kann (die Hardwareschnittstelle wird nur zur Kommunikation mit dem PC verwendet),
außerdem lassen sich einige Details damit besser beeinflussen, als mit der Hardwareblibliothek. Ich habe allerdings auch ein paar kleine Erweiterungen der NewSoftwareSerial Library vornehmen müssen damit alles sauber funktioniert.
...

Gruß
Thomas

Hallo Thomas,

genau das passt auf das "openaltimeter", das mit Deinem "Arduino-Pro-Mini" kompatibel ist.

Hast eine PN !

Viele Grüße

Tempo

MaOb
27.12.2011, 15:45
Hallo,

Bei mir hat sich leider nicht viel getan....momentan fehlt mir ganz einfach die zeit dazu:-(
Ein openaltimeter hab ich auch noch herumliegen!
Das wartet noch immer auf meinen bestellten blaster2 seit Monaten nicht in 'nur neon orange' zu bekommen ist.
(wurde schn 2x vertröstet weil nur Neon-Orange mit gelb geliefert wurde.....das will ich meinem Auge nicht zumuten.....)
Aber das ist eine andere Geschichte und OT....zurück zum Thema!

Schaut euch das mal an:
http://www.rcgroups.com/forums/showthread.php?p=16849720#post16849720
Anscheinend gibt es schon eine mlink firmware für das OA
ich habe versucht den Schreiber(komar) über rcgroups zu kontaktieren, leider ohne Erfolg, es ist nie eine Antwort gekommen....

Lg, Martin

landebahnpflug
06.01.2012, 23:26
das ich den thread jetzt erst finde...
also gibt es schon die Libs für den Adruino für den sensor und auch das display ... :eek:
und ich kurbel hier um und komm ned weiter .... und im forum adruino hatte ich auch nix gefunden
ich wollt nen fahrwerk dran hängen.... ;)
so mit druck und zustand ...
wo finde ich die LIBS?

thomasH
07.01.2012, 01:54
Hallo zusammen,

ich habe ja mittlerweile schon einige Anfragen per PN und EMail bzgl. meiner M-Link Library bekommen - und antworte hier mal gesammelt:

Ich habe meine M-Link Library mittlerweile noch etwas erweitert und verbessert.
Sie hat folgende "Features"

Direkte Anschluss an den MSB ohne Zusatzhardware


MSB Monitor Funktionen (z.B. für Datenlogging, Diagnose)


Komfortable Implementierung des MSB „ldle Line Multiprocessor Protocols“ um Werte auf den MSB auszugeben. Dabei muss der Anwender der Library sich nicht mit den Details des MSB auseinandersetzen. Das richtige Timing wird automatisch eingehalten.


Multi-Adressen Unterstützung – die Library kann automatisch Werte für mehrere MSB Adressen auf den Bus geben


Die Library wird zur Zeit nur noch mit Ardunio 1.0 weiterentwickelt und getestet. Ältere Ardunio Versionen sollten evtl. auch funktionieren (der Code enthält an einigen Stellen entsprechende „#ifdef“ Direktiven).


Getestet ist sie mit dem Arduino Uno Board und dem Ardunio Pro Mini 5V/16Mhz von Sparkfun


Es ist geplant, auch 8Mhz Ardunio Boards (z.B. Pro Mini 3,3V/8Mhz) zu unterstützen – da sich 3,3V Komponenten besser mit modellflugüblichen Stromversorgungen (z.B. 4 Zeller NiXX Akkus) vertragen – die ATmega Prozessoren aber bei 3,3V nur max. 8Mhz Takt vertragen. Hier stehen aber noch Tests aus.



Ich habe mittlerweile auch ein ausführlich kommentierten Beispielsketch erstellt - außerdem schreibe ich gerade an einer kleinen Doku.
Geplant ist die Bibliothek im Laufe des Monats Januar unter der GNU LGPL zu veröffentlichen - sofern auch Multiplex da keine Einwände hat.

Die hier erwähnte Openaltimeter Hardware müsste man auch verwenden können - nachteilig ist hier nur, dadd an der Openaltimeter Platine nur wenige Atmel Pins nach außen geführt sind - ohne Lötarbeiten kommen also nur die Pins "SERVO1" oder "SERVO2" infrage.

Also bitte noch ewas Geduld....

Gruß
Thomas

Tempo
07.01.2012, 10:16
Hallo Thomas,

das hört sich sehr gut und ausgereift an.:)
Ich bin gespannt auf Dein Ergebnis und würde es dann sehr gerne in mein Projekt miteinbinden.
Sicher ist es eine Bereicherung in der Schnittmenge der arduino-Modellbauer-Gemeinde.

In der openaltimeter-Gemeinde gibt es ebenso Interesse: http://www.rcgroups.com/forums/showthread.php?t=1342829&page=11&highlight=openaltimeter+sensor#post16858942
Jony, der Schöpfer des openaltimeter-Projekts ist übrigens ein Schleudersegler(DLG)-begeisterter Physiker:
http://www3.imperial.ac.uk/people/jony.hudson/

Viele Grüße

Tempo

P.S.:
Zitat
"Die hier erwähnte Openaltimeter Hardware müsste man auch verwenden können - nachteilig ist hier nur, dadd an der Openaltimeter Platine nur wenige Atmel Pins nach außen geführt sind - ohne Lötarbeiten kommen also nur die Pins "SERVO1" oder "SERVO2" infrage. "

Und die Hardware-UART-Verbindung ist herausgeführt, sodaß man gleich die Daten des eingebauten Bosch-Drucksensors als auch die Daten des Analog-Digital-Converter für eine beliebige Spannungskontrolle an einen Multiplex-Sensor-Bus
ausgeben kann. Ebenso kann man ohne Hardwareumbauten den 4Mbit-flash als Datenspeicher nutzen.

thomasH
07.01.2012, 19:16
Und die Hardware-UART-Verbindung ist herausgeführt, sodaß man gleich die Daten des eingebauten Bosch-Drucksensors als auch die Daten des Analog-Digital-Converter für eine beliebige Spannungskontrolle an einen Multiplex-Sensor-Bus
ausgeben kann. Ebenso kann man ohne Hardwareumbauten den 4Mbit-flash als Datenspeicher nutzen.

Nur leider unterstützt meine Bibliothek aus den oben genannten Gründen die Hardware-UART (also die TX/RX Pins am Openaltimeter) nicht. Wobei man sich unter Umständen damit behelfen kann, dass man die HW-UART abschaltet - dann sind auch die TX/RX Pins "normale" I/O Pins und können von der Software-UART bedient werden.

Gruß
Thomas

landebahnpflug
07.01.2012, 21:38
Ich habe mittlerweile auch ein ausführlich kommentierten Beispielsketch erstellt - außerdem schreibe ich gerade an einer kleinen Doku.
Geplant ist die Bibliothek im Laufe des Monats Januar unter der GNU LGPL zu veröffentlichen - sofern auch Multiplex da keine Einwände hat.


Löblich löblich, nur wäre es mir persönlich egal wenn MPX ein Einwand hätte, Wenn frei Entwickler schneller sind als die Profis, dann sollte MPX
sich da doch mal verstärken...

sorry aber MPX verschiebt immer wieder und irgendwann hat man nur zwei Möglichkeiten entweder alles weg tun und anderes System oder selber machen..
und ob das MPX gefällt oder nicht es wird immer wieder Firmen oder Menschen geben die MSB kompatible Geschichten bauen werden ( siehe jeti oder ACT )
Und wenn MPX das nicht möchte dann würde ich sagen, einfach mal Hackendampf geben ...

just my 2 cent

thomasH
07.01.2012, 22:03
Löblich löblich, nur wäre es mir persönlich egal wenn MPX ein Einwand hätte, Wenn frei Entwickler schneller sind als die Profis, dann sollte MPX
sich da doch mal verstärken...
.....
Und wenn MPX das nicht möchte dann würde ich sagen, einfach mal Hackendampf geben ...


Bleib' mal ganz entspannt. Möchte nicht das hier die üblichen Hersteller-Bashing Diskussionen entstehen. Multiplex arbeitet im Bereich M-Link sehr professionell und vernünftig und gibt die MSB-Spec auf Anfrage ohne Formalien (wie etwa NDA's) heraus. Ich gehe aber davon aus, dass ich ein Dokument, was nicht öffentlich zum Download angeboten wird, auch ohne solche Formalien zunächst als "vertraulich" behandle. Wenn ich nun eine Software auf Basis dieser Infos entwickele, halte ich es für guten Stil, mich vor einer Veröffentlichung der Quelltexte mit Multiplex abzustimmen.

Vertrauen beruht nämlich immer auf Gegenseitigkeit.

Gruß
Thomas

ingo_s
07.01.2012, 22:49
Hier mal anbei einige Bilder vom SetUp Vorgang mit der kleinen umprogrammierten Box und ein Bild des angeschlossenen Multi-Sensors. Der Sensor agiert als Lipo-Zellen Einzelzellen Überwachung, Strom, Stromverbrauchs und Drehzahl Sensor.

623462 623463 623465 623461623460 623459623464

Gruß Ingo
(Aus dem Thread "Treffpunkt DIY Multiplex Sensor-Entwickler (und die es werden wollen)" Post #15)

Jeder Sensor benötigt auch eine Parametrierung, die universelle Lösung von Helmut und mir möchte ich euch, falls Ihr sie noch nicht kennt ans Herz legen.

Das Prinzip ist ganz einfach, der Sensor liefert eine Beschreibung welche Einstellungen er beinhaltet, die Gegenseite also der Parametrierer ist dadurch universell.
Parametrieren geht z.Zt. mit einer umprogrammierten Robbe Programmer Box und in Kürze auch mit dem PC (Programm ist schon ist Testphase).

Die Sensor Parametrierung lässt sich in einer Baum-Struktur bzw. in Ebenen darstellen, für die sehr kompakte C-Strukturen entworfen die sich relativ leicht (wenn man die Strukturen verstanden hat - Eine Erweiterten Beschreibung will ich noch erstellen) im Sensor implementieren lassen.

Gruß Ingo

landebahnpflug
08.01.2012, 12:02
Bleib' mal ganz entspannt. Möchte nicht das hier die üblichen Hersteller-Bashing Diskussionen entstehen.
das sollte es auch nicht sein und so war es auch nicht gemeint.


nur Multiplex arbeitet im Bereich M-Link sehr professionell und vernünftig und gibt die MSB-Spec auf Anfrage ohne Formalien (wie etwa NDA's) heraus.
das war ja auch der Grund wieso in meiner MC22 ein MPX Modul seinen Dienst zu meiner vollsten Zufriedenheit tut.:)
nein auch wenn GRP jetzt mit Hott auch den ein oder andern gimik gelandet hat, halte ich den MSB für das vernünftigere System.

ich hatte 4 wochen urlaub ... ich bin tiefen entspannt ... :D

landebahnpflug
16.01.2012, 12:42
gibt es dann erst im März.... so langsam hab ich den Kaffee auf -....

Bernd FMC
16.01.2012, 18:46
also doch selber bauen ;-)

Bernd

landebahnpflug
16.01.2012, 19:01
wenn ich dann zu Mama zu Besuch fahre, können wir uns ja zu einer Messsession treffen und mal so ein 3d Display mit dynamischen Varioton und alles sowas
:)
Lübeck ist ja ned sooo weit von HH und son adruino kann ja was ... :D
mal sehen :)

Bernd FMC
16.01.2012, 19:12
:D Ich würd das schon hinbekommen, aber auch nicht bis März.
Aber - ich würde das erstmal einfach gestalten.

´Bin ja im Moment ERSTMAL bei meinem Einzelzellensensor dabei, und das wird auch schon.
( Nebenbei bin ich auch noch reichlich Vollzeit am arbeiten )

An sonsten darf ich hier aber eigentlich nicht schreiben, weil ich Pic´s von Microchip nutze.
Bitte nicht steinigen :rolleyes: .

Die Senderseite des MSB ist ja aber nicht offen gelegt, und das soll wohl auch so bleiben.
( Was nicht heissen soll das man die Daten nicht bekommt / hat )

Ein Bekannter in HL ist auch in der Lage so was zu proggen, und der verwendet auch Arduino
( weil er grad nen Quadcopter gebaut hat ) er ist aber auch erstmal bei Strom/Spannungsmessung .

Bernd

Tempo
17.01.2012, 12:37
Hallo landebahnpflug und Bernd FMC,


gibt es dann erst im März.... so langsam hab ich den Kaffee auf -....

für eure hochkarätigen Beiträge gibt es die Rubrik

http://www.rc-network.de/forum/forumdisplay.php/44-Caf%C3%A9-Klatsch

Müllt bitte unser (noch) überschaubares Thema nicht zu.;)

Viele Grüße

Tempo

landebahnpflug
17.01.2012, 12:58
An sonsten darf ich hier aber eigentlich nicht schreiben, weil ich Pic´s von Microchip nutze.
Bitte nicht steinigen :rolleyes: .

...........
Bernd
Jo eigentlich ist der µC egal , PIC ist besser in Sachen EMV und der Sprachumfang ist auch überschaubarer.
Adruino war haltmal ein Versuch und ist ein nettes Spielzeug ... Fritzing dazu und man hat eben ein einfaches anfängertaugliches toolpaket. Für ersthafte dinge muss man dann doch wieder richtig ins Bit steigen.

Wenn Thomas die LIB veröffentlicht würde das natürlich die sache beschleunigen. Aber der Kollege Stöckli hat den bus ja schon mal durchgemessen und veröffentlicht insofern sehe ich jetzt nicht wirklich das problem von Thomas. Ausser das er sich wirklich Gedanken und arbeit gemacht hat die dann noch vor uns liegt...
IDC2 und alles hätte ich auch zur Verfügung.

landebahnpflug
17.01.2012, 17:45
habe ich mal nur für die Anzeigefraktion einen eigen Thread aufgemacht

Also wenn Display dann Guggst du hier (http://www.rc-network.de/forum/showthread.php/308806-MPX-Display-mit-Adruino)
:D

Bernd FMC
17.01.2012, 20:00
für eure hochkarätigen Beiträge gibt es die Rubrik

http://www.rc-network.de/forum/forumdisplay.php/44-Caf%C3%A9-Klatsch

Tempo

Naja, es ist oot, da anderer Proc und kein Sensor, aber über die Art der Formulierung sollte
man vor dem posten nachdenken - ok bin dann hier auch weg, die Entwicklungen laufen
eh nicht in Foren o.ä. .

Gruß Bernd

thomasH
05.02.2012, 20:24
Hallo zusammen,

leider komme ich mangels Zeit nur mit verhaltenem Tempo weiter. Ich habe in den letzten Wochen meine MSB Bibliothek nochmal etwas optimiert, sodass sie nur auch mit 8Mhz ATMEGAs läuft (und damit auch mit 3,3V Boards). Dabei sind auch noch ein paar Fehler rausgeflogen :)

Doku ist in Arbeit - außerdem läuft die oben schon erwähnte Anfrage an MPX noch. Es liegt jetzt bei Hr. Choquet persönlich.

Heute habe ich dem eisigen Wind getrotzt und meinen G-Sensor in einem Twinstar II getestet - also im realen Modell. Hat funktioniert.

Ab einer gewissen Komplexität der Programme ist die Arduino Umgebung etwas unhandlich - ich habe daher die Open Source Idee Codeblocks so konfiguriert das ich die Arduino Libraries damit benutzen kann. Das Aufsetzen eines Projektes macht mehr Arbeit als mit Arduino - man muss auch mehr Details beachten - danach hat man aber einfach ein vielfaches an Komfort.

Durch das G-Sensor Programm habe ich einiges an Erfahrung sammlen können. Die wichtigste: Man muss schon mit Interrupts arbeiten wenn man gleichzeitig Sensoren sampeln und das MSB Timing einhalten will. Als Nebeneffekt noch eine Klasse zum asynchronen Auslesen der A/D Wandler entstanden.


Gruß
Thomas

skytor
14.02.2012, 08:14
Hallo Thomas ..

nich das du denkst hier liest keiner mehr mit ;-) .... wir warten gespannt auf den Download Link und das Eagle Layout zum nachbauen :D

Gruss aus Lübeck

Bernd FMC
14.02.2012, 12:32
Klar lesen hier alle mit, und trinken Kaffee.

Mein Layout verifiziere ich noch mal, dann wird geätzt.


Gruß Bernd

thomasH
14.02.2012, 22:58
Hallo Thomas ..

nich das du denkst hier liest keiner mehr mit ;-) .... wir warten gespannt auf den Download Link und das Eagle Layout zum nachbauen :D

Gruss aus Lübeck

Hallo,

warte leider immer noch auf die Antwort von Multiplex. Außerdem hatte ich jetzt noch ein kleines Problem:
In letzter Zeit habe ich die Library nur mit mit einem 8Mhz Prozessor genutzt und noch ein paar kleine Anpassungen vorgenommen damit alles mit dem kritischeren Timing bei dieser Frequenz funktioniert. Als ich sie nun wieder auf dem Ardunio Uno mit 16Mhz benutzen wollte ging nichts mehr - ich musste die Timingparameter der NewSoftSerial etwas anpassen. Jetzt weiß ich nicht ob mein Uno eine "Macke" hat, oder die Änderungen im Coding das Timing beeinflusst haben. Muss jetzt mal mit anderen Boards Tests fahren. Ist doch etwas kritisch mit de Sofware Library.

Bezüglich Hardware: Eagle Layout wird es von mir nicht geben - ich arbeite zur Zeit mit Lochraster + Breakout Boards für die Sensoren - reicht für meine Zwecke - in die Fertigung von SMD Platinen möchte ich nicht einsteigen. Für meine Zwecke reicht das - meine Modelle sind groß genug :)

Aber vielleicht hat ja jemand Lust die Schaltung professionell aufzubauen - dann freue ich mich. Der G-Sensor ist von der Beschaltung trivial - aber ich veröffentliche die Schaltung gerne hier.

Der von mir verwendete Sensor (Freescale MMA7341L) ist leider nicht sehr genau (die verschiedenen Achsen haben recht große Differenzen) - und die +/- 11g sind auch nicht sehr üppig. Im Twinstar habe ich locker 6g erreicht....

Bin am überlegen, auf einen Sensor mit digitaler Aufbereitung und SPI/I2C Bus umzusteigen (z.B. Analog Devices ADXL345).



Gruß
Thomas

thomasH
03.03.2012, 10:50
Hallo zusammen,

mittlerweile liegt eine Antwort von Multiplex vor, dass sie keine Bedenken haben, das ich meine MSB Library zu veröffentliche. Sie baten mich nur einen Hinweis auf den Schutz des MSB-Logos einzufügen und die Empfehlung, dass sich Entwickler, die ihre Hard-/Software öffentlich anbieten, bei Multiplex formlos registrieren damit sie immer die aktuelle Spezifikation zugesendet bekommen können.

Ich habe mittlerweile eine rudimentäre Dokumentation fertig. Zunächst stelle ich mir noch eine "Testphase" vor. Wer interessiert ist, kann die Library ab sofort bei mir anfordern - PN genügt.

Noch eine Ergänzung: Ich habe die Library unter die GNU GPL gestellt, weil ich im ersten Schritt nicht möchte, dass auf ihrer Basis "closed Source" Software entwickelt wird. Falls jemand Bedarf daran hat, die Library für ein komerzielles closed-soruce Projekt zu verwenden, finden wir sicher einen Weg ;)

Gruß

Thomas

alex ka.
05.03.2012, 15:07
Hallo Thomas,

coole Sache, vielen Dank! Das erleichtert diverse Entwicklungen ungemein ;)

Ich habe da auch noch diverse Dinge vor, was momentan aber noch magels Zeit auf Eis liegt...

Gruß, Alex

Tempo
30.03.2012, 12:08
Hallo,

in diesem Blog

http://sensiq.blogspot.de/

hat ein weiterer MSB-Arduino-Freund sein schönes Werk vorgestellt.


Viele Grüße

Tempo

P.S.:
Danke an Ingo, der mich durch seinem Beitrag darauf aufmerksam gemacht hat.
http://www.rc-network.de/forum/showthread.php/250726-Treffpunkt-DIY-Multiplex-Sensor-Entwickler-%28und-die-es-werden-wollen%29?p=2742860&viewfull=1#post2742860

Tempo
30.03.2012, 12:32
Hier sind die Mikrokopter-Freunde mit Arduino und MSB aktiv:

http://forum.mikrokopter.de/topic-post346969.html

Viele Grüße

Tempo

Tempo
18.05.2012, 19:30
Hallo Freunde,

hier ein Bild der Eigenentwicklung meiner Anzeige im Einsatz.
Die großen Ziffern sind sehr schnell und leicht auch im Augenwinkel zu erfassen, ohne das Modell aus den Augen zu lassen.
Dazu halte ich lediglich meinen Handsender entsprechend zwischen Auge und Modell ;)
Das negativ LCD hat einen angenehm großen Kontrast im Sonnenschein unter großem Blickwinkel.


824313

Viele Grüße

Tempo

simon_123
19.04.2017, 00:51
Hallo alle zusammen,
bin auf diesen Thread gestoßen und wollte auch mal meinen Senf dazu geben:
First of all: danke! Dank dieses Threads und einigen anderen Websites habe ich erfolgreich meinen Arduino auf den Sensorbus aufgeschaltet.

Also: Wozu der ganze Spaß: mir sind die MPX sensoren zu teuer und mit Arduino kann man das ganze auchnoch selber individuell konfigurieren.

Wozu das erneute Aufwärmen des Threads? Es hat sich viel getan was Arduinos etc. angeht, va. bzgl. der Programmieroberfläche und libraries.

Falls Fragen zu dem Thema auftreten oder ihr persönliche Hilfe braucht, gern ne PN oder Mail an mich (simon123_1Äweb*de) [das Ä durch ein @ und den Stren duch einen Punkt ersetzen]

Also, zu meinem Projekt:
Ich brauche: ein Vario, einen Höhenmesser und einen Spannungsmonitor für meinen Antriebslipo.
Hardware:
- Arduinoboard (am besten mit nativem iic, >2 digital pins oder alternativ RX/TX pins vom regulären UART Serial, >1 anolog pin und einem 16bit Timer, damit die, für die Sensoren nötigen libraries problemlos laufen.) Ich empfehle konkret einen Arduino nano (für die Einsteiger unter uns) oder pro mini für die Fortgeschrittenen (3.3V evtl für diese Anwendung die Bessere Wahl). Von ATTiny rate ich ab!!!!
- Kleinere Elektrische Bauteile: Wiederstände im niedrigen kOhm bereich für einen Spannungsteiler (falls Spannungsmessung am Antriebsakku gewünscht); NPN Transistor, 10kOhm und Diode für den "halb-duplex - RX-TX wandler"
Klingt alles kompliziert, ist aber ganz einfach:

Zunächst muss uns eines klar sein: Der Empfänger verwendet für die Sensorschnittstelle einen standart UART-Bus, wie ihn auch der Arduino nativ unterstützt (RX/TX). Als Datenrate(Baudrate) verlangt und nutzt der Empfänger 38,4kBit/s alias 38400Baud. Im Gegensatz zum Arduino, der mit seperaten RX und TX Kabeln arbeitet, fallen beim MPX-Sensorbus beide Leitungen zur RX/TX Leitung zusammen (halb duplex). Wir können aber nicht einfach am Arduino beide Leitungen zusammen klemmen und an den Empfänger anschließen. Der TX-Pin am Arduino steht im Idle (nichts wird gesendet) dauerhaft auf logic 1 was bedeutet, er liegt immer bei 3,3 bzw 5 V. Der RX pin kann dementsprechend keine Daten empfangen.
mit folgender Schaltung von http://nerdralph.blogspot.de/2014/01/avr-half-duplex-software-uart.html lässt sich das Problem überwinden:
TX/RX ---+--|>|-----+----- Tx
| $ R1
+--------(/^\)--- Rx
NPN E C
(Besseres Bild auf seiner Website, hier nur falls diese mal offline geht)
(Allen code auf der Website können wir für dieses Projekt ignorieren, va. wenn wir Anfänger sind ;)

TX/RX geht zum Senosor Signal des Empfängers und RX und TX zum Arduino (Nicht vergessen Arduino GND und Empfänger - zu verbinden, sonst entseht kein Stromkreis)

Ist alles verkabelt (ein "solderless breadboard" bietet sich an) kann der erste Test gestartet werden:
Ich verwende einen Arduino mit integrierter USB-Schnittstelle (z.b. UNO oder Nano). Achtung: das native UART wird hier bereits durch den USB Anschluss belegt und kann nicht benutz werden für die Kommunikation mit dem Empfänger!
Stattdessen verwende ich die SoftwareSerial library:



#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RXpin:Pin 10, TXpin: Pin 11

void setup() {
// Open serial communications and wait for port to open:
Serial.begin(250000);//Serial ist die Verbindung zum PC
Serial.println("hey");//Im Seriellen Monitor der Arduino IDE sollte hey zu lesen sein. (Bautrate am PC auf das maximum der IDE: 250000)
mySerial.setTimeout(5);
mySerial.begin(38400);//mySerial ist die Verbindung zum Empfänger
}

void loop() {

byte b[5];
long l[5];
long t=micros();
while(mySerial.available()>0){mySerial.read();}//wir wollen vor beginn des Tests einen leeren Buffer, wir dumpen seinen Inhalt
while(mySerial.available()<1){t=micros();};//wir warten bis vom Empfänger was ankommt.
long begintime=micros();//wir speichern die Zeit in Mikro Sekunden (nicht millisekunden)
b[0]= mySerial.read();//wir lesen das erste byte, das vom Master ankommt und speichern es
l[0]=t;//wir speichern die Zeit, wann das byte angekommen ist
t=micros();

for(int i=1;i<5;i++){//das selbe wie oben, blos 4 mal hintereinander (schleife)
while(mySerial.available()<1){t=micros();};
l[i]=t;
b[i]= mySerial.read();
t=micros();
}
long endtime=micros();//wir speichen die Zeit, wenn das letzte byte angekommen ist.
for(int i=0;i<5;i++){
Serial.print(b[i],HEX);//wir lassen uns eine Zeile mit den bytes (hexadezimal darstellung) ausgeben, die empfangen wurden
Serial.print(" ");
}
Serial.println();
Serial.print(0);
Serial.print(" ");
for(int i=1;i<5;i++){
Serial.print(l[i]-l[i-1]);//wir lassen uns eine Zeile mit den zeiten ausgeben, die vergangen sind, bevor das jeweilege byte empfangen wurde
Serial.print(" ");
}
Serial.println();
Serial.print(l[4]-l[0]);Serial.print(" ");Serial.println(endtime-begintime);//wir lassen uns 2 mal die dauer ausgeben
delay(2000);//nach 2 Sekunden kommt die nächste Messung
}


Die erste Zeile sind die Anfragen des Masters. Die Adressen, die er anfragt solten von 2 bis f (15) rotieren.
Die zweite Zeile, wieviel zeit jeweils zwischen der vorherigen und dieser Anfrage verstrichen ist. Eigendlich müsste diese Zeit immer ungefär 6ms (=6000micro Sekunden) betragen, bein meinen Tests ergaben sich aber meist Zeiten von etwa 5ms.

Sind weitere Erläuterungen des restlichen Projekts gewünscht?
Hier ist der Code für das Vario (profisorsch)! Wenn Interesse am Projekt besteht (PN bitte) werde ich das ganze gerne noch erläutern.
Für einen Programmierer eine Katastrophe, aber er ist nur zum testen und wird noch optimiert:



#include <SoftwareSerial.h>
#include <Wire.h>
#include <MS5611.h>

int variobuffer=0;
int variocnt=0;
MS5611 ms5611;
boolean dataavail=false;
int vario=0;
int alt=10;
int voltage=0;
int alert=0;
float prfAlt=0;
float TOALT;
long t;
float lastValue=0;

SoftwareSerial mySerial(10, 11); // RX, TX

void setup() {
analogReference(EXTERNAL);
mySerial.begin(38400);
mySerial.setTimeout(5);
while(!ms5611.begin())
{
delay(500);
}
ms5611.setOversampling(MS5611_ULTRA_HIGH_RES);
prfAlt=ms5611.getAltitude(ms5611.readPressure());
t = micros();
TOALT=ms5611.getAltitude(ms5611.readPressure());
}

void loop() {
if(mySerial.available()>0){
int red=mySerial.read();
if(red==0x5A){
TOALT=prfAlt;
}else if(red==0x03){
delayMicroseconds(1500);
if(mySerial.available()>0){
while(mySerial.available()>0){mySerial.read();}
}else{
if(dataavail){
if(variocnt==5){
vario+=variobuffer;
vario=vario/variocnt;
mySerial.write(0x33);
mySerial.write(lowByte(vario*2+alert));
mySerial.write(highByte(vario*2+alert));
vario=0;
variobuffer=0;
variocnt=0;
}else{
vario+=variobuffer;
variocnt++;
}
}else{
mySerial.write(0x33);
mySerial.write(lowByte(0x8000));
mySerial.write(highByte(0x8000));
}
}
}else if(red==0x04){
delayMicroseconds(1500);
if(mySerial.available()>0){
while(mySerial.available()>0){mySerial.read();}
}else{
if(dataavail){
mySerial.write(0x48);
mySerial.write(lowByte(alt*2+alert));
mySerial.write(highByte(alt*2+alert));
}else{
mySerial.write(0x48);
mySerial.write(lowByte(0x8000));
mySerial.write(highByte(0x8000));
}
}
}else if(red==0x05){
delayMicroseconds(1500);
if(mySerial.available()>0){
while(mySerial.available()>0){mySerial.read();}
}else{
if(dataavail){
mySerial.write(0x51);
mySerial.write(lowByte(voltage*2+alert));
mySerial.write(highByte(voltage*2+alert));
dataavail=false;
}else{
mySerial.write(0x51);
mySerial.write(lowByte(0x8000));
mySerial.write(highByte(0x8000));
}
updatedata();
}
}
}
}

void updatedata(){
voltage=(int)(0.5F+(analogRead(A0)/1024.0F)*66.0F);
long realPressure = ms5611.readPressure();
float absoluteAltitude = ms5611.getAltitude(realPressure);
float vspeed=(1000000*(absoluteAltitude-prfAlt)/(micros()-t));// avg in m/s
t=micros();
prfAlt=absoluteAltitude;
alt=(prfAlt-TOALT)+0.5F;//
if((vspeed<0&&lastValue<0&&vspeed<lastValue*0.3F)||(vspeed>0&&lastValue>0&&vspeed>lastValue*0.3F)){
passVario(vspeed);
}else{
passVario((vspeed+lastValue)/2.0F);
}
lastValue=vspeed;
dataavail=true;
}

void passVario(float value){
if(value>0){
variobuffer=0.5F+value*10;
}else{
variobuffer=value*10-0.5F;
}
}

jweber
28.04.2017, 11:04
Hallo simon 123,

Du kennst aber schon folgendes Projekt:

https://github.com/openXsensor/openXsensor

Das kann alles Beschriebene, auch MSB, und hat einen fertigen sehr gut funktionierenden Vario-Algorithmus.

Viele Grüße
Jörn

kalle123
28.04.2017, 11:44
Hallo simon 123,

Du kennst aber schon folgendes Projekt:

https://github.com/openXsensor/openXsensor

Das kann alles Beschriebene, auch MSB, und hat einen fertigen sehr gut funktionierenden Vario-Algorithmus.

Viele Grüße
Jörn

Verwende ich schon länger ... ;)

Vario (mit MS5611 und BMP xxx), Strom (ACS 712 und 758), Spannung, Drehzahl und GPS (U-Blox).

Mit MPX RX und HFMG-3 Modul auf Taranis .... Unterstützt aber auch FRSKY, HOTT, JETI!

Gruß KH

simon_123
28.04.2017, 13:18
Kannte ich nicht, aber ich mache das hautsächlich zum persönlichen Vergnügen und deshalb will ich das alles selber schreiben, konzipieren und zusammenbasteln.
Von daher bleib ich bei meiner Lösung;) Danke trotzdem!

(und mein Vario-Algorithmus schafft übrigens inzwischen auch ne 0er Auflösung von +-5cm pro sekunde;)

Neuer Code:


#include <Wire.h>
#include <MS5611.h>

//minimum update delays in ms (0=each cycle)
const int updateATemp=1000;
const int updateAlt=1000;
const int updateVario=300;
const int updateVoltage=100;
const int voltagearraylength=60;

MS5611 ms5611;

boolean iicavail; //false: 0x8000 /2 und alert=false!;

long lastATempMeasurement;
//boolean aTempavail;
int ambientTemprature; // 0,1 °C

long lastAltMeasurement;
float takeoffAlt;
//boolean altavail;
int alt; //Meter

long lastVarioMeasurement;
long varioTime;
float varioPreviousAlt;
float varioLastValue;
//boolean varioavail;
int vario; // 0,1 Meter/sekunde

long lastVoltageMeasurement;
long lastvalert;
int valert;
float voltvalues[voltagearraylength];
int voltindex=0;
//boolean voltageavail;
boolean voltagealert;
int voltage;

void setup() {
pinMode(LED_BUILTIN,OUTPUT);
digitalWrite(LED_BUILTIN,HIGH);

iicavail=true;
//aTempavail=false;
//altavail=false;
//varioavail=false;
//voltageavail=false;

varioLastValue=0.0F;
lastATempMeasurement=-updateATemp;
lastAltMeasurement=-updateAlt;
lastVarioMeasurement=-updateVario;
lastVoltageMeasurement=-updateVoltage;

ambientTemprature=0x8000/2;
vario=0x8000/2;
alt=0x8000/2;

pinMode(3,INPUT_PULLUP);
analogReference(EXTERNAL);

Serial.begin(38400);
Serial.setTimeout(5);

if(digitalRead(3)==LOW){
iicavail=false;
//aTempavail=true;
//altavail=true;
//varioavail=true;
digitalWrite(LED_BUILTIN,LOW);
delay(300);
digitalWrite(LED_BUILTIN,HIGH);
delay(300);
digitalWrite(LED_BUILTIN,LOW);
delay(300);
digitalWrite(LED_BUILTIN,HIGH);
delay(300);
digitalWrite(LED_BUILTIN,LOW);
delay(300);
digitalWrite(LED_BUILTIN,HIGH);
delay(300);
}else{
while(!ms5611.begin())
{
delay(500);
}
ms5611.setOversampling(MS5611_ULTRA_HIGH_RES);
varioPreviousAlt=ms5611.getAltitude(ms5611.readPressure());
varioTime = micros();
takeoffAlt=(
ms5611.getAltitude(ms5611.readPressure()) +
ms5611.getAltitude(ms5611.readPressure()) +
ms5611.getAltitude(ms5611.readPressure())
)/3.0F;
}
digitalWrite(LED_BUILTIN,LOW);
}

void loop() {
if(Serial.available()>0){
int red=Serial.read();
delayMicroseconds(1500);
if(Serial.available()>0){
while(Serial.available()>0){Serial.read();}
}else{
switch (red) {
case 0x02:
//if(aTempavail){
Serial.write(0x26);
Serial.write(lowByte(ambientTemprature*2));
Serial.write(highByte(ambientTemprature*2));
//aTempavail=false;
//}
break;
case 0x03:
//if(varioavail){
Serial.write(0x33);
Serial.write(lowByte(vario*2));
Serial.write(highByte(vario*2));
//varioavail=false;
//}
break;
case 0x04:
//if(altavail){
Serial.write(0x48);
Serial.write(lowByte(alt*2));
Serial.write(highByte(alt*2));
//altavail=false;
//}
break;
case 0x05:
//if(voltageavail){
Serial.write(0x51);
Serial.write(lowByte(voltage*2+voltagealert));
Serial.write(highByte(voltage*2+voltagealert));
//voltageavail=false;

//}
break;
}
}
}
updateData();
}

void updateData(){
long mill=millis();
if((mill-lastVoltageMeasurement)>updateVoltage){
float v=(analogRead(A0)/1024.0F)*66.0F;
voltage=(int)(0.5F+v);
lastVoltageMeasurement=mill;/*
voltvalues[voltindex]=v;
voltindex++;
if(voltindex>=voltagearraylength){voltindex=0;}
//Voltageavail=true;
if(v<3.45F){
valert=500;
}else if(v<3.65F){
valert=4*1000;
}else if(v<3.8F){
boolean b=true;
for(int i=0;i<voltagearraylength;i++){
if(voltvalues[i]>(v-0.7)&&voltvalues[i]<(v+0.7)){b=false;}
}
if(b){
valert=7*1000;
}else{
valert=0;
}
}else{
valert=0;
}
if(voltagealert){
if((millis()-lastvalert)>valert){
voltagealert=false;
lastvalert=millis();
}
}else{
if((millis()-lastvalert)>300){
voltagealert=true;
lastvalert=millis();
}
}*/
}
if(iicavail){
if((mill-lastATempMeasurement)>updateATemp){
ambientTemprature=10.0F*ms5611.readTemperature();
//aTempavail=true;
lastATempMeasurement=mill;
}
boolean updateAltduringVario=false;
if((mill-lastAltMeasurement)>updateAlt){
//alt=(ms5611.getAltitude(ms5611.readPressure())-takeoffAlt)+0.5F;
//Altavail=true;
updateAltduringVario=true;
}
if((mill-lastVarioMeasurement)>updateVario){
float absoluteAltitude = ms5611.getAltitude(ms5611.readPressure());
absoluteAltitude += ms5611.getAltitude(ms5611.readPressure());
absoluteAltitude += ms5611.getAltitude(ms5611.readPressure());
absoluteAltitude += ms5611.getAltitude(ms5611.readPressure());
absoluteAltitude += ms5611.getAltitude(ms5611.readPressure());
absoluteAltitude += ms5611.getAltitude(ms5611.readPressure());
absoluteAltitude += ms5611.getAltitude(ms5611.readPressure());
absoluteAltitude += ms5611.getAltitude(ms5611.readPressure());
absoluteAltitude += ms5611.getAltitude(ms5611.readPressure());
absoluteAltitude += ms5611.getAltitude(ms5611.readPressure());
absoluteAltitude = absoluteAltitude/10.0F;
passVario(1000*(absoluteAltitude-varioPreviousAlt)/(mill-varioTime));
varioPreviousAlt=absoluteAltitude;
varioTime=mill;
if(updateAltduringVario){
alt=varioPreviousAlt-takeoffAlt+0.5F;

lastAltMeasurement=mill;
}
lastVarioMeasurement=mill;
//Serial.println(vario);
//Varioavail=true;
}
}
}

void passVario(float value){
int vspeed;
if(value>0){
vspeed=0.5F+value*10;
}else{
vspeed=value*10-0.5F;
}
if(((vspeed<0&&varioLastValue<0&&vspeed<varioLastValue*0.3F)||(vspeed>0&&varioLastValue>0&&vspeed>varioLastValue*0.3F))&&(vspeed>3||vspeed<-3)){
vario=vspeed;
}else{
vario=(vspeed+varioLastValue)/2.0F;
}
varioLastValue=vspeed




;
}