j5智能车React前端控制

Posted by David on September 2, 2025

当然!以下是使用 React 制作网页控制 Arduino 机器人小车 的完整指南,以 Markdown 格式 输出,包含 项目介绍、架构说明、硬件连接、后端代码(Node.js + Johnny-Five)、前端代码(React)、运行步骤及扩展建议,方便你保存、阅读和实施。


🤖 使用 React 网页控制 Arduino 机器人小车

📌 项目简介

本项目旨在通过一个 React 前端网页,以 HTTP 请求的方式与 Node.js 后端通信,后端基于 Johnny-Five 库控制 Arduino 机器人小车,实现如 前进、后退、左转、右转、停止 等基本运动控制。


🧩 项目架构

1
[ React 前端网页 ]  ---HTTP--->  [ Node.js 后端 (Express) ]  ---Serial---  [ Johnny-Five ]  ---PWM/DIR--->  [ Arduino 机器人小车 ]
  • React:提供可视化控制界面(如按钮控制运动方向)。
  • Node.js + Express:提供后端 HTTP API 接口,接收前端指令。
  • Johnny-Five:Node.js 机器人控制库,用于控制电机驱动(如 L298N)。
  • Arduino:通过电机驱动模块(如 L298N)控制直流电机运转。

⚙️ 硬件准备(以 L298N 驱动为例)

所需组件

  • Arduino Uno / Nano / Mega 等
  • L298N 电机驱动模块
  • 2 个 直流电机(或 4 个轮子配双电机)
  • 适配电源(如 5V~12V 电池组,不要仅依赖 USB 供电
  • 杜邦线、面包板(可选)
  • USB 数据线(Arduino 连电脑)

接线说明(参考)

Arduino 引脚 L298N 模块 说明
D2 IN1 左电机方向 1
D3 IN2 左电机方向 2
D4 IN3 右电机方向 1
D5 IN4 右电机方向 2
D6 ENA 左电机 PWM(调速,可选)
D9 ENB 右电机 PWM(调速,可选)
5V / GND 5V / GND 模块控制电(非电机动力电)
电机正负极 OUT1 ~ OUT4 接到电机两端

⚠️ 动力电源(给电机供电)不要接到 Arduino 的 VIN 或 5V,应单独供电,并共地(GND)连接到 Arduino。


🛠️ 后端实现(Node.js + Express + Johnny-Five)

1. 创建后端项目

1
2
3
4
mkdir arduino-robot-backend
cd arduino-robot-backend
npm init -y
npm install express johnny-five cors

2. 后端代码:server.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
// server.js
const express = require('express');
const { Board, Robot } = require('johnny-five');
const cors = require('cors');

const app = express();
app.use(cors());
app.use(express.json());

const board = new Board();

// 定义双轮机器人,左右电机引脚配置
const robot = new Robot({
  wheels: [
    { pins: { pwm: 6, dir: 2 }, inverted: false }, // 左电机:PWM 6, DIR 2
    { pins: { pwm: 9, dir: 4 }, inverted: false }  // 右电机:PWM 9, DIR 4
  ],
  wheelDistance: 11 // 轮距(单位:厘米,可忽略或调整)
});

let currentCommand = 'stop';

board.on('ready', () => {
  console.log('✅ Arduino 机器人小车已连接!');

  // 初始状态:停车
  stop();

  // 提供 HTTP API 接口
  app.get('/forward', () => go('forward'));
  app.get('/backward', () => go('backward'));
  app.get('/left', () => go('left'));
  app.get('/right', () => go('right'));
  app.get('/stop', () => go('stop'));

  // 启动服务
  app.listen(3000, () => {
    console.log('🚀 后端服务运行在 http://localhost:3000');
  });
});

// 控制函数
function go(direction) {
  console.log('🚗 执行动作:', direction);
  currentCommand = direction;

  switch (direction) {
    case 'forward':
      robot.forward(1); // 速度 1.0
      break;
    case 'backward':
      robot.backward(1);
      break;
    case 'left':
      robot.left(1);
      break;
    case 'right':
      robot.right(1);
      break;
    case 'stop':
      robot.stop();
      break;
    default:
      console.warn('❓ 未知指令:', direction);
  }
}

function stop() {
  go('stop');
}

board.on('error', (err) => {
  console.error('⚠️ Johnny-Five 错误:', err);
});

🔧 注意:pins: { pwm: ?, dir: ? } 是控制电机方向和速度的引脚,请根据你实际 L298N 的接线修改!


🌐 前端实现(React 控制界面)

1. 创建 React 项目

1
2
3
npx create-react-app arduino-robot-frontend
cd arduino-robot-frontend
npm start

2. 修改 App.js

编辑 src/App.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import React from 'react';
import './App.css';

function App() {
  const sendCommand = (cmd) => {
    fetch(`http://localhost:3000/${cmd}`)
      .then(res => res.text())
      .then(msg => {
        console.log('✅ 指令返回:', msg);
      })
      .catch(err => {
        console.error('❌ 请求失败:', err);
      });
  };

  return (
    <div className="App">
      <h1>🤖 Arduino 机器人小车遥控</h1>
      <div className="controls">
        <button onClick={() => sendCommand('forward')}>⬆️ 前进</button><br /><br />
        <button onClick={() => sendCommand('left')}>⬅️ 左转</button>
        <button onClick={() => sendCommand('stop')}>⏹️ 停止</button>
        <button onClick={() => sendCommand('right')}>➡️ 右转</button><br /><br />
        <button onClick={() => sendCommand('backward')}>⬇️ 后退</button>
      </div>
    </div>
  );
}

export default App;

3. 简单样式(可选,编辑 App.css

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
.App {
  text-align: center;
  padding: 50px;
  font-family: Arial, sans-serif;
}

.controls button {
  margin: 5px;
  padding: 15px 25px;
  font-size: 16px;
  cursor: pointer;
  border: none;
  border-radius: 8px;
  background-color: #007bff;
  color: white;
}

.controls button:hover {
  background-color: #0056b3;
}

▶️ 运行步骤

1. 连接 Arduino

  • 按上述接线图连接 L298N 与 Arduino 和电机。
  • 将 Arduino 通过 USB 线连接到电脑。
  • 不要上传任何程序到 Arduino,Johnny-Five 将通过串口直接控制。

2. 启动后端服务

arduino-robot-backend 目录下运行:

1
node server.js

你应该看到如下信息:

1
2
✅ Arduino 机器人小车已连接!
🚀 后端服务运行在 http://localhost:3000

3. 启动 React 前端

arduino-robot-frontend 目录下运行:

1
npm start

浏览器会自动打开 http://localhost:3001(或手动访问),你将看到控制按钮。

4. 开始控制!

点击以下按钮即可控制小车:

  • ⬆️ 前进
  • ⬅️ 左转
  • ➡️ 右转
  • ⬇️ 后退
  • ⏹️ 停止

✅ 项目扩展建议

功能 实现思路
📡 WiFi / 蓝牙控制 使用 ESP8266 / ESP32 替代电脑串口控制,通过 WiFi 直接与手机/网页通信
📊 传感器数据展示 如超声波测距,通过 WebSocket 实时传回距离数据到前端显示
🤖 自动模式 增加避障、巡线、循迹等 AI / 自动化功能
📱 手机控制 将 React 前端部署至 Vercel / Netlify,用手机浏览器远程遥控
🖥️ 桌面应用 用 Electron 打包 React + Node,形成独立桌面应用
☁️ 远程部署 后端可部署到局域网内的树莓派,实现随时控制

❓ 常见问题

Q1: 电机不动?

  • 检查 Arduino 是否通电并连接电脑。
  • 检查电机驱动模块电源是否接好(电机需要独立电源,别只靠 USB)。
  • 检查 L298N 的引脚接线是否与 server.js 中定义一致。
  • 确保电机驱动模块的 ENA / ENB(PWM) 有供电且未被短路。

Q2: 能否用蓝牙 / WiFi 代替 USB?

  • 可以!推荐使用 ESP8266 / ESP32 开发板,通过 WiFi 与网页或手机通信,Johnny-Five 可运行在 ESP32 上(需使用兼容环境,如 https://github.com/firmata/arduino-firmata-esp32 或改用 https://github.com/bxparks/AceButton 等方案)。

Q3: 能否用手机控制?

  • 可以!将 React 前端部署到 Vercel / Netlify,然后用手机浏览器访问该网址进行遥控。

🎉 总结

通过本项目,你已经实现了:

功能 实现
✅ React 网页 UI 控制 前端提供直观按钮控制
✅ Node.js + Express 后端 提供 HTTP 接口接收指令
✅ Johnny-Five 控制 Arduino 控制电机运动
✅ 硬件接线与驱动 使用 L298N 驱动直流电机

这是一个完整的 机器人小车 Web 遥控原型,非常适合 学习、教学、演示、比赛或进一步开发


🚀 下一步可以尝试

  • 添加 避障传感器(如 HC-SR04),实现自动避障
  • 使用 ESP32 + WiFi,实现无线远程控制
  • 树莓派替代电脑,部署后端 + Johnny-Five 控制
  • 打包成 桌面应用(Electron)手机 App(React Native)

如你想要我继续帮你实现 避障、WiFi 控制、ESP32 支持、传感器融合、自动导航 等高级功能,欢迎继续提问!我可以提供详细代码和指导 😎🤖🚀


Happy Hacking with Robots and React! 🎮🤖💡