/Arduino

Various Arduino projects for beginners.

Primary LanguageC++

EEM 216 /Mikroişlemciler (Mikrodenetleyiciler - ARDUINO)

İkili sistem sayıcı (dijital pinleri çıkış olarak kullanma)

Binary Counter (using digital pins as output)

Derste binary kelimesinin ikili sistem (yâni 1 ve 0'lardan oluşan sistem) olduğunu göreceğiz. Bu kavramla sayısal tasarım (mantıksal devre tasarımı - logic circuits) dersinde True-False veya logic 0 - logic 1 olarak, Arduino'nun kendi ekosisteminde de özel tanımlanmış anahtar kelimeler olan HIGH-LOW ifadeleri şeklinde karşılaşabilirsiniz. Buna Boolean cebir (Boolean algebra) deniyor. Yapılan ilk deneyi izlemek için tıklayınız.

Örnek Sınav Soruları

  • Aşağıdaki devre şemasında ve verilen kodda setup() fonksiyonunda dijital pinlerin 0'dan başlayarak değil de 2'den başlayarak çıkış olarak tanımlandığını görüyoruz. İlk iki pinin dijital çıkış olarak tanımlanmamasının sebebi ne olabilir?
  • Aşağıdaki devre şemasında loop() foksiyonunda {a, b, c, d, e, f, g, h} değerleri oluşturulurken % operatörünün kullanıldığı görülüyor. Bu operatör neyi temsil ediyor, yâni ne işlev görüyor? Onluk sistemde bir byte'dan büyük olmayan bir sayıyı (e.g., 237) ikili (binary) sisteme çevirdiğiniz bir örnek üzerinde açıklayınız.

Arduino binary counter circuit

8-bit binary sayıcı

8-bit binary sayıcı USB powered

binary-counter-8-bit-improved.ino

void setup() {
  for (int pin = 2; pin <= 9; pin++) {
    pinMode(pin, OUTPUT);
  }
}

void loop() {
  for (byte i = 0; i < 256; i++) {
    byte bits = i;
    for (int pin = 2; pin <= 9; pin++) {
      digitalWrite(pin, bits & 1);
      bits = bits >> 1;
    }
    delay(250);
  }
}

Potansiyometre Kullanımı (Analog Giriş)

Using Potentiometer (Anaog Input)

Potansiyometre

Potansiyometrenin ayarlı direnç olduğunu daha önceki bölüm derslerimizde görmüş olmamız lâzım. Devrelerde gerilim bölücü (voltage divider) olarak vazife gören bu devre elemanının;

  • Üç bacağı olduğunu,
  • İlk ve son bacaklarına Arduino'nun Vcc +5V ve GND pinlerinin bağlandığını,
  • Orta bacağının Arduino'nun analog girişlerinden bir tanesine (e.g., A0) bağlandığını

bilmeliyiz. Analogdan dijitale çevirici (Analog to Digital Converter - ADC) aracılığıyla [0-5V] aralığında sürekli (continuous) değer alan analog sinyalin (potansiyometrenin orta bacağı), Arduino tarafından [0-1023] aralığında bir tam sayıya (integer) dönüştürülerek ayrık (dicrete) bir değer aldığını anlamalıyız. Örnek bir potansiyometre ve anlatılan Arduino bağlantılarını aşağıda görebilirsiniz.

Potansiyometre

Binary Counter, Üstten basmalı anahtar ve Potansiyometre

Using Toggle Switch as Digital Input and Potentiometer as Analog Input

Bir önceki projede kurduğumuz ikili sayıcı devresinde led'lerin yanma süresi sabitti. Bu deneyde ilk deneyimizi bozmadan geliştiriyoruz. Üstten basmalı anahtara basıldığında sayma işleminin durmasını ve serbest bırakıldığında da sayma işleminin devam etmesini istiyoruz. Bunun için D10 pinini dijital giriş (input) olarak kullanacağız. Ayrıca potansiyometreden okunan analog giriş vasıtasıyla Arduino'ya alınan değer delay() fonksiyonunda kullanılarak sayıcının sayma hızını manuel olarak değiştireceğiz. Sayıcı hızı potansiyometreden okuduğumuz değerle doğru orantılı olacak. Potansiyometre ile analog girişin kullanımı aşağıdaki kare dalga üreteci projesinde de yer alıyor. İkinci deneyi izlemek için tıklayınız.

Binary counter, toggle SW and pot

Geliştirilmiş İkili Sistem Sayıcı

Improved Binary Counter

Bir önceki Arduino deneyinde kodun en sonunda yer alan delay(250) komutuyla ayıcı hızı 250ms'de bir artacak biçimde ayarlanmış ve böylece sayıcı 1s'de 1000 / 250 = 4 sayı ilerlemişti. Bir saniyede dört sayı ilerlerse o zaman [0-255] yâni bir byte sayma süresi hemen hemen 1dk civarı (biraz fazla) olacaktır.

Bu deneyde bir potansiyometre kullanarak sayıcı hızını kendimiz manuel ayarlamak istiyoruz. Böylece potansiyometrenin üzerindeki ayarlanabilen dönen kısmı kullanarak sayıcı hızını artırıp azaltabileceğiz. Potansiyometreyi Arduino'ya analog girişlerden birinden bağlayacağız.

Ayrıca sayma işlemi gerçekleştirilirken üzerine basacağımız bir anahtar ile sayma işlemini durdurmak istiyoruz. Tekrar bastığımızda sayma işlemine devam etmesini istiyoruz. Bunun için dijital pinlerden birini giriş (input) olarak kullanacağımızı biliyoruz. Ancak bu düz mantık olmayabilir. Bu noktada karşımıza dijital pinden giriş olarak logic 0 ve logic 1 değerlerini okumada kullanmamız gereken pull-up ve pull-down rezistör kavramları geliyor. Bu donanımsal (devre analizi/tasarımı) ile ilgili ihtiyaç duyulan blgiye ek olarak daha ileri seviye bir konu olan kesme (interrupt) kavramını da bilmemiz gerekiyor. İngilizce'de INTERRUPT SERVICE ROUTINE (ISR) olarak bilinen kesme yardımıyla yukarıda bahsettiğimiz anahtara basınca sayacı durdurma ve (bıraktıktan sonra) tekrar basınca bu sefer de saymaya devam etme işini kolayca yapabiliriz. Özellikle bu kesme konusunda ChatGPT gibi bize kod yazma konusunda yardımcı olabilecek bir yapay zekâdan faydalanacağız. Deneyin bir başka videosunu izlemek için tıklayınız.

Binary counter with push-button switch and potentiometer

Kare Dalga Üreteci (Square Wave Generator)

Bu deneyimizde Arduino dijital çıkışlarından 13 no'lu pin olan D13'e hoparlör (veya buzzer) bağlayarak görev süresi (duty cycle) %50 olan frekansı potansiyometre tarafından manuel olarak ayarlanan kare dalga ürettik. Osiloskop ekranında kare dalgalar

Bu sinyali üstten basmalı anahtara (push-button switch) bastığımızda işitirken osiloskop ekranında aşağıda görüldüğü gibi iki farklı hâlde görüntüledik: a) Üstten basmalı anahtara basılmadığı (açık devre) durumunda, b) Üstten basmalı anahtara basıldığında (kapalı devre). Bu farklılığın açıklaması için bu videoyu izleyiniz.

Sqare wave generator with Arduino.

Deneyin push-button switch kullanılmadan yapılan bir başka videosu için tıklayınız.

Joystick ile Fırçasız Motor Manuel Hız Kontrolü (PWM sinyali ile)

Robotikte karşımıza çıkan motorlardan bazıları DC motor, adım (step) motor, servo motor ve fırçasız (brushless) motorlardır. Bunlardan RC modellerde yâni model uçak, araba, dronlarda sıklıkla kullanılan servo ve fırçasız motorları kontrol etmek için darbe genişlik modülasyonu (pulse width modulation - PWM) denilen bir metot var. Arduino kullanıcıları bu sinyali oluşturmak için özel bir kütüphane oluşturmuş. Bunun ismi Servo kütüphanesi. Arduino üzerindeki dijital pinlerden {3,5,6,9,10,11} no'lu olanlar (Arduino üzerinde ~ işaretinden anlayabilirsiniz) pwm sinyali üretmek için kullanılabilir. Aşağıdaki kodda D9 pininin pwm çıkışı olarak seçildiğini görebilirsiniz.

pwm_motor_control.ino

#include <Servo.h>
Servo motor;
int analogPin = A2; // [0-5]V

void setup() {
  motor.attach(9); // pwm sinyali D9
}

void loop() {
   int x = analogRead(analogPin); // [0-1023]
   // int y = map(x, 0, 1023, 0, 180);
   int z = map(x, 0, 1023, 1000, 2000);
   // motor.write(y);
   motor.writeMicroseconds(z);
}

