2012
|
Arduino über Visual Basic Express steuern
Si4735 - Digitales Analogradio II
|
VB-Express steuert Arduino. Der Progressbar von Windows 7 gibt dem Radio den nostalgischen Touch. Das magische Band ist etwas träge und schief, wie bei der originalen Röhre EM 84.
|
Die Ansteuerung des hier vorgestellten Arduino-Radios über die serielle RS232-Schnittstelle kann sehr komfortabel über die kostenfreie Version von Visual Basic Express erfolgen, also ohne Excel oder Word und ohne DLL - auch unter 64 Bit. Die serielle Schnittstelle lässt sich sehr einfach einbinden, auch das XOn/XOff Protokoll wird unterstützt.
Im Frühjahr 2012 kündigt Microsoft gerade die Version 2012 an. Die folgenden Ausführungen gelten für die jetzt verfügbare Version Microsoft Visual Basic 2010 Express.
Ein Import der alten VB-Forms ist offensichtlich nicht vorgesehen, darum wird das Radio 4 neu konstruiert und das Steuerprogramm entsprechend angepasst. Die Funktionalität enstspricht der Excel-Variante, lediglich der SNR-Wert wird testweise analog angezeigt. Auch das Arduino-Programm entspricht der Excel-Version, das hier geladen werden kann.
Unter Windows 7 Starter legt VB-Express die eigenen Programme im Dokumentenverzeichnis ab. Unter ... Eigene Dokumente\Visual Studio 2010\Projects lag die "WindowsApplication2" mit der VB-Express-Variante von Radio 4, die hier als ZIP-Datei verfügbar ist.
|
Details Serielle Schnittstelle
Ein Objekt mit dem Namen SerialPort stellt die RS232-Kommunikation her. Alle Parameter lassen sich zur Entwurfszeit voreinstellen und zur Laufzeit ändern. Hier wird COM1: benutzt mit 9600 BaudRate und XOn/XOff, da sonst der Arduino nicht antwortet. DTR ist aus, wodurch das Radio (Arduino) nicht resettet, sondern beim Starten oder Verlassen des Steuerprogramms weiter spielt. Die Routinen der RSAPI können komplett ersetzt werden, es wird
- SerialPort1.Open() - OPENCOM
- SerialPort1.Close() - CLOSECOM
- SerialPort1.Write("m") - SENDBYTE ASC("m")
- SerialPort1.ReadLine - READSTRING (A$)
Soll zum Beispiel die Frequenz in Label1 dargestellt werden, erwartet Arduino ein "f" und antwortet mit z.B. "104,3 MHz". In VB-Express wird das:
SerialPort1.Write("f") 'Frequenz
Label1.Text = SerialPort1.ReadLine
fertig.
Beim Umschalten auf Mittelwelle werden gleich mehrere Kommandos gesendet. Mit
SerialPort1.Write("M96") ' MW+9kHz+ScanUP
wird Mittelwelle mit 9 kHz Scanschritten gewählt und der nächste Sender gesucht.
|
Details Hauptschleife
|
Timer und SerialPort als wichtige Komponenten |
Neben dem SerialPort ist Timer1 das Werkzeug für wiederkehrende Aufgaben, hier die Hauptschleife. Wurde es in Excel mit einem Trick realisiert, steht nun für das Polling ein einfaches Element zur Verfügung. Alle 250 ms werden die Frequenz, der Pegel und die Signalqualität abgerufen. Bei FM-Betrieb und einem SNR-Wert > 11 werden auch die RDS-Informationen Sendername, Uhrzeit und Datum, sowie der Radiotext angefordert. Der Rückgabewert (PID) ist zurzeit ein Byte, aus dem die Alternativ-Frequenzen berechnet werden können.
Eine kleine Spielerei ist die Analoganzeige des Signal-Rausch-Abstandes mit einer Linie als Analogzeiger. Die Erfahrungen mit VB sind hier eher gering. Vielleicht gibt es einen Canvas oder eine Paintbox.
Die Hauptschleife im Quelltext:
Private Sub Timer1_Tick(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles Timer1.Tick
Dim snr, pid, af, rssi, No$ ' HAUPTSCHLEIFE
No$ = "No RDS"
SerialPort1.Write("f") 'Frequenz
f$ = SerialPort1.ReadLine
SerialPort1.Write("0") 'RSSI/SNR
Label1.Text = SerialPort1.ReadLine
snr = Val(Mid$(Label1.Text, 4, 2))
Anal(snr, 50) ' Test
rssi = Val(Mid$(Label1.Text, 1, 2))
If rssi > 50 Then rssi = 50
ProgressBar1.Value = 10 + 2 * rssi ' magisches Band
ProgressBar2.Value = 10 + 2 * rssi
If snr > 11 And RadioButtonFM.Checked Then 'RDS kommt
SerialPort1.Write("r") 'RDS
a$ = SerialPort1.ReadLine ' Langer String
pid = Mid$(a$, 1, 4) 'Testrückgabe für AF
Me.Text = " PID: " + Mid$(a$, 1, 4) 'PID im Titel
Label2.Text = RTrim(Mid$(a$, 5, 8)) 'SENDERNAME
LabelTime.Text = Mid$(a$, 19, 5) 'TIMELOCAL
LabelDate.Text = Mid$(a$, 24, 10) 'DATE
TextBox1.Text = LTrim(Mid$(a$, 34, 64)) 'RADIOTEXT
Label3.Text = f$ ' Frequenz
'Alternative Frequenzen wie sie kommen
af = Val("&h" + Mid$(pid, 3, 2))
If af > 0 And af < 205 Then
count = count + 1 ' Ruhigere Anzeige
a$ = "AF: " + Format((8750 + 10 * af) / 100, "#00.0")
If count Mod 5 = 0 Then LabelAF.Text = a$
End If
Else 'Kein RDS/Schwaches Signal
Me.Text = " Arduino goes Radio"
Label2.Text = f$ 'Frequenz
Label3.Text = No$ : LabelAF.Text = No$
LabelTime.Text = No$ : LabelDate.Text = No$
TextBox1.Text = " Happy DXing!"
End If
'Startup: Timerintervall 3000, FM not checked
If Timer1.Interval <> 250 Then 'Startverzögerung
RadioButtonFM.Checked = True
Timer1.Interval = 250
End If
End Sub
|
Fazit
Die Express-Lösung ist für Testzwecke durchaus brauchbar. Sie ist zurzeit noch kostenlos und führt nach kurzer Zeit zu dem gewünschten Ergebnis. Insbesondere die hier benötigte serielle Schnittstelle konnte ohne Umwege einfach angesprochen werden.
Das Studio unterstützt auch C#, C++ für Web, Phone, Datenbank ...
|
|
|
Weitere Software
|