กลับไปหน้ารวมไฟล์
30-fps-video-on-ssd1106-oled-display-70e45f.md

30 FPS Video on SSD1106 OLED Display

โปรเจกต์นี้มีจุดมุ่งหมายเพื่อทดสอบขีดจำกัดสูงสุดของ SSD1106 OLED display ซึ่งโดยทั่วไปมักถูกจำกัดให้แสดงผลข้อความพื้นฐานหรือกราฟิกแอนิเมชันง่ายๆ ในโปรเจกต์ Embedded ทั่วไป อย่างไรก็ตาม เป้าหมายของผมในครั้งนี้คือการก้าวข้ามขีดจำกัดเหล่านั้นด้วยการสตรีม Real-time video ลงบนหน้าจอจิ๋วนี้ การบรรลุเป้าหมายนี้ แน่นอนว่าต้องเผชิญกับความท้าทายทางเทคนิคหลายประการ โดยเฉพาะอย่างยิ่งเกี่ยวกับ "Bandwidth" และ "Color Depth"

ข้อจำกัดของ Hardware และการเพิ่มประสิทธิภาพ Interface (การ Overclock SPI)

ความท้าทายแรกและสำคัญที่สุดคือข้อจำกัดด้าน Bandwidth ของ Interface ระหว่าง microcontroller กับ SSD1106 display จอแสดงผลนี้รองรับความละเอียด 128x64 pixels ในการส่งข้อมูลภาพหนึ่งเฟรมไปยังหน้าจอ (Frame Buffer) เราจำเป็นต้องส่งข้อมูลทั้งหมด 1,024 bytes (128 * 64 / 8 bits) หากเราต้องการ Frame rate ที่ราบรื่น การสื่อสารแบบ SPI มาตรฐานอาจไม่เพียงพอ

เพื่อแก้ปัญหานี้ ผมตัดสินใจที่จะ overclock การเชื่อมต่อ SPI ให้สูงถึง 2MHz ผมเลือกใช้ Library ที่มี Code ที่ถูก Optimized (Optimized Library) ซึ่งเข้าถึง Registers โดยตรง เพื่อลด Overhead ของระบบและเพิ่มประสิทธิภาพการส่งข้อมูลให้สูงสุด นอกจากนี้ สำหรับการรับ video data จากคอมพิวเตอร์ผ่านการสื่อสารแบบ serial (UART) ผมได้ตั้งค่า Baud rate ให้สูงถึง 1MHz เพื่อให้มั่นใจว่า video data จากแหล่งกำเนิดจะไม่พบกับ Bottleneck ก่อนที่จะเข้าสู่ processor

การจำลองภาพ Grayscale ด้วยเทคนิค Dithering

ข้อจำกัดทางกายภาพอีกประการของ OLED displays คือ แต่ละ pixel สามารถแสดงได้เพียงสองสถานะ: "On" หรือ "Off" หรือที่เรียกว่า 1-bit color สิ่งนี้ทำให้ไม่สามารถแสดง Grayscale ใน video ปกติได้

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

วิดีโอสาธิต

ตรรกะของ Software (ภาพรวม Logic)

กระบวนการทำงานแบ่งออกเป็นสองส่วนหลัก:

  1. ฝั่งคอมพิวเตอร์ (Source Node): ทำการประมวลผล video ต้นฉบับโดย downsampling ภาพให้เป็น 128x64 pixels และคำนวณ Dithering สำหรับแต่ละ frame จากนั้นจึงทำการ pack data ลงใน Byte Stream และส่งออกผ่าน Serial Port ที่ความเร็ว 1Mbps
  2. ฝั่ง Microcontroller (Display Node): รอรับ data จาก UART Buffer เมื่อได้รับ data ครบหนึ่ง frame (1,024 bytes) microcontroller จะสั่งให้ SPI ความเร็วสูงอัปเดต data ไปยัง SSD1106 display driver ทันที การทำงานแบบวนซ้ำ (Loop) ที่รวดเร็วนี้ช่วยให้เราสามารถรับชม Real-time video บนหน้าจอขนาดเล็กนี้ได้

โปรเจกต์นี้แสดงให้เห็นว่า แม้จะมีข้อจำกัดด้าน hardware ที่ดูเหมือนจะเป็นไปไม่ได้ แต่ด้วยการ Optimized algorithm และการดึงประสิทธิภาพจาก communication protocols เราก็สามารถผลักดันอุปกรณ์ราคาไม่แพงให้ทำงานที่ซับซ้อนได้อย่างมีประสิทธิภาพ คุณมีความคิดเห็นอย่างไรเกี่ยวกับเทคนิคการ Optimized performance ในลักษณะนี้? สามารถแบ่งปันมุมมองของคุณได้เลย!

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

title: "30 FPS Video on SSD1106 OLED Display"
description: "I wondered if the SSD1106 can be used for more than text & simple graphics. After a bit of overclocking I managed to stream video at 30 FPS."
author: "saadsaif0333"
category: "Screens & Displays"
tags:
  - "lights"
  - "entertainment system"
  - "communication"
views: 20359
likes: 15
price: 1999
difficulty: "Intermediate"
components:
  - "1x 0.96\" OLED 64x128 Display Module"
  - "1x Arduino Nano R3"
tools: []
apps:
  - "1x OpenCV"
  - "1x Arduino IDE"
downloadableFiles:
  - "https://github.com/SaadOjo/SSD1106_monitor"
  - "https://github.com/SaadOjo/SSD1106_monitor"
documentationLinks: []
passwordHash: "8a8369cf6388e23324cf3639b6e43800fb37b2ed82c168691b2476b50b27cfce"
encryptedPayload: "U2FsdGVkX1/TOqmp7VuvVVL+ahD//Zj61BKx7DXx13H23cu2Q1z3vsKwCXO09pJffAtFOscsXGUwA7cY6Y1TOyQYDkP+bBjuK6+BDlnblBg="
seoDescription: "Learn how to stream 30 FPS Video on an SSD1106 OLED Display using overclocking for high-performance projects."
videoLinks:
  - "https://www.youtube.com/embed/aljv_NSFFC8"
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/30-fps-video-on-ssd1106-oled-display-70e45f_cover.jpg"
lang: "th"