آموزش رزبری پایپروژه رزبری پای

راه اندازی نمایشگر OLED SSD1306 با رزبری پای پیکو

در این آموزش ، ما قصد داریم یک ماژول صفحه نمایش OLED را با برد Pico راه اندازی کنیم. شما می توانید در پایان این آموزش ارتباط I2C را در رزبری پای پیکو برقرار کنید. در اینجا ، ما قصد داریم برخی از رشته ها را روی صفحه نمایش OLED با استفاده از Micropython نمایش دهیم.

مدار اتصال OLED SSD1306 به رزبری پای پیکو

نحوه اتصال ماژول نمایشگر OLED به Raspberry Pi Pico در تصویر زیر آورده شده است. پین SDA ماژول نمایش OLED به GPIO16 (Pin21) و پین SCL به GPIO17 (Pin22) متصل است. پین Vcc به پین ​​3.3v برد Pico وصل شده است که Pin36 است. پایه GND ماژول به پایه GND برد Pico متصل است که Pin38 است.

مدار اتصال OLED SSD1306 به رزبری پای پیکو

سخت افزار مورد نیاز

قطعات مورد نیاز را از فروشگاه قطعات آیرنکس تهیه کنید.

کتابخانه نمایشگر OLED در MicroPython

در ابتدا ، یک پوشه جدید ایجاد کنید که می خواهید فایل های کد خود را در آن ذخیره کنید. سپس باید کتابخانه را از https://github.com/Circuit-Digest/Raspberry_Pi_Pico_Tutorial در Raspberry Pi Pico با استفاده از MicroPython بارگیری کنید. به پوشه “T3_Interfacing_An_OLED” بروید. شما باید فایل های “main.py” و “ssd1306.py” را کپی کرده و سپس این فایل ها را در پوشه ای که برای ذخیره فایل های کد خود ایجاد کرده اید ، جایگذاری کنید. بنابراین ، ما در حال حاضر دو فایل داریم. فایل “main.py” حاوی کد نمایش متن و تصاویر است و “ssd1306.py” که کتابخانه ماژول صفحه نمایش OLED است. قبل ورود به قسمت توضیحات کد باید بدانید باید که تصاویر خود را به bitmap تبدیل کنید. می توانید فایل “img_to_bmp.py” دیگری را در پوشه “T3_Interfacing_An_OLED” مشاهده کنید. برای اجرای این فایل به محیط پایتون نیاز دارید. من از Python3.6 برای اجرای این فایل استفاده کرده ام.

برای یادگیری آردوینو (برنامه نویسی، ساخت ربات، ارتباط با اندروید) روی دوره آموزش آردوینو کلیک کنید.
برای یادگیری کامل الکترونیک روی دوره آموزش الکترونیک کلیک کنید.

توضیح کد فایل img_to_bmp.py

شما باید کتابخانه “PIL” زیر را با استفاده از دستور “pip” در محیط پایتون خود نصب کنید. input_filename_with_path شامل مسیر فایل بدون پسوند است. در مورد من ، فایل تصویر و فایل img_to_bmp.py در یک پوشه هستند. بنابراین ، من فقط نام فایل تصویر را ذکر کردم. “Image.open (file_in)” فایل تصویری مورد نظر را باز می کند و سپس با استفاده از توابع transpose() و convert() برخی عملیات ها را روی تصویر را انجام می دهیم. تابع save() برای ذخیره تصویر تبدیل شده به عنوان یک فایل خروجی با پسوند “.mpmp” استفاده می شود. سپس از Image.open (file_out، mode = ‘r’) برای بازکردن فایل “bmp” و از تابع io.BytesIO() برای خواندن bitmaparray تصویر استفاده می شود. img_bytes برای ذخیره آرایه bitmap استفاده می شود که در خروجی دریافت می کنیم. print(img_bytes) آرایه بایت تصویر ورودی را چاپ می کند. ما برای ارجاع بیشتر در فایل “main.py” باید این آرایه بایت را کپی کنیم. print(‘Image Resolution: ({0},{1})’.format(img.width,img.height)) وضوح تصویر را چاپ می کند. ما باید از این وضوح در فایل “main.py” خود استفاده کنیم. اطمینان حاصل کنید که وضوح تصویر زیاد نیست. برای کاهش وضوح تصویر می توانید از هر مبدل آنلاینی استفاده کنید.

import io
from PIL import Image
input_filename_with_path = "rpilogo1"
file_in = input_filename_with_path + ".png"
file_out = input_filename_with_path+".bmp"
img = Image.open(file_in)
img = img.transpose(Image.FLIP_LEFT_RIGHT)
threshold = 65
func = lambda x : 255 if x > threshold else 0
img = img.convert('L').point(func,mode='1')
img.save(file_out)
img = Image.open(file_out,mode='r')
img_bytes = io.BytesIO()
img.save(img_bytes,format='BMP')
img_bytes = img_bytes.getvalue()
print("Copy this bitmap array:")
print('\n')
print(img_bytes)
print('\n')
print('Image Resolution: ({0},{1})'.format(img.width,img.height))

کتابخانه نمایشگر OLED در MicroPython

تصویر بالا خروجی img_to_bmp.py است. من قبلاً وضوح تصویر ورودی را به اندازه 32×32 تبدیل کرده ام.

بنابراین ، اکنون ما آرایه بایت تصویر را داریم. بیایید کد فایل “main.py” زیر را بررسی کنیم. ما از کتابخانه “machine” برای انجام عملیات سخت افزاری اولیه با کمک MicroPython استفاده می کنیم. سپس ما از کتابخانه “ssd1306” استفاده می کنیم که اخیراً به برد Raspberry Pi Pico اضافه کرده ایم. از کتابخانه “utime” برای دسترسی به ویژگی زمان داخلی برد رزبری پای پیکو استفاده می شود. کتابخانه framebuf ، sys برای انجام عملیات آرایه بایت استفاده می شود.

from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
import utime
import framebuf,sys
WIDTH  = 128                                            # عرض صفحه نمایش
HEIGHT = 64

متغیر image_byte_arr شامل آرایه بایت (آرایه bitmap) تصویر است که باید نمایش داده شود. آرایه بایت را که از خروجی فایل img_to_bmp.py کپی کرده اید در اینجا قرار دهید. سپس عرض و ارتفاع تصویر را در خروجی فایل img_to_bmp.py ذکر کنید.

image_byte_arr = b'BM\xbe\x00\x00\x00\x00\x00\x00\x00>\x00\x00\x00(\x00\x00\x00 \x00\x00\x00 \x00\x00\x00\x01\x00\x01\x00\x00\x00\x00\x00\x80\x00\x00\x00\xc4\x0e\x00\x00\xc4\x0e\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xfc?\xff\xff\xfb\xcf\xff\xff\xe7\xf7\xff\xff\xc7\xf1\xff\xffs\xc6\x7f\xfe\xf1\xcf\xbf\xfd\xf7\xef\xbf\xfd\xf7\xf7\xdf\xff\xff\xf7\xdf\xfb\xef\xf3\xdf\xf9\xc7\xf1\x8f\xf6\x13\xeco\xf7|>w\xf7~\x7fw\xf7\xfe\x7fw\xf7\xff\x7fo\xfb\x7f\x7fo\xfc~~\x1f\xfd\xbc=\xff\xff\xe3\xe3\xbf\xfe\xf7\xf7\xbf\xff\x7f\xff\x7f\xff3\xe4\xff\xffx\x1f\x7f\xfe\xfc?\xbf\xfd\xfe?\xff\xfb\xff\x7f\xdf\xfb\xff\x7f\xdf\xfb\xfe\x7f\xef\xfb\xff\xbf\xef\xf9\xfb\xdf\x9f\xff\x0f\xf0\xff'
image_width = 32
image_height = 32

تابع ()I2C برای راه اندازی اولیه ارتباط I2C استفاده می شود. این عملکرد شماره کانال I2C را می گیرد زیرا ما 2 کانال I2C در برد پیکو داریم. در اینجا من از I2C0 استفاده می کنم. اگر از I2C1 استفاده می کنید ، اولین پارامتر را از 0 به 1 تغییر دهید. دو پارامتر بعدی برای نشان دادن پین های SCL و SDL برای ارتباط استفاده می شود. در اینجا من به ترتیب از 17 و 16 پین برای SCL و SDL استفاده می کنم. سپس پارامتر بعدی تابع I2C اشاره به فرکانس ارتباط I2C است. i2c.scan() برای بدست آوردن آدرس دستگاه مورد نظر استفاده می شود.

i2c = I2C(0, scl=Pin(17), sda=Pin(16), freq=200000) #پین های ارتباط
print("I2C Address      : "+hex(i2c.scan()[0]).upper()) # نمایش آدرس دستگاه
print("I2C Configuration: "+str(i2c))                   # پیکربندی I2C

تابع SSD1306_I2C() برای راه اندازی اولیه صفحه نمایش OLED و ذخیره آن در “oled” به عنوان یک object استفاده می شود. این عملکرد معمولاً عرض ، ارتفاع و حالت ارتباط دستگاه را می گیرد. سپس برخی از توابع از پیش تعریف شده را در کتابخانه ssd1306 داریم که می توان آنها را با استفاده از object “oled” فراخوانی کرد. oled.fill (0) برای پاک کردن صفحه استفاده می شود.

oled = SSD1306_I2C(WIDTH, HEIGHT, i2c) # Init oled display

تابع ()displayText برای نمایش متن روی OLED استفاده می شود. شما باید text، position، clear_oled و پارامتر show_text را به تابع منتقل کنید. position به طور پیش فرض روی (0،0) تنظیم شده است. اما می توانید موقعیت متن را با این پارامتر تغییر دهید. موقعیت متن باید در قالب چندگانه (به عنوان مثال: (x ، y) باشد. Clear -oled و show_text به طور پیش فرض روی True تنظیم شده است اما می توانید با این متغیرها را به False تغییر دهید.

def displayText(text, position=(0,0),clear_oled=True,show_text=True):
    if clear_oled:
        oled.fill(0) # Clear the oled display in case it has junk on it.
    oled.text(text,position[0],position[1]) # dispaying text
    if show_text:
        oled.show()  # Updating the display

تابع ()displayImage برای نمایش تصویر بر روی صفحه نمایش OLED استفاده می شود. این تابع دارای پارامترهای image_byte_array ، image_resolution ، position ، clear_oled و show_img است. ما باید متغیر image_byte_arr را به جای پارامتر image_byte_array منتقل کنیم. سپس وضوح تصویر شامل image_resolution است و ارتفاع تصویر باید در حالت تاپل باشد. (مثال: (image_width, image_height)). سپس می توانید موقعیت تصویر را در OLED با استفاده از پارامتر position منتقل کنید. position باید در قالب tuple باشد و به طور پیش فرض روی (0،0) تنظیم شده است. پارامترهای clear_oled و show_img به ترتیب روی False و True تنظیم شده اند. ما می توانیم این ها را بر اساس نیاز خود در آینده تغییر دهیم. تابع bytearray() برای گرفتن بیت مپ تصویر استفاده می شود. سپس تابع framebuf.FrameBuffer() برای ذخیره هر بیت استفاده می شود. FrameBuffer دارای چندین نوع است. ما از حالت MONO_HMSB فریم بافر استفاده می کنیم. سپس باید از تابع ()oled.blit برای نمایش قاب تصویر روی ماژول OLED استفاده کنیم.

#OLED Image display function
def displayImage(image_byte_array, image_resolution,position=(0,0),clear_oled=False,show_img=True): 
    img = bytearray(image_byte_array)
    img = bytearray([img[i] for i in range(len(img)-1,-1,-1)])
    frame = framebuf.FrameBuffer(img, image_resolution[0], image_resolution[1], framebuf.MONO_HMSB) # frame buffer types: MONO_HLSB, MONO_VLSB, MONO_HMSB
    if clear_oled:
        oled.fill(0) # clear the OLED
        print("clear")
    if show_img:
        oled.blit(frame, position[0],position[1]) # show the image at location (x=0,y=0)
        oled.show()
        print("display")

کد زیر برای نمایش متون روی OLED و حرکت دادن آن متون در OLED استفاده می شود. تابع displayText() را دوبار زیر حلقه for فراخوانی کردیم و text1 و text2 را به عنوان رشته با موقعیت های مربوطه “(x، 0)” و (WIDTH-x، 20) ارسال میکنیم. من Clear_oled را False و show_text را True برای text1 و برای text2 را Clear_oled را True و text_text را True قرار دادم. این به ما امکان می دهد متن ها را در OLED در هر تکرار نمایش دهیم. وقتی مقدار متغیر “x” به انتهای تکرار که عرض OLED است برسد ، برنامه از حلقه for خارج می شود.

#Scrolling Text on OLED
text1 = "Welcome to"
text2 = "CircuitDigest"
for x in range(0, WIDTH):
    displayText(text1,(x,0),clear_oled=False,show_text=True)
    displayText(text2,(WIDTH-x,20),clear_oled=True, show_text=True)
    if x == WIDTH:
        break
    else:
        x+=5

برای نمایش تصویر از تابع displayImage استفاده کردم. من پارامترهای image_byte_arr ، (width_width ، image_height) ، (x ، y) ، و clear_oled را ارائه کردم. در اینجا “(x ، y)” موقعیت تصویر است که در قالب تاپل هستند. عرض تصویر و ارتفاع تصویر نشان دهنده وضوح تصویر در فرمت تاپل است. سپس من clear_oled را False قرار دادم و متغیر show_img را تنظیم نکردم زیرا به طور پیش فرض روی True تنظیم شده است. بنابراین ، همچنین می توانید از تابع displayImage() و displayText() برای نمایش تصویر و متن در OLED استفاده کنید.

همچنین اگر در مورد این مطلب سوالی داشتید در انتهای صفحه در قسمت نظرات بپرسید
while True:
    y=0
    text = "Interfacing OLED"
    oled.fill(0)
    #Animating Text And Image Horizontaly
    for x in range(0,WIDTH-image_width):
        displayImage(image_byte_arr,(image_width,image_height),(x,y),clear_oled=False)
        displayText(text,(x,y+40),clear_oled=False,show_text=True)
        if x == (WIDTH-image_width)-1:
            break
        else:
            x+=2
            oled.fill(0)
    for x in range(WIDTH-image_width,-1,-1):
        displayImage(image_byte_arr,(image_width,image_height),(x,y),clear_oled=True)
        displayText(text,(x,y+40),clear_oled=False,show_text=True)
        if x == 0:
            break
        else:
            x-=2

اکنون ، فایل “main.py” و “ssd1306.py” را در Thonny IDE باز کنید. ابتدا باید فایل “ssd1306.py” را در برد Pico با فشار دادن “ctrl+shift+s” صفحه کلید خود ذخیره کنید. قبل از ذخیره فایل ها ، مطمئن شوید که برد Pico خود را به لپ تاپ خود متصل کرده اید. وقتی کد را ذخیره می کنید ، پنجره ای به مانند تصویر زیر به شما نشان می دهد. شما باید Raspberry Pi Pico را انتخاب کرده و سپس نام فایل را “ssd1306.py” بگذارید و روی ذخیره کلیک کنید. سپس همین روش را برای فایل “main.py” انجام دهید. این روش به شما امکان می دهد برنامه را هنگامی که Pico روشن می شود اجرا کنید.

اتصال نمایشگر OLED به رزبری پای Pico

موارد موجود در فایل : سورس کامل، فایل PCB

دانلود فایل های پروژه

برای مشاهده توضیحات روی دوره مورد نظر کلیک کنید.

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام آیرنکس را دنبال کنید.

تصویر از محمد رحیمی

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید را قرار دهم. (در خصوص سوال در مورد این مطلب از قسمت نظرات همین مطلب اقدام کنید) سعی میکنم تمام نظرات را پاسخ دهم.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *