Pssst - vil ha noe høyteknologisk beskyttelse for hjemmekontoret din, eller en hemmelig lås for din "workshop" (ok, du har meg, det er faktisk et fangehull / spillrom) at barna ikke kan finne ut? Vi har deg dekket. La oss bygge en DIY smart lås som automatisk oppdager når du er der, og låser når du ikke er.
Hvordan virker det? INGEN VET! Eller mer spesifikt, Bluetooth.
Konseptet
Din smarttelefon er en kraftig enhet som kontinuerlig avslører informasjon om seg selv til omverdenen; en måte det gjør dette er Bluetooth.
I funksjonsmodus sender den et unikt identifikasjonsnummer - men selv når det ikke er mulig å oppdage det, kan alt som kjenner adressen, forsøke å pinge den. Hvis et svar blir hørt, vil det indikere om det er innenfor rekkevidde eller ikke.
Vi skal sette opp en Raspberry Pi med en Bluetooth-adapter for å alltid være på utkikk etter når smarttelefonen er utenfor rekkevidde, og når det er, vil reléet knytte seg til handling og låse døren.
Du vil trenge
- Raspberry Pi - hvilken som helst modell skal fungere siden det ikke er en CPU-intensiv oppgave, men jeg bruker en eldre modell B, og GPIO pinouts kan være litt annerledes på modellen din. Se avsnittet om bordmodus nedenfor. Du vil også trenge grunnleggende detaljer som en kablet Ethernet-tilkobling eller Wi-Fi-konfigurert Sette opp trådløst nettverk på din Raspberry Pi Opprette trådløst nettverk på din Raspberry Pi Nesten hvert Raspberry Pi-prosjekt vil kreve en nettverkstilkobling, og stor fleksibilitet kan oppnås ved å ignorere Ethernet-porten til fordel for en trådløs USB-dongle. Les mer ; pluss SD-kort og mikro USB-strømkabel.
- Bluetooth USB-adapter. Adafruit selger en Bluetooth 4.0 BLE-modul bekreftet arbeid (hva er Bluetooth 4.0? Hvordan Bluetooth 4.0 skaper fremtiden for mobiltilkobling Hvordan Bluetooth 4.0 skaper fremtiden for mobiltilkobling Bluetooth er den glemte stjernen på enhetens spesifikasjonsark. Les mer), men Du bør teste alt du allerede har lyst på før du kjøper en ny bare for dette prosjektet. Jeg fant en gammel standard Bluetooth mini adapter jeg kjøpte i Japan som ser ut til å fungere bra. Vi bryr oss ikke om overføringshastigheter eller tilkoblingssikkerhet, da alt vi gjør er å sende ut et raskt håndtrykk for å se om en enhet er i live og bra.
- GPIO breakout board ("cobbler") og jumperkabler. Du kan jobbe direkte fra pinnene på Pi, men det er mye enklere hvis du har etiketter på hver pinne, og de er bare $ 6 uansett.
- Relébrett. Du har et bredt utvalg av valg her, og alt fungerer hvis det er designet for bruk med en mikrokontroller og kan kjøre minst 12 volt ved 5 ampere. Jeg har brukt en generisk 4-kanals brett som ligner på denne for rundt $ 5, men jeg antar at du vet hvordan du skal jobbe.
- 12 / 24V elektromagnetlås, men en elektronisk magnetlås skal også fungere. Den jeg kjøpte, har 180kg holdkraft og leveres komplett med monteringsplater og instruksjoner, for rundt $ 35.
- 12 / 24V strømforsyning. Magnetlåsen må ha en separat strømforsyning - uansett hva du gjør, ikke prøv å trekke strøm for det fra Pi.
- Lock.py Python app, men vi vil skrive dette når vi går.
Arbeider med Bluetooth
Bluetooth er sentralt i dette prosjektet, så la oss starte med å installere litt Bluetooth-støtte og teste adapteren vår. Du kan enten gjøre dette direkte fra Pi eller SSH i fjerntliggende (hvordan du konfigurerer Windows til SSH i deg Pi Sette opp Raspberry Pi For Headless Bruk Med SSH Sette opp Raspberry Pi For Headless Bruk Med SSH Raspberry Pi kan godta SSH kommandoer når du er koblet til et lokalt nettverk (enten via Ethernet eller Wi-Fi), slik at du enkelt kan sette opp. Fordelene med SSH går utover å forstyrre den daglige screeningen ... Les mer).
sudo apt-get install bluez python-bluez
Sett inn donglen din hvis du ikke allerede har det, og la oss se på hva den rapporterer.
hcitool dev
Hvis du har noe oppført i produksjonen, er du god til å gå. Deretter bruker vi et Python-skript for å avstemme for nærliggende Bluetooth-enheter, og ta tak i den unike enhetsadressen. Vi trenger bare å gjøre dette en gang for hver enhet.
wget https://raw.githubusercontent.com/karulis/pybluez/master/examples/simple/inquiry.py python inquiry.py
Hvis du ser "0 enheter funnet", har du heller ikke en kompatibel USB Bluetooth-dongle, eller smarttelefonen din kan ikke oppdages. Ikke fortvil deg skjønt: Jeg fant jeg måtte åpne Bluetooth-innstillingssiden på min iPhone for å sparke den til funnmodus, da skjedde dette:
Flott, la oss lage den første fasen av programvaren vår som gjør deteksjonen. Opprett en Python-app kalt detect.py, og åpne den med Nano.
nano detect.py
Lim inn i denne prøvekoden:
#!/usr/bin/python import bluetooth import time while True: print "Checking " + time.strftime("%a, %d %b %Y %H:%M:%S", time.gmtime()) result = bluetooth.lookup_name('78:7F:70:38:51:1B', timeout=5) if (result != None): print "User present" else: print "User out of range" time.sleep(10)
og juster følgende linje med Bluetooth-enhetsadressen din:
result = bluetooth.lookup_name('78:7F:70:38:51:1B', timeout=5)
Trykk CTRL-X og Y for å lukke og lagre. Kjør den samme koden, og du ser noe slikt:
Koden skal være veldig enkel å forstå selv om du aldri har rørt Python før: Det skanner for en bestemt Bluetooth-enhet hvert 10. sekund, og det skriver ut en annen melding, avhengig av om den er funnet eller ikke. Bytt Bluetooth på telefonen for å simulere flytting inn og ut av området (sannsynligvis ca. 4m i virkeligheten). Du kan redusere eller øke tiden mellom skanninger, men jeg følte at 10 sekunder var en rimelig tid å potensielt måtte vente på at døren skulle låse opp, noe som er hvor vi går med hele dette prosjektet.
Jeg bør legge til, jeg vet ikke om strømforbruket ved å gjøre dette, men jeg antar at pinging en enhet oftere ville nødvendigvis forbruke mer strøm. Jeg har ikke sett noen åpenbare ytelsesproblemer i testing, men hvis batterilevetiden er et alvorlig problem for deg, bør du vurdere å ha en bryter inne på kontoret ditt som aktiverer og deaktiverer skanneløkken, så når du er inne, kan du sette lås på pause system, og aktiver deretter skanningen når du reiser.
Gratulerer, du har nå en Python-app som vet når du er innenfor rekkevidde, så vi kan begynne å handle på det.
GPIO Board Modes
Før du fortsetter, må du finne ut hvilken styremodus du skal bruke. Det er ikke noe riktig eller feil svar, det påvirker bare om du oppgir bokstavsnummeret eller det virtuelle GPIO-pinnummeret.
Standard er å bruke bokstavsnummeret ("bordmodus"), startende med pin 1 nederst til venstre (hvis du ser ned på Pi med USB-porter på høyre side). Pin 2 er like over det.
Men hvis du har en GPIO-pause ("cobbler"), er etikettene du har, fra en alternativ modus, kalt "BCM" (Broadcom SOC-kanal), og er vanligvis skrevet med GPIO eller P som prefixer nummeret. Du trenger ikke strengt en GPIO-breakout - det gjør det bare enklere. Hvis du ikke har et breakout bord og ikke vil kjøpe en, bruk dette diagrammet:
Merk at den opprinnelige modellen B revisjon 1, revisjon 2, og modellen B + og Pi2 alle har forskjellige pin-outs. Se dette StackExchange-spørsmålet for et diagram som er riktig på brettet ditt.
I denne prosjektkoden bruker jeg BCM GPIO nummereringssystemet som tilsvarer Adafruit breakout bordet jeg har. Mindre endringer er nødvendig hvis du ønsker å bruke bokstavstast modus.
Tråd i et relé
Fest pennbrettet, og sørg for at ledningen fra pinnene 1 og 2 (de i hjørnene på Pi) festes til 3v3 og 5V0 på pause. Du vil kanskje trekke ut en spenningstester for å sjekke dette.
Før du fortsetter, sjekk om noen andre har brukt ditt eget relé med Raspberry Pi (eller finn en på forhånd som du vet). Noen kan kreve at 5V aktiveres - men RPi kan bare gi 3, 3 V på GPIO utgangspinnene. Ved en tilfeldighet er den jeg bruker lykkelig med 3.3V, så jeg trengte ikke noen ekstra kretser, bare 5V0 til VCC, GND til GND og GPIO pin 23 for første reléinngang .
Min forrige veiledning på GPIO Komme i gang med GPIO På en bringebær Pi Komme i gang med GPIO På en bringebær Pi Hvis du, selv om Arduino var kult, bare vent til du får hendene på en Raspberry Pi - disse tingene er fantastiske. I tillegg til å være en fullt funksjonell datamaskin, har de også en ... Les mer viste hvordan du kobler en transistorkrets til å skille opp 3.3V til en full 5V hvis du trenger (faktisk brukte jeg samme relébrett for den opplæringen, men det viser seg at jeg ikke trengte 5V tross alt).
Du trenger ikke å koble inn i elektromagneten enda, siden du kan høre et hørbart klikk når reléet brenner.
Neste opp, la oss få tak i noe kode for å kommunisere med GPIO-porter.
Vi starter med å teste utenfor Python for å bekrefte alt som fungerer på portene selv. Installer wiringPi, som gir deg noen nyttige kommandolinjeverktøy.
git clone git://git.drogon.net/wiringPi cd wiringPi ./build
Når du er installert, konfigurerer du GPIO-pin 23 for å være en utgang.
gpio -g mode 23 out
Nå, gjør en rask skanning av alle portene for å bekrefte
gpio -g readall
Du har noe som ligner på dette, selv om det kan være lengre på en modell B + eller Pi2 siden det har flere GPIO-pins:
Dette kan være litt forvirrende først, men bordet er delt ned i midten og kolonnordren er reversert på hver side. Langt til venstre og langt til høyre er BCM pin nummer. Siden vi bruker 23, bør du se modusen som er oppført nå som UT. Dette er en nyttig liten kommando bare for å få en god ide om hva som skjer med alle dine pins til enhver tid.
For å skrive pinnen høy eller lav, bruk bare
gpio -g write 23 1 gpio -g write 23 0
Forhåpentligvis, hvis du har reléet koblet riktig, vil du høre at det klikker på og av. Hvis ikke, fortsett ikke før du har funnet ut ledningen. Husk at du må ha høyere spenning for å aktivere reléet.
Når du har bekreftet reléet og GPIO jobber, legger du til Python-modulene for GPIO.
sudo apt-get install python-dev python-rpi.gpio
La oss nå endre Python-appen for å slå av eller på reléet når telefonen er oppdaget. Du finner den siste koden på denne Gist. Kopier eksisterende detect.py til en ny lock.py, og legg til følgende import- og oppsettkommandoer:
import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) RELAY = 23 GPIO.setup(RELAY, GPIO.OUT)
I IF-setningen legger du til en kommando for å enten aktivere eller deaktivere reléet. Vær oppmerksom på at reléet ditt kan virke med enten lavt eller høyt signal, så juster deretter etter testing.
GPIO.output(RELAY, 1)
For å kjøre denne nye versjonen krever prefikset kommandoen med sudo - tilgang til GPIO root-privilegier.
Hooking It Up
Når du har bekreftet at reléet skyter med nærhetssensoren, legger du i din elektromagnetlås. På relésiden, ta 12V-positive inn i terminalen merket COM (vanlig), så er den positive strøminngangen fra elektromagneten til NO-terminalen ( normalt åpen, det vil si at dette normalt ikke er koblet til den felles terminalen, men vil være når du aktiver reléet ).
Bli med i bakken fra strømforsyningen og elektromagneten på GND-terminalen.
Se monteringsanvisningene som fulgte med låsen din. døren må være ganske tykk, og det er lettere om det åpnes vekk fra siden du vil at låsen skal være på. Gruven var motsatt, så jeg trenger den L-formede monteringsbraketten, samt en ekstra bit av tre for å øke dørtykkelsen.
forbedringer
Dette var et konseptbevis for meg å bygge videre på med andre prosjekter, og egentlig bare for å holde nysgjerrige øyne ut av kontoret mitt når jeg ikke er der - det er ikke designet for å være et idiotsikkert sikkerhetssystem. For det vil du trenge et reservebatteri for å holde strømmen flyter ved kutting.
Selvfølgelig, hvis noen bryter inn i huset ditt og går i vanskeligheter med å kutte din makt, har du sikkert fått det større problemet med å være en psykopat som er ute for å drepe deg, snarere enn en uformell innbruddstyv. Du vil også ha en fysisk deadbolt-lås i tillegg til en elektronisk, og en veldig stor pinne.
Selvfølgelig er denne nærhetsdetekteringsteknikken ved hjelp av Bluetooth ikke bare begrenset til en automatisk dørlås - du kan også bruke den til å utløse garasjeportåpningen når du kommer hjem, eller slå på hjemmekinoen din før du går i døren.
Hvilken funksjon tror du jeg skal legge til neste? Har du noen problemer med å bygge dette? Gi meg beskjed i kommentarene og jeg vil gjøre mitt beste for å hjelpe!