[151] Arduino Q cz. 5
Przyjrzyjmy się teraz wejściom analogowym, ale tutaj przedstawię kolejną zmianę, która może mieć czasem istotne znaczenie. Każdy chyba zna i docenia współpracę z terminalem, czyli zrzucanie na zewnątrz ciągów danych, które zwłaszcza podczas uruchamiania aplikacji przydają się, by wiedzieć co się tam dzieje. Do tej pory używaliśmy polecenia Serial, jednak w nowym Arduino działa ono wyłącznie bezpośrednio, to znaczy dane są wysyłane na port szeregowy używający pinów 0 i 1. Żeby dane te zobaczył terminal, czy to wbudowany w IDE, czy w App Lab, trzeba użyć programowego mostka, który puści strumień przez pokładowy procesor płytki. Dlatego musimy osadzić bibliotekę, a polecenie Serial zamienimy nowym: Monitor. Ma tę samą składnię, ale współpracuje z wymienionym mostkiem, a nie portem wprost.
#include <Arduino_RouterBridge.h> // Biblioteka umożliwiająca przesyłanie danych do monitora.
const byte potPort = A1; // Adres portu, do którego podłączony jest potencjometr.
int potValue; // Mierzona wartość.
void setup() {
Monitor.begin(115200); // Inicjuj monitor.
}
void loop() {
potValue = analogRead(potPort); // Zmierz napięcie.
Monitor.println(potValue); // Prześlij zmierzoną wartość do monitora.
delay(100);
}Napisałem prostą aplikację zrzucającą mierzone napięcie z portu A1 na monitor. Użyłem jak zwykle płytki edukacyjnej TME, gdzie na pinie A1 osadzono ślizgacz potencjometru. Szkic działa, w zależności od położenia gałki potencjometru zmieniają się wartości.

Problem w tym, że widzimy tu kolejnego babola: co jakiś czas polecenie zmiany wiersza jest ignorowane, a potem wychodzi zdublowane. Stąd taki szczerbaty wygląd tego strumienia. Wszelkie sieciowe porady nic nie zmieniły więc pozostaje czekać na poprawki. Na szczęście to nie ma znaczenia dla samego działania przetwornika i psuje jedynie estetykę.
Kręcąc potencjometrem zwróćmy uwagę na to, że jest on tu podpięty do pięciu woltów i od dwóch trzecich zakresu regulacji daje przepełnienie. Mało tego, nie powinno się na port A1 posyłać wyższego napięcia niż 3,3 wolta, więc uważajmy i nie przekraczajmy progu przepełnienia. Wróćmy teraz do istoty: przetworniki analogowo-cyfrowe mają rozdzielczość dwa bity większą. By sięgnąć po tę zwiększoną dokładność, należy ją zadeklarować wpisem:
analogReadResolution(12); // Deklaracja głębokości bitowej przetwornika A/DPo kompilacji dostaniemy ciąg wartości do 4095. Mało tego, system potrafi zaoferować wyższą rozdzielczość, ale jest to już tworzone programowo. Mimo to może być przydatne, w szczególnych wypadkach oszczędzając nam dodatkowych obliczeń.

Nowy układ oferuje także szeroką ofertę napięć referencyjnych. Domyślnie przetwornik pracuje, biorąc za bazę napięcie zasilania, czyli 3,3 wolta. Tym poleceniem możemy jednak wybrać kilka innych napięć:
analogReference(AR_INTERNAL2V05); // Napięcie odniesienia dla przetwornika A/DWidoczna tu wartość 2V05, wraz z jedenastobitową dokładnością da nam wprost woltomierz mierzący nieco ponad dwa wolty z rozdzielczością jednego miliwolta. Do wyboru mamy jeszcze napięcia: półtora wolta, jeden i osiem dziesiątych, dwa i pół oraz napięcie zewnętrzne, podawane na pin AREF, byle nie wyższe od 3,3 wolta i nie niższe od dwóch.
Na koniec omówię nowość – parę przetworników cyfrowo – analogowych, czyli coś, czego dotąd nie było, a co zastępowaliśmy filtrowanymi PWM. Płytka oferuje dwa takie, niezależne wyjścia o rozdzielczości 12 bitów. Zatem możemy z tego uczynić wyjście audio. Co prawda 12 bitów to nie 16, ale w pionierskich czasach cyfrowych takimi rozdzielczościami dysponował sprzęt profesjonalny i dziś, słuchając płyt z lat osiemdziesiątych nawet nie domyślamy się, że wiele brzmień pochodzi z instrumentów dwunastobitowych.

Jednak głównym zadaniem tych wyjść jest oferowanie naprawdę stałego napięcia, bez kombinacji z filtrami – jak to bywa z PWM.
#include <Arduino_RouterBridge.h> // Biblioteka umożliwiająca przesyłanie danych do monitora.
const byte potPort = A1; // Adres portu, do którego podłączony jest potencjometr.
int potValue; // Mierzona wartość.
void setup() {
Monitor.begin(115200); // Inicjuj monitor.
analogReadResolution(12); // Deklaracja głębokości bitowej przetwornika A/D
analogWriteResolution(12); // Deklaracja głębokości bitowej przetwornika D/A
}
void loop() {
potValue = analogRead(potPort); // Zmierz napięcie.
analogWrite(DAC0, potValue); // Prześlij wartość zmierzoną na port D/A
Monitor.println(potValue); // Prześlij zmierzoną wartość do monitora.
delay(100);
}W pierwszym przykładzie będziemy przesyłać wartość napięcia ślizgacza potencjometru na wyjście przetwornika cyfrowo-analogowego. Jak widać, podłączenie tutaj wprost woltomierza pokazuje zmiany, a napięcie oczywiście sięga maksymalnie 3,3 wolta.
void setup() {
analogWriteResolution(12); // Deklaracja głębokości bitowej przetwornika D/A
}
void loop() {
for (int x = 0; x < 4096; x++) { // Zwiększaj napięcie w 4096 krokach.
analogWrite(DAC0, x); // Prześlij wartość zmierzoną na port D/A
}
}Drugi przykład generuje przebieg piły, który uzyskaliśmy w prosty, żeby nie powiedzieć: prostacki sposób: wartość napięcia jest cyklicznie zwiększana aż do 4095, po czym jest zerowana.

W kolejnych artykułach będę chciał się zająć praktycznym zastosowaniom elementów, których dokładność wzrosła, w szczególności generacji dźwięków. W 2 MB można upchać nieporównywalnie więcej próbek wobec 32 kB, siedzących w ośmiobitowym Arduino. Poza tym na przegląd czeka jeszcze matryca diod, o której dotąd napisałem tylko tyle, że istnieje.















































































































