Tragbarer Entfernungsmesser – Arduino Nano DIY-Kit mit HC-SR04, 18650-Akku und 3D-gedrucktem Gehäuse
Komponenten und Materialien
| Arduino Nano R3 | 1 |
| Ultraschallsensor HC-SR04 | 1 |
| 18650-Zelle | 1 |
| TP4056 Li-Ion-Lademodul | 1 |
| DC-DC 5V Step-Up-Wandler (Boost Converter) | 1 |
| Summer (Buzzer) | 1 |
| Drehpotentiometer | 1 |
| Schieberschalter | 1 |
| LED (rot 2×, grün 1×, blau 1×) | 4 |
| Widerstand 330 Ω | 2 |
| M3 Zylinderschrauben 10 mm | 4 |
| Drähte (18 AWG) | 1 |
| 3D-gedruckte Teile (3 Gehäuseteile) | 1 |
| Gewindeadapter (für Stativ) | 1 |
Benötigte Werkzeuge und Maschinen
- 3D-Drucker (ich: Anet A8)
- Lötkolben
- Heißklebepistole
- Dremel oder Drehwerkzeug
Apps und Online-Dienste
- Arduino IDE (NewPing Library nötig)
- Simplify3D (oder beliebiger Slicer)
Über dieses Projekt
Einführung
Die Sportwissenschaftliche Abteilung des Lehman College führte Studien zum Krafttraining durch. Inkonsistenzen im Bewegungsumfang bei Wiederholungen verfälschten Daten. Ich sollte ein Gerät bauen, das den vollen Bewegungsumfang bei Maschinen- oder Freihantelübungen erkennt.
Anforderungen:
- Einstellbare Distanz
- Nicht fest an Maschinen montiert
- Stativ-kompatibel
- Kabellos
Video
(Video im Original)
Teile
Die wichtigsten Teile sind unten abgebildet, vollständige Liste im BoM oben. Auswahl nicht optimal, sondern basierend auf Verfügbarkeit. Footprint ließe sich mit Custom PCBs, SMD-Bauteilen oder LiPo-Akku stark reduzieren.


Code
NewPing-Library erforderlich (unten verlinkt).
Summer-Frequenz und untere/obere Grenzen sind globale Variablen, anpassbar. Grenzen = Min/Max-Distanz des Sensors, gemappt auf Analogwert [0,5]V vom Potentiometer.
int frequency = 700; // Frequenz in Hz
int lower_bound = 60; // Distanz in mm
int upper_bound = 200; // Distanz in mm
Beim Start 3 Pieptöne (Boot erfolgreich, siehe setup()). loop() fragt kontinuierlich Ultraschallsensor ab und vergleicht mit Potentiometer-Schwellwert.
3D-Druck
Dateien auf Thingiverse oder als einzelne Datei unten. CAD-Design nicht Thema hier. Modell berücksichtigt 3D-Druck-Limitationen: Überhänge durch 45°-Fasen minimiert (weniger Stützmaterial), großzügige Toleranzen für unterschiedliche Druckerkalibrierung.


Druckzeiten (meine Werte):
- Oberteil: 2 Std 40 Min
- Unterteil: 2 Std 20 Min
- Drehknopf: 20 Min
Montage
Schaltpläne unten. Teile zuerst ohne Verdrahtung einpassen zur Passprüfung.


Geborgene IDE-Kabel als Leitungen. Kabelgruppen lassen sich abziehen und bleiben verbunden – für Ordnung.


Die meiste Elektronik sitzt auf einem Druckteil – Kabelrouting und -management durchdenken.
SMD-Status-LEDs auf TP4056 abgelötet. Erweiterungsdrähte + 3mm THT-LEDs eingelötet. Vorwiderstände bleiben auf Board. Video dazu verlinkt.

Arduino Nano hat nur 2 zugängliche GND-Pads → Lochrasterstreifen als GND-Verteilung. Gleiches für 5V-Leitung (siehe Bild).


Leiterbahn auftrennen (rotes „X“), damit 5V nicht auf GND kurzschließt. Nur Kupfer oben unterbrechen, nicht ganzes Board.
Komponenten außerhalb des Gehäuses verdrahten, zwischendurch zum Längenmessen und Prüfen auf Kabelinterferenzen einpassen.

Potentiometer um 6 mm gekürzt, damit es weniger vorsteht.

18650 direkt angelötet – schlechte Praxis. Überhitzung beschädigt Zelle und kann verzögert versagen. Richtig: Aluminiumstreifen Punktschweißen.
Heißkleber für Elektronikbefestigung – schämenswert. Vermeiden, wo möglich. Mechanisches Design und Schrauben halten länger. Heißkleber versagt mit der Zeit. Für Prototypen verständlich, für Serie nie.

Zusammenfassung
Rückblickend wäre IR-Sensor besser als Ultraschall gewesen – aber das wusste ich erst nach Experimenten. IR: schmalerer Erfassungswinkel, aber geringere Max-Distanz (~1 m).
Version 2: LiPo statt 18650. Großer geriffelter Adapter-Mutter schwer und platzraubend. Standard-Stativgewinde 1/4" → simpler 1/4"-Mutter aus Baumarkt reicht. Custom PCBs halbieren Volumen.
Für Prototyp von Konzept bis Übergabe in 2 Wochen: zufriedenstellend.
Zukunft des Projekts
Beim Experimentieren mit Ultraschall Grenzen kennengelernt: Erfassungswinkel ~±15° (30° gesamt). Objekt löst Summer aus, bevor es genau über Sensor ist → Ungenauigkeiten. Auch: Objektebene nicht senkrecht zur Schallwelle → kein reflektiertes Signal → keine Distanzmessung.
Ursprünglicher Plan: Gerät am Boden, Hantelscheiben lösen Auslöser beim Absenken. Engineering-Kollege schlug Inversion vor: Sensor an bewegter Stange, nach unten gerichtet → Boden wird Auslöser. Eliminiert FOV-Ungenauigkeiten.
Tolle Lösung, einfach umsetzbar. Bestellter 1/4"-Stativadapter kam mit 1/4"→3/8" UND 3/8"→1/4" Adapter – der zweite kommt nun zum Einsatz!
Da Dremel erst später verfügbar war, musste ganzes Stativadapter-Gewinde im 3D-Modell berücksichtigt werden. In Kombination mit 18650 deutlich schwerer. Ich will kein Gewicht hinzufügen – zweiten Adapter kürzen vor neuem Mount-Modell. In einer Woche zurück am Projekt für alternative Montage. Bis dahin: funktioniert trotzdem!
Code
RangeDetectionDevice.ino (Arduino)
/** Viktor Silivanov 3/22/2018 Portable distance detection device using the HC-SR04 Ultrasonic sensor with distance adjustment for triggering the buzzer. **/
//******************** Libraries ****************************************************************************************************************************************************************************************************************
#include <NewPing.h>
//******************** Pins ********************************************************************************************************************************************************************************************************************
//Analog Pins
#define wiper A5
//Digital Pins
#define echo 2
#define trig 3
#define ON_LED 7
#define buzzer 8
#define buzzer_LED 9
//******************** Global Variables *********************************************************************************************************************************************************************************************************
//User Modification Allowed
int frequency = 700; //Frequency in Hz
int lower_bound = 60; //Distance in mm
int upper_bound = 200; //Distance in mm
//Do Not Modify
int buzz_time = 250; //Time in milliseconds for buzzer right upon startup
int buzz_delay = 280; //Time in milliseconds for buzzer delay right upon startup
int max_distance = 400; //Argument for object in the NewPing library
int i = 0;
int distance;
int threshold;
NewPing sonar(trig, echo, max_distance); //Instanciation of object "sonar"
//******************** Setup ********************************************************************************************************************************************************************************************************************
//This function runs only once
void setup() {
Serial.begin(9600);
pinMode(trig, OUTPUT);
pinMode(echo, INPUT);
pinMode(buzzer, OUTPUT);
pinMode(buzzer_LED, OUTPUT);
pinMode(ON_LED, OUTPUT);
digitalWrite(ON_LED, HIGH); //Turns on green LED; Stays on while unit is on
//Buzzer beeps 3 times upon turning on device
while(i < 3){
digitalWrite(buzzer_LED, HIGH);
tone(buzzer, frequency, buzz_time);
delay(buzz_delay);
i++;
}
digitalWrite(buzzer_LED, LOW);
}
//******************** Runs Endlessly ***********************************************************************************************************************************************************************************************************
void loop() {
distance = sonar.ping_cm(); //Object "sonar" utilizes ping_cm() function from the library, which returns a value in cm.
threshold = analogRead(wiper); //Obtain analog value from wiper of the potentiometer
threshold = map(threshold, 0, 1023, lower_bound, upper_bound); //Translate analog readings into trigger range.
if(distance != 0 && distance < threshold){
//Condition to trigger the buzzer
tone(buzzer, frequency);
digitalWrite(buzzer_LED, HIGH);
} else{
//State of buzzer & LED otherwise
noTone(buzzer);
digitalWrite(buzzer_LED, LOW);
}
//serial_test(); //Uncommment this to view data from the serial monitor
}
//******************** Test Function ************************************************************************************************************************************************************************************************************
//Utilizes serial monitor to display some values. Used for testing/debugging purposes.
void serial_test(){
Serial.print("Ping: ");
Serial.print(distance);
Serial.println("cm");
Serial.print("Range: [");
Serial.print(lower_bound);
Serial.print(", ");
Serial.print(upper_bound);
Serial.println("] cm");
Serial.print("Threshold: ");
Serial.print(threshold);
Serial.println("cm");
delay(100);
}
Benutzerdefinierte Teile und Gehäuse
Alle 3 Teile in einer Datei zusammengefasst
Schaltpläne

Herstellungsprozess
- TinyML Spracherkennung mit Edge Impulse auf Arduino Nano 33 BLE Sense
- Echtzeit-Gyroskop-Spiel mit Arduino Nano & MPU-6050
- Arduino Digitaler Würfel: LCD-Würfel mit Zufallszahlen (1–6)
- 37-LED-Roulette-Spiel mit Arduino Nano bauen – Europäisches Layout
- ATtiny85 Mini-Arcade: Snake – Handheld OLED-Spielekonsole selbst bauen
- Audio-reaktive Schreibtischlampe mit Arduino Nano bauen
- Autonomes Gesichtsverfolgungs-Robotercar mit Arduino Nano & OpenCV
- Kupfer-Galvanik-Projekt: Intelligentes System mit Arduino UNO bauen
- NeoPixel-Matrix Pong auf Arduino Nano: Neon-Pong selbst bauen
- Tragbare Temperatur-Messstation – TMP36 & LCD-Display