Управление Arduino с компьютера
Подружить Arduino с компьютером очень просто. Данные передаются через виртуальный порт RS-232(COM).
Итак переходим к действиям. Три светодиода будут управляться с клавиатуры, нажатием клавиш влево и вправо. Зажигаем первый светодиод и нажимаем клавишу влево, горящий светодиод тухнет, а слева от него загорается. Когда позиция горящего светодиода крайняя, нажатие в ту же сторону приведет к переходу на светодиод с противоположной стороны.
На компьютере управляющая программа будет отображать позицию горящего светодиода. 
Схема со светодиодами, крайне проста.
LED1-3 светодиоды подключенные к ШИМ-выводам. ШИМ потребуются для фэйд-эффекта.
R1 двухсотомный резистор. Для ограничения тока проходящего через светодиод, иначе диод можно спалить.
Небольшая программа для Arduino. (Скачиваем)
// Serial LED control // compblog.vlukyanov.com //Объявляем переменные. int pin[] = ; // Объявляем массив в котором указанны номера выводов int i = 0; // Переменная для определения текущей позиции горящего светодиода int prev_i = 0; // Переменная для запоминания предыдущего светодиода // Настраиваем Arduino void setup() < // Запускаем цикл, в котором определяем контакты 3,5,6 как выводные for (int t = 0; t < 3; t++ ) // > < pinMode(pin[t], OUTPUT); >Serial.begin(9600); // Инициализируем перередачу данных по COM-порту на скорости 9600 бод > void loop() < // Запускаем цикл без каких либо действий // Только когда данные придут на COM-порт продолжится выполнение программы дальше этой строки while (Serial.available() == 0); // Данные пришли, считываем их в переменную i i = Serial.read(); // Постепенно гасим предыдущий светодиод, понижая яркость с 255 до 0; for (int j=255; j >0; j--) < analogWrite(pin[prev_i],j); delay(1); // Небольшая задержка >analogWrite(pin[prev_i],0); // Окончательно гасим светодиод // Пришедшее значение i используем для включения следующего светодиода for (int j=0; j < 255; j++) // > < analogWrite(pin[i],j); delay(1); >// Запоминаем значение светодиода, чтоб потом гасить его, когда появится новое значение на COM-порту prev_i = i; >

Теперь нужна программа на компьютере, которая будет посылать необходимые данные в COM-порт и отображать данные на экран. Processing хорошо подойдет.
IDE Arduino основана на processing, поэтому они очень похожи как внешне, так и по синтаксису.
Тоже довольно простая программа на Processing. (Скачиваем)
// Serial LED control // compblog.vlukyanov.com import processing.serial.*; // подключаем библиотеку для общения по COM-порту // в IDE Arduino это сделанно по умолчанию, тут надо это делать дополнительно int value = 1; // переменная которую будем отправлять в COM-порт для Arduino Serial port; // переменная обозначающая порт PFont f; // переменна для шрифта void setup() < size(500,500); // создаем окно 500 на 500 px f = createFont("Colibri", 15,true); // определяем шрифт для данного окна port = new Serial(this, "COM5", 9600); // задаем параметры порта, у меня он пятый >void draw() < // создаем окно background(0, 0, 0); // черный бэкграунд для окна textFont(f,200); // создаем текст text(value-1,200,300); // выводим в центр значение переменной value >void keyPressed() < // обрабатываем нажатия клавиш // переменная value сдвинута от нулевой позиции на 2, чтоб не загонять ее в минус if (keyCode == LEFT) < // при нажатии клавиши влево value = value + 1; // увеличиваем значение value на 1 if ( value >4 ) value=2; // если она оказывается вне пределов третьего светодиода - сбрасываем значение в 2 port.write(value-2); // и отправляем это значение в COM-порт > else if (keyCode == RIGHT) < // при нажатии клавиши вправо value = value - 1; // уменьшаем значение value на 1 if ( value < 2 ) value=4; // если она оказывается вне пределов первого светодиода - сбрасываем значение в 4 >port.write(value-2); // и отправляем это значение в COM-порт > else < >// в остальных случаях ничего не делаем >
Все относительно просто. Программа на компьютере передает цифровые значения в Com-порт, Arduino гасит текущий светодиод и зажигает светодиод с номером пришедшем через порт.
Управление реле с компьютера при помощи Arduino и bluetooth.
Сегодня в проекте рассмотрим беспроводное управление реле с компьютера при помощи Arduino NANO и bluetooth модуля hc-06. Приложение для компьютера сделал в программе Processing. Не смотря на свой простой дизайн приложения можно использовать для управления от 1 до 5 реле. Для этого достаточно в приложении и в прошивке для Arduino изменить одну переменную. При этом в интерфейсе приложения будет отображать нужное количество кнопок управления и сопутствующей информации.
Описание программы для управления реле с компьютера при помощи Arduino и bluetooth.
Пред тем как делать программу, нужно определиться с её функциями и возможностями. По планам, мое приложение для ПК должно иметь кнопку включения и выключения реле или светодиода. Изначально планировал сделать по 2 кнопки управления, одна включает, вторая выключает реле. Но потом понял, что гораздо нагляднее будет сделать 1 кнопку для управления реле и вывести статус «включено» или «выключено» реле. В итоге получился вот такой интерфейс.

Чтобы сделать программу более функциональной, решил изменить количество управляемого оборудования. Для этого достаточно поменять 1 значение в коде и количество элементов меняется от 1 до 5.

При нажатии на кнопку происходит изменение цвета обводки. Что наглядно отображает работу кнопки. А также при смене состояния реле меняется цвет шрифта на кнопке и изменяется статус: ВКЛ или ВЫКЛ.
Это мое первое приложение, сделанное в Processing, поэтому прошу строго не судить. Если вдруг увидите костыли, прошу указать на более правильное решение. Оставляйте ваши предложения в «Комментариях».
Для проекта понадобиться следующая электроника:
Описание кода Processing IDE для создания программы управления Arduino.
Сначала подключаем библиотеку для работы с последовательным портом и создадим объект, чтобы включить последовательное соединение, а также создадим массив для хранения статуса реле. Самая важная переменная это int n = 5; Отвечающая за количество управляемых реле.
boolean flag[] = new boolean[n]; boolean flagOld[] = new boolean[n]; int step = 70; void setup() < size(450, 480); myPort = new Serial(this, "COM18", 9600); // Запускает последовательное соедениние myPort.bufferUntil('\n'); // Определяет, до какого символа будут считываться данные с последовательного порта. Символ "\n" или "Новая строка" >
В разделе настройки нам нужно установить размер окна программы и запустить последовательное соединение. Что касается номера COM-порта. Необходимо перейти в раздел «Панель управления\Оборудование и звук\Устройства и принтеры».

Посмотреть свойства вашего устройства, нажав на иконку правой кнопкой мыши и выбрав в выпадающем меню «Свойства».

В открывшемся окне переходим на вкладку «Службы». Тут мы увидим «Последовательный порт», в моем случае это «COM18». У вас будет другой.

В основной функции draw (), которая постоянно повторяется, мы делаем всю графику и функции программы. Итак, сначала нам нужно установить цвет фона, цвет заливки, размер и цвет обводки, а затем с помощью функции rect () рисуем кнопку. Используя функцию text (), мы выводим весь текст, включая строку ledStatus.
background(227, 230, 231); textSize(26); fill(20, 160, 133); text("Управление реле с компьютера", 15, 35); textSize(24); fill(33); text("№", 12, 80); text("Реле", 80, 80); text("Состояние", 230, 80); textSize(24); fill(33); text(i+1, 12, 135+i*step); fill(20, 160, 133); // Зеленый Цвет stroke(33); strokeWeight(1); rect(50, 100+i*step, 150, 50, 10); fill(255); textSize(28); text("Включить", 60, 135+i*step);
Теперь осталось сделать кнопки работоспособными. Для этого используем оператор «if», при нажатии кнопки символ команды будет отправлен через последовательный порт на Arduino, и это включит или выключит реле. Следующие строки используются для выделения кнопки при ее нажатии.
// Если нажата кнопка if (mousePressed && mouseX>50 && mouseX100+i*step && mouseY <150+i*step) < // Выделяет кнопки красным цветом при нажатии stroke(255, 0, 0); strokeWeight(3); noFill(); rect(50, 100+i*step, 150, 50, 10); if (!flagOld[i]) < flag[i] = !flag[i]; flagOld[i] = true; int s; if (flag[i]) s = i; else s = i+n; myPort.write(str(s)); // Посылает символ >> else
Изменения значения flag в массиве, изменяет состояние кнопки и статуса которые выводим ниже.
if (flag[i]) < fill(20, 160, 133); // Зеленый Цвет stroke(33); strokeWeight(1); rect(50, 100+i*step, 150, 50, 10); fill(255); textSize(26); text(onButton, 60, 135+i*step); ledStatus[i] = "ВКЛ."; >else < fill(20, 160, 133); // Зеленый Цвет stroke(33); strokeWeight(1); rect(50, 100+i*step, 150, 50, 10); fill(255, 255, 0); textSize(26); text(offButton, 60, 135+i*step); ledStatus[i] = "ВЫКЛ."; >
И для вывода определённого количества элементов управления необходим цикл.
for (int i=0; i
Версию программы выложу с подключением и без подключения к последовательному порту, чтобы была возможность проверить интерфейс программу.
Схема подключения модуля с четырьмя реле и bluetooth hc-06 к Arduino.

Подключить реле можно в количестве от 1 до 5 шт. На схеме приведен пример подключения модуля с 4 реле и bluetooth hc-06 к Arduino. Вы можете использовать другое количество реле и другой модуль bluetooth. А также подключить твердотельное реле. В связи с тем, что твердотельное реле чаще всего высокоуровневое, в прошивке есть переменная, отвечающая за выбор логического уровня реле.

Пример исходного кода Arduino управления реле по Bluetooth.
В связи с тем, что программа для ПК получилась универсальная и можно изменять количество управляемых реле. Скетч для Arduino нужно также сделать максимально универсальным.
Первым делом подключим библиотеку для создания программного Serial порта. И укажем переменные, к которым подключим модуль Bluetooth.
#include const int rx = 3; const int tx = 4; SoftwareSerial mySerial (rx, tx);
Также в скетче я предусмотрел настройки для изменения типа рел. Значение 1 – позволит управлять реле высокого уровня. Значение 0 – в свою очередь позволит управлять реле низкого уровня.
const bool level = 1; // 1 - реле высокого уровня 0 - реле низкого уровня int relay_num = 4; // количество реле 1-5 int sdvig_pin = 5; // начальный пин подключения
Следующие 2 переменные определяют, сколько реле мы планируем подключить и номер пина, с которого будет вестись подключение. Соответственно, если мы начинаем с 5 pin и подключим 2 реле, это означает, что реле нужно будет подключить к пинам 5,6. Если нам нужно подключить 4 реле, то для этого будем использовать уже pin 5,6,7,8. И так далее.
Это основные настройки которые нужно знать. Всю программу разбирать не буду. Если вы разбираетесь в программировании, то вы без труда в ней разберётесь. Также в программе есть один костыль. Если у вас есть решение как его исправить пишите в комментариях.
Беспроводное управление светом с 2 мест с помощью bluetooth и переключателя.
Есть у меня на сайте проект, в котором я рассказываю, как можно управлять светом с 3 мест с помощью: Пульта ДУ, Радиопульта, Переключателя. Данное управление можно переделать. И вместо или помимо Пульт ДУ + Радиопульт подключить bluetooth. И управлять освещением еще и с компьютера. Достаточно удобно! Давайте рассмотрим, как это сделать.
Схема подключения Arduino NANO, bluetooth модуля hc-06 и модуля с двумя реле.

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

Описание работы управлением светом с компьютера по bluetooth.
Как видим на фото ниже, вместо радиоуправления подключил bluetooth модуль hc-06. Код использую тот же, что привел выше безо всяких изменений. Только указал нужное количество реле и тип сигнала низкого уровня. После чего можно приступать к управлению светом, включать с компьютера посредством беспроводной связи по bluetooth и переключателя, который можно установить в монтажную коробку как обычный выключатель.

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

Подведём итог.
Управление реле с компьютера, скорее всего не очень востребовано, так как мы редко нуждаемся в управлении светом за компьютером. Хотя… Это возможно только мое мнение!
В свези с тем, что это мое первое приложение для компьютера учтены не все моменты и имеются некоторые недочеты. Также есть смысл сделать управление реле по Wi-fi. Жду ваши мнение и предложения.
Понравился проект Управление реле с компьютера при помощи Arduino и bluetooth? Не забудь поделиться с друзьями в соц. сетях.
А также подписаться на наш канал на YouTube, вступить в группу Вконтакте, в группу на Facebook.
Спасибо за внимание!
Технологии начинаются с простого!
Arduino и Processing. Как управлять микроконтроллером по COM порту. Двустороннее общение
Всем привет! В интернете бытует заблуждение, что для управления компьютером при помощи самодельной электроники нужны только специальные платы, которые могут распознаваться как USB HID устройства. А касаемо Arduino все только и говорят о Arduino Leanardo. Такие популярные библиотеки как Keyboard и Mouse, которые позволяют создавать эмуляцию работы мыши или клавиатуры посредством микроконтроллера предназначены только для пары плат Arduino, Leonardo в их числе.
Я расскажу о том, как наладить связь любого микроконтроллера Arduino (для примера взята Arduino Uno) и своей программы на Processing. Добавив ко всему прочему знания о Java, на котором основывается Processing, можно будет дописать проект под управление всем компьютером, а не только собственным приложением. Тема управления компьютером программой на Java не есть чем то секретным, погуглите и все найдете, уверяю вас.
Скачиваем среды для разработки (IDE)
Существует много интегрированных сред разработки для программирования микроконтроллеров на чистом Си. Из них можно отметить самые удобные: Atollic, Eclipse, Keil.
Однако для простоты и доступности данного руководства я буду использовать редактор Arduino IDE и писать на Ардуино Си. Скачать такой редактор можно с официального сайта Arduino.
Среду разработки для программирования на Procrssing так же можно скачать с официального сайта.
Стоит отметить, приличия ради, что данные IDE очень похожи, потому что написаны на одном движке. И когда создавался Arduino основатели старались как можно больше упростить свой редактор кода, как это и было сделано в Processing редакторе.
Arduino. Собираем схему и пишем код
В данном примере я буду использовать Arduino Uno. К ней будет подключена кнопка, потенциометр и светодиод. Соответственно я могу выдавать логический 0 или 1. Читать логический 0 или 1. И проводить Аналого-цифровое преобразование(ADC или АЦП), получая числа от 0 до 1023 (в Arduino Uno 10-ми разрядный АЦП) в зависимости от положения потенциометра. Большего для примера и не нужно, так как это основные функции, которые может делать микроконтроллер.

На схеме светодиод анодом подключен к 5V через ограничивающий резистор ( минимум 220 Ом, желательно 500 Ом), катодом к пину D11. Кнопка замыкает землю и пин D2. Потенциометр меняет потенциал на пине A1.
Задача микроконтроллера следующая: Если по последовательному интерфейсу (Serial COM port) приходит сообщение «LED — H» — засветить светодиод. Если приходит сообщение «LED — L» — затушить светодиод. Каждые 250мс отправлять сообщение в последовательный порт (в данном случае на экран компьютера) сообщение «Pot — » и число, полученное аналоговым чтением пина A1. При нажатии кнопки единожды отсылать сообщение «Button is pressed!».
Вот мое предложение решения данной задачи (не пример для подражания):
Прошивка для Arduino Uno
#define pinPot A1 #define pinLed 11 #define pinBtn 2 void setup() < pinMode(pinPot, INPUT); pinMode(pinLed, OUTPUT); pinMode(pinBtn, INPUT_PULLUP); Serial.begin(9600); Serial.println("The program starts.\n\n"); >void loop() < /* INITIAL VARIABLES. Segment 1 */ static char potMes[] = "Pot - "; static char btnMes[] = "Button is pressed!"; static char passLight[] = "Led - "; static int passLength = sizeof(passLight) - 1; static int sizepm = sizeof(potMes) - 1; static int sizebtn = sizeof(btnMes) - 1; static bool flagLedState = LOW; static bool flagBtnPress = false; static long int curTime = 0; static const int period = 200; static bool flagEnableRead = false; /* INITIAL VARIABLES. Segment 1 */ /* FUNCTIONS CALL. Segment 2 */ /* * Led is attached to HIGH voltage from one side * And to pin on the other side * By that the inverting logic */ ReadSerialForLed(passLight, passLength, &flagLedState); digitalWrite(pinLed, !flagLedState); /* * Button pin always is pulled to the HIGH voltage * And only when button is pressed - Voltage on pin goes to GROUND * So it is need to invert logic when read pins */ if(!Bounce(pinBtn) && flagBtnPress == false)< for(int i = 0; i < sizebtn; i++)< Serial.write(btnMes[i]); >Serial.print("\n"); flagBtnPress = true; if(!flagEnableRead) < curTime = millis(); flagEnableRead = true; >>else if(Bounce(pinBtn)) < flagBtnPress = false; >/* * Read and send Info "Pot - " + var Only after first press on button * Every 'period'ms */ if(millis() - curTime > period && flagEnableRead) < SendData(pinPot, potMes, sizepm); curTime = millis(); >/* FUNCTIONS CALL. Segment 2 */ > /* * Pot - pin with potentiometer * pMes - Array with message before Pot value * sp - size of potentiometer message */ void SendData(int Pot, char* pMes, int sp) < static int varP[2]; varP[0] = analogRead(Pot); varP[1] = varP[0]/256; // 0 - 3 (256 - 1024) varP[0] = varP[0]%256; // 0 - 255 //Send Message for(int i = 0; i < sp; i++)< Serial.write(char(pMes[i])); >//Send 2 bits of data //Serial.write(varP[0]); //Serial.write(varP[1]); Serial.print(analogRead(Pot)); Serial.print("\n"); > /* * Function, which is reads button pin with the bounce */ bool Bounce(int btn)< if(digitalRead(btn) == true)< delay(15); if(digitalRead(btn) == true)< return true; >else < return false; >>else < return false; >> /* * If Message from Serial port, which you read will be the same to passLight * So look at the next symbol after Pass Message. If it is symbol 'H' - make LED to light * If it is 'L' - make LED off. */ void ReadSerialForLed(char *passLight_f, int passLength_f, bool* flagLedState_f) < static char sym; static int cntPass = 0; static bool readyGetLed = LOW; while (Serial.available() >0) < sym = Serial.read(); if(sym == passLight_f[cntPass] && !readyGetLed)< cntPass++; >else if (!readyGetLed)< cntPass = 0; >else if(readyGetLed)< if(sym == 'H')< *flagLedState_f = HIGH; >else if(sym == 'L') < *flagLedState_f = LOW; >> if(cntPass == passLength_f) < readyGetLed = HIGH; >> >
Комментарий: Светодиод подключен анодом к питаю. Это инвертирует логику состояния светодиода и больше никакой пользы не приносит. Кнопка не обвязана подтягивающим резистором из соображений экономии, так как в Arduino Uno имеются встроенные подтягивающие резисторы, которые включаются в схему при инициализации пина в режим INPUT_PULLUP.
Так же в прошивке сообщения о значении снятого с потенциометра отсылаются только после первого нажатия на кнопку!
Что бы залить прошивку в плату не забывайте выбрать порт и плату.

Если вы не знаете какой COM порт у вас отведен для платы Arduino, то на Windows заходим в
Панель управления -> Диспетчер устройств и нажимаем на вкладку «Порты COM»

Если у вас COM порт не подписан как у меня — всегда можно отсоединить Arduino и посмотреть который порт пропадет. А вот если никакой не пропал и Ардуина вовсе не распознается компьютером — значит пора поискать решение в интернете. Но начните с обновления драйверов или смены платы.
Когда все получится — попробуйте открыть монитор порта и ввести «Led — H», «Led — L», по нажимайте на кнопку, покрутите потенциометр и смотрите на экран, все ли правильно выводится.
Наигрались — поменяйте слегка код.
Замените последнюю строку кодом из комментария.
//Send 2 bits of data //Serial.write(varP[0]); //Serial.write(varP[1]); Serial.print(analogRead(Pot));
Теперь значения с потенциометра не будут выглядеть читабельными, но такой маневр требуется для программы на Processing.
Processing. Пишем программу, которая взаимодействует с микроконтроллером
Суть связи программы на Processing и микроконтроллера очень проста. Для этого языка программирования существует библиотека Serial, которая позволяет принимать сообщения, отправленные как Serial.write(); , а так же позволяет отправлять сообщения как Serial.print(); . Важно отметить, что при подобной отправке сообщения оно будет записано в буфер порта, а значит будет прочитано микроконтроллером. Так что нам осталось только подключиться к нужному Serial порту и принимать/отправлять на него сообщения.
Следующая программа подключит библиотеку Serial и напишет в консоли редактора список всех COM портов, к которым можно подключиться.
import processing.serial.*; void setup() < String[] port = Serial.list(); for(int i = 0; i < port.length; i++)< print("Port number #" + i + " "); println(Serial.list()[0]); >> void draw() <>
Когда вы напишете код в редактор и нажмете на кнопку «Пуск» (стрелочка 1 на картинке), то появится окно приложения(2) и в консоли(3) выведется список COM портов.

У меня только один такой COM порт и в листе, как в массиве, он будет находиться под номером 0. Из этих соображений объекту класса Serial: Serial port; при его создании будет указан именно первый элемент списка портов port = new Serial(this, Serial.list()[0], 9600);
Залейте в Ардуину нашу последнюю прошивку с изменением. После чего напишите вот эту программу и запустите ее. В ней Каждые 500 миллисекунд отправляется сообщение в COM порт потушить или зажечь светодиод. И если все у вас сделано правильно, то после запуска приложения светодиод должен мигать.
import processing.serial.*; Serial port; // Create object from Serial class void setup() < port = new Serial(this, Serial.list()[0], 9600); >void draw()
Или вот другой пример. Светодиод будет менять свое состояние после любого нажатия на окно приложения (размеры которого 800х800px) кнопкой мыши.
import processing.serial.*; Serial port; // Create object from Serial class int cnt = 0; void setup() < size(800, 800); port = new Serial(this, Serial.list()[0], 9600); >void draw()<> void mousePressed() < cnt++; if(cnt % 2 == 1)< port.write("Led - H"); >else < port.write("Led - L"); >>
Processing. Пример многофункционального приложения
Данное элементарное приложение симулирует «полет в космосе», если это можно так назвать. Значение с потенциометра изменяет скорость полета, нажатие на кнопку меняет направление полета. А любое нажатие кнопки мыши на окно приложения — меняет состояние светодиода (да, ничего оригинальнее я не придумал).
Мой код далек от совершенства, не принимайте его как хороший пример. Это просто пример, который работает. Вот, собственно, он.
Пример многофункциональной программы
import processing.serial.*; Serial port; // Create object from Serial class int val; // Data received from the serial port (symbol) int pot; // Data from potentiometer String potMes = "Pot - "; String btnMes = "Button is pressed!"; int cntPM = 0; // Counter Potentiometer Message. // When it equals to length of Pot Mess - get value. int cntBM = 0; int cntBtnPress = 0; int cntMousePress = 0; Star[] stars = new Star[1000]; float speed; int dir = 1; void setup() < size(800, 800); for(int i = 0; i < stars.length; i++)< stars[i] = new Star(); >frameRate(60); // 60 Frames per second port = new Serial(this, Serial.list()[0], 9600); // Wait for first message from Arduino delay(2000); while (port.available() > 0) < val = port.read(); print(char(val)); >> void draw() < if (port.available() >0) < val = port.read(); cntPM = CheckSymbol(potMes, cntPM, char(val), cntPM); cntBM = CheckSymbol(btnMes, cntBM, char(val), cntBM); >DrawRain(pot, 0, 1023); > void DrawRain(int speed_f, int min, int max) < background(0); translate(width/2,height/2); speed = dir*map(speed_f, min, max, 0, 50); for(int i = 0; i < stars.length; i++)< stars[i].go(); stars[i].update(); stars[i].show(); >> int CheckSymbol(String mes, int index, char sym, int ret_val)< if(mes.charAt(index) == sym && ret_val < (mes.length() - 1))< return (ret_val + 1); >else if( ret_val == (mes.length() - 1) && mes.equals(potMes) ) < if(port.available() >0) < pot = port.read(); // First 0-255 value >if(port.available() > 0) < pot += 256*port.read(); // Last 2 bits 256 - 1024 >>else if( ret_val == (mes.length() - 1) && mes.equals(btnMes) ) < cntBtnPress++; dir = -dir; >return 0; > void mousePressed() < cntMousePress++; if(cntMousePress % 2 == 1)< port.write("Led - H"); >else < port.write("Led - L"); >>
Заключение
Думаю, нужно написать, что идею последней программы я подцепил у одного программиста — Daniel Shiffman, который снимает ролики, понятные даже детям, о программировании на Processing (решено более 140 визуальных задач).
Когда я пытался сам разобраться в том что и как нужно делать для связи Processing и Arduino мне очень помогли вот эти сайты:
- developer.alexanderklimov.ru/arduino/processing.php
- arduino-diy.com/arduino-processing-osnovi
Ардуино для начинающих. Урок 10. Serial и processing

Теперь сделаем кое что посложнее. Сейчас напишем скетч для управления, встроенным в Arduino, светодиодом с компьютера через Serial интерфейс. Этот скетч не намного сложнее предыдущего:
// Управление светодиодом с компьютера int ledPin = 13; void setup () < // Открываем порт на скорости 9600 бод Serial.begin(9600); // Назначаем пин светодиода выходом pinMode(ledPin, OUTPUT); >void loop () < // Ждем данные while (Serial.available() == 0); // Считываем данные int val = Serial.read() - '0'; // Выполняем дествия в зависимости от данных if (val == 1) < Serial.println("Led is On"); digitalWrite(ledPin, HIGH); >else if (val == 0) < Serial.println("Led is Off"); digitalWrite(ledPin, LOW); >else < Serial.println("Invalid!"); >// Очищаем буфер Serial.flush(); >
Тут вы не найдете ничего нового, что мы бы не разбирали в этом или прошлых уроках, кроме Serial.flush(). Этот метод очищает оставшиеся символы в буфере памяти, так как мы работаем только с одним символом и остальные нам не нужны. В видео подробно рассказано зачем эта строчка.
А теперь приступим к самому интересному и сложному на сегодня. Теперь мы будем отправлять значения с Ардуино на компьютер и там их использовать. Для обработки получаемых значений на компьютере мы будем использовать Processing. Скачать его можно на официальном сайте.
Схема очень проста. Мы просто подключим потенциометр к аналоговому пину Arduino. Скетч тоже очень прост:
int potPin = 0; void setup () < Serial.begin(9600); >void loop () < // Считываем и преобразовываем данные int val = map(analogRead(potPin), 0, 1023, 0, 255); // Отправляем данные Serial.println(val); // Задержка для стабильности работы delay(50); >
Если вы прошли прошлые уроки, то в этом скетче вам все будет понятно. Если вы что то не знаете или забыли можете посмотреть прошлые уроки или справочник по языку программирования ардуино. А вот и код для Processing:
// Подключаем библиотеку монитора порта import processing.serial.*; // Инициируем порт Serial port; // Переменная для хранения значения яркости float brightness = 0; void setup () < // Задаем размер окна size(500, 500); // Слушаем ком порт СОМ3 port = new Serial(this, "COM3", 9600); port.bufferUntil('\n'); >void draw () < // Изменяем цвет фона окна background(0, 0, brightness); >// Получаем значения с ардуино void serialEvent (Serial port)
Описывать этот код я не буду, так как в видео все подробно изложено, да и практически каждая строчка кода пояснена комментарием.
5 комментариев
- Влад 2018-12-05 18:34:19
Не работает Serial.flash(). Вместо одной выходят несколько надписей Invaild. Что делать?
Влад, поменяй одну букву в слове Serial.flash()
Должно быть: Serial.flush()
В предпоследнюю строку последнего скетча вкралась опечатка.
Вместо redString в операторе brightness = float(port.redStringUntil(‘\n’)); там имелось в виду
readString, т.е. brightness = float(port.readStringUntil(‘\n’));
А как в процессинге работать с 2-3-4…. Ком портами ?
И как обмениваться float ?
подскажите пожалуйста как принимать 10 разных значений?
чем их разделить или может передавать последовательно?
требуется передать данные с разных датчиков а приняв отобразить в нужных местах. форму в Processing нарисовал, осталось продумать как в нужном порядке передать через Serial (использую Bluetooth) и приняв «разложить по полочкам»
Добавить комментарий Отменить ответ
Для отправки комментария вам необходимо авторизоваться.
Железо

Стартовый набор с Arduino Mega и RFID Это расширенный стартовый набор. В комплект входит Arduino Mega R3, макетные платы, множество датчиков, управляемые механизмы и необходимые радиоэлектронные компоненты. Полный список.

Плата Arduino Uno R3 Arduino Uno — плата на базе микроконтроллера ATmega328P с частотой 16 МГц. На плате есть все необходимое для удобной и быстрой работы.