[TH] Let’s have fun doing time-lapse with ESP32CAM.

บทความนี้เป็นการประยุกต์ใช้ชุดบอร์ด ESP32CAM เพื่อทำการถ่ายภาพแบบต่อเนื่องโดยกำหนช่วงเวลาระหว่างการถ่ายภาพแต่ละใบหรือที่เรียกว่า time-lapse ซี่งในบทความนี้เขียนโดยใช้ภาษาไพธอน ด้วยการติดตั้งเฟิร์มแวร์ที่ถูกคอมไพล์ด้วยการผนวกไลบรารี camera สำหรับการเชื่อมต่อกับโมดูลกล้องบนบอร์ด ESP32CAM ทำให้การเขียนโปรแกรมสะดวกและปรับแต่งโค้ดได้ง่าย

ภาพที่ 1 บอร์ด ESP32CAM ที่ใช้ในการทดลองครั้งนี้

อุปกรณ์

  1. บอร์ด ESP32CAM
  2. โมดูลกล้อง OV2640
  3. โมดูล USB-RS232
ภาพที่ 2 บอร์ด ESP32CAM กับเคสรุ่นที่ 2 และต่อเชื่อมกับโมดูล USB2RS232
ภาพที่ 3 บอร์ด ESP32CAM กับเคสรุ่นที่ 3 และโมดูล USB2RS232 ที่ใส่ไว้ด้านหลังของบอร์ด

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

การเชื่อมต่อโมดูล RS232 เพื่อให้บอร์ด ESP32CAM สามารถสื่อสารกับคอมพิวเตอร์เพื่อใช้เขียนเฟิร๋มแวร์และเขียนโปรแกรมจะต้องดำเนินการดังตารางต่อไปนี้

โมดูล RS232ESP32CAM
5V5V
GNDGND
TxRx
RxTx

ติดตั้งเฟิร์มแวร์

ต้องขอบคุณ Mauro Riva ที่เตรียมเฟิร์มแวร์ให้เราใช้งานที่ github ซึ่งผู้อ่านสามารถดาวน์โหลดเฟิร์มแวร์ esp32_idf4.x_ble_camera.bin และดำเนินการเขียนรอมเหมือนในบทความนี้

เมื่อติดตั้งเฟิร์มแวร์เรียบร้อยให้ทดสอบเรียกใช้ดังนี้ และถ้าได้ผลลัพธ์เป็น True หมายความว่าโมดูลกล้องพร้อมใช้งาน

import camera
camera.init(0, format=camera.JPEG)

หมายเหตุ
ในการเขียนเฟิร์มแวร์จะต้องต่อขา GPIO0 ของ ESP32CAM เข้ากับ GND แล้ว Reset เพื่อให้เข้าโหมดเขียนรอม

ไลบรารี camera

การเรียกใช้โมดูลกล้องต้องเรียกไลบรารี camera โดยไลบรารีมีคำสั่งให้ใช้งานดังนี้

  1. camera.init(0,format=camera.JPEG) สำหรับให้กล้องพร้อมทำงาน
  2. camera.gramesize( ขนาดของภาพ ) สำหรับกำหนดขนาดของภาพ ซึ่งมีผลกับจำนวนหน่วยความจำของบอร์ด โดยขนาดของภาพมีรายการให้เลือกเป็นดังนี้
    1. camera.FRAME_96X96 
    2. camera.FRAME_QQVGA 
    3. camera.FRAME_QCIF 
    4. camera.FRAME_HQVGA 
    5. camera.FRAME_240X240
    6. camera.FRAME_QVGA 
    7. camera.FRAME_CIF 
    8. camera.FRAME_HVGA 
    9. camera.FRAME_VGA 
    10. camera.FRAME_SVGA
    11. camera.FRAME_XGA 
    12. camera.FRAME_HD 
    13. camera.FRAME_SXGA 
    14. camera.FRAME_UXGA 
    15. camera.FRAME_FHD
    16. camera.FRAME_P_HD 
    17. camera.FRAME_P_3MP 
    18. camera.FRAME_QXGA 
    19. camera.FRAME_QHD 
    20. camera.FRAME_WQXGA
    21. camera.FRAME_P_FHD 
    22. camera.FRAME_QSXGA
  3. camera.whitebalance( ประเภทของWB )  สำหรับให้โมดูลกล้องปรับค่าสมดุลสีขาว (WB: White Balance) โดยมีให้เลือกดังนี้
    1. camera.WB_NONE
    2. camera.WB_SUNNY 
    3. camera.WB_CLOUDY 
    4. camera.WB_OFFICE 
    5. camera.WB_HOME
  4. camera.saturation( ค่าความเข้มสี ) โดยค่าความเข้มของสีไล่จาก -2 ถึง 2 ซึ่งเป็นค่าเกรย์สเกล (grayscale) ไปหาความเข้มสีที่มากที่สุด
  5. camera.brightness( ค่าความสว่าง ) ใช้สำหรับกำหนดการลดหรือเพิ่มความสว่างของภาพที่ได้จากโมดูลกล้อง มีค่าเป็น -2 ถึง 2
  6. camera.contrast( ค่าความเปรียบต่างของสี ) สำหรับปรับค่าความเปรียบต่างของสีให้น้อยหรือมาก โดยมีช่วงค่าเป็น -2 ถึง 2
  7. camera.quality( ระดับคุณภาพ ) สำหรับกำหนดคุณภาพของภาพ โดยมีค่าอยู่ในช่วง 10 ถึง 63 ซึ่งค่าน้อยหมายถึงคุณภาพของภาพสูงกว่าค่ามากเนื่องจากบีบอัดน้อยกว่า
  8. camera.flip( ค่าการกลับ ) สำหรับสั่งกลับภาพบน/ล่างโดยกำหนดเป็นค่า 0 หรือ 1
  9. camera.mirror( ค่าการกลับ ) สำหรับสั่งภาพกลับซ้าย/ขวาด้วยการกำหนดค่าเป็น 0 หรือ 1

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

ตัวอย่างโปรแกรม code21-1 เป็นการอ่านค่าจากโมดูลกล้องหลังจากนั้นเขียนไฟล์ภาพที่ได้ลง SDCard โดยตั้งชื่อเป็น capture.jpg

#code21-1
import camera
import machine
import os
import time

camera.init(0,format=camera.JPEG)
camera.framesize(camera.FRAME_VGA)
camera.whitebalance(camera.WB_NONE) 
camera.saturation(0)
camera.brightness(0)
camera.contrast(0)
camera.quality(10)

sd = machine.SDCard()

time.sleep_ms(100)
os.mount(sd, '/sd')
buf = camera.capture()
f = open('/sd/capture.jpg', 'w')
f.write(buf)
time.sleep_ms(100)
f.close()
sd.deinit()
camera.deinit()

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

ตัวอย่างโปรแกรม code21-2 เป็นการบันทึกภาพต่อเนื่องทุก 1 วินาที (โดยประมาณ) จำนวน 100 ใบ

# code21-2 time-laps
import machine as mc
import time
import camera
import os

camera.init(0,format=camera.JPEG)
camera.framesize(camera.FRAME_VGA)
camera.whitebalance(camera.WB_NONE)
sd = mc.SDCard()
time.sleep_ms(100)
if ('sd' in os.listdir()):
    os.umount('/sd')
os.mount(sd, '/sd')
frameCounter = 0
for i in range(100):
    frameCounter += 1
    buf = camera.capture()
    fname = "/sd/{:04d}.jpg".format(frameCounter)
    f = open(fname, 'w')
    f.write(buf)
    time.sleep_ms(100)
    f.close()
    print("Frame No.{}".format(frameCounter))
    time.sleep_ms(1000)
sd.deinit()
camera.deinit()
ภาพที่ 4 ตัวอย่างภาพผลลัพธ์ของการทำงานโปรแกรม code21-2
ภาพที่ 5 ตัวอย่างผลลัพธ์จากการรัน code21-2
ภาพที่ 6 ตัวอย่างภาพที่ได้จาก code21-2

สรุป

จากบทความนี้จะพบว่า การเขียนโปรแกรมภาษาไพธอนเพื่อสั่งงานโมดูลกล้องนั้นมีความสะดวกและไม่ยุ่งยากในการใช้งาน แต่ต้องติดตั้งเฟิร์มแวร์สำหรับ ESP32CAM เป็นการเฉพาะ แต่ทำให้ความเร็วในการทำงานของภาคโมดูลกล้องนั้นมีความเร็วสูงกว่าการเขียนโค้ดภาษาไพธอนเพียงอย่างเดียว และสิ่งหนึ่งที่ทางทีมงานเราพบ คือ การใช้งานโมดูลต้องมีแหล่งจ่ายไฟที่จ่ายกระแสได้สูงกว่าปกติ ดังนั้น ผู้อ่านต้องตรวจสอบกระแสที่จ่ายให้กับบอร์ดให้ดีเมื่อนำไปใช้งานจริง

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

(C) 2020, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุงเมื่อ 2020-11-24
ปรับปรุงเมื่อ 2021-08-19