• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
"Miarka" na enkoderze inkrementalnym z dodatykowymi funkcjami.
#1
Question 
Witam.


Tworzę hobbistycznie miarkę elektroniczną na enkoderze inkrementalnym z obsługą silnika oraz sterowania elektrozaworem powietrznym z wynikiem który wyświetla się w centymetrach na ekranie.


Mam bardzo dużo ogrodzenia w które chciałbym wpleść taśmy ochronne. Na jedno przęsło przychodzi 6 pasków po 255cm. Z racji tego że cięcie tego i mierzenie ręczne zajmie bardzo dużo czasu postanowiłem stworzyć sobie pomoc.
Wydukałem po ciężkich próbach kod, który działa lecz nie tak jak bym sobie tego życzył.


Moim pomysłem jest po prostu enkoder na którym osadzona jest rolka(kółko miernicze) która kręci się wraz z pociąganiem taśmy. Po osiągnięciu 255cm siłowniki podłączone do elektrozaworu opadną i przytrzymają materiał żebym mógł go równo uciąć i do tej pory wszystko działało jak należy.
Lecz wpadłem na pomysł żeby "maszyna" nawijała sobie bezpośrednio na silnik pasek 255cm siłownik opada, jest cięcie i tak sześć razy.


Po naciśnięciu przycisku "licznik" czeka aż wartość osiągnie 255cm po czym wyłączy przekaźnik sterujący pracą silnika, po zakończonej pracy naciskamy przycisk i cykl zaczyna się od nowa.
Początkowo gdy nie myślałem o zwijaniu tego na silnik to wystarczyło przeciągnąć po stole taśmę, naliczyło 255cm i siłownik opada. Po naciśnięciu przycisku wskazanie licznika się zeruje wraz z tym przekaźnik sterujący cewką elektrozaworu powietrznego rozwiera styki.


Poniżej wkleję funkcję którą wyklepałem, lecz nie spełnia to moich oczekiwań. po zaimplementowaniu tego w kod enkoder zachowuje się jak manetka od motocykla. Czyli kręcąc "do przodu" przekaźnik załącza się z coraz większą szybkością aż do osiągnięcia 255. Dodam, że przy czym kręcąc "do przodu" zwiększa mi się szybkość odświeżania pomiaru a po naciśnięciu i przytrzymaniu przycisku "praca" licznik działa normalnie bez tej funkcji, lecz gdy distance=0 jest straszny lag.
Oczywiście podczas trzymania przycisku gdy zjadę równo na 0.00cm i puszczę przycisk przekaźnik i wynik na ekranie pracuje z częstotliwością ~3s i narasta wraz z wynikiem (nie jestem w stanie tego zrozumieć).
Oto kawałek kodu o który mi chodzi:



Kod:
 
 if (digitalRead(praca) == LOW) {  // jeśli przycisk jest naciśnięty
    distance = 0;                      // zerowanie zmiennej distance
    digitalWrite(silnik, HIGH);      // włączenie przekaźnika
    while (distance < 255) {           // pętla działająca dopóki distance < 255
      distance++;                      // inkrementacja zmiennej distance
      delay(10);                       // opóźnienie
    }
    digitalWrite(silnik, LOW);       // wyłączenie przekaźnika
    delay(100);                       // opóźnienie przed kolejnym naciśnięciem przycisku
  }
Dla jasności całego mojego przekazu wkładam całość kodu:
Kod:
#include <LiquidCrystal_I2C.h> // Biblioteka do magistrali i2c
LiquidCrystal_I2C lcd(0x27, 16, 2);  //inicjalizacja LCD
 
#define outputA 2  //ZEGAR pin

#define outputB 3  //DATA pin

#define rstbtn 8  //RESET WYNIKU

#define silowniki 7    //SIŁOWNIKI pin

#define silnik 9  //SILNIK pin

#define praca 10 // PRACA maszyny

int wartoscprogowa = 255;
int counter = 0;
const float pi = 3.14; // Wartość PI  
const float R = 3.245;  //wymiar kółka od srodka do krawędzi
const int N = 600; //ilość impulsów na jeden obrót enkodera
float distance = 0;
 
void setup() {
  pinMode(silowniki, OUTPUT);
  pinMode(outputA, INPUT_PULLUP);
  pinMode(outputB, INPUT_PULLUP);
  pinMode(rstbtn, INPUT_PULLUP);
  pinMode(silnik, OUTPUT);
  pinMode(praca, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(outputA), readEncoder, FALLING);
  digitalWrite(silnik, LOW);
  digitalWrite(silowniki, LOW);
}

void readEncoder() {      
  int bValue = digitalRead(outputB);
  if (bValue == HIGH) {
    counter++; // enkoder w przod
  }
  if (bValue == LOW) {
    counter--; // enkoder w tyl
  }
}
 
int getCounter() {  
  int result;
  noInterrupts();
  result = counter;
  interrupts();
  return result;
  }
 
void resetCounter() {
  noInterrupts();
  counter = 0;
  interrupts();
}



void loop() {  //wzór i obliczenie impulsy>cm wyplucie wartosci na LCD

 
  distance = ((2*pi*R)/N) * getCounter();
  lcd.setCursor(0, 0);
  lcd.print("RozpocznijPomiar");
  lcd.setCursor(0, 1);
  lcd.print(distance);
  lcd.print("         ");
  lcd.setCursor(5,1);
  lcd.print("CM");

 
 
 
 if (digitalRead(praca) == LOW) {  // jeśli przycisk jest naciśnięty
    distance = 0;                      // zerowanie zmiennej distance
    digitalWrite(silnik, HIGH);      // włączenie przekaźnika
    while (distance < 255) {           // pętla działająca dopóki distance < 255
      distance++;                      // inkrementacja zmiennej distance
      delay(10);                       // opóźnienie
    }
    digitalWrite(silnik, LOW);       // wyłączenie przekaźnika
    delay(100);                       // opóźnienie przed kolejnym naciśnięciem przycisku
  }
  if (distance >= wartoscprogowa)  // Oblsuga siłowników
  {
    digitalWrite(silowniki, LOW);
    lcd.setCursor(8,1);
    lcd.print("Trzymam");
  }
  else
  {
    digitalWrite(silowniki, HIGH);
  }
 
    if (digitalRead(rstbtn) == LOW) {
    resetCounter();
  }
 
 delay(10);
  }



Pozdrawiam serdecznie wszystkich.
 
Odpowiedź
  


Wiadomości w tym wątku
"Miarka" na enkoderze inkrementalnym z dodatykowymi funkcjami. - przez DJAdriano - 09-05-2023, 13:03

Skocz do:


Przeglądający: 1 gości