Skocz do zawartości
Komentator

Kurs Arduino - #6 - kontynuacja UART, serwomechanizmy

Pomocna odpowiedź

Dnia 4.03.2019 o 12:31, Treker napisał:

"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 😉

Dobrze jest na początku nabyć dobre nawyki od doświadczonych osób. Czy może ukazał się jakiś artykuł na temat podstaw formatowania kodu? Jeżeli nie to myślę, że jest to dobry pomysł na nowy artykuł.

Udostępnij ten post


Link to post
Share on other sites
Dnia 5.03.2019 o 22:26, jogaszu napisał:

Czy może ukazał się jakiś artykuł na temat podstaw formatowania kodu? Jeżeli nie to myślę, że jest to dobry pomysł na nowy artykuł.

Od dawna mam taki plan, ale odkładam go w nieskończoność, bo wiem, że publikacja tego artykułu to będzie jak wsadzenia kija w mrowisko. Znajdzie się grono ekspertów, które nigdy wcześniej nie odezwało się nawet jednym słowem na forum, a będą za wszelką cenę udowadniali, że ich konwencja jest lepsza. To coś jak "walka" użytkowników Windows vs. Linux - każdy ma swoją rację 😉

Udostępnij ten post


Link to post
Share on other sites

6.3

#include <Servo.h> 
 
Servo serwomechanizm;  
byte pozycja = 0; 
int pozycjaPoprzednia = 0;
int mini=500;
int maxi=500;
 
void setup() { 
  serwomechanizm.attach(11);  
  Serial.begin(9600);
} 
 
void loop() 
{ 
  int odczytCzujnika = analogRead(A5); 
  if(mini>odczytCzujnika){
    mini=odczytCzujnika;
  }
  if(maxi<odczytCzujnika){
    maxi=odczytCzujnika;
  }
  
  pozycja = map(odczytCzujnika, mini, maxi, 0, 180); 
  
  if (abs(pozycja-pozycjaPoprzednia) > 3) { 
    serwomechanizm.write(pozycja); 
    pozycjaPoprzednia = pozycja; 
  }
  
  Serial.println(pozycja);
  Serial.print("mini");
  Serial.println(mini);
  Serial.print("maxi");
  Serial.println(maxi); 
  Serial.println();
  delay(500); 
}

 

  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

W 6.2 miałem ten sam problem co poprzednicy ale po zastosowaniu pętli while działa prawie idealnie

#define zielona 8
#define czerwona 9

int odebraneDane = 0; //Pusty ciąg odebranych danych

void setup() {
 Serial.begin(9600); //Uruchomienie komunikacji
 pinMode(zielona, OUTPUT); //Konfiguracja wyjść
 pinMode(czerwona, OUTPUT);

 digitalWrite(zielona, LOW); //Wyłączamy diody
 digitalWrite(czerwona, LOW);
}

void loop()  {
  while(Serial.available() ==0);
   odebraneDane = Serial.read(); 


   switch (odebraneDane) { 
     case 'z':  //Jeśli odebrano "z"
       digitalWrite(zielona, HIGH); //To włączamy diodę zieloną
       delay(1000);
       digitalWrite(zielona, LOW); 
       delay(1000);
     break;

     case 'r':  //Jeśli odebrano "r"
       digitalWrite(czerwona, HIGH); //To włączamy diodę czerwoną
       delay(1000);
       digitalWrite(czerwona, LOW); 
       delay(1000);
     break;

     default:
       Serial.println("Podano zly kolor, podaj [z] dla diody zielonej, [r] dla diody czerwonej");
     break;
   }
   delay(1000);
 }


 

dziękuje za pomoc 🙂

Edytowano przez Kuba2053
Już lepiej ;)

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

To przed switchem umieść sobie Serial.println(odebraneDane).

Uważaj, bo to może być trauma 🙂

Tak przy okazji - po to masz taki pizdryk opisany "zamieść kod" żeby za pomocą tego pizdryka kody zamieszczać. Następnym razem jak tego nie zrobisz zostaniesz po prostu zignorowany, nikomu się nie chce analizować kodu który wygląda jak ścierka wyjęta z taniej pralki.

Edytowano przez ethanak
  • Lubię! 1
  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

A jeszcze jedno, dlaczego pomimo spełniania case'a, wykonania bloku instrukcji i wyjścia poprzez 'break' bez względu na to co wpisze za każdym razem bez wyjątku wykonywana jest funckja default albo od razu lub po  wykonaniu case ?

 

Z tym od razu to wiadomo bo żaden warunek nie jest spełniony ale gdy zostanie wykonany 

Edytowano przez Kuba2053

Udostępnij ten post


Link to post
Share on other sites

@Kuba2053 jak masz ustawiony monitor portu szeregowego? Czy przypadkiem podczas nadawania nie dodajesz automatycznie znaków końca linii?

Udostępnij ten post


Link to post
Share on other sites

Ja tak delikatnie to zasugerowałem  ale uważałem że kolega sam na to wpadnie:)

Dla tych co nie rozumieją proponuję rozszyfrowanie skrótu GIGO.

Cóż - informatyka to nauka ścisła, komputer zrobi dokładnie to  co od niego chcesz. Tylko trzeba nauczyć się chcieć...

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Sprawdziłem forum na poprzednich stronach bo chciałem zobaczyć czy kogoś innego kod tez będzie miał ten błąd i natknąłem się że był ten sam problem gdzie koledze terminal dodawał coś tylko za bardzo nie wiem jak to sprawdzić

Cytat

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

kod jest dobry z tego wynika tylko czy to tak ma zostać czy da się to jakoś zmienić

Edytowano przez Kuba2053

Udostępnij ten post


Link to post
Share on other sites

Jak to sprawdzić to Ci napisałem.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Ethanak w sumie jednym zdaniem 3 problemy rozwiązałeś 😄 gratulacje, tylko musiałem troszkę pogłowić się co jest nie tak ale już wszystko jest jasne

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Zadanie 6.1 w moim wykonaniu🙂:

#define przycisk 2

int klik = 0;

void setup() {
  Serial.begin(9600); 
  pinMode(przycisk, INPUT_PULLUP);
} 
 
void loop() {
  int potencjometr = analogRead(A4);
  int fotorezystor1 = analogRead(A5);
  int fotorezystor2 = analogRead(A3);

  if (digitalRead(przycisk) == LOW) {
    klik = klik + 1;
    Serial.print("Odczyt: ");
    Serial.print(potencjometr);
    Serial.print("\t");
    Serial.print(fotorezystor1);
     Serial.print("\t");
    Serial.print(fotorezystor2);
     Serial.print("\t");
    Serial.print(klik);
     Serial.print("\n");
    while(digitalRead(przycisk) == LOW);
    }
    delay(100);
}

PS: Czy wam też strasznie hałasuje servo?

Edytowano przez Dami12250

Udostępnij ten post


Link to post
Share on other sites
13 godzin temu, Dami12250 napisał:

PS: Czy wam też strasznie hałasuje servo?

W serwie znajduje się stosunkowo duża przekładnia (składająca się z wielu kół zębatych), więc element ten zawsze będzie wydawał dźwięk 🙂 Taki urok tych napędów (są głośniejsze od silników z przekładniami). To całkowicie normalna sprawa.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Jak chodzi o koła zębate w serwie to wiem że wydają dźwięk taki jak na początku załączonego filmu ale chodziło mi o dźwięk taki jak w końcówce filmu.

I jeszcze jedna rzecz. Robiłem wskaźnik natężenia światła przepisałem kod dokładnie tak jak w kursie, wyregulowałem a wskaźnik (czasami)  drga jak najeżdżam na fotorezystor latarką. Co może być tego przyczyną?

 

Udostępnij ten post


Link to post
Share on other sites
54 minuty temu, Dami12250 napisał:

Jak chodzi o koła zębate w serwie to wiem że wydają dźwięk taki jak na początku załączonego filmu ale chodziło mi o dźwięk taki jak w końcówce filmu.

Wszystko zależy od tego, w której pozycji jest serwo - przy skrajnych pozycjach takie dźwięki są normalne. Jeśli serwo działa to bym się tym zbytnio nie przejmował, jak się uszkodzi to najwyżej zareklamujesz i otrzymasz nowe 😉

55 minut temu, Dami12250 napisał:

I jeszcze jedna rzecz. Robiłem wskaźnik natężenia światła przepisałem kod dokładnie tak jak w kursie, wyregulowałem a wskaźnik (czasami)  drga jak najeżdżam na fotorezystor latarką. Co może być tego przyczyną?

Arduino w połączeniu z fotorezystorem są bardzo czułym czujnikiem światła. Jeśli chcesz wyeliminować takie drgania to masz dwie opcje. Pierwsza to napisanie prostego filtru, czyli czegoś co będzie sprawiało, że małe zmiany oświetlenia będą ignorowane (wtedy wskazówka będzie ruszała się tylko przy większych skokach oświetlenia). Druga opcja to wprowadzenie większego opóźnienia na końcu pętli loop 😉

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