Skocz do zawartości

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


Komentator

Pomocna odpowiedź

Ok, już rozumiem jak działa przycisk. Tylko kwestia dlaczego przy programowaniu przycisku, daje mu się wartość LOW, gdy jest wciśnięty? Jeżeli jest obwód zamknięty, to czy nie powinna być wartość HIGH? Tak z ciekawości się pytam, bo mnie zainteresowało poprzednie pytanie kolegi.

Link do komentarza
Share on other sites

Nie, chyba nie rozumiesz.

Przycisk jest podłączony jednym końcem do masy, a drugim do pinu wejściowego mikrokontrolera. Pin jest również podłączony do rezystora, którego drugi koniec jest połączony z plusem zasilania.

Odpowiedz sobie na dwa pytania:

1) Jaki stan panuje na wejściu jeśli przycisk nie jest wciśnięty (tzn. jakie tam może byc napięcie i czy odpowiada LOW czy HIGH)?

2) To samo dla wciśniętego przycisku.

 

Link do komentarza
Share on other sites

W arduino IDE masz dwa przykłady: Button oraz DigitalInputPullup obydwa pokazują i opisują (w komentarzu na początku skecza) to co już zostało wytłumaczone w wypowiedziach na forum tylko może w inny sposób. 

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

@Panda nie, w przycisku nie ma żadnego rezystora. Może inaczej: jeśli wejście ustawimy jak INPUT_PULLUP to domyślnie na wejściu mamy stan wysoki HIGH (już nie wnikajmy dlaczego). Jak wciskasz przycisk to "podłączasz" do tego wejścia stan niski LOW. Czyli po wciśnięciu przycisku, ze stanu HIGH na wejściu robi się nagle LOW. Czy do tego momentu jest to jasne?

Link do komentarza
Share on other sites

3 godziny temu, Treker napisał:

@Panda nie, w przycisku nie ma żadnego rezystora. Może inaczej: jeśli wejście ustawimy jak INPUT_PULLUP to domyślnie na wejściu mamy stan wysoki HIGH (już nie wnikajmy dlaczego). Jak wciskasz przycisk to "podłączasz" do tego wejścia stan niski LOW. Czyli po wciśnięciu przycisku, ze stanu HIGH na wejściu robi się nagle LOW. Czy do tego momentu jest to jasne?

@Treker Dziękuje za wyjaśnienie, teraz rozumiem już o co chodzi z tym przyciskiem. Mam tylko jeszcze taką sprawę:


const int RED = 10;
const int GREEN = 8;

void setup() {
  
  pinMode(RED, OUTPUT);
  pinMode(GREEN, OUTPUT);
 
  digitalWrite(RED, LOW);
  digitalWrite(GREEN, HIGH); //ustawiam odpowiedni pin dla diody zielonej na HIGH
}

void loop() {
 

      if(digitalRead(GREEN)==HIGH){
         digitalWrite(RED, HIGH); //czerwona dioda sie zaswieci
      }
      else {
        digitalWrite(RED, LOW); //czerwona dioda gasnie 
      }

}

W przypadku diod powinno być podobnie, tzn. kiedy ustawię jakiś pin na HIGH i połączę go z masą to jego odczyt powinien dać teoretycznie LOW. W tym przypadku zapalam diodę zieloną, i zgodnie z moimi założeniami warunek logiczny nie powinien zostać spełniony ponieważ pin 8 jest zwarty do masy. A jednak została odczytana wartość HIGH, co źle rozumiem? No chyba że w ogóle wywoływanie funkcji digitalRead() dla ustawionego stanu OUTPUT nie jest właściwe...

Przepraszam jeśli odpowiedź jest logiczna ale dopiero się uczę i jeszcze wszystko mi się plącze ... 😕 ( a wolę być pewny że rozumiem temat w 100% ).

Edytowano przez JAKPAD
Link do komentarza
Share on other sites

Mylisz wejścia z wyjściami. Jeśli ustawiasz na wyjściu pinu HIGH to nie możesz go "łączyć z masą" bo robisz wtedy zwarcie i niszczysz Arduino... Jeśli chodzi Ci o sterowanie diody podłączonej do Arduino to nie możesz tego traktować jak "łączenie z masą", bo to tak nie działa. Wydaje mi się, że Twoim problemem nie są podstawy Arduino, a podstawy elektroniki. Lepiej byłoby chyba zająć się porządnie kursem elektroniki, bo tam znajdziesz odpowiedzi na zadawane tu pytania 😉

2 godziny temu, JAKPAD napisał:

A jednak została odczytana wartość HIGH, co źle rozumiem? No chyba że w ogóle wywoływanie funkcji digitalRead() dla ustawionego stanu OUTPUT nie jest właściwe...

Jeśli ustawiłeś "HIGH" to zostało odczytane "HIGH", to wydaje się dość logiczne 😉 Nie wiem jednak po co w tym przypadku coś takiego robisz, bo korzystanie z funkcji digitalRead w stosunku do wyjść nie ma w tym przypadku żadnego sensu.

