Moduł OpenLog – karta micro SD w służbie mikrokontrolera

Tworząc niektóre projekty chcemy mieć możliwość podejrzenia danych w późniejszym czasie, gdy wbudowana pamięć mikrokontrolera nie wystarcza możemy skorzystać z karty pamięci. Moduły umożliwiające zapis na kartach pamięci korzystają z reguły z magistrali SPI zabierając nam 4 piny, często są też dużymi urządzeniami, co wyklucza użycie ich w małych obudowach. 

Z pomocą przychodzi nam OpenLog – miniaturowy moduł zapisu danych na karcie micro SD. OpenLog łączy się z płytką za pomocą magistrali UART dzięki czemu możemy połączyć się z nim za pomocą tylko dwóch pinów sygnałowych. Ba, naprawdę tylko jeden – bo do samego logowania wystarczy podłączyć TX z urządzenia do RX na OpenLog.

Nie tylko kwestia pinów użytych do podłączenia ma znaczenie. Możesz użyć OpenLoga do dowolnych modułów/urządzeń które oferują wyjście UART z komunikatami – czy to odczyty, czy komunikaty o błędach.

Przygotowanie karty pamięci do pracy z modułem

Do pracy z OpenLogiem możemy użyć każdej karty micro SD której pojemność mieści się w zakresie 64 MB – 64GB, jednak moduł najszybciej pracuje z kartami do 16GB. Karta musi być sformatowana w formacie FAT, najlepiej FAT32, operację tą wykonamy bez problemu za pomocą systemu Windows. OpenLog posiada też diodę która monitoruje o błędzie karty, bądź jej braku. Gdy dioda urządzenia mruga 3 razy w jednym ciągu znaczy to, że moduł nie może się z nią skomunikować. Najczęściej kartę wystarczy jeszcze raz sformatować.

Podłączenie OpenLoga do Arduino 

Gdy przygotowaliśmy już naszą kartę możemy włożyć ją do slotu w module. Jednak zanim to zrobimy warto przylutować do niego goldpiny, wystarczą 4 piny, my jednak zabezpieczymy się i przylutujemy 6 pinów, aby móc korzystać z dodatkowych funkcji modułu. Poniżej przedstawiony jest moduł z którym dzisiaj pracujemy, krótko omówimy gdzie podłączyć piny naszego układu.

Po kolei, pin GRN to pin RESET, podanie na niego stanu wysokiego zresetuje moduł, jest to dość ważne, ponieważ resetując układ możemy wygodnie przenieść zapisywanie danych do nowego pliku. Pin RXI to pin służący do odbierania danych, łączymy go z pinem nadawczym, czyli TX mikrokontrolera sterującego. Pin TXO jest pinem służącym do nadawania, łączymy go z pinem RX mikrokontrolera. VCC i GND to oczywiście piny zasilające, warto tutaj wspomnieć, że OpenLog pracuje na napięciu od 3.3V do 12V, jednak najbardziej optymalny jest zakres 3,3V-5V. Pin BLK jest pinem GND, można go stosować na przykład przy połączeniu modułu z Arduino Pro Mini które ma wyprowadzone obok siebie dwa piny GND.

Połączenie z płytką możemy realizować przez UART domyślnie przypisany do pinów 0 i 1 w Arduino, drugą opcją jest stworzenie wirtualnego portu szeregowego w Arduino. Na początku skorzystamy z tej pierwszej funkcji. Warto też pamiętać, że urządzenie domyślnie pracuje na prędkości transmisji 9600 bodów, więc tą wartość przyjmujemy w każdym miejscu w którym ustalamy prędkość przesyłu. Kod który wgramy jest bardzo prosty i powinien wyglądać tak jak poniżej.

void setup() {
  Serial.begin(9600);//rozpoczęcie pracy Serial Monitora
  delay(5000);
  Serial.print("Witaj!");
}

void loop() {
}

Możemy się zastanawiać dlaczego pomiędzy rozpoczęciem pracy Serial Monitora, a wysłaniem pierwszych danych zastosowaliśmy 5 sekund przerwy. Wynika to z czasu który potrzebuje OpenLog na pełne rozpoczęcie działania i uruchomienie procedury zapisu danych. Katalogowo wystarczą dwie sekundy, jednak nie zaszkodzi zabezpieczyć się trochę bardziej przed błędem. Pamiętajmy, że podczas programowania mikrokontrolera wbudowany programator korzysta z UART, więc ważne jest aby odłączyć od Arduino moduł. Gdy zaprogramujemy już płytkę odłączmy zasilanie, podłączmy OpenLoga i znów podłączmy Arduino do zasilania. Program powinien się uruchomić, po 5 sekundach Arduino wyśle dane do zapisania na karcie, po tym czasie zaczekajmy kolejne 5 sekund  tak aby mieć pewność, że wszystkie dane zostały zapisane. Możemy teraz odłączyć zasilanie od Arduino, wyciągnąć kartę z modułu i podpiąć ją do komputera. Plik który wygenerował moduł powinien wyglądać jak poniżej.

