mathertel/Radio

RDA5807M + Arduino Pro Micro + SerialRadio Example = Random Freezing

MatPeff opened this issue · 2 comments

Hello,
At the beginning thank you for this work , It's very interesting project and comprehensive solution to easy implement of SDR receivers.
I have a problem like this :
I connected typical RDA5807 module to Arduino Micro and have uploaded example from your library - SerialRadio. Everything looked good , i could give serial commands to the radio( like frequency change (fxxxxx) , seekUp , seekDown , volume +/- ) , i could receive RDS messages but after few minutes I lost communication with radio via serial.
In other case i have connected a LCD with I2C converter and encoder to manually control of radio(change frq , vol etc...) . Frequency , and RDS was displayed properly , I could control radio by encoder but after few minutes everything froze again and I couldn't control radio by encoder. RDS refreshing was frozing too. I2C Addresses of LCD and RDA are different , I think that isn't a problem. In my custom implementation I turned off a serial communication.
I have tried to comment parts of code with control encoder but It still isn't It and It did not help.

Below is my implementation of your code with LCD control :

#include <EEPROM.h>
#include <newchip.h>
#include <radio.h>
#include <RDA5807M.h>
#include <RDSParser.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define outputA 6
#define outputB 7
#define zeroButton 8
int counter = 0;
int aState;
int aLastState;
int n = LOW;
unsigned long swTime = 0;
bool turnRight = false;
bool turnLeft = false;
int mode = 0;
int volumeEnc = 0;
int volumeSet;
RADIO_FREQ fqToSave;

byte Vol1[8] = {
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B11111,
};

byte Vol2[8] = {
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B11111,
B11111,
};

byte Vol3[8] = {
B00000,
B00000,
B00000,
B00000,
B00000,
B11111,
B11111,
B11111,
};

byte Vol4[8] = {
B00000,
B00000,
B00000,
B00000,
B11111,
B11111,
B11111,
B11111,
};

byte Vol5[8] = {
B00000,
B00000,
B00000,
B11111,
B11111,
B11111,
B11111,
B11111,
};

byte Vol6[8] = {
B00000,
B00000,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
};

byte Vol7[8] = {
B00000,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
};

byte Vol8[8] = {
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
};

LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set LCD address on 0x3F
RADIO_FREQ preset[] = {
10160,
9300,
10270,
8850,
8890,
8930,
8980,
9180,
9220,
};
int i_sidx=0; ///< Start at Station with index=5
RDA5807M radio; ///< Create an instance of a RDA5807 chip radio
RDSParser rds;
void DisplayFrequency(RADIO_FREQ f)
{
char s[12];
radio.formatFrequency(s, sizeof(s));
lcd.clear();
lcd.setCursor(0,0);
lcd.print(s);
lcd.print(" ");
if(mode == 0)
{
lcd.print("Tun");
}

if(mode == 1)
{
lcd.print("Mem");
lcd.print(" ");
lcd.print(i_sidx+1);
}

if(mode == 2)
{
lcd.print("Vol");
}
lcd.setCursor(8,1);
lcd.print(" ");

if(volumeEnc == 0)
{};

if(volumeEnc > 1 && volumeEnc <5)
{
lcd.write((uint8_t)0);
};

if(volumeEnc > 4 && volumeEnc < 8)
{
lcd.write((uint8_t)0);
lcd.write((uint8_t)1);
};

if(volumeEnc > 7 && volumeEnc < 9)
{
lcd.write((uint8_t)0);
lcd.write((uint8_t)1);
lcd.write((uint8_t)2);
};

if(volumeEnc > 8 && volumeEnc < 11)
{
lcd.write((uint8_t)0);
lcd.write((uint8_t)1);
lcd.write((uint8_t)2);
lcd.write((uint8_t)3);
};

if(volumeEnc > 10 && volumeEnc < 13)
{
lcd.write((uint8_t)0);
lcd.write((uint8_t)1);
lcd.write((uint8_t)2);
lcd.write((uint8_t)3);
lcd.write((uint8_t)4);
};

if(volumeEnc > 12 && volumeEnc < 14)
{
lcd.write((uint8_t)0);
lcd.write((uint8_t)1);
lcd.write((uint8_t)2);
lcd.write((uint8_t)3);
lcd.write((uint8_t)4);
lcd.write((uint8_t)5);
};

if(volumeEnc > 13 && volumeEnc < 16)
{
lcd.write((uint8_t)0);
lcd.write((uint8_t)1);
lcd.write((uint8_t)2);
lcd.write((uint8_t)3);
lcd.write((uint8_t)4);
lcd.write((uint8_t)5);
lcd.write((uint8_t)6);
};
}

void DisplayServiceName(char *name)
{

char s[12];
radio.formatFrequency(s, sizeof(s));
lcd.clear();
lcd.setCursor(0,0);
lcd.print(s);
lcd.print(" ");
if(mode == 0)
{
lcd.print("Tun");
}
if(mode == 1)
{
lcd.print("Mem");
lcd.print(" ");
lcd.print(i_sidx+1);
}
if(mode == 2)
{
lcd.print("Vol");
}
lcd.setCursor(0,1);
lcd.print(name);
lcd.print(" ");
if(volumeEnc == 0)
{
};

if(volumeEnc > 1 && volumeEnc <5)
{
lcd.write((uint8_t)0);
};

if(volumeEnc > 4 && volumeEnc < 8)
{
lcd.write((uint8_t)0);
lcd.write((uint8_t)1);
};

if(volumeEnc > 7 && volumeEnc < 9)
{
lcd.write((uint8_t)0);
lcd.write((uint8_t)1);
lcd.write((uint8_t)2);
};

if(volumeEnc > 8 && volumeEnc < 11)
{
lcd.write((uint8_t)0);
lcd.write((uint8_t)1);
lcd.write((uint8_t)2);
lcd.write((uint8_t)3);
};

if(volumeEnc > 10 && volumeEnc < 13)
{
lcd.write((uint8_t)0);
lcd.write((uint8_t)1);
lcd.write((uint8_t)2);
lcd.write((uint8_t)3);
lcd.write((uint8_t)4);
};

if(volumeEnc > 12 && volumeEnc < 14)
{
lcd.write((uint8_t)0);
lcd.write((uint8_t)1);
lcd.write((uint8_t)2);
lcd.write((uint8_t)3);
lcd.write((uint8_t)4);
lcd.write((uint8_t)5);
};

if(volumeEnc > 13 && volumeEnc < 16)
{
lcd.write((uint8_t)0);
lcd.write((uint8_t)1);
lcd.write((uint8_t)2);
lcd.write((uint8_t)3);
lcd.write((uint8_t)4);
lcd.write((uint8_t)5);
lcd.write((uint8_t)6);
};
} // DisplayServiceName()

void RDS_process(uint16_t block1, uint16_t block2, uint16_t block3, uint16_t block4) {
rds.processData(block1, block2, block3, block4);
}

void SetRadioVolumeByENC(int val){
if(val == 0)
{
radio.setMute(true);
}
else
{
radio.setMute(false);
}
radio.setVolume(val);
}

void setup() {
pinMode (outputA,INPUT_PULLUP);
pinMode (outputB,INPUT_PULLUP);
pinMode (zeroButton , INPUT);
digitalWrite(zeroButton, HIGH);
aLastState = digitalRead(outputA);
delay(500);
lcd.begin(16,2);
lcd.createChar(0, Vol1);
lcd.createChar(1, Vol2);
lcd.createChar(2, Vol3);
lcd.createChar(3, Vol4);
lcd.createChar(4, Vol5);
lcd.createChar(5, Vol6);
lcd.createChar(6, Vol7);
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("Radio FM");
delay(1000);
lcd.setCursor(0,1);
lcd.print("Version 1");
delay(1000);
radio.init();
radio.setBandFrequency(RADIO_BAND_FM, preset[i_sidx]); // 5. preset.
radio.setMono(false);
radio.setMute(false);
radio.setVolume(5);
volumeEnc = 5;
radio.attachReceiveRDS(RDS_process);
rds.attachServicenNameCallback(DisplayServiceName);
}

/// Constantly check for serial input commands and trigger command execution.
void loop() {
unsigned long now = millis();
static unsigned long nextFreqTime = 0;
static RADIO_FREQ lastf = 0;
RADIO_FREQ f = 0;

if (digitalRead(zeroButton) == LOW)
{
swTime = millis();
delay(500); //debounce
// check if the switch is pressed for longer than 1 second.
if(digitalRead(zeroButton) == LOW && swTime - millis() > 5000)
{
if(mode == 1)
{
fqToSave = radio.getFrequency();
preset[i_sidx] = fqToSave;
}
char s1[12];
radio.formatFrequency(s1, sizeof(s1));
delay(1000);
}
else
{
if(mode == 2)
{
mode = 0;
}
else
{
mode++;
}
int fq = radio.getFrequency();
DisplayFrequency(fq);
}
}

n = digitalRead(outputA);
if((aLastState == LOW) && (n == HIGH))
{
if (digitalRead(outputB) == LOW)
{
if(mode==0)
{
radio.seekUp(false);
//radio.seekDown(true);
}
if(mode == 2)
{
if(volumeEnc<15)
{
volumeEnc++;
SetRadioVolumeByENC(volumeEnc);
int fq = radio.getFrequency();
DisplayFrequency(fq);
}
}
if(mode == 1)
{
if (i_sidx < (sizeof(preset) / sizeof(RADIO_FREQ))-1) {
i_sidx++; radio.setFrequency(preset[i_sidx]);
int fq = radio.getFrequency();
DisplayFrequency(fq);
}
}
}
else {
if(mode==0)
{
radio.seekDown(false);
//radio.seekUp(true);
}
if(mode == 2)
{
if(volumeEnc>0)
{
volumeEnc--;
SetRadioVolumeByENC(volumeEnc);
int fq = radio.getFrequency();
DisplayFrequency(fq);
}
}
if(mode == 1)
{
if (i_sidx > 0) {
i_sidx--;
radio.setFrequency(preset[i_sidx]);
int fq = radio.getFrequency();
DisplayFrequency(fq);
}
}
}
}
aLastState = n;
radio.checkRDS();
if (now > nextFreqTime) {
f = radio.getFrequency();
if (f != lastf) {
// print current tuned frequency
DisplayFrequency(f);
lastf = f;
} // if
nextFreqTime = now + 400;
} // if
}

Could you help me with this problem ? I would be very grateful for your help :)
Best regards.
Matthew.

@MatPeff, do you still have this freezing problem? Maybe you suffer to this arduino/Arduino#1476 issue in Wire library? Take a look at my wmarkow/arduino-hifi#3 where I describe my problems with a blocked I2C; maybe it will help you. At least you can use ArduinoCrashMonitor to find the place in the code which is responsible for freezing.

closed as there was no activity.