(pseudo) Miernik odległości

(pseudo) Miernik odległości

INFORMACJA: Poniższy post nie wydostał się z Poczekalni :(

Cześć Majsterkowicze :)
W tym projekcie wykorzystałem ultradźwiękowy czujnik odległości arduino i ledy. Projekt mierzy pseudo odległość. A dokładniej każda dioda (jest ich 10) odpowiada za 5 centymetrów odległości. Czyli dokładność wskazywanej odległości to +/- 2.5 centymetra. Do 5 centymetrów pali się jedna dioda, do 10 centymetrów palą się 2 diody i tak dalej… Jest tutaj 10 diod tak więc działa to do 50 centymetrów. Zabezpieczeniem informującym o odległości większej niż 50 centymetrów jest chwilowe zapalanie się po kolei diod od lewej do prawej i z powrotem.

Potrzebne elementy:
-arduino (w moim przypadku UNO)
-10 diod(kolor dowolny tak jak i rozmiar)
-10 oporników(wartości dobieramy do swoich diod)
-ultradźwiękowy czujnik odległości HC-SR04
-płytka stykowa
-przewody połączeniowe

Przedmioty te można zakupić na botland.com.pl:
http://botland.com.pl/plytki-stykowe/55-plytka-stykowa-a-830-otworow.html
http://botland.com.pl/ultradzwiekowe-czujniki-odleglosci/1420-ultradzwiekowy-czujnik-odleglosci-hc-sr04-2-200cm.html
http://botland.com.pl/przewody-polaczeniowe/1022-przewody-polaczeniowe-mesko-meskie-65szt.html
http://botland.com.pl/arduino-moduly-glowne/1060-arduino-uno-r3.html

Co do rezystorów i arduino pozostawiam wybór osobie, która będzie chciała stworzyć ten projekt, ponieważ można kupić 10 oporników albo 1000 zależy to od użytkowania i wykorzystywania oporników w innych projektach. Co do arduino to można sobie wybrać takie jakie pasuje danemu majsterkowiczowi.

http://botland.com.pl/439-arduino-team-oryginalne-plytki
http://botland.com.pl/50-rezystory

Schemat podłączenia elementów na płytce stykowej:

odległość_bb2

#define L1 2
#define L2 3
#define L3 4
#define L4 5
#define L5 6
#define L6 7
#define L7 8
#define L8 9
#define L9 10
#define L10 11
#define trig 12
#define echo 13


void setup()
{
for(int i=2;i<=12;i++)
  {
pinMode(i,OUTPUT);
  }
pinMode(trig, OUTPUT);
  pinMode(echo, INPUT);
Serial.begin(9600);
}

void loop()
{
    int wynik,g,i;
long czas,odle;
    

    digitalWrite(trig, LOW);
delayMicroseconds(2);
    digitalWrite(trig,HIGH);
delayMicroseconds(10);
    digitalWrite(trig,LOW);

    czas = pulseIn(echo,HIGH);
odle = czas / 58;
    
delay(50);
    Serial.print(odle);
Serial.println(" cm");

if (odle<5)
    {
digitalWrite(L1,HIGH);
    digitalWrite(L2,LOW);
digitalWrite(L3,LOW);
    digitalWrite(L4,LOW);
digitalWrite(L5,LOW);
    digitalWrite(L6,LOW);
digitalWrite(L7,LOW);
    digitalWrite(L8,LOW);
digitalWrite(L9,LOW);
    digitalWrite(L10,LOW);
}
    else if(odle<10)
{
    digitalWrite(L1,HIGH);
digitalWrite(L2,HIGH);
    digitalWrite(L3,LOW);
digitalWrite(L4,LOW);
    digitalWrite(L5,LOW);
digitalWrite(L6,LOW);
    digitalWrite(L7,LOW);
digitalWrite(L8,LOW);
    digitalWrite(L9,LOW);
digitalWrite(L10,LOW);
    }
else if(odle<15)
    {
digitalWrite(L1,HIGH);
    digitalWrite(L2,HIGH);
digitalWrite(L3,HIGH);
    digitalWrite(L4,LOW);
digitalWrite(L5,LOW);
    digitalWrite(L6,LOW);
digitalWrite(L7,LOW);
    digitalWrite(L8,LOW);
digitalWrite(L9,LOW);
    digitalWrite(L10,LOW);
}
    else if(odle<20)
{
    digitalWrite(L1,HIGH);
digitalWrite(L2,HIGH);
    digitalWrite(L3,HIGH);
digitalWrite(L4,HIGH);
    digitalWrite(L5,LOW);
digitalWrite(L6,LOW);
    digitalWrite(L7,LOW);
digitalWrite(L8,LOW);
    digitalWrite(L9,LOW);
digitalWrite(L10,LOW);
    }
else if(odle<25)
    {
digitalWrite(L1,HIGH);
    digitalWrite(L2,HIGH);
digitalWrite(L3,HIGH);
    digitalWrite(L4,HIGH);
digitalWrite(L5,HIGH);
    digitalWrite(L6,LOW);
digitalWrite(L7,LOW);
    digitalWrite(L8,LOW);
digitalWrite(L9,LOW);
    digitalWrite(L10,LOW);
}
    else if(odle<30)
{
    digitalWrite(L1,HIGH);
digitalWrite(L2,HIGH);
    digitalWrite(L3,HIGH);
digitalWrite(L4,HIGH);
    digitalWrite(L5,HIGH);
digitalWrite(L6,HIGH);
    digitalWrite(L7,LOW);
digitalWrite(L8,LOW);
    digitalWrite(L9,LOW);
digitalWrite(L10,LOW);
    }
else if(odle<35)
    {
digitalWrite(L1,HIGH);
    digitalWrite(L2,HIGH);
digitalWrite(L3,HIGH);
    digitalWrite(L4,HIGH);
digitalWrite(L5,HIGH);
    digitalWrite(L6,HIGH);
digitalWrite(L7,HIGH);
    digitalWrite(L8,LOW);
digitalWrite(L9,LOW);
    digitalWrite(L10,LOW);
}
    else if(odle<40)
{
    digitalWrite(L1,HIGH);
digitalWrite(L2,HIGH);
    digitalWrite(L3,HIGH);
digitalWrite(L4,HIGH);
    digitalWrite(L5,HIGH);
digitalWrite(L6,HIGH);
    digitalWrite(L7,HIGH);
digitalWrite(L8,HIGH);
    digitalWrite(L9,LOW);
digitalWrite(L10,LOW);
    }
else if(odle<45)
    {
digitalWrite(L1,HIGH);
    digitalWrite(L2,HIGH);
digitalWrite(L3,HIGH);
    digitalWrite(L4,HIGH);
digitalWrite(L5,HIGH);
    digitalWrite(L6,HIGH);
digitalWrite(L7,HIGH);
    digitalWrite(L8,HIGH);
digitalWrite(L9,HIGH);
    digitalWrite(L10,LOW);
}
    else if(odle<50)
{
    digitalWrite(L1,HIGH);
digitalWrite(L2,HIGH);
    digitalWrite(L3,HIGH);
digitalWrite(L4,HIGH);
    digitalWrite(L5,HIGH);
digitalWrite(L6,HIGH);
    digitalWrite(L7,HIGH);
digitalWrite(L8,HIGH);
    digitalWrite(L9,HIGH);
digitalWrite(L10,HIGH);
    }
else
    { 
for(int i=2;i<=12;i++)
      {
digitalWrite(i,HIGH);
        digitalWrite(i-1,LOW);
delay(10);
      } 
for(int i=12;i>=2;i--)
      {
digitalWrite(i,HIGH);
        digitalWrite(i+1,LOW);
delay(10);
      }
}

}

1

2

3

4

4.1

5

Tak wygląda działanie:

A tak jeśli przekroczymy 50 centymetrów:

Pozdrawiam, Marcin

INFORMACJA: Poniższy post nie wydostał się z Poczekalni :(

Ocena: 1.83/5 (głosów: 6)

Podobne posty

20 komentarzy do “(pseudo) Miernik odległości

    • Może i gniot ale działa i spełnia swoją funkcję. A swoją drogą ciekawe ile ci zajęło lat aby wpaść na to że to GNIOT?

      Odpowiedz
  • @anonim @Fapaja Przypuszczam że już coś wrzuciłeś na główną skoro tak krytykujesz, myślę że z pewnością się pochwalisz. Poza tym nie każdy tutaj siedzący jest mistrzem elektroniki, może taki artykuł byłby dla niego świetną okazja do zapoznania się z tematem.

    Takie komentarze powodują tylko że postów jest coraz mniej, naturalnie jeśli postów będzie więcej to te najlepsze będą wchodzić…

    Odpowiedz
    • Nie polecam osobom które nie mają styczności z programowaniem ponieważ nie nauczą się niczego nowego. Jest pokazywany sam kod (BEZ KOMENTARZY)

      Odpowiedz
    • To jeden z moich ulubionych bezsensownych argumentów. Zasługi mają się nijak do słuszności czyjegoś zdania. Niestety, ale muszę się zgodzić z Fapaja.

      Artykuł jest bardzo słaby, brak nawet opisu zasady działania zarówno czujnika jak i kodu. Zastanawiam się, czy autor w ogóle potrafiłby wyjaśnić skąd wzięła się liczba 58. Ponadto autor, podobnie jak większość osób związanych z ekosystemem arduino, w gruncie rzeczy nie potrafi programować (co widać po jakości kodu) i według mnie nie powinien jeszcze próbować uczyć innych.

      Odpowiedz
    • “może taki artykuł byłby dla niego świetną okazja do zapoznania się z tematem.”
      Oby nikt się z tego nie uczył. Chociażby kod jest świetnym przykładem. Prawie 200 linijek… niczego. A dało by się nie wysilając skrócić do 20.

      Odpowiedz
  • Miernik odległości zawiera wiele błędów. Kod jest zrozumiały dla kogoś kto dobrze zna dane zagadnienie, ale zupełnie bezużyteczny dla kogoś kto chce się dopiero tego zagadnienia nauczyć. Nie próbuje się w niej tłumaczyć złożone mechanizmy np. odnosząc się do konkretnych implementacji. Bariera znajomości technologii nie umożliwia komuś kto nie zna takich technologiach na jakiekolwiek zrozumienie tematu.

    Odpowiedz
  • W sumie to takie coś to się da zrobić bez arduino.
    W sumie to nawet bardzo prosto się da , wystarczy wzmacniacz operacyjny ( a właściwie kilka , w zależności od ilości LED) , kondensator i odpowiedni rezystor. Sygnał PMW ładował by kondensator a rezystor by go rozładowywał. Odległość jest podawana w wypełnieniu sygnału PMW z czujnika więc napięcie na kondensatorze zmieniało by się w zależności od wskazań czujnika. Odpowiednio ustawione wzmacniacze włączały by kolejne diody w zależności od napięcia na kondensorze. To tylko teoria stworzona na szybko ale sądzę , że by zadziałało.
    A po drugie to w ogóle ten czujnik nie służy jako miarka a bardziej do mapowania otoczenia.

    Odpowiedz
  • Po przeczytaniu niepochlebnych komentarzy, temat zaciekawił mnie jeszcze bardziej, i tu niestety wróciłem do kodu programu. Mam do was prośbę czy moglibyście opisać/odpowiedzieć na moje wątpliwości. Czy dobrze rozumiem, że czujnik odbiera sygnał PWM z portu triger, a zwraca (w zależności od odległości) ten sygnał odpowiednio zmieniony na port echo? Co oznacza te mityczne 58? I czy skoro czujnik zwraca PWM, to czy można do odbioru wartości wykorzystać piny analogowe (wiem, że może to być mniejsza dokładność, ale nie potrzebuję aż tak dużej)
    Ewentualnie wrzućcie jakiś artykuł nawet teoretyczny.
    Pozdr

    Odpowiedz
    • Z tego co pamiętam przy zabawach z tym czujnikiem to na wyjściu echo pojawia się stan wysoki kiedy czujnik odbierze sygnał (wysłany wcześniej dźwięk/ultradźwięk) Innymi słowy jeśli procesor ustawi np na 10ms stan wysoki na pinie podłączonym do “triger” to czujnik wysyła “dźwięk”, który leci i po odbiciu od przeszkody wraca do do czujnika powodując pojawienie się krótkiego stanu wysokiego na wyjściu echo.
      Czas jaki upłynął od pojawienia się stanu wysokiego na “triger” do momentu pojawienia się stanu wysokiego na “echo” mierzy procesor. Ponieważ dźwięk w powietrzu rozchodzi się z prędkością 340m/s (1cm/29ms) a czas (przez procesor) jest mierzony w milisekundach to trzeba go podzielić przez 29 aby otrzymać wartość odległości w centymetrach. Magiczna liczba 58 wynika stąd, że dźwięk leci do przeszkody i wraca czyli musimy go podzielić jeszcze przez 2 (np 580ms/29ms/2 = 10cm czyli 580/58=10). Co do użycia pinów analogowych to wydaje mi się, że można czujnik podłączyć do dowolnego pinu gdyż jak pisałem wcześniej zwraca on stan wysoki a nie PWM.
      A co do artykułu to…. bez komentarza.

      Odpowiedz
      • Tego mi właśnie brakowało najbardziej wytłumaczenia jak ten czujnik komunikuje się z kontrolerem. Wielkie dzięki. I nasunął mi się teraz pomysł, czy nie można tego wykorzystać, znaczy pinu echo jako wyzwalacz przerwania np z tranzystorem, ale to już chyba temat na forum.

        Odpowiedz
        • hmm… może i by się dało ale trochę trzeba by pokombinować… jeśli dobrze zrozumiałem to chcesz pozbyć się procesora i wykorzystać sam moduł? Nie wydaje mi się, żeby zadziałało to jako czujnik przerwania (odpowiednik bariery optoelektronicznej?). Problem polega na tym, że czujnik za pomocą procka raz wysyła sygnał a raz nasłuchuje. Nie może jednocześnie wysyłać i odbierać bo cały czas miałbyś stan wysoki na echo (bez względu na to czy przetniesz drogę sygnału).
          Jeśli użyjesz procka to problemu nie ma. Mierzysz odległość od np ściany czyli tam gdzie ma być bariera i jeśli ktoś/coś przetnie to odległość (czas odbicia) się zmieni. Procesor to wykrywa i robi co mu powiesz np włącza alarm :)

          Odpowiedz
  • Nie nie chodziło mi o coś takiego, że procesor jest w trybie uśpienia, a pojawiający się sygnał wybudza procesor, taki system na zasilany bateryjnie czujnik odległości w garażu

    Odpowiedz

Odpowiedz

anuluj

Masz uwagi?