Skocz do zawartości

Bezprzewodowy sterownik funkcji na kierownicę samochodu.


Pomocna odpowiedź

Ponieważ Nano zarówno na Windowsie jak i Linuxie nie bardzo chce współpracować zacząłem zabawę na UNO.
Klawiatura działa przy zasilaniu z Arduino - 5V.
Sprawdziłem jakie wartości mają poszczególne klawisze i spłodziłem takie dzieło:

int out1Pin = 2;
int out2Pin = 3;
int out3Pin = 4;
int out4Pin = 5;
int out5Pin = 6;
int out6Pin = 7;
int out7Pin = 8;
int out8Pin = 9;
int buttonPin = 0;
int buttonValue;

void setup() {
  Serial.begin(9600);

}

void loop() {
  buttonValue =  analogRead(buttonPin);
  Serial.println(buttonValue);
  
 if (buttonValue == 0) {
  digitalWrite(out1Pin,HIGH);
 } else {
  digitalWrite(out1Pin,LOW);
 }
 if (buttonValue > 4 && buttonValue < 7) {
  digitalWrite(out2Pin,HIGH);
 } else {
  digitalWrite(out2Pin,LOW);
 }
  if (buttonValue > 24 && buttonValue < 27) {
  digitalWrite(out3Pin,HIGH);
 } else {
  digitalWrite(out3Pin,LOW);
 }
   if (buttonValue > 9 && buttonValue < 12) {
  digitalWrite(out4Pin,HIGH);
 } else {
  digitalWrite(out4Pin,LOW);
 }
    if (buttonValue > 53 && buttonValue < 56) {
  digitalWrite(out5Pin,HIGH);
 } else {
  digitalWrite(out5Pin,LOW);
 }
    if (buttonValue > 130 && buttonValue < 133) {
  digitalWrite(out6Pin,HIGH);
 } else {
  digitalWrite(out6Pin,LOW);
 }
    if (buttonValue > 81 && buttonValue < 84) {
  digitalWrite(out7Pin,HIGH);
 } else {
  digitalWrite(out7Pin,LOW);
 }
    if (buttonValue > 16 && buttonValue < 18) {
  digitalWrite(out8Pin,HIGH);
 } else {
  digitalWrite(out8Pin,LOW);
 } 
}

Program działa czyli naciskam klawisz i świeci diodka na odpowiednim wyjściu.
Teraz niestety nie mam już pojęcia jak zrobić resztę czyli:
Krótkie naciśnięcie włącz na kilka sekund, długie załącz na stałe, kolejne krótkie wyłącz oraz wyłączanie zmianą stanu na kolejnym I/O np. 10.

Co do czujnika przechyłowego: sterownik będzie zamontowany na kierownicy i nie koniecznie będzie się przechylał. To kierownica się obraca. Zaraz poszukam jakiś małych czujników Halla pewnie sprawdzą się lepiej niż kontaktrony.
Uprzedzając pytanie po co to wyłączenie - jeśli włączę kierunkowskaz na stałe to coś go musi wyłączyć. Manetka przy kierownicy nie jest przełączona więc też tego nie zrobi - to przećwiczyłem w Toyocie.

Ponieważ powoli zaczyna to działać kupię oryginalny przełącznik aby nie dewastować auta i dokładnie pomierzę co czym steruje przynajmniej w kwestii świateł i wycieraczek.

Wszelkie sugestie i podpowiedzi mile widziane.
Oczywiście jak to nabierze już kształtu to wkleję tu schemat całości być może komuś się przyda.

 

(edytowany)
9 minut temu, GaaD napisał:

Krótkie naciśnięcie włącz na kilka sekund, długie załącz na stałe, kolejne krótkie wyłącz oraz wyłączanie zmianą stanu na kolejnym I/O np. 10.

https://github.com/evert-arias/EasyButton
https://evert-arias.github.io/easybtn-docs/docs/on-pressed-for-duration-example

Nie ma co odkrywać koła na nowo 😉 

Edytowano przez H1M4W4R1

Prymitywne, ale może wystarczające rozwiązanie.
 

int out1Pin = 2;
int out2Pin = 3;
int out3Pin = 4;
int out4Pin = 5;
int out5Pin = 6;
int out6Pin = 7;
int out7Pin = 8;
int out8Pin = 9;
int buttonPin = 0;
int buttonValue;

#define BTN_NONE 0
#define BTN1 1
#define BTN2 2
#define BTN3 3

void setup() { Serial.begin(9600); }

int getBtn() {
  buttonValue = analogRead(buttonPin);
  Serial.println(buttonValue);

  if (buttonValue == 0) {
    return BTN1;
  }
  if (buttonValue > 4 && buttonValue < 7) {
    return BTN2;
  }
  if (buttonValue > 24 && buttonValue < 27) {
    return BTN3;
  }

  return BTN_NONE;
}

