Tafuta Msimbo

Kodi ya Arduino na Video ya Sensor ya Umbali ya Ultrasonic HC-SR04 na Onyesho la OLED SSD1306

Kodi ya Arduino na Video ya Sensor ya Umbali ya Ultrasonic HC-SR04 na Onyesho la OLED SSD1306

Katika mafunzo haya, tutaonyesha jinsi ya kutumia sensor ya umbali ya ultrasonic HC-SR04 pamoja na skrini ya OLED SSD1306 kuonyesha vipimo vya umbali. Mradi huu unakuruhusu kupima umbali bila kuhitaji kompyuta, na hivyo ni bora kwa matumizi mbalimbali, ikiwa ni pamoja na robotiki. Kufikia mwisho wa mradi huu, utakuwa na mfumo unaofanya kazi unaoonyesha usomaji wa umbali moja kwa moja kwenye skrini ya OLED.

How HC-SR04 ulrasonic sensor work
SSD1306 OLED display

Tunapoendelea, nitaelezea miunganisho ya waya inayohitajika kwa vifaa vyote viwili na kutoa mwongozo wa msimbo wa Arduino unaounganisha vifaa hivi. Hii itakusaidia kuelewa jinsi sensor inavyopima umbali na jinsi ya kutoa data hiyo kwenye skrini ya OLED. Kwa ufafanuzi zaidi, unaweza kurejea video inayohusishwa na mafunzo haya (katika video saa 00:00).

Vifaa Vimeelezwa

Vipengele vikuu vya mradi huu ni sensor ya umbali ya ultrasonic HC-SR04 na skrini ya OLED SSD1306. HC-SR04 inafanya kazi kwa kutumia mawimbi ya sauti ya ultrasonic; inatoa mawimbi ya sauti kupitia pini ya trigger na kusikiliza mwangwi kwenye pini ya echo. Kwa kuhesabu muda unaochukuliwa na sauti kurudi, inaweza kuamua umbali wa kitu. Sensor hii ni nzuri sana kwa vipimo vya umbali mfupi, kwa kawaida hadi sm 400-500.

Skrini ya OLED SSD1306 ni skrini yenye kiolesura cha I2C inayokuruhusu kuonyesha maandishi na michoro. Inawasiliana kupitia pini mbili: SDA (mstari wa data) na SCL (mstari wa saa). Katika mpangilio wetu, pini hizi zinaunganishwa kwenye pini maalum za Arduino, ikiruhusu uunganishaji na udhibiti rahisi.

Maelezo ya Datasheet

MtengenezajiMbalimbali
Nambari ya sehemuHC-SR04
Voltage ya Logic/IO5 V
Voltage ya usambazaji5 V
Mkondo wa pato (kwa kila chaneli)15 mA
Mkondo wa kilele (kwa kila chaneli)20 mA
Mwongozo wa mzunguko wa PWMHaupo
Viwango vya kizingiti cha mantiki ya kuingiza0.3*Vcc hadi 0.7*Vcc
Kushuka kwa voltage / RDS(on) / kuenezaHaupo
Mipaka ya joto0-70 °C
KifurushiModuli ya pini 4
Vidokezo / lahajaModuli ya kawaida

  • Hakikisha usambazaji wa nishati sahihi (5 V) kwa vifaa vyote viwili.
  • Tumia resistors za pull-up ikiwa ni lazima kwa mawasiliano ya I2C.
  • Weka mistari ya trigger na echo fupi ili kuepuka usumbufu.
  • Angalia mwelekeo wa sensor ya ultrasonic kwa usomaji sahihi.
  • Tumia uso thabiti kwa skrini ili kuepuka mitetemo ya kimakanika.

Maagizo ya Uunganishaji wa Waya

Arduino wiring for HC-SR04 ultrasonic SSD1306 128x64 OLED
Arduino wiring for HC-SR04 ultrasonic SSD1306 128x64 OLED

Ili kuunganisha sensor ya ultrasonic HC-SR04, anza kwa kuunganisha pini ya VCC (kwa kawaida nyekundu) kwenye pini ya 5V kwenye Arduino. Ifuatayo, unganisha pini ya GND (kwa kawaida nyeusi au njano) kwenye moja ya pini za GND za Arduino. Pini ya trigger (mara nyingi bluu) inapaswa kuunganishwa kwenye pini ya dijiti 12 kwenye Arduino, wakati pini ya echo (kwa kawaida kijani) inapaswa kuunganishwa kwenye pini ya dijiti 11.

Kwa skrini ya OLED SSD1306, unganisha pini ya VCC kwenye pini ya 5V kwenye Arduino na pini ya GND kwenye GND. Pini ya SCL inapaswa kuunganishwa kwenye pini A5 na pini ya SDA kwenye pini A4 kwenye Arduino. Ikiwa unatumia mfano tofauti wa Arduino ambao una pini maalum za I2C, unganisha skrini moja kwa moja kwenye pini hizo badala yake.

Mifano ya Msimbo na Mwongozo

Katika kazi ya setup, tunaanzisha skrini na mawasiliano ya serial. Sehemu ifuatayo inaonyesha jinsi skrini inavyoanzishwa:

void setup() {
   Serial.begin(9600);// weka serial monitor kwa baud 9600
   display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // anzisha na anwani ya I2C 0x3D
}

Hapa, skrini inaanzishwa na anwani ya I2C, ikiruhusu kuwasiliana na Arduino. Serial monitor pia imewekwa ili kuchapisha thamani za umbali.

Katika kitanzi kikuu, tunafuta skrini, kupima umbali, na kuchapisha. Sehemu ifuatayo ya msimbo inaonyesha jinsi tunavyoshughulikia kipimo cha umbali:

