การทำโปรเจคที่รวมเอา Arduino สำหรับการควบคุมหลอดไฟและ OpenCV Python สำหรับการตรวจจับภาพ ถือเป็นการผสมผสานระหว่างฮาร์ดแวร์และซอฟต์แวร์ที่สามารถนำมาใช้ในหลากหลายด้าน บทความนี้จะกล่าวถึงข้อดีของการทำโปรเจคดังกล่าว ดังนี้:

ข้อดีของการทำโปรเจค Arduino ควบคุมหลอดไฟกับ OpenCV Python

  1. การเรียนรู้และพัฒนาทักษะที่หลากหลาย:
    • การทำโปรเจคนี้ช่วยให้คุณได้เรียนรู้ทั้งการเขียนโค้ด Python สำหรับการประมวลผลภาพด้วย OpenCV และการเขียนโค้ด C++ สำหรับการควบคุมอุปกรณ์ฮาร์ดแวร์ด้วย Arduino ทำให้คุณพัฒนาทักษะในหลายๆ ด้าน
  2. การประยุกต์ใช้งานที่หลากหลาย:
    • โปรเจคนี้สามารถนำไปประยุกต์ใช้งานได้หลายรูปแบบ เช่น ระบบบ้านอัจฉริยะ (Smart Home), ระบบควบคุมแสงในสำนักงาน, การควบคุมแสงตามการเคลื่อนไหวของผู้ใช้งาน, หรือการนำไปใช้ในงานศิลปะดิจิทัล
  3. การสร้างระบบอัตโนมัติ:
    • ด้วยการใช้ OpenCV สำหรับการตรวจจับภาพ คุณสามารถสร้างระบบที่สามารถทำงานได้เองโดยอัตโนมัติ เช่น การเปิดปิดไฟเมื่อมีการตรวจจับการเคลื่อนไหว หรือการควบคุมความสว่างของไฟตามความเข้มของแสงในห้อง
  4. การพัฒนาความคิดสร้างสรรค์และการแก้ปัญหา:
    • การทำโปรเจคนี้จะท้าทายความคิดสร้างสรรค์ของคุณในการแก้ไขปัญหาต่างๆ ที่เกิดขึ้น เช่น การตั้งค่ากล้องให้ตรวจจับได้ดี การเขียนโค้ดให้ทำงานร่วมกันอย่างมีประสิทธิภาพ และการสร้างอินเตอร์เฟซที่ใช้งานง่าย
  5. การเรียนรู้การบูรณาการระบบ:
    • โปรเจคนี้จะสอนคุณเกี่ยวกับการบูรณาการระบบระหว่างฮาร์ดแวร์และซอฟต์แวร์ การใช้โปรโตคอลการสื่อสารระหว่าง Arduino และคอมพิวเตอร์ เช่น Serial Communication และการประสานงานระหว่างการประมวลผลภาพและการควบคุมฮาร์ดแวร์
  6. การเข้าถึงทรัพยากรและชุมชน:
    • มีทรัพยากรออนไลน์มากมายที่คุณสามารถเข้าถึงได้ เช่น บทความ, วิดีโอสอน, และโค้ดตัวอย่างจากชุมชน Arduino และ OpenCV ซึ่งจะช่วยให้คุณสามารถเรียนรู้และแก้ไขปัญหาได้ง่ายขึ้น
  7. การเตรียมตัวสำหรับอนาคต:
    • ทักษะที่คุณได้จากการทำโปรเจคนี้เป็นทักษะที่กำลังเป็นที่ต้องการในอุตสาหกรรม เช่น IoT (Internet of Things), AI (Artificial Intelligence), และระบบอัตโนมัติ ทำให้คุณมีโอกาสมากขึ้นในการทำงานในสายงานเหล่านี้


สรุป

การทำโปรเจคที่รวมเอา Arduino และ OpenCV Python ไม่เพียงแต่ช่วยให้คุณได้พัฒนาทักษะในการเขียนโปรแกรมและการทำงานกับฮาร์ดแวร์ แต่ยังเปิดโอกาสให้คุณได้สร้างสรรค์และพัฒนาระบบอัตโนมัติที่สามารถนำไปใช้ในชีวิตประจำวันหรือในอุตสาหกรรมต่างๆ ได้อีกด้วย


อุปกรณ์ที่ใช้

1- Arduino UNO R3

2- Sensor Shield V 5.0

3- PWM Dimming Adjust 220V Module

4- AC Power Cord 2 Pin Plug

5- แผ่นอะคริลิคใส

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) ของคอมพิวเตอร์แต่ละเครื่อง


ทดสอบ หรี่ไฟบ้าน 220V ด้วย ขวดโค๊ก

Leave a Reply

Your email address will not be published. Required fields are marked *

เราใช้คุกกี้เพื่อพัฒนาประสิทธิภาพ และประสบการณ์ที่ดีในการใช้เว็บไซต์ของคุณ คุณสามารถศึกษารายละเอียดได้ที่ นโยบายความเป็นส่วนตัว และสามารถจัดการความเป็นส่วนตัวเองได้ของคุณได้เองโดยคลิกที่ ตั้งค่า

Privacy Preferences

คุณสามารถเลือกการตั้งค่าคุกกี้โดยเปิด/ปิด คุกกี้ในแต่ละประเภทได้ตามความต้องการ ยกเว้น คุกกี้ที่จำเป็น

Allow All
Manage Consent Preferences
  • Always Active

Save