
Навчіться керувати програмами на комп’ютері через серійну передачу даних. Використовуючи Processing, ви зможете змінювати кольори, керувати графічними елементами та інтегрувати пристрій із цифровим світом. Дізнайтеся, як встановити зв’язок між Arduino та ПК, працювати з Serial.write(), аналізувати отримані дані та налаштовувати взаємодію в режимі реального часу. Простий гід для всіх, хто хоче вийти за межі фізичних експериментів і розширити функціонал свого мікроконтролера!
Керування програмою на комп’ютері за допомогою серійної передачі даних.
Ви вже зробили багато цікавого у фізичному світі, а тепер настав час навчитися керувати комп’ютером за допомогою Arduino. Коли ви програмуєте свій мікроконтролер, відкривається з’єднання між комп’ютером і Arduino, що дозволяє передавати дані між пристроями та взаємодіяти з іншими програмами.
Arduino містить спеціальний чип, який перетворює USB-з’єднання комп’ютера у серійну передачу даних, яку використовує мікроконтролер. Це означає, що Arduino та ПК обмінюються інформацією по черзі, передаючи дані послідовно, один за одним у часі.
Під час серійного обміну даними пристрої повинні узгодити швидкість, з якою вони спілкуються між собою.
Ви, мабуть, помічали у вікні Serial Monitor число в нижньому правому куті. Це значення швидкості обміну даними – 9600 біт за секунду (або baud rate), що збігається зі значенням, яке ви вказуєте у функції Serial.begin()
. Саме з такою швидкістю Arduino і комп’ютер обмінюються інформацією.
Біт – це найменша одиниця інформації, яку розуміє комп’ютер. Ви вже використовували Serial Monitor, щоб переглядати значення з аналогових входів. Тепер ви застосуєте схожий метод, щоб передавати дані у програму, яку напишете в середовищі Processing.
Processing заснований на Java, а середовище програмування Arduino базується на Processing. Вони схожі за своєю структурою, тому вам буде легко розібратися!
Перед тим як розпочати проєкт, завантажте останню версію Processing з processing.org. Також корисно ознайомитися з підручниками “Getting Started” та “Overview”, які можна знайти на processing.org/learning. Вони допоможуть вам краще зрозуміти Processing перед тим, як ви почнете писати програму для зв’язку з Arduino.
Найефективніший спосіб передавати дані між Arduino та Processing – це використання функції Serial.write() в коді Arduino. Вона подібна до Serial.print(), яку ви вже використовували для надсилання інформації на підключений комп’ютер. Але на відміну від Serial.print(), яка передає текстові символи та числа, Serial.write() надсилає сирі байти в діапазоні 0-255. Це обмежує можливі значення, які можна передати, але дозволяє надсилати дані набагато швидше.
Як на комп’ютері, так і на Arduino, є так звана серійна буферна пам’ять (serial buffer), яка тимчасово зберігає інформацію, поки вона не буде прочитана програмою. Ви будете передавати байти з Arduino у серійний буфер Processing. Потім Processing зчитуватиме ці байти з буфера. Після зчитування інформації з буфера звільняється місце для нових даних.
При використанні серійної комунікації між пристроями та програмами важливо, щоб обидві сторони не лише узгодили швидкість обміну даними, а й розуміли, який тип інформації очікується.
Уявіть, що ви зустрічаєте людину і очікуєте почути “Привіт!”, але замість цього вона каже “Кіт пухнастий”. Це може вас спантеличити. Те саме стосується й програмного забезпечення – обидві сторони повинні узгодити, що саме буде передаватися і як воно буде інтерпретуватися.
Відкриття серійного з’єднання. Спочатку запрограмуйте Arduino. У функції setup() ініціалізуйте серійну комунікацію так само, як ви це робили раніше, коли переглядали значення з підключеного датчика. Програма в Processing, яку ви напишете, повинна мати таку ж швидкість обміну даними, як і ваш Arduino.
Передача значення датчика. У loop() ви будете використовувати команду Serial.write() для надсилання даних через серійне з’єднання. Функція Serial.write() може передавати лише значення від 0 до 255. Щоб переконатися, що ви відправляєте коректні значення, поділіть отримане аналогове значення на 4.
Стабілізація АЦП. Після надсилання байта зачекайте 1 мілісекунду, щоб дати АЦП (аналогово-цифровому перетворювачу) час для стабілізації. Завантажте програму в Arduino, а потім відкладіть його в бік, щоб написати скетч у Processing.
Імпорт бібліотеки для серійного з’єднання. Мова Processing схожа на Arduino, але має певні відмінності. Тому варто переглянути кілька підручників та розділ “Getting Started”, щоб ознайомитися з її особливостями. Відкрийте новий скетч Processing. На відміну від Arduino, Processing не підтримує серійні порти без підключення зовнішньої бібліотеки. Вам потрібно імпортувати бібліотеку серійної комунікації.
Створення об’єкта для зображення. Щоб працювати із зображеннями в Processing, потрібно створити об’єкт, який зберігатиме зображення, і дати йому ім’я.
void setup() { Serial.begin(9600); } void loop() { Serial.write(analogRead(A0)/4); delay(1); } import processing.serial.*; Serial myPort; PImage logo;
Змінна для збереження кольору фону. Створіть змінну, яка зберігатиме відтінок фону логотипу Arduino. Логотип є файлом у форматі .png і має вбудовану прозорість, що дозволяє бачити зміну кольору фону.
Налаштування режиму кольору. Processing має функцію setup(), подібну до Arduino. У цій функції відкривається серійне з’єднання та задаються параметри, які програма використовуватиме під час роботи.
Завантаження зображення. Можна змінювати спосіб роботи Processing із кольоровою інформацією. Зазвичай використовується формат RGB (Red, Green, Blue), що нагадує змішування кольорів у четвертому проєкті, коли змінювалися значення від 0 до 255 для керування кольором світлодіода RGB. У цьому проєкті використовується інший режим – HSB (Hue, Saturation, Brightness). Відтінок кольору змінюється при повороті потенціометра. Функція colorMode() приймає два аргументи: тип режиму та максимальне значення.
Виведення доступних серійних портів. Щоб завантажити логотип Arduino у скетч, його потрібно зчитати в об’єкт logo, створений раніше. При вказівці URL зображення Processing завантажує його під час запуску програми. Функція size() визначає розмір вікна відображення. Якщо використати logo.width і logo.height як аргументи, скетч автоматично підлаштується під розмір зображення.
Створення об’єкта серійного з’єднання. Processing дозволяє виводити статусні повідомлення за допомогою команди println(). Використовуючи її разом із функцією Serial.list(), можна отримати список усіх серійних портів комп’ютера при запуску програми. Це стане у пригоді для визначення порту, до якого підключено Arduino. Програмі потрібно передати інформацію про серійне з’єднання. Щоб ініціалізувати об’єкт myPort, необхідно вказати, що він є новим екземпляром серійного об’єкта. Програма має знати, з яким застосунком вона працює, через який серійний порт буде комунікація та з якою швидкістю.
int bgcolor = 0; void setup() { colorMode(HSB, 255); logo = loadImage(“http://arduino.cc/logo.png”); size(logo.width, logo.height); println(“Available serial ports:”); println(Serial.list()); myPort = new Serial(this, Serial.list()[0], 9600); }
Атрибут this повідомляє Processing, що серійне з’єднання буде використовуватися саме в цьому застосунку. Аргумент Serial.list()[0] вказує, який серійний порт використовується. Функція Serial.list() містить масив усіх підключених серійних пристроїв. Аргумент 9600 визначає швидкість обміну даними, що має бути вам знайомим, оскільки саме з таким значенням працює комунікація між пристроями.
Функція draw() аналогічна функції loop() в Arduino, оскільки виконується безперервно, оновлюючи вікно програми.
Щоб перевірити, чи є дані від Arduino, використовується команда myPort.available(). Вона дозволяє визначити, чи є в серійному буфері доступні байти. Якщо вони є, значення зчитується у змінну bgcolor і виводиться у вікно налагодження.
Функція background() задає колір вікна програми. Вона приймає три аргументи: перший – відтінок (hue), другий – яскравість (brightness), а третій – насиченість (saturation). Для відтінку використовується змінна bgcolor, а яскравість і насиченість встановлюються на максимальне значення – 255. Логотип Arduino малюється за допомогою команди image(). Ця функція потребує вказівки, що саме потрібно відобразити, а також координат для початку малювання у вікні. Координати 0,0 відповідають верхньому лівому куту, тому варто почати з цього положення.
Підключіть Arduino та відкрийте серійний монітор. Покрутіть потенціометр на макетній платі. Ви побачите набір символів у вікні монітора. Серійний монітор очікує ASCII-символи, а не сирі байти. ASCII – це формат кодування інформації для представлення тексту в комп’ютерах. У вікні монітора ви бачите, як він намагається інтерпретувати отримані байти у вигляді символів ASCII.
Коли використовується Serial.println(), інформація передається у форматі, зрозумілому для серійного монітора. Однак при використанні Serial.write(), як у цьому проєкті, передається сира інформація. Програми на зразок Processing можуть розпізнавати ці сирі байти та використовувати їх відповідно.
void draw() { if (myPort.available() > 0) { bgcolor = myPort.read(); println(bgcolor); } background(bgcolor, 255, 255); image(logo, 0, 0); }
Закрийте серійний монітор. Запустіть ескіз обробки, натиснувши кнопку зі стрілкою в IDE обробки. Подивіться на вікно виводу обробки. Ви повинні побачити список, схожий на малюнок нижче.
Це список усіх серійних портів на вашому комп’ютері. Якщо ви використовуєте OSX, шукайте рядок, схожий на “/dev/tty.usbmodem411” – він, найімовірніше, буде першим елементом у списку. На Linux порт може виглядати як “/dev/ttyUSB0” або подібний. У Windows він відображатиметься як COM-порт, такий самий, як і при програмуванні плати. Число перед ним – це індекс у масиві Serial.list()[]. Змініть число у вашому скетчі Processing, щоб відповідати правильному порту вашого комп’ютера.
Перезапустіть скетч Processing. Коли програма запуститься, поверніть потенціометр, підключений до Arduino. Ви побачите, як змінюється колір фону за логотипом Arduino. Також у вікні Processing будуть відображатися значення, що надходять від мікроконтролера. Ці числа відповідають сирим байтам, які ви передаєте з Arduino.
Після того, як ви покрутили і покрутили за бажанням, спробуйте замінити горщик на аналоговий датчик. Знайдіть щось цікаве, щоб контролювати колір. Яке відчуття взаємодії? Можливо, це відрізняється від використання миші чи клавіатури, чи здається вам це природним?
При використанні послідовного зв’язку лише одна програма може спілкуватися з Arduino одночасно. Отже, якщо ви використовуєте ескіз обробки, підключений до вашого Arduino, ви не зможете завантажити новий ескіз Arduino або використовувати монітор послідовного порту, доки не закриєте активну програму.
За допомогою Processing та інших середовищ програмування можна керувати мультимедійним контентом на комп’ютері новими та цікавими способами. Якщо вас захоплює ідея керування цифровим вмістом за допомогою Arduino, варто витратити трохи часу на експерименти з Processing. В обох середовищах – Processing та Arduino IDE – є кілька прикладів використання серійної передачі даних, які допоможуть вам поглибити свої знання.
Серійна передача даних дозволяє Arduino взаємодіяти з програмами на комп’ютері. Processing – це відкрите середовище програмування, на основі якого побудована Arduino IDE. Завдяки серійній комунікації ви можете керувати скетчем Processing безпосередньо за допомогою Arduino.