Skocz do zawartości

Kurs Arduino - #4 - Przetwornik ADC


Pomocna odpowiedź

9 godzin temu, Treker napisał:

 

@CharlesX, czyli kolejny raz mamy dowód na to, że można sobie dorobić dodatkowych problemów niewłaściwym sprzętem 😉

To czemu wersja z potencjometrem działa jak najbardziej poprawnie? Trochę dziwne mi się to wydaje. 

Link do komentarza
Share on other sites

@CharlesX jeśli wersja z potencjometrem działa to właśnie oznacza, że masz jakiś problem z innym sprzętem (np. fototranzystorem lub rezystorami) i właśnie to miałem na myśli. Nie ma tam żadnej magii, układ ten jest tak prosty, że przy odpowiednich elementach po prostu musi od razu działać. Więc gdybyś miał odpowiednie elementy, to po wpięciu ich zamiast potencjometru wszystko by działało poprawnie. Wina na 99,9% leży u Ciebie właśnie w części sprzętowej.

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

Witam! To mój pierwszy post na forum.
Oto moja propozycja do zadania 4.5. Co sądzicie o moim rozwiązaniu?

#define zolta 10 //Zdefiniowanie pinów
#define czerwona 9
#define zielona 8
#define przycisk 7

//Wartosci poczatkowe
int wartoscOdczytana = 0; //odczytana z wejscia analogowego 
String wartoscPodana = ""; //podana przez uzytkownika
int naszaLiczba = 0; //podana przez uzytkownika zamieniona na inta
int proba = 1; //ilosc prob
boolean reset = true; //wartosc do kontynuowania gry
String kontynuacja = ""; //string otrzymujacy odpowiedz tak lub nie do kontynuacji gry

void setup() {
  Serial.begin(9600); //rozpoczecie transmisji

  //Okrelenie trybow odpowiednich pinow
  pinMode(zolta, OUTPUT);
  pinMode(czerwona, OUTPUT);
  pinMode(zielona, OUTPUT);
  pinMode(przycisk, INPUT_PULLUP);

  digitalWrite(zolta, LOW);
  digitalWrite(czerwona, LOW);
  digitalWrite(zielona, LOW);
}

void loop() {
  if (reset) {
    Serial.print("Proba nr. "); //Wyswietlanie numeru proby
    Serial.println(proba);
    if (proba == 1) { //Przekrecenie potencjometru i wcisniecie przycisku tylko dla pierwszej proby 
      Serial.println("Przekrec potencjometr i wcisnij przycisk");
      while (digitalRead(przycisk) == HIGH) {}; //dopoki nie wcisniemy przycisku
      if (digitalRead(przycisk) == LOW) { //jesli wcisniemy przycisk
        wartoscOdczytana = analogRead(A5); //odczytanie wartosci napiecia z dzielnika
        //Serial.println("Wartosc Odczytana: "); (tylko dla testow)
        //Serial.println(wartoscOdczytana);
        Serial.println('\n'); //dla przejrzystosci programu
      }

    }
    Serial.println("Podaj liczbe: ");

    while (!Serial.available()) {}; //dopoki nie podamy znaku

    if (proba != 4) { // tylko jesli to 1, 2 lub 3 proba 
      if (Serial.available() > 0)
      {
        wartoscPodana = Serial.readStringUntil('\n'); //podajemy liczbe

        naszaLiczba = wartoscPodana.toInt(); //liczba ze stringa zamieniana na inta
      }

      Serial.println(naszaLiczba); //wysietlnie naszej liczby

      Serial.println('\n'); //dla przejrzystosci

      if ((wartoscOdczytana - 50) <= naszaLiczba and (wartoscOdczytana + 50) >= naszaLiczba) //jesli naszaLiczba jest z zakresu <wartoscOdczytana-50;wartoscOdczytana+50>
      {
        digitalWrite(czerwona, LOW); 
        digitalWrite(zolta, LOW);
        digitalWrite(zielona, HIGH); //zapala sie zielona dioda
        Serial.println("WYGRALES!!!");
        delay(1000);

        //Kontynuacja gry
        Serial.println("Chcesz grac dalej? Wpisz 'tak' lub 'nie' ");
        while (!Serial.available()) {}; //dopoki nie podamy naszej odpowiedzi
        kontynuacja = Serial.readStringUntil('\n'); //nasza odpowiedz

        if (kontynuacja == "tak") //jeśli chcemy kontynuowac
        {
          reset = true; //warunek kontynuowania gry
          proba = 1; //ustawiamy zmienna proba na 1, aby program działał poprawnie
          digitalWrite(zielona, LOW); //wylaczamy zielona diode
          Serial.println('\n');
        }
        else
        {
          reset = false; //warunek kończący grę
        }
      }
      else //w przeciwnym wypadku gdy nie trafilismy liczby
      {
        digitalWrite(zolta, HIGH); //zapala sie żółta dioda,ktora caly czas swieci i oznacza ze zostaly 2 proby
        digitalWrite(czerwona, HIGH); //zapala sie czerwona dioda sygnalizujaca zle trafienie
        delay(1000); 
        digitalWrite(czerwona, LOW); //dioda czerwona gasnie
        proba = proba + 1; //liczba prob maleje o jedna
      }
    }

    if (proba == 4) //jesli to byla ostatnia proba
    {
      digitalWrite(zolta, LOW); //dioda żółta gaśnie
      Serial.println("Przegrales!!!");
      delay(1000);

      //Warunek kontynuacji, tak samo jak wyżej w przypadku wygranej
      Serial.println("Chcesz grac dalej? Wpisz 'tak' lub 'nie' ");
      while (!Serial.available()) {};
      kontynuacja = Serial.readStringUntil('\n');

      if (kontynuacja == "tak")
      {
        reset = true;
        proba = 1;
        Serial.println('\n');
      }
      else
      {
        reset = false;
      }
    }
  }
  else //w przypadku gdy konczymy gre
  {
    Serial.println("Koniec!");

    //wszystkie diody sa wylaczone
    digitalWrite(zielona, LOW); 
    digitalWrite(zolta, LOW);
    digitalWrite(czerwona, LOW);
    
    while (true); //petla nieskonczona, ktora powoduje zakonczenie programu
  }
}

 

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

@piotr_1998-09, witam na forum 😉 Widzę, że to Twoje pierwsze kroki na Forbocie, oto najważniejsze informacje na start:

  • Chcesz przywitać się z innymi członkami naszej społeczności? Skorzystaj z tematu powitania użytkowników.
  • Opis najciekawszych funkcji, które ułatwiają korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzieć?
  • Poszczególne posty możesz oceniać (pozytywnie i negatywnie) za pomocą reakcji - ikona serca w prawym dolnym rogu każdej wiadomości.

Dnia 21.02.2019 o 18:41, piotr_1998-09 napisał:

Oto moja propozycja do zadania 4.5. Co sądzicie o moim rozwiązaniu?

Kod ładnie sformatowany, do tego dobre komentarze - oby tak dalej!

Link do komentarza
Share on other sites

Zadanie 4.5 GRA

Na tą chwilę kod wygląda tak:

int odczyt = 0;                   //odczytana wartosc z potencjometru
int proba = 0;                     //licznik odpowiedzi
bool komunikat = 0;                //kontrolka komunikatu o roczpoczeciu gry

#define zielona 9                  //definiowanie pinow
#define czerwona 10
#define zolta 11
#define przycisk 3
#define potencjometr A5

void setup() {
  Serial.begin(9600);
  while (!Serial) {
    ; //bylo w tutorialu Arduino to dodalem :)
  }
  pinMode (zielona, OUTPUT);
  pinMode (zolta, OUTPUT);
  pinMode (czerwona, OUTPUT);
  pinMode (przycisk, INPUT_PULLUP);
}

