Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
SI 4703, ich bekomm die Krise
#1
nachdem ich von den Arduino Basteleien mit dem SI 4703 und Vorstellungen vom Jupp angefixt war, wollte ich nunn auch sowas mal zusammenstecken.
Also Board bestellt, (beim Makershop, gestern geordert, heute im Briefkasten, TOP), dann mal zusammengesteckt und nix funktioniert.
Wie Jupp an einer Stelle schrieb, auch etliche Sketche und Libs probiert, kein Ton.
Verkabelung gefühlt 125 überprüft. Kein Fehler gefunden.
Also wenn Examples aus der Lib nicht laufen, was dann?
Zitieren
#2
deine Angaben sind etwas mager. Ich kann deshalb nur allgemeine Hinweise geben.

Erst mal muss die Bibliothek auch zum code passen

diese Bibliotheken heissen gleich, sind aber unterschiedlich. Einmal wird mit 3 Parametern initialisiert und einmal mit 4 Parametern:

Code:
int resetPin = 2;
int SDIO = A4;
int SCLK = A5;

Si4703_Breakout radio(resetPin, SDIO, SCLK);


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

baue dir genügend serielle Ausgaben in den code und kontrolliere im Monitor was abgeht. Wenn der Baustein nicht modifiziert ist ist das Klinkenkabel gleichzeitig Antenne, was auch zu berücksichtigen ist. Und bestelle dir nie nur einen Baustein. Der kann auch mal defekt sein.
Gruß,
Jupp
-----------------------------

was du baust ist immer mit dir verbunden
(Lego)

Einsamkeit ist nur ein Mangel an Technologie
(@beetlebum)
Zitieren
#3
Moin,
Ich vermute, der ist hin, warum auch immer.
Ich habe mal nen I2C Scanner drüberlaufen lassen, das 4703 Board wird nicht erkannt.
Sicherheithalber mal ein 1602 zum scannen dran..., wird sofort erkannt.

NF seitig ist er wohl ok, man hört zumindest ein ein/ausschaltknacken, bzw. brummen beim berühren mit dem Finger.
Zitieren
#4
@ Jupp,

hattest du schon mal defekte SI4703 Boards?
Zitieren
#5
Hallo,

ich kenne die von Euch verwendeten Libs nicht, aber der SI4703 kann ja in mehreren Schnittstellenmodis starten -> Datenblatt: https://www.sparkfun.com/datasheets/Brea...-C19-1.pdf

Auch wichtig, liegt ein Takt auf RCLK, schwingt der Quarz an?

Grundsätzlich sind Debug-Ausgaben schon etwas wertvolles, sobald aber ein Datenbus dazwischen kommt, kommt man ohne so etwas meiner Meinung nach im Problemfall nicht aus: https://radio-bastler.de/forum/showthread.php?tid=9073

Gruß
Bernhard
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
#6
(02.04.2022, 19:07)Garagenloeter schrieb: @ Jupp,

hattest du schon mal defekte SI4703 Boards?

kann man so sagen. Beim dem ein oder anderen war ich selbst schuld, nach dem Unterbrechen der Antennenleitung komme ich nicht mehr an den Antennen-PIN des IC

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

was du baust ist immer mit dir verbunden
(Lego)

Einsamkeit ist nur ein Mangel an Technologie
(@beetlebum)
Zitieren
#7
Jupp, die sehen verschimmelt aus Blush ...
Zitieren
#8
es ist nur Staub, die Vorstufe des natürlichen Zerfalls. Ich kann halt nichts wegwerfen..
Gruß,
Jupp
-----------------------------

was du baust ist immer mit dir verbunden
(Lego)

Einsamkeit ist nur ein Mangel an Technologie
(@beetlebum)
Zitieren
#9
Sooo,

heute sind 2 neue SI 4703 Module gekommen.
Beide funktionierten sofort. Also ist der erste defekt.
Kann man ja sehr gut über den seriellen Monitor verfolgen.
Der Empfang ist aber unterirdisch.
Ausser Rauschen, kein einziger Sender, selbst den Stärksten Sender 1Live und WDR 2 nicht.
Verschiedene Standorte hab ich schon probiert
Zitieren
#10
du lässt mich immer raten. Ich hab keine Ahnung welchen sketch du hast. Vielleicht hast du ein 10KHz Kanalraster eingestellt. Für Europa werden 9KHz benötigt.
Ist das Klinkenkabel lang genug? Zum Testen eignet sich ein normaler Ohrhörer wie bei älteren handy's üblich, als es noch 3,5mm Klinke gab.
Gruß,
Jupp
-----------------------------

