Go Down

Topic: Arduino-Oszilloskop [Arduino-Control] (Read 7216 times) previous topic - next topic

SBond

Dec 16, 2012, 03:45 pm Last Edit: Dec 16, 2012, 07:54 pm by uwefed Reason: 1
Arduino-Control

Version: 0.4.0.0 Alpha
Datum: 16.12.2012

Datei ist ganz unten :P (Anhang)



Linien: ganz oben (Ladung an/aus), in der Mitte (Pins der 7-Segmentanzeige), unten: Lade/Entlade-Kurve des Kondensators (10µF)


Hallo Leute,

...ich bin ganz neu hier :D
Ich habe mir vor kurzem ein Arduino-Board (und noch einige andere) zugelegt und bin begeistert.

Nach viel spielerei habe ich jetzt nach einer Möglichkeit gesucht, die vom Arduino gesendeten Daten (serial.print) auf einem PC zu visualisieren.
...quasi wie mit einem Oszilloskop. Leider war das Ergebnis der Suche sehr ernüchternd. :(

...und darum programmiere ich jetzt selber ein Software-Oszi.

Meine Software ist noch im Alpha-Stadium und wird später natürlich als Freeware angeboten.

Funktionen:

-Übertragung der Daten zwischen Software und Arduino mit einer Baudrate von 250000 (ca. 31 Kb/s ,maximal)
-maximale Baudrate 256000 (ich empfehle aber 250000)
-Bis zu 2850 Datenpakete können pro Sekunde ausgewertet werden.
-bis zu 10 Kanäle können gleichzeitig dargestellt werden (könnten noch sehr viel mehr sein, aber 10 sollten ja wohl reichen)
-der Zustand aller Analoge Pins,Digitale Pins, Variablen im Arduinocode, können angezeigt und auch im laufenden Betrieb geändert werden (auch setzen von PWM)
-neben dem Graph steht auch eine Konsole/Terminal zur Verfügung

wird auch noch kommen:

-Ping und Reaktionstest
-der freie SDRAM und die Laufzeit des Arduino können angezeigt werden
-Messen von Impulsen
-lesen/schreiben/sichern/rücksichern/formatieren des EEPROM
-Triggern von periodischen Signalen (steigende und fallende flanke)
-Single-Shot-Modus
-Rolling-Modus
-X-Y-Betrieb
-HoldOff-Modus
-Mittelwertbildung von Signalen
-Grenzwertüberwachung
-differenzbild von zwei Signalen erzeugen
-Datenlogging
-Offline-Auswertung + FFT

...und was noch so ansteht ;)

Zur kommunikation mit dem Arduino wird im C-Code ein header eingebunden (benötigt ca. 8KB Flash und 0,5KB SDRAM. Dieser kommuniziert dann mit der Software automatisch.
Man sollte nur darauf achten, dass man in der Loop-Schleife nicht zu lange Delays einsetzt, da sonst das Oszilligramm sehr Zeitdiskret aussieht.
Ohne Header kann die Software aber noch "manuell" mit dem Arduino kommunizieren und oszilloskopieren.

Der einzige große Nachteil der Software.... es ist mit AutoIt geschrieben. Es ist also nur ein langsamer Interpreter.
Zum Zählen von 0 auf 1 Mrd braucht es bei mir 43 sek. (C braucht 4 sek und PureBasic schafft es in 0,3 sek.)
Bei meinen Tests auf verschiedenen Rechnern konnte ich 80 - 300 Messungen (aller Arduino-Eingänge/Ausgänge gleichzeitig) pro Sekunde plotten.
Sehr viel schneller geht es aber eh nicht, da man mit den ca. 20-30 Kb/s die man empfängt keine Darstellungsfrequenz im KHz-Bereich schafft.

Kurzes tutorial:
-Arduino-Control - 0.4 Alpha.rar entpacken
-den "ArduinoControl"-Ordner in  arduino-1.0.3/libraries  kopieren
-die Arduino IDE starten
- Datei -> Beispiele -> ArduinoControl -> minimal
- Auf den Arduino uploaden

jetzt kann man die "Arduino-Control - 0.4 Alpha.exe" starten Baudrate und COM-Port bestätigen und unten bei den Kanälen die Pins anzeigen.


Habe es erfolgreich getestet mit:

-Arduino Uno Rev. 3
-DFRduino nano328 (Arduino Nano v3.0 kompatibel)
-Freaduino MEGA2560 v1.2-White Color ( Arduino compatible)


zu der "senden"-Funktion:

steht schon da drin:      #s;A;0;R;1;#e

#s;   -> Datenpaket anfang
A;     -> Analog in     (D, Digital in/out)
0;     -> Pin 0
R;     -> Lesen  (W, für schreiben)
1;     -> Wert (1 ja,  0 Nein)
#e    -> Datenpaket ende

das kann  der Arduino übersetzen und führt dann den Befehl aus.

Beispiele:

#s;A;0;R;1;#e   -> Analog in, Pin 0:  wird nun gelesen und dauerhaft an die Software gesendet
#s;D;5;R;0;#e   -> Digital in/out, Pin 5: der Zustand wird nicht mehr überwacht; es werden keine Daten mehr über diesen Pin an die Software gesendet
#s;A;3;W;120;#e  -> Digital out, Pin 3: setze PWM mit dem Wert 120
#s;D;4;W;0;#e   -> Digital out, Pin 4: setzt den Pin auf LOW
#s;D;4;W;1;#e   -> Digital out, Pin 4: setzt den Pin auf HIGH


Werte, die vom Arduino gesendet werden: #s;D,6,0;A,2,342;...;...;...;#e

#s;   -> Datenpaket anfang
D,    -> Digital in/out
6,    -> Pin 6
0;    -> Wert 0

....   weitere Werte
#e    -> Datenpaket ende

naja...

es würde mich freuen, wenn noch jemand eine gute Idee hätte, was man noch brauchen könnte. Testen könnt ihr natürlich auch. Allerdings funktioniert nur knapp die Hälfte der Funktionen (Alpha-Version ;) )

mfg
-SBond-

Addi


es würde mich freuen, wenn noch jemand eine gute Idee hätte, was man noch brauchen könnte. Testen könnt ihr natürlich auch. Allerdings funktioniert nur knapp die Hälfte der Funktionen (Alpha-Version ;) )

Wo kann man das Programm später downloaden?
Tipp: Evtl. kannst du eine Funktion wie Firmata nachahmen, also eine einfache Ansteuerung über Button
statt "#s;D;5;R;0;#e"

Addi
/ \    _|  _| o
 /--\ (_| (_| |

michael_x

Quote
Bei meinen Tests auf verschiedenen Rechnern konnte ich 80 - 300 Messungen (aller Arduino-Eingänge/Ausgänge gleichzeitig) pro Sekunde plotten.
Sehr viel schneller geht es aber eh nicht, da man mit den ca. 20-30 Kb/s die man empfängt keine Darstellungsfrequenz im KHz-Bereich schafft.


Tja, was ich mir wünsche, wäre z.B. nur ein Signalverlauf von z.B. max. 8 Digitalsignalen, aber so schnell wie kontrolliert möglich.
Das Ganze muss nicht kontinuierlich laufen, bräuchte eher einen Start-Trigger, um das Ergebnis dann in Ruhe ansehen zu können.
( z.B. 1000 Werte sollten eine Bildschirm-Breite füllen und würden 1kB RAM ZwischenPuffer kosten )

AnalogSignale sollten nur durch die analogRead - Zeit (ca. 120 µs ?) begrenzt sein ( -> 700 Werte / 0,1 sek  ).
Das wäre eigentlich zu noch wenig für Audio-Signale ( 0,1...20 kHz ).
Geht Analog irgendwie schneller mit Arduino Hardware ?  

SBond

#3
Dec 17, 2012, 08:29 pm Last Edit: Dec 17, 2012, 08:40 pm by SBond Reason: 1
@Addi:

So etwas kommt auf jeden Fall noch. Geplant ist ein kleines Fenster in dem der aktuelle Zustand aller Ein/Ausgänge des Boards dargestellt werden und auch verändert werden können. Ich denke mal die Fertigstellung der Version 1.0 sollte bis Mitte Januar zu schaffen sein. Die aktuellen Versionen werde ich hier immer als Link zur Verfügung stellen. Eine eigene Webseite habe ich momentan nicht und durch mein Studium habe ich gerade auch keine Zeit eine zu entwerfen.


Aktuelle Version (0.4a):
https://dl.dropbox.com/s/7vu8k0pthjie5ac/Arduino-Control%20-%200.4%20Alpha.rar?dl=1



@michael_x:

die Echtzeitplottung ist ein großes Problem. Zum einen liegt es an der langsamen Grafikschnittstelle (GDI+), zum anderen an der Programmiersprache, die für hohe Geschwindigkeiten absolut nicht ausgelegt ist. Mein Code (9000 Zeilen bis jetzt) hat eine Laufzeit von ca. 2,5 ms + 2 ms für die Kommunikation mit dem COM-Port + ca. 3 ms für einen Plotvorgang. Gesamt ca. 7,5ms. Das ist für eine Echtzeitdarstellung nicht geeignet. Aber das ist nicht das einzige Problem: Die COM-Kommunikation schafft momentan max. 256000 Baud. Ich nehme 250000, da hier eine Fehlerrate von 0% ist. Ein Byte ist hier (mit Start und Stoppbit) 10 Bits lang. Das Bedeutet: 25KB/s die max. Übertragen werden können. Wenn eine Messung 6 Zeichen lang sein würde (+ 1 Zeichen für die Trennung zum nächsten Messwert -> z.B 123.46;121.22;....;...;...), dann könnte ich max. 3571 Werte pro Sekunde aufnehmen. Bei 8 Kanäle wären es nur noch 446 Werte/Sekunde für jeden Kanal.
Es gibt 3 Möglichkeiten das zu lösen:

1. Ich logge die Daten und Werte diese offline aus. So können alle Daten dargestellt werden und die Umsetzung ist nicht ganz so schwer. Ist nur blöd, dass man es nicht Live sehen kann.
2. Ich muss versuchen irgendwie eine eigene grafische Schnittstelle zu entwickeln (mit C) um einen Performancegewinn zu erreichen. Nachteil: Die Darstellungsfrequenz wird durch die COM-Schnittstelle begrenzt. (1 Kanal, 6+1Zeichen -> max. 3,57 KHz ; 8 Kanäle, 6+1 Zeichen -> max 446 Hz)
3. Ich nutze zum Auswerten zusätzlich die Soundkarte. Diese schaft 48KHz mit einer Auflösung von 16-24Bit. Problem: Es sprengt den Rahmen meiner Fähigkeiten, da ich dafür definitiv die Programmiersprache wechseln müsste. Außerdem müsste man den Arduino immer zusätzlich anklemmen und mehr als 2 Kanäle wären nicht möglich.


Ich habe vor kurzem mal die ADC Wandlungszeit des ATMega328P-PU im Labor gemessen. Bei einer Temperatur von 22,9°C; 5,1V Vcc; 16,0MHz Quarz betrug die Laufzeit 108,18µs. (also eine Frequenz von 9,24 KHz).  Sehr viel schneller wird es wohl auch nicht werden. ..zumal hat der Arduino noch seinen Bootloader der auch noch mal etwas bremsen dürfte. Das Schalten von Pins hat der Messung nach 820ns gedauert. (gemessen mit GoLogic)

hast du was spezielles vor mit dem Arduino?


lg
-Martin-

michael_x

Ich hab ein Arduino 1-Kanal Analog "Oszilloskop", und bin mit allem zufrieden ausser der Geschwindigkeit ;)
Die Übertragung mache ich in 1 byte binär/Messung. Das ist zur Darstellung am PC genau genug und Messung/Übertragung sind etwa gleich schnell.
Die Hälfte des 2k RAM nutze ich als Puffer. Wenn eine Aufzeichnung nicht auf eine Bildschirmbreite ( 1024 pixel ) passt, hat man es falsch aufgenommen ;)

