Afu-Software Linux Windows Blog oder …

vieles rund um Amateurfunk und PC

Arduino Daten mit der Powershell einlesen

Arduino Daten mit der Powershell einlesen

Wer stolzer Besitzer und Entwickler eines Arduinoboards ist, wird auch schon die Möglichkeit in Erwägung gezogen haben, seine Daten vom Board via Serielle Schnittstelle in den PC einzulesen.

Treiberseitig liefert solch ein Aduinoboard einen Treiber mit, über den via USB- Anschluss am Board die Daten seriell in den PC eingelesen werden können. Im Prinzip handelt es sich um die gleiche Vorgehensweise wie bei einem Seriell-USB Adapter.

Natürlich führen immer viele Wege nach Rom, für Windows 7 oder Windows XP besteht die Möglichkeit die Daten mittels der Powershell zu verarbeiten. Dabei hat dieses Vorgehen den Vorteil, dass die Powershell 1.0 bei XP nachinstalliert werden kann und bei Win7 schon von Haus aus mit an Bord ist. Unter Windows 8 ist bereits die Powershell 3.0 mit dabei. Wer sein Windows 7 auf Powershell 3.0 aufrüsten möchte, sollte unter folgendem Link den Installationsanweisungen folgen. Bitte genau in dieser Reihenfolge und nach der Installation von .NET4 oder 4.5 erst einen Neustart machen bevor man die Powershell installiert, sonst bricht die Installation mit der Meldung dieses Update ist nicht für ihre WinInstall geeignet ab.

LINK http://technet.microsoft.com/en-us/library/hh847837.aspx#BKMK_InstallingOnWindows7andWindowsServer2008R2

Wen alles läuft, gilt es sich Gedanken zu machen in welchem Format der Aduino die Daten schreiben soll, am einfachsten und schnellsten ist es die Datenausgabe so zu gestalten, dass die Daten als CSV ausgegeben werden. Dies vereinfacht die Weiterverarbeitung in der Powershell und zum Beispiel in EXCEL. Bei meinem Arduinoprojekt werden die Daten wie folgt ausgegeben (s.._..=Wert). Auf die Programmierung im Arduino gehe ich hier nicht weiter ein.

s0_1;..;..;..;..;s(n)

Jetzt schreiben wir diese Daten mit der Powershell in eine Datei. Dazu dient uns das folgende Script. Anmerkung `n in Rot sind Zeilenumbrüche hier für die Darstellung, im Script bitte weglassen!


cd "wechsel in euer Arbeitsverzeichnis z.B. C:\users\..."
#
$port = [system.IO.Ports.Serialport]::getportnames()
#
$sdaten = new-object system.IO.Ports.SerialPort $port,921600,none,8,one
#
$sdaten.open()
#
$name = Get-date -Format "yyMMdd-HHmmss"
"s0_1;s0_2;s0_3;s1_1;s1_2;s1_3;s2_1;s2_2;s2_3;s3_1;s3_2;s3_3;s4_1;s4_2;`n s4_3;EVENT;COUNT;HOUR;MINUTE;SECOUND" | out-file logger_$name.csv
$count = 1000
for ($index = 0; $index -lt $count; $index++) {
[string]$daten = $sdaten.ReadLine()
$daten = $daten.Replace("`r","")
$daten = $daten.Replace("`n","")
$zeit = Get-Date -Format ";HH;mm;ss"
[string]$zeile = "$daten$zeit"
out-file -InputObject $zeile -Append -FilePath  logger_$name.csv
Write-Host $zeile
}
#
$sdaten.close()
Remove-Variable -Name port , sdaten , name , count
Remove-Variable -Name index , zeit , zeile , daten

Mit der Zeile $port = [system.IO.Ports.Serialport]::getportnames() wird in der Variablen $port der SeriellePort ermittelt und abgespeichert, dies ist notwendig da Windows die Ports dynamisch verwaltet. Mit dem Object [system.io.ports.serialport] wird ein Handle auf die Serielle Schnittstelle geöffnet.

Im nächsten Schritt initialisieren wir die Schnittstelle mit den Daten die wir im Arduino vorgegeben haben, das new-object erbt die hier übergebenen Eigenschaften.

$sdaten = new-object system.IO.Ports.SerialPort $port,921600,none,8,one

Hier in meinem Script =  $port (der ComPort vom Arduino), 921600 Baud , keine Parität, 8 Datenbits, 1 Stopbit.

Geöffnet wird die Schnittstelle mit  $sdaten.open()jetzt können Daten eingelesen werden.

Da mein Projekt etwas umfangreicher ist, soll hier jede CSV-Datei noch einen Zeitstempel  mit der PC Systemzeit und als erste Zeile einen Header (jeder Headername muss eindeutig sein) erhalten. Dies erreichen wir mit dem folgenden Codestück.

$name = Get-date -Format "yyMMdd-HHmmss" # Format 130605-194512
"s0_1;s0_2;s0_3;s1_1;s1_2;s1_3;s2_1;s2_2;s2_3;s3_1;s3_2;s3_3;s4_1;s4_2;`n s4_3;EVENT;COUNT;HOUR;MINUTE;SECOUND" | out-file logger_$name.csv

Mit out-file wird die Datei mit dem Header und dem Namen (Variable $name) angelegt und kann nun mit Daten befüllt werden. Als nächstes schreiben wir 1000 Werte in diese Datei, wie schnell diese Zahl erreicht ist hängt davon ab wie oft der Arduino seine Daten ausgibt z.B. 1 mal Daten/s = 1000 Werte = 1000 Sekunden.

$count = 1000
for ($index = 0; $index -lt $count; $index++) {
[string]$daten1 = $sdaten.ReadLine()
$daten = $daten.Replace("`r","")
$daten = $daten.Replace("`n","")
$zeit = Get-Date -Format ";HH;mm;ss"
[string]$zeile = "$daten$zeit"
out-file -InputObject $zeile -Append -FilePath  logger_$name.csv
Write-Host $zeile
}
#

Die Variable $count initialisiert die For-Schleife mit 1000 Durchläufen, in der Variablen $daten werden die seriellen Daten gespeichert, gelesen wird mit der der Methode $sdaten.readline(). Egal wie schnell oder langsam euer Arduino die Daten ausgibt, ReadLine() übernimmt automatisch das Management, kommt ein Datensatz wird er geschrieben. Mit den Codezeilen $daten.replace "`r" und "`n", werden das Zeilenvorschub und NewLine Zeichen entfernt. Mit der Variablen $zeit wird die Systemzeit des PC im CSV-Format ";HH;mm;ss" (;08;15;47) angehängt. Mit out-file wird die Variable $zeile an die CSV Datei angehängt. Write-host gibt die gesamte Zeile (Daten vom Arduino + Zeit vom PC ) zur Kontrolle nochmals auf dem Monitor aus.

#
$sdaten.close()
Remove-Variable -Name port , sdaten , name , count
Remove-Variable -Name index , zeit , zeile , daten

sdaten.close() schließt nach 1000 Durchläufen der Schleife die Schnittstelle und mit Remove-Variable -Name ( wichtig alle Variablennamen ohne Dollarzeichen) werden alle Variablen gelöscht und die Speicherbereiche wieder freigegeben.

Viel Spass mit eurer CSV Datei, welche ihr jetzt weiterverarbeiten könnt, wünscht euer Tom

Kommentare sind geschlossen.