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

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


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

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

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


Схема работы следующая: с сервера считываем файл, в котором лежат данные с помощью программы, запущенной на ПК/ноутбуке. Эта программа через 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 команд, если алгоритм доработать и ввести парсинг данных в МК, то передавать можно любые данные. Так же есть возможность «допилинга» ПО для двустороннего обмена данными.

Выбор сервера и серверная часть


Для серверной части подойдет любой сервер с поддержкой PHP, хоть запущенный на личном ПК, лишь бы был статический IP, но я лично использую арендованный Jino. Серверная часть в моём примере состоит из двух файлов: HTML странички с формой с кнопками ВКЛ/ВЫКЛ светодиода и PHP скрипта, который меняет содержимое TXT файла из которого программа, запущенная на ПК читает данные.

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


Код HTML. Форма с 2 кнопками, вкл/выкл светодиод на плате:

<html>
<head>
<title>Управление светодиодом</title>
</head>  
<body>
<form action="work.php" method="post">
Светодиод:
<p>
<input type="submit" name="sv" value="On" />
<input type="submit" name="sv" value="Off" />
<p>
</form>    
</body>    
</html>

Код PHP, здесь мы пишем в файл команду А, если светодиод должен гореть, и В если должен потухнуть:

<?php
$cm = fopen("command.txt", "w");
switch ($_POST['sv']) {
case "On":
fwrite($cm,"a");    
    break;   
case "Off":
fwrite($cm,"b");    
    break;  
}
fclose($cm); 
?>

Теперь собственно код для 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-файл создается с дефолтными значениями.

Результаты работы



Вместо заключения


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