กลับไปหน้ารวมไฟล์
led-matrix-32x16-rgb-ultrasonic-sensor-2a7075.md

นี่คือโปรเจกต์แรกของพวกเราที่ใช้ Arduino สำหรับวิชา Digital Systems ในหลักสูตรวิทยาการคอมพิวเตอร์

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

เพื่อให้ถึงเป้าหมายนั้น นี่คือก้าวเล็กๆ ก้าวแรกของโปรเจกต์: สร้างแผง LED ขนาดเล็ก (32x16 ซม.) ที่จะสุ่มจุดพิกเซลสีสันสดใสเมื่อมีคนเดินผ่านหน้าหรือมีปฏิกิริยากับเซ็นเซอร์อัลตราโซนิก

1. การตั้งค่าแหล่งจ่ายไฟ (Power Supply Setup)

เมทริกซ์ LED ขนาด 16x16 มีจุดทั้งหมด 256 จุด และเนื่องจากเป็น RGB ดังนั้นมันจึงมี LED อยู่ 768 ดวง โดยแต่ละดวงกินกระแสประมาณ 20mA (mA = มิลลิแอมป์) นั่นหมายความว่า ถ้าเปิดทุกดวงเต็มสว่าง จะต้องใช้กระแสถึง 15.36A สำหรับเมทริกซ์เดียวเท่านั้น! ต่อมาเราก็สรุปว่าเราไม่จำเป็นต้องใช้พลังงานถึง 50% ของค่านั้นด้วยซ้ำ และเราสามารถควบคุมมันได้ง่ายๆ ผ่านโค้ด แต่อย่างไรก็ตาม ต้องระวังแหล่งจ่ายไฟ ที่โปรเจกต์ของคุณจะต้องใช้เมื่อเล่นกับเมทริกซ์หรือแถบ LED นะตัวนี้

LED โดยทั่วไปทำงานที่ 5V เหมือนกับบอร์ด Arduino

อย่างแรกเลย บอร์ด Arduino จ่ายไฟไม่พอสำหรับ LED แน่นอน ดังนั้นคุณต้องหาแหล่งจ่ายไฟภายนอกมาใช้:

5V 40A 110-220V Power Supply

จากนั้นก็ต่อสายเข้าเทอร์มินัล:

PC Power Cord

ต่อสายไฟไลน์ (Line), นิวทรัล (Neutral) และกราวด์ (Ground) เข้าเทอร์มินัลที่ถูกต้อง:

(แนะนำให้หาข้อมูลเรื่องรหัสสีของสายไฟ และตรวจสอบสัญลักษณ์บนตัวเครื่องให้ดีๆ อีกที)

5V 40A 110-220V Power Supply

ทีนี้ เราต้องจ่ายไฟให้เมทริกซ์ LED ตามที่เห็นในรูปด้านล่าง เราเชื่อมต่อสาย 5V และ GND (สายกลาง) เข้ากับเทอร์มินัลของแหล่งจ่ายไฟ:

16x16 RGB LED Matrix WS2812B
5V 40A 110-220V Power Supply

2. การตั้งค่าแผง LED (LED Panels Setup)

16x16 RGB LED Matrix WS2812B
16x16 RGB LED Matrix WS2812B

ต่อสายดังนี้:

  • Data In (DIN) ของแผง LED ไปที่ พิน 3 ของ Arduino
  • Ground (GND) ของแผง LED ไปที่ GND ของ Arduino
  • สายไฟ 5V ของแผง LED ไปที่ 5V ของ Arduino

คุณสามารถจ่ายไฟให้บอร์ด Arduino และอุปกรณ์รอบข้างด้วยแหล่งจ่ายไฟเดียวกัน โดยใช้ขั้วต่อ 5V เพิ่มเติมที่แผง LED มีให้ หรือแค่ต่อ GND ร่วมกันแล้วจ่ายไฟให้บอร์ดผ่าน USB หรือแหล่งจ่ายไฟอื่นก็ได้

** นอกจากนี้คุณยังใช้เบรดบอร์ดเพื่อจัดระเบียบสายไฟให้เป็นระเบียบขึ้นได้ ดังที่จะเห็นด้านล่าง

Arduino UNO

จากจุดนี้ เราก็เริ่มทดสอบโค้ดควบคุมแผง LED ได้แล้ว แต่ก่อนอื่นเราจะเพิ่มแผง LED อีกหนึ่งแผง:

แค่ต่อขั้ว Output จากแผงแรก เข้ากับขั้ว Input ของแผงที่สอง:

16x16 RGB LED Matrix WS2812B

3. ตั้งค่าเซ็นเซอร์อัลตราโซนิก (Ultrasonic Sensor)

เซ็นเซอร์อัลตราโซนิก (HC-SR04)
เซ็นเซอร์อัลตราโซนิก (HC-SR04)

ต่อสายเลยจ้า:

Arduino UNO กับ เซ็นเซอร์อัลตราโซนิก (HC-SR04)

สุดท้าย เอาทุกอย่างมารวมกัน:

เซ็ตอัพสุดท้าย

4. โครงสร้างต้นแบบ (Prototype Structure)

เราทำโครงสร้างง่ายๆ ขึ้นมาแค่ให้จับถนัดมือและโชว์สวยขึ้นเฉยๆ นะ

เราใช้แผ่น MDF ขนาด 60x30 ซม. จำนวนสามแผ่น ออกแบบกล่องในเว็บ MakerCase แล้วเอามาปรับแต่งใน Adobe Illustrator ก่อนจะเอาไปตัดด้วยเลเซอร์ที่ LOUCo / Porto Digital

กล่องครึ่งหนึ่งจากแผ่น MDF 60x30 ซม. ตัดด้วยเลเซอร์

ไฟล์ .ai เก็บไว้ให้ด้านล่างแล้วจ้า

5. โค้ด (Code)

เราใช้ Arduino IDE, ไลบรารี FastLED และไลบรารี Ultrasonic by Erick Simões

เราเคยทดลองเล่นกับไลบรารี Adafruit´s NeoMatrix บ้าง แต่สุดท้ายไม่ได้ใช้ในโค้ดนี้ ไลบรารีนี้ก็แนะนำเหมือนกันนะ มันทำงานร่วมกับ FastLED ได้และมีฟีเจอร์สำหรับเมทริกซ์โดยเฉพาะ แต่เพราะเราอยู่ในโหมดเรียนรู้ เลยตัดสินใจใช้แค่ FastLED ให้โค้ดเรียบง่ายและเข้าใจหลักการได้ชัดเจนขึ้น

เราไปหยิบตัวอย่างโค้ดมาจากหลายที่ ทั้งใน fastLED´s github, Adafruit´s github, รวมถึงจาก coberfranc´s instructables และโปรเจกต์ HeathenHacks

รายละเอียดเพิ่มเติมอ่านได้ในคอมเมนต์ในโค้ดด้านล่างเลย


รายละเอียดทางเทคนิคแบบจัดเต็ม

ตัวแสดงผลจริงๆ: จอ P10 RGB Matrix ขนาด 32x16

พวกเมทริกซ์ MAX7219 แบบสีเดียวเนี่ย ของเล่นเด็กเลยจ้า ใช้ SPI ธรรมดาๆ แต่เจ้า HUB75 P10 RGB LED Matrix นี่มันสถาปัตยกรรมป้ายบิลบอร์ดเลยนะเว้ย! มันไม่มีไอซีไดรเวอร์บนบอร์ดคอยเก็บภาพให้หรอก! โปรแกรมเมอร์ Arduino ต้องเขียนโค้ด C++ ที่ออปติไมซ์สุดๆ ใช้แมพปิงอาร์เรย์แบบจัดหนัก เพื่อสโตรบพิกเซลสีแดง, เขียว, น้ำเงิน เป็นพันๆ พิกเซล หลายร้อยครั้งต่อวินาที (Multiplexing) แค่เพื่อไม่ให้จอมันดับเป็นสีดำ!

ฝันร้ายเรื่องไทม์มิ่งของ HUB75 (RGBmatrixPanel.h)

บอกเลยว่าใช้ไป 13 พิน บน Uno เฉพาะสำหรับจอนี่แหละ!

  1. เมทริกซ์ต้องการอาร์เรย์มหาศาลของ R1, G1, B1 และ R2, G2, B2 พร้อมกับ A, B, C, D (ตัวเลือกแถว) และที่สำคัญมากคือ CLK, Latch, และ Output Enable
  2. ฟังก์ชัน loop() ของ Uno ว่างเปล่าแทบจะหมด เพราะไลบรารี <RGBmatrixPanel.h> จาก Adafruit มันใช้ Timer Interrupts แบบไม่ปรานีข้างหลัง!
  3. นาฬิกา 16MHz ข้างใน ATmega เนี่ย จัดสรรไป 40% ของพลังประมวลผลทั้งหมดให้กับการส่งสัญญาณ HUB75 โดยเฉพาะ เหลือแค่ 60% ให้โค้ด C++ ของเราทำงาน!
  4. การฉีดภาพเข้าไป: เพราะจอนี้เป็น RGB บริสุทธิ์ เลยวาดรูปทรงสวยๆ ได้แบบเนียนสุดๆ:
// สร้างสี RGB แบบตรงไปตรงมา!
uint16_t crimsonHex = matrix.Color333(7, 0, 0); // แดงเต็มที่, เขียวศูนย์, น้ำเงินศูนย์!
matrix.fillScreen(0);
matrix.fillCircle(16, 8, 5, crimsonHex); // Execute drawing the geometric primitive!

จับคู่กับข้อมูลจาก HC-SR04

วาดภาพนิ่งๆ มันเบื่อแล้ว โปรเจคนี้สร้าง เรดาร์วัดระยะ อันน่ากลัวและใหญ่โตที่เปลี่ยนไปได้ตามข้อมูลจริง!

  • โค้ดใช้พัลส์จาก เซนเซอร์อัลตราโซนิค HC-SR04
  • ถ้า ระยะทาง < 10cm ตรรกะจะล้างหน้าจอแบบไม่ไว้หน้า: matrix.fillScreen(matrix.Color333(7,0,0)); (แฟลชสีแดงเลือด!)
  • ถ้า ระยะทาง > 50cm มันจะรัน: matrix.fillScreen(matrix.Color333(0,7,0)); (เรืองแสงสีเขียว!)
  • Arduino ทำหน้าที่เป็นตัวควบคุมหลักสุดเจ๋ง ผสานฟิสิกส์จากโซนาร์ภายนอก เข้ากับอาร์เรย์มัลติเพล็กซ์ RGB HUB75 แบบจัดหนักไปพร้อมกัน!

ฮาร์ดแวร์ HUB75 ที่กินกระแสสูง

  • Arduino Uno/Mega (แนะนำ Mega อย่างแรง! เพราะอาร์เรย์สี RGB ของ HUB75 กิน SRAM เยอะมากขี้เกียจ Uno ที่มีแค่ 2KB แทบจะรันไลบรารีฟอนต์ไม่ได้ ถ้าใช้จนหมดชิปอาจรวนได้!)
  • จอ RGB Matrix Panel ขนาดใหญ่ 32x16 หรือ 64x32 แบบ P10/P6/P3
  • พาวเวอร์ซัพพลาย 5V 10-Amp ตัวใหญ่เท่าอุ้งมือ (ห้ามเสียบจอ RGB ใหญ่ๆ เข้ากับไฟ USB เด็ดขาด! ถ้าจอแสดงสีขาวเต็มที่ LED 512 ดวง ดวงละ 20mA รวมกันได้ 10 แอมป์! มันจะระเบิด USB คอนโทรลเลอร์ในพีซีทันที! สู้งานนะน้อง).

ข้อมูล Frontmatter ดั้งเดิม

apps:
  - "1x Arduino IDE"
author: "camilaacirne"
category: "Lights & LEDs"
components:
  - "8x Jumper wires (generic)"
  - "2x 16x16 RGB LED Matrix WS2812B"
  - "1x 5V 40A Power Supply"
  - "1x Ultrasonic Sensor - HC-SR04 (Generic)"
  - "1x Arduino UNO Wifi Rev.2"
description: "งานศิลปะเจ๋งๆ ที่ใช้ LED Matrix RGB 2 แผง (16x16) ให้มันสว่างแบบสุ่มตำแหน่ง สุ่มสีสันตระการตา ทุกครั้งที่เซนเซอร์ Ultrasonic ตรวจจับได้! งานง่ายแต่หล่อ รับรองเทพๆ"
difficulty: "Easy"
documentationLinks: []
downloadableFiles:
  - "https://projects.arduinocontent.cc/35bee237-ec1b-4b8b-ade5-1bdb8795752c.ino"
encryptedPayload: "U2FsdGVkX1/P3Fg5Z5puqVyBbENOjHlBUanTLAkl6mJJ4NHXnmL/u/H6V9yfPqpLClErpYWqngA4wqHd1IoMCrX+TrGSKaSSStOXCToKeD0="
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/led-matrix-32x16-rgb-ultrasonic-sensor-2a7075_cover.jpg"
lang: "en"
likes: 4
passwordHash: "2495ce547930efffd1328dbff9dced38c7637807d1cad4d773476a7581197898"
price: 2450
seoDescription: "Art experiment using 2 x 16 x 16 RGB LED matrix and an Ultrasonic Sensor to trigger random colors and positions. Arduino project."
tags:
  - "lights"
  - "art"
title: "งาน Matrix LED 32x16 RGB + Ultrasonic ตึงๆ วัยรุ่นจัดไป!"
tools: []
videoLinks:
  - "https://www.youtube.com/embed/R7i0qWiOLhA"
views: 4088