Processing. Урок 12. Ардуино

язык программирования Processing
Используем язык программирования Processing
Используем язык программирования Processing

Привет! Можно ли связать приложение в компьютере и схему на основе Ардуино? Конечно, можно. Для этого даже существует специальный язык программирования Processing. Хотя данные между компьютером и платой передаются через последовательный порт, так что вы можете использовать любой язык поддерживающий работы через com порт.

В этом уроке нам понадобятся класс и функции для работы с com портом. Для этого у нас уже были уроки. Посмотрите их если уже забыли или пропустили.

Последовательный порт. Урок 5. Ардуино

С помощью языка программирования Processing мы сможем создать приложение для windows, osx или linux и считывать данные с последовательного порта.

Для того, чтобы выполнить этот урок нам понадобиться.

  • Ардуино UNO
  • Макетная плата
  • Перемычки
  • Потенциометр
  • Кабель USB

Processing

Это открытый язык программирования, основанный на Java. Программа на Processing называется скетч так же как и в Ардуино. Ну и язык программирования Ардуино основан на Processing. Так что даже среда разработки выглядит одинаково.

Скачаем среду разработки на официальном сайте. http://processing.org

Устанавливать ее не нужно, можно сразу запустить.

Интерфейс Processing ide
Интерфейс Processing ide

Схема и программа Ардуино

Наша цель сегодня собрать схему на Ардуино. Передать данные от потенциометра. И считать данные в программе на компьютере.

Соберем простую схему с двумя потенциометрами. Подключим их к портам А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. И написали простую программу для обмена данными между Ардуино и программой в компьютере. В следующий раз, наоборот, попробуем использовать приложение на компьютере для управления схемой на Ардуино.

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

Ваш адрес email не будет опубликован.