Kreślarka Arduino jako prosty oscyloskop

Cześć, w dzisiejszym artykule chciałbym zaprezentować Wam ciekawe narzędzie dostarczone wraz z Arduino IDE o nazwie kreślarka. Znajdziemy ją w menu Narzędzia, a służy ona do rysowania wykresów. Z pewnością większość z Was już jej używała, ale pewnie nie wszyscy wiedzą, że może ona wyrysować wiele linii. W dalszej części artykułu napiszemy prosty oscyloskop, który swoje wyniki będzie prezentował właśnie za pomocą tejże kreślarki.

Jak będzie działał nasz oscyloskop?

Wykorzystując Arduino Uno mamy do dysopzycji 6 wejść analogowych (od A0 do A5), które są w stanie zmierzyć napięcie od 0 do 5V. W naszym projekcie prostego oscyloskopu wykorzystamy wszystkie 6 wejść oraz dodatkowo zaprogramujemy przycisk do pauzowania odczytów tak, żebyśmy mogli w dowolnym momencie „zamorzić” ekran oscyloskopu.

Parser kreślarki

Kreślarka dostarczona wraz ze środowiskiem Arduino IDE działą w bardzo prosty sposób. Kiedy otrzyma całą linię próbuje ją sparsować. Jeżeli w linii znajduje się tylko jedna liczba to naniesie punkt odpowiadający jej wartości na wykres.

Jeżeli chcemy uzyskać więcej linii wystarczy, że dodamy w danej linii więcej liczb oddzielonych spacją np. „1 2 3”. Otrzymując takie dane kreślarka narysuje 3 punkty o wsółrzędnych (x, 1), (x, 2) oraz (x, 3), gdzie x będzie tym samym miejscem na osi x i będzie zwiększał się wraz z każdą nową otrzymaną i poprawnie sparsowaną linią.

Realizacja oscyloskopu

Cały program to zaledwie 24 linijki kodu:

#define PIN_FREEZE 7

void setup() {
  for(int x = A0; x <= A5; x++) {
    pinMode(x, INPUT);
  }
  pinMode(PIN_FREEZE, INPUT_PULLUP);
  Serial.begin(115200);
}

void loop() {
  if(!digitalRead(PIN_FREEZE)) return;
  for(int x = A0; x <= A5; x++) {
    int value = analogRead(x);
    float voltage = (value / 1023.0) * 5.0;
    
    Serial.print(voltage);
    if(x == A5) {
      Serial.println();
    } else {
      Serial.print(" ");
    }
  }
}

Funkcja setup sprowadza się do ustawienia pinów od A0 do A5 jako wejścia, pinu FREEZE jako wyjście z podciągnięciem oraz ustawienia portu szeregowego na prędkość 115200. Ważne jest tutaj postawienie znaku <= w warunku wykonania pętli for, gdyż chcemy aby pin A5 także został ustawiony jako wejście. Baud rate 115200 pozwoli nam bez problemu drukować dużo danych w krótkim czasie na porcei szeregowym.

W funkcję loop możemy w zasadzie podzielić na 3 części.

Pierwsza z nich to sprawdzanie, czy przycisk pauzy jest wciśnięty. Sprowadza się to do jednej instrukcji warunkowej, która kończy działanie funkcji jeżeli przycisk jest wciśnięty.

Następnie już wewnątrz pętli for mamy część z odczytem oraz konwersją odczytanej wartości na napięcie. Ważne jest tutaj użycie liczb zmiennoprzecinkowych, gdyż zaokrąglenie do pełnych wartości wyniku mieszczączego się w przedziale od 0 do 5 spowodowałoby, że taki wynik byłby dla nas niemalże bezużyteczny. Dzielimy wynik przez 1023.0, gdyż 1023 to największa wartość, którą zwróci nam analogRead. Dzięki temu zabiegowi mamy liczbę z przedziału <0; 1>, którą następnie mnożymy przez 5.0 uzyskując napięcie zmierzone na pinie analogowym.

Teraz czas na ostatnią część, czyli wysyłanie wyników na port szeregowy. W pierwszej kolejności wypisujemy zmierzoną wartość (bez znaku nowej linii, czyli za pomocą funkcji Serial.print()). Następnie w zależności od tego, czy mierzony pin jest ostatnim wypisujemy pustą linię lub spację, która oddzieli nam aktualny wynik od tego, który będzie następny.

Jak włączyć taki oscyloskop

Aby włączyć oscyloskop musimy wcisnąć przycisk pauzy, a następnie uruchomić kreślarkę z menu Narzędzia Kreślarka. Po co taki zabieg? Dlatego, że moglibyśmy uruchomić kreślarkę w momencie, kiedy Arduino wypisuje dane na port szeregowy, przez co kreślarka mogłaby zwariować i wyrysować więcej lub mniej linii niż powinna.

Na górze kreślarki w prawym rogu znajdziemy kolorowe kwadraciki. W przypasku naszych 6 kanałów mają one kolory niebieski, czerwony, zielony, pomarańczowy, fioletowy oraz szary. Są to kolejne wejścia analogowe idąc od A0 (czyli np. czerwony to pin A1).

Moje ustawienia

Dla testu podłączyłem do swojego oscyloskopu przycisk do pinu A0, potencjometr do pinu A1, długi luźny kabelek do pinu A2, masę do A3, 3.3V z Arduino do A4 oraz 5V do A5. Wyniki prezentują się następująco:

Wnioski

Po krótkiej zabawie takim banalnym oscyloskopem można wyciągnąć wniosek, że niepodłączone piny zbierają bardzo dużo zakłóceń przez co w wielu projektach w internecie są używane jako generator ziarna do liczb losowych. Jak widać na powyższym obrazku są to raczej słabe generatory, gdyż na ich wartość mogą wpływać sąsiednie piny.

Taki prosty oscyloskop z pewnością nie przyda się do poważnych zastosowań, ale myślę że może pomóc przy debugowaniu amatorskich projektów. Z pewnością wadą kreślarki jest to, że jeżeli dwa punkty mają te same koordynaty to wyświetlany jest ten, który był rysowany później, co widać również na załączonym wyżej screenie. Można zauważyć, że brakuje niebieskiej linii (pokazującej przebieg przycisku), gdyż chwilę przed zrobieniem screena była ona cały czas w stanie wysokim.