Ülesanne 7 Mootor ja kaugusemõõtmise andur

7.1 Katse Mootori kasutamine

Цель:

В предыдущем проекте мы использовали транзистор для управления мотором, с помощью которого можно было управлять только скоростью мотора. В этом проекте мы используем H-мост, чтобы можно было также управлять направлением вращения мотора. Поскольку это значительный шаг в построении робота, мы добавим в схему переключатель для включения мотора, переключатель для изменения направления вращения и переменный резистор для изменения скорости мотора.

Необходимые компоненты:

  • Драйвер мотора L293D или SN754410
  • Переключатели — 2 шт.
  • Резисторы 10 кОм — 2 шт.
  • Потенциометр

H-мост

Чтобы управлять мотором в одну и другую сторону, нужно менять полярность выводов мотора. Здесь нам помогает драйвер мотора L293D (или SN754410). Это четырёхканальный драйвер мотора, предназначенный для управления моторами, реле или другими индуктивными электрическими устройствами. То есть с его помощью можно управлять двумя моторами. В чип встроены защитные диоды, которые защищают от электрического обратного удара, возникающего из-за индуктивности.

Если упростить принцип работы L293D, то он состоит из четырёх переключателей, расположенных в форме, напоминающей букву H — отсюда и название.

L293D

Драйвер мотора L293D — это чип с 16 выводами (ногами).

Выводы микросхемы обычно пронумерованы. На верхней части каждой микросхемы имеется выемка — возьми микросхему так, чтобы выемка находилась сверху. Тогда вывод номер 1 будет в верхнем левом углу, и далее нумерация будет идти по U-образной траектории.

  • Vss – питание микросхемы, +5 В
  • Vs – внешнее питание до +36 В
  • ENABLE1 и ENABLE2 – активируют мотор 1 и мотор 2
  • INPUT1 и INPUT2 – управление мотором 1
  • OUTPUT1 и OUTPUT2 – подключение мотора 1
  • INPUT3 и INPUT4 – управление мотором 2
  • OUTPUT3 и OUTPUT4 – подключение мотора 2
  • GND – земля (общий провод, масса)

Подключение L293D к Arduino

Теперь мы практически приведем моторы в действие с помощью драйвера мотора. В схему мы добавим две кнопки и потенциометр для управления мотором.

Сначала подключим микросхему L293D, переключатель и провода от батарейки к макетной плате. Пока батарейки не подключай! Затем соедини «+» и «–» шины (питающие полоски) на макетной плате между собой. Далее подключим выводы драйвера мотора по номерам. Обрати внимание, в какую сторону направлена выемка на микросхеме!

Подключения:

  1. Вывод 1 — подключаем к пину 9 на Arduino
  2. Вывод 2 — подключаем к пину 4 на Arduino
  3. и 6. Выводы — подключаем к мотору
    4., 5., 12. и 13. Выводы — подключаем к земле (GND)
  4. Вывод — подключаем к пину 3 на Arduino
  5. и 16. Выводы — подключаем к питанию от батарейки

Схема:

Код:

int switchPin = 2; // lüliti 1 
 
int motor1Pin1 = 3; // viik 2 (L293D) 
 
int motor1Pin2 = 4; // viik 7 (L293D) 
 
int enablePin = 9; // viik 1(L293D) 
 
 void setup() { 
 
 // sisendid 
 
 pinMode(switchPin, INPUT);
 
 //väljundid 
 
 pinMode(motor1Pin1, OUTPUT); 
 
 pinMode(motor1Pin2, OUTPUT); 
 
 pinMode(enablePin, OUTPUT); 
 
 // aktiveeri mootor1 
 
 digitalWrite(enablePin, HIGH); 
 
} 
 
 void loop() { 
 
 // kui lüliti on HIGH, siis liiguta mootorit ühes suunas: 
 
 if (digitalRead(switchPin) == HIGH) 
 
{ 
 
 digitalWrite(motor1Pin1, LOW); // viik 2 (L293D) LOW 
 
 digitalWrite(motor1Pin2, HIGH); // viik 7 (L293D) HIGH 
 
 } 
 
 // kui lüliti on LOW, siis liiguta mootorit teises suunas: 
 
 else
 
 { digitalWrite(motor1Pin1, HIGH); // viik 2 (L293D) HIGH 
 
 digitalWrite(motor1Pin2, LOW); // viik 7 (L293D) LOW 
 
 } 
 
} 

Регулировка скорости мотора

Теперь, когда схема загружена, мотор работает в одном направлении, а при нажатии кнопки — в другом. Дополнительно мы улучшим схему: добавим ещё один переключатель, который будет запускать мотор, и потенциометр, с помощью которого можно изменять скорость вращения мотора.

Схема:

Код:

int switchPin = 2; // lüliti 1 
 
int switchPin2 = 1; // lüliti 2 
 
int potPin = A0; // potentsiomeeter 
 
int motor1Pin1 = 3; // viik 2 (L293D) 
 
int motor1Pin2 = 4; // viik 7 (L293D) 
 
int enablePin = 9; // viik 1(L293D) 
 
 void setup() { 
 
 // sisendid 
 
 pinMode(switchPin, INPUT); 
 
 pinMode(switchPin2, INPUT); 
 
 //väljundid 
 
 pinMode(motor1Pin1, OUTPUT); 
 
 pinMode(motor1Pin2, OUTPUT); 
 
 pinMode(enablePin, OUTPUT); 
 
} 
 
 void loop() { 
 
 //mootori kiirus 
 
 int motorSpeed = analogRead(potPin); 
 
 //aktiveeri mootor 
 
 if (digitalRead(switchPin2) == HIGH)
 
{ 
 
 analogWrite(enablePin, motorSpeed); 
 
 } 
 
else
 
{ analogWrite(enablePin, 0); } 
 
 // kui lüliti on HIGH, siis liiguta mootorit ühes suunas: 
 
 if (digitalRead(switchPin) == HIGH)
 
{
 
 digitalWrite(motor1Pin1, LOW); // viik 2 (L293D) LOW 
 
 digitalWrite(motor1Pin2, HIGH); // viik 7 (L293D) HIGH 
 
 } 
 
 // kui lüliti on LOW, siis liiguta mootorit teises suunas: 
 
 else
 
{ 
 
 digitalWrite(motor1Pin1, HIGH); // viik 2 (L293D) HIGH 
 
 digitalWrite(motor1Pin2, LOW); // viik 7 (L293D) LOW 
 
 } 
 
}

7.2 Опыт: Использование датчика измерения расстояния

Подключение ультразвукового датчика HC-SR04 к Arduino

Ультразвуковой датчик — это сенсор (сонар), который измеряет расстояние до препятствия с помощью звукового импульса. Измеряется время между отправкой звукового импульса и получением отражённого сигнала (эха). Также нужно учитывать скорость распространения звука — 340 м/с — и делить результат на два (так как сигнал проходит путь туда и обратно).

Подсказка: чтобы пройти 1 см, звуку требуется примерно 29 микросекунд. Для измерения сигнала используй функцию pulseIn() в Arduino.

Этот датчик работает от 5 В, его угол измерения — до 15°, а измеряемое расстояние — от 2 до 450 см. Это довольно недорогой датчик, при этом его точность составляет около 0,3 см.

Для подключения к Arduino:

  • Echo подключается к пину 8,
  • Trig — к пину 7.

Схема:

Код:

#define ECHO_PIN 8
 
#define TRIG_PIN 7
 
void setup() {
 
  pinMode(ECHO_PIN, INPUT);
 
  pinMode(TRIG_PIN, OUTPUT);
 
  Serial.begin(9600);
 
}
 
void loop() {
 
  digitalWrite(TRIG_PIN,HIGH);
 
  digitalWrite(TRIG_PIN,LOW);
 
  int distance=pulseIn(ECHO_PIN, HIGH)/50;
 
  Serial.println(distance);
 
}
#define ECHO_PIN 8
 
#define TRIG_PIN 7
 
void setup() {
 
  pinMode(ECHO_PIN, INPUT);
 
  pinMode(TRIG_PIN, OUTPUT);
 
  Serial.begin(960);
 
}
 
void loop() {
 
  Serial.println(measure()); 
 
}
 
int measure()
 
{
 
  digitalWrite(TRIG_PIN,HIGH);
 
  digitalWrite(TRIG_PIN,LOW);
 
  int distance=pulseIn(ECHO_PIN, HIGH,15000)/50;
 
  return constrain(distance,1,300);
 
}

7.3 Опыт: Простая парковочная система

В этом проекте измеряется расстояние до препятствия с помощью ультразвукового датчика. Если расстояние меньше 50 см, загорается красный светодиод, пьезоизлучатель (buzzer) подаёт звуковой сигнал, а скорость мотора устанавливается на 0.

Компоненты:

  • Ультразвуковой датчик расстояния
  • Мотор
  • Пьезоизлучатель (buzzer)
  • Светодиод (LED)

Схема:

Код:

#define ECHO_PIN 7
#define TRIG_PIN 8
int motorPin1=3;
int distance=1;
int LedPin=13;
int duration;
const int buzzerPin = 9;
void setup() {
  pinMode(ECHO_PIN, INPUT);
  pinMode(TRIG_PIN, OUTPUT);
  pinMode(motorPin1,OUTPUT);
  pinMode(LedPin,OUTPUT);
  pinMode(buzzerPin, OUTPUT);
  Serial.begin(9600);
}
void loop() {
  digitalWrite(TRIG_PIN,LOW);
  delay(200);
  digitalWrite(TRIG_PIN,HIGH);
  delay(200);
  digitalWrite(TRIG_PIN,LOW);
  duration = pulseIn(ECHO_PIN, HIGH);
  distance=duration/58;
  Serial.println(distance);
  if (distance>50)
  {
      analogWrite(motorPin1,100);
      digitalWrite(LedPin,0);
    noTone(buzzerPin);     
      delay(1000);}  
  else
  {
    analogWrite(motorPin1,0);
      digitalWrite(LedPin,250);
       tone(buzzerPin, 1000);
  }
}

Ülesanne 7.2 Parking

Цель:

Умная система шлагбаума на Arduino
Создание автоматического шлагбаума, который реагирует на приближение автомобиля с помощью датчиков, открывается и закрывается автоматически, отображает статус и повышает безопасность парковки.

Используемые компоненты:

  • Arduino Uno R3 — основная плата микроконтроллера
  • HC-SR04 ультразвуковой датчик — для измерения расстояния и обнаружения приближающегося объекта (машины/руки)
  • Сервомотор (SG90) — для открытия и закрытия шлагбаума
  • Красный светодиод (LED) — индикация “шлагбаум закрыт / проезд запрещён”
  • Зелёный светодиод (LED) — индикация “шлагбаум открыт / проезд разрешён”
  • 2 × резистора 220 Ом — ограничение тока для светодиодов
  • Макетная плата (breadboard) — для сборки схемы
  • Провода соединительные (male-male) — для подключения компонентов

Задачи:

  1. Создать автоматизированную систему шлагбаума, которая открывается при приближении объекта (например, машины или руки).
  2. Измерять расстояние до объекта с помощью ультразвукового датчика (HC-SR04).
  3. Управлять сервомотором, обеспечивая открытие и закрытие шлагбаума в нужный момент.
  4. Отображать состояние системы с помощью светодиодов:
    • зелёный — проезд разрешён,
    • красный — проезд запрещён.
  5. Повысить безопасность и удобство управления доступом к ограниченной зоне (например, парковке или въезду).
  6. Развить навыки работы с Arduino, цифровыми и аналоговыми компонентами,

Схема:

Компоненты:

КомпонентКонтактArduino
HC-SR04VCC5V
GNDGND
TrigD9
EchoD10
ServoSignal (оранжевый)D8
VCC (красный)5V
GND (чёрный)GND
RGB LEDR (анод через резистор)A0
G (анод через резистор)A1
B (анод через резистор)*A2
Общий катодGND

Код:

#include <Servo.h>

// Пины компонентов
const int trigPin = 9;
const int echoPin = 10;
const int servoPin = 8;

// RGB пины
const int redPin = A0;
const int greenPin = A1;
const int bluePin = A2;

// Углы шлагбаума
const int openAngle = 90;
const int closeAngle = 0;

// Дистанция срабатывания
const int distanceThreshold = 15;

Servo tollServo;

void setup() {
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);

  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);

  tollServo.attach(servoPin);
  tollServo.write(closeAngle); // по умолчанию закрыт

  Serial.begin(9600);
}

void loop() {
  int distance = readDistance();

  Serial.print("Distance: ");
  Serial.print(distance);
  Serial.println(" cm");

  if (distance > 0 && distance < distanceThreshold) {
    // Объект обнаружен — открыть шлагбаум
    tollServo.write(openAngle);
    setLEDColor(0, 255, 0); // зелёный — можно проехать
    delay(3000);
    tollServo.write(closeAngle);
    setLEDColor(255, 0, 0); // красный — снова закрыт
  } else {
    tollServo.write(closeAngle);
    setLEDColor(255, 0, 0); // по умолчанию — красный
  }

  delay(500);
}

// Измерение расстояния ультразвуком
int readDistance() {
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  long duration = pulseIn(echoPin, HIGH);
  int distance = duration * 0.034 / 2;
  return distance;
}

// Управление RGB LED
void setLEDColor(int r, int g, int b) {
  analogWrite(redPin, r);
  analogWrite(greenPin, g);
  analogWrite(bluePin, b);
}

Видео: