Управление Arduino через интернет с помощью ПК — опыт новичка


Вместо вступления

Хочется сразу сказать, что в этой статье я не буду очень сильно углубляться в тонкости программирования, предполагается, что читающий имеет хотя-бы минимальные азы. Расскажу в целом как использовались ресурсы и о интересных моментах. Предпосылки к созданию данного способа у меня возникли во время создания моего электромобиля: Жмяк сюда! Скажу сразу, что создавалось это всё больше из спортивного интереса, нежели для серьёзных практических работ, но тем не менее оно работает и может пригодится кому-либо.

Написание скетча

Данные, которые принимает Bluetooth-модуль, приходят через UART (он же Serial-соединение) на скорости 9600 бит/с. Настраивать Bluetooth-модуль нет никакой необходимости: он сразу готов к работе. Поэтому скетч должен уметь следующее:

Особенности заливки скетча

Для связи Bluetooth-Bee с контроллером используются те же пины (0 и 1), что и для прошивки. Поэтому при программировании контроллера переключатель «SERIAL SELECT» на «Wireless Shield» должен быть установлен в положение «USB», а после прошивки его надо вернуть в положение «MICRO».

На чем строится вся система и как реализовано в железе

Схема работы следующая: с сервера считываем файл, в котором лежат данные с помощью программы, запущенной на ПК/ноутбуке. Эта программа через USB отсылает данные на контроллер. Контроллер принимает данные и по ним выполняет действия. Схема с сервером привлекательна тем, что управлять схемой можно без приложения, просто зайдя на сайт с любого смартфона/планшета/пк/ноутбука в любой точке планеты, где есть доступ к интернету.
PS. Про серверную часть рассказано ниже.

В этой статье я буду управлять Arduino MEGA 2560 (китайским аналогом), но «за кулисами» схема спокойно сработала и с PIC16F877А, единственное что пришлось использовать — переходник USB-TTL:

Понятное дело программа для PIC несколько отличается от программы для Ардуино, ввиду разных типов МК, но принцип один и тот-же:

Принимаем через COM-порт данные, сравниваем их с внутренней таблицей команд и выполняем соответственное действие.

Схема изначально мне показалась очень простой, но было одно НО — небыло программы, которая читала бы файлик в интернете и отсылала данные в COM-порт. Соответственно такую программу пришлось написать.

Программа писалась на VB6. Для чтения файла с сервера используется компонент VB6: Microsoft Internet Transfer Control 6.0. С его помощью просто читается текстовый файл на сервере в строковую переменную. После чтения эта строка отсылается в COM-порт с помощью компонента VB6: Microsoft Comm Control 6.0. Весь процесс чтения файла и отсылания строки читается в цикле с использования таймера. Интервал срабатывания таймера можно менять в конфиге программы, либо прямо во время работы. Кроме этого можно выбрать режим работы порта, его номер, режим работы интернет соединения и ссылку на читаемый файл.

Хочется сделать замечание, что при больших размерах файла и маленьких промежутках программа подвисает, но продолжает работать. Размер буфера моей программы 512 байт. Учитывая, что у моего МК буфер меньше, этого хватает.

Важный момент. Программа в МК не умеет парсить данные, она умеет читать только какой символ был передан на вход через последовательный порт. Без ошибок у меня получилось принимать латиницу (26 символов A-Z и 10 цифр 0-9). Итого 36 команд, если алгоритм доработать и ввести парсинг данных в МК, то передавать можно любые данные. Так же есть возможность «допилинга» ПО для двустороннего обмена данными.

Arduino IDE

Установка

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

    на установщик 1.8.13 для Windows 7 и выше
  • Если у вас Windows XP – качаем версию 1.6.13
  • Во время установки программа попросит установить драйвер – соглашаемся на всё
  • Установка на Linux из системного репозитория – читать тут
  • Установка на MacOS – читать тут
  • КРИТИЧЕСКИ НЕ РЕКОМЕНДУЕТСЯ ставить Arduino Windows app из магазина приложений Windows 10, а также Beta Builds, Hourly Builds и старые версии!

Распаковка портативной

Вместо полной установки программы можно скачать архив с уже “установленной”, на странице загрузки он называется Windows ZIP file. Вот прямая ссылка на 1.8.13. Распаковав архив, получим портативную версию Arduino IDE, которую можно скинуть на флешку и использовать на любом компьютере без установки программы. Но понадобится установить драйвер для китайских плат, а также драйверы из папки с программой Arduino IDE. Возможно понадобится установить Java.

Обновление IDE

Перед установкой новой версии нужно удалить старую. Ни в коем случае не удаляйте папку установленной IDE из Program Files, удалять нужно через “Установка и удаление программ“, либо запустив файл uninstall.exe из папки с установленной программой. Иначе установщик откажется устанавливать новую программу, так как в системе остались следы от старой. Решение этой проблемы описано в видео ниже. Вкратце о том, как удалить IDE вручную:

  • Папка с программой
  • C:\Program Files (x86)\Arduino\ (64-битная версия Windows)
  • C:\Program Files\Arduino\ (32-битная версия Windows)

  • Документы\Arduino\
  • C:\Пользователи (или Users)\Ваш_пользователь\AppData\Local\Arduino15\

Удаляем следы из реестра:

  • Открыть редактор системного реестра:
  • Windows 10: Пуск/regedit
  • Предыдущие: Пуск/Выполнить/regedit

  • В окне поиска пишем arduino\uninstall
  • Поиск

Решение проблем

  • Если перестала запускаться Arduino IDE – удаляем файлик preferences.txt из C:\Пользователи (или Users)\Ваш_пользователь\AppData\Local\Arduino15\

Программное обеспечение

Код HTML. Форма с 2 кнопками, вкл/выкл светодиод на плате: Управление светодиодом Светодиод: Код PHP, здесь мы пишем в файл команду А, если светодиод должен гореть, и В если должен потухнуть: Теперь собственно код для Arduino: int val; // освобождаем память в контроллере для переменой void setup() { Serial.begin(9600); // подключаем последовательный порт pinMode(13, OUTPUT); // объявляем пин 13 как выход } void loop() { // проверяем, поступают ли какие-то команды if (Serial.available()) { val = Serial.read(); // переменная val равна полученной команде if (val == ‘a’) {digitalWrite(13, HIGH);} // при a включаем светодиод if (val == ‘b’) {digitalWrite(13, LOW);} // при b выключаем светодиод }} Сама программа для чтения информации на сервере с пересылкой в COM-порт и её исходный код лежат в архиве по ссылке: Яндекс-Диск Программа скомпилирована в несколько вариантов кода, возможно будут какие-либо различия в работе, но не должно быть. При первом запуске EXEшника генерируется файл справки и конфиг-файл. Данные из этого файла считываются при запуске программы, если он существует. Если файл не существует (например при первом запуске программы), то config-файл создается с дефолтными значениями.

Схема соединения

Подключаем резисторы напрямую к ножкам RGB и контактам Arduino. Используем общий анодный RGB-светодиод, поэтому общий вывод должен быть подключен к 5В. Если вы используете светодиод RGB с общим катодом, вам следует вместо этого подключить общий вывод (который является более длинным) к GND (земля).

Используем цифровые выходы 3, 4 и 5, но вы можете использовать другие контакты, если хотите.

Отправить пример

На следующем рисунке показан пример отправки инструкций из приложения для Android. Он управляет светодиодным переключателем через модуль Bluetooth, и вы можете видеть, что команда может быть отправлена ​​не только через кнопку на интерфейсе приложения, но и через голос. Конкретный контент будет представлен на шагах 1, 2 и 3.


Рисунок 1. Светодиодный индикатор управления приложением Android


Рис. 2. Интерфейс приложения Android.

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

Во фрагменте кода выше обратите внимание на строку, содержащую 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); } }); }

Подготовка к работе

Большинство микроконтроллеров обладают множеством портов ввода-вывода. Для связи с ПК наиболее пригоден из них протокол UART. Это протокол последовательной асинхронной передачи данных. Для его преобразования в интерфейс USB на плате есть конвертор USB-RS232 – FT232RL. Для выполнения примеров их этой статьи вам будет достаточно только Arduino-совместимая плата. Мы используем EduBoard. Убедитесь, что на вашей плате установлен светодиод, подключенный к 13му выводу и есть кнопка для перезагрузки.

Virtuino

Программа для Андроид, предназначенная для мониторинга сенсора. Управляет электро устройствами через Bluetooth, Wi-Fi или Интернет.

При помощи Виртуино создаются:

Приложение способно совмещать несколько проектов в один. Управляет отличными платформами единовременно через Bluetooth и Wi-fi. Бесплатно в использовании. Относится к подкатегории System Maintenance. Есть возможность проектировать внутреннее оформление с разной визуализацией.

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

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

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

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

Выбираем File->New->Project.


Так как мы создаём приложение для android, выбираем Android-> Android Application Project, и нажимаем Next


Следующее диалоговое окно:


Application Name -> пишем имя приложение, Project Name -> пишем имя проекта, Package Name -> Ни чего не пишем он создается автоматически! Minimum Required SDK -> это минимальные требование указываем нашу версию Android у меня 4.1 её я и выбираю. Target SDK -> выбираем вашу версию Android Compile with -> выбираем вашу версию Android Theme: для начала я бы советовал выбрать None. Нажимаем Next. В следующем окне ничего менять не нужно. Просто жмем Next.


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


В следующем необходимо выбрать пункт меню Blank Activity и нажимать Next.


Жмем Finish и через несколько секунд открывается главное окно нашей программы. Выбираем вкладку Activity_main.xml и видим наш редактор:

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

Теперь добавим две кнопки в интерфейс приложения. Выбираем элемент Button и переносим его на форму.


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


Теперь нажмём снизу на AndroudManifest.hml


В этот файл нам нужно будет добавить две строки:

Они будут запрашивать включение Bluetooth при старте приложение, если он будет выключен приложение попросит пользователя его включить. Добавить его нужно сюда:


Далее откроем другой файл: src->com.example(name)


В этом файле и будет наш основной код. Все его содержимое нужно удалить и вставить вот этот код:

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 терминал!!! Ваше приложение готово. Теперь нам нужно проверить, как оно поведёт себя на устройстве. Запустите для этого симулятор. Если он запустился нормально без ошибок, то в папке, где вы создавали свой проект, будет создан файл с вашей программой. Его необходимо скопировать и установить на свое устройство.

Bluetooth Controller 8 Lamp

Платформа Arduino была создана в 2003 году. Всеобщего внимания она достигла, благодаря низкой цене, а также многомилионному сообществу, направленного на углубленное изучение программирования. Микропроцессоры и микроконтроллеры поставляются с платами. Самыми популярными считаются Arduino. Итальянские модели имеет много функций по расширению и исследованию встроенных Pro систем.

Bluetooth Controller 8 Lamp создан для регулировки функций Ардуино 8 канальным контроллером. Работает при помощи модулей Bluetooth HC-05, HC-06 и HC-07. 8 кнопочный интерфейс соответствует каждой лампочке.

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

Рейтинг
( 1 оценка, среднее 5 из 5 )
Понравилась статья? Поделиться с друзьями:
Для любых предложений по сайту: [email protected]