Блоґ одного кібера

Історія хвороби контуженого інформаційним вибухом

Stm32 Nucleo – вхідні сигнали і комунікація з компю’тером

with 10 comments

Сьогодні продовжимо розбиратись з нашою платою, і почнемо з того, як отримати натиснення кнопки. Якщо вас цікавить початок – переходьте сюди.

Якихось чітких інструкцій в інтернеті я не знайшов, зате в 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" на І вийде просто чудова кнопка тривоги наприклад:

Advertisements

Written by bunyk

Лютий 21, 2015 at 15:04

Оприлюднено в Інструменти, Кодерство, Конспекти

Tagged with ,

Відповідей: 10

Subscribe to comments with RSS.

    • Додам трошки конструктивної критики:

      1.”Що цікаво, коли я записав вищеподану програму на плату, світлодіод почав світитись, і почав вимикатись лише коли кнопка натиснута. Це пояснюється чудернацькою схемою підключення кнопок – якщо вона розімкнута – на вхід через резистор йде струм. Якщо замкнута – вхід заземляється, і струм йде в землю, тому там нуль.”

      це зовсім не чудернацька, а типова схема підключення кнопок, детальніше тут:
      http://chipenable.ru/index.php/how-connection/item/13-kak-podklyuchit-k-mikrokontrolleru-knopki.html
      http://easyelectronics.ru/podklyuchenie-mikrokontrollera-likbez.html

      2. ” До п’ятивольтового контакту світлодіоди краще приєднувати через резистор. GND – це заземлення (мінус).”

      До будь-якого світлодіоду потрібно під’єнувати резистор. Величина цього резистора визначається по формулі (Uживлення – Uпадіння на діоді (береться з документації))/струм через діод (зазвичай не перевищує 20мА). Ніжка мікроконтроллера не може видати більше ніж 20мА (якщо взяти більше, можна пошкодити мікроконтроллер, тому використовують транзисторні ключі.Але якщо світлодіод 1 то можна включати напряму (ми в продакшин ніколи такі варіанти не пускаємо). Приклад розрахунку резистора світлодіоду:
      світлодіод – C5SMF-RJS-CT0W0BB2, документація(http://www.digikey.com/product-detail/en/C5SMF-RJS-CT0W0BB2/C5SMF-RJS-CT0W0BB2CT-ND/1987481) каже що падіння на ньому 2.1В (тобто це напруга роботи потрібна щоб світлодіод працював, якщо більше він згорить), максимальний струм це 20мА. Пін мікр. в нас 3.3В – а нам потрібно 2.1, тому рахуємо резистор який погасить зайву напругу( яка рівна (3.3 – 2.1) , струм задамо 10мА ,загальна формула буде наступна
      (3.3 – 2.1)/ 0.01 (10mA = 1/10 = 0.01A) = 1.2 (напруга яку ми погашаємо, зайва) / 0,01 = 120 Ом, якщо є такий номінал резисторів вибираємо його, якщо нема, вибираємо найближчий.

      3. “дуже здивувався, бо коли я опускав туди лише одну ніжку резистора – діод засвічувався. Я подумав що струм тече в мене як заземлення і відпустив резистор – діод все одно світився. Дивно. Або я ще чогось не знаю, або в платі якийсь брак” – пін на якому є кнопка обовзяково має мати стійкий стан, високий або низький, тому що по замовчуванню вона плаваюча (float state) і будь яка зміна він пальця міняє рівень випадково, тому діод засвічується (прочитай про pull – up та pull -down резистори) .

      якщо маєш запитання, із радістю відповім.

      Nemo

      Лютий 21, 2015 at 18:01

  1. Також рекомендую курси
    https://www.edx.org/course/embedded-systems-shape-world-utaustinx-ut-6-02x#.VOyIrtWUc9V
    https://www.edx.org/course/electronic-interfaces-bridging-physical-uc-berkeleyx-ee40lx#.VOyIlNWUc9U

    вони дають хорошу базу в програмуванні мікроконтроллерів, та електроніці.

    Nemo

    Лютий 24, 2015 at 16:22


Залишити відповідь

Заповніть поля нижче або авторизуйтесь клікнувши по іконці

Лого WordPress.com

Ви коментуєте, використовуючи свій обліковий запис WordPress.com. Log Out / Змінити )

Twitter picture

Ви коментуєте, використовуючи свій обліковий запис Twitter. Log Out / Змінити )

Facebook photo

Ви коментуєте, використовуючи свій обліковий запис Facebook. Log Out / Змінити )

Google+ photo

Ви коментуєте, використовуючи свій обліковий запис Google+. Log Out / Змінити )

З’єднання з %s

%d блогерам подобається це: