Skocz do zawartości
Komentator

Kurs Arduino - #4 - Przetwornik ADC

Pomocna odpowiedź

Hej, mam pytanie odnośnie zadania 4.6. Zrobiłem zadanie, diody pokazują kierunek gdzie jest więcej światła, dodałem opóźnienie delay(100) gdyż ładnie to wygląda jak LED-y reagują dość szybko na zachodzące zmiany, ale za to źle się odczytuje wartości fotorezystorów w monitorze portu. Czy jest jakaś komenda która kasuje dane w monitorze? Coś w stylu Serial.clear().

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

@Wojtas002424 możesz zrobić to sprytnie i wypisywać jedynie przejścia z pewną strefą nieczułości. Np jeżeli stan się zmienił i minęło 200ms to ustaw nowy i wyświetl wterminalu.

13 godzin temu, Wojtas002424 napisał:

Czy jest jakaś komenda która kasuje dane w monitorze?

Wątpię, bo Arduino nie steruje komputerem. Ale możesz wyłączyć autoscroll i podejrzeć co się działo.

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Zła wiadomość: monitor portu szeregowego wbudowany w IDE Arduino to jeden z najprymitywniejszych programów tego typu jakie istnieją. Nie obsługuje praktycznie żadnych znaków sterującyh oprócz oczywistych NewLine i CarriageReturn. 

Dobra wiadomość: nie jest jedyny, więc zawsze możesz zmienić na coś innego (HyperTerm z poprzednich Windowsów, Putty, TeraTerm itd..). Każdy z nich rozumie obszerny repertuar znaków sterujących (to te z kodami poniżej 0x20) a także tzw. sekwencji ANSI/ESC. Zacznij od tego:

http://www.asciitable.com/

skupiając się na znaczeniu kodów poniżej 0x20, oraz tego:

https://en.wikipedia.org/wiki/ANSI_escape_code#DOS_and_Windows

albo od razu od któregoś standardu VT52/100:

http://ascii-table.com/ansi-escape-sequences-vt-100.php

Już od dawana ludzie zauważyli, że mając "na drugim końcu kabelka" urządzenie tekstowe fajnie byłoby mieć możliwość  przekazywania mu jakichś bardziej ciekawszych poleceń niż tylko "wypisz kolejny znak o kodzie N". Dlatego w standardzie ASCII są 32 znaki sterujące (0x00-0x1F) z których niektóre robią rzeczy typowe (wyczyszczenie całego ekranu: (Form Feed 0x0C), przejście do nowej linii itp) a niektóre (ESC: 0x1B) są "zaczątkiem" zupełnie nowych pomysłów wykraczających daleko poza ASCII. I tutaj jest już wiele różnych standardów, ale na szczęście niektóre są bardziej popularne od innych. Jeśli w programie terminalowym jaki sobie zainstalujesz włączysz np. emulację terminala (kiedyś takie urządzenia były osobnymi, fizycznymi sprzętami) VT52 albo VT100 to nagle okaże się, że za pomocą dobrze określonych sekwencji znaków wysyłanych z Arduino do PC możesz zmieniać kolor tekstu, mrugać znakami, przesuwać kursor po całym ekranie (a raczej okienku programu) tworząc/rysując nowe wirtualne "okienka" i w nich przesuwać tekst niezleżnie od innych obszarów itd itp. Także zacznij od znalezienia instalki/paczki odpowiedniego programu obsługującego port szeregowy, odpal go i zapomnij o tym co wbudowano w IDE Arduino. To tylko prymitywny monitor przychodzących znaków. Przynajmniej w wersji IDE, jaką posiadam u siebie.

Edytowano przez marek1707
Poprawione linki.

Udostępnij ten post


Link to post
Share on other sites
9 minut temu, marek1707 napisał:

Nie obsługuje praktycznie żadnych znaków sterującyh oprócz oczywistych NewLine i CarriageReturn. 

Tyle, że w tym przypadku to może być zaleta a nie wada. W przypadku wysłania jakiegoś binarnego pliku (albo próbie odbioru danych z inną prędkością) może się przydarzyć, że odebrane dane będzą odpowiadać jakiejś tam sekwencji sterującej. Pół biedy jeśli to będzie "przesuń kursor w lewo", ale np. ":ustaw kolor tekstu na biały" może być deprymujące 🙂

Niestety - albo albo. Albo (jak sugerował @marek1707) użyjesz bardziej profesjonalnego programu (ale narazisz się na niewygodę w przypadku odebranej przypadkowej sekwencji) - albo pozostaniesz przy prymitywnym monitorku wbudowanym w IDE, ale nie będziesz miał nawet możliwości czyszczenia ekranu.

Osobiście polecałbym używanie tych "profesjonalniejszych" programów tylko wtedy, gdy są rzeczywiście potrzebne (np. gdy chcemy zrobić piękne menu rysowane w konsoli kompa podłączonego do Arduino), a pozostanie przy wbudowanym w trakcie tworzenia programu.

Udostępnij ten post


Link to post
Share on other sites

No ale przecież Kolega pytał o czyszczenie ekranu, więc potrzebuje funkcji niedostępnej w Monitorze Portu.

23 minuty temu, ethanak napisał:

pozostanie przy wbudowanym w trakcie tworzenia programu

Niekoniecznie. Te lepsiejsze programy potrafią np. wypisywać/podglądać transmisje w postaci HEX (i to w obie strony) a to już bardzo pomaga w przypadku gdy wysyłamy (lub właśnie nie) coś dziwnego, szczególnie "w trakcie tworzenia programu", czyż nie? A zmiana koloru na biały wcale taka prosta nie jest, więc szansa jest mała. Już bardziej to, że migający ekran pliku binarnego (bo co chwila przychodzą FormFeedy) pokryty dziwną masą znaczków jest raczej mało komunikatywny, przynajmniej na początku.. Z drugiej strony rzadko udaje się komuś, kto używa tylko printf zrobić taką kaszanę a wiedza, że zawsze można zrobić bold czy mruganie czy kolor a nawet przepisać/zmienić fragment ekranu pomaga projektować ładniejsze interfejsy użytkownika.

Udostępnij ten post


Link to post
Share on other sites
3 minuty temu, marek1707 napisał:

Kolega pytał o czyszczenie ekranu, więc potrzebuje funkcji niedostępnej w Monitorze Portu.

Zawsze można wysłać \r i kilkadziesiąt \n 🙂

 

Udostępnij ten post


Link to post
Share on other sites

Witam

Jestem początkujący o programowaniu nie mam pojęcia i czy chcąc nauczyć się tworzyć na arduino i raspberry pi wystarczą te kursy czy powinienem sam się uczyć języka C, C++? Zadaje to pytanie bo jestem w trakcie 1 kursu na Arduino #4 zatrzymałem się na ćw 4.5 nie potrafiłem je samodzielnie wykonać na podstawie wiedzy z poprzednich lekcji, rozwiązania w komentarzach wydają się jakieś skomplikowane i niejasne, na pewno sam bym tak nie zrobił. 

Z góry dzięki za odp

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

@MisterPablo witam na forum 🙂 W zdecydowanej większości przypadków wystarczy wiedza z kursu - takie było założenie. Czasami trzeba coś dodatkowo poszukać, ale nie są to zbyt skomplikowane tematy. Jeśli masz problem z rozwiązaniem jakiegoś zadania to śmiało pytaj w komentarzach o konkrety. Pokaż to co napisałeś, daj znać na czym utknąłeś itd. Jeśli chodzi o programy wklejane przez inne osoby to pamiętaj, że część osób zna już podstawy programowania w C++, więc przy okazji, "z rozpędu" wplatają oni do rozwiązań pewne zapisy, które nie były omawiane w kursie. Często zadania da się rozwiązać jednak prościej 🙂

Udostępnij ten post


Link to post
Share on other sites

Cześć, zrobiłem zadanie 4.6, poproszę o komentarz doświadczonych programistów. Pozdrawiam

#define fotoLeft A4 //przypisanie pina do lewego fotorezystora
#define fotoRigh A5 //przypisanie pina do prawego fotorezystora

int odczytFotoLewy = 0;
int odczytFotoPrawy = 0;

int roznica = 0;
int zakres = 0;



void setup() {
  pinMode(6, OUTPUT); //konfiguracja wyjść pod diody
  pinMode(7, OUTPUT); //konfiguracja wyjść pod diody  
  pinMode(8, OUTPUT); //konfiguracja wyjść pod diody
  pinMode(9, OUTPUT); //konfiguracja wyjść pod diody
  pinMode(10, OUTPUT); //konfiguracja wyjść pod diody    
  Serial.begin(9600);
}

void loop() {
  odczytFotoLewy = analogRead(fotoLeft); //odczyt z lewego fotorezystora
  odczytFotoPrawy = analogRead(fotoRigh); //odczyt z prawego fotorezystora  
 
  Serial.print("lewy ");
  Serial.println(odczytFotoLewy);
  Serial.print("prawy ");
  Serial.println(odczytFotoPrawy);
  delay(200);

  roznica = odczytFotoLewy - odczytFotoPrawy;
  roznica = map(abs(roznica), 0, 250, 1, 3); //przeskalowanie różnicy na zakres 3 stopniowy
  
  Serial.print("lewy ");
  Serial.println(odczytFotoLewy);
  Serial.print("prawy ");
  Serial.println(odczytFotoPrawy);
  //delay(100);
  
  if (odczytFotoLewy - odczytFotoPrawy < 0 && roznica == 3) { 
    digitalWrite(6, HIGH);
    digitalWrite(7, LOW);   
    digitalWrite(8, LOW);  
    digitalWrite(9, LOW);  
    digitalWrite(10, LOW);    
        
  }

  if (odczytFotoLewy - odczytFotoPrawy < 0 && roznica == 2) { 
    digitalWrite(6, LOW);
    digitalWrite(7, HIGH);   
    digitalWrite(8, LOW);  
    digitalWrite(9, LOW);  
    digitalWrite(10, LOW);              
  }
 
    if (roznica == 1) { 
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);   
    digitalWrite(8, HIGH);  
    digitalWrite(9, LOW);  
    digitalWrite(10, LOW);              
  }  

  if (odczytFotoLewy - odczytFotoPrawy > 0 && roznica == 2) { 
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);   
    digitalWrite(8, LOW);  
    digitalWrite(9, HIGH);  
    digitalWrite(10, LOW);              
  } 
  if (odczytFotoLewy - odczytFotoPrawy > 0 && roznica == 3) {
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);   
    digitalWrite(8, LOW);  
    digitalWrite(9, LOW);  
    digitalWrite(10, HIGH);              
  } 
  delay(50); //opóźnienie, aby nie odczytywać ADC zbyt szybko
}

 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

@Radek77 fajnie że przysiadłeś do zadania dodatkowego. Użycie wartości bezwzględnej jest dobrym pomysłem, ale mógłbyś popróbować jakoś zastąpić warunki jedną funkcją. Odpowiedzi na to pytanie jest kilka ale możesz spróbować zaprojektować funkcję, gdzie dla każdej diody wyliczana jest pewna średnia ważona.

Udostępnij ten post


Link to post
Share on other sites

Takie pytanie. Co do zadania 4.5 da się wczytać z wiersza poleceń wartość użytkownika od razu do INT, zamiast do STRING?

Próbowałem używać Serial.parseInt(); ,ale to tak jakby nie czyściło mi pamięci Arduino i zawsze Serial.available() był większy zera.

Udostępnij ten post


Link to post
Share on other sites

@Beskid pewnie że jest to możliwe, przykłąd ze strony Arduino do funkcji toInt() ze Stringa:

void loop() {
  // Read serial input:
  while (Serial.available() > 0) {
    int inChar = Serial.read();
    if (isDigit(inChar)) {
      // convert the incoming byte to a char and add it to the string:
      inString += (char)inChar;
    }
    // if you get a newline, print the string, then the string's value:
    if (inChar == '\n') {
      Serial.print("Value:");
      Serial.println(inString.toInt());
      Serial.print("String: ");
      Serial.println(inString);
      // clear the string for new input:
      inString = "";
    }
  

Możesz też spróbować własnych sił i napisać swój algorytm konwersji 🙂 jest on dość prosty.

 

 

@tenacious Jest to zadanie domowe, więc ciężko będzie podać odpowiedź 🙂 

Podpowiem, masz w zadaniu coś o potencjometrze i diodzie świecącej. Poszukaj w treści tego odcinka jak można zmontować układ z tych części, żeby dało się z nich korzystać osobno. 

Udostępnij ten post


Link to post
Share on other sites

@Gieneq  

5 godzin temu, Gieneq napisał:

Poszukaj w treści tego odcinka

chciałeś tu podać jakiś link? czy o jaki odcinek chodzi? Jestem bardzo świeży w tematach forum i arduino, dlatego przepraszam z góry jeśli to jest błahy problem .

Udostępnij ten post


Link to post
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!

Gość
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...