Unicon10-209226

Page 1

Unicon  209

   Unicon สามารถเชื่อมตออุปกรณภายนอกไดหลากหลายมากมาย หนึงในนั ่ นคื ้ อ อุปกรณที่สือสารผ ่ าน ระบบบัส I2C อุปกรณที่นํามาเสนอในบทนีคื้ อ โมดูลวิทยุ FM ขนาดเล็ก เพื่อเปนตัวอยางในการนําไมโคร คอนโทรลเลอรไปใชในงานบันเทิง นอกเหนือไปจากการใชในระบบควบคุมอัตโนมัติแบบที่คุนเคย 

   โมดูลรั บวิทยุ FM ที่ นํามาแนะนํานี้เป นผลงานของ Parallax Inc. สหรัฐอเมริกา ใชไอซีเบอร RDA5807SS ของ RDA Microelectronics สาธารณรัฐประชาชนจีน ซึงได ่ รับการออกแบบใหตองทํางานกับ ไมโครคอนโทรลเลอรผานทางบัส I2C เพื่ อควบคุมการรับสัญญาณวิทยุ FM ไดครบทุกฟงกชั่นหลัก มีแจก สําหรับเสียบหูฟงสเตอริโอในตัว พรอมทั้งใชหูฟงเปนสายอากาศไดดวย มีคุณสมบัติทางเทคนิคที่สําคัญดังนี้  มีแจกสเตอริโอ 3.5 มิลลิเมตรในตัวสําหรับตอหูฟงหรือตอไปยังวงจรขยายกําลังภายนอก ่ ทยุ FM ตลอดยานตั้งแต 76 ถึง 108MHz ไมตองตอสายอากาศภายนอก  รองรับความถี่คลืนวิ

รูปที่ 10-1 หนาตา, การจัดขาและหนาทีของขาใช ่ งานทังหมดของโมดู ้ ลวิทยุ FM


210 

Unicon

วงจรขนาดเล็กมีขาเชื่อมตอเปนแบบ DIP 10 ขา กวาง 0.5 นิว้ เสียบลงบนเบรดบอรดหรือติดตั้งเขา กับแผนวงจรพิมพไดงาย  เชื่อมตอกับไมโครคอนโทรลเลอรไดทุกตระกูลหลัก โดยติดตอผานระบบบัส I2C  ใชไฟเลียง ้ 2.7 ถึง 5.5 V กินกระแสไฟฟาเพียง 25mA  ขนาด 1.78x1.65x0.87 เซนติเมตร ในรูปที่ 10-1 แสดงหนาตาของโมดูลวิทยุ FM และการจัดขา 

  ในรูปที่ 10-2 แสดงไดอะแกรมการทํางานของไอซี RDA5807SS ซึงเป ่ นหัวใจหลักสําคัญของโมดูลวิทยุ FM จะแบงออกเปน 4 สวนหลัก ประกอบดวย 1. สวนรับวิทยุ FM สัญญาณคลืนวิ ่ ทยุจะถูกเหนียวนํ ่ าเขาสูวงจรดวยสายอากาศ จากนั้นวงจรขยาย สัญญาณรบกวนตําจะทํ ่ าการขยายสัญญาณใหแรงขึ้น เพือป ่ อนเขาสูวงจรควอดราเจอรมิกเซอร โดยมีวงจรควบ คุมความแรงของสัญญาณชวยควบคุมไมใหสัญญาณมีความแรงเกินไป จนเกิดความเพี้ยน วงจรควอดราเจอร มิกเซอรทําหนาทีในการแปลงสั ่ ญญาณคลืนวิ ่ ทยุปนสัญญาณความถีกลางหรื ่ อ IF (Intermediate Frequency) เพือ่ สงตอไปยังวงจรขยายแบบโปรแกรมไดหรือ PGA เพื่อกําหนดอัตราความแรงของสัญญาณ IF ใหเหมาะสม จากนันจึ ้ งสงตอไปยังวงจรแปลงสัญญาณอะนาลอกเปนดิจิตอล เพือให ่ ไมโครคอนโทรลเลอรภายนอกสามารถ สงขอมูลเขามาควบคุมได โดยผานทางสวนประมวลผลสัญญาณดิจิตอล ที่สวนประมวลผลสัญญาณดิจิตอลจะ

LNA

  

   



 

 

VCO

 

  

 

    

  

    

 

 

 



 

รูปที่ 10-2 ไดอะแกรมการทํางานภายในของไอซี RDA5807SS ทีใช ่ ในโมดูลวิทยุ FM



 


Unicon  211