void loop() {
   display.clearDisplay();
   String distance  = String(sonar.ping_cm());// pata umbali na ubadilishe kuwa string kwa ajili ya kuonyesha
   robojaxText(distance +"cm", 3, 20, 3, false);
   display.display();
   delay(50); // Subiri ms 50 kati ya pings
}

Kitanzi hiki kinaendelea kupima umbali na kusasisha skrini na usomaji wa sasa. Kazi ya `robojaxText` inatumiwa kuonyesha maandishi kwenye skrini ya OLED.

Maonyesho / Nini cha Kutarajia

Wakati mpangilio umekamilika na msimbo umepakiwa, unapaswa kuona umbali ukionyeshwa kwenye skrini ya OLED kwa sentimita. Unaposogeza kitu karibu au mbali na sensor, thamani inayoonyeshwa inapaswa kubadilika ipasavyo. Hakikisha sensor imeelekezwa vizuri na haijazuiwa (katika video saa 02:30).

Vidokezo vya Muda wa Video

  • 00:00 - Utangulizi wa mradi
  • 01:15 - Maagizo ya uunganishaji wa waya
  • 02:30 - Maelezo ya msimbo
  • 04:00 - Maonyesho ya sensor

Bilder

HC-SR04 ulrasonic sensor
HC-SR04 ulrasonic sensor
How HC-SR04 ulrasonic sensor work
How HC-SR04 ulrasonic sensor work
Arduino wiring for HC-SR04 ultrasonic SSD1306 128x64 OLED
Arduino wiring for HC-SR04 ultrasonic SSD1306 128x64 OLED
SSD1306 OLED display
SSD1306 OLED display
SSD1306 OLED display-dimensions
SSD1306 OLED display-dimensions
SSD1306_128x64_OLDE-4
SSD1306_128x64_OLDE-4
SSD1306 OLED display-back
SSD1306 OLED display-back
44-This is the Arduino code for an HC-SR04 ultrasonic distance sensor with an SSD1306 display.
Språk: C++
/*
 * This is the Arduino code for the HC-SR04 Ultrasonic Distance Sensor with SSD1306 Display
 * to measure the distance using Arduino for a robotic car and other applications
 * Watch the video https://youtu.be/Pgx5fNF4Q6M
 * 
 * Written by Ahmad Shamshiri for Robojax Video
 * Date: December 21, 2017, in Ajax, Ontario, Canada
 * Permission granted to share this code given that this
 * note is kept with the code.
 * Disclaimer: this code is "AS IS" and for educational purposes only.
 * 
 */

/* Original Code 
   from https://github.com/adafruit/Adafruit_SSD1306
// https://playground.arduino.cc/Code/NewPing
 * Modified for Robojax video on December 21, 2017
// ---------------------------------------------------------------------------
// Example NewPing library sketch that does a ping about 20 times per second.
// ---------------------------------------------------------------------------
*/
//// start of SSD1306 display 
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2


#define LOGO16_GLCD_HEIGHT 64 
#define LOGO16_GLCD_WIDTH  128 
static const unsigned char PROGMEM logo16_glcd_bmp[] =
{ B00000000, B11000000,
  B00000001, B11000000,
  B00000001, B11000000,
  B00000011, B11100000,
  B11110011, B11100000,
  B11111110, B11111000,
  B01111110, B11111111,
  B00110011, B10011111,
  B00011111, B11111100,
  B00001101, B01110000,
  B00011011, B10100000,
  B00111111, B11100000,
  B00111111, B11110000,
  B01111100, B11110000,
  B01110000, B01110000,
  B00000000, B00110000 };

#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
//// end of SSD1306 display 

// ---------------------------------------------------------------------------
// Example NewPing library sketch that does a ping about 20 times per second.
// ---------------------------------------------------------------------------

#include <NewPing.h>

#define TRIGGER_PIN  12  // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define ECHO_PIN     11  // Arduino pin tied to echo pin on the ultrasonic sensor.
#define MAX_DISTANCE 200 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.



void setup() {
   Serial.begin(9600);// set serial monitor with 9600 baud
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3D (for the 128x64)
  
}// setup end


void loop() {
   display.clearDisplay();
  robojaxText("Distance", 3, 0, 2, false);
  String distance  = String(sonar.ping_cm());// get distance and convert it to string for display
  robojaxText(distance +"cm", 3, 20, 3, false);
    display.display();

  delay(50);                     // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
  Serial.print("Ping: ");
  Serial.print(sonar.ping_cm()); // Send ping, get distance in cm and print result (0 = outside set distance range)
  Serial.println("cm");

}// loop end


/*
 * robojaxText(String text, int x, int y,int size, boolean d)
 * text is the text string to be printed
 * x is the integer x position of text
 * y is the integer y position of text
 * size is the text size, 1, 2, 3 etc
 * d is either true or false.  Use true to display.
 */
void robojaxText(String text, int x, int y,int size, boolean d) {

  display.setTextSize(size);
  display.setTextColor(WHITE);
  display.setCursor(x,y);
  display.println(text);
  if(d){
    display.display();
  }

}

Resurser och referenser

Filer📁

Datablad (pdf)

  • SSD1306 display datasheet
    SSD1306 is a single-chip CMOS OLED/PLED driver with controller for organic / polymer light emitting diode dot-matrix graphic display system. It consists of 128 segments and 64commons. This IC is designed for Common Cathode type OLED panel. The SSD1306 embeds with contrast control, display RAM and oscillator, which reduces the number of external components and power consumption. It has 256-step brightness control. Data/Commands are sent from general MCU through the hardware selectable 6800/8000 series compatible Parallel Interface, I2C interface or Serial Peripheral Interface. It is suitable for many compact portable applications, such as mobile phone sub-display, MP3 player and calculator, etc.
    SSD1306_display_datasheet.pdf 1.79 MB