wtorek, 16 sierpnia 2011

Czujnik ultradźwiękowy odległości HC-SR04 ze wskaźnikiem led



W kolejnym projekcie wykorzystałem diody LED... każda z nich to 5cm odległości... 8 diod to jakieś 40 cm. Poniżej 5 cm wyłączają się wszystkie. skrypt pisałem sam... he he i działa... z pewnością można napisać go lepiej ale jak na moje umiejętności to i tak wydaje mi się że nieźle... jeżeli ktoś ma jakiś lepszy pomysł to proszę o sugestię. Może kiedyś jeszcze do tego wrócę :).

int impuls = 2;
int sonar = 3;
long czas, cm;

const int ledCount = 10;
int ledPins[] = { 4, 5, 6, 7, 8, 9,10,11,12,13 };

void setup() {
  pinMode(impuls, OUTPUT);
  pinMode(sonar, INPUT);
  
  for (int thisLed = 0; thisLed < ledCount; thisLed++) {
    pinMode(ledPins[thisLed], OUTPUT);
     Serial.begin(9600);}
}

void loop()
{
  digitalWrite(impuls, LOW);
  delayMicroseconds(2);
  digitalWrite(impuls, HIGH);
  delayMicroseconds(10);
  digitalWrite(impuls, LOW);
  czas = pulseIn(sonar, HIGH);
  cm = mikrosekundynacentymetry(czas);
  if (cm >= 5){on1();}else{off1();}
  if (cm >= 10){on2();}else{off2();}
  if (cm >= 15){on3();}else{off3();}
  if (cm >= 20){on4();}else{off4();}
  if (cm >= 25){on5();}else{off5();}
  if (cm >= 30){on6();}else{off6();}
  if (cm >= 35){on7();}else{off7();}
  if (cm >= 40){on8();}else{off8();}
  if (cm >= 45){on9();}else{off9();}
  if (cm >= 50){on10();}else{off10();}

  Serial.print("Distance: [");
  Serial.print(cm);
  Serial.print("]cm\n");
  delay(100);}

long mikrosekundynacentymetry(long mikrosekundy)
{return mikrosekundy / 29 / 2;}

void  on1(){ digitalWrite( 4, HIGH); }
void  on2(){ digitalWrite( 5, HIGH); }
void  on3(){ digitalWrite( 6, HIGH); }
void  on4(){ digitalWrite( 7, HIGH); }
void  on5(){ digitalWrite( 8, HIGH); }
void  on6(){ digitalWrite( 9, HIGH); }
void  on7(){ digitalWrite(10, HIGH); }
void  on8(){ digitalWrite(11, HIGH); }
void  on9(){ digitalWrite(12, HIGH); }
void on10(){ digitalWrite(13, HIGH); }

void  off1(){ digitalWrite( 4, LOW); }
void  off2(){ digitalWrite( 5, LOW); }
void  off3(){ digitalWrite( 6, LOW); }
void  off4(){ digitalWrite( 7, LOW); }
void  off5(){ digitalWrite( 8, LOW); }
void  off6(){ digitalWrite( 9, LOW); }
void  off7(){ digitalWrite(10, LOW); }
void  off8(){ digitalWrite(11, LOW); }
void  off9(){ digitalWrite(12, LOW); }
void off10(){ digitalWrite(13, LOW); }
...

