- วิทยุ FM ทำงานทั่วไป
- ส่วนประกอบที่จำเป็น
- RDA5807 ตัวรับ
- เครื่องขยายเสียง
- แผนภาพวงจรรับสัญญาณ Arduino FM
- คำอธิบายรหัสวิทยุ Arduino FM
- การทำงานของ Arduino FM Radio
ทุกวันนี้เกือบทุกคนใช้โทรศัพท์มือถือเพื่อฟังเพลงข่าวพอดแคสต์ ฯลฯ แต่เมื่อไม่นานมานี้เราทุกคนขึ้นอยู่กับวิทยุ FM ในพื้นที่เพื่อรับข่าวสารล่าสุดและเพลงช้าวิทยุเหล่านี้กำลังสูญเสียความนิยม แต่ในกรณีฉุกเฉินเมื่ออินเทอร์เน็ต หยุดลงวิทยุมีบทบาทสำคัญในการส่งข้อมูลไปยังผู้ใช้ สัญญาณวิทยุมักปรากฏอยู่ในอากาศ (ซึ่งออกอากาศโดยสถานี) และสิ่งที่เราต้องมีก็คือวงจรรับสัญญาณ FMเพื่อจับสัญญาณวิทยุเหล่านั้นและถ่ายโอนไปยังสัญญาณเสียง ในแบบฝึกหัดก่อนหน้านี้เราได้สร้างเครื่องส่งสัญญาณและเครื่องรับ FM อื่น ๆ อีกสองสามตัวตามรายการด้านล่าง
- เครื่องส่งสัญญาณ Raspberry Pi FM
- วิทยุรับสัญญาณ Raspberry Pi FM
- วงจรเครื่องส่งสัญญาณ FM
- วงจรเครื่องส่งสัญญาณ FM ที่ไม่มีตัวเหนี่ยวนำ
ในบทช่วยสอนนี้เราจะสร้างArduino FM Receiverและเพิ่มเข้าไปในคลังแสงโครงการของเรา เราจะใช้RDA5807 FM Receiver IC กับ Arduinoและตั้งโปรแกรมให้เล่นสถานีวิทยุ FM ใดก็ได้ที่ผู้ใช้สามารถปรับได้ด้วยโพเทนชิออมิเตอร์ นอกจากนี้เรายังจะใช้เครื่องขยายเสียงพร้อมกับวงจรเพื่อควบคุมระดับเสียงเอาต์พุตของArduino FM Radioของเราฟังดูน่าสนใจใช่ไหม? มาเริ่มกันเลย
วิทยุ FM ทำงานทั่วไป
สถานีวิทยุจะแปลงสัญญาณไฟฟ้าเป็นสัญญาณวิทยุและสัญญาณเหล่านี้ต้องได้รับการมอดูเลตก่อนที่จะส่งผ่านเสาอากาศ มีสองวิธีในการมอดูเลตสัญญาณคือ AM และ FM ตามชื่อที่แสดงถึงการมอดูเลตแอมพลิจูด (AM)จะปรับแอมพลิจูดก่อนที่จะส่งสัญญาณในขณะที่ในการมอดูเลตความถี่ (FM)ความถี่ของสัญญาณจะถูกมอดูเลตก่อนที่จะส่งผ่านเสาอากาศ ที่สถานีวิทยุพวกเขาใช้การมอดูเลตความถี่เพื่อปรับสัญญาณแล้วส่งข้อมูล ตอนนี้สิ่งที่เราต้องสร้างคือเครื่องรับที่สามารถปรับเป็นความถี่บางอย่างและรับสัญญาณเหล่านั้นและแปลงสัญญาณไฟฟ้าเหล่านี้เป็นสัญญาณเสียงในภายหลัง เราจะใช้ไฟล์โมดูลตัวรับสัญญาณ RDA5807 FMในโครงการนี้ซึ่งช่วยลดความซับซ้อนของวงจรของเรา
ส่วนประกอบที่จำเป็น
- Arduino นาโน
- เครื่องรับ RDA5807
- เครื่องขยายเสียง
- การเชื่อมต่อสายไฟ
- หม้อ - 100K
- คณะกรรมการ Perf
RDA5807 ตัวรับ
RDA5807เป็นโมดูลจูนเนอร์วิทยุ FM สเตอริโอแบบชิปเดี่ยวพร้อมซินธิไซเซอร์แบบครบวงจร โมดูลรองรับย่านความถี่ทั่วโลกที่ 50 - 115MHz, การควบคุมระดับเสียงและการปิดเสียง, การลดความสำคัญของโปรแกรม (50 / 75us), ตัวบ่งชี้ความแรงของสัญญาณและ SNR, ออสซิลเลเตอร์คริสตัล 32.768KHz, การควบคุมอัตราขยายอัตโนมัติแบบดิจิตอลเป็นต้นรูปด้านล่างแสดง บล็อกไดอะแกรมของจูนเนอร์ RDA5807M
มีสถาปัตยกรรม Digital Low-IF และรวมเครื่องขยายสัญญาณรบกวนต่ำ (LNA) ซึ่งรองรับย่านความถี่การออกอากาศ FM (50 ถึง 115 MHz) การควบคุมอัตราขยายที่ตั้งโปรแกรมได้ (PGA) ตัวแปลงอนาล็อกเป็นดิจิตอลความละเอียดสูงและ ตัวแปลงดิจิทัลเป็นอนาล็อก (DAC) ที่มีความเที่ยงตรงสูง ลิมิตเตอร์ป้องกันการโอเวอร์โหลดและ จำกัด จำนวนผลิตภัณฑ์ intermodulation ที่สร้างโดยช่องสัญญาณที่อยู่ติดกัน PGA ขยายสัญญาณเอาต์พุตมิกเซอร์แล้วแปลงเป็นดิจิทัลด้วย ADCs แกน DSP จะจัดการการเลือกช่องสัญญาณการถอดรหัส FM ตัวถอดรหัสสเตอริโอ MPX และสัญญาณเสียงออกRDA5807 pinoutแผนภาพสำหรับ IC ได้รับด้านล่าง
โมดูลที่ทำงานในแหล่งจ่ายไฟ 1.8 - 3.3V เมื่อมาถึงส่วนที่เหลือและการควบคุมอินเทอร์เฟซที่เลือกโมดูลจะรีเซ็ตตัวเองเมื่อ VIO เปิดเครื่องและยังรองรับซอฟต์รีเซ็ตโดยทริกเกอร์ของ bit1 จาก 0 ถึง 1 ของที่อยู่ 02H โมดูลใช้การสื่อสาร I2C เพื่อสื่อสารกับ MCU และอินเทอร์เฟซเริ่มต้นด้วยเงื่อนไขเริ่มต้นไบต์คำสั่งและไบต์ข้อมูล RDA5807 มีรีจิสเตอร์ 16 บิต 13 ตัวซึ่งแต่ละตัวทำหน้าที่เฉพาะ ที่อยู่ในการลงทะเบียนเริ่มต้นด้วย 00H ซึ่งกำหนดให้เป็นรหัสชิปและลงท้ายด้วย 0FH ในการลงทะเบียนทั้ง 13 รายการบางบิตถูกสงวนไว้ในขณะที่บางส่วนเป็น R / W รีจิสเตอร์แต่ละตัวทำหน้าที่ต่าง ๆ เช่นไดรฟ์ข้อมูลที่แตกต่างกันการเปลี่ยนช่องสัญญาณ ฯลฯ ขึ้นอยู่กับบิตที่กำหนด
เราไม่สามารถใช้โมดูลได้โดยตรงเมื่อเชื่อมต่อกับวงจรเนื่องจากพินถูกปิดโดย ดังนั้นฉันจึงใช้บอร์ด perf และหมุดตัวผู้และบัดกรีแต่ละพินของโมดูลกับพินตัวผู้แต่ละตัวตามที่แสดงในรูปด้านล่าง
เครื่องขยายเสียง
เครื่องขยายเสียงเป็นอุปกรณ์อิเล็กทรอนิกส์ที่ขยายสัญญาณเสียงอิเล็กทรอนิกส์กำลังต่ำไปยังระดับที่สูงพอสำหรับการขับลำโพงหรือหูฟัง เราได้สร้างเครื่องขยายเสียงอย่างง่ายโดยใช้ LM386 วงจรสำหรับแบบเดียวกันดังแสดงด้านล่างและคุณสามารถตรวจสอบลิงค์เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับวงจรนี้และตรวจสอบวงจรขยายเสียงอื่น ๆ
แผนภาพวงจรรับสัญญาณ Arduino FM
เราใช้โพเทนชิโอมิเตอร์สองตัวในการปรับย่านความถี่ FM และควบคุมระดับเสียงของเครื่องขยายเสียง เพื่อเปลี่ยนระดับเสียงคุณสามารถแตกต่างกันไปในหม้อที่มีการเชื่อมต่อในระหว่างวันที่ 1 และ 8 THขา LM386 หรือหม้อซึ่งมีการเชื่อมต่อที่ขา 3 ของ LM386 แสดงให้เห็นด้านล่างรูปที่สมบูรณ์วงจรสำหรับ Arduino วิทยุ
ฉันทำการเปลี่ยนแปลงเล็กน้อยในเครื่องขยายเสียง แทนที่จะใช้โพเทนชิโอมิเตอร์สองตัวในเครื่องขยายเสียงฉันใช้เพียงตัวเดียว ฉันเปลี่ยนหม้อซึ่งใช้ในการเปลี่ยน Gain ด้วยตัวต้านทาน ตอนนี้โปรเจ็กต์ของเรามีโพเทนชิออมิเตอร์สองตัวให้จูนและอีกตัวเปลี่ยนระดับเสียง โพเทนชิออมิเตอร์ซึ่งใช้ในการปรับช่องสัญญาณนั้นเชื่อมต่อกับ Arduino nano พินกลางของหม้อเชื่อมต่อกับพิน A0 ของ Arduino nano และอีกสองพินที่เหลือเชื่อมต่อกับ 5V และอีกอันเชื่อมต่อกับ GND หม้ออีกใบใช้เพื่อควบคุมระดับเสียงของวิทยุและเชื่อมต่อดังแสดงในรูปด้านบน
พิน A4 และ A5 ของ Arduino เชื่อมต่อกับพิน SDA และ SCL ของ RDA5807M โปรดทราบว่าโมดูลตัวรับสัญญาณใช้งานได้กับ 3.3V เท่านั้น ดังนั้นเชื่อมต่อพิน 3v3 ของนาโนกับพิน VCC ของโมดูลตัวรับ เมื่อทำการเชื่อมต่อแล้วการตั้งค่าของฉันมีลักษณะเช่นนี้
คำอธิบายรหัสวิทยุ Arduino FM
รหัสจะเริ่มต้นโมดูลตัวรับสัญญาณจากนั้นตั้งค่าช่องสัญญาณด้วยความถี่ที่ตั้งไว้ เมื่อค่าที่อ่านโดยนาโนที่พิน A0 เปลี่ยนไป (โดยการเปลี่ยนหม้อ) ความถี่จะเปลี่ยนไปซึ่งจะเปลี่ยนช่อง รหัสเต็มจะได้รับที่ส่วนท้ายของหน้า
เราเริ่มโปรแกรมของเราโดยการเพิ่มไลบรารีสายที่จำเป็นสำหรับการสื่อสารกับ RDA5807 จากนั้นในตัวแปร "channel" เรากำหนดค่าของช่อง เมื่อใดก็ตามที่วิทยุเริ่มต้นวิทยุจะปรับไปที่ช่องนี้โดยอัตโนมัติ
# รวม
ต่อไปเราจะโหลดไบต์ไปยังแต่ละรีจิสเตอร์บน RDA5807 IC ของเราเพื่อตั้งค่าการกำหนดค่าเริ่มต้นของเรา ณ จุดนี้เรากำลังรีเซ็ตเครื่องรับ
uint8_t boot_config = {/ * register 0x02 * / 0b11000001, 0b00000011, / * register 0x03 * / 0b00000000, 0b00000000, / * register 0x04 * / 0b00001010, 0b00000000, / * register 0x05 * / 0b10001000, 0b00001111, / * register 0x01000, 0b00001111, / * register 0x04 * 0b00000000, 0b00000000, / * ลงทะเบียน 0x07 * / 0b01000010, 0b00000010,};
หลังจากที่เรารีเซ็ตเครื่องแล้วเราสามารถจูนเครื่องได้ สำหรับการปรับช่องสัญญาณเราต้องตั้งโปรแกรม 4 ไบต์แรกเท่านั้น ส่วนนี้ของรหัสจะเปลี่ยนช่องไปยังความถี่ที่ต้องการ ใน I2C ในตอนแรกเราจะเริ่มการส่งเขียนหรืออ่านข้อมูลจากนั้นจึงสิ้นสุดการส่ง ใน IC ตัวรับนี้เราไม่จำเป็นต้องระบุที่อยู่เนื่องจากแผ่นข้อมูลระบุไว้อย่างชัดเจนว่าอินเทอร์เฟซ I2C มีการลงทะเบียนเริ่มต้นคงที่คือ 0x02h สำหรับการดำเนินการเขียนและ 0x0Ah สำหรับการดำเนินการอ่าน
uint8_t tune_config = {/ * register 0x02 * / 0b11000000, 0b00000001, / * register 0x03 * / (channel >> 2), ((channel & 0b11) << 6) - 0b00010000};
ในการตั้งค่าเราเริ่มต้นการกำหนดค่าการบูต (รีเซ็ต) จากนั้นปรับเป็นช่องสัญญาณโดยเขียนไบต์การกำหนดค่าการปรับแต่งไปยัง RDA5807M
การตั้งค่าเป็นโมฆะ () {Serial.begin (9600); pinMode (A0, อินพุต); / * เชื่อมต่อกับ 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 (); }
เมื่อใช้หม้อเพื่อปรับความถี่ฉันประสบปัญหา ค่าที่อ่านโดยพิน A0 ไม่คงที่ มีเสียงคลับเบดตามค่าที่ต้องการ ฉันใช้ตัวเก็บประจุเซรามิก 0.1uF ที่เชื่อมต่อระหว่าง A0 และ GND แม้ว่าเสียงจะลดลง แต่ก็ยังไม่ถึงระดับที่ต้องการ ดังนั้นฉันต้องทำการเปลี่ยนแปลงบางอย่างกับโค้ด ในตอนแรกฉันจดบันทึกการอ่านที่ได้รับผลกระทบจากเสียงรบกวน ฉันพบว่าค่าสูงสุดของสัญญาณรบกวนคือ 10 ดังนั้นฉันจึงเขียนโปรแกรมในลักษณะที่ว่ามันจะพิจารณาค่าใหม่ก็ต่อเมื่อความแตกต่างระหว่างค่าใหม่กับค่าเก่าของพินเดียวกันนั้นมากกว่า 10 จากนั้นปรับแต่งไปยังช่องที่ต้องการ
โมฆะลูป () {int channel1 = 187, avg = 0, newA; int คงที่ oldA = 0; ผล int = 0; newA = analogRead (A0); ถ้า ((newA - oldA)> 10 - (oldA - newA)> 10) {Serial.println (newA); ถ้า (newA! = oldA) {channel = channel1 + (newA / 10); myChangeChannel (ช่อง); oldA = newA; }}} // สิ้นสุดลูป
ฟังก์ชันนี้ใช้เพื่อตั้งค่าไบต์ของอาร์เรย์ tune_config จากนั้นส่งข้อมูลไปยัง RDA5807M IC โดยใช้โปรโตคอล I2C
เป็นโมฆะ myChangeChannel (ช่อง int) {/ * เป็นโมฆะหากไม่มีการส่งคืนอื่น int * / tune_config = (ช่อง >> 2) tune_config = ((ช่อง & 0b11) << 6) - 0b00010000; Wire.begin (); Wire.beginTransmission (RDA5807M_ADDRESS); Wire.write (tune_config, TUNE_CONFIG_LEN); Wire.endTransmission (); }
การทำงานของ Arduino FM Radio
เมื่อโมดูลเปิดใช้งานรหัสของเราจะรีเซ็ต RDA5807-M IC และตั้งค่าเป็นช่องสัญญาณที่ผู้ใช้ต้องการ (หมายเหตุ: ความถี่นี้ใช้เป็นความถี่พื้นฐานซึ่งความถี่จะเพิ่มขึ้น) ด้วยการเปลี่ยนโพเทนชิออมิเตอร์ (เชื่อมต่อกับ A0) ค่าที่ Arduino Nano อ่านจะเปลี่ยนไป หากความแตกต่างระหว่างค่าใหม่และค่าเก่ามากกว่า 10 โค้ดของเราจะพิจารณาค่าใหม่นี้ ช่องจะเปลี่ยนไปตามการเปลี่ยนแปลงของค่าใหม่จากค่าเก่า การเพิ่มหรือลดระดับเสียงขึ้นอยู่กับโพเทนชิออมิเตอร์ซึ่งเชื่อมต่อระหว่างพิน 3 และ GND
ในตอนท้ายของการสร้างและการเข้ารหัสคุณจะมีวิทยุ FM ของคุณเอง การทำงานทั้งหมดของวิทยุ FM สามารถพบได้ในวิดีโอลิงก์ที่ด้านล่างของหน้านี้ หวังว่าคุณจะสนุกกับโครงการและเรียนรู้สิ่งที่เป็นประโยชน์ หากคุณมีคำถามใด ๆ ในการทำให้โปรเจ็กต์นี้ใช้งานได้คุณสามารถฝากไว้ในส่วนความคิดเห็นหรือใช้ฟอรัมของเราเพื่อขอความช่วยเหลือด้านเทคนิคอื่น ๆ