Pinlerden D9 pwm çıkışı olarak fırçasız motora bağlanıyor. Elimizde bulunna eski bir dron kumandasının içine bir tane Arduino Pro Mini koyduk. Dron kumandasında dört adet potansiyometre var. Yâni iki adet joystick ediyor. Bunlardan birisi dronu yukarı-aşağı çıkarmak için kulllanılan THROTTLE denilen kanal. Biz bu potansiyometreyi A2 girişinden okuyup, yâni int x = analogRead(A2) komutuyla [0-5]V --> [0-1023] dönüşümünü yaptıktan sonra, Arduino'nun bize sağladığı map() fonksiyonuyla [1000-2000]us pwm sinyaline çevirip fırçasız motorun ESC denilen motor sürücü devresine uyguluyoruz. İlgili deneyi izlemek için video buradadır.

MPU6050 Hareket Sensörü Kullanımı (Using MPU6050 Motion Sensor)

MPU6050 sensörü verisini Arduino'ya MPU6050_tockn kütüphanesi yardımıyla okuyup Euler açılarını Arduino'nun seri port ekranında görüntüledik. Bu kütüphaneden esinlenerek bazı değişik özellikler ekleyip (e.g., sensör örnekleme frekansını ayarlama seçeneği, ivmemetre ve jiroskop verisi hassasiyeti ve max-min ölçüm değerleri) kendi kütüphanemiz olan MPU6050_ZUPT kütüphanesini oluşturduk. Bu kütüphaneye yapay zekâ yardımıyla yazdırdığımız Python kodlarını da ekleyerek MPU6050 verilerini gerçek zamanda pygame ve matplotlib paketleriyle görselleştirdik.

MPU6050 - Arduino connections

MPU6050 ile hesaplanan yunuslama açısı ile fırçasız motor hız kontrolü (Controlling brushless motor speed using pitch angle estimated with MPU6050)

Arkadaşlar, final sınavında bu soruyu soracağız. Kendi geliştirdiğimiz Arduino kütüphanesi olan MPU6050_ZUPT'da yer alan GetEuler.ino örneğini açıp gerekli Servo kütüphanesi komutlarını yazarak bu işi yapıyorduk. Bununla ilgili örnek video'yu kısa bir süre içinde buradan izleyebilirsiniz. Not: Bu kodu da kendi Arduino'larına yazıp fırçasız motorun hızını MPU6050 ile kontrol edenler final sınavından bir 20 puanı daha garantileyebilirler.

MPU6050 ile Kontrol Edilen Robot

Bu projenin kumanda devresini kurup, Arduino'yu ilgili depodaki transmitter.ino kodu ile programlayıp robotu nRF24l01 aracılığıyla MPU6050 ile kontrol edenler final sınavının 20 puanını almış sayılıyorlar.

Transmitter connection of gesture control RC car project

Projenin videosuna gesture robot bağlantısından ulaşabilirsiniz.