การใช้งานพอร์ตสื่อสาร I2C

download all demo files: I2C.7z

Contents

บทนำ

รู้จักกับ I2C

I2C  ย่อมาจาก  Inter-Integrated Circuit  คิดค้นโดย  Philip semiconductor  หรือ  NXP  semiconductor
จุดประสงค์เพื่อรับส่งข้อมูลความเร็วต่ำระหว่างอุปกรณ์ ต่างๆ เช่นเครื่องบันทึกเสียง โทรศัพท์มือถือ  รวมถึง
หน่วยความจำอย่าง EEPROM เป็นต้น การสื่อสารแบบ I2C มีจุดเด่นคือ การเชื่อมต่อกันเป็นระบบบัสและรับส่งข้อมูล
ระหว่างอุปกรณ์ได้เป็นจำนวนมาก โดยใช้สายสัญญาณเพียงสองเส้นดังรูป  1-1  ซึ่งสามารถลดจำนวนสายสัญญาณและ
ขนาดของอุปกรณ์ จึงเป็นที่นิยมในระบบสมองกลฝังตัวขนาดเล็ก

การสื่อสาร  I2C  ใช้สายส่งดิจิตอลแบบ  Bidirectional  Open-drain line  ซึ่งสามารถรับส่งข้อมูลได้ในเส้น
เดียวกับ จำนวน  2  ชุด คือ  Serial Data Line (SDA)  ใช้ทำหน้าที่ส่งข้อมูล  และ  Serial Clock Line (SCL)  ทำหน้าที่
ส่งสัญญาณนาฬิกา  ความเร็วของการรับส่งข้อมูลนั้นขึ้นอยู่กับความถี่ของสัญญาณนาฬิกาในสาย  SCL  ส่าหรับ
STM32F4 สามารถส่งสัญญาณนาฬิกาที่มี ความถี่ 100kHz (Standard) หรือ 400kHz (Fast) [1, p. 575]

รูป 1-1 การเชื่อมต่ออุปกรณ์ แบบ I2C บัส

รูป 1-1 การเชื่อมต่ออุปกรณ์ แบบ I2C บัส [2, p.1]

เนื่องจากสายสัญญาณของอุปกรณ์เป็นแบบ  open-drain  ซึ่งมีแรงดันไฟเท่ากับ  GND  เมื่อสถานะของโลจิก
เป็นศูนย์ และเป็น  High impedance  เมื่อสถานะโลจิกเป็นหนึ่ง จึงจำเป็นต้องต่อ  Pulled-up resistors  และมี
ไฟเลี้ยงภายนอก VDD (3.3V หรือ 5V)

จากรูป  1-1  แสดงตัวอย่างการเชื่อมต่ออุปกรณ์แบบ  I2C  บัส โดยมีอุปกรณ์รับส่งข้อมูลหลัก (Master) และมี
อุปกรณ์ย่อย  (Slave) จ่านวน  3  ชุด มาต่อพ่วง เมื่อเริ่มต้นการทำงานอุปกรณ์  Master  จะระบุคำสั่งว่าต้องการอ่าน
ข้อมูล  (Read)  หรือส่งข้อมูล  (Write)  ไปยังอุปกรณ์  Slave  การระบุอุปกรณ์   Slave  ที่ต้องการจะสื่อสาร จะใช้
Address 7  บิตหรือ  10  บิต  ซึ่งระบุไว้ใน  Datasheet ของผู้ผลิต  และกำหนดโดยผู้ใช้งานได้ทั้ง  Hardware
หรือ Software

การสื่อสารแบบ I2C มีรูปแบบดังรูป 1-2 และมีขั้นตอนการรับส่งข้อมูลเป็นลำดับ ดังนี้

  1. เพื่อเริ่มต้นสถานะการสื่อสารแบบ  I2C  อุปกรณ์  Master เริ่มจะส่งคำสั่ง  START  ซึ่งจะทำให้อุปกรณ์
    Slave ทุกตัวที่อยู่ใน Bus เตรียมพร้อมรับข้อมูลจากสายส่งข้อมูล (SDA)
  2. อุปกรณ์  Master  ส่ง  Address  ขนาด  7  บิตและตามด้วยคำสั่งอ่านหรือเขียน (Read/Write)  อีก  1
    บิต
  3. อุปกรณ์  Slave  ทุกตัวใน  Bus  จะตรวจสอบ  Address  ในสายส่งข้อมูลว่าตรงกับ  Address  ของตน
    หรือไม่หากตรงกัน  จะส่งสัญญาณ  ACK  ขนาด  1  บิต  กลับไปยังอุปกรณ์  Master  เพื่อเตรียมพร้อม
    ด่าเนินการต่อไป
  4. การรับส่งข้อมูลระหว่าง  Master และ Slave ที่ระบุ Address จะด่าเนินการอย่างต่อเนื่อง  ในกรณีที่
    Master  ส่งคำสั่ง  Read  อุปกรณ์  Slave  จะส่งข้อมูลเป็นชุดๆ ชุดละ  8  บิต (1  ไบต์)  เมื่ออุปกรณ์
    Master จะส่งสัญญาณ ACK เมื่อได้รับทุกๆ ไบต์
  5. อุปกรณ์  Master จะส่งคำสั่ง STOP เพื่อสิ้นสุดสถานะการสื่อสารแบบ I2C

รูป 1-2 รูปแบบการสื่อสารแบบ I2C

รูป 1-2 รูปแบบการสื่อสารแบบ I2C [3]

รูป 1-3 แสดงตัวอย่างการอ่านค่าความชื้นที่วัดได้จากเซนเซอร์วัดความชื้น  HIH6130 ข้อมูลมาจากเซนเซอร์มี
ขนาด 2 ไบต์

รูป 1-3 ตัวอย่างการอ่านค่าความชื้นที่วัดได้จากเซนเซอร์ Honeywell [2, p. 2]
รูป 1-3 ตัวอย่างการอ่านค่าความชื้นที่วัดได้จากเซนเซอร์ Honeywell [2, p. 2]

วิธีการใช้งาน I2C Blockset

ใน  Waijung  I2C Blockset  ประกอบด้วย  I2C Master Setup Block   แสดงในรูป  1-4  ทำหน้าที่ตั้งค่า
Register  ต่างๆ ที่เกี่ยวกับการสื่อสาร  I2C  ได้แก่ เลือกใช้งาน  I2C Module  ใน  STM32F4DISCOVERY  ได้ถึง  3  ชุด
เลือกใช้งานขา SDA/SCL และตั้งคำความถี่สัญญาณนาฬิกาในขา SCL

รูป 1-4 ลักษณะและการตั้งค่าการใช้งาน I2C Master Setup Block

รูป 1-4 ลักษณะและการตั้งค่าการใช้งาน I2C Master Setup Block

I2C Master Read/Write  Block  แสดงในรูป  1-5  ทำหน้าที่รับหรือส่งข้อมูล  ไปยังอุปกรณ์  Slave  ผ่าน  I2C
โดยให้  STM32F4DISCOVERY  เป็นอุปกรณ์  Master  ดังนั้นผู้ใช้งานสามารถกำหนด  Address  ขนาด  7  บิต  ของ
อุปกรณ์ Slave ที่ต้องการจะสื่อสารผ่าน I2C

รูป 1-5 ลักษณะและการตั้งค่าการใช้งาน I2C Master Read/Write Blockset

รูป 1-5 ลักษณะและการตั้งค่าการใช้งาน I2C Master Read/Write Blockset

การใช้งานเซนเซอร์วัดความชื้น /อุณหภูมิ  HIH6163

อุปกรณ์ที่ใช้ในการทดลอง

รูป 2-1 aMG Sense Humidity/Temperature

รูป 2-1 aMG Sense Humidity/Temperature

รูป  2-1  แสดงบอร์ดวัดความชื้น/อุณหภูมิ โดยใช้ติดตั้งเซนเซอร์รุ่น  HIH6131-021-001  จากบริษัท
Honeywell ซึ่งมีคุณสมบัติดังนี้

  • ติดต่อผ่านการสื่อสารแบบ I2C
  • ความแม่นย่าในการวัดค่าความชื้นสัมพัทธ์ : +/- 4 %RH
  • ช่วงของในการวัดค่าความชื้นสัมพัทธ์ : 10 – 90 %RH
  • ความแม่นยำในการวัดอุณหภู มิ : +/- 1 องศาเซลเศียส
  • ช่วงของในการวัดอุณหภูมิ : 5 – 50 องศาเซลเศียส
  • ค่าความละเอียดข้อมูล 14 บิต
  • มีสัญญาณแจ้งเตือนเมื่อค่าความชื้นสัมพัทธ์ เกินหรือต่ำกว่ากำหนด  โดยผู้ใช้สามารถตั้งค่าแจ้งเตือน ภายในเซนเซอร์ ได้  (ดูรายละเอียดการท่างานได้  [4])

เมื่อผู้ใช้งานต้องการเริ่มอ่านทั้งค่าความชื้นและอุณหภูมิ ต้องส่ง  Request  ไปยังเซนเซอร์โดยระบุ  Address ตามรูปแบบในรูป 2-2

แสดงรูปการสื่อสารแบบ I2C สำหรับอ่านค่าทั้งความชื้นและอุณหภูมิ  [2, p. 1]

แสดงรูปการสื่อสารแบบ I2C สำหรับอ่านค่าทั้งความชื้นและอุณหภูมิ [2, p. 1]

หลังจากนั้นให้อุปกรณ์  Master เริ่มทำการอ่านค่าจากเซนเซอร์และรออ่านข้อมูลเป็นจ่านวน  4  ไบต์   (32  บิต)
ซึ่งประกอบด้วย สถานะของ Sensor (2 บิต) ค่าความชื้น (14 บิต) และอุณหภูมิ (14 บิต)

รูป 2-3 แสดงรูปการสื่อสารแบบ I2C ของ Humidity/Temperature Sensor [2, p. 2]

รูป 2-3 แสดงรูปการสื่อสารแบบ I2C ของ Humidity/Temperature Sensor [2, p. 2]

รูป 2-4 สถานะของเซนเซอร์

รูป 2-4 สถานะของเซนเซอร์

ข้อมูลดิจิตอลที่อ่านได้ สามารถแปลงให้เป็นหน่วย %RH และองศาเซลเซียสได้ ตามสมการดังนี้

Humidity (%RH) = 14bit_HumidityData x 100 / (214-2)                            (1)
Temperature (◦C) = [14bit_TemperatureData x 165 / (214-2)] – 40              (2)

รูป  2-5  แสดงการเชื่อมต่อบอร์ด  aMG Sense Humidity/Temperature  กับ  aMG F4 Connect  โดยมี
ไฟเลี้ยง  GND  สาย  SDA  และ สายSCL  สำหรับการใช้งาน  Port I2C  บนบอร์ด  aMG F4 Connect  นั้น ผู้ใช้งานต้อง
เลือกใช้  I2C Module 1 และตั้งค่าการใช้งานขา PB7 สำหรับ SDA และขา PB8 สำหรับ SCL

รูป 2-5 การเชื่อมต่อระหว่าง aMG Sense Humiditiy/Temperature กับ aMG F4 Connect

รูป 2-5 การเชื่อมต่อระหว่าง aMG Sense Humiditiy/Temperature กับ aMG F4 Connect

การวัดค่าความชื้นและอุณหภูมิ

จุดประสงค์

  • เพื่อให้ผู้ใช้งานเข้าใจการสื่อสารแบบ I2C
  • เพื่อให้ผู้งานสามารถอ่านค่าความชื้นและอุณหภูมิจาก HIH6131 ได้
รูป 2-6 Simulink Model สำหรับอ่านค่าความชื้นและอุณหภูมิผ่านการสื่อสาร I2C

รูป 2-6 Simulink Model สำหรับอ่านค่าความชื้นและอุณหภูมิผ่านการสื่อสาร I2C

จากรูป 2‑6 แสดง Simulink Model สำหรับอ่านค่าความชื้นและอุณหภูมิจากเซนเซอร์ HIH6131 ผ่านการสื่อสารแบบ I2C และแสดงผลผ่านจอ LCD คำอธิบายการทำงานของมีดังนี้

  • การกำหนดค่า Slave Address โดยค่า Address ขนาด 7 บิตของ HIH6131 [2, p. 1] คือ 0x27 หรือ ‘0100111’ เมื่อนำมารวมกับบิต Read/Write จะได้ ‘01001110’ หรือ 0x4E
  • จากรูป 2‑2 สามารถนำมาเขียนเป็น Enable Subsystem block ชื่อ Request ดังรูป 2‑7 ซึ่งอุปกรณ์ Master ส่ง Address และคำสั่ง Write (ค่า 0x4E)
รูป 2-7 Enable Subsystem Model ของ Request

รูป 2-7 Enable Subsystem Model ของ Request

  • เมื่อทำการ Request แล้ว Subsystem Read ในรูป 2‑8 จะเริ่มทำงานโดยมีหน้าที่อ่านข้อมูลจากเซนเซอร์ให้ครบทั้ง 4 ไบต์ เมื่อการอ่านเสร็จจะทำการ Logic and Bit operation เพื่อแยกข้อมูลที่อ่านได้ออกเป็น สถานะของเซนเซอร์จำนวน 2 บิต ค่าความชื้นสัมพัทธ์ 14 บิต และค่าอุณหภูมิ 14 บิต
  • ข้อมูลดิจอลที่ได้จะนำไปแปลงเป็นค่าความชื้นสัมพัทธ์และอุณหภูมิตามสมการที่ได้กล่าวมา และนำไปแสดงผ่านจอแสดงผล LCD
รูป 2-8 Enable Subsystem Model สำหรับการอ่านค่าจากเซนเซอร์และการทำงานของ Binary Operation

รูป 2-8 Enable Subsystem Model สำหรับการอ่านค่าจากเซนเซอร์และการทำงานของ Binary Operation

รูป 2‑9 แสดงผลการทดลองการอ่านค่าความชื้นสัมพัทธ์และอุณหภูมิจากเซนเซอร์ HIH6131 ผ่านการสื่อสาร I2C แล้วแสดงผลผ่านจอ LCD โดยอัพเดตค่าทุกๆ 0.5 วินาที

รูป 2-9 ผลการทดลองการอ่านค่าความชื้นสัมพัทธ์และอุณหภูมิจากเซนเซอร์ HIH6163

รูป 2-9 ผลการทดลองการอ่านค่าความชื้นสัมพัทธ์และอุณหภูมิจากเซนเซอร์ HIH6163

ใน Waijung Blockset เวอร์ชั่น 13.12a มี Block สำหรับอ่านข้อมูลจากเซนเซอร์ HIH6131 ซึ่งอยู่ใน Simulink library: Waijung Blockset/Hardware Modules/aMG Sense Temp Humid รูป 2‑10 แสดงตัวอย่างการใช้งาน HIH6131 Block โดยผู้ใช้งานต้องวาง I2C Master Block บน Model หลัก ข้อมูลที่ได้จาก HIH6131 เป็นค่าความชื้นสัมพัทธ์และอุณหภูมิ ซึ่งผู้ใช้งานสามาถนำไปแสดงผลหรือบันทึกข้อมูลได้ทันที

รูป 2-10 Simulink Model สำหรับการอ่านค่าความชื้นสัมพัทธ์และอุณหภูมิ โดยใช้ HIH6131 Block

รูป 2-10 Simulink Model สำหรับการอ่านค่าความชื้นสัมพัทธ์และอุณหภูมิ โดยใช้ HIH6131 Block

การใช้งานเซนเซอร์วัดความดันอากาศ MPL3115A2

อุปกรณ์ที่ใช้ในการทดลอง

รูป 3-1 บอร์ด aMG Sense Pressure/Altitude

รูป 3-1 บอร์ด aMG Sense Pressure/Altitude

รูป 3‑1 แสดงบอร์ดวัดความดันอากาศและความสูง โดยใช้ติดตั้งเซนเซอร์รุ่น MPL3115A2 จากบริษัท Freescale ซึ่งมีคุณสมบัติ ดังนี้ [5]

  • ใช้ไฟเลี้ยงทำงานอยู่ในช่วง 1.95 ถึง 3.6V
  • ไฟเลี้ยงสำหรับข้อมูลดิจิตอล 1.6V ถึง 3.6V
  • สามารถวัดค่าต่างๆ ได้ดังนี้
    • ค่าความดันอากาศหน่วย Pa (ข้อมูลดิจิตอล 20 บิต) มีช่วงการวัด 20-110 kPa โดยมีความละเอียดในการวัด 0.25 Pa
    • หรือค่าความสูงเทียบระดับน้ำทะเล หน่วยเมตร (ข้อมูลดิจิตอล 20 บิต) โดยมีความละเอียดในการวัด 30 cm หรือ 1 ฟุต
    • ค่าอุณหภูมิ หน่วยองศาเซลเซียส (ข้อมูลดิจิตอล 12 บิต) มีช่วงการวัด -40 ถึง 85  ◦C โดยมีความแม่นยำ +/- 1 ◦C
  • ปรับความถี่ในการวัดได้สูงสุด 100 Hz
  • สื่อสารข้อมูลผ่าน I2C (ปรับความถี่สัญญาณนาฬิกาได้สูงสุด 400kHz)
  • สามารถบันทึกข้อมูล (Data Acquisition) ได้ทั้งหมด 32 ค่า โดยสามารถบันทึกได้ทุกๆ 1 วินาที ถึง 9 ชั่วโมง (ถ้าบันทึกข้อมูลทุกๆ 9 ชั่วโมงสามารถบันทึกได้ 12 วัน)

การกำหนดค่า Slave Address โดยค่า Address ขนาด 7 บิตของ MPL31152A คือ 0x60 [5, p. 6] หรือ ‘1100000’ เมื่อนำมารวมกับบิต Read/Write จะได้ ‘11000000’ หรือ 0xC0

Flow chart การใช้งานและอ่านค่าแบบ Polling แสดงในรูป [5, p. 12] โดยให้ค่าที่อ่านได้ให้เป็นค่าความดันอากาศ (ใช้งานเป็น Barometer [5, p. 32])

รูป 3-2 Flowchart การตั้งค่า Sensor และอ่านค่าแรงดันแบบ Polling

รูป 3-2 Flowchart การตั้งค่า Sensor และอ่านค่าแรงดันแบบ Polling

ข้อมูลค่าความดันอากาศและอุณหภูมิแบบดิจิตอล สามารถแปลงเป็นค่าความดันอากาศในหน่วย Pascal และ ค่าอุณหภูมิในหน่วยองศาเซลเซียสได้ ดังตัวอย่างการทดลองต่อไป

การวัดค่าความดันอากาศ

จุดประสงค์

  • เพื่อให้ผู้ใช้งานเข้าใจการสื่อสารแบบ I2C ได้ (อ่าน/เขียนข้อมูล โดยระบุ Address ของริจิสเตอร์ภายในของอุปกรณ์ Slave)
  • เพื่อให้ผู้งานสามารถอ่านค่าความดันอากาศจาก MPL3115A2 ได้
รูป 3-3 Simulink Model สำหรับอ่านค่าความดันอากาศผ่านการสื่อสาร I2C

รูป 3-3 Simulink Model สำหรับอ่านค่าความดันอากาศผ่านการสื่อสาร I2C

รูป 3‑3 แสดง Simulink Model สำหรับอ่านค่าความดันอากาศจากเซนเซอร์ MPL3115A2 ผ่านการสื่อสารแบบ I2C และแสดงผลผ่านจอ LCD ในตัวอย่างนี้จะอ่านค่าความดันอากาศและอ่านค่าแบบ Polling จึงต้องเริ่มจากตั้งค่าเริ่มต้นด้วย Subsystem Block ดังรูป 3‑4

รูป 3-4 Subsystem Model สำหรับตั้งค่าเริ่มต้นของเซนเซอร์ MPL3115A2

รูป 3-4 Subsystem Model สำหรับตั้งค่าเริ่มต้นของเซนเซอร์ MPL3115A2

Subsystem ในรูป 3‑4 จะตรวจสอบว่าเซนเซอร์ MPL3115A2 ตั้งค่าตรงกับรูป 3‑2 หรือไม่ (รีจิสเตอร์ 0x26 ของเซนเซอร์ต้องมีค่าเท่ากับ 0x39 และรีจิสเตอร์ 0x13 ต้องมีค่าเท่ากับ 0x07) ถ้าตั้งค่าได้ถูกต้องจะส่งสัญญาณ ON เพื่อเริ่มต้นการอ่านค่า หากไม่ถูกต้องจะทำการตั้งค่าโดยใช้คำสั่ง Write และต้องส่งค่าเป็นลำดับๆ ดังรูป 3‑5

รูป 3-5 Subsystem Model สำหรับกำหนดค่าเริ่มต้นเซนเซอร์ MPL3115A2 ด้วย I2C Master Write

รูป 3-5 Subsystem Model สำหรับกำหนดค่าเริ่มต้นเซนเซอร์ MPL3115A2 ด้วย I2C Master Write

เมื่อตั้งค่าเซนเซอร์เสร็จสิ้น จึงเริ่มทำการอ่านค่าความดันอากาศและอุณหภูมิดังรูป 3‑6 ซึ่งมีการระบุ Address ของรีจิสเตอร์ของเซนเซอร์ที่ต้องการอ่าน โดยเริ่มอ่านสถานะของเซนเซอร์ (อยู่ในรีจิสเตอร์ Address 0x00) จากนั้นอ่านค่าความดันอากาศ ซึ่งมีจำนวน 3 ไบต์ และค่าอุณหภูมิจำนวน 2 ไบต์ ตามลำดับ

รูป 3-6 Enable Subsystem Model สำหรับอ่านข้อมูลจากเซนเซอร์ MPL3115A2

รูป 3-6 Enable Subsystem Model สำหรับอ่านข้อมูลจากเซนเซอร์ MPL3115A2

เมื่อสถานะของเซนเซอร์มีข้อมูลใหม่พร้อมส่ง (DATA_VALID = 1) ค่าความดันอากาศที่อ่านได้ในรูปแบบข้อมูลดิจิตอล ซึ่งเป็นข้อมูล 20 บิตแบบไม่มีเครื่องหมาย (ค่าบวกเสมอ) โดยข้อมูล 18 บิตแรก ออกมาจาก P_MSB, P_CSB และบิตที่ 7-6 ของ P_LSB ส่วน 2 บิตสุดท้ายซึ่งอยู่ใน บิตที่ 5-4 ของ P_LSB แสดงค่าตำแหน่งทศนิยม [5, p. 23] ข้อมูลทั้งหมดนี้จะถูกแปลงเป็นค่าความดันอากาศในหน่วย Pascal ด้วย Convert Subsystem Block แสดงในรูป 3‑7  โดยรูป 3‑8 แสดงตัวอย่างการทำงานของ Convert Subsystem Block

รูป 3-7 Enable Subsystem Block สำหรับแปลงค่าความดันอากาศจากรูปแบบดิจิตอลให้เป็นหน่วย Pascal

รูป 3-7 Enable Subsystem Block สำหรับแปลงค่าความดันอากาศจากรูปแบบดิจิตอลให้เป็นหน่วย Pascal

สำหรับการแสดงผลอุณหภูมิจากเซนเซอร์ MPL31152A ผู้ใช้งานต้องสร้าง Subsystem Model สำหรับแปลงค่าอุณหภูมิที่อ่านได้ในรูปแบบข้อมูลดิจิตอล ซึ่งเป็นข้อมูล 12 บิตแบบ 2’s complement โดยข้อมูล 8 บิตแรก ออกมาจาก T_MSB ส่วน 4 บิตสุดท้ายซึ่งอยู่ใน บิตที่ 7-4 ของ T_LSB สำหรับแสดงจุดทศนิยม

รูป 3-8 ตัวอย่างการทำงานของ Convert Subsystem Block

รูป 3-8 ตัวอย่างการทำงานของ Convert Subsystem Block

รูป 3‑9 แสดงผลการทดลองการอ่านค่าความดันอากาศจากเซนเซอร์ MPL3115A2 ผ่านการสื่อสาร I2C แล้วแสดงผลผ่านจอ LCD

รูป 3-9 ผลการทดลองการอ่านค่าความดันอากาศจากเซนเซอร์ MPL3115A2 ผ่านการสื่อสาร I2C

รูป 3-9 ผลการทดลองการอ่านค่าความดันอากาศจากเซนเซอร์ MPL3115A2 ผ่านการสื่อสาร I2C

หากผู้ใช้ต้องการอ่านค่าความสูงเหนือระดับน้ำทะเล (Altitude) สามารถทำได้โดยตั้งค่าการทำงานเซนเซอร์ MPL3115A2 ให้เป็นแบบ Altimeter Model (รีจิสเตอร์ 0x26 ของเซนเซอร์ต้องมีค่าเท่ากับ 0xB9) จากนั้นสร้าง Subsystem Model สำหรับแปลงค่าความสูงเหนือระดับน้ำทะเลที่อ่านได้ในรูปแบบข้อมูลดิจิตอล ซึ่งเป็นข้อมูล 20 บิตแบบ 2’s complement (มีค่าบวกและลบ) โดยข้อมูล 16 บิตแรก ออกมาจาก P_MSB และ P_CSB ส่วนบิตที่ 7-4 ของ P_LSB แสดงค่าตำแหน่งทศนิยม (ความละเอียด 0.0625 m) [5, p. 23]

ใน Waijung Blockset เวอร์ชั่น 13.12a มี Block สำหรับอ่านข้อมูลจากเซนเซอร์ MPL3115A2 ซึ่งอยู่ในSimulink library: Waijung Blockset/Hardware Modules/aMG Sense Pressure รูป 3‑10 แสดงตัวอย่างการใช้งาน MPL3115A2 Block โดยผู้ใช้งานต้องวาง I2C Master Block บน Model หลัก ข้อมูลที่ได้จาก MPL3115A2 Block เป็นค่าความดันอากาศ ซึ่งผู้ใช้งานสามาถนำไปแสดงผลหรือบันทึกข้อมูลได้ทันที

รูป 3-10 Simulink Model สำหรับการอ่านค่าความดันอากาศ โดยใช้ MPL3115A2 Block

รูป 3-10 Simulink Model สำหรับการอ่านค่าความดันอากาศ โดยใช้ MPL3115A2 Block

การใช้งานเซนเซอร์วัดความเข้มแสง MAX44009

อุปกรณ์ที่ใช้ในการทดลอง

ในบทเรียนการใช้งานสัญญาณอนาล็อก [6] ได้แสดงตัวอย่างการอ่านค่าแรงดันจากเซนเซอร์ LDR ซึ่งจะมีค่าความต้านทานแปรผันกับความเข้มของแสง อย่างไรก็ตาม เซนเซอร์ LDR ไม่เหมาะสำหรับนำมาประยุกต์ใช้งานการวัดความเข้มของแสง เนื่องจากการแปลงค่าแรงดันที่อ่านได้ให้เป็นหน่วยความเข้มแสง Lux ขึ้นอยู่กับแรงดันไฟเลี้ยงและค่าความต้านทานที่มีความคาดเคลื่อนจากอุณหภูมิภายนอก

รูป 4-1 aMG Sense Light2

รูป 4-1 aMG Sense Light2

รูป 4‑1 แสดงบอร์ด aMG Sense Light2 สำหรับวัดความเข้มแสงและส่งข้อมูลผ่าน I2C ใช้ติดตั้งเซนเซอร์รุ่น MAX44009 จากบริษัท Maxis Integrated ซึ่งมีคุณสมบัติดังนี้

  • เซนเซอร์มีขนาดเล็ก 2mm x 2mm x 0.6mm
  • ไฟเลี้ยง 1.7V ถึง 3.6V ใช้กระแสเพียง 0.65 uA
  • ช่วงความเข้มของแสง: 0.045 Lux ถึง 188,000 Lux

ผู้ใช้งานสามารถเลือก Slave Address ของ MAX44009 ได้โดยเลือกต่อไฟเลี้ยง (VDD) หรือกราวน์ (GND) ที่ขา A0 (Pin3) ของ MAX44009 เมื่อต่อกับไฟเลี้ยง Address เท่ากับ 0x96 เมื่อต่อกับกราวน์ Address เท่ากับ 0x94

รูป 4-2 แผนผัง Slave Address ของ MAX44009 [7, p. 16]

รูป 4-2 แผนผัง Slave Address ของ MAX44009 [7, p. 16]

เมื่อต้องการอ่านข้อมูลจากเซนเซอร์ ผู้ใช้ต้องทำการอ่านจาก I2C โดยระบุ Address ของ Register ภายใน MAX44009 ดังรูป 4‑3 จะเห็นได้ว่าค่าความเข้มของแสงที่วัดได้ในรูปแบบดิจิตอลอยู่ใน Address 0x03 และ 0x04 โดยแสดงเป็นเลขชี้กำลังของ Exponential [E3–E0] และ ค่า Mantissa [M7-M0] ค่าความเข้มแสงในหน่วย Lux สามารถหาได้จากสมการดังนี้

Lux = 2(Exponent) x mantissa x 0.045

โดย     Exponent = 23xE3 + 22xE2 + 21xE1 + 20xE0

            Mantissa = 27xM7 + 26xM6 + 25xM5 + 24xM4 + 23xM3 + 22xM2 + 21xM1 + 20xM0

รูป 4-3 แผนผัง Register Address ภายในของ MAX44009 [7, p. 7]

รูป 4-3 แผนผัง Register Address ภายในของ MAX44009 [7, p. 7]

การอ่านค่าความเข้มแสง MAX44009

จุดประสงค์

  • เพื่อให้ผู้ใช้งานสามารถอ่านค่าความเข้มแสงจาก MAX44009 ได้
รูป 4-4 Simulink Model สำหรับอ่านค่าความเข้มแสงผ่านการสื่อสาร I2C

รูป 4-4 Simulink Model สำหรับอ่านค่าความเข้มแสงผ่านการสื่อสาร I2C

เมื่อ Download Model ลงใน STM32F4Discovery จึงเริ่มทำการอ่านค่าความเข้มชองแสง ซึ่งมีการระบุ Address ของรีจิสเตอร์ของเซนเซอร์ที่ต้องการอ่าน โดยเริ่มอ่านค่าที่ตั้งไว้ของเซอร์ (Register Address 0x02) จากนั้นอ่านค่าความเข้มของแสดง ซึ่งมีจำนวน 2 ไบต์ ซึ่งอยู่ใน Register Address 0x03 และ 0x04 ตามลำดับ

จากนั้นข้อมูลที่อ่านได้แปลงเป็นหน่วย Lux โดยใช้ Subsystem Model ดังรูป 4‑5 เนื่องจาก Simulink Block สำหรับเลขยกกำลังยังทำงานไม่ได้กับ GNU compiler ดังนั้นผู้ใช้งานควรใช้ custom code Block ()หรือ MATLAB Function Block ตัวอย่างนี้ใช้ MATLAB Function Block ซึ่งอยู่ใน Simulink library: Simulink/User-Defined Functions

รูป 4-5 Subsystem สำหรับแปลงข้อมูลดิจิตอลเป็นหน่วย Lux

รูป 4-5 Subsystem สำหรับแปลงข้อมูลดิจิตอลเป็นหน่วย Lux

รูป 4‑6 แสดงผลการทดลองการค่าความเข้มของแสงจากเซนเซอร์ MAX44009 โดยทำการอ่านค่าทุกๆ 1 วินาที ค่าความเข้มแสง Lux จะเพิ่มขึ้นเมื่ออยู่ในที่สว่างมาก (สูงสุด 188,000 Lux เมื่อได้รับแสงอาทิตย์โดยตรง)

รูป 4-6 ผลการทดลองการอ่านค่าความเข้มแสงจากเซนเซอร์ MAX44009

รูป 4-6 ผลการทดลองการอ่านค่าความเข้มแสงจากเซนเซอร์ MAX44009

ใน Waijung Blockset เวอร์ชั่น 13.12a มี Block สำหรับอ่านข้อมูลจากเซนเซอร์ MAX44009 ซึ่งอยู่ในSimulink library: Waijung Blockset/Hardware Modules/aMG Sense Light รูป 4‑7 แสดงตัวอย่างการใช้งาน MAX44009 Block โดยผู้ใช้งานต้องวาง I2C Master Block บน Model หลัก ข้อมูลที่ได้จาก MAX44009 Block เป็นค่าความเข้มแสง ผู้ใช้งานสามาถนำไปแสดงผลหรือบันทึกข้อมูลได้ทันที

รูป 4-7 Simulink Model สำหรับการอ่านค่าความเข้มแสง โดยใช้ MAX44009 Block

รูป 4-7 Simulink Model สำหรับการอ่านค่าความเข้มแสง โดยใช้ MAX44009 Block

การใช้งานโมดูลนาฬิกาดิจิตอล DS3231

เวลา คือสิ่งสมมุติที่มนุษย์กำหนดขึ้น เพื่อให้รู้จักอดีต ปัจจุบันและอนาคต การดำเนินชีวิตของมนุษย์เกี่ยวข้องกับเวลาทั้งสิ้น บันทึกเหตุการณ์ต่างๆในอดีตและปัจจุบัน รวมถึงการวางแผนงานในอนาคต หน่วยของเวลาที่ใช้กันมีหลายปริมาณ โดยหน่วยที่เล็กที่สุดของเวลาคือ วินาที เมื่อครบ 60 วินาทีจะเท่ากับ 1 นาที  เมื่อครบ 60 นาที เท่ากับ 1 ชั่วโมง และ 24 ชั่วโมงเท่ากับ 1 วัน ซึ่งเป็นระบบที่กำหนดขึ้นตั้งแต่สมัยอารยธรรมสุเมเรียน จนถึงสมัยโรมันได้มีการกำหนดหน่วยของเวลาเพิ่มคือ เดือนและปี โดย 30 หรือ 31 วันจะเท่ากับ 1 เดือน และ 12 เดือนเท่ากับ 1 ปี ทั้งหมดนี้จะมีความสัมพันธ์กับการขึ้นลงของดวงอาทิตย์และการหมุนของโลก

ระบบ SI ได้กำหนดนิยามของหน่วย 1 วินาที มีค่าเท่ากับ ระยะเวลาที่เกิดการแผ่รังสีกลับไปมาระหว่างอะตอมซีเซียม-133 สองอะตอม เป็นจำนวน 9,192,631,770 ครั้ง (ไป-กลับ นับเป็น 1 ครั้ง) ที่อุณหภูมิ 0 เคลวินและอยู่ในสถานะพื้น ในงานอิเลคโทรนิค นิยมใช้วงจรคริสตัลซึ่งมีผลึกคริสตัลภายในที่สั่นด้วยแรงกล เพื่อสร้างความถี่ที่กำหนดไว้สัญญาณที่มีความถี่คงที่ (ส่วนมากมีความถี่สูง) จะนำไปใช้ในอุปกรณ์หลายชนิดเช่น ซีพียูของคอมพิวเตอร์และไมโครคอนโทรลเลอร์ เพื่อกำหนดจังหวะการทำงาน วงจรคริสตัลเป็นที่นิยมมากเนื่องจากมีผลกระทบจากอุณหภูมิภายนอกน้อยมาก จึงสร้างสัญญาณความถี่ได้แม่นยำ

ฐานเวลาเป็นสิ่งจำเป็นในระบบคอมพิวเตอร์ส่วนบุคคล โดยเฉพาะ การจัดเก็บข้อมูลที่ต้องระบุวันที่ เดือนและปี เช่นเดียวกัน ฐานเวลาสามารถนำไปใช้งานในระบบสมองกลฝังตัวขนาดเล็กได้ ยกตัวอย่างเช่น การเก็บบันทึกข้อมูลจากเซนเซอร์ต่างๆ พร้อมวัน เดือน ปีที่บันทึก หรือระบบตั้งเวลาเพื่อเปิด-ปิดอุปกรณ์อัตโนมัติ

อุปกรณ์ที่ใช้ในการทดลอง

รูป 5-1 aMG High Precision RTC

รูป 5-1 aMG High Precision RTC

รูป 5‑1 แสดงบอร์ด aMG High Precision RTC โดยมีไอซีรุ่น DS3231 จากบริษัท Maxim Integrated ซึ่งเป็นโมดูลนาฬิกาดิจิตอล การทำงานของโมดูลมีวงจรคริสตัลภายในสำหรับสร้างสัญญาณความถี่ 32kHz ซึ่งนำมาใช้นับเวลาจากวินาที นาที ชั่วโมง วัน เดือนและปี นอกจากนี้มีปฏิทินภายในเพื่อปรับวันที่ตามปีอธิกสุรทิน (1 ปี = 366 วัน) ไปจนถึงปี 2100 [8, p. 1] ข้อมูลทั้งหมดส่งผ่านการสื่อสาร I2C โมดูลสามารถต่อแบตเตอรี่สำรองเพื่อรักษาข้อมูลและยังนับเวลาต่อได้ แม้ว่าไฟเลี้ยงหลักของ Microcontroller จะดับ

Slave device address ของไอซี DS3231 คือ 0xD0 [8, p. 17]   เมื่อต้องการอ่านนาฬิกาและปฏิทิน ผู้ใช้ต้องทำการอ่านจาก I2C โดยระบุ Address ของ Register ภายใน DS3231 ดังรูป 5‑2 โดย Address ที่ 0x00 ถึง 0x06 จะเก็บข้อมูลนาฬิกาและวันเดือนปีตามลำดับ ซึ่งข้อมูลทั้งหมดเป็นรูปแบบ Binary-coded Decimal (BCD)

รูป 5-2 แผนผังหน่วยความจำภายในโมดูลนาฬิกาดิจิตอล DS3231 [8, p. 11]

รูป 5-2 แผนผังหน่วยความจำภายในโมดูลนาฬิกาดิจิตอล DS3231 [8, p. 11]

การตั้งค่าเวลาโมดูลนาฬิกาดิจิตอล DS3231

ใน Simulink Library: Waijung Blockset/Hardware Modules/aMG High Precision RTC ประกอบด้วย Block ต่างๆ สำหรับติดต่อ DS3231 ผ่าน I2C มีดังนี้

วิธีการใช้งาน DS3231 Configure Block

หลังจากใส่แบตเตอรี่สำรองหรือเริ่มต้นใช้งาน DS3231 เป็นครั้งแรก เลขนาฬิกาและวันที่ตามปฏิทินจะมีค่าเท่ากับ 01/01/00 00:00:00 (วัน/เดือน/ปี ชั่วโมง:นาที:วินาที) ดังนั้นจึงต้องมีการตั้งค่านาฬิกา เพื่อให้ตรงกับเวลาที่ใช้งานจริง DS3231 Configure Block ดังรูป 5‑3 เป็น Subsystem Block ที่รวม DS3231 Blockset ต่างๆ เพื่อให้ผู้ใช้งานสามารถตั้งค่าเวลาด้วยปุ่มกด (สัญญาณดิจิตอล)

รูป 5-3 DS3231 Configure Block

รูป 5-3 DS3231 Configure Block

พอร์ตอินพุตของ DS3231 Configure Block มีหน้าที่ดังนี้

  • Port SlvAddr, ต่อกับ DS3231 Slave Address ซึ่งมีค่าเท่ากับ 0xD0
  • Port (+)UP รับสัญญาณดิจิตอลจากปุ่มกด เพื่อเพิ่มค่า +1
  • Port (-)DOWN รับสัญญาณดิจิตอลจากปุ่มกด เพื่อเพิ่มค่า -1
  • Port (*)MODE, รับสัญญาณดิจิตอลจากปุ่มกด เพื่อเลือกโหมดการทำงานตั้งค่านาฬิกา สัญญาณดิจิตอลต้อง Debounce ประมาณ 3 วินาที เพื่อเปลี่ยนโหมดการทำงาน

พอร์ตเอาน์พุตของ DS3231 Configure Block มีหน้าที่ดังนี้

  • Port Status ใช้แสดงสถานะของการตั้งค่านาฬิกา มีดังนี้

Status

คำอธิบาย

0

ผู้ใช้งานสามารถปรับค่า วันที่ (1 ถึง 30 หรือ 31) ของโมดูลนาฬิกาดิจิตอลได้

1

ผู้ใช้งานสามารถปรับค่า เดือน (1 ถึง 12) ของโมดูลนาฬิกาดิจิตอลได้

2

ผู้ใช้งานสามารถปรับค่า ปี (0 ถึง 99) ของโมดูลนาฬิกาดิจิตอลได้

3

ผู้ใช้งานสามารถปรับค่า ชั่วโมง (0 ถึง 23) ของโมดูลนาฬิกาดิจิตอลได้

4

ผู้ใช้งานสามารถปรับค่า นาที (0 ถึง 59) ของโมดูลนาฬิกาดิจิตอลได้

5

ผู้ใช้งานสามารถปรับค่า เดือน (0 ถึง 59) ของโมดูลนาฬิกาดิจิตอลได้
  • Port Enable ใช้แสดงสถานะของการตั้งค่านาฬิกา โดยจะเปิด – ปิด เมื่อสัญญาณดิจิตอลค้างประมาณ 3 วินาที

ตัวอย่างการตั้งค่าเวลาโมดูลนาฬิกาดิจิตอล DS3231

จุดประสงค์

  • เพื่อให้ผู้ใช้งานสามารถตั้งค่าเริ่มต้นโมดูลนาฬิกาดิจิตอล DS3231 ได้
รูป 5-4 Simulink Model สำหรับตั้งค่าเริ่มต้นของโมดูลนาฬิกา DS3231

รูป 5-4 Simulink Model สำหรับตั้งค่าเริ่มต้นของโมดูลนาฬิกา DS3231

เมื่อ Download Model ลงใน Microcontroller  ผู้ใช้สามารถตั้งเวลา โดยมีขั้นตอนดังนี้

  1. หลังจาก Download เสร็จสิ้น บรรทัดแรกของจอแสดงผล LCD จะแสดงค่าวันเดือนปี และบรรทัดที่สองแสดง นาฬิกาปัจจุบัน
  2. เมื่อต้องการตั้งค่าเวลา กดปุ่ม Mode (SW3) ค้างประมาณ 3 วินาที ตัวเลขบนจอแสดงผล LCD จะกระพริบ เมื่อเข้าสู่โหมดตั้งค่านาฬิกา.
  3. กดปุ่ม UP (SW1) หรือ DOWN (SW2) เพื่อเพิ่มหรือลดค่า
  4. กดปุ่ม Mode (SW3) อีกครั้ง เพื่อเลือกค่าที่ต้องการจะปรับ โดยเปลี่ยนตำแหน่งเป็นลำดับ (LCD จะเปลี่ยนตำแหน่งการกระพริบ) วันที่ -> เดือน -> ปี -> ชั่วโมง -> นาที และวินาที
  5. เมื่อต้องการออกจากโหมดตั้งค่า กดปุ่ม Mode (SW3) ค้างประมาณ 3 วินาทีอีกครั้ง จนกว่าไม่มีตัวเลขกระพริบบนหน้าจอแสดงผล LCD จากนั้นจอแสดงผล LCD จะแสดงนาฬิกาที่ตั้งไว้

การอ่านค่าเวลา วันเดือนปี จากโมดูลนาฬิกาดิจิตอล DS3231

จุดประสงค์

  • เพื่อให้ผู้ใช้งานสามารถอ่านค่าเวลา วันเดือนปีจากโมดูลนาฬิกาดิจิตอล DS3231
  • เพื่อให้ผู้ใช้งานสามารถประยุกต์การใช้งานจากโมดูลนาฬิกาดิจิตอล DS3231

วิธีการใช้งาน  DS3231 Get Date/Get Time Block

เมื่อใส่แบตเตอรี่สำรองและตั้งค่าเวลาโมดูลนาฬิกาดิจิตอลแล้ว ผู้ใช้งานสามารถอ่านเวลาและวันเดือนปีได้ ด้วย DS3232 Get Time และ DS3232 Get Date ตามลำดับ รูป 5‑5 แสดงลักษณะ Blockset สำหรับอ่านค่าเวลาและวันเดือนปีจาก DS3232 ผ่านการสื่อสาร I2C ดังนั้นผู้ใช้งานต้องวาง I2C Master Block บน Model หลัก

รูป 5-5 (a) DS3231 Get Time Block, (b) DS3231 Get Date Block

รูป 5-5 (a) DS3231 Get Time Block, (b) DS3231 Get Date Block

DS3231 Get Time Block แสดงค่าเวลาที่อ่านได้จากโมดูลนาฬิกาดิจิตอล DS3231 มีดังนี้

  • Status แสดงสถานะของการอ่าน I2C
  • Hour แสดงหน่วยชั่วโมง ค่าอยู่ในช่วง 0 ถึง 11 (AM/PM) หรือ 0 ถึง 23 (24ชั่วโมง)
  • Minute แสดงหน่วยนาที ค่าอยู่ในช่วง 0 ถึง 59
  • Second แสดงหน่วยวินาที ค่าอยู่ในช่วง  0 ถึง 59
  • AM/PM แสดงช่วงเวลา โดยค่าเท่ากับ 0 หมายถึงช่วง AM และ 1 หมายถึงช่วงPM

DS3231 Get Date Block แสดงค่าวันเดือนปีตามปฏิทินที่อ่านได้จากโมดูลนาฬิกาดิจิตอล DS3231 มีดังนี้

  • Status แสดงสถานะของการอ่าน I2C
  • Day แสดงหน่วยวัน ค่าอยู่ในช่วง 1 ถึง 7 ซึ่งผู้ใช้งานสามารถนำมาประยุกต์ให้แสดงผลเป็นวันจนทร์ถึงวันศุกร์ได้
  • Date แสดงหน่วยวันที่ ค่าอยู่ในช่วง 1 ถึง 31 ขึ้นอยู่กับเดือนที่อ่านได้
  • Month แสดงหน่วยเดือน ค่าอยู่ในช่วง  1 ถึง 12 ซึ่งผู้ใช้งานสามารถนำมาประยุกต์ให้แสดงผลเป็นเดือนมกราคมถึงเดือนธันวาคมได้
  • Year แสดงหน่วยปี ค่าอยู่ในช่วง 0 ถึง 99

ตัวอย่างการอ่านค่าเวลา วันเดือนปี จากโมดูลนาฬิกาดิจิตอล DS3231

รูป 5-6 Simulink Model สำหรับอ่านค่าเวลา วันเดือนปีจากโมดูลนาฬิกาดิจิตอล DS3231

รูป 5-6 Simulink Model สำหรับอ่านค่าเวลา วันเดือนปีจากโมดูลนาฬิกาดิจิตอล DS3231

รูป 5‑6 แสดง Simulink Model สำหรับอ่านนาฬิกา และวันเดือนปีจากโมดูลนาฬิกาดิจิตอล โดยเพิ่มเติ่มส่วนการควบคุมการเปิดปิดของอุปกรณ์ภายนอกด้วยนาฬิกา และเปลี่ยนรูปแบบการแสดงผลวันเดือนปี

เมื่อ Download Model ลงใน Microcontroller หน้าจอแสดงผล LCD แสดงปฏิทิน โดย Month Character Subsystem Block ดังรูป 5‑7 จะรับค่าเดือน และแสดงในรูปแบบเป็นภาษาอังกฤษ เช่น ค่าที่อ่านได้จาก Month เท่ากับ 2 จอแสดงผลจะแสดงเป็น Feb เป็นต้น

รูป 5-7 Subsystem สำหรับปรับรูปแบบแสดงผล เดือน ให้เป็นภาษาอังกฤษ

รูป 5-7 Subsystem สำหรับปรับรูปแบบแสดงผล เดือน ให้เป็นภาษาอังกฤษ

นอกจากนี้ผู้ใช้งานสามารถประยุกต์ DS3231 ให้ทำงานแบบ Timer เพื่อควบคุบการเปิดปิดอุปกรณ์ภายนอก เช่น เมื่อค่าที่อ่านได้จาก Hour มีค่าอยู่ระหว่าง 12 และ 13 สัญญาณดิจิตอลเอาน์พุตที่ขา PD12 จะ ON ดังนั้นหลอด LED1 จะติดช่วง 12:00:00 ถึง 12:59:59 ดังรูป 5‑8

รูป 5-8 ผลการทดลองการอ่านค่านาฬิกาจากโมดูลนาฬิกา DS3231 และควบคุมการเปิด-ปิดหลอด LED

รูป 5-8 ผลการทดลองการอ่านค่านาฬิกาจากโมดูลนาฬิกา DS3231 และควบคุมการเปิด-ปิดหลอด LED

การตั้งค่าเวลา วันเดือนปี จากโมดูลนาฬิกาดิจิตอล DS3231

จุดประสงค์

  • เพื่อให้ผู้ใช้งานสามารถตั้งค่าค่าเวลา วันเดือนปีให้กับโมดูลนาฬิกาดิจิตอล DS3231 ได้
  • เพื่อให้ผู้ใช้งานสามารถประยุกต์การตั้งนาฬิกาให้กับ DS3231 ผ่านการสื่อสาร UART ได้

วิธีการใช้งาน  DS3231 Set Date/Set Time Block

เมื่อตั้งค่าเวลาโมดูลนาฬิกาดิจิตอล ผู้ใช้งานสามารถตั้งค่าเวลาและวันเดือนปีได้ด้วย DS3232 Set Time และ DS3232 Set Date Block ตามลำดับ รูป 5‑9 แสดงลักษณะ Blockset สำหรับตั้งค่าเวลาและวันเดือนปีจาก DS3232 ผ่านการสื่อสาร I2C โดยผู้ใช้กำหนดเวลาวันเดิอนปีที่ต้องการและต่อเข้ากับพอร์ต Input ของ Block

รูป 5-9 (a) DS3231 Set Time Block, (b) DS3231 Set Date Block

รูป 5-9 (a) DS3231 Set Time Block, (b) DS3231 Set Date Block

DS3231 Set Time Block รับค่าเวลาที่ต้องการกำหนด แล้วส่งไปยังโมดูลนาฬิกาดิจิตอล DS3231 โดยแบ่งเป็นหน่วย ดังนี้

  • Hour กำหนดค่าชั่วโมง ค่าอยู่ในช่วง 0 ถึง 11 (AM/PM) หรือ 0 ถึง 23 (24ชั่วโมง)
  • Minute กำหนค่านาที ค่าอยู่ในช่วง 0 ถึง 59
  • Second กำหนดค่าวินาที ค่าอยู่ในช่วง  0 ถึง 59

DS3231 Set Date Block รับค่าวันเดือนปีที่ต้องการกำหนด แล้วส่งไปยังโมดูลนาฬิกาดิจิตอล DS3231 โดยแบ่งเป็นหน่วย ดังนี้

  • Date กำหนดค่าวันที่ ค่าอยู่ในช่วง 1 ถึง 31
  • Month กำหนดค่าเดือน ค่าอยู่ในช่วง  1 ถึง 12
  • Year กำหนดค่าปี ค่าอยู่ในช่วง 0 ถึง 99

ตัวอย่างการตั้งค่าเวลา วันเดือนปี ผ่านการสื่อสาร UART

เพื่อให้เข้าใจง่ายสำหรับการทดลองนี้ ผู้ใช้งานควรศึกษาหัวข้อ การควบคุม Peripheral ต่างๆ ผ่าน Serial Communication

รูป 5-10 Simulink Model สำหรับตั้งนาฬิกาและวันเดือนปีให้กับ DS3231 ผ่านการสื่อสาร UART

รูป 5-10 Simulink Model สำหรับตั้งนาฬิกาและวันเดือนปีให้กับ DS3231 ผ่านการสื่อสาร UART

เมื่อ Download Model ในรูป 5‑10 ลง Microcontroller จอแสดงผล LCD จะแสดงเวลาและวันที่อ่านได้จากโมดูล DS3231 เมื่อต้องการตั้งนาฬิกา บนหน้าต่าง Terminal ของโปรแกรมเช่น TeraTerm หรือ Putty ผู้ใช้งานต้องพิมพ์คำสั่ง T=ชั่วโมง:นาที แล้วกดปุ่ม Enter เพื่อ Activate Subsystem ในรูป 5‑11 หลังจากนั้นจะให้ข้อความ OK เพื่อตอบรับว่า การตั้งนาฬิกาเสร็จสิ้นแล้ว และจอ LCD จะแสดงนาฬิกาที่ตั้งใหม่

รูป 5-11 Subsystem Model สำหรับตั้งค่านาฬิกา

รูป 5-11 Subsystem Model สำหรับตั้งค่านาฬิกา

เมื่อต้องการตั้งปฏิทิน ผู้ใช้งานต้องพิมพ์คำสั่ง D=วันที่-เดือน-ปี แล้วกด Enter เพื่อ Activate Subsystem ในรูป 5‑12 Subsystem Model สำหรับตั้งปฏิทิน หลังจากนั้นจะให้ข้อความ OK เพื่อตอบรับว่า การตั้งปฏิทินเสร็จสิ้นแล้ว และจอ LCD จะแสดงวันเดือนปีที่ตั้งใหม่

รูป 5-12 Subsystem Model สำหรับตั้งปฏิทิน

รูป 5-12 Subsystem Model สำหรับตั้งปฏิทิน

รูป 5‑13 แสดงอุปกรณ์ที่ใช้ในการทดลองนี้ โดย Microcontroller จะเชื่อมต่อกับ Computer ผ่านบอร์ด aMG USB Converter-N Adapter ในเบื้องต้น หากไม่ใส่แบตเตอรี่สำรองโมดูลนาฬิกาจะแสดงวันที่ 1 เดือนมกราคม ปี 2000 และเริ่มนับนาฬิกาจากเวลา 0:00

