Arduino:Примеры/Управление двумя DC-моторами при помощи Arduino и Bluetooth

Материал из Онлайн справочника
Версия от 23:44, 5 мая 2017; Myagkij (обсуждение | вклад)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Черновик


Управление двумя DC-моторами при помощи Arduino и Bluetooth[1]

Эта статья рассказывает, как через Bluetooth управлять двумя DC-моторами (от англ. «direct current», что значит «постоянный ток»; эти моторы также называют «моторами постоянного тока») при помощи платы Arduino и Android-приложения, созданного с помощью веб-сервиса MIT App Inventor 2 (к слову, это отличная платформа для тех, кто только пробует себя в разработке приложений для Android).

В одной из прошлых статей я рассказывал, как управлять одним DC-мотором при помощи приложения под названием «BlueTerm».

Оно со своей работой справлялось неплохо, но у него были проблемы с отправкой разных команд.

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

Bluetooth-модуль HC-05

Чтобы настроить Bluetooth-соединение между смартфоном и Arduino, вам понадобится Bluetooth-модуль, и в нашем проекте будет использоваться модель HC-05 (см. фото ниже):

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

По умолчанию HC-05 коммуницирует на скорости 9600 бод.

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

Чтобы создать Android-приложение для проекта, мы воспользуемся бесплатным веб-сервисом MIT App Inventor. Этот сервис, помимо прочего, отлично подойдет тем, кто только начинает заниматься разработкой Android-приложений, т.е. позволяет создавать простые приложения, используя метод «drag-n-drop».

Чтобы зарегистрироваться в MIT App Inventor, понадобится аккаунт в Google. Залогиниваться нужно тут.

Кликните здесь, чтобы скачать файл «Arduino_Bluetooth_DC_Motors.aia», а затем следуйте инструкциям из видео ниже:

[Видео]

Чтобы загрузить файл, кликните в интерфейсе MIT App Inventor на Projects > Import Project (.aia) from my computer...

Две главные секции MIT App Inventor – это Designer и Blocks (переключение между ними осуществляется при помощи кнопок в правой верхней части экрана). Секция Designer позволяет добавлять кнопки, текст, меню и другими способами менять внешний вид приложения.

Секция Blocks позволяет создавать начинку приложения. То есть это, собственно, его «код» – то, какие функции выполняет приложение после того, как вы нажимаете на его кнопки.

Рекомендую продолжить этот проект, не внося в мое приложение никаких изменений.

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

  • App (provide QR code for .apk). Этот вариант позволяет сгенерировать QR-код, который можно отсканировать, а затем автоматически загрузить приложение на смартфон.
  • App (save .apk to my computer). Этот вариант позволяет скачать APK-файл на компьютер, а затем загрузить его на смартфон.

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

Код

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

Также убедитесь, что выбрали правильные пункты в меню Инструменты > Плата (Tools > Board) и Инструменты > Порт (Tools > Port).

/*
 * Автор – Руи Сантос (Rui Santos), http://randomnerdtutorials.com
 * Управление двумя моторами постоянного тока
 * при помощи смартфона через Bluetooth.
 */

int motor1Pin1 = 3;   // контакт 2 на микросхеме L293D 
int motor1Pin2 = 4;   // контакт 7 на микросхеме L293D 
int enable1Pin = 6;   // контакт 1 на микросхеме L293D
int motor2Pin1 = 8;   // контакт 10 на микросхеме L293D
int motor2Pin2 = 9;   // контакт 15 на микросхеме L293D
int enable2Pin = 11;  // контакт 9 на микросхеме L293D 
int state;
int flag=0;           // для того, чтобы функция Serial.println() 
                      // печатала «state» лишь единожды
int stateStop=0;
void setup() {
    // выставляем эти контакты в режим OUTPUT:
    pinMode(motor1Pin1, OUTPUT);
    pinMode(motor1Pin2, OUTPUT);
    pinMode(enable1Pin, OUTPUT);
    pinMode(motor2Pin1, OUTPUT);
    pinMode(motor2Pin2, OUTPUT);
    pinMode(enable2Pin, OUTPUT);
    // задаем контактам enable1Pin и enable2Pin 
    // значение HIGH, чтобы включить моторы:
    digitalWrite(enable1Pin, HIGH);
    digitalWrite(enable2Pin, HIGH);
    // запускаем последовательную коммуникацию на скорости 9600 бод: 
    Serial.begin(9600);
}

void loop() {
    // если получили какие-нибудь данные, считываем их 
    // и сохраняем в переменной «state»:
    if(Serial.available() > 0){     
      state = Serial.read();   
      flag=0;
    }   
    // если значение в «state» – это «F», двигаемся вперед:
    if (state == 'F') {
        digitalWrite(motor1Pin1, HIGH);
        digitalWrite(motor1Pin2, LOW); 
        digitalWrite(motor2Pin1, LOW);
        digitalWrite(motor2Pin2, HIGH);
        if(flag == 0){
          Serial.println("Go Forward!");  //  "Вперед!"
          flag=1;
        }
    }
    
    // если значение в «state» – это «R», двигаемся влево:
    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;
    }
    // если значение в «state» – это «S», останавливаем мотор:
    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;
    }
    // если значение в «state» – это «L», двигаемся вправо:
    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;
    }
    // если значение в «state» – это «B», двигаемся назад:
    else if (state == 'B') {
        digitalWrite(motor1Pin1, LOW); 
        digitalWrite(motor1Pin2, HIGH);
        digitalWrite(motor2Pin1, HIGH);
        digitalWrite(motor2Pin2, LOW);
        if(flag == 0){
          Serial.println("Reverse!");  //  "Назад!"
          flag=1;
        }
    }
    //  для отладочных целей:
    //  Serial.println(state);
}

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

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

  • Одна плата Arduino
  • Один Bluetooth-модуль HC-04, HC-05 или HC-06
  • Одна микросхема L293D
  • Два DC-мотора
  • Одна макетная плата
  • Провода-перемычки

Схема

Подключите эти компоненты друг к другу согласно схеме ниже:

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

Если вы так и не сгенерировали APK-файл (это файл, с помощью которого приложение устанавливается на смартфон), его можно скачать отсюда. Затем загрузите его на смартфон и следуйте инструкциям мастера установки.

Далее включите на смартфоне Bluetooth и кликните по иконке только что установленного приложения. Открыв приложение, кликните по кнопке Connect, чтобы подключить его к Bluetooth-модулю.

Готово! Теперь вы можете управлять моторами при помощи кнопок в приложении:

Посмотреть на проект в действии можно тут:

[Видео]

См.также

Внешние ссылки