تصویر شاخص نوشته: نمایشگر OLED (SSD1306) چطور تصویر می‌سازد؟

نمایشگر OLED (SSD1306) چطور تصویر می‌سازد؟

۲۷ تیر ۱۴۰۵ خروجی‌ها و نمایشگرها

در فصل «نمایشگر OLED» برای اولین بار توانستیم روی ربات متن و عدد نشان بدهیم؛ بدون این‌که به کامپیوتر وصل باشیم. آن صفحه‌ی کوچکِ سیاه‌وسفید یک OLED با تراشه‌ی راه‌اندازِ SSD1306 بود. بیا ببینیم چرا این نمایشگر این‌قدر باکیفیت و کم‌مصرف است.

چطور واقعاً کار می‌کند

OLED سرنام Organic Light Emitting Diode است. نکته‌ی اصلی این است که هر پیکسل خودش یک LED ریزِ آلی است و نور خودش را می‌سازد. این با نمایشگر LCD فرق اساسی دارد: در LCD یک لامپِ پس‌زمینه همیشه روشن است و کریستال‌ها فقط جلوی نورش را می‌گیرند، ولی در OLED پیکسلِ خاموش یعنی هیچ نوری؛ برای همین سیاهیِ واقعی، کنتراستِ بالا و صفحه‌ی خیلی نازک داریم.

اما مغزِ ماجرا تراشه‌ی SSD1306 است. این تراشه یک حافظه‌ی تصویری (framebuffer) دارد: برای صفحه‌ی 128×64 پیکسل، هر پیکسل فقط یک بیت است (روشن یا خاموش)، یعنی مجموعاً حدود ۱۰۲۴ بایت. تو تصویرت را در این حافظه می‌چینی و تراشه خودش کارِ سخت و سریعِ روشن‌وخاموش‌کردنِ پیکسل‌ها را انجام می‌دهد.

ارتباط با تراشه از طریق I²C است؛ پروتکلی که فقط با دو سیم کار می‌کند: SDA (داده) و SCL (کلاک). زیباییِ I²C این است که چند دستگاه می‌توانند همین دو سیم را با هم به اشتراک بگذارند؛ مثلاً نمایشگر OLED و یک سنسورِ دیگر روی همان SDA و SCL بنشینند. برای این‌که قاطی نشوند، هر دستگاه یک آدرس یکتا دارد تا برد بداند دارد با کدام حرف می‌زند. آدرسِ استانداردِ این نمایشگر 0x3C است (که در مبنای ده می‌شود ۶۰). به همین دلیل وقتی دستورِ scan را می‌زنی، عددِ ۶۰ را می‌بینی.

الگوی کارِ همیشگی هم ساده است: در حافظه بنویس، بعد حتماً show() را صدا بزن تا داده روی I²C به تراشه فرستاده و صفحه به‌روز شود. داخلِ تراشه این ۶۴ سطر به‌صورت هشت «صفحه» (page) هرکدام به بلندیِ ۸ پیکسل سازمان‌دهی شده و هر بایت یک ستونِ عمودیِ ۸ پیکسلی را روشن یا خاموش می‌کند؛ ولی خوشبختانه کتابخانه‌ی ssd1306 همه‌ی این جزئیات را برایت پنهان می‌کند و تو فقط با text و pixel کار داری.

کاربردهای واقعی

  • ساعت‌های هوشمند و دستبندهای تناسب‌اندام، چون کم‌مصرف و نازک‌اند.
  • صفحه‌ی کوچکِ برخی گوشی‌ها و پخش‌کننده‌های موسیقی.
  • داشبورد و نمایشگرهای خودرو.
  • دستگاه‌های پزشکیِ همراه و پنلِ لوازم خانگی.
  • نسخه‌ی بزرگش همان تلویزیون‌ها و مانیتورهای OLED باکیفیت است.

در عمل: سیم‌کشی و کد

فقط دو سیمِ داده: SCL به GPIO 22 و SDA به GPIO 21، به‌علاوه‌ی تغذیه‌ی 3V3 و GND. اول شیءِ I²C و بعد نمایشگر را می‌سازیم، متن می‌نویسیم و با show() نشانش می‌دهیم:

from machine import Pin, I2C
import ssd1306

i2c = I2C(0, scl=Pin(22), sda=Pin(21))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)

oled.fill(0)                      # safhe ra pak kon
oled.text("Salam Robot!", 0, 0)
oled.text("128 x 64", 0, 20)
oled.show()                       # hatman show!

اشتباه‌های رایج

  • آدرسِ اشتباه: بعضی ماژول‌ها روی 0x3D هستند نه 0x3C؛ اگر چیزی نمایش داده نشد، اول scan بگیر.
  • جابه‌جایی SDA و SCL: این دو سیم نباید قاطی شوند.
  • فراموش‌کردنِ show(): شایع‌ترین اشتباه؛ در حافظه می‌نویسی ولی چون show() را نمی‌زنی، صفحه خالی می‌ماند.
  • رزولوشنِ اشتباه: بعضی نمایشگرها 128×32 هستند؛ اگر عددِ اشتباه بدهی، تصویر به‌هم می‌ریزد.
  • انتظار رنگ: این نمایشگر تک‌رنگ است، نه رنگی.

همین حالا امتحان کن

متنت را روی صفحه‌ی مجازی ببین: شبیه‌ساز OLED را باز کن. برای یادگیری کاملِ نوشتن، شمارنده و رسمِ روی صفحه سراغ فصل نمایشگر OLED برو.