Как связать микроконтроллер AVR c планшетом на Android, с помощью bluetooth модуля HC-05.

Как связать микроконтроллер AVR c планшетом на Android, с помощью bluetooth модуля HC-05.

В конце прошлой статьи писал о том, что получилось создать интерфейс для Android и в этой статье попробую описать этот процесс. Почему попробую, потому что опыта в создании приложений под Android у меня практически нет и на самом деле, мало что смогу доступно объяснить. Ну всё довольно отмазываться пора переходить к делу.

Для начала качаем и устанавливаем Android Studio, о том как это сделать в интернете достаточно материала. После того как среда разработки установлена, создаём новый проект согласно скриншотам.
Как связать микроконтроллер AVR c планшетом на Android, с помощью bluetooth модуля HC-05.

Как связать микроконтроллер AVR c планшетом на Android, с помощью bluetooth модуля HC-05.

Как связать микроконтроллер AVR c планшетом на Android, с помощью bluetooth модуля HC-05.

Как связать микроконтроллер AVR c планшетом на Android, с помощью bluetooth модуля HC-05.


После того как проект создан, первым делом изменяем AndroidManifest, добавив в него две строчки, запрашивающие разрешение.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="domain.my.bluetooth_interface_example" >

     //запрашиваем разрешения, необходимые для работы приложения
     //BLUETOOTH_ADMIN необходим, когда требуется изменить какие-то свойства адаптера
    <uses-permission android:name="android.permission.BLUETOOTH"/>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MyActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Далее, в activity_my создаём несколько кнопок, присваиваем им id и назначаем методы, которые будут вызываться при нажатии.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context=".MyActivity">

    <Button
        android:layout_width="165dp"
        android:layout_height="wrap_content"
        android:text="increase_diametr"
        android:id="@+id/increase_diametr_bt"
        android:onclick="onclick"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="25dp" />

    <Button
        android:layout_width="160dp"
        android:layout_height="wrap_content"
        android:text="back"
        android:id="@+id/back_bt"
        android:onclick="onclick"
        android:layout_below="@+id/increase_diametr_bt"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginLeft="33dp"
        android:layout_marginTop="97dp" />

    <Button
        android:layout_width="160dp"
        android:layout_height="wrap_content"
        android:text="forward"
        android:id="@+id/forward_bt"
        android:onclick="onclick"
        android:layout_alignTop="@+id/back_bt"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:layout_marginRight="43dp" />

    <Button
        android:layout_width="160dp"
        android:layout_height="wrap_content"
        android:text="reduce_diametr"
        android:id="@+id/reduce_diametr_bt"
        android:onclick="onclick"
        android:layout_below="@+id/back_bt"
        android:layout_alignRight="@+id/increase_diametr_bt"
        android:layout_alignEnd="@+id/increase_diametr_bt"
        android:layout_marginTop="91dp" />

    <Button
        android:layout_width="165dp"
        android:layout_height="wrap_content"
        android:text="Connect"
        android:id="@+id/connect_bt"
        android:onclick="сonnect"
        android:layout_below="@+id/reduce_diametr_bt"
        android:layout_alignLeft="@+id/back_bt"
        android:layout_alignStart="@+id/back_bt"
        android:layout_marginTop="103dp"
        android:background="#ff59ffd1"
        android:layout_alignParentStart="false" />
</RelativeLayout>

Вот как это выглядит на экране.
Как связать микроконтроллер AVR c планшетом на Android, с помощью bluetooth модуля HC-05.

Кнопки можно назвать как угодно.

Осталось самое интересное — научиться устанавливать соединение по bluetooth и обрабатывать нажатие кнопок.

package domain.my.bluetooth_interface_example;

import java.io.OutputStream;
import java.lang.reflect.Method;

import android.util.Log;
import android.content.Intent;

import android.view.View;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.os.Bundle;
import android.widget.Toast;



public class MyActivity extends Activity  {

    BluetoothSocket clientSocket;

    //этот метод вызывается при создании или перезапуске приложения
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);
    }


    public void сonnect(View v)
    {
        String enableBT = BluetoothAdapter.ACTION_REQUEST_ENABLE;
        startActivityForResult(new Intent(enableBT), 0);
        BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

        boolean connection = true;

        try
        {
            // 10:14:05:26:01:66 - адрес модуля его можно посмотреть в настройках подключения при соединении к ПК
            BluetoothDevice device = bluetoothAdapter.getRemoteDevice("10:14:05:26:01:66");

            //инициируем соединение с устройством
            Method m = device.getClass().getMethod(
                    "createRfcommSocket", new Class[]{int.class});

            clientSocket = (BluetoothSocket) m.invoke(device, 1);
            clientSocket.connect();


        }

        catch (Exception e)
        {
            //оштбки выводим в лог
            Log.d("BLUETOOTH", e.getMessage());
            //выводим сообщение что не удалось установить соединение
            Toast.makeText(getApplicationContext(), "failed_to_connect", Toast.LENGTH_LONG).show();
            connection = false;
        }
        if (connection) {
            //выводим сообщение об успешном подключении
            Toast.makeText(getApplicationContext(), "CONNECTED", Toast.LENGTH_LONG).show();
        }
    }

    public void onclick(View v) {

        byte value = 0;
        //пытаемся послать данные
        try
        {
            //получаем выходной поток для передачи данных
            OutputStream outStream = clientSocket.getOutputStream();
            //проверяем какая кнопка была нажата
            switch (v.getId())
            {
                case R.id.forward_bt:             value = 's'; break;
                case R.id.back_bt:                value = 'w'; break;
                case R.id.increase_diametr_bt:    value = 'r'; break;
                case R.id.reduce_diametr_bt:      value = 'f'; break;
            }

            //пишем данные в выходной поток
            outStream.write(value);
        }
        catch (Exception e)
        {
            //если есть ошибки, выводим их в лог
            Log.d("BLUETOOTH", e.getMessage());
            //и выводим сообщение, что соединение не установлено
            Toast.makeText(getApplicationContext(), "not_connected", Toast.LENGTH_LONG).show();
        }
    }
}

В начале прошлой статьи писал о том, что когда покупал bluetooth модуль еще не знал куда его применить, но точно знал, что такая вещь в хозяйстве пригодиться. Прошло чуть времени и применение ему нашлось... В общем, есть у меня один проект, в котором МК управляет шаговыми двигателями, находиться всё это добро на балконе. Зимой на балконе холодно и неинтересно, поэтому отлаживать его удобнее из теплой комнаты, вот для этих целей и применил данный модуль.

Код для Atmega16, позволяющий принимать символы с планшета был взят из прошлой статьи.
Проект для Android Studio оставлю в архиве Bluetooth_Interface_Example.rar [357,77 Kb] (cкачиваний: 35).
комментарии
0