mBot Yapımı – Arduino Akıllı Robot Kiti
Merhaba arkadaşlar bugünkü yazımızda hem çizgi izleyen, hem engelden kaçan hemde bluetooth ile kontrol edilebilen mBot yapımı öğreneceğiz. Çizgi izleyen mBot‘un özelliği bluetooth modül ile istediğiniz seçeneği seçebiliyor olacaksınız. Robot’a bluetooth modül ile bağlanacağız ve istersek engelden kaçan istersek çizgi izleyen yapacağız. Şimdi araç için ürünlerin listesine geçelim.
mBot Yapımı
Arduino ile Robot Yapımı Listesi
mBot robot yapımı projemizin yazılım kısmına bakılacak olursa, gömülü yazılım Arduino’nun arayüzü ile android yazılımı ise App Inventor programı ile yazılmıştır. Android cihazdan gönderilen veriler, HC06 bluetooth modülü üzerinden Arduino UNO’ya gönderilmektedir. Arduino ise gelen verilerin gerekli şartları sağlaması halinde L298 Motor Shield’i tetikleyerek motorların gereken yön ve hızda dönmesini sağlamaktadır.
L298 Motor Shield, çoğu motor sürücü kartların aksine hem 2A gibi yüksek akım değerlerinde çalışabilmesi hem de modüler olarak üzerinde çevre elemanların takılmasını sağlayan soketler bulundurması açısından diğer sürücü kartlarından ayrılmaktadır. Üzerinde dahili olarak DC, step ve servo motorları için soketler bulunduran Shield, buna ilaveten bluetooth ile dijital ve analog pinler için de soketler barındırmaktadır. Bu özellikleri sayesinde çevre elemanları da Shield üzerine takılabilmekte ve bütün bir yapı ihtiva etmektedir.
L298 motor shield, çoğu motor sürücüye göre daha güçlü ve nitelikli bir sürücüdür. Üzerinde step, DC ve servo motorların takılabileceği soketler bulundurduğu gibi HC06 bluetooth modüllerinin takılabileceği 4 pinli soket de barındırmaktadır. L298P entegresinin güç verdiği motor sürücüde aynı anda 2 DC motor veya 1 step/servo motor sürülürken kanal başına 2A akım verebilmektedir. Ayrıca üzerinde bulundurduğu klemensler yardımıyla motor enerjisi harici bir kaynaktan alınabilmektedir. Ayrıca shield üzerindeki buzzer sayesinde istenen şartlarda ses vermesi sağlanabilmektedir.
Çizgi İzleyen mBot Robot Yapımı için Gerekli Malzemeler
L298N Motor Sürücü Kartı
L298N Motor Sürücü
24V’a kadar olan motorları sürmek için hazırlanmış olan bu motor sürücü kartı, iki kanallı olup, kanal başına 2A akım vermektedir. Kart üzerinde L298Nmotor sürücü entegresi kullanılmıştır. Sumo, mini sumo, çizgi izleyen robotlarda ve çok çeşitli motor kontrol uygulamalarında kullanılabilir.
HC06 Bluetooth Modülü
HC06 Bluetooth Modülü
HC06 Bluetooth Modülü, üzerinde CSR firmasına ait BC417 bluetooth çipi bulunan ve Bluetooth 2.0+EDR destekleyen bir karttır.
HC06 modülünün iki farklı modeli vardır. İlk modelde (HC06 Bluetooth Modülü-A2E7X) çip ve çeşitli devre elemanları bir kart üzerinde dizilmiş olarak bulunmaktadır. Ayrıca kart üzerinde gerekli anten dizaynı optimize edilmiş olarak gelmektedir. Bu tip kartlar PCB tasarımlarında lehimleme kolaylığı açısından daha kullanışlıdır.
İkinci ve daha çok tercih edilen modelde (HC06 Bluetooth Modülü (Pin Çıkışlı)-A2E7Y) ise ilk modelin gerekli pinleri ve haberleşme lojik seviyesi ayarlanmış şeklinde bulunmaktadır. Bu modelin üzerinde ikinci bir kart bulunup gerekli pinlerin dışarı alınması sayesinde herhangi bir lehimleme yapılmadan kullanıma uygundur. Böyle bir tasarım hobi ve robotik uygulamalarda kullanım kolaylığı açısından idealdir.
Modülün haberleşme bağlantısı serial(UART) olduğundan hızlı ve kolay bir kullanımı vardır. Ayrıca bu pinler yardımıyla AT komutlarını kullanarak modülün baud rate değeri, isim, şifre gibi çeşitli özellikleri değiştirilebilmektedir.
HC06 modülü varsayılan olarak Slave modda çalışmaktadır. HC05 modülü ise hem Master hem de Slave olarak kullanılabilmektedir.
Özellikler
• Bluetooth Çipi: CSR BC417
• Bluetooth Versiyonu: Bluetooth 2.0+EDR(Enhanced Data Rate)
• Hafıza: Harici 8Mbit Flash
• Çıkış Gücü: -4 ~ +6dBm
• Çalışma Frekansı: 2.4GHz
• Hassasiyet: -80dBm
• Çalışma Gerilimi: 1.8 – 3.6V(Tipik: 3.3V)
• Çalışma Akımı(Max): 40mA
• Çalışma Sıcaklığı: -40 ~ +85 °C
• Haberleşme Arayüzü: UART
• Çalışma Alanı: 10m
• Boyutlar(Modül): 27x13x2mm
• Boyutlar(Modül Kartı): 43x16x7mm
mBot app.inventor Aşaması
Arduino kodu, tamamen seri port üzerinden veri okuma ve okunan veriye göre dijital çıkışların high veya low yapma esasına dayanmaktadır. Bunun nedeni ise Android telefondan gelen verilerdir. Byte türündeki bu değerler okunarak gerekli şartları sağlaması durumunda motor sürücü tetiklenmektedir. Örneğin “10” değeri geldiği zaman araç ileri gidecek şekilde motor sürücüsü tetiklenmektedir. Hiçbir şartın sağlanmaması durumunda ise sürücü yine tetiklenerek motorların çalışmaması sağlanmaktadır. App Inventor ile yazılan Android blokları ise şu şekildedir:
Android programın arayüzüne bakıldığında 4 adet yön butonu, 1 adet Bluetooth arama butonu, 3 adet mod butonu ile Bluetooth durum label’i görülmektedir. mBot yapımı projemiz de bulunan HC06 bluetooth modülü ile telefonun önceden eşleştirilmiş olması gerekmektedir. Eşleştirdikten sonra telefonun bluetoothu açılarak programa öyle giriş yapılır. Ardından “Robocombo LOGO” tıklanarak bulunan Bluetooth cihazlarından HC06 seçilerek telefonu aygıta bağlayın. Artık araç kullanmaya hazır hale gelmiştir. Qr kodu okutarak veya dosyaların tamamını indirerek bu işlemi yapabilirsiniz.
İlgili mBot yapımı app.inventor kod bloğu şekildeki gibidir.
mBot Yapımı app.inventor Kod Bloğu
Bundan sonra ise aracın Kodları ile ilgileneceğiz. Öncelikle Ana Kod Bloğunu veriyoruz.
mBot yapımı bluetooth ile araç kontrolünün kod bloğu ana kod bloğumuz kadar önemlidir. Çünkü burada ki kod bloğu bize aracın bluetooth modül ile kontrolü konusunda bilgi vermektedir. Aracın montajı bittikten sonra bu kod bloğu ile araç çalışıtırılmalı ve yön bilgilerinin çalışıp çalışılmadığından emin olunmalı.
Not: Aşağıda Bulunan Kod Bloğu Arduino L298P Çift Motor Shield’e Göre Yazılmıştır. Ancak Robocombo Set043 Stok Kodlu Arduino Akıllı Robot Kiti – Kendin Yap Mbot Setinin İçerisinde L298N Çift Motor Sürücü Kartı Bulunmaktadır.
Kod bloğu aşağıda ki gibidir.
int pwm1 = 10; int pwm2 = 11; int yon1 = 12; int yon2 = 13; int gelenVeri = 0; void setup() { pinMode(pwm1, OUTPUT); pinMode(pwm1, OUTPUT); pinMode(yon1, OUTPUT); pinMode(yon2, OUTPUT); digitalWrite(pwm1, LOW); digitalWrite(pwm2, LOW); digitalWrite(yon1, LOW); digitalWrite(yon2, LOW); Serial.begin(9600); } void MotorKontrol(int mYon1, int mYon2, int pwmGiris) { digitalWrite(yon1, mYon1); digitalWrite(yon2, mYon2); digitalWrite(pwm1, pwmGiris); digitalWrite(pwm2, pwmGiris); } void loop() { gelenVeri = Serial.read(); if (gelenVeri == 10) // İleri { MotorKontrol(LOW, LOW, HIGH); } else if (gelenVeri == 20) // Geri { MotorKontrol(HIGH, HIGH, HIGH); } else if (gelenVeri == 30) // Sol { MotorKontrol(HIGH, LOW, HIGH); } else if (gelenVeri == 40) // Sağ { MotorKontrol(LOW, HIGH, HIGH); } else if (gelenVeri == 50) // Başka bir veri gelirse dur { MotorKontrol(LOW, LOW, LOW); } }
Aracı sadece çizgi izleyen olarak kullanmak istersek ise aşşağıdaki kod bloğunu kullanabilirsiniz. Burada ki kod bloğunu araca yüklediğinizde sadece çizgi izleyen sensörler ve motorlar aktif olacaktır. Mz80’ler veri okusada bu veri kod bloğunda kullanılmayacağı için çalışmıyor olarak da kabul edilebilirler. Burada ki kod bloğunu aracı ilk yaparken çizgi sensörler ile motorlar eş zamanlı çalışabiliyor mu ? Bağlantılarını doğru yaptık mı ? gibi sorulara cevap olarak kullanma durumumuz olacaktır.
int pwm1 = 10; int pwm2 = 11; int yon1 = 12; int yon2 = 13; int Sol = 8; int Orta = 7; int Sag = 6; void setup() { pinMode(pwm1, OUTPUT); pinMode(pwm1, OUTPUT); pinMode(yon1, OUTPUT); pinMode(yon2, OUTPUT); pinMode(Sag, INPUT); pinMode(Orta, INPUT); pinMode(Sol, INPUT); digitalWrite(pwm1, LOW); digitalWrite(pwm2, LOW); digitalWrite(yon1, LOW); digitalWrite(yon2, LOW); Serial.begin(9600); } void MotorKontrol(int mYon1, int mYon2, int pwmGiris) { digitalWrite(yon1, mYon1); digitalWrite(yon2, mYon2); digitalWrite(pwm1, pwmGiris); digitalWrite(pwm2, pwmGiris); } void loop() { gelenVeri = Serial.read(); Serial.println("çizgi izleyen kod bloğundasınız"); if(digitalRead(Sol) == 0 && digitalRead(Orta) == 1 && digitalRead(Sag) == 0){ // Orta sensör çizgiyi gördüğünde robot ileri MotorKontrol(LOW, LOW, HIGH); Serial.println("İleri gidiyor"); } if(digitalRead(Sol) == 1 && digitalRead(Orta) == 0 && digitalRead(Sag) == 0){ // Sağ sensör çizgiyi gördüğünde robot sağa MotorKontrol(LOW, HIGH, HIGH); Serial.println("sağa gidiyor"); } if(digitalRead(Sol) == 0 && digitalRead(Orta) == 0 && digitalRead(Sag) == 1){ // Sol sensör çizgiyi gördüğünde robot sola MotorKontrol(HIGH, LOW, HIGH); Serial.println("sola gidiyor"); } }
Çizgi İzleyen mBot Robot
İlgili kod bloğu ile araç sadece olacaktır.
Şimdi ki kod bloğumuz ise engelden kaçan kod blouğudur. 2 ADet MZ80 ile engelden kaçan robot yapımında da bu kod bloğu kullanılabilir. Buradaki kodlar aracınızı sadece engelden kaçan bir robota çevirecektir.
İlgili kod bloğumuz
int mz80 = 4; int mz81 = 2; int pwm1 = 10; int pwm2 = 11; int yon1 = 12; int yon2 = 13; int m1,m2; void setup() { pinMode(mz80, INPUT); pinMode(mz81, INPUT); pinMode(pwm1, OUTPUT); pinMode(pwm1, OUTPUT); pinMode(yon1, OUTPUT); pinMode(yon2, OUTPUT); digitalWrite(pwm1, LOW); digitalWrite(pwm2, LOW); digitalWrite(yon1, LOW); digitalWrite(yon2, LOW); Serial.begin(9600); } void MotorKontrol(int mYon1, int mYon2, int pwmGiris) { digitalWrite(yon1, mYon1); digitalWrite(yon2, mYon2); digitalWrite(pwm1, pwmGiris); digitalWrite(pwm2, pwmGiris); } void engel() { if(m1 == 1 && m2 == 1){ MotorKontrol(LOW, LOW, HIGH); // Engel yoksa ileri gider Serial.println("11111 if de"); } else if(m1 == 0){ // engel var ise geri sonra sol MotorKontrol(HIGH, LOW, HIGH); Serial.println("222222 if de"); } else if(m2 == 0){ // engel varsa geri sonra sağ MotorKontrol(LOW, HIGH, HIGH); Serial.println("ÜÇÇÇÇ if de"); } } void loop() { boolean m1=digitalRead(mz80); boolean m2=digitalRead(mz81); engel(); }
mBot Robot Yapımı Ana Kod Bloğumuz
Ana kod bloğumuzun özelliği tüm kodların tek bir kod çalışması içerisinde başarı şekilde yönetilmesidir. Buradaki ana kod blouğunun içerisinde bluetooth ile kontrol, çizgi izleyen mobil robot ve engelden kaçan mobil robot halene getirebiliyoruz.
mBot Ana kod bloğu
int pwm1 = 10; int pwm2 = 11; int yon1 = 12; int yon2 = 13; int mz80 = 4; int mz81 = 2; int Sol = 8; int Orta = 7; int Sag = 6; int m1,m2; int gelenVeri = 0; void setup() { pinMode(pwm1, OUTPUT); pinMode(pwm1, OUTPUT); pinMode(yon1, OUTPUT); pinMode(yon2, OUTPUT); pinMode(mz80, INPUT); pinMode(mz81, INPUT); pinMode(Sag, INPUT); pinMode(Orta, INPUT); pinMode(Sol, INPUT); digitalWrite(pwm1, LOW); digitalWrite(pwm2, LOW); digitalWrite(yon1, LOW); digitalWrite(yon2, LOW); Serial.begin(9600); } void MotorKontrol(int mYon1, int mYon2, int pwmGiris) { digitalWrite(yon1, mYon1); digitalWrite(yon2, mYon2); digitalWrite(pwm1, pwmGiris); digitalWrite(pwm2, pwmGiris); } void engel() { if(m1 == 1 && m2 == 1){ MotorKontrol(LOW, LOW, HIGH); // Engel yoksa ileri gider Serial.println("11111 if de"); } else if(m1 == 0){ // engel var ise geri sonra sol MotorKontrol(HIGH, LOW, HIGH); Serial.println("222222 if de"); } else if(m2 == 0){ // engel varsa geri sonra sağ MotorKontrol(LOW, HIGH, HIGH); Serial.println("ÜÇÇÇÇ if de"); } } void Cizgi(){ if(digitalRead(Sol) == 0 && digitalRead(Orta) == 1 && digitalRead(Sag) == 0){ // Orta sensör çizgiyi gördüğünde robot ileri MotorKontrol(LOW, LOW, HIGH); } if(digitalRead(Sol) == 0 && digitalRead(Orta) == 0 && digitalRead(Sag) == 1){ // Sağ sensör çizgiyi gördüğünde robot sağa MotorKontrol(HIGH, LOW, HIGH); } if(digitalRead(Sol) == 1 && digitalRead(Orta) == 0 && digitalRead(Sag) == 0){ // Sol sensör çizgiyi gördüğünde robot sola MotorKontrol(LOW, HIGH, HIGH); } } void loop() { if (Serial.available() > 0) { boolean m1=digitalRead(mz80); boolean m2=digitalRead(mz81); gelenVeri = Serial.read(); if (gelenVeri == 10) // İleri { MotorKontrol(LOW, LOW, HIGH); } else if (gelenVeri == 20) // Geri { MotorKontrol(HIGH, HIGH, HIGH); } else if (gelenVeri == 30) // Sol { MotorKontrol(HIGH, LOW, HIGH); } else if (gelenVeri == 40) // Sağ { MotorKontrol(LOW, HIGH, HIGH); } else if (gelenVeri == 50) // Başka bir veri gelirse dur { MotorKontrol(LOW, LOW, LOW); } while(gelenVeri == 70){ boolean m1=digitalRead(mz80); boolean m2=digitalRead(mz81); gelenVeri = Serial.read(); engel(); if(gelenVeri =! 70){ break; } } while (gelenVeri == 80){ gelenVeri = Serial.read(); Cizgi(); if(gelenVeri =! 80){ break; } } } }
mBot Kod Bloğu ile İlgili
Bu kod bloğu tüm kodların tek bir kod bloğunda toplanmış halidir.
Kendi Mbotunu yap setine dair aradığınız tüm kod ve dökümanlara erişebilirsiniz.
Çizgi İzleyen, Engelden Kaçan, Bluetooth Kontrollü Robot için Gerekli Malzeme ve Ekipmanlar;
Satın Alabileceğiniz Set:
Robocombo.com Üzerinden Arduino Akıllı Robot Kiti – Kendin Yap Mbot Setini Alabilirsiniz.