Raspberry Pi Pico İnceleme (MicroPython)
|Merhaba,
Bu konuda Raspberry Pi yeni ürünü olan Raspberry Pi Pico’ yu inceleyeceğiz. Öncelikle kart Türkiye’ de çok geç stoklara geldiği için cihazı geç inceleyebildim. İncelemelerim sonucunda kartın 3 farklı şekilde programlanabildiğini gördüm. Bunlardan ilki C API’ si kullanılarak yapılan programlama. Bu biraz daha ileri seviye geliştiriciler için hazırlanmış daha karmaşık bir programlama yöntemidir. Ancak Raspberry Pi Pico kullanılarak maksimum performans ancak C dili ile alınabilmektedir. İlgilenenler için C/C++ SDK’ nın nasıl kullanıldığına ait dökümana bağlantıdan ulaşabilirsiniz. İkinci olarak MicroPython kullanarak Pico’ nuzu programlayabilirsiniz. Raspberry Pi Pico official olarak Micropython kullanımı destekler. Micropython kullanımı hakkında hazırlanmış SDK kullanım dokümanına bağlantıdan ulaşabilirsiniz. Bu şekilde programlama C ile programlama yöntemine göre çok daha basittir. Ayrıca internet üzerinde çok daha fazla kaynak bulunabilir. Bu konuda gerçekleştireceğimiz uygulamada da MicroPython kullanacağız. Son yöntem de Arduino IDE’ si ile kullanımdır. Arduino IDE’ si kullanımı şu an Pico tarafından official olarak desteklenmemektedir. Arduino IDE’ si ile kullanım hakkındaki bir videoya bağlantıdan ulaşabilirsiniz. Bunlara ek olarak Raspberry Pi tarafından hazırlanmış kullanım kitabına bağlantıdan ulaşabilirsiniz. Bağlantıya gittiğinizde “Free Download” butonuna bastıktan sonra isterseniz bağış yaparak ya da isterseniz ücretsiz bir şekilde kitabı indirebilirsiniz.
Pico’ nun sahip olduğu özelliklere de bakacak olursak, ilk olarak ARM Cortex M0+ serisi bir işlemci barındırır. Bu işlemci 133 Mhz’ de bir saat hızına ve çift çekirdekli bir yapıya sahiptir. Hazırlayacağınız uygulamarda bu çift çekirdeği bağımsız olarak kullanıp asenkron işlemleri rahatlıkla gerçekleştirebilirsiniz. Kıyaslama olarak STM32 serisi denetleyici kartlar ile benzer özellikler taşımaktadır. Buna örnek olarak ADC, DMA, Timer, GPIO vb. yapılara sahiptir. Pico’ da yaptığım gözlemler arasında en büyük eksisi üzerinde güç LED’ in olmamasıdır. Cihaz çalışıyor mu yoksa çalışmıyor mu bilgisayar bağlamadan yada içerisine yazılım yüklemeden anlamak malesef ki imkansız. İkinci eksisi ADC pinlerinin az oluşu. Pico 4 adet ADC girişine sahiptir. Bunlardan bir tanesi dahili sıcaklık sensörüne bağlı olduğu için dışarıdan kullanılamamaktadır. Yani uygulamalarınızda en fazla 3 ADC girişi kullanmanız mümkündür. Ancak Pico’ nun genel olarak küçük ve çok pin’ e sahip oluşu, onu bir çok uygulama için kullanışlı hala getirmektedir. Ayrıca kartın alt yüzünde hiç devre elemanı bulunmamaktadır. Bu özellik de kartı hazırladığınız devrelere Pin Header kullanmadan doğrudan lehimlemeyebilme imkanı vermektedir. Fiyatının da 4$ olduğunu düşünürsek yeterli bir kart gibi görünmekte. Birde dahili Wi-Fi’ ye sahip olsa idi bir o kadar daha sevimli olabilirdi .. :)
Firmware Yükleme
İlk olarak Rapsberry Pi Pico içerisinde MicroPython kurulumu ile başlayalım. Bağlantıdaki sayfadan gerekli firmware indirmelisiniz. Bu firmware MicroPython’ un bilgisayar ile haberleşmesini sağlamaktadır. İndirilebilir linkler içerisinde üzerinde “unstable” yazanlar geliştirilme süreci tamamlanmamış olduğu anlamına gelmektedir. Bu sebeple kullanım sırasında bazı sorunlar ile karşılaşabilirsiniz. Size tavsiye üzerinde bu şekilde etiket bulunmayan sürümü indirmenizdir. Firmware’ i Pico’ ya yükleme işlemi oldukça basittir. Pico üzerindeki butona basılı tutarken USB kablososunu bilgisayara takarsanız Pico kendini USB depolama aygıtı olarak tanıtacaktır. Daha sonra indirdiğiniz firmware’ i depolama aygıtı olarak görünen Pico’ nun içerisine kopyalamanız yeterli olacaktır.
Şimdi gelelim ilk kullanıma. Pico’ ya firmware yüklemesi yaptıktan sonra Pico kendini bilgisayara Sanal Com Port olarak tanıtacaktır. Bu bağlantı noktası ismini (Windows için COM*, Linux için dev/ttyACM*) kullanarak herhangi bir seri port arayüz programı ile Pico’ ya bağlanabilirsiniz. Ben putty kullanarak bağlantı gerçekleştireceğim. Default Baud Rate 115200 olarak seçmeniz gerekmektedir. Seri port üzerinden bağlantı yaptıktan sonra bir kez enter tuşuna basarsanız terminal ekranında ” >>> ” ibaresini göreceksiniz. Bu Pico içerisinde Micropython kurulu olduğuna ve sizin gördereceğiniz komutlara cevap vermeye hazır olduğu anlamına gelmektedir. Şimdi terminal ekranından ilk komutlarımızı aşağıdaki sıra ile satır satır gönderelim.
from machine import Pin led = Pin(25, Pin.OUT) led.value(1) led.value(0)
Yazılımda kullanılan fonksiyonlarda da anlaşıldığı üzere bu yazılım Pico üzerindeki dahili LED’ i yakmak içindi. Kullanılan “machine” kütüphanesi MicroPython tarafından standart olarak geliştirilmiş olup ESP32 yada ESP8266′ da genel amaçlı donanımların fonksiyonlarını barındırır. Bu kütüphanedeki Pin sınıfını kullanarak 25 numaralı Pin’ i çıkış olarak atadık. Daha sonra bu pin’ e önce 1 vererek LED’ i yaktık, sonra 0 vererek LED’ i söndürdük. Aslında işlemin mantığı son derece basit. Pico ile MicroPython kütüphanesi kullanılırken pin isimlerine aşağıdaki resimden ulaşabilirsiniz.
VsCode Eklentisi (Yenilendi)
—- Güncelleme
VsCode’ da yapılan bir güncelleme sonrası Pico-Go eklentisi çalışmayı bırakmıştı. Ancak geçtiğimzi günlerde yayınlanan aynı isimdeki yeni eklentiyi kullanarak Pico için MicroPython geliştirmeye VsCode kullanarak devam edebilirsiniz. Eskisi eklenti sayfasından kaldırıldığı için ona ulaşamazsınız zaten. Ancak yayınlayan isim farklı olduğu için aklınızda soru işareti oluşmaması açısından bu güncellemeyi konuya ekleme gereği duydum. Kullanımı birebir aynıdır. Yeni eklentiye VsCode’ un eklentiye sayfasından ulaşabileceğiniz gibi bağlantıdan da ulaşabilirsiniz.
—-
Bu şekilde terminal üzerinden Pico programlanabilir. Ancak büyük uygulamalar için bu şekilde kodlama yapmak oldukça zor olacaktır. MicroPython kullanarak büyük projeler python dosyaları oluşturulur. Daha sonra Pico içerisine seri port üzerinden yüklenir. Yükleme işlemini kolay bir şekilde gerçekleştirmek için VsCode ve Atom IDE’ sine yüklenebilen “PyMark” isimli bir eklenti mevcuttur. Daha önceki MicroPython konularında bu eklentiyi kullanarak yazılım yükleme yaptık. Ancak bu uygulamada Pico ile MicroPython kullanabilmek için geliştirilmiş farklı bir eklenti kullanacağız. Bu eklentinin adı “Pico-Go”. Bu eklentiyi tercih etmemin sebebi, eklenti PiCo’ ya yazılım yükleme işleminin yanı sıra MicroPython kütüphanesi için kod tamamlama özelliği de sağlamaktadır. Eklentiyi VsCode içerisinde eklenti sayfasından aşağıdaki resimdeki gibi yükleyebilirsiniz.
Bu eklentiyi kullanarak proje oluşturmamız lazım. Ancak proje oluşturabilmek için VsCode ile bir klasör açılmış olması gerekmektedir. Bunu VsCode içerisinde “File -> Open Folder” ile gerçekleştirebilirsiniz. Klasörü açtıktan sonra VsCode içerisinde “Ctrl + Shift + P” tuşlarına basarak “Pico-Go > Configure Project” seçeneğini seçmeliyiz. Böylece seçtiğimiz klasör içerisinde kod yazarken kod tamamlama özelliği aktif olacaktır. Klasör içerisinde ismi “hello.py” olan bir dosya oluşturalım. Bu dosya içerisinde aşağıdaki gibi bir yazılım yazalım.
from machine import Pin
import time
led = Pin(25, Pin.OUT)
while True:
led.on()
time.sleep(1)
led.off()
time.sleep(1)
Oluşturduğumuz yazılım ile az önce terminal içerisinde yaptığımız işlemi bir dosya içerisinde yapmış olduk. Yazılımı Pico’ ya yüklemek için VsCode içerisinde altta bulunana Pico-Go menüsünü kullanacağız.
Resimde Pico’ ya yükleme yapmak için kullanacağımız aracı göstermektedir. Kodu Pico içerisinde çalıştırabilmek için öncelikle bağlantı yapılmalıdır. Pico’ nuz bilgisayara bağlı iken “Pico Disconnected” yazan butona basarak Pico’ nun seri portuna bağlanabilirsiniz. Sorunsuz bağlantı olabilmesi için o anda seri port’ a bağlı herhangi bir yazılım olmamalıdır. Bağlantı gerçekleştikten sonra “Run” butonuna basarak hazırladığımız yazılımı Pico’ da çalıştırabiliriz. “Upload” butonu yazılımı Pico hafızasına yüklemeye yarar. “Download” butonu ise Pico içerisindeki dosyaları bilgisayara indirmenizi sağlar. Hazırladığımız yazılımın çalışabilmesi için Pico’ ya her güç vermemizde “Run” butonuna basmamız gerekmektedir. Bunun bu şekilde olmasını istemiyorsak, yani Pico’ ya güç verdiğimizde yazılımın kendisinin başlamasını istiyorsak yazılımı hazırladığımız dosyanın ismini “boot.py” olarak değiştirmeliyiz. Pico her çalıştığında bu dosya otomatik olarak başladığı için yazılımınız da çalışmaya başlayacaktır.
Bağlantı Şeması
Yapacağımız uygulamada Pico’ ya iki adet LED bağlayıp birinin parlaklığını potansiyometre ile değiştirelim. Diğerini ise buton ile yakıp söndürelim ve potansiyometre değerini terminalde gösterelim. Yazılıma geçmeden önce gerekli bağlantı şemasını verelim.
Bağlantı yaparken potansiyometrenin ADC pinine bağlı olduğundan emin olmalısınız. Diğer pinlerin nereye bağlandığı size kalmış. Üstte de belirttiğimiz gibi potansiyometre soldaki LED’ in parlaklığını değiştirecek. Buton ise diğer LED’ in yanıp sönme durumunu değiştirecektir. Buton Pull-Up olarak bağlanmıştır. Bağlantı Pull-up olduğu için butona basıldığında Pico’ da 0 (sıfır) okunacaktır. Yazılımda pin’ deki pull-up direncini aktif edeceğimiz için bağlantıda dirence gerek duymadık. Ayrıca buton pinine paralel bağlanan kondansatör butona basma anında meydana gelebilecek gürültüleri engelleyip butona her basma da Pico’ da 1 kez okunması içindir.
Yazılım
Şimdi gelelim yazılım kısmına. Yazılım kısmında öncelikle kullanacağımız kütüphaneleri dahil edelim. GPIO, ADC ve PWM kullanacağımız için projemizde bunları dahil ettik. Kullandığımız machine kütüphanesi daha önce de belirttiğimiz gibi MicroPython tarafından tanımlanmış standart bir kütüphanedir. Kullanılan “Pin, ADC, PWM” sınıfları bu kütüphane içerisinde mevcuttur. Eğer MicroPython’ da olmayan bir sınıfa ihtiyaç duyarsak o sınıfın olduğu dosyayı içeren kütüphane dosyasını projede aynı dizine koymalısınız. Sonra burada kullandığımız şekilde projeye dahil edebilirsiniz. Aslında anlatmak istediğim şeyi Python’ da kütüphane eklemekten farklı değil.
from machine import Pin, ADC, PWM
Kütüphaneleri projeye dahil ettikten sonra şimdi pinlerimizi tanımlayalım.
led1 = Pin(25, Pin.OUT) led2 = Pin(2, Pin.OUT) potPin = ADC(2) pwm = PWM(Pin(3)) btn = Pin(4, Pin.IN, Pin.PULL_UP)
Kullanılan pinlerin ne olduğu isimlerinden anlamak kolay olduğu için üzerinde fazla durmayacağım. Sadece buton için internel Pull-Up direnci kullandığımızı belirtmek istiyorum. Bu sebeple bağlantı şemasında herhangi bir direnç kullanmaya gerek duymadık. Pin’ leri tanımladıktan sonra yazılımın geri kalan kısmında bu pin’ lere yazma ve pin’ lerden okuma yapabiliriz. Sadece kullanmamız gereken PWM için frekans ayarı yapmalıyız. Birde istersek pin’ leri okumak yerine interrupt (kesme) olarak ayarlayabiliriz. Bu iki işlem aşağıdaki gibi yapılabilir.
def btnInt(pPin): print("Butona Basildi") led2.toggle() btn.irq(btnInt, Pin.IRQ_FALLING) pwm.freq(1000)
En üstteki fonksiyonu butona basıldığında çalışacak kesme fonksiyonudur. İçerisinde butona basıldığında yapılmasını istediğimiz işlemleri yazabiliriz. Ancak daha önceki uygulamalarda da belirttiğim gibi kesme fonksiyonlarında uzun işlemler yapmak yada “delay” vb fonksiyonlar kullanmak çok doğru değildir. Kesme fonksiyonun hemen altında buton kesme fonksiyonun ayarlanması işlemi mevcuttur. Bu ayarın yapıldığı “irq” fonksiyonu ilk parametre olarak kesme fonksiyonunu ikinci parametre olarak da kesme fonksiyonunun butonun düşen kenarında mı yoksa yükselen kenarında mı tetikleneceğini belirtiriz. Son olarak da kullanmak istediğimiz PWM frekansını girmeliyiz. Bu değerin max’ ı hakkında tam bilgi henüz bulamadım. Ancak ek ayar yapmadan (çözünürlük yada prescaler) sadece bu fonksiyon kullanılarak 10 ile 20 Khz arası bir şey ayarlanabileceğini tahmin ediyorum.
Şimdi gelelim yazılım geri kalanına. Bu kısımda ADC’ den okuduğumuz değeri PWM olarak LED’ e göndereceğiz. Micropython’ ın ADC değerini okuma ve PWM olarak yazma kısmı biraz değişik. Okunan ya da yazılan değerler 16 bit’ miş gibi gösteriyor. Oysaki normalde ADC 12 bit, PWM ise 8 bit’ tir. Ancak okunan ve yazılan değerler MicroPython tarafında otomatik olarak skala edilmektedir. Bizim yapacağımız uygulamada iki değerde 16 bit’ miş gibi göründüğü için ADC’ den okuduğumuz değeri hiç bir şey yapmadan PWM olarak kullanabiliriz.
while True: adcVal = potPin.read_u16() pwm.duty_u16(adcVal) print(adcVal * 3.3 / 65536) time.sleep(0.1)
Yukarıda karmaşık şekilde anlatılan ADC ve PWM işlemleri aslında iki satırdan ibaret bir işlemdir. Daha sonra okuduğumuz ADC değerini terminal ekranında görmek için print fonksiyonunu kullanarak yazdırdık. Ancak 16 bit değer olarak değil de gerilim olarak görülmesi için 3.3 / 65536 ile çarptım. Aslında bu işlem bir oran orantı işlemi. 0 ile 65536 arasındaki sayıları 0 ile 3.3 arasına çekmeyi sağlıyor.
İlk Pico yazımı bu idi. İleride daha farklı yazılar da hazırlamaya çalışacağım. Elimden geldiğince çok detay verip hızlı bir konu yazmaya çalıştım. Umarım yardımcı olabilmişimdir.
Yazılım tamamına aşağıdaki gibidir.
from machine import Pin, ADC, PWM import time led1 = Pin(25, Pin.OUT) led2 = Pin(2, Pin.OUT) potPin = ADC(2) pwm = PWM(Pin(3)) btn = Pin(4, Pin.IN, Pin.PULL_UP) def btnInt(pPin): print("Butona Basildi") led2.toggle() btn.irq(btnInt, Pin.IRQ_FALLING) pwm.freq(1000) while True: adcVal = potPin.read_u16() pwm.duty_u16(adcVal) led1.toggle() print(adcVal * 3.3 / 65536) time.sleep(0.1)
Bir otomobile,konuşan sistem,pico ve micropython ile yapılır mı?Tebrikler,devamını bekleriz.
Merhaba, açıkcası bu alanda çok araştırma yapmış birisi değilim. Ancak yapılsa bile basit anlamda bazı kelimeleri algılayabilen bir sistem yapılabileceğini düşünüyorum. Benzeri kartlarda yapılmış farklı çalışmalar var ise elbet Pico’ ya da implemente edilebilir. Bir çok mikrodenetleyiciye göre güçlü özelliklere sahip bir kart Pico. Başta da dediğim gibi daha önce bu alanda çalışma yapmadığım için çok yardımcı olamıyorum. İyi çalışmalar dilerim…