DIY: Робоавтомобиль под Arduino с управлением с помощью Android устройств. Пошаговая инструкция по созданию

Добавлено 28 ноября 2016 в 02:00

Хотите послать текстовое сообщение с вашего смартфона с ОС Android на свою плату Arduino? В этой статье написано, как это сделать!

image

Что потребуется

  • смартфон на Android с поддержкой режима USB хоста (т.е. поддержка OTG) – большинство устройств, работающих с Android 3.1 и выше, поддерживают этот режим. Проверьте свой телефон с помощью USB Host Diagnostics App из Play Store;
  • Arduino – любая версия. Я буду использовать Uno R3;
  • USB кабель для Arduino;
  • USB OTG кабель – он необходим вам, чтобы подключить USB кабель Arduino к порту micro-USB телефона;
  • Android Studio – вам необходимо установить его. Это довольно просто сделать. Android Studio делает разработку приложений проще, благодаря своим предположениям и генерации кода. Это одна из лучших IDE. Вы также можете использовать эту статью в качестве руководства по установке Android IDE.

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

В Android приложении есть три основных файла:

MainActivity.java
Здесь находится выполняемый код на Java, который управляет тем, как будет функционировать приложение.
activity_main.xml
Содержит макет приложения, то есть, компоненты: кнопки, компоненты отображения текста и т.д.
AndroidManifest.xml
Здесь вы определяете, когда приложение должно запускаться, в какие права ему нужны, и к какому аппаратному обеспечению ему необходимо получить доступ.

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

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

Макет

image
Макет Android приложения для взаимодействия с Arduino

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

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

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

                

Я использовал здесь RelativeLayout, а это означает, что каждый виджет расположен относительно виджетов вокруг него. Макет может быть легко воссоздан на вкладке Design Tab, где вы можете перетащить виджеты туда, куда хотите. Нам необходимо описать, что будет происходить при нажатии на кнопку. Для этого используется метод onClick. Укажите имя метода в XML коде для кнопки. Для этого добавьте строку:

android:onClick="onClickMethod"

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

Предупреждение в Android Studio

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

Библиотека USB Serial

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

Алгоритм выполнения программы

Алгоритм выполнения Android программы для взаимодействия с Arduino

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

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

Во-первых, давайте определим метод onClick для кнопки Begin. При нажатии необходимо выполнить поиск всех подключенных устройств, а затем проверить, совпадает ли VendorID подключенного устройства (ID поставщика) с VendorID Arduino. Если совпадение найдено, то у пользователя должно быть запрошено разрешение. Каждое ведомое USB устройство имеет ID поставщика (Vendor ID) и ID продукта (Product ID), которые могут быть использованы для определения того, какие драйвера должны использоваться для этого устройства. Vendor ID для любой платы Arduino равен 0x2341 или 9025.

public void onClickStart(View view) {        HashMap usbDevices = usbManager.getDeviceList();      if (!usbDevices.isEmpty()) {          boolean keep = true;          for (Map.Entry entry : usbDevices.entrySet()) {              device = entry.getValue();              int deviceVID = device.getVendorId();              if (deviceVID == 0x2341)   //Arduino Vendor ID              {                  PendingIntent pi = PendingIntent.getBroadcast(this, 0,                   new Intent(ACTION_USB_PERMISSION), 0);                  usbManager.requestPermission(device, pi);                  keep = false;              } else {                  connection = null;                  device = null;              }                if (!keep)                  break;          }      }  }

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

// Приемник широковещательных сообщений для автоматического запуска и закрытия последовательного соединения.  private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {       @Override      public void onReceive(Context context, Intent intent) {          if (intent.getAction().equals(ACTION_USB_PERMISSION)) {              boolean granted =                   intent.getExtras().getBoolean(UsbManager.EXTRA_PERMISSION_GRANTED);              if (granted) {                  connection = usbManager.openDevice(device);                  serialPort = UsbSerialDevice.createUsbSerialDevice(device, connection);                  if (serialPort != null) {                      if (serialPort.open()) { //Установить параметры последовательного соедниения.                          setUiEnabled(true);  //Включить кнопки в UI.                          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,"Serial Connection Opened!n");                        } else {                          Log.d("SERIAL", "PORT NOT OPEN");                      }                  } else {                      Log.d("SERIAL", "PORT IS NULL");                  }              } else {                  Log.d("SERIAL", "PERM NOT GRANTED");              }          } else if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_ATTACHED)) {              onClickStart(startButton);          } else if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_DETACHED)) {              onClickStop(stopButton);          }      };  };

Если первое условие IF выполняется, и если пользователь дал разрешение, то начать соединение с устройством, у которого Vendor ID совпадает с необходимым нам Vendor ID. Кроме того, если принято широковещательное сообщение о подключении или отключении устройства, вручную вызывать методы onClick для кнопок Start и Stop. SerialPort определяется с использованием устройства и соединения в качестве аргументов. В случае успеха открыть SerialPort и установить соответствующие параметры. Значения параметров для Arduino Uno равны: 8 бит данных, 1 стоповый бит, бита четности нет, управление потоком выключено. Скорость передачи данных может быть 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600 или 115200 бит/с, но мы будем использовать стандартные 9600 бит/с.

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

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

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

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

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 кнопки Send.

serialPort.write(string.getBytes());

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

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

serialPort.close();

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

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

 

Приложение можно заставить запускаться автоматически, добавив фильтр интентов в главную активность MainActivity. Этот фильтр интентов будет срабатывать при подключении любого нового устройства. Вид устройства может быть указан явно с помощью ID поставщика (Vendor ID) и/или ID продукта (Product ID) в XML файле.

<?xml version="1.0" encoding="utf-8"    <activity>                                                                                         

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

                

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

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

void setup()    {      Serial.begin(9600);    }      void loop()    {      char c;    if(Serial.available())      {        c = Serial.read();        Serial.print(c);      }    }  

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

Тестирование Android приложения для взаимодействия с Arduino

Заключение

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

Исходный код Android приложения для связи с Arduino через USB

Теги

AndroidArduinoOTGUSBПоследовательная связь

В этот раз я опишу процесс подключения к моему роботу “Ведроид-мобиль” модуля Bluetooth JY-MCU и реализую управление через смартфон на Android.

Ранее я описал процесс сборки мотоплатформы для робота на Arduino,  подключения модуля Motor Shield и работу с ним.

Модернизация Motor Shield

Получилось так, что производители модуля Motor Shield лишили своих покупателей возможности устанавливать поверх своего продукта другой модуль. Видимо им нравится быть сверху или просто зажали нормальную панельку контактов.

Меня этот нюанс совсем не устраивает. Именно поэтому я решил взяться за паяльник и привести Motor Shield к удобному для меня виду.

Аккуратно выдрал родные панельки контактов и выкинул их нафиг.

Установил на их место нормальные.

В таком виде модулем стало пользоваться гораздо удобнее. Теперь я смогу нормально подключить провода от Bluetooth в разъемы, а не припаивать их намертво к контактам на Motor Shield.

Bluetooth модуль JY-MCU для Arduino

Сам Bluetooth модуль JY-MCU довольно миниатюрный. В комплект поставки входит кабель для подключения. Назначение выводов расписано на обратной стороне.

Запитать его можно от источника питания 3,6-6В. Это предоставляет нам возможность подключить его напрямую к Arduino без использования стабилизатора или делителя напряжения.

Код, используемый при подключении к устройству: 1234.

Подключение Bluetooth JY-MCU к Arduino Mega 2560

Подключение довольно простое.

Официальная схема подключения:

  • VCC на JY-MCU подключаем к +5В Arduino
  • GND на JY-MCU подключаем к GND Arduino
  • TXT на JY-MCU подключаем к RX (0) на Arduino
  • RXD на JY-MCU подключаем к TX (1) на Arduino

При таком варианте подключения придется каждый раз отключать питание модуля Bluetooth перед загрузкой скетча. Не забывайте про это.

Меня такой вариант не устраивает, поэтому я решил использовать дискретные порты с поддержкой Serial.

Неофициальная схема подключения:

  • VCC на JY-MCU подключаем к +5В Arduino
  • GND на JY-MCU подключаем к GND Arduino
  • TXT на JY-MCU подключаем к дискретному PIN 50 на Arduino
  • RXD на JY-MCU подключаем к дискретному PIN 51 на Arduino

Вот теперь можно загружать скетчи без отключения питания модуля Bluetooth.

Чтобы закрепить Bluetooth, я решил использовать плату Proto Shield и миниатюрную беспаечную макетную плату. К ней в будущем и буду подключать остальное оборудование, элементы управления и индикации.

Скетч для управления роботом на Arduino по Bluetooth через смартфон на Android

В своём скетче я реализовал следующие функции:

  • Движение вперед
  • Движение назад
  • Разворот влево
  • Разворот вправо
  • Плавный поворот влево при движении вперед
  • Плавный поворот вправо при движении вперед
  • Плавный поворот влево при движении назад
  • Плавный поворот вправо при движении назад
  • Остановка
  • Установка скорости 0%
  • Установка скорости 10%
  • Установка скорости 20%
  • Установка скорости 30%
  • Установка скорости 40%
  • Установка скорости 50%
  • Установка скорости 60%
  • Установка скорости 70%
  • Установка скорости 80%
  • Установка скорости 90%
  • Установка скорости 100%

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

SoftwareSerial BTSerial(50, 51); // RX, TX

Программа Bluetooth RC Car – управление роботом-машинкой со смартфона на Android

В свой смартфон я установил программу Bluetooth RC Car. На мой взгляд  – это лучшая софтинка для управления роботом-машинкой.

Программа позволяет передавать команды при нажатии на кнопки или реагировать на данные с акселерометра в смартфоне, регулировать скорость движения ползунком, включать передние и задние фонари, включать и выключать звуковой сигнал, включать и выключать сигнал “аварийка”.

Для работы программы требуется Android версии 2.3.3 или выше. Размер программы 3 мегабайта.

Список команд:

  • F – вперед
  • B – назад
  • L – влево
  • R – вправо
  • G – прямо и влево
  • I – прямо и вправо
  • H – назад и влево
  • J – назад и вправо
  • S – стоп
  • W – передняя фара включена
  • w – передняя фара выключена
  • U – задняя фара включена
  • u – задняя фара выключена
  • V – звуковой сигнал включен
  • v – звуковой сигнал выключен
  • X – сигнал “аварийка” включен
  • x – сигнал “аварийка” выключен
  • 0 – скорость движения 0%
  • 1 – скорость движения 10%
  • 2 – скорость движения 20%
  • 3 – скорость движения 30%
  • 4 – скорость движения 40%
  • 5 – скорость движения 50%
  • 6 – скорость движения 60%
  • 7 – скорость движения 70%
  • 8 – скорость движения 80%
  • 9 – скорость движения 90%
  • q – скорость движения 100%

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

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

Принцип передачи команд: при нажатии на кнопку в программе, команда передается по Bluetooth один раз, а при отпускании кнопки сразу передается команда S-остановка.

Демонстрация работы

В следующий раз я планирую подключить к роботу ультразвуковой дальномер и реализовать алгоритм объезда препятствий.

Платы Arduino и подобные микроконтроллеры делают творчество более доступным, чем когда либо, пишут MUD. Вне зависимости от целей использования – для автоматизации вашего дома или контроля светодиодных лент, или даже для защиты вашей собственности, эти удивительные маленькие технические устройства являются сердцевиной большинства электронных девайсов формата «сделай сам».

Если вам необходимо дать команду вашему Arduino изменить положение перемычек контакта (например, включить свет), то Arduino потребует от пользователя нажать на физическую кнопку или применить сенсор. Для многих проектов использование силы давления человеческого пальца или аналогичных методов управления устройствами вполне приемлемо, но что необходимо применить, если вам захотелось только собрать схему с возможностью дистанционного доступа?

Данная статья дает краткое описание шести способов соединения вашего устройства на платформе Android с любой совместимой платой Arduino.

1. ArduinoDroid позволяет создавать скетчи

Первое устройство в нашем списке — ArduinoDroid. Это приложение работает через USB On The Go (OTG), соединяющее ваше мобильное устройство с Arduino через USB кабель. Одно из преимуществ USB кабеля – это отсутствие необходимости соединения с интернетом или Bluetooth для функционирования устройства.

Приложение является полнофункциональным IDE, которое предоставляет пользователю возможность написания кода на смартфоне, сделать загрузку ранее написанных скетчей, которые хранятся в Dropbox или Google drive и затем начать процесс компиляции.

Преимущества использования приложения ArduinoDroid очевидны. Наличие под рукой IDE позволяет оперативно вносить изменения в поля, а процесс прикрепления устройства  Android является менее сложным и трудоемким, чем попытки сбалансировать громоздкий ноутбук на руках!

Явный недостаток приложения ArduinoDroid заключается в том, что написание кода на вашем девайсе может быть не очень комфортным занятием, особенно если вы будете использовать для этих целей смартфон. Вместе с тем, это слабое место приложения не является столь ярко выраженным, когда на одной чаше весов – удобство иметь под рукой ультра-портативный способ программирования на вашей плате без необходимости наличия интернет соединения, а на другой чаше весов – не слишком комфортный метод написания кода.

С другой стороны, наличие ArduinoDroid является недорогим способом обучения основам Arduino, поскольку клон платы Arduino и USB On The Go стоят несколько долларов. Для тех, кому редко доступен компьютер, приложение ArduinoDroid является отличной альтернативой!

2. Arduino Bluetooth Controller

Следующая программа в нашем списке – удачно названный Контроллер Arduino  Bluetooth. Это приложение имеет большую значимость относительно триггеров на изменения в загруженных скетчах, и меньшую значимость для программирования Arduino. Контроллер Arduino по Bluetooth посылает данные на вашу плату по Bluetooth, что дает вам возможность послать серийные данные нажатием кнопки. Вам потребуется модуль Bluetooth для вашей платы, хотя модуль HC-06 широко используется и доступен всего лишь за $3.

Заслуживает упоминания тот факт, что программа загружается на английском языке, хотя на картинках Play Store указан итальянский язык!

3. Приложение Blynk для разработки проектов

Приложение Blynk является отличной разработкой для создания проектов. Гибкость и простота приложения обеспечивают интуитивный подход к триггеру событий на вашей плате. Работа с Blynk требует наличия соединения с интернетом, поскольку приложение использует свой собственный сервер. Вы можете использовать либо Wi-Fi, либо мобильные данные для обеспечения доступа к приложению Blynk, и эта возможность отлично подходит для смартфонов.

Одно из самых сильных мест приложения – это вариативность подключений к устройству. При наличии поддержки практически всех разработческих плат, вы можете соединиться с сервером на беспроводной основе, или используя ethernet и даже компьютер через USB. Сервис отлично документирован, а его интуитивное приложение обеспечивает простоту интеграции кастомизированного контроля над вашим проектом. Библиотека Blynk для Arduino IDE следит за всеми коммуникациями.

Если вы предпочитаете включать вашу кофемашину с использованием смартфона до того, как встали с постели рано утром, это приложение, действительно, для вас!

Blynk является не единственным сервисом в этой категории. Стоит обратить внимание и на такой исключительно кастомизированный сервис как Thinger.io и практически безлимитный, хотя и чрезвычайно трудный OpenHAB. Из этих трех сервисов Blynk является самым быстрым при запуске и работе, хотя в долгосрочной перспективе изучение OpenHAB является отличной идеей.

4. Коммуникация с нуля

Описанные выше приложения предполагают использование уже существующих сервисов, которые оказывают вам помощь в обеспечении различных вариантов соединения. Что необходимо предпринять для осуществления полного и тотального контроля над каждым аспектом ваших приложений к устройствам Android? Почему бы вам не решить этот вопрос самостоятельно и с нуля?

Проблема обеспечения контроля над пакетом приложений решается просто через открытие USB связи и взаимообратную передачу серийных данных между приложениями и платой Arduino. Этот вариант обеспечения контроля является одним из лучших для знакомства с Android Studio и созданием приложений в целом.

Следует заметить, что при наличии методов и способов создания приложений для устройств на платформе Android без кода, заслуживает внимание и изучение основ кодирования программного обеспечения на Java.

5. Превратить ваш Arduino в сервер

Альтернативным способом обеспечения коммуникации с вашей платой является превращение ее в крошечный сервер. Ключевое преимущество такой трансформации платы в сервер является появление возможности коммуникации с платами с любого устройства, которое может осуществлять навигацию по IP адресу или отправлять веб-запрос. Это потребует прикрепления Ethernetshield к вашей плате к домашней сети.

Если у вас нет Ethernet shield, то аналогичный эффект может быть достигнут через Wi-Fi shield или через плату, соединенную с Wi-Fi, подобно NodeMCU.

Если код node.js является вашим джемом (jam), есть смысл взглянуть на проект arduino-android github. Еще раз повторим, что приложения для Android разработаны на основе открытого кода, и все, что необходимо сделать вам — это установить сервер node.js на выбранной вами Arduino плате.

6. Инфракрасный контроль

Если вы в поиске универсального инструмента коммуникации с вашим Arduino или вам хотелось бы сыграть роль легендарного секретного агента Макгайвер, то снимите инфракрасный приемник (ИТ) с вашей старой стереоустановки или VHS плеера и используете его для коммуникации с вашей Arduino платой!

Этот способ коммуникации потребует наличия на вашем устройстве Android  инфракрасного бластера. Эта специфичный метод коммуникации доступен для многих приложений, хотя из их числа Mi Remote controller является бесплатным и функционирует со многими другими домашними девайсами.

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

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

На 5 уроке про Умную теплицу на Ардуино, мы создадим свое собственное мобильное приложение для устройств на Андроиде. Для этого мы используем редактор  визуального программирования Android App Invertor 2

Напомним: в предыдущих статьях по Умной теплице (проект «Домашний цветок») «Умная теплица на Arduino- делаем первые шаги» и «Индикация показаний при проектировании Умной теплицы на Ардуино»  и Организация полива, обдува и освещения в Умной теплице на Ардуиномы реализовали функции мониторинга и вывода данных на дисплей и светодиоды, а также функции управления — полив цветка, обдув, освещение нажатием соответствующих кнопок.

В следующей статье про  перенос «функции мониторинга и управления теплицей на телефон или планшет с ОС Android» мы установили связь нашей системы с телефоном (или планшетом) с операционной системой Android по Bluetooth, что позволило нам отправлять данные мониторига данных нашей теплицы на телефон и получать команды управления с телефона. Но для связи теплицы с телефоном мы использовали на телефоне приложение Bluetooth Terminal, что совсем неудобно. Нам нужно полноценное приложение. В этом уроке мы и займемся его созданием. Глубоко внимать в вопросы программирования для операционной системы Android не входит в наши планы, поэтому нам нужна простая и понятная система создания кода для Android, наподобие системы Sctratch для Arduino, которую мы рассматривали на этом уроке – Программируем с Arduino… К счастью подобный визуальный редактор есть. Это онлайн визуальный редактор для визуального программирования для Android App Invertor 2. Страница проекта – http://ai2.appinventor.mit.edu.

Рисунок 1. Страница онлайн-редактора App Invertor 2.

После авторизации (можно использовать профиль google) или регистрации попадаем в свой профиль программы, где можем создать новый проект.

Рисунок 2. Ваш профиль программы. Создание проекта.

Сначала в панети Design создаем интерфейс нашего приложения, перетаскивая на экран необходимые компоненнты. Кроме визуальных компонентов необходимо добавить 3 невизуальных: Bluetooth client из раздела Connectivity; Clock из раздела Sensors (для получения данных из Bluetooth c периодичностью, установленной в Clock); Notifer из UserInterface.

Рисунок 3. Создание интерфейса в Design.

Теперь создаем код. Переходим в раздел Block. Сначала создаем код для инициализации Bluetooth соединения и создания Bluetooth клиента (рисунок 4).

Рисунок 4. Код для инициализации Bluetooth соединения и создания Bluetooth клиента.

Затем код для отправки сообщений при изменениии состояний chexckbox-ов для насоса, вентилятора и лампы (рисунок 5).

Рисунок 5. Код для отправки сообщений при изменениии состояний chexckbox-ов.

И код получения по таймеру сообщений, поступающих по Bluetooth из Arduino (рисунок 6).

Рисунок 6. Код получения по таймеру сообщений, поступающих из Arduino

Создаем app приложение (рисунок 7) и загружаем его на телефон.

Рисунок 7. Генерация app приложения

Листинг 1.

 // подключение библиотеки SoftwareSerial   #include   // подключение библиотеки DHT   #include "DHT.h"   // тип датчика DHT   #define DHTTYPE DHT11    // контакты подключения bluetooth-модуля HC-05   int pinBlRx=17;   int pinBlTx=18;   // контакт подключения входа данных модуля DHT11   int pinDHT11=9;   // контакт подключения аналогового выхода модуля влажности почвы   int pinSoilMoisture=A0;   // контакт подключения аналогового выхода датчика температуры TMP36   int pinTMP36=A1;   // контакт подключения аналогового выхода фоторезистора   int pinPhotoresistor=A2;    // пины светодиодов индикации   #define LED_TEMP 5   #define LED_MOISTURE 6   #define LED_LIGHT 7    // значения для условий   #define TEMP_DETECT 30   #define MOISTURE_DETECT 500   #define LIGHT_DETECT 250    // реле   int pinRelays[]={2,3,4};   // статусы полива, освещения, вентилятора   boolean statusRelays[]={false,false,false};    // создание экземпляра объекта SoftwareSerial   SoftwareSerial HC05Serial(pinBlRx,pinBlTx);   // создание экземпляра объекта DHT   DHT dht(pinDHT11, DHTTYPE);    unsigned long millisupdate=0;   // для получения данных из SoftwareSerial   String inputString0 = "";   // признак конца полученной строки   boolean stringComplete0 = false;    void setup()   {   // запуск последовательного порта   Serial.begin(9600);   //   pinMode(LED_TEMP,OUTPUT);digitalWrite(LED_TEMP,LOW);   pinMode(LED_MOISTURE,OUTPUT);digitalWrite(LED_MOISTURE,LOW);   pinMode(LED_LIGHT,OUTPUT);digitalWrite(LED_LIGHT,LOW);   // инициализация dht   dht.begin();   // запуск SoftwareSerial   HC05Serial.begin(9600);   // резервирование 50 bytes для the inputString:   inputString0.reserve(50);    }    void loop()   {   // ожидание конца строки для анализа поступившего запроса:   serialEvent0();   if (stringComplete0)   {   Serial.println(inputString0);   parse_string0(inputString0);   // очистить :   inputString0 = "";   stringComplete0 = false;   }   // каждые 5 сек - получение показаний датчиков   // и вывод на дисплей   if(millis()-millisupdate>5000)   {   millisupdate=millis();   // получение данных с DHT11   float h = dht.readHumidity();   if (isnan(h))   {   Serial.println("Failed to read from DHT");   HC05Serial.println("H1=101");   delay(10);   }   else   {   Serial.print("HumidityDHT11= "); Serial.print(h);Serial.println(" %");   HC05Serial.print("aH=");HC05Serial.print(h);HC05Serial.print("*");   delay(10);   }   // получение значения с аналогового вывода модуля влажности почвы   int val0=analogRead(pinSoilMoisture);   Serial.print("SoilMoisture= "); Serial.println(val0);   HC05Serial.print("SM=");HC05Serial.print(h);HC05Serial.print("*");   delay(10);   // получение значения с аналогового вывода датчика температуры TMP36   int val1=analogRead(pinTMP36);   // перевод в мВ   int mV= val1*1000/1024;   // перевод в градусы цельсия   int t=(mV-500)/10+75;//t=23;   Serial.print("TempTMP36= "); Serial.print(t);Serial.println(" C");   HC05Serial.print("aT=");HC05Serial.print(t);HC05Serial.print("*");   delay(10);   // получение значения с аналогового вывода фоторезистора   int val2=analogRead(pinPhotoresistor);   Serial.print("Light= "); Serial.println(val2);   HC05Serial.print("Ph=");HC05Serial.print(val2);HC05Serial.print("*");   delay(10);   // обновить   // вывод состояние полива, лампы, вентилятора   Serial.print("pump - "); Serial.println(statusRelays[2]);   Serial.print("fun - "); Serial.println(statusRelays[1]);   Serial.print("lamp - "); Serial.println(statusRelays[0]);   HC05Serial.print("PM=");HC05Serial.print(statusRelays[2]);HC05Serial.print("*");   delay(10);   HC05Serial.print("FN=");HC05Serial.print(statusRelays[1]);HC05Serial.print("*");   delay(10);   HC05Serial.print("LM=");HC05Serial.print(statusRelays[0]);   delay(10);   //// проверка условий   // увлажненность почвы   if(val0 > MOISTURE_DETECT)   digitalWrite(LED_MOISTURE,HIGH);   else   digitalWrite(LED_MOISTURE,LOW);   // температура воздуха   if(t > TEMP_DETECT)   digitalWrite(LED_TEMP,HIGH);   else   digitalWrite(LED_TEMP,LOW);   // освещенность   if(val2 < LIGHT_DETECT)   digitalWrite(LED_LIGHT,HIGH);   else   digitalWrite(LED_LIGHT,LOW);   // пауза 5 секунд   Serial.println();   }   }   // SerialEvent для HC05   void serialEvent0() {   while (HC05Serial.available()) {   // получить очередной байт:   char inChar = (char)HC05Serial.read();   // добавить в строку   inputString0 += inChar;   // /n - конец передачи   if (inChar == '#') {   stringComplete0 = true;   }   }   }   // парсинг строки из android   void parse_string0(String inputString)   {   // длина строки   int length1=inputString.length();   if(length1!=5)   {Serial.println("ERROR1"); return;}   if(inputString.charAt(2)!='=')   {Serial.println("ERROR2"); return;}   if(inputString.charAt(4)!='#')   {Serial.println("ERROR3"); return;}   String param1=inputString.substring(0,2);   int param2=inputString.substring(3,4).toInt();   Serial.print("param1=");Serial.println(param1);   Serial.print("param2=");Serial.println(param2);   if(param1=="PM")   doCommand(2,min(param2,1));   else if(param1=="FN")   doCommand(1,min(param2,1));   else if(param1=="LM")   doCommand(0,min(param2,1));   }    // исполнение команды от смартфона   void doCommand(int relay, int status1)   {   // изменить статус   statusRelays[relay]=status1;   // изменить состояние реле   digitalWrite(pinRelays[relay],statusRelays[relay]);   }

Загружаем скетч на Arduino, на телефоне запускаем приложение.

Сегодня наткнулся на проект Arduino+Android: www.amarino-toolkit.net.image Состоит из приложения Amarino для Android и библиотеки MeetAndroid, которую надо подключать к скетчу в Arduino. Пока предполагается, что связь будет устанавливаться с ArduinoBT или с обычным Arduino через bluetooth-шилд, поэтому сами понимаете, насколько сужается диапазон применения проекта. Общий смысл – унификация взаимодействия с подключаемыми к Arduino схемами. В приложении Amarino надо задать события и получаемые от скетча сообщения. В самом скетче надо унаследоваться от класса MeetAndroid ( в свою очередь, он унаследован от класса Print и немного расширяет его функции, работая через Serial ). Дальше пишите callback-функцию опроса устройства и регистрируете ее в экземпляре MeetAndroid. Это дает возможность Amarino асинхронно дергатьопрашивать через Arduino схему и получать данные (в основном, числа). Например:

#include // you can define your own error function to catch messages// where not fuction has been attached for  MeetAndroid meetAndroid(error);  void error(uint8_t flag, uint8_t values){   Serial.print("ERROR: ");   Serial.print(flag); }  int onboardLed = 13;  voidsetup()   {   // use the baud rate your bluetooth module is configured to    // not all baud rates are working well, i.e. ATMEGA168 works best with 57600   Serial.begin(57600);     // register callback functions, which will be called when an associated event occurs.   // - the first parameter is the name of your function (see below)   // - match the second parameter ('A', 'B', 'a', etc...) with the flag on your Android application   meetAndroid.registerFunction(compass, 'F');     pinMode(onboardLed, OUTPUT);   digitalWrite(onboardLed, HIGH); }   voidloop()  {   meetAndroid.receive(); // you need to keep this in your loop() to receive events }   /* * This method is called constantly. * Compass events are sent several times a second. * * note: flag is in this case 'F' and numOfValues is 1  * since compass event sends exactly one single int value for heading */void compass(byte flag, byte numOfValues) {   // we use getInt(), since we know only data between 0 and 360 will be sent   int heading = meetAndroid.getInt();    flushLed(heading); // silly, you should have better ideas }  void flushLed(int time) {   digitalWrite(onboardLed, LOW);   delay(time);   digitalWrite(onboardLed, HIGH); }  

Здесь определяется функция compass, которая получает от Android целое число и зажигает светодиод L на соответствующее ему число миллисекунд. Можно также отправлять непрерывные потоки данных – видимо, для построения графиков. Проект находится в зачаточном состоянии, поддерживает 1.5 и 1.6 версии платформы Android, а вот 2.0 – нет, но она на подходе. Все исходники, естественно, доступны. Думаю, порадует фанов Arduino и Android – я пока что гуглофоном не обзавелся, увы 🙁 А пока – пожелаю ему всяческих успехов!

Оцените статью
Рейтинг автора
5
Материал подготовил
Илья Коршунов
Наш эксперт
Написано статей
134
Citilink-kabinet.ru
Добавить комментарий