Programowanie robotów

Jeśli chcesz wejść w świat elektroniki i programowania mikrokontrolerów bez kupowania sprzętu na start, świetnym rozwiązaniem jest Tinkercad Circuits (symulator Arduino w przeglądarce). Pozwala budować wirtualne układy (Arduino + diody, przyciski, rezystory, czujniki) i uruchamiać kod tak, jakby działał na prawdziwej płytce.

W tym artykule przejdziemy przez absolutne podstawy: void setup(), void loop(), opóźnienia (delay), oraz konfigurację i obsługę pinów GPIO jako wejścia i wyjścia.


Arduino + Tinkercad: o co chodzi?

Arduino to platforma do nauki i prototypowania elektroniki. Składa się z:

  • płytki (np. Arduino Uno),

  • środowiska programistycznego,

  • prostego języka opartego o C/C++.

Tinkercad Circuits pozwala:

  • złożyć układ na wirtualnej płytce stykowej,

  • pisać kod Arduino,

  • włączyć symulację i obserwować działanie (np. miganie LED, odczyt przycisku).


Struktura programu Arduino:

setup() i loop()

Każdy szkic (program) Arduino ma zwykle dwie główne funkcje:

void setup()

To część kodu, która uruchamia się raz – na starcie programu (po włączeniu zasilania lub resecie).

W setup() najczęściej:

  • ustawiasz tryby pinów (pinMode)

  • uruchamiasz komunikację szeregową (Serial.begin)

  • ustawiasz stan początkowy wyjść (np. gasisz diodę)

void setup() {
pinMode(13, OUTPUT); // pin 13 jako wyjście (np. LED)
Serial.begin(9600); // start komunikacji z monitorem portu
}

void loop()

To pętla wykonywana w kółko – Arduino nie kończy programu, tylko ciągle powtarza loop().

W loop() zwykle:

  • odczytujesz czujniki i przyciski

  • podejmujesz decyzje (if/else)

  • sterujesz diodami, silnikami, buzzerem

  • wysyłasz dane do komputera

void loop() {
digitalWrite(13, HIGH);
delay(500);
digitalWrite(13, LOW);
delay(500);
}

Efekt: LED miga co 0,5 sekundy.


Opóźnienie w Arduino:  delay() i co to znaczy „blokuje” delay(ms)

Funkcja delay() wstrzymuje wykonywanie programu na określony czas w milisekundach.

  • delay(1000) = 1 sekunda

  • delay(200) = 0,2 sekundy

digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(1000);

Ważne: delay() jest opóźnieniem blokującym.

To znaczy: w trakcie delay() Arduino nie robi nic innego (nie odczytuje przycisków, nie reaguje na zdarzenia w kodzie, bo po prostu „czeka”).

Na początek to wygodne, ale później (przy większych projektach) przechodzi się na programowanie bezblokujące (np. millis()).


GPIO – co to jest i jak działa?

GPIO (General Purpose Input/Output) to piny mikrokontrolera, które mogą pracować jako:

  • wejście (INPUT) – odczytujesz stan (np. przycisk)

  • wyjście (OUTPUT) – ustawiasz stan (np. LED)

  • wejście z podciąganiem (INPUT_PULLUP) – przycisk bez dodatkowego rezystora

W Arduino konfigurujesz to funkcją:

pinMode(pin, tryb)

Przykłady trybów:

  • OUTPUT

  • INPUT

  • INPUT_PULLUP


Ustawianie pinu jako WYJŚCIE (OUTPUT)

Gdy pin jest wyjściem, sterujesz nim:

  • digitalWrite(pin, HIGH) – stan wysoki (zwykle ~5V w UNO)

  • digitalWrite(pin, LOW) – stan niski (0V)

Przykład – LED na pinie 13:

const int LED = 13;

void setup() {
pinMode(LED, OUTPUT);
}

void loop() {
digitalWrite(LED, HIGH);
delay(300);
digitalWrite(LED, LOW);
delay(300);
}

Odczyt pinu jako WEJŚCIE (INPUT)

Gdy pin jest wejściem, odczytujesz go:
• digitalRead(pin) – zwraca HIGH albo LOW

Przykład – przycisk na pinie 2 (z zewnętrznym rezystorem):

const int BTN = 2;
const int LED = 13;

void setup() {
pinMode(BTN, INPUT);
pinMode(LED, OUTPUT);
}

void loop() {
int state = digitalRead(BTN);

if (state == HIGH) {
digitalWrite(LED, HIGH);
} else {
digitalWrite(LED, LOW);
}
}

INPUT_PULLUP – najprostszy przycisk bez rezystora

Arduino ma wewnętrzne rezystory podciągające.
Jeśli użyjesz:

pinMode(BTN, INPUT_PULLUP);

to:

  • pin domyślnie jest w stanie HIGH

  • po wciśnięciu przycisku (zwierasz do GND) odczytujesz LOW

To często myli na początku, bo logika jest „odwrócona”.

const int BTN = 2;
const int LED = 13;

void setup() {
pinMode(BTN, INPUT_PULLUP);
pinMode(LED, OUTPUT);
}

void loop() {
int state = digitalRead(BTN);

if (state == LOW) { // wciśnięty!
digitalWrite(LED, HIGH);
} else {
digitalWrite(LED, LOW);
}
}

W Tinkercad podłączasz przycisk: jeden styk do pinu 2, drugi do GND.

20 pytań (z odpowiedziami)

  1. Do czego służy Tinkercad Circuits?

    Odp: Do symulowania układów elektronicznych i uruchamiania kodu Arduino w przeglądarce.

  2. Z czego składa się platforma Arduino (w uproszczeniu)?

    Odp: Płytka (np. Uno), środowisko programistyczne i język oparty o C/C++.

  3. Ile głównych funkcji ma typowy program Arduino? Jakie to funkcje?

    Odp: Dwie: setup() i loop().

  4. Kiedy wykonuje się void setup()?

    Odp: Raz, na starcie programu (po włączeniu zasilania lub resecie).

  5. Podaj 2 typowe rzeczy robione w setup().

    Odp: Ustawienie trybów pinów pinMode(), uruchomienie Serial.begin(), ustawienie stanu początkowego wyjść.

  6. Kiedy wykonuje się void loop()?

    Odp: W pętli bez końca, ciągle od początku do końca funkcji.

  7. Co robi pinMode(pin, OUTPUT)?

    Odp: Ustawia dany pin jako wyjście (Arduino steruje napięciem na pinie).

  8. Co zwraca digitalRead(pin)?

    Odp: HIGH albo LOW.

  9. Co robi digitalWrite(pin, HIGH)?

    Odp: Ustawia stan wysoki na pinie (np. ~5V w Arduino Uno).

  10. Jaka jednostka czasu jest w delay()?

    Odp: Milisekundy.

  11. Ile to delay(1000)?

    Odp: 1 sekunda.

  12. Co znaczy, że delay() jest „blokujące”?

    Odp: W czasie opóźnienia program nie wykonuje innych działań (np. nie sprawdza przycisków).

  13. Co to jest GPIO?

    Odp: Piny ogólnego przeznaczenia wejścia/wyjścia mikrokontrolera.

  14. Wymień trzy tryby pinMode() opisane w tekście.

    Odp: OUTPUT, INPUT, INPUT_PULLUP.

  15. Po co używa się INPUT_PULLUP?

    Odp: Żeby użyć wewnętrznego rezystora podciągającego i podłączyć przycisk bez zewnętrznego rezystora.

  16. Jaki jest stan pinu w INPUT_PULLUP, gdy przycisk NIE jest wciśnięty?

    Odp: HIGH.

  17. Jaki jest stan pinu w INPUT_PULLUP, gdy przycisk JEST wciśnięty (zwarty do GND)?

    Odp: LOW.

  18. Dlaczego INPUT_PULLUP bywa mylące dla początkujących?

    Odp: Bo logika przycisku jest odwrócona: wciśnięty = LOW, puszczony = HIGH.

  19. W prostym miganiu LED: co trzeba zrobić z pinem LED w setup()?

    Odp: Ustawić pinMode(LED, OUTPUT).

  20. Do czego służy Serial.begin(9600)?

    Odp: Uruchamia komunikację szeregową (np. do Monitora portu) z prędkością 9600 bps.

 

 

 

 

Zostaw komentarz

Koszyk