Skocz do zawartości

Kurs Arduino - #5 - PWM, serwomechanizmy, biblioteki


Komentator

Pomocna odpowiedź

(edytowany)
42 minuty temu, ethanak napisał:

 

Jako ćwiczenie przerób program tak, aby działał:

  1. Z wartością 10
  2. Z dowolną wartością.

Dopisałem kilka linijek zgodnie z twoimi podpowiedziami, teraz działa chyba z każdą wartością

#define PIN3 3

int wypelnienie = 0;
int zmiana = 15;

void setup() {
pinMode(3, OUTPUT); // pin 3 jako wyjscie
}

void loop() {

analogWrite(PIN3, wypelnienie); // wygeneruj sygnal (gdzie, jakie wypełnienie)

if (wypelnienie < 255) { //Jeżeli wypełnienie jest mniejsze od 255 czyli 100% to:
wypelnienie = wypelnienie + zmiana; // zwiekszamy wypelnienie od drugiej petli
delay(25);
}


else{ //jesli wypelnienie jest powyzej 255
wypelnienie = 255;
while (wypelnienie > 0) { // jezeli wypelnienie nie jest rowne 0
  analogWrite(PIN3, wypelnienie); // wygeneruj sygnal (gdzie, jakie wypełnienie)
  
  (wypelnienie = wypelnienie - zmiana);
  if (wypelnienie < 0){
     wypelnienie = 0;
  }
delay(25);
}}
delay(50); //opoznienie zeby zobaczyc efekty
}

EDIT: wyrzuciłem jeszcze ostatnie delay 50 bo szybciej gasła a wolniej rozświetlała

Edytowano przez PanMajster
  • Lubię! 1
Link do komentarza
Share on other sites

Praca domowa 5.4

#include <Servo.h> //Biblioteka serwa 

Servo serwomechanizm;  //Obiekt odwołania do serwa 
int start = 0; // pozycha startowa
String odebranapozycja=""; //dane wprowadzone przez UART
int stopnie;
boolean wpisane=false;

void setup() 
{ 
 serwomechanizm.attach(9);  //Serwomechanizm podłączony do pinu 9 
 Serial.begin(9600); // start łąćża
 serwomechanizm.write(start); // ustawienie serwa w pozycje startowej
} 

void loop() 
{
 if (wpisane==false) { // sprawdzenie bool
 Serial.println("Wpisz polozenie serwaa 0-180");
   wpisane=true;
 }

if(Serial.available() > 0) {  // jeżeli wpisano tekst
odebranapozycja = Serial.readStringUntil('\n'); // odczytuje dane ze string do konca linijki
stopnie=odebranapozycja.toInt(); // wpisujemy liczbe wpisana w string do stopni

 delay(100); // opóźnienie do lepszej obserwacji

if (stopnie<=180 && stopnie>=0){// sprawdzamy czy uzytkownik wpisal liczbe w zakresie 0-180
     delay(100); // opóźnienie do lepszej obserwacji
     serwomechanizm.write(stopnie); //serwo ustawia sie w wpisana pozycje
    // progtam wysyla napis wpisane stopnie + położenie}
 Serial.println(" Wpisane stopnie");
     Serial.println(stopnie);
     delay(100);

}else{ // w innym przypadku
     Serial.println("wpisano złą wartość"); // program pisze do nas wpisano złą wartość
      Serial.println("Prawidłowa wartość 0-180");
     delay(100);
   }
 
}  }

    

Praca domowa 5.5

Dwie prace domowe. Proszę żeby ktoś rzucił okiem. Uwagi mile widziane 🙂

#include <Servo.h> //Biblioteka serwa 

Servo serwomechanizm;  //Obiekt odwołania do serwa 
int start = 0; // pozycha startowa
boolean powitanie=false;
int odczytanaWartosc = 0; //Odczytana wartość z ADC
int poprzedniaWartosc = -1; // Inicjalizacja poprzedniej wartości wartością niemożliwą do uzyskania z ADC

void setup() 
{ 
Serial.begin(9600); // start łącza
serwomechanizm.attach(9);  //Serwomechanizm podłączony do pinu 9 
serwomechanizm.write(start); // ustawienie serwa w pozycje startowej
} 

void loop() {
odczytanaWartosc = analogRead(A5);//Odczytujemy wartość z pinu A5
odczytanaWartosc = map(odczytanaWartosc, 0, 1023, 0, 180);//Przeskalowanie wartości 0-180

delay(100);
if (powitanie==false) { // sprawdzenie bool zeby raz wyswietlic instrukcje
 Serial.println("Ustaw pozycje potencjometru");
   powitanie=true;
}
  delay(80);


  if (odczytanaWartosc != poprzedniaWartosc) {   // Sprawdzenie czy wartość się zmieniła
    Serial.println(odczytanaWartosc); // nie chcemy dostawac w kolko na port szeregowy 
    poprzedniaWartosc = odczytanaWartosc; //aktualnej wartosci jeżeli nie uległa zmianie

    delay(80);

serwomechanizm.write(odczytanaWartosc);

    delay(100);}}
   

 

Link do komentarza
Share on other sites

@PanMajster programy bardzo ładne, tylko kocówka ostatniego programu coś brzydko zwinięta 🙂 Zastanów się tylko nad treścią komentarzy, bo komentarz typu "// sprawdzenie bool zeby raz wyswietlic instrukcje" opisuje co tam się dzieje, ale dla człowieka łatwiejsze w zrozumieniu byłoby pewnie "// jeśli to pierwsze uruchomienie" (lub coś takiego) - pomijam, że ten fragment akurat jest do sporej optymalizacji, bo mógłbyś zrobić to w setup (zamiast loop) skoro chcesz, aby komunikat wyświetlił się tylko raz.

  • Lubię! 1
Link do komentarza
Share on other sites

Praca domowa 6.1 

 

int fotorezystor1 = 0; //Odczytana wartość z ADC
int fotorezystor2 = 0; //Odczytana wartość z ADC
int potencjometr = 0; //Odczytana wartość z ADC
int przycisk = 0; //Odczytana wartość z ADC do liczenia wciśnięć
boolean przyciskON=false; //Sprawdzanie odpuszczenie przycisku wcisniecie przycisku

void setup() {
  Serial.begin(9600); //Inicjalizacja UART
   Serial.println(" Witam w programie !"); 
   pinMode(3, OUTPUT); // pin 3 jako wyjscie
   pinMode(8, INPUT_PULLUP); //Wyjście przycisku

}
void loop() {
 
  if (digitalRead(8) == LOW && !przyciskON) { //jeżeli przycisk jest wcisniety i zmienna przyciskON=false to:


    przycisk++; //dodajemy +1 do kliknięć
    Serial.println("Ilość pomiarów");
    Serial.println(przycisk);
  


  int fotorezystor1 = analogRead(A4); //Odczytanie wartości ADC
  int fotorezystor2 = analogRead(A3); //Odczytanie wartości ADC
  int potencjometr = analogRead(A5); //Odczytanie wartości ADC

  Serial.print("Odczyt Potencjometr: ");
  Serial.print(potencjometr, DEC);
  Serial.print("[DEC]\t");
  Serial.print(potencjometr, HEX);
  Serial.print("[HEX]\t");
  Serial.print(potencjometr, OCT); 
  Serial.print("[OCT]\t");
  Serial.print(potencjometr, BIN); 
  Serial.print("[BIN]\n");

  Serial.print("Odczyt Fotorezystor 1: ");
  Serial.print(fotorezystor1, DEC);
  Serial.print("[DEC]\t");
  Serial.print(fotorezystor1, HEX);
  Serial.print("[HEX]\t");
  Serial.print(fotorezystor1, OCT); 
  Serial.print("[OCT]\t");
  Serial.print(fotorezystor1, BIN); 
  Serial.print("[BIN]\n");

  Serial.print("Odczyt Fotorezystor 2: ");
  Serial.print(fotorezystor2, DEC);
  Serial.print("[DEC]\t");
  Serial.print(fotorezystor2, HEX);
  Serial.print("[HEX]\t");
  Serial.print(fotorezystor2, OCT); 
  Serial.print("[OCT]\t");
  Serial.print(fotorezystor2, BIN); 
  Serial.print("[BIN]\n");

    Serial.println(  ); //Przerwa dla lepszego wygladu w minitorzee portu szeregowym
    przyciskON = true; // zmiana przyciskON na true by przerwać petle
  }
  delay(100); //Opóźnienie dla wygody
  if (digitalRead(8) == HIGH && przyciskON) { // sprawdzamy czy przycisk został puszczony by petla nie działała w kolko przy trzymaniu przycisku
    przyciskON = false; // zmiana przyciskON na false by odznaczyc ze przycisk puszczono i cykl można zacząć od nowa
 }
  }

Coś powinienem poprawić? Wszystko działa

  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

6 minut temu, PanMajster napisał:

Coś powinienem poprawić?

Jeśli ma być idealnie to możesz popracować nad wcięciami w kodzie - to estetyka, ale ważna. U Ciebie wcięcia są zrobione trochę chaotycznie - szczególnie na końcu (chyba, że to podczas wklejania na forum coś się pozmieniało). 

Link do komentarza
Share on other sites

1 godzinę temu, PanMajster napisał:

Fotorezystory podłączyłem poprzez dzielnik napięcia. Czy można to zrobić bez dzielnika?

Podłączyć można, ale czemu ma to służyć?

Link do komentarza
Share on other sites

@PanMajster dzielnik napięcia jest tutaj konieczny, bo Arduino inaczej nie zmierzy zmian oporności - dzielnik napięcia pozwala zamienić zmiany rezystancji na zmiany napięcia i sprawdza się tutaj doskonale. Dobry wybór 🙂 

Link do komentarza
Share on other sites

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

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.