Сьогодні продовжимо розбиратись з нашою платою, і почнемо з того, як отримати натиснення кнопки. Якщо вас цікавить початок – переходьте сюди.
Якихось чітких інструкцій в інтернеті я не знайшов, зате в IDE було аж два демо проекти про кнопку:
- “Read the user button state on the Nucleo board.”
- “Read the user button using external interrupt.”
Код там досить простий, але я його ще спростив ось так:
#include "mbed.h" DigitalIn mybutton(USER_BUTTON); DigitalOut myled(LED1); int main() { while(1) { myled = mybutton; } }
Тобто так само як ми оголошуємо що змінна myled
міститиме рівень напруги на світлодіоді, так само ми оголошуємо що змінна mybutton
міститиме рівень напруги на кнопці.
В документації по mbed написано що оголошення DigitalIn
можна використовувати на будь-якому виводі, який позначений на схемі синьою міткою. Якщо на вході будь-яка напруга менше 0.8В – міститиме 0, якщо більше 2В – міститиме 1.
Що цікаво, коли я записав вищеподану програму на плату, світлодіод почав світитись, і почав вимикатись лише коли кнопка натиснута. Це пояснюється чудернацькою схемою підключення кнопок – якщо вона розімкнута – на вхід через резистор йде струм. Якщо замкнута – вхід заземляється, і струм йде в землю, тому там нуль.
Інший приклад – з перериванням:
#include "mbed.h" InterruptIn mybutton(USER_BUTTON); DigitalOut myled(LED1); void pressed() { myled = !myled; } int main() { mybutton.fall(&pressed); while (1) { // без цього - не працює wait(100); } }
Тут з кожним натисканням кнопки світлодіод вмикається або вимикається. Зауважте що тепер ми оголошуємо кнопку не як DigitalIn
, а як InterruptIn
.
Ок, може пора нарешті попрацювати руками? Хоча страшно, бо кажуть що руками ту плату можна й вбити, якщо створити коротке замикання в неправильному місці. Я от наприклад вирішив спробувати як вона працює окремо від комп’ютера, і замість того аби втикнути USB в комп’ютер, втикнув його в адаптер електричної мережі. Адаптер, як на ньому написано повинен був давати 5.1В 850мА постійного струму. Плата не захотіла моргати до мене світлодіодами, як було запрограмовано, просто LD1 (COM) загорівся загрозливим червоним. Тому напевне спершу піду ще раз інструкцію прочитаю.

Схема виходів. В коді дозволяється використовувати лише ті що написані білим в синіх і зелених прямокутничках.
Шкода що не маю мультиметра, можна було б подивитись яка напруга на яких контактах.
З того що я начитався, виходить що там де написано 5v – є напруга 5В, там де 3V3 – 3.3В. (такий запис – це хитрий спосіб прибрати зайвий символ – десяткову крапку, і зробити підпис компактнішим.) До п’ятивольтового контакту світлодіоди краще приєднувати через резистор. GND – це заземлення (мінус).
В світлодіода довша ніжка – це +, коротша -, або та ніжка що всередині корпусу діода має в собі більше металу – це мінус.
І це можна перевірити, втикаючи світлодіод в 3V3 та GND. Або послідовно з резистором в 5V та GND.
Тепер, давайте зробимо так, щоб наш перемикач з останнього лістингу керував зовнішнім світлодіодом. Для цього втикаємо його мінус в GND, в A5 наприклад втикаємо резистор, і з’єднуємо додатню ніжку діода з резистором.
Замінюємо визначення: DigitalOut myled(LED1);
на DigitalOut myled(PC_0);
. Перепрошиваємо, і тепер вже зовнішній світлодіод повинен реагувати на нашу кнопку.
Далі я написав програмку яка змушувала б вбудований LED показувати стан піна A5 як входу.
#include "mbed.h" DigitalIn mycontact(PC_0); DigitalOut myled(LED1); int main() { while (1) { myled = mycontact; } }
І дуже здивувався, бо коли я опускав туди лише одну ніжку резистора – діод засвічувався. Я подумав що струм тече в мене як заземлення і відпустив резистор – діод все одно світився. Дивно. Або я ще чогось не знаю, або в платі якийсь брак. Думаю варто переключитись на вбудовану кнопку до з’ясування обставин.
Що ще хотілось би зробити – так це взаємодію з комп’ютером. Нехай по натисненні кнопки, комп’ютер виконує якусь команду.
Виявляється, що при приєднанні контролера до комп’ютера, він окрім того що розпізнається як диск, ще й додає пристрій який називається /dev/ttyACM*
(замість зірочки має бути якесь число). Принаймі так написано в документації.
Ми можемо подивитись що на цьому пристрої, за допомогою команди:
sudo cat /dev/ttyACM0
Якщо треба вийти, то натискаємо Ctrl+A
а тоді вводимо команду :quit
. Тепер, можемо змусити контролер посилати нашому комп’ютеру всілякі повідомлення по натисненні кнопочки:
InterruptIn mybutton(USER_BUTTON); Serial pc(USBTX, USBRX); void pressed() { pc.printf("I'm clicked!\r\n"); } int main() { mybutton.fall(&pressed); while (1) { wait(100); } }
І ми побачимо щось таке:
$> sudo cat /dev/ttyACM0 I'm clicked! I'm clicked! I'm clicked!
І тепер, ми можемо змусити якийсь процес читати цей пристрій і виконувати з нього команди. Наприклад такий Python скрипт:
import os with open('/dev/ttyACM0', 'rb', 0) as f: while True: message = f.read(5) # reading 5 byte messages if message == 'ALARM': os.system('mplayer -fs /home/bunyk/video/beastie_boys_sabotage.flv')
Замінюємо повідомлення з "I'm clicked!\r\n"
на І вийде просто чудова кнопка тривоги наприклад:
Filed under: Інструменти, Кодерство, Конспекти Tagged: C++, hardware
