亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

便携式远程监控摄像头机器人系统

组件与材料

组件数量
SparkFun Arduino Pro Mini 328 - 5V/16MHz1
轮胎 + 减速直流电机 + 固定支架1 套
SparkFun 双 H 桥驱动板 L2981
Raspberry Pi 3 Model B1
Raspberry Pi Camera Module1

所需工具

项目简介

这是一个集机械制造、嵌入式开发、Linux 系统配置、Android App 开发、网络通信于一体的综合项目。虽然复杂,但拆解学习每个模块极具价值。

核心技术栈:

步骤 1:材料清单

便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统

结构件:亚克力/有机玻璃板、塑料板、胶水、轮胎+减速电机+支架、螺母螺栓、六角铜柱、万向轮×2、小型 LED 手电筒(改装前照灯)、PCB 板、NPN 三极管(驱动前照灯)、L7805CV 5V 稳压、L298 H桥、220Ω 电阻、USB 公头、Micro USB 公头、各色导线、3.3V 稳压(Pi-Arduino 通讯)、公母排针、开关、XT60 母头、2S 1300mAh LiPo 电池、5V 移动电源、Pi 3、Pi 存储卡、Pi 外壳、Pi 摄像头。

步骤 2:机械平台搭建

设计目标:前轮双电机差速转向(原地旋转)、后轮万向轮、顶部前照灯、内部容纳电池/电路/Pi 箱、底盘离地几厘米。

底盘:18×13cm 底板,电机用金属支架固定,H桥装底板朝下,后轮用 2cm 六角铜柱(一公一母)固定,底板预留大孔穿线。

上层:两块 L 型板(12×13cm 和 6.5×13cm)胶合,提供电子仓盖、前照灯座、Pi 箱支撑,用 6cm 六角铜柱与底盘连接。

便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统

步骤 3:电子电路制作

便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统

Arduino 引脚分配

PCB 组装要点

  1. 底盘底部已装 H桥,另装前/后红外传感器(用 L 型金属片固定)。
  2. 前照灯:拆解 5V LED 手电筒仅保留灯头,焊线穿孔至上层板,接 2P 母座。
  3. Pi 箱组装:装入 Pi、摄像头、存储卡(已烧录 Raspbian)、摄像头排线。
  4. 主控 PCB 焊接顺序:排母座 → KF301-2P 端子 → NPN 三极管+基极电阻 → L7805CV → 3.3V 稳压(Arduino TX 线) → Arduino Pro Mini 公排针 → 信号线(红/黑/白) → 前照灯公排针。
  5. 连接器制作:
    ① 5V 移动电源 → USB A 公头 + Micro USB 公头 双头供电 Pi 与 Arduino。
    ② LiPo 电池 → XT60 母头 + 开关 → KF301-2P 供电 H桥/电机。
    ③ 红外传感器、H桥、电机、主电源按对应排针连接。
  6. 上电前务必放大镜检查焊点、万用表测通断短路。

步骤 4:Arduino 固件

为什么要中间层 Arduino?

  1. 模块化:可脱离 Pi 独立复用。
  2. 安全:烧坏 3 美元 Pro Mini 远好过 35 美元 Pi。
  3. 实时性:裸机轮询传感器、PWM 控制电机,不受 OS 抢占。
  4. 看门狗可靠:Python 脚本挂起可能导致电机失控,Arduino 看门狗更可靠。
  5. 解耦调试:分层排查更容易。

固件功能:

  1. 串口接收指令控制电机/灯光。协议示例:
    M:-25:16; 左转 25 功率 16 → 左电机 17% 右电机 32% 前进
    M:44:19; 右转 44 功率 19 → 左 38% 右 5% 前进
    L:1; 灯亮 L:0 灯灭
  2. 定时轮询前/后红外传感器,串口上报距离数据:F=3:B=0;

依赖库 TextMotorCommandsInterpretter (GitHub)。完整代码:

