Lär dig hur du gör en panorerings- och lutningskamera som kan ses på distans med en Raspberry Pi. Detta projekt kan slutföras på en morgon med bara de enklaste delarna. Här är slutresultatet:
Vad du behöver
Raspberry Pi 2 eller 3 med Micro SD-kort Arduino UNO eller liknande 2 x mikro- eller minihobbyservon USB-webbkamera Hane till hane kopplingskablar hane till hona kopplingstrådar Diverse dragkedjor
Bygger säkerhetskameran
Fäst ett servohorn (de små plastformarna) på varje servo med den medföljande skruven. Den speciella formen spelar ingen roll, även om ju större desto bättre. Dra inte åt skruven för hårt.
Använd nu blixtlås för att fästa en servo till den andra i rät vinkel. En av dessa kommer att vara panorering (vänster till höger), medan den andra kommer att lutas (upp och ner). Det spelar ingen roll vem som gör vad, det kan justeras i koden.
Fäst slutligen din webbkamera till en av servon. Du kan använda dragkedjor för detta, även om min webbkamera kom med en klämma skruvad i botten — jag tog bort denna och använde skruven för att hålla den mot hornet. För stabilitet kanske du vill montera hela riggen i en låda eller låda. En enkel kartong gör susen ganska bra. Du kan skära ett snyggt fyrkantigt hål och montera en servo i jämnhöjd med ytan, men det räcker med en dragkedja.
Ett ord om webbkameror
Alla USB-webbkameror är inte skapade på samma sätt. Anslut din webbkamera till USB-porten på din Pi och kör det här kommandot:
lsusb
Detta kommando visar information om alla USB-enheter som är anslutna till Pi. Om din webbkamera inte är listad här, kanske du vill prova en USB-hubb med strömförsörjning och upprepa kommandot. Om webbkameran fortfarande inte känns igen kan du behöva köpa en kompatibel webbkamera.
Servoinställningar
Även om servon kan verka skrämmande och komplexa, är de egentligen ganska enkla att ansluta. Servon arbetar med Pulse Width Modulation (PWM), vilket är ett sätt för digitala system att imitera analoga signaler. PWM-signaler är i huvudsak en snabb PÅ-AV-signal. En signal som är PÅ eller HÖG beskrivs med duty cycle. Duty cycle uttrycks i procent och beskriver hur länge signalen är PÅ. En PWM-signal på 25 % arbetscykel kommer att vara PÅ under 25 % av tiden och AV under de återstående 75 %. Signalen är inte PÅ vid starten och sedan AV för alltid, den pulseras regelbundet under en mycket kort tidsperiod.
Servon lyssnar efter dessa pulser och agerar därefter. Att använda en arbetscykel på 100 % skulle vara detsamma som “vanliga” 5v, och 0 % skulle vara samma som mark. Oroa dig inte om du inte helt förstår hur PWM fungerar, du kan fortfarande styra servon (Extreme Electronics är ett bra ställe att lära dig mer).
Det finns två huvudsakliga sätt att använda PWM – hårdvara eller mjukvara. Hårdvara PWM ger ofta lägre latens (hur lång tid mellan servon tar emot kommandot och flyttar) än mjukvara PWM, men Pi har bara en hårdvaru-PWM-kapabel pin. Externa kretsar är tillgängliga för att tillhandahålla flera kanaler av hårdvaru-PWM, men en enkel Arduino kan också hantera uppgiften, eftersom de har flera hårdvaru-PWM-stift.
Här är kretsen:
Dubbelkolla pinouten för din Pi, de varierar något mellan modellerna. Du måste ta reda på hur dina servon är anslutna. Servon kräver tre ledningar för att styra dem, men färgerna varierar något:
Röd är positiv, anslut denna till Pi +5v Brun eller svart är negativ, anslut denna till GND på Pi Orange eller vit signal, anslut denna till Arduino stift 9 och 10
Arduino-inställning
Ny på Arduino? Kom igång här.
När servon är anslutna öppnar du Arduino IDE på din dator och laddar upp denna testkod. Glöm inte att välja rätt kort och port från Verktyg > Styrelse och Verktyg > Port menyer
#include <Servo.h> // Import the library
Servo servoPan, servoTilt; // Create servo objects
int servoMin = 20, servoMax = 160; // Define limits of servos
void setup() {
// Setup servos on PWM capable pins
servoPan.attach(9);
servoTilt.attach(10);
}
void loop() {
for(int i = servoMin; i < servoMax; ++i) { 1
// Move servos from minimum to maximum
servoPan.write(i);
servoTilt.write(i);
delay(100); // Wait 100ms
}
for(int i = servoMax; i > servoMin; --i) {
// Move servos from maximum to minimum
servoPan.write(i);
servoTilt.write(i);
delay(100); // Wait 100ms
}
}
Allt är bra bör du se båda servon sakta röra sig fram och tillbaka. Lägg märke till hur “servoMin” och servoMax” definieras som 20 och 160 grader (istället för 0 och 180). Detta beror delvis på att dessa billiga servon inte kan röra sig hela 180 grader exakt, och även på grund av webbkamerans fysiska storlek förhindrar att hela intervallet används. Du kan behöva justera dessa för din inställning.
Om de inte fungerar alls dubbelkolla att kretsen är korrekt ansluten. Breadboards kan ibland också variera i kvalitet, så överväg att investera i en multimeter för att verifiera.
Servon är nästan för kraftfulla för Arduino att driva, så de kommer att drivas av Pi. 5V-skenan på Pi är begränsad till 750mA för hela Pi, och Pi drar ungefär 500mA, vilket lämnar 250mA för servon. Dessa mikroservon drar ungefär 80mA, vilket betyder att Pi:n ska kunna hantera två av dem. Om du vill använda fler servon eller större modeller med högre effekt kan du behöva använda en extern strömförsörjning.
Ladda nu upp följande kod till Arduino. Detta kommer att lyssna på inkommande seriella data (seriellt som i Universal Serie buss eller USB). Pi:n skickar denna data via USB till Arduino och talar om för den vart servon ska flyttas.
#include <Servo.h> // Import the library
Servo servoPan, servoTilt; // Create servo object
String data = ""; // Store incoming commands (buffer)
void setup() {
// Setup servos on PWM capable pins
servoPan.attach(9);
servoTilt.attach(10);
Serial.begin(9600); // Start serial at 9600 bps (speed)
}
void loop() {
while (Serial.available() > 0)
{
// If there is data
char singleChar = Serial.read(); // Read each character
if (singleChar == 'P') {
// Move pan servo
servoPan.write(data.toInt());
data = ""; // Clear buffer
}
else if (singleChar == 'T') {
// Move tilt servo
servoTilt.write(data.toInt());
data = ""; // Clear buffer
}
else {
data += singleChar; // Append new data
}
}
}
Du kan testa den här koden genom att öppna den seriella monitorn (uppe till höger > Serial Monitor) och skickar lite testdata:
Lägg märke till formatet på kommandona — ett värde och sedan en bokstav. Värdet är servos position, och bokstaven (i versaler) anger panorerings- eller lutningsservot. Eftersom denna data överförs från Pi seriellt kommer varje karaktär igenom en i taget. Arduino måste “lagra” dessa tills hela kommandot har sänts. Den sista bokstaven anger inte bara servo, den låter också Arduino veta att det inte finns mer data i det här kommandot.
Koppla slutligen bort din Arduino från datorn och anslut den till Raspberry Pi via den vanliga USB-portanslutningen.
Pi-inställning
Nu är det dags att ställa in Pi. Installera först ett operativsystem. Anslut webbkameran och Arduino till Pi USB.
Uppdatera Pi:
sudo apt-get update
sudo apt-get upgrade
Installationsrörelse:
sudo apt-get install motion
Motion är ett program gjort för att hantera webbkameraströmning. Den klarar alla tunga lyft och kan till och med utföra inspelning och rörelsedetektering (prova att bygga ett säkerhetssystem för rörelsefångst). Öppna Motion-konfigurationsfilen:
sudo nano /etc/motion/motion.conf
Den här filen ger många alternativ för att konfigurera Motion. Ställ in enligt följande:
daemon on — Kör programmet framerate: 100 — Hur många bilder eller bilder/sekund att streama stream_localhost av — Tillåt åtkomst över nätverkets bredd 640 — Bredd på video, justera för din webbkamera höjd 320 — Höjd på video, justera för din webbkamera stream_port 8081 — Porten för att mata ut video till output_picture off — Spara inga bilder
Det här är en ganska stor fil, så du kanske vill använda den CTRL + W för att söka efter linjer. När du är klar trycker du på CTRL + X och bekräfta sedan för att spara och avsluta.
Redigera en fil till:
sudo nano /etc/default/motion
Ställ in “start_motion_daemon=ja”. Detta behövs för att Motion ska fungera.
Ta nu reda på din IP-adress:
ifconfig
Detta kommando visar nätverksanslutningsdetaljerna för Pi. Titta på den andra raden, inet adr. Du kanske vill ställa in en statisk IP-adress (vad är en statisk IP?), men anteckna nu detta nummer.
Starta nu Motion:
sudo service motion start
Du kan stoppa eller starta om Motion genom att ändra “start” till “stopp” eller “starta om”.
Byt över till din dator och navigera till Pi från en webbläsare:
http://xxx.xxx.x.xx:8081
Där xxx.xxx.x.xx är Pi IP-adressen. Kolon följt av ett nummer är porten som konfigurerades tidigare. Om allt är bra bör du se streamen från din webbkamera! Försök att flytta runt och se hur det ser ut. Du kan behöva justera inställningarna för ljusstyrka och kontrast i konfigurationsfilen. Du kan behöva fokusera webbkameran — vissa modeller har en liten fokusring runt linsen. Vrid detta tills bilden är som skarpast.
Tillbaka på Pi, skapa en mapp och navigera in i den:
mkdir security-cam
cd security-cam/
Installera nu Twisted:
sudo apt-get install python-twisted
Twisted är en webbserver skriven i Python, som lyssnar efter kommandon och sedan agerar därefter.
När det är installerat, skapa ett Python-skript för att köra kommandon (flytta servon).
sudo nano servos.rpy
Lägg märke till hur filtillägget är “.rpy” istället för “py”. Här är koden:
# Import necessary files
import serial
from twisted.web.resource import Resource
# Setup Arduino at correct speed
try:
arduino = serial.Serial('/dev/ttyUSB0', 9600)
except:
arduino = serial.Serial('/dev/ttyUSB1', 9600)
class MoveServo(Resource):
isLeaf = True
def render_GET(self,request):
try:
# Send value over serial to the Arduino
arduino.write(request.args['value'][0])
return 'Success'
except:
return 'Failure'
resource = MoveServo()
Starta nu webbservern:
sudo twistd -n web -p 80 --path /home/pi/security-cam/
Låt oss bryta ner det — “-p 80” anger porten (80). Detta är standardporten för webbsidor. “–path /home/pi/security-cam/” säger till Twisted att starta servern i den angivna katalogen. Om du gör några ändringar i skripten i mappen “security-cam” måste du starta om servern (CTRL + X för att stänga och kör sedan kommandot igen).
Skapa nu webbsidan:
sudo nano index.html
Här är webbsidans kod:
<!doctype html>
<html>
<head>
<title>Make Use Of DIY Security Camera</title>
<style type="text/css">
#container {
/* center the content */
margin: 0 auto;
text-align: center;
}
</style>
</head>
<body>
<div id="container">
<img src="https://www.makeuseof.com/tag/diy-pan-and-tilt-network-security-cam-raspberry-pi/[Image URL]" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script><br />
<button onclick="servos.move('P', 10)">Left</button>
<button onclick="servos.move('P', -10)">Right</button>
<button onclick="servos.move('T', -10)">Up</button>
<button onclick="servos.move('T', 10)">Down</button>
</div>
</body>
<script>
var servos;
$( document ).ready(function() {
servos = moveServos();
});
function moveServos() {
// Store some settings, adjust to suit
var panPos = 70,
tiltPos = 90,
tiltMax = 170,
tiltMin = 45,
panMax = 170,
panMin = 20;
return {
move:function(servo, adjustment) {
var value;
if(servo == 'P') {
if(!((panPos >= panMax && adjustment > 0) || (panPos <= panMin && adjustment < 0))) {
// Still within allowed range, "schedule" the movement
panPos += adjustment;
}
value = panPos + 'P';
}
else if(servo == 'T') {
if(!((tiltPos >= tiltMax && adjustment > 0) || (tiltPos <= tiltMin && adjustment < 0))) {
// Still within allowed range, "schedule" the movement
tiltPos += adjustment;
}
value = tiltPos + 'T';
}
// Use AJAX to actually move the servos
$.get('http://PI_IP_ADDRESS/servos.rpy?value=" + value);
},
}
}
</script>
</html>