Link do komentarza
Share on other sites

1 godzinę temu, Treker napisał:

Mylisz wejścia z wyjściami. Jeśli ustawiasz na wyjściu pinu HIGH to nie możesz go "łączyć z masą" bo robisz wtedy zwarcie i niszczysz Arduino... Jeśli chodzi Ci o sterowanie diody podłączonej do Arduino to nie możesz tego traktować jak "łączenie z masą", bo to tak nie działa. Wydaje mi się, że Twoim problemem nie są podstawy Arduino, a podstawy elektroniki. Lepiej byłoby chyba zająć się porządnie kursem elektroniki, bo tam znajdziesz odpowiedzi na zadawane tu pytania 😉

Jeśli ustawiłeś "HIGH" to zostało odczytane "HIGH", to wydaje się dość logiczne 😉 Nie wiem jednak po co w tym przypadku coś takiego robisz, bo korzystanie z funkcji digitalRead w stosunku do wyjść nie ma w tym przypadku żadnego sensu.

@Treker Czyli problem jest w tym co sam przypuszczałem że pogmatwałem wejścia i wyjścia...

Co do podstaw elektroniki to kurs skończyłem, przerabiałem go dość solidnie bo fundamentalny wpis od prawie Ohma analizowałem kilka razy. Po prostu teraz mi się to wszystko zmyliło, mylnie uogólniłem że jeśli pin jest podłączony do diody, dioda do rezystora a rezystor do masy, to sam pin jest tak naprawdę bezpośrednio zwarty do masy...

To tylko słów na moją obronę 😉 Dzięki jeszcze raz i pozdrawiam.

 

Link do komentarza
Share on other sites

@Panda napiszę najprościej. Do pinu arduino ustawionego na INPUT masz podpiętą jedną nóżkę przycisku. Jeśli druga nóżka tego przycisku jest połączona z masą "-"  , to po jego wciśnięciu na ww. pinie arduino pojawia się stan niski "LOW" .

Jeśli zaś do tej drugiej nóżki przycisku podłączysz "+" i naciśniesz przycisk to na pinie arduino pojawi się stan wysoki "HIGH".

W przypadku kiedy druga nóżka przycisku jest podłączona do masy "-" i tym samym po naciśnięciu podajemy do Arduino stan niski "LOW", wtedy nie ustawiamy tego pinu w jako INPUT, tylko jako INPUT_PULLUP. 

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

W ten sposób udało mi się zrobić żeby przycisk "zachował swój stan" ( oczywiście programowo ) :

void loop() {

  static bool status = 0;

  if(digitalRead(BUTTON) == LOW) {
    status = !status; 
    while(digitalRead(BUTTON) == LOW){}
  }

  if(status) {
    digitalWrite(YELLOW, HIGH);
    digitalWrite(GREEN, LOW); 
  } else{
    digitalWrite(YELLOW, LOW);
    digitalWrite(GREEN, HIGH); 
  }
}

U mnie działa to w porządku, no chyba że naciskam na guzik mega szybko to czasami nie przeskoczy stan...

Czy to rozwiązanie jest dobre, tzn. bezawaryjne? Czy da się to jakoś ulepszyć ( bo raczej przykładowo w grze użytkownik nie chciał by uważać żeby wciskać i opuszczać przycisk wolno ) Pozdrawiam.

Edytowano przez JAKPAD
Link do komentarza
Share on other sites

Wybaczcie, że nie przeczytałem wszystkich 184 komentarzy, żeby sprawdzić, czy ktoś o tym wspomniał.

Błagam, zmieńcie kolor komentarzy w kodach źródłowych, na prawdę ciężko je czytać.

To mój trzeci kurs, jak zwykle rewelacja 😄

Taka mała uwaga z mojej strony, w kursie z podstaw elektroniki jest napisane, że określenie "dioda LED" jest nieprawidłowe, w tym kursie jednak takie określenie pojawia się nagminnie 😄 

Link do komentarza
Share on other sites

Dnia 23.06.2019 o 19:57, Rakragul napisał:

To mój trzeci kurs, jak zwykle rewelacja 😄

Miło słyszeć, że kursy są pomocne 🙂 Dziękuję za sugestię co do kolorów komentarzy. Na ten moment nie mam możliwości, aby to zmienić, ale w kolejnej wersji kursów kody będą już osadzane w inny, czytelniejszy sposób.

Dnia 23.06.2019 o 19:57, Rakragul napisał:

Taka mała uwaga z mojej strony, w kursie z podstaw elektroniki jest napisane, że określenie "dioda LED" jest nieprawidłowe, w tym kursie jednak takie określenie pojawia się nagminnie 😄 

Nie byłbym jednak aż tak krytyczny wobec tego "błędu", bo to bardzo potoczne i częste określenie, ale masz rację - będziemy to zmieniać 😉

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.