• 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
#18
Jest tak:
Nowy hall daje stabilniejsze odczyty ale nadal wyskakują z niego dziwne odskoki. Nie aż tak wywalone w kosmos ale jednak. Po podciągnięciu rezystorem (Młt 0.125W 10kom wstawione między pin zasilający serwo +5V a wejście sygnału z halla) jest faktycznie lepiej - odczyty te "z księżyca" są zdecydowanie rzadsze.
Jednak serwo nadal wykonuje często nieskoordynowane ruchy. Udaje się ucelować obrotami silnika tak, żeby drgało w jakiejś pozycji, nawet do jej czasowego utrzymania (to dość trudne bo silnik reaguje mocno na minimalne ruchy linki gazu - co nie dziwne, jako że pracuje bez obciążenia).
Widać tendencję skłaniania się serwa w jedną stronę gdy obroty płynnie rosną i w drugą gdy maleją. Jednak na większe i szybsze zmiany obrotów serwo reaguje histerycznymi losowymi skokami w różnych kierunkach.
z takiego kodu wychodzą takie odczyty (niżej):
Kod:
#include <Servo.h> //Biblioteka odpowiedzialna za serwa
#define hallPin 2 //hall na pinie 2

Servo serwomechanizm;  //Tworzymy obiekt, dzięki któremu możemy odwołać się do serwa
byte pozycja = 0; //Aktualna pozycja serwa 0-180
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
 if(przerwa > 3250) przerwa = 3250;
 if(przerwa < 2200) przerwa = 2200;
 pozycja = map(przerwa, 3250, 2200, 90, 0); //Zamieniamy je na pozycję serwa
 if(pozycja > 90) pozycja = 90;
 if(pozycja < 0) pozycja = 0;  
 serwomechanizm.write(pozycja); //Wykonajujemy ruch

 Serial.print("hall =\t");
 Serial.print(przerwa);
 Serial.print("\   servo =\t");
 Serial.println(pozycja);

 delay(250); //Opóźnienie dla lepszego efektu
}

Odczyt:

hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    2200   servo =    0
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    2200   servo =    0
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    3250   servo =    90
hall =    2200   servo =    0
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    2200   servo =    0
hall =    3250   servo =    90
hall =    2200   servo =    0
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    2200   servo =    0
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    3206   servo =    87
hall =    3214   servo =    87
hall =    2200   servo =    0
hall =    3129   servo =    80
hall =    3123   servo =    80
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    3250   servo =    90
hall =    3022   servo =    71
hall =    3250   servo =    90
hall =    2950   servo =    65
hall =    2942   servo =    64
hall =    2927   servo =    63
hall =    2883   servo =    59
hall =    2866   servo =    58
hall =    2853   servo =    56
hall =    2834   servo =    55
hall =    2821   servo =    54
hall =    2200   servo =    0
hall =    2772   servo =    50
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2750   servo =    48
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2730   servo =    46
hall =    3130   servo =    80
hall =    2724   servo =    45
hall =    3002   servo =    69
hall =    2977   servo =    67
hall =    2918   servo =    62
hall =    2903   servo =    61
hall =    2507   servo =    27
hall =    2200   servo =    0
hall =    2500   servo =    26
hall =    2861   servo =    57
hall =    2537   servo =    29
hall =    2200   servo =    0
hall =    2872   servo =    58
hall =    2496   servo =    26
hall =    2830   servo =    54
hall =    2432   servo =    20
hall =    2810   servo =    53
hall =    2456   servo =    22
hall =    2806   servo =    52
hall =    2435   servo =    21
hall =    2200   servo =    0
hall =    2479   servo =    24
hall =    2864   servo =    57
hall =    2200   servo =    0
hall =    2809   servo =    53
hall =    2457   servo =    23
hall =    2783   servo =    50
hall =    2200   servo =    0
hall =    2423   servo =    20
hall =    2461   servo =    23
hall =    2832   servo =    55
hall =    2491   servo =    25
hall =    2200   servo =    0
hall =    2502   servo =    26
hall =    2837   servo =    55
hall =    2461   servo =    23
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2365   servo =    15
hall =    2357   servo =    14
hall =    2388   servo =    17
hall =    2200   servo =    0
hall =    2818   servo =    53
hall =    2499   servo =    26
hall =    2876   servo =    58
hall =    2520   servo =    28
hall =    2877   servo =    59
hall =    2484   servo =    25
hall =    2807   servo =    53
hall =    2444   servo =    21
hall =    2764   servo =    49
hall =    2200   servo =    0
hall =    2413   servo =    19
hall =    2427   servo =    20
hall =    2845   servo =    56
hall =    2528   servo =    29
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2603   servo =    35
hall =    2644   servo =    39
hall =    3138   servo =    81
hall =    2850   servo =    56
hall =    2920   servo =    62
hall =    3250   servo =    90
hall =    3060   servo =    74
hall =    3250   servo =    90
hall =    2953   servo =    65
hall =    2880   servo =    59
hall =    2862   servo =    57
hall =    2792   servo =    51
hall =    2806   servo =    52
hall =    2200   servo =    0
hall =    3149   servo =    82
hall =    2736   servo =    46
hall =    3097   servo =    77
hall =    2651   servo =    39
hall =    3087   servo =    77
hall =    2689   servo =    42
hall =    3106   servo =    78
hall =    2749   servo =    48
hall =    3154   servo =    82
hall =    2758   servo =    48
hall =    3156   servo =    82
hall =    2740   servo =    47
hall =    3120   servo =    79
hall =    2730   servo =    46
hall =    3111   servo =    79
hall =    2200   servo =    0
hall =    2789   servo =    51
hall =    2821   servo =    54
hall =    2789   servo =    51
hall =    2200   servo =    0
hall =    3120   servo =    79
hall =    2677   servo =    41
hall =    3066   servo =    75
hall =    2682   servo =    42
hall =    3081   servo =    76
hall =    2701   servo =    43
hall =    2200   servo =    0
hall =    2668   servo =    41
hall =    3044   servo =    73
hall =    2200   servo =    0
hall =    2622   servo =    37
hall =    2606   servo =    35
hall =    2591   servo =    34
hall =    2577   servo =    33
hall =    2574   servo =    33
hall =    2520   servo =    28
hall =    2856   servo =    57
hall =    2445   servo =    21
hall =    2385   servo =    16
hall =    2325   servo =    11
hall =    2589   servo =    34
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2423   servo =    20
hall =    2200   servo =    0
hall =    2398   servo =    17
hall =    2200   servo =    0
hall =    2424   servo =    20
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2209   servo =    1
hall =    2222   servo =    2
hall =    2226   servo =    3
hall =    2565   servo =    32
hall =    2241   servo =    4
hall =    2597   servo =    35
hall =    2311   servo =    10
hall =    2200   servo =    0
hall =    2330   servo =    12
hall =    2382   servo =    16
hall =    2400   servo =    18
hall =    2200   servo =    0
hall =    2793   servo =    51
hall =    2464   servo =    23
hall =    2889   servo =    60
hall =    2949   servo =    65
hall =    3033   servo =    72
hall =    2705   servo =    44
hall =    3126   servo =    80
hall =    2724   servo =    45
hall =    3094   servo =    77
hall =    2200   servo =    0
hall =    2606   servo =    35
hall =    2578   servo =    33
hall =    2556   servo =    31
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2567   servo =    32
hall =    2608   servo =    35
hall =    2663   servo =    40
hall =    3082   servo =    76
hall =    2713   servo =    44
hall =    3134   servo =    81
hall =    2740   servo =    47
hall =    2200   servo =    0
hall =    2839   servo =    55
hall =    2808   servo =    53
hall =    2200   servo =    0
hall =    3136   servo =    81
hall =    2730   servo =    46
hall =    3150   servo =    82
hall =    2788   servo =    51
hall =    2832   servo =    55
hall =    2851   servo =    56
hall =    2200   servo =    0
hall =    2922   servo =    62
hall =    2200   servo =    0
hall =    3127   servo =    80
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    2200   servo =    0
hall =    3250   servo =    90
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    3036   servo =    72
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2859   servo =    57
hall =    2757   servo =    48
hall =    2200   servo =    0
hall =    3182   servo =    85
hall =    2818   servo =    53
hall =    2879   servo =    59
hall =    2947   servo =    65
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    2200   servo =    0
hall =    3250   servo =    90
hall =    2200   servo =    0
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    3250   servo =    90
hall =    2200   servo =    0
hall =    2200   servo =    0
hall =    2200   servo =    0

Myślę, że tych odczytów już bardziej się nie wygładzi a i trochę się obawiam czy nie zareaguje na to komputerek sterujący wtryskiem, który przecież też jest równolegle podpięty.
Jak widzisz cuduje z kodem starając się zignorować wszystkie odczyty z poza interesującego mnie zakresu - ale jakoś się chyba źle za to zabieram. Sad
Chciałbym jakoś tak zrobić, żeby odczyty wartości halla wykraczające poza określoną ramę (w tym wypadku 3250 do 2200) były całkowicie ignorowane. Tak jak zrobiłem są one jedynie zamieniane na skrajne położenia serwa. Może właśnie to powoduje te jego skoki?
Niestety jestem za cienki w programowaniu - a tu aż się prosi komenda /ignore/ Smile
"odczytałeś sygnał z halla < lub > niż zakres, niech serwo nie robi nic a ty powtórz pętlę"
Myślę, że jest to możliwe do zrobienia bo przecież nie takie rzeczy ludzie tworzą - jednak w moim przypadku już 4-ta noc spędzana przy kompie na szukaniu i próbach przyswojenia wiedzy o języku C nie zbliżyła mnie nawet do rozwiązania.
Na dokładkę nie umiem wyrzucić z głowy pozostałości po basicu - gdzie zwykłmi if i goto załatwił bym to w ciągu max godziny! Sad
Weź - bądź Dobrą Duszą i popchnij mnie chociaż w kierunku.
Pozdrawiam A


Edycja kilka (-naście) prób później...:

Udało mi się przy użyciu warunków osiągnąć zamierzony efekt:

