Lekcja 28/31: Samochód Car-6 Samochód Arduino SunFounder z napędem autonomicznym przy użyciu | Robojax
W tym projekcie zbudujemy podstawowy samochód autonomiczny wykorzystujący Arduino, czujnik ultradźwiękowy oraz dwa czujniki podczerwieni. To świetny projekt wprowadzający do nauki nawigacji autonomicznej, fuzji czujników i logiki podejmowania decyzji. Samochód może poruszać się do przodu, do tyłu oraz skręcać, aby omijać przeszkody, skutecznie znajdując wolną drogę. Projekt opiera się na zestawie SunFounder 3-in-1 Arduino i jest częścią kursu Arduino Robojaxa.
Ten projekt to nie tylko budowa zabawki; to praktyczne wprowadzenie do kluczowych koncepcji robotyki autonomicznej. Ta sama logika i czujniki są używane w rzeczywistych zastosowaniach, takich jak roboty odkurzające, automatycznie sterowane pojazdy w magazynach, a nawet systemy nawigacji bardziej złożonych robotów. Rozumiejąc, jak połączyć pomiar odległości z prostymi zasadami nawigacji, możesz tworzyć różnorodne projekty, takie jak:
- Budowa małego robota, który może poruszać się po pokoju i omijać meble.
- Tworzenie automatycznego pojazdu, który może podążać prostą ścieżką lub patrolować obszar.
- Nauka implementacji podstawowych algorytmów unikania przeszkód dla większych projektów robotycznych.
Komponenty sprzętowe
Ten projekt wykorzystuje komponenty z zestawu SunFounder 3-in-1. Niezbędne części to:
- Płytka Arduino Uno
- Podwozie samochodu SunFounder 2WD lub 3-in-1 z silnikami
- Moduł sterownika silników (np. L298N lub podobny)
- Czujnik odległości ultradźwiękowy HC-SR04
- Dwa czujniki przeszkód na podczerwień
- Przewody połączeniowe i źródło zasilania dla silników
Schemat połączeń
Podłączenie przewodów to kluczowy pierwszy krok do ożywienia Twojego samochodu autonomicznego. Połączenia są proste, ale niezwykle ważne jest dokładne sprawdzenie każdego z nich, aby uniknąć uszkodzenia komponentów. Logika połączeń polega na podłączeniu pinów sterujących Arduino do sterownika silników i czujników, co pozwala Arduino odczytywać dane i wysyłać polecenia.
- Piny sterownika silników (A-1B, A-1A, B-1B, B-1A): Te piny kontrolują prędkość i kierunek dwóch silników. Są podłączone do pinów Arduino 5, 6, 9 i 10, które obsługują PWM, co pozwala na zmienną kontrolę prędkości.
- Czujnik ultradźwiękowy (Trig i Echo): Pin Trig wysyła impuls ultradźwiękowy, a pin Echo odbiera odbity sygnał. Pin Trig jest podłączony do pinu Arduino 3, a pin Echo do pinu Arduino 4.
- Czujniki IR (lewy i prawy): Te czujniki wykrywają, czy przeszkoda znajduje się bezpośrednio przed nimi. Lewy czujnik IR jest podłączony do pinu Arduino 8, a prawy do pinu 7. Służą do sprawdzania przestrzeni po bokach samochodu.
Aby uzyskać szczegółowy przewodnik wizualny, zapoznaj się z poniższym schematem połączeń, który jasno przedstawia każde połączenie.
Wyjaśnienie kodu
Kod jest napisany w języku programowania Arduino (C++). Pełny program jest dostępny do pobrania ze strony z zasobami, do której link znajduje się w opisie wideo. Rozłóżmy na czynniki pierwsze kluczowe, konfigurowalne przez użytkownika części tego szkicu.
Definicje pinów
Na początku kodu definiujesz piny łączące Arduino z różnymi komponentami. Możesz je zmienić, jeśli używasz innych pinów na swojej płytce.
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;
Piny A_1B, A_1A, B_1B i B_1A sterują mostkiem H sterownika silników. Ustawiając te piny w stan HIGH lub LOW w różnych kombinacjach, możesz kontrolować kierunek każdego silnika. echoPin i trigPin służą do czujnika ultradźwiękowego, a rightIR i leftIR do czujników podczerwieni.
Zmienne zachowania i logika
Podstawowa logika zachowania autonomicznego znajduje się w funkcji loop(). Samochód podejmuje decyzje na podstawie odczytów z czujników IR i czujnika ultradźwiękowego. Kod definiuje określone odległości, które wyzwalają różne działania. Na przykład zmienna distance jest mierzona w centymetrach. Logika jest następująca:
- Jeśli odległość jest większa niż 50 cm: Droga przed pojazdem jest wolna, więc samochód jedzie do przodu z prędkością 200.
- Jeśli odległość wynosi od 2 cm do 10 cm: Samochód jest zbyt blisko przeszkody. Cofa się przez jedną sekundę, a następnie skręca w lewo do tyłu przez pół sekundy, aby znaleźć nową drogę.
- Jeśli odległość wynosi od 10 cm do 50 cm: Samochód znajduje się w „strefie ostrożności”. Jedzie do przodu, ale z mniejszą prędkością 150.
Te wartości progowe (50 cm, 10 cm i 2 cm) oraz prędkości (200 i 150) to główne zmienne, które możesz dostosować, aby zmienić zachowanie samochodu. Na przykład możesz zwiększyć „bezpieczną” odległość do 60 cm, jeśli Twój samochód porusza się szybko.
Funkcje niestandardowe
Kod zawiera kilka niestandardowych funkcji do sterowania ruchami samochodu. Są one używane w całej pętli głównej, aby kod był czystszy i łatwiejszy do zrozumienia.
moveForward(int speed): Ta funkcja ustawia piny silników, aby napędzać samochód do przodu. Parametrspeed(0-255) kontroluje, jak szybko obracają się silniki.moveBackward(int speed): Podobna domoveForward, ale odwraca kierunek silników, aby poruszać samochodem do tyłu.backLeft(int speed)ibackRight(int speed): Te funkcje skręcają samochodem, uruchamiając jeden silnik wstecz, podczas gdy drugi jest zatrzymany. Jest to skręt w miejscu, który pomaga samochodowi skutecznie zmieniać kierunek.stopMove(): Ta funkcja zatrzymuje wszystkie silniki, ustawiając wszystkie piny sterujące na LOW.readSensorData(): Ta funkcja wysyła impuls z czujnika ultradźwiękowego i mierzy czas powrotu echa. Następnie oblicza odległość w centymetrach i zwraca wartość.
Prezentacja na żywo projektu
(na wideo o 07:09) W demonstracji samochód jest umieszczony w środowisku z różnymi przeszkodami, takimi jak pudełka i ściany. Logika samochodu jest widoczna podczas nawigacji. Gdy czujnik ultradźwiękowy wykryje ścianę lub przeszkodę oddaloną o więcej niż 50 cm, samochód pewnie jedzie do przodu. Gdy zbliża się, czujniki IR po bokach sprawdzają wolną przestrzeń.
Jeśli przeszkoda zostanie wykryta po lewej stronie, samochód wykonuje skręt w prawo do tyłu, aby jej uniknąć, i odwrotnie. Gdy samochód znajdzie się w ciasnym miejscu, na przykład pod stołem (na wideo o 07:49), używa funkcji cofania i skręcania, aby się wydostać i znaleźć wolną drogę. Samochód ciągle odczytuje swoje otoczenie i podejmuje decyzje, demonstrując reaktywny system sterowania, który nie polega na wcześniej zaplanowanej trasie.
Rozdziały wideo
- [00:00] Wprowadzenie do projektu samochodu autonomicznego
- [00:28] O zestawie SunFounder 3-in-1
- [01:32] Otwieranie kodu i przegląd
- [02:02] Wyjaśnienie struktury kodu i nowych funkcji
- [03:11] Konfiguracja pinów w funkcji setup
- [03:28] Główna logika podejmowania decyzji w pętli
- [05:41] Prezentacja na żywo: samochód w akcji
- [07:09] Demonstracja z przeszkodami i podążaniem wzdłuż ścian
- [09:58] Podsumowanie i wnioski końcowe
/*
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
Rzeczy, których możesz potrzebować
-
AmazonSunFounder Arduino Learning Kit on AliExpresss.click.aliexpress.com
-
Amazon
-
Amazon
-
Amazon
-
Amazon
Zasoby i odniesienia
-
DokumentacjaDocumentation for SunFounder 3 in 1 IoT/Smart Car/Learning Kitdocs.sunfounder.com
-
ZewnętrznyPurchase SunFounder's 3-in-1 Smart car learning kitsunfounder.com
Pliki📁
Biblioteki Arduino (zip)
-
SunFounder's 3-in-1 Smart Car learning kit source code
3in1-kit-main-v2.zip12.80 MB