Python ile gömülü sistemler dünyasını keşfedin. Bu kapsamlı rehber, MicroPython, CircuitPython, donanım entegrasyonu ve küresel bir kitle için gerçek dünya projelerini kapsamaktadır.
Metal Üzerinde Python: Gömülü Programlamaya ve Mikrodenetleyici Entegrasyonuna Derinlemesine Bir Bakış
Onlarca yıldır, akıllı saatlerden endüstriyel makinelere kadar her şeyi çalıştıran küçük bilgisayarlar olan gömülü sistemler dünyası, C, C++ ve Assembly gibi düşük seviyeli dillerin özel alanıydı. Bu diller benzersiz kontrol ve performans sunar, ancak öğrenme eğrisi dik ve geliştirme döngüleri uzundur. Basitliği, okunabilirliği ve geniş ekosistemiyle ünlü Python devreye giriyor. Bir zamanlar web sunucuları ve veri bilimiyle sınırlı olan Python, artık donanımın kalbine güçlü bir giriş yaparak, dünya çapında yeni nesil geliştiriciler, hobiler ve yenilikçiler için elektroniği demokratikleştiriyor.
Bu rehber, heyecan verici Python gömülü programlama dünyasına kapsamlı bir giriş niteliğindedir. Python gibi üst düzey bir dilin donanımı doğrudan nasıl kontrol edebileceğini inceleyeceğiz, bunu mümkün kılan temel platformları araştıracağız ve yazılımdan silikona yolculuğunuza başlamanız için pratik örnekler üzerinde duracağız.
Python Gömülü Ekosistemi: Sadece CPython'dan Fazlası
Dizüstü bilgisayarınızda kullandığınız standart Python'u (CPython olarak bilinir) tipik bir mikrodenetleyiciye kolayca yükleyemezsiniz. Bu cihazlar son derece sınırlı kaynaklara sahiptir; RAM'de kilobaytlar ve işlem gücünde megahertzler hakkında konuşuyoruz; bu, modern bir bilgisayardaki gigabaytlar ve gigahertzlerle keskin bir tezat oluşturuyor. Bu boşluğu kapatmak için, Python'ın özel, yalın uygulamaları oluşturuldu.
MicroPython: Mikrodenetleyiciler için Python
MicroPython, kısıtlı donanımda çalışmak üzere optimize edilmiş, Python 3 programlama dilinin tamamen yeniden yazılmış halidir. Damien George tarafından oluşturulmuş olup, doğrudan, düşük seviyeli donanıma erişim sağlarken, standart Python ile mümkün olduğunca uyumlu olmayı amaçlamaktadır.
- Temel Özellikler: Bir derleme adımına gerek kalmadan, bir karta bağlanmanıza ve kodu satır satır yürütmenize olanak tanıyan etkileşimli bir Read-Eval-Print Loop (REPL) içerir. Son derece verimlidir, küçük bir bellek ayak izine sahiptir ve doğrudan donanım kontrolü (GPIO, I2C, SPI, vb.) için
machinegibi güçlü modüller sağlar. - En İyisi: Maksimum performans, donanım üzerinde ince taneli kontrol ve çok çeşitli mikrodenetleyicilerde uyumluluk isteyen geliştiriciler için. "Metale" daha yakındır ve genellikle daha performansa duyarlı uygulamalar için tercih edilir.
CircuitPython: Başlangıç Seviyesi Güç Merkezi
CircuitPython, do-it-yourself (DIY) elektronik alanında lider bir şirket olan Adafruit tarafından oluşturulan ve sürdürülen MicroPython'ın bir dalıdır. MicroPython ile bir çekirdeği paylaşırken, felsefesi kullanım kolaylığı ve eğitime odaklanmıştır.
- Temel Özellikler: En belirgin özellik, mikrodenetleyiciyi bilgisayarınıza nasıl sunduğudur. Bir CircuitPython kartı taktığınızda, küçük bir USB sürücü gibi görünür. Bu sürücüdeki
code.pydosyanızı düzenler ve kaydeder, kart yeniden yüklenir ve yeni kodunuzu otomatik olarak çalıştırır. Ayrıca, desteklenen tüm kartlarda birleşik bir API'ye sahiptir, yani bir karttaki bir sensörü okumak için kod, küçük değişikliklerle başka bir kartta çalışacaktır. - En İyisi: Yeni başlayanlar, eğitimciler ve hızlı prototip oluşturmaya odaklanan herkes için. Öğrenme eğrisi daha yumuşaktır ve Adafruit tarafından sağlanan kapsamlı kitaplık ekosistemi, sensörleri, ekranları ve diğer bileşenleri entegre etmeyi inanılmaz derecede basit hale getirir.
MicroPython ve CircuitPython: Hızlı Bir Karşılaştırma
Bunlardan birini seçmek genellikle proje hedeflerinize ve deneyim seviyenize bağlıdır.
- Felsefe: MicroPython, donanım özelliklerine ve performansa öncelik verir. CircuitPython, basitliğe, tutarlılığa ve öğrenme kolaylığına öncelik verir.
- İş Akışı: MicroPython ile, genellikle cihazın REPL'sine bağlanmak ve dosyaları yüklemek için Thonny gibi bir araç kullanırsınız. CircuitPython ile, bir
code.pydosyasını USB sürücüye sürükleyip bırakırsınız. - Donanım Desteği: MicroPython, birçok üreticiden çok çeşitli kartları destekler. CircuitPython öncelikle Adafruit'ten ve belirli üçüncü taraf ortaklarından kartları destekler, ancak desteği derin ve iyi belgelenmiştir.
- Kütüphaneler: CircuitPython, kurulumu kolay, büyük, küratörlüğünü yapılmış bir kütüphane kümesine sahiptir. MicroPython kitaplıkları da mevcuttur, ancak daha parçalı olabilir.
Bu rehber için, kavramlar ve birçok kod örneği, küçük değişikliklerle her ikisi için de geçerli olacaktır. Önemli oldukları durumlarda farklılıklara dikkat çekeceğiz.
Donanımınızı Seçme: Mikrodenetleyici Savaş Alanı
Python çalıştırabilen mikrodenetleyici (MCU) sayısı son yıllarda patladı. İşte küresel bir kitle için en popüler ve erişilebilir seçeneklerden bazıları.
Raspberry Pi Pico & RP2040
Tam teşekküllü Raspberry Pi bilgisayarı ile karıştırılmaması gereken Pico, özel RP2040 çipi etrafında inşa edilmiş düşük maliyetli, yüksek performanslı bir mikrodenetleyici kartıdır. Donanım üzerinde Python için küresel bir favori haline geldi.
- Temel Özellikler: Güçlü bir çift çekirdekli ARM Cortex-M0+ işlemci, cömert bir 264KB RAM ve Özel Donanım Arayüzlerinin (PIO) oluşturulmasına olanak tanıyan Programlanabilir G/Ç (PIO) adlı benzersiz bir özellik. Yeni Pico W modeli yerleşik Wi-Fi ekler.
- Python için neden harika: MicroPython için resmi, birinci sınıf desteğe sahiptir ve ayrıca CircuitPython tarafından da iyi desteklenir. Düşük fiyatı (genellikle 10 ABD Dolarının altında) ve güçlü performansı, onu inanılmaz bir değer yapar.
Espressif ESP32 & ESP8266
Şanghay merkezli Espressif Systems şirketi tarafından üretilen ESP çip ailesi, IoT'nin tartışmasız şampiyonlarıdır. Entegre Wi-Fi ve Bluetooth yetenekleriyle bilinirler ve bunları bağlı projeler için varsayılan seçim haline getirirler.
- Temel Özellikler: Güçlü tek veya çift çekirdekli işlemciler, yerleşik Wi-Fi ve (ESP32'de) Bluetooth. Dünyanın dört bir yanındaki üreticilerden binlerce farklı geliştirme kartında mevcutturlar.
- Python için neden harika: Mükemmel MicroPython desteği, yalnızca birkaç satır Python koduyla bağlantılı cihazlar oluşturmanıza olanak tanır. İşlem güçleri, web sunucuları çalıştırmak veya birden fazla sensörden gelen verileri işlemek gibi karmaşık görevler için fazlasıyla yeterlidir.
Adafruit Feather, ItsyBitsy ve Trinket Ekosistemleri
Adafruit, standartlaştırılmış form faktörlerinde çok çeşitli kartlar sunar. Bunlar, belirli çip olmaktan ziyade, CircuitPython ekosistemi içinde sorunsuz çalışmak üzere tasarlanmış ürün aileleridir.
- Temel Özellikler: Feather ailesindeki kartlar ortak bir pin çıkışını paylaşır ve bu da onları değiştirilebilir hale getirir. Birçoğu yerleşik pil şarj devreleri ve konektörler içerir. RP2040, ESP32 ve diğerleri dahil olmak üzere çeşitli mikrodenetleyicilerle mevcuttur.
- Python için neden harika: Baştan sona CircuitPython için tasarlanmıştır. Bu sıkı entegrasyon, yüzlerce kitaplığa ve eğitime erişimle sorunsuz, tak ve çalıştır deneyimi anlamına gelir.
Başlarken: Donanımda İlk "Merhaba, Dünya"
Teoriden pratiğe geçelim. Gömülü programlamanın geleneksel "Merhaba, Dünya"sı bir LED'i yanıp söndürmektir. Bu basit eylem, kod düzenleyicinizden karttaki bellenime kadar tüm araç zincirinizin doğru çalıştığını doğrular.
Önkoşullar
- Desteklenen bir mikrodenetleyici kartı (örneğin, Raspberry Pi Pico, ESP32 veya bir Adafruit kartı).
- Yalnızca şarj etme değil, veri aktarımını destekleyen bir USB kablosu.
- Bir bilgisayar (Windows, macOS veya Linux).
Adım 1: Bellenimi Yükleyin
Kartınızın üzerine MicroPython veya CircuitPython yorumlayıcısının kurulu olması gerekir. Buna "bellenimi flaşlamak" denir.
- CircuitPython için: circuitpython.org adresini ziyaret edin, kartınızı bulun ve
.uf2dosyasını indirin. Kartınızı önyükleyici moduna alın (bu genellikle takarken bir "BOOT" veya "RESET" düğmesini basılı tutmayı içerir). Bir USB sürücü gibi görünecektir. İndirilen.uf2dosyasını üzerine sürükleyin. Sürücü çıkarılacak ve tekrar görünecek, şimdi CIRCUITPY olarak adlandırılacak. - MicroPython için: micropython.org adresini ziyaret edin, kartınızı bulun ve bellenim dosyasını indirin (genellikle bir
.uf2veya.bindosyası). İşlem benzerdir: kartı önyükleyici moduna alın ve dosyayı kopyalayın.
Adım 2: Düzenleyicinizi Kurun
Herhangi bir metin düzenleyici kullanabilmenize rağmen, özel bir IDE geliştirmeyi çok daha kolay hale getirir. Thonny IDE yeni başlayanlar için şiddetle tavsiye edilir. Ücretsiz, platformlar arasıdır ve MicroPython ve CircuitPython için yerleşik desteğe sahiptir. Kartınızı otomatik olarak algılar, cihazın REPL'sine erişim sağlar ve dosyaları yüklemeyi kolaylaştırır.
Adım 3: Yanıp Sönen LED Kodu
Şimdi kod için. MicroPython için main.py adında yeni bir dosya oluşturun veya CircuitPython için mevcut code.py dosyasını düzenleyin.
Raspberry Pi Pico W üzerinde MicroPython örneği:
import machine
import utime
# Pico W üzerindeki yerleşik LED'e özel bir adla erişilir
led = machine.Pin("LED", machine.Pin.OUT)
while True:
led.toggle()
print("LED açılıp kapatıldı!")
utime.sleep(0.5) # Yarım saniye bekle
Çoğu Adafruit kartında CircuitPython örneği:
import board
import digitalio
import time
# Yerleşik LED genellikle 'LED' adlı bir pine bağlıdır
led = digitalio.DigitalInOut(board.LED)
led.direction = digitalio.Direction.OUTPUT
while True:
led.value = not led.value
print("LED açılıp kapatıldı!")
time.sleep(0.5)
Kod Analizi:
import: Donanımı kontrol etmek (machine,digitalio,board) ve zamanı yönetmek (utime,time) için kitaplıklar içe aktarırız.- Pin Kurulumu: Hangi fiziksel pini kontrol etmek istediğimizi (yerleşik LED) tanımlar ve onu bir çıktı olarak yapılandırırız.
- Döngü:
while True:döngüsü sonsuza kadar çalışır. Döngünün içinde, LED'in durumunu değiştiririz (açıktan kapalıya veya kapalıdan açığa), seri konsola bir mesaj yazdırırız (Thonny'de görülebilir) ve ardından yarım saniye dururuz.
Bu dosyayı cihazınıza kaydedin. Yerleşik LED hemen yanıp sönmeye başlamalıdır. Tebrikler, Python'u doğrudan bir mikrodenetleyici üzerinde çalıştırdınız!
Daha Derine İnmek: Mikrodenetleyicilerde Python'ın Temel Kavramları
Bir LED'i yanıp söndürmek sadece başlangıçtır. Daha karmaşık projeler oluşturmak için kullanacağınız temel kavramları inceleyelim.
Genel Amaçlı Giriş/Çıkış (GPIO)
GPIO pinleri, mikrodenetleyicinizin dünyayla etkileşime girmesini sağlayan fiziksel bağlantılardır. Hem giriş (düğmelerden veya sensörlerden veri okumak için) hem de çıkış (LED'leri, motorları veya röleleri kontrol etmek için) olarak yapılandırılabilirler.
Bir Düğmeye Basmayı Okuma (MicroPython):
import machine
import utime
düğme = machine.Pin(14, machine.Pin.IN, machine.Pin.PULL_DOWN)
while True:
if button.value() == 1:
print("Düğmeye basıldı!")
utime.sleep(0.1)
Burada, 14 numaralı pini dahili bir aşağı çekme direnci ile bir giriş olarak yapılandırıyoruz. Döngü, düğmenin değerinin 1 (yüksek) olup olmadığını, yani basılıp basılmadığını sürekli olarak kontrol eder.
Sensörlerle Çalışmak
En ilginç projelerin çoğu sensörleri içerir. Python, hem analog hem de dijital sensörlerden okumayı kolaylaştırır.
- Analog Sensörler: Foto dirençler (ışık ölçümü) veya potansiyometreler gibi bu sensörler, değişken bir voltaj sağlar. Mikrodenetleyicinin Analog-Dijital Dönüştürücüsü (ADC) bu voltajı okur ve bir sayıya dönüştürür.
- Dijital Sensörler: Bu daha gelişmiş sensörler (sıcaklık/nem sensörleri, ivmeölçerler gibi) belirli protokolleri kullanarak iletişim kurar. En yaygın iki tanesi I2C (Entegre Devreler Arası) ve SPI (Seri Çevresel Arabirim)dir. Bu protokoller, birden fazla cihazın yalnızca birkaç pin kullanarak mikrodenetleyiciyle iletişim kurmasını sağlar. Neyse ki, iletişimleri sizin için kitaplıklar hallettiği için, düşük seviyeli ayrıntıları nadiren bilmeniz gerekir.
BMP280 Sensörüyle Sıcaklık Okuma (CircuitPython):
import board
import adafruit_bmp280
# Bir I2C veri yolu nesnesi oluşturun
i2c = board.I2C() # Varsayılan SCL ve SDA pinlerini kullanır
# Bir sensör nesnesi oluşturun
bmp280 = adafruit_bmp280.Adafruit_BMP280_I2C(i2c)
# Sıcaklığı okuyun
sıcaklık = bmp280.temperature
print(f"Sıcaklık: {sıcaklık:.2f} C")
Darbe Genişlik Modülasyonu (PWM)
PWM, bir dijital pinde analog bir çıkışı simüle etmek için kullanılan bir tekniktir. Bir pini hızla açıp kapatarak, bir LED'i kısarken, bir DC motorun hızını kontrol ederken veya bir servo motoru konumlandırırken kullanışlı olan ortalama voltajı kontrol edebilirsiniz.
Bağlantı ve Nesnelerin İnterneti (IoT)
ESP32 ve Pico W gibi kartların gerçekten parladığı yer burasıdır. Yerleşik Wi-Fi ile Python, IoT cihazları oluşturmayı şaşırtıcı derecede basit hale getirir.
Wi-Fi'ye Bağlanma
Cihazınızı bir ağa bağlamak ilk adımdır. Ağ kimlik bilgilerinizi güvenli bir şekilde saklamak için bir dosya (CircuitPython'da genellikle secrets.py olarak adlandırılır) oluşturmanız gerekir.
Bir ESP32'yi Wi-Fi'ye Bağlama (MicroPython):
import network
SSID = "YourNetworkName"
PASSWORD = "YourNetworkPassword"
station = network.WLAN(network.STA_IF)
station.active(True)
station.connect(SSID, PASSWORD)
while not station.isconnected():
pass
print("Bağlantı başarılı")
print(station.ifconfig())
Web İstekleri Yapma
Bağlandıktan sonra, internetle etkileşim kurabilirsiniz. Uygulama Programlama Arayüzlerinden (API'ler) veri alabilir, sensör verilerini bir web hizmetine gönderebilir veya çevrimiçi eylemleri tetikleyebilirsiniz.
Bir API'den JSON verilerini getirme (`urequests` kitaplığını kullanarak):
import urequests
response = urequests.get("http://worldtimeapi.org/api/timezone/Etc/UTC")
data = response.json()
print(f"Geçerli UTC saati: {data['datetime']}")
response.close()
MQTT: IoT'nin Dili
HTTP kullanışlı olsa da, IoT iletişimi için altın standart MQTT (Message Queuing Telemetry Transport) 'dir. Düşük bant genişliği, yüksek gecikme süreli ağlar için tasarlanmış hafif bir yayın-abone protokolüdür. Bir cihaz bir "konuya" sensör verilerini "yayınlayabilir" ve bu konuya "abone olan" diğer herhangi bir cihaz (veya sunucu) verileri anında alacaktır. Bu, bir web sunucusunu sürekli yoklamaktan çok daha verimlidir.
Gelişmiş Konular ve En İyi Uygulamalar
Projeleriniz büyüdükçe, bir mikrodenetleyicinin sınırlamalarıyla karşılaşacaksınız. İşte sağlam gömülü Python kodu yazmak için bazı en iyi uygulamalar.
- Bellek Yönetimi: RAM en değerli kaynağınızdır. Döngüler içinde listeler veya uzun dizeler gibi büyük nesneler oluşturmaktan kaçının. Çöp toplama işlemini manuel olarak tetiklemek ve bellek boşaltmak için
gcmodülünü (import gc; gc.collect()) kullanın. - Güç Yönetimi: Pille çalışan cihazlar için güç verimliliği kritik öneme sahiptir. Çoğu mikrodenetleyici, çipin çoğunu kapatan, çok az güç tüketen ve ayarlanan bir süre sonra veya harici bir tetikleyiciden uyanabilen bir "derin uyku" moduna sahiptir.
- Dosya Sistemi: Tıpkı normal bir bilgisayarda olduğu gibi, yerleşik flash belleğe dosya okuyabilir ve yazabilirsiniz. Bu, veri günlüğü tutmak veya yapılandırma ayarlarını saklamak için mükemmeldir.
- Kesmeler: Bir döngüde (yoklama olarak adlandırılan bir işlem) bir düğmenin durumunu sürekli kontrol etmek yerine, bir kesme kullanabilirsiniz. Bir Kesme İsteği (IRQ), ana kodu durduran, özel bir işlevi çalıştıran ve ardından devam ettiren bir donanım sinyalidir. Bu çok daha verimli ve duyarlıdır.
Gerçek Dünya Proje Fikirleri Vitrini
İnşa etmeye hazır mısınız? İşte tartıştığımız kavramları birleştiren birkaç fikir:
- Akıllı Hava Durumu İstasyonu: Sıcaklığı, nemi ve basıncı ölçmek için bir BME280 sensörlü bir ESP32 kullanın. Verileri küçük bir OLED ekranda görüntüleyin ve Adafruit IO veya Home Assistant gibi bir panoya MQTT aracılığıyla yayınlayın.
- Otomatik Bitki Sulama Sistemi: Bir toprak nem sensörünü bir Raspberry Pi Pico'ya bağlayın. Toprak kuruduğunda, küçük bir su pompasını birkaç saniye açmak için bir GPIO pini kullanın.
- Özel USB Makro Pedi: Bir Pico veya birçok Adafruit kartı gibi USB HID'yi (İnsan Arabirim Cihazı) destekleyen bir CircuitPython kartı kullanın. Karmaşık klavye kısayollarını göndermek veya önceden tanımlanmış metni yazmak için düğmeleri programlayın, üretkenliğinizi artırın.
Sonuç: Gelecek Python'a Gömülüdür
Python, gömülü geliştirme manzarasını temelden değiştirdi. Giriş engelini düşürdü, yazılım geliştiricilerin donanımı kontrol etmesini ve donanım mühendislerinin her zamankinden daha hızlı prototip oluşturmasını sağladı. Bir sensörü okumanın veya sadece birkaç satır okunabilir kodla internete bağlanmanın basitliği, oyunun kurallarını değiştiren bir şey.
Yanıp sönen bir LED'den tam özellikli bir IoT cihazına giden yolculuk inanılmaz derecede ödüllendiricidir. Küresel topluluk ve zengin açık kaynak kitaplıkları, bir zorlukla karşılaştığınızda asla gerçekten yalnız olmadığınız anlamına gelir. Bu nedenle bir kart seçin, bellenimi flaşlayın ve Python ile fiziksel dünyanın heyecan verici kesişim noktasında maceranıza başlayın. Tek sınır hayal gücünüzdür.