树莓派(Raspberry Pi)远程控制云台

入手树莓派后,参考了网上的一些文章实现了树莓派(Raspberry Pi)远程控制云台来监控我家养的三只陆龟。http://pi.fendou.info(Pagekite映射)  http://buzzdao.myds.me:1111/ (路由映射)

下面是实现过程的总结。PS:目前Gor博客内容直接Git clone 自 hugozhu,回头有时间也会把这篇文章以markdown格式整理到上面。

初始化操作
如已经在SD中安装过系统,可以用DiskGenius3.4.5清楚原有数据和Linux分区

安装RaspberryPi操作官方系统 Raspbian “wheezy”下载地址 http://www.raspberrypi.org/downloads 写入SD前先解压出img文件

下载SD卡写入工具Win32DiskImager 翻墙下载 & http://sourceforge.net/projects/win32diskimager/

系统初始化时扩展剩余SD卡空间

配置Pi密码(默认raspberry)、时区、预言、键盘布局并在高级设置中开启SSH
$sudo raspi-config
$sudo apt-get install vim (喜欢这个编辑器)

进入系统配置Wifi
$sudo nano /etc/network/interfaces
$sudo nano /etc/wpa_supplicant/wpa_supplicant.conf

更新RaspberryPi到最新版本(时间较长)
$sudo apt-get update
$sudo apt-get upgrade


安装所要的软件
安装视频捕获软件mjpg-streamer&安装摄像头Logitech(C110\C270)
首先下载mjpg-streamer http://sourceforge.net/projects/mjpg-streamer/files/latest/download
$wget http://hivelocity.dl.sourceforge.net/project/mjpg-streamer/mjpg-streamer/Sourcecode/mjpg-streamer-r63.tar.gz

编译安装mjpg-streamer前,需要安装支持开发库
$sudo apt-get install libjpeg8-dev

解压mjpg-streamer 到文件夹中 并
$make clean all

编译时报错:mjpg_streamer.c:27:28: fatal error: linux/videodev.h: No such file or directory
compilation terminated. 内核版本太高造成
创建符号链接解决:
$sudo ln -s /usr/include/linux/videodev2.h /usr/include/linux/videodev.h

lsusb查看摄像头是否正常识别,然后在mjpg-streamer 文件夹中运行
$./start.sh 启动mjpg-streamer
启动正常后使用浏览器访问 http://RaspberryPi-IP:8080 检查是否正常拍摄

添加mjpg_streamer 开机自动运行脚本
$sudo vim /etc/init.d/webcam (注意修改成自己的mjpg_streamer路径)

#! /bin/sh
# /etc/init.d/webcam

# Carry out specific functions when asked to by the system
case "$1" in
  start)
    echo "Starting webcam script"
    export LD_LIBRARY_PATH=/home/pi/cam_project/mjpg-streamer-r63
    /home/pi/cam_project/mjpg-streamer-r63/mjpg_streamer -o "output_http.so -w /home/pi/cam_project/mjpg-streamer-r63/www" &
    ;;
  stop)
    echo "Stopping webcam script"
    killall mjpg_streamer
    ;;
  *)
    echo "Usage: /etc/init.d/webcam {start|stop}"
    exit 1
    ;;
esac

exit 0

修改文件权限 $sudo chmod 755 webcam
启动mjpg_streamer $sudo /etc/init.d/webcam start
停止mjpg_streamer $sudo /etc/init.d/webcam stop
设置开机启动 $sudo update-rc.d webcam defaults
重启RaspberryPi $sudo reboot 查看是否开机启动运行mjpg_streamer

安装 webiopi 方便测试Raspberry Pi 的GPIO接口 https://code.google.com/p/webiopi/
首先安装python $sudo apt-get install python3-dev (时间较长)

$ wget https://webiopi.googlecode.com/files/WebIOPi-0.6.0.tar.gz
$ tar xvzf WebIOPi-0.6.0.tar.gz
$ cd WebIOPi-0.6.0
$ sudo ./setup.sh

启动WebIOPi$ sudo /etc/init.d/webiopi start
停止WebIOPi$ sudo /etc/init.d/webiopi stop
设置开机启动 $ sudo update-rc.d webiopi defaults
重启RaspberryPi $sudo reboot 运行WebIOPi后,浏览器中访问http://RaspberryPi-IP:8000 默认用户名/密码为webiopi/raspberry

安装ServoBlaster &接好舵机 红线+5V 棕色或者灰色接地线 黄色链接 Raspberry的GPIO,链接查看webiopi和ServoBlaster README

PS:首先要看你树莓派的版本,不同的版本GPIO不同,其次认真查看webiopi和ServoBlaster的README后发现连接很简单,不会接线可在此留言。v2版本的树莓派有两个5v Power针脚,可直接连接两个9g舵机。

$sudo git -clone https://github.com/richardghirst/PiBits.git
$cd /PiBits/ServoBlaster/
$make clean all
$make
$sudo ./servod

测试命令 $echo 1=160 > /dev/servoblaster

设置开机脚本(很明显这是修改自mjpg_streamer的开机脚本)$sudo vim /etc/init.d/servod

#! /bin/sh
# /etc/init.d/servod

# Carry out specific functions when asked to by the system
case "$1" in
  start)
    echo "Starting servod script"
    export LD_LIBRARY_PATH=/home/pi/cam_project/ServoBlaster
    /home/pi/cam_project/ServoBlaster/servod &
    ;;
  stop)
    echo "Stopping servod script"
    killall servod
    ;;
  *)
    echo "Usage: /etc/init.d/servod {start|stop}"
    exit 1
    ;;
esac

exit 0

设置开机自动启动servod:$sudo update-rc.d servod defaults

Web控制界面
安装mongoose和php5-cgi搭建最精简的web环境

$sudo apt-get install php5-cgi

$wget http://mongoose.googlecode.com/files/mongoose-3.7.tgz
$tar -vzxf mongoose-3.7.tgz
$cd mongoose-3.7
$make clean
$make linux
$sudo ./mongoose -I `which php-cgi` -r wwwroot -a wwwlog/log -p 80

创建启动脚本

$sudo vim /etc/init.d/mongoose

#! /bin/sh
# /etc/init.d/mongoose

# Carry out specific functions when asked to by the system
case "$1" in
  start)
    echo "Starting  mongoose  script"
    export LD_LIBRARY_PATH=/home/pi/cam_project/mongoose
    /home/pi/cam_project/mongoose/mongoose -I `which php-cgi` -r /home/pi/cam_project/mongoose/wwwroot -a /home/pi/cam_project/mongoose/wwwlog/log -p 80 &
    ;;
  stop)
    echo "Stopping  mongoose  script"
    killall mongoose
    ;;
  *)
    echo "Usage: /etc/init.d/mongoose  {start|stop}"
    exit 1
    ;;
esac

exit 0

$sudo update-rc.d mongoose defaults

重启RaspberryPi 验证Web PHP是否正常解析
$sudo vim /home/pi/cam_project/mongoose/wwwroot/index.php

<?php phpinfo(); ?>

浏览器访问看php页面是否执行

设置软链接方便对网站文件的修改
$cd ~
$ln -s /home/pi/cam_project/mongoose/wwwroot/ wwwroot

时间同步
安装校时工具
$ sudo apt-get install ntpdate
通过网络同步时间
$ sudo ntpdate stdtime.gov.hk

舵机调试

echo 0=90 > /dev/servoblaster
echo 0=95 > /dev/servoblaster
echo 1=90 > /dev/servoblaster
echo 1=95 > /dev/servoblaster

WebUI
1.服务端servo.php

<?php
if (isset($_GET['a'])) { //get angle0 bettween 0 to 180 
   $num = (int)(((int)$_GET['a'] * 11 + 500)/10);   //change angle to pulse width in 10ns,because servoblaster use this format
   system("echo 0=".$num ."> /dev/servoblaster"); //set GPIOxx angle to servoblaster
   echo $_GET['a'];
}
if (isset($_GET['b'])) { //get angle1 bettween 0 to 180 
   $num = (int)(((int)$_GET['b'] * 11 + 500)/10);   //change angle to pulse width in 10ns,because servoblaster use this format
   system("echo 1=".$num ."> /dev/servoblaster"); //set GPIOxx angle to servoblaster
   echo $_GET['b'];
}
?>

2.前台页面(可直接查看http://pi.fendou.info/cam/iframe.html源代码)

修改angle调整舵机转动角度限定范围(别拍到不该拍的地方!!!)

检查网络状态脚本

检测网络状态重启Raspberry Pi

#!/bin/bash
export PATH=/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
ping_count() {
count=0
`timeout 5 ping 192.168.1.1 | while read LINE; do
{
if [[ "${LINE}" =~ "64 bytes from" ]]; then
let "count = $count + 1"
echo "export count=$count"
fi
}
done`
echo $count
}
if [[ $(ping_count) < 1 ]]; then
echo "Fatal error: wifi is down, rebooting now..."
sudo reboot
fi

测试:$sudo ifconfig wlan0 down && /home/pi/cam_project/checknetwork.sh
定时运行:$sudo crontab -e

*/60 * * * * /home/pi/cam_project/checknetwork.sh

利用PageKite做端口映射

安装 Pagekite
$sudo curl -s https://pagekite.net/pk/ |sudo bash

第一次运行配置 Pagekite
$sudo pagekite.py

编辑~/.pagekite.rc 添加映射条目设置开机自启动

service_on  = http:@kitename                   : localhost:80      : @kitesecret
service_on  = http:fendou.314.pagekite.me      : localhost:80      : @kitesecret
service_on  = http:pi.fendou.info              : localhost:80      : @kitesecret
service_on  = http:cam.fendou.info             : localhost:8080    : @kitesecret
service_on  = ssh:pi.fendou.info               : localhost:22      : @kitesecret
service_on  = http:nas.fendou.info             : 192.168.1.4:5000  : @kitesecret

设置开机启动脚本(–optfile=修改自己的配置文件位置)

#! /bin/sh
# /etc/init.d/pagekite

# Carry out specific functions when asked to by the system
case "$1" in
  start)
    echo "Starting pagekite script"
    export LD_LIBRARY_PATH=/usr/local/bin/
    /usr/local/bin/pagekite.py --optfile=/home/pi/.pagekite.rc &
    ;;
  stop)
    echo "Stopping pagekite script"
    killall pagekite.py
    ;;
  *)
    echo "Usage: /etc/init.d/pagekite {start|stop}"
    exit 1
    ;;
