- IC RDA5807M
- IC PT2258
- Sơ đồ
- Thành phần bắt buộc
- Làm cách nào để chúng tôi Lấy dữ liệu từ Trợ lý Google?
- Thiết lập tài khoản Adafruit để liên lạc
- Thiết lập Nhà môi giới IFTTT cho Đài FM
- Giải thích và mã Arduino
- Kiểm tra Đài FM được điều khiển bằng giọng nói bằng Arduino
- Cải tiến thêm
Ngày nay, hầu hết chúng ta đều thích nghe nhạc bằng điện thoại thông minh. Nhưng một vài năm trở lại đây, điều này không đúng như vậy, vào thời điểm đó, đài FM là lựa chọn hàng đầu để nghe nhạc, podcast, tin tức và những thứ khác. Ngày nay không ai nghe đài để nghe nhạc, tin tức, và những thứ khác, bà và ông ngoại là một ngoại lệ.
Vì vậy, để hồi sinh lại một chút vinh quang cũ của đài FM, trong dự án này, tôi sẽ xây dựng đài FM được điều khiển bằng giọng nói bằng cách sử dụng Google Assistance và IC thu RDA5870M Superheterodyne phổ biến .
Ngoài ra, hãy kiểm tra các mạch đài FM trước đây của chúng tôi:
- Đài FM dựa trên Arduino
- Đài FM được điều khiển trên điện thoại thông minh bằng Arduino
- Mạch phát FM đơn giản
- Cách xây dựng mạch phát FM
IC RDA5807M
RDA5807M là bộ dò đài FM stereo đơn chip rất hiện đại với bộ tổng hợp tích hợp đầy đủ, tính chọn lọc IF, RDS / RBDS và bộ giải mã MPX hỗ trợ dải tần từ 50MHz đến 115MHz. Đó là một IC thu FM đơn chip rất rẻ, cần rất ít linh kiện bên ngoài để hoạt động đúng chức năng. IC này sử dụng giao diện I2C để giao tiếp với bất kỳ thiết bị chủ nào, vì vậy tất cả tính năng này làm cho nó rất phù hợp với các thiết bị di động.
IC này có Bộ xử lý âm thanh bên trong chịu trách nhiệm cho chất lượng âm thanh tuyệt vời của nó.
Một số tính năng cơ bản bao gồm-
- Hỗ trợ các dải tần trên toàn thế giới
- Hỗ trợ cho RDS / RBDS
- Bộ chỉnh IF thấp kỹ thuật số
- Bộ tổng hợp tần số kỹ thuật số tích hợp đầy đủ
- Kiểm soát độ lợi tự động kỹ thuật số (AGC)
- Tăng âm trầm
- Hỗ trợ trực tiếp tải điện trở 32Ω
- Bộ điều chỉnh LDO tích hợp và hơn thế nữa
Bạn có thể tìm hiểu thêm về vi mạch này bằng cách xem qua dự án Đài FM dựa trên Arduino sử dụng RDA5807.
IC PT2258
PT2258 là một vi mạch được sản xuất để sử dụng như một Bộ điều khiển âm lượng điện tử 6 kênh, vi mạch này sử dụng công nghệ CMOS được thiết kế đặc biệt cho các ứng dụng âm thanh-video đa kênh.
IC này cung cấp Giao diện điều khiển I2C với dải suy giảm từ 0 đến -79dB ở 1dB / bước và đi kèm trong gói DIP hoặc SOP 20 chân.
Một số tính năng cơ bản bao gồm-
- 6 kênh đầu vào và đầu ra (Đối với hệ thống âm thanh gia đình 5.1)
- Địa chỉ I2C có thể lựa chọn (Đối với ứng dụng Daisy-chain)
- Tách kênh cao (Đối với ứng dụng tiếng ồn thấp)
- Tỷ lệ S / N> 100dB
- Điện áp hoạt động là 5 đến 9V
Trước đây chúng tôi đã giải thích về IC này trong Dự án điều khiển âm lượng âm thanh kỹ thuật số PT2258. Bạn có thể kiểm tra dự án đó nếu bạn muốn biết thêm về vi mạch này.
Sơ đồ
Dưới đây là sơ đồ mạch cho Đài FM do Trợ lý Google điều khiển:
Thành phần bắt buộc
- Vi điều khiển NodeMCU - 1
- Bộ điều khiển âm lượng kỹ thuật số PT2258 - 1
- Mô-đun Đài FM RDA5807 - 1
- SPDT Relay 6V - 1
- 1n4007 Diode - 1
- Thiết bị đầu cuối vít 5mmx2 - 1
- Giắc cắm tai nghe 3,5 mm - 1
- Công cụ chuyển đổi cấp độ logic - 1
- Điện trở 10K, 5% - 4
- Điện trở 150K, 5% - 4
- Điện trở 100K, 5% - 2
- Tụ điện 10uF - 6
- Tụ điện 0,1uF - 1
- Dây nhảy - 10
Làm cách nào để chúng tôi Lấy dữ liệu từ Trợ lý Google?
Hình ảnh trên cung cấp cho bạn ý tưởng cơ bản về quy trình giao tiếp giữa Trợ lý Google và NodeMCU.
Trợ lý Google có quyền sửa đổi dữ liệu trong máy chủ Adafruit IO để thực hiện IFTTT đó với MQTT đang hoạt động như một nhà môi giới.
Nếu bất kỳ thay đổi dữ liệu nào xảy ra ở phía máy chủ (Adafruit IO), điều đó được phản ánh ở phía NodeMCU. Để đạt được điều này, bạn cần làm theo hướng dẫn dưới đây-
Thiết lập tài khoản Adafruit để liên lạc
Đầu tiên, hãy tạo một tài khoản IO Adafruit. Đăng nhập vào Adafruit IO bằng thông tin đăng nhập của bạn hoặc Đăng ký nếu bạn chưa có tài khoản. Trước đây chúng tôi đã sử dụng Adafruit IO để xây dựng đèn LED được điều khiển bằng Alexa, tự động hóa nhà Raspberry Pi và nhiều Dự án dựa trên IoT khác.
Sau khi đăng nhập vào tài khoản Adafruit, Nhấp vào Trang tổng quan, sau đó nhấp vào Hành động> Tạo Trang tổng quan mới .
Tiếp theo, chúng tôi sẽ thêm tên mới và mô tả ngắn gọn về Trang tổng quan mới của chúng tôi .
Sau khi đã tạo trang tổng quan, bạn cần lấy Tên người dùng và Khóa hoạt động từ tài khoản của mình như yêu cầu trong mã Arduino. Bạn có thể nhận được điều đó bằng cách nhấp vào biểu tượng KEY.
Sau đó, tạo thành ba khối; một khối chuyển đổi, một khối đo, một khối văn bản.
Các khối này rất quan trọng, vì các khối này chịu trách nhiệm giao tiếp giữa bộ phận hỗ trợ của Google và NodeMCU.
Để tạo khối, bạn cần nhấp vào dấu + ở góc trên bên phải.
Tiếp theo, chúng ta sẽ tạo các khối.
Tiếp theo, Bạn cần thiết lập mọi khối, cho điều đó, bạn cần đánh dấu vào một khối cụ thể và nhấp vào Bước tiếp theo.
Đối với dự án này, không cần thay đổi bất kỳ cài đặt nào ngoại trừ nút bật tắt.
Văn bản trong nút bật tắt là chữ in hoa, bạn cần viết chữ nhỏ và cập nhật các thay đổi.
Vậy là xong, đó là tất cả những thứ bạn cần thiết lập trong IO adafruit.
Màn hình cuối cùng của tôi trông như thế này-
Thiết lập Nhà môi giới IFTTT cho Đài FM
Như mọi khi, Đăng ký nếu bạn chưa có tài khoản hoặc Đăng nhập nếu bạn đã có tài khoản.
Bây giờ, bạn cần tạo một Applet. Đối với điều đó, hãy làm theo các bước dưới đây:
Để tạo một applet, hãy nhấp vào biểu tượng tài khoản của bạn và nhấp vào Tạo.
Trong màn hình tạo, nhấp vào biểu tượng + sau if.
Sau đó, bạn cần cho phép truy cập vào tài khoản google của mình.
Để làm được điều đó, bạn cần tìm kiếm Trợ lý Google trên thanh tìm kiếm và nhấp vào biểu tượng Trợ lý Google.
Trong Màn hình tiếp theo, chúng ta phải chọn một trình kích hoạt, Hãy nhớ rằng, chúng tôi đã tạo ba khối trong Máy chủ IO Adafruit, chúng tôi cần tạo các trình kích hoạt cho ba khối đó.
Đầu tiên, Khối Đài phát thanh, để làm điều đó, chúng ta cần chọn Nói một cụm từ có thành phần văn bản .
Trong màn hình tiếp theo, chúng tôi phải nhập những gì bạn muốn nói và trợ lý google sẽ trả lời bạn với.
Sau đó nhấp vào nút Tạo kích hoạt.
Màn hình tiếp theo trông giống như thế này, như bạn đã hoàn thành Nếu phần, đó là thời gian cho sau đó một phần, nhấp vào + dấu hiệu sau đó .
Bạn sẽ thấy một màn hình như hình dưới đây, tìm kiếm Adafruit và nhấp vào biểu tượng Adafruit.
Tiếp theo, ủy quyền tài khoản Adafruit của bạn với IFTTT, sau đó nhấp vào Kết nối.
Tiếp theo, bạn phải nhấp vào Gửi dữ liệu đến Adafruit IO.
Sau đó, bạn sẽ thấy một danh sách thả xuống các nguồn cấp dữ liệu mà bạn đã tạo trước đó trong tài khoản Adafruit.
Chọn một cái bất kỳ và nhấp vào tạo hành động, bạn cần làm điều này cho cả ba.
Và cùng với đó, đánh dấu sự kết thúc của quá trình IFTTT, màn hình applet cuối cùng của tôi trông như thế này,
Giải thích và mã Arduino
Mã Arduino ở đó để quản lý tất cả giao tiếp giữa IC và giao tiếp giữa Adafruit IO IFTTT và WIFI. Mã hoàn chỉnh cho Arduino Nano FM Radio này được đưa ra ở cuối hướng dẫn này. Đoạn mã hơi dài và phức tạp, ở đây chúng tôi đã giải thích từng dòng mã hoàn chỉnh.
Đầu tiên, chúng ta cần bao gồm tất cả các thư viện bắt buộc, chúng là:
#include
Sau đó, xác định SSID và mật khẩu cho WI-FI, đây là SSID và MẬT KHẨU của bộ định tuyến của bạn.
const char * ssid = "Android"; // SSID của bộ định tuyến của bạn const char * password = "12345678"; // Mật khẩu của Bộ định tuyến của bạn
Sau đó, chúng tôi xác định hai boolean và một biến, boolean được sử dụng để giữ trạng thái giao tiếp của IC và biến volume được sử dụng để đặt mức âm lượng.
bool potStatus; // 1 khi giao tiếp được thiết lập giữa MCU và IC bool radioStatus; // 1 khi giao tiếp được thiết lập giữa MCU và IC int volume = 15; // mức âm lượng mặc định với IC bắt đầu bằng
Sau đó, chúng tôi thiết lập một chân GPIO có tên là Relay_Pin để bật hoặc tắt bộ khuếch đại.
#define Relay_Pin D7 // Chân này dùng để bật và tắt radio
Tiếp theo, chúng ta cần xác định tất cả các định nghĩa cần thiết để giao tiếp với Adafruit IO.
#define AIO_SERVER "io.adafruit.com" #define AIO_SERVERPORT 1883 // sử dụng 8883 cho SSL #define AIO_USERNAME "debashis13" // Thay thế nó bằng tên người dùng của bạn #define AIO_KEY "aio_Qyal47xo1fYhc55QB1lEPEirnoFp Key" // Thay thế bằng Project Auth của bạn "
Các định nghĩa dưới đây FIX_BAND là định nghĩa độc quyền được thư viện sử dụng.
Câu lệnh được định nghĩa tiếp theo đặt khối lượng bên trong của mô-đun.
#define FIX_BAND RADIO_BAND_FM // <Ban nhạc sẽ được điều chỉnh bởi bản phác thảo này là FM. #define FIX_RADIO_VOLUME 6 /// <Âm lượng mặc định của mô-đun.
Tiếp theo, tạo các đối tượng cần thiết cho PT2258, RDA5807M và WiFiClient.
PT2258 digitalPot; // Đài PT2258 Object RDA5807M; // Máy khách RDA5807M Object WiFiClient; // Đối tượng WiFiClient
Sau đó, thiết lập lớp máy khách MQTT bằng cách chuyển vào máy khách WiFi và máy chủ MQTT và thông tin đăng nhập.
Adafruit_MQTT_Client mqtt (& client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
// Thiết lập lớp máy khách MQTT bằng cách chuyển vào máy khách WiFi và máy chủ MQTT và chi tiết đăng nhập.
Sau đó, chúng tôi cần đăng ký một Nguồn cấp dữ liệu. Điều gì khiến bạn có thể hỏi?
Nếu một số giá trị, một số thông số thay đổi trong máy chủ Adafruit, các thay đổi sẽ được phản ánh tại đây.
Adafruit_MQTT_Subscribe Radio_Station = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Radio_Station"); // Các phương thức được sử dụng để đăng ký Feed Adafruit_MQTT_Subscribe Toggle_FM = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Toggle_FM"); // Các phương thức được sử dụng để đăng ký Feed Adafruit_MQTT_Subscribe Volume = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Volume"); // Các phương thức được sử dụng để đăng ký Nguồn cấp dữ liệu
Dưới đây là nguyên mẫu hàm cho hàm MQTT_connect () .
void MQTT_connect (); // Nguyên mẫu hàm cho MQTT Connect
Sau đó, chúng tôi bắt đầu quá trình thiết lập của mình. Đầu tiên, chúng tôi bắt đầu giao tiếp UART với phương thức begin.
Serial.begin (9600); // UART bắt đầu Serial.println (); // thêm một dòng bổ sung cho khoảng cách Serial.println (); // thêm một dòng bổ sung cho khoảng cách Tiếp theo, chúng ta thực hiện tất cả những việc thông thường để kết nối với WiFI **************** tất cả những thứ thông thường cần thiết cho kết nối WiFi *********************** / Serial.print ("đang kết nối với"); Serial.println (ssid); WiFi.mode (WIFI_STA); WiFi.begin (ssid, mật khẩu); while (WiFi.status ()! = WL_CONNECTED) {delay (500); Serial.print ("."); } Serial.println (""); Serial.println ("Đã kết nối WiFi"); Serial.println ("Địa chỉ IP:"); Serial.println (WiFi.localIP ()); / **************** tất cả những thứ thông thường cần thiết cho kết nối WiFi *********************** /
Tiếp theo, gọi phương thức Wire.begin () để khởi tạo kết nối I2C và chúng tôi gọi phương thức Wire.setClock () để sửa tần số I2C thành 100KHz vì đó là tốc độ đầy đủ của IC PT2258.
Wire.begin (); // bắt đầu chuỗi bắt đầu I2C Wire.setClock (100000); // đặt đồng hồ I2C thành 100KHz
Tiếp theo, gọi phương thức init () cho cả PT2258 và IC RDA5807 và giữ trạng thái trả về trong các boolean đã xác định trước đó.
potStatus = digitalPot.init (); radioStatus = radio.init ();
Tiếp theo, kiểm tra xem MCU có thể giao tiếp với IC hay không. Chúng tôi làm điều này với hai câu lệnh if else .
if (potStatus) {Serial.println ("Đã tìm thấy Thiết bị PT2258!"); } else {Serial.println ("Không thể bắt đầu PT2258"); } if (radioStatus) {Serial.println ("Đã tìm thấy Thiết bị RDA5807M!"); } else {Serial.println ("Không thể bắt đầu RDA5807M"); }
Tiếp theo, gọi phương thức đăng ký từ thư viện MQTT. Chúng tôi sẽ được máy chủ MQTT thông báo nếu có bất kỳ thay đổi nào xảy ra trong nguồn cấp dữ liệu đã đăng ký của chúng tôi.
mqtt.subscribe (& Radio_Station); // Thiết lập đăng ký MQTT cho nguồn cấp dữ liệu Radio_Station mqtt.subscribe (& Toggle_FM); // Thiết lập đăng ký MQTT cho Toggle_FM feed mqtt.subscribe (& Volume); // Thiết lập đăng ký MQTT cho Nguồn cấp dữ liệu khối lượng
Tiếp theo, chúng tôi đặt chân Relay làm đầu ra và trạng thái chân thành LOW
pinMode (D7, OUTPUT); digitalWrite (D7, LOW);
Tiếp theo, đặt âm lượng radio định trước, thông số này đặt âm lượng bên trong IC RDA5807, đánh dấu sự kết thúc của quá trình thiết lập của chúng tôi.
radio.setVolume (FIX_RADIO_VOLUME); // tiếp theo chúng ta đặt âm lượng radio chuẩn hóa radio.setMono (false); // chúng tôi không muốn chip cung cấp đầu ra đơn âm radio.setMute (false); // chúng tôi không muốn chip tắt tiếng khi bắt đầu
Chúng tôi bắt đầu vòng lặp bằng cách gọi hàm MQTT_connect () để thiết lập kết nối với máy chủ MQTT.
Trong chức năng kết nối MQTT, chúng tôi thử ba lần để tạo kết nối với máy chủ MQTT.
Nếu thành công, chúng tôi nhận được thông báo Thành công, nếu không chúng tôi sẽ nhận được thông báo Lỗi.
void MQTT_connect () {int8_t ret; // Số nguyên 8 bit để lưu trữ các lần thử lại // Dừng nếu đã được kết nối. if (mqtt.connected ()) {return; } Serial.print ("Đang kết nối với MQTT…"); uint8_t retries = 3; while ((ret = mqtt.connect ())! = 0) {// kết nối sẽ trả về 0 cho Serial.println được kết nối (mqtt.connectErrorString (ret)); Serial.println ("Đang thử lại kết nối MQTT sau 5 giây…"); mqtt.disconnect (); chậm trễ (5000); // đợi 5 giây thử lại--; if (retries == 0) {// về cơ bản là chết và đợi WDT đặt lại cho tôi trong khi (1); }} Serial.println ("Đã kết nối MQTT!"); }
Tiếp theo, hãy bắt đầu bằng cách tạo một con trỏ đến một đối tượng Adafruit_MQTT_Subscribe . Chúng tôi sẽ sử dụng điều này để xác định đăng ký nào đã được nhận.
Đăng ký Adafruit_MQTT_Subscribe *;
Tiếp theo, chúng tôi chờ một tin nhắn đăng ký.
mqtt.readSubscription (timeInMilliseconds) sẽ lắng nghe trong một thời gian nhất định, đối với bất kỳ thư nào đến từ máy chủ MQTT.
Nếu nó nhận được một tin nhắn trước khi hết thời gian, nó sẽ trả lời bằng một con trỏ đến đăng ký hoặc nó sẽ chỉ hết thời gian và trả về 0. Trong trường hợp đó, nó sẽ đợi trong 2 Giây.
while ((đăng ký = mqtt.readSubscription (20000)))
Nếu một thời gian chờ xảy ra, trong khi vòng lặp fill thất bại. Nếu không, chúng tôi so sánh đăng ký nào và sẽ nhận được các đăng ký đã biết của chúng tôi.
Trong mã này, chúng tôi thực hiện việc này cho cả ba nguồn cấp dữ liệu đã đăng ký của chúng tôi.
if (đăng ký == & Toggle_FM) if (đăng ký == & Radio_Station) if (đăng ký == & Âm lượng)
Đây là ba tham số chính mà bạn cần hiểu trong phần vòng lặp.
Phần này của mã được sử dụng để theo dõi và đặt nguồn cấp dữ liệu Toggle_FM .
if (subscription == & Toggle_FM) // có phải là thông báo từ Toggle_FM Feed {Serial.print (F ("Got:")); Serial.println ((char *) Toggle_FM.lastread); // in dữ liệu Nguồn cấp dữ liệu chỉ để gỡ lỗi if (String ((char *) Toggle_FM.lastread) == String ("on")) // chúng tôi so sánh dữ liệu nhận được với một tham số đã biết trong trường hợp này chúng tôi mong đợi rằng "on "đến từ sever {// nhưng trước khi làm điều đó, chúng ta phải đặt nó thành một chuỗi để làm cho comprisin siêu dễ dàng digitalWrite (D7, HIGH); // nếu chúng ta nhận được chuỗi" on "từ máy chủ mà chúng ta đang tạo chân D7 HIGH} if (String ((char *) Toggle_FM.lastread) == String ("off")) // một lần nữa chúng tôi đang kiểm tra chuỗi tắt {digitalWrite (D7, LOW); // nếu chúng tôi nhận được chuỗi "tắt" từ máy chủ mà chúng tôi đang tạo chân D7 LOW}}
Phần này của mã được sử dụng để theo dõi và thiết lập nguồn cấp dữ liệu Radio_Station .
if (đăng ký == & Radio_Station) {Serial.print (F ("Got:")); Serial.println ((char *) Radio_Station.lastread); if (String ((char *) Radio_Station.lastread) == String ("Big FM")) // nghe thấy chúng tôi đang kiểm tra chuỗi Big FM {radio.setBandFrequency (FIX_BAND, 9270); // nếu điều kiện trên là đúng, chúng ta đang đặt kênh radoi thành 92,7MHz} // Các quy trình được đề cập ở trên được tiếp tục bên dưới if (String ((char *) Radio_Station.lastread) == String ("Red FM")) { radio.setBandFrequency (FIX_BAND, 9350); } if (String ((char *) Radio_Station.lastread) == String ("Radio Mirchi")) {radio.setBandFrequency (FIX_BAND, 9830); }}
Phần này của mã được sử dụng để theo dõi và đặt Nguồn cấp dữ liệu âm lượng.
if (subscription == & Volume) // // nghe thấy chúng tôi đang kiểm tra chuỗi Khối lượng và nó là một giá trị số nguyên ở định dạng chuỗi // Chúng tôi phải chuyển đổi nó trở lại số nguyên để thay đổi âm lượng với sự trợ giúp của PT2258 IC Serial.print (F ("Got:")); Serial.println ((char *) Volume.lastread); volume = atoi ((char *) Volume.lastread); // Chúng tôi đang sử dụng metode atoi () để chuyển đổi một con trỏ ký tự thành một số nguyên volume = map (volume, 0,100,79,0); // map (value, fromLow, fromHigh, toLow, toHigh) // vì pt2258 chỉ hiểu các giá trị số nguyên tính bằng dB // chúng tôi đang ánh xạ giá trị 0dB - 79dB thành 0% - 100%. digitalPot.setChannelVolume (khối lượng, 0); // sau tất cả chúng ta đang cài đặt âm lượng cho kênh 0 của PT2258 IC digitalPot.setChannelVolume (volume, 1); // sau tất cả chúng ta đang cài đặt âm lượng cho kênh 1 của IC PT2258}}
Kiểm tra Đài FM được điều khiển bằng giọng nói bằng Arduino
Để kiểm tra mạch, thiết bị sau được sử dụng:
- Một máy biến áp có một vòi 13-0-13
- Hai loa 4Ω 20W làm tải.
- Điện thoại để sử dụng Trợ lý Google.
Trong một bài viết trước, tôi đã hướng dẫn bạn cách tạo một Bộ khuếch đại âm thanh 2x32 Watt đơn giản với IC TDA2050, tôi cũng sẽ sử dụng nó cho phần trình diễn này, Tôi đã làm rối loạn chiết áp cơ học và làm chập hai dây dẫn với hai dây cáp nhỏ. Bây giờ, với sự trợ giúp của hai nút nhấn, tôi đã có thể thay đổi âm lượng của bộ khuếch đại.
Cải tiến thêm
Có nhiều cải tiến hơn nữa có thể được thực hiện cho mạch này.
- Có nhiều vấn đề về tiếng ồn khác nhau do nguồn âm thanh đang hoạt động bên cạnh NodeMCU, vì vậy chúng tôi cần thực hiện biện pháp che chắn bổ sung để cải thiện khả năng chống ồn.
- Xây dựng mạch tổng thể thành PCB sẽ cải thiện khả năng chống ồn.
- Bộ lọc bổ sung có thể được thêm vào IC này để loại bỏ nhiễu.
Tôi hy vọng bạn thích bài viết này và học được điều gì đó mới từ nó. Nếu bạn có bất kỳ nghi ngờ nào, bạn có thể hỏi trong phần bình luận bên dưới hoặc có thể sử dụng diễn đàn của chúng tôi để thảo luận chi tiết.