รูป 5-13 การเตรียมอุปกรณ์สำหรับการทดลองตั้งค่านาฬิกา ด้วยคอมพิวเตอร์

รูป 5-13 การเตรียมอุปกรณ์สำหรับการทดลองตั้งค่านาฬิกา ด้วยคอมพิวเตอร์

รูป 5‑14 แสดงผลการตั้งค่านาฬิกา หลังจากพิมพ์คำสั่งในโปรแกรม Teraterm ซึ่งเป็นโปรแกรมสำหรับสื่อสารผ่านพอร์ตอนุกรมในคอมพิวเตอร์ ผู้ใช้งานสามารถเลือกตั้งค่านาฬิกาหรือปฏิทินได้ เมื่อตั้งค่านาฬิกาเสร็จ หน่วยวินาทีจะเริ่มนับจาก 0 วินาทีทุกครั้ง

รูป 5-14  ผลการทดลองการตั้งค่านาฬิกาผ่านการสื่อสาร UART

รูป 5-14 ผลการทดลองการตั้งค่านาฬิกาผ่านการสื่อสาร UART

การอ่านค่าอุณหภูมิจากโมดูล DS3231

จุดประสงค์

  • เพื่อให้ผู้ใช้งานสามารถอ่านอุณหภูมิจากโมดูลนาฬิกาดิจิตอล DS3231

โมดูลนาฬิกาดิจิตอล DS3231 ได้ติดตั้งเซนเซอร์วัดอุณหภูมิไว้ภายใน เพื่อลดความคลาดเคลื่อนของวงจรคริสตัลที่เกิดจากอุณหภูมิภายนอก จึงทำให้สัญญาณสำหรับนับนาฬิกามีความแม่นยำมากที่สุด รูป 5‑15 แสดงการวัดอุณหภูมิจาก DS3231 โดยใช้ DS3231 Temperature Block ซึ่งอยูใน Simulink Library: Waijung Blockset/Hardware Modules/aMG High Precision RTC เช่นกัน

รูป 5-15 Simulink Model สำหรับการอ่านอุณหภูมิจาก DS3231 ผ่านการสื่อสาร I2C

รูป 5-15 Simulink Model สำหรับการอ่านอุณหภูมิจาก DS3231 ผ่านการสื่อสาร I2C

เมื่อ Download Model ลงใน Microcontroller แล้วหน้าจอแสดงผล LCD จะแสดงสถานะ และอุณหภูมิที่วัด โดยมีความแม่นยำ +/-3 องศาเซลเซียส [8, p. 1]

รูป 5-16 ผลการทดลองการวัดอุณหภูมิจาก DS3231 ผ่านการสื่อสาร I2C

รูป 5-16 ผลการทดลองการวัดอุณหภูมิจาก DS3231 ผ่านการสื่อสาร I2C

ตัวอย่างการต่ออุปกรณ์ I2C แบบบัส

จุดประสงค์

  • เพื่อให้ผู้ใช้งานสามารถเชื่อมต่อและอ่านข้อมูลจากอุปกรณ์ I2C ที่ต่อพ่วงกันแบบบัสได้

ตัวอย่างนี้ เป็นการแนะนำสร้างชุดเซนเซอร์สำหรับวัดความชื้น อุณหภูมิ ความดันอากาศและความเข้มของแสง ได้พร้อมกัน โดยเชื่อมสาย SCL และ SDA ของบอร์ด aMG Sense Humidity/Temperature, aMG Sense Pressure/Altitude และ aMG Sense Light2 เข้าด้วยกันแบบบัส ดังรูป 6‑1

รูป 6-1 การเชื่อมต่อชุดเซนเซอร์สำหรับวัดความชื้น อุณหภูมิ ความดันอากาศและความเข้มของแสง

รูป 6-1 การเชื่อมต่อชุดเซนเซอร์สำหรับวัดความชื้น อุณหภูมิ ความดันอากาศและความเข้มของแสง

รูป 6‑2 แสดง Simulink Model สำหรับวัดความชื้น อุณหภูมิ ความดันอากาศและความเข้มของแสง ด้วยการสื่อสาร I2C และแสดงผลผ่านจอ LCD นอกจากนี้ โมดูลนาฬิกาดิจิตอล DS3231 นำมาเชื่อมบนบอร์ด aMG F4 Connect เพื่อแสดงวันเดือนปี และเวลาที่วัดข้อมูล โดยข้อมูลทั้งหมดจะ Update ทุกๆ 0.5 วินาที ในModel ประกอบด้วย

  1. HIH6131 Block สำหรับวัดความชื้นและอุณหภูมิ
  2. MPL3115A2 Block สำหรับวัดความดันอากาศ
  3. MAX44009 Block สำหรับวัดความเข้มแสง
  4. DS3231 Get Time และ DS3231 Get Date Block สำหรับอ่านเวลาและปฏิทิน

หากถอดเซนเซอร์ตัวใดตัวหนึ่งออก จอแสดงผล LCD ยังคงแสดงผลค่าที่อ่านได้ล่าสุดของเซนเซอร์ตัวนั้น ในขณะที่ Model ยังทำการอ่านค่าจากเซนเซอร์ตามปกติ

รูป 6-2 Simulink Model สำหรับวัดความชื้น อุณหภูมิ ความดันอากาศและความเข้มของแสง

รูป 6-2 Simulink Model สำหรับวัดความชื้น อุณหภูมิ ความดันอากาศและความเข้มของแสง

รูป 6‑3 แสดงการทดลองการวัดค่าจากชุดเซนเซอร์ที่เชื่อมต่อการแบบระบบบัส ตามที่กล่าวมาในรูป 6‑1 เมื่อเชื่อมต่อไฟเลี้ยง 3.3V SCL SDA และขา GND จาก aMG F4 Connect ไปยังชุดเซนเซอร์ ข้อมูลค่าความชื้น อุณหภูมิ ความดันอากาศและความเข้มของแสงจะแสดงผลหน้าจอ LCD โดย update ข้อมูลทุกๆ 0.5 วินาทีนอกจากนี้ เมื่อติดตั้งโมดูลนาฬิกาดิจิตอล DS3231 ที่มีการตั้งค่านาฬิกาแล้ว บน aMG F4 Connect บรรทัดแรกของจอแสดงผล LCD จะแสดงวันที่และเวลาปัจจุบัน

รูป 6-3 ผลการทดลองการวัดค่าจากเซนเซอร์ และเวลา ผ่านการสื่อสาร I2C

รูป 6-3 ผลการทดลองการวัดค่าจากเซนเซอร์ และเวลา ผ่านการสื่อสาร I2C

เอกสารอ้างอิง

  1. STMicroelectronics, RM0090: STM32F40xxx Reference Manual [Online], 2013
  2. Honeywell, I2C Communication with the Honeywell HumidIcom Digital Humidity/Temperature Sensors [Online], 2012.
  3. Totolphase, I2C Background, . [Online]. Available: http://www.totalphase.com/support/articles/200349156#theory, [Accessed 31 October 2013]
  4. Honeywell, Using Alarms on the Honeywell Hunidlcom Digital Humidity/Temperature Sensors: HIH-6130/6131 Series [Online], 2012 .
  5. Freescale Semiconductor, Data Sheet: Advance information I2C Precision Altimeter [Online], 2012.
  6. Aimagin, การใช้งานอนาล็อก IO, 2013. [Online]. Available: http://aimagin.com/blog/adc-dac/?lang=th.
  7. Maxim Integrated, MAX44009 Industry’s Lowest-Power Ambient Light Sensor with ADC, 2011
  8. Maxim Integrated, DS3231 Extremely Accurate I2C-Integrated RTC/TCXO/Crystal, 2013.