void loop() {
  int btn = BTN_NONE;
  unsigned long start = millis();
  while (true) {
    // tu w pętli sprawdzamy stan przycisków i czekamy na zmianę
    int newBtn = getBtn();
    // wykrywajmy zmianę stanu przycisków
    if (newBtn != btn) {
      // jeśli do tej pory jakiś przycisk był wciśnięty
      if (btn != BTN_NONE) {
        // wciśnięty powyżej sekundy???
        if (millis() - start > 1000) {
          Serial.print("LONG ");
          Serial.println(btn);
          // tutaj można dodać kod obsługi długiego wciśnięcia
        } else
          (millis() - start > 100) {
            Serial.print("SHORT ");
            Serial.println(btn);
            // tutaj można dodać kod obsługi krótkiego wciśnięcia
          }
        else {
          Serial.print("TOO SHORT ");
          Serial.println(btn);
        }
      }
      // zapamiętujemy aktualny czas, jeśli przycisk się zmieni to
      // będziemy mogli policzyć czas jego wciśnięcia
      start = millis();
      // zapamiętujemy nowy stan jako bieżący stan
      btn = newBtn;
    }
    // a tu dodatkowa logika sprawdzająca czas wciśnięcia bez konieczności
    // puszczenia przycisku
    if (btn != BTN_NONE && millis() - start > 5000) {
      Serial.print("VERY LONG ");
      Serial.println(btn);
      // tutaj można dodać kod obsługi bardzo długiego wciśnięcia
      // możemy też zresetować licznik czasu, wtedy po kolejnych 5 sekundach znowu dostaniemy VERY LONG
      start = millis();
      // można też ustawić btn = BTN_NONE; wtedy VERY LONG dostaniemy tylko raz
      // i po puszczeniu nie będzie już drugiej akcji
    }
  }
}

 

5 minut temu, etet100 napisał:

Wręcz przeciwnie. Nie ma co bezmyślnie używać bibliotek.

Dlatego podesłałem koledze dokumentację.

Moim zdaniem kolega powinien sobie ułatwiać życie. Dodatkowo założeniem jest stworzenie urządzenia rozwiązującego konkretny problem, a nie nauka programowania, więc liczy się jak najprostsza droga do celu. Programowania może się nauczyć przy okazji jak będzie miał zapał i trochę pogrzebie.

8 godzin temu, etet100 napisał:

Jak to by miało działać?

Zwarty jak kierownica jest prosto. Jeżeli skręcasz w dowolnym kierunku i się rozwiera, to komputer "wie" że należy wyłączyć kierunkowskaz po powrocie do jazdy na wprost (ponownego zwarcia).

Może trochę logiki dodać dla skrętów wymagających kilku obrotów kierownicy.

1 godzinę temu, GaaD napisał:

Co do czujnika przechyłowego: sterownik będzie zamontowany na kierownicy i nie koniecznie będzie się przechylał. To kierownica się obraca.

Jak obracasz kierownicą, to to co jest na niej zamontowane musi się też obrócić/przechylić 

Można by nawet użyć żyroskopu do wykrycia kierunku obrotu. Przy sporym luzie w układzie kierowniczym można by tego użyć do włączania kierunkowskazu 😉☠️

 

(edytowany)

Co do nauki programowania to trochę za stary już chyba jestem. Przykłady gotowców owszem przeglądałem ale trzeba wiedzieć jak je połączyć z moją klawiaturą bo tam są dla konkretnego wejścia więc nadal jest to nauka i szukanie rozwiązania.
Dziękuję @etet100za podpowiedź, skorzystałem wywalało mi błąd kompilacji ale teraz wygląda to tak:
 

int out1Pin = 2;
int out2Pin = 3;
int out3Pin = 4;
int out4Pin = 5;
int out5Pin = 6;
int out6Pin = 7;
int out7Pin = 8;
int out8Pin = 9;
int buttonPin = 0;
int buttonValue;

#define BTN_NONE 0
#define BTN1 1
#define BTN2 2
#define BTN3 3
#define BTN4 4
#define BTN5 5
#define BTN6 6
#define BTN7 7
#define BTN8 8


void setup() { Serial.begin(9600);}

int getBtn() {
  buttonValue = analogRead(buttonPin);
//  Serial.println(buttonValue);

  if (buttonValue == 0) {return BTN1;}
  if (buttonValue > 4 && buttonValue < 8) {return BTN2;}
  if (buttonValue > 22 && buttonValue < 28) {return BTN3;}
  if (buttonValue > 8 && buttonValue < 13) {return BTN4;}
  if (buttonValue > 52 && buttonValue < 57) {return BTN5;}
  if (buttonValue > 129 && buttonValue < 134) {return BTN6;}
  if (buttonValue > 80 && buttonValue < 85) {return BTN7;}
  if (buttonValue > 15 && buttonValue < 20) {return BTN8;} 
  return BTN_NONE;
}

void loop() {
  int btn = BTN_NONE;
  unsigned long start = millis();
  while (true) {
    // tu w pętli sprawdzamy stan przycisków i czekamy na zmianę
    int newBtn = getBtn();
    // wykrywajmy zmianę stanu przycisków
    if (newBtn != btn) {
      // jeśli do tej pory jakiś przycisk był wciśnięty
      if (btn != BTN_NONE) {
        // wciśnięty powyżej sekundy???
        if (millis() - start > 1000) {
          Serial.print("LONG ");
          Serial.println(btn);
          // tutaj można dodać kod obsługi długiego wciśnięcia
        } else
         if (millis() - start > 100) {
            Serial.print("SHORT ");
            Serial.println(btn);
            // tutaj można dodać kod obsługi krótkiego wciśnięcia
          }
        else {
          Serial.print("TOO SHORT ");
          Serial.println(btn);
        }
      }
      // zapamiętujemy aktualny czas, jeśli przycisk się zmieni to
      // będziemy mogli policzyć czas jego wciśnięcia
      start = millis();
      // zapamiętujemy nowy stan jako bieżący stan
      btn = newBtn;
    }
  }
}  

 

Efekt w terminalu:
23:02:52.026 -> SHORT 1 
23:02:52.855 -> SHORT 2 
23:02:54.017 -> SHORT 3 
23:02:54.847 -> SHORT 4 
23:02:56.208 -> SHORT 5 
23:02:57.170 -> SHORT 6 
23:03:00.356 -> SHORT 7 
23:03:01.584 -> SHORT 8 
23:03:04.736 -> LONG 1 
23:03:07.224 -> LONG 2 
23:03:10.012 -> LONG 3 
23:03:12.933 -> LONG 4 
23:03:16.715 -> LONG 5 
23:03:20.265 -> LONG 6 
23:03:23.417 -> LONG 7 
23:03:26.371 -> LONG 8 

Musiałem trochę zwiększyć wartości dla przycisków i już w miarę stabilnie uzyskuję krótkie i długie naciśnięcie klawiszy.
Bardzo długi czas nie jest mi potrzebny więc usunąłem.

 Jak teraz wstawić "kod obsługi..." ? Bo tu już chyba trzeba sprawdzać też stan wyjścia jeśli kolejny SHORT ma wyłączyć dane wyjście?

 

Edytowano przez GaaD
1 godzinę temu, GaaD napisał:

Jak teraz wstawić "kod obsługi..." ? Bo tu już chyba trzeba sprawdzać też stan wyjścia jeśli kolejny SHORT ma wyłączyć dane wyjście?

Nie wiem czy rozumiem. Jeśli stan ma się zmieniać to na przykład jak niżej. `digitalRead` zwraca aktualny stan, wykrzyknik to negacja i digitalWrite ustawia stan przeciwny.

digitalWrite(out1Pin, !digitalRead(out1Pin));
1 godzinę temu, kostuch napisał:

Jak obracasz kierownicą, to to co jest na niej zamontowane musi się też obrócić/przechylić 

Można by nawet użyć żyroskopu do wykrycia kierunku obrotu. Przy sporym luzie w układzie kierowniczym można by tego użyć do włączania kierunkowskazu 😉☠️

 

W momencie skrętu kierownicą nie ma już sensu włączać. Kierunkowskaz sygnalizuje zamiar!

"kod o obsługi" tzn. jak teraz przyporządkować akcję do konkretnego przycisku?
np.

SHORT 1  sprawdź stan wyjścia x
                 - jeśli OFF  to załącz na 15 sekund i wyłącz
                 - jeśli ON wyłącz
LONG 1 załącz na stałe - ma włączyć więc chyba nie ma sensu sprawdzać stanu

To byłyby dwa pierwsze wyłączniki kierunkowskazów.

Co do automatycznego wyłącznika.
Pierwsza opcja była z montażem ESP w klawiaturze. Klawiatura miała być nad rękojeścią a kierownica obracałaby się względem samej klawiatury. Wyłączenie musi nastąpić przy skręcie kierownicy ok 45 stopni stąd pomysł by zamontować w klawiaturze "czujnik skrętu".
Teraz koncepcja się zmieniła - klawiatura zostaje oryginalna zatem muszę to ogarnąć inaczej - pomyślę gdy zdejmę plastiki w kolumny kierowniczej.
Teraz jedyne co trzeba dopisać to wyłączenie tych dwóch pierwszych wyjść kolejnym wejściem na zasadzie:
- zmienia się stan wejścia 10 - sprawdź czy wyjście  1 lub 2 jest włączone,  jeśli tak wyłącz.
 

Do testów wystarczy ważne aby program był gotowy.
I kierunki byłby gotowe.


 

Takie delikatne pytanie... szukasz gościa który to zrobi czy chcesz się nauczyć jak to się robi? Bo jeśli to pierwsze to nie ten dział na forum. Masz dział "praca", zaproponuj kasę.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...