09-05-2023, 13:03
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:
Dla jasności całego mojego przekazu wkładam całość kodu:
Pozdrawiam serdecznie wszystkich.
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
}
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.