Skocz do zawartości

Kurs Arduino - #5 - PWM, serwomechanizmy, biblioteki


Pomocna odpowiedź

Witajcie,

w treści artykułu znalazłem drobne błędy:

  • literówka - powinno być generowaniem - Wstęp do artykułu
Cytat

Poprzednia część omawiała przetwornik ADC. Tym razem pójdziemy w drugą stronę i zajmiemy się generowanie specyficznego sygnału.

  • słowo można jest tu niepotrzebne - Treść zadania domowego 5.2
Cytat

Napisz program, który po zwiększeniu wypełnienia do 255 zacznie je stopniowo zmniejszać do zera (i tak w koło). Sprawdź przy jakim opóźnieniu w każdym obiegu pętli można zaobserwowany efekt pulsowania będzie najciekawszy.

 

  • 4 tygodnie później...
(edytowany)

A jakbym baterii 9V użył jako zewnętrzne źródło zasilania dla serwomechanizmu a Arduino zasilał przez port USB? Będzie miało to racje bytu? 🙂

 

P.S. zasilanie z portu USB wystarczy, aby wszystko działało poprawnie 🙂

Edytowano przez DziadekJohnson
11 godzin temu, DziadekJohnson napisał:

P.S. zasilanie z portu USB wystarczy, aby wszystko działało poprawnie 🙂

@DziadekJohnson taka metoda jest ryzykowana. Działać, zadziała, ale jest duża szansa, że programy nie będą działały poprawnie lub uszkodzisz tak Arduino 🙂

  • Lubię! 1
  • 2 tygodnie później...

Hej wszystkim! Oto moje rozwiązanie zadania 5.4

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

Servo serwomechanizm; //Tworzymy obiekt, dzięki któremu możemy odwołać się do serwa
String pozycja = ""; //Ciąg odebranych znaków
int pozycja_int ; // zmienna, przechowująca przesłaną liczbę 

void setup() {
  // put your setup code here, to run once:
  serwomechanizm.attach(9); //Serwomechanizm podłączony do pinu 9
  Serial.begin(9600); // Ustawienie prędkosci transkmisji
  Serial.println("Podaj położenie ramienia serwa");//Jednorazowe podanie tekstu
  serwomechanizm.write(0);// Wyzerowanie pozycji serwa
}


void loop() {
  // put your main code here, to run repeatedly:
  if (Serial.available()>0) {// jeśli dane są dostępne
    pozycja = Serial.readStringUntil('\n'); //odczyt danych
    pozycja_int = pozycja.toInt();//zimiana danych ze zmiennej string na zmienną int

    if(0 < pozycja_int < 180) { // jeśli liczba jest mniejsza niż 180
    serwomechanizm.write(pozycja_int); // serwo ustawia się na pozycję przez nas wysłaną
    } else {//Jeśli nie
      Serial.println("Błąd! Wybierz liczbę z zakresu 0 - 180");//wysłanie stosownego komunikatu
    }
   
  }
}

Generalnie na liczbach wszystko ładnie działa, ale chciałabym, żeby po wpisaniu liter także wyświetlał się błąd. I tu moje pytanie - czy jest szansa, żeby zmodyfikować ten kod w taki sposób, żeby po odczytaniu innych znaków niż liczby też wyświetlił komunikat o błędzie?  

  • Lubię! 1
  • 1 miesiąc później...
(edytowany)

Po prostu usuń warunek. Po przekroczeniu maksymalnej wartości program sam się zresetuje.

#define diodaPIN 3
 
int wypelnienie = 0;
int zmiana = 5;
 
void setup() 
{
  pinMode(diodaPIN, OUTPUT);//Konfiguracja pinu jako wyjścia 
}
 
void loop() 
{
  analogWrite(diodaPIN, wypelnienie); //Generujemy sygnał o zadanym wypełnieniu 
  wypelnienie = wypelnienie + zmiana; //Zwiększamy wypełnienie
  
  delay(50); //Małe opóźnienie, aby efekt był widoczny
}

 

Edytowano przez jas123
  • 3 tygodnie później...
(edytowany)

Cześć,

 

Przesyłam moje zadanka do opinii.

 

5.2

#define Dioda 3

byte wypelnienie = 0; //Jasność diody
int zmiana = 5; //Przyrost wypełnienia
boolean wypelnienieZero = true; //Zmienna okreslajaca czy wypelnienie zaczyna sie od zera
int opoznienie = 10; //Wartosc opoznienia

void setup() {
  pinMode(Dioda, OUTPUT); //Konfiguracja pinu jako wyjścia
}

void loop() {
  analogWrite(Dioda, wypelnienie); //Generujemy sygnal o zadanym wypelnieniu
  if (wypelnienieZero == true) {
    wypelnienie = wypelnienie + zmiana; //Zwiekszamy wypelnienie
    if (wypelnienie == 255) {
      wypelnienieZero = false;
    }
  } else {
    wypelnienie = wypelnienie - zmiana; //Zmiejszamy wypelnienie
    if (wypelnienie == 0) {
      wypelnienieZero = true;
    }
  }
  delay(opoznienie); //Ustawiamy opoznienie, aby efekt byl widoczny
}

5.3

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

Servo serwomechanizm; //Tworzymy obiekt, dzieki któremu możemy odwołać sie do serwa
int pozycja = 0; //Aktualna pozycja serwomechanizmu
int zmiana =5; //Zmiana pozycji serwa
int opoznienie = 50; //Ustawienie poczatkowego opoznienia

void setup() {
  serwomechanizm.attach(9); //Serwomechanizm podlaczoy do pinu 9
}

void loop() {
  if (pozycja < 180) {
    serwomechanizm.write(pozycja); //Wykonaj ruch
  } else {
    pozycja = 0; //Powrót na początek
    opoznienie = 50;
  }
  pozycja = pozycja + zmiana; //Zmiana pozycji serwa
  opoznienie = opoznienie + 50;
  delay(opoznienie); //Zwiekszenie opoznienia
}

5.4

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

Servo serwomechanizm; //Tworzymy obiekt, dzieki któremu możemy odwołać sie do serwa
int pozycja = 0; //Aktualna pozycja serwomechanizmu
int opoznienie = 200; //Ustawienie poczatkowego opoznienia

String odebraneDane = ""; //Pusty ciag odebranych danych
int odebranaLiczba = 0; //Odebrana liczba

void setup() {
  serwomechanizm.attach(9); //Serwomechanizm podlaczoy do pinu 9

  Serial.begin(9600); //Komunikacja z PC
  Serial.println("Wpisz nową pozycje serwomechanizmu!");
}

void loop() {
  if (Serial.available() > 0) {
    odebraneDane = Serial.readStringUntil('\n'); // Zapisujemy odebrane dane
    odebranaLiczba = odebraneDane.toInt (); // Przekształcamy odebrane dane na liczbe int
    pozycja = odebranaLiczba;
  }
  serwomechanizm.write(pozycja); //Ustawienie mechanizmu w zadanej pozycji
  delay(opoznienie); //Zadane opoznienie
}

5.5

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

Servo serwomechanizm; //Tworzymy obiekt, dzieki któremu możemy odwołać sie do serwa
int pozycja = 0; //Aktualna pozycja serwomechanizmu
int opoznienie = 50; //Ustawienie poczatkowego opoznienia

int odczytPot = 0; //Zmienna wartosci potencjometru

void setup() {
  serwomechanizm.attach(9); //Serwomechanizm podlaczoy do pinu 9
 Serial.begin(9600);
}

void loop() {
  odczytPot = analogRead(A5); //Przypisanie wartosci z potencjometru
  pozycja = odczytPot * 180./1023.; //Przeliczenie na zakres 0-180
  serwomechanizm.write(pozycja); //ustawienie serwa w zadanej pozycji
  Serial.print(odczytPot);
  Serial.print("  ");
  Serial.println(pozycja);
  delay(opoznienie);
}

Czy do potencjometru mógłbym pobrać zasilanie z Vin? 

Mam problem z potencjometrem. 50% obrotu potencjometru to przyrost wartości od 0 do około 50, potem skacze mi do około 900 na 20% obrotu i znów powoli do góry. Co może powodem? Uszkodzony potencjometr?

Pozdrawiam

Edytowano przez Achtenbob
20 godzin temu, Achtenbob napisał:

Czy do potencjometru mógłbym pobrać zasilanie z Vin? 

@Achtenbob co dokładnie masz na myśli? Pamiętaj, że na Vin, napięcie może być wyższe od 5 V - przy błędnym połączeniu możesz uszkodzić wejście Arduino (jeśli podasz na nie >5 V).

20 godzin temu, Achtenbob napisał:

Mam problem z potencjometrem. 50% obrotu potencjometru to przyrost wartości od 0 do około 50, potem skacze mi do około 900 na 20% obrotu i znów powoli do góry. Co może powodem? Uszkodzony potencjometr?

O jakich wartościach mówisz - chodzi Ci o ADC czy o zmierzone napięcie? Trochę te wartości nie pasują mi do niczego, więc wolę się upewnić 🙂

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...