void loop() {
  odczyt = analogRead(potencjometr);      //odczyt z potencjometru
  Serial.println("Zakrec potencjometrem i wciśnij przycisk");

  while (digitalRead(przycisk) == HIGH) {}//czekamy na wciśnięcie przycisku
  if (digitalRead(przycisk) == LOW) {}    //jeżeli wciśnięty
  if (komunikat != 1) {                     //jeżeli komunikat nie został wywietlony
    digitalWrite(zielona, LOW);           //gasimy LEDY
    digitalWrite(zolta, LOW);
    digitalWrite(czerwona, LOW);
    Serial.println("Zaczynamy grę");
    Serial.println("Odgadnij wartość z zakresu 0-1023");
    komunikat = 1;                         //oznaczenie ze komunikat zostal wyswietlony
    proba = 0;                            //zerowanie licznika prob
    delay(50);
  }

  while (proba < 3) {                      //powtorka do 3 prob
    Serial.println("Podaj liczbę");
    while (Serial.available() == 0) {}
    String tekst = Serial.readStringUntil('\n');
    int liczba = tekst.toInt();            //string na int
    int roznica = odczyt - liczba;          //wyliczenie roznicy
    if (abs(roznica) <= 50) {              //roznica jako modół, żeby sprawdzić
      Serial.println("Wygrałes");
      proba = 3;
      digitalWrite(zielona, HIGH);
      delay(2000);
     }
    else     {
      Serial.println("Pudlo");
      digitalWrite(zielona, LOW);
      digitalWrite(zolta, HIGH);
      digitalWrite(czerwona, LOW);
      delay(800);
      digitalWrite(zolta, LOW);
    }

    komunikat = 0;                  //zezwolenie na komunikat
    proba++;                        //kolejna proba
  }
  Serial.println("Koniec Gry");     
  digitalWrite(zielona, LOW);
  digitalWrite(zolta, LOW);
  digitalWrite(czerwona, HIGH);
}

Trochę się namęczyłem,  żeby to działo. Niektórzy użytkownicy mogą znaleźć tutaj swoje fragmenty kodu 🙂 

Największe problemy miałem z przekształceniem string i int. Poszukując rozwiązania w pomocy Arduino natknąłem się na taki fragment przy konfikurowaniu:

void setup() { 
 //Initialize serial and wait for port to open:
  Serial.begin(9600); 
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB
  }
} 

i mam teraz kilka pytań:

  1. Do czego służy ten while(!Serial){;} ?
  2. W moim kodzie na początku w terminalu pojawia się komunikat: Zakrec potencjometrem i wciśnij przycisk. I niby program czeka na wciśnięcie przycisku. Ale zaobserwowałem, że wpisując liczby i zatwierdzając je program rejestruje je w tle i po wciśnięciu przycisku gra toczy się automatycznie na wprowadzonych liczbach. Jak poprawić kod, żeby czekał na wciśnięcie przycisku i dopiero po tym fakcie można było wprowadzać liczby?
  • Lubię! 1
Link do komentarza
Share on other sites

Witam wszystkich serdecznie,

zainspirowany zadaniem 4.6 w połączeni z kursem dot. serwa wymyśliłem sobie zadanie polegające na stworzeniu układu, który ma obracać ramie serwa w kierunku źródła światła.

Cały układ fajnie działa, natomiast zastanawia mnie jedna linijka. Dotyczy przeskalowania wartości, a dokładnie wartości wejściowych (-550, 550), które wpisuje "z ręki" i które dobrałem doświadczalnie, tak że zakrywałem kolejno fotorezystory i wpisałem skrajne wartości odczytanej sumy. Moje pytanie - jak można to prze edytować, żeby przy użyciu światła o różnym natężeniu ramię serwa obracało się +/- w kierunku źródła światła? Czy na tym etapie jest to w ogóle możliwe?

W układzie takim jak poniżej, gdy zbliżam latarkę do danego fotorezystora, serwo odkręca się w skrajną pozycję.

#include <Servo.h> //Biblioteka odpowiedzialna za serwa

Servo serwomechanizm;  //Tworzymy obiekt, dzięki któremu możemy odwołać się do serwa 
int czuj_1 = 0; // Czujnik prawy złącze A4
int czuj_2 = 0; // Czujnik lewy złącze A5
int suma = 0; // Suma z czujników
int kat = 0; // Kat ustawienia serwo

void setup() {
   Serial.begin(9600);//Uruchomienie komunikacji przez USART
   serwomechanizm.attach(3);  //Serwomechanizm podłączony do pinu 3

}

void loop() {
   czuj_1 = analogRead(A4);//Odczytujemy wartość Czujnik prawy złącze A4
   Serial.println("Czujnik prawy");
   Serial.println(czuj_1);//Wysyłamy wartość Czujnik prawy złącze A4
   czuj_2 = -analogRead(A5);//Odczytujemy wartość Czujnik lewy złącze A5 ZAMIANA NA WARTOŚĆ PRZECIWNĄ
   Serial.println("Czujnik lewy");
   Serial.println(czuj_2);//Wysyłamy wartość Czujnik lewy złącze A5
   Serial.println("");
   suma = czuj_1+czuj_2; // Sumowanie odczytanych wartości
   Serial.println("SUMA");
   Serial.println(suma);//Wysyłamy wartość sumy
   Serial.println("");
   kat = map(suma, -550, 550, 0, 180); //przeskalowanie skrajnych wartości sumy na kąt serwa
   Serial.println("KAT");
   Serial.println(kat);//Wysyłamy wartość kąta
   Serial.println("");
   serwomechanizm.write(kat);//obrót serwa
   delay(500);
   
}

 

Link do komentarza
Share on other sites

Dnia 1.03.2019 o 21:55, jogaszu napisał:

Do czego służy ten while(!Serial){;} ?

Wstrzymuje działanie programu do czasu nawiązania połączenia przez UART.

Dnia 1.03.2019 o 21:55, jogaszu napisał:

W moim kodzie na początku w terminalu pojawia się komunikat: Zakrec potencjometrem i wciśnij przycisk. I niby program czeka na wciśnięcie przycisku. Ale zaobserwowałem, że wpisując liczby i zatwierdzając je program rejestruje je w tle i po wciśnięciu przycisku gra toczy się automatycznie na wprowadzonych liczbach. Jak poprawić kod, żeby czekał na wciśnięcie przycisku i dopiero po tym fakcie można było wprowadzać liczby?

Możesz trochę dokładniej to opisać? Jak dokładnie wygląda przebieg takiej "wadliwej" gry?

@Krakers007, witam na forum 😉 Widzę, że to Twoje pierwsze kroki na Forbocie, oto najważniejsze informacje na start:

  • Chcesz przywitać się z innymi członkami naszej społeczności? Skorzystaj z tematu powitania użytkowników.
  • Opis najciekawszych funkcji, które ułatwiają korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzieć?
  • Poszczególne posty możesz oceniać (pozytywnie i negatywnie) za pomocą reakcji - ikona serca w prawym dolnym rogu każdej wiadomości.

Dnia 1.03.2019 o 22:07, Krakers007 napisał:

Cały układ fajnie działa, natomiast zastanawia mnie jedna linijka. Dotyczy przeskalowania wartości, a dokładnie wartości wejściowych (-550, 550), które wpisuje "z ręki" i które dobrałem doświadczalnie, tak że zakrywałem kolejno fotorezystory i wpisałem skrajne wartości odczytanej sumy. Moje pytanie - jak można to prze edytować, żeby przy użyciu światła o różnym natężeniu ramię serwa obracało się +/- w kierunku źródła światła? Czy na tym etapie jest to w ogóle możliwe?

Tak, powinieneś mieć możliwość stworzenia takiego programu. Może łatwiej będzie Ci, jeśli rozbijesz sobie to zadanie na dwa mniejsze. Najpierw określaj, po której stronie jest jaśniej (po lewej, czy po prawej), a dopiero później odpowiednio dobieraj kąt wychylenia serwa 😉

Link do komentarza
Share on other sites

11 godzin temu, Treker napisał:

Wstrzymuje działanie programu do czasu nawiązania połączenia przez UART.

Dokładniej: do czasu, aż Serial będzie gotowy do nawiązania połączenia. Dotyczy praktycznie tylko Leonardo i Micro/Pro Micro.

 

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

15 godzin temu, Treker napisał:

 

Możesz trochę dokładniej to opisać? Jak dokładnie wygląda przebieg takiej "wadliwej" gry?

 

Chciałem uzyskać taki efekt, żeby nic program nie rejestrował dopóki nie wcisnę przycisku na plytce. Teraz jak włączę aplikację i przed przyciśnięciem przycisku wprowadzę dane, to na ekranie widnieje komunikat "Zakrec potencjometrem i wciśnij przycisk" i do póki go nie wcisnę komunikat z ekranu nie zniknie. I teraz jeżeli przed wciśnięciem przycisku wprowadzę dane, to na ekranie nie widać, że je wprowadziłem ale po wciśnięciu przycisku są one automatycznie odbierane przez program. Chciałem uzyskać taki efekt, że jeżeli program czeka na wciśnięcie przycisku jest "zamrożony" to z mogę wpisywać co chcę i nie były to dane odbierane przez program.

Jak nie piszę zbyt jasno to trudno, uczymy się  dalej 🙂

Link do komentarza
Share on other sites

@jogaszu teraz rozumiem. W takim razie najprościej będzie tuż po wciśnięciu przycisku odczytać wszystkie dane, które są w buforze i nic z nimi nie zrobić (tylko pobrać z bufora, aby go wyczyścić). Spróbuj pójść w tym kierunku 🙂

Link do komentarza
Share on other sites

int odczytanaWartosc=0;
int prog=0;
float napiecie=0; //Napiecie w V

void setup() 
{
  Serial.begin(9600); //Uruchamiamy transmisję
  
  pinMode(8, OUTPUT); //Dioda niebieska, wyjscie

}

void loop() 
{
  odczytanaWartosc=analogRead(A5);
  prog=analogRead(A4);
  napiecie=odczytanaWartosc*(5.0/1024.0);

  if(odczytanaWartosc < prog)
  {
    digitalWrite(8, HIGH);
    Serial.println(napiecie);
    while(odczytanaWartosc<prog)
    {
      odczytanaWartosc=analogRead(A5);
      prog=analogRead(A4);
      delay(50);
    }
  }
  else
  {
    digitalWrite(8, LOW);
  }
  
 delay(50);
}

zad 4.4

nauka programowania idzie mi bardzo ciężko. podejrzewam ze zadania 4.5 i 4.6 zabiorą mi mnóstwo czasu.

To są moje początki i nigdy nie miałem z tym do czynienia ale liczę na to ze trening czyni mistrza.

Pozdrawiam

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

1 godzinę temu, arek2007100 napisał:

podejrzewam ze zadania 4.5 i 4.6 zabiorą mi mnóstwo czasu.

Spokojnie na wszystko przyjdzie czas - tak jak sam napisałeś: trening czyni mistrza! Powodzenia w dalszych eksperymentach. W razie problemów pytaj tutaj lub załóż osobny temat na forum 🙂

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

Dnia 3.03.2019 o 23:54, Treker napisał:

@jogaszu teraz rozumiem. W takim razie najprościej będzie tuż po wciśnięciu przycisku odczytać wszystkie dane, które są w buforze i nic z nimi nie zrobić (tylko pobrać z bufora, aby go wyczyścić). Spróbuj pójść w tym kierunku 🙂

Hmm jako początkujący teraz ja nie do końca rozumiem. Czy jest jakieś specjalne polecenie pobrania z bufora? Czy po prostu trzeba dopisać jakąś funkcję, która zabierze dane i nic z nimi nie zrobi?

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.