Okullar için Robotik ve Mühendislik · anaokulundan liseye

1. ünite / 10

ESP32'ye giriş: Uno'dan bağlı karta

Çift çekirdek, 3,3 V mantık, Wi-Fi ve BLE: ESP32'yi Uno ile karşılaştır, pinlerinin kurallarını öğren, ilk kodu Arduino ve MicroPython ile yaz.

Bu ünitenin sonunda

  • ESP32 ile Arduino Uno'yu işlemci, bellek, gerilim ve bağlantı açısından karşılaştırmak
  • Flash, yalnız-giriş, açılış (strapping) ve ADC2 pinlerinin kısıtlarını açıklamak
  • Bir projenin pin planını kısıtlara uyarak yapmak
  • Aynı devreyi Arduino çekirdeği ve MicroPython ile programlamak

Ders notları

Uno, bir ATmega328P etrafında kurulu basit ve sağlam bir karttır: 16 MHz, 2 KB RAM, 5 V mantık. Bir sensörü okumak ve bir motoru sürmek için yeterlidir ama tek başına internete çıkamaz. ESP32 ise Wi-Fi ve Bluetooth radyosunu aynı çipe koyar; Nesnelerin İnterneti (IoT) projelerinin en yaygın kalbi olmasının nedeni budur.

Uno ile ESP32 yan yana

  • İşlemci: Uno 8 bit, 16 MHz; ESP32 iki çekirdekli 32 bit Xtensa, 240 MHz'e kadar. Bir çekirdek Wi-Fi yığınına, öbürü senin koduna ayrılabilir.
  • Bellek: Uno 2 KB RAM ve 32 KB flash; ESP32 yaklaşık 520 KB RAM ve kartta genellikle 4 MB flash.
  • Gerilim: Uno 5 V; ESP32 3,3 V. ESP32 pinleri 5 V'a dayanıklı değildir: 5 V'luk bir sensör çıkışı seviye dönüştürücü ya da gerilim bölücü ister.
  • ADC: Uno 10 bit (0..1023); ESP32 12 bit (0..4095), iki birim: ADC1 ve ADC2.
  • Bağlantı: Uno'da yok; ESP32'de 2,4 GHz Wi-Fi ve Bluetooth (klasik ve BLE).
Uno: V = 5 · ham / 1023    ESP32 (11 dB): V ≈ 3,1 · ham / 4095

Pinler: her GPIO her işi yapmaz

ESP32 DevKit üzerinde 30 ya da 38 bacak vardır ama hepsi serbest değildir. Pin planı yapmadan lehim yapmak, "kart açılmıyor" ya da "Wi-Fi açılınca sensör sıfır okuyor" gibi sinsi hatalara yol açar. Bu ünitenin simülasyonu bu kuralları bir checkPin fonksiyonuyla denetler.

  • GPIO 6–11: kartın flash belleğine bağlıdır. Dokunursan kod çalışmaz.
  • GPIO 34, 35, 36, 39: yalnız giriştir ve iç pull-up/pull-down dirençleri yoktur. Düğme bağlayacaksan dış direnç gerekir.
  • Açılış pinleri 0, 2, 5, 12, 15: açılışta düzeyleri önyükleme kipini seçer. GPIO 12 açılışta yüksekse flash gerilimi yanlış seçilir ve kart açılmaz.
  • ADC2 (GPIO 0, 2, 4, 12–15, 25–27): Wi-Fi sürücüsü bu birimi kullanır. Wi-Fi açıkken analog okuma için ADC1 pinlerini (32–39) seç.

Arduino çekirdeği mi, MicroPython mı?

Espressif'in Arduino çekirdeği tanıdık setup() / loop() yapısını, WiFi.h ve binlerce kütüphaneyi getirir; derlenmiş C++ hızlıdır ve bellekte küçüktür. MicroPython ise karta bir Python yorumlayıcısı yükler: kodu derlemeden REPL'de satır satır denersin. Bu derste her konu iki dilde de yazılır; ürün kodu için genellikle C++, hızlı deneme için MicroPython seçilir.

Donanımın yoksa Wokwi'de yeni bir ESP32 projesi aç: kart, LED, LDR ve DHT22 sanal olarak bağlanır, Wi-Fi bile benzetilir.

Simülasyon

ESP32 pin planlayıcı

Bir projenin her bağlantısı için pin ve görev seç (çıkış, giriş, ADC, PWM, I²C, DAC, dokunma). Planlayıcı flash pinlerini, yalnız-giriş pinlerini, açılış (strapping) pinlerini ve Wi-Fi açıkken çalışmayan ADC2'yi işaretler.

BağlantıGörevGPIODenetim
DHT22 veriUygun
LDR (ışık)Uygun
Toprak nemiÇalışmaz
ADC2 kanalı: Wi-Fi açıkken analogRead çalışmaz. ADC1 (32–39) kullan.
Pompa rölesiUygun
Pencere servosuDikkat
GPIO 12 açılışta HIGH ise flash gerilimi 1,8 V seçilir, kart açılmayabilir.
BME280 / OLED SDAUygun
BME280 / OLED SCLUygun
1 hata, 1 uyarı
analogRead = 2048 ≈ 1,55 V (11 dB) Uno: 317 / 1023 (5 V)

Kod

Arduino C++: LED ve LDR (ADC1)
// ESP32 DevKit: GPIO 2 kart LED'i, GPIO 34 LDR bölücüsü
const int LED_PIN = 2;    // çıkış; açılış pini, LED yalnız sürüş için uygun
const int LDR_PIN = 34;   // ADC1_CH6, yalnız giriş, iç pull-up yok

void setup() {
  Serial.begin(115200);
  pinMode(LED_PIN, OUTPUT);
  analogReadResolution(12);             // 0..4095
  analogSetAttenuation(ADC_11db);       // yaklaşık 0..3,1 V ölçüm aralığı
}

void loop() {
  int raw = analogRead(LDR_PIN);
  float v = raw * 3.1f / 4095.0f;       // doğrusal yaklaşım; uçlarda ADC doğrusal değil
  digitalWrite(LED_PIN, raw < 1200 ? HIGH : LOW);  // karanlıkta LED yanar
  Serial.printf("raw=%d  V=%.2f\n", raw, v);
  delay(500);
}
MicroPython: aynı devre, REPL'de dene
from machine import Pin, ADC
import time

led = Pin(2, Pin.OUT)
ldr = ADC(Pin(34))          # ADC1: Wi-Fi açıkken de çalışır
ldr.atten(ADC.ATTN_11DB)    # yaklaşık 0..3,1 V
ldr.width(ADC.WIDTH_12BIT)  # 0..4095

while True:
    raw = ldr.read()
    led.value(1 if raw < 1200 else 0)   # karanlıkta yan
    print(raw, round(raw * 3.1 / 4095, 2))
    time.sleep_ms(500)

Kendin dene

Pin planlayıcıda bir sera düğümü planla: LED, LDR (analog), DHT22 (veri), I²C OLED (SDA, SCL) ve bir düğme. Önce LDR'yi GPIO 4'e koy ve Wi-Fi'yi aç: hangi uyarı çıktı? LDR'yi GPIO 34'e taşı. Düğmeyi GPIO 35'e bağlayınca ne söylüyor, neden dış direnç gerekir? Bir LED'i GPIO 12'ye koyup açılış uyarısını oku. Sonra Wokwi'de aynı devreyi kur ve iki kodu da çalıştır.

Sık yapılan hatalar

  • ESP32 pinine 5 V sensör çıkışı bağlamak: pin zarar görebilir, seviye dönüştürücü ya da bölücü kullan.
  • Wi-Fi açıkken ADC2 pinlerinden analog okumak: değer sabit kalır ya da hata döner.
  • GPIO 34–39'a düğme bağlayıp iç pull-up beklemek: bu pinlerde yoktur, giriş havada kalır.
  • Flash pinlerine (6–11) ya da açılışta yüksek kalan bir devreyi GPIO 12'ye bağlamak: kart açılmaz.
  • ESP32 ADC'sini hassas ölçüm aleti sanmak: uçlarda doğrusal değildir, kalibrasyon gerekir.

Yazılım mühendisliği bağlantısı

Pin planı, donanımın arayüz sözleşmesidir. Onu kodun içine dağıtma; tek bir başlık dosyasında topla.

  • pins.h içinde her pin bir sabit olsun ve yanında görevi yazsın. Kart değişince yalnız bu dosya değişir.
  • Planlayıcıdaki kurallar bir statik denetleyicidir: aynı denetimi derleme öncesi bir betikle (ya da static_assert ile) çalıştırabilirsin.
  • Uno ve ESP32 için aynı uygulama kodunu yazıp donanım katmanını ayırmak (HAL), ileride kart değiştirmeyi ucuzlatır.

Kendini sına

  1. Wi-Fi açıkken bir LDR'yi analog okumak için hangi pin uygundur?

  2. 5 V ile çalışan bir sensörün dijital çıkışını ESP32'ye bağlamak için ne yaparsın?

  3. Kart, GPIO 12'ye bağlı bir devre yüzünden açılmıyor. En olası neden nedir?

  4. MicroPython'un bu derste hızlı deneme için seçilmesinin nedeni nedir?

Parçalar ve ilgili sayfalar

Esc
  • PanelAna sayfaSayfa
  • ModüllerTüm modüllerSayfa
  • ParçalarParça ansiklopedisiSayfa
  • Mühendislik yoluBüyükler için robotik: 128 parça, 7 seviyeSayfa
  • Robotik dersi (ESOF 323)Üniversite robotik dersi, 14 haftaSayfa
  • Drone dersiBüyükler için: parça, simülasyon, yazılım; 10 üniteSayfa
  • Blok atölyesiSerbest blok programlamaAraç
  • Devre laboratuvarıSanal Arduino ve devreAraç
  • Robot arenasıSanal robot sürüşüAraç
  • OyunlarBloklarla 8 öğretici oyunAraç
  • Mikro Kart atölyesiSanal LED kartı bloklarla programlaAraç
  • Robot atölyesiMikro Kart'ı robota tak, bloklarla görev yapAraç