ทําหนาที่เลือกชองความถีของวิ ่ ทยุ FM, ดีมอดูเลชั่น, ถอดรหัส FM สเตอริโอมัลติเพล็กซ จนไดเปนขอมูลเสียง ทังช ้ องซายและขวา กอนสงตอไปยังวงจรแปลงสัญญาณดิจิตอลเปนอะนาลอกทําการแปลงเปนเสียงเพือขั ่ บออก หู ฟ งหรือตอเขากับวงจรขยายกําลังตอไป โดยผูใชงานสามารถปรับระดับสัญญาณไดดวยผานทางการเขียน โปรแกรมติดตอกับรีจิสเตอรควบคุมการทํางาน 2. ซินธีไซเซอร ในสวนนีทํ้ าหนาที่ในการสรางสัญญาณนาฬิกาสําหรับกําหนดจังวะการทํางาน ของวงจรควอดราเจอรมิกเซอร โดยเลือกได 7 คาคือ 32.768 KHz,12M, 24M, 13M, 26M, 19.2M, 38.4MHz เสถียรภาพของสัญญาณวิทยุ FM ทีรั่ บไดจะขึนกั ้ บสวนนีเป ้ นสําคัญ ดวยการใชวงจรซินธีไซเซอรจะทําใหความ ถี่ที่ ใชในการผสมสัญญาณเพื่อแปลงคลื่นวิทยุเปนคลื่นคงวามถี่กลางหรือ IF มีความแนนอนสูง ทําใหความ สามารถในการรับสัญญาณของโมดุลรับวิทยุ FM มีเสถียรภาพ 3. ภาคจายไฟ ในตัวไอซี RDA5807SS มีวงจรควบคุมไฟเลี้ยงคงที่แบบแรงดันตกครอมตํา่ จึงทํา ใหสามารถใชงานกับไฟเลียงในย ้ านกวางตังแต ้ +2.7 ถึง +5.5V จึงทําใหใชงานกับไมโครคอนโทรลเลอรไดทุก ตระกูลที่ใชไฟเลียงทั ้ ้ง +3.3V และ +5V 4. สวนเชือมต ่ อวงจรควบคุมภายนอก ทําหนาที่จัดการสัญญาณตางๆ ที่จําเปนสําหรับติดตอกับ ่ กใชบัส I2C มากกวา เพราะใชไดกับไมโคร ไมโครคอนโทรลเลอรภายนอกผานทางบัส I2C และ I2S โดยทัวไปมั คอนโทรลเลอรไดทุกตระกูล หากเปนบัส I2S มีไมโครคอนโทรลเลอรสมัยใหมบางตระกูลเทานันที ้ มี่ โมดูลการ ติดตอผานบัส I2S สัญญาณจากไมโครคอนโทรลเลอรจะถูกสงผานไปยังสวนประมวลสัญญาณดิจิตอล, ซินธี ไซเซอร และวงจรแปลงสัญญาณดิจิตอลเปนอะนาลอก เพือติ ่ ดตอกับรีจิสเตอรทีทํ่ าหนาทีควบคุ ่ มการทํางานของ สวนตางๆ นัน้

   เนืองจากโมดู ่ ลรับวิทยุ FM ตองทํางานรวมกับไมโครคอนโทรลเลอร ดังนันจึ ้ งตองมีรีจิสเตอรสําหรับ ควบคุมการทํางาน ซึงจะรั ่ บขอมูลคําสั่งจากไมโครคอนโทรลเลอรเพื่อสงตอไปยังวงจประมวลผลสัญญาณ ดิจิตอลทําการประมวลผลและนําไปควบคุมการทํางานของวงจรตางๆ ภายในไอซี RDA5807SS เพื่อใหได สัญญาณเสียงจากการรับคลืนวิ ่ ทยุ FM ออกมาใหไดฟงกันในทีสุ่ ด รหัสแอดเดรสประจําตัวแบบ 7 บิตตามขอกําหนดของการเปนอุปกรณระบบบัส I2C ของโมดูลรับวิทยุ FM คือ 0010000 สําหรับบิตสุดทาย (บิต 0) จะเปนตัวกําหนดวาตองการอานหรือเขียนขอมูลกับโมดูลนี้ หาก ตองการอาน คาแอดเดรสจะเปน 00100001 หรือ 0x21 หากตองการเขียนขอมูลหรือคําสั่ง แอดเดรสของโมดูล จะเปลี่ยนเปน 00100000 หรือ 0x20 โดยคําสังที ่ ใช ่ ควบคุมประกอบดวย คําสังเพิ ่ ม-ลดระดั ่ บเสียง, คําสังค ่ นหาสถานี คําสังปรั ่ บเลือนค ่ าความ ถี่ เปนตน รีจิสเตอรทีใช ่ กําหนดการทํางานของโมดูลรับวิทยุ FM และเขาถึงไดดวยตัวผูใช  งาน มีขนาด 16 บิต จํานวน 5 ตัว คือ รีจิสเตอร 0x02, 0x03, 0x04, 0x05 และ 0x06 ดังมีขอมูลโดยสรุปแสดงในตารางที่ 10-1 ถึง 10-4


212 

Unicon

  

 

   





  





 





 

 

 

     





 

 

  

  

  

 

  

 







 

    

ตารางที่ 10-1 ขอมูลของรีจิสเตอร 0x02

 


Unicon  213

            

  

 

 

             

ตารางที่ 10-2 ขอมูลของรีจิสเตอร 0x03

 

 




214 

Unicon

  

 





















         

 

 



 

   



                 





  

ตารางที่ 10-3 ขอมูลของรีจิสเตอร 0x04








Unicon  215

  

 

     





 

                  

  ตารางที่ 10-4 ขอมูลของรีจิสเตอร 0x05 และ 0x06

 

 


216 

Unicon

   

  







 

 

           

       

  

 

   



 



  

 

ตารางที่ 10-5 ขอมูลของรีจิสเตอร 0x0A และ 0x0B




Unicon  217

ดังนันในการเขี ้ ยนโปรแกรมเพื่อติดตอกับโมดูลรับวิทยุ FM นี้ จะตองเริ่มจากติดตอกับตัวอุปกรณให ไดกอนดวยการใชรหัสแอดเดรสประจําตัวของโมดูลรับวิทยุ FM นี้กอน เมื่อมีการตอบสนองแลว จึงทําการ ติดตอกับรีจิสเตอรทั้ง 5 ตัวเพือควบคุ ่ มการทํางานตอไป ผูใช งานสามารถอ านคาชองสัญญาณความถี่ของสถานีวิทยุที่รับได หรือตรวจสอบสถานะการรับ สัญญาณไดจากรีจิสเตอรอีก 2 ตัวคือ 0x0A และ 0x0B ดังมีขอมูลโดยสรุปแสดงในตารางที่ 10-5

 เนืองจากโมดู ่ ลวิทยุ FM ตองการการติดตอผานระบบบัส I2C ซึ่งใชสายสัญญาณ 2 เสนคือ SDA และ SCL ดังนันในการติ ้ ดตอกับไมโครคอนโทรลเลอรจึงใชขาพอรตเพียง 2 เสน โดยไมตองตอตัวตานทานพูลอัป ที่ขาสัญญาณ SDA และ SCL เนืองจากมี ่ การตอตัวตานทานนีไว ้ ภายในโมดูลแลว วงจรใชงานเบื้องตนจึงงาย มากและมีอุปกรณตอภายนอกนอยหากใชไมโครคอนโทรลเลอรที่มีวงจรกําเนิดสัญญาณนาฬิกาอยูภายในตัว ดังรูปที่ 10-3 ดวยความสะดวกและใชงานไดไมยาก ทําใหความคิดในการในสรางโครงงานที่เกียวกั ่ บเครื่องรับวิทยุ FM เอาไวใชงานเอง ทําไดงายขึน้ เพียงมีความรูด านการเขียนโปรแกรมไมโครคอนโทรลเลอรและการตอวงจร นิดหนอยเทานัน้ ไมตองปรับแตงขดลวดหรือสรางวงจร FM ดีมอดูเลเตอร วงจรถอดรหัส FM สเตอริโอมัลติ เพล็กซใหยุงยากอีกตอไป

รูปที่ 10-3 ตัวอยางวงจรเชือมต ่ อกับไมโครคอนโทรลเลอรอยางงายทีสุ่ ดเพือใช ่ งานโมดูลวิทยุ FM


218 

Unicon

  เพื่อใหการเชื่อมตอเพื่อใชงานโมดูลวิทยุ FM ทําไดสะดวกขึ้น จึงไดออกแบบแผงวงจรที่รองรับการ ติดตังโมดู ้ ลวิทยุ FM และมีจุดตอแบบตางๆ ใหเลือกใช มีชือเรี ่ ยกวา บอรด ADX-FM มีหนาตาและสวนประกอบ แสดงในรูปที่ 10-4 สวนวงจรแสดงในรูปที่ 10-5

  +V 1 2 ANT SCL SDA + SDA +

27984

3

SCL +

 

     

     

รูปที่ 10-4 หนาตาและรายละเอียดของบอรด ADX-FM MOD1 FM radio module

ANT K1 SDA

+VCC

1

SDA

GND

10

2

SCL

+Vcc

9

ANT

GPIO3

NC

GPIO2

NC

GPIO1

3 K2 SCL

+VCC

4 5

GND SCL SDA +V

C1 +VCC 0.1F

R1 510

8 7 6

LED1 GPIO3 STEREO

+VCC +V GPIO2 GPIO1

+VCC

K3 I2C bus

รูปที่ 10-5 วงจรของบอรด ADX-FM

K4 GPIO


Unicon  219

คุณสมบัติทางเทคนิคที่สําคัญมีดังนี้ มีคอนเน็กเตอรตัวเมีย 10 ขา (เปนแบบ 5 ขาแถวเดี่ยว 2 ตัว) สําหรับติดตั้งโมดูลวิทยุ FM จุดตอสัญญาณเขากับระบบบัส I2C (SDA และ SCL) มีทั้งแบบ JST (Japan Standard Terminal) 2 มม. และแบบ IDC (Insulation Displacement Connector) 2.5 มม. ทั้งตัวผูและตั  วเมีย ทําใหเชื่อมตอกับบอรดไมโคร คอนโทรลเลอรและแผงตอวงจรหรือเบรดบอรดไดทุกแบบ

  ในการทดลองนี้เปนการติดตอกับโมดูลวิทยุ FM ของบอรด Unicon ผานบัส I2C โดยมีสวิตช 4 ตัวทํา หนาที่ควบคุมการเลือนสถานี ่ แสดงผลการทํางานผานจอแสดงผลกราฟก LCD สีบนบอรด GLCD-XT

10.6.1 เชื่อมตอวงจร ทําการเชื่อมตอวงจรตามรูปที่ 10-6 จากวงจรใชขาพอรต 18, 19, 20 และ 21 ตอกับแผงวงจรสวิตช ZX01 เพื่อใชในการเลือกความถี่ของสถานีวิทยุในลักษณะตางๆ และกําหนดใหทํางานเปนขาพอรตอินพุตดิจิตอล สวนขาพอรต 2 (SDA) และ 3 (SCL) ตอเขากับโมดูลวิทยุ FM เพื่อเขียนคําสั่งและอานคาความถีสถานี ่ วิทยุ

    FreqDown

ZX-01

ZX-01

ZX-01

LOW

LOW

LOW

LOW

S

ANT +V 1 2 3

SCL +

ZX-01

S

27984

SCL SDA + SDA +

SeekUp SeekDown FreqUp

21

1

20 19 18

รูปที่ 10-6 วงจรทดลองใชงานบอรด Unicon กับโมดูลวิทยุ FM

+

+

+

S

SDA

S

+

SCL


220 

Unicon

10.6.2 โปรแกรมทดลอง แสดงรายละเอียดของโปรแกรมสําหรับทดลองในโปรแกรมที่ 10-1 แบงการทํางานของโปรแกรมที่ 10-1 ออกเปน 4 สวนคือ 1. สวนของการประกาศตัวแปรทั้งหมดทีเกี ่ ยวข ่ อง 2. สวนของฟงกชั่น setup() เพื่อกําหนดการทํางานในชวงตนของโปรแกรม 3. สวนของฟงกชั่น loop() ซึงเป ่ นโปรแกรมหลัก 4. สวนของฟงกชั่นยอยที่ทํางานในโปรแกรมหลัก การทํางานโดยรวมของโปรแกรมคือ เมื่อเริ่มทํางาน จะกําหนดใหโมดูล FM ทําการเลือกความถี่ของ สถานีทีเป ่ นคาตังต ้ นนันคื ่ อ 96.5MHz และปรับระดับเสียงไวเทากับ 1 จากนันจะรอการกดสวิ ้ ตชเพือเลื ่ อกสถานี ซึงมี ่ ดวยกัน 4 ตัวคือ เลือกคาความถีลดลง ่ (FreqDown), เลือกคาความถีเพิ ่ ่มขึ้น (FreqUp), เลือกคนหาสถานี ดวยการลดความถี่ (SeekDown) และเลือกคนหาสถานีดวยการเพิ่มความถี่ (SeekUp) เมื่อเลือกแลว ก็จะเขียน คําสังทั ่ ้งหมดไปยังรีจิสเตอร 5 ตัวของโมดูลวิทยุ FM เพื่อใหเริมทํ ่ างาน ในเวลาเดียวกันก็จะแสดงคาความถีของ ่ สถานีวิทยุลาสุดผานทางบอรดแสดงผล GLCD-XT ในรูปที่ 10-7 เปนไดอะแกรมแสดงการทํางานของโปรแกรมที่ 10-1 โดยแสดงใหเห็นถึงลําดับการทํา งานและความเกี่ยวของของฟงกชั่นยอยตางๆ ในโปรแกรม

10.6.2.1 สวนของการประกาศตัวแปร เริ่มตนดวยการกําหนดแอดเดรสของโมดูลวิทยุ FM ซึงเท ่ ากับ 0x20 จากนั้นประกาศตัวแปรทั้งหมด ที่ตองใชในโปรแกรม ประกอบดวย 1. Config0 และ Config เปนตัวแปรแบบอะเรย 5 สมาชิกเพื่อเก็บคาคําสั่งของโมดูล FM โดย มีตัวแปร Config0 ทําหนาที่อานคาการทํางานเหลานันออกมาใช ้ งาน 2. กําหนดตัวแปรคาคงที่ซึ่งเปนบิตตางๆ ของรีจิสเตอรควบคุมของโมดูลวิทยุ FM รวม 12 ตัว ดวยคําสัง่ #define ประกอบดวย SEEK, SEEK_MASK, SEEK_UP, SEEK_DOWN, CHAN, CHAN_MASK, VOLUME, VOLUME_MASK, STC, READCHAN และ READCHAN_MASK 3. กําหนดยานความถีสู่ งสุดและตําสุ ่ ดทีตั่ วแปร MAX_FREQ เปน 1080 และ MIN_FREQ เปน 870 4. ตัวแปร fm_vol สําหรับเก็บคาความดังของสัญญาณเอาตพุต มีคาตังต ้ นเปน 1 ่ มีคาตังต ้ นเปน 975 5. ตัวแปร fm_chan สําหรับเก็บคาความถีของสถานี 6. ตัวแปร fm_stc ใชตรวจสอบวา คนหาสถานีเสร็จแลวหรือไม 7. ตัวแปร fm_seek สําหรับเก็บคาความถีของสถานี ่ ที่คนหา 8. ตัวแปร seeking สําหรับเก็บสถานะของการคนหาสถานี


