美文网首页玩转树莓派树莓派程序员
树莓派视频遥控小车 + iOS / Android / web应

树莓派视频遥控小车 + iOS / Android / web应

作者: 三少ZZzzz | 来源:发表于2017-10-18 21:52 被阅读1617次

    更新续篇>>会聊天的树莓派视频遥控小车 + iOS / Android / web应用

    本文介绍了一种树莓派遥控小车的实现,做这个的初衷是希望能在不同平台和树莓派愉快地玩耍,所以视频直播用了 HLS 技术,缺点是有一定延迟。iOS 和 Android 客户端使用React Native,web端为 React,后台为 NodeJS,通信使用 websocket。主要功能有视频监控,温湿度检测,红外遥控等。出于方便,一部分 GPIO 操作还是用的 Python 和 C。具体代码请见:https://github.com/shaqian/PiBot


    手机应用演示


    PiBotApp


    应用界面


    组装演示


    元件列表

    树莓派:Raspberry Pi v3 Model B

    树莓派摄像头: 8MP Raspberry Pi Camera v2

    Micro SD 内存卡:8G 或以上

    USB声卡

    麦克风:3.5mm 接口

    迷你音箱:3.5mm 接口

    小车底盘:ZK-4WD

    马达驱动:L298n

    5v电源:给树莓派供电

    电池电源:两节18650 (3.7v)电池加电池壳,给马达驱动供电

    DC降压模块:LM2596S,7.4v转5v,给舵机供电

    舵机:SG90 9g

    舵机底座:我用的是这个,但只用了单层,因为树莓派只有2组硬件 PWM,需要留一组给红外输出。

    红外发射模块:可以用 Arduino 的红外发射模块 KY-005,但是可达距离较短。推荐这个大功率红外模块,距离可达几米。

    红外接收模块:KY-022 (IR Receiver for Arduino)

    面包板:SYB-170

    杜邦线:20或30厘米,公对母

    电阻:1/4W 1kΩ & 2kΩ

    设置树莓派和网络

    如果不是第一次使用树莓派,可跳过此部分内容。

    1) 安装树莓派系统 (Mac)

    从镜像安装 Raspbian

    1. 下载 .zip 文件 RASPBIAN STRETCH WITH DESKTOP

    2. 解压并得到 2017-07-05-raspbian-jessie.img。

    3. 打开终端,运行 diskutil list 列出所有磁盘。

    4. SD 卡插入读卡器并连接电脑。

    5. 再次运行 diskutil list,找到 SD 卡的 disk (并非 partition),比如 disk3 ,而不是 disk3s1

    6. 运行 sudo diskutil unmountDisk /dev/disk[n] 解挂SD卡 (将[n]替换为上一步得到的disk编号,比如:/dev/disk3)。

    7. 将镜像拷贝至 SD 卡:sudo dd bs=1m if=[path-to-the-image-file] of=/dev/rdisk[n] conv=sync (替换 [path-to-the-image-file] 为镜像文件路径,例如 ~/Downloads/2017-07-05-raspbian-jessie.img, 并将 [n] 替换为正确的 disk 编号,比如:/dev/rdisk3)。

    2) SSH至Raspberry Pi 

    1. 启用SSH:

    2016年11月之后发布的 Raspbian 默认关闭了 SSH,启用方式是在 SD 卡的根目录创建一个名为 ssh 的文件,不带任何扩展名。

    2. 从电脑弹出 SD 卡,并插入树莓派。

    3. 将树莓派用网线连接至家用路由器,并用 5v 电源给树莓派供电。

    4. 找到树莓派的 IP。如果没用路由器的权限,可以运行 sudo nmap -sP -PI -PT 192.168.1.0/24 扫描家庭网络中的所有设备。

    5. 打开终端,运行 ssh pi@[IP-of-Raspberry-Pi] (将 [IP-of-Raspberry-Pi] 替换为实际的IP地址,比如:192.168.1.16),输入默认密码 raspberry

    6. (可选) 修改密码:passwd pi

    3) (可选) 配置图形远程桌面

    1. 如未安装VNC connect,运行:
    sudo apt-get update
    sudo apt-get install realvnc-vnc-server realvnc-vnc-viewer

    2. 启用 VNC Server,运行 sudo raspi-config ,选择 Interfacing Options,选择 VNC > Yes

    3. 打开 VNC Viewer,输入树莓派的 IP 地址并连接。

    4) 连接Wifi

    1. 运行 cat /etc/network/interfaces,确认已存在以下内容:
    iface wlan0 inet manual
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

    2. 运行 sudo vi /etc/wpa_supplicant/wpa_supplicant.conf,在最底下添加
    network={
    ssid="{Name-of-the-Wifi}"
    psk="{Password-of-the-Wifi}"
    }

    3. 运行 sudo service networking restart 以生效,设置完成后可拔出网线。

    安装必要软件

    1) Python 3.x

    如果 which python3 返回空,运行 sudo apt-get install python3

    2) NodeJs 8.x

    curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
    sudo apt install nodejs
    node -v

    3) Nginx Server

    安装 nginx:sudo apt-get install nginx,开启服务器 sudo /etc/init.d/nginx start

    4) 音频视频相关

    安装ALSA开发库:sudo apt-get install libasound2-dev。如果返回404,先运行 sudo apt-get upgrade --fix-missing

    avconv 用来转换录像为.mp4格式:sudo apt-get install libav-tools

    mpg123 用来播放.mp3:sudo apt-get install mpg123

    5) 下载repo

    cd ~
    git clone https://github.com/shaqian/PiBot.git


    测试硬件

    1) 马达驱动及马达

    1. 按电路图接线。

    2. 安装 rpio,运行 npm install rpio 

    3. 运行 node 

    4. 初始化端口输出:
    var rpio = require('rpio');
    rpio.open(29, rpio.OUTPUT, rpio.LOW);
    rpio.open(31, rpio.OUTPUT, rpio.LOW);
    rpio.open(38, rpio.OUTPUT, rpio.LOW);
    rpio.open(40, rpio.OUTPUT, rpio.LOW);

    5. 前进:
    rpio.write(29, rpio.LOW);
    rpio.write(31, rpio.HIGH);
    rpio.write(38, rpio.LOW);
    rpio.write(40, rpio.HIGH);

    6. 后退:
    rpio.write(29, rpio.HIGH);
    rpio.write(31, rpio.LOW);
    rpio.write(38, rpio.HIGH);
    rpio.write(40, rpio.LOW);

    7. 停止:
    rpio.write(29, rpio.LOW);
    rpio.write(31, rpio.LOW);
    rpio.write(38, rpio.LOW);
    rpio.write(40, rpio.LOW);

    2) 舵机

    1. 按电路图接线:

    2. 运行:
    cd ~/PiBot/PiBotServer/bin
    chmod +x direct.py

    3. 舵机角度由duty cycle控制,一般范围为2.5至11.5。转至中间:
    ./direct.py 7

    4. 左转到底:
    ./direct.py 2.5

    5. 右转到底:
    ./direct.py 11.5

    3) 温湿度传感器

    1. 按电路图接线:

    2. 运行:
    cd ~/PiBot/PiBotServer/bin/temp_hum
    chmod +x getTemp.py
    chmod +x getHum.py

    3. 获取温度:
    ./getTemp.py

    4. 获取湿度:
    ./getHum.py

    4) 红外接收模块

    红外接收模块用来接收和解码遥控器信号,然后树莓派发送相同信号即可模拟遥控器。

    代码借用这个 repo,修改了端口,以及ST_BASE的值,树莓派3 (BCM2837) 为0x3F003000 ,而旧版为 0x20003000。

    1. 按电路图接线:

    2. 运行 gpio -v 检查是否已安装wiringPi。没有的话,安装 Wiring Pi

    3. 运行 cd ~/PiBot/PiBotServer/bin。编译代码生成可执行文件:
    gcc ir_decode.c -lwiringPi -o decode.out
    chmod +x decode.out

    4. 运行 sudo ./decode.out。没有信号时屏幕每秒打印 [0]

    5. 将遥控器对准红外接收模块并按键。解码后的信号为一串十六进制数,如:0xb2,0x4d,0x1f,0xe0,0x98,0x67,[48]

    6. 重复以上步骤,解码空调开机和关机的信号。

    5) 红外发射模块

    红外解码完成后移除红外接收模块

    1. 按电路图接线:

    2. 运行以下命令复制编码代码:

    cd ~/PiBot/PiBotServer/bin
    cp ir_encode.c on.c
    cp ir_encode.c off.c

    3. 运行 vi on.c,将 166 行的十六进制数改为解码所得的开机信号,如:
    char data[6] = {0xb2,0x4d,0x1f,0xe0,0xd8,0x27};

    4. 运行 vi off.c,将 166 行的十六进制数改为解码所得的关机信号,如:
    char data[6] = {0xb2,0x4d,0x7b,0x84,0xe0,0x1f};

    5. 编译代码生成可执行文件:
    gcc on.c -lwiringPi -o on.out
    chmod +x on.out
    gcc off.c -lwiringPi -o off.out
    chmod +x off.out

    6. 发射开机信号:sudo ./on.out

    7. 发射关机信号:sudo ./off.out

    6) 声卡、麦克风及扬声器

    树莓派有板载的 3.5mm 音频接口输入但没有输出,所以我用 USB 声卡作为音频输入和输出。

    1. USB 声卡接入树莓派并连接麦克风及扬声器。

    2. 运行 arecord -laplay -l 确认 USB Audio Device 编号,比如 card 1

    3. 录制 5s 的测试录音:arecord -Dplughw:[n] -fcd -d5 -c1 -twav -r16000 test.wav (将 [n] 替换为 USB 声卡的编号,比如 Dplughw:1)。

    4. 播放测试录音:aplay -Dplughw:[n] test.wav (将 [n] 替换为USB声卡的编号,比如 Dplughw:1)。

    5. 将USB声卡设为默认音频设备,运行 sudo vi /lib/modprobe.d/aliases.conf,写入以下内容并保存:
    options snd_usb_audio index=0
    options snd_bcm2835 index=1
    options snd slots=snd_usb_audio,snd_bcm2835

    6. 重启树莓派: sudo reboot

    7. 运行 cat /proc/asound/modules 确认显示如下:
    0 snd_usb_audio
    1 snd_bcm2835

    8. 此时播放 .wav 无需指定设备编号即是 USB 输出:aplay test.wav

    7) 摄像头

    借用 picam 生成 HTTP Live Streaming (HLS) 直播视频流。

    1. 将树莓派摄像头接至树莓派。

    2. 运行 sudo raspi-config,选择 Interfacing Options,选择 Camera > Yes

    3. 安装 picam 的依赖:
    sudo apt-get update
    sudo apt-get install libharfbuzz0b libfontconfig1

    4. 创建目录和软连接:
    cd ~;mkdir picam;cd picam
    cat > make_dirs.sh <<'EOF'

    #!/bin/bash
    DEST_DIR=~/picam
    SHM_DIR=/run/shm
    mkdir -p $SHM_DIR/rec
    mkdir -p $SHM_DIR/hooks
    mkdir -p $SHM_DIR/state
    mkdir -p $DEST_DIR/archive
    ln -sfn $DEST_DIR/archive $SHM_DIR/rec/archive
    ln -sfn $SHM_DIR/rec $DEST_DIR/rec
    ln -sfn $SHM_DIR/hooks $DEST_DIR/hooks
    ln -sfn $SHM_DIR/state $DEST_DIR/state
    EOF

    chmod +x make_dirs.sh
    ./make_dirs.sh

    5. 安装 picam 库:
    wget https://github.com/iizukanao/picam/releases/download/v1.4.6/picam-1.4.6-binary-jessie.tar.xz
    tar xvf picam-1.4.6-binary-jessie.tar.xz
    cp picam-1.4.6-binary-jessie/picam ~/picam/

    6. 创建 HLS 视频直播流:
    cd ~/picam
    ./picam -o /run/shm/hls

    7. 配置 Nginx 服务器。运行 sudo vi /etc/nginx/sites-available/default,在 server 的 { ... } 块中添加以下内容:
    location /hls/ {
    root /run/shm;
    }

    8. 重启 Nginx:
    sudo /etc/init.d/nginx restart

    9. 测试播放视频流:

    HLS 地址为 http://[IP-of-Raspberry-Pi]/hls/index.m3u8

    i. 使用 Mac 自带的 QuickTime 播放:

    打开 QuickTime,选择 File > Open Location, 输入 http://[IP-of-Raspberry-Pi]/hls/index.m3u8

    ii. 或使用网页播放:

    a. 下载测试用的 html 复制至 Nginx 服务器根目录:
    sudo cp ~/PiBot/PiBotServer/public/hls_test.html /var/www/html/hls_test.html

    b. 在树莓派或同一网络中的电脑上,打开浏览器,转到 http://[IP-of-Raspberry-Pi]/hls_test.html

    配置 Nginx 服务器

    启用 80 端口的 HTTP 以及 443 端口的 HTTPS。如果不启用 HTTPS,当域名非 localhost 时将无法使用录音功能。参考: https://goo.gl/rStTGz

    1. 运行 sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/snippets/nginx-selfsigned.key -out /etc/nginx/snippets/nginx-selfsigned.crt 创建 HTTPS 用的证书。

    2. 将 /etc/nginx/sites-enabled/default 内的内容替换为 ~/PiBot/PiBotServer/ngnix/default

    3. 运行 sudo nginx -t 测试配置文件。如果没问题,重启 Nginx 服务器:sudo /etc/init.d/nginx restart

    使用网页应用

    1. 运行 cd ~/PiBot/PiBotServer;npm install 安装依赖。

    2. 开启 HLS 直播视频流:
    cd ~/picam
    ./make_dirs.sh
    ./picam -o /run/shm/hls --vflip --hflip

    3. 开启网页应用:
    cd ~/PiBot/PiBotServer
    sudo npm start

    4. 在浏览器中打开 http[s]://[IP-of-Raspberry-Pi] (将 IP-of-Raspberry-Pi 替换为实际的网址,比如:192.168.1.16)。

    使用移动应用

    iOS

    i. 编译并在模拟器中运行:
    cd PiBot/PiBotApp
    npm install
    npm run ios

    ii. 在设备上运行:
    参考 React Native 官方文档的 Running your app on iOS devices

    Android

    i. 编译并在模拟器中运行应用:
    cd PiBot/PiBotApp
    npm install
    npm run android

    ii. 在设备上运行:
    参考 React Native 官方文档的 Running your app on Android devices
    或者直接使用repo中的 PiBot.apk。

    相关文章

      网友评论

      • 大宇_6a78:如果不用 树莓派的摄像头,使用usb摄像头,改如何设置流媒体?作者是否有该项目的群,对这个很感兴趣
      • d462f8a8eda4:IOS 部分是如何安装的,我有点不是很明白?还有Picam部分我也安装不成功丫😢😢
      • 蓝飞:请问为什么红外线不直接使用 lirc 呢?
        三少ZZzzz:那个好像有点复杂哈哈
      • wangliang938:设备采购路径能贴上么谢谢
        胖若两人_:@wangliang938 我的树莓派文章中,刚好有提到采购路径,挺便宜的
        wangliang938:@wangliang938 我想看看你全套的,俺也想弄个
        三少ZZzzz:都是淘宝的,需要哪个我可以贴给你
      • 于连林520wcf:高大上啊

      本文标题:树莓派视频遥控小车 + iOS / Android / web应

      本文链接:https://www.haomeiwen.com/subject/ccdhuxtx.html