BP–06 · Başlangıç projesi

Kara Şimşek (Yürüyen Işık)

Seksenlerin ünlü dizisindeki konuşan arabanın önündeki kırmızı ışığı hatırlıyor musunuz? Bu projede 8 LED'i bir dizi ve iki for döngüsüyle sağa sola koşturarak aynı efekti yapacağız.

SeviyeBaşlangıç
Süre40 dk
Malzeme7 çeşit
Dizi (array)for döngüsüÇoklu çıkışDeğişken hızKod sadeleştirme

Proje hakkında

8 LED'i tek tek kontrol etmek için 16 satır digitalWrite yazabilirdik. Ama programlamanın gücü, tekrar eden işleri döngülere devretmektir. Pin numaralarını bir dizide tutup for döngüsüyle dolaşarak aynı işi birkaç satırda yapacağız.

Bu proje, ileride LED matrisler, adreslenebilir LED şeritler ve çoklu motor kontrolü gibi konularda kullanacağınız "dizi + döngü" düşünce kalıbını kazandırır. Bonus kodda potansiyometreyle efektin hızını da canlı olarak ayarlayacağız.

  • Pin numaralarını dizide saklamayı
  • İleri ve geri sayan for döngüleri yazmayı
  • Uç noktalarda LED'in iki kez yanmasını önlemeyi
  • Bir sensörle animasyon hızını değiştirmeyi

Malzeme listesi

Projeyi tamamlamak için aşağıdaki 7 çeşit malzemeye ihtiyacınız var. Parçaların çoğu Arduino başlangıç setlerinde hazır olarak bulunur.

Arduino Uno R3 1 adet

Projenin beyni. Nano veya Mega ile de aynı kod çalışır.

Breadboard 1 adet

8 LED için tam boy (830 delik) daha rahattır.

5 mm kırmızı LED 8 adet

Aynı renk LED'ler daha düzgün bir efekt verir.

220 Ω direnç 8 adet

Her LED için bir direnç.

10 kΩ potansiyometre (isteğe bağlı) 1 adet

Bonus kodda hız ayarı için.

Jumper kablo (erkek-erkek) 12 adet

USB A-B kablosu 1 adet

Kodu yüklemek ve kartı bilgisayardan beslemek için.

Devre bağlantıları

Bağlantıları USB kablosu takılı değilken yapın. Her satır, bileşenin hangi bacağının Arduino'nun hangi pinine gideceğini gösterir; çizgi rengi önerilen kablo rengidir.

LED 1 anot (+)D2Her LED kendi 220 Ω direnci üzerinden
LED 2 anot (+)D3
LED 3 anot (+)D4
LED 4 anot (+)D5
LED 5 anot (+)D6
LED 6 anot (+)D7
LED 7 anot (+)D8
LED 8 anot (+)D9
Tüm LED katotları (−)GNDOrtak − hattı üzerinden
Potansiyometre orta bacakA0Uçlar 5V ve GND'ye (isteğe bağlı)
Tüm LED'leri kısa bacakları aynı tarafa bakacak şekilde, tek bir sıra halinde dizin. Katotları doğrudan breadboard'un − hattına bağlarsanız sadece 8 adet GND kablosundan kurtulursunuz.

Adım adım kurulum

  1. LED'leri sıralayın

    8 LED'i breadboard'a eşit aralıklarla, kısa bacakları − hattına yakın olacak şekilde yerleştirin.

  2. Katotları bağlayın

    Her LED'in kısa bacağını − hattına bağlayın. Bacakları doğrudan − hattına uzanacak şekilde bükebilirsiniz.

  3. Dirençleri ekleyin

    Her LED'in uzun bacağının sütununa birer 220 Ω direnç takın.

  4. Pinlere bağlayın

    Soldaki LED'den başlayarak dirençleri sırasıyla D2, D3, D4 ... D9 pinlerine bağlayın.

  5. GND'yi bağlayın

    Arduino'nun GND pinini breadboard'un − hattına bağlayın.

  6. Kodu yükleyin

    İlk kodu yükleyin. Işık soldan sağa, sonra sağdan sola akmalı. Sıra karışıksa kabloları değil, dizideki pin sırasını değiştirmeniz yeterli.

  7. Hız ayarını ekleyin (isteğe bağlı)

    Potansiyometreyi 5V, A0 ve GND'ye bağlayıp ikinci kodu yükleyin.

Arduino kodu

Kodları Arduino IDE'ye yapıştırıp yükleyebilirsiniz. Türkçe karakterler yalnızca yorum satırlarında kullanıldı; Seri Port Ekranına yazdırılan metinlerde bilerek kullanılmadı.

Dizi ve döngülerle yazılmış klasik Kara Şimşek efekti.

kara_simsek.ino
// Kara Şimşek (Yürüyen Işık)
// RobotikHocasi.com

const int ledPinleri[] = {2, 3, 4, 5, 6, 7, 8, 9};
const int ledSayisi = 8;
const int hiz = 70;   // ms; küçüldükçe ışık hızlanır

void setup() {
  for (int i = 0; i < ledSayisi; i++) {
    pinMode(ledPinleri[i], OUTPUT);
  }
}

void loop() {
  // Soldan sağa
  for (int i = 0; i < ledSayisi; i++) {
    digitalWrite(ledPinleri[i], HIGH);
    delay(hiz);
    digitalWrite(ledPinleri[i], LOW);
  }

  // Sağdan sola (uçlardaki LED'ler iki kez yanmasın diye 6'dan 1'e)
  for (int i = ledSayisi - 2; i > 0; i--) {
    digitalWrite(ledPinleri[i], HIGH);
    delay(hiz);
    digitalWrite(ledPinleri[i], LOW);
  }
}

Bonus: Potansiyometreyle hız ayarı ve arkasında sönük bir iz bırakan ışık.

kara_simsek_kuyruklu.ino
// Hız ayarlı, kuyruklu Kara Şimşek
const int ledPinleri[] = {2, 3, 4, 5, 6, 7, 8, 9};
const int ledSayisi = 8;
const int potPin = A0;

int konum = 0;     // Işığın şu anki konumu
int yon = 1;       // 1: sağa, -1: sola

void setup() {
  for (int i = 0; i < ledSayisi; i++) {
    pinMode(ledPinleri[i], OUTPUT);
  }
}

void loop() {
  int hiz = map(analogRead(potPin), 0, 1023, 20, 300);

  // Tüm LED'leri söndür, sonra ana ışığı ve izini yak
  for (int i = 0; i < ledSayisi; i++) {
    digitalWrite(ledPinleri[i], LOW);
  }
  digitalWrite(ledPinleri[konum], HIGH);

  int iz = konum - yon;                  // Bir önceki konum
  if (iz >= 0 && iz < ledSayisi) {
    digitalWrite(ledPinleri[iz], HIGH);  // Kısa bir an iz bırak
    delay(hiz / 4);
    digitalWrite(ledPinleri[iz], LOW);
    delay(hiz - hiz / 4);
  } else {
    delay(hiz);
  }

  // Bir sonraki konuma geç, uçlara gelince yön değiştir
  konum += yon;
  if (konum == ledSayisi - 1 || konum == 0) {
    yon = -yon;
  }
}

Kod açıklaması

const int ledPinleri[] = {2, 3, ... 9};

Pin numaralarını sırayla tutar. ledPinleri[0] değeri 2, ledPinleri[7] değeri 9'dur. Dizilerde sayma her zaman 0'dan başlar.

for (int i = 0; i < ledSayisi; i++)

i değişkeni 0'dan 7'ye kadar sayar. Her turda bir LED yanar, bekler ve söner.

for (int i = ledSayisi - 2; i > 0; i--)

Geri dönüşte 6'dan 1'e sayarız. Böylece en uçtaki LED'ler (0 ve 7) arka arkaya iki kez yanmaz ve hareket akıcı görünür.

yon = -yon;

Bonus koddaki yön değişkeni 1 ile -1 arasında gidip gelir. konum += yon satırı, aynı kodla hem ileri hem geri hareket sağlar.

Nasıl çalışır?

Göz, kısa aralıklarla art arda yanan ışıkları hareket eden tek bir ışık olarak algılar. Buna phi fenomeni denir ve sinemadaki hareketli görüntülerin de temelidir. 50–100 ms aralık, akıcı ama takip edilebilir bir hareket için idealdir.

Arduino Uno'nun tek bir pininden en fazla 40 mA, tüm pinlerden toplamda ise yaklaşık 200 mA akım çekilmesi önerilir. Bu projede aynı anda en fazla bir veya iki LED yandığı için güvenli sınırların çok altındayız. Tüm LED'leri aynı anda yakacağınız projelerde toplam akımı hesaplamayı unutmayın.

Sorun giderme

Bir LED hiç yanmıyor
O LED ters takılmış olabilir veya direnci yanlış sütunda. LED'i ters çevirip tekrar deneyin.
Işık sırası karışık atlıyor
Kablolar pinlere sırasız bağlanmış. Kabloları değiştirmek yerine dizideki sayıların sırasını düzenleyin.
İki LED aynı anda yanıyor
İki LED'in direnci aynı sütunu paylaşıyor olabilir. Her LED'in kendi sütunu olmalı.
Hız ayarı ters çalışıyor
map() satırındaki 20 ve 300 değerlerinin yerini değiştirin.

Geliştirme fikirleri

Projeyi tamamladıysanız, aşağıdaki fikirlerle bir adım öteye taşıyabilirsiniz.

Çift yönlü efekt

Ortadan dışa ve dıştan ortaya doğru açılan iki ışık oluşturun.

Shift register ile genişletme

74HC595 entegresiyle sadece 3 pin kullanarak 16 LED kontrol edin.

Ses seviyesi göstergesi

Bir mikrofon modülüyle ses yükseldikçe daha fazla LED yakan bir VU metre yapın.

Reaksiyon oyunu

Işık ortadaki LED'e geldiğinde butona basmaya çalışılan bir oyun tasarlayın.

Sık sorulan sorular

8'den fazla LED kullanabilir miyim?
Uno'da 20 adet kullanılabilir I/O pin var (D0–D13 ve A0–A5). Daha fazlası için 74HC595 shift register veya WS2812 adreslenebilir LED şerit kullanmak daha pratiktir.
ledSayisi değerini elle yazmak zorunda mıyım?
Hayır. sizeof(ledPinleri) / sizeof(ledPinleri[0]) yazarak dizinin uzunluğunu otomatik hesaplatabilirsiniz.
Neden D0 ve D1'i kullanmadık?
Bu pinler USB üzerinden seri haberleşme için kullanılır. Kod yüklemeyi zorlaştırmamak için D2'den başlamak iyi bir alışkanlıktır.

Bir sonraki projeye hazır mısınız?

Başlangıç serisindeki 10 projeyi sırayla tamamladığınızda sensör, motor ve ekran kullanımının temellerini öğrenmiş olursunuz.

Başlangıç projelerine dön