2012
HOME

Arduino über Visual Basic Express steuern
Si4735 - Digitales Analogradio II
Visual Express steuert SI4735 via Arduino unter Winows 7 Starter
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
Serielle Schnittstelle unter VB-Express
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 Serial
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

.
Startseite Bücher Software Digital TV Musik Kontakt

Für Inhalt und weitere Verzweigung externer Links sind die Betreiber der dortigen Seiten verantwortlich - H.-J. Berndt