Bouw goedkoop je eigen Arduino afstandsmeter

In deze post ga ik stap voor stap beschrijven hoe je zelf eenvoudig en goedkoop een digitale ultrasoon afstandsmeter kan bouwen. Met de arduino die we gebruiken kan je simpel alles aan elkaar knopen. En omdat de werking bepaald wordt door de software kan je die eenvoudig aanpassen naar je eigen wensen.

Elektronica Maandblad
Elektronica Maandblad

Vroeger (ja, ja, lang geleden) had je een blad als Elektuur en daarin verschenen telkens nieuwe zelfbouw elektronica projecten. Dan kon je een printje bestellen en alle transistor’s, weerstanden, enz. en moest je dat in elkaar solderen. Als je het goed had gedaan, had je daarna een werkende versterker, radio-zender, of wat dan ook.

Tegenwoordig kan je heel veel elektronica projectjes bouwen met een Arduino mini-computer. Dit is een computertje van 6,5 x 5 centimeter, met er veel input & output (I/O) pinnen. Via die I/O pinnen kan je weer allerlei displays of sensoren aansluiten en dat maakt het zo makkelijk om een compleet project te bouwen met dit mini-computertje.
Naast de hardware heb je software nodig om het geheel te laten werken. De software kan je schrijven in de Arduino IDE (Integrated Development Environment), die is gratis te downloaden van de Arduino website.Arduino UNO

De afstandsmeter uit deze post werkt met ultrasoon geluid. De frequentie is 40 kHz, dus dat is niet te horen, tenzij je een vleermuis bent.

De manier waarop het werkt is dat er een geluidspuls wordt uitgezonden en op datzelfde moment wordt in de Arduino de stopwatch gestart en gaat hij luisteren. Zodra hij de geluidspuls weer ontvangt wordt die stopwatch gestopt en dan is het een kwestie van de tijd delen door de geluidssnelheid (1234,8 km/h)geluidssnelheid (1234,8 km/h) om de afstand te vinden. Simpel toch?

Boodschappenlijstje

Testen

Begin met het op elkaar aanbrengen van de Arduino Uno en het LCD shield. Sluit de Arduino via de USB kabel aan op de computer en download de Arduino Integrated Development Environment (IDE) en installeer die volgens de instructies.
Voordat je zo meteen het test programma wat hier onder getoond is kan uploaden naar de arduino, moet je wel eerst het juiste type selecteren, voor ons is dat de “Arduino UNO”.

// Arduino LCD met knoppen shield
#include <LiquidCrystal.h>

// selecteer de pinnen die gebruikt zijn op het LCD panel
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// initialiseer de variabelen die je verderop gaat gebruiken
int lcd_key     = 0;
int adc_key_in  = 0;
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5

// lees de knoppen uit
int read_LCD_buttons()
{
 adc_key_in = analogRead(0);      // lees de waarde uit van de sensor
 //de knoppen zitten op een analoge ingang aangesloten
 //ze worden op de Arduino via de Analoog-Digitaal converter uitgelezen
 if (adc_key_in > 1000) return btnNONE; // dit is de optie voor als niets ingedrukt is
 if (adc_key_in < 50)   return btnRIGHT;  
 if (adc_key_in < 250)  return btnUP; 
 if (adc_key_in < 450)  return btnDOWN; 
 if (adc_key_in < 650)  return btnLEFT; 
 if (adc_key_in < 850)  return btnSELECT;  

 return btnNONE;  // als niets is ingedrukt....
}

void setup()
{
 lcd.begin(16, 2);              // start de routine
 lcd.setCursor(0,0);
 lcd.print("Druk op een knop"); // toon bericht op het display
}
 
void loop()
{
 lcd.setCursor(9,1);            // verplaats de cursor naar de 2e regel "1" en overschrijf met 9 spaties
 lcd.print(millis()/1000);      // toont het aantal seconden sinds power-up


 lcd.setCursor(0,1);            // ga naar de 2e regel
 lcd_key = read_LCD_buttons();  // lees de knoppen

 switch (lcd_key)               // doe een actie afhankelijk van de knop die ingedrukt is
 {
   case btnRIGHT:
     {
     lcd.print("RIGHT ");
     break;
     }
   case btnLEFT:
     {
     lcd.print("LEFT  ");
     break;
     }
   case btnUP:
     {
     lcd.print("UP    ");
     break;
     }
   case btnDOWN:
     {
     lcd.print("DOWN  ");
     break;
     }
   case btnSELECT:
     {
     lcd.print("SELECT");
     break;
     }
     case btnNONE:
     {
     lcd.print("NONE  ");
     break;
     }
 }

}


Je kan de software hier downloaden: Arduino LCD Keypad test

Aansluiten Hardware

Als de test met het LCD scherm goed is verlopen kan je verder gaan met het aansluiten van de sensor.
De Ultrasoon afstand sensor heeft 4 aansluiten, één voor +5 Volt (Vcc), een voor massa (GND), deze worden doorverbonden met Vcc en GND van de Arduino Uno.
Voor de data aansluiting is een aansluiting van Trigger/TX nodig op aansluiting A3 van de Arduino en Echo/Rx komt op A2.
Meer verbindingen zijn er niet nodig.

Software

// Ultrasonic Distance Meter with LCD Display
// 20141007 Ewald

#include <LiquidCrystal.h>

unsigned int EchoPin = 2;           // connect Pin 2(Arduino digital io) to Echo/RX at US-100
unsigned int TrigPin = 3;           // connect Pin 3(Arduino digital io) to Trig/TX at US-100
unsigned long Time_Echo_us = 0;
unsigned long Len_mm  = 0;
float Len_cm = 0;
float tmp = 0;

// select the pins used on the LCD panel
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

void setup()
{  //Initialize
    Serial.begin(9600);                         //Serial: output result to Serial monitor
    pinMode(EchoPin, INPUT);                    //Set EchoPin as input, to receive measure result from US-100
    pinMode(TrigPin, OUTPUT);                   //Set TrigPin as output, used to send high pusle to trig measurement (>10us)

  // start the LCD library
  lcd.begin(16, 2);                              // 16 characters, 2 rows
  lcd.setCursor(0,0);                            // position first row, first position
  lcd.print("Distance (cm):");
}


void loop()
{
    digitalWrite(TrigPin, HIGH);              //begin to send a high pulse, then US-100 begin to measure the distance
    delayMicroseconds(50);                    //set this high pulse width as 50us (>10us)
    digitalWrite(TrigPin, LOW);               //end this high pulse
    
    Time_Echo_us = pulseIn(EchoPin, HIGH);               //calculate the pulse width at EchoPin, 
    if((Time_Echo_us < 60000) && (Time_Echo_us > 1))     //a valid pulse width should be between (1, 60000).
    {
      Len_mm = (Time_Echo_us*34/100)/2;      //calculate the distance by pulse width, Len_mm = (Time_Echo_us * 0.34mm/us) / 2 (mm)
      Serial.print("Present Distance is: ");  //output result to Serial monitor
 
      lcd.setCursor(0,1);                   // position second row, first position
      tmp = Len_mm ; Len_cm = tmp / 10;     // the trick with tmp is ugly, but otherwise Len_cm gets rounded down (computation is done as a int and than assigned to the float)
      lcd.print(Len_cm);
      
      Serial.print(Len_mm, DEC);            //output result to Serial monitor
      Serial.println("mm");                 //output result to Serial monitor
    }
    delay(1000);                            //take a measurement every second (1000ms)
}

Je kan de software hier downloaden: Arduino US100 code

Je kan nu zelf wat experimenteren met het programma om je eigen tekst te laten zien. De metingen van dichtbij zijn waarschijnlijk al aardig nauwkeurig. Voor wat grotere afstanden kan het handig zijn als je een kokertje maakt rondom de ultrasoon sensor.

Eind Resultaat

Arduino Afstandsmeter