Skocz do zawartości
Komentator

Kurs Arduino - #6 - kontynuacja UART, serwomechanizmy

Pomocna odpowiedź

Witam moja propozycja do zadania 2.4

String kolor; //zmienna dla koloru
int dane; //zmienna dla przeksztalcenia koloru w cyfre
void setup() {
 Serial.begin(9600); //wlaczym uart
  pinMode(8, OUTPUT); //okreslamy pin
 pinMode(9, OUTPUT); // okreslamy pin
 Serial.println(" Wpisz kolor diody \n do wyboru masz \n czerwony \t zielony"); //krtótka instrukcja")
}

void loop() {
 if (Serial.available() > 0) { //czekamy na tekst
   kolor = Serial.readStringUntil('\n'); //odczytujemy zmienna
   if (kolor == "zielony") { //jesli zmienna to zielony
     dane = 1; //dane = 1
   }
   else if (kolor == "czerwony") { //jeśli zmienna to czerwony
     dane = 2; //dane = 2
   } 
   else { dane=3; } //w przypadku nieprawidlowego wpisu
   switch (dane) { //stosujemy switcha do dane
     case 1: //w przypadku 1
       Serial.println("zapaliles diode koloru zielonego"); //wyswietlamy teskt
       digitalWrite(9, HIGH); //zapalamy zielona
       digitalWrite(8, LOW); //wylaczamy czerwona
       break;
     case 2: //w przypadku 2
       Serial.println("zapalisles diode koloru czerwonego"); // wyswietlamy tekst
       digitalWrite(9, LOW); //wylaczamy zielona
       digitalWrite(8, HIGH); //wlaczamy czerwona
       break;
     case 3:
       Serial.println("postepuj zgodnie z instrukcja i podaj kolor ;)"); //jesli zaden z powyzszych wyswietl komunikat
       digitalWrite(9, LOW); //wylaczamy
       digitalWrite(8, LOW); //wylaczamy
       break;
   }
 }
}

Pozdrawiam

Udostępnij ten post


Link to post
Share on other sites

Cześć

Znalazłem dwa błędy. Raczej nikomu nie przeszkadzają, ale nie zaszkodzi poprawić

1.

Raz jest napisane fototranzystor, później fotorezystor.

"Potrzebne do tego będzie Arduino z podłączonym !!!fototranzystorem!!! w układzie dzielnika napięcia oraz serwomechanizm."

"Druga część schematu to podłączenie rezystora i !!!fotorezystora!!! w dzielnik napięcia. Dokładniejsze informacje na ten temat znaleźć można w części dotyczącej ADC w Arduino."

2.

Zbędne znajduje

"Na końcu !!!znajduje!! opcjonalnie możemy umieścić kod pomiędzy default oraz break."

Najlepszy kurs jaki znalazłem. Gratulacje dla autora 🙂

Udostępnij ten post


Link to post
Share on other sites

Mechanizm kalibracji urządzenia z użyciem potencjometru.

#include <Servo.h> //podlaczamy serwo
Servo miernik; //nazywamy serwo
int p; //zmienna dla fotorezystora
int pp; //zmienna po ustaleniu pozycji wskazówki
int po; //odczyt z potencjometru
void setup() {
 miernik.attach(9); //konfigurujemy serwo pod PWM
 Serial.begin(9600); //wlaczamy uart
}
void loop() {
 p = analogRead(A5); //odczytujemy fotorezystor
 po = analogRead(A4); //odczytujemy potencjometr
 Serial.println(p); //odczyt fotorezystora
 delay(50); //opoznienie
 p = map( p, 0, po, 0, 180); /* mapujemy fotorezystor gdzie minimalny odczyt to 0 maksymalny to odczyt z potencjometru, nastepnie katy od 0 do 180 */
 if (abs( p - pp) > 5) {
   //ustawiamy tolerancje zmienionego oswietlenia
   miernik.write( p); //ustawiamy kat
   pp = p; //zapamietujemy pozycje serwa
 }
}

Pozdrawiam

Udostępnij ten post


Link to post
Share on other sites

Coorsar, witam na forum! Dziękuję za miłe słowa na temat kursu - cieszę się, że jest pomocny. Zgłoszone błędy zostały poprawione 🙂

Udostępnij ten post


Link to post
Share on other sites

Mam pewien problem z zadaniem 6.2

Diody zapalają się, jednak po zgaśnięciu i tak wyświetla się komunikat o błędzie, gdy wpisze inna literę niż "z" lub "c" wyświetlają się 2 komunikaty o błędzie. W wcześniejszych postach zauważyłem problemy podobnego do mojego, jednak odpowiedzi do nich nie pomogły mi.

int OdebraneDane=0 ;
#define z 8//dioda zielona
#define c 10//dioda czerwona

void setup() {

Serial.begin(9600);
pinMode(z, OUTPUT);
pinMode(c, OUTPUT);
}
void loop() {
while(Serial.available()==0); //zatrzymanie w pustej petli

OdebraneDane= Serial.read( );

  switch( OdebraneDane){
case'z':  //dioda zielona

digitalWrite(z,HIGH);
delay(1000);
digitalWrite(z,LOW);
break;

case'c':  //dioda czerwona
digitalWrite(c,HIGH);
delay(1000);
digitalWrite(c,LOW);
break;

default:  //cokolwiek innego
Serial.println("Błąd");
break;
}

delay(1000);

}
 
 






 

 

Dnia 20.06.2016 o 11:36, piotrino napisał:
Chumanista napisał:
Zobacz czy terminal ci czegoś nie dodaje, na przykład \r\n.

BINGO:) Miałeś rację, teraz działa jak należy. Moja nieuwaga. Pozdrawiam

To jest chyba rozwiązanie mojego problemu, ale nadal nie wiem jak wprowadzić go w życie, gdzie dodać jakie komendy.

Udostępnij ten post


Link to post
Share on other sites

@Kamar, w prawym dolnym rogu terminala wybierasz jak mają być kończone linie. Wybierz opcję, która zapewnia transmisję bez znaków zakończenia linii i sprawdź działanie programu 😉

  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

 Treker

Po raz kolejny mi pomogłeś, wystarczyło wybrać "brak zakończenia linii" , dziękuję bardzo 😉

Edytowano przez Kamar
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Witam wszystkich,  niedawno zacząłem przygodę z Arduino. Zrodziło się pytanie odnośnie Serwa i zadania z natężeniem światła. Otóż moglibyście podpowiedzieć co robię źle? W wyżej wymienionych kodach jak sterujecie kątem dajecie:

pozycja = map(odczytCzujnika, 0, 970, 0, 180);

Otóż u mnie wskazówka wychyla się wtedy w drugą stronę, czyli jak świecę lampką w fotorezystor to na tarczy będzie mi wskazywać około 0%. Jedyne co na myśl mi przyszło to odwrócić w funkcji map wartości 0 i 970 ( odczyt z ADC na dzielniku). Czy z moim Serwomechanizmem jest coś nie tak? Pozdrawiam

Udostępnij ten post


Link to post
Share on other sites

@miszczur, prawdopodobnie podłączyłeś odwrotnie dzielnik napięcia z fotorezystorem. Zobacz, który jego "koniec" masz podłączony do plusa, a który do minusa zasilania. Zamiana zasilania dzielnika napięcia powinna odwrócić działanie układu.

Udostępnij ten post


Link to post
Share on other sites
23 minuty temu, Treker napisał:

@miszczur, prawdopodobnie podłączyłeś odwrotnie dzielnik napięcia z fotorezystorem. Zobacz, który jego "koniec" masz podłączony do plusa, a który do minusa zasilania. Zamiana zasilania dzielnika napięcia powinna odwrócić działanie układu.

Wydaje mi się, że podłączyłem jak na obrazku w kursie, tak myślałem, że może to dzielnik, teraz już nie sprawdzę, bo działam z LCD i rozmontowałem poprzedni układ na płytce stykowej. Tak czy siak dziękuję za odpowiedź!

Udostępnij ten post


Link to post
Share on other sites
Dnia 14.01.2019 o 14:20, Treker napisał:

@miszczur, prawdopodobnie podłączyłeś odwrotnie dzielnik napięcia z fotorezystorem. Zobacz, który jego "koniec" masz podłączony do plusa, a który do minusa zasilania. Zamiana zasilania dzielnika napięcia powinna odwrócić działanie układu.

Też podpiąłem odwrotnie (dopiero teraz zobaczyłem, że to robi różnicę). Dzięki odwrotnemu przepięciu dowiedziałem się również, że  funkcja map() skaluje  również jeżeli jako pierwszą damy większą wartość, a jako drugą mniejszą (przykład w kodzie poniżej). Dodałem również opcję auto-kalibracji 

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

Servo serwomechanizm;  //Tworzymy obiekt, dzięki któremu możemy odwołać się do serwa
byte pozycja = 0; //Aktualna pozycja serwa 0-180
int pozycjaPoprzednia = 0; 
int minWartosc = 50; //wartosc min odczytu dla przeskalowania
int maxWartosc = 700; //wartosc max odczytu
void setup() {
  serwomechanizm.attach(11);  //Serwomechanizm podłączony do pinu 11
  Serial.begin(9600);
}

void loop()
{
  int odczytCzujnika = analogRead(A5); //Odczytujemy wartość z czujnika
  pozycja = map(odczytCzujnika, minWartosc, maxWartosc, 180, 0); //Zamieniamy ją na pozycję serwa
  if (odczytCzujnika < minWartosc) { //Autokalibracja-sprwdzenie czy odczytana wartosc jest mniejsza od min ustawionej
    minWartosc = odczytCzujnika;      //jezeli mniejsza to zamiana
  }
  else if (odczytCzujnika > maxWartosc) { //jak wyzej
    maxWartosc = odczytCzujnika;
  }
  else if (abs(pozycja - pozycjaPoprzednia) > 5) { //Sprawdzamy czy pozycje różnią się o ponad 5 stopni
    serwomechanizm.write(pozycja); //Wykonajujemy ruch
    pozycjaPoprzednia = pozycja; //Zapamiętujemy aktualną pozycję jako poprzednią
  }
  Serial.print("Min: ");
  Serial.println(minWartosc);
  Serial.print("Max: ");
  Serial.println(maxWartosc);
  Serial.println(odczytCzujnika); //Wysyłamy wartość do terminala
  delay(300); //Opóźnienie dla lepszego efektu
}

oto mój wskaźnik 😋

IMG_20190303_184348.thumb.jpg.04be830d019567eb54f8fea3c3d66cfe.jpg

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
5 godzin temu, jogaszu napisał:

Dzięki odwrotnemu przepięciu dowiedziałem się również, że  funkcja map() skaluje  również jeżeli jako pierwszą damy większą wartość, a jako drugą mniejszą (przykład w kodzie poniżej).

Dokładnie tak, ta funkcja jest bardzo wygodna i przydaje się również w takich niestandardowych przypadkach 😉

Jedna uwaga do formatowania programu, zamiast tak:

 }
  else if (abs(pozycja - pozycjaPoprzednia) > 5) {

Lepiej będzie robić tak:

 } else if (abs(pozycja - pozycjaPoprzednia) > 5) {

Mniejsza szansa, że później coś pomylisz podczas rozbudowywania programu.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
13 godzin temu, Treker napisał:

Lepiej będzie robić tak

Dziwię się trochę, że czepiasz się takiego drobiazgu, a przecież autor nie pisze tak:

 }
  else if (abs(pozycja - pozycjaPoprzednia) > 5) {

tylko raczej tak 😉 :

 }
 else if (abs(pozycja - pozycjaPoprzednia) > 5) {

i jeżeli robi to konsekwentnie i systematycznie to jest to zupełnie czytelne i poprawne.

Dziwię się, bo jest dużo zamieszczanych tu kodów z gorszymi, moim zdaniem, całkowicie przemilczanymi błędami. Poniżej malutki fragment kodu z programu zamieszczonego w tym wątku:

dane = 2; //dane = 2
   } 
   ...
   switch (dane) { //stosujemy switcha do dane
     case 1: //w przypadku 1

Rozumiem doskonale, że piszą je początkujący i czasami dodatkowo nie za bardzo znają angielski i że lepiej aby program był brzydki jak przysłowiowa noc i działał, niż żeby był piękny jak ... a zupełnie nie działał, 

Jeżeli ktoś nie wie o co chodzi, to chodzi o komentarze.

A wystarczyłoby może w tych miejscach kursu, gdzie wspomina się o dodawaniu komentarzy do swojego kodu, dodać, aby nie przesadzać i nie robić tego na siłę. Jeżeli to mają być takiego typu komentarze jak powyżej, to dużo lepiej aby się nie pojawiły w ogóle. A to tylko jeden drobny przykład z bardo wielu takich przypadków. 

Edytowano przez narbej
styl

Udostępnij ten post


Link to post
Share on other sites
3 godziny temu, narbej napisał:

Dziwię się, bo jest dużo zamieszczanych tu kodów z gorszymi, moim zdaniem, całkowicie przemilczanymi błędami.

"Czepiam" się dlatego, że jeśli ktoś zamieszcza ogólnie poprawny i ładnie sformatowany kod to warto wytknąć nawet małe drobiazgi, które sprawią, że będzie jeszcze lepiej. Jak ktoś początkujący wkleja kompletnie źle sformatowany program, ale ma on z tego wielką radość, bo siedział nad tym 5 godzin i jest to jego drugi program w życiu, to wytykanie mu takich drobiazgów na tym etapie wiele nie zmieni (może go jedynie zniechęcić). Dlatego każdy kod staram się ocenić trochę inaczej. Tutaj widać, że @jogaszu radzi sobie całkiem dobrze, to się uczepiłem drobiazgu 😉

3 godziny temu, narbej napisał:

jeżeli robi to konsekwentnie i systematycznie to jest to zupełnie czytelne i poprawne.

Tylko, że jest to raczej mało popularny sposób formatowania warunków. Oczywiście gdzieś tam można go spotkać, ale przeważa jednak wersja, którą tutaj zaproponowałem. Do tego, właśnie taka wersja była przedstawiana w kursie. Wystarczy też przejrzeć kilka różnych źródeł na temat programowania i raczej ze znacznie większym prawdopodobieństwem trafimy na "moją wersję". Pierwsze z brzegu przykłady:

Właściwie szukając teraz takich przykładów nigdzie nie trafiłem na inną wersję formatowania warunków z else. Samo Arduino w swoich programach demonstracyjnych również formatuje warunki sposób, który zaproponowałem. Przykład z projektu IfStatmentConditional:

  // if the analog value is high enough, turn on the LED:
  if (analogValue > threshold) {
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
  }

Do tego, po prostu uważam, że takie formatowanie jest wygodniejsze. Mniejsza szansa, że "wstrzelimy" coś przypadkiem między else, a nawias rozpoczynający blok instrukcji.

Udostępnij ten post


Link to post
Share on other sites

sposobów formatowania jest przeszło więcej, ja stosuję z reguły coś podobnego do "kernel". proponuję zapoznanie się z programem indent i jego możliwościami formatowania.

tak przy okazji - parę razy miałem przyjemność analizy i przerabiania kodu tworzonego przez niewidomych... to jest dopiero masakra 🙂

  • Lubię! 1

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