esac

exit 0

添加到启动项
$sudo update-rc.d pagekite defaults

备份Raspberry Pi

下载备份脚本
$sudo curl “https://raw.github.com/andreafabrizi/Dropbox-Uploader/master/dropbox_uploader.sh” -o dropbox_uploader.sh

设置执行权限
$sudo chmod +x dropbox_uploader.sh

第一次运行生成配置文件(注意生成文件位置,默认为~/.dropbox_uploader)
$sudo ./dropbox_uploader.sh

备份脚本 sudo执行

#/bin/bash

TMP_DIR="/tmp/"
DATE=$(date +"%d-%m-%Y_%H%M")
BKP_FILE="$TMP_DIR/MyPiBkp_$DATE.tar"
BKP_DIRS="/home/pi /etc"
DROPBOX_UPLOADER=/home/pi/dropbox_uploader.sh

tar cf "$BKP_FILE" $BKP_DIRS
gzip "$BKP_FILE"

$DROPBOX_UPLOADER -f /root/.dropbox_uploader upload "$BKP_FILE.gz"

rm -fr "$BKP_FILE.gz"

计划任务 $sudo crontab -e

00 00 * * *     /home/pi/backup.sh 2>&1 >> /var/log/backup.log

测试备份 $sudo ./backup.sh
查看结果 $sudo ./dropbox_uploader.sh list

《树莓派(Raspberry Pi)远程控制云台》有26个想法

  1. 尝试了一下直接用Raspberry Pi 连接舵机,但执行一次命令后就死机了并且ssh也连不上了
    能否请博主介绍一下如何接线?我是红线电源接P4 ,棕色地线接P6, 黄色数据线接P7
    测试命令 echo P1-7=150 > /dev/servoblaster
    舵机转了一下,然后ssh就掉了

  2. 1、如何查看Pi的版本?我的是256M内存的原装第一代板子。
    2、现在这个教程有没有需要更新的地方?
    3、有没有远程实时语音的研究?

    1. 一代板子pin位置有变化的参考ServoBlaster 的文档;除了接线所有的命令和脚本都有了;语音没有研究,现在电源功率有点不足了(用的htc的充电器)

        1. 弄错了 另一个cubieboard用的HTC充电器,树莓派的用的一个2A的,是买minix带的充电器,如果控制舵机(5g舵机直接接在树莓派上)必须5V,2A,不然会自动重启。

        2. 电源还是挺关键的,建议找个靠谱的5v,2A电源。另外我用的舵机驱动在控制舵机的同时播放广播,树莓派会死机,所以建议你试验的时候把每个功能做单独的项目来实现。

  3. 1、我添加了你的gtalk,请同意,便于更方便的学习。
    2、关于”mjpg-streamer”:用这个软件的目的是它适合你的罗技摄像头么?还是说在rpi上的此类功能的视频监控软件只有它适合。此软件的视频帧数很低的,画面卡顿感也很明显。
    3、在编译这个软件的时候,你有没有改动软件源码?因为有些摄像头是YUYV的,有些是JPEG的,如何查看自己的摄像头是哪种呢?
    4、在硬件上我想除了pi之外,是不是还有别的硬件,可以具体罗列一下么? 我现在手里只一个pi,并且我对andruino方面的东西并不是太清楚,例如具体的型号呀之类的,尚请指教。

    注:我是一代,256M内存的rpi.

    1. 除了mjpg-streamer 也用过别的(忘记名字了),局域网看着还行,外网实在太卡了,mjpg-streamer 实际是截的图片javascript一帧一帧播放,外网效果比较好。Logitech(C110\C270)两个摄像头免驱,部署简单。我不懂编程,没有修改过mjpg-streamer源码,安装过程和排错文章都有体现,到现在我重装树莓派也得参考。硬件上没有用到andruino,软硬列表如下:
      WebIOPi | ServoBlaster | Mongoose | PHP5-CGI @ 2013

      RaspberryPi Ver2.0 | Logitech C110 | EDUP EP-N8508GS | TowerPro SG90 | Aircraft FPV

      都能在tb上买到

发表评论

电子邮件地址不会被公开。 必填项已用*标注