Introduction: Ultrasone Box
Ultrasone box
Ik ben op het idee van een ultrasone box gekomen, omdat bij het bekijken van studentenkamers altijd onduidelijkheid was hoe groot de kamer nou precies is. Het lijkt mij handig om met 1 druk op de knop de afmetingen te weten.
Wat is een ultrasone box?
De ultrasone box is een doosje met 4 ultrasone sensoren die daardoor de afstand tot een object kan bepalen, maar ook de afstand tussen twee objecten en het oppervlakte van een ruimte.
Wat moet de ultrasone box kunnen?
Door middel van de MoSCoW methode zijn er prioriteiten opgesteld waaraan de box moet voldoen.
Must have:
- De afstand meten tot een object.
- Makkelijk mee te nemen
- Niet te duur
Should have:
- Afstand tussen twee objecten bepalen
- Oppervlakte bepalen
- Stand alone
Could have:
- Een laser om een indicatie geven tot welk je object je meet
- Inhoud van de ruimte meten.
Won’t have:
- Resultaten en geschiedenis door sturen naar een telefoon of laptop
Onderdelen
Voor de box heb ik de volgende onderdelen gebruikt
- Arduino mega
- Half size Breadbord ( 5,5cm x 8,5cm )
- HC-SR04 ultrasone (4 stuks)
- Houtenplaat van 3 mm dik om de box uit te kunnen snijden
- Powerbank
- Lcd scherm
- A-B usb kabel
- Adafruit 16 x 2 lcd display
- Drukknopen ( 3 stuks)
- 10 ohm weerstanden ( 3 stuks )
- Male- female breadboard kabels (23 stuks)
- Male – male kabel ( 15 stuks )
Step 1: Het Ontwerpen En Maken Van De Behuizing
Behuizing
Voor de behuizing ben ik begonnen met alle onderdelen zo compact mogelijk bij elkaar te leggen zonder dat ze elkaar in de weg zaten. Vervolgens heb ik een vierkant om de onderdelen heen getekend en heb dit opgemeten.
Met deze afmetingen ben ik vervolgens aan de slag gegaan om een 3D model te maken in Autocad Inventor. In de rechter boven en linker onder hoek zit een holle cilinder om eventueel later een bovenkant op de behuizing te monteren. Veder zit er aan elke kant van de behuizing 2 ronde gaten voor de ultrasone sensoren en tot slot zit er aan de linker kant nog een extra gat voor een laser. Zoals te zien is op foto 1. op foto 2 is de werktekening te zien met alle afmetingen. De volledige tekeningen staan in het pdf tekeningen 1.
Om een beeld te krijgen van de gewenste inrichting heb ik in paint een tekening gemaakt met de gewenste inrichting van de box. Hierbij bevind het display zich buiten de box. Deze afbeelding is te zien op foto 3.
Om de ultrasone’s te kunnen testen heb ik een in inventor een houder gemaakt die vervolgens uitgeprint. De tekening hier van is te zien op foto 4 en het eindresultaat op foto 5 en 6
Om de box te maken had ik een eerste instantie 3D printen in gedachten. Helaas bleek het te lang te duren om de box uit te kunnen printen ( 70+ uur) en was de kans te groot dat dit fout zou gaan. Om de box te kunnen maken heb ik toen besloten om de box uit houd te laten snijden. Hiervoor moesten de tekeningen echter wel aangepast worden. De tekeningen hiervan zijn te zien op foto 7. volledige tekening is te zien in het pdf Tekeningen 2.
Deze heb ik vervolgens laten uitsnijden en met hot glue aan elkaar gelijmd. Het resultaat hiervan is te zien op foto 8
Step 2: De Code
De code
In de codes wordt gebruik gemaakt van extra libery’s. zonder deze zal het lcd scherm niet werken en zullen de ultrasone sensoren een stuk minder nauwkeurig zijn.
Code voor de ultrasone sensor:
#define echoPin 13
#define trigPin 12
#include
NewPing sonar(12, 13, 200);
void setup()
{
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
Serial.begin(9600);
}
void loop() {
int duration, distance;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration / 2) / 29.1;
Serial.println(distance);
delay (1000);
}
Code voor het lcd scherm:
#include
#include // bibliotheek voor lcd
LiquidCrystal_I2C lcd (0x27, 2, 1, 0, 4, 5, 6 , 7 , 3, POSITIVE);
void setup()
{
Serial.begin(9600);
lcd.begin(16, 2);
for (int i = 0; i < 3; i++);
{
lcd.backlight();
delay(250);
lcd.noBacklight();
delay(250);
}
}
void loop(){
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Halo wereld :P"); // afstand is onjuist maar wordt wel op lcd geprint
}
Code voor de drukknoppen:
#define drukknop1 13
#define drukknop2 12
#define drukknop3 8
int buttonState = 0;
int buttonState2 = 0;
int buttonState3 = 0;
void setup()
{
pinMode(drukknop1, INPUT);
pinMode(drukknop2, INPUT);
pinMode(drukknop3, INPUT);
Serial.begin(9600);
}
void loop(){
buttonState = digitalRead(drukknop1);
buttonState2 = digitalRead(drukknop2);
buttonState3 = digitalRead(drukknop3);
else if (buttonState == HIGH) {
Serial.println( "button1 ingedrukt");
}
else if (buttonState2 == HIGH) {
Serial.println( "button2 ingedrukt");
}
else if (buttonState2 == HIGH) {
Serial.println( "button3 ingedrukt");
}
delay (1000);
}
Code voor de laser:
void setup()
{
pinMode(13, OUTPUT);
}
void loop()
{
digitalWrite(13, HIGH);
delay(10000);
digitalWrite(13, LOW);
delay(2000);
}
Totale code:
#define drukknop1 52
#define drukknop2 53
#define drukknop3 51
#define laser 50
#define echoPin 48
#define trigPin 49
#define echoPin2 26
#define trigPin2 27
///// vanaf hier alleen voor arduino mega
#define echoPin3 22
#define trigPin3 23
#define echoPin4 24
#define trigPin4 25
/////
#define I2C_ADDR 0x27 // Define I2C Address for the PCF8574A
#define BACKLIGHT_PIN 3
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7
#define LED_OFF 0
#define LED_ON 1
#include // nieuwe bibliotheek toegevoegd voor betere ping
#include
#include // bibliotheek voor lcd
LiquidCrystal_I2C lcd(I2C_ADDR, En_pin, Rw_pin, Rs_pin, D4_pin, D5_pin, D6_pin, D7_pin);
NewPing sonar(49, 48, 400);
NewPing sonar1(27, 26, 400);
NewPing sonar2(23, 22, 400);
NewPing sonar3(25, 24, 400);
int buttonState = 0;
int buttonState2 = 0;
int buttonState3 = 0;
void setup()
{
pinMode(drukknop1, INPUT);
pinMode(drukknop2, INPUT);
pinMode(drukknop3, INPUT);
Serial.begin(9600);
/////////
pinMode(laser, OUTPUT);
Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(trigPin2, OUTPUT);
pinMode(echoPin2, INPUT);
pinMode(trigPin3, OUTPUT);
pinMode(echoPin3, INPUT);
pinMode(trigPin4, OUTPUT);
pinMode(echoPin4, INPUT);
lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
lcd.setBacklight(HIGH);
Serial.begin(9600);
lcd.begin(16, 2);
for (int i = 0; i < 3; i++);
{
lcd.backlight();
delay(250);
lcd.noBacklight();
delay(250);
}
}
void loop() {
long duration, distance, duration2, distance2, between, duration3, distance3, duration4, distance4, between2, oppervlakte, oppervlakte2;
// ultrasone 1
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration / 2) / 29.1;
// ultrasone 2
digitalWrite(trigPin2, LOW);
delayMicroseconds(2);
digitalWrite(trigPin2, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin2, LOW);
duration2 = pulseIn(echoPin2, HIGH);
distance2 = (duration2 / 2) / 29.1;
between = distance + distance2 + 18; // afstand tussen us1 en us2
// ultrasone 3
digitalWrite(trigPin3, LOW);
delayMicroseconds(2);
digitalWrite(trigPin3, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin3, LOW);
duration3 = pulseIn(echoPin3, HIGH);
distance3 = (duration3 / 2) / 29.1;
// ultrasone 4
digitalWrite(trigPin4, LOW);
delayMicroseconds(2);
digitalWrite(trigPin4, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin4, LOW);
duration4 = pulseIn(echoPin4, HIGH);
distance4 = (duration4 / 2) / 29.1;
between2 = distance3 + distance4 + 18; // afstand tussen us 3 en us 4
oppervlakte = (between * between2);
oppervlakte2 = ( oppervlakte / 10000);
////
buttonState = digitalRead(drukknop1);
buttonState2 = digitalRead(drukknop2);
buttonState3 = digitalRead(drukknop3);
if (buttonState == HIGH) {
digitalWrite(laser, HIGH);
Serial.println(distance);
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print(distance);
delay(100);
lcd.print(" cm ");
delay(100);
}
else if (buttonState2 == HIGH) {
Serial.println( between);
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print(between);
delay(100);
lcd.print(" cm ");
delay(100);
}
else if (buttonState3 == HIGH) {
Serial.println( oppervlakte2 );
delay(1000);
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print( oppervlakte2 );
delay(100);
lcd.print(" m2 ");
delay(100);
}
else {
Serial.println(" maak een keuze ");
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("maak een keuze ");
digitalWrite(laser, LOW);
delay(1000);
}
}
Step 3: Het Aansluiten
Aansluiten
Druk knoppen
Op de foto 1 is te zien hoe de drukknoppen aangesloten moeten worden, hoe de kabels moeten lopen en de weerstanden moeten worden aangesloten.
ultrasone sensor
De ultrasone sensoren moeten aangesloten worden zoals in foto 2 staat aangegeven. Hierbij moet alleen de + en de - via het bread board lopen en de echo en de triger op de porten aangesloten worden zoals aangegeven staat in de code.
laser
de laser moet als volgt aangesloten worden. De meest rechter pin moet baar de - van het brackboard. De middelste moet naar de + van het brackboard en de linker naar de poort op de arduino zoals deze in code staat aangegeven.
Lcd scherm
Het lcd scherm moest zoals op de foto staat worden aangesloten. Ook hier moeten de + en de - weer via het brackboard lopen.
Powerbank
Tot slot moet de arduino van electrische stroom worden voorzien. Hiervoor moet de powerbank met de usb kabel op de arduino worden aangesloten.
Step 4: Bediening Van De Box
Werking van de box
Door de box op de powerbank aan te sluiten. Wordt de arduino van stroom voorzien en start het programma op.
Vervolgens zijn er 4 opties:
1. Knop 1 ( de meest linker) deze laat de laser branden en meet de afstand tot het object en ultrasone 1
2. Knop 2 ( de middelste) deze meet de afstand tussen ultrasone1 en ultrasone2
3. Knop 3 ( de meest linker) deze geeft het gemeten oppervlakte weer in m2
4. Niks indrukken. Er wordt dan op het scherm gevraagd om een keuze te maken
Step 5: Result
Het eindresultaat van de box