Код для поиска

Урок 27/31: Умный автомобиль SunFounder Car-5 следует за вашей рукой с использованием Arduino | Robojax

Урок 27/31: Умный автомобиль SunFounder Car-5 следует за вашей рукой с использованием Arduino | Robojax

Введение

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

27-SunFounder-Car-5-Follow-Hand

Этот проект является частью курса Robojax по Arduino (Урок 27/31) и создан с использованием набора SunFounder 3-in-1 Arduino. Это отличный способ узнать о слиянии датчиков, когда несколько датчиков работают вместе, чтобы создать более сложное и отзывчивое поведение. Практическая ценность здесь заключается в понимании того, как комбинировать различные типы входных данных для принятия решений — фундаментальная концепция в робототехнике и автоматизации.

Вот несколько практических идей, которые вы могли бы развить на основе этой логики:

  • Интерактивные выставки: Создайте небольшой роботизированный дисплей, который следует за посетителями, чтобы привлечь их внимание.
  • Автономная платформа для обхода препятствий: Измените код, чтобы машина перемещалась по комнате, избегая препятствий, вместо того чтобы следовать за рукой.
  • Образовательный робототехнический набор: Используйте это как базовый проект для обучения студентов интеграции датчиков, логике и управлению двигателями.
  • Умная тележка для доставки: В контролируемой среде эту логику можно адаптировать для небольшой тележки, которая следует за человеком на складе или в заводском помещении.

Аппаратное обеспечение и компоненты

В этом проекте используются компоненты, входящие в набор SunFounder 3-in-1 Arduino. Основные компоненты, которые вы будете использовать:

  • Шасси умной машины SunFounder: Физическая платформа с колёсами и двигателями.
  • Плата Arduino: «Мозг» машины, который выполняет код.
  • Ультразвуковой датчик (HC-SR04): Используется для измерения расстояния до объекта (вашей руки) перед машиной.
  • Два инфракрасных датчика обнаружения препятствий: Установлены слева и справа для обнаружения присутствия вашей руки с этих сторон.
  • Драйвер двигателей: Модуль (часто L298N или аналогичный), используемый для управления скоростью и направлением двигателей машины на основе сигналов от Arduino.
  • Источник питания: Батареи для питания Arduino и двигателей.

Руководство по подключению

car_7_8_follow_hand

Как упоминалось в видео, подключение для этого проекта идентично тому, что объяснялось в предыдущих уроках для машины с обходом препятствий. Датчики и двигатели подключены к цифровым и аналоговым выводам Arduino. Для визуальной справки обратитесь к схеме подключения для умной машины SunFounder.

Код определяет конкретные выводы, используемые для каждого компонента, которые подробно описаны в следующем разделе.

Объяснение кода

Этот раздел сосредоточен на настраиваемых пользователем частях кода, которые вы, возможно, захотите изменить для своей машины. Полная программа доступна для загрузки на странице ресурсов Robojax.

В самом начале скетча вы найдёте определения выводов. Это наиболее важные строки для понимания, если вы подключили свою машину иначе, чем инструктор.

const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;

const int rightIR=7;
const int leftIR=8;

const int trigPin = 3;
const int echoPin = 4;

Вот что делает каждая группа выводов:

  • Выводы двигателей (A_1A, A_1B, B_1A, B_1B): Это выводы, подключённые к драйверу двигателей для управления двумя двигателями. Метки «A» и «B» обычно относятся к левому и правому двигателям соответственно. Вы должны изменить их, если ваш драйвер двигателей подключён к другим выводам Arduino.
  • Выводы инфракрасных датчиков (rightIR, leftIR): Эти цифровые входные выводы считывают сигнал с левого и правого инфракрасных датчиков препятствий. Значение 0 означает, что препятствие (ваша рука) обнаружено, а 1 — что путь свободен.
  • Выводы ультразвукового датчика (trigPin, echoPin): trigPin — это выход, который отправляет короткий ультразвуковой импульс, а echoPin — это вход, который считывает длительность отражённого импульса для расчёта расстояния.

Внутри функции loop() вы найдёте основную логику поведения. Есть одна переменная, которую вы, возможно, захотите изменить:

int speed = 150;

Эта переменная speed управляет мощностью, подаваемой на двигатели во время движения. Она может варьироваться от 0 (остановка) до 255 (максимальная скорость). Вы можете увеличить это значение (например, до 200) для более быстрой машины или уменьшить (например, до 100) для более контролируемых, медленных движений.

