Arduino — Взаимодействие с компьютером

Статья связана с микроконтроллером Arduino и посвящена взаимодействию данного МК с компьютером.

Я буду использовать язык программирования C#. Если вы его не знаете, то нет ничего страшного, в качестве «собеседника» можно использовать даже Small Basic, или любой другой язык с возможностью работать с последовательными портами(COM-портами).

Для работы нужны:
— Микроконтроллер Arduino (у меня Mega1280, но можно использовать любой другой, например Nano) и всё с ним связанное.
— Среда разработки C#, или Small Basic, в этой статье будут примеры на обоих языках.
— Светодиод – визуальное подтверждение «контакта разумов»

Программирование микроконтроллера
Исходный код, с комментариями:

int led = 9; 
// Светодиод (СИД), подключенный к вход/выходу 9

int inSize=0; 
// Переменная которая будет содержать размер буфера

char str[128]; 
// Так как типа string тут нет, 
// будем использовать массив символов
 
void setup()
{
pinMode(led, OUTPUT); 
// Второй выход (на котором у нас СИД) будет выводом

Serial.begin(9600); 
// Открываем порт с скоростью передачи в 9600 бод(бит/с)
}
 
void loop()
{
inSize=0; 
// Сбрасываем переменную

memset(str, '\0', 128); 
// Очищаем массив

if(Serial.available() > 0)
{
delay(200); 
// Ждем, для того, чтобы пришли все данные

inSize = Serial.available(); 
// Получаем длину строки и записываем ее в переменую

for (int i = 0; i < inSize; i++)
{
str[i] = Serial.read(); 
// Читаем каждый символ, и пишем его в массив
}
 
// Сравнять массив с строкой будем используя функцию strcmp
if (strcmp(str, "on") == 0) 
// Если было передано строку "on" - включаем СИД
{
Serial.println("Led is ON"); 
// Отправляем сообщение компьютеру

digitalWrite(led, HIGH);
}
else if (strcmp(str, "off") == 0) 
// Если было передано строку "off" - выключаем СИД
{
Serial.println("Led is OFF");
digitalWrite(led, LOW);
}
else if (strcmp(str, "hello") == 0) 
// Если было передано строку "hello" - отвечаем.
{
Serial.println("Hello! My name is Mega1280!");
}
else
{
Serial.println("Error command!");
}}}

Программа для компьютера
Код на Small Basic:

'Настройки окна
GraphicsWindow.Width = 320
GraphicsWindow.Height = 150
GraphicsWindow.Title = "Arduino + Small Basic"
'Поле для вводо отправляемой строки
textBox1 = Controls.AddTextBox(10, 10)
Controls.SetSize(textBox1, 200, 30)
'Поле для вывода ответа
textBox2 = Controls.AddTextBox(10, 50)
Controls.SetSize(textBox2, 200, 30)
button1 = Controls.AddButton("Отправить", 220, 10)
Controls.SetSize(button1, 90, 30)
Controls.ButtonClicked = send_read
 
'Коннектимся к порту, у меня Arduino подключен к порту COM21, скорость передачи 9600 бод
CommPort.OpenPort("COM21", 9600)
'Саб для разговоров с МК
Sub send_read
'Отправляем строку
CommPort.TXString(Controls.GetTextBoxText(textBox1))
'Ждем 0,3 секунды, чтоб ответ точно пришел
Program.Delay(300)
'CommPort.RXAll() - считываем строку, и выводим во второй текстбокс
Controls.SetTextBoxText(textBox2, CommPort.RXAll())
EndSub

Задержка в 0.3 секунды нужна для того, чтоб данные полностью пришли в программы. Библиотека расширений SerialPort достаточно медленная, и без задержки данные могут не успеть дойти. В C# скорость отправки/приема данных мгновенна, если не брать в счет задержку на Arduino в 0.2 секунды.(Small Basic — 0.2 + 0.3 = 0.5 сек.)

Код на C#:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
 
namespace ArduinoCs
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// Открываем порт, и задаем скорость в 9600 бод
serialPort1.PortName = "COM21";
serialPort1.BaudRate = 9600;
serialPort1.Open();
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
// При закрытии программы, закрываем порт
if (serialPort1.IsOpen) serialPort1.Close();
}
 
private void button1_Click(object sender, EventArgs e)
{
// Передача данных из текстового поля в порт
serialPort1.Write(textBox1.Text);

// Прием данных и вывод его в окно программмы
textBox2.Text = serialPort1.ReadLine();
}}}

Для того чтоб у вас заработал код, нужно или добавить элемент управления «SerialPort» на форму, или вручную:

...
using System.IO.Ports;
 
namespace ArduinoCs
{
public partial class Form1 : Form
{
SerialPort serialPort1 = new SerialPort();
public Form1()
{
InitializeComponent();
// Открываем порт, и задаем скорость в 9600 бод
serialPort1.PortName = "COM21";
serialPort1.BaudRate = 9600;
serialPort1.Open()
...
}

К сожалению, кириллица не поддерживается, но это не критично. Если я найду решение этой проблемы, то напишу в блог. Если Вы найдете решение быстрее, чем я, буду благодарен, если выложите его в комментариях или напишите мне на почту.

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

Похожие записи:

Если вам понравилась статья, вы можете подписаться на RSS или E-mail рассылку. Для получения обновлений по электронной почте, введите ваш e-mail адрес в эту форму (Доставка от FeedBurner):

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *