Bu proje, 16x16 bir micromouse labirentinde en kısa yolu otonom olarak bulup maksimum hızla tamamlayan Arduino Nano tabanlı bir robotik sistemdir.
Amaç: Minimum kaynak kullanımı + maksimum karar hızı + stabil hareket.
- Platform: Arduino Nano (ATmega328P @ 16MHz)
- Algoritma: Dinamik Flood Fill
- Kontrol: PD (Proportional-Derivative)
- Sürüş: Diferansiyel (2 DC Motor)
- Bellek Optimizasyonu: Bitmask tabanlı harita
- Labirent: 16x16 hücre
Sistem 3 ana katmandan oluşur:
- Flood Fill (mesafe hesaplama)
- Path decision logic
- PD controller
- Motor hız düzeltmeleri
- IR sensörler
- Motor sürücüler
- Encoder (opsiyonel ama önerilir)
- Arduino Nano
- 2x DC motor + dişli kutusu
- Motor driver (TB6612FNG / L298N)
- 4 adet IR mesafe sensörü
- LiPo pil (7.4V önerilir)
- Step-down regülatör (5V sabit çıkış)
- Encoder'lı motor
- IMU (stabilite için)
Her hücre 1 byte ile temsil edilir.
uint8_t maze[16][16];| Bit | Anlam |
|---|---|
| 0 | Kuzey duvarı |
| 1 | Doğu duvarı |
| 2 | Güney duvarı |
| 3 | Batı duvarı |
| 4 | Ziyaret edildi |
maze[x][y] |= 0x01; // kuzey duvarı ekle
maze[x][y] |= 0x10; // visitedAmaç: Her hücreye hedefe olan mesafeyi atamak.
uint8_t dist[16][16];Hedef hücre(ler) = 0
for all cells:
dist = INF
dist[target] = 0queue.push(target)
while(queue not empty):
current = queue.pop()
for each neighbor:
if no wall:
if dist[neighbor] > dist[current] + 1:
dist[neighbor] = dist[current] + 1
queue.push(neighbor)- Her yeni duvar algılandığında flood fill tekrar çalıştırılmalı
Robot bulunduğu hücreden:
-
Erişilebilir komşulara bakar
-
En küçük distance değerini seçer
-
Eşitse:
- ziyaret edilmemiş tercih edilir
best = INF
next = NONE
for each direction:
if no wall:
if dist[cell] < best:
best = dist[cell]
next = directionSol Motor | Sağ Motor
----------------------
Hızlı | Yavaş → sağa dön
Yavaş | Hızlı → sola dön
Eşit | Eşit → düz git
- Pivot turn
- Tank turn
error = leftSensor - rightSensor;correction = Kp * error + Kd * (error - lastError);leftMotor = baseSpeed - correction;
rightMotor = baseSpeed + correction;- Kp ↑ → hızlı tepki, overshoot
- Kd ↑ → stabilite, titreşim azaltma
- Analog IR sensör önerilir
- Gürültü filtreleme:
value = (v1 + v2 + v3) / 3;- Ortama göre kalibre edilmeli
- Harita oluşturulur
- Duvarlar işlenir
- Flood fill sürekli güncellenir
Hedefe ulaşınca:
saveToEEPROM();- Önceden hesaplanmış path kullanılır
- Minimum duraklama
- Maksimum hız
EEPROM.write(address, value);- Maze veya path saklanabilir
- 8-bit integer kullan (uint8_t)
- Recursive kullanma (stack patlar)
- Queue → static array
- Float kullanma (fixed-point tercih et)
- LiPo pil önerilir
- Regülatör ile 5V sabitlenmeli
- Motor ve MCU ayrı beslenmeli
- Serial debug (9600 baud)
- LED state göstergeleri
- Sensör değerlerini logla
- Motor sür
- Sensör oku
- PD kontrol
- Düz git
- Maze + bitmask
- Flood fill
- Path seçimi
- Hız arttır
- Path smooth
Bu sistem:
- Minimum RAM ile çalışır
- Gerçek zamanlı karar verir
- Yarışma seviyesinde performans hedefler