Renkler
- Güç
- İşlem
- Pinler
- Işıklar
- Breadboard
- Parçalar
- Kontrol
Bu cihaz 3D görüntüyü açamadı. Kartlardaki anlatım ve mini sınav çalışır.
Ekran kartı sahneyi durdurdu.
Bir deliğe dokun: bağlı delikler yeşil yanar
Parçalara dokunarak tanı
Panel ayarları
Panel genişliği
Yazı boyutu
Panel tarafı
Trafik Işığı Yapalım: 3D Arduino simülasyonu
Kavşakta kim karar veriyor?
Kavşaktaki trafik ışıkları belli bir sırayla, belli sürelerle yanar. Her ışığın bir anlamı var: kırmızı dur, yeşil geç. Peki ışık ne zaman değişeceğini nereden biliyor? Bugün üç LED'le kendi trafik ışığımızı yapıp sırayı kodla söyleyelim.
Trafik ışıkları, araçların ve yayaların yolu sırayla kullanmasını sağlar; bu yüzden sıra ve süre çok önemlidir. Işıkları belli bir sırayla yakan bir düzenek, aslında adım adım bir talimat listesini uygular. Bugün üç LED, üç direnç ve bir kodla küçük bir trafik ışığı modeli yapalım.
Yönetmeliğe göre trafik ışıkları, araçların ve yayaların yolu sırayla kullanmasını düzenlemek için kurulur. Bir kavşağın güvenli olması, ışıkların doğru sırayla ve yeterli sürede yanmasına bağlıdır. Bu sırayı adım adım yazarsak bir algoritma elde ederiz. Bugün bu algoritmayı Arduino'ya kod olarak verelim.
Trafik İşaretleri Hakkında Yönetmelik, ışıklı işaretlerin amacını araçların ve yayaların yolu sırayla kullanmasını düzenlemek olarak tanımlar. Bir trafik ışığını, her aşamada hangi ışıkların yanacağının ve ne kadar kalacağının belli olduğu bir aşamalar dizisi olarak düşünebiliriz. Bugün bu aşamaları sırayla yazıp üç çıkış pinini zamanlayarak bir trafik ışığı modeli kuracağız.
Bu derste
- Trafik ışığındaki renklerin anlamını söyleyeceğiz.
- Üç LED'i ayrı pinlere bağlayan devreyi kuracağız.
- Adımları sırayla yazmanın bir algoritma olduğunu göreceğiz.
Bu derste
- Işıkların sırasını adım adım bir algoritma olarak yazacağız.
- Her LED'e neden ayrı direnç taktığımızı açıklayacağız.
- loop ve delay komutlarının bu sıradaki görevini göstereceğiz.
Bu derste
- Trafik ışığı algoritmasını dört adımlık bir tablo ve akış şeması olarak düşüneceğiz.
- Pinlerin yeni komut gelene kadar durumunu koruduğunu kodda göstereceğiz.
- delay satırları olmadan ne olacağını gerekçesiyle tahmin edeceğiz.
Bu derste
- Yönetmelikteki ışık anlamlarından dört aşamalı bir döngü kuracağız.
- Bir turun süresini hesaplayıp sürelerin algoritmayı nasıl etkilediğini açıklayacağız.
- delay'in buton okumayı nasıl engellediğini ve PWM ile ilişkisini tartışacağız.
Malzemelerimiz
Bu derste üç LED kullanacağız: bir kırmızı, bir sarı, bir yeşil. Her LED'in kendi koruyucu direnci olacak: 3 adet 220 Ω direnç. Bir de kablolar, breadboard ve Arduino.
Malzemeler: 1 kırmızı, 1 sarı, 1 yeşil LED; 3 adet 220 Ω direnç; 4 bağlantı kablosu (üç pin için birer tane, bir de GND için); Arduino UNO ve breadboard. Her LED'e ayrı direnç koyacağız, çünkü her biri ayrı bir yoldan elektrik alacak.
Malzemeler: kırmızı, sarı ve yeşil birer LED, 3 adet 220 Ω direnç, bağlantı kabloları, breadboard ve Arduino UNO. Neden tek bir direnç yetmez? Her LED ayrı bir pinden beslenir ve ayrı bir yol oluşturur; her yolun akımını kendi direnci sınırlamalıdır. Üç LED'in eksi tarafları aynı - rayında, yani aynı GND'de buluşur.
Malzemeler: kırmızı, sarı ve yeşil birer LED, 3 adet 220 Ω direnç, bağlantı kabloları. Her LED kendi pininden ve kendi direnciyle beslenir; böylece her dalın akımı ayrı sınırlanır. LED'in üzerindeki gerilim rengine göre değişebildiği için aynı dirençle parlaklıklar biraz farklı görünebilir. Tek ortak direnç kullansaydık, aynı anda yanan iki LED akımı paylaşır ve parlaklıklar birbirini etkilerdi.
Işıkların sırası
Trafik kurallarına göre kırmızı dur demektir. Kırmızıyla birlikte sarı yanarsa yeşil gelmek üzeredir: hazırlan ama henüz geçme. Yeşil geç demektir. Yeşilden sonra yalnız sarı yanarsa kırmızı gelmek üzeredir. Bizim sıramız: kırmızı, kırmızı ve sarı, yeşil, sarı.
Trafik yönetmeliği ışıkların anlamını şöyle yazar: kırmızı dur; kırmızıyla birlikte sarı, yol açılmak üzere, hazırlan; yeşil geç; yeşilden sonra sarı, yol kapanmak üzere. Modelimiz bu sırayı izler: kırmızı, kırmızı ve sarı, yeşil, sarı. Süreleri sınıfta izleyebilmek için kısa seçtik.
Trafik İşaretleri Hakkında Yönetmelik'e göre sarı ışığın anlamı sırasına bağlıdır: kırmızıyla birlikte yanarsa yol açılmak üzeredir ve bekleyen sürücüler hazırlanır; yeşilden sonra yanarsa yol kapanmak üzeredir. Kırmızı mutlak duruş, yeşil geçiş demektir. Modelimizin dört aşaması: kırmızı (3 sn), kırmızı ve sarı (1 sn), yeşil (3 sn), sarı (1 sn). Süreler sınıfta izlenebilsin diye kısa.
Yönetmeliğe göre kırmızı, yolun kapalı olduğunu ve mutlak duruşu; kırmızıyla birlikte yanan sarı, yolun açılmak üzere olduğunu; yeşil, yolun açık olduğunu; yeşilden sonra yanan sarı ise yolun kapanmak üzere olduğunu bildirir. Bu anlamlardan döngüsel bir sıra çıkar: kırmızı, kırmızı ve sarı, yeşil, sarı, sonra yine kırmızı. Modelde süreleri 3000, 1000, 3000 ve 1000 ms seçtik; bir tam tur 8 saniye sürer. Süreler sınıfta izlenebilsin diye kısa tutuldu.
Devreyi kuralım
USB takılı değilken kuralım. Her LED'in uzun bacağı kendi pinine gider: kırmızı pin 10, sarı pin 9, yeşil pin 8. Kısa bacaklar birer 220 Ω dirençle - rayına bağlanır. GND de - rayına gider.
USB takılı değilken kuralım. Üç LED'i ayrı sütunlara takalım. Anotlar kablolarla pinlere gider: kırmızı pin 10'a, sarı pin 9'a, yeşil pin 8'e. Her LED'in katodu kendi 220 Ω direnciyle - rayına bağlanır. Siyah kablo GND'yi - rayına bağlar. Böylece üç ayrı yol oluşur ama hepsi aynı GND'ye döner.
Bağlantıları USB takılı değilken yapalım. Kırmızı LED'in anodu pin 10'a, sarınınki pin 9'a, yeşilinki pin 8'e bağlanır. Her katot ayrı bir 220 Ω ile - rayına iner; GND kablosu da - rayına takılır. Böylece kart üç ayrı çıkış devresini ayrı ayrı yönetir: hangi pin HIGH olursa yalnız onun LED'i yanar.
USB takılı değilken üç dal kuralım: D10, kırmızı LED, 220 Ω, - rayı; D9, sarı LED, 220 Ω, - rayı; D8, yeşil LED, 220 Ω, - rayı. Siyah kablo GND'yi - rayına bağlar. Üç dal ayrı pinlerden beslenir, yalnız dönüş yolu (GND) ortaktır; her dalın akımı kendi direnciyle sınırlanır. Bir dalın açık kalması diğer ikisini etkilemez; örneğin sarı LED ters takılırsa yalnız o yanmaz.
Kodu okuyalım
Kodun başında her renge bir pin adı veriyoruz.
setupüç pini de çıkış yapar.loopiçinde dört adım var: kırmızıyı yak ve bekle, sarıyı da yak ve bekle, ikisini söndürüp yeşili yak ve bekle, yeşili söndürüp sarıyı yak ve bekle.Kodun ilk üç satırı renklere pin numarası verir:
kirmizi10,sari9,yesil8.setupüç pini de çıkış yapar.loopdört aşamadan oluşur ve her aşamadelayile biter. Bir LED'i söndürmedikçe yanık kalır; bu yüzden ikinci aşamada kırmızı hâlâ yanarken sarıyı ekleriz.Üç
const intsatırı renkleri pin numaralarına bağlar.setupiçinde üç pin çıkış yapılır.loopdört aşamalıdır; her aşama önce ışıkları ayarlar, sonradelayile bekler. Pinler yeni bir komut gelene kadar son durumlarını korur. Bu yüzden ilk satır, önceki turdan yanık kalan sarıyı söndürür. Kod yukarıdan aşağı çalışır, en alta gelince başa döner.Kod, trafik ışığının dört aşamasını sırayla kurar. Her aşama iki parçadan oluşur: çıkışları ayarlayan
digitalWritesatırları ve aşamayı koruyandelay.digitalWriteyalnız yazdığı pini değiştirir; diğer pinler önceki değerini korur. Bu yüzden 2. aşamada yalnız sarıyı yakmak yeter, kırmızı zaten HIGH'tır. Döngünün başındakidigitalWrite(sari, LOW), 4. aşamadan kalan sarıyı söndürür. Bir tur: 3000 + 1000 + 3000 + 1000 = 8000 ms.Arduino koduAltında Türkçesiconst int kirmizi = 10;Kırmızı LED pin 10'da. Kodda Türkçe harf kullanmadığımız için adı kirmizi.const int sari = 9;Sarı LED pin 9'da.const int yesil = 8;Yeşil LED pin 8'de.void setup() {Hazırlık bölümü: kart açılınca bir kez çalışır.pinMode(kirmizi, OUTPUT);Kırmızı LED'in pinini çıkış yap.pinMode(sari, OUTPUT);Sarı LED'in pinini çıkış yap.pinMode(yesil, OUTPUT);Yeşil LED'in pinini çıkış yap.}Hazırlık bölümü bitti.void loop() {Tekrar bölümü: dört adım sırayla çalışır, sonra başa döner.digitalWrite(sari, LOW);1. adım: Önceki turdan yanık kalan sarıyı söndür.digitalWrite(kirmizi, HIGH);Kırmızıyı yak: dur.delay(3000);3 saniye bekle.digitalWrite(sari, HIGH);2. adım: Kırmızı yanarken sarıyı da yak: hazırlan.delay(1000);1 saniye bekle.digitalWrite(kirmizi, LOW);3. adım: Kırmızıyı söndür.digitalWrite(sari, LOW);Sarıyı söndür.digitalWrite(yesil, HIGH);Yeşili yak: geç.delay(3000);3 saniye bekle.digitalWrite(yesil, LOW);4. adım: Yeşili söndür.digitalWrite(sari, HIGH);Sarıyı yak: kırmızı geliyor.delay(1000);1 saniye bekle.}Tekrar bölümü bitti; 1. adıma dön.
Çalıştıralım
USB'yi takalım ve ışıkları izleyelim: kırmızı, kırmızıyla sarı, yeşil, sarı ve yeniden kırmızı. Kodda o an çalışan satır parlıyor. Işık yanarken hangi satır parlıyor? "Süre" düğmeleriyle normal ve hızlı arasında geçip farkı görelim.
Kodu çalıştıralım. Işıklar sırayla değişiyor ve sıra bitince en baştan başlıyor; bu tekrar
loopsayesinde. Her ışık yanarken vurgulanan satır birdelay: kart o sırada bekliyor. "Süre" düğmeleriyle hızlıya geçelim; sıra aynı kalıyor mu, yalnız süreler mi kısalıyor?Kod çalışınca dört aşama sırayla gelir ve sonra başa döner. Vurgulanan satırı izleyelim: zamanın neredeyse tamamı
delaysatırlarında geçer, ışıkları değiştiren satırlar ise göz açıp kapayıncaya kadar çalışır. "Süre" düğmeleriyle hızlıya geçince sıra değişmez, yalnız bekleme süreleri kısalır. Sıra yanlış olsaydı kavşakta ne olurdu?Çalışan kodu izleyelim: aşamalar 3000, 1000, 3000 ve 1000 ms sürer ve
loopsonunda başa döner. Zamanın neredeyse tamamıdelaysatırlarında geçer; bu sırada kart başka hiçbir satırı çalıştırmaz. "Süre" düğmesiyle hızlıya geçmek algoritmanın adımlarını değiştirmez, yalnız bekleme değerlerini küçültür. Not: Bu kod bir yaya butonunu ancakdelaybitince okuyabilirdi; buna ileride döneceğiz.SüreArduino koduAltında Türkçesiconst int kirmizi = 10;Kırmızı LED pin 10'da. Kodda Türkçe harf kullanmadığımız için adı kirmizi.const int sari = 9;Sarı LED pin 9'da.const int yesil = 8;Yeşil LED pin 8'de.void setup() {Hazırlık bölümü: kart açılınca bir kez çalışır.pinMode(kirmizi, OUTPUT);Kırmızı LED'in pinini çıkış yap.pinMode(sari, OUTPUT);Sarı LED'in pinini çıkış yap.pinMode(yesil, OUTPUT);Yeşil LED'in pinini çıkış yap.}Hazırlık bölümü bitti.void loop() {Tekrar bölümü: dört adım sırayla çalışır, sonra başa döner.digitalWrite(sari, LOW);1. adım: Önceki turdan yanık kalan sarıyı söndür.digitalWrite(kirmizi, HIGH);Kırmızıyı yak: dur.delay(3000);3 saniye bekle.digitalWrite(sari, HIGH);2. adım: Kırmızı yanarken sarıyı da yak: hazırlan.delay(1000);1 saniye bekle.digitalWrite(kirmizi, LOW);3. adım: Kırmızıyı söndür.digitalWrite(sari, LOW);Sarıyı söndür.digitalWrite(yesil, HIGH);Yeşili yak: geç.delay(3000);3 saniye bekle.digitalWrite(yesil, LOW);4. adım: Yeşili söndür.digitalWrite(sari, HIGH);Sarıyı yak: kırmızı geliyor.delay(1000);1 saniye bekle.}Tekrar bölümü bitti; 1. adıma dön.
Bu bir algoritma
Bir işi yapmak için adımları sırayla yazmaya algoritma denir. Diş fırçalarken de belli adımları sırayla yaparız. Trafik ışığımızın algoritması: kırmızıyı yak, bekle, sarıyı ekle, bekle, yeşile geç, bekle, sarıya geç, bekle. Sonra döngü bunu baştan tekrarlar.
Sırası belli adımlar dizisine algoritma denir. Kodumuz da bir algoritma: 1) Kırmızıyı yak, 3 sn bekle. 2) Sarıyı da yak, 1 sn bekle. 3) Yeşile geç, 3 sn bekle. 4) Sarıya geç, 1 sn bekle. Döngü bu dört adımı durmadan tekrarlar. Adımların yeri değişirse ışık yanlış çalışır.
Sırası belli, açık ve sonlu adımlardan oluşan çözüm yoluna algoritma denir. Trafik ışığı algoritmamızın dört adımı var; her adımda hangi ışıkların yanacağı ve ne kadar bekleneceği bellidir. Bu adımları kâğıda yazıp bir akış şeması olarak da çizebiliriz.
loopise bir döngüdür: dördüncü adım bitince algoritma birinci adıma döner.Algoritma, bir problemi çözen, sırası belli, açık ve sonlu adımlar dizisidir. Trafik ışığımızda her adım bir durum (hangi ışıklar yanık) ve bir süre içerir; bu yapı bir tablo olarak da yazılabilir: kırmızı 3000 ms; kırmızı ve sarı 1000 ms; yeşil 3000 ms; sarı 1000 ms.
loop, tablonun sonuna gelince başa dönen bir sonsuz döngüdür. Adımlar eksiksiz olmalıdır: kırmızıyı söndüren satırı unutursak yeşil ve kırmızı birlikte yanar.Arduino koduAltında Türkçesiconst int kirmizi = 10;Kırmızı LED pin 10'da. Kodda Türkçe harf kullanmadığımız için adı kirmizi.const int sari = 9;Sarı LED pin 9'da.const int yesil = 8;Yeşil LED pin 8'de.void setup() {Hazırlık bölümü: kart açılınca bir kez çalışır.pinMode(kirmizi, OUTPUT);Kırmızı LED'in pinini çıkış yap.pinMode(sari, OUTPUT);Sarı LED'in pinini çıkış yap.pinMode(yesil, OUTPUT);Yeşil LED'in pinini çıkış yap.}Hazırlık bölümü bitti.void loop() {Tekrar bölümü: dört adım sırayla çalışır, sonra başa döner.digitalWrite(sari, LOW);1. adım: Önceki turdan yanık kalan sarıyı söndür.digitalWrite(kirmizi, HIGH);Kırmızıyı yak: dur.delay(3000);3 saniye bekle.digitalWrite(sari, HIGH);2. adım: Kırmızı yanarken sarıyı da yak: hazırlan.delay(1000);1 saniye bekle.digitalWrite(kirmizi, LOW);3. adım: Kırmızıyı söndür.digitalWrite(sari, LOW);Sarıyı söndür.digitalWrite(yesil, HIGH);Yeşili yak: geç.delay(3000);3 saniye bekle.digitalWrite(yesil, LOW);4. adım: Yeşili söndür.digitalWrite(sari, HIGH);Sarıyı yak: kırmızı geliyor.delay(1000);1 saniye bekle.}Tekrar bölümü bitti; 1. adıma dön.
Beklemeleri silersek?
Önce tahmin edelim: Koddaki bütün
delaysatırlarını, yani bekle komutlarını silersek ne olur? Işıklar yine sırayla yanar mı? Tahminimizi söyleyelim, sonra cevaba bakalım.Tahmin et, sonra tartış. Koddaki dört
delaysatırını silersek kart ışıkları yine aynı sırayla değiştirir mi? Değiştirirse biz bunu görebilir miyiz? Önce sınıfça tahmin edelim, sonra cevabı okuyalım.Bir satırın görevini anlamanın yolu, o satır olmasaydı ne olacağını düşünmektir. Bütün
delaysatırlarını silersek kod yine aynı sırayla çalışır mı? Her aşama ne kadar sürer? Gözümüz bu değişimi yakalayabilir mi? Önce gerekçeli tahminlerimizi yazalım, sonra cevaba bakalım.Düşünce deneyi: dört
delaysatırı silinirse algoritmanın sırası korunur ama her aşamanın süresi, birkaçdigitalWritesatırının çalışma süresine iner. Bu süre, insan gözünün ayırt edebileceği süreyle karşılaştırıldığında nasıldır? Işıkları nasıl görürüz? İpucu: Ders 2'de bekleme 0,2 saniyeye indiğinde LED'in yanıp söndüğünü hâlâ görüyorduk; peki süre bunun binde birinden de kısa olursa? Tahminimizi gerekçesiyle yazalım; PWM ile bağlantısını da düşünelim.Tahmin et: Bütün
delaysatırlarını silersek ışıklar ne yapar?Kart yine sırayla çalışır ama çok çok hızlı. Işıklar gözümüzün yakalayamayacağı kadar hızlı değişir; üç ışık birden sönükçe yanıyor gibi görünebilir. Bekleme komutu, her ışığın görebileceğimiz kadar yanmasını sağlar.
Tahmin et: Bekleme komutları olmadan ışıkların değiştiğini görebilir miyiz?
Kart sırayı bozmaz ama her aşama saniyenin milyonda birkaçı kadar sürer. Göz bu kadar hızlı değişimi ayırt edemez: ışıklar göremeyeceğimiz hızda değişir, üçü birden sönükçe yanıyor gibi görünebilir.
delay, her aşamanın insanların görebileceği kadar sürmesini sağlar.Tahmin et:
delaysatırları silinince kod sırayı bozar mı? Biz ışıkları nasıl görürüz?Sıra bozulmaz; kod yine yukarıdan aşağı çalışır. Ama her aşama yalnız birkaç
digitalWritesatırı kadar, yani mikrosaniyeler sürer. Göz bu kadar hızlı değişimi ayrı ayrı göremez; ışıklar göremeyeceğimiz hızda değişir ve üçü birden sönükçe yanıyor gibi görünebilir. Demek kidelayalgoritmanın bir parçasıdır: süre de bir adımdır.Tahmin et: Her aşama yalnız birkaç mikrosaniye sürerse LED'leri nasıl algılarız?
Sıra korunur ama bir tur birkaç on mikrosaniyeye iner; LED'ler saniyede binlerce kez yanıp söner. Göz bu hızlı değişimi ortalar: her LED, açık kaldığı zamanın oranına göre sönük ve sürekli yanıyor gibi görünür. Bu, PWM'in temel fikridir:
analogWrite, ~ pinlerde saniyede yaklaşık 490 kez (5 ve 6. pinlerde 980 kez) açıp kapatarak parlaklığı ayarlar. Trafik ışığı için ise anlamlı süreler gerekir; bu yüzdendelayşarttır.Yaya butonu ekleyelim mi?
Bazı yaya geçitlerinde bir buton vardır; yaya basınca ışık sistemi yayaların geçmek istediğini öğrenir. Ders 3'teki butonu bu devreye ekleyebiliriz. Butona basılınca kodun hangi adımı değişmeli? Sınıfça düşünelim.
Ders 3'te butonu okumayı öğrendik, bu derste ışıkları sıraladık. İkisini birleştirelim: yaya butona basınca araçlar için ışık sarıya, sonra kırmızıya dönsün. Bunun için kodda bir
ifgerekir: eğer butona basıldıysa sırayı başlat. Butonu boştaki bir pine, örneğin pin 2'ye bağlayabiliriz.Yaya butonu fikri: Ders 3'teki buton devresini pin 2'ye kuralım. Işık yeşilken yaya butona basarsa sıra sarıya, sonra kırmızıya geçsin; kırmızıda yayalar geçsin. Kodda
if (digitalRead(2) == HIGH)ile bir karar ekleriz. Ama dikkat: kartdelayiçindeyken butonu okumaz. Bu sorunu nasıl çözebiliriz?Yaya butonu, Ders 3 ile Ders 4'ü birleştirir: D2'ye pull-down dirençli bir buton ekleyip yeşil aşamasında okuyalım. Sorun:
delay(3000)çalışırken kart girişi okumaz, kısa bir basış kaçabilir. Çözüm fikri: uzun bekleme yerine kısa beklemelerden oluşan bir döngü kurup her turda butonu okumak (ör. 100 kezdelay(30)). Daha ileri bir yol,millis()ile zamanı ölçüp hiç durmadan butonu okumaktır.Özet
Bugün üç LED ile bir trafik ışığı modeli yaptık. Her LED'in kendi pini ve direnci var. Kod, ışıkları sırayla yakan bir algoritma.
loopbu sırayı hep tekrarlar. Bekleme olmasaydı ışıkların değiştiğini göremezdik.Özet: Kırmızı pin 10'da, sarı pin 9'da, yeşil pin 8'de; her LED'in kendi 220 Ω direnci var. Sıra: kırmızı, kırmızı ve sarı, yeşil, sarı. Sırası belli adımlar bir algoritmadır;
loopbu algoritmayı tekrarlayan döngüdür.delayher adımın görülebilecek kadar sürmesini sağlar.Trafik ışığı algoritması dört adımdan oluşur ve her adımda hangi ışıkların yanacağı ile süresi bellidir. Pinler yeni bir komut gelene kadar durumunu korur; bu yüzden söndürme komutlarını unutmamak gerekir.
loopadımları sonsuza kadar tekrarlar,delayise süreyi belirler. Ders 3'teki butonla bu sisteme yaya isteği eklenebilir.Model, yönetmelikteki ışık anlamlarına uygun dört aşamalı bir döngüdür: 3000, 1000, 3000, 1000 ms; bir tur 8 s.
digitalWriteyalnız yazdığı pini değiştirir, diğerleri durumunu korur.delaysırasında kart başka satır çalıştırmaz; bu, butonlu bir sistemde kısa basışların kaçmasına yol açabilir. Beklemesiz hızlı açıp kapama ise gözde sönük ve sürekli ışık etkisi yaratır: PWM'in temeli.Mini sınav
Mini sınav
Mini sınav
Mini sınav