Skocz do zawartości
Waldy

EHR - ATtiny84 sterujące rozdzielaczem hydraulicznym

Pomocna odpowiedź

Na wstępie witam wszystkich użytkowników 🙂 Pytanie może wydawać się banalne ale już dłuższy czas nie miałem do czynienia ze środowiskiem arduino a mam tak że jak nie korzystam dłuższy czas z "czegoś" to pewne rzeczy się zapomina. Ale do rzeczy. Planuje wykonać jak w temacie prosty podnośnik,jako czujnik pozycji chce wykorzystać potencjometr liniowy 10kohm(ta opcja wydaje mi się dość sensowna ze względu na relatywnie dobrą wytrzymałość ale jeszcze nie miałem takowego urządzenia także to tylko moje domysły) a do sterowania góra/dół zwykły potencjometr podwójny 10kohm. Układ który będzie wykorzystany to mikrokontroler  ATtiny84. Planuję "porównywać" wartości ADC z potencjometru ustawiającego pozycję do wartości czujnika i na tej podstawie odpowiednio sterować cewkami rozdzielacza hydraulicznego. Poniżej kod programu(jeszcze nie skończony) :

#define up A0 //potencjometr do góry
#define down A1  // potencjometr na dół
#define czujnik A2 // potencjometr -czujnik
#define DG 3 // dioda do góry
#define DD 4 // dioda na dół
#define przyciskg 6 // przycisk do góry
#define przyciskd 7 //przycisk na dół
#define cewkag 5 //cewka rozdzielacza do góry
#define cewkad 8 //cewka rozdzielacza na dół

void setup() {
  pinMode(up,INPUT);
  pinMode(down,INPUT);
  pinMode(czujnik,INPUT);
  pinMode(przyciskg,INPUT_PULLUP);
  pinMode(przyciskd,INPUT_PULLUP);
  pinMode(DG,OUTPUT);
  pinMode(DD,OUTPUT);
  pinMode(cewkag,OUTPUT);
  pinMode(cewkad,OUTPUT);
  digitalWrite(cewkag,LOW);
  digitalWrite(cewkad,LOW);
  delay(100);
  
}
void loop() {
  int val = analogRead(czujnik); //odczyt pozycji czujnika
  val= map(val,0,1023,0,255);
  
  int valg =analogRead(up); //odczyt potencjometru pozycji do góry
  valg= map(valg,0,1023,0,255);
  
  //int vald =analogRead(down);
 // vald =map(vald,0,1023,255,0);
  
  int hist = 3; //histereza 
  
  if((digitalRead(przyciskg)==LOW)&&(val < valg+hist)) { 
    digitalWrite(cewkag,HIGH); //wysterowanie cewki
    digitalWrite(DG,HIGH);    // dioda sygnalizująca podnoszenie
    
}}
 //if(digitalRead(przyciskd)=LOW)&(val 

 I tutaj moje pytanie. Chodzi mi o warunek w "Ifie" czy jest dobrze sformułowany ? Czy podczas ustawienia odpowiedniej pozycji potencjometru sterującego i wyzwoleniu przycisku wyzwoli cewkę i diodę sygnalizującą podnoszenie  tak długo aż czujnik pokryję się z wartością adc potencjometru strojącego uwzględniając histerezę i zmieni stan na niski ? Czy może czegoś nie uwzględniłem albo jest jakiś inny sposób aby zrealizować takowe sterowanie? Za wszystkie sugestie czy też podpowiedzi z góry dziękuję. Pozdrawiam Waldek. 

P.S. Wszystkie potrzebne części są zamówione oprócz potencjometru liniowego - tutaj się jeszcze waham bo jest to dość droga inwestycja a na chwilę obecną nie bardzo wiem czym można było by  go zastąpić z racji tego że planowana maszyna pracuje i się brudzi. 

Udostępnij ten post


Link to post
Share on other sites
47 minut temu, Waldy napisał:

Chodzi mi o warunek w "Ifie" czy jest dobrze sformułowany ?

Warunek to pewnie tak, ale...

47 minut temu, Waldy napisał:

Czy podczas ustawienia odpowiedniej pozycji potencjometru sterującego i wyzwoleniu przycisku wyzwoli cewkę i diodę sygnalizującą podnoszenie  tak długo aż czujnik pokryję się z wartością adc potencjometru strojącego uwzględniając histerezę i zmieni stan na niski ?

Nie - nie masz nigdzie polecenia zmiany stanu na niski.

Przy okazji:

Po co mapujesz zakres analogRead na 0..255, jeśli używasz go tylko do porównania z drugim takim samym?

Po co potencjometr podwójny?

Dlaczego wszystko na siłę chcesz upchać do jednego ifa? Co powiesz na konstrukcję w stylu:
 

int8_t jazda;
if (przycisk_wciśnięty()) {
   if (za_nisko()) jazda = 1; // do góry
   else if (za_wysoko()) jazda = -1; // w dół
   else jazda = 0; // stop
   }
else { // przycisk puszczony
   jazda = 0; // nigdzie nie jedziemy
}

if (jazda > 0 {
   włącz_cewkę_i diodę_A();
   wyłącz_cewkę_i diodę_B();
}
else if (jazda < 0) {
   wyłącz_cewkę_i diodę_A();
   włącz_cewkę_i diodę_B();
}
else {
   wyłącz_cewkę_i diodę_A();
   wyłącz_cewkę_i diodę_B();
}

 

Udostępnij ten post


Link to post
Share on other sites
56 minut temu, Waldy napisał:

tutaj się jeszcze waham bo jest to dość droga inwestycja a na chwilę obecną nie bardzo wiem czym można było by  go zastąpić

np. enkoderem. trzeba będzie tylko ustalić odpowiedni skok w zależności od potrzebnej rozdzielczości i dokładności pozycjonowania.  Najlepiej pobawić się arduino na "sucho" np. na diodach. Błędy wychodzą w praniu, jakieś tam pojęcie masz więc sobie poradzisz.

Udostępnij ten post


Link to post
Share on other sites

Panie ethanak:

Cytat

Po co mapujesz zakres analogRead na 0..255, jeśli używasz go tylko do porównania z drugim takim samym?

Słuszna uwaga w zasadzie mapowanie nie ma tutaj sensu - pewnie kwestia przyzwyczajenia. Jeszcze jedno zapytanie do wypowiedzi, rozumiem że w przedstawionym przez Pana kodzie w miejsce " za_nisko" /"za_wysoko"  wstawiam swoje porównanie czujnika do potencjometru sterującego tak ? Czy błędnie to rozumiem ?  Sterowanie jest tutaj realizowane jednym przyciskiem ? Po za tym kod wydaje się bardzo przystępny - dziękuje za sugestie 😉

Cytat

np. enkoderem. trzeba będzie tylko ustalić odpowiedni skok w zależności od potrzebnej rozdzielczości i dokładności pozycjonowania.  Najlepiej pobawić się arduino na "sucho" np. na diodach. Błędy wychodzą w praniu, jakieś tam pojęcie masz więc sobie poradzisz.

Tutaj jeszcze zapytanie odnoście enkodera,czy jest on odporny na warunki atmosferyczne ? Wybaczcie że nie sprecyzowałem na początku ta maszyna to ciągnik/traktor a taki czasami bywa myty prosto z węża jak to się mówi,wiadomo że zabezpieczyło by się to jakąś puszczą ale połączenie z ruchomym "wałem" zawsze jako tako zostaje nieuszczelnione. 

Udostępnij ten post


Link to post
Share on other sites
6 minut temu, Waldy napisał:

w miejsce " za_nisko" /"za_wysoko"  wstawiam swoje porównanie czujnika do potencjometru sterującego tak ?

Coś w tym rodzaju. Na przykład "za nisko" to podnośnik jest niżej niż ustawienie minus histereza, ale równie dobrze może być to coś bardziej skomplikowanego. Tak samo przycisk jest ważny, ale np. można przełączyć całą maszynerię na zewnętrzne sterowanie (o ile wiem EHR-y mają taką możliwość, jakaś wajcha czy klawiatura na błotniku) i wtedy dochodzi jeszcze jeden warunek przed tym całym ifem. Chodzi o to, że możemy sobie w ustawiać zmienna "jazda" jak chcemy, a dopiero na końcu, gdy jest już ustawiona, na jej podstawie włączamy/wyłączamy cewki, diody czy cokolwiek.

13 minut temu, Waldy napisał:

Wybaczcie że nie sprecyzowałem na początku ta maszyna to ciągnik/traktor

Nie jesteś tutaj pierwszy co kombinuje z EHR-em 🙂 A nawet gdyby, to pierwszy wynik z googla.

A tak w ogóle

14 minut temu, Waldy napisał:

Panie ethanak:

...to w internecie przyjęło się używać formy "Ty", zostawiając "Pana" wszelkiej maści snobom.

Udostępnij ten post


Link to post
Share on other sites

Tak,myślałem odnośnie dodatkowych przycisków na np błotniku ale w nieco inny sposób. Przyciski wyzwalały by bezpośrednio cewki a wyjścia z domniemanego "sterownika" zabezpieczone były by odpowiednio diodami prostowniczymi. Myślę że to by nie komplikowało działania kodu pod warunkiem że dana osoba nie sterowała by podnośnikiem naraz z panelu i przycisku. W zasadzie to jest jeszcze to przemyślenia. 

Udostępnij ten post


Link to post
Share on other sites
Przed chwilą, Waldy napisał:

Myślę że to by nie komplikowało działania kodu

Akurat ja też sobie o tym pomyślałem i wyszło mi coś takiego:

Zakładam istnienie przełącznika, który włącza sterowanie na błotniku (joystick lub dwa klawisze), na razie bez krańcówek (o tym pogadamy jeśli Ci się pomysł spodoba):

if (przełączono_na_błotnik) {
  if (wciśnięty_dół) jazda = -1;
  else if (wciśnięta_góra) jazda = 1;
  else jazda = 0;
}
else if (przycisk_wcisniety()) { // dalej jak poprzednio

I zaczyna to przypominać coś bardziej użytecznego 🙂

Udostępnij ten post


Link to post
Share on other sites

Ciekawy pomysł,co do krańcówek do pierwsza rzecz jaka przeszła mi przez myśl to coś na zasadzie  przerwań ale chyba wyobraźnia mnie poniosła za daleko 😄 Puki co jest to odległy temat,najpierw muszę ogarnąć podstawowy kod i przeanalizować jego działanie. 

Mam jeszcze pytanie czy ktoś z Państwa spotkał się z takowym czujnikiem,na pierwszy rzut oka wydaje się być idealny to zastosowania w danym projekcie:

czujnik

Pozdrawiam 😉 

Udostępnij ten post


Link to post
Share on other sites

Kolejne pytanie na dzisiaj,chodzi o INPUT_PULLUP - jest to programowa eliminacja drgań styków. Czy ta opcja jest głównie dedykowana do microswitchów ? Czy poradzi sobie z tym przełącznikiem

Przełącznik

Choć z tego co pamiętam kiedyś używałem jej do przełącznika "dzwigienkowego" i nic złego się nie działo no ale to już jest dość duży przełącznik stąd moje pytanie ? Bo eliminacja drgań sprzętowa nie jest trudna także nawet z ciekawości chciałbym wiedzieć ^^. 

Udostępnij ten post


Link to post
Share on other sites
32 minuty temu, Waldy napisał:

Kolejne pytanie na dzisiaj,chodzi o INPUT_PULLUP - jest to programowa eliminacja drgań styków.

Nie, nie jest to programowa eliminacja drgań styków i nie ma z nią nic wspólnego, jak również z microswitchami. INPUT_PULLUP to po prostu podłączenie wewnętrznego rezystora podciągającego (jak sama nazwa wskazuje) po to, aby przycisk czy przełącznik w ogóle działał.

Uprzedzając pytanie: tak, programowa eliminacja drgań styków (tzw. debouncing) doskonale sobie poradzi z tym przełącznikiem. Z ciekawości: do czego chcesz go uzyć?

Udostępnij ten post


Link to post
Share on other sites

Do wyżej wymienionego projektu. Na samym początku tematu są zdefiniowane dwa przyciski (przyciskg i przyciskd) analogicznie wykorzystał bym odpowiednie zwarcie styków przycisku tak jak odpowiadają jego strzałki. Przycisk jest podręczny jeśli można tak to ująć i wydaje mi się odpowiedni do tego celu.

Zmieniłem trochę kod pod ten przycisk:

 if (digitalRead(przyciskg == LOW)) {       //wcisnięty przycisk w górę
   if (pozycja < sterowanie - hist) 
   jazda = 1;                                 // do góry      
   else {
     jazda =0;                                //stop
   }
   if(digitalRead(przyciskd == LOW )) {      //wcisnięty przycisk w dół
   if (pozycja > sterowanie + hist) 
     jazda = -1;    

I tutaj mam zapytanie jak to rozumieć ? Warunkiem głównym jest wciśnięcie przycisku i jak rozumieć tego drugiego ifa? Jeżeli jest wciśnięty przycisk i jeżeli podczas wciśnięcia tego przycisku występuje porównanie dwóch "zmiennych" to jest wystawiana odpowiednia wartość analizowana na podstawie tego porównania ? Dobrze to rozumiem czy na około ? 

Udostępnij ten post


Link to post
Share on other sites

Czekaj moment. Wyjaśnijmy sobie parę spraw. Przede wszystkim:

2 minuty temu, Waldy napisał:

Zmieniłem trochę kod pod ten przycisk:

(ciach kod, ponieważ)

2 minuty temu, Waldy napisał:

I tutaj mam zapytanie jak to rozumieć ?

Nie chcę być posądzony o niegrzeczność, ale czyżbyś nie rozumiał własnego kodu?

No i druga sprawa.

Czy to ma działać w ten sposób:

Jeśli wciśnięty jest "do góry" to podnośnik jedzie do góry aż osiągnie wartość zadaną potencjometrem.

Jeśli wciśnięty jest "do dołu" to podnośnik jedzie do dołu aż osiągnie wartość zadaną potencjometrem.

Trochę to dziwne, bo poprzednio było:

Jeśli przycisk jest wciśnięty, podnośnik jedzie aż osiągnie wartość zadaną potencjometrem sam ustalając kierunek.

Zdecyduj się.

Udostępnij ten post


Link to post
Share on other sites

Obydwie opcje są fajne ale pierwotnie chcę aby to działało tak:

Cytat

Jeśli wciśnięty jest "do góry" to podnośnik jedzie do góry aż osiągnie wartość zadaną potencjometrem.

Jeśli wciśnięty jest "do dołu" to podnośnik jedzie do dołu aż osiągnie wartość zadaną potencjometrem.

Ponieważ wydaje mi się to bardziej "roboczą" opcją.

Udostępnij ten post


Link to post
Share on other sites

Trochę to dziwne... w sumie wyłączasz automatykę... ale to już Twoja sprawa.

Pisałeś:

39 minut temu, Waldy napisał:

Warunkiem głównym jest wciśnięcie przycisku i jak rozumieć tego drugiego ifa?

Ale przecież teraz zrobiłeś dwa przyciski, no to i dwa ify by się przydały...

Przy okazji: jeśli tak komplikujesz sprawę, możesz uprościć jedną rzecz, mianowicie nadać zmiennej "jazda" wartość początkową zero. Wtedy nie musisz się martwić co się stanie, jeśli warunek nie zostanie spełniony.

No i nie pchaj digitalRead() bezpośrednio do ifa, jakiś debouncing by się tu przydał.

Czyli taki kawałek (pseudo)kodu:

//coś w stylu:
int przycisk = co_tam_wcisniete_z_uwzglednieniem_debouncingu();
int jazda = 0;
if (przycisk == DO_GORY) {
  if (za_nisko()) jazda = 1;
}
else if (przycisk == DO_DOLU) {
  if (za_wysoko()) jazda = -1;
}

  

Zrozumiały?

 

Udostępnij ten post


Link to post
Share on other sites

No dobrze zrozumiały, dziękuję za poradę 🙂

Z eliminacji drgań mam coś takiego:

unsigned long lastDebounceTime =0;
unsigned long debounceDelay = 60;     // wartość "na oko" 

 int stan = digitalRead(przyciskg);    //przypisanie zmiennej do odczytu przycisku
  int stan1 = digitalRead(przyciskd);
  
  if (stan != HIGH); {                   // jeżeli wykryto zmianę uruchamiam millisa
  lastDebounceTime = millis();
  }
  if ((millis() - lastDebounceTime) > debounceDelay) {   // po upływie założonego czasu ponownie sprawdzam stan przcisku
    if (stan != HIGH) {
      przyciskg == LOW;                                  // jeśli się zgadza z oczekiwanym wystawiam stan niski na przycisk 
    }
     else  {
       stan == HIGH;
     }
  }

 

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...