Как подключить Arduino Uno к телефону Android через USB-кабель?

Можно ли настроить связь между Arduino Uno и телефоном Android с помощью провода, который напрямую соединяет телефон Android и Arduino?


2
$ begingroup $

Хотя ваш вопрос лучше подходит для сайта Arduino StackExchange, я все же попытаюсь ответить на него . Ниже приведен метод, который я использовал в прошлом, однако, очевидно, есть несколько способов снять шкуру с кошки … Например, тот же вопрос был задан несколько лет назад на EE.SE, Подключите устройство Android к Arduino Uno через USB.

Ответ на ваш вопрос можно найти здесь: Android USB host + Arduino: Как общаться без рутирования нашего планшета или телефона Android. Однако есть некоторые предварительные условия для устройства Android, которое вы собираетесь использовать:

Вам потребуется устройство Android, которое также поддерживает режим хоста USB. в качестве API хоста USB . Для большинства планшетов с Android 3.1+ будет достаточно (для некоторых может потребоваться адаптер USB OTG). Кроме того, в Galaxy Nexus включен режим хоста и он соответствует требованиям (однако вам понадобится адаптер USB OTG).

Я процитирую информацию с приведенной выше страницы в случае смерти ссылки.

Этот пример состоит из двух частей:

  • Приложение Android, которое использует API USB.

Простое приложение для Android, которое позволяет вам регулировать яркость светодиода на Arduino с помощью ползунка. Он также имеет кнопку для «перечисления» USB-устройства.

  • Прошивка для Arduino, которая выполняет некоторый последовательный ввод-вывод с приложением Android

Очень простая прошивка для Ардуино. При получении нового байта генерируется прерывание. Полученные данные контролируют яркость встроенного светодиода Arduino. (реализовано с помощью программного обеспечения pwm в стиле usleep в основном цикле).

Код Arduino:

  int main (void)  {//инициализация initIO ();  uart_init ();  sei ();  uint8_t я = 0;  непостоянная пауза uint8_t;  for (;;) {//это основной цикл pause = data;  PORTB | = (1  

Процедура прерывания Arduino:

  ISR (USART_RX_vect) {//внимание к имени и аргументу здесь, выиграла  в противном случае не работает data = UDR0;//необходимо прочитать UDR0}  

Исходный код Android доступен здесь: UsbController.tar.gz *.

  • Возможно, вам потребуется изменить значение PID в UsbControllerActivity.java в строке 38, если у вас Arduino Uno Rev3 или выше. Вы можете проверить значение VID/PID с помощью lsusb после подключения Arduino к вашему компьютеру..

Большая часть кода довольно стандартна, однако стоит обратить внимание на следующий класс UsbRunnable :

  частный класс UsbRunnable реализует Runnable {private final UsbDevice mDevice;  UsbRunnable (UsbDevice dev) {mDevice = dev;  } @Override public void run () {//здесь реализована основная функциональность USB UsbDeviceConnection conn = mUsbManager.openDevice (mDevice);  если (! conn.claimInterface (mDevice.getInterface (1), true)) {return;  }//Настройка последовательного USB-преобразователя Arduino conn.controlTransfer (0x21, 34, 0, 0, null, 0, 0);  conn.controlTransfer (0x21, 32, 0, 0, новый байт [] {(байт) 0x80, 0x25, 0x00, 0x00, 0x00, 0x00, 0x08}, 7, 0);  UsbEndpoint epIN = ноль;  UsbEndpoint epOUT = ноль;  UsbInterface usbIf = mDevice.getInterface (1);  for (int i = 0; i  

После того, как интерфейс USB был заявлен, последовательный преобразователь USB Arduino инициализируется путем выполнения следующих управляющих передач:

  conn.controlTransfer (0x21, 34, 0, 0, null, 0, 0); conn.controlTransfer (0x21, 32, 0, 0, новый байт [] {(byte) 0x80, 0x25,  0x00, 0x00, 0x00, 0x00, 0x08}, 7, 0);  

Первый вызов устанавливает состояние линии управления, второй вызов устанавливает кодировку строки (9600, 8N1) . Для связи используется дополнительный поток для отправки данных, не блокируя основной поток пользовательского интерфейса Activity. При уведомлении sSendLock UsbController данные будут переданы. После отправки поток снова перейдет в режим ожидания. Таким образом, даже если отправка занимает больше времени, чем ожидалось, основной поток действия не будет заблокирован, и, следовательно, приложение не перестанет отвечать.

Улучшите этот ответ
отредактировано 13 апреля ’17 в 12:50
Сообщество ♦
1
ответил 19 окт. в 15:13

$ endgroup $

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

Хотя ваш вопрос лучше подходит для Arduino StackExchange сайта, я попытаюсь ответить на него, тем не менее. Ниже приведен метод, который я использовал в прошлом, однако, очевидно, что существует более одного способа снять шкуру с кошки … Например, один и тот же вопрос задавали несколько лет назад на EE.SE, подключите устройство Android к Arduino Uno через USB.

Ответ на ваш вопрос можно найти здесь: USB-хост Android + Arduino: Как общаться без рутирования нашего планшета или телефона Android . Однако есть некоторые предварительные условия для устройства Android, которое вы собираетесь использовать:

Вам потребуется устройство Android, поддерживающее режим USB-хоста в качестве а также API-интерфейс USB-хоста . Для большинства планшетов с Android 3.1+ будет достаточно (для некоторых может потребоваться адаптер USB OTG). Кроме того, в Galaxy Nexus есть режим хоста ena bled и соответствует требованиям (однако вам понадобится адаптер USB OTG).

Я процитирую информацию с указанной выше страницы в случае смерти ссылки.

Этот пример состоит из двух частей:

  • Приложение Android, использующее USB API

Простое приложение для Android, которое позволяет вам регулировать яркость светодиода на Arduino с помощью ползунка. Он также имеет кнопку для «перечисления» USB-устройства.

  • Прошивка для Arduino, которая выполняет некоторый последовательный ввод-вывод с приложением Android

Очень простая прошивка для Ардуино. При получении нового байта генерируется прерывание. Полученные данные контролируют яркость встроенного светодиода Arduino. (реализовано с помощью программного обеспечения pwm в стиле usleep в основном цикле).

Код Arduino:

  int main (void)  {//инициализация initIO ();  uart_init ();  sei ();  uint8_t я = 0;  непостоянная пауза uint8_t;  for (;;) {//это основной цикл pause = data;  PORTB | = (1  

Процедура прерывания Arduino:

  ISR (USART_RX_vect) {//внимание к имени и аргументу здесь, выиграла  в противном случае не работает data = UDR0;//необходимо прочитать UDR0}  

Исходный код Android доступен здесь: UsbController.tar.gz *.

  • Возможно, вам потребуется изменить значение PID в UsbControllerActivity.java в строке 38, если у вас Arduino Uno Rev3 или выше. Вы можете проверить значение VID/PID с помощью lsusb после подключения Arduino к вашему компьютеру..

Большая часть кода довольно стандартна, однако стоит обратить внимание на следующий класс UsbRunnable :

  частный класс UsbRunnable реализует Runnable {private final UsbDevice mDevice;  UsbRunnable (UsbDevice dev) {mDevice = dev;  } @Override public void run () {//здесь реализована основная функциональность USB UsbDeviceConnection conn = mUsbManager.openDevice (mDevice);  если (! conn.claimInterface (mDevice.getInterface (1), true)) {return;  }//Настройка последовательного USB-преобразователя Arduino conn.controlTransfer (0x21, 34, 0, 0, null, 0, 0);  conn.controlTransfer (0x21, 32, 0, 0, новый байт [] {(байт) 0x80, 0x25, 0x00, 0x00, 0x00, 0x00, 0x08}, 7, 0);  UsbEndpoint epIN = ноль;  UsbEndpoint epOUT = ноль;  UsbInterface usbIf = mDevice.getInterface (1);  for (int i = 0; i  

После того, как интерфейс USB был заявлен, последовательный преобразователь USB Arduino инициализируется путем выполнения следующих управляющих передач:

  conn.controlTransfer (0x21, 34, 0, 0, null, 0, 0); conn.controlTransfer (0x21, 32, 0, 0, новый байт [] {(byte) 0x80, 0x25,  0x00, 0x00, 0x00, 0x00, 0x08}, 7, 0);  

Первый вызов устанавливает состояние линии управления, второй вызов устанавливает кодировку строки (9600, 8N1) . Для связи используется дополнительный поток для отправки данных, не блокируя основной поток пользовательского интерфейса Activity. При уведомлении sSendLock UsbController данные будут переданы. После отправки поток снова перейдет в режим ожидания. Таким образом, даже если отправка занимает больше времени, чем ожидалось, основной поток действия не будет заблокирован, и, следовательно, приложение не перестанет отвечать.



Общайтесь со своим Arduino через Android

Проект, 16 октября 2015 г., Харихаран Матаван

Хотите отправить текст на Arduino с помощью смартфона Android? Вот как! В этой статье будет показано, как Arduino (или почти любой другой микроконтроллер) может «разговаривать» с вашим смартфоном, отправляя и получая текст в обоих направлениях.

Хотите отправить текст со своего телефона Android на Arduino? Вот как!

Требования/Спецификация

  • Телефон Android, который поддерживает режим USB-хоста (то есть, поддержка OTG) — большинство устройств под управлением Android 3. 1+ поддерживают это. Убедитесь, что ваш телефон использует приложение USB Host Diagnostics из Play Store.
  • Arduino — подойдет любая версия. Я буду использовать Uno R3.
  • USB-кабель Arduino.
  • USB-OTG-кабель — он понадобится вам для подключения USB-кабеля Arduino к порту micro-USB на смартфоне. На Amazon это стоит около 5 долларов.
  • Android Studio — вам потребуется установить и настроить. Сделать это довольно просто. Android Studio упрощает разработку приложений с помощью прогнозов и генерации кода. Это одна из лучших IDE. Вы также можете следовать этой статье, чтобы установить Android Studio на свой компьютер.

Основные компоненты приложения для Android

В одном Приложение для Android:

  • MainActivity.java
    Здесь идет код Java. Он контролирует работу приложения.
  • activity_main.xml
    Содержит макет приложения, то есть компоненты или кнопки, подобные виджетам, TextViews и т. д.
  • AndroidManifest.xml
    Здесь вы определяете, когда приложение должно запускаться, какие разрешения ему необходимы и какое оборудование необходимо доступ.

Также существует множество других файлов, но все они связаны между собой с помощью этих трех.

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

Макет

Мы будем использовать один и тот же макет как для приложения USB, так и для приложения Bluetooth. Это простой виджет с минимально необходимыми виджетами для проверки соединения между устройствами.

Как видите, у него есть виджет EditText для ввода данных от пользователя, кнопки для запуска соединения, передачи данные, завершите соединение и очистите TextView. Полученные данные отображаются в TextView (пустая часть под кнопками).

Вот часть XML. Поскольку код кнопок похож, я оставил их здесь. Получите полный код в конце этой статьи.

  & ltRelativeLayout 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: paddingBottmargin = "@ dimen_account_bottom =" @ dimenical_d действия_  инструменты: context = ". MainActivity "& gt & ltEditText android: layout_width =" wrap_content "android: layout_height =" wrap_content "android: id =" @ + id/editText "android: layout_alignParentTop =" true "android: layout_alignParentRight =" true "android: layout_alignParentEnd =" true "android: layout_alignParentEnd =" true "  android: layout_alignParentLeft = "true" android: layout_alignParentStart = "true"/& gt & ltButton android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: text = "Begin" android: id = "@ + id/buttonStart" android  : layout_below = "@ + id/editText" android: layout_alignParentLeft = "true" android: layout_alignParentStart = "true" android: onClick = "onClickStart"/& gt & ltTextView android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: layout_height = "wrap_content"  id = "@ + id/textView" android: layout_below = "@ + id/buttonSend" android: layout_alignParentLeft = "true" android: layout_alignParentStart = "true" android: layout_alignRight = "@ + id/editText" android: layout_alignEnd = "  @ + id/editText "android: layout_alignParentBottom =" true "/& gt & lt/RelativeLayout & gt  

Я использовал здесь RelativeLayout, что означает, что каждый виджет упорядочен относительно виджетов вокруг него. Макет можно легко воссоздать с помощью вкладки «Дизайн», где вы можете перетаскивать виджеты в любое место. При нажатии кнопки нам нужно будет описать, что должно произойти. Для этого используется метод OnClick. Укажите имя метода в XML-коде кнопки. Для этого добавьте строку:

android:onClick="onClickMethod"

Теперь наведите указатель мыши на эту строку, и появится предупреждение всплывающее окно слева выглядит следующим образом:

Нажмите «Создать» OnClick … «. Это автоматически добавит код для метода onClick в MainActivity.java. Вам нужно будет сделать это для каждой кнопки.

Библиотека последовательного порта USB

Настройка последовательного соединения в Android является довольно сложной задачей, потому что для этого вам потребуется вручную настраивать множество вещей, поэтому я искал некоторые библиотеки, которые делают все это автоматически. Я протестировал несколько из них и, наконец, остановился на библиотеке UsbSerial от пользователя Github felHR85. Среди всех найденных мною соответствующих библиотек это была единственная, которая все еще обновляется. Его довольно легко настроить и использовать. Чтобы добавить эту библиотеку в свой проект, загрузите последний файл JAR с Github. Переместите его в папку libs в каталоге вашего проекта. Затем в проводнике файлов Android Studio щелкните правой кнопкой мыши JAR и выберите «Добавить как библиотеку». Вот и все!

Ход программы

Это краткое описание того, как мы будем действовать. У каждого действия есть метод onCreate (), который запускается при создании действия.. Любой код, который вы хотите запустить в начале, должен быть помещен внутрь него. Обратите внимание, что чтение с устройства является асинхронным, то есть оно будет продолжать работать в фоновом режиме. Это сделано для того, чтобы данные были получены как можно скорее.

Открытие соединения

Прежде всего, давайте определим метод onClick для кнопки Begin. При нажатии он должен искать все подключенные устройства, а затем проверять, совпадает ли идентификатор поставщика Arduino с идентификатором подключенного устройства. В случае обнаружения необходимо запросить разрешение у пользователя. Каждое ведомое USB-устройство имеет идентификатор производителя и продукта, по которым можно определить, какие драйверы для него следует использовать. Идентификатор поставщика для любого Arduino — 0x2341 или 9025.

  public void onClickStart (View view) {HashMap  usbDevices = usbManager.getDeviceList ();  если (! usbDevices.isEmpty ()) {логическое значение keep = true;  для (Map.Entry  запись: usbDevices.entrySet ()) {device = entry.getValue ();  int deviceVID = device.getVendorId ();  if (deviceVID == 0x2341)//ID поставщика Arduino {PendingIntent pi = PendingIntent.getBroadcast (this, 0, новое намерение (ACTION_USB_PERMISSION), 0);  usbManager.requestPermission (устройство, число пи);  keep = false;  } else {соединение = ноль;  device = null;  } if (! keep) break;  }}}  

Теперь давайте определим BroadcastReceiver для приема широковещательной рассылки с запросом разрешения пользователя, а также для автоматического запуска соединения при подключении устройства и закрытия соединения, когда он отключен.

  private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver () {//Широковещательный приемник для автоматического запуска и остановки последовательного соединения.  @Override public void onReceive (Контекст контекста, намерение намерения) {if (intent.getAction (). Equals (ACTION_USB_PERMISSION)) {логическое предоставленное = intent.getExtras (). GetBoolean (UsbManager.EXTRA_PERMISSION_GRANTED);  если (предоставлено) {соединение = usbManager.openDevice (устройство);  serialPort = UsbSerialDevice.createUsbSerialDevice (устройство, соединение);  if (serialPort! = null) {if (serialPort.open ()) {//Устанавливаем параметры последовательного соединения.  setUiEnabled (правда); //Включение кнопок в пользовательском интерфейсе serialPort.setBaudRate (9600);  serialPort.setDataBits (UsbSerialInterface.DATA_BITS_8);  serialPort.setStopBits (UsbSerialInterface.STOP_BITS_1);  serialPort.setParity (UsbSerialInterface.PARITY_NONE);  serialPort.setFlowControl (UsbSerialInterface.FLOW_CONTROL_OFF);  serialPort.read (mCallback); //tvAppend (textView, «Последовательное соединение открыто!  n»);  } else {Log.d ("СЕРИЙНЫЙ", "ПОРТ НЕ ОТКРЫТ");  }} else {Log.d ("ПОСЛЕДОВАТЕЛЬНЫЙ", "ПОРТ НУЛЬ");  }} else {Log.d ("СЕРИЙНЫЙ", "РАЗРЕШЕНИЕ НЕ ПРЕДОСТАВЛЕНО");  }} иначе, если (intent.getAction (). equals (UsbManager.ACTION_USB_DEVICE_ATTACHED)) {onClickStart (startButton);  } else if (intent.getAction (). equals (UsbManager. ACTION_USB_DEVICE_DETACHED)) {onClickStop (stopButton);  }};  };  

Если выполняется первое условие IF и если пользователь предоставил разрешение, инициируйте соединение для устройства, идентификатор поставщика которого соответствует нашему требуемому идентификатору поставщика. Кроме того, если получено широковещательное сообщение о подключении или отключении устройства, вручную вызовите методы onClick для кнопок Start и Stop.

SerialPort определяется с использованием устройства в качестве подключения в качестве аргументов. Если это успешно, откройте SerialPort и установите соответствующие параметры. Для Uno параметры по умолчанию: 8 бит данных, 1 стоповый бит, без бита четности и управление потоком выключено. Скорость передачи может быть 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600 или 115200, но оставим стандартную 9600.

Получение данных с устройства

В приведенном выше фрагменте кода обратите внимание на строку с надписью serialPort.read (mCallback). Здесь ссылка на обратный вызов передается функции чтения, чтобы она автоматически запускалась при обнаружении любых входящих данных.

  UsbSerialInterface.UsbReadCallback mCallback = new UsbSerialInterface.UsbReadCallback () {//Определение обратного вызова, который срабатывает при чтении данных.  @Override public void onReceivedData (byte [] arg0) {String data = null;  попробуйте {data = new String (arg0, "UTF-8");  data.concat ("/n");  tvAppend (текстовый просмотр, данные);  } catch (UnsupportedEncodingException e) {e.printStackTrace ();  }}};  

Полученные данные будут в виде необработанных байтов. Придется перекодировать его в читаемый формат, например UTF-8. Затем он добавляется к TextView с помощью специального метода с именем tvAppend (). Это сделано потому, что любое изменение пользовательского интерфейса может произойти только в потоке пользовательского интерфейса. Поскольку этот обратный вызов будет выполняться как фоновый поток, он не может напрямую влиять на пользовательский интерфейс.

private void tvAppend (TextView tv, CharSequence text) {final TextView ftv = tv; final CharSequence ftext = text; runOnUiThread (new Runnable () {@Override public void run () {ftv.append (ftext);}}); }

Отправка данных на устройство

Отправка данных относительно проста по сравнению с чтением данных с устройства. Это простой вызов функции с байтами данных, которые необходимо отправить в качестве аргумента. Это будет определено в методе OnClick кнопки «Отправить».

serialPort.write (string.getBytes ());

Закрытие соединения

Чтобы закрыть соединение, просто закройте SerialPort.

serialPort.close ();

Манифест приложения

В манифесте укажите, какие дополнительные разрешения могут потребоваться приложению. Единственное, что нужно, — это разрешение сделать телефон USB-хостом. Добавьте в манифест следующее:

Приложение можно настроить на запускается автоматически, добавляя IntentFilter в MainActivity. Этот IntentFilter будет срабатывать при подключении любого нового устройства. Тип устройства можно явно указать, указав идентификатор поставщика и/или идентификатор продукта в XML-файле.

  & lt? Xml version = "1.0" encoding = "utf-"  8 "? & Gt & ltactivity android: name =". MainActivity "android: label =" @ string/app_name "& gt & ltintent-filter & gt & ltaction android: name =" android.intent.action.MAIN "/& gt & ltcategory android: name =" android  .intent.category.LAUNCHER "/& gt & lt/intent-filter & gt & ltintent-filter & gt & ltaction android: name =" android.hardware.usb.action.USB_DEVICE_ATTACHED "/& gt & lt/intent-filter & gt & ltmeta-android data: name ="  hardware.usb.action.USB_DEVICE_ATTACHED "android: resource =" @ xml/device_filter "/& gt & lt/activity & gt  

Обратите внимание на строку» android: resource = «@ xml/device_filter» Это сообщает компилятору, что он может найти свойства устройства в файле с именем device_filter в src/main/res/xml, поэтому создайте папку с именем «xml» в src/main/res и поместите в нее следующее:

  & ltresources & gt & ltusb-device vendor-id = "9025"/& gt & lt! -  - Идентификатор производителя Arduino - & gt & lt/resources & gt  

Тестирование приложения

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

  void setup () {Serial.begin (9600);  } void loop () {char c;  если (Serial.available ()) {c = Serial.read ();  Serial.print (c);  }}  

Теперь подключите Arduino к порту microUSB с помощью кабеля OTG. Приложение должно запускаться автоматически. Попробуйте отправить текст, и те же данные будут повторены!

Теперь у вас должна быть возможность общаться с вашим Arduino через Android!

Эта статья помогла показать, как Arduino может общаться с вашим смартфоном. Использование этого безгранично! В случае, если необходимы данные с любого датчика и если они недоступны на борту смартфона, любой микроконтроллер можно использовать для считывания с этого датчика и передачи данных на телефон. В следующей части статьи будет показано, как подключиться с помощью популярного модуля Bluetooth HC05.

Следующая статья из серии: Управление Arduino с помощью Bluetooth

ArduinoUSB.zip

Попробуйте этот проект сами! Получить спецификацию.

Связанное содержимое

  • Power Integrations представляет новое семейство бесщеточных ИС для приводов двигателей постоянного тока
  • Проект Raspberry Pi: управление вентилятором постоянного тока
  • Смачиваемые боковыми сторонами боковые поверхности включают AOI на бессвинцовых пакетах SMD (DFN)
  • Основы полупроводников: материалы и устройства

Подробнее о:

  • android
  • arduino
  • Последовательная связь
  • usb
  • otg
  • Последовательный Устройство
  • serial io
  • Поделиться
Оцените статью
logicle.ru
Добавить комментарий