← SİTEYE DÖN
DONANIM

ESP32-S3'ü iPad'den derlemek

7 dk okuma

iPadOS uygulamalara USB-seri vermiyor. Ben de kartı USB belleğe çevirdim: TinyUF2, GitHub Actions ve bir dosya kopyalama.

Sınav haftasında Mac'e erişimim olmayacak. Elimde iPad Air, harici klavye ve bir ESP32-S3-DevKitC-1 kalacak. Hedefim basitti: kodu iPad'de yazayım, kabloyu takayım, kart çalışsın. Bunun için kendi editörümü yazıyorum: VSCodePad, iPad'de VS Code arayüzüyle çalışan, C/C++ ve Python'u internetsiz derleyen bir uygulama.

C ve Python tarafı iPad'in içinde çözüldü. ESP32 ise beklediğimden çok daha inatçı çıktı.

Duvar: iPadOS'ta seri port yok

Bilgisayarda ESP32'ye kod atmak için esptool kartla USB-seri üzerinden konuşur. iPadOS bu kapıyı uygulamalara kapatıyor. WebSerial yok, uygulamanın kendi USB sürücüsünü getirmesi de serbest değil.

Tek teknik çıkış yolu DriverKit: M çipli iPad'lerde uygulamanın içine gömülü bir USB sürücüsü. Denedim, Xcode imzalamayı reddetti. Ücretsiz Apple ID ile açılan kişisel takımlar DriverKit iznini alamıyor. Yıllık 99 dolarlık geliştirici hesabıyla açılıyor ama kendime koyduğum şart belliydi: başka cihaz yok, ücretli hesap yok.

Çözüm: kartı USB belleğe çevirmek

iPadOS'un sorunsuz yaptığı bir şey var: USB belleği Dosyalar uygulamasında açmak. O zaman kartı USB bellek gibi göstermem yeterliydi.

Bunu TinyUF2 yapıyor. ESP32-S3'e kurulan küçük bir önyükleyici bu. Kart UF2 moduna girince bilgisayara (ya da iPad'e) S3DKC1BOOT adında bir sürücü olarak görünüyor. İçine bir .uf2 dosyası kopyaladığında kendini o yazılımla güncelliyor. Bu durumda yükleme, kart açısından bir dosya kopyalamadan ibaret.

Tek seferlik bedel: TinyUF2'nin karta bir kez bilgisayardan yüklenmesi gerekiyor. Boş bir ESP32'nin ROM'u sadece USB-seri konuştuğu için ilk yükleme iPad'den mümkün değil. Bunu Mac'te, kartın COM (UART) portundan bir betikle yaptım, iki dakika sürdü. Sonrasında Mac'e bir daha gerek kalmıyor.

Akış

  1. Yaz: VSCodePad'de bir .ino dosyası aç.
  2. Derle: Arduino derleyicisi iPad'e sığmıyor. Kod esp32-projeler reposuna gidiyor, orada GitHub Actions arduino-cli ile derliyor (esp32 core 3.0.7).
  3. Çevir: Uygulama derlenmiş .bin'i indirip .uf2'ye çeviriyor. Bu dönüşüm ESP32-S3'ün UF2 aile kimliğiyle (0xc47e5767) yapılıyor.
  4. Yükle: Kartı UF2 moduna al (RESET, mor LED, BOOT), S3DKC1BOOT'u seç, dosyayı yaz. Kart yeniden başlıyor ve kod çalışıyor.

Kablo istemeyen durumlar için Wi-Fi (OTA) ve BLE ile yükleme de var. Tamamen internetsiz çalışmak istersem de CircuitPython var: kart CIRCUITPY olarak görünüyor ve code.py'yi kaydetmek yetiyor.

İlk deneme: "dosya kaydedilemedi"

İlk sürümde iPadOS, karta yazarken "dosya kaydedilemedi" dedi. Harici sürücülerde bir yazma yönteminin çalışması, ötekilerin de çalışacağı anlamına gelmiyor. Sonunda uygulama üç yolu sırayla deniyor: düz POSIX yazma, FileHandle ve NSFileCoordinator. Biri tutunca duruyor.

11 Kasım 2026'da iPad'den kabloyla ilk yükleme başarılı oldu. Mac yoktu, kartın LED'i mavi-yeşil yanıp sönüyordu.

Test çizimi

Bu kartta dahili RGB LED, belgelerde yazan GPIO38'de değil, büyük ihtimalle GPIO48'de. İkisini birden yakmak en garantisi. Bir de esp32 core 3.x'te neopixelWrite eskidi, yerine rgbLedWrite kullanılıyor.

// ESP32-S3-DevKitC-1 · renk döndüren LED
const int LEDLER[] = {48, 38};   // kart sürümüne göre biri yanar

void renk(uint8_t r, uint8_t g, uint8_t b) {
  for (int pin : LEDLER) rgbLedWrite(pin, r, g, b);
}

void setup() {
  Serial.begin(115200);
}

void loop() {
  renk(0, 40, 40);  delay(400);   // mavi-yeşil
  renk(40, 0, 20);  delay(400);   // mor
  renk(0, 0, 0);    delay(400);   // sönük
  Serial.println("merhaba iPad");
}

Hâlâ açık olanlar

  • UF2 yazımından sonraki yazılımsal yeniden başlatmada USB-seri görünmüyor, RST'ye basınca geliyor. iPad'de seri kullanmadığım için şimdilik dert değil.
  • Yaz, GitHub'da derle, USB'den yükle zincirinin tamamı daha pürüzsüz değil. Derleme başarılı oluyor ama uçtan uca akışı cilalamam gerekiyor. Bir sonraki günlükte buna bakacağım.
  • Ücretli hesap alırsam DriverKit açılıyor. O zaman boş kartlar da (klasik ESP32 dahil) iPad'den doğrudan programlanabilir.

Özetle: iPad bir ESP32'yi programlayamaz, ama bir dosyayı USB belleğe kopyalayabilir. Gerisi kartı USB bellek gibi davranmaya ikna etmekten ibaret.