Film znajduje się tutaj: https://youtu.be/SNg4OOBb188
Nie wszyscy mamy samochody wyposażone w czujniki odległości, a wjechanie do garażu zostawiając odpowiednią odległość z tyłu i z przodu samochodu wymaga umiejętności i wyczucia. Czujnik ultradźwiękowy HC-SR04 podłączony do płytki Arduino Uno lub Nano załatwia problem braku wprawy we wjeżdżaniu do garażu :) Dwie matryce led 8×8 wystarczą aby dane z czujnika po odpowiednim zaprogramowaniu płytki Arduino znalazły się przed oczami kierowcy. Ten czujnik pozwala na pomiar w odległości 2 – 200 cm. Mnie wystarczą dwie matryce, bo nie muszę mieć pomiaru powyżej jednego metra, ale z łatwością można zwiększyć ilość matryc.
Matryce podłączyłem do wyjść 12,11,10, zasilania 5V i GND
Czujnik jest podłączony również do zasilania 5v i GND. Piny Trig i Echo trafiły odpowiednio do złącz 7 i 6 na płytce Arduino.
Naturalnie, to co widzicie można zrobić znacznie estetyczniej. Robiłem to raczej dla zabawy elektroniką i nie skupiałem się na estetyce. Obudowa jest dość duża, ale przy zastosowaniu mniejszej płytki można całość upchnąć w znacznie niższym pudełku. Wewnątrz jest jeszcze niewielki regulator napięcia step-down, bo mam jedynie zasilacze 12v.
Kod jest bardzo prosty. Zadbałem również o zmniejszenie zużycia energii. Jaskrawość matryc zostaje maksymalnie zmniejszona po kilku sekundach oczekiwania, gdy pojazd się zatrzyma, a po dalszych kilkunastu sekundach matryce zostaną wyłączone. Czujnik, w trakcie ruchu pojazdu dokonuje pomiaru co ułamki sekundy. Później pomiar dokonywany jest co około 2 sekundy. Czujnik budzi się natychmiast gdy “wyczuje” ruch, ale te 2 sekundy pomiędzy pomiarami powoduje, że czasem można koło niego przejść i czujnik się nie “obudzi”.
Podczas oglądania filmu wyraźnie słychać odgłos pomiaru, ale “złapał” się tylko na nagranie wykonane komórką. Normalnie nie ma szans go usłyszeć. Proszę również zwrócić uwagę, że gdy zbliżałem rękę, ultradźwięki nie były już “złapane” przez komórkę. Mój samochód jest wyposażony w czujniki i na nagraniu je można usłyszeć. Oczywiście do płytki można również podłączyć buzzer, gdyby komuś nie wystarczał wyświetlacz :)
Czujnik, niestety trzeba umieścić tak, aby był na równi z przeszkodą, ko której się zbliżamy. Można też umieścić go dalej, ale istnieje prawdopodobieństwo, że wyniki pomiaru będą zafałszowane przez odbicia, no i takie przesunięcie trzeba też uwzględnić podczas programowania płytki.
#include “LedControl.h”
#define trigPin 7
#define echoPin 6
LedControl lc=LedControl(12,10,11,2); // Pins: DIN,CLK,CS, # of Display connected
int delayTime=200;
int zakr[30];
int mini, maxi;
byte loope=0, loopb=0;
// Put values in arrays
byte c[] ={B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000};
byte c0[] ={B00000000, B01111110, B11111111, B10000001, B10000001, B11111111, B01111110, B00000000};
byte c1[] ={B00000000, B00000000, B00000100, B10000010, B11111111, B11111111, B10000000, B00000000};
byte c2[] ={B00000000, B11000010, B11100011, B10110001, B10011001, B10001111, B10000110, B00000000};
byte c3[] ={B00000000, B01000010, B11000011, B10000001, B10001001, B11111111, B01110110, B00000000};
byte c4[] ={B00000000, B00111000, B00111100, B00100010, B00100001, B11111111, B11111111, B00000000};
byte c5[] ={B00000000, B01001111, B11001101, B10000101, B10000101, B11111101, B01111001, B00000000};
byte c6[] ={B00000000, B01111110, B11111111, B10001001, B10001001, B11111011, B01110010, B00000000};
byte c7[] ={B00000000, B00000011, B00000011, B11110001, B11111001, B00001111, B00000111, B00000000};
byte c8[] ={B00000000, B01110110, B11111111, B10001001, B10001001, B11111111, B01110110, B00000000};
byte c9[] ={B00000000, B01001110, B11011111, B10010001, B10010001, B11111111, B01111110, B00000000};
void setup()
{
lc.shutdown(0,false); // Wake up displays
lc.shutdown(1,false);
lc.setIntensity(0,5); // Set intensity levels
lc.setIntensity(1,5);
lc.clearDisplay(0); // Clear Displays
lc.clearDisplay(1);
Serial.begin (9600);
pinMode(trigPin, OUTPUT); //Pin, do którego podłączymy trig jako wyjście
pinMode(echoPin, INPUT); //a echo, jako wejście
}
void a(){for (int i = 0; i < 8; i++){lc.setRow(0,i,c[i]);}}
void a1(){for (int i = 0; i < 8; i++){lc.setRow(0,i,c1[i]);}}
void a2(){for (int i = 0; i < 8; i++){lc.setRow(0,i,c2[i]);}}
void a3(){for (int i = 0; i < 8; i++){lc.setRow(0,i,c3[i]);}}
void a4(){for (int i = 0; i < 8; i++){lc.setRow(0,i,c4[i]);}}
void a5(){for (int i = 0; i < 8; i++){lc.setRow(0,i,c5[i]);}}
void a6(){for (int i = 0; i < 8; i++){lc.setRow(0,i,c6[i]);}}
void a7(){for (int i = 0; i < 8; i++){lc.setRow(0,i,c7[i]);}}
void a8(){for (int i = 0; i < 8; i++){lc.setRow(0,i,c8[i]);}}
void a9(){for (int i = 0; i < 8; i++){lc.setRow(0,i,c9[i]);}}
void a0(){for (int i = 0; i < 8; i++){lc.setRow(0,i,c0[i]);}}
void b(){for (int i = 0; i < 8; i++){lc.setRow(1,i,c[i]);}}
void b1(){for (int i = 0; i < 8; i++){lc.setRow(1,i,c1[i]);}}
void b2(){for (int i = 0; i < 8; i++){lc.setRow(1,i,c2[i]);}}
void b3(){for (int i = 0; i < 8; i++){lc.setRow(1,i,c3[i]);}}
void b4(){for (int i = 0; i < 8; i++){lc.setRow(1,i,c4[i]);}}
void b5(){for (int i = 0; i < 8; i++){lc.setRow(1,i,c5[i]);}}
void b6(){for (int i = 0; i < 8; i++){lc.setRow(1,i,c6[i]);}}
void b7(){for (int i = 0; i < 8; i++){lc.setRow(1,i,c7[i]);}}
void b8(){for (int i = 0; i < 8; i++){lc.setRow(1,i,c8[i]);}}
void b9(){for (int i = 0; i < 8; i++){lc.setRow(1,i,c9[i]);}}
void b0(){for (int i = 0; i < 8; i++){lc.setRow(1,i,c0[i]);}}
void loop()
{
Serial.print(Odl());
Serial.println(” cm”);
switch(Odl())
{
case 1:a();b1();break;
case 2:a();b2();break;
case 3:a();b3();break;
case 4:a();b4();break;
case 5:a();b5();break;
case 6:a();b6();break;
case 7:a();b7();break;
case 8:a();b8();break;
case 9:a();b9();break;
case 10:a1();b0();break;
case 11:a1();b1();break;
case 12:a1();b2();break;
case 13:a1();b3();break;
case 14:a1();b4();break;
case 15:a1();b5();break;
case 16:a1();b6();break;
case 17:a1();b7();break;
case 18:a1();b8();break;
case 19:a1();b9();break;
case 20:a2();b0();break;
case 21:a2();b1();break;
case 22:a2();b2();break;
case 23:a2();b3();break;
case 24:a2();b4();break;
case 25:a2();b5();break;
case 26:a2();b6();break;
case 27:a2();b7();break;
case 28:a2();b8();break;
case 29:a2();b9();break;
case 30:a3();b0();break;
case 31:a3();b1();break;
case 32:a3();b2();break;
case 33:a3();b3();break;
case 34:a3();b4();break;
case 35:a3();b5();break;
case 36:a3();b6();break;
case 37:a3();b7();break;
case 38:a3();b8();break;
case 39:a3();b9();break;
case 40:a4();b0();break;
case 41:a4();b1();break;
case 42:a4();b2();break;
case 43:a4();b3();break;
case 44:a4();b4();break;
case 45:a4();b5();break;
case 46:a4();b6();break;
case 47:a4();b7();break;
case 48:a4();b8();break;
case 49:a4();b9();break;
case 50:a5();b0();break;
case 51:a5();b1();break;
case 52:a5();b2();break;
case 53:a5();b3();break;
case 54:a5();b4();break;
case 55:a5();b5();break;
case 56:a5();b6();break;
case 57:a5();b7();break;
case 58:a5();b8();break;
case 59:a5();b9();break;
case 60:a6();b0();break;
case 61:a6();b1();break;
case 62:a6();b2();break;
case 63:a6();b3();break;
case 64:a6();b4();break;
case 65:a6();b5();break;
case 66:a6();b6();break;
case 67:a6();b7();break;
case 68:a6();b8();break;
case 69:a6();b9();break;
case 70:a7();b0();break;
case 71:a7();b1();break;
case 72:a7();b2();break;
case 73:a7();b3();break;
case 74:a7();b4();break;
case 75:a7();b5();break;
case 76:a7();b6();break;
case 77:a7();b7();break;
case 78:a7();b8();break;
case 79:a7();b9();break;
case 80:a8();b0();break;
case 81:a8();b1();break;
case 82:a8();b2();break;
case 83:a8();b3();break;
case 84:a8();b4();break;
case 85:a8();b5();break;
case 86:a8();b6();break;
case 87:a8();b7();break;
case 88:a8();b8();break;
case 89:a8();b9();break;
case 90:a9();b0();break;
case 91:a9();b1();break;
case 92:a9();b2();break;
case 93:a9();b3();break;
case 94:a9();b4();break;
case 95:a9();b5();break;
case 96:a9();b6();break;
case 97:a9();b7();break;
case 98:a9();b8();break;
case 99:a9();b9();break;
}
delay(delayTime);
}
int Odl() {
long czas;
int dyst;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
czas = pulseIn(echoPin, HIGH);
dyst = czas / 58;
if (dyst > 99) {
dyst = 99;
}
zakr[loope]=dyst;
maxi=zakr[0];
mini=zakr[0];
for(int i=0;i<30;i++)
{
if(zakr[i]>maxi) maxi=zakr[i];
//Serial.println(maxi);
if(zakr[i]<mini) mini=zakr[i];
//Serial.println(mini);
}
if(maxi-mini<2){
lc.setIntensity(0,0);
lc.setIntensity(1,0);
delayTime=2000;
if(loopb>10){lc.shutdown(0,true);lc.shutdown(1,true);}
if(loopb<30)loopb++;
}
else{
lc.shutdown(0,false);
lc.shutdown(1,false);
lc.setIntensity(0,5);
lc.setIntensity(1,5);
delayTime=200;
loopb=0;
}
delay(100);
if(loope<=30){loope++;}else{loope=0;}
return dyst;
}
To jeszcze przydałoby się wyświetlanie odległości w odbiciu lustrzanym (dla wjeżdżających do garażu tyłem)>
Hej, ładnie się to prezentuje :) Graty !
Powiem Ci, że dużo tego w tym kodzie masz i to bardzo dużo.
Definicje wyświetlania znaków można zredukować do jednej tablicy dwuwymiarowej.
Za sprawą odpowiedniego przeliczania mógłbyś się pozbyć ilość tych case, a zarazem same wyświetlanie zrealizować
na dwóch for :) Ale to taka moja sugestia, jeśli projekt miał tylko działać to ważne, że działa :D
Pozdrawiam Piro
Zastanawiałem się jak to ugryźć żeby skrócić kod przez rozbicie wyniku na dwie cyfry, ale postanowiłem zamknąć obudowę :) Niestety, jestem jeszcze początkującym. Dziś ją rozbiorę i ponownie przysiądę nad skróceniem kodu. Dziękuję za sugestię :)
Zasadniczo nie zakładałem, że może być dużo osób wjeżdżających tyłem. Raz tak zrobiłem i żałowałem. Jak uruchomiłem silnik po dłuższym postoju, to był potężny smród :)
czy można zaprogramować układ, a następnie przenieść go na płytkę i dodać jakieś elementy elektroniczne aby nie wykorzystywać samej płytki od arduino uno?
Można. Poszukaj o klonowaniu Arduino
Super sprawa, idealny dla mojej żony ona już nie raz przygrzmociła w ścianę. Będę musiał pokusić się o skonstruowanie czegoś takiego
Ciekawa alternatywa dla piłeczki tenisowej, zawieszonej pod sufitem. ;)
Kolego… Pomysł fajny, ale same gotowe elementy… Nawet kabelki do goldpinow to gotowce. Nie masz ambicji na stworzenie projektu porządnie, taniej i przede wszystkim łatwiejszego do montażu dla czytelników, bez tej pajęczyny? Co za czasy…
Bardzo chętnie bym coś takiego kupiła tylko żeby wyglądało trochę bardziej estetycznie
Cała zabawka nazbyt skomplikowana i zbyt kosztowna do takiego zastosowania. W zupełności (sprawdzone praktycznie) wystarcza zamontowanie bariery laserowej przy drzwiach garażu z podłączoną sygnalizacyjną LED na wyjściu. U mnie działa taka:
https://www.aliexpress.com/item/FREE-SHIPPING/32828380432.html?spm=a2g0s.9042311.0.0.78d54c4d91GqLU
I to jest wyjście idealnie ! Nie trzeba przyglądać się wyswietlacza. Zaświeci się lampka i wsio. Fajny by był taki semafor jak w myjni i dwa punkty pomiaru :D
Słusznie, nie jest to estetyczne, ale nie o to chodziło.
Co do kosztów. Koszty w dolarach – Czujnik 0.99, klon arduino 2.58, matryca 2×2,50, zasilacz 1.6 i jakieś kabelki, no i obudowa. Całość to koszt około 10 dolarów + kabelki i wykonanie obudowy, gdybyśmy kupowali na aliexpressie. Naturalnie na to wszystko trzeba mieć czas, żeby to złożyć i zaprogramować, a wspomniana wyżej bariera laserowa za 18.70 dol. (bez zasilacza) raczej jest produktem gotowym i trudno tu faktycznie o jakiś skomplikowany projekt elektroniczny czy programistyczny.
a gdybym chciał to zrobić na dwóch wyświetlaczach 7 segmentowych? co trzeba zmienić w kodzie?
Mozna zamiast matrycy zastosowac wyświetlacz LCD 2*16? Napewno widocznosc znakow bedzie duzo mniejsza
Można. Tylko musisz zmienić tą część kodu, która odpowiada za wyświetlacz.
I musisz uważać na czasy. Z tego, co wiem, obsługa wyświetlacza LCD może wprowadzać opóźnienia, które będą zakłócały pracę czujnika.
Witam super projekt ,nie bardzio wiem jak to samemu wykonac była by chetna osoba aby odpłatnie wykonac taki układ ?
Witaj, zakupiłem, złożyłem, zasiliłem i kicha :-(. Część pomiarowa czyli czujnik ultra działa bo na monitorze portu szeregowego pokazuje jak liczy odległość. Ale matryce zupełnie zgłupiały – albo poświecą całe przez chwilę i pomiga jedna albo wcale nie działają lub pojawia się pionowy pasek z ledów przesuwający się po matrycach a potem ciemno. Proszę o schemat połączeń układu – może coś mi nie wyszło. Pozdrawiam.
Komuś też wyskakują błedy w kodzie? Jest mi w stanie ktoś pomóc?
Ja kiedyś jak jeździłem dostawczakiem bez środkowego lusterka po prostu zamontowałem na kiju w odpowiedniej odległości od ściany włącznik starej lampki jak się zapaliło to znaczy stop. Też działało i dużo łatwiejsze w budowie. :)
Bardzo fajna sprawa dla takich co chcą coś zrobić samemu, a krytykanci niech się chwalą że samodzielnie kupili od Chińczyków albo powiesili kij do miotły.
Witam
Jestem początkujący w programwaniu .Wywala mi błąd w pierwszym wierszu szkicu , prosze o sprawdzenie.
Prosze też o schemat podłaczenia
Pozdraiwiam
Błąd jest prawdopodobnie spowodowany tym, że nie masz ściągniętej biblioteki, której nazwa jest w pierwszej linii.
Schematu faktycznie nie ma. Ale… czujnik odległości podpinasz
Echo -> pin 6
Trig -> pin 7
Wyświetlacz… masz w tej linijce podłączenie:
LedControl lc=LedControl(12,10,11,2); // Pins: DIN,CLK,CS, # of Display connected
W tekście też jest to opisane
Mamy problem. Oba wyswietlacze podłączylismy do wejsc 10,11,12 +5 i GND, ale oba pokazywaly nam cyfre dziesiatek. Co mozemy z tym zrobic?
Założyć temat na forum. Wstawić zdjęcia (albo schemat), kod programu. Bez tego naprawdę trudno się pomaga
Pomysł bardzo fajny :) Aż chętnie ten czujnik zastosuję do innych swoim rzeczy.
Ale czy nie prościej by było zawiesić pod sufitem lusterko i ustawić pod takim kątem, że z auta widać będzie dokładnie jak podjeżdżasz? Może być np takie wyprofilowane lusterko z samochodu ciężarowego. Przy okazji się ktoś dowie, że ma żarówkę spaloną jak jeszcze nie zauważył tego ;)
Pozdrawiam!