Dienstag, 17. März 2020

SI4703 und Arduino Nano, zweite Generation mit RDS

 

erstmals konnte ich dem SI4703 RDS-Informationen entlocken. Vorher hatte ich sehr viele libraries und sketche durchprobiert. Alle ohne Erfolg. Bis ich auf diese Bauanleitung gestossen bin:

Si4703-FM-Radio-Arduino-Uno-Schield

die dafür notwendig library <Si4703_Breakout.h>

Die wichtigste Erkenntnis war das ich die Verdrahtung des SI4703 ändern musste. GPIO2 des Empfängers löst über D3 des Arduino den RDSInterrupt aus und wird demzufolge auch mit bei den Variablen deklariert:

/*SI4703 - Pins*/
int resetPin = 2;
int SDIO = A4;
int SCLK = A5;
int RDSInterruptPin = 3; // GPIO2 for RDS Interrupt

sowie in der Objektdefinition mit als Parameter übergeben:

/*Init SI4703 Driver*/
Si4703_Breakout radio(resetPin, SDIO, SCLK, RDSInterruptPin);

Nun arbeitete ich ja schon länger mit der Bibliothek Si4703_Breakout von Simon Monk, aber die notwendige zusätzliche Verdrahtung hatte in meinem Kopf nie einen "Klick" ausgelöst.

Ich arbeite jetzt daran den RDS-fähigen Sketch auf meine Bedürfnisse anzupassen. Dazu hatte ich den funktionierenden "Kern" mit den RDS-Funktionen weitgehend freigelegt und meine I/O Funktionen dazugebaut.

Dazu gehörte erst mal die Bedienung per Drehencoder, welcher für die Sendereinstellung einen scan ausführt. Bewährte Routinen mit ISR benutze ich schon seit Jahren. Der einzige freie interruptfähige Pin D3 ist aber jetzt an den RDSInterrupt vergeben. Also bleiben für die Encoderabfrage nur 2 Möglichkeiten. Einfaches polling oder Pin Change Interrupts. Dabei lieferte das polling mit einem einfachen Encoderbauteil ohne breakboard, und damit auch ohne Tiefpass, so präzise Ergebnisse, das ich es dabei belies.

Der nächste Schritt war eine Umstellung der Ausgabe von OLED 128x64 auf LCD 16x2. Das war erst mal kein großes Problem, und ich bekam auch alle Informationen unter die ich anzeigen lassen wollte: Frequenz, RSSI, Stereo/Mono/Tuning, RDS sowie Lautstärke (VOL). Da aber jede Änderung nur eines Wertes jedesmal die ganze Anzeige neu aufbaute war im Display ein ständiges Flimmern zu erkennen, das mich störte. Deshalb zerlegte ich die Unterfunktion zur Displayaktualisierung auf mehrere kleine Unterfunktionen, um einzelne Wertänderungen partiziell zu aktualisieren. Die Aufrufe wurden dann direkt den Ereignissen zugeordnet und auf diese Weise eine stabile, flimmerfreie Ausgabe erzeugt.

Die Anzeige Mono/Stereo/Tune konnte ich mit nur einem Zeichen realisieren. Ein Charakter zeigt während des Suchlaufes die Suchrichtung '<' bzw. '>', und nach erfolgreichem Suchlauf ein 'S' für Stereo bzw. 'M' für Mono.

Die Formatierung für die Frequenzanzeige unterscheidet zwischen 2 und 3 Stellen vor dem Komma und passt dementsprechend den string "frequency" an.

Ein aktiver Suchlauf sollte nicht nur per Suchrichtung angezeigt werden, sondern die grade behandelte Frequenz sollte auch ausgegeben werden. Das erforderte Anpassungen in der Standard SI4703_seekUpAuto / SI4703_seekDnAuto - Funktion.

Sämtliche seriellen Ein/Ausgaben entfernte ich aus dem sketch, da inzwischen der Compiler durch zuviel Speicherbedarf Instabilitäten vermeldete. Es gab zwar einen Schalter:

#define DEBUG 1  // change from 0 to 1 if you want debug (serial monitor)

der das gleiche bewirkt hätte. Aber mir wurde der sketch aufgrund der ganzen Unterprogramme einfach zu unübersichtlich. Eine serielle Bedienung des Radios macht auch insofern keinen Sinn weil es dann über den USB-Port des PC gespeist werden muss und die peek's auf dem USB-Kabel einen guten Empfang sowie eine RDS-Ausgabe ruinieren.

Lautstärke per zweiten encoder ist jetzt auch integriert.

Für die Zukunft sind weitere Varianten für andere Displays, Servo-Ausgabe und LED-Stripes geplant. Auch muss ich meine Platine neu entwickeln. Einmal wegen der RDSInterrupt-Verdrahtung und einmal um mehr GPIOS's über Pfostenstecker erreichen zu können, sowie direkte Kontakte für I2C-Displays mit wahlweise 3,3V und 5V, also auf beiden Seiten des Level Converter.

ein kleines Demo: 

und so sieht meine Entwicklungsumgebung aus:




 

1 Kommentar:

  1. Hallo, Jupp,
    auch eine schöne Bastelei, die ich gerne nachmachen würde. Du hast solche Ideen!

    AntwortenLöschen