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.
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/
"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!
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ć?