• 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
Stabilizator obrotów silnika spalinowego
#1
Witam
Usiłuję zbudować (jak w temacie) do silnika od Skody (1,4 MPI),
Silnik ten zastosowałem do własnej konstrukcji maszyny ogrodniczej.
Problem wynikł podczas pierwszych prób, gdy się okazało, iż maszyna podczas pracy generuje losowo zmienne obciążenie dla silnika.
Można powiedzieć - chciała by aby dodać gazu a kiedy obciążenie zmaleje - odpuścić.
Po kilku nieudanych próbach mechanicznego "podejścia" (bezwładnościowy/odśrodkowy, klapka nad wentylatorem itp.) podpowiedziano mi, że można to łatwo rozwiązać przy użyciu Arduino i serwa, sterującego bezpośrednio przepustnicą silnika.


Jeszcze nie zacząłem wydawać pieniędzy (reszta maszyny już zeżarła ich sporo) - czytam, czytam, czytam...
Spróbuję podzielić się swoimi dotychczasowymi wnioskami a do Was prośba - jeżeli już gdzieś jest w nich błąd logiczny to poprawcie mnie PRoszę żebym niepotrzebnie nie brnął dalej.

 Myślę że:
-zasilę płytkę Arduino z instalacji "samochodowej" (DC 14,4V) poprzez scalak 7809,
-pobiorę informację o aktualnych obrotach silnika z wbudowanego w nim czujnika Halla,
-podłączę serwo, z tych solidniejszych (np.TowerPro MG-995),
-serwo, za pomocą linki "gazu" bezpośrednio do przepustnicy.

Założenie:
otwieranie/zamykanie przepustnicy w reakcji na odpowiednio spadek/wzrost obrotów silnika.
Fajnie by było żeby reakcja układu była w miarę proporcjonalna (trochę spadły-trochę uchyl przepustnice).
Nie głupio było by jeszcze dodać możliwość ustawienia punktu (obrotów np 2500, np za pomocą potencjometru) do którego układ ma dążyć i utrzymywać.

Jak do tej pory udało mi się doczytać zarówno kwestie sterowania serwem jak i odczytu z czujnika Halla.
Nie mam jednak fioletowego pojęcia jak "pożenić ze sobą" obie te kwestie w jakąś sensowną całość.

Tak więc kolejna prośba/pytania:
-czy to możliwe?
-jeśli już gdzieś coś podobnego opisane to gdzie bo nie umiem znaleźć,
-ew. z której strony "nadgryzać" problem samemu?
Dodam, że kurs Arduino z bloga na Forbot.pl już odkryłem ale to mało Sad


ps. zainteresowanych "poza tematem", majsterkowiczów ciekawych np. jak samodzielnie wykonać solidną kosiarkę bijakową wykorzystując jak najwięcej gratów ze starego samochodu (czyt. tanio) zapraszam na PW, pochwalę się swoją.
 Smile
>Robimy dziś grilla?
<ok. będę potrzebował: wiertarkę, arkusz blachy…
 
Odpowiedź
#2
Witam,
Twoja koncepcja jest jak najbardziej prawidłowa. Stopień skomplikowania programu dla takiego regulatora nie jest duży i korzystając z przykładów dla serw, tylko lekko je modyfikując uzyskasz zamierzony efekt. Jeśli przepustnice uchyla się przez obrót to chyba lepiej byłoby sterować nią bezpośrednio przez serwo, bez pośrednictwa linki.
Pozdrawiam.
 
Odpowiedź
#3
(18-06-2017, 20:42)Smaczek napisał(a): ...Stopień skomplikowania programu dla takiego regulatora nie jest duży...

Big Grin wierzę na słowo Big Grin
Zrobiłem więc zakupy:
-Arduino UNO klon (jak zniszczę to mniej żal 3-ech dych niż 9-ciu),
-serwo TowerPro MG-995,
-garść 78xx i trochę kondensatorów do nich.
Po czym ambitnie rozpocząłem próby.
Najpierw zrobiłem "listwę" stabilizatorów, żeby trochę uporządkować te 14,4V z alternatora.
Wyszło mi bardzo ładne i równe ~12; 9; i 5V. (te 12V to tak na zapas, może się jeszcze do czegoś przyda).
Następny krok - Arduino do laptopa. I pierwsza panika:
-"nierozpoznane urządzenie", cała noc szukania po necie. Doczytałem o wiadrach łez wylanych i worach h*ów wysypanych na chińskie podróby. Żadne z proponowanych i spróbowanych rozwiązań (tych, które choć zrozumiałem) nie zadziałało. Arduino po podłączeniu świeci dwoma diodami ale komp ni jak z nim współpracować nie zamierza.
Dopiero rano, świeże spojrzenie (syn), chociaż wg mnie to raczej "rzut na liny".
"...a próbowałeś innym kablem?"
Kabel pożyczony z drukarki = cudowne ozdrowienie Cool
Bieduinko śmiga aż miło - @chińce dały walnięty kabel!!!
2. Podłączyłem serwo, załadowałem przykładowy program - jest ok. Parę doświadczeń (przeróbek), żeby chodziło płynniej, w różnych zakresach itp. ogarniam bez większych problemów.
3. Widzę, że jest biblioteka do Halla (jeszcze go fizycznie "na stole" nie mam - nadal siedzi w silniku).
Myślę, że właśnie do prób "stołowych" z nim przyda się już te 12V.
Rano wyjmę czujnik i spróbuję pojechać dalej - ale...

