← zpět na zápisky z Arduino projektů
Nepřibližuj se!
- Co je potřeba umět
- Foto
- Video
- Hardware
- Software
- Jak to funguje
- Schéma zapojení
- Program
- Možná vylepšení
- Poznatky
Po úspěchu ultrazvukového měření vzdálenosti jsme se rozhodli to trochu vylepšit o zvuky :-). Jakmile se k pokladu někdo začne přibližovat, poklad narušitele zvukově odhání.
Co je potřeba umět
- Projekt zvládne i menší dítě, pokud se smíříme s tím, že nebude rozumět každému slovu v kódu. Nicméně sestavení podmínek pro jednotlivé úrovně vzdáleností už dítě může programovat samo.
- Jde v zásadě o jednoduché propojení ultrazvukového měření vzdálenosti a demo příkladu na mp3 přehrávač.
Foto
Video
Hardware
- ultrazvukové čidlo HC-SR04 (Aliexpress, specifikace)
- mp3 přehrávač (Aliexpress, specifikace)
- malý reproduktor (Aliexpress)
- resistor 1 kΩ
- microSD karta pro přehrávač
Software
- něco pro nahrávání zvuku, např. Audacity
Jak to funguje
Ultrazvukové čidlo měří vzdálenost a podle toho pouští jednotlivé skladby na mp3 přehrávači.
Schéma zapojení
(malovala dcera (7) sama)
Program
#include <SPI.h>
#include <Wire.h>
#include "DFRobotDFPlayerMini.h"
#include "SoftwareSerial.h"
// nastaveni pinu pro ultrazvuk
#define trigPin 13
#define echoPin 12
// nastaveni pinu pro mp3
#define rxMp3 10
#define txMp3 11
// software serial pro mp3
SoftwareSerial mySoftwareSerial(rxMp3, txMp3);
DFRobotDFPlayerMini myDFPlayer;
void setup() {
// seriova konzole pro testy
Serial.begin (9600);
// nastaveni pinu pro ultrazvuk
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
// inicializace software serial
mySoftwareSerial.begin(9600);
Serial.println();
Serial.println(F("DFRobot DFPlayer Mini Demo"));
Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
if (!myDFPlayer.begin(mySoftwareSerial)) { //Use softwareSerial to communicate with mp3.
Serial.println(F("Unable to begin:"));
Serial.println(F("1.Please recheck the connection!"));
Serial.println(F("2.Please insert the SD card!"));
while (true);
}
Serial.println(F("DFPlayer Mini online."));
//nastav hlasitost prehravace (0-30)
myDFPlayer.volume(25);
// normalni equalizer
myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);
// prehravame z SD karty
myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);
}
long zmerVzdalenost() {
long doba, vzdalenost;
// PULSE ___|---|___
// vycisti trigger pin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// posli 8 cyklu za 10 mikrosekund
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
// vypni posilani
digitalWrite(trigPin, LOW);
// precteme echo pin
doba = pulseIn(echoPin, HIGH);
//prepocet na vzdalenost
//-----------------------------
// rychlost zvuku = 340 m/s = 0,034 cm/us (mikrosekund)
// t = s/v => s = t * v
// s = cas * 0,034
// na konci musime vzdalenost vydelit 2, protoze zvuk leti tam a zpet
vzdalenost = (doba * 0.034) / 2;
return vzdalenost;
}
void loop() {
long vzdalenost = zmerVzdalenost();
Serial.print("Vzdalenost: ")
Serial.println(vzdalenost);
// je treba pockat nez se prehraje zvuk, odhadujeme 2s
int pockej = 2000;
if ((vzdalenost < 150) && (vzdalenost >= 100)) { // 100 - 150cm
myDFPlayer.play(1);
delay(pockej);
} else if ((vzdalenost < 100) && (vzdalenost >= 50)) { // 50 - 100 cm
myDFPlayer.play(2);
delay(pockej);
} else if (vzdalenost < 50) { // pod 50cm
myDFPlayer.play(3);
delay(pockej);
}
// pokud je zde mene nez 200ms, ultrazvuk zacina zlobit
delay(300);
}
Možná vylepšení
- Zapojení by šlo předělat např. na zvukový sonar, kdy bude lidským hlasem oznamovat vzdálenost od překážky (např. “dva a půl metru”)
- Různé druhy sirén, kdy dojde k detekci překážky
- Zobrazování dalších hodnot či vzkazů na OLED displeji
Poznatky
- Zatím jsme nepřišli na to, jak zjistit z přehrávače, že přehrává skladbu (nebo že ji dopřehrával), tedy dáváme za puštění skladby vždy tvrdé prodlevy
delay()
. - Pokud jsme detekovali ultrazvukem vzdálenost rychleji 5× za sekundu (pauza menší než 200 ms), tak docházelo k významným měřícím chybám, vracela se čísla > 3000 cm (sonar měří asi do 4 m) a současně pak přicházela chybná měření např. < 50 cm, aniž byla nějaká překážka v dosahu. Nastavení prodlevy na 200 ms sice zpomalí reakci sonaru, ale vyřešilo to problém.