JavaScript 添加网络摄像头来监控您的安全系统详解

在前面的章节中,我们讨论了一些主题,例如连接到 Arduino 的传感器和树莓 Pi Zero 的监控,跨设备使用网络,我们的家庭安全项目的重要性,以及监控现实世界中发生的事情的 domotics。为此,我们对这一章有一个建议。

在本章中,我们将配置我们的树莓 Pi Zero 来监控网络摄像头,并安装一个 TTL 串行摄像头来与 Arduino 板交互;我们将通过以下主题实现这一目标:

在这一章中,我们将了解树莓 Pi 如何作为终端计算机进行编程,不仅可以将设备作为服务器并部署页面或应用,还可以使用 IDE 对 Arduino 板进行编程。为此,我们需要将树莓皮连接到 Arduino,以便它们可以相互通信。

以下是树莓 Pi 拥有的一些接口,这些都包含在设备中:I2C 协议、SPI 通信、USB 端口和串行 UART 端口。在这种情况下,我们将使用 USB 端口在 Arduino 和树莓 Pi 之间进行通信。

以下是配置 Arduino 和树莓 Pi 相互交互的步骤:

  1. 为树莓皮安装 Arduino 集成开发环境
  2. 用 PuTTY 打开你的终端,检查你的覆盆子 Pi 的 IP 地址
  3. 执行远程访问,并键入 IP 地址
  4. 在图形界面中打开 Arduino IDE

在拉斯扁安装 Arduino IDE

键入以下命令在树莓 Pi 上安装 Arduino IDE:

sudo apt-get install arduino

远程访问树莓皮

在本节中,我们将查看访问远程桌面以执行安装在 Raspian 操作系统中的 Arduino IDE 的屏幕:一旦屏幕弹出,请键入您的用户名和密码:

Remote access to Raspberry Pi

在图形界面执行 Arduino

现在我们有了主屏幕,我们转到编程菜单,如果看到进入 Arduino IDE 的图标,一切都安装好了。点击 Arduino IDE 的图标:

Executing Arduino in a graphical interface

这里我们有 Arduino IDE 的接口,类似于我们在计算机中拥有的接口。从运行在树莓 Pi 中的 Arduino IDE,我们可以在两个板之间进行交互:

Arduino interface in Raspian

准备界面

我们需要验证我们选择了合适的电路板;在这种情况下,我们使用的是 Arduino UNO。在以下窗口中选择电路板:

Preparing the interface

选择串口

在我们选择了我们将使用的板之后,我们需要验证并选择将与我们的 Arduino 通信的端口,该端口连接到树莓 Pi 的 USB 端口;我们需要选择名称端口:/dev/ttyACM0:

Selecting the serial port

从图形界面下载草图

我们需要做的主要事情就是从我们的树莓 Pi Zero 和 Arduino 进行交流,不用电脑就可以把草图下载到 Arduino 板上,这样我们就可以把我们的树莓 Pi 用于其他用途了。

下面的截图显示了草图界面:

Downloading a sketch from the graphical interface

我们应该在界面下载草图。下图为连接的 Arduino-rubber Pi:太酷了!

Downloading a sketch from the graphical interface

现在我们将看一个使用 Python 控制树莓 Pi 输出的例子。

首先我们需要将草图下载到 Arduino 板上。为了测试我们的通信,我们将展示一个测试 Arduino 和树莓 Pi 之间的链接的示例:

我们声明以下输出:

int led_output = 13; 

我们从程序中的设置开始:

void setup () { 

然后我们提到输出引脚:

pinMode(led_output, OUTPUT); 

在 9600 开始串行通信:

Serial.begin(9600); 
} 

声明程序的循环:

void loop () {

这是我们检查串行端口是否可用的地方:

if (Serial.available() > 0){ 

如果找到了什么,它会读取什么并将内容保存在c变量中:

char c = Serial.read(); 

如果它读出一个标记为高的字母H:

      if (c == 'H'){ 

输出将打开连接到引脚 13 的发光二极管

digitalWrite(led_output, HIGH); 

如果它读取一个标记为低的字母L:

}  
else if (c == 'L'){ 

输出将关闭连接到引脚 13 的发光二极管:

         digitalWrite(led_output, LOW); 
      }  
   } 
} 

首先,我们需要安装串行库,因为这有助于通过 USB 端口通信与 Arduino 通信。键入以下命令安装库:

sudo apt-get install python-serial

