Draagbare Afstandsdetector – Arduino Nano DIY Kit met HC-SR04, 18650 Accu en 3D-geprinte Behuizing
Onderdelen en Benodigdheden
| Onderdeel | Aantal |
|---|---|
| Arduino Nano R3 | 1 |
| Ultrasonische Sensor - HC-SR04 (Generiek) | 1 |
| 18650 Accucel | 1 |
| TP4056 Lithium-Ion Oplader | 1 |
| DC-DC 5V Step-up Converter | 1 |
| Buzzer | 1 |
| Draaipotentiometer (generiek) | 1 |
| Schuifschakelaar | 1 |
| LED (generiek) - Rood (2), Groen (1), Blauw (1) | 4 |
| Weerstand 330 ohm | 2 |
| OpenBuilds M3 Kapschroef (10mm, 4 stuks) | 1 set |
| Draden (18 AWG) | 1 set |
| 3D-geprinte onderdelen (3 delen voor behuizing) | 1 set |
| Draadadapter | 1 |
Nodige Tools en Machines
- 3D-printer (generiek) – gebruikt: Anet A8
- Solderbout (generiek)
- Lijm pistool (generiek)
- Dremel (of enige draaiend gereedschap)
Apps en Online Services
- Arduino IDE (vereist NewPing bibliotheek)
- Simplify3D (of elke andere slicer)
Over Dit Project
Inleiding
De Exercise Science-afdeling van Lehman College voerde studies uit rondom gewichtstraining. Er waren inconsistenties in de beweegbereik voor herhalingen, wat de data significant kon beïnvloeden. Ik werd gevraagd een apparaat te maken dat het volledige beweegbereik identificeert voor oefeningen die machines of zwaardere gewichten gebruiken.
Het apparaat moest aan de volgende voorwaarden voldoen:
- Instelbare afstand
- Niet permanent vast aan machines
- Compatibel met statief
- Geen draden
Video
(Video niet beschikbaar in deze tekstversie)
Onderdelen
De meeste onderdelen zijn hieronder getoond; voor een complete lijst zie de BOM bovenaan. De gekozen onderdelen zijn niet per se optimaal; het was wat ik beschikbaar had. De afmetingen zouden aanzienlijk verkleind kunnen worden met custom PCBs, SMD-componenten of een LiPo-accu.


Code
De NewPing bibliotheek is vereist voor de code (onderaan beschikbaar) om te compileren.
De buzzer-frequentie en de boven-/ondergrenzen zijn globale variabelen die aangepast kunnen worden. De boven-/ondergrenzen verwijzen naar de minimale en maximale afstand die de sensor meet, gemapt op de analoge waarde [0,5]V van de potentiometer.
int frequency = 700; // Frequentie in Hz
int lower_bound = 60; // Afstand in mm
int upper_bound = 200; // Afstand in mm
Bij opstarten piept de buzzer 3 keer om een succesvolle boot aan te tonen (zie de setup() lus). Vervolgens vraagt loop() continu data aan de ultrasonische sensor en vergelijkt deze met de drempelwaarde ingesteld door de potentiometer.
3D Printen
Alle bestanden zijn naar Thingiverse geüpload, of als één samengevoegd bestand onderaan de pagina. Het gebruik van CAD wordt hier niet behandeld. Het model is ontworpen met rekening met de beperkingen van 3D-printen. Overhangs zijn geminimaliseerd door 45 graden fasefasen, wat supportmateriaal reduceert. Toleranties zijn ruime, zodat onderdelen moeten passen ondanks verschillende printerkalibraties.


Printtijden (op mijn printer):
- Bovenstuk: 2 uur 40 minuten
- Onderstuk: 2 uur 20 minuten
- Knop: 20 minuten
Montage
De schakelingen zijn onderaan de pagina te vinden. Onderdelen worden eerst zonder bekabeling geplaatst om de pasvorm te controleren.


Gerecycleerde IDE-kabels leverden alle draden. Groepen draden kunnen afgezogen worden terwijl ze aan elkaar blijven hangen, wat orde schept.


De meeste elektronica wordt op een van de geprinte onderdelen gemonteerd, dus er moet nagedacht worden over draadrouting en -beheer.
De SMD-indicatorleds op het TP4056-bord zijn afgesoldeerd. Verlengingsdraden en 3mm THT-leds zijn op hun plaats gesoldeerd. Stroombegrenzende weerstanden zitten nog op het bord. Er is een video beschikbaar van iemand die deze verplaatsing uitvoert.

De Arduino Nano had maar 2 toegankelijke ground-pads, dus een stripprint werd gebruikt om het aantal ground-pads uit te breiden. Hetzelfde werd gedaan met de 5V-lijn, zichtbaar in de foto hieronder.


Het verbreken van de verbinding op de strip is nodig om te voorkomen dat 5V kortgesloten wordt met ground. De rode "X" markeert de locatie van de onderbreking. Alleen het kopperlaagje hoeft onderbroken te worden, niet de hele fiberglasplaat.
Componenten werden buiten de behuizing bekabeld. Ze werden af en toe in de behuizing geplaatst om draadlengte te meten en op interferentie te controleren.

De potentiometer werd 6 mm ingekort zodat hij minder uitsteekt.

De verbinding met de 18650 is direct gesoldeerd, wat slechte praktijk is. Oververhitting van de cel schaadt hem en kan leiden tot uitval. Spotwellen van een aluminiumstrip is de juiste manier om 18650's te verbinden.
Heetlijm is schaamteloos gebruikt om de elektronica te bevestigen. Vermijd heetlijm waar mogelijk. Correct mechanisch ontwerp en bevestigingsmiddelen duren langer. Het zal op den duur falen. Het is begrijpelijk voor prototypes, maar productieonderdelen gebruiken nooit heetlijm.

Samenvatting
In retrospect zou ik een IR-sensor de ultrasonische sensor hebben voorgezogen, maar dat was pas te weten toen ik begon te experimenteren met de ultrasonische sensor. IR-sensoren hebben een smaller zichtsveld met als nadeel een veel lagere maximumafstand (~1 m).
Als er een tweede versie zou zijn, zou een LiPo de 18650 vervangen. De grote geribbelde adaptermoer is zwaar en verbruikt ruimte. De standaard draad voor statiefmontage is 1/4", dus een simpele 1/4" moer uit de bouwmarkt volstaat. Custom PCBs zouden het volume halveren.
Voor een prototype dat van concept tot oplevering in 2 weken is gegroeid, ben ik tevreden.
Toekomst van het Project
Tijdens experimenten met de ultrasoonsensor leerde ik meer over de beperkingen. Ten eerste heeft het zichtsveld een hoek van ~±15° (30° totaal). Dit betekent dat een object de buzzer kan activeren voordat het direct boven de sensor is. Dit levert onnauwkeurigheden en ongewenste metingen. Bovendien, als het vlak van het object niet loodrecht (of binnen de tolerantiehoek) staat op de uitgezonden geluidsgolf, ontvangt de sensor geen gereflecteerde golf en kan geen afstandswaarde verwerken.
Mijn oorspronkelijke plan was om de unit op de grond te laten rusten en de platen op een gewichtstrainingsta te laten de buzzer activeren wanneer ze onder de drempelwaarde zakten. Dit systeem bestond uit een vaste sensor en een bewegende trigger. Mijn mede-ingenieur had een alternatief voorgesteld: het systeem omkeren. Hij stelde voor de sensor op de bewegende sta te monteren, gericht naar de grond. Zo wordt de grond de trigger. Het elimineert ook onnauwkeurigheden door het wijdere zichtsveld.
Het voorstel was niet alleen een geweldige oplossing voor de gegeven problemen, maar ook heel makkelijk te implementeren. De bestelling voor de 1/4" statiefadapter moer kwam met een 1/4" → 3/8" adapter EN een 3/8" → 1/4" adapter. De tweede komt nu van pas!
Omdat ik geen toegang had tot mijn Dremel toen ik begon met 3D-modelleren, was ik gedwongen de hele statiefadapter in rekening te brengen. In combinatie met een 18650-cel nam het gewicht aanzienlijk toe. Ik wil geen extra gewicht toevoegen, dus ik zal de tweede statiefadapter inkorten voordat ik de mount model. Ik kom over een week terug op het project om deze alternatieve montagemethode af te ronden. Tot dan werkt het toch nog!
Code
RangeDetectionDevice.ino (Arduino)
/** Viktor Silivanov 3/22/2018 Draagbare afstandsdetectieapparaat met HC-SR04 ultrasoonsensor en instelbare drempel voor buzzer. **/
//******************** Bibliotheken ****************************************************************************************************************************************************************************************************************
#include <NewPing.h>
//******************** Pinnen ********************************************************************************************************************************************************************************************************************
//Analoge pinnen
#define wiper A5
//Digitale pinnen
#define echo 2
#define trig 3
#define ON_LED 7
#define buzzer 8
#define buzzer_LED 9
//******************** Globale Variabelen *********************************************************************************************************************************************************************************************************
//Gebruikerswijzigingen toegestaan
int frequency = 700; // Frequentie in Hz
int lower_bound = 60; // Afstand in mm
int upper_bound = 200; // Afstand in mm
//Niet wijzigen
int buzz_time = 250; // Tijd in milliseconden voor buzzer direct na opstart
int buzz_delay = 280; // Tijd in milliseconden voor buzzer vertraging direct na opstart
int max_distance = 400; // Argument voor object in NewPing bibliotheek
int i = 0;
int distance;
int threshold;
NewPing sonar(trig, echo, max_distance); // Instantiëring van object "sonar"
//******************** Setup ********************************************************************************************************************************************************************************************************************
//Deze functie draait maar één keer
void setup() {
Serial.begin(9600); // Stelt seriële monitor in met baudrate 9600
//Pin I/O Type Declaratie
pinMode(trig, OUTPUT);
pinMode(echo, INPUT);
pinMode(buzzer, OUTPUT);
pinMode(buzzer_LED, OUTPUT);
pinMode(ON_LED, OUTPUT);
digitalWrite(ON_LED, HIGH); // Zet groene LED aan; blijft aan zolang unit aanstaat
//Buzzer piept 3 keer bij aanzetten
while(i < 3){
digitalWrite(buzzer_LED, HIGH);
tone(buzzer, frequency, buzz_time);
delay(buzz_delay);
i++;
}
digitalWrite(buzzer_LED, LOW);
}
//******************** Oneindige Lus ***********************************************************************************************************************************************************************************************************
void loop() {
distance = sonar.ping_cm(); // Object "sonar" gebruikt ping_cm() functie uit bibliotheek, retourneert waarde in cm. Distance neemt die waarde aan
threshold = analogRead(wiper); // Haal analoge waarde op van wiper van potentiometer
threshold = map(threshold, 0, 1023, lower_bound, upper_bound); // Vertaal analoge lezingen naar triggerbereik. Update waarden van threshold
if(distance != 0 && distance < threshold){
// Voorwaarde om buzzer te activeren
tone(buzzer, frequency);
digitalWrite(buzzer_LED, HIGH);
} else{
// Staat van buzzer & LED anders
noTone(buzzer);
digitalWrite(buzzer_LED, LOW);
}
//serial_test(); // Uncomment dit om data van seriële monitor te bekijken
}
//******************** Test Functie ************************************************************************************************************************************************************************************************************
// Gebruikt seriële monitor om sommige waarden weer te geven. Gebruikt voor testen/debuggen.
void serial_test(){
Serial.print("Ping: ");
Serial.print(distance);
Serial.println("cm");
Serial.print("Bereik: [");
Serial.print(lower_bound);
Serial.print(", ");
Serial.print(upper_bound);
Serial.println("] cm");
Serial.print("Drempel: ");
Serial.print(threshold);
Serial.println("cm");
delay(100);
}
Custom Onderdelen en Behuizingen
Alle 3 delen zijn in één bestand opgeslagen.
Schema's
Productieproces
- TinyML Taaldetector met Edge Impulse op Arduino Nano 33 BLE Sense
- Bouw een real-time gyroscoop-spel met Arduino Nano & MPU-6050 sensor
- Arduino Digitale Dobbelsteen: Bouw Je Eigen LCD-willekeurige Getalgenerator
- Bouw Je Eigen 37-LED Roulette-spel met Arduino Nano
- ATtiny85 Mini Arcade: Snake – Bouw een Handheld OLED Game Console
- Een audio-reactieve bureaulamp bouwen met Arduino Nano
- Autonome Gezichtsvolgende Robot Auto met Arduino Nano & OpenCV
- Koper Elektrolyseren Project: Bouw een Slim Systeem met Arduino UNO
- NeoPixel Matrix Pong op Arduino Nano: Bouw je eigen neon Pong-spel
- Draagbare temperatuurmeetstation – Nauwkeurige TMP36 & LCD-display
- Indrukwekkende Lichtsequenties Maken met Arduino en Shift Register