본문 바로가기
프로그래밍/임베디드

[RDA5807M][TEA5767][RRD102.Ver2] 라디오 만들기

by JR2 2021. 2. 22.

datasheet.lcsc.com/szlcsc/RDA5807M_C82537.pdf

 

www.sparkfun.com/datasheets/Wireless/General/TEA5767.pdf

 

cafe.naver.com/arduinostory/52911

 

RDA5807M과 TEA5767의 Datasheet이다.

간략하게 설명하자면 RDA5807M에서 TEA5767의 모드를 사용 할 수 있다.

이 게시글에서는 TEA5767을 사용하기 때문에, TEA5767의 DataSheet를 참고해야한다.

 

회로도

#include <Wire.h>                       // I2C용 라이브러리 인쿨루드 

void setup(){
  Wire.begin();
  Wire.beginTransmission(0x60);     // TEA5767모드로 I2C통신 시작
    Wire.write(0x30);                 // Reg 1 쓰기
    Wire.write(0x1F);                 // Reg 2 쓰기 
    Wire.write(0x90);                 // Reg 3 쓰기
    Wire.write(0x12);                 // Reg 4 쓰기 
    Wire.write(0x40);                 // Reg 5 쓰기 
  Wire.endTransmission();           // I2C 통신 마침 
  delay(100); 
}

void loop(){
}

어디선가 퍼온 소스코드이다.

 

일단 기본적인 TEST로 본인이 위치한 지역의 라디오 주파수로

Register 1과, Register 2를(주파수 레지스터) 바꿔준다.

 

Register 1과, Register 2의 정보는 TEA5767의 DataSheet에

"Table 5. Format of 1st data byte" 를 참고하면 된다.

 

 

주파수 Register의 Formula

예를 들어,

본인이 위치한 지역에 100.7MHZ가 수신된다면,

4 * (100700000 + 225000) / 32768 = 12319

12319(Dec) = 301F(Hex)

 

Register1 = 0x30, Register2 = 0x1F로 소스코드를 고쳐주면 된다.

 

TEA5767 은 쓰기/읽기 명령을 내린 후 5개를 쓰거나/읽음으로 통신을 한다.

 

 

#include "U8glib.h"
#include <Wire.h>

#define Rotary_ROT1 4 // Rotary Encoder Rotate Pin
#define Rotary_ROT2 5 // Rotary Encoder Rotate Pin
#define Rotary_SW 6 // Rotary Encoder Switch Pin

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);	// I2C / TWI 

int prev_rot = 0;
byte regOne;                       // 레지스터 1번용 변수  
byte regTwo;                       // 레지스터 2번용 변수
float Freq = 96.5;                          // 수신주파수 입력용 변수 (소수점 사용가능) 
unsigned long time;

const unsigned char MHZ [] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x20, 0x09, 0x00, 0x00, 0x30, 0x19, 0x00, 0x00, 0x28, 0x29, 0x00, 0x00,
0x24, 0x49, 0x00, 0x00, 0x22, 0x89, 0xF0, 0x00, 0x21, 0x09, 0x08, 0x00, 0x20, 0x09, 0x09, 0xFC,
0x20, 0x09, 0x08, 0x08, 0x20, 0x09, 0x08, 0x10, 0x20, 0x09, 0x08, 0x20, 0x20, 0x09, 0x08, 0x40,
0x20, 0x09, 0x08, 0x80, 0x20, 0x09, 0x09, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

void u8g_prepare(void) {
  u8g.setFont(u8g_font_fub30); //30size 폰트 사용
  u8g.setFontRefHeightExtendedText();
  u8g.setDefaultForegroundColor();
  u8g.setFontPosTop();
}

void draw(void) {
  setFreq(Freq);
  Serial.print("Freq : ");
  Serial.println(Freq);
  if(Freq <= 99.90) { u8g.setPrintPos(35, 10); } // Freq는 소수점을 기준으로 정렬.
  else { u8g.setPrintPos(12, 10); }
  u8g.print(Freq, 1); // Freq의 소수점 첫째자리 까지만 print
  u8g.drawRFrame(0, 0, 128, 64, 1); // 사각형 테두리 그림
  u8g.drawBitmapP(90, 45, 4, 16, MHZ); // MHZ 표시
  u8g_prepare(); //prepare 함수 호출
}

void setFreq(float Freq) {
  unsigned int freqCalc =  ( ( Freq * 1000000 + 225000 ) * 4 ) / 32768 ;  
  regOne = freqCalc >> 8 ;
  regTwo = freqCalc &  0xff ;
  Wire.beginTransmission(0x60);
    Wire.write(regOne);
    Wire.write(regTwo);
    Wire.write(0x90);
    Wire.write(0x12);
    Wire.write(0x40);
  Wire.endTransmission();
  delay(1);
}

void radio_begin(){
  Wire.begin();
  delay(10);
}

void setup(void) {
  pinMode(Rotary_ROT1,INPUT_PULLUP);
  pinMode(Rotary_ROT2,INPUT_PULLUP);
  pinMode(Rotary_SW,INPUT_PULLUP);
  radio_begin();
  setFreq(Freq);
  u8g.firstPage();  
  do {
    draw();
  } while( u8g.nextPage() );
  Serial.begin(9600);
}

void loop(void) {
  int rot = digitalRead(Rotary_ROT1);
  if(rot == 0 && prev_rot == 1){
    if(digitalRead(Rotary_ROT2)){
      Freq += 0.1;
    }
    else {
      Freq -= 0.1;
    }
    Serial.println(Freq);
    u8g.firstPage();  
    do {
      draw();
    } while( u8g.nextPage() );
  }
  prev_rot = rot;
  delay(1);
}

 

 

댓글