Skocz do zawartości

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


Komentator

Pomocna odpowiedź

void setup() {
  // put your setup code here, to run once:
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, INPUT_PULLUP);

digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);

digitalWrite(6, LOW);

}

void loop() {
  // put your main code here, to run repeatedly:

digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
delay(1000);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, HIGH);
delay(5000);
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
delay(1000);
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
delay(1000);


if (digitalRead(7) == LOW) {
 digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
delay(1000);
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
delay(1000);
digitalWrite (6, HIGH);
 digitalWrite (5, LOW);
  delay(3000);
  digitalWrite (6, LOW);
  digitalWrite (5, HIGH);
  delay(1000);
  digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
}
else {digitalWrite(5, HIGH);
}

}

Cześć

Próbuję zrobić światła drogowe działające tak:

-cały czas sekwencja ziel4, żółte3, czer2, czer2 i zół3, ziel4.... a na przejsciu cały czas czerw5

-chyba, że wcisnę przycisk7 to żół3, czerw2 > na przejściu ziel6, czerw5 i wracam do początku

Mają powyższy program w miarę to działa ale są dwa problemy:
-muszę długo przytrzymać przycisk7 żeby uruchomić if - Dlaczego tak się dzieje?
- i mniejszy problem - idzie czerw2, zół3, czerw2 i dopiero wtedy if - macie na to jakiś pomysł?

Edytowano przez RysiekUP
Link do komentarza
Share on other sites

7 minut temu, RysiekUP napisał:

-muszę długo przytrzymać przycisk7 żeby uruchomić if - Dlaczego tak się dzieje?
 

Delay() to taka funkcja ktora "zamraza" kod na czas jaki zostal ustalony...nie zrobisz z tym nic, jedyny ratunek to funkcja millis() ktora nie blokuje i program reaguje bardzo szybko na jakies zdarzenia...poprostu kod wykonuje sie w kolko bardzo szybko..

Link do komentarza
Share on other sites

Ok znalazłem artykuł o millis: https://forbot.pl/blog/kurs-arduino-ii-wielozadaniowosc-opoznienia-z-millis-id18418
Dopiero zaczynam więc na razie odpuszczę ten temat bo to nie takie proste 😛

Ogólnie to wydawało mi się, że mikrokontrolery będą łatwiejsze w obsłudze... może za stary na to jestem hehe
Ale ciekawi mnie jak sobie z tym poradzą uczniowie podstawówek i ich nauczyciele....

 

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

12 minut temu, RysiekUP napisał:

Dopiero zaczynam więc na razie odpuszczę ten temat bo to nie takie proste 😛

 

przyjdzie z czasem...😉

 

13 minut temu, RysiekUP napisał:

 Ogólnie to wydawało mi się, że mikrokontrolery będą łatwiejsze w obsłudze...

 

Panie to i tak chyba najprostsza wersja programowania...w sensie adruino ide..😉

 

14 minut temu, RysiekUP napisał:

 Ale ciekawi mnie jak sobie z tym poradzą uczniowie podstawówek i ich nauczyciele....

 

nie od razu rzym zbudowano..😉

void setup() {
  // put your setup code here, to run once:
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, INPUT_PULLUP);

digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);

digitalWrite(6, LOW);

}

void loop() {
  static int tab[] = {1000,5000,1000,1000};
  static int tab1[] = {1000,1000,3000,1000,1000};
  static int i = 0;
  static byte stan = 0;
  static long last = 0;
  
  if (millis() - last > tab[i]) {
    i++;
    last = millis();
    if (i == 4) {
      i = 0;
    }
  }
  if (stan == 0) {
if (i == 0) {
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
}
if (i == 1) {
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, HIGH);
}
if (i == 2) {
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
}
if (i == 3) {
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
}
  }

if (digitalRead(7) == LOW) {
stan = 1;
i = 0;
delay(1000);
}

if (millis() - last > tab1[i]) {
    i++;
    last = millis();
  }
    if (i == 5) {
      i = 0;
      stan = 0;
    }
  if (stan == 1) {
    if (i == 0) {
 digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
    }
if (i == 1) {
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
}
if (i == 2) {
digitalWrite (6, HIGH);
 digitalWrite (5, LOW);
}
if (i == 3) {
  digitalWrite (6, LOW);
  digitalWrite (5, HIGH);
}
if (i == 4) {
  digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
}
}


}

sprawdz...moze zadziala

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

10 minut temu, farmaceuta napisał:
28 minut temu, RysiekUP napisał:

 Ogólnie to wydawało mi się, że mikrokontrolery będą łatwiejsze w obsłudze...

 

Panie to i tak chyba najprostsza wersja programowania...w sensie adruino ide..

Nawet mnie nie załamuj 😞 A ja myślałem, że zmienię branżę hehe

Kod, który wysłałeś lepiej działa ale rozgryzienie go pewnie zajęłoby mi całą noc 😝
 

Link do komentarza
Share on other sites

7 minut temu, RysiekUP napisał:

Kod, który wysłałeś lepiej działa ale rozgryzienie go pewnie zajęłoby mi całą noc 😝
 

Ale dziala tak jak zalozyles???

 

7 minut temu, RysiekUP napisał:

Nawet mnie nie załamuj 😞 A ja myślałem, że zmienię branżę hehe

Sluchaj...ja jak zobaczylem przykladowe kody to na kilka lat temat calkiem porzucilem, wiadomo hieroglify i szlaczki...ale wkoncu sie przelamalem i teraz zaluje ze wtedy sie wylamalem...😉 po troszku wszystko do glowy wejdzie

Link do komentarza
Share on other sites

Witam 😄 ja mam kilka pytań odnoście tej części kursu:

1. Jeśli funkcja zwraca jakąś wartość, to funkcja pinMode i digitalWrite zwracają wartość w postaci High lub LOW (0 lub 1 ) ?

2. INPUT_PULLUP łączy się przez rezystor do wyjścia "5v" z arduino ? czy da się podciągnąć tym rezystorem wewnętrznym do masy, aby sterować dodatnim napięciem ?

3. Przy pętli While - skoro przycisk łączy 7 pin Arduino z masą, to dlaczego w zapisie   while(digitalRead(7) == HIGH){} jest "HIGH" zamiast LOW ? przeciez arduino czeka, aż dostanie LOW - stan niski a nie HIGH - stan wysoki aby wykonać pętlę.

 

Link do komentarza
Share on other sites

35 minut temu, Silver_1 napisał:

Witam 😄 ja mam kilka pytań odnoście tej części kursu:

1. Jeśli funkcja zwraca jakąś wartość, to funkcja pinMode i digitalWrite zwracają wartość w postaci High lub LOW (0 lub 1 ) ?

2. INPUT_PULLUP łączy się przez rezystor do wyjścia "5v" z arduino ? czy da się podciągnąć tym rezystorem wewnętrznym do masy, aby sterować dodatnim napięciem ?

3. Przy pętli While - skoro przycisk łączy 7 pin Arduino z masą, to dlaczego w zapisie   while(digitalRead(7) == HIGH){} jest "HIGH" zamiast LOW ? przeciez arduino czeka, aż dostanie LOW - stan niski a nie HIGH - stan wysoki aby wykonać pętlę.

 

1. Nie, akurat te funkcje nie zwracają żadnej wartości.

2.Chyba nie ma takiej możliwości.

3.Zakładam, że chodzi Ci o przykład ze światłami drogowymi. Tutaj, w pętli program czeka, aż pojawi się stan niski(przycisk zostanie wciśnięty),

dlatego jest HIGH, a nie LOW. Dopiero kiedy na pinie będzie stan niski, program wychodzi z pętli i wykonuje dalsze instrukcje.

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

Witajcie. Coś dla dociekliwych:

     Program do migania diodą w cyklu jednosekundowym zadziałał bez problemu, ale zastanowiło, dlaczego sekunda sekundzie nie jest równa - obok też coś migało umownie co sekundę, ale było dużo szybsze od doświadczalnego Arduino (MEGA 2560). W czasie minuty potrafiło nadgonić z półtorej sekundy. Pojawiły się dwa podejrzenia:

1) Oscylatory chodzą mało dokładnie.

2) Program się mozoli, bo zastosowana jest daleka droga do tego, aby na końcu uzyskać zmianę stanu logicznego na wyjściu portu.

    Zastanowiło też, jak wąski impuls można wycisnąć (takim sposobem) z Arduino, oraz: Czy czas wykonywania instrukcji wewnątrz pętli oraz obsługa pętli są na tyle znaczące, aby wskazane było odjęcie jakiejś wartości od tego tysiąca milisekund. Program rozciągnąłem, aby było kilka prostokątów do obejrzenia oscyloskopem, ale celowo, w celach pomiarowych, bez stosowania wewnętrznych pętli: 

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, HIGH);
}

void loop() {
  digitalWrite(LED_BUILTIN, LOW);
  digitalWrite(LED_BUILTIN, HIGH);
  digitalWrite(LED_BUILTIN, LOW);
  digitalWrite(LED_BUILTIN, HIGH);
  digitalWrite(LED_BUILTIN, LOW);    // 1
  digitalWrite(LED_BUILTIN, LOW);    // 2
  digitalWrite(LED_BUILTIN, HIGH); // 1
  digitalWrite(LED_BUILTIN, HIGH); // 2
  
  digitalWrite(LED_BUILTIN, LOW);    // 1
  digitalWrite(LED_BUILTIN, LOW);    // 2
  digitalWrite(LED_BUILTIN, LOW);    // 3
  digitalWrite(LED_BUILTIN, LOW);    // 4
  digitalWrite(LED_BUILTIN, LOW);    // 5
  digitalWrite(LED_BUILTIN, LOW);    // 6
  digitalWrite(LED_BUILTIN, LOW);    // 7
  digitalWrite(LED_BUILTIN, LOW);    // 8
  digitalWrite(LED_BUILTIN, LOW);    // 9
  digitalWrite(LED_BUILTIN, LOW);    // 10
  digitalWrite(LED_BUILTIN, HIGH); // 1
  digitalWrite(LED_BUILTIN, HIGH); // 2
  digitalWrite(LED_BUILTIN, HIGH); // 3
  digitalWrite(LED_BUILTIN, HIGH); // 4
  digitalWrite(LED_BUILTIN, HIGH); // 5
  digitalWrite(LED_BUILTIN, HIGH); // 6
  digitalWrite(LED_BUILTIN, HIGH); // 7
  digitalWrite(LED_BUILTIN, HIGH); // 8
  digitalWrite(LED_BUILTIN, HIGH); // 9
  digitalWrite(LED_BUILTIN, HIGH); // 10  
}

Wyniki:

zrzut1.thumb.png.8384c7139158290266329bde84a81347.png   zrzut2.thumb.png.781988a7959cee61b8f0d51343656dfc.png 

pokazały że tym sposobem przełączania stanów logicznych można uzyskać generator fali prostokątnej o częstotliwości podchodzącej pod 100kHz, a minimalna szerokość impulsu wynosi około 5.28µs (na oscylogramie po prawej uwidoczniony jest pomiar grupy 10-ciu impulsów).

Wniosek: Za omijanie Assemblerów i wygodę płaci się nie tylko długością programu wynikowego, ale też jego umiarkowaną prędkością. Warto o tym pamiętać (element edukacji), ale w ćwiczeniu z LED'em w niczym nie przeszkadza.

Pozdrawiam

Tomasz

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

Nie musisz się bawić w asemblery i gmeranie po rejestrach bo ktoś już to za ciebie zrobił - poszukaj digitalWriteFast.

A jako ćwiczenie porównaj kody źródłowe oryginalnego digitalWrite z digitalWriteFast.

  • Lubię! 2
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.