Sesli Kontrol Edilen Dört Bacaklı Robot Projesi
Kendi Robotunu Yap projelerimizin bu bölümünde dört bacaklı robotumuzu sesli komutla kablosuz kontrol edeceğiz.Robotumuzu python ve bitvoicer programlarını kullanarak iki farklı yöntemle sesli komutla yöneteceğiz.Daha önceki projemizde sesli komutla telefondan robotu kontrol etmiştik.
Buradan projemize bakabilirsiniz.
Malzemeler:
- Dagu Quadbot Klasik Kit
- Dagu Spider Kontrol Karı
- Mini USB Kablo
- Bluetooth Modül HC-06
- LiPo Batarya (7V-30)
- SRF05 Ultrasonik Sensör
- Bluetooth USB modül
Robot Kitimizin Mekanik Montajı:
Elektronik Kısım:
Örümcek kontol kartımızın servo pin bağlatılarını yapalım.
Ön Sol Kalça servo – 46.pin
Ön Sağ Kalça servo – 52.pin
Arka sol kalça Servo-28.pin
Arka sağ kalça Servo-13.pin
Ön Sol Diz servo – 47.pin
Ön Sağ Diz servo – 53.pin
Arka sol Diz servo – 29.pin
Arka sağ Diz servo – 12.pin
Hc-06 Bluetooth Modülün Bağlantı Pinleri:
GND – GND
VCC – + 5V
TXD – RX0 / D0 (Sinyal)
RXD – TX0 / D1 (Sinyal)
Yazılım Kısmı:
#include <Servo.h> // Servo kütüphanesi // servoların başlangıç pozisyonları #define FLHcenter 1500 #define FRHcenter 1500 #define RLHcenter 1520 #define RRHcenter 1450 #define FLKcenter 1150 #define FRKcenter 1220 #define RLKcenter 1220 #define RRKcenter 1210 // servoların pin numaraları #define FLHpin 46 // Front Left Hip servo pin #define FRHpin 52 // Front Right Hip servo pin #define RLHpin 28 // Rear Left Hip servo pin #define RRHpin 13 // Rear Right Hip servo pin #define FLKpin 47 // Front Left Knee servo pin #define FRKpin 53 // Front Right Knee servo pin #define RLKpin 29 // Rear Left Knee servo pin #define RRKpin 12 // Rear Right Knee servo pin char INBYTE; // gelen ses komutları // led pinleri int led1 = 27; int led2 = 11; int led3 = 45; int led4 = 26; int Time = 90; int LShift = 280; int RShift = 280; int Raise = 550; // servo tanımlamaları Servo FLHservo; Servo FRHservo; Servo RLHservo; Servo RRHservo; Servo FLKservo; Servo FRKservo; Servo RLKservo; Servo RRKservo; void setup() { // Attach servos (digitally) FLHservo.attach(FLHpin); FRHservo.attach(FRHpin); RLHservo.attach(RLHpin); RRHservo.attach(RRHpin); FLKservo.attach(FLKpin); FRKservo.attach(FRKpin); RLKservo.attach(RLKpin); RRKservo.attach(RRKpin); // Attach LEDs (digitally) pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); pinMode(led3, OUTPUT); pinMode(led4, OUTPUT); Serial.begin(9600); // servolara başlangı açılarını yazdırma FLHservo.writeMicroseconds(FLHcenter); FRHservo.writeMicroseconds(FRHcenter); RLHservo.writeMicroseconds(RLHcenter); RRHservo.writeMicroseconds(RRHcenter); FLKservo.writeMicroseconds(FLKcenter+700); FRKservo.writeMicroseconds(FRKcenter+700); RLKservo.writeMicroseconds(RLKcenter+700); RRKservo.writeMicroseconds(RRKcenter+700); delay(500); // gelen ses komutlarının harflerle eşleştirlmesi Serial.println("wasd - movement"); Serial.println("z - sleep"); Serial.println("x - play dead"); Serial.println("i - sit"); Serial.println("u - stand"); Serial.println("q - wake up"); } void loop() { Serial.println("Komut almaya hazır"); while (!Serial.available()); INBYTE = Serial.read(); delay(50); if (INBYTE == 'q') // Uyan { digitalWrite(led1, LOW); digitalWrite(led2, LOW); digitalWrite(led3, LOW); digitalWrite(led4, LOW); delay(200); digitalWrite(led1, HIGH); digitalWrite(led2, HIGH); digitalWrite(led3, HIGH); digitalWrite(led4, HIGH); delay(200); digitalWrite(led1, LOW); digitalWrite(led2, LOW); digitalWrite(led3, LOW); digitalWrite(led4, LOW); delay(200); digitalWrite(led1, HIGH); digitalWrite(led2, HIGH); digitalWrite(led3, HIGH); digitalWrite(led4, HIGH); delay(200); digitalWrite(led1, LOW); digitalWrite(led2, LOW); digitalWrite(led3, LOW); digitalWrite(led4, LOW); delay(200); digitalWrite(led1, HIGH); digitalWrite(led2, HIGH); digitalWrite(led3, HIGH); digitalWrite(led4, HIGH); delay(200); digitalWrite(led1, LOW); digitalWrite(led2, LOW); digitalWrite(led3, LOW); digitalWrite(led4, LOW); delay(200); digitalWrite(led1, HIGH); digitalWrite(led2, HIGH); digitalWrite(led3, HIGH); digitalWrite(led4, HIGH); } else if (INBYTE == 'z') //Uyu { FLHservo.writeMicroseconds(FLHcenter); FRHservo.writeMicroseconds(FRHcenter); RLHservo.writeMicroseconds(RLHcenter); RRHservo.writeMicroseconds(RRHcenter); FLKservo.writeMicroseconds(FLKcenter+700); FRKservo.writeMicroseconds(FRKcenter+700); RLKservo.writeMicroseconds(RLKcenter+700); RRKservo.writeMicroseconds(RRKcenter+700); delay(1000); digitalWrite(led1, HIGH); digitalWrite(led2, HIGH); digitalWrite(led3, HIGH); digitalWrite(led4, HIGH); delay(200); digitalWrite(led1, LOW); digitalWrite(led2, LOW); digitalWrite(led3, LOW); digitalWrite(led4, LOW); delay(200); digitalWrite(led1, HIGH); digitalWrite(led2, HIGH); digitalWrite(led3, HIGH); digitalWrite(led4, HIGH); delay(200); digitalWrite(led1, LOW); digitalWrite(led2, LOW); digitalWrite(led3, LOW); digitalWrite(led4, LOW); delay(200); digitalWrite(led1, HIGH); digitalWrite(led2, HIGH); digitalWrite(led3, HIGH); digitalWrite(led4, HIGH); delay(200); digitalWrite(led1, LOW); digitalWrite(led2, LOW); digitalWrite(led3, LOW); digitalWrite(led4, LOW); delay(200); } else if (INBYTE == 'u') // Ayağa kalk { // Center servos FLHservo.writeMicroseconds(FLHcenter); FRHservo.writeMicroseconds(FRHcenter); RLHservo.writeMicroseconds(RLHcenter); RRHservo.writeMicroseconds(RRHcenter); FLKservo.writeMicroseconds(FLKcenter); FRKservo.writeMicroseconds(FRKcenter); RLKservo.writeMicroseconds(RLKcenter); RRKservo.writeMicroseconds(RRKcenter); delay(1000); } else if (INBYTE == 'x') // Öl { FLHservo.writeMicroseconds(FLHcenter); FRHservo.writeMicroseconds(FRHcenter); RLHservo.writeMicroseconds(RLHcenter); RRHservo.writeMicroseconds(RRHcenter); FLKservo.writeMicroseconds(FLKcenter+700); FRKservo.writeMicroseconds(FRKcenter+700); RLKservo.writeMicroseconds(RLKcenter+700); RRKservo.writeMicroseconds(RRKcenter+700); delay(1000); } else if (INBYTE == 'i') //Otur { FLHservo.writeMicroseconds(FLHcenter); FRHservo.writeMicroseconds(FRHcenter); RLHservo.writeMicroseconds(RLHcenter-600); RRHservo.writeMicroseconds(RRHcenter+600); FLKservo.writeMicroseconds(FLKcenter); FRKservo.writeMicroseconds(FRKcenter); RLKservo.writeMicroseconds(RLKcenter+700); RRKservo.writeMicroseconds(RRKcenter+700); } else if (INBYTE == 'h') //El sıkış { FLHservo.writeMicroseconds(FLHcenter-600); FRHservo.writeMicroseconds(FRHcenter); RLHservo.writeMicroseconds(RLHcenter-600); RRHservo.writeMicroseconds(RRHcenter+600); FLKservo.writeMicroseconds(FLKcenter+600); FRKservo.writeMicroseconds(FRKcenter); RLKservo.writeMicroseconds(RLKcenter-700); RRKservo.writeMicroseconds(RRKcenter+700); delay(1000); FLKservo.writeMicroseconds(FLKcenter+300); delay(200); FLKservo.writeMicroseconds(FLKcenter+600); delay(200); FLKservo.writeMicroseconds(FLKcenter+300); delay(200); FLKservo.writeMicroseconds(FLKcenter+600); delay(200); } else if(INBYTE == 'w') // İleri Yürü { LShift=300; RShift=300; for(int i=0;i<5;i++) { Run(); } } else if(INBYTE == 'a') // Sola dön { LShift=-300; RShift=300; for(int i=0;i<3;i++) { Run(); } } else if(INBYTE == 'd') // sapa dön { LShift=300; RShift=-300; for(int i=0;i<3;i++) { Run(); } } else if(INBYTE == 's') // Geriye yürü { LShift=-300; RShift=-300; for(int i=0;i<5;i++) { Run(); } } } void Run() { FRKservo.writeMicroseconds(FRKcenter+Raise); // sağ ön bacak yükseltmek RLKservo.writeMicroseconds(RLKcenter+Raise-10); // sol ön bacak yükseltmek FLHservo.writeMicroseconds(FLHcenter+LShift); // geriye ön sol bacak hareketi RRHservo.writeMicroseconds(RRHcenter-RShift); // geriye arka sağ bacak hareketi delay(Time/2); FRHservo.writeMicroseconds(FRHcenter+RShift); // ileri ön sol bacak hareketi RLHservo.writeMicroseconds(RLHcenter-LShift); // ileri ön sağ bacak hareketi delay(Time); FRKservo.writeMicroseconds(FRKcenter); // Alt ön sağ bacak RLKservo.writeMicroseconds(RLKcenter); // Alt ön sol bacak delay(Time); FLKservo.writeMicroseconds(FLKcenter+Raise); // Ön sol bacağı kaldırma RRKservo.writeMicroseconds(RRKcenter+Raise); // Ön sağ bacağı kaldırma FRHservo.writeMicroseconds(FRHcenter-RShift); // arka sağ bacağı kaldırma RLHservo.writeMicroseconds(RLHcenter+LShift); // arka sol bacağı kaldırma delay(Time/2); FLHservo.writeMicroseconds(FLHcenter-LShift); // İleri ön sol bacak hareketi RRHservo.writeMicroseconds(RRHcenter+RShift); // İleri ön sağ bacak hareketi delay(Time); FLKservo.writeMicroseconds(FLKcenter); // Alt ön sol bacak RRKservo.writeMicroseconds(RRKcenter); // Alt ön sağ bacak delay(Time); }
Bluetooth modülü bilgisayara tanıtalım aşağıdaki gibi gelen ve giden portlar oluşacaktır.Hc-06 bluetooth modülün şifresi 1234 tür.
BitVoicer İle Sesli Kontrol:
BitVoicer programını indirin.Programa ses tanımlamak için öncelikle dil ayarını yapmamız gerekecek.Bunu yapmak için programi yönetici olarak çalıştırın ve File >> Additional Languages bölümünden kullanacağınız dili indirin.
Ses tanıtma için aşağıdaki adımları takip edelim.
- File >> New kısmından yeni dosya oluşturun.
- Default command data type veri türünü char yapın.
- Add New Sentence butonuna tıklayalım buradan komut ekliyoruz.
- Komut olarak örnek stand up yazdık.
- Yine Add New Sentence butonuna tıklayalım.
- İkinci komudumuz sit down ekledik.
- Default command data type veri türünü char yapın.
- Bu şekilde istediğiniz komutu ekleyin.Data türünü char yapın.
9. File >> Save kısmından komutları kaydedin.
10. File >> Preferences kısmından konuşma tanıma dilimizi ve bluetooth bağlantı portumuzu seçelim ve kaydedelim.
Python İle Sesli Kontrol:
Python yazılımı buradan indirebilirsiniz.
Projede için gerekli python kütüphanelerini indirelim.
- PyBluez 0.20 – Bluetooth (setup)
- PyAudio 0.2.8 – Ses tanımlama kütüphanesi (setup)
- SpeechRecognition 1.1.0 – Ses tanıma(download)
Python Yazılımı:
# Title: Speech Controlled Quadrapod # Author: Adith Jagadish # Description: Uses Google's Speech Recognition API and python bluetooth library to control a quadrapod # How to: Say "stand up" to make bot stand up and say "sit down" to make it sit. # Say "stop listening to terminate the program" import bluetooth import speech_recognition as sr port = 1 bd_addr = "xx:xx:xx:xx:xx:xx" sock = bluetooth.BluetoothSocket( bluetooth.RFCOMM ) sock.connect((bd_addr, port)) r = sr.Recognizer() r.pause_threshold = 0.6 r.energy_threshold = 400 MESSAGE = "continue" print("Ready to accept command...\n") while (MESSAGE != "stop listening"): while (MESSAGE == "continue"): try: # use the default microphone as the audio source with sr.Microphone() as source: # listen for the first phrase and extract it into audio data audio = r.listen(source,timeout = None) # recognize speech using Google Speech Recognition print("Me: " + r.recognize(audio)) MESSAGE = str(r.recognize(audio)) except LookupError: # speech is unintelligible MESSAGE = "continue" print("Could not understand audio") if(MESSAGE == "sit down"): sock.send("i") elif(MESSAGE == "stand up"): sock.send("u") elif(MESSAGE == "stop listening"): break; MESSAGE = "continue" sock.close() print("\nProgram terminated.")
Bluetooth ip adresinizi bd_addr = “00:14:01:23:21:78” satırına yazınız.Bluetooth ip adresini aşağıdaki ekrandaki gibi öğrenebilirsiniz.
Robotumuzun Kontrolü:
Robotumuzun bağlantılarını yapalım ve çalıştıralım.
Bilgisayarınızın bluetooth’unu açın.Mikrofonun çalıştığından emin olun.
BitVoicer veya Python programından istediğinizle tanımladığınız ses komutlarını söyleyerek robotunuzu kontrol edebilirsiniz.
Kendi Robotunu Yap projelerimizin bu bu bölümünde de sesli kontrol edilen dört bacaklı robotumuzu tamamladık.
Merhaba,Sesli Kontrol Edilen Dört Bacaklı Robot Projesini bitirme projesi olarak yapmak istiyorum ama malzemeleri bulamıyorum yardımcı olabilirmisiniz ?
Merhaba, Sesli Kontrol Edilen Dört Bacaklı Robot Projesini bitirme projesi olarak yapmak istiyorum ama malzemeleri bulamıyorum yardımcı olabilirmisiniz?
bu robotun kitini nereden alabilirim bana link atar mısınız yardımcı olursanız sevinirim
kardesşim merhaba robotun plastık aksamının 3d prınter stl formatındakı dosyaları elınde varsa lınk verebılırmısın
Merhaba,malzemeler şuan güncel olarak temin edebileceğim bir yer var mı üstteki yorumlarda yazan siteden bulamadım acaba bitirme tezi için çok acil lazım yardımcı olur musunuz?
merabalar öncelikle calişmalar icin tesekurler yanliş anlamıyında bu kadar seyi okulda öğrenmediniz bence 🙂
önerebildiğiniz robotlarla ilgili sıfırdan anlatım kodlarla dahil bir kitap var mı tam olarak yapmak istediğim sey zihin gücüyle yuruyen robot yapmak ..
merhaba Remzi, öncelikle öğrenmeye istekli isen herşeyi öğrenebilirsin. İlgin olması yeterli. Robotik uygulamaları hiçbir kitap kullanmadan öğrendim. Sadece internette doğru araştırma yapmasını bilmen yeterli. İstemediğin kadar kaynak mevcut. Düşünce gücüyle robot yönetmek için NeuroSky Mindwave Mobile Beyin Dalga Sensörünü kullanabilirsin.
Çok sağolun sitenizi takipte kalıcam
1-) Peki bu dagi spider kartı nerden temin edebilirim.
İnternette bulamadım?
2-) Bu kartı daha önce hiç kullanmadım yazılımı hangi program diliyle yazı cam?
3-) Anladığım kadarıyla 8 adet servi motor var.Bu servo motorların voltaj ve rpm hakkında bilgi verir misiniz?
4-) Robotta olan aynı şaseyi verilen eklem yerleri için kullanılan parçaları nerden temin edebilirim?
5-) Bu kartı kullandığım zaman herhangi bir motor sürücü devresini ihitiyacım var mı?
6-) Tekerler için nasıl birşey kullanılmalı sizce?
7-) Bu led aydınlatmayı yaparken gereken voltajı nerden alıyoruz
1-) Spider kartı robitshop.com/Spider-Servo-Kontrol-Karti-Spider-Controller,PR-2784.html bura var.
2-)Atmega128 tabanlı bir kart arduino programından karta yazılımı yukluyorsunuz.
3-)Servo motorlar 9gr ağırlığında 1.3 maksimum torklu servolardır.5 veya 6v gerekir.
4-)robitshop.com/6-Bacakli-Robot-Kiti-Hexapod-Chassis-Kit,PR-2486.html burada kit var servolarda dahildir.
5-)hayır.kart zaten servo motor kontrol tabanlı.direk motorların pin bağlantılarını yapıyorsunuz.
6-)tekerlekler de kitte var
7-)kartın üzerindeki pinlerden alıyoyorsunuz.Yazılımda ledlerin pinleri yazılıdır.
Bu uygulamayı ardunio ile nasıl yapabilirim.Bunun için ardunio uno uygun mudur.Ve ardunio nun yanında hangi bileşenleri kullanmam gerekli.Yardımcı olurmusunuz
Bu projede Dagu Spider Kontrol Kartı kullanınız.Bu kart atmega tabanlı ve üzerinde hazır servo giriş pinleri var.Programı bu karta yüklüyorsunuz.Devre kurmaya gerek kalmıyor.Ama arduino ile yapacaksanız da mega kullanın.Ayrıca servoları sağlıklı hareket ettirmek için de ya kendiniz devre yapacaksınız ya da servo kontrol kartı alacaksınız.Servoların akımına göre de lipo pil kullanın.Başka birşeye gerek yok.Kontrolü phyton ile komut tanımlayarak gerçekleştireceksiniz.
Merhaba,
Bir projenin belirli bir kısmı için yardıma ihtiyacım var. Bu gerekli modul ise şöyle. karsisinda yaninda altinda veya tepesinde duran insanın bir yetişkinmi bir gencmi bir çocukmu olduğunu nasıl anlayabiliriz. Bunu yapabilecek bir yöntem mevcut mu? Alt yapıda herhangi bir microcontroler veya proccesor olabilir .
Şimdiden teşekkürler.
Merhaba,
Sizin robotunuz sadece insan yüzüne göre arar verecekse görüntü işleme ile yapabilirsiniz.Eğer tüm vucuda göre algılanacaksa birkaç kriter kullanarak algoritma oluşturabilirsiniz.Örneğin boyu veya yapısal olarak hacmine göre kriterler belirleyip ona göre karar verdirebilirsiniz.Fakat bu yöntemler %100 doğru karar vermeyebilirler.Bu yöntemle yapacaksanız kızılötesi sensör kullanabilirsiniz.Ayrıca karşıdakinin insan olup olmadığını da görüntü işleme ve hareket sensörü ile kontrol edilmelidir.Bu sistemleri arduino ile rahatlıkla yapabilirsiniz.