Ders 28/31: Araba-6 SunFounder kendi kendine giden Arduino arabası | Robojax kullanarak
Bu projede, bir Arduino, bir ultrasonik sensör ve iki kızılötesi sensör kullanarak temel bir sürücüsüz araba inşa edeceğiz. Bu, otonom navigasyon, sensör füzyonu ve karar verme mantığı hakkında bilgi edinmek için harika bir başlangıç projesidir. Araba, engellerden kaçınmak için ileri, geri hareket edebilir ve dönüşler yapabilir, böylece kendi başına net bir yol bulabilir. Bu proje, SunFounder 3'ü 1 arada Arduino kitine dayanmaktadır ve Robojax'ın Arduino kursunun bir parçasıdır.
Bu proje sadece bir oyuncak yapmakla ilgili değildir; otonom robotiğin arkasındaki temel kavramlara pratik bir giriş niteliğindedir. Aynı mantık ve sensörler, robotik süpürgeler, depolardaki otomatik yönlendirmeli araçlar ve hatta daha karmaşık robotların navigasyon sistemleri gibi gerçek dünya uygulamalarında kullanılır. Mesafe algılamayı basit navigasyon kurallarıyla nasıl birleştireceğinizi anlayarak, aşağıdakiler gibi çeşitli projeler oluşturabilirsiniz:
- Bir odada gezinebilen ve mobilyalardan kaçınabilen küçük bir robot yapmak.
- Basit bir yolu takip edebilen veya bir alanı devriye gezen otomatik bir araç oluşturmak.
- Daha büyük robotik projeler için temel engel kaçınma algoritmalarının nasıl uygulanacağını öğrenmek.
Donanım Bileşenleri
Bu proje, SunFounder 3'ü 1 arada kitindeki bileşenleri kullanır. Temel parçalar şunlardır:
- Arduino Uno kartı
- Motorlu SunFounder 2WD veya 3'ü 1 arada araba şasisi
- Motor sürücü modülü (ör. L298N veya benzeri)
- HC-SR04 Ultrasonik mesafe sensörü
- İki kızılötesi engel sensörü
- Jumper kablolar ve motorlar için bir güç kaynağı
Bağlantı Kılavuzu
Bağlantı, sürücüsüz arabanızı hayata geçirmek için kritik ilk adımdır. Bağlantılar basittir, ancak bileşenlerinize zarar vermemek için her birini iki kez kontrol etmek önemlidir. Bağlantının arkasındaki mantık, Arduino'nun kontrol pinlerini motor sürücüsüne ve sensörlere bağlayarak Arduino'nun veri okumasını ve komut göndermesini sağlamaktır.
- Motor Sürücü Pinleri (A-1B, A-1A, B-1B, B-1A): Bu pinler iki motorun hızını ve yönünü kontrol eder. PWM destekli olan Arduino pinleri 5, 6, 9 ve 10'a bağlanır ve değişken hız kontrolü sağlar.
- Ultrasonik Sensör (Trig ve Echo): Trig pini bir ultrasonik darbe gönderir ve Echo pini yansıyan sinyali alır. Trig pini Arduino pin 3'e, Echo pini ise Arduino pin 4'e bağlanır.
- Kızılötesi Sensörler (Sol ve Sağ): Bu sensörler, önlerinde doğrudan bir engel olup olmadığını algılar. Sol kızılötesi sensör Arduino pin 8'e, sağ kızılötesi sensör ise pin 7'ye bağlanır. Arabanın yanlarındaki boşluğu kontrol etmek için kullanılırlar.
Ayrıntılı bir görsel kılavuz için lütfen her bağlantıyı net bir şekilde gösteren aşağıdaki bağlantı şemasına bakın.
Kod Açıklaması
Kod, Arduino programlama dilinde (C++) yazılmıştır. Tam program, video açıklamasında bağlantısı verilen kaynak sayfasından indirilebilir. Bu taslağın kullanıcı tarafından yapılandırılabilir kilit kısımlarını inceleyelim.
Pin Tanımları
Kodun başında, Arduino'yu çeşitli bileşenlere bağlayan pinleri tanımlarsınız. Kartınızda farklı pinler kullanıyorsanız bunları değiştirebilirsiniz.
const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;
const int echoPin = 4;
const int trigPin = 3;
const int rightIR = 7;
const int leftIR = 8;
A_1B, A_1A, B_1B ve B_1A pinleri H-köprü motor sürücüsünü kontrol eder. Bu pinleri farklı kombinasyonlarda YÜKSEK veya DÜŞÜK ayarlayarak her motorun yönünü kontrol edebilirsiniz. echoPin ve trigPin ultrasonik sensör içindir ve rightIR ile leftIR kızılötesi sensörler içindir.
Davranış Değişkenleri ve Mantık
Sürücüsüz davranışın temel mantığı loop() fonksiyonundadır. Araba, kızılötesi sensörlerden ve ultrasonik sensörden gelen okumalara dayanarak kararlar alır. Kod, farklı eylemleri tetikleyen belirli mesafeleri tanımlar. Örneğin, distance değişkeni santimetre cinsinden ölçülür. Mantık şu şekildedir:
- Mesafe 50 cm'den büyükse: Öndeki yol açıktır, bu nedenle araba 200 hızında ileri hareket eder.
- Mesafe 2 cm ile 10 cm arasındaysa: Araba bir engele çok yakındır. Bir saniye geri gider, ardından yeni bir yol bulmak için yarım saniye geri sola döner.
- Mesafe 10 cm ile 50 cm arasındaysa: Araba bir "dikkat bölgesinde"dir. İleri hareket eder, ancak daha yavaş bir hız olan 150 ile.
Bu eşik değerleri (50 cm, 10 cm ve 2 cm) ve hızlar (200 ve 150), arabanızın davranışını değiştirmek için ayarlayabileceğiniz birincil değişkenlerdir. Örneğin, arabanız hızlı hareket ediyorsa "güvenli" mesafeyi 60 cm'ye çıkarabilirsiniz.
Özel Fonksiyonlar
Kod, arabanın hareketlerini kontrol etmek için birkaç özel fonksiyon içerir. Bunlar, ana döngü boyunca kodu daha temiz ve anlaşılması daha kolay hale getirmek için kullanılır.
moveForward(int speed): Bu fonksiyon, motor pinlerini aracı ileri sürmek için ayarlar.speedparametresi (0-255) motorların ne kadar hızlı döneceğini kontrol eder.moveBackward(int speed):moveForwardfonksiyonuna benzer, ancak aracı geri hareket ettirmek için motor yönünü tersine çevirir.backLeft(int speed)vebackRight(int speed): Bu fonksiyonlar, bir motoru ters yönde çalıştırıp diğerini durdurarak aracı döndürür. Bu, aracın yönünü etkili bir şekilde değiştirmesine yardımcı olan bir pivot dönüşüdür.stopMove(): Bu fonksiyon, tüm kontrol pinlerini DÜŞÜK (LOW) ayarlayarak tüm motorları durdurur.readSensorData(): Bu fonksiyon, ultrasonik sensörden bir darbe gönderir ve yankının geri dönmesi için geçen süreyi ölçer. Ardından mesafeyi santimetre cinsinden hesaplar ve değeri döndürür.
Canlı Proje Gösterimi
(videoda 07:09'da) Gösterimde, araç kutular ve duvarlar gibi çeşitli engellerin bulunduğu bir ortama yerleştirilmiştir. Araç ilerlerken mantığı görünür. Ultrasonik sensör 50 cm'den daha uzakta bir duvar veya engel algıladığında, kendinden emin bir şekilde ileri sürer. Yaklaştıkça, yanlardaki IR sensörleri açık alan olup olmadığını kontrol eder.
Solda bir engel algılanırsa, araç ondan kaçınmak için sağa geri dönüş yapar ve bunun tersi de geçerlidir. Araç kendini dar bir alanda bulduğunda, örneğin bir masanın altında (videoda 07:49'da), kendini kurtarmak ve açık bir yol bulmak için geri ve dönüş fonksiyonlarını kullanır. Araç sürekli olarak çevresini okur ve kararlar alır; bu, önceden planlanmış bir yola dayanmayan reaktif bir kontrol sistemi sergiler.
Video Bölümleri
- [00:00] Kendi Kendine Giden Araç Projesine Giriş
- [00:28] SunFounder 3'ü 1 Arada Kiti Hakkında
- [01:32] Kodun Açılması ve Genel Bakış
- [02:02] Kod Yapısı ve Yeni Fonksiyonların Açıklaması
- [03:11] Kurulum Fonksiyonunda Pinlerin Ayarlanması
- [03:28] Döngüdeki Ana Karar Verme Mantığı
- [05:41] Canlı Gösterim: Araç Hareket Halinde
- [07:09] Engeller ve Duvar Takibi ile Gösterim
- [09:58] Sonuç ve Son Düşünceler
/*
Lesson 28/31: Car-6 SunFounder self Driving Arduino car
Get this code and watch video Download and resource page https://robojax.com/RJT611
https://www.youtube.com/watch?v=IyninXUcsn0
*/
const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;
const int echoPin = 4;
const int trigPin = 3;
const int rightIR = 7;
const int leftIR = 8;
float readSensorData() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
float distance = pulseIn(echoPin, HIGH) / 58.00; //Equivalent to (340m/s*1us)/2
return distance;
}
void moveForward(int speed) {
analogWrite(A_1B, 0);
analogWrite(A_1A, speed);
analogWrite(B_1B, speed);
analogWrite(B_1A, 0);
}
void moveBackward(int speed) {
analogWrite(A_1B, speed);
analogWrite(A_1A, 0);
analogWrite(B_1B, 0);
analogWrite(B_1A, speed);
}
void backLeft(int speed) {
analogWrite(A_1B, speed);
analogWrite(A_1A, 0);
analogWrite(B_1B, 0);
analogWrite(B_1A, 0);
}
void backRight(int speed) {
analogWrite(A_1B, 0);
analogWrite(A_1A, 0);
analogWrite(B_1B, 0);
analogWrite(B_1A, speed);
}
void stopMove() {
analogWrite(A_1B, 0);
analogWrite(A_1A, 0);
analogWrite(B_1B, 0);
analogWrite(B_1A, 0);
}
void setup() {
Serial.begin(9600);
//motor
pinMode(A_1B, OUTPUT);
pinMode(A_1A, OUTPUT);
pinMode(B_1B, OUTPUT);
pinMode(B_1A, OUTPUT);
//ultrasonic
pinMode(echoPin, INPUT);
pinMode(trigPin, OUTPUT);
//IR obstacle
pinMode(leftIR, INPUT);
pinMode(rightIR, INPUT);
}
void loop() {
int left = digitalRead(leftIR); // 0: Obstructed 1: Empty
int right = digitalRead(rightIR);
if (!left && right) {
backLeft(150);
} else if (left && !right) {
backRight(150);
} else if (!left && !right) {
moveBackward(150);
} else {
float distance = readSensorData();
Serial.println(distance);
if (distance > 50) { // Safe
moveForward(200);
} else if (distance < 10 && distance > 2) { // Attention
moveBackward(200);
delay(1000);
backLeft(150);
delay(500);
} else {
moveForward(150);
}
}
}
Common Course Links
Common Course Files
İhtiyacın olabileceğini düşünüyor
-
AmazonSunFounder Arduino Learning Kit on AliExpresss.click.aliexpress.com
-
Amazon
-
Amazon
-
Amazon
-
Amazon
Kaynaklar ve referanslar
-
BelgelendirmeDocumentation for SunFounder 3 in 1 IoT/Smart Car/Learning Kitdocs.sunfounder.com
-
DışPurchase SunFounder's 3-in-1 Smart car learning kitsunfounder.com
Dosyalar📁
Arduino Kütüphaneleri (zip)
-
SunFounder's 3-in-1 Smart Car learning kit source code
3in1-kit-main-v2.zip12.80 MB