วันพุธที่ 1 กรกฎาคม พ.ศ. 2558

Mini-Project Embedded System Design Lab

MiniProject 010123120 Embedded System Design Lab นาฬิกาปลุก


หัวข้อ : นาฬิกาปลุก

วัตถุประสงค์
1.   เพื่อการศึกษาการทำงานของบอร์ด ET-STM32F103
2.   เพื่อศึกษาการใช้งานของ Ethernet module สำหรับการเชื่อมต่อระหว่างหน้าเว็บที่ไว้สำหรับกำหนดเวลาในการปลุกกับบอร์ดทดลอง
3.   เพื่อศึกษาการใช้งานของ module real time clock ซึ่งเป็นอุปกรณ์ที่ให้ค่าเวลาตามจริง 
4.   เพื่อศึกษาการทำงาน Piezo ซึ่งไว้ทำให้เกิดเสียงเมื่อจะทำการปลุก
5.   เพื่อศึกษาการทำงานของปุ่มกด ซึ่งไว้ทำการกดปิดเสียง Piezo


6.   เพื่อศึกษาการทำงานของโมดูล MAX7219 ซึ่งแสดงผลด้วย LED แบบDotmatrix ขนาด 8x8
  ซึ่งไว้แสดงนาฬิกาแบบดิจิตอล

ขอบเขตของงาน
1.   ใช้บอร์ด ET-STM32F103 ในการควบคุมระบบ
2.   ต้องมีการนำข้อมูลหรือสถานะของระบบหรือควบคุมสั่งงานในรูปแบบใดแบบหนึ่งผ่าน web
3.   ต้องมีการใช้งานบัส I2C หรือ SPI อย่างน้อย อุปกรณ์ เช่น RTC module
4.   ต้องมีการบันทึกข้อมูลลง SD card / microSD หรือ ส่งข้อมูลแบบไร้สายไปยังคอมพิวเตอร์(ห้ามใช้อุปกรณ์ประเภท WiFi-to-Serial) หรือ ส่งข้อมูลผ่านEthernet ไปยังคอมพิวเตอร์
5.   ให้ใช้ STM32CubeMx (STM32CubeF0 / STM32CubeF3 / STM32CubeF4) และ HAL library แบบใหม่ และไม่ใช้ Standard peripherals library (SPL ) ซึ่งเป็นของเดิม

ประโยชน์ที่คาดว่าจะได้รับ
1.  ทำให้ได้รับความรู้เกี่ยวกับบอร์ดทดลองที่ได้รับเพิ่มมากขึ้น
2.  ทำให้ได้รับความรู้จากการใช้โมดูลไวไฟ , module real time clock , Piezoและ LED8x8
3.  ทำให้ได้รับความรู้จากการใช้งานสำหรับการติดต่อระหว่างบราวเซอร์ของ Chormeกับบอร์ดทดลอง

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



การออกแบบระบบย่่อย
1. การใช้งานโมดูลแสดงผลด้วย LED แบบ Dotmatrix ขนาด 8x8 โดย MAX 7219 (RED) สามารถศึกษาได้จาก http://embeddedsystemdesign010123119.blogspot.com/2015/06/miniproject-010123120-embedded-system_4.html


2. การใช้งาน RTC (Real Time Clock) บนบอร์ด STM32F103 สามารถศึกษาได้จาก http://embeddedsystemdesign010123119.blogspot.com/2015/06/rtc-real-time-clock-stm32f103.html

3. การใช้งาน Module Ethernet mini ENC28J60 สามารถศึกษาได้จาก http://embeddedsystemdesign010123119.blogspot.com/2015/07/module-ethernet-mini-enc28j60.html

4. การใช้บัซเซอร์เพื่อส่งเสียงปลุก

5. การใช้ปุ่มกด เพื่อหยุดเสียงปลุก

โปรแกรมที่ใช้สำหรับการพัฒนา
1.  STM32CubeMx
2.  CubeMx2EmBlock
3.  EmBlocks
4.  Demonstrator GUI

วัสดุและอุปกรณ์
1.    บอร์ด ET-STM32F103
2.    โมดูล MAX7219 LED 8x8
3.    โมดูล Ethernet mini ENC28J60
4.     สายไฟ
5.    ตัวต้านทาน 1kOhms
6.    LM35 Temparature sersor
7.    Buzzer

