Nie od razu GPS logger zbudowano: Arduino i karta microSD

logger

To jest to co w Arduino lubię najbardziej :) plątanina kabli, jakiś breadboard no i po chwili okazuje się że działa. Albo że nie, i trzeba grzebać dalej, czemu? Czy to tylko jakieś głupie niedoczytanie karty katalogowej, źle wpięty kabelek czy po prostu projekt nie ma w ogóle szans :)

Każdy kto ma trochę doświadczenia, chociażby w oglądaniu cudzych projektów, powinien od razu na zdjęciu wypatrzeć charakterystyczną antenę odbiornika GPS. Tak, to kolejny (bo wiele takich projektów już widzieliście) “zapisywacz” położenia odczytanego z GPS.

Arduino zapisuje dane w pliku na karcie microSD

Jednak nim zbudujemy coś takiego, nim mozolnie odczytamy pozycję z portu UART modułu GPS potrzebujemy możliwości zapisu na karcie microSD. Karta microSD jest niewielka, oferuje spore pojemności, jest niedroga. Pozostaje tylko kwestia jak wygodnie podłączyć kartę do Arduino.

Na Nettigo od dawna już można kupić adapter karty microSD, czyniący zapisywanie na karcie całkiem proste. Nie mieliśmy tutaj opisu jak podłączyć taki adapter, więc korzystając z okazji, pierwszy krok – podłączenie adaptera i zapis na karcie.

Karta microSD i Arduino

Karta microSD podłączona do Arduino
Karta microSD podłączona do Arduino

Adapter karty microSD ma oznaczenia na złączu (zwróć uwagę, że opis do pinu złącza znajduje się nad pinem, co w pierwszej chwili powoduje pewną niepewność – którego pinu dotyczy opis). Od góry mamy kolejno piny opisane:

  • 5V i 3V3: tutaj podłączamy zasilanie. Adapter przyjmuje napięcie zasilające 5V lub 3.3V – niezależnie od tego jakie masz Arduino nie będzie problemu z zasilaniem karty
  • CS – sygnał wyboru układu
  • MI – transmisja danych
  • MO – transmisja danych
  • SCK – sygnał zegara
  • GND – masa układu

Mała dygresja o tym co to jest SPI i jak działa

Karta microSD komunikuje się się z użyciem interfejsu SPI. Korzysta on z trzech linii: sygnał zegara w rytm którego odbywa się transmisja i dwie linie danych. SPI może łączyć wiele urządzeń jednocześnie. Zegar magistrali podaje urządzenie główne (tak zwany master), tutaj jest to Arduino. Linie danych służą do komunikacji: jedna od urządzenia głównego do podrzędnego a druga w przeciwną stronę. Ponieważ urządzeń podrzędnych może być wiele, urządzenie główne wybiera z którym urządzeniem się chce komunikować zmieniając stan linii wyboru układu. O ile linie zegara i transmisji danych łączą urządzenie główne i wszystkie podrzędne, to linia wyboru układu jest jedna dla każdego urządzenia podrzędnego.

Czyli po podłączeniu zasilania i masy, pozostaje podłączyć linie używane przez SPI. W terminologi używanej przez Arduino MOSI i MISO należy podłączyć do linii MO i MI na adapterze. W Arduino zwykle na pin CS używa się określenia SS (CS to Chip Select a SS Slave Select) a SCK (Serial Clock) czasem jest nazywany CLK w Arduino. Dla UNO podłączenie będzie wyglądało tak:

Arduino   <->   Adapter karty
MOSI (11)       MO
MISO (12)       MI
SS   (10)       CS
SCK  (13)       SCK

Oczywiście łączymy ze sobą GND i wybieramy zasilanie adaptera – 3.3V lub 5V.

W nawiasach powyżej podałem numery portów cyfrowych z Arduino UNO – jeżeli masz  Arduino z innym procesorem niż na UNO (np Arduino Leonardo czy Mega) sprawdź w dokumentacji gdzie znajdują się odpowiedni porty.

Pozostaje wsadzić sformatowaną kartę microSD (FAT lub FAT32) i skorzystać z gotowej, dołączonej do Arduino IDE biblioteki SD. W menu File/Examples/SD/Datalogger znajdziecie przykład, który komunikuje się z kartą, jeśli wszystko w porządku (może się skomunikować z kartą), to odczytuje napięcie z 3 pierwszych portów analogowych i zapisuje je w tekstowym formacie CSV, w pliku datalog.txt na karcie micoSD.

Po wgraniu programu na Arduino, podłączcie się do monitora portu szeregowego i sprawdźcie czy komunikaty sugerują, że dane są zapisywane na karcie. Jeśli widzicie błąd "error opening datalog.txt" poprzedzony komunikatem o "Card failed, or not present" to najpewniej nie podłączyliście jak należy adaptera.

Jak działa program?

  if (!SD.begin(chipSelect)) {

W setup następuje próba rozpoczęcia komunikacji z kartą. Argumentem funkcji begin jest numer pinu, do którego podpięty jest sygnał CS.

  for (int analogPin = 0; analogPin < 3; analogPin++) {
    int sensor = analogRead(analogPin);
    dataString += String(sensor);
    if (analogPin < 2) {
      dataString += ",";
    }
  }

Tutaj, pętla for odczytuje kolejno wartości z wejść analogowych od A0 do A2 i dołącza je do łańcucha znakowego, oddzielając każdą wartość przecinkiem. To na co warto zwrócić uwagę, to zapis  dataString += String(sensor); Konstrukcja String(zmienna_liczbowa) zamienia wartość zmiennej na zapis w formie łańcuch znaków, a += powoduje dodanie (dołączenie) go na koniec całego łańcucha.

Na koniec…

Jak widać, uzyskanie szkicu zapisującego dane na karcie microSD jest naprawdę proste i szybkie. Teraz pozostaje nam tylko odebrać dane od odbiornika GPS i możemy zbudować nasz pierwszy loger GPS… A o tym już niedługo!