Tickers w zastosowaniu do sterowania diodą (testy platformy Nucleo-F401RE)

Ćwiczenie 1: Sprawdzenie poprawność instalacji środowiska mbed-cli

To ćwiczenie stanowi naturalną kontynuację instrukcji konfiguracji i uruchamiania przykładowego programu na mikrokontrolerze STM platformy NUCLEO-F401RE (Ilustracja 1), kompilowanego przy użyciu ARM mbed-cli systemu MBED OS Internetu Rzeczy.

Ilustracja 1: Platforma NUCLEO-F401RE [UM1724] z trzema modułami rozszerzeń zainstalowanymi kaskadowo.

1. Programowanie przy użyciu kompilatora działającego w chmurze obliczeniowej

W pierwszej części tego ćwiczenia wykorzystamy platformę os.mbed.com, udostępniającą narzędzie programistyczne Cloud SDK. W tym celu należy utworzyć konto na platformie mbed i po zalogowaniu się, otworzyć podstronę kompilatora ide.mbed.com/compiler. W prawym górnym rogu (Ilustracja 2) uruchamiamy okno wyboru platformy (ST-LINK/V2-1 jest zainstalowany i nasz układ jest w tym momencie podłączony do komputera za pomocą kabla do portu USB obsługiwanego przez emulator portu szeregowego, zob. opis do Projektu z "Mechatroniki" ).

Ilustracja 2: Przycisk okna wyboru platformy rozwojowej

Kilkamy Add Board, wskazujemy platformę i klikamy Add to your Mbed compiler. W menu okna Mbed IDE klikamy New i wybieramy pierwszy przykładowy program (Template) o nazwie "Blinky LED test for the ST Nucleo boards". Program jest bardzo krótki i zawiera tylko kilka linii kodu. Usuwamy zawartość okna edytora i przepisujemy kod z Wydruku 1.


WYDRUK 1
  
/* Ćwiczenie nr 1 
 * 
 * Wykorzystanie dwóch zegarów do zmiany częstotliwości
 *
 * błyskania diody (naprzemiennie 2 i 10 razy/sek.)
 *
 */

#include "mbed.h"

InterruptIn button(USER_BUTTON);
DigitalOut led(LED1);
Ticker tic1, tic2;

int state = 3;

void led_on(){
 led = 1;
 printf("LED ON\r\n"); //wyświetl w oknie terminala, jeśli jest podłączony
}

void led_off(){
 led = 0;
 printf("LED OFF\r\n");
}

void switch_blinking(){
 if(state == 2) state = 1;
 if(state == 3) state = 0;
}

int main()
{
 button.rise(&switch_blinking);
 while(1){
  if(state == 0){
   tic1.attach(&led_on, 0.1);
   tic2.attach(&led_off, 0.5); //zgaśnie po 0.5 sek.
   state = 2;
  }
  if(state == 1){
   tic1.detach();
   tic2.detach();
   led = 0;
   state = 3;
  }
 }
}
* kod sformatowano w kolorach C++ za pomocą narzędzia konwersji kodu do html na stronie hilite.me

Inicjujemy kompilację wciskając Compile. Po zakończeniu, zapisujemy wygenerowany plik "bin" w pamięci flash układu, widocznej w eksploratorze Windows'a pod określonym dyskiem (tutaj, G:). Teraz wciskamy niebieski przycisk na płytce NUCLEO. Uruchamia się program, wykonujący w nieskończonej pętli zapisane instrukcje.

2. Programowanie lokalne z wykorzystaniem biblioteki mbed-os i interfejsu mbed-cli

W drugiej części tego ćwiczenia, najpierw zainstalujemy rozszerzenie powłoki Windows'a o nazwie TortoiseHg (tutaj Mercurial 4.9.0 MSI installer - x64 Windows - requires admin rights), pozwalające na uruchomienie narzędzia zarządzającego Mercurial, które używamy do kontroli źródeł rozproszonych.

Konfigurując zmienną MBED_OS_DIR, wskazującą na katalog "mbed-os" sprawimy, że jedna biblioteka mbed-os będzie wspólna dla wszystkich programów tworzonych w podkatalogach katalogu projektów "./ARMmbed-Projects". W linii poleceń Anaconda prompt lub systemowej (jeśli polecenie mbed jest rozpoznawalne po dodaniu ścieżki systemowej wskazującej na program mbed) wywołujemy:

mbed config -G MBED_OS_DIR "C:\Users\PC\Backup\GrantyDydaktycznePL-2018\ROBOCZY\ARMmbed-Projects\mbed-os"

Z poziomu utworzonego katalogu projektów "ARMmbed-Projects" tworzymy nowy program, wywołując:

> mbed new mbed-two-tickers-blinky-led
> mbed new .

Pierwsze wywołanie utworzy katalog programu mbed-two-tickers-blinky-led i szkielet projektu (strukturę plików), a drugie uchroni nas przed ostrzeżeniami braku takiego szkieletu w aktualnym katalogu (projektów) przy współdzieleniu biblioteki mbed-os. Ta biblioteka będzie importowana ze wskazanego katalogu projektów MBED_OS_DIR podczas kompilacji kodu ze źródła (tutaj, np. w postaci pliku "main.cpp", dokującym w katalogu naszego programu). Dlatego należy sprawdzić, czy katalog "mbed-os" z bibliotekami systemu Mbed OS jest w katalogu projektów. Jeśli go nie ma, to wywołuje się jak poniżej:

> mbed import mbed-os

W katalogu projektu ".\ARMmbed-Projects\mbed-two-tickers-blinky-led" tworzymy plik "main.cpp" i zapisujemy w nim kod programu z Wydruku 1, który kompilujemy przywołując polecenie mbed compile z odpowiednimi parametrami:

./ARMmbed-Projects> mbed compile -t GCC_ARM -m NUCLEO_F401RE --source mbed-two-tickers-blinky-led --source mbed-os --build BUILD/mbed-two-tickers-blinky-led 

Pierwsza kompilacja trwa dość długo, zanim nie uzyskamy skompilowanych wersji wszystkich bibliotek. Kolejne, w trakcie rozwoju aplikacji są szybsze ze względu na przyrostowe budowanie pliku wynikowego. Tutaj należy podkreślić, że katalog projektu (naszego programu) ".\ARMmbed-Projects\mbed-two-tickers-blinky-led" i katalog z bibliotekami systemu Mbed OS ".\ARMmbed-Projects\mbed-os" zawierają kody źródłowe i biblioteki nagłówkowe, a plik skompilowany - wynikowy, jest generowany do katalogu ".\ARMmbed-Projects\BUILD\mbed-two-tickers-blinky-led".

W efekcie, uzyskujemy plik z rozszerzeniem "bin", którym przez skopiowanie zapisujemy pamięć flash układu rozwojowego NUCLEO-F401RE. W eksploratorze Windows'a reprezentuje ją odpowiednia litera dysku (tutaj, G:).

> copy BUILD\mbed-two-tickers-blinky-led\mbed-two-tickers-blinky-led.bin G:
 
Podobnie jak pierwszym sposobem, po wciśnięciu niebieskiego przełącznika na płytce NUCLEO uruchamia się program, wykonujący w nieskończonej pętli zapisane instrukcje. Dioda cyklicznie zmienia częstotliwość błyskania.

Dalszy rozwój: 1) Przedstawione w kodzie rozwiązanie jest tylko jedną z możliwości. Proponuje się samodzielne opracowanie innej metody obsługi platformy celem wykonania tego samego lub innego, ciekawszego zadania sterowania cyfrowego. 2) Oprogramowanie urządzenia przy użyciu ARM Mbed Studio lub innych narzędzi, wymienionych w treści zadania projektowego z "Mechatroniki". 3) Modyfikację zaproponowanego kodu z wykorzystaniem programowania obiektowego.

Komentarze