10-07-2017, 20:50
Witam
Jest super
Brnąc coraz głębiej, szukając zastosowania coraz to bardziej zagmatwanych poleceń i wciąż nie osiągając zadowalającego efektu – podeszliśmy do problemu „z innej beczki”.
Wychodząc z założenia, że im konstrukcja prostsza tym bardziej niezawodna – zacząłem to rozkminiać od podstaw, i tak:
-uśredniony odczyt z halla jest super (nie ruszać!)
-odczyt z halla jest ściśle związany z obrotami silnika więc przy tych moich wymarzonych 2500rpm wynosi po prostu ~3700,
-do utrzymania właśnie tej wartości ma dążyć program, ganiając z serwem w lewo lub prawo dotąd, aż ją osiągnie,
-czyli na dobrą sprawę mapowanie stało się zbędne bo wystarczy, że serwo poczynając od 0 dopyka po stopniu do optymalnych obrotów silnika (czyli również wartości odczytanej z halla) a potem, pykając stopień w przód lub w tył – po prostu ją utrzyma.
W ten sposób, zarówno utrzyma obroty bez obciążenia jak i wraz z jego wzrostem, będzie dalej uchylać przepustnicę starając się sprostać oczekiwaniom.
I odwrotnie, jak opory spadną i silnik będzie chciał się rozbujać – zacznie ją przymykać.
Wyszło mi, że kod spełniający taką funkcję musi wyglądać mniej/więcej tak:
Ten ostatni warunek ma z założenia przyspieszać reakcję silnika na nagle zwiększony opór. Nie jestem pewien czy jest z sensem ale jak nie patrzeć program działa – i to całkiem fajnie, równo i wystarczająco „żywo”.
Okazało się, jak to zwykle kiedy już wymyślone że to całkiem proste było – niemniej jednak, faktem jest, że bez Twojej pomocy, zwłaszcza w części związanej z „ugłaskaniem” tego cholernego halla (pullup, rezystor, i while) pewnie nigdy bym sobie nie poradził.
Tak więc WIELKIE DZIĘKI – a jak dokończę „kosmetykę” to wstawię zdjęcia i filmik z działania.
Pozdrawiam,
Andrzej
Jest super
Brnąc coraz głębiej, szukając zastosowania coraz to bardziej zagmatwanych poleceń i wciąż nie osiągając zadowalającego efektu – podeszliśmy do problemu „z innej beczki”.
Wychodząc z założenia, że im konstrukcja prostsza tym bardziej niezawodna – zacząłem to rozkminiać od podstaw, i tak:
-uśredniony odczyt z halla jest super (nie ruszać!)
-odczyt z halla jest ściśle związany z obrotami silnika więc przy tych moich wymarzonych 2500rpm wynosi po prostu ~3700,
-do utrzymania właśnie tej wartości ma dążyć program, ganiając z serwem w lewo lub prawo dotąd, aż ją osiągnie,
-czyli na dobrą sprawę mapowanie stało się zbędne bo wystarczy, że serwo poczynając od 0 dopyka po stopniu do optymalnych obrotów silnika (czyli również wartości odczytanej z halla) a potem, pykając stopień w przód lub w tył – po prostu ją utrzyma.
W ten sposób, zarówno utrzyma obroty bez obciążenia jak i wraz z jego wzrostem, będzie dalej uchylać przepustnicę starając się sprostać oczekiwaniom.
I odwrotnie, jak opory spadną i silnik będzie chciał się rozbujać – zacznie ją przymykać.
Wyszło mi, że kod spełniający taką funkcję musi wyglądać mniej/więcej tak:
Kod:
#include <Servo.h>
#define hallPin 2
Servo serwo;
volatile byte pozycja = 0;
void setup()
{
pinMode(hallPin, INPUT_PULLUP);
pinMode(7, INPUT_PULLUP);
serwo.attach(11);
Serial.begin(9600);
serwo.write(pozycja);
}
void loop()
{
byte licznik = 0;
unsigned long srednia = 0;
unsigned int odczyt;
while (licznik < 10) //liczy srednią jak liczył
{
odczyt = pulseIn(hallPin, LOW);
if ((odczyt > 1000)&&(odczyt < 10000)) //tylko zakres odczytów tak, żeby rozumial już od biegu jalowego
{
srednia += odczyt;
licznik++;
}
}
srednia /= 10; //wiem, że przy 2500rpm srednia z halla=3700 a serwo=12 bez obciążenia
if(srednia > 3700) pozycja++; //dokąd srednia jest większa niż 3700 dodawj serwu o 1 stoień co kolejna pętla
if(srednia < 3700) pozycja--; //jak srednia spadnie poniżej 3700 zacznij odejmować serwu po 1 stopień co kolejna pętla
if (digitalRead(7) == HIGH) //"prztyczek"- zerowanie serwa
{
pozycja = 0;
serwo.write(pozycja);
}
if (digitalRead(7) == LOW) //a jak prztyczka nie ma to daj serwu pozycję z linii 35/36
{
serwo.write(pozycja);
}
if ((digitalRead(7) == LOW) && (pozycja < 8)) //jak bez prztyczka a serwo<8 przyspiesz przyrost o jeszcze 1
{
pozycja++;
serwo.write(pozycja);
}
}
Ten ostatni warunek ma z założenia przyspieszać reakcję silnika na nagle zwiększony opór. Nie jestem pewien czy jest z sensem ale jak nie patrzeć program działa – i to całkiem fajnie, równo i wystarczająco „żywo”.
Okazało się, jak to zwykle kiedy już wymyślone że to całkiem proste było – niemniej jednak, faktem jest, że bez Twojej pomocy, zwłaszcza w części związanej z „ugłaskaniem” tego cholernego halla (pullup, rezystor, i while) pewnie nigdy bym sobie nie poradził.
Tak więc WIELKIE DZIĘKI – a jak dokończę „kosmetykę” to wstawię zdjęcia i filmik z działania.
Pozdrawiam,
Andrzej
>Robimy dziś grilla?
<ok. będę potrzebował: wiertarkę, arkusz blachy…
<ok. będę potrzebował: wiertarkę, arkusz blachy…