Skocz do zawartości
Komentator

Kurs Arduino - #6 - kontynuacja UART, serwomechanizmy

Pomocna odpowiedź

Witam. Mam problem z serwomechanizmem z zestawu. Po pewnym czasie działania serwa odłączyłem przewód sterujący wychyleniem od Arduino. Później na pewien czas zostawiłem układ na biurku. Gdy przypomniałem sobie o tym, że nie odłączyłem zasilania, podłączyłem odłączony wcześniej przewód do tego samego pinu. I tu zaczął się problem. Serwo wyraźnie próbuje się przemieścić, jednak tkwi w pozycji 180, a gdy każę mu wychylić się na pozycję 0, to nic nie robi.

Udostępnij ten post


Link to post
Share on other sites

@Itap88 czy po resecie zasilania problem nie ustąpił? Zobacz czy nic fizycznie nie blokuje ruchu orczyka. Możesz też na odłączonym serwie ręcznie przekręcić orczyk, ale zrób to bardzo delikatnie, aby nie połamać zębatek. Sprawdź czy to nie rozwiąże problemu 😉

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Zadanie domowe 6.1 

int licznik=0; // licznik przycisniec
int foto1=0; //zmienna fotorezystora 1
int foto2=0;//zmienna fotorezystora 2
int potencjometr=0; // zmienna potencjometru


void setup(){
  
  Serial.begin(9600);
  pinMode(12,INPUT_PULLUP);
  
}

void loop(){
  
  foto1=analogRead(A1);
  foto2=analogRead(A2);
  potencjometr=analogRead(A3);
  
    
  if (digitalRead(12) == LOW){
    
    licznik++;
    
    Serial.print("Fotorezytor 1: ");
    Serial.print(foto1);
    Serial.print("\t Fotorezystor 2: ");
    Serial.print(foto2);
    Serial.print("\t Potencjmetr: ");
    Serial.print(potencjometr);
    Serial.print("\t Przycisk wcisnieto: ");
    Serial.println(licznik);
           
    while(digitalRead(12)==LOW){}
  } 
}

 

nadal czekam na arduino dlatego symulator musi mi go zastąpić

Bez tytułu.jpg

Udostępnij ten post


Link to post
Share on other sites

Hej.

Siedzę nad ćwiczeniem dotyczącym pomiaru natężenia światła. Układ mam identyczny jak na obrazku dodanym do artykułu, skrypt również. Tyle, że u mnie działa on odwrotnie - im jest więcej światła tym skala się zmniejsza.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

@wolandszyderca witam na forum 🙂

27 minut temu, wolandszyderca napisał:

Siedzę nad ćwiczeniem dotyczącym pomiaru natężenia światła. Układ mam identyczny jak na obrazku dodanym do artykułu, skrypt również. Tyle, że u mnie działa on odwrotnie - im jest więcej światła tym skala się zmniejsza.

Wygląda na to jakbyś jednak odwrotnie podłączył układ - konkretnie chodzi o podłączenie dzielnika napięcia, w którym wpięty jest rezystor. Sprawdź dokładnie czy nie zamieniłeś miejscami rezystora z fotorezystorem 😉 

Udostępnij ten post


Link to post
Share on other sites

Już rozwiązałem temat. W układzie odwrotnie podpięte są przewody od rozdzielnika napięcia. Jak Podłączyłem odwrotnie polaryzację działa normalnie. 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

zadanie 6.2 - ogólnie trochę dziwnie to wygląda, ale rozumiem że zadanie jest typowo aby poznać zagadnienie w praktyce, bo nie wdaje mi się że będzie to najefektywniejsze wykorzystanie kodu.

 

#define zielona 8
#define czerwona 9
 
String odebraneDane = ""; //Pusty ciąg odebranych danych
byte kolor=0;

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() {
  
  if(Serial.available() > 0) { //Czy Arduino odebrało dane
    //Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej odebraneDane
    odebraneDane = Serial.readStringUntil('\n'); 
  }
  
  if(odebraneDane=="zielona"){
    kolor=1;
  }else if (odebraneDane=="czerwona"){
    kolor=2;
  } else {
    kolor=0;
  }
  
  switch (kolor){
    case 1:
    digitalWrite(zielona, HIGH); 
    digitalWrite(czerwona, LOW);
    break;
    case 2:
    digitalWrite(zielona, LOW); //Wyłączamy diody
    digitalWrite(czerwona, HIGH);
    break;
    case 0:
    digitalWrite(zielona, LOW); //Wyłączamy diody
    digitalWrite(czerwona, LOW);
    break;
  }

  delay(1000);
}

 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

#define zielona 8
#define czerwona 9
	String odebraneDane = ""; //Pusty ciąg odebranych danych
int kolor = 0;
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() {
  if (Serial.available() > 0) { //Czy Arduino odebrało dane
    //Jeśli tak, to odczytujemy i zapisujemy w zmiennej odebraneDane
    odebraneDane = Serial.readStringUntil('\n');
  }
  if (odebraneDane == "zielona") {
    kolor = 1;
  } else if (odebraneDane == "czerwona") {
    kolor = 2;
  } else {
    kolor = 0;
  }
	  switch (kolor) {
    case 1:  //Jeśli odebrano słowo "zielona"
      digitalWrite(zielona, HIGH); //To włączamy diodę zieloną
      delay(1000);
      digitalWrite(zielona, LOW);
      break;
    case 2:  //Jeśli odebrano słowo "czerwona"
      digitalWrite(czerwona, HIGH); //To włączamy diodę czerwoną
      delay(1000);
      digitalWrite(czerwona, LOW);
      break;
    case 0:
      Serial.println("Wprowadzono błędne dane. Wpisz 'zielona' lub 'czerwona'");
      break;
	  }
	}

hymm zrobiłem podobnie ale nie działa mi to tak jak powinno, dioda powinna zgasnąć a świeci się cały czas, w przypadku błędnego wprowadzenia danych wyświetla się komunikat ale się też zapętla i cały czas wysyła to samo przecież jest break więc powinien wyjść z pętli...

Udostępnij ten post


Link to post
Share on other sites
[code]
#define zielona 9
#define czerwona 8
String odebraneDane = ""; //Pusty ciąg odebranych danych
int kolor = 0;
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() {

  if (Serial.available() > 0) { //Czy Arduino odebrało dane
    odebraneDane = Serial.readStringUntil('\n');  //Jeśli tak, to odczytujemy i zapisujemy w zmiennej odebraneDane
  }

  if (odebraneDane != "zielona" && odebraneDane != "czerwona" && odebraneDane != 0) {   //Jeśli wprowadzone dane są niewłaściwe
    kolor = 3;                                                                          //Ustaw zmienną na 3
  }
  else if (odebraneDane == "zielona") {                                                 // Jeśli wprowadzono "zielona"
    kolor = 1;                                                                          // Ustaw zmienną kolor na 1
  } else if (odebraneDane == "czerwona") {                                              // Jeśli wprowadzono "czerwona"
    kolor = 2;                                                                          // Ustaw zmienną kolor na 2
  }
  switch (kolor) {
    case 1:  //Jeśli odebrano słowo "zielona"
      digitalWrite(zielona, HIGH); //To włączamy diodę zieloną
      delay(1000);
      digitalWrite(zielona, LOW); // wyłączamy diodę zieloną
      odebraneDane = "";          //"reset" zmiennej
      kolor = 0;                  //"reset" zmiennej
      break;
    case 2:  //Jeśli odebrano słowo "czerwona"
      digitalWrite(czerwona, HIGH); //To włączamy diodę czerwoną
      delay(1000);
      digitalWrite(czerwona, LOW);  // wyłączamy diodę czerwoną
      kolor = 0;                    //"reset" zmiennej
      odebraneDane = "";            //"reset" zmiennej
      break;
    case 3:
      Serial.println("Wprowadź poprawne dane: 'zielona' lub 'czerwona'"); // Wypisz komunikat
      kolor = 0;                    //"reset" zmiennej
      odebraneDane = "";            //"reset" zmiennej
      break;
  }
}
[/code]

6.2 W końcu poprawiłem...

Udostępnij ten post


Link to post
Share on other sites

Cześć. kolejna super część kursu. 

Chciałbym podzielić się moimi rozwiązaniami zadań domowych:

6.1 

#define potencjometr A5
#define fotorezystor1 A4
#define fotorezystor2 A3
#define przycisk 8

int potencjometrW = 0; //zmienna dla potencjometru
int fotorezystor1W = 0; // zmienna na fotorezystora 1
int wcisniecia = 0; //zmienna dla ilosci wcisniec
int fotorezystor2W = 0; // zmienna na fotorezystora 1


void setup()
{
    Serial.begin(9600); //rozpoczescie komuniacji z PC 
    pinMode(przycisk, INPUT_PULLUP); //zdefiniowanie pinu przycisku
}

void loop()
{
    while (digitalRead(przycisk) == HIGH)
    { //kiedy przycisk nie wcisniety
        delay(50);
    }
    wcisniecia++; //zwiekszecznie ilosci wcisniec
    fotorezystor1W = analogRead(fotorezystor1); //odczytanie wartosci z 1 fotorezystora
    fotorezystor2W = analogRead(fotorezystor2); //odczytanie wartosci z 2 fotorezystora
    potencjometrW = analogRead(potencjometr); //odczytanie wartosci z potencjometru
    Serial.print("Potencjometr: ");
    Serial.print(potencjometrW);
    Serial.print(",\t");
    Serial.print("Fotorezytor 1: ");
    Serial.print(fotorezystor1W);
    Serial.print(",\t");
    Serial.print("Fotorezytor 2: ");
    Serial.print(fotorezystor2W);
    Serial.print(",\t");
    Serial.print("Liczba klikniec: ");
    Serial.print(wcisniecia);
    Serial.print("\n");

    delay(500);

}

 

6.2

#define czerwona 2
#define zielona 3

int odebraneDane = 0; //zmienna do odczytu podanych danych

void setup()
{
    Serial.begin(9600); //rozpoczescie komunikacji z PC
    pinMode(czerwona, OUTPUT); //określenie trybów pinów
    pinMode(zielona, OUTPUT);

    digitalWrite(czerwona, LOW); //stan poczatkowy diod
    digitalWrite(zielona, LOW);

}

void loop()
{
    Serial.println("Którą diodę zaświecić? (z - zielona, c - czerwona)");
    while (Serial.available() == 0)
    { //jesli nic nie wpisane
        delay(50);
    }

    odebraneDane = Serial.read(); //odczytanie wartosci wpisanej przez uzytkownika

    switch (odebraneDane)
    { //funkcja switch case na swiecenie odpowiedniej diody
        case 'z':
            Serial.println("Wybrałeś zieloną diodę!");
            digitalWrite(zielona, HIGH);
            delay(1000);
            digitalWrite(zielona, LOW);
            break;

        case 'c':
            Serial.println("Wybrałeś czerwoną diodę!");
            digitalWrite(czerwona, HIGH);
            delay(1000);
            digitalWrite(czerwona, LOW);
            break;

        default:
            Serial.println("Podałeś błędne dane!");
            break;
    }

}

 

6.3

Tutaj można by dodać dwie metody kalibracji - poprzez ADC, na przykład potencjometr lub z wykorzystaniem przycisków, ja wybrałem drugą opcję :). Wciśnięcie jednego z przycisków ustawia wartość minimalną, drugi zaś maksymalną. Poniżej kod i film z działania układu.

#include <Servo.h> //zaimplementowanie bilbioteki serwa
#define fotorezystor A5
#define przyciskMIN 2
#define przyciskMAX 3

Servo serwomechanizm; //utworzenie obiektu  serwo
byte pozycja = 0; //zmienna pozycji serwomechanizmu
int pozycjaPoprzednia = 0; //zmienna mowiaca o poprzednim polozeniu serwa
int wartoscMIN = 0; //zmienna wartosci minimalnego swiatla
int wartoscMAX = 1024; //wartosc maksymalnego swiatla

void setup()
{
    serwomechanizm.attach(9); //serwomechanizm na pinie numer 9
    Serial.begin(9600); //rozpoczescie komunikacji z PC
    pinMode(przyciskMIN, INPUT_PULLUP); //zdefiniowanie pinów dla przycisków
    pinMode(przyciskMAX, INPUT_PULLUP);

}

void loop()
{
    int odczytCzujnika = analogRead(fotorezystor); //odczyt wartosc z fotorezystora

    while (digitalRead(przyciskMIN) == LOW)
    { //kiedy przycisk wartosci minimalnej wcisniety
        wartoscMIN = odczytCzujnika;
        delay(100);
    }

    while (digitalRead(przyciskMAX) == LOW)
    { //kiedy przycisk wartosci maksymalnej wcisniety 
        wartoscMAX = odczytCzujnika;
        delay(100);
    }

    pozycja = map(odczytCzujnika, wartoscMIN, wartoscMAX, 180, 40);
    pozycja = constrain(pozycja, 40, 180);
    if (abs(pozycjaPoprzednia - pozycja) > 5)
    { //usunięcie zbyt małych zmian
        serwomechanizm.write(pozycja);
        pozycjaPoprzednia = pozycja; //zapamiętanie nowej poprzedniej pozycji
    }

    Serial.println("Aktualne wskaznie fotorezystora to: " + String(odczytCzujnika)); //info dla uzytkownika

    delay(200);

}

 

 

  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites

@BHBmacieg super, bardzo dobra robota! Fajne programy, ładnie sformatowane, oby tak dalej - powodzenia w dalszych eksperymentach 🚀

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Mam problem z zad 6.2. Po wpisaniu c albo z wykonują się polecenia ale wyświetla się słowo "błąd", a po wpisaniu czegokolwiek innego komunikat wyświetla się 2 razy. Nie mam już pomysłów jak to naprawić.

 

#define czerwona 2
#define zielona 4
	int odebraneDane = 0;
	void setup() {
  Serial.begin(9600);//rozpoczęcie transmisji
  pinMode(czerwona, OUTPUT);//ustalenie trybów pinów diod
  pinMode(zielona, OUTPUT);
	  digitalWrite(czerwona, LOW);
  digitalWrite(zielona, LOW);
	}
	void loop() {
	  if(Serial.available()>0){
    odebraneDane = Serial.read();//przypisanie wartosci zmiennej
 
  switch(odebraneDane){
    case 'c'://po wpisaniu c
      digitalWrite(czerwona, HIGH);//zaswiec czerwoną diode
      delay(1000);
      digitalWrite(czerwona, LOW);
    break;
    
    case 'z'://po wpisaniu z
      digitalWrite(zielona, HIGH);//zaswiec zieloną diode
      delay(1000);
      digitalWrite(zielona, LOW);
    break;
    default://w pozostałych przypadkach
      Serial.println("błąd");//wyświetl komunikat o błędzie
    break;
  }
  }
  delay(1000);
	 
}

Udostępnij ten post


Link to post
Share on other sites

W monitorze portu szeregowego zaznacz opcję "Bez zakończenia linii" - napisz czy pomogło, a jeśli tak to zastanów się czym jest to "zakończenie linii"?

  • Lubię! 2

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