การทำโปรเจคที่รวมเอา Arduino สำหรับการควบคุมหลอดไฟและ OpenCV Python สำหรับการตรวจจับภาพ ถือเป็นการผสมผสานระหว่างฮาร์ดแวร์และซอฟต์แวร์ที่สามารถนำมาใช้ในหลากหลายด้าน บทความนี้จะกล่าวถึงข้อดีของการทำโปรเจคดังกล่าว ดังนี้:
ข้อดีของการทำโปรเจค Arduino ควบคุมหลอดไฟกับ OpenCV Python
- การเรียนรู้และพัฒนาทักษะที่หลากหลาย:
- การทำโปรเจคนี้ช่วยให้คุณได้เรียนรู้ทั้งการเขียนโค้ด Python สำหรับการประมวลผลภาพด้วย OpenCV และการเขียนโค้ด C++ สำหรับการควบคุมอุปกรณ์ฮาร์ดแวร์ด้วย Arduino ทำให้คุณพัฒนาทักษะในหลายๆ ด้าน
- การประยุกต์ใช้งานที่หลากหลาย:
- โปรเจคนี้สามารถนำไปประยุกต์ใช้งานได้หลายรูปแบบ เช่น ระบบบ้านอัจฉริยะ (Smart Home), ระบบควบคุมแสงในสำนักงาน, การควบคุมแสงตามการเคลื่อนไหวของผู้ใช้งาน, หรือการนำไปใช้ในงานศิลปะดิจิทัล
- การสร้างระบบอัตโนมัติ:
- ด้วยการใช้ OpenCV สำหรับการตรวจจับภาพ คุณสามารถสร้างระบบที่สามารถทำงานได้เองโดยอัตโนมัติ เช่น การเปิดปิดไฟเมื่อมีการตรวจจับการเคลื่อนไหว หรือการควบคุมความสว่างของไฟตามความเข้มของแสงในห้อง
- การพัฒนาความคิดสร้างสรรค์และการแก้ปัญหา:
- การทำโปรเจคนี้จะท้าทายความคิดสร้างสรรค์ของคุณในการแก้ไขปัญหาต่างๆ ที่เกิดขึ้น เช่น การตั้งค่ากล้องให้ตรวจจับได้ดี การเขียนโค้ดให้ทำงานร่วมกันอย่างมีประสิทธิภาพ และการสร้างอินเตอร์เฟซที่ใช้งานง่าย
- การเรียนรู้การบูรณาการระบบ:
- โปรเจคนี้จะสอนคุณเกี่ยวกับการบูรณาการระบบระหว่างฮาร์ดแวร์และซอฟต์แวร์ การใช้โปรโตคอลการสื่อสารระหว่าง Arduino และคอมพิวเตอร์ เช่น Serial Communication และการประสานงานระหว่างการประมวลผลภาพและการควบคุมฮาร์ดแวร์
- การเข้าถึงทรัพยากรและชุมชน:
- มีทรัพยากรออนไลน์มากมายที่คุณสามารถเข้าถึงได้ เช่น บทความ, วิดีโอสอน, และโค้ดตัวอย่างจากชุมชน Arduino และ OpenCV ซึ่งจะช่วยให้คุณสามารถเรียนรู้และแก้ไขปัญหาได้ง่ายขึ้น
- การเตรียมตัวสำหรับอนาคต:
- ทักษะที่คุณได้จากการทำโปรเจคนี้เป็นทักษะที่กำลังเป็นที่ต้องการในอุตสาหกรรม เช่น IoT (Internet of Things), AI (Artificial Intelligence), และระบบอัตโนมัติ ทำให้คุณมีโอกาสมากขึ้นในการทำงานในสายงานเหล่านี้
สรุป
การทำโปรเจคที่รวมเอา Arduino และ OpenCV Python ไม่เพียงแต่ช่วยให้คุณได้พัฒนาทักษะในการเขียนโปรแกรมและการทำงานกับฮาร์ดแวร์ แต่ยังเปิดโอกาสให้คุณได้สร้างสรรค์และพัฒนาระบบอัตโนมัติที่สามารถนำไปใช้ในชีวิตประจำวันหรือในอุตสาหกรรมต่างๆ ได้อีกด้วย
อุปกรณ์ที่ใช้
3- PWM Dimming Adjust 220V Module
6- เสารองแผ่นพีซีบีโลหะแบบเหลี่ยม 8 mm
7- Jumper (F2F) 20cm Female to Female
8- หลอดไฟ 220V + ขั้วหลอดไฟ + สายไฟ
การสร้าง Arduino หรี่ไฟบ้านด้วย ขวดโค๊ก
1.ประกอบอุปกรณ์และเชื่อมต่อวงจร
- ยึด Arduino UNO R3 เข้ากับ เสารองแผ่นพีซีบีโลหะแบบเหลี่ยม 8 mm

- เสียบ Sensor Shield เข้ากับ บอร์ด Arduino UNO R3

- เชื่อมต่อ Sensor Shield กับ Dimmer Module

เชื่อมต่อ PWM Dimming Module กับ อุปกรณ์ไฟฟ้าอื่นๆ
( หลอดไฟควรมีคุณสมบัติหรี่ไฟได้ เช่น หลอดไส้ร้อนแบบธรรมดา 40 – 100 วัตต์ )



2. อัพโหลดโค้ดและทดสอบ
เปิดโปรแกรม Arduino IDE เขียนโค้ดและอัพโหลดโค้ดดังนี้
int PWM_Pin = 3;
void setup() {
pinMode(PWM_Pin, OUTPUT);
}
void loop() {
analogWrite(PWM_Pin, 0);
delay(1000);
analogWrite(PWM_Pin, 64);
delay(1000);
analogWrite(PWM_Pin, 127);
delay(1000);
analogWrite(PWM_Pin, 191);
delay(1000);
analogWrite(PWM_Pin, 255);
delay(1000);
}
ผลลัพธ์การทำงาน :
- หลอดไฟสว่าง 0 %
- หลอดไฟสว่าง 25 %
- หลอดไฟสว่าง 50 %
- หลอดไฟสว่าง 75 %
- หลอดไฟสว่าง 100 %
คลิปทดสอบ Arduino หรี่ไฟบ้าน
แสดงว่า การเชื่อมต่อ PWM Dimming Module ของเรานั้นถูกต้อง และ พร้อมใช้งานแล้ว
3 : อัพโหลดโค้ด เพื่อรอคำสั่งจาก Python
อัพโหลดโค้ด ด้านล่างไปยังบอร์ด Arduino UNO R3 เพื่อรอคำสั่งจาก Python
int PWM_Pin = 3;
int val;
void setup() {
Serial.begin(9600);
pinMode(PWM_Pin, OUTPUT);
}
void loop() {
String readString;
String Q;
while (Serial.available()) {
delay(1);
if (Serial.available() > 0) {
char c = Serial.read();
if (isControl(c)) {
break;
}
readString += c;
}
Q = readString;
int X = Q.toInt();
val = map(X, 0, 640, 255, 0);
analogWrite(PWM_Pin, val);
}
}
https://lungmaker.com/code/coke.ino
*** การทำงานที่คอมพิวเตอร์ ***
1. ติดตั้ง Python
2. ติดตั้งโปรแกรม PyCharm
เลือกติดตั้งตัวฟรี คือ PyCharm Community

3. เพิ่มแพคเก็จ OpenCV
เปิดโปรแกรม PyCharm Community
เลือก New Project

ชื่อโปรเจคตามตัวอย่างคือ pythonProject -> Create

เพิ่มแพคเก็จ OpenCV โดยไปที่ File -> Settings…

ไปที่ Python Interpreter

เลือก แล้ว คลิกเครื่องหมาย +

ที่ช่องค้นหา พิมพ์ opencv -> คลิกที่ opencv-python -> Install Package

แสดงการติดตั้งสำเร็จ แล้วปิดหน้าต่างลงไป

แสดง แพคเก็จ OpenCV ที่เพิ่มเข้ามา -> OK

4. ทดสอบใช้งาน OpenCV
สร้างไฟล์ Python โดยคลิกขวาที่โฟลเดอร์ venv -> New -> Python File

ตั้งชื่อไฟล์ ในตัวอย่างเป็น test-opencv -> Enter

เขียนโค้ดดังนี้
import cv2
print("Package import")
ทดสอบการทำงานโดย คลิกขวา ในพื้นที่การเขียนโค้ด -> Run ‘test-opencv’

ที่ด้านล่าง แสดง Package import แสดงว่า OpenCV ของเราพร้อมใช้งานกับ Python แล้ว

5 .โปรแกรมแรก OpenCV Python
เขียนโค้ดดังนี้
import cv2
import imutils
import time
greenLower = (160, 110, 20)
greenUpper = (179, 255, 255)
vs = cv2.VideoCapture(0)
time.sleep(2.0)
while True:
_, frame = vs.read()
if frame is None:
break
blurred = cv2.GaussianBlur(frame, (5, 5), 0)
width, height = frame.shape[:2]
hsv = cv2.cvtColor(blurred, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv, greenLower, greenUpper)
mask = cv2.erode(mask, None, iterations=2)
mask = cv2.dilate(mask, None, iterations=2)
cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
center = None
if len(cnts) > 5:
c = max(cnts, key=cv2.contourArea)
((x, y), radius) = cv2.minEnclosingCircle(c)
M = cv2.moments(c)
center = (int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"]))
# To see the centroid clearly
if radius > 5:
cv2.circle(frame, (int(x), int(y)), int(radius), (0, 255, 255), 5)
cv2.imwrite("circled_frame.png", cv2.resize(frame, (int(height / 2), int(width / 2))))
cv2.circle(frame, center, 5, (0, 0, 255), -1)
frame2 = cv2.flip(frame,1)
cv2.imshow("Frame", frame2)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
vs.release()
cv2.destroyAllWindows()
https://lungmaker.com/code/opencv-2024.py
Run

แสดงการ Error ว่าไม่พบโมดูล,ชื่อ imutils ซึ่งเป็น library เบื้องต้นของ image processing พวกหมุนภาพ กลับภาพ ปรับขนาด

แก้ไขโดยการ เพิ่มแพคเก็จ imutils โดยขั้นตอนเหมือนกับ การเพิ่มแพคเก็จ OpenCV
โดยไปที่ File -> Settings… -> Python Interpreter -> คลิกเครื่องหมาย +
ทีช่องค้นหา พิมพ์ imutils -> คลิกที่ imutils -> Install Package

แสดงการติดตั้งสำเร็จ แล้วปิดหน้าต่างลงไป

แสดง แพคเก็จ imutils ที่เพิ่มเข้ามา -> OK

Run อีกครั้ง

ถ้าแสดงการติดตามวัตถุ ในที่นี้คือ ขวดโค้ก ฝาสีแดง จาก webcam หรือ กล้องจากแล็ปท็อปคอมพิวเตอร์ แสดงว่าขั้นตอนนี้สำเร็จแล้ว


6. เพิ่มแพคเก็จ pySerial
โมดูล pySerial ทำหน้าที่เป็นตัวคอยเชื่อมโยง Python ให้สามารถส่งข้อมูลออกทางพอร์ตอนุกรม (serial port) ของคอมพิวเตอร์ได้ โดยใช้โมดูล PySerial นี้รันเป็นแบล๊กกราวด์ของโปรแกรม
เพิ่มแพคเก็จ pySerial โดยไปที่ File -> Settings… -> Python Interpreter -> คลิกเครื่องหมาย +
ทีช่องค้นหา พิมพ์ pyserial -> คลิกที่ pyserial -> Install Package

แสดงการติดตั้งสำเร็จ แล้วปิดหน้าต่างลงไป

แสดง แพคเก็จ pyserial ที่เพิ่มเข้ามา -> OK

7. เขียนโค้ดและทดสอบ
import cv2
import imutils
import time
import serial
ser = serial.Serial("COM3", 9600)
greenLower = (160, 110, 20)
greenUpper = (179, 255, 255)
vs = cv2.VideoCapture(0)
time.sleep(2.0)
while True:
_, frame = vs.read()
if frame is None:
break
blurred = cv2.GaussianBlur(frame, (11, 11), 0)
width, height = frame.shape[:2]
hsv = cv2.cvtColor(blurred, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv, greenLower, greenUpper)
mask = cv2.erode(mask, None, iterations=2)
mask = cv2.dilate(mask, None, iterations=2)
cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
center = None
if len(cnts) > 0:
c = max(cnts, key=cv2.contourArea)
((x, y), radius) = cv2.minEnclosingCircle(c)
M = cv2.moments(c)
center = (int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"]))
# To see the centroid clearly
if radius > 10:
cv2.circle(frame, (int(x), int(y)), int(radius), (0, 255, 255), 5)
input_value = str(int(x))
print(input_value)
ser.write(input_value.encode())
cv2.imwrite("circled_frame.png", cv2.resize(frame, (int(height / 2), int(width / 2))))
cv2.circle(frame, center, 5, (0, 255, 255), -1)
frame2 = cv2.flip(frame, 1)
cv2.imshow("Frame", frame2)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
vs.release()
cv2.destroyAllWindows()
https://lungmaker.com/code/coke.py
โดยโค้ด “COM3”
ser = serial.Serial("COM3", 9600)
ให้แก้ไขตามข้อมูลที่ปรากฏ Ports (COM & LPT) ของคอมพิวเตอร์แต่ละเครื่อง
