Skocz do zawartości

Kurs Arduino - #4 - Przetwornik ADC


Pomocna odpowiedź

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.
Link do komentarza
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.

Link do komentarza
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.

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

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
Link do komentarza
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 🙂

Link do komentarza
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
Link do komentarza
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.

Link do komentarza
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.

Link do komentarza
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. 

Link do komentarza
Share on other sites

int odczytanawartosc = 0; //liczba zmienna
float napiecie = 0; //wartosc przeliczona na napiecie w woltach

void setup(){ //uruchamiane
Serial.begin(9600); //inicjacja transmisjii
Serial.println("Cyfrowy woltomierz do napięcia 5[V}");
delay(5000); //opoznienie by kazdy mogl przeczytac
}

void loop() //rozpoczecie programu
{
  odczytanawartosc = analogRead(A0); //odczytujemy wartosc napiecia
  napiecie = odczytanawartosc * (5.0/1024.0); //przeliczanie wartosci na wolty 
  Serial.println("Aktualnie napięcie wynosi"); //napis z napieciem
  Serial.println(napiecie + String("[V]"));  //napiecie wraz z jednostka
  delay(200); //opoznienie dla odczytania wynikow
  
}

Bardzo dobrze zrobiony kurs na temat przetworników ADC!

Najbardziej spodobał mi się miernik napięcia który myślę że przyda się mi przez jakiś czas. 

Przesyłam mój projekt i lekko zmodyfikowany kod 🙂20200413_232146.thumb.jpg.c8b5d2800f1e1feb326ef78aadf2bd11.jpg

  • 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.