Tuesday 30 June 2015

[Mini Project]วิทยุ FM อัจฉริยะ : ตอนที่ 7 Build Project


สำหรับบทความในตอนนี้จะกล่าวถึงวิธีการสร้าง Mini Project วิทยุ  FM อัจฉริยะ


   ส่วนที่  1 :  ส่วนของการโปรแกรมลงบอร์ด Nucleo
         ขั้นตอนในการ  Build Project สามารถศึกษาได้จากบทความ เริ่มต้นใช้งานบอร์ด STM32-NUCLEO F401RE เริ่มแรกจะใช้โปรแกรม STM32CubeMX ในการสร้าง Project ตามบทความข้างต้น ซึ่งหลังจากที่เราเลือก  New Project  แล้ว ในส่วนของ MCU Selector และ Board Selector ให้ทำการแก้ไขให้เป็นไปตามภาพด้านล่าง

MCU Selector

Board Selector

        เมื่อสร้าง  Project  เสร็จแล้วให้ทำการ  configuration Peripheral  ต่างๆดังนี้ 
  • I2C3   -> I2C
  • SPI3  ->  Mode : Full-Duplex Master
  • SYS -> Debug : SWD and Asnchronous Trace
  • USART2 -> Mode : Asynchronous         
ซึ่งเมื่อทำจะได้ผลออกมาเป็นดังภาพด้านล่างนี้



            เมื่อทำขั้นตอนข้างต้นแล้วให้ทำตามขั้นตอนที่เหลือที่ได้กล่าวไว้ในบทความเริ่มต้นใช้งานบอร์ด STM32-NUCLEO F401RE จนกระทั่งถึงขั้นตอนก่อนทำการ  Build Target เนื่องจาก  Library  ที่ใช้ใน Project นี้เป็นไฟล์สกุล  C++ จึงต้องเปลี่ยนไฟล์ main.c  ให้กลายเป็น  main.cpp ดังนั้นในส่วนของ compiler จึงต้องทำการแก้ไข ซึ่งจะต้องทำการแก้ไข Build Option  โดยสามารถเข้าไปแก้ไขที่ Project -> Build Option กดเลือกแท็บ Compiler settings -> Compiler Flags แล้วเปลี่ยนส่วน  Categories  เป็น  C++ options และต่อมาให้กดเลือกแท็บ Linker settings  แล้วเปลี่ยนส่วน  Categories  เป็น <All categories> และเลือก Use C++ Libraries  ดังภาพด้านล่าง


แล้วทำการ  Build Target และโปรแกรมลงบอร์ดต่อไป

     ส่วนที่  2 :  ส่วนของการทดสอบใช้จริง
         เมื่อทำการโปรแกรมโค้ดลงบอร์ด  Nucleo  และต่อวงจรทั้งหมดเสร็จเรียบร้อยแล้ว ในส่วนนี้จะอธิบายถึงการทำให้โทรศัพท์สมาร์ทโฟนระบบปฏิบัติการณ์แอนดรอยด์สามารถควบคุมวงจรได้โดยมี 2 ขั้นตอนดังนี้
        1. ทำให้คอมพิวเตอร์กลายเป็น WiFi access point โดยศึกษาวิธีการทำ WiFi access pointได้ที่นี่
        2. เปิดแอพพลิเคชั่น พร้อมทั้งตั้งค่า  IP Destination  ให้ตรงกันกับที่เราได้ตั้งไว้
     ในกรณีข้อสอง หากไม่ใช้ Notebook เป็น Hotspot ก็สามารถต่อโดยตรงกับ Access Point ปกติทั่วไปที่ต่ออยู่กับบอร์ด STM ได้เช่นกัน
       
     



Read More »

Monday 8 June 2015

[Mini Project]วิทยุ FM อัจฉริยะ : ตอนที่ 6 Code

      สำหรับโค้ดที่ได้นำมาโปรแกรมลงบนบอร์ดในส่วนของ  FM Receiver SPK-TFM-1010 ได้ทำการดัดแปลงมาจาก  AR1010 FM radio module library for Arduino ซึ่งเป็นการแปลงการใช้ Library Wire ของ Arduino มาเป็นการใช้ Library HAL แทน
- สามารถดาวน์โหลด Library  ต้นฉบับได้ ที่นี่

โดยทำการดัดแปลงภายในไฟล์ ar1010lib.cppโดยได้ทำการแก้ส่วน include ซึ่งได้เปลี่ยนจาก
#include <Wire.h> (สำหรับโค้ดนี้จะเป็น  Library  ที่ใช้ในการควบคุม  I2C )และ #include "WProgram.h"(Librar  คำสั่งพื้นฐานของ  Arduino) เหลือเพียง  #include "stm32f4xx_hal.h"
และทำการแก้ไข 2  ฟังก์ชันหลักดังนี้

       1. ฟังก์ชัน writeToRegister(uint8_t address, uint16_t data)
       

  ฟังก์ชัน writeToRegister จาก  Library ต้นฉบับ