Kod:
#include <Servo.h> //Biblioteka odpowiedzialna za serwa
#define hallPin 2 //hall na pinie 2

Servo serwomechanizm;  //Tworzymy obiekt, dzięki któremu możemy odwołać się do serwa
byte pozycja = 0; //Aktualna pozycja serwa 0-180
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

 if(przerwa < 3250)
 if(przerwa > 2200)
 {
 pozycja = map(przerwa, 3250, 2200, 90, 0); //Zamieniamy je na pozycję serwa

 serwomechanizm.write(pozycja); //Wykonajujemy ruch

 Serial.print("hall =\t");
 Serial.print(przerwa);
 Serial.print("\   servo =\t");
 Serial.println(pozycja);
 }
 else
 {
   Serial.println("poza skala");
 }
 delay(250); //Opóźnienie
}


Udało się osiągnąć takie oto wskazania:

Kod:
poza skala
poza skala
poza skala
poza skala
poza skala
poza skala
poza skala
poza skala
poza skala
poza skala
hall =    2954   servo =    65
poza skala
poza skala
hall =    3064   servo =    75
hall =    2685   servo =    42
hall =    3067   servo =    75
hall =    2664   servo =    40
hall =    2629   servo =    37
hall =    2570   servo =    32
hall =    2523   servo =    28
poza skala
poza skala
hall =    2486   servo =    25
hall =    2841   servo =    55
hall =    2495   servo =    26
hall =    2896   servo =    60
poza skala
hall =    2542   servo =    30
poza skala
hall =    2855   servo =    57
hall =    2460   servo =    23
hall =    2800   servo =    52
poza skala
poza skala
hall =    2773   servo =    50
poza skala
hall =    2804   servo =    52
hall =    2475   servo =    24
hall =    2819   servo =    54
hall =    2441   servo =    21
hall =    2422   servo =    20
hall =    2401   servo =    18
hall =    2383   servo =    16
hall =    2381   servo =    16
hall =    2382   servo =    16
poza skala
hall =    2744   servo =    47
hall =    2454   servo =    22
hall =    2834   servo =    55
hall =    2494   servo =    26
hall =    2904   servo =    61
hall =    2583   servo =    33
hall =    2649   servo =    39
hall =    3119   servo =    79
hall =    2884   servo =    59
poza skala
poza skala
poza skala
poza skala
poza skala
poza skala
poza skala
poza skala
hall =    3063   servo =    74
hall =    2324   servo =    11
hall =    2994   servo =    69
hall =    2990   servo =    68
poza skala
hall =    2890   servo =    60
hall =    2834   servo =    55
hall =    2791   servo =    51
poza skala
poza skala
poza skala
poza skala
poza skala
hall =    3144   servo =    81
hall =    2728   servo =    46
hall =    3104   servo =    78
hall =    2674   servo =    41
hall =    3072   servo =    75
hall =    2691   servo =    43
hall =    3084   servo =    76
hall =    2680   servo =    42
hall =    3072   servo =    75
hall =    2659   servo =    40
hall =    2628   servo =    37
hall =    2573   servo =    32
hall =    2566   servo =    32
poza skala
hall =    2577   servo =    33
hall =    2545   servo =    30
hall =    2542   servo =    30
poza skala
hall =    2840   servo =    55
poza skala
hall =    2795   servo =    51
poza skala
hall =    2398   servo =    17
poza skala
hall =    2383   servo =    16
hall =    2346   servo =    13
poza skala
hall =    2638   servo =    38
hall =    2291   servo =    8
hall =    2602   servo =    35
hall =    2288   servo =    8
hall =    2620   servo =    36
hall =    2309   servo =    10
poza skala
hall =    2405   servo =    18
hall =    2918   servo =    62
poza skala
hall =    3200   servo =    86
hall =    2921   servo =    62
hall =    2716   servo =    45
hall =    2567   servo =    32
hall =    2827   servo =    54
poza skala
hall =    2385   servo =    16
hall =    2361   servo =    14
hall =    2447   servo =    22
hall =    2912   servo =    62
poza skala
hall =    3085   servo =    76
poza skala
poza skala
poza skala
poza skala
hall =    2819   servo =    54
hall =    3026   servo =    71
hall =    2920   servo =    62
hall =    2469   servo =    24
hall =    2780   servo =    50
poza skala
hall =    2373   servo =    15
poza skala
poza skala
hall =    2583   servo =    33
hall =    2244   servo =    4
hall =    2607   servo =    35
hall =    2338   servo =    12
poza skala
hall =    2737   servo =    47
hall =    3030   servo =    72
poza skala
poza skala
poza skala
poza skala

Jednak nadal przy płynnym, powolnym dodawaniu gazu serwo wykonuje ruchy przeczące. Już nawet nie chaotyczne, tylko po prostu przecząco kręci orczykiem. Czy moje arduino chce mi coś powiedzieć?
>Robimy dziś grilla?
<ok. będę potrzebował: wiertarkę, arkusz blachy…
 
Odpowiedź
  


Wiadomości w tym wątku
RE: Stabilizator obrotów silnika spalinowego - przez andrus - 03-07-2017, 23:12

Skocz do:


Przeglądający: 2 gości