Themabewertung:
  • 1 Bewertung(en) - 4 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Lumophon 210W mit Arduino
#1
Die letzten Teile für mein Lumophon Projekt sind heute von Reichelt angekommen, und zwar die Achskupplungen und der C8 AC-Einbaustecker. Das Gehäuse erstand ich günstig mit bereits geplündertem Chassis. Der Lautsprecher war noch vorhanden, aber er hat nur leise gekrächzt, und ich fand Ersatz in einem Philips Lautsprecher mit einem Schallwandteil als Adapter. Das Netzteil gehörte zu einem HiFi-System mit Ladestation für das iPhone das ich von Detlef geschenkt bekam. An der Ladestation hatte ich es ersetzt, dann, nach Erneuerung eines tauben Elko, konnte ich es wieder verwenden.
Die Elektronik hatte ich hier bereits vorgestellt. Die hardware ist unverändert übernommen. Lediglich hatte ich ein paar Wochen an der software gebastelt. Ich testete diverse libraries für den SI4703 UKW-Baustein. Prinzipiell haben sie alle funktioniert, aber meine Ideen liesen sich nur mit der Simon Monk library alle verwirklichen. Dazu gehörte ein gut funktionierender Suchlauf (seek) mit AFC, sowie ein Auslesen der Feldstärke (rssi) und eine Stereoanzeige. Von diesen Informationen mache ich die Farbe des LED-stripe abhängig. So ist diese normal grün, bei Stereo wird sie rot, und wenn der Baustein ein erfolgreiches Feintuning vollzogen hat wird sie blau. Der Rotary-Encoder löst mit nur einem Impuls einen Suchlauf aus, natürlich richtungsbhängig. Der encoder-switch liegt noch brach, ich bin mir noch nicht im klaren was ich damit schalten soll.

Das lange Audiokabel zwischen Radiobaustein und Klangregelteil hat seinen Grund. Es wirkt nämlich als Antenne. Deshalb ist die Masse des Kabels auf der Verstärkerseite auch nicht aufgelegt, und die Klinkenbuchse auf dem Chassis gegen Masse isoliert.

Das LED-stripe musste direkt hinter der Skalenscheibe befestigt werden. Gleichzeitg aber Kleber von der Scheibe ferngehalten werden. So klebte ich mit Doppelklebband den stripe auf eine grünliche Folie, und diese mit ebensolchem Klebband an die seitlichen Schutzstreifen des Skala.


   

erster Test:

   

Aufbereiten und Lackieren des Chassis:

   

Lautsprechereinbau:

   

Bestücken des Chassis:

   

zur Klangverbesserung setzte ich einen Kuhschwanzregler hinzu:

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   
Gruß,
Jupp
-----------------------------

was du baust ist immer mit dir verbunden
(Lego)

Einsamkeit ist nur ein Mangel an Technologie
(@beetlebum)
Zitieren
#2
und .. na klar .. es folgt noch ein Filmchen. Und wenn man genau hinhört kann man vielleicht noch die Frau Merkel im Hintergrund hören, die bei mir um die Ecke zu diesem Zeitpunkt eine Rede hielt :-)



und dann noch der Programmcode. Mit Sicherheit ist er nicht elegant aufgebaut, aber er funktioniert genau so wie ich es mir vorstelle:

Code:
/// SI4703 Nano Rotary Neostrip sketch mit der SI4703_Breakout library von Simon Monk. Auf die aktuellere Version achten! Diese
/// hat bei der Objektdefinition 4 Parameter, die alte Version nur 3.
/// Jupp Haffner 15.9.2017
///
/// Wiring
/// ------
/// The SI4703 board has to be connected by using the following connections:
/// | Arduino UNO pin    | Radio chip signal  |
/// | -------------------| -------------------|
/// | 3.3V (red)         | VCC                |
/// | GND (black)        | GND                |
/// | A5 or SCL (yellow) | SCLK               |
/// | A4 or SDA (blue)   | SDIO               |
/// | D2 (white)         | RST                |

#include <Arduino.h>
#include <Wire.h>
#include <radio.h>
#include <Si4703_Breakout.h>

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

int StereoLED = 11;
int AF_LED    = 12;

int volume = 30;
int rssi; //signal-level
int tune; //AFC
int stereo;

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

//Rotary Encoder http://henrysbench.capnfatz.com/henrys-bench/arduino-sensors-and-input/keyes-ky-040-arduino-rotary-encoder-user-manual/
int clk = 3;  // Connected to CLK on KY-040
int dt = 7;  // Connected to DT on KY-040
volatile int channel = 1017;
volatile byte INTFLAG1 = 0; // interrupt status flag
volatile byte UP_FLAG = 0; //seekUp
volatile byte DOWN_FLAG = 0; //seekDn

#include <Adafruit_NeoPixel.h>
#define Din 4
int anz_led = 26; // Anzahl der LED's
Adafruit_NeoPixel strip = Adafruit_NeoPixel(anz_led, Din, NEO_GRB + NEO_KHZ800);
// Parameter 1 = number of pixels in strip
// Parameter 2 = pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
int wc = 0; //wheel-color 0 = grün, 80 = rot, 160 = blau
int led = 0;
int led_pos = channel;

void setup()
{
  
  //Rotary Encoder KY-040 pull up's built in
  pinMode (clk, INPUT);
  pinMode (dt, INPUT);
  // interrupt 1 digital pin 3 positive edge trigger
  attachInterrupt(digitalPinToInterrupt(clk), flag, RISING);  
        
  //Initialize and Power up the SI4703
  radio.powerOn();
  radio.powerOn();
  radio.setVolume(volume);
  radio.setChannel(channel);

  //Print Informations to Serial Monitor
  Serial.begin(9600);
  displayInfo();
  
  strip.begin();
  strip.setBrightness(64); //range 0 (off) to 255 (max brightness)
  strip.show(); // Initialize all pixels to 'off'
  UpdateLed();
  
}

void loop()
{

//Rotary Encoder
  if (INTFLAG1)   {
       Serial.println("ISP ausgelöst");
       if (UP_FLAG) SI4703_seekUpAuto();
       if (DOWN_FLAG) SI4703_seekDnAuto();
       // clear flags
       INTFLAG1 = 0;
       UP_FLAG = 0;
       DOWN_FLAG = 0;
       delay(40);
  }
}

//ISR for Encoder: http://www.bristolwatch.com/arduino/arduino2.htm
void flag() {
  INTFLAG1 = 1;
  // CW
  if (digitalRead(clk) && digitalRead(dt)) {
    UP_FLAG = 1;
  }
  // CCW
  if (digitalRead(clk) && !digitalRead(dt)) {
    DOWN_FLAG = 1;
  }
}