Nie mam nawet bladego pojęcia jak "pożenić" ze sobą odczyt z Halla i polecenia dla serwa.
Intuicyjni widzę to tak:
-odczyt z Halla przypisać do zmiennej xx,
-zrobić warunek, że jak zmienna mniejsza niż xx to serwo jazda w lewo o krok,
-zrobić warunek, że jak zmienna większa niż xx to serwo w prawo o krok.
-jakąś tolerancję wprowadzić, żeby układ nie reagował zbyt histerycznie.

[Obrazek: zmeczony.gif] Proszę podpowiedzcie jak to ugryźć bo nigdzie nie mogę znaleźć nawet trochę podobnego przykładu a moje umiejętności programowania (daaawno temu, trochę w basicu ale tam było łatwo, po prostu przejście do konkretnej linii programu) - są żenująco niewystarczające Sad
>Robimy dziś grilla?
<ok. będę potrzebował: wiertarkę, arkusz blachy…
 
Odpowiedź
#4
(18-06-2017, 20:42)Smacz ek napisał(a): ...Jeśli przepustnice uchyla się przez obrót to chyba lepiej byłoby sterować nią bezpośrednio przez serwo, bez pośrednictwa linki...

I tak i nie Smile
Oczywiście z punku widzenia "mechanicznego" - im prostsze rozwiązanie tym lepsze, bardziej niezawodne itp ale:
-linka gazu ma przy przepustnicy taki plastikowy dinks, który umożliwia jej posuwisto zwrotny ruch,
-bezpośrednio przy przepustnicy jest chyba trocho zbyt gorąco jak dla serwa, zaraz pod spodem jest bok kolektora wydechowego,
-silnik nieźle wibruje podczas pracy.
Biorąc to wszystko pod uwagę oraz, że potrzebny zakres to raptem ok. 60stopni - myślę, że lepiej będzie umocować serwo dalej i do ramy nośnej.
>Robimy dziś grilla?
<ok. będę potrzebował: wiertarkę, arkusz blachy…
 
Odpowiedź
#5
Witam,
Twoja intuicja Cię nie myli. Algorytm prawidłowy. Jeśli będzie z czymś problem to proszę pisać.
PS. Też miałem identyczną sytuację z klonem i kablem, tylko dość szybko się "jarnąłem".
Pozdrawiam,
Tomek.
 
Odpowiedź
#6
Już jestem
Oczywiście walczę z Hallem od rana Smile ale piszę dopiero gdy czuję się zagoniony do narożnika Sad
Próbując najprostszą metodą (czy w ogóle ten czujnik chodzi z Arduino) - taki kod:
sorki,że bez źródła ale ktoś tak wstawił na youtuba
Kod:
const int hallPin = 3;     // the number of the pushbutton pin
const int ledPin =  13;      // the number of the LED pin


void setup() {

 pinMode(ledPin, OUTPUT);
 pinMode(hallPin, INPUT);
 digitalWrite(hallPin,HIGH);
}

void loop() {
 

 if (digitalRead(hallPin) == HIGH) {
   digitalWrite(ledPin, LOW);
 } else {
   digitalWrite(ledPin, HIGH);
 }
}

Rozumiem z tego, że jak przysuwam/cofam magnes - dioda wbudowana w płytkę powinna migać.
I miga Smile tyle, że czasem (losowo) zostaje zapalona lub zgaszona po zabraniu magnesu.
Próbowałem też z magnesem przylepionym do wkrętarki - to samo zjawisko po odsunięciu.
Czy ten mój Hall jest jakiś dziwaczny? Bo na pewno sprawny, w końcu silnik MPI pracuje z nim bez zarzutu.

Ciągle nie mogę znaleźć nic na odczyt rpm Sad
Próbuję różne gotowce, coś tam w nich też dłubiąc - żeby na początek odczytać na monitorze co tam poleci (zrozumieć).
Jednak jedyne co uzyskuję to same zera albo całkiem przypadkowe liczby, na dokładkę zmieniające się nawet bez magnesu!!!
Pozdrawiam Andrzej
>Robimy dziś grilla?
<ok. będę potrzebował: wiertarkę, arkusz blachy…
 
Odpowiedź
#7
Witam,
A jakie są wartości napięć na wyjściu z czujnika Halla?
Pozdrawiam
 
Odpowiedź
#8
Zapomniałem,
W kodzie powinno być:
pinMode (hallPin,PULLUP);
i bez przypisywania do tego pinu HIGH w następnej linijkę.
 
Odpowiedź
#9
Zrobiłem tak:

Kod:
[code]
const int hallPin = 2;     // the number of the pushbutton pin
const int ledPin =  13;      // the number of the LED pin


void setup() {

 pinMode(ledPin, OUTPUT);
 pinMode(hallPin, INPUT_PULLUP);
}

void loop() {
 

 if (digitalRead(hallPin) == HIGH) {
   digitalWrite(ledPin, LOW);
 } else {
   digitalWrite(ledPin, HIGH);
 }
}
[/code]

Nadal tak samo (losowo włączona/wyłączona dioda zostaje po zabraniu magnesu).
Coś źle zrozumiałem czy inna przyczyna?


Czujnik podłączony do osobnego zasilania (5,1V identycznie jak w "samochodzie") daje sygnał 0,01V lub 0,71V, zmieniający się pod wpływem magnesu - tyle że po zabraniu magnesu też mu zostaje tak albo tak. Zupełnie jakby zostawał w pozycji zał lub wył - a przecież to do cholery nie kontaktron co to się "przykleja" bo stary i zniszczony!!!
Dodam, że łączyłem go zarówno do samego Arduino, zasilanego z USB jak i do osobnego zasilania (z minusem podanym na GND Arduino oraz w opcji całkiem bez usb (i Arduino 9V i Hall 5V wszystko z akumulatora po stabilizatorach 78xx).
Dzięki za cierpliwość, pozdrawiam
Andrzej
>Robimy dziś grilla?
<ok. będę potrzebował: wiertarkę, arkusz blachy…
 
Odpowiedź
#10
Walczę dalej ignorując "zacinanie się" halla.
Może przy kręcącym się dość prędko magnesie te "zacięcia" będą jedynie trochę fałszować wynik pomiaru albo nawet całkiem zanikną (w końcu w silniku jakoś to działa).
Pierwszy pomysł ( bo żadnych gotowców nie znalazłem):
Kod:
#define hallPin 2
int a;
int b;
int c;

void setup() {
  Serial.begin(9600);
  pinMode(hallPin, INPUT_PULLUP);
  }

void loop() {
 
  if (digitalRead(hallPin) == HIGH) {a=1;} //jeśli stan wysoki na hallPinie przypisz zmiennej a wartość 1
  else {b=0;} //jeśli inny, zakładam że niski przypisz zmiennej b wartość 0
  c=a+b; //przypisz zmiennej c sumę a i b zakładam, że będzie to 0+0 lub 0+1
  static int D; D=D+c; //tworzę zmienną statyczną D ,której wartość zachowaną z poprzedniej pętli powiększam o aktualne c
  static int E=1; //tworzę zmienną statyczną E
  E++; //dodaję do niej 1 przy każdej kolejnej pętli
  if (E==10) {Serial.println(D);delay(1000);} //gdy E osiągnie wartość 10 czyli pętla
  zostanie wykonana 10 razy wyświetl wartość zmiennej D i odczekaj sekundę
}

Nie wiem ile w tym sensu - dopiero co poczytałem o funkcjach, zmiennych i typach danych ale...
COŚ działa!!! Wypisuje na ekranie zmieniające się liczby. Cool

Spróbowałem więc trochę z innej beczki (trochę ściągane, trochę kombinowane):
Kod:
#include <Servo.h> //Biblioteka odpowiedzialna za serwa

Servo serwomechanizm;  //Tworzymy obiekt, dzięki któremu możemy odwołać się do serwa
byte pozycja = 0; //Aktualna pozycja serwa
int pozycjaPoprzednia = 0;
const int hallPin = 2; //hall na pinie 2
unsigned long przerwa; //czas miedzy 'mignieciami' niskiego stanu halla

void setup() {
 pinMode(hallPin, INPUT_PULLUP); //ustawienie halla
 serwomechanizm.attach(11);  //Serwomechanizm podłączony do pinu 11
 Serial.begin(9600);
}

void loop()
{
 przerwa = pulseIn(hallPin, LOW); //odczytujemy przerwy w impulsach halla, liczba maleje ze wzrostem obrotow
 pozycja = map(przerwa, 10000, 4000, 0, 120); //Zamieniamy je na pozycję serwa
 
 if (abs(pozycja-pozycjaPoprzednia) > 5) { //Sprawdzamy czy pozycje różnią się o ponad 5 stopni
   serwomechanizm.write(pozycja); //Wykonajujemy ruch
   pozycjaPoprzednia = pozycja; //Zapamiętujemy aktualną pozycję jako poprzednią
 }
 
 Serial.println(przerwa); //Wysyłamy wartość do terminala
 delay(1000); //Opóźnienie dla poprawienia czytelności
}
Efekt przy przysunięciu wkrętarki z przylepionym magnesem:
-serwo wykonuje w miarę skoordynowane ruchy w obie strony, w zależności od obrotów ww.
Mam nadzieję, że te czasem mniej skoordynowane wynikają z niedoskonałości technicznych (wiertarka w ręku) a nie z totalnych byków w kodzie?
Pozdrawiam
Andrzej
>Robimy dziś grilla?
<ok. będę potrzebował: wiertarkę, arkusz blachy…
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości