analogRead (0) lub analogRead (A0)

14

Odwołanie do arduino stwierdza , że użyjesz następującego kodu do odczytania wartości z analogowego pinu # 5:

int val1 = analogRead(5);

Jednak aby odczytać z cyfrowego pinu nr 5, przekazałeś ten sam numer pinu do digitalRead:

int val2 = digitalRead(5);

Nie powinieneś używać analogRead(A5)zamiast analogRead(5)?

Jeśli nie, co robi następujący kod:

int val3 = analogRead(A5);
Tyilo
źródło

Odpowiedzi:

28

Aby odpowiedzieć na szczegółowe pytania Tyilo:

analogRead(5)i digitalRead(5)będzie czytać z dwóch różnych miejsc. Pierwszy odczyta z kanału analogowego 5lub A5drugi odczyta z pinu 5, który okazuje się być pinem cyfrowym. Tak, jeśli chcesz czytać analogowy pin digitalRead, powinieneś go używać A5.

Dlaczego?

analogReadwymaga numeru kanału wewnętrznie, ale pozwoli ci również nadać mu numer PIN. Jeśli nadasz mu numer pinu, przekształci go w odpowiedni numer kanału. O ile wiem, analogReadjedyna funkcja, która korzysta z numeru kanału wewnętrznie, jest jedyną, która pozwala na numer kanału i jest jedyną funkcją z tą nieudokumentowaną konwersją pin-to-channel. Aby to zrozumieć, zacznijmy od kilku przykładów.

Jeśli chcesz użyć analogReadpierwszego pinu analogowego A0, możesz zrobić, analogRead(0)który używa numeru kanału lub analogRead(A0)który używa numeru pinu. Jeśli użyjesz wariantu numeru pinu, analogReadprzekonwertujesz numer pinu A0na właściwy numer kanału 0.

Jeśli chcesz użyć digitalWritepierwszego analogowego pinu, A0możesz to zrobić tylkodigitalWrite(A0, x) . digitalWritenie korzysta z kanałów analogowych wewnętrznie i nie pozwala przekazać numeru kanału. Cóż, to niech cię ale ty wybrałeś niewłaściwy kod PIN. To samo dotyczy, digitalReada nawet analogWrite.

Co z konwersjami pin-to-channel wykonanymi przez analogRead? Źródło tej funkcji można znaleźć w hardware/arduino/avr/cores/arduino/wiring_analog.c: Zobaczysz, że wykonuje ona proste odejmowanie w zależności od typu płytki. Plik A0/ A1/ A2/ itp. Stałe reprezentują liczbę pinów kanałów analogowych i mogą być używane wszędzie tam, gdzie potrzebujesz odwoływać się do wejść analogowych. Z tego powodu są najlepszą opcją do użycia w kodzie Arduino, ponieważ jest oczywiste, że używasz tego samego portu fizycznego, nawet jeśli używasz różnych funkcji. Definicje tych stałych zależą od twojej planszy.

Na przykład, oto kod definicji pinów analogowych dla Arduino Uno w hardware/arduino/avr/variants/standard/pins_arduino.h

static const uint8_t A0 = 14;
static const uint8_t A1 = 15;
static const uint8_t A2 = 16;
static const uint8_t A3 = 17;
static const uint8_t A4 = 18;
static const uint8_t A5 = 19;
static const uint8_t A6 = 20;
static const uint8_t A7 = 21;

Dla porównania tutaj jest analogowy kod definicji pin dla Arduino Mega:

static const uint8_t A0 = 54;
static const uint8_t A1 = 55;
static const uint8_t A2 = 56;
[...]
static const uint8_t A13 = 67;
static const uint8_t A14 = 68;
static const uint8_t A15 = 69;

Dalsza dyskusja EE na temat pinów analogowych: Czy mogę używać analogowych pinów na Arduino dla mojego projektu jako cyfrowego?

Kevin Mark
źródło
1
Myślałem, że to dokładnie tak, jak wyjaśniłeś, po prostu pomyliłem się z odniesieniem do Arduino, które zawiera fałszywe informacje.
Tyilo 18.04.13
1
Możesz to zrobić tylkoanalogRead na pinach analogowych! Z drugiej strony analogWritemoże być stosowany zarówno na pinie analogowym, jak i PWM.
Tyilo,
1
@Tyilo Zaktualizowałem swoją odpowiedź kilkoma dokładniejszymi informacjami pochodzącymi z kodu źródłowego.
Kevin Mark
3
AnalogWrite () można wywołać na dowolnym z pinów, ale robi to tylko na pinach PWM. Na pinach cyfrowych innych niż PWM i wszystkich pinach analogowych po prostu wywołuje digitalWrite ().
baldengineer
3
@powtac - Ogólnie przyjmuje się, że dokumentacja arduino jest dość obrzydliwa, przynajmniej tutaj. Nie czuj się jakbyś coś przeoczył, to nie ty, to ludzie arduino.
Connor Wolf,
3

Spędziłem nad tym godziny. Myślałem, że mam problem ze sprzętem. Okazuje się, że dzwoniłem analogRead()niepoprawnie.

Niepoprawny (błędny przykładowy kod z DFRobot 😣):

val = analogRead(0); //connect sensor to Analog 0

Poprawny:

val = analogRead(A0); //connect sensor to Analog 0

Aktualizacja : analogRead()pobiera numery pinów GPIO. A0itd. to #definicja numerów pinów Arduino, gdzie A0 == 36.

Bądź ostrożny: np. Na FireBeetle ESP32, pin oznaczony „IO36 / A0” (GPIO36) równa się Arduino A0, ale „IO39 / A1” (GPIO39) równa się Arduino A3(nie A1), „IO34 / A2” (GPIO34) równa się Arduino A6(nie A2) itp.

jrc
źródło