// source: https://github.com/danionescu0/arduino/tree/master/libraries/TextMotorCommandsInterpretter
#include <SoftwareSerial.h>
#include <TextMotorCommandsInterpretter.h>
const char MOTOR_COMMAND = 'M';
const char LIGHT_COMMAND = 'L';
const long maxDurationForMottorCommand = 300; // ms
const byte maxPwmValue = 230;
const long transmitingInterval = 500;
const int maxObstacleDetection = 1000;
const int minObstacleDetection = 500;
const byte FLASH_PIN = 3;
const byte RIGHT_MOTOR_PWM_PIN = 5;
const byte RIGHT_MOTOR_EN1_PIN = A4;
const byte RIGHT_MOTOR_EN2_PIN = A5;
const byte LEFT_MOTOR_PWM_PIN = 6;
const byte LEFT_MOTOR_EN1_PIN = A3;
const byte LEFT_MOTOR_EN2_PIN = A2;
const byte FRONT_DISTANCE_SENSOR = A0;
const byte BACK_DISTANCE_SENSOR = A1;
SoftwareSerial masterComm(11, 10); // RX, TX
TextMotorCommandsInterpretter motorCommandsInterpretter(-50, 50, -50, 50);
String currentCommand;
long lastCheckedTime;
long lastTransmitTime;
boolean inMotion = false;

void setup() {
  Serial.begin(9600);
  masterComm.begin(9600);
  masterComm.setTimeout(10);
  pinMode(FLASH_PIN, OUTPUT);
  pinMode(LEFT_MOTOR_PWM_PIN, OUTPUT);
  pinMode(LEFT_MOTOR_EN1_PIN, OUTPUT);
  pinMode(LEFT_MOTOR_EN2_PIN, OUTPUT);
  pinMode(RIGHT_MOTOR_PWM_PIN, OUTPUT);
  pinMode(RIGHT_MOTOR_EN1_PIN, OUTPUT);
  pinMode(RIGHT_MOTOR_EN2_PIN, OUTPUT);
  lastCheckedTime = millis();
  lastTransmitTime = millis();
}

void loop() {
  if (masterComm.available() > 0) {
    currentCommand = masterComm.readString();
    processCommand();
  }
  if (inMotion && millis() - lastCheckedTime > maxDurationForMottorCommand) {
    stopMotors();
  }
  if (millis() - lastTransmitTime > transmitingInterval) {
    lastTransmitTime = millis();
    masterComm.print(getObstacleData());
    Serial.print(analogRead(BACK_DISTANCE_SENSOR)); Serial.print("---");
    Serial.println(getObstacleData());
  }
}

String getObstacleData() {
  int frontDistance = analogRead(FRONT_DISTANCE_SENSOR);
  int backDistace = analogRead(BACK_DISTANCE_SENSOR);
  frontDistance = map(frontDistance, maxObstacleDetection, minObstacleDetection, 0, 10);
  backDistace = map(backDistace, maxObstacleDetection, minObstacleDetection, 0, 10);
  return String("F=" + String(frontDistance) + ":B=" + String(backDistace) + ";");
}

void processCommand() {
  switch (currentCommand.charAt(0)) {
    case MOTOR_COMMAND: steerCar(); break;
    case LIGHT_COMMAND: toggleLight(currentCommand.charAt(2)); break;
  }
}

void steerCar() {
  motorCommandsInterpretter.analizeText(currentCommand);
  float percentLeftMotor = motorCommandsInterpretter.getPercentLeft();
  float percentRightMotor = motorCommandsInterpretter.getPercentRight();
  Serial.write("Left="); Serial.println(percentLeftMotor);
  Serial.write("Right="); Serial.println(percentRightMotor);
  setMotorsDirection(motorCommandsInterpretter.getDirection());
  analogWrite(LEFT_MOTOR_PWM_PIN, percentLeftMotor * maxPwmValue);
  analogWrite(RIGHT_MOTOR_PWM_PIN, percentRightMotor * maxPwmValue);
  inMotion = true;
  lastCheckedTime = millis();
}

void setMotorsDirection(boolean forward) {
  if (forward) {
    digitalWrite(LEFT_MOTOR_EN1_PIN, HIGH);
    digitalWrite(LEFT_MOTOR_EN2_PIN, LOW);
    digitalWrite(RIGHT_MOTOR_EN1_PIN, HIGH);
    digitalWrite(RIGHT_MOTOR_EN2_PIN, LOW);
  } else {
    digitalWrite(LEFT_MOTOR_EN1_PIN, LOW);
    digitalWrite(LEFT_MOTOR_EN2_PIN, HIGH);
    digitalWrite(RIGHT_MOTOR_EN1_PIN, LOW);
    digitalWrite(RIGHT_MOTOR_EN2_PIN, HIGH);
  }
}

void stopMotors() {
  Serial.println("Stopping motors");
  analogWrite(LEFT_MOTOR_PWM_PIN, 0);
  analogWrite(RIGHT_MOTOR_PWM_PIN, 0);
  inMotion = false;
}

void toggleLight(char command) {
  Serial.println("Toggle light");
  if (command == '1') digitalWrite(FLASH_PIN, HIGH);
  else digitalWrite(FLASH_PIN, LOW);
}

用 FTDI 适配器烧录。调试可接蓝牙模块(HC-05)发送串口指令测试。

步骤 5:树莓派端部署

架构概览:

便携式远程监控摄像头机器人系统

前置条件

安装步骤

  1. git clone https://github.com/danionescu0/robot-camera-platform.git (目录固定为 /home/pi/robot-camera-platform,如改动需同步修改 docker-compose.yml)。
  2. 禁用 Pi 串口控制台 (参考 官方指南)。
  3. 安装 uv4l:
    chmod +x uv4l/install.sh uv4l/start.sh && sh ./uv4l/install.sh
    编辑 uv4l/start.sh 配置密码、端口、帧率、分辨率、旋转等。
    测试:sh ./uv4l/start.sh → 浏览器访问 https://<Pi_IP>:9090/stream → sudo pkill uv4l 停止。
  4. 配置 config.py (MQTT 密码、串口设备/波特率) 和 docker-container/mosquitto/Dockerfile (设置 Mosquitto 用户密码)。
  5. 安装 Docker & Docker Compose (参考 树莓派官方博客)。
  6. 配置 systemd 自启动:
    sudo cp systemctl/* /etc/systemd/system/
    sudo systemctl enable robot-camera.service robot-camera-video.service
    重启验证:sudo systemctl status robot-camera.service sudo systemctl status robot-camera-video.service

步骤 6:Android App 配置与构建

  1. git clone https://github.com/danionescu0/android-robot-camera
  2. 开启手机开发者选项 & USB 调试。
  3. 安装 Android Studio,导入项目。
  4. 编辑 app/src/main/res/values/passwords.xml 填入 MQTT 服务器地址/端口、流媒体地址/端口。
  5. 连接手机运行/安装 APK。

步骤 7:使用与调试

便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统
便携式远程监控摄像头机器人系统

App 操作

多层级调试

  1. Arduino 层:FTDI 接第二串口(Pro Mini D11/D10)发指令测试电机/灯光;检查电机反转则对调两线;核对 H桥接线。
  2. Pi 层:docker ps 确认两容器运行;netstat -nltp 检查 9090/1883 端口;ls -l /dev/ttyS0 确认串口设备;停止 Docker 后用 picocom -b 9600 /dev/ttyS0 直连 Arduino 测试;确认串口控制台已禁用;外部机器测试 MQTT/流媒体可达性。
  3. App 层:检查 passwords.xml 配置;验证流媒体/MQTT 外部可达;观察右上角 “Connected”;Android Studio Logcat 查报错。

步骤 8:扩展应用 — 颜色物体跟踪

机器人可跟随特定颜色/大小物体。需 pip3 install -r navigation/requirements.txt (较慢)。修改 navigation/config_navigation.py 中 HSV 阈值 hsv_bounds 和尺寸阈值 object_size_threshold。安装 VNC 查看桌面,运行 python3 object_tracking.py colored-object --show-video 实时查看检测框。

更多创意:人脸跟随、巡逻报警、3G/4G 远程探索危险区域等。项目复杂难免疏漏,欢迎评论区提问交流。喜欢请订阅作者 YouTube 频道支持更多作品。

代码仓库

原理图

制造工艺

  1. 现代相机的演变与设计
  2. 深度解析相机镜头:设计原理、发展历史与未来创新
  3. MrRobot:Ubuntu移动端控制Rapiro机器人,支持语音、触控与摇晃交互
  4. Roomberry:用树莓派 Zero W 将 Roomba 改装为监控机器人
  5. 蓝牙控制 Arduino 电动相机滑轨:打造丝滑电影级运镜
  6. 互动陀螺仪 LED 显示:NeoPixel Ring + Arduino Pro Mini
  7. 基于 Arduino、1Sheeld 与红外控制的万能安卓遥控器
  8. DIY Arduino USB 游戏手柄 — 自制高性能游戏手柄
  9. Pixie:基于 Arduino Pro Mini 的 NeoPixel 智能腕表 - 极简 DIY LED 时钟
  10. 在 Arduino Due 上实现语音识别与语音合成 - BitVoicer Server 方案
  11. Arduino PowerPoint 指针:无缝无线演示控制器
  12. 智能手语手套:柔性传感器 + 加速度计 + 蓝牙将手势转文字/语音