вівторок, 23 серпня 2016 р.

STM32: Підключення 1602 LCD Keypad Shield до STM32F103 Nucleo в засобі розробки mbed


Компанія STMicroelectronics виробляє плати розробника серії STM32 Nucleo, які підтримуються в онлайн засобі розробки mbed. І мають роз'єм сумісний з популярними і розповсюдженими платами розширення сімейства ARDUINO. Спробуємо на практиці підключити ось таку плату розширення LCD Keypad Shield з рідкокристалічним текстовим дисплеєм 1602 (16 символів, 2 рядки) та клавіатурою з 5 кнопок (вверх, вниз, ліворуч, праворуч, вибір), які підключені через резисторний дільник до одного аналогового входу A0. Кнопка "RST" (скидання) дублює аналогічну кнопку, що на платі розробника. Такі плати розширення LCD Keypad Sield та її клони існують в декількох варіантах. В мене, наприклад, спрощена схема підсвічування індикатора. Підсвічування вмикається від живлення плати. А є плати де підсвічування дисплею виведено на окремий A3 вивід і підсвічуванням дисплею можна керувати програмно. Увімкнути чи вимкнути підсвічування, або навіть регулювати яскравість підсвічування, коли налаштувати вихід A3 як PwmOut.
1602 LCD keypad shield
Підключати будемо до плати розробника STM32F103 Nucleo, але підійде будь яка плата серії Nucleo з роз'ємами arduino connector.
STM32F103 Nucleo
Підключення на рівні заліза дуже просте. Просто з'єднати плату розробника та плату розширення одну до одної "бутербродом" відповідними роз'ємами. Помилитись складно.

А от над програмним підключенням попрацюємо. Заходимо через браузер до "mbed compiler workspace". Ви маєте бути там зареєстровані. Як це зробити у дописі: "Знайомство з STM32F103 Nucleo та засобом розробки mbed".

Створюємо новий проект. Тиснемо "New" у верхньому лівому кутку засобу розробки mbed, або комбінацію кнопок"Ctrl+N". У вікні, що з'явиться обираємо "Nucleo-F103RB", або свою платформу, якщо відрізняється. З шаблонів обираємо пусту програму "Empty Program" і даємо назву програмі "1602_LCD_keypad_shield".
Створення нової прогарами
Тиснемо "OK". В просторі "Program Workspace" створиться наш новий пустий проект. 
Тепер наповнимо наш проект змістом. На назві нашої нової програми "1602_LCD_keypad_shield" клікаємо правою кнопкою миші (викликаємо контекстне меню) і обираємо створити новий файл "New File".
Створюємо новий файл
Даємо ім'я новому файлу "main.cpp" і тиснемо "OK".
Даємо назву main.cpp
Далі потрібно додати до проекту бібліотеку mbed. Аналогічно як додавали до проекту новий файл main.cpp, викликаємо контекстне меню проекту і обираємо "Import Library". Далі "From Import Wizard". В рядку пошуку "search" вводимо "mbed" без лапок і тиснемо кнопку "Search". Обираємо подвійним кліком миші бібліотеку "The official mbed C/C++ SDK provides the software platform and libraries to build your applications".
Підключення бібліотеки mbed
Ще потрібно підключити бібліотеку для роботи з нашим "LCD Keypad Shield". Аналогічно, як підключали до проекту бібліотеку "mbed", підключаємо бібліотеку для роботи з нашою платою розширення "LCD Keypad Shield". Для цього викликаємо контекстне меню проекту і обираємо "Import Library". Далі "From Import Wizard". В рядку пошуку "search" вводимо "lcd shield" без лапок і тиснемо кнопку "Search". Із списку обираємо бібліотеку "freetronicsLCDShield" A basic library for the Freetronics arduino LCD shield.

Все готово щоб почати писати програму. В дереві проекту обираємо файл "main.cpp" і першими рядками підключимо потрібні бібліотеки:
1
2
#include "mbed.h"
#include "freetronicsLCDShield.h"
Додамо в програму головну функцію main і безкінечний цикл. Тепер шаблон нашої програми буде виглядати так:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#include "mbed.h"
#include "freetronicsLCDShield.h"

int main()
{
    while(1)
    {
        
    }
}
Щоб дізнатись як працювати з бібліотекою "freetronicsLCDShield", заглянемо до довідки. В дереві проекту розгортаємо "freetronicsLCDShield", натиснувши на "+", далі "Classes" і "freetronicsLCDShield". Відкриється вкладка з довідкою на бібліотеку.
freetronicsLCDShield Class Reference
Спочатку до головної функції за допомоги конструктора створимо об'єкт. Дамо йому назву "lcdKeypad", та вкажемо всі потрібні для роботи піни.
1
freetronicsLCDShield lcdKeypad(D8, D9, D4, D5, D6, D7, D3, A0);
Де D8 - rs, D9 - enable, D4-D7 - data, D3 - back light, A0 - keypad.

І тепер в програмі ми можемо звертатись до членів класу через оператор - "."
Де "lcdKeypad" це назва класу, а члени це функції, такі як - cls, setCursor, home, readButton, тощо. Докладно дивитись в довідку по бібліотеці "freetronicsLCDShield".

Спочатку напишемо програму яка буде показувати на екран отримані значення від натискання той чи іншої кнопки. Максимально доповнив програму коментарями, має бути все зрозумілим.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include "mbed.h"
#include "freetronicsLCDShield.h"

// Оголошуємо клас freetronicsLCDShield з назвою lcdKeypad,
// та вказуємо всі потрібні піни для роботи
freetronicsLCDShield lcdKeypad(D8, D9, D4, D5, D6, D7, D3, A0); 

int main()
{
    // оголошуємо змінну типу float для значень з аналогового
    // входу A0, куди підключений keypad
    float val_button;
    // Очищаємо дисплей
    lcdKeypad.cls();
    // В позицію 0,0 пишемо текстовий рядок "STM32: mBed"
    lcdKeypad.printf("STM32: mBed");
    // чекаємо 2-ві секунди
    wait(2);
    
    while(1)
    {
        // Встановлюємо курсор в позицію 1,0 
        lcdKeypad.setCursorPosition(1, 0);
        // Зчитуємо значення на аналоговому вході A0.
        // Так як значення в межах від 0 до 1, то множимо на 1000
        val_button = lcdKeypad.readButton()*1000;
        // Друкуємо на дисплей отримані значення на аналоговому вході A0
        lcdKeypad.printf("Value: %4.0f", val_button);
        // Чекаємо 0.2 секунди щоб отримані значення не так швидко "мерехтіли"
        wait(0.2);
    }
}
Після того як ввели програму, компілюємо її, та переносимо на диск "Nucleo". Програма "заллється" в мікроконтролер і на екрані в першому рядку з'явиться напис "STM32: mBed", а в другому рядку "Value: 1000".
Результат роботи програми
Натискаємо по черзі на кнопки і занотовуємо отримані значення. Мої значення при натисканні на кнопки такі: нічого не натиснуто - 1000, left - 728, down - 468, up - 196, right - 0, select - 1000. Отакої! Виходить, що натискання на кнопку "SELECT" я ніяк не зможу відстежити, мабуть це
якийсь брак конкретно мого екземпляру. Але нічого страшного, достатньо і чотирьох кнопок.

Як виявилось це не брак плати, а "конфлікт" напруг. Напруга, яку подають на резистивний дільник з кнопками, дорівнює 5 вольтам, а максимальна напруга яку міряє наш АЦП - 3.3 вольта. Тому, все що вище 3.3 вольта, не відстежується. Треба плату LCD доопрацювати. Це або живити дільник від 3.3 вольт, або змінити номінали резисторів на дільнику.

Внесемо зміни до програми. Щоб при натисканні на кнопки, на дисплей виводився напис, яку кнопку ми натиснули. 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include "mbed.h"
#include "freetronicsLCDShield.h"

// Оголошуємо клас freetronicsLCDShield з назвою lcdKeypad,
// та вказуємо всі потрібні піни для роботи
freetronicsLCDShield lcdKeypad(D8, D9, D4, D5, D6, D7, D3, A0); 

int main()
{
    // оголошуємо змінну типу float для значень з аналогового
    // входу A0, куди підключений keypad
    float val_button;
    // Очищаємо дисплей
    lcdKeypad.cls();
    // В позицію 0,0 пишемо текстовий рядок "STM32 : mBed"
    lcdKeypad.printf("STM32 : mBed");
    // чекаємо 2-ві секунди
    wait(2);
    
    while(1)
    {
        // Встановлюємо курсор в позицію 1,0 
        lcdKeypad.setCursorPosition(1, 0);
        // Зчитуємо значення на аналоговому вході A0.
        // Так як значення в межах від 0 до 1, то множимо на 1000
        val_button = lcdKeypad.readButton()*1000;
        // Перевіряємо яку кнопку натиснуто
        if (val_button < 50)
        {
            lcdKeypad.printf("BUTTON: Right  ");
        }
        else if (val_button < 250)
        { 
            lcdKeypad.printf("BUTTON: Up     ");
        } 
        else if (val_button < 500)
        { 
            lcdKeypad.printf("BUTTON: Down   ");
        } 
        else if (val_button < 800)
        { 
            lcdKeypad.printf("BUTTON: Left   "); 
        } 
        else if (val_button > 950)
        { 
            lcdKeypad.printf("BUTTON: Nothing");
        }
        // Чекаємо 0.1 секунду
        wait(0.1);
    }
}
Компілюємо, переносимо до диску "Nucleo". Програма "заллється" до мікроконтролеру і на екрані побачимо таку "картину".
Результат роботи програми
Тепер при натисканні кнопок на дисплей буде виводитись напис: up, down, left, right.

В кого в "LCD Keypad Shield" підсвічування дисплею під'єднане коректно до піну D3, то треба додати до програми рядок "lcdKeypad.setBackLight(true);", щоб увімкнути підсвічування, або "lcdKeypad.setBackLight(false);", щоб вимкнути підсвічування. Наприклад, якщо натиснута кнопка "up" - вмикаємо підсвічування, "down" - вимикаємо.

Відео приклад

Коротке відео, як створити новий пустий проект, під'єднати потрібні бібліотеки. Далі вставляємо програму що вище з цієї статті, компілюємо, "заливаємо" до мікроконтролеру та розглядаємо як працює програма.


Немає коментарів:

Дописати коментар