Skocz do zawartości
Waldy

EHR - ATtiny84 sterujące rozdzielaczem hydraulicznym

Pomocna odpowiedź

Straszliwie to skomplikowałeś. Jeśli nie chcesz zastosować jakiegoś gotowca z biblioteki (co miałoby sens, bo są proste, sprawdzone i możesz wybrać jaki chcesz) musisz zastosować debouncing oddzielnie dla każdego przycisku, nie możesz mieć żadnych wspólnych zmiennych.

Najprostszą metodą jest po prostu zapamiętanie sobie kiedy zmienił się stan przycisku i nie reagowanie na zmiany przez ileś tam milisekund. Czyli dla każdego przycisku musisz mieć dwie zmienne: poprzedni stan i czas zmiany.

Coś w stylu:

/* zmienne globalne */
bool keyG, keyD;
uint32_t changeTimeG, changeTimeD;


/* sprawdzenie czy klawisz jest wciśnięty */
if (millis() - changeTimeG > delayTime) { /* upłynął czas braku reakcji */
  bool stan = digitalRead(PIN_G);
  if (stan != keyG) {
    keyG = stan;
    changeTimeG = millis();
  }
}

/* i tak dalej dla drugiego klawisza */
/* można oczywiście prościej bez zmiennej stan, ale to mniej czytelne */

if (millis() - changeTimeD > delayTime) {
  if (digitalRead(PIN_D) != keyD) {
    keyD = !keyD;
    changeTimeD = millis();
  }
}
    

/* teraz będziesz mógł użyć keyG i keyD w warunku sprawdzenia naciśnięcia klawisza */

if (!keyG) { // naciśnięty klawisz "w górę"
  ...

Radzę jednak użyć jakiejś biblioteki - ponowne wynajdywanie koła pozostawmy maniakom uważającym, że biblioteki Arduino są złe i na pewno potrafią napisać lepiej 🙂

 

Udostępnij ten post


Link to post
Share on other sites

Zgadza się biblioteka była by bardzo wygodna. Spróbowałem użyć chyba dość popularnej Bounce2 ale nie kompiluje mi się program. Nawet jak zaimportuje samą bibliotekę 

#include <Bounce2.h>   to już mam błąd kompilacji. Może to wina prehistorycznej wersji jaką używam czyli  1.0.6.  Kiedyś dawno temu jak używałem obecnej wersji to chyba było 1.6.1 już dokładnie nie pamiętam  też coś robiłem  ale na attiny85 i miałem podobnie błędy kompilacji i na forum arduino wspomnieli coś o niejakim "avrdude" że po wersji 1.0.6 że jest jakiś inny i bardziej dedykowany do zestawów arduino(gotowych płytek) a niekoniecznie do samych AVR-ów. Może te attiny mają coś takiego w sobie że nie zawsze chcą współpracować.  No ale to już tak poza tematem. Poniżej błąd który się wyświetla podczas nieudanej kompilacji może komuś coś to podpowie i uda się temu coś zaradzić na przyszłość:

In file included from D:\arduino-1.0.6\arduino-1.0.6\hardware\arduino\cores\arduino/Stream.h:26,
                 from D:\arduino-1.0.6\arduino-1.0.6\hardware\arduino\cores\arduino/HardwareSerial.h:28,
                 from D:\arduino-1.0.6\arduino-1.0.6\hardware\arduino\cores\arduino/Arduino.h:215,
                 from C:\Users\nado2\Documents\Arduino\libraries\Bounce2\src/Bounce2.h:39,
                 from Projekt_EHR_wersja_1.ino:1:
D:\arduino-1.0.6\arduino-1.0.6\hardware\arduino\cores\arduino/Print.h:32:1: warning: "BIN" redefined
In file included from d:/arduino-1.0.6/arduino-1.0.6/hardware/tools/avr/lib/gcc/../../avr/include/avr/iotn84.h:38,
                 from d:/arduino-1.0.6/arduino-1.0.6/hardware/tools/avr/lib/gcc/../../avr/include/avr/io.h:290,
                 from d:/arduino-1.0.6/arduino-1.0.6/hardware/tools/avr/lib/gcc/../../avr/include/avr/pgmspace.h:82,
                 from D:\arduino-1.0.6\arduino-1.0.6\hardware\arduino\cores\arduino/Arduino.h:27,
                 from C:\Users\nado2\Documents\Arduino\libraries\Bounce2\src/Bounce2.h:39,
                 from Projekt_EHR_wersja_1.ino:1:
d:/arduino-1.0.6/arduino-1.0.6/hardware/tools/avr/lib/gcc/../../avr/include/avr/iotnx4.h:71:1: warning: this is the location of the previous definition
In file included from Projekt_EHR_wersja_1.ino:1:
C:\Users\nado2\Documents\Arduino\libraries\Bounce2\src/Bounce2.h: In constructor 'Bounce::Bounce(uint8_t, long unsigned int)':
C:\Users\nado2\Documents\Arduino\libraries\Bounce2\src/Bounce2.h:161: error: type 'Bounce' is not a direct base of 'Bounce'
Projekt_EHR_wersja_1.ino: In function 'void loop()':
Projekt_EHR_wersja_1.ino:38: warning: statement has no effect
Projekt_EHR_wersja_1.ino:41: warning: statement has no effect

 

Udostępnij ten post


Link to post
Share on other sites

Wywal to 1.0.6 do kosza, zainstaluj najnowsze 1.8.10 i MiniCore do ATtiny (ew. MicroCore do ATtiny13).

Swoją drogą ja jako stary leń robiłbym to na Arduino Pro Mini, ale to już kwestia gustu.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Fajnie by było jakby kolego zaczął może po kolei. Schemat hydrauliczny układu, jakim zaworem/zaworami chcesz sterować? Ogólnie SHR to skomplikowany układ, mniemam że oparty o zawory proporcjonalne, więc słabo tu widzę ATTiny i jakiś, mniemam 5 drogowy zawór. Załóżmy że wypozycjonujesz siłownik, i jak go chcesz w tej pozycji utrzymać?

Szukając po sieci co w środku piszczy, jest tez elektryczne EHR.

 

Edytowano przez BlackJack

Udostępnij ten post


Link to post
Share on other sites

Bardzo dobre pytanie Pan zadał. To zacznę od samego początku pewna osoba z rodziny zapytała mnie czy jestem w stanie spróbować zrobić proste sterowanie do rozdzielacza hydraulicznego. Koncepcja była dość prosta aczkolwiek wtedy mi się taka wydawała mianowicie zadaje pozycję i klikam odpowiedni przycisk i w zależności jaki wybrałem przycisk i zadaną pozycję "ramię" idzie albo do góry albo na dół i zatrzymuje się po osiągnięciu danej pozycji. W projekcie ma zostać użyty taki rozdzielacz hydrauliczny. Z jego opisu wydaje mi się że cewki działają zero-jedynkowo no chyba że się mylę.  Projekt jest puki co niskobudżetowy bo nie wiemy jaki będzie efekt finalny dlatego na dzień dzisiejszy planowane jest użycie "zwykłego" aczkolwiek odpornego potencjometru obrotowego w roli czujnika.Bo uważam że jeśli projekt się uda i będzie to "jakoś" działało to wtedy można użyć czegoś lepszego w celu poprawienia np. dokładności działania. Co do schematu hydraulicznego to nie jestem w stanie odpowiedzieć na to pytanie. Wiem że jest to ciągnik Belarus i pewnie ta osoba ma koncepcje jak się wpiąć z tym rozdzielaczem pod układ hydrauliki maszyny. Zbudowałem nawet pewien układ w oparciu o wzmacniacz który pełnił rolę komparatora  co prawda testowałem na diodach ale nie byłem do końca zadowolony jego działania ale podstawowe założenia spełniał, dlatego też pomyślałem że może warto by było wykorzystać do tego mikrokontroler, wybór padł na attine nie wiem czy to dobrze czy źle,to też zacząłem od najtrudniejszej dla mnie kwestii, próby napisania kodu. A z racji że nie obcuje z "pisaniem programów" na co dzień, raczej bardzo bardzo rzadko co zresztą pewnie widać. Za to wykonanie układu(elektroniki) sterowania tego rozdzielacza raczej nie będzie  stanowiło dla mnie problemu. 

Udostępnij ten post


Link to post
Share on other sites

Z tego co się orientuję w sprawach hydrauliki, to ten typ zaworu, spokojnie to obsłuży. Nie ma też problemu z utrzymaniem siłownika w zadanej pozycji, bo jak nie zasilasz żadnej cewki, to olej nie ma jak spłynąć/dopłynąć. Natomiast zrobienie na nim płynnej regulacji prędkości posuwu, może okazać się niemożliwe (duty = 100%), ale to w sumie upraszcza układ sterujący od strony elektroniki. Od strony sprzętowej warto pomyśleć o tym, aby nie było możliwe podanie 1 na obie cewki naraz. (sterowanie DIR- kierunek, EN-praca)
Co do pozycjonowania, cóż dobry potencjometr, w sensie hermetyczny, o odpowiedniej wielkości osi i wytrzymałości mechanicznej, aby dało się to sensownie montować na wale, może spokojnie kosztować 150zł!? 😕  Za te pieniądze można chyba już szukać gotowego zadajnika 0-10V lub lepiej 4-20mA, co rozwiązuje w pewnym sensie problem kalibracji, bo mają zazwyczaj programowalne ZERO i Zakres.

Ogólnie jest tu parę rzeczy które należy sobie najpierw rozeznać, a potem dobrać sobie procesor, i idę układu.

 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Witam,mały update tematu na chwilę obecną mam coś takiego:

#include <Bounce2.h>


#define potencjometr A1       // potencjometr ustawiający pozycję
#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ół

Bounce debouncer = Bounce();

void setup() {
  
  pinMode(potencjometr,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);
  
  debouncer.attach(przyciskg);
  debouncer.attach(przyciskd);
  debouncer.interval(60);
}
 void loop() {
   
 // debouncing przycisków góra/dół
  
   debouncer.update();
   
  int stanG = debouncer.read();
  if(stanG ==LOW) {
    przyciskg == LOW;
  }
    else {
      przyciskg == HIGH;
    }
   int stanD = debouncer.read();
   if( stanD == LOW) {
    przyciskd == LOW; 
   }
    else {
      przyciskg == HIGH;
    }

 
  int pozycja = analogRead(czujnik);         //odczyt pozycji czujnika 
  //pozycja = map(pozycja,0,360,0,1023);
  
  int sterowanie =analogRead(potencjometr); //odczyt potencjometru do ustawiania pozycji 

  int hist = 5; //histereza 
  
  // za_nisko = pozycja < sterowanie - hist
  // za_wysoko = pozycja > sterowanie + hist 
  
  int jazda=0;
  
   if (przyciskg == LOW) {       //wcisnięty przycisk w górę
   if (pozycja < sterowanie - hist) 
   jazda = 1;                                 // do góry      
   }
   
   if(przyciskd == LOW ) {      //wcisnięty przycisk w dół
   if (pozycja > sterowanie + hist) 
     jazda = -1;                               // w dół    
   }
 
     
   if (jazda > 0) {
     
   digitalWrite(cewkag,HIGH);
   digitalWrite(DG,HIGH);
   
   digitalWrite(cewkad,LOW);
   digitalWrite(DD,LOW);
}

   else if (jazda < 0) {
   digitalWrite(cewkag,LOW);
   digitalWrite(DG,LOW);
   
   digitalWrite(cewkad,HIGH);
   digitalWrite(DD,HIGH);
}

   else {
   digitalWrite(cewkag,LOW);
   digitalWrite(DG,LOW);
   
   digitalWrite(cewkad,LOW);
   digitalWrite(DD,LOW);
}
 }

Poskładałem wszystko na płytce stykowej,wgrałem kod do ATtiny jednak po ustawieniu pozycji sterowania większej niż ustawienie czujnika  i wciśnięciu przycisku  nic się nie dzieje tak jakby nie został spełniony warunek,pytanie dlaczego ? Następne pytanie czy funkcja  debouncer.update();  może obsługiwać więcej niż jeden przycisk ?  

Udostępnij ten post


Link to post
Share on other sites

Bo próbujesz podłączyć dwa przyciski do debouncera, który obsługuje jeden. Raczej ciężko do jednej zmiennej przypisać dwie wartości...

Masz w przykładach biblioteki biounce2buttons. /usunięto fragment niezgodny z PPF/

  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites

Poprawiłem debouncera na dwa przyciski sugerując się przykładem z biblioteki ale to nic nie dało. Jak również dla testu wyrzuciłem wszystko związane z debouncingiem z kodu i po wgraniu programu i zaaplikowaniu na płytce podpiąłem bezpośrednio przewód od masy  do odpowiedniej nóżki na której wystawiony jest stan wysoki(INPUT_PULLUP) i też nic się nie dzieje ustawiając odpowiednio potencjometry. Próbowałem obydwa warunki wstawić do jednego ifa np:  ((przyciskg == LOW) &&(pozycja < sterowanie - hist)) - też nic. Jak również wykluczyć zmienną "jazda" i bezpośrednio pod ifami dodałem to co ma się wykonać - ponownie zero reakcji. Wgrałem ponownie bootloadera dla ATtiny84. Zmieniałem też piny definiując inne... Mimo tego po wgraniu sketcha mikrokontroller dobrze wystawia stany wysokie na zdefiniowanych pinach,myślałem że może się jakoś uszkodził ?  Pierwotny kod poniżej proszę o analizę poprawności w celu wykluczenia program bądź controllera a może trzeba jakoś inaczej zdefiniować warunek albo porównanie potencjometrów ?. Pozdrawiam W. 

#include <Bounce2.h>


#define potencjometr A1       // potencjometr ustawiający pozycję
#define czujnik A2            // potencjometr -czujnik
#define DG 7                  // dioda do góry
#define DD 6                  // dioda na dół
#define przyciskg 3           // przycisk do góry
#define przyciskd 4         //przycisk na dół
#define cewkag 5              //cewka rozdzielacza do góry
#define cewkad 8            //cewka rozdzielacza na dół

Bounce debouncerG = Bounce();
Bounce debouncerD = Bounce();

void setup() {
  
  pinMode(potencjometr,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);
  
  debouncerG.attach(przyciskg);
  debouncerG.interval(60);
  
  debouncerD.attach(przyciskd);
  debouncerD.interval(60);


}
 void loop() {
   
 //debouncing przycisków góra/dół
  
   debouncerG.update();
   debouncerD.update();
   
  int stanG = debouncerG.read();
  int stanD = debouncerD.read();
  
  if(stanG == LOW) {
    przyciskg == LOW;
  }
    else {
      przyciskg == HIGH;
    }
   
   if( stanD == LOW) {
    przyciskd == LOW; 
   }
    else {
      przyciskg == HIGH;
    }

 
  int pozycja = analogRead(czujnik);         //odczyt pozycji czujnika 
  //pozycja = map(pozycja,0,360,0,1023);
  
  int sterowanie =analogRead(potencjometr); //odczyt potencjometru do ustawiania pozycji 

  int hist = 5; //histereza 
  
  // za_nisko = pozycja < sterowanie - hist
  // za_wysoko = pozycja > sterowanie + hist 
  
   int jazda =0;
 
   if (przyciskg == LOW) {                //wcisnięty przycisk w górę
   if (pozycja < sterowanie - hist) 
     jazda = 1;                                                                     
   }
   
    if (przyciskd == LOW ) {            //wcisnięty przycisk w dół
    if(pozycja > sterowanie + hist) 
     jazda = -1;    
   }
   
   if (jazda > 0) {
     
   digitalWrite(cewkag,HIGH);
   digitalWrite(DG,HIGH);
   
   digitalWrite(cewkad,LOW);
   digitalWrite(DD,LOW);
}

   else if (jazda < 0) {
   digitalWrite(cewkag,LOW);
   digitalWrite(DG,LOW);
   
   digitalWrite(cewkad,HIGH);
   digitalWrite(DD,HIGH);
}
    
   else {
   digitalWrite(cewkag,LOW);
   digitalWrite(DG,LOW);
   
   digitalWrite(cewkad,LOW);
   digitalWrite(DD,LOW);
}
 }

 

 

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Program powinien działać - co prawda nie powinno się deklarować pinów analogowych jako INPUT ale nie powinno to przeszkadzać.

No to teraz pokaż wszystko - wersja Arduino IDE, jaki pakiet płytek, jaka płytka wybrana. Ja w programie żadnego błędu nie widzę, ale może ktoś jeszcze rzuci okiem?

Spróbuj tego pakietu (u mnie działa, przynajmniej na ATtiny85, na 84 nie próbowałem): https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json

Edytowano przez ethanak
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Myślę że tak będzie najszybciej:

 

aaa.png

Pakiet płytek mam taki:

ATTinyCore - ATtiny 25/45/85, 24/44/84, 261/461/861, 48/88, 2313/4313, 87/167, 441/841, 1634, 828

Edytowano przez Waldy

Udostępnij ten post


Link to post
Share on other sites

No to muszę przyznać że zgłupiałem... jedno co mi przychodzi do głowy to niedziałający ADC.

Spróbuj tego pakietu z poprzedniego maila (bez żadnych bootloaderów).

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Podczas użycia proponowanej biblioteki wyskakuje błąd avrdude :

avrdude: Version 6.3, compiled on Feb 17 2016 at 09:25:53
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch

         System wide configuration file is "D:\Arduino\arduino-1.8.9\hardware\tools\avr/etc/avrdude.conf"
avrdude: error at D:\Arduino\arduino-1.8.9\hardware\tools\avr/etc/avrdude.conf:1133: programmer type jtagice3_updi not found
avrdude: error reading system wide configuration file "D:\Arduino\arduino-1.8.9\hardware\tools\avr/etc/avrdude.conf"
avrdude: error reading system wide configuration file "D:\Arduino\arduino-1.8.9\hardware\tools\avr/etc/avrdude.conf"

Może to mieć wpływ na zaistniałą sytuację ? Może pokrótce : podczas przejścia ze 1.0.6 na 1.8.9 miałem problem z nie wykrywaniem programatora USBasp mimo tego że w menadżerze urządzeń był widoczny. Znalazłem temat na naszym forum i zastosowałem się do wskazówek, przeinstalowałem sterowniki i podmieniłem plik avrdude.exe  z wersji 6.3. Spróbuje pobrać jeszcze raz nowe arduino 1.8.10 i zobaczymy.

Udostępnij ten post


Link to post
Share on other sites

Na czystej wersji 1.8.10 używając powyższej biblioteki sketcha wgrało ale oczekiwanego efektu nie ma...Obmierzyłem nawet potencjometry pod względem podawanego napięcia,oporności i wartości ADC 0 -1024(tutaj użyłem promini) no i są ok.  Znalazłem w swoich czeluściach jakąś atmege8 ,attiny4313 i 2313 jutro spróbuje coś z tymi scalakami pokombinować.

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