Подписаться на получение новых статей на почту:

V-USB. AVR and Android. USB-OTG. Шаг №76

Всем привет. Итак друзья наконец то мы добрались до практической части соединения микроконтроллера avr (atmega8) c ОС Android, где первый использует протокол V-USB, второй – USB-OTG. Немного вспомним, что похожую операцию мы проделали в статье №74, за исключением того что в роли хоста выступала ОС  Windows.

В прошлой статье мы с Вами познакомились с ОС Android и чуть ранее с USB-OTG (статья №72). Перед тем как начнем рассматривать код и подключение, хочется немного написать о том что с USB-OTG не все так просто в Android устройствах. Я был очень удивлен что телефон 2017 года не поддерживает данный режим. Не Host, не OTG. И никакое «рутирование», добавление ситемных файлов и другое “колдовство” не поможет если данный режим «выпилен из ядра». Только сборка кастомного ядра при поддержке на уровне железа. Поэтому будьте внимательны. Программа для AVR используется та же. Рассмотрим программу на java и скомпилируем Android–приложение. В этой записи познакомимся с классами устройств USB описанными в пакете android.hardware.usb с которыми мы будем работать. (более подробно по ссылке https://developer.android.com/reference/android/hardware/usb/package-summary.html). Сделаем небольшой проект либо в Eclipse (если ранняя версия ОС до 4.2) либо Android Studio (охватывает все версии).

Создаем приложение. Выбираем минимальную версию API 12. На форму приложения бросаем элементы кнопку button и TextView.

1

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   tools:context="com.example.list6.MainActivity">
   <TextView
        android:id="@+id/txt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintHorizontal_bias="0.331"
        app:layout_constraintVertical_bias="0.431" />
   <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="btnClick"
        android:text="Button1"
        tools:layout_editor_absoluteX="507dp"
        tools:layout_editor_absoluteY="787dp" />
</android.support.constraint.ConstraintLayout>

Также в проекте можно создать фильтр (создаем в директории проекта res папку xml где и располагаем файл фильтрации), который будет содержать параметры описания устройств, например VID, PID и др. Мы фильтр создавать не будем, увидим наше устройство в списке по VID and PID. В этом случае фильтрация подойдет под любое устройство USB.

Добавим в AndroidManifest.xml секцию < uses-feature android:name="android.hardware.usb.host" />, которая отвечает за использование в программе возможностей хоста USB. Немного забегая на перед, такой же файл с расширением xml, должен содержаться в системных файлах устройства.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.example.list6" >
     <uses-feature android:name="android.hardware.usb.host" />
     <application android:allowBackup="true"
           android:icon="@mipmap/ic_launcher"
           android:label="@string/app_name"
           android:roundIcon="@mipmap/ic_launcher_round"
           android:supportsRtl="true"
           android:theme="@style/AppTheme" >
           <activity android:name="com.example.list6.MainActivity" >
               <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
              </intent-filter>
           </activity>
      </application>
</manifest>

И последний файл MainActivity.java.

package com.example.list6;
import android.app.Activity;
import android.content.Context;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;import android.text.Layout;
import android.text.method.ScrollingMovementMethod;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.util.HashMap;
import java.util.Iterator;
public class MainActivity extends Activity {
    TextView console;
    Button btn;
    UsbManager mUsbManager;
    /*Метод onCreate вызывается при создании или перезапуска активности*/
    protected void onCreate(Bundle savedInstanceState) {
        /*Метод вызывается при создании деятельности*/
        super.onCreate(savedInstanceState);
        /*Устанавливает содержимое Activity из layout-файла*/
        setContentView(R.layout.activity_main);
        console = (TextView) findViewById(R.id.txt);
        console.setText("");
        console.setMovementMethod(new ScrollingMovementMethod());
        btn = (Button) findViewById(R.id.button);
    }
    /*Для вывода в TextView создаем процедуру clog, принимающую строку*/
    private void clog(String text)
    {
        if(console != null)
        {
            console.append(text + "\n");
            final Layout layout = console.getLayout();
            if(layout != null)
            {
                int scrollDelta = layout.getLineBottom(console.getLineCount() - 1)
                        - console.getScrollY() - console.getHeight();
                if(scrollDelta > 0)
                    console.scrollBy(0, scrollDelta);
            }
        }
    }
     /*Обработчик клика на кнопке*/
    public void btnClick(View v)
    {
        UsbDevice device;
        boolean nodevices = true;
        /*Получаем доступ к устройству на шине USB. Возвращает UsbManager.*/
        mUsbManager = (UsbManager)getSystemService(Context.USB_SERVICE);
        /*Возвращает список подключенных устройств*/
        HashMap<String, UsbDevice> deviceList = mUsbManager.getDeviceList();
        Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
        while(deviceIterator.hasNext())
        {
             nodevices = false;
             device = deviceIterator.next();
             clog("getDeviceName: " + device.getDeviceName());
             clog("toString: " + device.toString());
        }
        if (nodevices)
        {
             clog("Устройства USB не найдены");
        }
     }
  }

Строим проект. Получаем приложение .apk, устанавливаем на наше устройство, кликаем по кнопке и наблюдаем следующе сообщение “USB устройство не найдено”. Рис. ниже.

android Screenshot_2017-10-28-12-09

Итак используемые классы и их иерархия. В данном коде используем два:

UsbManager –> UsbDevice . Первый класс запускается UsbManager, который получает доступ к необходимому устройству на шине USB (VID and PID), как в примере с Windows. Далее найденное устройство представляется классом UsbDevice. И все. Мы получаем информацию о устройстве и выводим в сообщении.

Теперь перейдем к железу. Мы с Вами уже рассматривали кабель USB-OTG и как его сделать (статья №72). На рисунке ниже я разобрал штекер microUSB и подпаял 4-й вывод к 5-му. Также можно купить готовый кабель.

IMG_20171022_233451

IMG_20171022_233902

IMG_20171028_141812

 

 

 

 

 

Возвращаясь к разговору выше о поддержке OTG, долго я мучал монтажную плату с контроллером. Обмеряя каждую ножку, вывод, проводочек тестером, ломая голову… Рядом стояло ведро, испытывая мое терпение))). Испытав два телефона по полной, установив различные программы, получив права, закинув дополнительные файлы в системные папки, где – то наковыряв характеристики процессора. Как я и писал выше поможет только своя сборка. В общем вспомнил я про планшет.

Impression ImPAD 5114 успешно увидел USB устройства. Ниже на рисунках представлено подключение флешки и микроконтроллера AVR.

Подключение USB-устройства к планшету. Видно что Android – устройство увидело микроконтроллер.

IMG_20171027_135453

Запущенное приложение получило список USB-устройств.

IMG_20171027_135217

Как Вы помните в программе для МК мы прописывали VID and PID, что и увидели в списке.

2

Подключаем флешку.

IMG_20171027_202426

Также получаем ее VID and PID.

Screenshot_2017-10-27-13-48

Как видно в сообщении у нас выводится VID, PID также  class, subclass и protocol которые также используются для фильтрации устройств мы их не задавали.

В этой записи мы с Вами познакомились с основой подключения USB-устройств к Android-устройствам, написали программу на java, которая выводит список подключенных устройств, испытали микроконтроллер AVR в качестве USB-устройства, используя протокол V-USB. В дальнейшим мы с Вами начнем разрабатывать Android — приложение  с различным функционалам для взаимосвязи с различными датчика. В следующей статье мы с Вами познакомимся с архитектурой ARM. На этом на сегодня и остановимся. Всем пока.

Используемый материал:
 — https://developer.android.com/reference/android/hardware/usb/package-summary.html;
- http://microsin.net/programming/android/usb-host.html.

Используемые устройства:
 — fly IQ 440;
 — huawei y6 2;
- Impression ImPAD 5114;
 — USB-device at ATmega8.

Просмотрено 332 раз.

Я на Google+

Добавить комментарий

Ваш e-mail не будет опубликован.

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Subscribe without commenting