LinkedIn YouTube Facebook
Szukaj

Wstecz
Artykuły

[PRZYKŁAD] STM32NUCLEO: pierwsze kroki z mbed

Projekt aplikacji sterującej diodami LED

Pierwsza aplikacja demonstracyjna będzie miała za zadanie miganie z częstotliwością 2 Hz zieloną diodą LD2, jaka jest dostępna w zestawie. W tym celu wykorzystamy biblioteczną klasę DigitalOut, której opis można znaleźć po rozwinięciu elementu mbed, a następnie Classes.

Kopiując przykład zawarty w dokumentacji danej klasy i kompilując projekt uzyskujemy gotowy plik, który należy zapisać na dysk Nucleo zestawu. Jak można zauważyć, nazwy takie jak LED1 są już zdefiniowane dla konkretnego zestawu, przez co nie musimy przeglądać schematów elektrycznych celem znalezienia nazwy wyprowadzenia mikrokontrolera.

Listing pierwszej aplikacji wygląda następująco:

// Toggle a LED
#include "mbed.h"

DigitalOut led(LED1);

int main() {
    while(1) {
        led = !led;
        wait(0.25);
    }
}

Jak widać kod aplikacji jest dość prosty i sprowadza się jedynie do utworzenia obiektu klasy DigitalOut przy pomocy konstruktora z argumentem zdefiniowanym jako LED1, cyklicznej zmiany stanu obiektu (diody) na przeciwny oraz czekania 250 ms. Zaletą tworzenia aplikacji w języku C++ w porównaniu do zwykłego C jest możliwość wykonywania operacji z wykorzystaniem samych obiektów, bez konieczności wywoływania przy tym funkcji jak np. read()/write() (mamy tutaj do czynienia z przeciążaniem operatorów).

W kolejnej wersji aplikacji dodamy obsługę przycisku ogólnego przeznaczenia, po wciśnięciu którego dioda zacznie migać, a po odpuszczeniu jej ostatni stan zostanie zachowany. Tym razem potrzebny będzie jeszcze obiekt klasy DigitalIn zainicjalizowany na wartość zdefiniowaną jako USER_BUTTON. Stan przycisku odczytujemy w prosty sposób poprzez pobranie wartości zmiennej enable (obiekt klasy DigitalIn):

// Flash a LED while an USER BUTTON is pressed

#include "mbed.h"

DigitalIn enable(USER_BUTTON);
DigitalOut led(LED1);

int main() {
    while(1) {
        if(!enable) {
            led = !led;
        }
        wait(0.25);
    }

 

Fot. 1. Sterowanie zewnętrznymi diodami modułu KAmodLED8

W ostatnim przykładzie zmodyfikujemy nasz program tak, aby obsługiwał zewnętrzne diody LED podłączone do zestawu w sposób pokazany na rysunku 2 – wykorzystano tutaj moduł z 8 diodami KAmodLED8 (fotografia 1). W danym zestawie Nucleo linie D0 oraz D1 są domyślnie odłączone od mikrokontrolera (rysunek 3) dlatego w ich miejsce wybrano odpowiednio linie D8 oraz D9

Rys. 2. Uproszczony schemat podłączenia diod LED do zestawu Nucleo-F334R8

Rys. 3. Domyślnie linie D0 i D1 są odłączone od mikrokontrolera

W pierwszej kolejności należy utworzyć obiekty poszczególnych diod i można to zrobić deklarując tablicę obiektów klasy DigitalOut. Każdy element tablicy jest inicjalizowany przy pomocy konstruktora z argumentem zdefiniowanym jako D2…D9 (nazwy wyprowadzeń zgodne z systemem Arduino i oznaczone na płytce Nucleo). W głównej pętli programu zamiast operowania na pojedynczym obiekcie będziemy operować na elementach tablicy. Wprowadzając dodatkową zmienną zliczającą od 0 w górę i wykorzystując operację modulo będzie można uzyskać dostęp do elementów z indeksem od 0 do 7. W wyniku działania programu uzyskamy efekt przesuwającej się diody:

 

// Rotate a LED on KAmodLED8 module

#include "mbed.h"

DigitalOut KAmodLED8[] = {DigitalOut(D8), DigitalOut(D9), DigitalOut(D2), DigitalOut(D3),
                          DigitalOut(D4), DigitalOut(D5), DigitalOut(D6), DigitalOut(D7)
                         };

int main() {
    int i = 0;
    
    while(1) {
        // Turn on LED
        KAmodLED8[i % 8] = 1;
        
        // Wait 0.25 s
        wait(0.25);
        
        // Turn off LED
        KAmodLED8[i++ % 8] = 0;
    }
}

Autor: Jan Szemiet