บทความนี้เป็นการประยุกต์ใช้ชุดบอร์ด ESP32CAM เพื่อทำการถ่ายภาพแบบต่อเนื่องโดยกำหนช่วงเวลาระหว่างการถ่ายภาพแต่ละใบหรือที่เรียกว่า time-lapse ซี่งในบทความนี้เขียนโดยใช้ภาษาไพธอน ด้วยการติดตั้งเฟิร์มแวร์ที่ถูกคอมไพล์ด้วยการผนวกไลบรารี camera สำหรับการเชื่อมต่อกับโมดูลกล้องบนบอร์ด ESP32CAM ทำให้การเขียนโปรแกรมสะดวกและปรับแต่งโค้ดได้ง่าย
อุปกรณ์
- บอร์ด ESP32CAM
- โมดูลกล้อง OV2640
- โมดูล USB-RS232
การเชื่อมต่อกับโมดูล RS232
การเชื่อมต่อโมดูล RS232 เพื่อให้บอร์ด ESP32CAM สามารถสื่อสารกับคอมพิวเตอร์เพื่อใช้เขียนเฟิร๋มแวร์และเขียนโปรแกรมจะต้องดำเนินการดังตารางต่อไปนี้
โมดูล RS232 | ESP32CAM |
---|---|
5V | 5V |
GND | GND |
Tx | Rx |
Rx | Tx |
ติดตั้งเฟิร์มแวร์
ต้องขอบคุณ Mauro Riva ที่เตรียมเฟิร์มแวร์ให้เราใช้งานที่ github ซึ่งผู้อ่านสามารถดาวน์โหลดเฟิร์มแวร์ esp32_idf4.x_ble_camera.bin และดำเนินการเขียนรอมเหมือนในบทความนี้
เมื่อติดตั้งเฟิร์มแวร์เรียบร้อยให้ทดสอบเรียกใช้ดังนี้ และถ้าได้ผลลัพธ์เป็น True หมายความว่าโมดูลกล้องพร้อมใช้งาน
import camera
camera.init(0, format=camera.JPEG)
หมายเหตุ
ในการเขียนเฟิร์มแวร์จะต้องต่อขา GPIO0 ของ ESP32CAM เข้ากับ GND แล้ว Reset เพื่อให้เข้าโหมดเขียนรอม
ไลบรารี camera
การเรียกใช้โมดูลกล้องต้องเรียกไลบรารี camera โดยไลบรารีมีคำสั่งให้ใช้งานดังนี้
- camera.init(0,format=camera.JPEG) สำหรับให้กล้องพร้อมทำงาน
- camera.gramesize( ขนาดของภาพ ) สำหรับกำหนดขนาดของภาพ ซึ่งมีผลกับจำนวนหน่วยความจำของบอร์ด โดยขนาดของภาพมีรายการให้เลือกเป็นดังนี้
- camera.FRAME_96X96
- camera.FRAME_QQVGA
- camera.FRAME_QCIF
- camera.FRAME_HQVGA
- camera.FRAME_240X240
- camera.FRAME_QVGA
- camera.FRAME_CIF
- camera.FRAME_HVGA
- camera.FRAME_VGA
- camera.FRAME_SVGA
- camera.FRAME_XGA
- camera.FRAME_HD
- camera.FRAME_SXGA
- camera.FRAME_UXGA
- camera.FRAME_FHD
- camera.FRAME_P_HD
- camera.FRAME_P_3MP
- camera.FRAME_QXGA
- camera.FRAME_QHD
- camera.FRAME_WQXGA
- camera.FRAME_P_FHD
- camera.FRAME_QSXGA
- camera.whitebalance( ประเภทของWB ) สำหรับให้โมดูลกล้องปรับค่าสมดุลสีขาว (WB: White Balance) โดยมีให้เลือกดังนี้
- camera.WB_NONE
- camera.WB_SUNNY
- camera.WB_CLOUDY
- camera.WB_OFFICE
- camera.WB_HOME
- camera.saturation( ค่าความเข้มสี ) โดยค่าความเข้มของสีไล่จาก -2 ถึง 2 ซึ่งเป็นค่าเกรย์สเกล (grayscale) ไปหาความเข้มสีที่มากที่สุด
- camera.brightness( ค่าความสว่าง ) ใช้สำหรับกำหนดการลดหรือเพิ่มความสว่างของภาพที่ได้จากโมดูลกล้อง มีค่าเป็น -2 ถึง 2
- camera.contrast( ค่าความเปรียบต่างของสี ) สำหรับปรับค่าความเปรียบต่างของสีให้น้อยหรือมาก โดยมีช่วงค่าเป็น -2 ถึง 2
- camera.quality( ระดับคุณภาพ ) สำหรับกำหนดคุณภาพของภาพ โดยมีค่าอยู่ในช่วง 10 ถึง 63 ซึ่งค่าน้อยหมายถึงคุณภาพของภาพสูงกว่าค่ามากเนื่องจากบีบอัดน้อยกว่า
- camera.flip( ค่าการกลับ ) สำหรับสั่งกลับภาพบน/ล่างโดยกำหนดเป็นค่า 0 หรือ 1
- 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()
สรุป
จากบทความนี้จะพบว่า การเขียนโปรแกรมภาษาไพธอนเพื่อสั่งงานโมดูลกล้องนั้นมีความสะดวกและไม่ยุ่งยากในการใช้งาน แต่ต้องติดตั้งเฟิร์มแวร์สำหรับ ESP32CAM เป็นการเฉพาะ แต่ทำให้ความเร็วในการทำงานของภาคโมดูลกล้องนั้นมีความเร็วสูงกว่าการเขียนโค้ดภาษาไพธอนเพียงอย่างเดียว และสิ่งหนึ่งที่ทางทีมงานเราพบ คือ การใช้งานโมดูลต้องมีแหล่งจ่ายไฟที่จ่ายกระแสได้สูงกว่าปกติ ดังนั้น ผู้อ่านต้องตรวจสอบกระแสที่จ่ายให้กับบอร์ดให้ดีเมื่อนำไปใช้งานจริง
สุดท้ายหวังว่าบทความนี้คงมีประโยชน์บ้างไม่มากก็น้อยสำหรับผู้อ่าน และหวังว่าผู้อ่านจะมีความสุขกับการเขียนโปรแกรมและนำไปประยุกต์ใช้กันต่อไปครับ
(C) 2020, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุงเมื่อ 2020-11-24
ปรับปรุงเมื่อ 2021-08-19