Raspberry Pi Pico MicroPython ADC Kullanımı

Raspberry Pi Pico’da MicroPython ADC Kullanımını anlattığımız bu yazımızda, ADC uyumlu pinleri, Pico’da ADC kullanımı anlattığımız bu içeriğimiz ile karşı karşıyasınız. Raspberry Pi Pico eğitim serimizi takip ediyorsanız temel kurulumu ve OLED ekran modülünün Raspberry Pi Pico ile nasıl arayüzleneceğini zaten biliyorsunuz demektir.

Bu içeriğimizde, bir ADC dönüşümü gerçekleştirmek için Pico kartını kullanacağız. Raspberry Pi Pico’nun dört adet 12 bit ADC kanalı vardır, ancak bunlardan biri dahili sıcaklık sensörüne bağlıdır. Kalan ADC’ler sırasıyla ADC0, ADC1 ve ADC2 olarak GPIO26, GPIO27 ve GPIO28’de bulunur. Aşağıdaki resimde kırmızıyla vurgulanan ADC pinlerini görebilirsiniz.

Raspberry Pi Pico MicroPython ADC Kullanımı MicroPython ADC Kullanımı

Gerekli Malzemeler

Raspberry Pi Pico üzerinde ADC işlemlerini gerçekleştirmek için aşağıdaki bileşenlere ihtiyacımız var:

  • Raspberry Pi Pico
  • Potansiyometre (10K ohm)
  • I2C 128×64 OLED 1.3″ Ekran Modülü
  • Bağlantı Kabloları
  • Devre tahtası-breadboard

Bağlantı Şeması

Aşağıdaki devre şemasında görüldüğü gibi Raspberry Pi Pico’nun 3.3v, GPIO28 ve GND pinlerine bir potansiyometre takılmıştır. OLED ekranın SDA ve SCL pinleri sırasıyla GPIO16 ve GPIO17’ye bağlanırken, OLED modülünün VCC pini Pico kartının 3.3v pinine bağlıdır. OLED ekran modülünün GND pini, Raspberry Pi Pico’nun GND pinine bağlıdır.

Raspberry Pi Pico MicroPython ADC Kullanımı MicroPython ADC Kullanımı

MicroPython kullanarak Raspberry Pi Pico üzerinde ADC

Raspberry Pi Pico’da 12 bit çözünürlüğe sahip üç ADC kanalımız var. Ancak Pico’yu MicroPython ile programladığımızda sonuç olarak 16 bit çözünürlük elde ederiz. Aslında, MicroPython ADC kütüphanesinde 12-bit çözünürlüğü 16-bit çözünürlüğe ölçeklendirdiler, bu nedenle 4096 (yani 2^12) yerine 65535 (yani 2^16) maksimum ADC değeri alacağız. Potansiyometrenin çıkış pinini GPIO28 veya ADC2’ye bağladığımız için, ADC2 kanalını kullanacağız ve ADC’nin sonuç değerini 0V ile 3,3V arasında dönüştüreceğiz. Gerilim değerini elde etmek için, bir dönüştürme faktörünü elde edilen ADC değeriyle çarpacağız.

Kodlama bölümüne başlamadan önce buradaki GitHub deposunu indirin. Ardından “T3_ADC_on_Pico” klasörünü açın. Kod klasöründe iki dosyamız var, yani “main.py” ve “ssd1306.py”. OLED ekran modülünün pico ile nasıl arabirim oluşturacağına ilişkin önceki öğreticimizde “ssd1306.py” hakkında zaten tartışmıştık. Şimdi, aşağıdaki “main.py” dosyasına odaklanalım.

Programlama Kısmı

Raspberry Pi Pico’da MicroPython programlamasını görelim. “main.py” dosyasında, “machine.py” kütüphanesine ve “ssd1306.py” kütüphanesine sahibiz. machine kitaplığı, I2C, ADC, SPI vb. temel işlemler için işlevlere sahip yerleşik bir MicroPython kitaplığıdır. OLED ekran için ssd1306.py kitaplığı kullanılır. OLED ekran modülünün Raspberry Pi Pico ile nasıl arayüzleneceğine ilişkin önceki eğitimimizde bu kitaplıktan zaten bahsetmiştik. utime.py kitaplığı, programda zaman gecikmeleri vermek için kullanılır.

from machine import Pin, I2C, ADC
from ssd1306 import SSD1306_I2C
import utime

machine.ADC(28) GPIO28 olan ADC kanalını tanımlamak için kullanılır. conversion_factor değişkeni, elde edilen ADC değeriyle çarpılarak gerçek voltajı hesaplamak için kullanılacaktır. Ardından, OLED ekranının pico öğreticisiyle arabirim oluşturmasında tartıştığımız gibi bir I2C iletişimini başlatmak için kullanılan I2C(0, scl=Pin(17), sda=Pin(16), freq=200000) satırını kullandık. “SSD1306_I2C()” işlevi, OLED ekranda işlemleri gerçekleştirmek için kullanılabilecek “oled” nesnesini oluşturmak için kullanılır.

analog_value = machine.ADC(28)
conversion_factor = 3.3 / (65535)
WIDTH  = 128       # oled display width
HEIGHT = 64         # oled display height
i2c = I2C(0, scl=Pin(17), sda=Pin(16), freq=200000)      
oled = SSD1306_I2C(WIDTH, HEIGHT, i2c)              

Aşağıdaki kodda, OLED ekranı oled.fill(0) işlevi kullanılarak temizlenecektir. Ardından, oled.text() işlevini kullanarak bazı metinleri karşılık gelen konumlarıyla birlikte görüntülüyoruz. oled.show() işlevi, bu metinleri OLED ekranında görüntüler.

oled.fill(0)
oled.text("devreyakan.com",5,8)
oled.text("ADC",28,40)

oled.show()
utime.sleep(1)

Aşağıdaki while döngüsünde, analog_value.read_u16() işlevini kullanarak GPIO28’de ADC’yi okur ve bunu okuma değişkeninde saklarız. Ancak, daha önce tartıştığımız gibi, bu adc değeri 16 bit çözünürlüktedir çünkü MicroPython’daki read_u16() işlevi 16 bit çözünürlük değeri döndürür. Bu nedenle, bu 16 bitlik ADC değerini 0V ila 3,3V aralığına eşlemek için conversion_factor okuma değişkeniyle çarparız. voltageValue değişkeni daha sonra oled.text() işlevi kullanılarak görüntülenir.

while True:
    oled.fill(0)
    reading = analog_value.read_u16()     
    print("ADC: ",reading)
    utime.sleep(0.2)
    voltageValue = reading* conversion_factor
    oled.text("Voltage:",5,8)
    oled.text(str(voltageValue)+"V",15,25)
    oled.show()
    utime.sleep(1)

Şimdi, Thonny IDE’de “main.py” ve “ssd1306.py” dosyalarını açın. Başlamak için klavyenizdeki “ctrl+shift+s” tuşlarına basarak “ssd1306.py” dosyasını Pico kartına kaydedin. Dosyaları kaydetmeden önce Pico kartınızın bilgisayarınıza bağlı olduğundan emin olun. Kodu kaydettiğinizde, aşağıdaki resimde gösterildiği gibi bir açılır pencere görünecektir. Önce Raspberry Pi Pico’yu seçmeli, ardından dosyayı “ssd1306.py” olarak adlandırmalı ve kaydetmelisiniz. Ardından, “main.py” dosyası için işlemi tekrarlayın. Bu prosedür, Pico açıkken programı çalıştırmanızı sağlar.

Raspberry Pi Pico MicroPython ADC Kullanımı MicroPython ADC Kullanımı

Aşağıdaki videoda, potansiyometrenin değeri değişirken voltaj seviyesinin de 0V ile 3,3V arasında değiştiğini görebilirsiniz. Programlama kısmı ile ilgili herhangi bir şüpheniz varsa, yorumlarda belirtebilirsiniz.

from machine import Pin, I2C, ADC
from ssd1306 import SSD1306_I2C

import utime
analog_value = machine.ADC(28)
conversion_factor = 3.3 / (65535)

WIDTH  = 128                                            
HEIGHT = 64                                            

i2c = I2C(0, scl=Pin(17), sda=Pin(16), freq=200000)       
print("I2C Address      : "+hex(i2c.scan()[0]).upper()) 
print("I2C Configuration: "+str(i2c))                   
oled = SSD1306_I2C(WIDTH, HEIGHT, i2c)                  


oled.fill(0)
oled.text("devreyakan.com",5,8)
oled.text("ADC",28,40)

oled.show()
utime.sleep(1)

while True:
    oled.fill(0)
    reading = analog_value.read_u16()     
    print("ADC: ",reading)
    utime.sleep(0.2)
    voltageValue = reading* conversion_factor
    oled.text("Voltage:",5,8)
    oled.text(str(voltageValue)+"V",15,25)
    oled.show()
    utime.sleep(1)

Yorum yapma özelliği, forum tarafından gelen istek sebebiyle kapatılmıştır. Lütfen tartışmalar ve sorularınız için topluluk forumumuza katılın.