Ta strona używa ciasteczek (plików cookies), dzięki którym może działać lepiej. Dowiedz się więcejRozumiem i akceptuję

Kurs Arduino - #3 - UART (komunikacja z PC), zmienne

Autor Wiadomość
bonneripper 



Posty: 2
Wysłany: 03-03-2018, 17:40   ()

SOYER napisał/a:
Po co ta "pusta" pętla?


Cześć.
Domniemam, że po to, żeby program nie latał w kółko i sterował IO tylko cyklicznie co 0,025 sprawdzał status położenia przycisku. Zresztą przykład przeklejony jota w jote ze strony kursu (podstawowy kurs arduino forbot rozdział 3 ). I nadal nie wiem czemu czerwona dioda się nie zapala. Pokusiłem się nawet od dodanie i wykorzystanie komend (Serial.println i delay) w kulku miejscach, żeby dokładnie sprawdzić czy program dociera w te miejsca w programie i dziwne ale w kroku w którym powinien zmienić stan na czerwonej diodzie nic się nie dzieje. Czy ktoś może to dla mnie odczarować? Gdzie strzeliłem błąd? Pozdrawiam.

Ostatnio zmieniony przez bonneripper 03-03-2018, 17:42, w całości zmieniany 2 razy  
Postaw piwo autorowi tego posta
 
 
Treker 




Posty: 8322
Pomógł: 123 razy
Otrzymał 515 piw(a)
Skąd: Gdynia
Programuję w:
C, Arduino
Moje roboty:
Spectrum, Fuzzy

Wysłany: 06-03-2018, 14:50   

bonneripper, witam na forum :) Zacznijmy od tego czy na pewno masz wszystko dobrze podłączone. Sprawdzałeś prostym programem, czy możesz zamigać diodą?


Na udzielam odpowiedzi na pytania techniczne zadawane kanałami prywatnymi (maile, komunikatory, PW).
Sprawdź » Kurs ARDUINOKurs podstaw elektronikiZbuduj swojego robota - kurs!
Postaw piwo autorowi tego posta
 
 
Kamil88 



Posty: 3
Wysłany: 14-03-2018, 21:08   Kurs Arduino - #3 - UART (komunikacja z PC), zmienne

Witam, Arduino programuję od niedawna. Przebrnąłem przez kolejne lekcje kursu bez żadnych problemów aż to lekcji #3. Przy próbie komunikacji przez UART i odczycie imienia nie pojawił się jeszcze problem. Stworzył się podczas próby kontroli przez ww. zapalania diod, zielonej i czerwonej. Próbowałem z każdej strony do tego podejść ale bez wyniku. Na początku sprawdziłem poprawność połączeń poprzez prosty program zapalający diody i wszystko było ok. Następnie wróciłem do programu z imieniem i UART działał jak powinien. Wszystko jest ok dopóki nie używam więcej jak jednej instrukcji "if". Wygląda to tak jak by Arduino nie widziało kolejnych instrukcji "if" w instrukcji głównej. Czy możliwe jest, że mam problem z kompilatorem, mikrokontrolerem albo IDE ? Dodam tylko, że po kolejnych próbach z kompilacją postanowiłem skopiować program prosto ze strony więc nie ma mowy o błędach w kodzie. Dziękuję za pomoc.

Ostatnio zmieniony przez Kamil88 14-03-2018, 21:17, w całości zmieniany 1 raz  
Postaw piwo autorowi tego posta
 
 
Treker 




Posty: 8322
Pomógł: 123 razy
Otrzymał 515 piw(a)
Skąd: Gdynia
Programuję w:
C, Arduino
Moje roboty:
Spectrum, Fuzzy

Wysłany: 15-03-2018, 12:44   

Kamil88, witam na forum :) Błędy kompilatora można wykluczyć. Pokaż proszę dla pewności dokładny program, który kompilujesz i do tego zrzut z okna, przez które komunikujesz się później z płytką (tak, aby było widać ustawienia).


Na udzielam odpowiedzi na pytania techniczne zadawane kanałami prywatnymi (maile, komunikatory, PW).
Sprawdź » Kurs ARDUINOKurs podstaw elektronikiZbuduj swojego robota - kurs!
Postaw piwo autorowi tego posta
 
 
Kamil88 



Posty: 3
Wysłany: 15-03-2018, 19:12   

Witam,
Do sprawdzenia działania Monitora Portu pod względem instrukcji zagnieżdżonych "if" skompilowałem taki program:

Kod programu: Zaznacz cały

String odebraneDane = ""; //Pusty ciąg odebranych danych

void setup() {
  Serial.begin(9600); //Uruchomienie komunikacji
}

void loop() {
  if(Serial.available() > 0) { //Czy Arduino odebrano dane
    //Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej odebraneDane
    odebraneDane = Serial.readStringUntil('\n');
   
    if (odebraneDane == "zielona") { //Jeśli odebrano słowo "zielona"
     Serial.println("zielona"); //To odbierzemy "zielona"
     delay(1000);
    }
   
    if (odebraneDane == "czerwona") { //Jeśli odebrano słowo "czerwona"
      Serial.println("czerwona"); //To odbierzemy czerwona
      delay(1000);
    }
  }
}


Na zdjęciu skompilowany program wraz z otwartym monitorem portu z widocznymi ustawieniami jak prosiłeś.


Ostatnio zmieniony przez Kamil88 15-03-2018, 19:15, w całości zmieniany 1 raz  
Postaw piwo autorowi tego posta
 
 
Treker 




Posty: 8322
Pomógł: 123 razy
Otrzymał 515 piw(a)
Skąd: Gdynia
Programuję w:
C, Arduino
Moje roboty:
Spectrum, Fuzzy

Wysłany: 15-03-2018, 22:15   

Kamil88, wygląda na to, że Twój problem leży w źle ustawionym monitorze portu szeregowego. Pokombinuj z menu, gdzie w tej chwili masz ustawione "Zarówno NL, jak i CR" (sprawdź jak program działa przy różnych ustawieniach) i daj znać jakie wnioski ;)


Na udzielam odpowiedzi na pytania techniczne zadawane kanałami prywatnymi (maile, komunikatory, PW).
Sprawdź » Kurs ARDUINOKurs podstaw elektronikiZbuduj swojego robota - kurs!
Postaw piwo autorowi tego posta
 
 
Kamil88 



Posty: 3
Wysłany: 17-03-2018, 13:57   

Treker, Dzięki za pomoc. Oczywiście wszystko teraz działa jak powinno. Przy pierwszych dwóch ustawieniach program działa a następnych już nie. To też wydaje się dziwne bo nie zmianiałem ustawień przy poprzednim programie z komunikacją przez UART. Tak czy inaczej już wszystko ok. Dzieki jeszcze raz.

Postaw piwo autorowi tego posta
 
 
KapitanBomba 



Posty: 1
Wysłany: 31-03-2018, 19:57   

Hej, niestety: odebraneDane = Serial.readStringUntil('\n'); nie działa poprawnie, tzn. nie zapisuje do znaku końca linii. Czy coś się pozmieniało w Arduinach? Funkcja ta działa poprawnie dopiero jak dodamy jakieś opóźnienie w kodzie w innym przypadku wyświetla to co uda jej się "złapać", a przecież powinna omijać odbiór jeśli nie wykryła końca linii. Z opóźnieniem jest ten problem że musi być mniejsze od opóźnienia w Arduinie nadającym dane.

Wiem że można poczekać aż w buforze znajdzie się więcej danych przez zwiększenie zera w ifie: Serial.available() > 0, ale przy zmiennej długości przesyłanego komunikatu robi się choinka.

Dla przykładu Serial.parseInt działa poprawnie nawet jak w kodzie nie ma ani jednego delay czy millis(). Ewidentnie Serial.setTimeout przyjmujący domyślną wartość 1000ms robi robotę bo jak zmniejszę na zero to tylko szczątkowe dane zbiera co jakiś czas.
Jak już jesteśmy przy Serial.setTimeout() to jestem załamany tym jak Arduino wolno te dane mieli - widać gołym okiem że odbieranie danych przez UART spowalnia cały kod, a jak setTimeout damy na zero to znowu choinka.
Świetną wydała mi się funkcja void serialEvent(), ale to już w ogóle zamula wszystko.

Po co jest ten bufor w Arduino skoro bez opóźnienia nie chce działać? Ja to tak rozumiem że dane do bufora powinny być zapisane jednocześnie w trakcie wykonywania się pętli głównej, a w dowolnej chwili zaglądam do bufora i jak są dane to zapisuje do zmiennej/ robię z nimi co chce.

Czy jest jakiś sposób przesyłania danych o zmiennej długości bez użycia jakichkolwiek opóźnień w kodzie odbiornika? Po odebraniu chciał bym te dane jeszcze jakoś podzielić na dwie zmienne int więc muszę mieć zawsze komplet w nowej linii :-) Musi być jakiś sposób skoro ludzie na tych prockach autopiloty do modeli RC robią, które są w stanie odbierać na bieżąco całą sieczkę z GPS i przeliczać to robiąc jeszcze setki innych obliczeń w ułamku sekundy. Pomóżcie coś bo już czacha mi dymi, od rana nad tym siedzę...

EDYTA:
Mam wrażenie że w dokumentacji https://www.arduino.cc/en/Serial/SetTimeout jest bzdura, na Serial.parseInt() owszem działa tak jak tam opisali. Jeśli
Kod programu: Zaznacz cały
Serial.setTimeout()
jest mniejsza niż częstotliwość wysyłania danych do seriala to zaczyna pluć zerami między pomiarami, ale już Serial.parseFloat() nic sobie nie robi z Serial.setTimeout() czy jest 500 czy 2500ms odczytuje prawidłowo dane gdy tylko się pojawią, mało tego nie blokując pętli :roll:

PS. Wybaczcie że wcześniej tak ciurkiem napisałem, ale myślałem że piszę komentarz, a nie post na forum...

Ostatnio zmieniony przez KapitanBomba 31-03-2018, 23:02, w całości zmieniany 2 razy  
Postaw piwo autorowi tego posta
 
 
Treker 




Posty: 8322
Pomógł: 123 razy
Otrzymał 515 piw(a)
Skąd: Gdynia
Programuję w:
C, Arduino
Moje roboty:
Spectrum, Fuzzy

Wysłany: 03-04-2018, 20:37   

KapitanBomba, witam na forum!

KapitanBomba napisał/a:
Hej, niestety: odebraneDane = Serial.readStringUntil('\n'); nie działa poprawnie, tzn. nie zapisuje do znaku końca linii. Czy coś się pozmieniało w Arduinach? Funkcja ta działa poprawnie dopiero jak dodamy jakieś opóźnienie w kodzie w innym przypadku wyświetla to co uda jej się "złapać", a przecież powinna omijać odbiór jeśli nie wykryła końca linii. Z opóźnieniem jest ten problem że musi być mniejsze od opóźnienia w Arduinie nadającym dane.

Zacznijmy od tego na jakim kodzie testujesz to rozwiązanie? Nie słyszałem, aby Arduino coś zmieniało i w moich projektach wszystko działa "po staremu". Pokaż kod to łatwiej będzie rozmawiać.

KapitanBomba napisał/a:
PS. Wybaczcie że wcześniej tak ciurkiem napisałem, ale myślałem że piszę komentarz, a nie post na forum...

Nic się nie stało - u nas komentarze są połączone z forum, dzięki temu łatwiej prowadzić bardziej rozbudowane dyskusje :)


Na udzielam odpowiedzi na pytania techniczne zadawane kanałami prywatnymi (maile, komunikatory, PW).
Sprawdź » Kurs ARDUINOKurs podstaw elektronikiZbuduj swojego robota - kurs!
  
Postaw piwo autorowi tego posta
 
 
vst 



Posty: 6
Otrzymał 3 piw(a)
Wysłany: 08-04-2018, 19:49   

Co w przypadku, gdy konieczna będzie zmiana fizycznych podłączenie np.: diody lub przycisku? (fizycznego podłączenia)?

Sięgamy do miejsca w pamięci, który zadeklarowaliśmy jako zmienną licznik, a następnie wysyłamy znalezioną tam wartość przez UART. (które)?

Czy Arduino odebrano dane (odebrało)?

Dzieje się to za pomocą funkcji Serial.readStringUntil(terminator), która kopiuje dane z bufora do momentu napotkania znaku terminator (w tym przypadku "\n" - czyli znak nowej linii). (terminatora)?

Na początku definiowane są nr pinów z diodami oraz deklarowane jest zmienna, do której kopiowane są odebrane dane. (deklarowana)?

Postaw piwo autorowi tego posta
 
 
Więcej szczegółów
Wystawiono 1 piw(a):
Treker
Treker 




Posty: 8322
Pomógł: 123 razy
Otrzymał 515 piw(a)
Skąd: Gdynia
Programuję w:
C, Arduino
Moje roboty:
Spectrum, Fuzzy

Wysłany: 18-04-2018, 19:38   

vst, jak zawsze dziękuję za czujność - poprawione :)


Na udzielam odpowiedzi na pytania techniczne zadawane kanałami prywatnymi (maile, komunikatory, PW).
Sprawdź » Kurs ARDUINOKurs podstaw elektronikiZbuduj swojego robota - kurs!
Postaw piwo autorowi tego posta
 
 
mszzukowski 



Posty: 1
Skąd: Olsztyn
Programuję w:
Java, C
Wysłany: 19-04-2018, 20:10   

Witam serdecznie,
jestem tutaj nowy. Pozwolę sobie "pochwalić" się swoim rozwiązaniem zadania z gwiazdką w tym artykule:

Kod programu: Zaznacz cały

#define green 9
#define red 8

String odebraneDane = "";
boolean greenState = false;
boolean redState = false;

void setup() {
  Serial.begin(9600);
  pinMode(green, OUTPUT);
  pinMode(red, OUTPUT);

  digitalWrite(green, LOW);
  digitalWrite(red, LOW);

}

void loop() {
 
  if(Serial.available() > 0){
    odebraneDane = Serial.readStringUntil('\n');
   
    if (odebraneDane == "zielona"){
      if (greenState){
        digitalWrite(green, LOW);

      } else{
        digitalWrite(green, HIGH);

      }
      greenState = !greenState;   
    } else if (odebraneDane == "czerwona"){
      if (redState){
        digitalWrite(red, LOW);
      } else{
        digitalWrite(red, HIGH);
      }
      redState = !redState; 
    } else {
      Serial.println("Wpisz zielona lub czerwona");
    }
  }

}


Pozdrawiam, i dziękuję za tę serię - jest świetna. Nie mogę się doczekać aż przerobię tę i kolejne ;-)

Postaw piwo autorowi tego posta
 
 
Treker 




Posty: 8322
Pomógł: 123 razy
Otrzymał 515 piw(a)
Skąd: Gdynia
Programuję w:
C, Arduino
Moje roboty:
Spectrum, Fuzzy

Wysłany: Dzisiaj 12:20   

mszzukowski, witam na forum! Widzę, że to Twoje pierwsze kroki na Forbocie, jeśli chcesz przywitać się z innymi członkami naszej społeczności możesz skorzystać z tego tematu: Wątek zbiorczy: powitania użytkowników :)

Dzięki za miłe słowa, cieszę się, że kurs jest pomocny :) Pamiętaj, aby na przyszłość w swoich program umieszczać komentarze, które ułatwiają analizę kodu - wtedy będzie jeszcze lepiej. Powodzenia w dalszej nauce!


Na udzielam odpowiedzi na pytania techniczne zadawane kanałami prywatnymi (maile, komunikatory, PW).
Sprawdź » Kurs ARDUINOKurs podstaw elektronikiZbuduj swojego robota - kurs!
Postaw piwo autorowi tego posta
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Wersja do druku

Skocz do:  

Nie rozwiązałeś swojego problemu? Zobacz podobne tematy: Kurs Arduino - #9 - ... Kurs Arduino - #8 - ... Kurs STM32 - #3 - Pł... Kurs STM32 - #2 - Po...
lub przeszukaj forum po wybranych tagach: artykulow, do, komentarze


Powered by phpBB modified by Przemo © 2003 phpBB Group
Popularne kursy: Arduinopodstawy elektroniki