Processing arduino linux

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 имеются встроенные подтягивающие резисторы, которые включаются в схему при инициализации пина в режим INPUT_PULLUP.
Так же в прошивке сообщения о значении снятого с потенциометра отсылаются только после первого нажатия на кнопку!

Что бы залить прошивку в плату не забывайте выбрать порт и плату.

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

Если у вас COM порт не подписан как у меня — всегда можно отсоединить Arduino и посмотреть который порт пропадет. А вот если никакой не пропал и Ардуина вовсе не распознается компьютером — значит пора поискать решение в интернете. Но начните с обновления драйверов или смены платы.

Когда все получится — попробуйте открыть монитор порта и ввести «Led — H», «Led — L», по нажимайте на кнопку, покрутите потенциометр и смотрите на экран, все ли правильно выводится.

Наигрались — поменяйте слегка код.

Замените последнюю строку кодом из комментария.

Теперь значения с потенциометра не будут выглядеть читабельными, но такой маневр требуется для программы на Processing.

Processing. Пишем программу, которая взаимодействует с микроконтроллером

Суть связи программы на Processing и микроконтроллера очень проста. Для этого языка программирования существует библиотека Serial, которая позволяет принимать сообщения, отправленные как Serial.write(); , а так же позволяет отправлять сообщения как Serial.print(); . Важно отметить, что при подобной отправке сообщения оно будет записано в буфер порта, а значит будет прочитано микроконтроллером. Так что нам осталось только подключиться к нужному Serial порту и принимать/отправлять на него сообщения.

Следующая программа подключит библиотеку Serial и напишет в консоли редактора список всех COM портов, к которым можно подключиться.

Когда вы напишете код в редактор и нажмете на кнопку «Пуск» (стрелочка 1 на картинке), то появится окно приложения(2) и в консоли(3) выведется список COM портов.

У меня только один такой COM порт и в листе, как в массиве, он будет находиться под номером 0. Из этих соображений объекту класса Serial: Serial port; при его создании будет указан именно первый элемент списка портов port = new Serial(this, Serial.list()[0], 9600);

Залейте в Ардуину нашу последнюю прошивку с изменением. После чего напишите вот эту программу и запустите ее. В ней Каждые 500 миллисекунд отправляется сообщение в COM порт потушить или зажечь светодиод. И если все у вас сделано правильно, то после запуска приложения светодиод должен мигать.

Или вот другой пример. Светодиод будет менять свое состояние после любого нажатия на окно приложения (размеры которого 800х800px) кнопкой мыши.

Processing. Пример многофункционального приложения

Данное элементарное приложение симулирует «полет в космосе», если это можно так назвать. Значение с потенциометра изменяет скорость полета, нажатие на кнопку меняет направление полета. А любое нажатие кнопки мыши на окно приложения — меняет состояние светодиода (да, ничего оригинальнее я не придумал).

Мой код далек от совершенства, не принимайте его как хороший пример. Это просто пример, который работает. Вот, собственно, он.

Заключение

Думаю, нужно написать, что идею последней программы я подцепил у одного программиста — Daniel Shiffman, который снимает ролики, понятные даже детям, о программировании на Processing (решено более 140 визуальных задач).

Когда я пытался сам разобраться в том что и как нужно делать для связи Processing и Arduino мне очень помогли вот эти сайты:

Источник

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

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

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

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

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

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

Processing

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

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

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

Интерфейс Processing ide

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

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

Соберем простую схему с двумя потенциометрами. Подключим их к портам А0 и А1.

Принципиальная схема подключения потенциометров

А на плату Ардуино загрузим простой скетч. Который считает данные из портов А0 и А1 и запишет их в последовательный порт.

Отправлять данные будем одной строкой. Но разделим один потенциометр от другого точкой. После записи данных со второго потенциометра отправим символ перевода строки.

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

Монитор последовательного порта Ардуино

Processing программа

Теперь осталось написать программу для считывания данных из com порта и их обработки. Откроем IDE processing и напишем простую программу.

Подключим класс для работы с последовательным портом и создадим объект port.

Объявим все необходимые переменные.

В функции setup() создадим окно программы размером 255 на 255 пикселей.

Откроем последовательный порт для работы и настроим считывание до обнаружения специального символа конца строки.

Настроим событие, которое сработает, если на последовательном порту появятся данные. Мы можем считать данные в переменную float. Таким образом у нас появятся данные с двух потенциометров. Но с первого в целой части, а со второго в дробной.

Чтобы разделить их по разным переменным, преобразуем float в string и разделим ее на элементы массива.

Теперь осталось перерисовать окно программы. Для этого есть функция draw(). Она работает как цикл loop() в Ардуино. Постоянно выполняет код внутри функции. Передадим в нее переменные, которые мы вычислили из последовательного порта.

Полный текст программы

В целом программа напоминает программу на Ардуино. Языки программирования очень похожи друг на друга.

В итоге мы увидим окно программы. Цвет которого будет реагировать на первый потенциометр. И прямую линию, которая будет перерисовываться из точки определенной двумя потенциометрами и курсором.

Результат выполнения программ

Заключение

Мы рассмотрели использование языка программирования Processing. И написали простую программу для обмена данными между Ардуино и программой в компьютере. В следующий раз, наоборот, попробуем использовать приложение на компьютере для управления схемой на Ардуино.

Источник

Connecting Arduino to Processing

Introduction

So, you’ve blinked some LEDs with Arduino, and maybe you’ve even drawn some pretty pictures with Processing — what’s next? At this point you may be thinking, ‘I wonder if there’s a way to get Arduino and Processing to communicate to each other?’. Well, guess what — there is! — and this tutorial is going to show you how.

In this tutorial we will learn:

  • How to send data from Arduino to Processing over the serial port
  • How to receive data from Arduino in Processing
  • How to send data from Processing to Arduino
  • How to receive data from Processing in Arduino
  • How to write a serial ‘handshake’ between Arduino and Processing to control data flow
  • How to make a ‘Pong’ game that uses analog sensors to control the paddles

Before we get started, there are a few things you should be certain you’re familiar with to get the most out of this tutorial:

Looking for the right Arduino?

Check out our Arduino Comparison Guide! We’ve compiled every Arduino development board we carry, so you can quickly compare them to find the perfect one for your needs.

From Arduino.

Let’s start with the Arduino side of things. We’ll show you the basics of how to set up your Arduino sketch to send information over serial.

  • First things first. If you haven’t done so yet, download and install the Arduino software for your operating system. Here’s a tutorial if you get stuck.
  • You’ll also need an Arduino-compatible microcontroller and an appropriate way to connect it to your computer (an A-to-B USB cable, micro USB, or FTDI breakout). Check this comparison guide if you’re not sure what’s right for you.

Ok. You should by this point have the Arduino software installed, an Arduino board of some kind, and a cable. Now for some coding! Don’t worry, it’s quite straightforward.

  • Open up the Arduino software. You should see something like this:

The nice big white space is where we are going to write our code. Click in the white area and type the following (or copy and paste if you feel lazy):

This is called our setup method. It’s where we ‘set up’ our program. Here, we’re using it to start serial communication from the Arduino to our computer at a baud rate of 9600. For now, all you need to now about baud rate is that (basically) it’s the rate at which we’re sending data to the computer, and if we’re sending and receiving data at different rates, everything goes all gobbledy-gook and one side can’t understand the other. This is bad.

After our setup() method, we need a method called loop() , which is going to repeat over and over as long as our program is running. For our first example, we’ll just send the string ‘Hello, world!’ over the serial port, over and over (and over). Type the following in your Arduino sketch, below the code we already wrote:

That’s all we need for the Arduino side of our first example. We’re setting up serial communication from the Arduino and telling it to send data every 100 milliseconds. Your Arduino sketch should now look something like this:

All that’s left to do is to plug in your Arduino board, select your board type (under Tools -> Board Type) and your Serial port (under Tools -> Serial Port) and hit the ‘upload’ button to load your code onto the Arduino.

Now we’re ready to see if we can magically (or through code) detect the ‘Hello, world!’ string we’re sending from Processing.

. to Processing

Our task now is to find a way to listen in on what our Arduino sketch is sending. Luckily, Processing comes with a Serial library designed for just this kind of thing! If you don’t have a version of Processing, make sure you go to Processing.org and download the latest version for your operating system. Once Processing is installed, open it up. You should see something like this:

Looks a lot like Arduino, huh? The Arduino software was actually based in part off of Processing — that’s the beauty of open-source projects. Once we have an open sketch, our first step is to import the Serial library. Go to Sketch->Import Library->Serial, as shown below:

You should now see a line like import processing.serial.*; at the top of your sketch. Magic! Underneath our import statement we need to declare some global variables. All this means is that these variables can used anywhere in our sketch. Add these two lines beneath the import statement:

In order to listen to any serial communication we have to get a Serial object (we call it myPort but you can it whatever you like), which lets us listen in on a serial port on our computer for any incoming data. We also need a variable to recieve the actual data coming in. In this case, since we’re sending a String (the sequence of characters ‘Hello, World!’) from Arduino, we want to receive a String in Processing. Just like Arduino has setup() and loop() , Processing has setup() and draw() (instead of loop).

For our setup() method in Processing, we’re going to find the serial port our Arduino is connected to and set up our Serial object to listen to that port.

Remember how we set Serial.begin(9600) in Arduino? Well, if we don’t want that gobbledy-gook I was talking about, we had better put 9600 as that last argument in our Serial object in Processing as well. This way Arduino and Processing are communicating at the same rate. Happy times!

In our draw() loop, we’re going to listen in on our Serial port and we get something, stick that something in our val variable and print it to the console (that black area at the bottom of your Processing sketch).

Ta-Da! If you hit the ‘run’ button (and your Arduino is plugged in with the code on the previous page loaded up), you should see a little window pop-up, and after a sec you should see `Hello, World!’ appear in the Processing console. Over and over. Like this:

Excellent! We’ve now conquered how to send data from Arduino to Processing. Our next step is figure out how go the opposite way — sending data from Processing to Arduino.

From Processing.

So we’ve sent data from Arduino to Processing, but what if we want to send data the other way — from Processing to Arduino? Piece of cake!

Let’s start with the Processing side of things. It starts out much like our last sketch: we import the Serial library and declare a global Serial object variable for our port up top, and in our setup() method we find our port and initialize Serial communication on that port with our Serial variable at 9600 baud. We’re also going to use the size() command, to give us a little window to click in, which will trigger our sketch to send something over the Serial port to Arduino.

In our draw() loop, we send whatever we want over the serial port by using the write method from the Processing Serial library. For this sketch, we will send a ‘1’ whenever we click our mouse in the Processing window. We’ll also print it out on the console, just to see that we’re actually sending something. If we aren’t clicking we’ll send a ‘0’ instead.

This is what your code should look like at this point:

If you run this code, you should see a bunch of 1’s appear in the console area whenever you click your mouse in the window. Neat! But how do we look for these 1’s from Arduino? And what can we do with them?

. to Arduino

Ok! On this page we’re going to look for those 1’s coming in from Processing, and, if we see them, we’re going to turn on an LED on pin 13 (on some Arduinos, like the Uno, pin 13 is the on-board LED, so you don’t need an external LED to see this work).

At the top of our Arduino sketch, we need two global variables — one for holding the data coming from Processing, and another to tell Arduino which pin our LED is hooked up to.

Next, in our setup() method, we’ll set the LED pin to an output, since we’re powering an LED, and we’ll start Serial communication at 9600 baud.

Finally, in the loop() method, we’ll look at the incoming serial data. If we see a ‘1’, we set the LED to HIGH (or on), and if we don’t (e.g. we see a ‘0’ instead), we turn the LED off. At the end of the loop, we put in a small delay to help the Arduino keep up with the serial stream.

This is what your code should look like when you’re done:

Voila! If we load up this code onto our Arduino, and run the Processing sketch from the previous page, you should be able to turn on an LED attached to pin 13 of your Arduino, simply by clicking within the Processing canvas.

Shaking Hands (Part 1)

So far we’ve shown that Arduino and Processing can communicate via serial when one is talking and the other is listening. Can we make a link that allows data to flow both ways, so that Arduino and Processing are both sending and receiving data? You bet! In the biz we call this a serial ‘handshake’, since both sides have to agree when to send and receive data.

On this page and the next, we’re going to combine our two previous examples in such a way that Processing can both receive ‘Hello, world!’ from Arduino AND send a 1 back to Arduino to toggle an LED. Of course, this also means that Arduino has to be able to send ‘Hello, world!’ while listening for a 1 from Processing. Whew!

Let’s start with the Arduino side of things. In order for this to run smoothly, both sides have to know what to listen for and what the other side is expecting to hear. We also want to minimize traffic over the serial port so we get more timely responses.

Just like in our Serial read example, we need a variable for our incoming data and a variable for the LED pin we want to light up:

Since we’re trying to be efficient, we’re going to change our code so that we only listen for 1’s, and each time we hear a ‘1’ we toggle the LED on or off. To do this we added a boolean (true or false) variable for the HIGH or LOW state of our LED. This means we don’t have to constantly send a 1 or 0 from Processing, which frees up our serial port quite a bit.

Our setup() method looks mostly the same, with the addition of an establishContact() function which we’ll get to later — for now just type it in.

In our loop function, we’ve just combined and slimmed down the code from our two earlier sketches. Most importantly, we’ve changed our LED code to toggle based on our new boolean value. The ‘!’ means every time we see a one, we set the boolean to the opposite of what it was before (so LOW becomes HIGH or vice-versa). We also put our ‘Hello, world!’ in an else statement, so that we’re only sending it when we haven’t seen a ‘1’ come in.

Now we get to that establishContact() function we put in our setup() method. This function just sends out a string (the same one we’ll need to look for in Processing) to see if it hears anything back — indicating that Processing is ready to receive data. It’s like saying ‘Marco’ over and over until you hear a ‘Polo’ back from somewhere.

Your Arduino code should look like this:

That’s it for the Arduino side, now on to Processing!

Shaking Hands (Part 2)

For the Processing side of things, we’ve got to make a few changes. We’re going to make use of the serialEvent() method, which gets called every time we see a specific character in the serial buffer, which acts as our delimiter — basically it tells Processing that we’re done with a specific ‘chunk’ of data — in our case, one ‘Hello, world!’.

The beginning of our sketch is the same except for a new firstContact boolean, which let’s us know when we’ve made a connection to Arduino.

Our setup() function is the same as it was for our serial write program, except we added the myPort.bufferUntil(‘\n’); line. This let’s us store the incoming data into a buffer, until we see a specific character we’re looking for. In this case, it’s a carriage return (\n) because we sent a Serial.println from Arduino. The ‘ln’ at the end means the String is terminated with a carriage return, so we know that’ll be the last thing we see.

Because we’re continuously sending data, our serialEvent() method now acts as our new draw() loop, so we can leave it empty:

Now for the big one: serialEvent() . Each time we see a carriage return this method gets called. We need to do a few things each time to keep things running smoothly:

  • read the incoming data
  • see if there’s actually anything in it (i.e. it’s not empty or ‘null’)
  • trim whitespace and other unimportant stuff
  • if it’s our first time hearing the right thing, change our firstContact boolean and let Arduino know we’re ready for more data
  • if it’s not our first run, print the data to the console and send back any valid mouse clicks (as 1’s) we got in our window
  • finally, tell Arduino we’re ready for more data

That’s a lot of steps, but luckily for us Processing has functions that make most of these tasks pretty easy. Let’s take a look at how it all breaks down:

Oof. That’s a lot to chew on, but if you read carefully line by line (especially the comments), it’ll start to make sense. If you’ve got your Arduino code finished and loaded onto your board, try running this sketch. You should see ‘Hello, world!’ coming in on the console, and when you click in the Processing window, you should see the LED on pin 13 turn on and off. Success! You are now a serial handshake expert.

Tips and Tricks

In developing your own projects with Arduino and Processing, there are a few ‘gotchas’ that are helpful to keep in mind in case you get stuck.

  • make sure your baud rates match
  • make sure you’re reading off the right port in Processing — there’s a Serial.list() command that will show you all the available ports you can connect to.
  • if you’re using the serialEvent() method, make sure to include the port.bufferUntil() function in your setup() method.
  • also, make sure that whatever character you’re buffering until (e.g., ‘\n’) is a character that you’re actually sending from Arduino.
  • If you want to send over a number of sensor values, it’s a good idea to count how many bytes you’re expecting so you know how to properly parse out the sensor data. (the example (shown below) that comes with Arduino gives a great example of this:

Resources and Going Further

Now that you know how to send data from Arduino to Processing and back again (even simultaneously!), you’re ready for some seriously cool projects. By hooking together Arduino and Processing, you can do things like visualize sensor data in real-time, or make a glove with flex sensors in the fingers that makes penguins appear on the screen, or a command console from Processing that controls a giant array of LEDs.

Here are a few useful links that you may find useful going forward:

Источник

Adblock
detector