Przejdź do głównej zawartości

[Arduino] Czujnik martwej strefy w lusterku bocznym

Poruszanie się motocyklem, w szczególności w mieście, związane jest z ryzykiem wjechania innemu uczestnikowi ruchu przed przysłowiową maskę. Jest to o tyle niebezpieczne, że mimo względnie niewielkich prędkości może dojść do wywrotki motocykla wraz z kierującym i pasażerem. Aby tego uniknąć trzeba umiejętnie korzystać z lusterek, jednak w przypadku motocykli są one na ogół dość małe i bardziej niż ma to miejsce w samochodach doświadczamy tzw. martwej strefy. Ogólnie rzecz biorąc jest to strefa w bliskiej odległości od motocykla, której nie widzimy w lusterku (trzeba się wychylić i spojrzeć w nie pod innym kątem albo odwrócić głowę), a w której może znaleźć się inny pojazd. Z pomocną ręką może przyjść nowoczesna elektronika. W niniejszym wpisie przedstawię bardzo prostą propozycję wykorzystania Arduino jako czujnika martwej strefy motocykla.  Oczywiście zamiast motocykla można wstawić każdy inny pojazd, a wręcz pomysł można potraktować jako czujkę alarmową (czujnik ruchu). Cały projekt udostępniony jest online poprzez TinkerCAD (link w stopce wpisu).
Pomysł polega na tym, aby monitorować przestrzeń po bokach motocykla lekko z tyłu. Oczywiście jest to kwestia montażu, natomiast w tym projekcie przedstawiona jest idea rozwiązania. Jego bazą jest płytka Arduino Uno R3. Dodatkowe elementy to dwa czujniki zbliżeniowe Parallax 28015 Rev. C PING))), dwie czerwone diody LED oraz dwa rezystory 470 omów. Dla czytelności projektu wykorzystana została również mała płytka stykowa.
Schemat połączeń
Do portów cyfrowych o numerach 2 (lewa strona motocykla) i 3 (prawa strona motocykla) dołączone zostały czerwone diody LED celem sygnalizacji obecności pojazdu w odległości mniejszej niż założona, czyli w tym przykładzie było to 100 cm. Czujniki zbliżeniowe zostały dołączone do kolejnych portów: 4 (lewa strona) i 5 (prawa strona). Zasada działania wykorzystanego czujnika zbliżeniowego przedstawiona jest na poniższym rysunku.
Zasada działania czujnika zbliżeniowego  [1]
Żeby czujnik zadziałał należy piny zasilające połączyć z masą oraz zasilaniem +5V, a następnie wystartować go krótkim impulsem stanu wysokiego (TRIG), co spowoduje wygenerowanie serii testowych impulsów (CHIRP), a następnie impulsu odpowiedzi (ECHO), której czas trwania jest proporcjonalny do odległości. 

Zależności czasowe czujnika zbliżeniowego [2]

Odległość tę możemy przeliczyć na cm korzystając ze wzoru:

odległość [cm] = ( czas_odpowiedzi [us] * 34 ) / 1000 / 2

System ten działa w ten sposób, że w trybie ciągłym monitorowana jest odległość obiektów od czujników i jeśli jakiś znajdzie się bliżej niż założone 100 cm zaświeci się lewa lub prawa dioda, zależnie od strony gdzie ten obiekt się pojawił. Wykorzystane rezystory z punktu widzenia symulacji nie są niezbędne, jednak wykonując model praktycznie warto o nich pamiętać - ograniczają prąd płynący przez diodę. Program realizujący to wszystko, czyli generujący impulsy wyzwalające czujniki, odbierający sygnały, przeliczający odległości oraz zaświecający diody LED w razie potrzeby wygląda następująco:

#define LeftLed 2
#define RightLed 3
#define LeftSensor 4
#define RightSensor 5
#define MinimalDistance 100 //centimeters

void setup() {              
  pinMode(LeftLed, OUTPUT);
  pinMode(RightLed, OUTPUT);
}

float LeftDistance() {
  unsigned long czas;
  pinMode(LeftSensor,OUTPUT);
  digitalWrite(LeftSensor, LOW);
  delayMicroseconds(2);
  digitalWrite(LeftSensor, HIGH);
  delayMicroseconds(5);
  digitalWrite(LeftSensor, LOW);
  pinMode(LeftSensor, INPUT);
  czas=pulseIn(LeftSensor, HIGH);
  return czas / 58;
}

float RightDistance() {
  unsigned long czas;
  pinMode(RightSensor,OUTPUT);
  digitalWrite(RightSensor, LOW);
  delayMicroseconds(2);
  digitalWrite(RightSensor, HIGH);
  delayMicroseconds(10);
  digitalWrite(RightSensor, LOW);
  pinMode(RightSensor, INPUT);
  czas=pulseIn(RightSensor, HIGH);
  return ((czas * 34 ) / 1000 / 2);
}

void loop() {
  if(LeftDistance() < MinimalDistance) {
    digitalWrite(LeftLed, HIGH);
  }
  else {
    digitalWrite(LeftLed, LOW);
  }
 
  if(RightDistance() < MinimalDistance) {
    digitalWrite(RightLed, HIGH);
  }
  else {
    digitalWrite(RightLed, LOW);
  }
}
W pierwszym bloku zostały zdefiniowane stałe elementy, jak przyporządkowane porty czy minimalna odległość. W funkcji setup() skonfigurowane zostały porty, do których dołączono diody LED, jako wyjściowe. Kolejne dwie funkcje (LeftDistance oraz RightDistance) służą odczytowi odległości od przeszkody odpowiednio z lewej i prawej strony. Zgodnie z przedstawionym wcześniej sposobem działania najpierw przełączają port z dołączonym wyjściem SIG czujnika w tryb wyjściowy, następnie generują impuls wyzwalający czujnik (impuls o czasie trwania 10 us), dalej przełączają tryb pracy portu w stan wejściowy i odczytują czas trwania impulsu, który się tam pojawił. Ostatnią rzeczą jest przeliczenie tego czasu na odległość do obiektu. W programie głównym (czy raczej pętli głównej) wykonywane są pomiary odległości do obiektów z lewej, potem z prawej strony. Jeśli w którymś momencie okaże się, że jest obiekt bliżej niż 100 cm to zaświeca się dioda LED odpowiadająca stronie, po której się on pojawił, a jeśli nie to pozostaje zgaszona lub gaśnie. Realizuje to instrukcja warunkowa if, w której odczytana z danej strony odległość jest porównywana z minimalną dozwoloną. Model, gotowy do uruchomienia udostępniony jest online na platformie TinkerCAD - tutaj.

Na chwilę obecną pogoda jest mało zachęcająca do jazd motocyklowych, ale być może na wiosnę najdzie mnie i spróbuję zrobić takie urządzenie w praktyce. Póki co zostaje zabawa przy komputerze, np. uzupełnienie projektu o element regulacyjny czułość (minimalną odległość) w zadanym zakresie.

[2] Botland

Komentarze

Popularne posty z tego bloga

[Arduino] Trójkanałowy pomiar rezystancji

Moduł Arduino posiada kilka portów analogowych, poprzez które możemy mierzyć napięcie. Napięcie jest taką wielkością, że przy odrobinie wyobraźni i znajomości elektrotechniki w zasadzie każdą inną możemy sprowadzić właśnie do napięcia. Dzisiejszy projekt dotyczy trójkanałowego pomiaru rezystancji z wykorzystaniem Arduino. Oprócz modułu procesora wykorzystany będzie moduł wyświetlacza LCD. Dlaczego trójkanałowego? Ano dlatego, że taki układ można wykorzystać np. do pomiaru przenośnych uziemiaczy trójfazowych. 

Z psem na Turbacz

 Wyjazd wakacyjny nie musi się wiązać z zostawianiem psa w domu pod opieką rodziny czy sąsiadów, albo oddawaniem do psiego hotelu. Przy odrobinie wyobraźni i dobrych chęci czas ten można znakomicie spędzić wspólnie. Pewną propozycją dla osób posiadających psa lubiącego dalekie spacery może być wycieczka na Turbacz. Turbacz jest najwyższym szczytem Gorców, a jego wysokość to 1310 m.  Dojście z psem na szczyt możliwe jest legalnie niebieskim szlakiem z Łopusznej. O tyle zaznaczam legalność wejścia, ponieważ wstęp psów do parków narodowych jest w większości przypadków zabroniony, a Trubacz od północy otacza Gorczański Park Narodowy. Proponowany niebieski szlak jest to dość długi, bowiem ma około 11 km licząc od parkingu. Część turystów zostawia samochód na dzikim parkingu 3 km dalej po trasie szlaku, ale miejsca jest tam nie za dużo i może być problem. Poza tym umówmy się, że jak się idzie szlakiem to się idzie, a nie jedzie - do czego wrócę w innym wpisie. A zatem samochód zosta...