Samstag, 17. Juni 2017

Preset-Tuner mit ATtiny und TEA5767



ich tüftele schon einige Zeit an diesem Konzept. Die Platine soll für unterschiedliche Anforderungen benutzt werden. Bei Bedarf soll ein Display zusteckbar sein, ebenso ein Servo für eine motorische Frequenzanzeige. Die Abstimmung kann auf unterschiedliche Arten erfolgen. Entweder mit Poti, oder mit Tasten, oder mit Rotary-Encoder. Aber auch mit kapazitiven Touch Key Modulen. Ich stelle mir beispielsweise vor daß mit einem solchen Tuner ein AM-Röhrenradio nachgerüstet wird und man berührt das Emblem auf der Schallwand um auf den nächsten Sender umzuschalten, der entweder als Festfrequenz vorliegt oder per scan gefunden wird.

Warum Preset-Tuner? Ich teile hier ein Poti in 6 Bereiche. Jedem Bereich ist eine Festfrequenz zugeordnet. Diese Bedienung ist praktisch barrierefrei.

Der Testaufbau brachte einige Schwächen zutage, die ich teilweise ausräumen konnte. Ein Problem ist daß in den ATtiny nicht alle Bibliotheken geladen werden können, weil der Programmspeicher einfach zu klein ist. Ich muss also unterschiedliche Sketche bereithalten. Dann hat sich herausgestellt daß der I2C-Bus sich kritisch verhält. Je nach Kombination der Peripherie wurde der Tuner nicht mehr angesprochen. Hier erhoffe ich mir Abhilfe durch Pegel-Converter. Der ATtiny arbeitet mit 5V, was für den TEA5767 die oberste Grenze darstellt. Mit den Convertern kann ich den Tuner dann auf 3,3V laufen lassen. Bernhard gab mir dann noch den Tipp daß man den Tuner abfragen kann ob er mit seiner Konversation fertig ist, und dann erst andere Aufgaben über den I2C Bus erledigt. Am Programm-Code gibt es noch weiteren Handlungsbedarf. Die IF-ELSE Verschachtelungen lassen sich noch stark vereinfachen. Aber ich hab so schon mal was funktionierendes und vorzeigbares. Bestimmt fließen noch weitere Ideen ein, das wird sich dann ergeben.

Entsprechende Geräte für einen Einbau sind schon auf der Werkbank und in absehbarer Zeit kann ich Komplettgeräte zeigen. Im Moment gibt es nur die Platine als Prototyp.

Den TEA5657-Baustein hatte ich zwecks Fehlersuche von der Platine ausgelagert. Praktischer ist es wenn man dafür auch ein fertiges Breakout-Board nimmt. Die engen Kontakte der Platine sind sehr schwierig zu verdrahten.


Das breakout-board mit dem ATtiny kann zum Programmieren abgezogen werden. Unter dem Board befindet sich die 3,3V-Versorgung und die Pullup's für den I2C-Bus. Das Digispark-Board liefert über einen eingebauten Spannungsregler 5V und wird selbst mit 7 - 12V (oder mehr) versorgt.




Der aktuelle Code:
#include <TinyWireM.h>
#include <LiquidCrystal_I2C.h>
//#include <SoftRcPulseOut.h>
#include <TEA5767Tiny.h>

LiquidCrystal_I2C lcd(0x3F, 16, 2);
TEA5767Tiny Radio;
//SoftRcPulseOut servo;

#define REFRESH_PERIOD_MS 20

int analogInPin = A2; // PB4
int poti = 0;
int poti_pwm = 0;
int poti_preset = 0;
int poti_preset_out = 0;

double frequenz;

char Sendername[17] = "Platzhalter";

void setup() {

pinMode(analogInPin, INPUT);

//servo.attach(1);
//servo.setMaximumPulse(2200);
//SoftRcPulseOut::refresh();

lcd.init();
lcd.backlight();
lcd.clear();
lcd.print (poti_preset_out);
delay (30);

Radio.init();
delay (30);

}

void loop() {

poti = analogRead(analogInPin);
poti_preset = map(poti, 0, 1000, 1, 6);
poti_pwm = map(poti, 0, 1000, 0, 180);

if (poti_preset == 1) {
      frequenz = 88.0;
      strcpy (Sendername, "SR 1 Europawelle");
      }
     
else if (poti_preset == 2) {
      frequenz = 91.3;
      strcpy (Sendername, "SR 2 Kultur     ");
      }
     
else if (poti_preset == 3) {
      frequenz = 95.5;
      strcpy (Sendername, "SR3Saarlandwelle");
      }
     
else if (poti_preset == 4) {
      frequenz = 100.9;
      strcpy (Sendername, "ClassicRockRadio");
      }

else if (poti_preset == 5) {
      frequenz = 101.7;
      strcpy (Sendername, "Radio Salue     ");      
      }
     
     
 else if (poti_preset == 6) {
      frequenz = 103.7;
      strcpy (Sendername, "SR Unser Ding   ");
      }

if ((poti_preset_out) != (poti_preset)) {
 poti_preset_out = poti_preset;
 Radio.set_frequency(frequenz);
 delay (30);      
 lcd.setCursor ( 0, 0 );
 lcd.print (poti_preset);
 lcd.print (" - ");
 lcd.print (frequenz);
 lcd.print ("MHz ");
 lcd.setCursor(0, 1);
 lcd.print (Sendername);
 //servo.write(poti_pwm);
}

delay (30);
}

Keine Kommentare:

Kommentar veröffentlichen