Nowy rok to nowe zabawki, chciałoby się powiedzieć. W każdym razie zainspirowany dyskusją, którą prowadziliśmy w Google+ w związku ze zmianą właściciela marki Atmel i przyszłością rodziny AVR, sięgnąłem po niedrogą płytkę prototypową firmy STMicroelectronics, zawierającą mikrokontroler tegoż producenta, z rdzeniem w architekturze ARM. Wybór – całkowicie przypadkowy, bo chodziło o najtańszą ofertę w serwisie aukcyjnym – padł na Nucleo L152RE. Dane dotyczące platformy i tego konkretnego modelu znajdziecie na stronie producenta, więc nie będę ich tutaj powielał (dbajmy o ten nasz biedny internet). Tam też znajdziecie serię instruktaży wideo, pokazujących, jak zacząć pracę z płytkami Nucleo i jak ją z powodzeniem kontynuować. Tutaj zatem będzie krótko, na zachętę.
Zacznę od końca. Jestem pod ogromnym wrażeniem tej platformy. Bo tak:
- żeby pisać programy i ładować je do układu nie jest potrzebne żadne oprogramowanie instalowane na naszym komputerze – wystarczy w miarę świeża przeglądarka WWW i połączenie z internetem;
- żeby podłączyć płytkę Nucleo do komputera, potrzebujemy port USB; w systemie Windows potrzebne są jeszcze sterowniki – znajdziemy je na stronie producenta, zalinkowanej wcześniej;
- co do programowania, powinniśmy znać język C/C++ i – rzecz jasna – topologię wyprowadzeń płytki, nazwy jej elementów zaimplementowane w bibliotece dla C/C++ itp.
Bierzemy zatem naszą płytkę Nucleo, podłączamy do komputera, instalujemy sterowniki (jeśli to konieczne, aktualizujemy firmware – patrz: linki na stronie producenta) i oczom naszym ukazuje się napęd USB o nazwie "NUCLEO".
Wchodzimy teraz – za pomocą przeglądarki ;-) – na stronę mbed.org (lub od razu developer.mbed.org), czytamy sobie zawarte tam informacje (niecierpliwi mogą ten krok pominąć, aczkolwiek...), zakładamy konto, łączymy je sobie z twitterem, githubem i z czym tam jeszcze chcemy (możemy też nie łączyć) i zaglądamy na nasz dysk USB "NUCLEO". Znajdziemy tam plik "mbed.htm". Przeciągamy go "na przeglądarkę" – zostaniemy przekierowani na stronę, która pozwoli nam dodać posiadaną i podłączoną do komputera płytkę prototypową do naszego konta (czyli powiązać płytkę z kontem). Pozwalamy na to i od tego momentu możemy spokojnie używać online'owego IDE z kompilatorem, produkującym kod wynikowy specjalnie dla naszego mikrokontrolera i naszej płytki :-) W serwisie mbed.org znajdziemy również bardzo przydatną, praktycznie niezbędną w dalszej pracy charakterystykę wspieranych platform (strona poświęcona mojej płytce).
Program, po skompilowaniu, wysyłany jest na nasz komputer w postaci binarnego wsadu. Kopiujemy (lub przenosimy) ten wsad do naszego dysku "NUCLEO" i... gotowe! Mikrokontroler zaprogramowany! Dociekliwi zauważą, że po odświeżeniu dysk "NUCLEO" zawiera tylko plik "mbed.htm", wsad zniknął :-)
Prawda, że cudownie proste?
Dla zabawy i porównania z Arduino pozwoliłem sobie przeportować na Nucleo przykładowy program, wyświetlający tablicę kodów ASCII w oknie terminala portu szeregowego PC. Ale to nie było żadne wyzwanie (działa jak w Arduino), zatem komputer PC zastąpiłem moim modułem sterownika LCD z komunikacją przez port szeregowy. Owszem, Nucleo ma wadę – jak praktycznie każdy ARM, pracuje w logice 3,3V, więc w celu wymiany danych z urządzeniami pracującymi w logice 5V (TTL) musimy użyć konwertera poziomów (lub konwersji poziomów logicznych w ogólności).
Kod źródłowy programu zaprezentowany został poniżej.
- Kod:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
ASCII table | |
- przykład bazujący na programie dla Arduino, tutaj jednak dane wyswietlane są za pomoca modułu Serial LCD | |
(http://wileczeknet.blogspot.com/2013/01/programowanie-avr-cz-7-mikroprocesorowy.html oraz | |
http://wileczeknet.blogspot.com/2013/06/programowanie-avr-cz-10-modyfikacja.html) | |
- wyświetlanie tablicy kodów ASCII po naciśnięciu niebieskiego przycisku. | |
*/ | |
#include "mbed.h" | |
#define byte unsigned char | |
// Stałe komend sterownika wyświetlacza | |
const byte Clean = 255; | |
const byte Cleft = 254; | |
const byte Cright = 253; | |
const byte Con = 252; | |
const byte Coff = 251; | |
const byte Cblink = 250; | |
const byte Cnoblink = 249; | |
const byte Cupline = 248; | |
const byte Cdownline = 247; | |
Serial lcd(D8, D2); // Serial1 | |
DigitalOut myled(LED1); | |
// Przycisk musi być podłączony do wejścia podciągniętego do "1" | |
DigitalIn mybutton(USER_BUTTON, PullUp); | |
// Locate w sposób przyjazny | |
// -- x przyjmuje wartości od 1 do 16 | |
// -- y przyjmuje wartości od 1 do 2 | |
void locate_xy(byte x = 1, byte y = 1) { | |
if ((x <= 16) && (y <= 2)) { | |
byte pos = 192 + (x - 1) * 2 + (y - 1); | |
lcd.printf("%c", pos); | |
} | |
else { | |
lcd.printf("%c", 192); | |
} | |
} | |
int main() { | |
// Czyszczenie wyświetlacza, wyłączenie kursora i wyświetlenie nagłówka | |
lcd.printf("%c", Clean); | |
lcd.printf("%c", Coff); | |
wait(0.1f); | |
locate_xy(1,1); | |
lcd.printf("ASCII Table"); | |
locate_xy(1,2); | |
lcd.printf("Press blue key."); | |
wait(2.0f); | |
while(1) { | |
if (mybutton == 0) { // nie trzeba odszumiać | |
int i = 33; | |
while(i < 127) { | |
lcd.printf("%c", Clean); | |
locate_xy(1,1); | |
lcd.printf("%c", i); | |
lcd.printf(" dec: %.4d", i); | |
locate_xy(1,2); | |
lcd.printf(" hex: 0x%.2X", i); | |
wait(0.5f); | |
myled = !myled; | |
i++; | |
} | |
lcd.printf("%c", Clean); | |
lcd.printf("End."); | |
locate_xy(1,2); | |
lcd.printf("Press blue key."); | |
} | |
} | |
} |
Myślę, że płytki z serii Nucleo mogą być całkiem niezłą alternatywą dla Arduino, również Arduino Due (tam też jest ARM). Mam nadzieję, że przyszłość przyniesie wiele ciekawych inspiracji i projektów zrealizowanych z wykorzystaniem tej platformy (chodzi tu głównie o mnie ;-))
A co to za język ten C/C++ ? Czyżby to jakaś nowość w świecie języków programowania?
OdpowiedzUsuńO, to bardzo dobre pytanie - już odpowiadam. Otóż geneza pisania w różnych opracowaniach "C/C++" jest, jak się domyślam, prosta. Twórcy - bo obecnie można już tak to ująć - języka C++ od początku (od Bjarne) nie narzucili jednoznacznego stylu programowania w tym języku (jest to język obiektowy, ale programista nie jest zobowiązany do ubierania swojego programu w klasy i tworzenia obiektów), pozwolili jednak wykorzystywać dobrodziejstwa C++ w programach o strukturze zbliżonej do klasycznego C (ANSI C itp.), dbając o wsteczną kompatybilność, czy też chcąc pozyskać sobie przychylność programistów piszących dotychczas w C. Znam kilku koderów, którzy do obsługi operacji wejścia-wyjścia preferują klasyczne funkcje znane im z stdio.h itp. (choć już dawno przepisane i zmodyfikowane, ale jednak) mimo, że program tworzą w pełni obiektowy. Idąc dalej, kod źródłowy programów dla Arduino czy choćby Nucleo ma często strukturę programu w języku C, mimo, że znakomita większość bibliotek dla Arduino jest obiektowa.
UsuńTak więc używam - ja i wielu innych publikujących teksty o programowaniu - zlepka "C/C++", żeby podkreślić płynne połączenie programowania obiektowego (C++) i strukturalnego (C) w danym projekcie.
Mam nadzieję, że moje wyjaśnienia nie są zbyt zawiłe i były pomocne.
Dziękuję za wyjaśnienie. Chociaż nie od dziś programuję w C++, a co za tym idzie również w C, muszę przyznać że nie podchodziłem do takiego zapisu w ten sposób, a wręcz taki zapis raził mnie w oczy. W programowaniu mikrokontrolerów "problem" pisania proceduralnego wykorzystując język C++, a więc język obiektowy, mocno się rozmywa. Właściwie ludzie często nie mają pojęcia, że ich środowisko wykorzystuje język C++, jak to jest chociażby we frameworku Arduino. Tutaj często mówi się, również w publikacjach drukowanych, o jakimś tajemniczym, nienazwanym języku, który jest podobny do C. U początkujących użytkowników Arduino może to powodować spore zamieszanie i strach przed przesiadką na czysty C.
UsuńTak, też w przypadku publikacji związanych z Arduino spotkałem się ze sformułowaniami typu "język podobny do C" – całkowicie niepotrzebna asekuracja moim zdaniem.
UsuńBardzo fajnie napisane. Jestem pod wrażeniem i pozdrawiam.
OdpowiedzUsuńDziękuję i również pozdrawiam!
Usuń