Arduino — Управление 2 DC-моторами через Bluetooth (Идеально для создания робота)

В этом руководстве я покажу вам, как управлять 2 DC-моторами через Bluetooth с помощью Android-приложения, созданного в MIT App Inventor 2. MIT App Inventor — это отличная платформа для начала разработки под Android.

Arduino — Управление 2 DC-моторами через Bluetooth

В предыдущем руководстве (нажмите здесь, чтобы посмотреть тот проект) я управлял 1 DC-мотором с помощью приложения «BlueTerm». Это приложение справлялось с задачей, но оно не идеально для постоянной отправки различных команд удобным способом.

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

Bluetooth-модуль HC-05

Для установления Bluetooth-связи между вашим смартфоном и Arduino вам нужен Bluetooth-модуль. В этом проекте используется Bluetooth-модуль HC-05 (как показано на рисунке ниже).

Bluetooth-модуль HC-05

Этот Bluetooth-модуль работает с последовательными данными. Это означает, что Arduino отправляет информацию, а Bluetooth-модуль получает её через последовательный порт (и наоборот).

По умолчанию Bluetooth-модуль HC-05 работает на скорости передачи данных 9600 бод.

Создание Android-приложения

Android-приложение будет создано с помощью бесплатного веб-приложения MIT App Inventor. MIT App Inventor — отличное место для начала разработки под Android, поскольку он позволяет создавать простые приложения с помощью перетаскивания.

Для регистрации в MIT App Inventor вам нужен аккаунт Google, и вот страница входа: http://ai2.appinventor.mit.edu.

Нажмите здесь, чтобы скачать .aia файл, затем посмотрите видео ниже:

Если вы перейдёте на вкладку Projects, вы сможете загрузить .aia файл для этого проекта

Импорт проекта в MIT App Inventor

В MIT App Inventor есть 2 основных раздела: дизайнер и блоки. Дизайнер позволяет добавлять кнопки, текст, экраны и редактировать общий внешний вид приложения.

Дизайнер Android-приложения в MIT App Inventor

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

Блоки Android-приложения в MIT App Inventor

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

Если вы хотите внести какие-либо изменения в приложение, когда закончите и захотите установить приложение на свой смартфон, перейдите на вкладку Build.

  • Вы можете сгенерировать QR-код, который можно отсканировать смартфоном и автоматически установить приложение на смартфон.

  • Или вы можете скачать .apk файл, подключить смартфон к компьютеру и переместить .apk файл на телефон.

Сборка приложения в MIT App Inventor

Просто следуйте мастеру установки, чтобы установить приложение, и готово!

Код

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

/*
 * created by Rui Santos, https://randomnerdtutorials.com
 * Control 2 DC motors with Smartphone via bluetooth
 */

int motor1Pin1 = 3; // pin 2 on L293D IC
int motor1Pin2 = 4; // pin 7 on L293D IC
int enable1Pin = 6; // pin 1 on L293D IC
int motor2Pin1 = 8; // pin 10 on L293D IC
int motor2Pin2 = 9; // pin 15 on L293D IC
int enable2Pin = 11; // pin 9 on L293D IC
int state;
int flag=0;        //makes sure that the serial only prints once the state
int stateStop=0;
void setup() {
    // sets the pins as outputs:
    pinMode(motor1Pin1, OUTPUT);
    pinMode(motor1Pin2, OUTPUT);
    pinMode(enable1Pin, OUTPUT);
    pinMode(motor2Pin1, OUTPUT);
    pinMode(motor2Pin2, OUTPUT);
    pinMode(enable2Pin, OUTPUT);
    // sets enable1Pin and enable2Pin high so that motor can turn on:
    digitalWrite(enable1Pin, HIGH);
    digitalWrite(enable2Pin, HIGH);
    // initialize serial communication at 9600 bits per second:
    Serial.begin(9600);
}

void loop() {
    //if some date is sent, reads it and saves in state
    if(Serial.available() > 0){
      state = Serial.read();
      flag=0;
    }
    // if the state is 'F' the DC motor will go forward
    if (state == 'F') {
        digitalWrite(motor1Pin1, HIGH);
        digitalWrite(motor1Pin2, LOW);
        digitalWrite(motor2Pin1, LOW);
        digitalWrite(motor2Pin2, HIGH);
        if(flag == 0){
          Serial.println("Go Forward!");
          flag=1;
        }
    }

    // if the state is 'R' the motor will turn left
    else if (state == 'R') {
        digitalWrite(motor1Pin1, HIGH);
        digitalWrite(motor1Pin2, LOW);
        digitalWrite(motor2Pin1, LOW);
        digitalWrite(motor2Pin2, LOW);
        if(flag == 0){
          Serial.println("Turn LEFT");
          flag=1;
        }
        delay(1500);
        state=3;
        stateStop=1;
    }
    // if the state is 'S' the motor will Stop
    else if (state == 'S' || stateStop == 1) {
        digitalWrite(motor1Pin1, LOW);
        digitalWrite(motor1Pin2, LOW);
        digitalWrite(motor2Pin1, LOW);
        digitalWrite(motor2Pin2, LOW);
        if(flag == 0){
          Serial.println("STOP!");
          flag=1;
        }
        stateStop=0;
    }
    // if the state is 'L' the motor will turn right
    else if (state == 'L') {
        digitalWrite(motor1Pin1, LOW);
        digitalWrite(motor1Pin2, LOW);
        digitalWrite(motor2Pin1, LOW);
        digitalWrite(motor2Pin2, HIGH);
        if(flag == 0){
          Serial.println("Turn RIGHT");
          flag=1;
        }
        delay(1500);
        state=3;
        stateStop=1;
    }
    // if the state is 'B' the motor will Reverse
    else if (state == 'B') {
        digitalWrite(motor1Pin1, LOW);
        digitalWrite(motor1Pin2, HIGH);
        digitalWrite(motor2Pin1, HIGH);
        digitalWrite(motor2Pin2, LOW);
        if(flag == 0){
          Serial.println("Reverse!");
          flag=1;
        }
    }
    //For debugging purpose
    //Serial.println(state);
}

Посмотреть исходный код

Примечание: перед загрузкой кода убедитесь, что пины TX и RX отключены от Bluetooth-модуля!

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

Необходимые компоненты для проекта

Вы можете использовать ссылки выше или перейти напрямую на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!

Схемы

Следуйте схеме на рисунке ниже, чтобы собрать вашу цепь.

Схема подключения DC-моторов с L293D и Arduino Собранная схема DC-моторов на макетной плате

Запуск приложения

Если вы не сгенерировали .apk файл на предыдущем шаге, вы можете нажать здесь, чтобы скачать .apk файл (это файл установки Android-приложения). Переместите этот файл на свой смартфон и откройте его. Следуйте мастеру установки, чтобы установить приложение.

Включите Bluetooth на вашем смартфоне.

Нажмите на недавно установленное приложение. Нажмите кнопку «Connect», чтобы подключить ваше приложение к Bluetooth-модулю Arduino.

Теперь вы можете легко управлять 2 DC-моторами с помощью вашего приложения:

Android-приложение для управления DC-моторами

Смотрите видео-демонстрацию

Устранение неполадок:

  • Отсоедините кабели RX и TX при загрузке нового скетча на плату Arduino.

  • Люди часто подключают TX от Bluetooth-модуля к TX Arduino — это не будет работать. Убедитесь, что вы подключили: TX идёт к RX, а RX идёт к TX.

  • Если Bluetooth-модуль HC-04/HC-06/HC-05 запрашивает пароль, это «1234».

Заключение

Надеюсь, вы нашли это полезным.

Знаете друга, которому было бы интересно увидеть этот проект? Обязательно поделитесь этим проектом с ним!

Хотите узнать больше о создании приложений для Arduino? Получите доступ к нашему курсу: Android Apps for Arduino with MIT App Inventor 2.

P.S. Если у вас нет Bluetooth-модуля, прочитайте мой обзор HC-05 здесь.