Einfaches Sonar auf TFT

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 geben 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" );
} 

 

Letzter Artikel Epoxidharz, eine wasserdichte Sache

Kommentar

Markus Neumann - Juni 26, 2018

Hallo Herr Rode,

unser Mini-Breadboard gibt es unter https://www.az-delivery.de/products/mini-breadboard

Heinrich Rode - Juni 26, 2018

Moin,

ich möchte das Sonar gerne nachbauen. Jetzt stellt sich die Frage, wo ich so ein kurzes Breadboard her bekomme.

Gruß Heiner

Hinterlasse einen Kommentar

Kommentare müssen vor der Veröffentlichung überprüft werden

Erforderliche Angabe