[TH] ESP8266 MicroSD-Card Reader (Adapter)

บทความนี้เป็นตัวอย่างการใช้โมดูลอ่าน/เขียนการ์ดประเภท SD-Card เพื่อเก็บข้อมูลและอ่านข้อมูลในรูปแบบ JSON ซึ่งเป็นแนวทางสำหรับผู้อ่านบทความสามารถนำไปประยุกต์ใช้งานต่อไปในอนาคต

ภาพที่ 1

โมดูล SD-Card

ภาพที่ 2 โมดูล micro SD-Card Reader
ภาพที่ 3 โมดูล micro SD-Card Reader

โมดูล SD-Card ที่ทางทีมงานเราเลือกใช้ในครั้งนี้เป็นดังภาพที่ 2 และ 3 โดยโมดูลนี้เป็นบอร์ดที่มี Socket สำหรับเสียบ SD-Card หรือ MMC Card ผ่านทางบัส SPI

ภาพที่ 4 รายชื่อขาเชื่อมต่อของโมดูล MicroSD Card Reader

จากภาพที่ 4 จะพบว่า ขาสำหรับเชื่อมต่อที่ต้องใช้ได้แก่ขา

  1. Vcc สำหรับต่อแหล่งจ่ายไฟให้กับโมดูล ซึ่งโมดูลนี้ต้องการแรงดัน 5VDC
  2. GND สำหรับต่อกราวด์ของโมดูล
  3. CS สำหรับต่อกับขา CS ของบัส SPI เพื่อใช้สำหรับกำหนดให้โมดูลทำงานหรือไม่ทำงาน
  4. MOSI สำหรับต่อเข้ากับขา MOSI ของบัส SPI เพื่อใช้ส่งข้อมูลจากไมโครคอนโทรลเลอร์มาที่โมดูล SD-Card
  5. SCK สำหรับต่อเข้ากับขา SCK ของบัส SPI เพื่อใช้เป็นขาสัญญาณนาฬิกาของบัสสื่อสาร
  6. MISO สำหรับต่อเข้ากับขา MISO ของบัส SPI เพื่อใช้เป็นขาอ่านข้อมูลจากโมดูล SD-Card ไปให้กับบอร์ดไมโครคอนโทรลเลอร์

การเชื่อมต่อโมดูลกับ ESP8266

การเชื่อมต่อโมดูล SD-Card เข้ากับบอร์ด ESP8266 เป็นดังนี้

Micro SD Card ReaderESP8266 (NodeMCU)
VccVin หรือ 5VDC
CD (CS)D8 (GPIO15)
CMD (MOSI)D7 (GPIO13)
CLK (SCK)D5 (GPIO14)
DAT0 (MISO)D6 (GPIO12)
GNDGND
ภาพที่ 5
ภาพที่ 6

การใช้งานโมดูล SD-Card ต้องใช้งานไลบรารี sdcard.py ที่ทาง Adafruit ได้พัฒนาเอาไว้ โดยตัวอย่างการใช้งานมีขั้นตอนและเป็นดังโปรแกรม code8-1

#code8-1 : list
import sdcard, os
from machine import Pin, SPI
# กำหนดขา CS
sdCSPin = Pin(15)
# เลือกใช้ SPI พอร์ต 1
spi = SPI(1)
# สร้างวัตถุ sdcard
sd = sdcard.SDCard(spi, sdCSPin)
# เชื่อมต่อการ์ดเข้ากับโฟลเดอร์ /sd
os.mount(sd, '/sd')
# อ่านรายการไฟล์ในโฟลเดอร์ /sd
listFiles = os.listdir('/sd')
if len(listFiles) > 0:
    print("{file(s) in /sd}".format(listFiles))
else:
    print("no file!")
# ยกเลิกการเชื่อมต่อกับการ์ด
os.umount('/sd')
# ยกเลิกการใช้พอร์ต SPI
spi.deinit()

ก่อนรันโปรแกรมจะต้องดาวน์โหลด sdcard.py และอัพโหลดเข้าบอร์ด ESP8266 ก่อน มิฉะนั้นจะเกิดปัญหาการหาไฟล์ไลบรารีไม่พบ

JSON

MicroPython รองรับการใช้งาน JSON ผ่านทางคลังคลาส json โดยในตัวอย่างโปรแกรม code8-2 ทำการสร้างตัวแปรชื่อ devices เป็นตัวแปรประเภท dictionary หลังจากนั้นสร้างข้อมูล id ให้มีค่าเป็น 1 สร้างข้อมูล ‘board’ เป็นสตริงชื่อ ‘esp8266’ และสร้างข้อมูล “ios” สำหรับใช้เก็บหน้าที่ของขา อันได้แก่ ขา 4 ทำหน้าที่ “sda” ขา 5 ทำหน้าที่ “scl” ขา 12 ทำหน้าที่ “MISO” ขา 13 ทำหน้าที่ “MOSI” ขา 14 ทำหน้าที่ “SCK” ขา 15 ทำหน้าที่ “CS” หลังจากนั้นแปลงข้อมูล dictionary ให้เป็นสตริง แล้วแสดงผลสตริง สุดท้ายทดสอบแปลงสตริงให้กลับเป็นรูปของ dictionary อีกครั้งแล้วแสดงผลออกมา

ผลลัพธ์ = json.dumps( วัตถุ ) ทำหน้าที่แปลงวัตถุประเภท dictionary ให้เป็นสตริง
ผลลัพธ์ = json.loads( สตริง ) ทำหน้าที่แปลงสตริงให้เป็นวัตถุประเภท dictionary

# code8-2
import json
# สร้างตัวแปร dictionary เก็บข้อมูล
devices = {}
devices['id'] = 1
devices["board"] = "esp8266"
devices["ios"] = [{4:"sda",5:"scl",12:"MISO",13:"MOSI",14:"SCK",15:"CS"}]
# แปลงข้อมูล dictionary เป็น string
myProject = json.dumps(devices) 
print("myProject type:{},value:{}".format(type(myProject), myProject))
# แปลงสตริงกลับไปเป็น dictionary
data = json.loads(myProject)
print("data type:{},value:{}".format(type(data),data))

ตัวอย่างโปรแกรม

ตัวอย่างโปรแกรม code8-3 เป็นการเขียนโปรแกรมเพื่อนำ code8-2 จัดเก็บลงไฟล์ชื่อ me.json หลังจากนั้น อ่านข้อมูลจากไฟล์ me.json กลับขึ้นมา และแสดงผล

# code8-3
import json
import sdcard, os
from machine import Pin, SPI
# กำหนดขา CS
sdCSPin = Pin(15)
# เลือกใช้ SPI พอร์ต 1
spi = SPI(1)
# สร้างวัตถุ sdcard
sd = sdcard.SDCard(spi, sdCSPin)
# เชื่อมต่อการ์ดเข้ากับโฟลเดอร์ /sd
os.mount(sd, '/sd')
# สร้างตัวแปร dictionary เก็บข้อมูล
devices = {}
devices['id'] = 1
devices["board"] = "esp8266"
devices["ios"] = [{4:"sda",5:"scl",12:"MISO",13:"MOSI",14:"SCK",15:"CS"}]
# แปลงข้อมูล dictionary เป็น string
myProject = json.dumps(devices) 
# เขียน myProject ลง SD-Card
me = open('/sd/me.json','w')
me.write(myProject)
me.close()
# อ่านข้อมูลจากไฟล์
me = open('/sd/me.json','r')
text = me.read()
me.close()
# แปลงเป็น dictionary
data = json.loads(text)
# แสดงผล
print(data)
#สิ้นสุดการทำงาน
# ยกเลิกการเชื่อมต่อกับการ์ด
os.umount('/sd')
# ยกเลิกการใช้พอร์ต SPI
spi.deinit()

สรุป

จากบทความนี้ผู้อ่านจะสามารถเชื่อมต่อโมดูล SD-Card เข้ากับบอร์ด ESP8266 ผ่านทางการสื่อสารบัส SPI และเขียนโปรแกรมเพื่อเชื่อมต่อกับระบบไฟล์ของ SD-Card หรือ microSD-Card และเรียนรู้การใช้งาน JSON ซึ่งเปรียบเสมือนเครื่องมือจัดเก็บข้อมูล ทำให้เราสามารถแปลงข้อมูลแบบโครงสร้างให้เป็นสตริง และแปลงสตริงกลับมาเป็นข้อมูลแบบโครงสร้างได้ ซึ่งรายละเอียดเกี่ยวกับการใช้ dictionary สามารถอ่านเพิ่มเติมได้จากเอกสารเกี่ยวกับการเขียนโปรแกรมภาษาไพธอน

สุดท้ายนี้ทางทีม JarutEx หวังว่าบทความคงมีประโยชน์ต่อผู้ที่สนใจ และสามารถนำไปปรับปรุงใช้งานได้ในขั้นตอนต่อไป และขอให้สนุกกับการเขียนโปรแกรมครับ

(C) 2020, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุง 2010-10-12
ปรับปรุง 2020-10-20