was du baust ist immer mit dir verbunden
(Lego)

Einsamkeit ist nur ein Mangel an Technologie
(@beetlebum)
Zitieren
#11
...eigentlich ist der Empfang manchmal von Modul zu Modul unterschiedlich, aber keinen einzigen Sender - das hatte ich noch nicht. Sonst, ja mit kaputten SI4703 hatte ich auch , obwohl auch selten zu kämpfen.
Ich tippe hier, dass der Sketch nicht richtig geladen wurde - falsche Baudrate z.B. Oder eine oder andere Bibliothek fehlt.
Folge erst die Anweisungen von Jupp - er hat mir immer geholfen.
Gruß,
Ivan
Zitieren
#12
falsche Bibliothek kann eigentlich nicht sein, falsch hochladen auch nicht. Die IDE denkt schon ein wenig mit :-)

hier ist eine typische Suchlaufroutine:

Code:
if(seekall>1080)seekall=875;
         Serial.print(seekall/10.);Serial.println(" MHz");
         radio.setChannel(seekall);
         OledDisplayInfo();
         delay(30);
         int SI4703AFC_Tune=radio.getTune();
         int SI4703RSSI_Tune=radio.getRSSI();
         delay((SI4703RSSI_Tune*4));
         if(((SI4703AFC_Tune==false)&&(SI4703RSSI_Tune>25)))
         {
            radio.setVolume(volume);
            channel=seekall;
            SetDataToEEP();
            displayInfo();
            break;
         }
      }

die Frequenz wird in 100KHz Schritten hochgezählt und zum SI geschickt. Dann wird ein RSSI-Wert ausgelesen, der ein Maß für die Feldstärke ist. Die Schwelle ist hier auf 25 gesetzt. Ist der RSSI-Wert gleich oder darunter, wird weitergezählt. Wird die 25 überschritten stoppt der Suchlauf. Mit diesem Wert muss man je nach Empfangsverhältnissen experimentieren. Ist er zu hoch angesetzt, werden schwache Sender oder evtl. auch mittelstarke Sender übersprungen. Ist er zu tief, stoppt der Suchlauf bei jedem Knistern in der Umgebung.

Sketch und library findest du hier:

instructables

die lib ist auf Europa eingestellt. Mit den Simon Monk codes habe ich früher immer gerne experimentiert. Kann ich dir nur empfehlen. Damit konnte ich auch zum erstenmal erfolgreich RDS Informationen dekodieren.
Gruß,
Jupp
-----------------------------

was du baust ist immer mit dir verbunden
(Lego)

Einsamkeit ist nur ein Mangel an Technologie
(@beetlebum)
Zitieren
#13
Hallo zusammen,

ich habe mehrere Empfänger mit dem SI4703 gebaut. Die Empfangsleistungen sind gut, die lokalen Programme kommen alle rauschfrei.

In den von Silabs heraus gegebenen Application Notes (AN383) ist die Beschaltung des Antenneneinganges gezeigt. Um den Eingangskreis in Resonanz zu bringen, ist zwingend eine Spule von c.a. 270nH notwendig. Wenn diese nicht verbaut ist, ist der Empfang nicht optimal. Am besten sind die ganz kleinen SI4703 Boards, die nur die geringstmögliche Außenbeschaltung haben, so dass man den Eingangskreis selbst aufbauen kann. Im Anhang ein Foto eines Empfängers mit Arduino Nano und SI4703 Board mit Luftspule im Eingang.

   
Zitieren
#14
Hallo Jensen,

auf dem von uns hauptsächlich verwendeten sparkfun evaluation board ist die Spule eingebaut. Sie dient dazu die Kopfhörer-Masse NF-mässig auf GND zu legen, die Masseleitung aber HF-technisch von GND zu entkoppeln, um das Antennensignal nicht kurzzuschliessen.


