Friday, January 31, 2020

Robotik Ders 4 - Digital

Bu ders için gerekli parçalar:
  1. dMoto + Arduino Nano + Mini USB kablo
  2. Breadboard
  3. Buton
  4. LED
  5. 330R direnç
  6. 10K direnç
  7. 5 erkek-erkek jumper kablo
dMoto kartı üzerine monteli Arduino Nano kullanarak buton ile LED yakıp söndüreceğiz. Dersten önce aşağıdaki video izlenmiş, breadboard ile devre yapılmış ve kod yazılmış olmalı.



Sınıftaki dersin başında videoyu henüz izlememiş olanlardan kendi laptoplarında videoyu izlemeleri istenecek. Anlaşılmayan bir şey olduğunda videoda nereyi anlamadıkları sorulacak.

Videoda anlatılanları tam olarak yapabilenlere sorular:
  1. #define satırları ne işe yarıyor?
  2. setup() fonksiyonu ne zaman çalışmaya başlar, kaç kez çalışır?
  3. pinMode(..., OUTPUT) ne yapar?
  4. pinMode(..., INPUT) ne yapar?
  5. loop() fonksiyonu kaç kez çalışır, ne zaman durur?
  6. digitalRead() fonksiyonu ne yapar?
  7. if ... else ne yapar?
  8. digitalWrite() fonksiyonu ne yapar?
  9. Serial.println() fonksiyonu ne yapar?
Nano + buton + buzzer:
  • LEDi yakmak yerine buzzerdan ses çıkarmak istesek kodu nasıl değiştirmeliyiz? 10 dakika süre.
  • Serial monitöre LED HIGH/LOW yerine BUZZER ON/OFF yazmak için kodu nasıl değiştirmeliyiz? 5 dakika süre.
  • Kod.

Nano + buton basılıyken LED blink:
  • Buton basılıyken LEDin sürekli yanıp sönmesini sağlamak için kodu nasıl değiştirmeliyiz? delay(). 10 dakika süre.
  • Kod.

Wednesday, January 22, 2020

Robotik Ders 3 - Elektrik Devresi

Bu ders için gerekli parçalar:
  1. dMoto + Arduino Nano + Mini USB kablo
  2. Breadboard
  3. Pil kutusu + 4 AA pil
  4. 330R direnç
  5. LED
  6. Buton
Arduino IDE'de do re mi mi kodunu yaz, çalıştır.

Elektrik devresi nedir?

Breadboard ne işe yarar?


Kaynak: https://www.nutsvolts.com/magazine/article/smileys_workshop_an_avr_c_programming_series_part_11
Basit LED devresi:

Butonlu LED devresi:


Monday, January 13, 2020

Robotik Ders 2

Bu ders için gerekli parçalar:
  1. Üzerine Arduino Nano monteli dMoto kartı
  2. Mini USB kablo
Siren kodunu açıkla:
  • Kod C++ programlama dilinde yazıldı. C++ elektronikte yaygın olarak kullanılır.
  • #define: Yanındaki isim ve rakam çiftini rakamı isimle çağırabilmek için kullanmamızı sağlar. Örneğin #define NOTE_C4  262 ile kodda NOTE_C4 yazarak 262 yazmakla aynı sonucu elde ederiz. Rakam yerine isimleri daha kolay aklımızda tutabildiğimiz için yararlıdır. Kodda 262 gördüğümüzde bunun C4 notası olduğunu bilemeyebilir, şarkıyı koda bakarak anlayamayız.
  • Fonksiyonlar (setup(), play(), loop())
    • Blockly Games, Müzik, İşlevler'de yaptığımız şey fonksiyon tanımlamaktı.
    • setup(): Karta güç verildiğinde bir kez çalışır. Bir kez yapılması yeterli ayarlamalar için kullanılır.
      • pinMode()
        • buzzerPin, LED_BUILTIN (13): Arduino Nano'nun hangi numaralı bacaklarına buzzer (basit hoparlör) ve LED bağlı olduğunu gösterir
        • OUTPUT: Nano'nun bu bacaklara elektrik vereceğini ifade eder.
    • loop(): Sürekli çalışır, kartın elektriğini kesene kadar tekrar tekrar (saniyede 117bin kezi bulabilir) çağrılır.
      • digitalWrite(): Nano'nun hangi bacağında ne işlem yapılacağını belirler
        • Pin numarası = LED_BUILTIN
        • HIGH: Elektrik ver = LED'i yak.
        • LOW: Elektriği kes = LED'i söndür.
      • play(): Buzzer'dan ses çıkar
        • freq_Hz, duration_ms. Frekans örneği: Elin bir aşağı yukarı hareket süresi = period, frekans = 1/period. Elimin aşağı yukarı hareket süresi 2 saniye ise frekans 0.5Hz olur.
        • Ses dalgaları havanın titreşmesi ile olur, insan 20Hz ile 20kHz arasını duyabilir. 1kHz = 1000Hz, 1kg = 1g gibi.
        • tone(): frekans, Hz, süre, 1000 milisaniye [ms] = 1 saniye. Arduino Nano 16MHz'te çalışıyor, saniyede 16 milyon işlem yapabilir.
        • delay(): Girilen ms kadar bekler.
