Modul SSD1306 Raspberry Pi Pico | SPI

Halo sobat, hari ini saya ingin menunjukkan SSD1306 dengan Raspberry Pi Pico. Hari ini kami ingin menghubungkan Oled ini ke pico melalui koneksi SPI. Semua kode dan perpustakaan diberikan, jadi jangan khawatir.

Raspberry Pi Pico

Raspberry Pi Pico adalah papan pengembangan yang berjalan terutama di MicroPython. Mirip dengan mikrokontroler lain seperti Arduino, NodeMCU dan lain-lain. Tetapi memiliki lebih banyak fitur dibandingkan dengan mereka. Terbuat dari Rp2040. Ini memiliki 264 KB RAM dan 2 MB ruang flash. Anda juga dapat memprogram PICO di C/C++ menggunakan arduino IDE. Untuk melakukan ini, cukup letakkan tautan ini di opsi Arduino IDE pilihan Anda. Lalu pergi ke Manajer papan dan cari Raspberry pi pico dan unduh Papan ini.

https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index  

Anda dapat menggunakan jenis komunikasi seperti SPI (2), I2C (2), UART, serial. Jadi jika Anda pandai Python, coba saja papan ini. Pustaka yang perlu Anda gunakan untuk menginstal sistem operasi di papan mudah dilakukan. Menggunakan Thonny IDE.

Untuk memperbarui sistem operasi atau menginstal, cukup tekan tombol (BOOTSEL) pada PICO dan sambungkan ke pico sambil menekan USB. Setelah papan Anda terdeteksi di Thonny IDE, Anda dapat melepaskan tombolnya. Sekarang klik Instal atau Tingkatkan Firmware di kanan bawah.

Bahan yang dibutuhkan:

  • Pico Raspberry
  • SSD1306 SPI OLED
  • Kabel jumper
  • Board
  • Thonny IDE diinstal pada sistem

Desain sirkuit:

PI raspberry Layar 7-pin lama
+5 volt VCC
GND GND
GPIO 18 pin SCK
GPIO 19 pin SDA
GPIO 20 pin RES
GPIO 17 pin DC
GPIO 16 pin CS

Pemrograman:

Buka Thonny IDE lalu tempel kode ini ke file baru:

 # MicroPython SSD1306 OLED driver, I2C and SPI interfaces  
 from micropython import const  
 import framebuf  
 SET_CONTRAST = const(0x81)  
 SET_ENTIRE_ON = const(0xA4)  
 SET_NORM_INV = const(0xA6)  
 SET_DISP = const(0xAE)  
 SET_MEM_ADDR = const(0x20)  
 SET_COL_ADDR = const(0x21)  
 SET_PAGE_ADDR = const(0x22)  
 SET_DISP_START_LINE = const(0x40)  
 SET_SEG_REMAP = const(0xA0)  
 SET_MUX_RATIO = const(0xA8)  
 SET_COM_OUT_DIR = const(0xC0)  
 SET_DISP_OFFSET = const(0xD3)  
 SET_COM_PIN_CFG = const(0xDA)  
 SET_DISP_CLK_DIV = const(0xD5)  
 SET_PRECHARGE = const(0xD9)  
 SET_VCOM_DESEL = const(0xDB)  
 SET_CHARGE_PUMP = const(0x8D)  
 class SSD1306(framebuf.FrameBuffer):  
   def __init__(self, width, height, external_vcc):  
     self.width = width  
     self.height = height  
     self.external_vcc = external_vcc  
     self.pages = self.height // 8  
     self.buffer = bytearray(self.pages * self.width)  
     super().__init__(self.buffer, self.width, self.height, framebuf.MONO_VLSB)  
     self.init_display()  
   def init_display(self):  
     for cmd in (  
       SET_DISP | 0x00, # off  
       # address setting  
       SET_MEM_ADDR,  
       0x00, # horizontal  
       # resolution and layout  
       SET_DISP_START_LINE | 0x00,  
       SET_SEG_REMAP | 0x01, # column addr 127 mapped to SEG0  
       SET_MUX_RATIO,  
       self.height - 1,  
       SET_COM_OUT_DIR | 0x08, # scan from COM[N] to COM0  
       SET_DISP_OFFSET,  
       0x00,  
       SET_COM_PIN_CFG,  
       0x02 if self.width > 2 * self.height else 0x12,  
       # timing and driving scheme  
       SET_DISP_CLK_DIV,  
       0x80,  
       SET_PRECHARGE,  
       0x22 if self.external_vcc else 0xF1,  
       SET_VCOM_DESEL,  
       0x30, # 0.83*Vcc  
       # display  
       SET_CONTRAST,  
       0xFF, # maximum  
       SET_ENTIRE_ON, # output follows RAM contents  
       SET_NORM_INV, # not inverted  
       # charge pump  
       SET_CHARGE_PUMP,  
       0x10 if self.external_vcc else 0x14,  
       SET_DISP | 0x01,  
     ): # on  
       self.write_cmd(cmd)  
     self.fill(0)  
     self.show()  
   def poweroff(self):  
     self.write_cmd(SET_DISP | 0x00)  
   def poweron(self):  
     self.write_cmd(SET_DISP | 0x01)  
   def contrast(self, contrast):  
     self.write_cmd(SET_CONTRAST)  
     self.write_cmd(contrast)  
   def invert(self, invert):  
     self.write_cmd(SET_NORM_INV | (invert & 1))  
   def show(self):  
     x0 = 0  
     x1 = self.width - 1  
     if self.width == 64:  
       # displays with width of 64 pixels are shifted by 32  
       x0 += 32  
       x1 += 32  
     self.write_cmd(SET_COL_ADDR)  
     self.write_cmd(x0)  
     self.write_cmd(x1)  
     self.write_cmd(SET_PAGE_ADDR)  
     self.write_cmd(0)  
     self.write_cmd(self.pages - 1)  
     self.write_data(self.buffer)  
 class SSD1306_I2C(SSD1306):  
   def __init__(self, width, height, i2c, addr=0x3C, external_vcc=False):  
     self.i2c = i2c  
     self.addr = addr  
     self.temp = bytearray(2)  
     self.write_list = [b"\x40", None] # Co=0, D/C#=1  
     super().__init__(width, height, external_vcc)  
   def write_cmd(self, cmd):  
     self.temp[0] = 0x80 # Co=1, D/C#=0  
     self.temp[1] = cmd  
     self.i2c.writeto(self.addr, self.temp)  
   def write_data(self, buf):  
     self.write_list[1] = buf  
     self.i2c.writevto(self.addr, self.write_list)  
 class SSD1306_SPI(SSD1306):  
   def __init__(self, width, height, spi, dc, res, cs, external_vcc=False):  
     self.rate = 10 * 1024 * 1024  
     dc.init(dc.OUT, value=0)  
     res.init(res.OUT, value=0)  
     cs.init(cs.OUT, value=1)  
     self.spi = spi  
     self.dc = dc  
     self.res = res  
     self.cs = cs  
     import time  
     self.res(1)  
     time.sleep_ms(1)  
     self.res(0)  
     time.sleep_ms(10)  
     self.res(1)  
     super().__init__(width, height, external_vcc)  
   def write_cmd(self, cmd):  
     self.spi.init(baudrate=self.rate, polarity=0, phase=0)  
     self.cs(1)  
     self.dc(0)  
     self.cs(0)  
     self.spi.write(bytearray([cmd]))  
     self.cs(1)  
   def write_data(self, buf):  
     self.spi.init(baudrate=self.rate, polarity=0, phase=0)  
     self.cs(1)  
     self.dc(1)  
     self.cs(0)  
     self.spi.write(buf)  
     self.cs(1)  

Simpan file ini sebagai ‘ssd1306.py’ ke pico Anda. Ini bukan kode asli, tetapi membantu untuk mengeksekusi kode asli atau dapat dikatakan bahwa itu adalah perpustakaan yang digunakan.

Sekarang kode asli berfungsi seperti ini. Pertama kita masuk ke fungsi SPI dan Pin dari modul mesin. Kemudian impor fungsi SSD1306_SPI dari perpustakaan yang disimpan di atas (gunakan SSD1306_I2C untuk komunikasi I2C). Setelah itu kita masuk ke modul yang berisi semua proses yang kita lakukan untuk menampilkan sesuatu di oled. Kami juga mengimpor beberapa modul waktu untuk menunda program.

from machine import Pin, SPI  
 from ssd1306 import SSD1306_SPI  
 import framebuf  
from time import sleep
from utime import sleep_ms

Sekarang kita tentukan port SPI mana yang akan kita sambungkan ke OLED, yaitu SPI (0). Pin untuk SPI adalah 18,19,16,17. SCK, MOSI, MISO, CS, masing-masing. Pin dc dan pertama dapat ditentukan secara manual dalam inisialisasi OLED SLE1306. Kami juga membuat objek “oled” yang menyimpan nilai OLED asli kami

spi = SPI(0, 100000, mosi=Pin(19), sck=Pin(18))
oled = SSD1306_SPI(128, 64, spi, Pin(17),Pin(20), Pin(16)) 

Kemudian pada perulangan while, kita mencoba cara lain untuk melanjutkan perulangan sampai menemukan interupsi keyboard. Jadi layar menampilkan teks ‘HELLO WORLD’ yang bergerak ke bawah dan ke kanan secara bersamaan hingga keyboard berhenti.

Kode:

Berikut kode lengkapnya. Lihat saja dan ingat untuk menyimpannya sebagai “main.py” di pico untuk dijalankan setiap kali pico di-restart atau dihidupkan.

from machine import Pin, SPI
from ssd1306 import SSD1306_SPI
import framebuf
from time import sleep
from utime import sleep_ms

spi = SPI(0, 100000, mosi=Pin(19), sck=Pin(18))
oled = SSD1306_SPI(128, 64, spi, Pin(17),Pin(20), Pin(16))
#oled = SSD1306_SPI(WIDTH, HEIGHT, spi, dc,rst, cs) use GPIO PIN NUMBERS
while True:
    try:
        for i in range(40):
            for j in range(56):
                
                oled.fill(0)
                oled.show()
                #sleep(1)
                oled.text("HELLO WORLD",i,j)
                oled.show()
                sleep_ms(10)
    except KeyboardInterrupt:
        break
  

Dengan ini, kami telah berhasil menyelesaikan pelatihan kami tentang SSD1306 raspberry Pi Pico menggunakan komunikasi SPI. Saya harap Anda menyukainya. Jika Anda memiliki masalah, beri tahu saya di komentar di bawah.