Unicon  221 ฟงกชนั่ setup()

ฟงกชนั่ fm_reset() : รีเซตการทํางานของโมดูลวิทยุ FM

- กําหนดลักษณะการทํางานของขาพอรตของ Unicon เปนอินพุตเพือ่ ตอกับสวิตชเลือกการทํางาน

- หยุดการคนหาสถานีดว ยคําสั่ง seeking = false;

- เริม่ ตนติดตอกับบัส I2C ดวยฟงกชั่น

Wire.begin()

เพือ่ ติดตอกับโมดูลวิทยุ FM - สงคําสั่งเพื่อรีเซตโมดูลวิทยุ FM ดวยฟงกชั่น

- กําหนดคาระดับเสียงตัง้ ตนเปน 1 และความถี่ตงั้ ตนเปน 97.5MHz โดย เขียนลงในรีจิสเตอร VOLUME และ CHAN โดยกระทําผานตัวแปร Config - เอ็นเอเบิลการเลือกความถี่ดว ยฟงกชั่น tune_enable()

fm_reset()

- สงคาของคําสั่งเลือกความถี่ไปยังโมดูลวิทยุ FM ดวยฟงกชั่น setConfig()

- แสดงคาสถานีปจจุบันดวยฟงกชั่น chan_print()

- ดิสเอเบิลการเลือกความถี่ดวยฟงกชั่น tune_disable()

ฟงกชนั่ loop()

ฟงกชนั่ chan_print() : แสดงคาความถี่ของสถานีวทิ ยุ FM

- ตรวจสอบการกดสวิตชเพื่อเลือกการทํางาน

- นําคาจากตัวแปร chan ที่ไดมาจากคําสั่ง int chan = ((Config[1] & CHAN_MASK) >> CHAN ) + MIN_FREQ;

1. สวิตช FreqDown/FreqUp ถูกกด - แจงสถานะการทํางานบนจอแสดงผล

มาแสดงที่จอแสดงผล GLCD-XT ดวยคําสั่ง glcd(2, 0, "Channel %d.%d MHz

- ปรับปรุงคาความถี่ดว ยฟงกชั่น chan_update() - เตรียมคนหาสถานีดวยคําสั่ง seeking = true; 2. สวิตช SeekDown ถูกกด - แจงสถานะการทํางานบนจอแสดงผล - เลือกขอมูลคําสั่งคนหาสถานีที่ชองความถี่ต่ํากวา โดยกําหนดคาลงในตัวแปร Config[0] ดวยคําสั่ง Config[0] &= ~SEEK_MASK;

= true;

- ตรวจสอบคาความถี่วาเกินขอบเขตที่ตั้งไวหรือไม (ตองอยูในชวง 870 ถึง 1080 ซึ่งตรงกับความถี่ 87.0 ถึง 108.0MHz) ดวยคําสั่ง if (val >= MIN_FREQ || val <= MAX_FREQ)

- กําหนดคาของสถานีดว ยคําสั่ง

- เอ็นเอเบิลการเลือกความถี่ดว ยฟงกชั่น tune_enable() - แสดงคาสถานีปจจุบันดวยฟงกชั่น chan_print()

3. สวิตช SeekUp ถูกกด - แจงสถานะการทํางานบนจอแสดงผล - เลือกขอมูลคําสั่งคนหาสถานีที่ชองความถี่สูงกวา โดยกําหนดคาลงในตัวแปร Config[0] ดวยคําสั่ง Config[0] &= ~SEEK_MASK; Config[0] |= SEEK_UP;

- เตรียมคนหาสถานีดวยคําสั่ง seeking

ฟงกชนั่ chan_update() : ปรับปรุงและแสดงคาความถีข่ องสถานี

fm_chan = val; Config[1] &= ~CHAN_MASK; Config[1] |= (fm_chan - MIN_FREQ) << CHAN;

Config[0] |= SEEK_DOWN;

- เตรียมคนหาสถานีดวยคําสั่ง seeking

", chan / 10, chan % 10);

ฟงกชนั่ setConfig() : กําหนดคําสั่งใหกับโมดูลวิทยุ FM - ติดตอกับโมดูลวิทยุ FM ผานฟงกชั่น Wire.beginTransmission() - เตรียมคาของคําสั่งที่ตอ งการเขียนไปยังโมดูลวิทยุ FM ดวยคําสั่ง for(int i = 0 ; i < CONFIG_WORDS ; i++) )

= true;

- คนหาสถานี (1) สงคําสั่งใหโมดูลวิทยุ FMดวยฟงกชั่น setConfig()

- เขียนขอมูลไปยังโมดูลวิทยุ FM ดวยคําสั่ง Wire.write((int)Config[i] >> 8); Wire.write((int)(Config[i] & 0xff));

- สิ้นสุดการติดตอกับโมดูลวิทยุ FM ดวยฟงกชั่น Wire.endTransmission();

(2) อานคาสถานีปจจุบันจากโมดูลวิทยุ FM ดวยฟงกชั่น getStatus()

(3) ตรวจสอบวา การคนหาสถานีเสร็จสิ้นหรือยังดวยการ ตรวจสอบสถานะของตัวแปร fm_stc ดวยคําสั่ง if(seeking && fm_stc)

(4) เมือ่ คนหาสถานีเสร็จสิ้น ทําการดิสเอเบิลการคนหา สถานีดวยฟงกชั่น seek_disable จากนั้นปรับปรุงคา ความถี่ดวยฟงกชั่น chan_update() แลวสงคําสั่งไป ยังโมดูลวิทยุ FM ดวยฟงกชั่น setConfig() (5) ดิสเอเบิลการเลือกความถี่ดวยฟงกชั่น tune_disable()

ฟงกชนั่ getStatus() : อานคาความถี่และสถานะจากโมดูลวิทยุ FM - ประกาศตัวแปร Status เพื่อใชเก็บคาความถี่ - ติดตอกับโมดูลวิทยุ FM เพื่อรองขอใหสงคาความถี่ดวยฟงกชั่น Wire.requestFrom();

- อานคาความถี่ปจจุบันของโมดูลวิทยุ FM ดวยคําสั่ง for(int i = 0 ; i < 1 ; i++) { Status[i] = Wire.read(); Status[i] = Status[i] << 8 | Wire.read(); } fm_seek = Status[0] & READCHAN_MASK; fm_stc = Status[0] >> STC & 1;

รูปที่ 10-7 แสดงไดอะแกรมการทํางานของโปรแกรมทดสอบการติดตอระหวางบอรด Unicon กับโมดูลวิทยุ FM


222 

Unicon

/* Unicon with RDA5870SS FM module example sketch * Connect the Unicon's SDA and SCL pin with the module * Display the operation by GLCD-XT board * Connect 4 of ZX-SWITCH to Unicon board for tuning the frequnecy *********************************************************************/ #include <unicon.h> // Include main library #define SLAVE_ID 0x20 >> 1 // Declare FM module address #define CONFIG_WORDS 5 // Declare array variable number static uint16_t Config0[CONFIG_WORDS] = {0xD001, 0x0000, 0x0400, 0x86D3, 0x4000}; // Default value of config register of FM module // [Register 0x02, 0x03, 0x04, 0x05 and 0x06] static uint16_t Config[CONFIG_WORDS]; // Declare the config register variable // Definition of working bit of FM module #define SEEK 8 #define SEEK_MASK (3 << SEEK) #define SEEK_UP (3 << SEEK) #define SEEK_DOWN (1 << SEEK) #define CHAN 6 #define TUNE 4 #define CHAN_MASK (0xff << CHAN) #define VOLUME 0 #define VOLUME_MASK (0x0f << VOLUME) #define STC 14 #define READCHAN 0 #define READCHAN_MASK (0xff << READCHAN) #define MAX_FREQ 1080 #define MIN_FREQ 870

// Set the maximum frequency of operation range // Set the minimum frequency of operation range

uint16_t fm_vol = 1, fm_chan = 975; // Declare and set the default value of volume and channel variable uint16_t fm_stc, fm_seek; // Declare variable for Tuning status (fm_stc) and Frequency station (fm_seek) bool seeking;

// Seeking status variable (Boolean type)

// Set the Unicon's port interfacing int pinFreqDown = 18; // Frequenct down button at pin 18 int pinFreqUp = 19; // Frequenct up button at pin 19 int pinSeekDown = 20; // Seek down button at pin 20 int pinSeekUp = 21; // Seek up button at pin 21 void setup() { pinMode(pinFreqDown, INPUT); // Set all pins as input pinMode(pinFreqUp, INPUT); pinMode(pinSeekDown, INPUT); pinMode(pinSeekUp, INPUT); Wire.begin(); // Start I2C bus fm_reset(); // Reset FM module function chan_print(); // Display the current frequency station }

โปรแกรมที่ 10-1 ไฟล FM_Example.ino โปรแกรมภาษา C/C++ ของ Arduino สําหรับบอรด Unicon เพือเชื ่ อมต ่ อและใชงานโมดูลวิทยุ FM (มีตอ)


Unicon  223 void loop() { if(digitalRead(pinFreqDown)) // Check the Frequency down button pressing { glcd(0, 0, "Freq Down "); // Display the status delay(200); // Delay 0.2 second chan_update(fm_chan - 1); // Decrease the frequency 0.1MHz seeking = true; // Set the seeking flag } else if(digitalRead(pinFreqUp))// Check the Frequency down button pressing { glcd(0, 0, "Freq Up "); // Display the status delay(200); chan_update(fm_chan + 1); // Increase the frequency 0.1MHz seeking = true; // Set the seeking flag } else if(digitalRead(pinSeekDown))// Check the Seek down button pressing { glcd(0, 0, "Seek Down "); // Display the status delay(200); Config[0] &= ~SEEK_MASK; // Clear the seekup bit Config[0] |= SEEK_DOWN; // Prepare the seek down command data to // the register 0x02 seeking = true; // Set the seeking flag } else if(digitalRead(pinSeekUp))// Check the Seek up button pressing { glcd(0, 0, "Seek Up "); // Display the status delay(200); Config[0] &= ~SEEK_MASK; // Clear the seekup bit Config[0] |= SEEK_UP; // Prepare the seek up command data to // the register 0x02 seeking = true; // Set the seeking flag } if (seeking) // Seeking operation { setConfig(); // Call config setting function delay(100); getStatus(); // Read the receiving status and frequency if (seeking && fm_stc) // Check the seeking complete { seek_disable(); // After seeking complete, disable seeking chan_update(fm_seek + MIN_FREQ); // Update the frequency value setConfig(); // Call config setting function } tune_disable(); // Disable tuning frequency } } void setConfig() // { Wire.beginTransmission(SLAVE_ID); // for(int i = 0 ; i < CONFIG_WORDS ; i++) { Wire.write((int)Config[i] >> 8); Wire.write((int)(Config[i] & 0xff)); } Wire.endTransmission(); // }

FM module config setting function I2C bus start // Send the config words to FM module

I2C bus stop

โปรแกรมที่ 10-1 ไฟล FM_Example.ino โปรแกรมภาษา C/C++ ของ Arduino สําหรับบอรด Unicon เพือเชื ่ อมต ่ อและใชงานโมดูลวิทยุ FM (มีตอ)


224 

Unicon

void fm_reset() // FM module reset function { seeking = false; // Set the seeking status as false to stop the seeking fm_vol = 1; // Set volume value to 1 fm_chan = 975; // Set the default frequency as 97.5MHz memcpy(Config,Config0,CONFIG_WORDS * sizeof(uint16_t)); // Copy the Config0 variable to Config variable Config[1] &= ~CHAN_MASK; // Prepare the default frequency Config[1] |= (fm_chan - MIN_FREQ) << CHAN; // to store into Register 0x03 Config[3] &= ~VOLUME_MASK; Config[3] |= fm_vol << VOLUME; tune_enable(); setConfig(); tune_disable();

// // // // //

Prepare the default volume level to store into Register 0x05 Enable frequency tuning function Call config setting function Disable frequency tuning function

} void tune_enable() // Frequency tuning enable function { Config[1] |= (1 << TUNE); // Set TUNE bit in Register 0x03 of FM module } void tune_disable() // Frequency tuning disable function { Config[1] &= ~(1 << TUNE); // Clear TUNE bit in Register 0x03 of FM module } void seek_disable() // Frequency seeking disable function { seeking = false; Config[0] &= ~SEEK_MASK; } void chan_update(int val) // Update channel function { if (val >= MIN_FREQ || val <= MAX_FREQ) // Check frequency in operation range { fm_chan = val; Config[1] &= ~CHAN_MASK; // Prepare the current frequency Config[1] |= (fm_chan - MIN_FREQ) << CHAN; // to store into Register 0x03 tune_enable(); // Enable frequency tuning function chan_print(); // Display the current frequency station } } void chan_print() // Frequency station displaying function { int chan = ((Config[1] & CHAN_MASK) >> CHAN ) + MIN_FREQ; glcd(2, 0, "Channel %d.%d MHz ", chan / 10, chan % 10); } void getStatus() // Status and Frequency station reading function { uint16_t Status[1]; Wire.requestFrom(SLAVE_ID, 2); for(int i = 0 ; i < 1 ; i++) { Status[i] = Wire.read(); Status[i] = Status[i] << 8 | Wire.read(); } fm_seek = Status[0] & READCHAN_MASK; fm_stc = Status[0] >> STC & 1; }

โปรแกรมที่ 10-1 ไฟล FM_Example.ino โปรแกรมภาษา C/C++ ของ Arduino สําหรับบอรด Unicon เพือเชื ่ อมต ่ อและใชงานโมดูลวิทยุ FM (จบ)


Unicon  225

จากนันทํ ้ าการกําหนดขาพอรตทีใช ่ ตอกับสวิตชเพือควบคุ ่ มการทํางานของโมดูลวิทยุ FM ประกอบดวย ขา 18 ตอกับสวิตชเพื่อเลือกคาความถีลดลง ่ (Frequency Down), ขา 19 ตอกับสวิตชเพื่อเลือกคาความถีเพิ ่ ่มขึ้น (Frequency Up), ขา 20 ตอกับสวิตชเพื่อคนหาสถานีดวยการลดคาความถี่ลง (Seek Down) และขา 21 ตอกับสวิตชเพื่อคนหาสถานีดวยการเพิ่มคาความถี่ (Seek Up)

10.6.2.2 สวนของฟงกชัน่ setup() เมื่อโปรแกรมเริ่มทํางาน ในฟงกชั่น setup() โดยกําหนดใหขาพอรตทีเชื ่ ่อมตอสวิตชควบคุมทั้ง หมดเปนพอรตอินพุตดิจิตอล จากนันติ ้ ดตอกับบัส I2C ดวยคําสัง่ Wire.begin() เพือทํ ่ าการรีเซตโมดูลวิทยุ FM จากนันอ ้ านคาสถานีลาสุดออกมา แลวทําการแสดงผลดวยฟงกชั่น chan_print()

10.6.2.3 สวนของฟงกชัน่ loop() เมือเข ่ าสูฟ งกชัน่ loop() อันเปนสวนของโปรแกรมหลัก จะมีการตรวจสอบการกดสวิตชตางๆ ทีใช ่ ควบคุมการทํางาน แลวทําการแสดงสถานะการทํางานทีเกิ ่ ดขึ้นทุกครั้งที่จอแสดงผล GLCD-XT ในทุกครั้งที่มี การกดสวิตชเพื่อเปลี่ยนลดหรือเพิ่มคาความถี่ จะมีการเรียกใชฟงกชั่น chan_update() เพื่อปรับคาความ ่ าใหโมดูลวิทยุ FM เลือกรับสัญญาณจากสถานี ถีล่ าสุดทีเกิ ่ ดขึน้ แลวเรียกใชฟงกชัน่ tune_enable() เพีอทํ ที่มีความถี่ตรงกับที่ตองการ (สวนจะรับชัดหรือไม และรับไดหรือไม ไมสนใจ) โดยจะเรียกใชคําสัง่ TUNE ทีชี่ ้ โดยตัวแปร Config ขอมูลสําหรับกําหนดการทํางานทั้งหมดจะถูกเขียนไปยังโมดูลวิทยุ FM ดวยฟงกชั่น setConfig() โดยจะเขียนรีจิสเตอรหลักทั้ง 5 ตัวในคราวเดียวกัน จากนั้นทําการอ านสถานะการคนหาสถานีและคาความถี่ปจจุบันจากโมดูลวิทยุ FM ดวยฟงกชั่น ่ จจุบัน แลวสงคําสั่งไปยังโมดูลวิทยุ getStatus() แลวหยุดการคนหาสถานี ทําการปรับปรุงคาความถีป FM อีกครัง้ เพือให ่ โมดูลวิทยุ FM ทํางานอยูกั บสถานีวิทยุลาสุดทีเลื ่ อกไว พรอมกันนันกํ ้ าหนดใหแสดงคาสถานี ทีเลื ่ อกไวบนจอแสดงผลของบอรด GLCD-XT ดวยฟงกชัน่ chan_print()ทีถู่ กเรียกใหทํางานภายในฟงกชัน่ chan_update()

10.6.2.4 สวนของฟงกชันย ่ อยทีทํ่ างานในโปรแกรมหลัก มีทั้งสิ้น 8 ฟงกชั่นคือ 1. fm_reset() ทําหนาที่รีเซตการทํางานของโมดูลวิทยุ FM ใหกลับไปยังคาตังต ้ น 2. chan_print() เปนฟงกชั่นแสดงคาความถีของสถานี ่ บนจอแสดงผลของบอรf GLCD-XT 3. chan_update() เปนฟงกชั่นปรับปรุงคาความถีป่ จจุบันสําหรับโมดูลวิทยุ FM ดวยการนําคา ของตัวแปร fm_seek มาบวกกับคาความถีตํ่ าสุ ่ ดทีกํ่ าหนดไวในตัวแปร MINB_FREQ โดยจะเตรียมขอมูลของ ความถี่เพื่อเขียนลงในรีจิสเตอร 0x03 ของโมดูลวิทยุ FM ดวยฟงกชั่น setConfig() ตอไป 4. setConfig()เปนฟงกชั่นทีมี่ ความสําคัญมากที่สุดตัวหนึ่ง ทําหนาที่ในการเขียนขอมูลคําสั่งลง ในรีจิสเตอรหลักของโมดูลวิทยุ FM 5 ตัวคือ รีจิสเตอร 0x02, 0x03, 0x04, 0x05 และ 0x06 ในฟงกชั่นนี้มีการ เรียกใชคําสั่งและฟงกชั่นของไลบรารี Wire ซีงใช ่ ในการติดตอกับอุปกรณระบบบัส I2C ของ Arduino


226 

Unicon

5. getStatus() เปนฟงกชั่นอานคาสถานะการคนหาสถานีและคาความถีของสถานี ่ ปจจุบันของ โมดูลวิทยุ FM โดยเก็บสถานะการคนหาสถานีไวที่ตัวแปร fm_stc และคาของสถานีไวที่ตัวแปร fm_seek 6. tune_enable() เปนฟงกชั่นเอ็นเอเบิลหรือควบคุมใหโมดูลวิทยุ FM ทําการรับคลืน่ 7. tune_disable()เปนฟงกชั่นหยุดการรับคลืนของโมดู ่ ลวิทยุ FM ่ 8. seek_disable() เปนฟงกชั่นหยุดการคนหาชองความถีของสถานี


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.