Katse: Auto Detailid
Komponendid:
1 x Arduino Uno
1 x L298N mootori draiver
2 x mootor
1 x lüliti sisse / välja lülitamiseks
3 x parkimisandur
1 x aku (võib asendada patareidega)
Skeem:

Tööprotsess:
Auto sisselülitamisel loeb autoandurid vahemaa ja määrab, kui kiiresti see liigub. Mida lähemal objektile, seda aeglasemalt see liigub kuni täieliku peatumiseni. See põhimõte kehtib ka piiksuja puhul.
Kood:
// DISTANCE VARIABLES
const int trigPin = 3;
const int echoPin = 2;
int dist_check1, dist_check2, dist_check3;
long duration, distance, distance_all;
int dist_result;
// MOTORS VARIABLES
const int mot1f = 6;
const int mot1b = 5;
const int mot2f = 11;
const int mot2b = 10;
int mot_speed = 150; // Уменьшенная скорость моторов
int k = 0; // BRAKE
// LOGICS VARIABLES
const int dist_stop = 25;
const int max_range = 800;
const int min_range = 0;
int errorLED = 13;
int turn_count = 0; // Счётчик поворотов
// INITIALIZATION
void setup() {
// Serial.begin(9600);
// bluetoothSerial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(errorLED, OUTPUT);
}
// BASIC PROGRAM CYCLE
void loop() {
delay(1000);
goto start;
start:
int result = ping(); // Check distance
if (result <= min_range || result >= max_range) { // Check min and max range
digitalWrite(errorLED, 1);
delay(500);
}
else if (result <= dist_stop) { // Check stop range
digitalWrite(errorLED, 0);
motors_stop();
turn_count++;
// Turn left
motors_left();
delay(300);
motors_stop();
// Check distance again after turning left
result = ping();
if (result <= dist_stop) { // If obstacle still detected, turn right 180 degrees
motors_stop();
// Turn right 180 degrees
motors_right();
delay(600);
motors_stop();
}
if (turn_count >= 5) { // Если поворачивает 5 раз подряд
turn_count = 0;
// Едем вперёд
motors_forward();
delay(1000); // Продолжительность движения вперёд
motors_stop();
result = ping();
if (result <= dist_stop) { // Если сразу увидит препятствие
motors_stop();
// Едем назад
motors_back();
delay(500); // Продолжительность движения назад
motors_stop();
}
}
} else { // If all is OK, go forward
motors_forward();
delay(100);
turn_count = 0; // Сбрасываем счётчик поворотов при движении вперёд
}
goto start;
}
// *********************** FUNCTIONS *******************************
int ping() { // CHECK DISTANCE FUNCTION (3x)
digitalWrite(trigPin, 0);
delayMicroseconds(2);
digitalWrite(trigPin, 1);
delayMicroseconds(10);
digitalWrite(trigPin, 0);
duration = pulseIn(echoPin, 1);
distance = duration / 58;
dist_check1 = distance;
digitalWrite(trigPin, 0);
delayMicroseconds(2);
digitalWrite(trigPin, 1);
delayMicroseconds(10);
digitalWrite(trigPin, 0);
duration = pulseIn(echoPin, 1);
distance = duration / 58;
dist_check2 = distance;
digitalWrite(trigPin, 0);
delayMicroseconds(2);
digitalWrite(trigPin, 1);
delayMicroseconds(10);
digitalWrite(trigPin, 0);
duration = pulseIn(echoPin, 1);
distance = duration / 58;
dist_check3 = distance;
int dist_check_sum = dist_check1 + dist_check2 + dist_check3;
dist_result = dist_check_sum / 3;
return dist_result;
}
void motors_forward() { // MOTORS FORWARD FUNCTION
analogWrite(mot1f, mot_speed);
analogWrite(mot2f, mot_speed);
digitalWrite(mot1b, 0);
digitalWrite(mot2b, 0);
}
void motors_back() { // MOTORS BACK FUNCTION
digitalWrite(mot1f, 0);
digitalWrite(mot2f, 0);
analogWrite(mot1b, mot_speed);
analogWrite(mot2b, mot_speed);
}
void motors_stop() { // MOTORS STOP FUNCTION
digitalWrite(mot1f, 1);
digitalWrite(mot2f, 1);
digitalWrite(mot1b, 1);
digitalWrite(mot2b, 1);
}
void motors_left() { // MOTORS LEFT FUNCTION
analogWrite(mot1f, mot_speed);
digitalWrite(mot2f, 0);
digitalWrite(mot1b, 0);
analogWrite(mot2b, mot_speed);
}
void motors_right() { // MOTORS RIGHT FUNCTION
digitalWrite(mot1f, 0);
analogWrite(mot2f, mot_speed);
analogWrite(mot1b, mot_speed);
digitalWrite(mot2b, 0);
}
void motors_foward_left() { // FORWARD LEFT FUNCTION
k = mot_speed * 0.8;
analogWrite(mot1f, mot_speed);
analogWrite(mot2f, k);
digitalWrite(mot1b, 0);
digitalWrite(mot2b, 0);
}
void motors_foward_right() { // FORWARD RIGHT FUNCTION
k = mot_speed * 0.8;
analogWrite(mot1f, k);
analogWrite(mot2f, mot_speed);
analogWrite(mot1b, 0);
analogWrite(mot2b, 0);
}
void motors_back_left() { // BACK LEFT FUNCTION
k = mot_speed * 0.8;
digitalWrite(mot1f, 0);
digitalWrite(mot2f, 0);
analogWrite(mot1b, k);
analogWrite(mot2b, mot_speed);
}
void motors_back_right() { // BACK RIGHT FUNCTION
k = mot_speed * 0.8;
digitalWrite(mot1f, 0);
digitalWrite(mot2f, 0);
analogWrite(mot1b, mot_speed);
analogWrite(mot2b, k);
}
Reaalse elu rakendused:
Mootor, puidutöötlemine, kaevandamine, robootika, keeruline insener, Pargisensorid kasutatakse ohutuks parkimiseks.
Video:
Foto:

This post is also available in ru_RU.