8.    ปุ่มกด 

ขั้นตอนการทดลอง
1.            สร้างโปรเจค สำหรับ Mini Project นี้ ซึ่งเป็นชิป STM32F103RBTX โดยใช้โปรแกรม STM32CubeMX
2.            เลือกขา ที่ต้องใช้ทั้งหมด ซึ่งได้แก่
1)           ADC1 ซึ่งไว้สำหรับอ่านค่า Temperature



2)           RTC ไว้สำหรับอ่านค่า วันที่และเวลา



3)           SPI1 แบบ Full-Duplex Master ซึ่งไว้สำหรับส่งข้อมูลไปยัง 8*8 LED Matrix และเลือกขา PA1(GPIO_OUTPUT) ไว้สำหรับเป็น CS
SPI2 แบบ Full-Duplex Master ซึ่งไว้สำหรับส่งข้อมูลไปยัง 8*8 LED Matrix และเลือกขา PB12(GPIO_OUTPUT) ไว้สำหรับเป็น CS


   

4)           UART2 เลือกแบบ Mode Asychronousไว้สำหรับ แสดงข้อความที่ต้องการดู



5)           ปุ่มกด    : PB9(GPIO_INPUT)
บัซเซอร์ : PB8(GPIO_OUTPUT)



6)           ทำการ ตั้งค่าโปรเจคและ Generate Code



           
7)           แล้วจึงทำการ convert โปรเจคจาก โปรแกรม STM32CubeMX ไปยัง Emblocks โดยใช้โปรแกรม CubeMx2EmBlock





8)           แล้วจึงเปิดโปรเจคโดยไปที่ File -> Open -> แล้วเลือกโปรเจคที่จะทำการเปิด



9)           เนื่องจาก Library ที่นำมาใช้ เป็น C++ จึงต้องทำการเปลี่ยนไฟล์ main.c เป็น main.cpp ดังนั้นจึงต้องทำการแก้ในส่วนของ Build Option ดังนี้ Project -> Build Option -> Compiler settings -> Compiler Flags แล้วเปลี่ยนส่วน Categories เป็น C++ Options แล้วทำการติ๊กตามรูปข้างล่างนี้



10)   และแก้ส่วนของ Linker settings -> Linker Flags แล้วเปลี่ยนส่วน Categories เป็น Library selection แล้วทำการติ๊กตามรูปข้างล่างนี้



11)   แล้วจึงทำการแก้ในส่วนของ Pre/post build steps เพื่อให้รันออกมาเป็น file นามสกุล .bin



12)    จากนั้นจึงทำการเปลี่ยนไฟล์ main.c เป็น main.cpp


ทำการรวมโค้ดในแต่ละส่วนของการทดลอง เพื่อให้ทำงานเป็นระบบหนึ่งเดียว ซึ่งมีโค้ดตามข้างล่างนี้






       จากโค้ดที่จะใช้ ADC1channel 15จานวน 12 บิตสาหรับอ่านแรงดันเอาต์พุตจากLM35DZ และใช้ SPI1สำหรับส่งข้อมูลไปยังโมดูล MAX7219 LED8x8และใช้ SPI2สาหรับเชื่อมต่อบัส SPI กับโมดูล Ethernet ENC28J60

4.2. ทำการต่อวงจรสำหรับการทดลองดังต่อไปนี้

***สำหรับวงจรที่นำมาใช้สำหรับการทดลอง จะใช้ตัวต้านทาน 1kΩ***

4.3. ทำการรันโค้ด Python ในไฟล์ eudp.py ในคอมพิวเตอร์เพื่อรับข้อมูลที่ได้จากบอร์ด STM32F103  
เพื่อใช้สำหรับการส่งข้อมูลต่างๆ ไปยังเว็บ Plot.py 







ซึ่งโค้ด eudp.py จะมีการเรียกใช้งานคลาสที่อยู่ภายในไฟล์ sent2plotly.py



สามารถดาวน์โหลดไฟล์โค้ดการทำงานได้ที่
https://www.dropbox.com/s/d2a1qsptbahy6o8/Project_mini.rar?dl=0


จะได้กราฟใน Plotly เป็นดังนี้


แกน x : เวลาที่รับมา
แกน y : ค่าอุณหภูมิ (เซลเซียส)


ภาพการต่อวงจรจริง



สามารถดาวน์โหลดไฟล์เอกสารเป็นไฟล์ pdf ได้ที่ https://www.dropbox.com/s/umnf3cooaftyo9r/5501012630010_5501012630176.pdf?dl=0

Temperature

การใช้งาน Module Ethernet mini ENC28J60

MiniProject 010123120 Embedded System Design Lab นาฬิกาปลุก


Ethernet mini ENC28J60
การเชื่อมต่อกับไมโครคอนโทรลเลอร์ โดยจะใช้การเชื่อมต่อแบบ SPI Bus และในส่วนของระบบไฟ ไอซี ENC28J60 จะทำงานที่แรงดัน 3 Voltage  จึงได้สร้างวงจรบัฟเฟอร์เพื่อให้สำหรับรองรับการเชื่อมต่อระบบไฟ ระหว่าง 3V กับ 5V
                เป็นโมดูลที่ออกแบบมาเพื่อเป็นตัวกลางในการเชื่อมต่อระบบการสื่อสารระหว่างไมโครคอนโทรลเลอร์ กับโครงข่าย Ethernet ซึ่งรองรับการทำงานของProtocol TCP/IP โดยใช้ไอซี ENC28J60 ซึ่งรองรับมาตรฐานการสื่อสาร IEEE 802.3 เชื่อมต่อสัญญาณควบคุมผ่าน SPI Bus ความเร็วสูงสุด 10 Mb/s ในการพัฒนาโปรแกรมทางบริษัท Microchip จะสนับสนุนตัว Microchip TCP/IP Stack ซึ่งสามารถดาวน์โหลด และ นำไปใช้ได้ฟรีที่เว็บไซต์ของ Microchip (www.microchip.com) โดยคุณสมบัติคร่าวๆ ของ ENC28J60 จะเป็นดังนี้
คุณสมบัติของ IC ENC28J60
General:
·       IEEE 802.3 compatible Ethernet Controller
·       Integrated MAC and 10BASE-T PHY
·       8 Kbyte Transmit/Receive Packet Dual Port Buffer SRAM
·       Programmable Automatic Retransmit on Collision
·       Programmable Padding and CRC Generation
·       Programmable Automatic Rejection of Erroneous Packets
·       SPI™ Interface with speeds up to 10 Mb/s
·       Supports Full and Half-Duplex modes

Code :
เป็นการตั้งค่าให้กับ SPI2 สำหรับนำมาใช้เชื่อมต่อระหว่าง ไมโครคอนโทรลเลอร์ กับ Module Ethernet


เป็นส่วนที่ประกาศ object จากclass UIPEthernetClass
-                   โดยได้กำหนดให้ PB12 เป็น CS



เป็นส่วนไว้กำหนด IP address, Port, DNS, GATE, SUBnet ให้กับ Module Ethernet และให้เริ่มต้นการทำงาน ซึ่งอยู่ในส่วนของ int main()




เป็นส่วนไว้กำหนด IP address, Port ของ Computer และทำการส่ง Data ที่อยู่ใน char aray ชื่อ str_to_send  ซึ่งอยู่ในส่วนของ while loop


จากนั้นทำการรันไฟล์ server เพื่อตรวจสอบการใช้งานของ Module Ethernet
Code server.py
import socket,SocketServer,time

print 'Server started...' #print server start
host, port = '192.168.1.173',51000 #set host and port
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
server.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
server.bind((host,port))
server.settimeout(5)
j=0
start_time = time.time()
try:
  server.sendto("Hello",('192.168.1.63',50000)) #ip, port module ethernet
  while True:
    try:
      print "send"
      (received, addr) = server.recvfrom(65535)
      server.sendto(received,addr)
      print j, ': received from ', str(addr), 'data is ', received
      j+=1
      
    except socket.timeout:
      print "Out"
      pass
  
except KeyboardInterrupt as ex:
  print ex

ผลการทดลอง