Skocz do zawartości

Kurs Arduino - #2 - podstawy programowania, porty I/O


Komentator

Pomocna odpowiedź

Chciałbym się upewnić, jak działa INPUT_PULLUP, bo w kursie jest pewna nieścisłość. W opisie tego trybu piszecie, że jest wymagany rezystor podciągający. Jest nawet odpowiedni schemat i wydaje się to logicze.

a1.png

Ale już w połączeniu praktycznym nie ma tego rezystora. To powinien być czy nie? Jeśli skonfiguruję wejście jako INPUT, to przy rozwartym styku będzie na nim stan niski, a z INPUT_PULLUP będzie wysoki? Czy jednak muszę te stany początkowe wymusić rezystorem do VCC albo do GND? Pytam, bo jeszcze nie mogę sam sprawdzić - na razie teoria i nie mam sprzętu.

Link do komentarza
Share on other sites

@Jaroodd tak PULL-UP wymaga rezystora podciągającego do zasilania. Nie ma go na schemacie bo jest ustawiony w konfiguracji wyprowadzenia - w ten sposób wewnątrz mikrokontrolera następuje takie połączenie.

void setup() {
  pinMode(8, OUTPUT); //Dioda jako wyjście
  pinMode(7, INPUT_PULLUP); //Przycisk jako wejście
  digitalWrite(8, LOW); //Wyłączenie diody
}

Możesz też ustawić wejście jako samo INPUT, wtedy jest w stanie wysokiej impedancji i jeżeli mowa o przycisku to spowoduje to losowe odczyty. Żeby temu zapobiec trzeba dodać zewnętrzny rezystor podciągający do zasilania lub masy.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Hej. Mam wątpliwości czy mój układ z ostatniego ćwiczenia działa poprawnie. Czy światła mają zmieniać się (po kolei, wg pętli) tylko gdy swich jest wciśnięty? Tak to u mnie właśnie działa -czy tak ma być?

 

Link do komentarza
Share on other sites

@Filipo Hej, pozwolę sobie zacytować:

Jak to działa?

  1. Uruchamiamy świecenie diodami zgodnie z pewną sekwencją,
  2. wchodzimy w pętlę while(), która jest tuż poniżej,
  3. pętla jest pusta, więc program cały czas kręci się w koło i...  nic nie robi,
  4. dopiero po wciśnięciu przycisku (niespełnienie warunku) program wychodzi z pętli,
  5. zapalana jest kolejne sekwencja i sytuacja się powtarza.
12 godzin temu, Filipo napisał:

Czy światła mają zmieniać się (po kolei, wg pętli) tylko gdy swich jest wciśnięty?

Tak 🙂 Autor kursu oczekiwał, że jak przycisk będzie wciskany to będą się zmieniać, ale jak na stałe go przytrzymasz to warunek wyjścia z pętli też zostanie spełniony, tak jakby tych pętli w ogóle nie było. Dzieje się tak gdyż warunek dotyczy stanu wyprowadzenia (przycisku), inaczej byłoby z wykrywaniem zmian stanu - przerwaniami.

Edytowano przez Gieneq
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Moja wersja "świateł drogowych". Trochę uproszczona w porównaniu do rozwiązania @BHBmacieg. Nie ma świateł dla pieszych, jest tylko przycisk z przejścia i światła dla samochodów.

void setup() {
  pinMode(8, OUTPUT); // LED czerwona
  pinMode(9, OUTPUT); // LED zolta
  pinMode(10, OUTPUT); // LED zielona
  pinMode(2, INPUT_PULLUP); // Przycisk
  digitalWrite(8, LOW); // LED czerwona
  digitalWrite(9, LOW); // LED zolta
  digitalWrite(10, HIGH); // LED zielona
  }
 
void loop() {
  if ( digitalRead(2) == LOW){ // Przycisk
  digitalWrite(8, LOW); // LED czerwona
  digitalWrite(9, HIGH); // LED zolta
  digitalWrite(10, LOW); // LED zielona  
  }
  else {
    if ( digitalRead(9) == HIGH) { // czy zolta dioda swieci?
       delay(5000); // czas swiatla zoltego
       digitalWrite(8, HIGH); // LED czerwona
       digitalWrite(9, LOW); // LED zolta
       digitalWrite(10, LOW); // LED czerwona
       delay(15000); // czas swiatla czerwonego
       digitalWrite(9, HIGH); // LED zolta
       delay(5000); // czas swiatla czerwonego z zoltym
       digitalWrite(8, LOW); // LED czerwona
       digitalWrite(9, LOW); // LED zolta
       digitalWrite(10, HIGH); // LED zielona  
       } 
     }
}

Zadałem sobie pytanie, jak mogę sprawdzić stan wyjścia i to wykorzystać w programie. Sprawdziłem też przydatną cechę instrukcji IF, czyli możliwość ustawienia lub zresetowania jakiegoś bitu na stałe, wykorzystując do tego krótki impuls. W sumie rzeczy oczywiste, ale może nie dla każdego.

Link do komentarza
Share on other sites

@Jaroodd fajnie że masz zacięcie do nauki, tak trzymaj.

8 godzin temu, Jaroodd napisał:

W sumie rzeczy oczywiste, ale może nie dla każdego.

