Arduino: miernik rezystancji w… Scratchu?

Podczas kolejnych zajęć w Laboratorium Nowych Technologii, spotkałem się z problemem mierzenia rezystacji. Sprawa jest trywialna, o ile macie pod ręką multimetr albo mega-pamięć do tych kolorowych pasków. A co jeżeli na stole leży jedynie Arduino i kilka rezystorów? Nie ma problemu: wystarczy zrozumieć, jak działa dzielnik napięciowy:)

IMG_0535Podobnych projektów w Sieci znajdziecie bardzo wiele. Jeden z nich postanowiłem zaadoptować na potrzeby naszej pracowni. Stąd własnie wpadłem na pomysł wykorzystania… Scratcha:) A dokładniej S4A, czyli Scratcha dla Arduino.

Dzielnik napięciowy

Dzielnik napięciowy to jedna z podstawowych konstrukcji w elektronice. Pozwala na zmniejszenie napięcia wejściowego do zadanego poziomu na wyjściu.

Uwaga: dzielinik napięciowy oparty na rezystorach można stosować jedynie do konwersji poziomów logiki; nie można z niego zasilać elementów i układów.

Spójrzmy więc na taki oto układ:

divider_1Napięcie wyjściowe U_{wy} zmienia się tutaj w zależności od wartości rezystorów R_1 i R_2 oraz napięcia wejściowego U_{we}:

U_{wy} = U_{we} * {R_2 \over R_1 + R_2}

Mierzenie nieznanego rezystora

Na potrzeby tego projektu, założymy, że R_1 będzie miało znaną wartość. Naszym tajemniczym rezystorem będzie R_2. Zakładając, że {U_{wy}}>0, {R_1}>0 oraz {R_2}>0:

U_{wy} = U_{we} * {R_2 \over R_1 + R_2}
(R_1+R_2)*U_{wy}=U_{we}*R_2
R_1+R_2={U_{we}\over U_{wy}}*R_2
{R_1 \over R_2}+1={U_{we}\over U_{wy}}
{R_1 \over R_2}={U_{we}\over U_{wy}}-1
{R_2 \over R_1}={1 \over {U_{we}\over U_{wy}}-1}
{R_2}={R_1 \over {U_{we}\over U_{wy}}-1}

W ten sposób możemy wyznaczyć wartość rezystora R_2.

Pomiar napięcia przez Arduino

W tym projekcie, wejściowe piny przetwornika analog-cyfra  Arduino (oznaczone A0 – A5) użyjemy do zmierzenia napięcia wyjściowego U_{wy}.

Taki odczyt w Arduino-C można uzyskać za pomocą wywołania:

//Zmienna raw zawiera wynik odczytu z pinu analogowego analogPin, np. A0
int raw = analogRead(analogPin);

Zauważcie, że zwracana wartość zawiera się w przedziale 0..1023. Wartość tą należy przemapować na napięcie logiki Arduino, które wynosi 5V. Wtedy:

  • raw == 0: napięcie 0V
  • raw == 1023: napięcie 5V (jak zasilanie Arduino).

Łatwo to osiągnąć, gdybśmy pisali nasz program w Arduino-C:

float raw = analogRead(analogPin);
float vout;
vout = (5.0 / 1023.0) * raw;
//lub
vout = (5.0 * raw) / 1023.0;

Uwaga: aż prosiłoby się tu użyć funkcję map(value, fromLow, fromHigh, toLow, toHigh). Niestety – operuje ona jedynie na liczbach całkowitych. Zwróciłaby więc jedynie wartości 0, 1, 2, 3, 4, 5. Rozdzielczość takiego miernika byłaby raczej mało użyteczna.

Scratch

Zanim weźmiemy się za składanie bloczków, warto przypatrzyć się wzorowi:

{R_2}={R_1 \over {U_{we}\over U_{wy}}-1}
…i trochę go uprościć przyjmując pewne założenia:

  • {R_1}=1000, bo użyjemy rezystora 10kΩ,
  • {U_{we}}=5, bo użyjemy zasilania Arduino 5V,
  • {U_{wy}}=raw, wartość odczytana z pinu A0.

W związku z tym, podstawiając odpowiednie wartości:
{R_2}={R_1 \over {5 \over {5 * raw \over 1023}}-1}
{R_2}={R_1 \over { {1023 \over {raw}} -  {raw \over raw}}}
{R_2}={R_1 \over { {1023 -raw} \over {raw}}}
{R_2}=R_1 * {raw \over {1023 - raw} }

I lepiej:
{R_2}={{R_1 * raw} \over {1023 - raw}}

’Kod’ programu

Nasz program zrealizujemy za pomocą następujących bloczków:

bloczki_0Zwróćcie uwagę na kilka właściwości tego kodu:

  • Program wykonuje się po kliknięciu zielonej flagi,
  • W nieskończonej pętli:
    • Ustawia wartość R_1 na 10000 (odpowiada rezystorowi 10kΩ,
    • Pobiera wartość z sensora Analog0 (A0) i przypisuje ją do zmiennej raw,
    • Oblicza wartość rezystora i zapisuje w zmiennej R_2,
    • Wyświetla na ekranie zawartość zmiennej R_2,
    • Czeka 1 sekundę do następnego pomiaru

Teraz wystarczy wcisnąć zieloną flagę: wartość rezystora pojawi się w dymku:
bloczki_1

Kilka testów

Testy wykonałem na rezystorze R_1=10k z pomocą dekady rezystorowej w roli R_2. Dzięki dekadzie mogłem sprawdzić naprawdę szeroki zakres rezystancji.

Dekada Wskazanie
100Ω 78,82
220Ω  209.58
330Ω  312.5
470Ω  460.12
1kΩ  1000
4.7kΩ  4149
10kΩ  10179
47kΩ 48157
100kΩ 103666

Jak sami widzicie: dokładność może nie jest zbyt imponująca, ale w zupełności wystarcza do zgrubnego określenia wartości rezystora.

A teraz odwróciłem sytuację zastanawiając się, jak dobór rezystora R_1 wpływa na dokładność pomiaru rezystora R_2.
I tak, dla rezystora R_2=46 \Omega (rezystancja zmierzona multimetrem UT33C: 46.9kΩ):

  • R_1=10k\Omega: wynik: 29,41
  • R_1=1k\Omega: wynik: 44,94

Dla rezystora R_2=360 \Omega (rezystancja zmierzona multimetrem UT33C: 352Ω):

  • R_1=10k\Omega: wynik: 343,78
  • R_1=1k\Omega: wynik: 354,97

Natomiast dla rezystora R_2=1k \Omega (rezystancja zmierzona: 975Ω):

  • R_1=10k\Omega: wynik: 964,39
  • R_1=1k\Omega: wynik: 971,1

Natomiast dla rezystora R_2=4k7 \Omega (rezystancja: 4.7kΩ):

  • R_1=10k\Omega: wynik: 4740,63
  • R_1=1k\Omega: wynik: 4715,08

Natomiast dla rezystora R_2=10k \Omega: (rezystancja: 9.69kΩ)

  • R_1=10k\Omega: wynik: 9749,03
  • R_1=1k\Omega: wynik: 9768,42

Natomiast dla rezystora R_2=100k \Omega: (rezystancja: 100.7kΩ)

  • R_1=10k \Omega: wynik: 103666,67
  • R_1=1k\Omega: wynik: 112666,67

Wydaje się się, że mniejszy rezystor R_1 lepiej sprawdza się do mierzenia rezystorów o mniejszych pojemnościach – gorzej dla większych pojemności.

Źródła

Dodaj komentarz