[171] Arduino i oscyloskop cz. 1
Dziś podłączymy Arduino do oscyloskopu, ale nie po to, by oglądać przebiegi, choć… właściwie będziemy oglądać przebiegi. Zacznijmy jednak od tego, że oscyloskop to fascynujące urządzenie, które pozwala zobaczyć prąd elektryczny – że tak trochę alegorycznie określę, do czego służy. I poniekąd to prawda, oscyloskopu używa się do oglądania zmieniających się napięć, często w formie „czasowej lupy”, pozwalającej obejrzeć kształt napięć przemiennych o dużych częstotliwościach. Dziś jednak będę chciał spojrzeć na to narzędzie z zupełnie innej strony. Otóż skoro na ekranie oscyloskopu można zobaczyć przebiegi jakimi one są, czy nie da się na odwrót? To znaczy wygenerować takie przebiegi, by wyglądały jak konkretne grafiki, obrazy, teksty i cyfry, a nawet animacje? Oczywiście, że jest to możliwe, a do tego celu należy wykorzystać wejście, zwykle leżące odłogiem.
Najprościej mówiąc, oglądanie przebiegów przemiennych polega na tym, że napięcie takie doprowadzamy do wejścia oscyloskopu i po wzmocnieniu steruje ono pionowym ruchem plamki. Za ruch w poziomie odpowiedzialny jest generator znajdujący się w urządzeniu. Zmieniając jego częstotliwość możemy synchronizować się z okresem napięć mierzonych i w ten sposób przy określonych częstotliwościach plamka będzie nam rysować kształt fali. Zróbmy sobie doświadczenie: użyjmy naszego Arduino do wygenerowania zmieniającego się napięcia: zero woltów – chwila przerwy – pięć woltów – znowu chwila i tak w kółko. Innymi słowy, stworzymy najprostszy generator przebiegu prostokątnego.
const byte inputY = 9; // Port wejścia Y oscyloskopu.
void setup() {
pinMode(inputY, OUTPUT); // Inicjuj port wejścia Y oscyloskopu.
}
void loop() {
digitalWrite(inputY, HIGH); // Wystaw wysokie napięcie.
delayMicroseconds(1000); // Czekaj milisekundę.
digitalWrite(inputY, LOW); // Wystaw niskie napięcie.
delayMicroseconds(1000); // Czekaj milisekundę.
}
Program chyba nie wymaga komentarza. Chwilę przerwy ustaliłem na milisekundę, więc częstotliwość pracy wynosi mniej więcej 500 Hz. Podłączę teraz oscyloskop do pinu dziewiątego i po ustawieniu parametrów będę mógł sobie obejrzeć prostokątny – no, prawie – przebieg, w zależności od częstotliwości generatora kilka cykli albo jeden, jeśli będzie mieć tę samą częstotliwość co przebieg generowany.
Widziany obraz jest nieco zniekształcony, co wynika przede wszystkim z niskiej klasy tego narzędzia. Jednak świadomie wybrałem ten model z dwóch powodów: po pierwsze – chcę pokazać, że nawet takie nic już nie warte oscyloskopy mogą się przydać do zabawy. Drugim powodem jest to, że to mój pierwszy oscyloskop, który kupiłem sobie bodajże w roku 1987.

Denerwowały mnie radzieckie napisy – zapewne z powodu przymusu uczenia się tego języka przez osiem szkolnych lat – i wymieniłem płytę czołową na taką wesołą. Wróćmy do przebiegów. Cała zabawa będzie opierać się na doborze generowanych sygnałów o dowolnych poziomach, czyli będziemy poruszać się w świecie napięć analogowych. Arduino jako takie nie wygeneruje nam tych napięć wprost, ale może użyć metody PWM do generacji przebiegów o zmiennym wypełnieniu, czyli o zmiennej energii. Powiedziałem: energii, bo napięcia chwilowe nadal będą tutaj równe zero albo pięć woltów, jednak stosunek jednego do drugiego będzie kontrolowany. Żeby taki przebieg zamienić w napięcie, trzeba będzie zbudować prosty układ całkujący, który uśredni napięcie. Po drodze do oscyloskopu pojawi się rezystor, który ograniczy przepływ prądu do znajdującego się zaraz za nim kondensatora. Teraz po wystawieniu napięcia 5 woltów kondensator zacznie się ładować – powoli, bo na drodze stoi rezystor. Za chwilę napięcie wystawione spadnie do zera, kondensator równie wolno zacznie się rozładowywać. Jeśli dobierzemy wartości odpowiednio do częstotliwości pracy PWM, zamiast przebiegów prostokątnych dostaniemy uśrednione napięcia wynikające ze stosunku podanych stanów: niskiego i wysokiego. Tak na marginesie, na zdjęciu widzimy dwa rezystory i dwa kondensatory, co przyda nam się za chwilę.
Jeszcze jedna uwaga: częstotliwość pracy PWM musi być daleko wyższa od częstotliwości sygnałów, które będziemy chcieli generować. Arduino dysponuje możliwością definiowania szybkości taktowania PWM i najwyższą jest 62,5 kHz. Wymaga to osadzenia takich wpisów na początku, inaczej pozostalibyśmy w częstotliwościach równych około 500 Hz, bardzo trudnych do odfiltrowania przy częstotliwościach przebiegów niewiele niższych. Przyjrzyjmy się temu prostemu szkicowi.
const byte inputY = 9; // Port wejścia Y oscyloskopu.
const int stepTime = 391; // Dla 10 Hz: 100 000 us / 256 kroków
void setup() {
TCCR1A = _BV(COM1A1) | _BV(WGM10); // Zmiana częstotliwości pracy PWM na 62,5 kHz
TCCR1B = _BV(WGM12) | _BV(CS10);
pinMode(inputY, OUTPUT); // Inicjuj port wejścia Y oscyloskopu.
}
void loop() {
for (int level = 0; level < 256; level++) { // Generuj przebieg piły rosnącej o częstotliwości 10 Hz
analogWrite(inputY, level); // Wystaw PWM
delayMicroseconds(stepTime); // Czekaj 391 us
}
}
Częstotliwość przebiegu określiłem sobie na 10 Hz. Z tego wynika, że przy każdej zmianie jednego z 256 poziomów napięcia – bo tyle daje PWM Arduino – musi upłynąć 391 mikrosekund. W głównej pętli będziemy zwiększać wartość PWM od 0 do 255, po czym cykl powtórzy się, a wszystko to będzie trwać jedną dziesiątą sekundy.

Jednak gdybyśmy teraz podłączyli oscyloskop, zamiast oczekiwanego przebiegu zobaczylibyśmy coś takiego. Częstotliwość PWM skutecznie zasłoniła nam nasz oczekiwany przebieg. Dlatego teraz zbudujemy wspomniany filtr. Potrzebny będzie rezystor o wartości kilooma i kondensator 100 nF.

Jak pisałem, widzimy dwie takie pary, bo za chwilę przyda się drugi filtr. Po jego wpięciu w obwód, przebieg o częstotliwości 62,5 kHz został skutecznie wycięty i możemy się cieszyć widokiem takiej już czystej piły o częstotliwości 10 Hz.

Pokonaliśmy zatem barierę niemożliwości: nasze Arduino generuje napięcia analogowe – no, prawie. Czas więc na sedno, czyli pełną kontrolę nad plamką oscyloskopu. Ale o tym napiszę w kolejnym artykule.














