- LM393 Hız Sensörü Modülü (H206)
- H206 Sensör Montaj Düzeni
- DIY Arduino LM393 Hız Sensörü Robot Devre Şeması
- LM393 hız sensörü modülüyle Hız Ölçmenin arkasındaki mantık
- Tekerleğin kat ettiği mesafeyi ölçmenin arkasındaki mantık
- Botun açısını ölçmenin arkasındaki mantık
- Arduino Robot Kodu
- Arduino Robotunun Mesafe, Hız ve Açı ölçümü için test edilmesi
Robotlar, hayatımızı kolaylaştırmak için yavaş yavaş toplumumuza girmeye başladı. Starship'ten altı tekerlekli gıda dağıtım robotlarını İngiltere yollarında bulabiliriz, hedefine ulaşmak için siviller arasında akıllıca geziniyorlar. Ortama giren her mobil robot, gerçek dünyaya göre konumunun ve yönünün daima farkında olmalıdır. GPS, RF Üçgenleme, İvmeölçerler, Jiroskoplar vb. Gibi farklı teknolojileri kullanarak bunu başarmanın birçok yolu vardır. Her tekniğin kendi avantajı vardır ve kendi başına benzersizdir. Bu Arduino LM393 hız sensörü eğitiminde basit ve kolay erişilebilir LM393 hız sensörü modülünü kullanacağızArduino kullanarak Robotun Hız, Katedilen Mesafe ve Açı gibi bazı hayati parametreleri ölçmek için. Bu parametrelerle robot, gerçek dünya durumunu öğrenebilecek ve onu güvenli bir şekilde gezinmek için kullanabilecektir.
Arduino, basit bir çizgi takipçisinden daha karmaşık bir kendi kendini dengeleyen veya zemin temizleme robotuna kadar robot yapmak için hobiler arasında en popüler seçimdir. Robotik bölümünden her tür robotu inceleyebilirsiniz.
Lityum pille çalışan küçük bir robot yapacağız ve onu bir joystick kullanarak sürdüreceğiz. Çalışma süresi boyunca robotun hızını, mesafesini ve açısını ölçebilir ve gerçek zamanlı olarak Arduino'ya bağlı LCD ekranda görüntüleyebiliriz. Bu proje sadece bu parametreleri ölçmenize yardımcı olur, bunu yaptıktan sonra bu parametreleri botunuzu gerektiği gibi otonom olarak çalıştırmak için kullanabilirsiniz. İlginç değil mi? Öyleyse başlayalım.
LM393 Hız Sensörü Modülü (H206)
Devre şemasına ve proje koduna girmeden önce, projede hayati bir rol oynadığı için LM393 Hız sensörü Modülünü anlayalım. H206 Speed sensör modülü Kızılötesi Işık oluşur sensörü dolayısıyla LM393 Gerilim karşılaştırıcı IC adı LM393 Hız sensörü ile entegre. Modül ayrıca motorun dönen şaftına monte edilmesi gereken bir ızgara plakasından oluşur. Tüm bileşenler aşağıdaki resimde etiketlenmiştir.
Kızılötesi Işık sensörü bir IR LED ve küçük gab ile ayrılmış bir foto-transistörü oluşur. Tüm sensör düzenlemesi, yukarıda gösterildiği gibi siyah bir muhafaza içine yerleştirilmiştir. Izgara plakası yuvalardan oluşur; plaka, Kızılötesi Işık Sensörünün boşluğu arasında, sensörün ızgara plakasındaki boşlukları algılayabileceği şekilde düzenlenmiştir. Izgara plakasındaki her boşluk, boşluktan geçerken IR sensörünü tetikler; bu tetikleyiciler daha sonra karşılaştırıcı kullanılarak voltaj sinyallerine dönüştürülür. Karşılaştırıcı, ON yarı iletkenlerinden bir LM393 IC'den başka bir şey değildir. Modülün, ikisi modüle güç sağlamak için kullanılan ve bir çıkış pini tetiklerin sayısını saymak için kullanılan üç pime sahiptir.
H206 Sensör Montaj Düzeni
Bu tür sensörleri monte etmek biraz zordur. Sadece şaftı her iki tarafında çıkıntı yapan motorlara monte edilebilir. Şaftın bir tarafı tekerleğe bağlanırken diğer tarafı yukarıda gösterildiği gibi ızgara plakasını monte etmek için kullanılır.
Tekerlek ve plaka aynı şafta bağlı olduğundan her ikisi de aynı hızda dönmekte ve böylece plakanın hızını ölçerek tekerleğin hızını ölçebiliyoruz. Izgara plakasındaki boşlukların kızılötesi sensörden geçtiğinden emin olun, ancak bu durumda sensör geçen boşlukların sayısını sayabilir. Ayrıca, belirtilen koşulu karşıladığı sürece sensörü monte etmek için kendi mekanik düzenlemenizi de bulabilirsiniz. IR sensörü genellikle birçok Robotik projesinde robota engeller hakkında rehberlik etmek için kullanılır.
Yukarıda gösterilen ızgara plakası 20 yuvaya (ızgaralar) sahiptir. Bu, sensörün tekerleğin bir tam dönüşü için 20 boşluk bulacağı anlamına gelir. Sensörün algıladığı boşlukların sayısını sayarak, benzer şekilde sensörün boşlukları ne kadar hızlı bulduğunu ölçerek tekerleğin hızını tespit edebildiğimizi ölçerek, tekerleğin kat ettiği mesafeyi hesaplayabiliriz. Robotumuzda bu sensörü her iki tekerleğe de monte edeceğiz ve böylece robotun açısını da bulabiliriz. Bununla birlikte, İvmeölçer veya Jiroskop kullanılarak dönüş açısı daha hassas bir şekilde hesaplanabilir, buradan İvmeölçer ve jiroskopu Arduino ile arayüzlemeyi öğrenin ve bunları kullanarak dönme açısını ölçmeyi deneyin.
DIY Arduino LM393 Hız Sensörü Robot Devre Şeması
Bu Hız ve mesafe algılama robotunun tam devre şeması aşağıda gösterilmiştir. Bot, beyni olarak Arduino Nano'dan oluşur, tekerlekler için iki DC motor L298N H-Bridge Motor Sürücü modülü tarafından tahrik edilir. Joystick botun hızını ve yönünü kontrol etmek için kullanılır ve iki hız sensörü H206 botun hızını, mesafesini ve açısını ölçmek için kullanılır. Ölçülen değerler daha sonra 16x2 LCD modülünde görüntülenir. LCD'ye bağlanan potansiyometre, LCD'nin kontrastını ayarlamak için kullanılabilir ve direnç, LCD'nin arka ışığına akan akımı sınırlamak için kullanılır.
Komple devre bir 7.4V lityum hücre tarafından desteklenmektedir. Bu 7,4V, Motor sürücü modülünün 12V pinine verilir. Motor sürücü modülündeki voltaj regülatörü daha sonra 7.4V'u Arduino, LCD, Sensörler ve Joystick'e güç sağlamak için kullanılan düzenlenmiş + 5V'a dönüştürür.
Motor, Arduino'nun 8,9,10 ve 11 dijital pinleri tarafından kontrol edilir. Motorun hızının da kontrol edilmesi gerektiğinden, motorun pozitif terminaline PWM sinyalleri sağlamalıyız. Dolayısıyla, her ikisi de PWM özellikli pin olan 9 ve 10 numaralı pinlerimiz var. Joystick'ten X ve Y değerleri sırasıyla A2 ve A3 Analog pinleri kullanılarak okunur.
Bildiğimiz gibi H206 sensörü, ızgara plakasındaki boşluk algılandığında bir tetikleyici oluşturur. Doğru hız ve mesafeyi hesaplamak için bu tetikleyicilerin her zaman doğru okunmaması gerektiğinden, her iki tetik (çıkış) pini de Arduino Kartının Harici kesinti pimi 2 ve 3'e bağlanır. Tüm devreyi bir şasi üzerine monte edin ve hız sensörünü açıklandığı gibi monte edin, bağlantılar tamamlandıktan sonra botum aşağıdaki gibi görünüyordu. Sensörün nasıl monte edildiğini öğrenmek için bu sayfanın sonundaki videoyu da izleyebilirsiniz.
Artık donanım bölümü tamamlandığına göre botun hızını, mesafesini ve tekini nasıl ölçeceğimizin mantığına geçelim ve ardından programlama bölümüne geçelim.
LM393 hız sensörü modülüyle Hız Ölçmenin arkasındaki mantık
Sensör montaj kurulumundan, LM393 hız sensörü modülünün (H206) yalnızca ızgara plakasında bulunan boşlukları ölçtüğünü bilmelisiniz. Montaj yapılırken hızı ölçülmesi gereken tekerleğin ve ızgara plakasının aynı hızda dönmesine dikkat edilmelidir. Burada olduğu gibi, hem tekerleği hem de plakayı aynı şaft üzerine monte ettiğimiz için, açıkçası ikisi de aynı hızla dönecekler.
Kurulumumuzda, botun açısını ölçmek için her bir tekerlek için iki sensör monte ettik. Ancak amacınız yalnızca hız ve mesafeyi ölçmekse, sensörü herhangi bir tekerleğe monte edebiliriz. Sensörün çıkışı (tetikleme sinyalleri) en yaygın olarak bir mikro denetleyicinin harici bir kesme pinine bağlanacaktır. Izgara plakasındaki boşluk her tespit edildiğinde bir kesinti tetiklenecek ve ISR'deki (Interrupt service Routine) kod çalıştırılacaktır. Bu tür iki tetikleyici arasındaki zaman aralığını hesaplayabilirsek, tekerleğin hızını hesaplayabiliriz.
Arduino'da bu zaman aralığını millis () fonksiyonunu kullanarak kolayca hesaplayabiliriz. Bu milis fonksiyonu, cihaz çalıştırıldığı andan itibaren her milisaniye için 1 artmaya devam edecektir. Böylece, ilk kesinti gerçekleştiğinde, milis () değerini kukla bir değişkene (bu koddaki pevtime gibi) kaydedebiliriz ve ardından ikinci kesinti gerçekleştiğinde, milis () 'den pevtime değerini çıkararak geçen zamanı hesaplayabiliriz..
Alınan zaman = şimdiki zaman - önceki zaman çizelgesi = milis () - pevtime ; // timetaken içinde milisaniye
Geçen zamanı hesapladıktan sonra, aşağıdaki formülleri kullanarak rpm değerini basitçe hesaplayabiliriz, burada (1000 / zaman) RPS'yi (Saniyedeki devir sayısı) verir ve RPS'yi RPM'ye dönüştürmek için 60 ile çarpılır (Dakika başına devir).
rpm = (1000 / zamanlanmış) * 60;
Devri hesapladıktan sonra, tekerleğin yarıçapını bildiğimiz takdirde aşağıdaki formülleri kullanarak aracın hızını hesaplayabiliriz.
Hız = 2π × RPS × tekerleğin yarıçapı. v = yarıçap_çarkı * rpm * 0.104
Yukarıdaki formül, m / s cinsinden hızı hesaplamak içindir, km / saat cinsinden hesaplamak istiyorsanız, 0,0104'ü 0,366 ile değiştirin. 0.104 değerinin nasıl elde edildiğini merak ediyorsanız, V = 2π × RPS × tekerlek yarıçapı formülünü basitleştirmeyi deneyin.
Dönen bir nesnenin hızını ölçmek için bir salon sensörü kullanılsa bile aynı teknik kullanılır. Ancak H206 sensörü için bir yakalama vardır, ızgara plakasında 20 yuva vardır ve bu nedenle iki yuva aralığı arasındaki süreyi ölçmek için mikro denetleyiciye aşırı yük binecektir. Bu nedenle hızı yalnızca tekerleğin tam dönüşünde ölçüyoruz. Her boşluk için (biri başlangıçta ve diğeri boşluğun sonunda) iki kesinti üretileceğinden , tekerleğin bir tam dönüş yapması için toplam 40 kesinti alacağız. Tekerleğin hızını gerçekten hesaplamadan önce 40 kesinti bekliyoruz. Aynı kod aşağıda gösterilmiştir
eğer (rotasyon> = 40) { timaken = milis () - pevtime; // zaman milisaniye cinsinden alınır rpm = (1000 / süre) * 60; // rpm'yi hesaplamak için formüller pevtime = millis (); rotasyon = 0; }
Bu yöntemin bir başka dezavantajı, hızın sıfıra düşmemesidir çünkü kesinti, rpm değerini hesaplamak için çarkın her zaman bir dönüşü tamamlamasını bekleyecektir. Bu dezavantaj, iki kesinti arasındaki zaman aralığını izleyen basit bir kod ekleyerek kolayca aşılabilir ve normalden fazla olursa, rpm değerini ve hızı sıfıra zorlayabiliriz. Aşağıdaki koddaki bağlantı, zamandaki farkı kontrol etmek için değişken dtime kullandık ve 500 milisaniyeyi aşarsa hız ve rpm değeri sıfır olmaya zorlanır.
/ * Araç durursa sıfıra düşmek için * / if (millis () - dtime> 500) // 500ms için hiçbir kesinti bulunamadı { rpm = v = 0; // rpm ve hızı sıfır dtime = milis () yapın; }
Tekerleğin kat ettiği mesafeyi ölçmenin arkasındaki mantık
Arduino'nun tekerlek bir tam dönüş yaptığında 40 kesinti algılayacağını zaten biliyoruz. Böylece, tekerleğin yaptığı her bir dönüş için, tekerleğin kat ettiği mesafenin tekerleğin çevresine eşit olduğu açıktır. Tekerleğin yarıçapını zaten bildiğimiz için, aşağıdaki formülü kullanarak kapsanan mesafeyi kolayca hesaplayabiliriz
Mesafe = 2πr * dönüş sayısı mesafe = (2 * 3.141 * radius_of_wheel) * (left_intr / 40)
Tekerleğin çevresi 2πr formülü kullanılarak hesaplandığında ve daha sonra tekerleğin yaptığı dönüş sayısı ile çarpılır.
Botun açısını ölçmenin arkasındaki mantık
Robotun meleğini belirlemenin birçok yolu vardır. İvmeölçerler ve Jiroskoplar normalde bu değerleri belirlemek için kullanılır. Ancak başka bir ucuz yaklaşım, H206 sensörünü her iki tekerlekte de kullanmaktır. Bu şekilde her bir tekerleğin kaç dönüş yaptığını bileceğiz. Aşağıdaki şekil açının nasıl hesaplandığını göstermektedir.
Robot başlatıldığında baktığı açı 0 ° olarak kabul edilir. Oradan sola döner açı negatif olarak artar ve sağa dönerse melek pozitif olarak artar. Anlamak için, şekilde gösterildiği gibi -90 ila +90 aralığını ele alalım. Böyle bir düzenlemede, her iki tekerlek de aynı çapta olduğu için, eğer tekerleklerden herhangi biri, botu tam bir dönüş yaparsa, 90 ° 'lik bir açıyla döndürüyoruz.
Örneğin, Sol tekerlek bir tam dönüş yaparsa (80 kesinti), o zaman bot 90 ° sola dönecek ve benzer şekilde Sağ tekerlek bir tam dönüş (80 kesinti) yaparsa bot -90 ° sağa doğru dönecektir. Artık Arduino bir tekerlekte 80 kesinti tespit ederse, botun 90 ° döndüğünü ve hangi tekerleğe bağlı olarak botun pozitif (sağ) veya negatif (sol) döndüğünü anlayabileceğimizi biliyoruz. Böylece sol ve sağ açı aşağıdaki formüller kullanılarak hesaplanabilir
int angle_left = (left_intr% 360) * (90/80); int angle_right = (right_intr% 360) * (90/80);
90, 80'lik bir kesinti yaparken kapsanan açıdır. Ortaya çıkan değer çarpılır sayı kesilir. Ayrıca, elde edilen değer 36'yı asla geçmeyecek şekilde 360'lık bir modül kullandık. Hem sol hem de sağ açıyı hesapladıktan sonra, botun baktığı etkin açı, sağ açıdan sol açının çıkarılmasıyla kolayca elde edilebilir.
açı = açı_sağı - açı_sola;
Arduino Robot Kodu
Bu hız ve açı ölçüm robotu için eksiksiz Arduino kodu bu sayfanın sonunda bulunabilir. Programın amacı, yukarıdaki mantıklarla botun hızını, mesafesini ve açısını hesaplamak ve LCD ekranda görüntülemektir. Bunun dışında , Joystick'i kullanarak botu kontrol etme seçeneği sunmalıdır .
Programa iki motor için Dijital I / O pinlerini tanımlayarak başlıyoruz. Ayrıca motorun hızını kontrol etmemiz gerektiğini ve bu nedenle motorları kontrol etmek için Arduino'daki PWM pinlerini kullanmamız gerektiğini unutmayın. Burada 8, 9, 10 ve 11 numaralı pimleri kullandık.
#define LM_pos 9 // sol motor #define LM_neg 8 // sol motor #define RM_pos 10 // sağ motor #define RM_neg 11 // sağ motor #define joyX A2 #define joyY A3
Hız ve kapsanan mesafeyi ölçmek için , tekerleğin yarıçapını bilmemiz, değeri ölçmemiz ve aşağıda gösterildiği gibi metre cinsinden girmemiz gerekir. Benim botum için yarıçap 0.033 metreydi ancak botunuza bağlı olarak sizin için farklılık gösterebilir.
float radius_of_wheel = 0.033; // Tekerleğinizin yarıçapını ölçün ve buraya cm cinsinden girin
İçinde kurulum fonksiyonu, biz sıfır ve sonra LCD ekranda bir giriş Metin görüntülemek için tüm değer başlatmak. Ayrıca seri monitörü hata ayıklama amacıyla başlattık. Daha sonra H206 hız sensörlerinin harici kesmeler olarak pin 2 ve 3'e bağlandığından bahsetmiştik. Burada kesinti tespit edildiğinde, Left_ISR ve Right_ISR ISR işlevi buna göre çalıştırılacaktır.
geçersiz kurulum () { rotasyon = rpm = pevtime = 0; // Tüm değişkeni sıfıra başlat Serial.begin (9600); lcd.begin (16, 2); // 16 * 2 LCD lcd.print'i başlatın ("Bot Monitor"); // Giriş Mesajı 1. satır lcd.setCursor (0, 1); lcd.print ("- CircuitDigest"); // Giriş Mesajı 2. satır gecikmesi (2000); lcd.clear (); lcd.print ("Lt: Rt:"); lcd.setCursor (0, 1); lcd.print ("S: D: A:"); pinMode (LM_pos, OUTPUT); pinMode (LM_neg, OUTPUT); pinMode (RM_pos, OUTPUT); pinMode (RM_neg, OUTPUT); digitalWrite (LM_neg, LOW); digitalWrite (RM_neg, LOW); attachInterrupt (digitalPinToInterrupt (2), Left_ISR, CHANGE); // Sol tekerlek sensörü tetiklendiğinde Left_ISR çağrılır attachInterrupt (digitalPinToInterrupt (3), Right_ISR, CHANGE); // Sağ tekerlek sensörü tetiklendiğinde Right_ISR çağrılır }
Left_ISR rutini içinde, daha sonra botun açısını ölçmek için kullanılacak olan left_intr adlı bir değişkeni artırıyoruz. Right_ISR'nin içinde de aynı şeyi yapıyoruz ama ek olarak burada hızı da hesaplıyoruz. Değişken dönüş, her kesinti için artırılır ve ardından hızı hesaplamak için yukarıdaki mantık kullanılır.
void Left_ISR () { left_intr ++; gecikme (10); } void Right_ISR () { right_intr ++; gecikme (10); rotasyon ++; dtime = milis (); eğer (rotasyon> = 40) {zaman geçirildi = milis () - pevtime; // zaman milisaniye cinsinden alınır rpm = (1000 / süre) * 60; // rpm'yi hesaplamak için formüller pevtime = millis (); rotasyon = 0; } }
Ana sonsuz döngü işlevinin içinde, X ve Y değerlerini joystick'ten izliyoruz. Joystick hareket ettirilirse değere bağlı olarak botu buna göre kontrol ederiz. Botun hızı, joystick'in ne kadar uzağa itildiğine bağlıdır.
int xValue = analogRead (joyX); int yValue = analogRead (joyY); int hızlandırma = eşleme (xValue, 500, 0, 0, 200); eğer ( xValue <500) { analogWrite (LM_pos, hızlanma); analogWrite (RM_pos, ivme); } else { analogWrite (LM_pos, 0); analogWrite (RM_pos, 0); } if ( yValue > 550) analogWrite (RM_pos, 80); eğer ( yValue <500) analogWrite (LM_pos, 100);
Bu, kullanıcının botu hareket ettirmesine ve elde edilen değerlerin beklendiği gibi olup olmadığını kontrol etmesine yardımcı olacaktır. Son olarak, yukarıdaki mantıkları kullanarak botun hızını, mesafesini ve açısını hesaplayabilir ve aşağıdaki kodu kullanarak LCD'de görüntüleyebiliriz.
v = yarıçap_çarkı * rpm * 0.104; //0.033, tekerleğin metre cinsinden yarıçapıdır = (2 * 3.141 * radius_of_wheel) * (left_intr / 40); int angle_left = (left_intr% 360) * (90/80); int angle_right = (right_intr% 360) * (90/80); açı = açı_sağı - açı_sola; lcd.setCursor (3, 0); lcd.print (""); lcd.setCursor (3, 0); lcd.print (left_intr); lcd.setCursor (11, 0); lcd.print (""); lcd.setCursor (11, 0); lcd.print (right_intr); lcd.setCursor (2, 1); lcd.print (""); lcd.setCursor (2, 1); lcd.print (v); lcd.setCursor (9, 1); lcd.print (""); lcd.setCursor (9, 1); lcd.print (mesafe); lcd.setCursor (13, 1); lcd.print (""); lcd.setCursor (13, 1); lcd.print (açı);
Arduino Robotunun Mesafe, Hız ve Açı ölçümü için test edilmesi
Donanımınız hazır olduğunda kodu Arduino'nuza yükleyin ve botunuzu hareket ettirmek için joystick'i kullanın. Botun hızı, kapladığı mesafe ve açı aşağıda gösterildiği gibi LCD'de görüntülenecektir.
LCD'de Lt ve Rt terimleri sırasıyla Sol Kesme Sayımı ve Sağ Kesme sayımını temsil eder. Bu değerlerin sensör tarafından algılanan her boşluk için arttığını görebilirsiniz. S teması botun Hızını m / sn cinsinden ve D terimi metre cinsinden katedilen Mesafeyi belirtir. Botun Açısı, 0 ° 'nin düz olduğu sonda görüntülenir ve saat yönünün tersine dönüş için negatif ve saat yönünde dönüş için pozitiftir.
Botun nasıl çalıştığını anlamak için bu sayfanın sonundaki videoyu da izleyebilirsiniz. Umarım projeyi anladınız ve inşa etmekten keyif aldınız. Herhangi bir endişeniz varsa, onları yorum bölümünde bırakın, en iyi şekilde yanıt vermeye çalışacağım. Hızlı teknik yardım için forumları da kullanabilirsiniz.