Introduction: Ultrasonic Interface

Made with 2 ultrasonic rangefinders (SRF02), old mac-keyboard & 1 Arduino Uno.

Schoolproject (course: Mechatronics), Industrial Design school Kortrijk.

On the site of TIII (Tangible Intuitive Interactive Interfaces) you can find inspiration and other Arduino based projects (it's in dutch, but visually, you 'll get the point.)


see the instructable for the hacking: Hacking a USB keyboard



Arduino code:

// MATHIEU LEFEBVRE & YORICK STUYTS
// 2011-2012: MECHATRONIA

//laad libraries voor communicatie met ultrasoon sensor SRF02
#include <Wire.h>
#include <SRF02.h>

int w = 300;

//Create a new instance of a SRF02 sensor with the specified (7-bit) device id and measurement mode (SRF02_INCHES, SRF02_CENTIMETERS, SRF02_MICROSECONDS).
SRF02 srf02[2] = {
  SRF02(0x70, SRF02_CENTIMETERS),
  SRF02(0x71, SRF02_CENTIMETERS)
};

// variabelen nodig voor positiemeting
int afstandVA=0;                 
int afstandLR=0;
int reading = 0;

// variabelen nodig voor positiebepaling
String key="leeg";

//variabelen nodig voor de positieberekening
int grenzenVA [4]= {150,190,  260,300};        //binnen welke afstanden liggen volgende commando's (vooruit/achteruit)
int grenzenLR [4]= {150,190,  260,300};        //binnen welke afstanden liggen volgende commando's (links/rechts)


void setup(){
 
  Wire.begin();                // join i2c bus (address optional for master)
  Serial.begin(9600);          // start serial communication at 9600bps
  SRF02::setInterval(70);      // default is 70
 
  // pin x => relais x => toetsslag => PC/MAC
  pinMode(2, OUTPUT);    //UP
  pinMode(3, OUTPUT);    //DOWN
  pinMode(4, OUTPUT);    //LEFT
  pinMode(5, OUTPUT);    //RIGHT
}


void loop(){
 
  meetAfstand();                // afstanden tot alle sensoren
 
  berekenPositie();             // berekendde positie met behulp van de gemeten afstanden
                                // coordinaat van positie
                                // en ken een toets toe aan een bepaalde positie
 
  activeerToets();              // activeer toets via:
                                // optie 1: relais => toetsenbord => usbkabel => PC, de correcte relais wordt aangestuurd
}


void meetAfstand(){
// hier gaan we over van hardware naar software
  // code from: http://www.grapelabs.org/arduino/libraries/srf02-ultrasonic-distance-sensor

    //EERSTE LEZING
    SRF02::update();
      afstandVA=srf02[0].read();
      afstandLR=srf02[1].read();
      
    //output van de lezingen na storings-controle
    Serial.print("VA: ");   
    Serial.print(afstandVA);
    Serial.print("    LR: ");   
    Serial.print(afstandLR);
    Serial.print(" ");



void berekenPositie(){
//deze functie berekend de positie en kent een toests toe aan een welbepaalde positie
 
//berekening positie: vooruit, achteruit, links & rechts
   if( afstandVA>grenzenVA[0] && afstandVA    if( afstandVA>grenzenVA[2] && afstandVA    if( afstandLR>grenzenLR[0] && afstandLR    if( afstandLR>grenzenLR[2] && afstandLR
   if( afstandVA>grenzenVA[1] && afstandVAgrenzenLR[1] && afstandLR     key=" ";
    digitalWrite(2,LOW);
    digitalWrite(3,LOW);
    digitalWrite(4,LOW);
    digitalWrite(5,LOW);
  }
  
//output ter controle tijdens programeren/werking  
Serial.print("BEREKENDE POSITIE");
Serial.print(key);
Serial.println("  ");  
}
 

void activeerToets(){
//hier gaan we over van de software naar de hardware, relais worden aangestuurd om zo een toestslag via een usb-toestenbord door te sturen naar de aangesloten computer
  if (key=="UP"){//activeer up-relais
    digitalWrite(3,LOW);
    digitalWrite(4,LOW);
    digitalWrite(5,LOW);
    delay(50);
    digitalWrite(2, HIGH);
    delay(w-50);
  }
  else if (key=="DOWN"){//activeer down-relais
    digitalWrite(2,LOW);
    digitalWrite(4,LOW);
    digitalWrite(5,LOW);
    delay(50);
    digitalWrite(3, HIGH);
    delay(w-50);
  }
  else if (key=="LEFT"){//activeer left-relais
    digitalWrite(2,LOW);
    digitalWrite(3,LOW);
    digitalWrite(5,LOW);
      delay(50);
      digitalWrite(4,LOW);
    digitalWrite(4, HIGH);
    delay(w-50);
  }  
  else if (key=="RIGHT") {//activeer right-relais
    digitalWrite(2,LOW);
    digitalWrite(3,LOW);
    digitalWrite(4,LOW);
    delay(50);
    digitalWrite(5,LOW);
    digitalWrite(5, HIGH);
    delay(w-50);
  } 

}