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).
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.
[1] Parallax.com
[2] Botland
Komentarze
Prześlij komentarz