ESP8266 ile MicroPython Kullanımı

micropythonlogo

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ı – 2deki sayfadır.

esp8266pinout

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…

3 Comments

Add a Comment

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir