Hallo Community,
heute möchte ich kurz ein primitives Sonar mit Darstellung auf einem TFT-Display zeigen. Die Umsetzung ist absichtlich einfach gehalten und ohne Winkelkorrektur. Dieses Anwendungsbeispiel soll zeigen wie man in kurzer Zeit ein optisch sehr eindrucksvolles Projekt mit wenig Hardware realisieren kann. In unserem Beispiel "scannt" ein SR04 montiert auf einem SG90 Servo einen Bereich von 180° und wir geben erkannte Hinternisse effektvoll auf unserem 1.77" TFT-Display aus.
Stückliste:
1x Stromversorgung (z.B. MB102 Breadboard Kit)
1x Servo SG90 mit Montageteilen
1x TFT-Display 1.77"
1x HC-SR04
1x Nano V3
Pinbelegung:
Stromversorgung | NanoV3 | TFT-Display | SR04 | Servo |
+ 5V | 5V | Pin 2 | VCC | rot |
GND | GND | Pin 1 | GND | schwarz |
+ 3,3V | Pin 8 | |||
D2 | Trig | |||
D3 | Echo | |||
D6 | gelb | |||
D8 | Pin 5 | |||
D9 | Pin 6 | |||
D10 | Pin 7 | |||
D11 | Pin 4 | |||
D13 | Pin 3 |
Sketch:
//Servo #include <Servo.h> Servo servo; //HC-SR04 int interval = 0; double distance = 0; //Prepare the TFT #include <TFT.h> // Arduino TFT library (standart) #include <SPI.h> // Display Pins am Nano #define cs 10 #define dc 9 #define rst 8 // Instanz für TFT TFT TFTscreen = TFT(cs, dc, rst); // char Array char rc_Printout[4]; void setup() { servo.attach(6); //D6 am Nano pinMode( 2, OUTPUT ); pinMode( 3, INPUT ); Serial.begin( 9600 ); TFTscreen.begin(); TFTscreen.background(0, 0, 0); } void loop() { int r_beam = 100; //D6 TFTscreen.stroke(255, 255, 255); TFTscreen.circle(80,128,r_beam+2); TFTscreen.setTextSize(2); TFTscreen.text("Dist(cm)", 0, 0); //nach rechts drehen for (int i=0;i<180;i=i+1){ servo.write(i); measure_dist(); Serial.print(i); Serial.print("\n"); delay(20); int r = distance*2; String r_Printout = String(r/2); TFTscreen.stroke(0, 0, 0); TFTscreen.setTextSize(2); TFTscreen.text(rc_Printout, 100, 0); r_Printout.toCharArray(rc_Printout, 4); TFTscreen.stroke(255, 255, 255); TFTscreen.setTextSize(2); TFTscreen.text(rc_Printout, 100, 0); TFTscreen.stroke(70, 70, 70); TFTscreen.line(80,128,80+r_beam*cos((360-i)*3.14/180), 128+r_beam*sin((360-i)*3.14/180)); TFTscreen.stroke(0, 255, 0); TFTscreen.circle(80+r*cos((360-i)*3.14/180), 128+r*sin((360-i)*3.14/180), 2); } TFTscreen.background(0, 0, 0); TFTscreen.stroke(255, 255, 255); TFTscreen.circle(80,128,r_beam+2); TFTscreen.setTextSize(2); TFTscreen.text("Dist(cm)", 0, 0); //nach links drehen for (int i=180;i>0;i=i-1){ servo.write(i); measure_dist(); Serial.print(i); Serial.print("\n"); delay(20); int r = distance*2; String r_Printout = String(r/2); TFTscreen.stroke(0, 0, 0); TFTscreen.setTextSize(2); TFTscreen.text(rc_Printout, 100, 0); r_Printout.toCharArray(rc_Printout, 4); TFTscreen.stroke(255, 255, 255); TFTscreen.setTextSize(2); TFTscreen.text(rc_Printout, 100, 0); TFTscreen.stroke(70, 70, 70); TFTscreen.line(80,128,80+r_beam*cos((360-i)*3.14/180), 128+r_beam*sin((360-i)*3.14/180)); TFTscreen.stroke(0, 255, 0); TFTscreen.circle(80+r*cos((360-i)*3.14/180), 128+r*sin((360-i)*3.14/180), 2); } TFTscreen.background(0, 0, 0); } void measure_dist() { Serial.read(); // Trig SR04 digitalWrite( 2, HIGH ); delayMicroseconds( 100 ); digitalWrite( 2, LOW ); // Echo SR04 interval = pulseIn( 3, HIGH ); distance = interval * 0.017; // cm Serial.print( interval, DEC ); Serial.print( "\t" ); Serial.print( distance, 1 ); Serial.print( "\n" ); }
6 comments
Andreas Wolter
@Douglas Debnar:
Can you explain this in more detail? What is the error you are experiencing?
Douglas Debnar
The code that is posted is wrong. The for loops are missing some things. Pleas check k and repost.
Siebo Mörig
Moin.
Super Idee. Würdet Ihr das ganze noch um eine Fritzing Zeichnug erweitern? Auch ein kleines Video währe sehr anschaulich.
Macht weiter so.
Ist der direkte Betrieb des Servos über den Ausgang so sinnvoll? Oder sollte da besser noch ein Treiber zwischengeschaltet werden?
Vielen Dank
Siebo
Hans-Gerd Valks
Wie wäre es mit einer Säge?😜
Markus Neumann
Hallo Herr Rode,
unser Mini-Breadboard gibt es unter https://www.az-delivery.de/products/mini-breadboard
Heinrich Rode
Moin,
ich möchte das Sonar gerne nachbauen. Jetzt stellt sich die Frage, wo ich so ein kurzes Breadboard her bekomme.
Gruß Heiner