太棒了!用 Scratch 来编程无人机是一个非常有趣且富有创造性的想法,这不仅能让你学习编程逻辑,还能亲手控制现实世界的物体,成就感十足。

下面我将为你详细拆解如何实现“Scratch 编程无人机”,包括核心原理、准备工作、具体步骤和项目案例。
核心原理:Scratch 如何与无人机通信?
Scratch 本身是一个图形化编程环境,它不能直接通过 Wi-Fi 或蓝牙控制无人机,我们需要一个“中间人”或“翻译官”。
这个“翻译官”通常是一个微控制器,最常见的就是 ESP32 开发板,整个工作流程如下:
- 你在 Scratch 中编写程序:当按下“上箭头”键时,让无人机向上飞。
- Scratch 将指令发送出去:通过你的电脑或局域网,将“向上飞”这个指令打包成数据(通常是网络数据包)。
- ESP32 接收指令:ESP32 开发板连接到同一个 Wi-Fi 网络,像一个“网络服务器”一样,监听并接收来自 Scratch 的数据。
- ESP32 翻译并执行指令:ESP32 接收到指令后,会根据预设的协议,将其翻译成无人机遥控器(遥控器)能识别的信号(通常是红外信号 IR 或串口信号 Serial)。
- 无人机接收信号并行动:无人机的接收器(遥控器)接收到 ESP32 发来的信号,控制电机做出相应的动作(上升、下降、旋转等)。
准备工作:你需要什么硬件和软件?
硬件部分:
-
无人机:
(图片来源网络,侵删)- 首选:支持红外遥控的玩具无人机,这种无人机通常使用红外信号控制,像电视遥控器一样,这是最简单的方案,因为 ESP32 可以轻松模拟红外信号。
- 备选:支持串口通信的无人机,一些更高级的玩具无人机或 DIY 套件(如 Holybro 的 CADDX Turtle V2)会通过串口接收指令,这需要更复杂的硬件连接,但信号更稳定。
-
主控板:ESP32 开发板:
- 这是整个项目的核心,ESP32 便宜、功能强大,自带 Wi-Fi 和蓝牙,并且可以轻松编程来模拟红外信号,推荐使用 ESP32 DevKitC V4 这类常见的开发板。
-
红外发射管:
如果你的无人机是红外遥控的,你需要一个红外发射管,很多 ESP32 开发板已经集成了红外发射二极管,如果没有,你需要单独购买一个,并连接到 ESP32 的指定引脚。
-
连接线:
(图片来源网络,侵删)杜邦线若干,用于连接红外发射管(如果需要)。
软件部分:
-
Scratch 3.0:
- 可以是 Scratch 3.0 离线版 或 在线版,为了与硬件通信,我们通常会使用一个特殊的 Scratch 扩展。
-
Scratch Link (关键!):
- 这是连接 Scratch 和硬件的桥梁,Scratch Link 是一个在你的电脑上运行的小程序,它会监听来自 Scratch 程序的网络请求,并通过蓝牙或 Wi-Fi 将这些请求转发给连接的设备(如 ESP32)。
- 下载地址:https://scratch.mit.edu/scratch-link
- 注意:Scratch Link 主要支持蓝牙,但我们可以通过一些技巧(见下文)让它与 Wi-Fi 上的 ESP32 通信。
-
Arduino IDE:
用于给 ESP32 编写和上传代码,你需要先安装 Arduino IDE,并添加 ESP32 的开发板支持。
-
无人机遥控器:
- 一个好的“信号源”,你需要先用手动遥控器“学习”并“录制”下无人机的各种动作指令(如上升、下降、左飞、右飞、旋转等),然后将这些录制的信号数据存入 ESP32 的代码中。
详细步骤:从零开始搭建
第 1 步:为 ESP32 “学习”无人机指令
这是最关键的一步,目的是让 ESP32 知道“上升”这个动作对应怎样的红外信号数据。
-
准备硬件:
- 将红外接收头连接到 Arduino 上(VCC, GND, DATA)。
- 将无人机遥控器和红外接收头都对准,确保它们之间没有障碍物。
-
使用 Arduino 库录制信号:
- 在 Arduino IDE 中,安装
IRremoteESP8266库(它也支持 ESP32)。 - 打开
IRrecvDumpV2示例程序(在库的示例中可以找到)。 - 上传代码到 ESP32。
- 打开 Arduino IDE 的 串口监视器(波特率设置为 115200)。
- 按下遥控器上的“上升”按钮,串口监视器会打印出一长串数据(类似
Protocol NEC Address: 0x10 Command: 0xE01F Bits: 32)。 - 记录下所有你需要的指令(上升、下降、左、右、前、后、起飞、降落等)的
Address和Command值。
- 在 Arduino IDE 中,安装
第 2 步:编写 ESP32 发射代码
你将使用上一步记录的数据,编写一个能让 ESP32 发射红外信号的代码。
- 创建一个新的 Arduino 程序。
- 引入
IRremoteESP8266.h库。 - 定义红外发射引脚(
#define IR_LED 4)。 - 创建一个
IRsend对象。 - 在
setup()函数中,初始化串口,用于接收来自 Scratch 的指令。 - 在
loop()函数中,使用if (Serial.available())来检查是否有数据从串口传来。 - 根据收到的不同字符('U' 代表 Up, 'D' 代表 Down),调用
irsend.sendNEC()函数,并传入你之前记录的Address和Command。
示例代码框架:
#include <Arduino.h>
#include <IRremoteESP8266.h>
#include <IRsend.h>
#define IR_LED 4 // 定义红外发射引脚
IRsend irsend(IR_LED); // 创建 IRsend 对象
void setup() {
Serial.begin(115200); // 初始化串口,与电脑通信
Serial.println("ESP32 IR Transmitter Ready!");
}
void loop() {
if (Serial.available() > 0) { // 检查是否有数据传入
char command = Serial.read(); // 读取一个字符
// 根据不同指令发送不同的红外信号
switch (command) {
case 'U': // Up
Serial.println("Sending UP signal...");
irsend.sendNEC(0x10E01F, 32); // 替换为你录制的地址和命令
break;
case 'D': // Down
Serial.println("Sending DOWN signal...");
irsend.sendNEC(0x10D02F, 32);
break;
case 'L': // Left
Serial.println("Sending LEFT signal...");
irsend.sendNEC(0x10C03F, 32);
break;
case 'R': // Right
Serial.println("Sending RIGHT signal...");
irsend.sendNEC(0x10B04F, 32);
break;
case 'T': // Takeoff
Serial.println("Sending TAKEOFF signal...");
irsend.sendNEC(0x10A05F, 32);
break;
case 'L': // Land
Serial.println("Sending LAND signal...");
irsend.sendNEC(0x10906F, 32);
break;
default:
Serial.print("Unknown command: ");
Serial.println(command);
break;
}
}
}
将这段代码上传到你的 ESP32。
第 3 步:配置 Scratch 和 Scratch Link
这是连接虚拟世界和现实世界的桥梁。
-
启动 ESP32 的 TCP 服务器:
- 上述代码只监听串口,为了让 Scratch 能找到它,我们需要在代码中加入一个简单的 TCP 服务器功能,这会让事情变得复杂一些,有现成的库可以帮助你实现。
- 一个更简单的方法是使用 Blynk 或 MQTT 等物联网平台,但这超出了基础教程的范围。
- 简化方案:直接使用 USB 串口通信,如果你将 ESP32 通过 USB 连接到电脑,Scratch 可以通过一个名为
Serial的扩展直接向串口发送字符,这是最直接、最稳定的方式,但缺点是线缆限制了无人机的活动范围。
-
安装 Serial 扩展:
标签: Scratch无人机编程创意飞行 Scratch控制无人机飞行教程 Scratch无人机编程创意项目