Skocz do zawartości

ewgron

Użytkownicy
  • Zawartość

    10
  • Rejestracja

  • Ostatnio

Reputacja

6 Neutralna

O ewgron

  • Ranga
    2/10

Ostatnio na profilu byli

Blok z ostatnio odwiedzającymi jest wyłączony i nie jest wyświetlany innym użytkownikom.

  1. Podzielę się moją propozycją rozwiązania zadania 5.5: Układ: Program: #include <Servo.h> //Biblioteka odpowiedzialna za serwa Servo serwomechanizm; //Obiekt odwołujący się do serwa int potencjometr = 0; //Zmienna do przechowywania wartości odczytanej z dzielnika int pozycja = 0; //Zmienna do przechowywania pozycji serwa void setup() { serwomechanizm.attach(9); //Serwomechanizm podłączony do pinu 9 } void loop() { potencjometr = analogRead(A5); //Odczytanie wartości z dzielnika pozycja = map(potencjometr, 0, 1023, 0, 180); //Przeskalowanie wartości serwomechanizm.write(pozycja); //Wykonanie ruchu }
  2. Warunek zapisany w instrukcji "if" sprawdza czy wartość zmiennej "pozycja" jest mniejsza od 180. Jeżeli zmienna "pozycja" jest równa lub większa od 180 to warunek nie jest spełniony. Gdyby warunek był zapisany w ten sposób: if (pozycja <= 180) to wówczas byłoby tak jak napisałeś. Natomiast w kodzie jest zapis: if (pozycja < 180) czyli gdy zmienna "pozycja" ma wartość 180 to mamy: if (180 < 180) czego wynikiem jest "false" czyli warunek nie jest spełniony ponieważ 180 nie jest mniejsze od 180. https://www.arduino.cc/reference/en/language/structure/comparison-operators/lessthan/ @Gieneq Proszę o rozstrzygnięcie.
  3. Może się mylę ale działanie programu z kursu w skrajnych położeniach rozumiem tak (analizę zaczynam w 29 przebiegu czyli wtedy gdy zmienna "pozycja" ma już wartość 174): Warunek "pozycja < 180" jest spełniony (ponieważ wartość zmiennej "pozycja" wynosi 174) więc serwo jest przestawiane na pozycję 174, następuje zwiększenie wartości zmiennej "pozycja" na 180, a na koniec pojawia się opóźnienie. Warunek "pozycja < 180" nie jest już spełniony (ponieważ wartość zmiennej "pozycja" jest równa 180) więc wykonuje się polecenie w "else" to znaczy wartość zmiennej "pozycja" jest ustalana na 0 (serwo nie wykonuje ruchu), następnie wartość zmiennej "pozycja" jest zwiększana o 6 (pozycja = pozycja + zmiana) i przyjmuje wartość 6, na koniec pojawia się opóźnienie. Warunek "pozycja < 180" jest spełniony (ponieważ wartość zmiennej "pozycja" wynosi 6) więc serwo jest przestawiane na pozycję 6, następuje zwiększenie wartości zmiennej "pozycja" na 12, a na koniec pojawia się opóźnienie. Wygląda na to, że serwo nie przyjmuje wartości skrajnych czyli 0 i 180. Dlatego zaproponowałem inne podejście. Jeżeli źle rozumiem działanie programu z kursu, proszę o wyjaśnienie Dopiero zaczynam przygodę z Arduino i w związku z tym proszę o wyrozumiałość
  4. Chciałby zaproponować trochę zmodyfikowaną wersję programu do sterowania serwomechanizmem, ponieważ w tej wersji, która jest w kursie zmienna "pozycja" po wyzerowaniu jest od razu zwiększana o wartość "zmiana", a następnie jest wykonywany ruch czyli nigdy wychylenie nie osiąga wartości równej 0. W mojej propozycji linijka odpowiedzialna za wykonanie ruchu została przeniesiona przed instrukcję warunkową, a linijka, w której zwiększana jest wartość zmiennej "pozycja" trafiła do instrukcji warunkowej. #include <Servo.h> //Biblioteka odpowiedzialna za serwa Servo serwomechanizm; //Tworzymy obiekt, dzięki któremu możemy odwołać się do serwa int pozycja = 0; //Aktualna pozycja serwa 0-180 int zmiana = 6; //Co ile ma się zmieniać pozycja serwa? void setup() { serwomechanizm.attach(9); //Serwomechanizm podłączony do pinu 9 } void loop() { serwomechanizm.write(pozycja); //Wykonaj ruch do aktualnej pozycji if (pozycja < 180) { //Jeśli pozycja mieści się w zakresie pozycja = pozycja + zmiana; //Zwiększenie aktualnej pozycji serwa } else { //Jeśli nie pozycja = 0; //Zmniejszenie aktualnej pozycji serwa } delay(100); //Opóźnienie dla lepszego efektu } Poza tym chciałbym też zaproponować program, który będzie płynnie obracał serwomechanizmem od pozycji minimalnej do maksymalnej i z powrotem: #include <Servo.h> //Biblioteka odpowiedzialna za serwa Servo serwomechanizm; //Tworzymy obiekt, dzięki któremu możemy odwołać się do serwa int pozycja = 0; //Aktualna pozycja serwa 0-180 int zmiana = 1; //Co ile ma się zmieniać pozycja serwa? boolean wzrost = true; //Czy zwiększamy wychylenie? void setup() { serwomechanizm.attach(9); //Serwomechanizm podłączony do pinu 9 } void loop() { serwomechanizm.write(pozycja); //Wykonaj ruch do aktualnej pozycji if (wzrost == true) { //Jeżeli zwiększamy wychylenie pozycja = pozycja + zmiana; //Zwiększ wartość pozycji } else { //W przeciwnym wypadku pozycja = pozycja - zmiana; //Zmniejsz wartość pozycji } if (pozycja == 180) { //Jeżeli pozycja osiągnie maksimum wzrost = false; //Przejdź do zmniejszania wychylenia } else if (pozycja == 0) { //Jeżeli pozycja osiągnie minimum wzrost = true; //Przejdź do zwiększania wychylenia } delay(10); }
  5. Dzięki za opinię Ciekawa sugestia do przemyślenia Przyznam, że na początku sceptycznie podchodziłem do Arduino ale już teraz czuję, że zaczyna mnie wciągać. I moim zdaniem prawdą jest, że trzeba wykonywać dużo ćwiczeń praktycznych - nauka przez rozwiązywanie problemów jest skuteczna i sprawia dużo frajdy
  6. Moja propozycja rozwiązania zadania 4.5 Układ: Kod: #define zielona 8 #define czerwona 9 #define zolta 10 #define potencjometr A5 #define przycisk 11 String wpisanaWartosc = ""; //Wartość wpisana przez gracza int liczba = 0; //Wartość wpisana przez gracza zamieniona na liczbę int wartoscUstawiona = 0; //Wartość odczytana z potencjometru int proba = 0; //Licznik prób void setup() { Serial.begin(9600); //Uruchomienie komunikacji pinMode(zielona, OUTPUT); //Ustawienie wyjść pinMode(czerwona, OUTPUT); pinMode(zolta, OUTPUT); pinMode(przycisk, INPUT_PULLUP); digitalWrite(zielona, LOW); //Wyłącznie diod digitalWrite(czerwona, LOW); digitalWrite(zolta, LOW); } void loop() { if (proba<3) { //Jeżeli licznik prób jest mniejszy od 3 Serial.println("Przekręć potencjometr, a następnie naciśnij przycisk."); while (digitalRead(przycisk) == HIGH) {delay(50);} //Poczekaj na wiśnięcie przycisku wartoscUstawiona = analogRead(potencjometr); //Odczytanie wartości z potenjometru Serial.println("Podaj liczbę z zakresu od 0 do 1023."); //Wyświetlenie komunikatu while (Serial.available()==0){delay(50);} //Oczekiwanie na wprowadzenie wartości if (Serial.available()>0) { //Jeżeli wartość została wprowadzona wpisanaWartosc = Serial.readStringUntil('\n'); //Przeczytanie wartości wprowadzonej liczba = wpisanaWartosc.toInt(); //Konwersja wartości wprowadzonej na liczbę if ((liczba<wartoscUstawiona+50) and (liczba>wartoscUstawiona-50)) { //Jeżeli wprowadzona liczba mieści się w zakresie digitalWrite(zielona, HIGH); //Włączenie diody zielonej Serial.println("Wygrana."); //Wyświetlenie komunikatu informującego o wygranej Serial.println(wartoscUstawiona); //Wyświetlenie prawidłowego wyniku delay(2000); digitalWrite(zielona, LOW); //Wyłączenie diody delay(1000); } else { //Jeżeli wprowadzona wartość jest spoza zakresu digitalWrite(zolta, HIGH); //Włączenie żółtej diody Serial.println("Błąd."); //Wyświetlenie komunikatu informującego o błędnej wartośći delay(2000); digitalWrite(zolta, LOW); //Wyłączenie żółtej diody delay(1000); proba=proba+1; //Zwiększenie licznika prób } } } else if (proba == 3) { //Jeżeli osiągnięto limit prób digitalWrite(czerwona, HIGH); //Włączenie czerwonej diody Serial.println("Przegrana."); //Wyświetlenie komunikatu informującego o przegranej Serial.println(wartoscUstawiona); //Wyświetlenie prawidłowego wyniku delay(2000); digitalWrite(czerwona, LOW); //Wyłączenie czerwonej diody delay(1000); proba = 0; //Zerowanie licznika prób } }
  7. Zadanie domowe nr 2.5*: #define zielona 8 #define czerwona 9 String odebraneDane = ""; //Pusty ciąg odebranych danych boolean stanZielona = false; boolean stanCzerwona = false; void setup() { Serial.begin(9600); //Uruchomienie komunikacji pinMode(zielona, OUTPUT); //Konfiguracja wyjść pinMode(czerwona, OUTPUT); digitalWrite(zielona, LOW); //Wyłączenie diod digitalWrite(czerwona, LOW); } void loop() { if(Serial.available() > 0) { //Czy Arduino odebranło dane odebraneDane = Serial.readStringUntil('\n'); //Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej odebraneDane if (odebraneDane == "zielona") { //Jeśli odebrano słowo "zielona" if (stanZielona == false) { //Jeżeli dioda zielona jest wyłączona digitalWrite(zielona, HIGH); //To włącz diodę zieloną stanZielona = true; //Informacja o stanie diody zielonej - włączona } else { //W przeciwnym wypadku digitalWrite(zielona, LOW); //Wyłącz diodę zieloną stanZielona = false; //Informacja o stanie diody zielonej - wyłączona } } else if (odebraneDane == "czerwona") { //Jeśli odebrano słowo "czerwona" if (stanCzerwona == false) { //Jeżeli dioda czerwona jest wyłączona digitalWrite(czerwona, HIGH); //To włącz diodę czerwoną stanCzerwona = true; //Informacja o stanie diody czerwonej - włączona } else { //W przeciwnym wypadku digitalWrite(czerwona, LOW); //Wyłącz diodę czerwoną stanCzerwona = false; //Informacja o stanie diody czerwonej - wyłączona } } else { //Jeżeli podano inne polecenie Serial.println("Błędne polecenie!"); //Wyświetl komunikat } } }
  8. Proszę o wyjaśnienie do czego służy rezystor Ra i dlaczego po zmniejszeniu jego wartości np. za pomocą potencjometru do bardzo małych wartości (poniżej 150 Ω) układ przestaje przełączać.
  9. Witam serdecznie. Dziękuję twórcom i autorom kursów. Po kursie elektroniki poziom I nadszedł czas na poziom II. Z niecierpliwością czekam już na poziom III
×
×
  • Utwórz nowe...