Witajcie w naszym najnowszym
newsletterze edukacyjnym poświęconym tematyce Arduino! Przede wszystkim
dziękujemy za zaufanie i dołączenie do naszej listy mailingowej. Cieszymy się,
że możemy razem odkrywać niesamowity świat mikrokontrolerów i projektowania
elektroniki.
W naszych newsletterach skupimy
się głównie na zgłębianiu tajemnic programowania, elektroniki, ciekawych
projektach znalezionych w sieci, nowościach ze społeczności arduinowo.pl oraz
podsumowań naszych dyskusji na kanałach Discord. Niezależnie od tego, czy
dopiero zaczynasz swoją przygodę, czy już tworzysz złożone projekty, mam
nadzieję, że znajdziesz tutaj coś ciekawego i inspirującego. Zapraszamy do
lektury i eksperymentowania!
Czym są
funkcje w Arduino? Funkcje to małe bloki kodu, które wykonują
określone zadanie. Możesz je wywoływać wielokrotnie w swoim programie, co
ułatwia zarządzanie kodem i rozwiązywanie skomplikowanych
problemów.
Dlaczego funkcję są dla
nas ważne? Używanie funkcji jest bardzo korzystne podczas pracy z AI,
ponieważ na chwilę obecną modele takie jak chatGPT nie
potrafią wygenerować kodów dla bardziej złożonych projektów. Pytając chatGPT o
napisanie tylko pojedynczych funkcji łatwiej jest nam dokładnie opisać czego
oczekujemy, przetestować i zaimplementować w projekcie.
Podczas pracy z
Arduino często wykorzystujemy wbudowane funkcje systemowe, na
przykład:
1. Funkcję
delay(1000),
która wprowadza opóźnienie w wykonywaniu programu na jedną
sekundę.
2.
Funkcję digitalRead(3), która służy
do odczytywania stanu cyfrowego z określonego pinu, w tym przypadku z pinu
numer 3. Funkcja ta zwraca wartość binarną, która może
być HIGH (wysoki) lub
LOW (niski), w zależności od stanu napięcia na
danym pinie. Jest ona przydatna do odczytywania sygnałów z różnych czujników
lub przycisków.
W Arduino IDE możemy
stworzyć również własne funkcje, przykładowo funkcję która doda nam dwie liczby
całkowite - Rys.1.
Rys.1. Przykład definicji funkcji użytkownika zwracającej sumę dwóch liczby.
Elementy składowe
definicji funkcji:
1. Nazwa
funkcji: Na początku nadajemy unikatową nazwę funkcji. Najlepiej,
aby jej nazwa kojarzyła się z zadaniem realizowanym przez funkcję. W naszym
przypadku funkcja ma dodawać dwie liczby dlatego nazwaliśmy
ją dodaj.
2. Parametry
wejściowe: W tym miejscu wprowadzamy zmienne, które chcemy
wykorzystać w naszej funkcji. W naszej przykładowej funkcji
dodaj parametrami wejściowymi będą dwie liczby,
które chcemy dodać i nazwaliśmy je literami
a oraz b. Dodatkowo
musimy podać typy tych zmiennych. Typy zmiennych w Arduino to podstawowe
elementy, które pozwalają określić rodzaj i rozmiar danych, z którymi program
będzie pracować. O typach napiszemy jeszcze szczegółowo w innym wydaniu
newslettera. W tym przykładzie dla naszych parametrów wejściowych wybraliśmy
typ int (INTEGER), który reprezentuje zmienną
całkowitą o wartości w zakresie od -32768 do 32767. Możliwe jest stworzenie
funkcji bez parametrów wejściowych - wtedy w nawiasach okrągłych, gdzie
wpisalibyśmy parametry nic nie wpisujemy.
3. Ciało funkcji,
klamry: Ciało funkcji to miejsce, gdzie umieszczamy wszystkie
polecenia (kod programu funkcji), które wykonać ma funkcja i muszą zawierać się
między klamrą otwarcia { oraz
zamknięcia }. Ponieważ nasza funkcja ma dodać
dwie liczny, wprowadziliśmy dodatkowo zmienną c
jest równa sumie zmiennej a oraz zmiennej
b. Zmienną c
zdefiniowaliśmy jako typu int - INTEGER, trzeba
jednak zwrócić uwagę, że suma dwóch liczb
typu int w wyniku może dać liczbę poza zakresem
typu int od -32768 do
32767 (wtedy funkcja nie będzie działała prawidłowo). Należy o tym pamiętać i w
razie potrzeby zmienić typ na long lub wprowadzić
dodatkowe zabezpieczenie (np. funkcję sprawdzającą).
4. Wartość zwracana i
jej typ: W Arduino IDE, funkcja zwraca wartość po poleceniu
return. Funkcja może zwrócić tylko pojedynczą
wartość i po zrealizowaniu polecenia return
ignoruje dalszy kod programu funkcji. W naszym przykładzie zwróciliśmy wartość
zmiennej c czyli
napisaliśmy: return c;. O typach było już krótko
w podpunkcie nr 2. Tak samo jak parametry funkcji muszą mieć swój typ, również
musimy zdefiniować typ dla wartości zwracanej. Ponieważ nasza zmienna
c jest typu int dlatego można przypisać taki
sam typ zwracany, czyli int. Jeśli nie chcemy, aby funkcja
zwracała wartość zamiast typu wpisujemy void.
Wywołanie
funkcji: Mamy już gotową funkcję dodaj i teraz możemy
użyć ją w naszym kodzie głównego programu setup lub
loop. W naszym przypadku, jeśli chcemy obliczyć sumę liczb 2 i
5, wywołanie funkcji będzie wyglądało bardzo
prosto: doda(2,5); Wynik możemy również przypisać do nowej
zmiennej np.: int wynik = doda(2,5);. Po takim poleceniu
zmienna wynik przyjmie wartość równą 7.
W
praktyce użycie naszej funkcji dodaj będzie wyglądało następująco:
Kod definicji funkcji w
przeciwieństwie do wywołania funkcji dodajemy w dowolnym miejscu poza sekcją
setup i loop (my umieściliśmy na końcu
programu za sekcją loop - patrz na kod powyżej).
Ciekawostki dla bardziej
zaawansowanych
Jak w Arduino zwrócić z
funkcji więcej niż jedną wartość? W Arduino IDE nie da się
bezpośrednio zwrócić więcej niż jednej wartości, można jednak zastosować pewne
triki. Poniżej pokażemy jak "zwrócić" dwie zmienne - jednocześnie wynik dla
dodawania oraz odejmowania.
1. Użycie
zmiennych globalnych na przykład:
2. Użycie wskaźników
na przykład:
3. Użycie struktury
na przykład:
4. Użycie tablicy na
przykład:
Powyższymi sposobami
można "zwrócić" z funkcji kilka parametrów. Znajcie jeszcze jakieś inne
sposoby? Jeśli tak koniecznie napiszcie w społeczności na
naszym serwerze Discord.
W pierwszym wydaniu newsletera,
napiszemy krótko o najbardziej podstawowym elemencie wykorzystywanym w
elektronice - jest nim rezystor. W jednym zdaniu można napisać, że rezystor
jest elementem ograniczającym prąd płynący w obwodzie elektrycznym. Na
schematach rezystory mogą mieć różne symbole graficzne np. - Rys.2.
Rys.2. Przykłady symboli graficznych rezystorów na schematach.
Rezystory przydają się
także w wielu bardziej złożonych aplikacjach, takich jak dzielniki napięcia,
filtry, czy układy wzmacniaczy. Znajomość ich właściwości pozwala na precyzyjne
kontrolowanie sygnałów w obwodzie, co jest niezbędne w wielu zaawansowanych
projektach Arduino.
Co ważne, rezystory występują w
różnych wartościach rezystancji, które są zazwyczaj oznaczane za pomocą kodu
kolorowego – umiejętność odczytywania tych kodów jest bardzo pomocne (szukaj w
sieci "kod paskowy rezystora"). Również rezystory SMD są oznaczone
cyframi.
Wartość rezystancji można
również zmierzyć multimetrem, jednak w ten sposób możemy mierzyć tylko
rezystory niepodłączone do obwodu (pomiar podłączonego do obwodu rezystora może
dać nieprawidłowy wynik).
Dla użytkowników Arduino,
zrozumienie roli rezystorów jest kluczowe. Są one nie tylko fundamentem wielu
projektów, ale także służą do ochrony innych komponentów przed uszkodzeniem
przez nadmierny prąd. Przykładem może być użycie rezystora do ograniczenia
prądu płynącego przez diodę LED, aby zapobiec jej przepaleniu - Rys.3.
Rys.3. Przykład zastosowania rezystora w obwodzie diody LED.
Jak obliczyć
wartość rezystora, który musimy zastosować dla typowej diody
LED?
Nasza płytka Arduino zasilana
jest napięciem 5V to napięcie zasilania (NZ) diody również
wynosi NZ = 5V. Aby obliczyć wartość rezystora R, przyjmijmy
standardowe wartości dla typowej diody LED:
1. Prąd przewodzenia (PP) diody LED: PP = 20
mA (0.02 A) - to typowa wartość dla wielu diod LED.
2. Napięcie przewodzenia (NP) diody LED: NP =
2V - to przybliżona wartość dla wielu diod LED, ale może się różnić w
zależności od koloru i typu diody.
Zastosujemy wzór na obliczenie wartości rezystancji (prawo Ohma):
R = (NZ-NP)/PP = (5V - 2V) /
0.02A = 150Ohm
Wartość rezystora, który powinieneś użyć do ograniczenia prądu diody LED
podłączonej do źródła 5V, wynosi minimalnie 150Ohm. Jeśli masz kartę katalogową
używanej diody LED, możesz znaleźć w niej dokładne wartości prądu
oraz napięcia przewodzenia i podstawić do powyższego wzoru.
Jaki rezystor
zastosować, aby chronić pin wyjściowy Arduino UNO (ustawiony jako OUTPUT) przed
uszkodzeniem?
Arduino UNO działa z napięciem
logicznym U = 5V i zaleca się, aby prąd płynący przez każdy pin GPIO nie
przekraczał I = 20mA (absolutnie maksymalny prąd dla pinu GPIO to I = 40
mA).
Wartość rezystora zalecana: R = U
/ I = 5V / 0.02A = 250Ohm.
Wartość rezystora minimalna: R =
U / I = 5V / 0.04A = 125Ohm.
Aby ograniczyć prąd do 40 mA na
pinie wyjściowym Arduino UNO, należy użyć rezystora o wartości nie mniejszej
niż 125 omów. Użycie takiego rezystora zapewni, że prąd płynący przez pin nie
przekroczy maksymalnej bezpiecznej wartości dla Arduino UNO, nawet jeśli pin
zostanie przypadkowo zwarty do masy (jednak rekomenduje się używanie rezystorów
o nieco wyższej wartości np. 220Ohm).
Rezystory
nielinowe
Chociaż większość
standardowych rezystorów ma liniową charakterystykę rezystancji w stosunku do
napięcia, rezystory nieliniowe wykazują zmienność swojej rezystancji w
zależności od innych czynników, takich jak temperatura, oświetlenie czy
napięcie.
Termistory w skrócie PTC (Positive
Temperature Coefficient) i NTC (Negative Temperature Coefficient). Termistory
PTC zwiększają swoją rezystancję wraz ze wzrostem temperatury, podczas gdy
termistory NTC zachowują się odwrotnie – ich rezystancja maleje przy wzroście
temperatury. Ta właściwość sprawia, że są one niezwykle przydatne w aplikacjach
do pomiaru temperatury, ochrony przed przegrzaniem, czy w układach kompensacji
temperaturowej.
Fotorezystory zmieniają swoją
rezystancję w odpowiedzi na zmiany natężenia światła. Ich rezystancja maleje
przy wzroście natężenia światła, co czyni je przydatnymi w czujnikach światła,
alarmach i urządzeniach do automatycznego sterowania oświetleniem.
Warystory, znane również jako VDR
(Voltage Dependent Resistors), mają charakterystykę rezystancji zależną od
przyłożonego napięcia. Przy normalnych warunkach pracy mają wysoką rezystancję,
ale w przypadku wystąpienia wysokiego napięcia (jak w przypadku przepięć) ich
rezystancja gwałtownie spada, co pozwala na przepuszczenie prądu i ochronę
innych elementów układu.
Ciekawostką może być
fakt, że w bardzo zaawansowanych zastosowaniach, takich jak precyzyjne układy
pomiarowe czy sprzęt audiofilski, wybór odpowiedniego typu rezystora (np.
metalizowany, drutowy, węglowy) może mieć znaczący wpływ na działanie całego
układu ze względu na różnice w szumie termicznym, stabilności i innych
parametrach rezystorów.
W tej części newsletera
przedstawiamy ciekawy projekt znaleziony w sieci. Tym razem jest nim
angielskojęzyczny projekt dla Arduino UNO, wykorzystujący wyświetlacz OLED jako
wskaźnik trójwymiarowego kompasu pionowego. Autor w celu pokazania jak działa
wyświetlanie kierunku dla uproszczenia zastosował potencjometr zamiast
magnetometru. Poza samym opracowaniem, autor pokazuje również na filmie, w jaki
sposób zasymulować pracę potencjometru oraz wyświetlacza OLED online na
stronie wokwi.com.
Choć kanały na naszym
serwerze Discord zostały niedawno utworzone i nie ma jeszcze wielu członków,
nie brakuje na nim ciekawych dyskusji.
Zamieszczamy tu
podsumowanie naszych ostatnich dyskusji na serwerze Discord:
@jimboston - przedstawił
swój projekt automatycznej praski do prochu, wykonanej w technologii 3D oraz
schemat blokowy jej działania. Pytał również rekomendację w sprawie doboru
najlepszych podzespołów.
@PM - przedstawił
propozycję kodu programu dla Arduino dla praski użytkownika @jimboston
@Piotr Spychalski Gaśnica
- pytał o programy do projektowania PCB oraz firmy produkujące płytki
PCB.
Dla osób które chcą
jeszcze zapisać się na serwer dyskusyjny o Arduino na Discord udostępnione
zostało aktualne zaproszenie:
Dziękujemy za przeczytanie tego
newslettera. Twoja opinia jest bardzo ważna i wpływa na treści, które w
przyszłości zostaną opublikowane.
Czy podobała Ci się
treść tego wydania newslettera?
Jaki jest dla
Ciebie poziom zaawansowania materiałów tego wydania
newslettera?
Swoją szczegółową opinią możesz
podzielić się na kanale Discord o nazwie "newsletter-dyskusja"
|