CUSTOMELECTRONICS.RU
Информационно-учебный блог о разработке электроники
Эл. почта: info@customelectronics.ru

Создаем Android-приложение для управления домашним роботом через Bluetooth

В этой статье представлена пошаговая инструкция, которая поможет вам самостоятельно создать приложение для Android-смартфона, предназначенное для управления чем-либо через Bluetooth. Для демонстрации мы подробно разберем пример мигания светодиодом на Arduino по командам с телефона или планшета. В результате выполнения наших инструкций вы научитесь делать вот так:

Для управления домашним роботом достаточно добавить кнопок и обработать их команды на стороне Arduino.

Что для этого потребуется

  1. Любая Arduino-совместимая плата
  2. Bluetooth-модуль
  3. Устройство на котором установлена ОС Android

В качестве Bluetooth-модуля лучше всего использовать HC-05. Его легко купить в китайском интернет магазине или на eBay. Модуль питается от 3.3 В, но его линии I/O могут работать и с 5-вольтовой логикой, что позволяет подключать его UART к Arduino.

Внешний вид Bluetooth-модуля HC-05

Bluetooth-модуль HC-05

Подключение Bluetooth-модуля к Arduino

Так теперь нам нужно подключить нашу Arduino с Bluetooth. Если на Arduino нет вывода с 3.3В , а только 5В то нужен будет поставить стабилизатор чтобы снизить питание. Назначение выводов HC-05 легко найти в интернете. Для использования рекомендуем вам сделать плату с выведенными линиями питания, Rx и Tx. Подключение к Arduino необходимо производить в следующем порядке:

  • вывод Arduino 3.3В или (5В через стабилизатор!) — к 12 пину модуля Bluetooth
  • вывод Arduino GND — к 13 пину модуля Bluetooth
  • вывод Arduino TX — к 2 пину модуля RX Bluetooth
  • вывод Arduino RX — к 1 пину модуля TX Bluetooth

После подключения необходимо проверить работоспособность Bluetooth модуля. Подключим Светодиод к 12 выводу Arduino и загрузим на плату следующий скетч:

char incomingByte;  // входящие данные
int  LED = 12;      // LED подключен к 12 пину

void setup() {
  Serial.begin(9600); // инициализация порта
  pinMode(LED, OUTPUT); //Устанавливаем 12 вывод как выход
  Serial.println("Press 1 to LED ON or 0 to LED OFF...");
}

void loop() {
  if (Serial.available() > 0) {  //если пришли данные
    incomingByte = Serial.read(); // считываем байт
    if(incomingByte == '0') 
    {
       digitalWrite(LED, LOW);  // если 1, то выключаем LED
       Serial.println("LED OFF. Press 1 to LED ON!");  // и выводим обратно сообщение
    }
    if(incomingByte == '1') {
       digitalWrite(LED, HIGH); // если 0, то включаем LED
       Serial.println("LED ON. Press 0 to LED OFF!");
    }
  }
}

Теперь скачиваем из Play Market программу Bluetooth-терминал и устанавливаем его. Включаем нашу Arduino. В приложении Нажимаем кнопку меню->Connect a device-Secure.
Тем самым ваше устройство начнём искать Bluetooth поблизости. Наш модуль должен называться HC-05. Вам потребуется выписать его MAC-адрес, так он понадобится в дальнейшем. Как только он обнаружит устройство HC-05 выберите его. Пароль, если потребуется: 1234 (это стандартный код). После того как вы подключились к нему у вас должно вывести сообщение которое пришло в Bluetooth терминал от Arduino: “Press 1 to LED ON or 0 to LED OFF..” Далее введите 1 и нажмите отправить. Тем самым вы посылаете цифру 1 через Bluetooth на Arduino. Как только он примет цифру 1 должен загореться светодиод подключенный к 12 выводу Arduino. После введите цифру 0 и светодиод должен погаснуть. Если всё получилось переходим дальше.

Установка Android SDK

Скачиваем с официального сайта программу для создания приложений для android любых моделей. Распаковываем архив, запускаем SDK Manager.exe и устанавливаем программу. Вам предложат установить API, и версию android для которой вы в дальнейшем будете устанавливать приложения.

Окно Android SDK Manager

Android SDK Manager

После нажимаем кнопку Install, ждём когда завершиться установка и закрываем окно.
Заходим в саму программу, она находиться в папке eclipse/eclipse.exe. После открытия программы в диалоговом окне необходимо указать директорию для хранения будущих проектов. Лучше создавать папку на локальном диске, используя при этом только латинские буквы.

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

Выбираем File->New->Project.
Window
Так как мы создаём приложение для android, выбираем Android-> Android Application Project, и нажимаем Next
Window2
Следующее диалоговое окно:
Window3
Application Name -> пишем имя приложение,
Project Name -> пишем имя проекта,
Package Name -> Ни чего не пишем он создается автоматически!
Minimum Required SDK -> это минимальные требование указываем нашу версию Android у меня 4.1 её я и выбираю.
Target SDK -> выбираем вашу версию Android
Compile with -> выбираем вашу версию Android
Theme: для начала я бы советовал выбрать None.
Нажимаем Next.
В следующем окне ничего менять не нужно. Просто жмем Next.
Window4
Далее нам предлагают создать свою иконку для приложения, можете изменить стандартный ярлык загрузив свою картинку, я же для начала предлагаю просто нажать Next.
Window5
В следующем необходимо выбрать пункт меню Blank Activity и нажимать Next.
Window6
Жмем Finish и через несколько секунд открывается главное окно нашей программы. Выбираем вкладку Activity_main.xml и видим наш редактор:
Window7

  1. Файлы нашего проекта.
  2. Run Запуск эмулятора для проверки программы на наличие ошибок
  3. Панель кнопок текста и многое другое от сюда вы будите выбирать что вам нужно и добавлять в качестве элементов приложения
  4. Для выбора размера дисплея вашего телефона или планшета
  5. Выбор ориентации. Два вида: горизонтальный и вертикальный
  6. API уровень (лучше не трогать)
  7. Тут будет отображаться всё то что вы добавили в приложение, так же тут можно переименовать ваши добавленные элементы или удалять их.
  8. Показывает свойства элемента, его размер цвет и т.д., так же тут можно редактировать элемент
  9. Показывает наличие ошибок.
  10. Выбор редактирования (графический либо текстовой). Для начинающих конечно лучше пользоваться графическим режимом
  11. Окно вашего приложения , можно видеть интерфейс будущего приложения

Теперь добавим две кнопки в интерфейс приложения. Выбираем элемент Button и переносим его на форму.
Window8
Справа вверху мы видим объекты которые мы добавили. Так же важно, какой из объектов выбран в данный момент. Справа внизу можно редактировать кнопку, давайте изменим текст подписи кнопки и его цвет.
Для этого в поле свойств элемента «Text» введите, вместо button1, значение «ВКЛ», а у button2 — “ВЫКЛ”. Должно получиться вот так:
Window9
Мы можем запустить только что созданное приложение на эмуляторе. Идем в настройки запуска «Run» → Run Configurations», в левой части нажимаем на «Android Application». Появляется новая конфигурация «New_configuration». В правой части окна выбираем вкладку «Target» и выбираем опцию «Launch on all compatible devices/AVD» и добавляем устройство. Проверяем что кнопки появились и их можно нажимать. Если всё хорошо — продолжаем дальше.
Теперь в файлах проекта выбираем bin->AndroidManifest.hml
Window10
Теперь нажмём снизу на AndroudManifest.hml
Window11
В этот файл нам нужно будет добавить две строки:

Они будут запрашивать включение Bluetooth при старте приложение, если он будет выключен приложение попросит пользователя его включить. Добавить его нужно сюда:
Window12
Далее откроем другой файл: src->com.example(name)
Window13
В этом файле и будет наш основной код. Все его содержимое нужно удалить и вставить вот этот код:

package com.example.NAME;//Вместо NAME введите имя вашего проекта

import java.io.IOException;
import java.io.OutputStream;
import java.util.UUID;

import com.example.NAME.R;

import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {
  private static final String TAG = "bluetooth1";

  Button button1, button2;//Указываем id наших кнопок

  private static final int REQUEST_ENABLE_BT = 1;
  private BluetoothAdapter btAdapter = null;
  private BluetoothSocket btSocket = null;
  private OutputStream outStream = null;

  // SPP UUID сервиса 
  private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

  // MAC-адрес Bluetooth модуля
  private static String address = "00:00:00:00:00";  //Вместо “00:00” Нужно нудет ввести MAC нашего bluetooth

  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    button1 = (Button) findViewById(R.id.button1); //Добавляем сюда имена наших кнопок
    button2 = (Button) findViewById(R.id.button2);

    btAdapter = BluetoothAdapter.getDefaultAdapter();
    checkBTState();

    button1.setOnClickListener(new OnClickListener()  //Если будет нажата кнопка 1 то
    { 
      public void onClick(View v) 
      {
        sendData("1");         // Посылаем цифру 1 по bluetooth
        Toast.makeText(getBaseContext(), "Включаем LED", Toast.LENGTH_SHORT).show();  //выводим на устройстве сообщение
      }
    });

    button2.setOnClickListener(new OnClickListener() {
      public void onClick(View v) 
        {
        sendData("0"); // Посылаем цифру 1 по bluetooth
        Toast.makeText(getBaseContext(), "Выключаем LED", Toast.LENGTH_SHORT).show(); 
      }
    });
  }

  @Override
  public void onResume() {
    super.onResume();

    Log.d(TAG, "...onResume - попытка соединения...");

    // Set up a pointer to the remote node using it's address.
    BluetoothDevice device = btAdapter.getRemoteDevice(address);

    // Two things are needed to make a connection:
    //   A MAC address, which we got above.
    //   A Service ID or UUID.  In this case we are using the
    //     UUID for SPP.
    try {
      btSocket = device.createRfcommSocketToServiceRecord(MY_UUID);
    } catch (IOException e) {
      errorExit("Fatal Error", "In onResume() and socket create failed: " + e.getMessage() + ".");
    }

    // Discovery is resource intensive.  Make sure it isn't going on
    // when you attempt to connect and pass your message.
    btAdapter.cancelDiscovery();

    // Establish the connection.  This will block until it connects.
    Log.d(TAG, "...Соединяемся...");
    try {
      btSocket.connect();
      Log.d(TAG, "...Соединение установлено и готово к передачи данных...");
    } catch (IOException e) {
      try {
        btSocket.close();
      } catch (IOException e2) {
        errorExit("Fatal Error", "In onResume() and unable to close socket during connection failure" + e2.getMessage() + ".");
      }
    }

    // Create a data stream so we can talk to server.
    Log.d(TAG, "...Создание Socket...");

    try {
      outStream = btSocket.getOutputStream();
    } catch (IOException e) {
      errorExit("Fatal Error", "In onResume() and output stream creation failed:" + e.getMessage() + ".");
    }
  }

  @Override
  public void onPause() {
    super.onPause();

    Log.d(TAG, "...In onPause()...");

    if (outStream != null) {
      try {
        outStream.flush();
      } catch (IOException e) {
        errorExit("Fatal Error", "In onPause() and failed to flush output stream: " + e.getMessage() + ".");
      }
    }

    try     {
      btSocket.close();
    } catch (IOException e2) {
      errorExit("Fatal Error", "In onPause() and failed to close socket." + e2.getMessage() + ".");
    }
  }

  private void checkBTState() {
    // Check for Bluetooth support and then check to make sure it is turned on
    // Emulator doesn't support Bluetooth and will return null
    if(btAdapter==null) { 
      errorExit("Fatal Error", "Bluetooth не поддерживается");
    } else {
      if (btAdapter.isEnabled()) {
        Log.d(TAG, "...Bluetooth включен...");
      } else {
        //Prompt user to turn on Bluetooth
        Intent enableBtIntent = new Intent(btAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
      }
    }
  }

  private void errorExit(String title, String message){
    Toast.makeText(getBaseContext(), title + " - " + message, Toast.LENGTH_LONG).show();
    finish();
  }

  private void sendData(String message) {
    byte[] msgBuffer = message.getBytes();

    Log.d(TAG, "...Посылаем данные: " + message + "...");

    try {
      outStream.write(msgBuffer);
    } catch (IOException e) {
      String msg = "In onResume() and an exception occurred during write: " + e.getMessage();
      if (address.equals("00:00:00:00:00:00")) 
        msg = msg + ".\n\nВ переменной address у вас прописан 00:00:00:00:00:00, вам необходимо прописать реальный MAC-адрес Bluetooth модуля";
        msg = msg +  ".\n\nПроверьте поддержку SPP UUID: " + MY_UUID.toString() + " на Bluetooth модуле, к которому вы подключаетесь.\n\n";

        errorExit("Fatal Error", msg);       
    }
  }
}

ОБЯЗАТЕЛЬНО! Введите вместо 00:00:00:00:00 МАС вашего Bluetooth модуля, который можно узнать через Bluetooth терминал!!!
Ваше приложение готово. Теперь нам нужно проверить, как оно поведёт себя на устройстве. Запустите для этого симулятор. Если он запустился нормально без ошибок, то в папке, где вы создавали свой проект, будет создан файл с вашей программой. Его необходимо скопировать и установить на свое устройство.

Работа приложения

При нажатии на кнопку “Вкл” ваше Android-устройство передаст через Bluetooth цифру 1 и, как только Arduino примет цифру 1, светодиод загорится. При нажатии на кнопку “Выкл” передается цифра 2 и светодиод выключится, как показано на видео в начале статьи. Всё просто))

Мы будем очень рады, если вы поддержите наш ресурс и посетите магазин наших товаров shop.customelectronics.ru.

Метки: , Просмотров: 56847