Czasem nawet wynalezienie koła na nowo, choć mało odkrywcze, to może być bardzo pouczające. 🙂 

Link do komentarza
Share on other sites

Chciałbym się odnieść do listingu pierwszego z migającą diodą na pinie 8.Nie rozumiem  po co jest funkcja pinMode (8,OUT);  w void setup ?

Usunąłem tą funkcję i dioda dalej miga , w void loop zmieniłem pin z 8 na 7 ,ponownie wgrałem kompilację i dioda miga na pinie 7 ,pomimo braku funkcji pinMode  ???

Link do komentarza
Share on other sites

@ML7 witam na forum 🙂

Funkcje Arduino możesz podejrzeć - folder programu\hardware\arduino\avr\cores\arduino

pinMode ustawia tryb wyprowadzenia. Przyczym nie ma trybu OUT tylko OUTPUT. Nie wiem jak się stało że Ci się to skompilowało. Wewnątrz funkcji pinMode jest warunek else, który zostanie spełniony dla innych wartości zmiennej mode. Dlaczego funkcja jest "nie potrzebna", ciężko powiedzieć. Wyprowadzenia Arduino są domyślnie wejściami INPUT, jeżeli twój LED jest podłączony do plusa to wejście może zaciągać prąd i tworzyć sink.

Takie "optymalizacje" nie są jednak zalecane, kod traci na jakości i działa przypadkowo. Możesz jeszcze sprawdzić jak działają funkcje, kod poniżej:

void pinMode(uint8_t pin, uint8_t mode)
{
	uint8_t bit = digitalPinToBitMask(pin);
	uint8_t port = digitalPinToPort(pin);
	volatile uint8_t *reg, *out;

	if (port == NOT_A_PIN) return;

	// JWS: can I let the optimizer do this?
	reg = portModeRegister(port);
	out = portOutputRegister(port);

	if (mode == INPUT) { 
		uint8_t oldSREG = SREG;
                cli();
		*reg &= ~bit;
		*out &= ~bit;
		SREG = oldSREG;
	} else if (mode == INPUT_PULLUP) {
		uint8_t oldSREG = SREG;
                cli();
		*reg &= ~bit;
		*out |= bit;
		SREG = oldSREG;
	} else {
		uint8_t oldSREG = SREG;
                cli();
		*reg |= bit;
		SREG = oldSREG;
	}
}

 

void digitalWrite(uint8_t pin, uint8_t val)
{
	uint8_t timer = digitalPinToTimer(pin);
	uint8_t bit = digitalPinToBitMask(pin);
	uint8_t port = digitalPinToPort(pin);
	volatile uint8_t *out;

	if (port == NOT_A_PIN) return;

	// If the pin that support PWM output, we need to turn it off
	// before doing a digital write.
	if (timer != NOT_ON_TIMER) turnOffPWM(timer);

	out = portOutputRegister(port);

	uint8_t oldSREG = SREG;
	cli();

	if (val == LOW) {
		*out &= ~bit;
	} else {
		*out |= bit;
	}

	SREG = oldSREG;
}

 

  • Lubię! 1
Link do komentarza
Share on other sites

Gdy przerobię program blink na miganie diodą na porcie 8 to wszystko działa ale jak zrobię nowy plik to wyskakuję mi błąd

Cytat

 

Arduino:1.8.12 (Windows Store 1.8.33.0) (Windows 10), Płytka:"Arduino Uno"

C:\Users\DELL\Documents\Arduino\sketch_may09b\sketch_may09b.ino: In function 'void setup()':

sketch_may09b:3:13: error: 'output' was not declared in this scope

   pinMode(8,output);

             ^~~~~~

C:\Users\DELL\Documents\Arduino\sketch_may09b\sketch_may09b.ino: In function 'void loop()':

sketch_may09b:10:19: error: 'high' was not declared in this scope

   digitalWrite(8, high);

                   ^~~~

C:\Users\DELL\Documents\Arduino\sketch_may09b\sketch_may09b.ino:10:19: note: suggested alternative: 'sinh'

   digitalWrite(8, high);

                   ^~~~

                   sinh

sketch_may09b:14:21: error: 'low' was not declared in this scope

    digitalWrite (8, low);

                     ^~~

C:\Users\DELL\Documents\Arduino\sketch_may09b\sketch_may09b.ino:14:21: note: suggested alternative: 'pow'

    digitalWrite (8, low);

                     ^~~

                     pow

exit status 1
'output' was not declared in this scope

Ten raport powinien zawierać więcej informacji jeśli w 
File -> Preferencje zostanie włączona opcja "Pokaż
szczegółowe informacje podczas kompilacji"

 

rozumiem, że muszę dodać jakieś biblioteki? ale jakie i jak?

tak wygląda program:

#include "Arduino.h"
void setup(){
  pinMode(8,output);
   // ustawiam pin 8 jako wyjscie


}

void loop() {
  digitalWrite(8, high);
   //ustawiam stan pinu 8 na wysoki
   delay(1000);
   //opoznienie 1000ms
   digitalWrite (8, low);
   //ustawiam stan pinu 8 jako niski
   delay (1000);
   //opoznienie 1000ms

}

 

  • Lubię! 1
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.