7 komentarzy:

  1. Witaj Maćku a może napisał byś jak wykorzystać ten czujnik z wyświetlaczem lcd 2x16 lub w robocie do omijania przeszkód na arduino bo w całej sieci są różne kody i wszystkie nie są poprawne
    Pozdrawiam wasyl2007

    OdpowiedzUsuń
  2. Witaj Wasylu, ależ masz bardzo fajny kod w zakładce projekt1 nawet dwa :) chyba :) 2... losowy najbardziej mi się podoba, robot znajduje przeszkodę losuje jedną z trzech możliwości i ją wykonuje... jest mało przewidywalny przez co wciąga na dłuższą chwilę... na końc jest line folower ale niestety nie mogę sobie jeszcze z nim poradzić, cięgle nie wychodzi :(... ale może niebawem... przynajmniej już wiem gdzie problem :) muszę ułożyć kod jakoś logicznie... najwyżej że masz już jakieś rozwiązanie
    pozdrawiam Maciek

    OdpowiedzUsuń
    Odpowiedzi
    1. Sorki Maćku nie doczytałem bardzo mi się podobają Twoje artykuły trzymaj tak dalej.Ja też interesuje się arduino ale niestety zawsze budowałem raczej żeczy elektroniczne a na programowaniu nie znam się zupełnie.Też bardzo chciałbym zbudować robocika kupiłem nawet wszystkie potrzebne elementy ale niestety nie mogę poradzić sobie z kodem do arduino wykorzystał bym ten kod który umieściłeś ale u mnie sprawa wygląda inaczej ponieważ ja mam motor shield i u mnie przykładowy kod wygląda tak;
      //określamy, które piny sterują silnikami
      //piny sterujące prędkością silników
      int EN1 = 6;
      int EN2 = 5;

      //piny sterujące kierunkiem jazdy
      int IN1 = 7;
      int IN2 = 4;

      int R = 0; //jazda do tyłu
      int F = 1; //jazda do przodu


      //funkcje sterujące silnikami – pwm określa prędkość, reverse kierunek
      void Motor1(int pwm, boolean reverse)
      {
      analogWrite(EN1,pwm); //ustawia wypełnienie PWM: 0 - silnik zatrzymany, 255 - pełna prędkość
      if(reverse)
      {
      digitalWrite(IN1,HIGH);
      }
      else
      {
      digitalWrite(IN1,LOW);
      }
      }
      void Motor2(int pwm, boolean reverse)
      {
      analogWrite(EN2,pwm); //ustawia wypełnienie PWM: 0 - silnik zatrzymany, 255 - pełna prędkość
      if(reverse)
      {
      digitalWrite(IN2,HIGH);
      }
      else
      {
      digitalWrite(IN2,LOW);
      }
      }

      void setup()
      {
      int i;
      for(i=4;i<=7;i++) { //Dla Arduino Motor Shield
      pinMode(i, OUTPUT); //ustaw piny 4,5,6,7 jako wyjścia
      }
      }

      void loop() {
      //jedź do przodu przez 5 sekund
      Motor1(255,F);
      Motor2(255,F);
      delay(5000);
      Motor1(0,F); //zatrzymaj się na 5 sekund
      Motor2(0,F);
      delay(5000);
      //jedź do tyłu przez 5 sekund
      Motor1(255,R);
      Motor2(255,R);
      delay(5000);
      Motor1(0,F); //zatrzymaj się na 5 sekund
      Motor2(0,F);
      delay(5000);
      Motor1(255,F);
      Motor2(255,R);
      delay(1000);
      Motor1(0,F); //zatrzymaj się na 5 sekund
      Motor2(0,F);
      delay(5000);

      }

      Usuń
    2. powiedz jeszcze jakie masz objawy :) z urządzeniem? oczywiście

      Usuń
  3. Witaj rzeczywiście wygląda to strasznie :) oczywiście do rozgryzienia :), to nie tak że ja się na tym w pełni na tym znam ale tak jak i ty się uczę... jedyna podstawa z programowania jaką mam to kurs z lat 80 programowanie w basic'u na commodore64... he he prawie to ten sam poziom prostoty... tak przynajmniej myślałem, potem porobiłem kilka stron w htmlu i wziąłem się na arduino... i mniejwięcej wygląda to jak bym chciał polecieć na księżyc :) na szczęście coraz więcej info jest w internecie ;) a hobby się rozwija...

    powiedz dokładnie który motor shield masz? coś poszukam bo ten kod jak na początek jest mocno skomplikowany... sam miałem tak że pierwsze kody jakie znalazłem w sieci były mega rozbudowane... potem okazało się że można w miarę prościej coś zapisać :) przy okazji współpracy wrzucę twój moto shield do bloga...

    OdpowiedzUsuń
    Odpowiedzi
    1. Witaj oczywiście ten kod to tylko próba jazdy.Chciałem go przerobić żeby współpracował z jakimś czujnikiem ale przyznam szczerze że ten kod mnie przeraził.Twój kod jest dużo bardziej zrozumiały pospieszyłem się z kupnem tego shielda,ale do rzeczy motor shield jest firmy DFrobot 2x2A a kupiłem go w sklepie który pewnie znasz sklep www.trobot.pl tam też jest dokładny opis shielda.Jak będziesz miał chwilkę to zajrzyj na you tube filmik nazywa się "diode the 2nd"Takiego robocika chciałbym zbudować ale oczywiście od chciałbym do gotowego projektu dzielą mnie jakieś 2 lata świetlne

      Usuń
  4. Witaj Maćku po wielu próbach doszedłem z tym moim kodem robot jedzie do przodu a kiedy wykryje przeszkodę cofa się następnie skręca i jedzie dalej do tego dołożyłem od siebie diodę RGB dioda pali się na zielono a kiedy robot wykryje przeszkodę zmienia kolor na czerwony.Myślałem o tym twoim projekcie i zastanawiałem się dlaczego musisz zatrzymywać robota przed mierzeniem odległości u mnie ten problem nie występuje a mam bardzo głosne silniki,myślę że to za sprawą filtra czyli na przewodach przy silnikach założyłem pierścienie ferytowe to powinno zalatwić problem
    pozdrawiam

    OdpowiedzUsuń