Статья связана с микроконтроллером 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() ... }
К сожалению, кириллица не поддерживается, но это не критично. Если я найду решение этой проблемы, то напишу в блог. Если Вы найдете решение быстрее, чем я, буду благодарен, если выложите его в комментариях или напишите мне на почту.
Все вопросы и предложения оставляйте здесь в комментариях.
2 comments on “Arduino — Взаимодействие с компьютером”
Я загрузил Ваш код на Ардуинку, шлю «on» в мониторе порта, мне выдает ответ: Error command!
У вас исчез мой комментарий.