Gdy potrafimy przesłać dane za pomocą wbudowanego Serial Monitora możemy przejść do wysyłania danych za pomocą wirtualnego połączenia szeregowego. Kod nie będzie się dużo różnił, dodamy jeszcze mruganie wbudowaną diodą, tak abyśmy wiedzieli kiedy możemy odłączyć Arduino od zasilania i wyciągnąć kartę. Kod powinien wyglądać jak poniżej.

#include <SoftwareSerial.h>
static const int RXPin = 2, TXPin = 3;//stworzenie zmiennych do wirtualnego Seriala
SoftwareSerial ss(RXPin, TXPin);//przypisanie nazwy i pinów obsługujących systemowy Serial
void setup() {
  pinMode(13, OUTPUT);//zdefiniowanie pinu 13, czyli wbudowanej diody
  Serial.begin(9600);//rozpoczęcie pracy Serial Monitora
  ss.begin(9600);//prędkość podawania danych na kartę SD
  delay(5000);//czas potrzebny na rozpoczęcie działania przez moduł
  Serial.println("Witaj!");
  ss.println("Witaj!");
  delay(500);
  Serial.println("Widzę, że umiesz wysyłać dane do karty na dwa sposoby :-)");
  ss.println("Widzę, że umiesz wysyłać dane do karty na dwa sposoby :-)");
  delay(5000);//czas potrzebny na zakończenie zapisu na karcie
  digitalWrite(13,HIGH);
}
void loop() {
}

Jedyną zmianą w połączeniu modułu jest podłączenie pinu TXO modułu do pinu 2 Arduino i pinu RXI do pinu 3 płytki. Gdy wykonaliśmy tą modyfikacje możemy wgrać program na Arduino i włączyć Serial Monitor, powinniśmy zobaczyć to co poniżej. 

Gdy widzimy, że dioda przypisana do pinu 13 świeci możemy odłączyć zasilanie od Arduino i wyciągnąć kartę, po podłączeniu jej do komputera powinniśmy znaleźć plik o takiej zawartości:

 Jeśli i tym razem nam się udało przejdziemy do ostatniego przykładu w którym wykonamy zapis do dwóch osobnych plików, możemy dzięki temu możemy dzielić zapisy na przykład na dni, czy inne interwały czasowe. Kod z instrukcjami przedstawiony jest poniżej. 

#include <SoftwareSerial.h>
static const int RXPin = 2, TXPin = 3;//stworzenie zmiennych do wirtualnego Seriala
SoftwareSerial ss(RXPin, TXPin);//przypisanie nazwy i pinów obsługujących systemowy Serial
int resetPin=4;
void setup() {
  pinMode(13, OUTPUT);//zdefiniowanie pinu 13, czyli wbudowanej diody
  pinMode(4, OUTPUT);//zdefiniowanie pinu 5, czyli wyjścia do resetowania modułu
  Serial.begin(9600);//rozpoczęcie pracy Serial Monitora
  ss.begin(9600);//prędkość podawania danych na kartę SD
  delay(5000);//czas potrzebny na rozpoczęcie działania przez moduł
  Serial.println("Zapis do pliku numer 1:");
  delay(500);
  Serial.println("Plik1:");
  ss.println("Plik1:");
  delay(500);
  Serial.println("10,20,30");
  ss.println("10,20,30");
  delay(5000);//czas potrzebny na zakończenie zapisu na karcie
  Serial.println("Reset modułu");
  digitalWrite(4,HIGH);//reset modułu
  delay(1000);
  digitalWrite(4,LOW);
  delay(500);
  Serial.println("Plik2:");
  ss.println("Plik2:");
  delay(500);
  Serial.println("40,50,60");
  ss.println("40,50,60");
  delay(5000);//czas potrzebny na zakończenie zapisu na karcie
  Serial.println("Możesz odłączyć zasilanie!");
  digitalWrite(13,HIGH);
}
void loop() {
}

Ostatnią modyfikacje musimy wykonać na samym układzie, pin GRN musimy podpiąć do pinu 4 Arduino. Po wgraniu programu do Arduino i uruchomieniu Serial Monitora powinniśmy zobaczyć:

A na karcie powinny powstać dwa pliki o takiej zawartości:

Proste? Pewnie, że tak! Teraz potrafisz już w łatwy sposób zapisywać dane z projektów na karcie micro SD!

Programy i biblioteki:

  • Arduino IDE w wersji 1.8.5, Arduino Core 1.6.20

Materiały użyte w artykule: