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.
Linh kiện cần có
- Arduino Nano
- Bộ thu RDA5807
- Bộ khuyếch đại âm thanh
- Kết nối dây
- Nồi – 100K
- 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 .
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.
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.
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 .
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 .
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
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.