In Echtzeit zuschauen bringt nicht viel, finde ich. Selbst 50Hz unsynchronisiert sind zu schnell um wirklich was zu sehen. Eher braucht es eine gute Trigger - Synchronisierung.
Quote
Ich nutze zum Auswerten zusätzlich die Soundkarte. Diese schaft 48KHz mit einer Auflösung von 16-24Bit
Hast du da einen guten Link ?

Um Flankensteilheit und Störimpulse zu erkennen ist das Ganze aber viiiiel zu langsam.

Was mir sonst noch fehlt ist ein "Logic - Analyzer" d.h. statt 1 byte für 1 Analogwert lieber 8 digitale Werte.

Quote
Das Schalten von Pins hat der Messung nach 820ns gedauert.
Das soll mit einem 16MHz 328P mit bis zu 8 MHz (125 ns) gehen, aber interessant ist ja eher, die (minimale) Zeit zwischen 2 Signalen erfassen zu können.

P.S.
Quote
zumal hat der Arduino noch seinen Bootloader der auch noch mal etwas bremsen dürfte
das versteh ich ( oder du ;) nicht richtig. Nach dem Reset kostet der Bootloader nur noch ein bisschen Flash-Speicherplatz, aber keine cpu Zeit, denke ich. 

uwefed



Ich habe vor kurzem mal die ADC Wandlungszeit des ATMega328P-PU im Labor gemessen. Bei einer Temperatur von 22,9°C; 5,1V Vcc; 16,0MHz Quarz betrug die Laufzeit 108,18µs. (also eine Frequenz von 9,24 KHz).  Sehr viel schneller wird es wohl auch nicht werden. ..zumal hat der Arduino noch seinen Bootloader der auch noch mal etwas bremsen dürfte. Das Schalten von Pins hat der Messung nach 820ns gedauert. (gemessen mit GoLogic)

Der Bootloader ist nur während des Startvorgangs aktiv. Da kontrolliert er ob über die serielle Schnittstelle ein Upload kommt. Nach der Wartezeit springt er in den Sketch und wird erst beim nächsten Reset wieder aufgerufen.
Grüße Uwe

SBond

#6
Dec 17, 2012, 11:02 pm Last Edit: Dec 17, 2012, 11:06 pm by SBond Reason: 1
also dieses Soundkarten-Oszi: http://www.zeitnitz.de/Christian/scope_de
das steht zwar man braucht eine Lizenz, aber du kannst auch ohne das Programm starten. Zumindest kannst du es mal testen :)
Ich selber habe es bisher noch nie ernsthaft verwendet. ..zumal ich nicht genau weiß, welche Spannungen der Mic/LineIn-Eingang aushält.

An der 1Byte-Binär-Messung habe ich auch schon mal gedacht. Damit könnte ich max. eine Frequenz von 25,6KHz rausholen. Eine 8-Bit-Auflösung ist zwar nicht das gelbe vom Ei, aber für digitale Pins oder einfache analoge Signale durchaus sinnvoll. Dieses werde ich auch mit einprogrammieren (für den SingleShot-Modus).


Jetzt rein theoretisch: wenn ich mich recht erinnere kann der ATMega328 + 16MHz-Quarz mit einer Baudrate von 2.000.000 fehlerfrei senden. Damit könnte man über die serielle Schnittstelle mit 200KHz senden, aber ich glaube nicht das es möglich ist dieses auch zu empfangen. An einem richtigen Oszi mit 10-100MHz kommt man einfach nicht ran :P


