实验09:PWM 电机调速
这个实验做完你会得到什么
手机上拖滑动条,直流电机的转速跟着变;点开关按钮启停。
| 项目 | 说明 |
|---|---|
| 难度 | ★★★☆☆ |
| 用时 | 约 40 分钟 |
| 前置 | 实验02:LED 调光(PWM 原理一样) |
改编自 MIT 官方教程 App Inventor + IoT: PWM Motor。 完成品工程:Arduino101PWMMotor.aia
一、器材清单
| 器材 | 数量 | 说明 |
|---|---|---|
| Arduino 101 | 1 | |
| Seeed Grove 扩展板 | 1 | |
| Grove 直流电机模块(含驱动) | 1 | |
| 外接电源(电池盒) | 1 | 强烈建议,见下 |
二、接线与供电
电机模块插在 Grove 扩展板上;电机的电源要单独供,不要指望 USB。
⚠️ 电机不能直接接引脚。引脚只能输出几十毫安,电机启动瞬间要几百毫安到几安, 直接接会烧引脚甚至烧板子。必须经过电机驱动模块(Grove 电机模块自带驱动芯片)。
只靠 USB 供电时,电机一转板子就可能掉电重启(表现:手机突然断连)。 给驱动模块接外部电池盒能彻底解决。
固件:.ino 里把 PWM_MOTOR 设为 ENABLED,其余 DISABLED。
三、界面组件
| 组件 | 命名 | 关键属性 |
|---|---|---|
| 按钮 | 按钮_启停 |
文本「启动」 |
| 滑动条 | 滑动条_速度 |
最小值 0、最大值 100、初始 60 |
| 标签 | 标签_速度 |
文本「速度:60」 |
| Arduino101PWMMotor | Arduino101PWMMotor1 |
不可见,BluetoothDevice = BluetoothLE1 |
当前版本的
Arduino101PWMMotor没有Pin属性(组件描述符里只有Speed、On和BluetoothDevice),引脚由固件指定。但官方教程里写的是”设置 Pin 为电机插的那个 D 口”,并注明 电机必须插在 D3、D5、D6、D9 之一 —— 那是给带
Pin属性的旧版本写的。 版本对不上时以设计器里实际有没有这个属性为准;接线仍按 D3/D5/D6/D9 选口, 这四个是板子上支持 PWM 的引脚。
四、分步搭代码块
第 1 步:启停
global 转着 = false
when 按钮_启停.Click() {
if 转着 {
Arduino101PWMMotor1.TurnOff()
global 转着 = false
按钮_启停.Text = "启动"
} else {
Arduino101PWMMotor1.TurnOn()
global 转着 = true
按钮_启停.Text = "停止"
}
}
中途验证:点「启动」,电机转起来;再点变成「停止」并停下。
第 2 步:调速
when 滑动条_速度.PositionChanged(thumbPosition) {
Arduino101PWMMotor1.Speed = round(thumbPosition)
标签_速度.Text = join("速度:", round(thumbPosition))
}
中途验证:电机转着的时候拖滑动条,转速明显变化。
Speed是 PWM 占空比的百分比 0~100(组件文档:0 = 一直关,50 = 每个周期通电一半, 100 = 一直开,默认 100),不是 0~255。低速转不动是正常的:直流电机有启动电压,占空比太小(常见低于 25~30)时力矩不够, 电机只会嗡嗡响不转。想从”完全停”平滑起步,可以先给一个短暂的高值再降下来。
第 3 步:连接与收尾
when BluetoothLE1.Connected() {
标签_状态.Text = "已连接"
Arduino101PWMMotor1.Speed = round(滑动条_速度.ThumbPosition)
}
when Screen1.BackPressed() {
Arduino101PWMMotor1.TurnOff()
BluetoothLE1.Disconnect()
}
when BluetoothLE1.Disconnected() {
标签_状态.Text = "已断开"
global 转着 = false
按钮_启停.Text = "启动"
}
退出前一定要
TurnOff。断开连接不会自动停机,电机会一直转到没电 —— 这既危险又费电。
五、排错表
| 现象 | 原因与处理 |
|---|---|
| 电机不转,只嗡嗡响 | 占空比太低,低于启动电压。调到 40 以上试(量程是 0~100 不是 0~255) |
| 电机一转手机就断连 | 供电不足,板子掉电重启。给驱动模块接外部电池 |
| 完全没反应 | ① 固件 PWM_MOTOR 没 ENABLED;② 电机模块没接外部电源;③ BluetoothDevice 没设 |
| 速度调了不生效 | Speed 是属性不是方法,写成 Arduino101PWMMotor1.Speed = 值 |
| 板子发烫 / 有焦味 | 立刻断电。电机直接接了引脚,或驱动模块接反 |
| 退出 App 后电机还在转 | 没在 BackPressed 里 TurnOff |
六、下一步
相关文档
- Arduino101PWMMotor 组件参考
- 官方原版教程(英文,已标注过时):MIT_App_Inventor_IoT_PWM_Motor.pdf
扫码添加客服咨询