.png   JVCDq.png (Größe: 9,84 KB / Downloads: 356)
Gruß,
Jupp
-----------------------------

was du baust ist immer mit dir verbunden
(Lego)

Einsamkeit ist nur ein Mangel an Technologie
(@beetlebum)
Zitieren
#15
Ich komm nicht wirklich weiter.

Den einzigen Sketch, den ich zum laufen gebracht habe, ist das Exampel von SparkFun.
Damit weiss ich zumindest, das die beiden neuen Platinen funktionieren.

Alles andere lüppt bei mir nicht, auch nicht die Sketche vom Jupp.
Der Compiler läuft ohne Fehler durch.
Angry
Zitieren
#16
ich warte hier eigentlich noch auf weitere Angaben. Vor allem was der serielle Monitor meint. Ich habe doch schon einige Anhaltspunkte gegeben?
Gruß,
Jupp
-----------------------------

was du baust ist immer mit dir verbunden
(Lego)

Einsamkeit ist nur ein Mangel an Technologie
(@beetlebum)
Zitieren
#17
Ich habe nun nach mehreren Versuchen eine Sketch vom Jupp zum laufen bekommen.

Warum es nun plötzlich klappte, keine Ahnung.

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
///
///https://hackaday.io/project/175474-diy-arduino-retro-look-fm-radio-with-linear-scale
///https://cdn.hackaday.io/files/1754747507479616/CODE%20autotune%20seek.txt
/// 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 = 20;
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 = 992;
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 = 21; // 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 = grun, 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 ausgelost");
       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*3));
         if(((SI4703AFC_Tune==false)&&(SI4703RSSI_Tune>15)))
         {
            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*3));
         if(((SI4703AFC_Tune==false)&&(SI4703RSSI_Tune>15)))
         {
            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; //grun
if (rssi >= 25) wc = 80; //rot
if (tune) wc = 160; //blau
strip.setPixelColor(led, Wheel(wc));
strip.show();
delay(20);
}

Was noch nicht richtig funktioniert, ist das auf und up scrollen am Drehencoder.
Egal ob ich links oder rechts drehe, der Sendersuchlauf läuft immer aufwärts. Huh

Für meine Person stelle ich fest, das diese kleinen Radiomodule nicht meine Freunde sind u werden.
Zitieren
#18
Zitat://Rotary Encoder KY-040 pull up's built in
bedeutet der Encoder braucht auch eine 3,3V Versorgung sowie GND. Welchen encoder genau hast du genommen?

der serielle Monitor zeigt ob eine Drehbewegung des encoder erkannt wurde:

Zitat:Serial.println("ISP ausgelost");


du kannst die Ausgabe erweitern durch die Werte von UP_FLAG und DOWN_FLAG. Je nach Drehrichtung muss einer der beiden von 0 auf 1 wechseln.

Serial.print(" UP_FLAG: ");
Serial.print(UP_FLAG);
Serial.print(" DOWN_FLAG: ");
Serial.println(DOWN_FLAG);

dann siehst du ob die Drehrichtung korrekt erkannt wird. Diese Auswertung macht bei diesem Sketch die Interrupt-Routine void flag(). In diese Routine darfst du keine seriellen Ausgaben einbauen.
Gruß,
Jupp
-----------------------------

was du baust ist immer mit dir verbunden
(Lego)

Einsamkeit ist nur ein Mangel an Technologie
(@beetlebum)
Zitieren
#19
Nabend Jupp,
Danke für die Infos.
Encoder ist folgender:
https://www.amazon.de/AZDelivery-KY-040-...B08247Q69J
also widerstände schon drin.

Serial.println("ISP ausgelost");
wird angezeigt.

Mit der Plusleitung wusste ich nicht, war im Schaltbild nicht eingezeichnet.

Ok, hab ich nun angeschlossen und funktioniert nun up and down.
nur leider verkehrt rum. heisst, rechts rum =down und andersrum
Zitieren
#20
das ist kein Problem. Da must du nur die Leitungen CLK und DT vertauschen.
Gruß,
Jupp
-----------------------------

was du baust ist immer mit dir verbunden
(Lego)

Einsamkeit ist nur ein Mangel an Technologie
(@beetlebum)
Zitieren


Gehe zu: