09.09.2017, 00:09
Vorbereitend für ein Radioprojekt stelle ich hier schon mal die Platine vor. Ein Arduino Nano steuert einen SI4703 Baustein. Die Abstimmung erfolgt über Rotary Encoder und die Frequenzanzeige über ein LED-Strip.
LED-Strip:
Diese LED-Streifen gibt es als gerade Stücke, als Kreis oder Teilkreis, oder als Band als Meterware. Man schneidet sich ein passendes Stück des Bandes einfach ab (wie hier im Beispiel). Jede LED-Einheit setzt sich zusammen aus einem Miniprozessor und mehrfarbigen LED's. Der Hammer aber ist das es nur eine einzige Steuerleitung gibt und damit auch nur ein Digitalpin des Arduino benötigt wird. Die Steuerleitung und die Betriebsspannung von 5V wird von einer LED-Einheit zur nächsten weitergereicht. Es existieren libraries für alle möglichen bunten Effekte. Ich benutze hier eine wheel Funktion und lösche alle LED bevor ich die nächste LED setze. Dadurch entsteht ein wandernder Punkt. Farbe und Helligkeit sind parametrisierbar. Die Grundlagen hab ich mir hier angeeignet.
Rotary Encoder:
Die Funktionsweise ist hier sehr gut beschrieben. Im Prinzip keine große Sache. Trotzdem hat es mich tagelang beschäftigt bis die Abstimmung sauber funktionierte. Der Grund ist das Kontaktprellen der Schaltkontakte. Die Effekte waren Sprünge bei der Frequenzeinstellung, willkürliches Ändern der Drehrichtung, Verschlucken von Impulsen. Etwas Erfolge hatte ich mit dem Abfragen der Kontakte per Interruptfunktion, wobei die ansteigende bzw. abfallende Flanke ausgewertet wird. Ein zusätzliche Verbesserung brachte eine Zeitverzögerung, die in der Interruptfunktion per millis() einbaut wird. Zufriedenstellend war es immer noch nicht, und ich wollte schon von dem Encoder weg. Dann fand ich einen Hinweis auf eine hardware-Entprellung mit einem einfachen RC-Glied. Das war dann der Durchbruch. Die millis() konnte ich wieder rausnehmen, die Interrupts mussten bleiben. Der Encoder arbeitet jetzt ganz präzise und die Abstimmung ist endlich brauchbar. In die Leitungen der 2 Encodersignale kommen 10K Widerstände und 100n gegen Masse. Bei einer Auflösung von 100kHz pro Raster und 20 Rasterungen pro Umdrehung muss man natürlich schon etwas kurbeln um den Bereich durchzustimmen. Deshalb benutze ich noch zusätzlich den switch des Encoders um festeingestellte Empfangsfrequenzen zu toogeln.
Dann gab es ein weiteres großes Problem. Nach kurzem intensiven Durchstimmen der Frequenz gab es auf einmal reproduzierbar einen Frequenzversatz, so das die eingestellte Frequenz nicht mehr zur Frequenz passte den der SI4703 Baustein ausgab. Möglicherweise änderte der Baustein das Regionalband. Das Problem verschwand erst als ich die library austauschte. Das Programm basierte bis dahin auf der <SparkFunSi4703.h> library, nun arbeitet es stabil mit der Hertel-library <si4703.h>.
Auf dem Video steckt der library-Fehler noch drin, deshalb musste ich zwischendurch den Prozessor resetten:
LED-Strip:
Diese LED-Streifen gibt es als gerade Stücke, als Kreis oder Teilkreis, oder als Band als Meterware. Man schneidet sich ein passendes Stück des Bandes einfach ab (wie hier im Beispiel). Jede LED-Einheit setzt sich zusammen aus einem Miniprozessor und mehrfarbigen LED's. Der Hammer aber ist das es nur eine einzige Steuerleitung gibt und damit auch nur ein Digitalpin des Arduino benötigt wird. Die Steuerleitung und die Betriebsspannung von 5V wird von einer LED-Einheit zur nächsten weitergereicht. Es existieren libraries für alle möglichen bunten Effekte. Ich benutze hier eine wheel Funktion und lösche alle LED bevor ich die nächste LED setze. Dadurch entsteht ein wandernder Punkt. Farbe und Helligkeit sind parametrisierbar. Die Grundlagen hab ich mir hier angeeignet.
Rotary Encoder:
Die Funktionsweise ist hier sehr gut beschrieben. Im Prinzip keine große Sache. Trotzdem hat es mich tagelang beschäftigt bis die Abstimmung sauber funktionierte. Der Grund ist das Kontaktprellen der Schaltkontakte. Die Effekte waren Sprünge bei der Frequenzeinstellung, willkürliches Ändern der Drehrichtung, Verschlucken von Impulsen. Etwas Erfolge hatte ich mit dem Abfragen der Kontakte per Interruptfunktion, wobei die ansteigende bzw. abfallende Flanke ausgewertet wird. Ein zusätzliche Verbesserung brachte eine Zeitverzögerung, die in der Interruptfunktion per millis() einbaut wird. Zufriedenstellend war es immer noch nicht, und ich wollte schon von dem Encoder weg. Dann fand ich einen Hinweis auf eine hardware-Entprellung mit einem einfachen RC-Glied. Das war dann der Durchbruch. Die millis() konnte ich wieder rausnehmen, die Interrupts mussten bleiben. Der Encoder arbeitet jetzt ganz präzise und die Abstimmung ist endlich brauchbar. In die Leitungen der 2 Encodersignale kommen 10K Widerstände und 100n gegen Masse. Bei einer Auflösung von 100kHz pro Raster und 20 Rasterungen pro Umdrehung muss man natürlich schon etwas kurbeln um den Bereich durchzustimmen. Deshalb benutze ich noch zusätzlich den switch des Encoders um festeingestellte Empfangsfrequenzen zu toogeln.
Dann gab es ein weiteres großes Problem. Nach kurzem intensiven Durchstimmen der Frequenz gab es auf einmal reproduzierbar einen Frequenzversatz, so das die eingestellte Frequenz nicht mehr zur Frequenz passte den der SI4703 Baustein ausgab. Möglicherweise änderte der Baustein das Regionalband. Das Problem verschwand erst als ich die library austauschte. Das Programm basierte bis dahin auf der <SparkFunSi4703.h> library, nun arbeitet es stabil mit der Hertel-library <si4703.h>.
Auf dem Video steckt der library-Fehler noch drin, deshalb musste ich zwischendurch den Prozessor resetten:
Gruß,
Jupp
-----------------------------
was du baust ist immer mit dir verbunden
(Lego)
Einsamkeit ist nur ein Mangel an Technologie
(@beetlebum)
Jupp
-----------------------------
was du baust ist immer mit dir verbunden
(Lego)
Einsamkeit ist nur ein Mangel an Technologie
(@beetlebum)