Arduino 101 实验09 - PWM 电机调速

« 返回 Arduino101 平台  IoT 专题

实验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 属性(组件描述符里只有 SpeedOnBluetoothDevice),引脚由固件指定。

但官方教程里写的是”设置 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))
}

中途验证:电机转着的时候拖滑动条,转速明显变化。

SpeedPWM 占空比的百分比 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 后电机还在转 没在 BackPressedTurnOff

六、下一步


相关文档

文档反馈