Привет! Можно ли связать приложение в компьютере и схему на основе Ардуино? Конечно, можно. Для этого даже существует специальный язык программирования Processing. Хотя данные между компьютером и платой передаются через последовательный порт, так что вы можете использовать любой язык поддерживающий работы через com порт.
Содержание
В этом уроке нам понадобятся класс и функции для работы с com портом. Для этого у нас уже были уроки. Посмотрите их если уже забыли или пропустили.
С помощью языка программирования Processing мы сможем создать приложение для windows, osx или linux и считывать данные с последовательного порта.
Для того, чтобы выполнить этот урок нам понадобиться.
- Ардуино UNO
- Макетная плата
- Перемычки
- Потенциометр
- Кабель USB
Processing
Это открытый язык программирования, основанный на Java. Программа на Processing называется скетч так же как и в Ардуино. Ну и язык программирования Ардуино основан на Processing. Так что даже среда разработки выглядит одинаково.
Скачаем среду разработки на официальном сайте. http://processing.org
Устанавливать ее не нужно, можно сразу запустить.
Схема и программа Ардуино
Наша цель сегодня собрать схему на Ардуино. Передать данные от потенциометра. И считать данные в программе на компьютере.
Соберем простую схему с двумя потенциометрами. Подключим их к портам А0 и А1.
А на плату Ардуино загрузим простой скетч. Который считает данные из портов А0 и А1 и запишет их в последовательный порт.
const int POT0=0;
const int POT1=1;
int val0;
int val1;
void setup(){
Serial.begin(9600);
}
void loop(){
val0 = map(analogRead(POT0), 0, 1023, 0, 255);
val1 = map(analogRead(POT1), 0, 1023, 0, 255);
Serial.print(val0);
Serial.print(".");
Serial.println(val1);
delay(50);
}
Отправлять данные будем одной строкой. Но разделим один потенциометр от другого точкой. После записи данных со второго потенциометра отправим символ перевода строки.
Прошиваем Ардуино и можем убедиться, что программа и схема работают правильно, если откроем монитор порта и покрутим ручки в разные стороны.
Processing программа
Теперь осталось написать программу для считывания данных из com порта и их обработки. Откроем IDE processing и напишем простую программу.
Подключим класс для работы с последовательным портом и создадим объект port.
import processing.serial.*;
Serial port;
Объявим все необходимые переменные.
float dataFloat = 0;
int dataInt = 0;
String strData;
String[] listData = {"0","0"};
В функции setup() создадим окно программы размером 255 на 255 пикселей.
Откроем последовательный порт для работы и настроим считывание до обнаружения специального символа конца строки.
void setup() {
// Размер окна
size(255, 255);
port = new Serial(this, "COM5", 9600); // Инициализация
// последовательного порта
port.bufferUntil('\n');// Символ конца строки
}
Настроим событие, которое сработает, если на последовательном порту появятся данные. Мы можем считать данные в переменную float. Таким образом у нас появятся данные с двух потенциометров. Но с первого в целой части, а со второго в дробной.
Чтобы разделить их по разным переменным, преобразуем float в string и разделим ее на элементы массива.
void serialEvent(Serial port) {
dataFloat = float(port.readStringUntil('\n')); // Получить переменную
dataInt = int(dataFloat);
strData = str(dataFloat);
listData = split(strData, '.');
println( listData[0] );
println( listData[1] );
}
Теперь осталось перерисовать окно программы. Для этого есть функция draw(). Она работает как цикл loop() в Ардуино. Постоянно выполняет код внутри функции. Передадим в нее переменные, которые мы вычислили из последовательного порта.
void draw() {
background(0, 0, dataFloat);
stroke(255);
line(float(listData[0]), float(listData[1]), mouseX, mouseY);
}
Полный текст программы
// код программы Processing
import processing.serial.*;
Serial port;
float dataFloat = 0;
int dataInt = 0;
String strData;
String[] listData = {"0","0"};
void setup() {
// Размер окна
size(255, 255);
port = new Serial(this, "COM5", 9600); // Инициализация
// последовательного порта
port.bufferUntil('\n');// Символ конца строки
}
void draw() {
background(0, 0, dataFloat);
stroke(255);
line(float(listData[0]), float(listData[1]), mouseX, mouseY);
}
// Перерисовать окно
void serialEvent(Serial port) {
dataFloat = float(port.readStringUntil('\n')); // Получить переменную
dataInt = int(dataFloat);
strData = str(dataFloat);
listData = split(strData, '.');
println( listData[0] );
println( listData[1] );
}
В целом программа напоминает программу на Ардуино. Языки программирования очень похожи друг на друга.
В итоге мы увидим окно программы. Цвет которого будет реагировать на первый потенциометр. И прямую линию, которая будет перерисовываться из точки определенной двумя потенциометрами и курсором.
Заключение
Мы рассмотрели использование языка программирования Processing. И написали простую программу для обмена данными между Ардуино и программой в компьютере. В следующий раз, наоборот, попробуем использовать приложение на компьютере для управления схемой на Ардуино.