ฟังก์ชัน writeToRegister  ที่ได้ทำการดัดแปลงแล้ว

   จากโค้ดด้านบนจะเห็นได้ว่าคำสั่ง  Wire.beginTransmission(-> เป็นคำสั่งที่ใช้ในการเริ่มต้นการเชื่อมต่อแบบ  I2C โดยจะส่งค่า Address  ของ  Slave ที่ต้องการติดต่อไป) , Wire.send(->เป็นคำสั่งที่ใช้ในการส่งข้อมูล) และ Wire.endTransmission (-> เป็นคำสั่งที่ระบุว่าสิ้นสุดการส่งข้อมูล )ได้ถูกรวมเหลือเพียงคำสั่งเดียวซึ่งก็คือคำสั่ง HAL_I2C_MASTER_Transmit() ซึ่งจะมีพารามิเตอร์ทั้งหมด  5 พารามิเตอร์ดังนี้
    1. I2c_HandleTypeDef* hi2c (ไว้ระบุว่าเราใช้  I2C  ตัวใด)
    2. uint16_t DevAddress (พารามิเตอร์ที่มีไว้ระบุ  Address  ของ  Slave ที่เราจะติดต่อ)
    3. uint8_t* pData (pointer  ของข้อมูลที่ส่ง)
    4.uint16_t size  (ขนาดของข้อมูลที่ส่ง)
   5. uint32_t Timeout
ซึ่งคำสั่งนี้จะทำการส่งข้อมูลในรูปแบบ I2C  ให้โดยอัตโนมัติ


       2. ฟังก์ชัน readFromRegister(uint8_t address)

                                        
ฟังก์ชัน readFromRegister จาก  Library ต้นฉบับ


ฟังก์ชัน  readFromRegister ที่ได้ทำการดัดแปลงแล้ว


   จากโค้ดด้านบนจะเห็นได้ว่าคำสั่ง  Wire.beginTransmission , Wire.send และ Wire.endTransmission ได้ถูกรวมเหลือเพียงคำสั่งเดียวซึ่งก็คือคำสั่ง HAL_I2C_MASTER_Transmit() เช่นเดียวกับฟังก์ชัน  WriteToRegister และในส่วนของการอ่านข้อมูลจากรีจีสเตอร์ซึ่งใน Library  เดิมจะใช้คำสั่ง  Wire.RequestFrom(DevAddress,size) และคำสั่ง  Wire. recieve() ได้ถูกแปลงเป็นคำสั่งHAL_I2C_MASTER_Recieve() ซึ่งจะมีพารามิเตอร์ทั้งหมด  5 พารามิเตอร์ดังนี้
    1. I2c_HandleTypeDef* hi2c (ไว้ระบุว่าเราใช้  I2C  ตัวใด)
    2. uint16_t DevAddress (พารามิเตอร์ที่มีไว้ระบุ  Address  ของ  Slave ที่เราจะติดต่อ)
    3. uint8_t* pData (pointer  ของข้อมูลที่จะรับ)
    4.uint16_t size  (ขนาดของข้อมูลที่จะรับ)
   5. uint32_t Timeout
ซึ่งคำสั่งนี้จะเป็นคำสั่งที่ใช้ในการอ่านข้อมูลในรูปแบบ I2C  

คำอธิบายฟังก์ชันการใช้งานในแต่ละส่วน

    ส่วนที่ 1 : ส่วนเชื่อมต่อของบอร์ด STM32-NUCLEO F401RE กับ FM Receiver SPK-TFM-1010
และ Ethernet module ENC28J60

Class main.cpp
 


 
     สำหรับใน Class main นี้เป็นส่วนของการเรียกใช้งานทั้งระบบโดยเริ่มแรกจะเป็นการกำหนดค่าเริ่มต้นให้กับ Peripheral ทั้งหมดและสร้าง object ขึ้นมาสอง object คือ radio เพื่อเรียกใช้คลาส AR1010 ในการควบคุมโมดูล FM Receiver และ object Udp เพื่อใช้ควบคุมโมดูล Ethernet ถัดมาจะทำการเชื่อมต่อเซิฟเวอร์แบบ UDP ระหว่างบอร์ด Nucleo กับ แอนดรอยด์แอพพลิเคชันโดยผ่านโมดูล Ethernet เมื่อเชื่อมต่อเสร็จแล้วจะรอรับแพคเกจซึ่งจะส่งค่าสตริงCommand กับ Value มาให้ หาก Command ที่ส่งมาเป็นคำว่า Frequency จะเรียกใช้คำสั่ง radio.setFrequency(value) เพื่อทำการเปลี่ยนคลื่นสัญญาณวิทยุ FM โดยที่เปลี่ยนไปตามค่า Value ที่รับเข้ามา หาก Command ที่ส่งมาเป็นคำว่า SeekUp จะเรียกใช้คำสั่ง radio.seek(‘u’) ซึ่งเป็นฟังก์ชันที่ใช้การค้นคลื่นสัญญาณ FM ใหม่ โดยเป็นการหาคลื่นที่มี่ความถี่สูงกว่า และServer จะส่งค่าสัญญาณความถี่ FM ใหม่ที่ได้กลับไปยังแอพพลิเคชั่น มา หาก Command ที่ส่งมาเป็นคำว่า SeekDown จะเรียกใช้คำสั่ง radio.seek(‘d’) ซึ่งเป็นฟังก์ชันที่ใช้การค้นคลื่นสัญญาณ FM ใหม่ โดยเป็นการหาคลื่นที่มี่ความถี่ต่ำกว่า และServer จะส่งค่าสัญญาณความถี่ FM ใหม่ที่ได้กลับไปยังแอพพลิเคชั่น หาก Command ที่ส่งมาเป็นคำว่า Volume จะเรียกใช้คำสั่งradio.setVolume(value) เพื่อทำการเปลี่ยนระดับเสียงโดยที่เปลี่ยนไปตามค่า Value ที่รับเข้ามา และหากCommand ที่ส่งมาเป็นคำว่า Android_Init จะทำการส่งค่าสัญญาณความถี่ของวิทยุ FM กลับไปเพื่อแสดงบนหน้าแอพพลิเคชั่น และ Command นี้



Class ar1010.h


   สำหรับ Class ar1010.h นั้นจะเป็น Class หลักที่ใช้ในการควบคุมโมดูล FM Receiverโดยมีส่วนที่เป็น Public ดังนี้
       1. Constructor รับค่า I2C_HandleTypeDef* I2C(ตัวจัดการ I2C ของ HAL)
       2. ฟังก์ชัน writeToRegister เป็นฟังก์ชันที่ใช้ส่งข้อมูลแบบ I2C ไปยังโมดูล FM Receiver โดยรับพารามิเตอร์เข้ามาสองอย่างคือ address ซึ่งเป็นแอดเดรสของรีจีสเตอร์ที่จะส่งและรับพารามิเตอร์ Dataคือข้อมูลที่จะส่งไป
       3. ฟังก์ชัน readFromRegister เป็นฟังก์ชันที่ใช้รับข้อมูลแบบ I2C ไปยังโมดูล FM Receiver โดยรับพารามิเตอร์ address ซึ่งเป็นแอดเดรสของรีจีสเตอร์ที่จะรับข้อมูลเข้ามา
      4. ฟังก์ชัน setSeekThreshold เป็นฟังก์ชันที่ไว้เซตค่า Threshold โดยจะมีพารามิเตอร์Threshold
      5. ฟังก์ชัน setFrequency เป็นฟังก์ชันที่มีไว้กำหนดค่าคลื่นวิทยุ โดยจะรับพารามิเตอร์ Frequency ซึ่งคือค่าคลื่นความถี่วิทยุที่เรากำหนด
      6. ฟังก์ชัน setVolume เป็นฟังก์ชันที่มีไว้กำหนดระดับเสียงซึ่งมีตั้งแต่ระดับ 0-18 โดยจะรับพารามิเตอร์ Volume ซึ่งคือค่าระดับเสียงที่เราต้องการกำหนด
      7. ฟังก์ชัน frequency เป็นฟังก์ชันที่ส่งค่าความถี่ของสัญญาณวิทยุในขณะนั้นกลับออกไป
      8. ฟังก์ชัน seek เป็นฟังก์ชันที่มีไว้หาคลื่นวิทยุโดยอัตโนมัติโดยจะมีพารามิเตอร์ direction ในการ       กำหนดว่าจะค้นหาคลื่นวิทยุที่มีความถี่สูงกว่าหรือต่ำกว่า หากต้องการให้หาขึ้นที่มีความถี่สูงกว่าให้ใส่ค่าพารามิเตอร์นี้เป็น ‘u’ หากต้องการให้ต่ำกว่าต้องกำหนดเป็น’d’และเมื่อค้นหาจบแล้วจะทำการส่งค่าความถี่ของสัญญาณวิทยุในขณะนั้นกลับออกไป

ส่วนที่เป็น Private มีดังนี้
      1. ฟังก์ชัน setBitInregister เป็นฟังก์ชันที่มีไว้กำหนดค่าบิตในรีจีสเตอร์ที่เราต้องการโดยจะรับพารามิเตอร์สามตัวคือ address คือแอดเดรสของรีจีสเตอร์นั้น,bit คือตำแหน่งของบิตที่เราต้องการเซต และ bitstate คือการกำหนดว่าบิตนั้นจะเป็น 0 หรือ 1
       2. ฟังก์ชัน setSeekDirection เป็นฟังก์ชันที่มีไว้กำหนด seek บิต ในรีจีสเตอร์โดยจะรับพารามิเตอร์ที่ชื่อว่า direction
       3. ฟังก์ชัน readLOInjection เป็นฟังก์ชันที่ใช้ในการอ่าน LO/HI INJECTION โดยรับพารามิเตอร์ lohi เป็นพารามิเตอร์การกำหนดว่าจะอ่านด้าน High หรือ Low โดยฟังก์ชันนี้จะส่งค่า RSSI กลับออกมา
      4. ฟังก์ชัน tuneWithAutoHiLo เป็นฟังก์ชันในการจูนหาคลื่นสัญญาณ


Class UIPEthernet.h




     สำหรับ Class UIPEthernetClass นั้นจะเป็น Class หลักที่ใช่ในการควบคุม ENC28J60 Ethernet Module ซึ่งต้นฉบับมาจาก mbed.org ซึ่งการดัดแปลงส่วนใหญ่ ดัดแปลงในไฟล์ Enc28J60Network.cpp โดยเป็นการเปลี่ยนจากการใช้ Library SPI ของ mbed มาเป็นของ HAL แทนและแก้ไขการ include standard library บางตัวเพื่อให้สามารถ Compile ผ่านได้ ซึ่งมีส่วนที่เป็น Public ดังนี้

      1. Constructor รับค่า SPI_HandleTypeDef* spi(ตัวจัดการ SPI ของ HAL), GPIO_TypeDef* cs(ตัวจัดการ GPIO ของ Pin CS), uint16_t cs_num(เลข Pin ที่ใช้เป็นขา CS)
      2. begin ทำหน้าที่ในการกำหนดค่า MAC Address, IP Address, DNS IP, Gateway IP, Subnet IP โดยสามารถเลือกได้ว่าจะค่า MAC Address เพียงอย่างเดียวหรือ กำหนดค่าอื่นๆเพิ่มได้
      3. maintain ใช้สำหรับการขอ IP ใหม่ในกรณีที่มีการใช้ DHCP ในการกำหนด IP
      4. localIP บอกค่า IP Address ปัจจุบัน
      5. subnetMask บอกค่า Subnet Mask Address ปัจจุบัน
      6. gatewayIP บอกค่า Gateway IP Address ปัจจุบัน
      7. dnsServerIP บอกค่า DNS IP Address ปัจจุบัน
      8. network เป็น object ของ Class Enc28J60Network ใช้ในการควบคุม Module

ส่วนของ Private

      1. in_packet, uip_packet, uip_hdrlen, packetstate, _dnsServerAddress, _dhcp, periodic_timer เป็นตัวแปรที่เอาไว้เก็บค่าที่ใช้ภายใน Object
      2. init ใช้ในการกำหนดค่าของ MAC Address ไปยัง ENC28J60
      3. configure ใช้ในการกำหนดค่า IP Address, DNS IP, Gateway IP, Subnet IP
      4. network_send ใช้ในการส่ง packet ผ่าน ENC28J60
     5. UIPServer, UIPClient, UIPUDP ประกาศ friend class
     6. chksum, ipchksum, upper_layer_chksum, uip_ipchksum, uip_tcpchksum, uip_udpchksum เป็นการทำ Checksum

ส่วนที่ 2 : ส่วนของสมาร์ทโฟนบนระบบปฏิบัติการแอนดรอยด์



1 Class ของ Android App จะเชื่อมกับหน้าต่างเพียงหน้าเดียวเท่านั้น ซึ่ง App นี้มีเพียงหน้าเดียวจึงมี Class เพียง Class เดียว โดยตัวแปรต่างๆเก็บค่าดังนี้
      1. my_port เก็บค่า port ของ Android ที่จะใช้ในการติดต่อ UDP
      2. send_port เก็บค่า port ของ STM32 ที่จะใช้ในการติดต่อ UDP
      3. ip_send เก็บค่า IP Address ของ STM32 ในรูปของ String
      4. ip เก็บค่า IP Address ของ STM32 ในรูปของ InetAddress
      5. datagramSocket เป็น Object ที่ใช้ในการจัดการ UDP Packet
      6. frequencyControl, volumeControl ใช้ชี้ไปยัง SeekBar ที่อยู่ในหน้า UI สำหรับควบคุมความถี่ FM และระดับเสียงของวิทยุ
      7. frequencyBox ใช้ชี้ไปยัง EditText ที่เอาไว้พิมรับค่าความถี่ที่จะฟังและแสดงค่าความถี่ปัจจุบัน
      8. minimum เป็นค่าความถี่ต่ำสุดที่กำหนดไว้
      9. oldBox เก็บค่า String เริ่มต้นสำหรับ frequencyBox
      10. progressChanged, volumeChanged ใช้เก็บค่าของ process bar ของ SeekBar frequencyControl, volumeControl ตามลำดับ

       ประกาศ Thread recv_udp ไว้เพื่อใช้ในการทำ Multithread ซึ่ง Thread นี้จะทำงานในการรับค่า UDP Packet ที่ส่งมาจาก STM32 ซึ่งเช็คว่ามีการส่งค่า ความถี่มาให้รึเปล่า ถ้ามีก็จะทำการอัพเดทค่าของ UI ให้ frequencyControl และ frequencyBox

 

   
      1. onCreate method นี้จะถูกเรียกตอนที่มีการเปิดแอพขึ้นซึ่งจะอ่านค่าของ ip port ต่างๆที่เซฟไว้มาและใส่ลงไปในตัวแปรที่ได้ประกาศไว้ พร้อมทั้งสร้าง object datagramSocket เพื่อใช้ในการส่ง UDP กำหนดค่าเบื้องต้นให้ UI และเริ่ม Thread recv_udp
      2. onDestroy จะถูกเรียกเมื่อมีการปิดแอพ โดยจะทำหน้าที่ในการสั่งปิด datagramSocket และ หยุด Thread recv_udp
      3. onCreateOptionsMenu ทำหน้าที่ในการสร้างเมนู option ซึ่งมี 3 เมนูคือ Set your Port, Set your destination ip, Set your destination port ตอนเริ่มเปิดแอพ
      4. onOptionsItemSelected ทำหน้าที่ในการจัดการเมื่อมีการกดใช้งาน option ใดๆซึ่งจะกำหนดไปเรียก show_popup โดยส่งค่า Arguments ต่างกันตามแต่ option ที่กล่าวไว้ในข้อ 3
      5. show_popup จะแสดงหน้าต่าง popup ขึ้นมาและถามค่าจากผู้ใช้ โดยค่าที่ถามจะขึ้นกับ option ที่กดเลือกมาซึ่งค่าจะถูกส่งมาจากข้อ 4
      6. send_freq ทำหน้าที่ในการส่ง UDP Packet ของความถี่ FM ที่ต้องการเปลี่ยนไปยัง STM32
      7. send_seekup ทำหน้าที่ในการส่ง คำสั่ง seekup ออกทาง UDP ไปยัง STM32
      8. send_seekdown ทำหน้าที่ในการส่ง คำสั่ง seekdown ออกทาง UDP ไปยัง STM32
      9. send_init ทำหน้าที่ในการส่งคำสั่ง Android_Init ไปยัง STM32 เพื่อรับค่าความถี่ที่ตั้งไว้กลับไปแสดงผล และกำหนดค่าเสียงเริ่มต้น
     10. onKeyDown ทำหน้าที่ Handle การกดปุ่มเพิ่มลดเสียงของตัวเครื่องให้ไปจัดการกับ SeekBar volumeControl ให้เพิ่มลดตามปุ่มกดได้



คุณสามารถดาวน์โหลด Code และไฟล์เอกสารของมินิโปรเจคได้ที่นี่









บทความนี้เป็นส่วนหนึ่งของรายวิชา 010123120 Embedded System Design Lab 
คณะวิศวกรรมศาสตร์ ภาควิชาวิศวกรรมไฟฟ้าและคอมพิวเตอร์
 มหาวิทยาลัยเทคโนโลยีพระจอมเกล้าพระนครเหนือ


Read More »

Friday 5 June 2015

[Mini Project]วิทยุ FM อัจฉริยะ : ตอนที่ 5 สรุปผลการทำงานของระบบ

สรุปกระบวนการทำงานทั้งหมด

       จากการออกแบบที่ได้มาจะแบ่งผลที่ได้ออกเป็น 2 ส่วนได้แก่

                    1. ส่วนของแอพพลิเคชั่น

                           1.1 ไอคอนของแอพพลิเคชั่น

                            1.2 หน้าหลัก



ส่วนประกอบของหน้าจอหลักในแอพพลิเคชั่นจะมี
6 ส่วนต่างๆดังนี้
1.ส่วนแสดงคลื่นวิทยุที่กำลังเล่นอยู่ ซึ่งเมื่อแตะที่
ส่วนนี้จะมีแป้นพิมพ์เพื่อให้ผู้ใช้ป้อนคลื่นความถี่ได้
2.ปุ่ม Change Frequency มีหน้าที่เมื่อผู้ใช้ป้อนค่า
คลื่นความถี่ที่ต้องการแล้วต้องกดปุ่มนี้เพื่อยืนยัน
การเปลี่ยนค่า
3.Slider Bar เป็นส่วนที่ทำหน้าที่ไว้เปลี่ยนคลื่นวิทยุ
เมื่อผู้ใช้เลื่อนแถบ
4.ปุ่ม Seek Up Frequency เป็นส่วนที่ทำหน้าที่
หาคลื่นวิทยุอัตโนมัติเป็นการหาคลื่นวิทยุที่อยู่ถัดไป
5.ปุ่ม Seek Down Frequency เป็นส่วนที่ทำหน้าที่หา
คลื่นวิทยุอัตโนมัติเป็นการหาคลื่นวิทยุที่อยู่ก่อนหน้า
6. Volume Slider bar เป็นส่วนที่ทำหน้าที่ไว้ลด/เพิ่ม
ระดับเสียงเมื่อผู้ใช้เลื่อนแถบ



         



    หากผู้ใช้ต้องการเปลี่ยน IP Destination , Port Destination หรือ My Port สามารถทำได้โดยกดตรงปุ่ม option ดังภาพตัวอย่างด้านล่าง






                    2. ส่วนของบอร์ด NUCLEO

                          ในส่วนของวงจรที่ได้ออกแบบวงจรไว้ผลที่ได้จะเป็นวงจรดังรูปด้านล่าง



 และเมื่อนำออสซิลโลสโคปมาวัดสัญญาณเอาต์พุตที่ข R-OUT หรือ L- OUT ของโมดูล FM Receiverที่ได้ โดยปรับให้ค่า Volume = 0 และ Volume = 18 สัญญาณที่ได้จะมีลักษณะดังภาพด้านล่างนี้


Volt/Div = 50 mV Time/Div = 200 ms Volume = 0          
Volt/Div = 200 mV Time/Div = 200 ms Volume = 18
             

ซึ่งผลกการทดลองใช้งานวงจรสามารถชมได้จากคลิปวิดีโอด้านล่างนี้




สรุปผลการทำงาน
            สำหรับผลการทำงานที่ได้โมดูลต่างๆสามารถทำงานได้ตรงตามที่ต้องการโดยแอนดรอยด์แอพพลิเคชั่นสามารถส่งข้อมูลที่ใช้รูปแบบ  UDP โดยทำการติดต่อผ่าน  Ethernet Module ENC28J60 มายังบอร์ด  STM32-NUCLEO-F401RE  เพื่อให้บอร์ด  NUCLEO ไปควบคุมโมดูล  FM Receiver SPK-TFM-1010 ซึ่งเป็นตัวรับคลื่นวิทยุแล้วส่งเอาต์พุตออกไปทางลำโพง ซึ่งฟังก์ชันบนแอนดรอยด์แอพพลิ-เคชั่นต่างๆมีดังนี้
  1. ฟังก์ชันเปลี่ยนคลื่นวิทยุโดยการใส่ค่าความถี่ในหน่วน  MHz   หรือปรับโดยใช้แถบสไลด์
  2. ฟังก์ชันการปรับเสียงสามารถปรับได้ทั้งหมด  18  ระดับ
  3. ฟังก์ชันค้นหาสถานีที่อยู่ก่อนหน้าหรือถัดไปโดยอัตโนมัติ           





บทความนี้เป็นส่วนหนึ่งของรายวิชา 010123120 Embedded System Design Lab 
คณะวิศวกรรมศาสตร์ ภาควิชาวิศวกรรมไฟฟ้าและคอมพิวเตอร์
 มหาวิทยาลัยเทคโนโลยีพระจอมเกล้าพระนครเหนือ
Read More »

[Mini Project]วิทยุ FM อัจฉริยะ : ตอนที่ 4 Schematics และ Protocal



Schematic of the Circuit


    ส่วนของการเชื่อมต่อระหว่าง NUCLEO-F401RE กับ Ethernet Module และ SPK-TFM-1010


    
ส่วนของการเชื่อมต่อระหว่าง NUCLEO-F401RE กับ Ethernet Module ENC28J60


    ส่วนของการเชื่อมต่อระหว่าง NUCLEO-F401RE กับ SPK-TFM-1010


Protocol Design (Socket Communication)

     การออกแบบรูปแบบการติดต่อสื่อสารโดยรวมแล้วจะกำหนดให้ STM32-NUCLEO F401RE เป็น Server และแอนดรอยด์แอพพลิเคชั่นเป็น Client โดยเบื้องต้นข้อมูลที่ส่งเป็น String จากแอนดรอยด์แอพพลิเคชั่นจะมีข้อมูลอยู่องส่วนด้วยกันคือ Command และ Value เมื่อ Server รับค่ามาแล้วนำไปตรวจว่าค่า Command ตรงกับกรณีใด โดยที่ค่า Value คือค่าที่ Command จำเป็นต้องใช้ ถ้าหาก Command ใดไม่ต้องใช้ค่า Value ก็จะกำหนดให้ส่งเป็นเลข 0 แทน ซึ่งค่า Command สามารถมีได้ 5 กรณีดังนี้

       กรณีที่ 1 : Command = Android_Init , Value = 0 เมื่อ Server ได้รับค่า Command นี้มาจะทำการส่งค่าสัญญาณความถี่ของวิทยุ FM กลับไปเพื่อแสดงบนหน้าแอพพลิเคชั่น และ Command นี้ Serverจะได้รับตอนที่เริ่มเปิดแอนดรอยด์แอพพลิเคชันและรูปแบบการติดต่อในกรณีที่ 1 จะเป็นดังนี้



       กรณีที่ 2 : Command = Frequency , Value = require Frequency value เมื่อ Server ได้รับค่า Command นี้เข้ามาจะหมายถึงการเปลี่ยนคลื่นสัญญาณ FM โดยที่เปลี่ยนไปตามค่า Value ที่รับเข้ามา



      กรณีที่ 3 : Command = SeekUp, Value = 0 เมื่อ Server ได้รับค่า Command นี้เข้ามาจะหมายถึงการค้นคลื่นสัญญาณ FM ใหม่ โดยเป็นการหาคลื่นที่มี่ความถี่สูงกว่า และServer จะส่งค่าสัญญาณความถี่ FM ใหม่ที่ได้กลับไปยังแอพพลิเคชั่น


     กรณีที่ 4 : Command = SeekDown, Value = 0 เมื่อ Server ได้รับค่า Command นี้เข้ามาจะหมายถึงการค้นคลื่นสัญญาณ FM ใหม่ โดยเป็นการหาคลื่นที่มี่ความถี่ต่ำกว่า และServer จะส่งค่าสัญญาณความถี่ FM ใหม่ที่ได้กลับไปยังแอพพลิเคชั่น


      กรณีที่ 5 : Command = Volume, Value = Volume value เมื่อ Server ได้รับค่า Command นี้เข้ามาจะหมายถึงการระดับเสียง ตามค่า Value ที่ส่งมา








บทความนี้เป็นส่วนหนึ่งของรายวิชา 010123120 Embedded System Design Lab 
คณะวิศวกรรมศาสตร์ ภาควิชาวิศวกรรมไฟฟ้าและคอมพิวเตอร์
 มหาวิทยาลัยเทคโนโลยีพระจอมเกล้าพระนครเหนือ








Read More »

Thursday 4 June 2015

[Mini Project]วิทยุ FM อัจฉริยะ : ตอนที่ 3 ภาพรวมของระบบ

วัสดุ อุปกรณ์ เครื่องมือหรือโปรแกรมที่ใช้ในการพัฒนา
      
         รายชื่อวัสดุอุปกรณ์
             STM32-NUCLEO F401RE                                            1 บอร์ด
             FM Receiver Module (SPK-TFM-1010)                         1 โมดูล
             Ethernet module ENC28J60                                          1 โมดูล
             แจ็คขนาด  3.5 mm                                                          1 ชุด
             สายไฟสำหรับต่อวงจร                                                       1 ชุด
             ลำโพง                                                                             1 ชุด
             สมาร์ทโฟนที่รองรับระบบปฏิบัติการแอนดรอยด์                   1 เครื่อง


       รายชื่อโปรแกรมที่ใช้ในการพัฒนา
            STM32CubeMX v 4.7
            EmBlocks v 2.30 
            CubeMx2EmBlocks v 1.0.0
            STM32 ST-LINK Utility v 3.5
            Android Studio 1.2.1.1 JRE 1.7.0 

    