uint32_t Wheel(byte WheelPos) {
  if (WheelPos < 85) {
    return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  } else if (WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  } else {
    WheelPos -= 170;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
}

void displayInfo (void)
   {
   rssi=radio.getRSSI();
   tune=radio.getTune();
   stereo=radio.getStereo();
   Serial.print("\n\nChannel: "); Serial.print(channel/10.);Serial.println(" MHz");
   Serial.print("Volume: "); Serial.println(volume);
   Serial.print("RSSI: ");Serial.print(rssi);Serial.println("dB");
   Serial.print("Tune: ");
   if(tune==0)Serial.println("AFC Tuned!!");
   if(tune==1)Serial.println("AFC Tuning...");
   Serial.print("Stereo: ");
   if(stereo==1){Serial.println("true");digitalWrite(StereoLED, HIGH);}
   if(stereo==0){Serial.println("false");digitalWrite(StereoLED, LOW);}
   }

void SI4703_seekUpAuto (void)
{
      channel+=1;
      radio.setVolume(0);
      radio.setChannel(channel);
      delay(100);
      for(int seekup=channel;; seekup++)
      {
         if(seekup>1080)seekup=875;
         Serial.print(seekup/10.);Serial.println(" MHz");
         radio.setChannel(seekup);
         led_pos = seekup;
         UpdateLed();
         delay(30);
         int SI4703AFC_Tune=radio.getTune();
         int SI4703RSSI_Tune=radio.getRSSI();
         delay((SI4703RSSI_Tune*4));
         if(((SI4703AFC_Tune==false)&&(SI4703RSSI_Tune>20)))
         {
            radio.setVolume(volume);
            channel=seekup;
            displayInfo();
            break;
         }
      }      
}

void SI4703_seekDnAuto (void)
{
      channel-=1;
      radio.setVolume(0);
      radio.setChannel(channel);
      delay(100);
      for(int seekdown=channel;; seekdown--)
      {        
         if(seekdown<=875)seekdown=1080;
         Serial.print(seekdown/10.);Serial.println(" MHz");
         radio.setChannel(seekdown);
         led_pos = seekdown;
         UpdateLed();
         delay(30);
         int SI4703AFC_Tune=radio.getTune();
         int SI4703RSSI_Tune=radio.getRSSI();
         delay((SI4703RSSI_Tune*4));
         if(((SI4703AFC_Tune==false)&&(SI4703RSSI_Tune>20)))
         {
            radio.setVolume(volume);
            channel=seekdown;
            displayInfo();
            break;
         }
      }
}

void UpdateLed()
{
rssi=radio.getRSSI();
tune=radio.getTune();
stereo=radio.getStereo();
strip.setPixelColor(led, strip.Color( 0, 0, 0));
led = map(led_pos, 870, 1080, 0, (anz_led - 1));
wc = 0; //grün
if (rssi >= 25) wc = 80; //rot
if (tune) wc = 160; //blau
strip.setPixelColor(led, Wheel(wc));
strip.show();
delay(20);
}
Gruß,
Jupp
-----------------------------

was du baust ist immer mit dir verbunden
(Lego)

Einsamkeit ist nur ein Mangel an Technologie
(@beetlebum)
Zitieren
#3
Hallo Jupp,

Mir gefällt die Lösung und ich habe noch 2-3 solcher Gehäuse, die sich nicht mehr sinnvoll vervollständigen lassen. Das werde ich mir nächsten Monat von Dir noch mal im Detail zeigen lassen. Von deinem ersten Beitrag habe ich die LED Kette als Anregung übernommen. Geordert habe ich 4 größere Kreissegmente weil ich eine runde Skala dieser Art vorhabe. Lässt sich eigentlich neben der Position und der Farbe auch die Helligkeit programmieren? Diese LED sind mir fast noch zu hell.
Prima Entwicklung, danke für die Vorstellung.

Gruß Matthias
Zitieren
#4
Sehr kreativ, das muß ich mir doch die Tage live ansehen kommen...
Und so bunt! Hättest was gesagt, dann hätte ich Dir schwarzes Filament vorbei gebracht Wink
Gruß,
Uli
Zitieren
#5
Hallo, Jupp,
Mich fasziniert auch was Du machst. Ich glaube, ich muß mal Zeit investieren, richtig zu studieren was Du machst und ob ich es umsetzen kann. Oder soll ich vielleicht ein Kurs bei Dir absolvieren. Spass bei Seite, ich denke ernsthaft an das.
Gruß,
Ivan
Zitieren
#6
Guten Tag,

Diese Umsetzung find ich super.
Damit könnten einige Gehäuse gerettet werden.
Mfg Bernd
Zitieren
#7
(15.09.2017, 21:58)MatthiasD schrieb: Hallo Jupp,

Mir gefällt die Lösung und ich habe noch 2-3 solcher Gehäuse, die sich nicht mehr sinnvoll vervollständigen lassen. Das werde ich mir nächsten Monat von Dir noch mal im Detail zeigen lassen. Von deinem ersten Beitrag habe ich die LED Kette als Anregung übernommen. Geordert habe ich 4 größere Kreissegmente weil ich eine runde Skala dieser Art vorhabe. Lässt sich eigentlich neben der Position und der Farbe auch die Helligkeit programmieren? Diese LED sind mir fast noch zu hell.
Prima Entwicklung, danke für die Vorstellung.

Gruß Matthias

Hallo Matthias,

ich komme erst jetzt zum antworten, war heute unterwegs. Im setup-Teil meine sketches siehst du diese Zeile:

strip.setBrightness(64); //range 0 (off) to 255 (max brightness)

damit wird global die Helligkeit eingestellt. Ich hab die Hochleistungs-LED auch nur auf ein viertel der max. Helligkeit laufen.

Viertel-Kreise hab ich auch bestellt, logischerweise für runde oder quadratische Skalen

(15.09.2017, 22:04)Uli schrieb: Sehr kreativ, das muß ich mir doch die Tage live ansehen kommen...
Und so bunt! Hättest was gesagt, dann hätte ich Dir schwarzes Filament vorbei gebracht Wink

schwarzes Filament hab ich auch da. Grün ist im Moment mein "Markenzeichen".

(16.09.2017, 10:05)navi schrieb: Hallo, Jupp,
Mich fasziniert auch was Du machst. Ich glaube, ich muß mal Zeit investieren, richtig zu studieren was Du machst und ob ich es umsetzen kann. Oder soll ich vielleicht ein Kurs bei Dir absolvieren. Spass bei Seite, ich denke ernsthaft an das.

Hallo Ivan,

der hardware-Aufwand ist so gering das ich die Verdrahtung gar nicht mehr aufzeichne. Die benutzten PIN's ersehe ich aus den Deklarationen im Quellcode. Und fertige software findet man auch überall im Netz, zumindest für die grundsätzlichen Funktionen.

(16.09.2017, 17:35)klammi schrieb: Guten Tag,

Diese Umsetzung find ich super.
Damit könnten einige Gehäuse gerettet werden.
Mfg Bernd

Hallo Bernd,

es freut mich das diese Projekte von einigen als Rettung angesehen werden. So ist es von mir auch gemeint, auch wenn es nicht jeder so sieht.
Gruß,
Jupp
-----------------------------

was du baust ist immer mit dir verbunden
(Lego)

Einsamkeit ist nur ein Mangel an Technologie
(@beetlebum)
Zitieren
#8
Wunderhübsch!
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren


Möglicherweise verwandte Themen…
Thema Verfasser Antworten Ansichten Letzter Beitrag
  Sonra Bobby - UKW mit Arduino NWSF Software navi 18 7.013 02.03.2021, 02:48
Letzter Beitrag: pintel
  Radio Bau mit einem Arduino was kann man machen? Atze1967 21 17.747 10.01.2021, 11:36
Letzter Beitrag: Atze1967
Wink Philips B01I 00U Cadetto 2 mit Si4703 und Arduino navi 7 3.830 23.08.2020, 21:06
Letzter Beitrag: navi

Gehe zu: