ESP8266 ile MicroPython Kullanımı
|Merhabalar,
Bu konuda yeni inceleme fırsatı bulduğum bir framework olan MicroPython’ a giriş yapacağız. Micropython, gömülü sistemlerin Python yazılım dili kullanılarak masaüstü bilgisayarlarda olduğu kadar kolay bir şekilde kullanılmasına olanak veren platformdur. 256 kbyte flash belleği ve 16 kbyte ram’ i olan her mikrodenetleyicide python çalıştırmanıza olanak sağlar. Ancak precompiled versionları şu anda sadece bağlantıdaki cihazlar için geçerlidir. Bu listedeki donanımlar dışındaki donanımlar için sizin derleme yapmanız gerekmektedir. Biz bu konuda Micropython ile en çok kullanılan donanımlardan biri olan ESP8266′ yı inceleyeceğiz. Peki Micropython’ ın bize getireceği artılar nelerdir. Yazılım geliştirmenin kolay olması en büyük artısı. İncelediğim kadarı ile web platformlarından GPIO’ lara kadar bir çok kütüphanesini stabil bir şekilde oluşturmuşlar. İkinci olarak açık kaynaklı olması büyük bir artısı. Daha önce bahsettiğimiz Mongoose OS kullanımı kotalı bir sistemdi. Cloud’ a bağlıyabileceğiniz cihaz sayısı sınırlı idi. Ancak bunda herhangi bir sınırlama yok. İstediğiniz kadar ESP8266′ yı yada farklı denetleyicileri bir MQTT Broker üzerinden birbirine bağlayıp derin uykuda yıllarca çalışabilecek bir mesh sensör ağı kurabilirsiniz. Ancak gerçek zamanlı uygulamlar için (robotlar, drone’ lar vs.) C kadar yüksek performans vermesini beklemek çok doğru olmayabilir. En büyük eskisi de sonuçta kütüphanelerden oluştuğu için en basit led yakma yazılımı için bile yukarıda belirttiğim kadar sistem kaynağı gerektirmesi. Ancak bir mikrodenetleyicide Python çalıştırmak istiyoruz ve bunun bir bedeli olmalı.
Yazılımın içine dalmadan biraz daha Micropython’ dan bahsedecek olursam, kullanım kolaylığını test etmeniz açısından online simulatörü bulunmakta. Bu simülatör ile kendi yazılımlarınızı sayfanın aşağısında verilen çevresel birimler ile test edebilir yada hazır örnek yazılımları çalıştırabilirsiniz. Simülatörde şimdilik cihazı değişmenize izin vermiyor. Belki ilerde ESP8266′ da ekelebilir simülatöre. Micropython’ u ESP8266 ile nasıl kullanacağımıza bakacak olursak, başta da dediğimiz gibi Python dosyalarını yüklemeye yapmamız gerek. Bunun için de ESP8266′ ya göre bu kütüphanelerin önceden derlenmiş versiyonunu bulmalıyız. İçerisinde ESP8266′ nın da bulunduğu birçok donanım için Micropython firmware’ ilerine bağlantıdan ulaşabilirsiniz.
Firmware’ i indirme işlemi ile başlayalım. Bağlantıdaki sayfada esp8266 için bir çok farklı .bin dosyası bulunmakta. Bunlar arasından “stable” olarak geçen en üstteki gruptan indirme yapmanızı tavsiye ederim. Firmware’ i indirdik. Peki bunu ESP8266′ ya nasıl yükleyeceğiz. Yükleme işlemi için bağlantıdaki sayfaya bakmanızı tavsiye ederim. Ben kısaltılmış olarak bu sayfayı anlatmaya çalışacağım. Bağlantıdaki sayfa ESP8266 için anlatım içermektedir.
Firmware yükleme işlemi için öncelikle esptool isimli python aracı kurmalıyız. Bu şu şekilde yapabiliriz.
pip install esptool
esptool aracını yüklemede sorun yaşarsanız kaynak kodundan yüklemek için bağlantıdaki github sayfasından indirme yapabilirsiniz. Sayfada nasıl yükleme yapılacağı hakkında bilgiler mevcut. Takip edebilirsiniz. ESP8266 içerisinde çalışan yazılımı silmek için aşağıdaki komutu kullanabilirsiniz. Önceden yüklü olan içeriklerin sorun yaşatmaması açısından bu komutu kullanmanızı tavsiye ederim.
esptool.py --port COM1 erase_flash
Bu komutu açıklayacak olursam. “–port” seçeneği isminden de anlaşılacağı üzere kullanılacak portu seçmemizi sağlar. Windows için bu port “COM1”, “COM2” şeklinde değişirken, Ubuntu işletim sisteminde “/dev/ttyUSB0” gibi bir isim alabilir. Hatta “sudo” yetkisi vermeniz bile gerekebilir. “erase_flash” parametresi ise esp8266′ nın flash’ ını silmek istediğimiz anlamına gelir. Bundan sonra sıra geldi firmware yüklemeye. Bunun için aşağıdaki komutu kullanabiliriz.
esptool.py --port COM1 --baud 460800 write_flash --flash_size=detect 0 esp8266-***-v***.bin
Bu komuttaki parametrelerde aslında oldukça açık. İlk parametre kullanılacak seri portu, ikinci parametre kullanılacak haberleşme hızını, 3. parametre yapılacak işlemi seçmemizi sağlıyor. Dördüncü parametre flash boyutunu belirtmemizi sağlar ancak “detect” olarak belirtmememiz halinde bunu kendisi öğrenebiliyor. Son parametre ise yüklemek istediğimiz firmware’ i belirtiyor. Ben üstte bazı karakterleri yıldız ile belirttim. Bunun sebebi sizin bu yazıyı okuduğunuz tarihte indirdiğiniz versiyonun değişmiş olma ihtimalinin çok yüksek olması. Örneğin ben bu konuyu yazarken kullandığım dosya ismim şu şekilde idi “esp8266-20190125-v1.10.bin”. Bunu siz indirdiğiniz dosyaya göre değiştirmelisiniz.
Yükleme işlemini doğru şekilde yaptıktan sonra seri porttan’ u izleyebilen Putty, RealTerm vb. bir uygulama ile klavyeden enter tuşuna bastığımızda Python konsolunun sevimli satır karakteri olan “>” karakterinin bize geri döndüğünü görebiliriz. Böylece python shell üzerinden istediğimiz işlemleri esp8266′ ya yaptırabiliriz. Ancak shell kullanımı çok kullanışlı olmayacaktır. Bunun yerine Python komutlarının bir arada bulunduğu dosyalar olan script dosyaları ile çalışmak daha kullanışlıdır. Bu noktada bilgisayarda oluşturacağımız script dosyalarını denetleyiciye nasıl yükleyeceğimiz sorusu ortaya çıkmakta.
Şimdi sıra geldi bilgisayarda oluşturduğumuz yazılımı nasıl çalıştıracağımız sorusuna. Bildiğiniz üzere Python derlenen bir dil değil. Bu yüzden bilgisayarda önceden derleyip derlenmiş dosyaları ESP8266′ ya yükleyemeyiz. (Aslında mümkün ama şu anda tercih edeceğimiz yol kadar kolay ve kullanışlı olmaz.) Bilgisayarda oluşturduğumuz yazılımı donanıma yüklemek için ampy isimli bir komut sistem aracı kullanacağız. Bu araç bilgisayarda yazdığınız yazılımları donanıma yüklemenin yanı sıra aşağıdaki özelliklere sahiptir.
- donanımdaki dosyaları çekmek (get)
- donanımdaki dosyaları çalıştırmak (run)
- donanımdaki dosyaları silmek (rm)
- donanımdaki dosyaları listelemek (ls)
Peki bu araç olmadan donanıma yazılım yükleyemez misiniz. Elbette farklı yöntemler mevcut. Ancak benim konuyu hazırlarken bulduğum en kullanışlı yöntem bu idi. Bu araç ile yükleme yapmak için aşağıdaki gibi bir komut girmeliyiz.
ampy --port /COM1 put test.py
Bu komut ile test.py python script dosyasını COM1 seri port bağlantısı üzerinden donanımımıza yükleyebiliriz. Bu işlemin başarılı bir şekilde gerçekleşmesi için yukarıda anlatılan firmware yükleme işleminin başarılı bir şekilde tamamlanmış olması gerekir. Bu dosyayı denetleyiciye yüklemiş olsak da gücü kesip verdiğimizde otomatik olarak başlamadığını göreceksiniz. Bunu script dosyasının ismini “main.py” yaparak düzeltebiliriz. Böylece denetleyiciye her gücü kesip vermemizde oluşturduğumuz script dosyası çalışmaya başlayacaktır. Yazılımı nasıl yükleyeceğimizi de hallettiğimize göre artık kod yazmaya başlıyabiliriz. Öncelikle LED yakıp söndürerek başlayalım. Yapacağımız işlemler için referans sayfalarımız bağlantı- 1 ve bağlantı – 2 ‘ deki sayfadır.
from machine import Pin # import Pin libary import time # imprrt Time library led = Pin(2, Pin.OUT) # define onboard led pin as a output while True: # infinite loop led.on() # turn on onboard led time.sleep(1.0) # wait 1 second led.off() # turn of onboard led time.sleep(1.0) # wait 1 second
Yukarıda da görüldüğü üzere led yakıp söndürmek için yazmamız gereken yazılım sade ve kolay anlaşılır. Ayrıca kullandığımız time kütüphanesi de python’ ı önceden kullanmış olanların aşina olduğu standart bir kütüphanedir. Kullanılan diğer kütüphane olan “machine” kütüphanesi Micropython ile gelen bir kütüphane olup api’ sine bağlantıdan ulaşabilirsiniz. Buna benzer olarak aşağıdaki örneklerde kullanacağımız diğer MicroPython kütüphanelerinin api’ si bağlantıda mevcuttur. Yukarıda yazdığımız yazılımı ESP8266′ da çalıştırmak için ampy’ i kullanarak komut sisteminden şu şekilde bir komut girmeliyiz.
ampy --port COM2 run test.py
Eğer COM bağlantı hatası alırsanız altta seri portun başka bir uygulama ile (RealTerm, putty yada Arduino Serial Monitor, vb…) kullanılıyor olma ihtimali çok yüksektir. Onu kapatıp tekrar deneyin. Yine olmazsa ESP8266′ nın gücünü kesmeyi yada aşağıdaki komut ile yazılımsal reset atmayı deneyebilirsiniz.
ampy --port COM2 reset
Şimdi biraz daha karmaşık bir örnek yapalım. Bu örnekte ADC’ den okduğumuz değeri seri porttan yazdırırken, her butona basılmasında led yakıp söndürelim. Kullandığımız ESP8266′ nın sahip olduğu ADC’nin en yüksek ölçüm geriliminin 1.4V olduğunu unutmayalım! Bunun hakkındaki uyarı aynı zamanda bağlantıdaki sayfada da yapılmış durumda.
from machine import Pin # import Pin libary import time # imprrt Time library from machine import UART from machine import ADC adc = ADC(0) # create ADC object on ADC pin uart = UART(0, 115200) # init with given baudrate led = Pin(2, Pin.OUT) # define onboard led pin as a output btn = Pin(4, Pin.IN, Pin.PULL_UP) #define input with pull up resistor while True: # infinite loop #if button pressed turn on led if btn.value() == 0: led.on() else: led.off() # read adc value val = adc.read() #send read data with uart sendStr = str(val) + "\n\r" uart.write(sendStr) # wait 100 ms time.sleep(0.1)
ESP8266 üzerinde 1 adet ADC pini olduğu için bu örnekte farklı bir pin kullanma şansınız yok. ADC’ nin id sini 0 vererek doğrudan 1. kanaldaki tek adc pinini okumuş olursunuz. Uart’ ı tanımlarken de yine ilk parametre olarak verdiğimiz id’ yi 0 yaptık. ESP8266 üzerinde 2 adet UART var. UART0 hem alma hemde gönderme yapabiliyorken, UART1 sadece veri gönderme yapabiliyor. Ancak UART1′ in veri gönderebiliyor olması bu örnek için kullanbileceğimiz anlamına gelmez. Çünkü UART1′ in bağlı olduğu pin farklı bir pin ve ona yazdığımız veriyi bilgisayardan görmek istersek o pine bir ftdi dönüştürücü bağlamamız gerekir.
Aynı şekilde Micropython dökümantasyon sayfasına bakarak diğer donanımları kullanabilirsiniz. Ancak son olarak kullandığımız denetleyici ESP8266 olduğu için Wi-Fi modülüne de değinmek istiyorum. Wi-Fi modülünü micropython ile kullanmak için “network” kütüphanesini kullanmalıyız.
import network # import network libraries isApOn = False # if ap on WIFI_SSID = "" # your wifi SSID WIFI_PSWD = "" # your wifi password wlan = network.WLAN(network.STA_IF) # create station interface wlan.active(True) # activate the interface wlan.scan() # scan for access points wlan.isconnected() # check if the station is connected to an AP wlan.connect(WIFI_SSID, WIFI_PSWD) # connect to an AP wlan.config('mac') # get the interface's MAC adddress wlan.ifconfig() # get the interface's IP/netmask/gw/DNS addresses ap = network.WLAN(network.AP_IF) # create access-point interface if isApOn: ap.active(True) # activate the interface ap.config(essid='ESP-AP') # set the ESSID of the access point else: ap.active(False) # deactivate the interface
Eğer ESP8266′ yı access point olarak kullanmak istiyorsanız baştaki “isApOn” değişkeni “True” olarak değiştiril yazılımı tekrar çalıştırabilirsiniz. Böylece Wi-Fi taraması yapınca “ESP-AP” isimli bir bağlantı noktası görebilirsiniz. Bu yazılımı bir kez çalıştırınca ESP8266 Wi-Fi bilgilerini EEPROM’ a kayıt ediyor ve siz değiştirmedikçe orda kalıyor. Böylece ESP8266′ ya her güç vermenizde kendisi otomatik olarak ağa bağlanabiliyor. Bu sayede yapacağınız network uygulamalarında her seferinde bu kodları kullanmanız gerekmiyor.
Böylece bu konunun sonuna geldik. Micropython ile alakalı MQTT uygulamaları ve güç tasarrufu hakkında da yazı yamayı düşünüyorum. Umarım yakın gelecekte yazabilirim.
İyi çalışmalar dilerim…
Makaleniz çok açıklayıcı olmuş, emekleriniz için teşekkürler.
Yardımcı olabildiğime çok sevindim. İyi çalışmalar dilerim.
Güzel ve aciklayici olmuş firebase üzerinde veri yazma ve alma hakinda yazilarinizi bekliyoruz.kolay gelsin