Kodda değişiklik yaparak sonuçlarını gözle:
  • loop() içerisindeki kodu kes ve setup() içerisine yapıştır, kodu karta yükle, öncekine göre ne farkı var?
  • play()'e girdi olarak verdiğin duration_ms değerlerini azalt, hangi değerde LED'in yanıp sönmesi ayırt edilemez oluyor?
  • NOTE_C4 değerini azalt, ne zaman ses bozuluyor? Aynısını arttırarak dene.
  • digitalWrite() fonksiyonuna LED_BUILTIN yerine buzzerPin'i girdi olarak verince ne oluyor?

Sunday, January 5, 2020

Robotik Ders 1

Bu ders için gerekli parçalar:
  1. dMoto kartı
  2. Arduino Nano
  3. Mini USB kablo
Elektronik kartları yanlardan tut, yoksa vücudundaki statik elektrik karttaki devrelere zarar verebilir.

Kırmızı dMoto kartını ve mavi Nano'yu poşetlerinden dikkatlice yanlardan tutarak çıkart. Nano küçük boyutlarına rağmen laptoplarımız gibi bir bilgisayardır, sadece kapasitesi daha düşüktür. Nano üzerindeki USB (metal kısım) ile kart üzerindeki iki ok aynı yöne bakmalı. dMoto kartının üzerine Arduino Nano'yu oturt, Nano'nun bacakları sokete tamamen girmeli. Buzzer üzerindeki beyaz etiketi çıkart.

Mavi kablonun bir ucunu Nano'ya diğer ucunu bilgisayara tak. Nano üzerinde ışığın yandığını gör.

Windows 10 kurulu bilgisayarlara Arduino IDE kur.
Arduino IDE'yi çalıştır. Eğer editör dili Türkçe ise dili İngilizce (English) yap, programı kapatıp aç:

Diğer ayarları yap:
Tools menüsünden Nano'yla ilgili ayarları yap:
  1. Board = Nano
  2. Processor = ATmega328P (Old Bootloader)
  3. Port = Kartın takılı olduğu COM portu. Not1: Bilgisayarda daha önceden tanımlı bir COM portu yoksa Nano'yu bağlayınca COM portu oluşur, o port IDE'den seçilir. Birden fazla COM portu varsa kartın COM port numarası Windows aygıt yöneticisinde Bağlantı noktaları (COM ve LPT) altında, yanında CH340 yazan portun numarasıdır. Not2: Eğer bilgisayarda Windows 10 değil de Windows 7 varsa CH340 driver kurmak gerekebilir.

Blink örneğini aç:


Upload (sağ ok) butonuna bas:

Programın Nano'ya yüklenmesi tamamlanınca Arduino IDE'nin ortasındaki yeşil kısımda "Done uploading" ve alt tarafta kırmızı "Thank you" mesajı görünür:

Program Nano'da çalışır ve Nano üzerindeki küçük kırmızı  LED saniyede bir yanıp sönmeye başlar.
Siren kodunu elle yaz. Kodu yazarken pek kullanmadığımız "#", "{" (süslü parantez), "[" gibi karakterlerin klavyeyle nasıl yazılacağı öğreniliyor. Not: Çift tırnak (") yerine tek tırnağı (apostrof) iki kez yazanlar oluyor.

Kodu kaydet ve Nano'ya yükle. İlk denemede kodda muhtemelen yazım hatası olacağından hata mesajı çıkacaktır. Örnek hata mesajı (kırmızı işaretli satırda buzzerPin yerine küçük p harfi ile buzzerpin yazılmış):

Hataları düzelt, tamamı düzelene kadar yükleme denemelerine devam et. Yükleme tamamlandıktan sonra Nano üzerinde LED yanıp sönerken dMoto kartı üzerindeki buzzer siren sesi çıkarır.

Nano'yu her bilgisayara bağladığında (yani elektrik verdiğinde) içinde yüklü olan program çalışır, programı tekrar yüklemen gerekmez.

Robotiğe giriş

Robotiğe giriş derslerinin sonunda çocuklar okul projelerinin yazılım ve elektronik kısımlarını kendi başlarına yapabilir hale gelecekler. Robotik derslerinin odağında yazılım var, robotik/elektronik projelerini kodlamayı ilginç kılmak ve bilgisayarın dış donanımlarla nasıl etkileşebileceğini göstermek için kullanıyorum.

Windows 10 kurulu bilgisayar olması ve aşağıdaki bileşenlerin alınması gerekiyor.
  1. Rodeo Kodlama Robotu BT
  2. Arduino Nano
  3. Çizgi takip sensörü, 3 adet
  4. Ultrasonik sensör
  5. Breadboard - 8.5*5.5 cm, 2 adet
  6. Direnç 330R, 100K, 10K, 1K
  7. 2K potansiyometre2 adet
  8. Servo SG902 adet
  9. Sg90 Servo Motor Bağlantı Aparatı
  10. Ultrasonik sensör tutucu
  11. 5mm Kırmızı Led, Sarı, Yeşil
  12. 4 Pinli Push Buton, 5 adet
  13. 40 Pin Ayrılabilen Jumper Kablo-100mm, Dişi-Dişi, Dişi-Erkek, Erkek-Erkek
  14. 40 Pin Ayrılabilen Jumper Kablo-200mm, Dişi-Erkek
  15. 4 adet kalem pil
Blockly Games'te sürükle bırak yöntemiyle kodlamaya giriş yapmıştık, artık elle kod yazmayı öğrenme zamanı. Geliştirme ortamı olarak Arduino IDE kullanıyoruz. İdeali VS Code + PlatformIO kullanmak olurdu ancak çocukların ellerindeki laptopların bir kısmında Win7 olunca Python da kurmak gerekiyor, bu da kurulum aşamasını uzatıyor, şimdilik Arduino IDE yeterli.

Kodlamaya giriş

Çocuklarda Windows 7 (tercihen Windows 10) işletim sistemi ve Chrome browser kurulu laptop olması gerekiyor. Kodlamaya giriş için incelediğim eğitim sistemleri içerisinde en iyisi Blockly Games. Bedava, Türkçe dil seçeneği var, offline olarak da kullanılabiliyor, web tabanlı olduğu için herhangi bir kurulum gerektirmiyor.

Kodlama oyun/puzzle şeklinde kurgulanmış, öğrenciler soruları çözerken temel yazılım kavramları ile tanışıyor. Derste ben beş dakika konuya giriş yapıyorum, sonra çocuklar kendi laptop'larında soruları çözmeye başlıyorlar. Her çocuk kendi hızında ilerliyor, öğretmen olarak rolüm takıldıkları yerde onlara yardımcı olmak. Tipik bir dersten ziyade atölye çalışması yapıyoruz. Blockly Games ile igili bir video (tüm videolar):

Dikkat edilmesi gereken konu bölümlerin son sorularının genellikle çok zor olabilmesi. Örneğin ilk bölümün onuncu sorusunu çocuğun çözebilme olasılığı sıfıra yakın, en fazla 10 dakika uğraşıp çözemese dahi bir sonraki bölüme geçmek lazım. Her bölüm kolay sorularla başlıyor.

Derslerimi 8-13 yaş arası 12 çocuğa iki ayrı grup halinde her hafta C.tesi sabah birer saat veriyorum. Blockly Games'te bir bölümü bitirmemiz genellikle iki ders saati, yani iki hafta sürüyor. Tüm bölümlerin tamamlanması 10 haftayı buluyor. Bir gruptaki çocuk sayısının 10'un altında, tercihen 5 civarında olması gerekli.

Kodlama bilgisayar gibi düşünebilmeyi gerektirdiği ve bu düşünce biçimi çocuklar için yeni olduğundan bazen aynı kavramı beş kez tekrar etmeniz gerekebiliyor. Sınıf mevcudu fazla olduğunda en fazla bir iki kez anlatabilirsiniz ve çocuklar konuyu tam anlamayabilirler.

Neden çocuklar için kodlama ve robotik?

Bu bloğu ilk-ortaokul dönemindeki çocukların kodlama ve robotik öğrenmesine yardımcı olmak için oluşturdum.

Yazılımı robotların beyni gibi düşünebiliriz. Robotlar sensörleri ile etraflarını algılar, beyinlerindeki yazılım ile karar verir ve motorları ile uygularlar:

Kodlama ve robotik neden önemli:
  • Otomasyon çağında yaşıyoruz, kodlama ve robotik gittikçe daha yaygın hale geliyor. Çocuk ileride mühendis olmayacaksa bile temel kavramları bilirse teknolojiyi kendi ihtiyaçları için kolayca kullanabilir.
  • Kodlama ciddi dikkat gerektirdiğinden çocukların dikkatini geliştirmek için iyi bir antrenman. Dikkat başta matematik olmak üzere hayatın her alanında gerekli.
  • Çocuk fen ve matematik konularını soyut, sıkıcı formüller halinde ezberlemek yerine projelerde uygular. Örneğin robotun etrafa çarpmaması için gerekli mesafe sensörünü kullanırken ses dalgalarını ve yol = hız * zaman denklemini öğrenir.
  • Bir problemi bilgisayarın/robotun çözebileceği hale getirmek problem tanımlama, alt parçalara ayırma (analiz) ve çözüm adımlarına dönüştürme (algoritma) becerilerini geliştirir.
  • Karşılaştığı sorunları basit adımlara ayırarak çözme becerisi gelişir. Örneğin robot bluetooth komutlarına yanıt vermiyorsa önce bluetoothu basit şekilde test etmesi gerekir.
  • Başta hiç anlamadığı karmaşık problemleri çözebilir hale gelmek kendine güveni ve daha zorlu işlerle uğraşma isteğini arttırır.
  • Çocuk bilgisayar okur yazarı olur. Örnekler: USB bellekten bir dosyayı masa üstüne alma, web sayfasındaki yazıyı kopyalama, pencereyi minimize etme, büyütme.
Robotik kodlama için matematik bilgisine ihtiyaç yok, lazım olduğu kadarını ben anlatıyorum. Çocuğun ilgisinin ve azminin olması yeterli. İlgisi yoksa eziyete dönüşür, çünkü özellikle 3. aydan sonraki dersler kolay değil. İlgisi olup olmadığı birkaç dersten sonra belli olur.

Ben makine mühendisliği mezunu bir yazılımcı olduğum için çocukların derslerde öğrendikleri konuların gerçek hayatta nerelerde uygulandığını anlatarak onları motive edebilir, yazılım ve mühendislik mesleğinin neye benzediği ve kariyer seçimi konusunda yardımcı olabilir, bilimsel/rasyonel düşünme becerilerini geliştirebilirim. Çocuklara ne seviyeye kadar yardımcı olabileceğim soruluyor zaman zaman; Çocukların yanısıra üniversitedeki bilgisayar mühendisliği öğrencilerine de rehberlik ediyorum. Yazılımı meslek olarak yaptığımdan konuya ilgisi olanlara mühendis oldukları güne kadar destek verebilirim. Yazılım eğitimi hobim olduğu için herhangi bir maddi karşılık beklemiyorum, yararlı olmak ve onların da büyüdükleri zaman çevrelerine yardım ettiklerini hayal etmek benim için yeterince tatmin edici.

Dersleri haftada birer saatten 3-4 ay kodlama, 3-4 ay robotik olmak üzere kurguladım. Çocuklar derse konuyla ilgili videoyu seyrederek hazırlıklı gelmeliler, yoksa haftada 1 saatle ilerlemek mümkün olmaz. Giriş seviyesini 6 ayda tamamladıktan sonra benzer şekilde orta ve ileri düzey derslerle devam edeceğim.

Ders seviyeleri:
  1. Seviye A1 (3-4 ay): Blockly Games
  2. Seviye A2 (3-4 ay): İlk robot, okul projesi yapabilir hale gelme
  3. Seviye B1 (3-4 ay): Javascript ile oyun programlama 1, GitHub/Gist
  4. Seviye B2 (3-4 ay): IoT (NodeJS, ESP32, glitch), PID'ye giriş, magnetic levitation, daha iyi çizgi takibi.
  5. Seviye C1 (3-4 ay): Javascript ile oyun programlama 2: Pathfinding
  6. Seviye C2 (3-4 ay): Robot yarışmalarına katılım (TeknofestODTÜ, İTÜ)
  7. İleri seviye: Yüz tanıma, simülasyon, oto rotalama, blockchain vb. uygulama alanı odaklı çalışma. Her uygulama 3-4 ay.
O anki seviyenin hedefine doğrudan hizmet etmeyen ayrıntılarla zaman kaybetmekten kaçınmalı, ilgiyi canlı tutmalıyım. Derslerde çocukların anlayamayacağı karmaşıklıkta konulara girmemem ancak ilerlemeyecek kadar da basitleştirmemem gerekli (zone of proximal development). Örneğin A2 seviyesinde Ohm Kanunu'ndan bahsetmezken B2 seviyesinde voltage divider'ı anlatabilirim.