середа, 14 вересня 2016 р.

STM32: Експорт проекту з mbed до засобу розробки CooCox IDE

Опис експорту в малюнках

Онлайн засіб розробки це добре, бо маєш доступ до своїх проектів з будь якого комп'ютера на будь якій операційній системі, що має доступ до інтернету. Але буває потрібно попрацювати і в оффлайн.
Онлайн засіб розробки mbed дозволяє експортувати створені в ньому проекти до інших IDE, таких як (на час написання цієї статті): Keil uVision4CooCox CoIDESystem Workbench for STM32IAR System, тощо.
Давайте спробуємо експортувати, для прикладу, будь який робочий проект з mbed до CooCox CoIDE і перевірити вже там як компілюється, прошивається і працює наш проект. CooCox CoIDE взятий для прикладу, принцип експорту один й той самий і для інших IDE.
Я за приклад візьму проект з попередньої статті "Підключення 1602 LCD Keypad Shield до STM32F103 Nucleo в засобі розробки mbed". Заходжу до компілятора mbed. З списку проектів, що в вікні ліворуч "Program Workspace" обираю проект "LCD_KeyPad_Shield", та в вікні "Program Details", що праворуч тисну "Export":
Обираємо і експортуємо
Далі відкриється вікно де потрібно обрати ваш засіб розробки зі списку. Я обираю CooCox CoIDE:
Обираємо засіб розробки
Далі тиснемо кнопку "Export" і в теку для завантажень отримуємо zip архів з проектом "LCD_Keypad_Shield_coide_nucleo_f103rb.zip". Копіюємо вміст архіву, теку "LCD_Keypad_Shield" до теки "workspace" нашого CooCox CoIDE.
Тепер запустимо засіб розробки CooCox CoIDE і в ньому відкриємо експортований проект. Отакої, всі коментарі кирилицею - спотворено. Але то нічого, сама програма від того не постраждала. Компілюємо. Прошиваємо до мікроконтролеру. РаДіємо що все працює. 

Відео опис експорту

середа, 7 вересня 2016 р.

STM32: Тестер батарейок з STM32F103 Nucleo та 1602 LCD Keypad Shield

Для ознайомлення з такою периферією мікроконтролера як АЦП (ADC) зробімо простенький прилад "Тестер батарейок 1.5 В і акумуляторів 1.2 В". Який буде вимірювати напругу на батарейці чи акумуляторі і виводити на екран інформацію про напругу в вольтах чи мілівольтах. А також приблизну інформацію про стан батарейки чи акумулятора: чудовий, середній, поганенький, розряджена.

Матеріали і засоби

  1. Плата розробника серії Nucleo (наприклад STM32F103 Nucleo)
  2. Плата розширення LCD Keypad Shield з дисплеєм LCD WH1602 (HD44780)
  3. Будь яка контактна макетна плата breadboard (наприклад така)
  4. Один резистор 1.8 - 2.2 КОм
  5. Чотири з'єднувальні дроти два такі і два такі
  6. Засіб розробки  "mbed compiler workspace" (знайомство з mbed тут)

Схема

Схема дуже проста. Плату розширення LCD Keypad Shield з'єднуєте "бутербродом" з платою розробника STM32F103 Nucleo відповідними роз'ємами Arduino connector. Як вже робили в попередній статті "Підключення 1602 LCD Keypad Shield до STM32F103 Nucleo в засобі розробки mbed".
Між землею і виводом А1 поставити резистор на 1.8 - 2 кОм. І вивести дроти на батарейку, або на тримач батарейок, якщо є в наявності, як показано на малюнку.
Схема підключення

Програма

Програма трішки нагадує програму з попередньої статті "Підключення 1602 LCD Keypad Shield до STM32F103 Nucleo в засобі розробки mbed". В текст програми додано детальні коментарі. Додаткових пояснень не потребує. Константу "const int Vref" треба підібрати відповідно до опорної напруги. Якщо є можливість заміряти напругу 3.3 В на платі розробника точним приладом у мілівольтах - це і буде константа. Як ні, то достатньо приблизно вказати "3330". Все одно це більш іграшка для ознайомлення, чим серйозний прилад.
  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
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#include "mbed.h"
#include "freetronicsLCDShield.h"

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

int main()
{
    /* оголошуємо змінну типу float для значень з аналогового
       входу A0, куди підключений keypad */
    float val_button;
    /* оголошуємо змінну типу float для значень з аналогового
       входу A1, на якому будемо тестувати батарейки */
    float meas;
    /* Так як значення зчитуємо з АЦП в межах від 0 до 1, то напруга яку можна
        поміряти 3.3 Вольта це без дільника напруги */
    const int Vref = 3393; // опорна напруга в мілівольтах (для точності підбирається)
    // прапорець - виводити на екран виміряну напругу у вольтах чи мілівольтах
    bool flag_voltage = false;
    // прапорець - міряємо батарейку 1.5В або акумулятор 1.2В
    bool flag_battery = true;
    
    lcdKeypad.cls(); // Очищаємо дисплей
    
    while(1)
    {
        /*Зчитуємо значення на аналоговому вході A0.
        Так як значення в межах від 0 до 1, то множимо на 1000*/
        val_button = lcdKeypad.readButton()*1000;
        // Зчитуємо значення на аналоговому вході A1.
        meas = analog_value.read();
        
        if (flag_battery)
        {
            // Встановлюємо курсор в позицію 0,0 
            lcdKeypad.setCursorPosition(0, 0);
            lcdKeypad.printf("Battery: ");
            
            if (meas == 0)
            {
                // Якщо значення 0 то нічого не під'єднано
                lcdKeypad.printf("No Batt");
            }
            
            if (meas * Vref > 1400)
            {
                // Якщо значення більше 1.4В то батарейка в доброму стані
                lcdKeypad.printf("Perfect");
            }
            else if (meas * Vref < 1400 && meas * Vref > 1100)
            {
                // Якщо значення між 1.1В і 1.4В то батарейка середньо розряджена
                lcdKeypad.printf("Middle ");
            }
            else if (meas * Vref < 1100 && meas * Vref > 950)
            {
                // Якщо значення між 0.95В і 1.1В то батарейка майже розряджена
                lcdKeypad.printf("Badly  ");
            }
            else if (meas * Vref < 950)
            {
                // Якщо значення менше 0.95В то батарейка розряджена
                lcdKeypad.printf("Died   ");
            }
            // Встановлюємо курсор в позицію 1,0 
            lcdKeypad.setCursorPosition(1, 0);
            lcdKeypad.printf("Vbat = ");
        }
        else
        {
            // Встановлюємо курсор в позицію 0,0 
            lcdKeypad.setCursorPosition(0, 0);
            lcdKeypad.printf("Accum  : ");
            
            if (meas == 0)
            {
                // Якщо значення 0 то нічого не під'єднано
                lcdKeypad.printf("No Acc ");
            }
            
            if (meas * Vref > 1150)
            {
                // Якщо значення більше 1.15В то акумулятор в доброму стані
                lcdKeypad.printf("Perfect");
            }
            else if (meas * Vref < 1150 && meas * Vref > 1100)
            {
                // Якщо значення між 1.1В і 1.15В то акумулятор середньо розряджений
                lcdKeypad.printf("Middle ");
            }
            else if (meas * Vref < 1100 && meas * Vref > 1000)
            {
                // Якщо значення між 1В і 1.1В то акумулятор майже розряджений
                lcdKeypad.printf("Badly  ");
            }
            else if (meas * Vref < 1000)
            {
                // Якщо значення менше 1В то акумулятор розряджений
                lcdKeypad.printf("Died   ");
            }
            
            // Встановлюємо курсор в позицію 1,0 
            lcdKeypad.setCursorPosition(1, 0);
            lcdKeypad.printf("Vacc = ");
        }
        
        if (flag_voltage)
        {
            /*Так як значення meas в межах від 0 до 1, а опорна напруга має 3300 mV
            то множимо на 3300 mV (для точності треба заміряти точним приладом)*/
            meas = meas * Vref;
            // Друкуємо результат вимірювань
            lcdKeypad.setCursorPosition(1, 7);
            lcdKeypad.printf("%.0f mV     ", meas);
        }
        else
        {
            /*Так як значення meas в межах від 0 до 1, а опорна напруга має 3.3 V
            то множимо на 3.3 V (для точності треба заміряти точним приладом)*/
            meas = meas * Vref / 1000;
            // Друкуємо результат вимірювань
            lcdKeypad.setCursorPosition(1, 7);
            lcdKeypad.printf("%.2f V     ", meas);
        }
        
        // Перевіряємо яку кнопку натиснуто
        if (val_button < 50)
        {
            // встановлюємо прапорець для тестування батарейок
            flag_battery = true;
        }
        else if (val_button < 250)
        { 
            // встановлюємо прапорець щоб показувати напругу в мілівольтах
            flag_voltage = true;
        } 
        else if (val_button < 500)
        { 
            // встановлюємо прапорець щоб показувати напругу в вольтах
            flag_voltage = false;
        } 
        else if (val_button < 800)
        { 
            // встановлюємо прапорець для тестування акумуляторів 
            flag_battery = false;
        } 
    }
}
Створіть нову пусту програму в mbed, додайте до проекту бібліотеки "mbed.h" і "freetronicsLCDShield.h". Як це зробити в статті  "Підключення 1602 LCD Keypad Shield до STM32F103 Nucleo в засобі розробки mbed". Скопіюйте цю програму до редактора. Компілюєте, завантажений файл копіюєте чи переносите до диску "Nucleo". Все! Тестер батарейок готовий.
Тестер батарейок

Як користуватись

При увімкнені, за замовчуванням, тестуємо батарейки у Вольтах. Кнопка догори "UP" - міряємо у мілівольтах, кнопка вниз "DOWN" - міряємо у Вольтах. Кнопка ліворуч "LEFT" - міряємо акумулятор 1.2В, кнопка праворуч "RIGTH" - батарейку 1.5В. Міряти можна виключно елементи живлення до 3.3 Вольта. Висока напруга може вивести мікроконтролер з ладу.