ArduinoMạch Điện

Đài FM sử dụng Arduino và chip RDA5807M

Đài FM sử dụng Arduino và chip RDA5807M : Ngày nay hầu như mọi người đều sử dụng điện thoại di động để nghe nhạc, tin tức, podcast, v.v. Nhưng cách đây không lâu, tất cả chúng ta đều phụ thuộc vào Radio FM địa phương để nhận tin tức và bài hát mới nhất, dần dần những chiếc Radio này mất dần tính phổ biến nhưng trong những trường hợp khẩn cấp khi internet là xuống, bộ đàm đóng một vai trò quan trọng để truyền tải thông tin đến người dùng. Tín hiệu vô tuyến luôn hiện hữu trong không khí (được các đài phát), và tất cả những gì chúng ta cần là một mạch thu FM để bắt các tín hiệu radio đó và chuyển chúng sang tín hiệu âm thanh. Trong các hướng dẫn trước đây của chúng tôi, chúng tôi cũng đã xây dựng một số Bộ phát và Bộ thu FM khác được liệt kê bên dưới.

Trong hướng dẫn này, chúng ta sẽ xây dựng Bộ thu FM Arduino và thêm nó vào kho dự án của chúng ta. Chúng tôi sẽ sử dụng IC thu FM RDA5807 với Arduino và lập trình nó như vậy, phát bất kỳ đài FM nào mà người dùng có thể điều chỉnh bằng chiết áp. Chúng ta cũng sẽ sử dụng Bộ khuếch đại âm thanh cùng với mạch để điều khiển âm lượng đầu ra của Đài FM Arduino của chúng ta , nghe thật thú vị phải không? Vậy hãy bắt đầu.

Đài FM Hoạt Động Như Thế Nào

Các đài phát thanh chuyển đổi tín hiệu điện thành tín hiệu vô tuyến , và các tín hiệu này phải được điều chế trước khi truyền qua ăng-ten. Có hai phương pháp mà tín hiệu có thể được điều chế là AM và FM. Như tên của nó, điều chế biên độ (AM) điều chế biên độ trước khi truyền tín hiệu trong khi trong điều chế tần số (FM) , tần số của tín hiệu được điều chế trước khi truyền qua ăng-ten. Tại các đài phát thanh, họ sử dụng điều tần để điều chế tín hiệu và sau đó truyền dữ liệu. Bây giờ, tất cả những gì chúng ta cần xây dựng là một bộ thu có thể được điều chỉnh đến các tần số nhất định và nhận các tín hiệu đó, sau đó chuyển đổi các tín hiệu điện này thành tín hiệu âm thanh. Chúng tôi sẽ sử dụngMô-đun thu FM RDA5807 trong dự án này, giúp đơn giản hóa mạch của chúng tôi.

Có thể bạn quan tâm

Linh kiện cần có

  1. Arduino Nano
  2. Bộ thu RDA5807
  3. Bộ khuyếch đại âm thanh
  4. Kết nối dây
  5. Nồi – 100K
  6. Bảng Perf

Bộ thu RDA5807M

RDA5807M là mô-đun bộ dò đài FM stereo một Chip với bộ tổng hợp tích hợp đầy đủ. Mô-đun hỗ trợ dải tần trên toàn thế giới từ 50 – 115MHz, điều khiển âm lượng và tắt tiếng, tắt tiếng có thể lập trình (50/75us), chỉ báo cường độ tín hiệu nhận và SNR, bộ dao động tinh thể 32,768KHz, điều khiển độ lợi tự động kỹ thuật số, v.v. Hình bên dưới cho thấy sơ đồ khối của  RDA5807M .

Bộ thu RDA5807M

Nó có kiến ​​trúc kỹ thuật số low-IF và tích hợp bộ khuếch đại tiếng ồn thấp (LNA), hỗ trợ băng tần phát sóng FM (50 đến 115 MHz), điều khiển độ lợi có thể lập trình (PGA), bộ chuyển đổi tương tự sang kỹ thuật số có độ phân giải cao và một bộ chuyển đổi kỹ thuật số sang tương tự (DAC) có độ trung thực cao. Bộ giới hạn ngăn quá tải và giới hạn số lượng sản phẩm xuyên điều chế được tạo ra bởi các kênh lân cận. PGA khuếch đại tín hiệu đầu ra của bộ trộn và sau đó được số hóa bằng ADC. Lõi DSP quản lý việc lựa chọn kênh, giải điều chế FM, bộ giải mã âm thanh nổi MPX và tín hiệu âm thanh đầu ra. Các RDA5807 pinout sơ đồ cho các IC được đưa ra dưới đây.

RDA5807M

Mô-đun hoạt động trên nguồn điện 1,8 – 3,3V . Khi đến trạng thái nghỉ ngơi và giao diện điều khiển được chọn, mô-đun tự đặt lại khi VIO Bật nguồn, đồng thời hỗ trợ thiết lập lại mềm bằng kích hoạt của bit1 từ 0 đến 1 của địa chỉ 02H. Mô-đun sử dụng giao tiếp I2C để giao tiếp với MCU và giao diện bắt đầu với điều kiện bắt đầu, một byte lệnh và các byte dữ liệu. RDA5807 có 13 thanh ghi 16 bit, mỗi thanh ghi thực hiện một chức năng cụ thể. Địa chỉ thanh ghi bắt đầu bằng 00H, được phân bổ cho ID chip và kết thúc bằng 0FH. Trong tất cả 13 thanh ghi, một số bit được dành riêng trong khi một số là R / W. Mỗi thanh ghi thực hiện các nhiệm vụ như thay đổi âm lượng, thay đổi kênh, v.v. tùy thuộc vào các bit được gán cho chúng.

Chúng tôi không thể sử dụng trực tiếp mô-đun khi kết nối nó với một mạch vì các chân đã được đóng lại. Vì vậy, tôi đã sử dụng một bo mạch hoàn hảo và một số chân nam và hàn từng chân của mô-đun vào từng chân nam như trong hình bên dưới.

PCB Bộ thu RDA5807M

Bộ khuyếch đại âm thanh

Bộ khuếch đại âm thanh là một thiết bị điện tử, khuếch đại tín hiệu âm thanh điện tử công suất thấp đến mức đủ cao để điều khiển loa hoặc tai nghe. Chúng tôi đã chế tạo một bộ khuếch đại âm thanh đơn giản sử dụng LM386 , mạch cho tương tự được hiển thị bên dưới và bạn cũng có thể kiểm tra liên kết để tìm hiểu thêm về mạch này, cũng kiểm tra các mạch khuếch đại âm thanh khác .

Bộ khuyếch đại âm thanh

Sơ đồ mạch Đài FM sử dụng Arduino và chip RDA5807M

 Chúng tôi đã sử dụng hai chiết áp để điều chỉnh băng tần FM và điều khiển âm lượng của bộ khuếch đại âm thanh. Để thay đổi âm lượng bạn có thể thay đổi nồi, được kết nối ở giữa 1 và 8 tháng pin của LM386 hoặc nồi, được kết nối tại chân 3 của LM386. Hình dưới đây cho thấy sơ đồ mạch hoàn chỉnh cho Arduino FM Radio .

Sơ đồ mạch Đài FM sử dụng Arduino và chip RDA5807M

Tôi đã làm thay đổi nhỏ trong bộ khuếch đại. Thay vì sử dụng hai chiết áp trong bộ khuếch đại, tôi chỉ sử dụng một. Tôi đã thay đổi POT, được sử dụng để thay đổi Gain, bằng một điện trở. Vì vậy, bây giờ dự án của chúng tôi có hai chiết áp một để điều chỉnh và một để thay đổi âm lượng. Chiết áp, được sử dụng để điều chỉnh kênh được kết nối với Arduino nano. Chân giữa của nồi được kết nối với chân A0 của Arduino nano, và một trong hai chân còn lại được kết nối với 5V và chân còn lại được kết nối với GND. Một cái nồi khác được sử dụng để điều khiển âm lượng của radio và được kết nối như trong hình trên.

Chân A4 và A5 của Arduino được kết nối với chân SDA và SCL của RDA5807M. hãy nhớ rằng mô-đun bộ thu chỉ hoạt động trên 3.3V. Vì vậy, hãy kết nối chân 3v3 của Nano với chân VCC của mô-đun thu. Sau khi các kết nối được thực hiện, thiết lập của tôi trông như thế này

kiểm tra mạch Đài FM sử dụng Arduino và chip RDA5807M

Giải thích Code Đài FM sử dụng Arduino và chip RDA5807M

Mã sẽ khởi tạo mô-đun Bộ thu và sau đó đặt kênh với tần số đặt trước. Khi giá trị được đọc bởi nano tại chân A0 thay đổi (bằng cách thay đổi POT) thì tần số thay đổi làm thay đổi kênh. Code đầy đủ được đưa ra ở cuối trang.

Chúng tôi bắt đầu chương trình của mình bằng cách thêm thư viện dây bắt buộc để giao tiếp với RDA5807M. Sau đó, trong biến “kênh”, chúng tôi đặt giá trị của kênh. Bất cứ khi nào radio bắt đầu, đài sẽ tự động dò kênh này.

#include <Wire.h> 
uint16_t channel = 187;

Tiếp theo, chúng tôi sẽ tải các byte vào mỗi thanh ghi trên IC RDA5807 của chúng tôi để thiết lập cấu hình ban đầu của chúng tôi. Tại thời điểm này, chúng tôi đang đặt lại đầu thu.

uint8_t boot_config[] = {
  /* register 0x02 */
  0b11000001,
  0b00000011,
  /* register 0x03 */
  0b00000000,
  0b00000000,
  /* register 0x04 */
  0b00001010,
  0b00000000,
  /* register 0x05 */
  0b10001000,
  0b00001111,
  /* register 0x06 */
  0b00000000,   
  0b00000000,
  /* register 0x07 */
  0b01000010,
  0b00000010,
};

Sau khi chúng tôi đặt lại thiết bị, chúng tôi có thể điều chỉnh thiết bị. Để dò kênh, chúng ta chỉ cần lập trình 4 byte đầu tiên. Phần code này sẽ thay đổi kênh thành tần số mong muốn. Trong I2C lúc đầu, chúng tôi bắt đầu truyền, Ghi hoặc đọc dữ liệu và sau đó kết thúc quá trình truyền. Trong IC thu này, chúng ta không phải chỉ định địa chỉ vì biểu dữ liệu nói rõ ràng rằng giao diện I2C có một thanh ghi bắt đầu cố định tức là 0x02h cho một thao tác ghi và 0x0Ah cho một thao tác đọc.

uint8_t tune_config[] = {
  /* register 0x02 */
  0b11000000,
   0b00000001,
   /* register 0x03 */
   (channel >> 2),
   ((channel & 0b11) << 6 ) | 0b00010000
};

Trong thiết lập, chúng tôi khởi tạo cấu hình khởi động (đặt lại) và sau đó điều chỉnh kênh bằng cách ghi các byte cấu hình điều chỉnh vào RDA5807M.

void setup()
{
  Serial.begin(9600);
  pinMode(A0,INPUT);
  /* Conect to RDA5807M FM Tuner: */
  Wire.begin();
  Wire.beginTransmission(RDA5807M_ADDRESS);
  Wire.write(boot_config, BOOT_CONFIG_LEN);
  Wire.endTransmission();
  Wire.beginTransmission(RDA5807M_ADDRESS);
  Wire.write(tune_config, TUNE_CONFIG_LEN);
  Wire.endTransmission();
}

Khi sử dụng pot để điều chỉnh tần số, tôi đã gặp phải một vấn đề. Các giá trị được đọc bởi chân A0 không phải là hằng số. Có một câu lạc bộ tiếng ồn với giá trị mong muốn. Tôi đã sử dụng một tụ gốm 0,1uF được kết nối giữa A0 và GND, mặc dù tiếng ồn đã được giảm thiểu, nhưng nó không đạt đến mức mong muốn. Vì vậy, tôi đã phải thực hiện một số thay đổi đối với code. Lúc đầu, tôi ghi lại các kết quả đọc bị ảnh hưởng bởi tiếng ồn. Tôi phát hiện ra rằng giá trị lớn nhất của nhiễu là 10. Vì vậy, tôi đã viết chương trình theo cách đó, nó sẽ chỉ xem xét giá trị mới nếu sự khác biệt giữa giá trị mới và giá trị cũ của cùng một chân đó lớn hơn 10 và sau đó dò kênh mong muốn.

void loop()
{
  int channel1 =187 ,avg=0, newA;
  static int oldA = 0;
  int result = 0;
  newA = analogRead(A0);
  if ((newA - oldA) > 10 || (oldA - newA) > 10){
   Serial.println(newA);
  if(newA!= oldA){
     channel = channel1+(newA/10);
    myChangeChannel(channel);
    oldA=newA;
  }
} 
}//loop end

Hàm này được sử dụng để thiết lập các byte của mảng tune_config và sau đó truyền dữ liệu đến IC RDA5807M bằng giao thức I2C.

void myChangeChannel(int channel){ /* void if nothing is returned else int */
   tune_config[2] = (channel >> 2);
   tune_config[3] = ((channel & 0b11) << 6 ) | 0b00010000;
      Wire.begin();
      Wire.beginTransmission(RDA5807M_ADDRESS);
      Wire.write(tune_config, TUNE_CONFIG_LEN);
      Wire.endTransmission();
  }

Hoạt động của Arduino FM Radio

Khi mô-đun được cấp nguồn, code của chúng tôi đặt lại IC RDA5807M và đặt nó thành kênh người dùng mong muốn (Lưu ý: tần số này được lấy làm tần số cơ bản mà tần số sẽ được tăng lên). Bằng cách thay đổi chiết áp (kết nối với A0), các giá trị được đọc bởi Arduino Nano sẽ thay đổi. Nếu sự khác biệt giữa giá trị mới và cũ lớn hơn 10, code của chúng tôi sẽ xem xét giá trị mới này. Kênh được thay đổi tùy thuộc vào sự thay đổi của giá trị mới so với giá trị cũ. Việc tăng hoặc giảm âm lượng phụ thuộc vào chiết áp, được kết nối giữa chân 3 và GND.

kiểm tra mạch Đài FM sử dụng Arduino và chip RDA5807M

Code

#include <Wire.h>
    /* Select the frequency we want to tune to by way
     * of selecting the channel for the desired frequency 
     */
uint16_t channel = 187; 
    /*
     * assuming band starts at 87.0MHz (per settings below)
     * and channel spacing of 100kHz (0.1MHz) (per settings below)
     * then channel can be derived as follows:
     *  
     * channel = (<desired freq in MHz> - 87.0) / 0.1 
     *
     * which is the same as:
     * <10 x desired freq in MHz> - 870
     */
#define RDA5807M_ADDRESS  0b0010000 // 0x10
#define BOOT_CONFIG_LEN 12
#define TUNE_CONFIG_LEN 4
/* 
 *  These bytes set our initial configuration
 *  We don't bother to tune to a channel at this stage.
 *  But instead initiate a reset.
 */
uint8_t boot_config[] = {
  /* register 0x02 */
  0b11000001,
    /* 
     * DHIZ audio output high-z disable
     * 1 = normal operation
     *
     * DMUTE mute disable 
     * 1 = normal operation
     *
     * MONO mono select
     * 0 = stereo
     *
     * BASS bass boost
     * 0 = disabled
     *
     * RCLK NON-CALIBRATE MODE 
     * 0 = RCLK is always supplied
     *
     * RCLK DIRECT INPUT MODE 
     * 0 = ??? not certain what this does
     *
     * SEEKUP
     * 0 = seek in down direction
     *
     * SEEK
     * 0 = disable / stop seek (i.e. don't seek)
     */
  0b00000011,
    /* 
     * SKMODE seek mode: 
     * 0 = wrap at upper or lower band limit and contiue seeking
     *
     * CLK_MODE clock mode
     *  000 = 32.768kHZ clock rate (match the watch cystal on the module) 
     *
     * RDS_EN radio data system enable
     * 0 = disable radio data system
     *
     * NEW_METHOD use new demodulate method for improved sensitivity
     * 0 = presumably disabled 
     *
     * SOFT_RESET
     * 1 = perform a reset
     *
     * ENABLE power up enable: 
     * 1 = enabled
     */ 
  /* register 0x03 */
    /* Don't bother to tune to a channel at this stage*/
  0b00000000, 
    /* 
     * CHAN channel select 8 most significant bits of 10 in total
     * 0000 0000 = don't boher to program a channel at this time
     */
  0b00000000,
    /* 
     * CHAN two least significant bits of 10 in total 
     * 00 = don't bother to program a channel at this time
     *
     * DIRECT MODE used only when test
     * 0 = presumably disabled
     *
     * TUNE commence tune operation 
     * 0 = disable (i.e. don't tune to selected channel)
     *
     * BAND band select
     * 00 = select the 87-108MHz band
     *
     * SPACE channel spacing
     * 00 = select spacing of 100kHz between channels
     */    
  /* register 0x04 */
  0b00001010, 
    /* 
     * RESERVED 15
     * 0
     *
     * PRESUMABLY RESERVED 14
     * 0
     *
     * RESERVED 13:12
     * 00
     *
     * DE de-emphasis: 
     * 1 = 50us de-emphasis as used in Australia
     *
     * RESERVED
     * 0
     *
     * SOFTMUTE_EN
     * 1 = soft mute enabled
     *
     * AFCD AFC disable
     * 0 = AFC enabled
     */
  0b00000000, 
    /* 
     *  Bits 7-0 are not specified, so assume all 0's
     * 0000 0000
     */  
  /* register 0x05 */
  0b10001000, 
    /* 
     * INT_MODE
     * 1 = interrupt last until read reg 0x0C
     *
     * RESERVED 14:12 
     * 000
     *
     * SEEKTH seek signal to noise ratio threshold
     * 1000 = suggested default
     */   
  0b00001111, 
    /* 
     * PRESUMABLY RESERVED 7:6
     * 00
     *
     * RESERVED 5:4
     * 00
     *
     * VOLUME
     * 1111 = loudest volume
     */ 
  /* register 0x06 */
  0b00000000, 
    /* 
     * RESERVED 15
     * 0
     *
     * OPEN_MODE open reserved registers mode
     * 00 = suggested default
     *
     * Bits 12:8 are not specified, so assume all 0's
     * 00000
     */   
  0b00000000, 
    /* 
     *  Bits 7:0 are not specified, so assume all 0's
     *  00000000
     */    
  /* register 0x07 */
  0b01000010, 
    /* 
     *  RESERVED 15 
     * 0
     *
     * TH_SOFRBLEND threshhold for noise soft blend setting
     * 10000 = using default value
     *
     * 65M_50M MODE 
     * 1 = only applies to BAND setting of 0b11, so could probably use 0 here too
     *
     * RESERVED 8
     * 0
     */      
  0b00000010, 
    /*   
     *  SEEK_TH_OLD seek threshold for old seek mode
     * 000000
     *
     * SOFTBLEND_EN soft blend enable
     * 1 = using default value
     *
     * FREQ_MODE
     * 0 = using defualt value
     */  
};
/* After reset, we can tune the device
 * We only need program the first 4 bytes in order to do this
 */
uint8_t tune_config[] = {
  /* register 0x02 */
  0b11000000, 
    /* 
     * DHIZ audio output high-z disable
     * 1 = normal operation
     *
     * DMUTE mute disable 
     * 1 = normal operation
     *
     * MONO mono select
     * 0 = mono
     *
     * BASS bass boost
     * 0 = disabled
     *
     * RCLK NON-CALIBRATE MODE 
     * 0 = RCLK is always supplied
     *
     * RCLK DIRECT INPUT MODE 
     * 0 = ??? not certain what this does
     *
     * SEEKUP
     * 0 = seek in down direction
     *
     * SEEK
     * 0 = disable / stop seek (i.e. don't seek)
     */   
   0b00000001, 
    /* 
     * SKMODE seek mode: 
     * 0 = wrap at upper or lower band limit and contiue seeking
     *
     * CLK_MODE clock mode
     * 000 = 32.768kHZ clock rate (match the watch cystal on the module) 
     *
     * RDS_EN radio data system enable
     * 0 = disable radio data system
     *
     * NEW_METHOD use new demodulate method for improved sensitivity
     * 0 = presumably disabled 
     *
     * SOFT_RESET
     * 0 = don't reset this time around
     *
     * ENABLE power up enable: 
     * 1 = enabled
     */ 
   /* register 0x03 */
   /* Here's where we set the frequency we want to tune to */
   (channel >> 2), 
    /* CHAN channel select 8 most significant bits of 10 in total   */
   ((channel & 0b11) << 6 ) | 0b00010000
    /* 
     *  CHAN two least significant bits of 10 in total 
     *
     * DIRECT MODE used only when test
     * 0 = presumably disabled
     *
     * TUNE commence tune operation 
     * 1 = enable (i.e. tune to selected channel)
     *
     * BAND band select
     * 00 = select the 87-108MHz band
     *
     * SPACE channel spacing
     * 00 = select spacing of 100kHz between channels
     */  
};
void setup()
{
  Serial.begin(9600);
  pinMode(A0,INPUT);
  Wire.begin(); 
  Wire.beginTransmission(RDA5807M_ADDRESS);
  Wire.write(boot_config, BOOT_CONFIG_LEN);
  Wire.endTransmission();
  Wire.beginTransmission(RDA5807M_ADDRESS); 
  Wire.write(tune_config, TUNE_CONFIG_LEN); 
  Wire.endTransmission(); 
}//setup end
void loop()
{
  int channel1 =90,newA;
  static int oldA = 0; // set the oldA as HIGH
  int result = 0;
  newA = analogRead(A0);
  if ((newA - oldA) > 10 || (oldA - newA) > 10){
    Serial.println(newA);
    if(newA!= oldA){
      channel = channel1+(newA/10);
      myChangeChannel(channel);
      oldA=newA;
      }
}
  uint16_t frequency = channel+870;
  uint16_t num1 = (frequency / 1000) % 10;
  uint16_t num2 = (frequency / 100) % 10;
  uint16_t num3 = (frequency / 10) % 10;
  uint16_t num4 = frequency % 10;
  Serial.print(num1);
  Serial.print(num2);
  Serial.print(num3);
  Serial.print(num4);
  Serial.print("--");
  Serial.println(channel+870); 
}//loop end
/*
 * Function to change channel on radio RDA5807
 * Example: channel = 191 
 */
void myChangeChannel(int channel){ /* void if nothing is returned else int */
  /*
   * first write new channel to tune_config massive
   */
   tune_config[2] = (channel >> 2); 
   tune_config[3] = ((channel & 0b11) << 6 ) | 0b00010000;
      Wire.begin();
      Wire.beginTransmission(RDA5807M_ADDRESS);
      Wire.write(tune_config, TUNE_CONFIG_LEN);
      Wire.endTransmission();
  }

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Back to top button