Skocz do zawartości

Kurs Arduino - #6 - kontynuacja UART, serwomechanizmy


Pomocna odpowiedź

(edytowany)
#include <Servo.h>

#define zielona 9
#define zolta 8

Servo serwo;
byte pozycja = 0; ///obecna pozycja rączki ścierwa
int pozycjapoprzednia = 0; // rónica pozycji rączki ścierwa
int min = 0; /// Kalibracja MIN
int max = 1023; /// Kalibracja MAX
bool mincalib = false; ///Czy była kalibracja MIN?
bool maxcalib = false; ///Czy była kalibracja MAX?

unsigned long czasStart = 0; /// Liczenie czasu kalibracji


void setup() {
serwo.attach(11);
Serial.begin(9600);
pinMode(zielona,OUTPUT); /// Dioda informująca o sukcesie kalibracji
pinMode(zolta,OUTPUT); ///Dioda informująca o trwającej kalibracji 
}

void loop() {

int odczyt = analogRead(A3);
pozycja = map(odczyt,min,max,0,180); /// Mapowanie odczytu FOTOREZYSTORA do SERWO wg MIN/MAX

if (abs(pozycja-pozycjapoprzednia) > 5) { /// Ustalenie odchyłu zmiany pozycji serwa
  serwo.write(pozycja);
  pozycjapoprzednia = pozycja;
}

if(mincalib == false) { /// KALIBROWANIE MIN Jezeli jeszcze nie było
  if(odczyt < 200) { /// Załozylem ekstremum celowej kalibracji
    if(czasStart == 0) czasStart = millis(); /// Jezeli jeszcze nie ma odliczania to startujemy zegar
    Serial.print(" KALIBRRACJA MIN \n Odczyt: ");
    Serial.print(odczyt);
    Serial.print("\t Min: ");
    Serial.print(min);
    Serial.println();
    digitalWrite(zolta,HIGH);
    int nowyOdczyt = analogRead(A3); ///Odczyt roboczy FOTO
    if(nowyOdczyt < 200) { /// Jezeli odczyt się utrzymuje ponizej 200
      if((millis() - czasStart)>=5000) { /// Jezeli minelo 5 sekund
      min = nowyOdczyt; /// KALIBRUJEMY nowe minimum
      digitalWrite(zolta,LOW);
      Serial.print("SUKCES KALIBRACJI \t Min: ");
      Serial.print(min);
      Serial.println();
      delay(500);
      digitalWrite(zielona,HIGH);
      delay(500);
      digitalWrite(zielona,LOW);
      delay(500);
      digitalWrite(zielona,HIGH);
      delay(500);
      digitalWrite(zielona,LOW);
      mincalib = true; ///Blokujemy opcja kolejnej kalibracji
      czasStart = 0; /// Resetujemy zegar po sukcesie kalibracji
      }
      }
    }else {
      czasStart = 0; ///Resetujemy zegar po fuckupie kalibracji
      digitalWrite(zolta,LOW);
    }
  }

if(maxcalib == false) {
  if(odczyt > 800) {
    if(czasStart == 0) czasStart = millis();
    Serial.print(" KALIBRRACJA MAX \n Odczyt: ");
    Serial.print(odczyt);
    Serial.print("\t Max: ");
    Serial.print(max);
    Serial.println();
    digitalWrite(zolta,HIGH);
    int nowyOdczyt = analogRead(A3);
    if(nowyOdczyt > 800) { 
      if((millis() - czasStart)>=5000) {
      max = nowyOdczyt;
      digitalWrite(zolta,LOW);
      Serial.print("SUKCES KALIBRACJI \t Max: ");
      Serial.print(max);
      Serial.println();
      delay(500);
      digitalWrite(zielona,HIGH);
      delay(500);
      digitalWrite(zielona,LOW);
      delay(500);
      digitalWrite(zielona,HIGH);
      delay(500);
      digitalWrite(zielona,LOW);
      maxcalib = true;
      czasStart = 0;
      }
    }else {
    czasStart = 0;
    digitalWrite(zolta,LOW);
    }
  }
}

  
Serial.print("Odczyt: ");
Serial.print(odczyt);
Serial.print("\t Min: ");
Serial.print(min);
Serial.print("\t Max: ");
Serial.print(max);
Serial.print("\t Pozycja: ");
Serial.print(pozycja);
Serial.print("\t Czas Start: ");
Serial.print(czasStart);
Serial.println();
delay(1000);


}

Kalibracja 6.3 😄

Przy ekstremalnej wartości (subiektywnie ustawionej na 200- lub 800+), jeżeli przez 5 sekund będzie utrzymywała się wartość, to jednorazowo automatycznie się skalibruje range min/max.

Trochę sie boksowałem i potrzebowałem wsparcia Chata aby użyć millis() 🙂

Wskaźnik miał ładną strzałkę zrobioną z Forbotowej kareczki z kodem ale ją urwałem i zgubiłem podczas przestawiania silnika zeby wskazywał 180o od 0 do 100, zamiast od 50 do uderzenia w stół 😛 

btw

detal - w artykule jest literówka - "autoamtycznej" 🙂

IMG_3518.png

Edytowano przez Kajti
błędy stylistyczne
  • Lubię! 1
  • 5 tygodnie później...

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