Die Sache mit dem Bootloader.... ja, das habe ich mal hypotetisch angenommen. Ich weiß nicht genau, in wie fern der Bootloader im aktiven Betrieb den MCU beeinflusst. Könnte ja sein, dass es auf die Geschwindikkeit einfluss hat.   ...ich weiß es aber nicht.



Edit...

ok, danke Uwe. Jetzt bin ich wieder etwas schlauer. ^^

..ich bin ja was MCUs angeht ja auch erst seit kurzem dabei. Im Juni haben wir die Laborversuche mit einem ATMega32 gemacht und dort wurde auch mein interesse geweckt.

MaFu

Wenn eine Messung 6 Zeichen lang sein würde (+ 1 Zeichen für die Trennung zum nächsten Messwert -> z.B 123.46;121.22;....;...;...), dann könnte ich max. 3571 Werte pro Sekunde aufnehmen. Bei 8 Kanäle wären es nur noch 446 Werte/Sekunde für jeden Kanal.


Warum machst Du es so umständlich? Das sind doch viel zuviel Daten die Du so übertragen musst.
Bei analogRead() bekommst Du Werte zwischen 0 und 1023, es müssen also nur 2 Byte pro Kanal übertragen werden. Das Trennzeichen kannst Du auch weglassen. Bei 8 Kanälen sind es also nur 16 Byte die übertragen werden müssen. Zur Sicherheit würde ich noch eine eindeutige Kennung übertragen, welche den Beginn einer neuen Messreihe zeigt. Da bietet sich $FFFF an, da dieser Wert von den Messdaten nicht erreicht wird (max. $03FF). Dann wären es 18 Byte für 8 Kanäle.

Und analogRead() kann man noch ordentlich Dampf machen, ich hab hier mal einen Vergleich durchgeführt: http://www.mafu-foto.de/blog/viewpost/85
_______
Manfred

michael_x

@MaFu: Vielen Dank für dein AnalogRead - Beschleuniger Beispiel. Du meinst das hier unten angefügte ?
Werd ich mal tiefer einsteigen, was die 3 Bits im ADCSRA Register bedeuten und was für Nebeneffekte das wohl hat.
Danach kann man ganz normal analogRead aufrufen, oder muss man weiter direkt auf Register-Ebene programmieren ?

Um nur Werte für Trends zu übertragen, kann man auch ein bisschen an der Genauigkeit sparen
      byte value = analogRead(0) >> 2;
und dadurch die Übertragungsgeschwindigkeit verdoppeln ( gegenüber deinem Vorschlag von 2 Byte für 0...0x3FF )

Eventuell ein (selten vorkommendes) Byte als "Escape" Zeichen definieren ( z.B. 0xFC):
Falls der zu übertragende Wert tatsächlich 0xFC ist, werden 2 Bytes FC übertragen, ansonsten kommt nach 0xFC irgendwas anderes. (z.B. ASCII Text, die Länge eines nächsten Datenblocks, etc.)   



Hier der Code aus MaFu's link:
Code: [Select]

//An den Anfang des Sketches:
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

//Und dann in die setup() Routine:

sbi(ADCSRA,ADPS2);
cbi(ADCSRA,ADPS1);
cbi(ADCSRA,ADPS0);

Addi

#9
Dec 18, 2012, 02:17 pm Last Edit: Dec 18, 2012, 02:34 pm by Addi Reason: 1

So etwas kommt auf jeden Fall noch. Geplant ist ein kleines Fenster in dem der aktuelle Zustand aller Ein/Ausgänge des Boards dargestellt werden und auch verändert werden können. Ich denke mal die Fertigstellung der Version 1.0 sollte bis Mitte Januar zu schaffen sein. Die aktuellen Versionen werde ich hier immer als Link zur Verfügung stellen. Eine eigene Webseite habe ich momentan nicht und durch mein Studium habe ich gerade auch keine Zeit eine zu entwerfen.

Aktuelle Version (0.4a):
https://dl.dropbox.com/s/7vu8k0pthjie5ac/Arduino-Control%20-%200.4%20Alpha.rar?dl=1

Du könntest bei bplaced.net ein Gratis-Webspace bekommen. Dann musst du eigentlich nur die Archive mit dem Programm
Filezilla hochladen.
Wird man eigentlich auch irgendwo den Quellcode bekommen?

Addi
/ \    _|  _| o
 /--\ (_| (_| |

SBond

@MaFu:

Ja, das könnte nützlich sein. Ich muss mal schauen, wie ich später eine Aufzeichnungsmethode entwickel.
Nun momentan ist die Software so gedacht, das Signalverläufe mal eben schnell angezeigt werden. Eine Live-Ansicht ist zwar relativ langsam, für einige Anwendungen aber durchaus ausreichend und nützlich. Signale, die eine hohe Genauigkeit verlangen, kann ich nur loggen und danach offline auswerten. Dies geschieht dann über das direkte Senden von Bytes statt Datenpakete.

Der Grund, warum ich so viele Bytes pro Datenpaket habe ist recht simpel: Ich kann so recht einfach auch die ganzen Variablen des Arduino auslesen und ggf. ändern. Auch Strings/Arrays. Die größe der Datenpakete ist dynamisch und kann beliebig groß sein. Immerhin soll die Software auch in der Lage sein, den Arduino komplett zu steuern (so weit, wie es möglich ist).



@Addi:
Speicher habe ich momentan genug. Ich habe eine Kapazität von 27.2 GB bei der Dropbox (durch mein Studium).
Ob ich mein Quellcode freigebe weiß ich noch nicht genau. Momentan ist ja auch noch alles in en Kinderschuhen.   ...das werde ich mir mal in Ruhe überlegen müssen.

Zum Programmieren komme ich auch erst wieder nächste Woche. Am Freitag schreiben wir noch eine Prüfung (Antriebssysteme und elek. Maschinen) und da muss ich lernen.




lg
-Martin-



-Holger-



Quote
Ich nutze zum Auswerten zusätzlich die Soundkarte. Diese schaft 48KHz mit einer Auflösung von 16-24Bit

Hast du da einen guten Link ?


Servus!

Das lief grad bei DangerousPrototypes übern Ticker:
http://dangerousprototypes.com/2012/12/19/protocol-analyzer-for-ir-and-rf/

Habs selbst nicht getestet, klingt aber ganz nett, um mit ner Soundkarte so tolle Sachen wie z.B Funkthermometer zu decoden ... ;-)

Sorry, leicht OT, klingt aber interessant und werde ich sicher mal testen.

Grüße und schon mal frohes Fest,
Holger


SB-D

Hi, SBond
wäre es möglich den sourcecode der Software zu bekommen? Mich interessiert die Datenkommunikation zwischen PC und Arduino. Und dein Kozept gefällt mir, schade das nach keine neuere Version hier erschienen ist.


SBond

hoppla....

bin wohl etwas zu spät.
Aber für alle die sich noch hierher verirren sollten: Das Programm "Arduino-Control" wurde in dieser Form abgebrochen, da die Programmiersprache für diese Zwecke einfach zu langsam war. Eine Neuentwicklung ist zur Zeit aktiv in Bearbeitung. Updates werden solange hier veröffentlicht:

http://forum.arduino.cc/index.php?topic=160703.0


Mattef

Hey,

ich habe das Projekt lxardoscope für Mac OS X portiert. Das Softwarepaket kann unter

https://github.com/MKesenheimer/lxardoscope_0.95_Mac

heruntergeladen werden. Weitere Informationen sind auf

http://deralchemist.wordpress.com/2014/07/07/das-megaschnelle-oszilloskop/

zu finden.

Grüße
Matthias

Go Up