Oppsummering
Her vil du lære hvordan du kobler opp Doppler Radar med og uten mikrokontroller. Du kan se tilstedeværelsen av en person eller objekt i bevegelse , innen et område på 0 -12 meter. I tillegg til oppkobling vil du lære å skrive kode til og programmere verdens mest kjent mikrokontroller Arduino UNO. I det mest brukte programmeringsmiljø Arduino IDE.
RCWL-0516 er en liten nærhetssensor som bruker Doppler Radar for å føle tilstedeværelsen av en person eller objekt i bevegelse. Den er veldig allsidig og kan brukes på egen hånd eller i forbindelse med en mikrokontroller.
Denne enheten bruker ikke mye strøm og fungerer i en rekkevidde på 4 til 28 volt, noe som gjør den til en ideell komponent for en batteridrevet design.
Mikrobølgeantennene er integrert i det lille trykte kretskortet, noe som gjør det til en helt selvforsynt enhet.
RCWL-0516 støtter også en valgfri lysavhengig motstand (LDR) for å la enheten bare fungere i mørke. Dette kan være veldig nyttig i lyskontrollapplikasjoner.
Modulbeskrivelse
Modulen er et enkelt kretskort med følgende tilkoblinger:
3V3 | 3,3Volt utgang (konstant og kan brukes til å fore andre ting f.eks en LED) |
GND | Jord |
OUT | Digital Data Ut ( Gir høyt signal i 2 sekunder, når den oppdager bevegelse) |
VIN | 4-28Volt In |
CDS | LDR ( Lys sensitiv motstand) |
Hva står egentlig CDS for?
CDS står for Cadmium Sulphide, som er den fotoaktive komponenten i LDR. På grunn av dette kalles LDR-er noen ganger for CDS-fotoresistorer.
Modulen har 3 jumperinnstillinger bak. Sensorenes standardinnstillinger kan endres ved å fylle disse hopperne med passende motstander og kondensatorer:
C-TM: (Pulslengdejustering) Ved å installere en passende SMD-kondensator kan du justere repetisjonstiden ved å forlenge utgangspulslengden. Standard triggertid er 2s. Å øke kondensatorens kapasitet vil gjøre gjentatt triggertid lenger. En 0,2 uF kondensator utvider utgangspulsen til 50-tallet, mens 1 uF utvider den til 250-tallet.
R-GN: (Detection Range Adjustment) Ved å installere en passende motstand kan du redusere deteksjonsområdet. Standard deteksjonsområde er 7m. Hvis du installerer en 1M-motstand, reduseres avstanden til 5m, mens en 270K-motstand reduserer den til 1,5 m.
R-CDS: (Light Sensitivity Adjustment) Du kan bruke dette som et alternativ til lodding av LDR. Enhver motstand mellom 47K – 100K vil være tilstrekkelig. Jo lavere verdi, desto lysere må lyset være for å deaktivere avtrekkeren.
Fordeler
- Veldig billig og kompakt. PCB i seg selv er mindre enn 4 mm tykk
- De kan trenge gjennom vegger og hull slik at de kan ha et bredt deteksjonsområde
- Radarsignaler kan trenge gjennom ikke-ledende materialer som plast og tre slik at de kan skjules eller beskyttes mot utilsiktet skade
- Disse sensorene kan fungere perfekt bak 18mm tykke biter av furu, 50mm tykk hardbackbok uten åpenbar reduksjon i følsomhet
- Disse sensorene er trygge. De legger ut veldig lave nivåer av mikrobølger ved 3,2 GHz
- De utføres ikke av varme mye og har bedre deteksjonshastighet enn tradisjonelle IR-sensorer
- De er utrolig følsomme for bevegelse og kan oppdage små bevegelser veldig enkelt
Ulemper
- Siden disse sensorene er avhengige av et Doppler-radarsystem, kan signalrefleksjoner fra andre objekter i nærheten forstyrre målingen, noe som gjør den mindre pålitelig og nøyaktig enn andre sensorer
- Denne sensoren og alle ledningene må monteres stivt. Hvis tilkoblingsledningene er utsatt for bevegelse eller vibrasjoner, vil de utløse sensoren
- Disse sensorene fungerer ikke bak normale standard doble vinduer
- Refleksjonene fra metaller kan også påvirke målingene
- De kan utløses av vinden
- Du kan bruke aluminiumsfolier for å blokkere mikrobølgesignalene fra sensoren
2 måter å koble til skumringsrele uten tilkoblet mikrokontroller
Resultat av eksperiment med LDR
Her er det viktig å påpeke at jeg kun fikk dette eksperimentet til å fungere når jeg satt i et helt mørkt rom. Det var ikke nok å bare holde fingeren over LDR’en. Det er derfor ikke et skumringsrele, men en av og på bryter. Når LDR får litt lys vil ikke sensoren virke, men når det er helt mørkt, fungerer den helt utmerket.
Hvis jeg beveger meg mot sensoren slår lyset seg på i 2 sekunder. Det går av 2 sekunder etter det slutter å registrer bevegelse. Sensoren er meget sensitiv så du må sitte helt stille for at den skal slutte å lyse. Det tok meg et par runder med grubling da jeg synes sensoren kun sto på og ikke ville skru seg av.
Tilkobling uten LDR
Resultat av eksperiment uten LDR
Her fungerte sensoren uansett om det var mørk eller lyst, En interessant observasjon er hvor god denne sensoren er på å gå gjennom ulike materialer. Jeg puttet 2 lag med plastikk over og den klarte helt fint å sense gjennom. Også gjennom 1 cm med skum materiale fungerte sensoren. Helt utrolig :)!!!!
Trenger en mikrokontroller til denne komponenten?
Svaret er at; det gjør du ikke! Ikke hvis du bare trenger en sensor for å skru på lyset om natten ved bevegelse eller på dagtid når du oppdager noen i nærheten. Skal du bruke Arduino her må du ha behov for mere og RCWL-0156 vil da være en del av en større krets.
La oss se for oss et eksempel der du trenger å videreformidle budskapet om at det er noen som har ankommet. Sensoren utløser lyset, men vi vil også skru på en buzzer og gi informasjonen på en skjerm. La oss gjøre et eksperiment:)
#include <Wire.h> // Dette bibloteket er innebygd i Arduino, du trenger ikke innstallere dette.
#include <Adafruit_GFX.h> // Dette bibloteket er Adafruits grafiske biblotek og må innstalleres.
#include <Adafruit_SSD1306.h> // Dette bibloteket er skjerm spesifikt. OLED skjerm på 0,96" med CMOS driver SSD1306, og må innstalleres.
#define SCREEN_WIDTH 128 // OLED skjermens bredde, i piksler.
#define SCREEN_HEIGHT 64 // OLED skjermens høyde, i piksler.
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); // Deklarere at det finnes et oled objekt vi kaller "oled" koblet til I2C portene.
#define sensor A0 // Egendefinert navn på port A0, hvor RCWL-0156 utsignalet er tilkoblet.
#define buzzer 9 // Egendefinert navn på port 9, hvor positiv sidse av Buzzer er tilkoblet.
void setup() {
Serial.begin(9600); // Kommando for å åpne serieporten for innkommende mld fra mikrokontroller i hastighet 9600.
pinMode(sensor, INPUT); // Setter opp GPIO9, ellers kalt sensor som inn signal port. Dette er en digital port.
pinMode(buzzer, OUTPUT); // Setter opp GPIOA0, ellers kalt buzzer som ut signal port. Dette er en analog port.
// initialize OLED display with address 0x3C for 128x64
if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Starter opp oled display med mac 0x3C og sjekker om det gikk bra.
Serial.println(F("SSD1306 allocation failed")); // Hvis det ikke gikk bra; skriv ut beskjed på serieporten.
while (true); // Fortsett med å skrive ut feilmld. til oppstarten av skjerm har gått bra.
}
delay(2000); // Gi oled skjermen 2 sekunder på å starte opp, det tar litt tid :)
oled.clearDisplay(); // Fjern alt som er på skjermen, før vi starter å skrive.
oled.setTextSize(1); // Sett skriftstørrelsen til nr 1.
oled.setCursor(10, 0); // Start å skrive i piksel x = 10 og y =0, (0,0) ligger i øverste hjørne, venstre side.
oled.println("Tutorial made by"); // Skriv denne setningen.
oled.setTextSize(2); // Sett skriftstørrelsen til nr 2.
oled.setCursor(20, 30); // Start å skrive i piksel x = 20 og y =30, (0,0) ligger i øverste hjørne, venstre side.
oled.println("byrk.no"); // Skriv denne setningen.
oled.display(); // Vis alt du har skrevet på skjermen.
}
void loop() {
int movement = analogRead(sensor); // Definerer en variabel som skal holde avlest analogverdie fra sensor(A0).
if(movement > 400 ){ // Hvis avvlest verdi er over 400 av 1024 max, Er det detektert bevegelse.
Serial.println(String("Bevegelse detetktert --> Raaverdien er = ") + String(movement));
// Skriv denne setningen og skriv ut denne variablen(movement) på serieporten.
oled.writeFillRect(0,20,128,40,BLACK); // Fyll et svart rektangel over det område vi skal oppdater med nye verdier.
oled.setCursor(0, 30); // Start å skrive i piksel x = 0 og y =30, (0,0) ligger i øverste hjørne, venstre side.
oled.println("Bevegelse detektert"); // Skriv denne setningen.
oled.display(); // Vis alt du har skrevet på skjermen.
tone(buzzer, 1000, 2000); // Kjør buzzer i 2 sekunder med lyd frekvens 1000Hz, for på indikere bevegelse detektert.
delay(2000); // Ikke gjør noe annet i 2 sekunder.
oled.writeFillRect(0,20,128,40,BLACK); // Fyll et svart rektangel over det område vi skal oppdater med nye verdier.
oled.display(); // Vis alt du har skrevet på skjermen.
}
}
Kodeforklaring
#include <Wire.h>
Dette biblioteket kan du bare bruke så lenge du programmerer i Arduino IDE, det er preinnstallert.
#include <Adafruit_GFX.h>
Adafruit_GFX.h er en header fil for Adafruit GFX-biblioteket for Arduino. Dette biblioteket gir en felles syntaks og et sett med grafikkfunksjoner for alle LCD- og OLED-skjermer og LED-matriser fra Adafruit . Samt en mengde andre skjermer som låner fra dette biblioteket. Du kan finne Adafruit_GFX.h-biblioteket og det aktuelle biblioteket for skjermen din ved hjelp av Arduino Library Manager .
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306.h er en header fil for Arduino-biblioteket Adafruit_SSD1306. Dette biblioteket lar deg styre monokrome OLED-skjermer med SSD1306-kontrolleren . Disse skjermene er ofte 128×64 eller 128×32 piksler i størrelse og brukes i mange hobbyelektronikkprosjekter.
Hvis du jobber med et OLED-skjerm basert på SSD1306-kontrolleren, er Adafruit_SSD1306.h avgjørende for å sende kommandoer og vise data på skjermen.
På samme måte som vist ovenfor, installeres denne gjennom Library Manager i Arduino IDE.
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
#define sensor A0
#define buzzer 9
Her predefinerer vi noen variabler med viktige navn og størrelser. Dette gjøres for at vi lettere skal finne frem i koden. Det er ikke nødvendig, men en stor fordel. Vi bruker en del av disse variablene når vi deklarerer at det finnes en OLED. Vi gir den det uorginale navnet “oled”.
Denne funksjonen initialiserer et Adafruit_SSD1306-objekt for å styre en OLED-skjerm med SSD1306-kontrolleren. Her er en detaljert forklaring av hver input-parameter:
1. SCREEN_WIDTH:
- Denne parameteren definerer bredden på OLED-skjermen i piksler. For eksempel er en typisk 128×64 OLED-skjerm 128 piksler bred.
2. SCREEN_HEIGHT:
- Denne parameteren definerer høyden på OLED-skjermen i piksler. For eksempel er en typisk 128×64 OLED-skjerm 64 piksler høy.
3. &Wire:
- Denne parameteren er en peker til Wire-objektet, som brukes for I2C-kommunikasjon mellom Arduino-enheten og OLED-skjermen. Wire-objektet er tilgjengelig globalt i Arduino IDE.
4. -1:
- Denne parameteren angir at OLED-skjermen ikke har en dedikert reset-pinne. I de fleste tilfeller er dette gyldig for OLED-skjermer, og reset-funksjonaliteten håndteres automatisk.
Ekstra notater:
- Du kan finne verdier for SCREEN_WIDTH og SCREEN_HEIGHT i dokumentasjonen for din spesifikke OLED-skjerm.
- Noen OLED-skjermer kan ha en dedikert reset-pinne. I dette tilfellet kan du erstatte -1 med pinnenummeret i funksjonen.
void setup() {
Serial.begin(9600);
pinMode(sensor, INPUT);
pinMode(buzzer, OUTPUT);
if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F(“SSD1306 allocation failed”));
while (true);
}
delay(2000);
oled.clearDisplay();
oled.setTextSize(1);
oled.setCursor(10, 0);
oled.println(“Tutorial made by”);
oled.setTextSize(2);
oled.setCursor(20, 30);
oled.println(“byrk.no”);
oled.display();
}
- Koden starter seriell kommunikasjon for feilsøking.
- Den definerer sensor- og buzzer-pinner som henholdsvis inngang og utgang.
- Den initialiserer en OLED-skjerm og viser en feilmelding hvis det mislykkes.
- Den viser en “Tutorial made by” melding på skjermen.
- Den setter skriftstørrelse og viser “byrk.no” under den første meldingen.
- Den oppdaterer skjermen for å vise de utskrevne meldingene.
void loop() {
int movement = analogRead(sensor);
if(movement > 400 ){
Serial.println(String(“Bevegelse detetktert –> Raaverdien er = “) + String(movement));
oled.writeFillRect(0,20,128,40,BLACK);
oled.setCursor(0, 30);
oled.println(“Bevegelse detektert”);
oled.display();
tone(buzzer, 1000, 2000);
delay(2000);
oled.writeFillRect(0,20,128,40,BLACK);
oled.display();
}
}
1. Leser sensorverdi:
- Den leser en analog verdi fra “sensor”-pinnen og lagrer den i “movement”-variabelen.
2. Bevegelsesdeteksjon:
- Den sjekker om “movement”-verdien er over 400.
3. Varsling ved bevegelse:
- Ved bevegelse (verdi over 400):
- Skriver en melding til seriell monitor med den analoge verdien.
- Fyller et rektangel på OLED-skjermen med svart for å fjerne forrige tekst.
- Viser “Bevegelse detektert” på OLED-skjermen.
- Aktiverer en buzzer i 2 sekunder.
4. Vente og fjerne melding:
- Venter i 2 sekunder.
- Fjerner “Bevegelse detektert” fra OLED-skjermen ved å fylle rektangelet med svart.
5. Løkkerepetisjon:
- Gjentar loopen for kontinuerlig bevegelsesdeteksjon.
Produkter som er brukt i denne artikelen:
-
Doppler Radar199 kr inkl Mva
-
OLED skjerm 0.96″69 kr inkl Mva
-
Arduino UNO R3129 kr inkl Mva