Код также содержит функции, такие как moveForward(), turnLeft() и turnRight(). Эти функции используются для управления движением машины и вызываются на основе показаний датчиков. Вам не нужно их изменять, но вы можете использовать их как строительные блоки для создания собственного поведения.

Как работает логика «Следуй за рукой»

Магия этого проекта заключается в том, как Arduino интерпретирует данные с трёх датчиков. Логика проста и выполняется непрерывно в функции loop().

Сначала автомобиль измеряет расстояние до объекта прямо перед собой с помощью ультразвукового датчика. Затем он проверяет два инфракрасных датчика, чтобы определить, есть ли объект слева или справа. Процесс принятия решений выглядит следующим образом:

  1. Движение вперёд: Если расстояние, измеренное ультразвуковым датчиком, больше 5 см, но меньше 10 см, автомобиль движется вперёд. Это создаёт «зону оптимального расстояния», в которой автомобиль будет следовать за вашей рукой.
  2. Поворот влево: Если расстояние не находится в этой зоне, автомобиль проверяет ИК-датчики. Если левый датчик заблокирован (ваша рука слева), а правый датчик свободен, автомобиль поворачивает влево.
  3. Поворот вправо: И наоборот, если правый датчик заблокирован, а левый свободен, автомобиль поворачивает вправо.
  4. Остановка: Если ни одно из этих условий не выполняется — например, если ваша рука слишком далеко или слишком близко — автомобиль останавливается.

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

Живая демонстрация проекта

В видеодемонстрации инструктор показывает поведение автомобиля в реальном времени. Последовательный монитор используется для отображения расстояния, считываемого ультразвуковым датчиком. Когда автомобиль простаивает, а ваша рука находится далеко (например, 36 см), он остаётся остановленным. Как только вы помещаете руку в зону 5–10 см перед автомобилем, он начинает двигаться вперёд.

Демонстрация также подчёркивает логику поворота. Когда ваша рука находится с левой стороны автомобиля, срабатывает левый ИК-датчик, и автомобиль поворачивает влево. Аналогично, размещение руки с правой стороны заставляет автомобиль поворачивать вправо. Автомобиль продолжает следовать за вашей рукой, когда вы двигаете её, останавливаясь только тогда, когда рука убирается из зоны действия датчиков или находится слишком близко. Это подтверждает, что объединение данных датчиков и логика работают должным образом, создавая отзывчивый и увлекательный проект.

Главы

  • [00:00] Введение в умный автомобиль, следующий за рукой
  • [00:35] О курсе и наборе Robojax Arduino
  • [01:41] Обзор проекта и настройка кода
  • [02:19] Объяснение определений выводов и настройки
  • [03:19] Логика кода для следования за вашей рукой
  • [05:48] Живая демонстрация автомобиля в действии
  • [07:28] Финальная демонстрация и оценка производительности

Изображения

Car 7 8 follow hand
Car 7 8 follow hand
27 SunFounder Car 5 follow hand
27 SunFounder Car 5 follow hand
898-Lesson 27/31: Car-5 SunFounder Smart Car Follows Your Hand
Язык: C++
/*
Lesson 27/31: Car-5 SunFounder Smart Car Follows Your Hand
Get this code and watch video Download and resource page https://robojax.com/RJT610
YouTube video https://www.youtube.com/watch?v=mcbJlE7-8ro

*/
const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;

const int rightIR=7;
const int leftIR=8;

const int trigPin = 3;
const int echoPin = 4;

void setup() {
  Serial.begin(9600);

  //motor
  pinMode(A_1B, OUTPUT);
  pinMode(A_1A, OUTPUT);
  pinMode(B_1B, OUTPUT);
  pinMode(B_1A, OUTPUT);

  //IR obstacle
  pinMode(leftIR,INPUT);
  pinMode(rightIR,INPUT);
  
  //ultrasonic
  pinMode(echoPin, INPUT);
  pinMode(trigPin, OUTPUT);
}

void loop() {

  float distance = readSensorData();

  int left = digitalRead(leftIR);  // 0: Obstructed   1: Empty
  int right = digitalRead(rightIR);
  int speed = 150;

  if (distance>5 && distance<10){
    moveForward(speed);
  }else if(!left&&right){
    turnLeft(speed);
  }else if(left&&!right){
    turnRight(speed);
  }else{
    stopMove();
  }
}

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 turnRight(int speed) {
  analogWrite(A_1B, speed);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, speed);
  analogWrite(B_1A, 0);
}

void turnLeft(int speed) {
  analogWrite(A_1B, 0);
  analogWrite(A_1A, speed);
  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);
}

Вещи, которые могут вам понадобиться

Файлы📁

Библиотеки Arduino (zip)