下面的代码控制来自树莓 Pi 的 Arduino 现在,您可以将代码复制到名为ControlArduinoFromRasp.py的文件中,或者直接从这个项目的文件夹中获取完整的代码。

以下代码片段导入 Python 中的串行库:

import serial 

我们定义串行通信:

Arduino_UNO = serial.Serial('/dev/ttyACM0', 9600) 

打印一条消息,查看通信是否完成:

print("Hello From Arduino!") 

在此过程中,用户可以输入命令:

while True: 
      command = raw_input('Enter the command ') 
      Arduino_UNO.write(command) 

如果是H则打印消息;如果为假,则显示指示灯熄灭:

      if command == 'H': 
            print('LED ON') 
      elif command == 'L': 
            print('LED OFF') 

关闭连接:

arduino_UNO.close() 

硬件连接

这是连接到 Arduino UNO 的 LED,可以使用 Python 从树莓 Pi 进行控制:

Hardware connections

这里有一个模式,微型 SD 卡与 TTL 串行相机的连接;我用的是 ada 水果的相机模型。以下链接有你需要的所有信息,https://www.adafruit.com/product/397。在下图中,我们有项目的连接:

Connecting a TTL serial camera to Arduino and saving pictures to a micro SD

现在我们将解释如何拍照并保存到微型 SD;主要思想是将摄像头连接到 Arduino,这样我们就可以在家庭安全的监控系统中实现这一点。

以下是测试 TTL 相机、拍照并保存在微型 SD 上的代码。请注意,代码太长了,但我将解释做前面的动作最重要和必要的代码。这些例子的所有代码都包含在书中,以获得更完整的信息。

这里我们有来自 TTL 摄像机的导入文件,以及与 micro SD 通信的文件:

#include <Adafruit_VC0706.h> 
#include <SPI.h> 
#include <SD.h> 

我们定义了通过串行通信的库软件:

// comment out this line if using Arduino V23 or earlier 
#include <SoftwareSerial.h>        

定义chipSelect至引脚 10:

#define chipSelect 10 

代码将锁定连接:

SoftwareSerial cameraconnection = SoftwareSerial(2, 3); 
Adafruit_VC0706 cam = Adafruit_VC0706(&cameraconnection); 

然后我们需要启动摄像机:

  if (cam.begin()) { 
    Serial.println("Camera Found:"); 
  } else { 
    Serial.println("No camera found?"); 
    return; 
  } 

这里我们定义图像大小:

    cam.setImageSize(VC0706_640x480); 

这将显示图像大小:

  uint8_t imgsize = cam.getImageSize(); 
  Serial.print("Image size: "); 

代码会拍一张照片:

  if (! cam.takePicture())  
    Serial.println("Failed to snap!"); 
  else  
    Serial.println("Picture taken!"); 

创建文件以保存拍摄的图像:

  char filename[13]; 

保存文件的代码:

  strcpy(filename, "IMAGE00.JPG"); 
  for (int i = 0; i < 100; i++) { 
    filename[5] = '0' + i/10; 
    filename[6] = '0' + i%10; 

准备微型 SD 以保存文件:

if (! SD.exists(filename)) { 
      break; 
    } 
  } 

打开用于预查看的文件:

  File imgFile = SD.open(filename, FILE_WRITE); 

要显示拍摄图像的大小:

  uint16_t jpglen = cam.frameLength(); 
  Serial.print("Storing "); 
  Serial.print(jpglen, DEC); 
  Serial.print(" byte image."); 

从文件中读取数据:

  byte wCount = 0; // For counting # of writes 
  while (jpglen > 0) { 

将文件写入内存:

    uint8_t *buffer; 
    uint8_t bytesToRead = min(32, jpglen); 
    buffer = cam.readPicture(bytesToRead); 
    imgFile.write(buffer, bytesToRead); 

在屏幕上显示文件:

    if(++wCount >= 64) { 
      Serial.print('.'); 
      wCount = 0; 
    } 

显示读取的字节数:

Serial.print(bytesToRead, DEC);  
Serial.println(" bytes"); 
jpglen -= bytesToRead; 
  } 

关闭打开的文件:

imgFile.close(); 

打开 TTL 摄像机的运动检测:

  cam.setMotionDetect(true); 

验证运动是否被激活:

  Serial.print("Motion detection is "); 
  if (cam.getMotionDetect())  
    Serial.println("ON"); 
  else  
    Serial.println("OFF"); 
} 

当摄像机检测到运动时会发生什么:

if (cam.motionDetected()) { 
   Serial.println("Motion!");    
   cam.setMotionDetect(false); 

如果检测到运动,拍照或显示信息:

  if (! cam.takePicture())  
    Serial.println("Failed to snap!"); 
  else  
    Serial.println("Picture taken!"); 

现在我们已经看到了如何在 Arduino 和 rubber Pi 之间进行通信,以控制电路板,我们可以将此应用到我们的安全系统项目中。我们需要这样做,以便通过树莓皮与我们的摄像机进行通信和控制:

  • 将 Arduino 和树莓皮相互连接
  • 以 9,600 mbps 的速度创建串行连接
  • 调用将拍摄照片并将其保存在微型 SD 中的功能

在树莓皮上,我们需要做以下工作:

  • 在 Arduino 中创建调用函数的脚本,该脚本将拍摄图片
  • 使用 PuTTY 终端打开并执行脚本

以下部分是应在 Arduino 板上下载的草图:

首先,我们开始串行通信:

void setup () { 
    Serial.begin(9600);  
} 

这是告诉相机拍照的功能:

void loop () { 
   if (Serial.available() > 0) { 
      char c = Serial.read(); 
      if (c == 'T') {  

      takingpicture(): 

      }  
   } 
} 

拍照功能的代码

这里我们讨论定义提示相机拍照的功能的代码。

该函数具有拍摄照片的代码:

void takingpicture(){ 

拍照:

  if (!cam.takePicture())  
    Serial.println("Failed to snap!"); 
  else  
    Serial.println("Picture taken!"); 

在这里,我们创建要保存的文件:

  char filename[13]; 

我们在这里保存文件:

  strcpy(filename, "IMAGE00.JPG"); 
  for (int i = 0; i < 100; i++) { 
    filename[5] = '0' + i/10; 
    filename[6] = '0' + i%10; 

准备微型 SD 以保存文件:

if (! SD.exists(filename)) { 
      break; 
    } 
  } 

打开文件进行预览:

  File imgFile = SD.open(filename, FILE_WRITE); 

保存前获取文件的大小:

  uint16_t jpglen = cam.frameLength(); 
  Serial.print("Storing "); 
  Serial.print(jpglen, DEC); 
  Serial.print(" byte image."); 

从保存的文件中读取数据:

  byte wCount = 0; // For counting # of writes 
  while (jpglen > 0) { 

将文件写入内存:

    uint8_t *buffer; 
    uint8_t bytesToRead = min(32, jpglen); 
    buffer = cam.readPicture(bytesToRead); 
    imgFile.write(buffer, bytesToRead); 

保存后显示文件:

    if(++wCount >= 64) { 
      Serial.print('.'); 
      wCount = 0; 
    } 

显示读取的字节数:

Serial.print(bytesToRead, DEC);  
Serial.println(" bytes"); 
jpglen -= bytesToRead; 
  } 

关闭打开的文件:

imgFile.close(); 
}

在这一节中,我们将学习如何在 PHP 的网页中控制我们的相机,并在树莓 Pi 中运行一个网络服务器。我们将需要以下内容来运行 PHP 文件和网络服务器:

  • 在树莓 Pi 上运行 Apache 服务器
  • 安装 PHP 软件

对于网页,为了控制,我们必须在以下路径中创建我们的 PHP 文件:/var/www/html,例如,我们需要编辑index.php文件,并复制以下行。

下面的 HTML 文件包含 PHP:

<!DOCTYPE html> 
<html> 
 <head> 
 <title>Control Camera</title> 
 </head> 
  <body> 

这里我们定义了执行拍照动作的功能:

<form  action="on.php">   
  <button type="submit">Taking the picture</button> 
  </form> 

这里,我们定义了在检测到运动时要采取的措施:

  <form action="off.php">   
  <button type="submit">Motion</button> 
  </form> 
</body> 
</html> 

从 PHP 调用 Python 脚本

在本节中,我们需要从网页中调用 Python 脚本,并执行包含该脚本的文件:

<?php 
$prende= exec('sudo python on.py'); 
header('Location:index.php'); 
?> 

<?php 
$apaga = exec('sudo python motion.py'); 
header('Location:index.php'); 
?> 

Python 脚本的代码

在服务器端,也就是树莓皮,我们有 Python 脚本,可以从网页上调用:

import serial 
import time 
Arduino_1 = serial.Serial('/dev/ttyACM0',9600) 
Arduino_1.open() 
Command='H' 
if command:    
    Arduino_1.write(command) 
Arduino_1.close() 

import serial 
import time 
Arduino_1 = serial.Serial('/dev/ttyACM0',9600) 
Arduino_1.open() 
Command='L' 
if command:    
    Arduino_1.write(command) 
Arduino_1.close() 

如果一切配置完善,会出现如下页面:在你喜欢的浏览器中,输入你的PI/index.php的 IP 地址:

Code for Python scripts

在本节中,我们将创建一个项目,允许我们监控连接到 Arduino YUN 的 USB 摄像机,该摄像机具有 USB 端口,并包括与以太网和 Wi-Fi 的通信。所以,它有很多优点。我们将致力于在树莓皮和 Arduino YUN 之间建立一个网络,所以主要的想法是从一个网页上监控摄像头,从树莓皮。该页面将存储在树莓皮中。

配置 Arduino YUN

我们将使用支持 UVC 协议的罗技相机:

Configuring Arduino YUN

现在我们将解释在 Arduino YUN 中安装相机的步骤:

  • 将主板连接到无线路由器
  • 验证 Arduino YUN 的 IP 地址

输入 IP 地址后,将出现以下屏幕:

Configuring Arduino YUN

我们现在将在命令提示符下发出一系列命令来完成设置:

更新包:

opkg update

安装紫外线控制协议:

opkg install kmod-video-uvc

安装摄像机驱动程序:

opkg install fswebcam

下载Mjpgstreamer:

wget http://www.custommobileapps.com.au/downloads/mjpgstreamer.Ipk

安装Mjpgstreamer:

opkg install mjpg-streamer.ipk

要手动启动摄像机,请使用以下代码:

mjpg_streamer -i "input_uvc.so -d /dev/video0 -r 640x480 -f 25" -o
"output_http.so -p 8080 -w /www/webcam" &

要自动启动摄像机,我们将使用以下代码:

安装nano程序:

opkg install nano

输入以下文件:

nano /etc/config/mjpg-streamer

使用以下参数配置摄像机:

config mjpg-streamer core   
option enabled    "1"   
option device    "/dev/video0"   
option resolution  "640x480"   
option fps    "30"   
option www    "/www/webcam"   
option port    "8080" 

使用以下命令启动服务:

/etc/init.d/mjpg-streamer enable
/etc/init.d/mjpg-streamer stop
/etc/init.d/mjpg-streamer start

来自 MJPG-STREAM 服务器的监控

一旦你访问了 Arduino YUN 的服务器,在你的网络浏览器中输入你的 Arduino YUN 的 IP 地址http://Arduino.local:8080。配置结果如下图所示:

Monitoring from the MJPG-STREAMER server

从树莓皮监控 USB 摄像头

随着摄像头连接到 Arduino YUN,现在我们可以从树莓 Pi 上发布的网页进行实时监控。

为网页提供标题:

<html> 
<head> 
<title>Monitoring USB Camera</title> 

我们把 Arduino YUN 的 IP 地址称为摄像机图像:

</head> 
<body> 
<center> 
<img src="http://192.168.1.107:8080/?action=stream"/> 
</center> 
</body> 
</html> 

通过键入树莓皮的 IP 地址从浏览器访问网页(http://192.168.1.106/index.html):

Monitoring the USB camera from the Raspberry Pi

在下一节中,我们将了解如何配置连接的设备和将在网络中交互的硬件。

下图表示我们使用可监控的设备创建的网络;例如,我们监控一所房子的每个房间,用无线网络连接所有设备,并从树莓皮监控它们:

Monitoring the USB camera from the Raspberry Pi

在本章中,您已经学习了如何配置连接到网络的网络摄像头,以及如何监控物联网的安全系统。我们用你的 Arduino 板连接安全摄像头,树莓 Pi Zero 连接网络监控系统。在下一章中,我们将把我们的系统树莓 Pi Zero 与 Arduino 集成,以构建一个完整的系统连接设备和显示器。

教程来源于Github,感谢apachecn大佬的无私奉献,致敬!

技术教程推荐

技术与商业案例解读 -〔徐飞〕

邱岳的产品手记 -〔邱岳〕

算法面试通关40讲 -〔覃超〕

Netty源码剖析与实战 -〔傅健〕

图解 Google V8 -〔李兵〕

Flink核心技术与实战 -〔张利兵〕

PyTorch深度学习实战 -〔方远〕

B端产品经理入门课 -〔董小圣〕

结构会议力 -〔李忠秋〕