แนวคิดและหลักการออกแบบระบบ
              ในส่วนของแนวคิดและการออกแบบระบบนี้ได้แบ่งออกเป็นสองส่วนดังนี้
                 ส่วนที่ 1 : ส่วนเชื่อมต่อของบอร์ด STM32-NUCLEO F401RE กับ FM Receiver SPK-TFM-                    1010 และ Ethernet module ENC28J60

          
            ส่วนที่ 2 : ส่วนของการเชื่อมต่อระหว่าง Internet Socket UDP กับ สมาร์ทโฟนในระบบปฏิบัติ                    การแอนดรอยด์

Component
        1. บอร์ด STM32-NUCLEO F401RE

      ทำหน้าที่เป็นตัวควบคุม FM Receiver และ Ethernet Module โดยใช้ STM32CubeMX ในการกำหนด Peripherals และใช้ HAL library และภาษา C++ ในการพัฒนา โดยใช้โปรแกรม EmBlock


         2. FM Receiver SPK-TFM-1010



       ทำหน้าที่เป็นตัวรับสัญญาณวิทยุที่มีความถี่ตั้งแต่ 76-108 MHz และส่งเอาต์พุตที่เป็นความถี่ซึ่งมีระดับแรงดัน 0.6 - 1 V ออกไปให้ลำโพง
       ในการติดต่อระหว่าง AR1010 กับ บอร์ด NUCLEO สามารถติดในต่อในรูปแบบ I2C หรือ SPI ก็ได้ ซึ่งเราตัดสินใจเลือกใช้ I2C ในการติดต่อ โดยที่บอร์ด NUCLEO เป็น Master และ AR1010 เป็น Slave
ในส่วนของฮาร์ดแวร์จะจ่ายไฟเลี้ยง 3.3 V ซึ่งสามารถจ่ายโดยตรงด้วยบอร์ด NUCLEO ได้เลย และเราได้เลือกการควบคุมแบบ I2C ดังนั้นขา BusMode จึงต่อลง GND และขา Write/Read ไม่ต้องต่อ ต่อเพียงแค่ขา Clock กับ Data เข้ากับขา PA8 และ PC9 ตามลำดับ


        3. Ethernet module ENC28J60



ทำหน้าที่เป็นตัวรับและส่งข้อมูลแบบ UDP ระหว่างบอร์ด NUCLEO กับ สมาร์ทโฟน โดยจะใช้การติดต่อในรูปแบบ SPI โดยที่บอร์ด NUCLEO เป็น Master และ Ethernet module เป็น Slave

4. สมาร์ทโฟนระบบปฏิบัติการแอนดรอยด์



     เราจะใช้แอพพลิเคชั่นบนระบบปฏิบัติการแอนดรอยด์ ในการควบคุมความถี่วิทยุและส่งในรูปแบบUDP กลับไปหาบอร์ด NUCLEO F401RE โดยใช้โปรแกรม Android Studio ในการพัฒนาแอพพลิเคชั่น ซึ่งอินเตอร์เฟสของแอพพลิเคชั่นที่ออกแบบได้เป็นดังภาพด้านล่าง



และฟังก์ชันในแอพพลิเคชั่นมีดังนี้

          · ผู้ใช้สามารถป้อนความถี่ที่ต้องการได้

          · ปรับระดับเสียงได้

          · ค้นหาช่องสัญญาณความถี่ที่อยู่ก่อนหน้าหรือถัดไปได้


5. ลำโพง

              ทำหน้าที่รับสัญญาณความถี่เอาต์พุตจาก FM Receiver มาแสดงในรูปสัญญาณเสียง






เอกสารสำหรับศึกษาเพิ่มเติม
   Description of STM32F4xx HAL drivers
   ENC28J60 Data Sheet 
   specification applies to FM Module
   ar1010 programmerguide 0.81







บทความนี้เป็นส่วนหนึ่งของรายวิชา 010123120 Embedded System Design Lab 
คณะวิศวกรรมศาสตร์ ภาควิชาวิศวกรรมไฟฟ้าและคอมพิวเตอร์
 มหาวิทยาลัยเทคโนโลยีพระจอมเกล้าพระนครเหนือ
Read More »

[Mini Project]วิทยุ FM อัจฉริยะ : ตอนที่ 2 ปัญหาที่เจอจากการทำงาน


ปัญหาที่พบจากการทำมินิโปรเจคมีดังนี้
  1. จากเดิมที่ตั้งใจจะทำ WebApp ซึ่งคาดว่าจะใช้ Chrome API Sockets เพื่อใช้ในการส่ง UDP แต่เมื่อศึกษาจริงๆแล้วพบว่า Chrome API ที่จะใช้นั้นเป็นการเขียน App เพื่อใช้ใน Browser Chrome ดังนั้นจึงได้เปลี่ยนแนวทางจาก การทำ WebApp ไปเป็น Android App เพื่อใช้งานในการสั่งงาน FM Module โดยติดต่อผ่าน UDP Protocol เช่นเดิม
  2. Wifi Module NRF24L01 ที่ซื้อมาเนื่องจากไม่ได้ศึกษาการใช้งานอย่างดีก่อนที่จะทำการซื้อ จึงทำให้ไม่สามารถใช้งาน ในการส่ง UDP ตามต้องการได้ จึงได้ทำการเปลี่ยนเป็น Ethernet module enc28j60 [ET-MINI ENC28J60 (P-ET-A-00346)] มาใช้ในการรับส่งข้อมูลระหว่าง STM32-NUCLEO F401RE และ Android App แทน
  3. FM Module ที่ซื้อมานั้นมีช่องว่างระหว่าง Pin ขนาด 2 mm ซึ่งทำให้ไม่สามารถบัดกรี Pin แล้วเสียบลง โฟโต้บอร์ดได้ ดังนั้นจึงแก้ไขโดยการบัดกรีลงแผ่นปริ้นท์อเนกประสงค์เพื่อปรับช่องว่างเป็น 2.54 mm แทน
  4. เนื่องจาก FM Module ที่นำมาใช้นั้นให้เสียงออกมาเป็นแบบ Stereo แต่อยู่ในรูปแบบของ Pin จึงต้องหา Jack ขนาด 3.5 mm มาต่อกับลำโพง

ภาพ FM Module หลังจากบัดกรีลงแผ่นปริ้นท์อเนกประสงค์


ภาพ Jack ขนาด 3.5 mm ที่ถอดจากคอมพิวเตอร์เก่าไม่ใช้แล้วเพื่อนำมาต่อกับ FM Module








บทความนี้เป็นส่วนหนึ่งของรายวิชา 010123120 Embedded System Design Lab 
คณะวิศวกรรมศาสตร์ ภาควิชาวิศวกรรมไฟฟ้าและคอมพิวเตอร์
 มหาวิทยาลัยเทคโนโลยีพระจอมเกล้าพระนครเหนือ
Read More »

[Mini Project]วิทยุ FM อัจฉริยะ : ตอนที่ 1 แบบนำเสนอมินิโปรเจค


หัวข้อมินิโปรเจค

       วิทยุ FM อัจฉริยะ

วัตถุประสงค์
     1. เพื่อศึกษาทดลองใช้งานบอร์ด STM32-NUCLEO F401RE
     2. เพื่อศึกษาใช้งานโมดูล FM Receiver SPK-TFM-1010 ในการรับสัญญาณวิทยุ ในย่าน
     76-108 MHz
     3. เพื่อศึกษาการใช้งานบัส I2C หรือ SPI เพื่อใช้ในการเชื่อมต่อโมดูล FM Receiver กับ บอร์ด
     STM32-NUCLEO F401RE
     4. เพื่อศึกษาใช้งาน Ethernet module โดยเป็นการติดต่อผ่านทางไวไฟโดยใช้โมดูล NRF24L01
     5. เพื่อศึกษาใช้งาน API socket ของบราวเซอร์ Chorme เพื่อใช้งาน UDP ในการส่งข้อมูลระหว่าง
     บอร์ด STM32-NUCLEO F401RE กับคอมพิวเตอร์

ขอบเขตของงาน
     1. ใช้บอร์ด STM32-NUCLEO F401REในการควบคุมระบบ
     2. ต้องมีการนาข้อมูลหรือสถานะของระบบหรือควบคุมสั่งงานในรูปแบบใดแบบหนึ่งผ่าน web
     3. ต้องมีการใช้งานบัส I2C หรือ SPI อย่างน้อย 1 อุปกรณ์ เช่น RTC module
     4. ต้องมีการบันทึกข้อมูลลง SD card / microSD หรือ ส่งข้อมูลแบบไร้สายไปยังคอมพิวเตอร์
     (ห้ามใช้อุปกรณ์ประเภท WiFi-to-Serial) หรือ ส่งข้อมูลผ่าน Ethernet ไปยังคอมพิวเตอร์

ประโยชน์ที่คาดว่าจะได้รับ
     1. ได้ความรู้เกี่ยวกับบอร์ด STM32-NUCLEO F401RE เพิ่มขึ้น
     2. ได้ความรู้ในการใช้โมดูล FM Receiver SPK-TFM-1010,ไวไฟโมดูล NRF24L01
     3. ได้ความรู้ในการใช้งาน API socket ของบราวเซอร์ Chorme

แนวคิดและหลักการออกแบบระบบ

     ส่วนที่ 1 : ส่วนเชื่อมต่อของบอร์ด STM32-NUCLEO F401RE กับโมดูล FM Receiverและไวไฟโมดูล NRF24L01

บล็อคไดอะแกรมการออกแบบระบบส่วนที่ 1 

     ส่วนที่ 2 : ส่วนของการเชื่อระหว่าง Internet Socket UDP กับ Computer

บล็อคไดอะแกรมการออกแบบระบบส่วนที่ 2 

วัสดุ อุปกรณ์ เครื่องมือหรือโปรแกรมที่ใช้ในการพัฒนา
      
         รายชื่อวัสดุอุปกรณ์
             STM32-NUCLEO F401RE                      1 บอร์ด
             FM Receiver Module (SPK-TFM-1010)  1 โมดูล
             Wi-Fi Ethernet (NRF24L01)                     1 โมดูล
             สายไฟสำหรับต่อวงจร                               1 ชุด
             ลำโพง                                                       1 ชุด
             คอมพิวเตอร์                                              1 เครื่อง


       รายชื่อโปรแกรมที่ใช้ในการพัฒนา
            STM32CubeMX v 4.7
            EmBlocks v 2.30 
            CubeMx2EmBlocks v 1.0.0
            STM32 ST-LINK Utility v 3.5

































บทความนี้เป็นส่วนหนึ่งของรายวิชา 010123120 Embedded System Design Lab


คณะวิศวกรรมศาสตร์ ภาควิชาวิศวกรรมไฟฟ้าและคอมพิวเตอร์


มหาวิทยาลัยเทคโนโลยีพระจอมเกล้าพระนครเหนือ
Read More »