Windows IoT借助树莓派驱动步进电机
智能机械控制中步进电机是少不了的,某宝上智能机械手就是步进电机精准控制动作角度完成。
步进电机使用特别广泛,而且都是需要精雕细琢的场景,比如电脑绣花机、针式打印机、电脑绘图仪等。
为了完成试验,出了吃灰很久的树莓派3B+,8.8元买了一个5v进步电机和驱动板。说到树莓派不得不吐槽一下,前两年200左右,现在翻倍不止了,4B+超过一千元了,二手的都是我当初的1.5倍价格。
不废话了,进入正题。
1、硬件准备:树莓派3B+,16G内存卡+读卡器,显示屏(非必须),进步电机+驱动板
2、软件部分:Windows IoT系统+烧写工具、Visual Studio 2022
图中的步进电机是:28BYJ48+ULN2003驱动板 4相 5线 5V12V步进电机
引脚编号用的BCM编码5、6、12、13这4个信号引脚,供电5v
先现在Windows IoT Core Dashboard工具 下载 - Windows IoT | Microsoft Docs
Windows IoT Core的最新版本还是2018年的,如何下载烧写不细讲了。和树莓派系统一样,通电自己启动,随遍一个HDMI的显示器都可以街上。
下载安装Visual Studio 2022,宇宙第一的开发环境刚刚升级到了.Net6,等MAUI完善,就可以全平台开发任意应用了。这里使用的是UWP程序,鉴于本次演示的是电机驱动,先不展示了。
using Windows.Devices.Gpio
微软不但提供了操作Gpio的类库,还有PWM、I2C,SPI等以后慢慢展示出来。
根据电机+启动的工作原理,这次并没有用到PWM,而且通过GPIO来完成的。
步进电机的驱动原理
驱动板上有IN1, IN2, IN3, IN4四个接口,根据资料得知这四个接口依次设置为高电平就可以驱动,就想弹吉他,从上往下波琴弦,总有一根被弹到,循环往复
引脚关系:GPIO5->IN1,GPIO6->IN2,GPIO12->IN3,GPIO3->IN4.4个GpioPin对象顺序变换高低电平。
具体实现代码如下:一个步进,4个引脚分别一次高电平
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Windows.Devices.Gpio;
namespace Recyclable.Monitors
{
public class MotorService
{
/// <summary>
/// GPIO针脚
/// </summary>
readonly int[] pins = { 5, 6, 12, 13 };
/// <summary>
/// GPIO控制对象
/// </summary>
private readonly List<GpioPin> _GpioPin;
public MotorService()
{
var gpio = GpioController.GetDefault();
_GpioPin = new List<GpioPin>();
foreach (var p in pins)
{
var pin = gpio.OpenPin(p);
pin.SetDriveMode(GpioPinDriveMode.Output);
_GpioPin.Add(pin);
}
}
/// <summary>
/// 顺时针转动
/// </summary>
/// <param name="steps"></param>
public void TurnClockwise(int steps)
{
for (int x = 0; x < steps; x++)//前进x次
{
for (int i = 0; i < _GpioPin.Count; i++)//一次前进,所有针脚从高到低
{
Thread.Sleep(2);
for (int j = 0; j < _GpioPin.Count; j++)//每步都设置电平
{
if (j == i)
_GpioPin[j].Write(GpioPinValue.High);
else
_GpioPin[j].Write(GpioPinValue.Low);
}
}
}
Stop();
}
/// <summary>
/// 停止
/// </summary>
public void Stop()
{
for (int i = 0; i < _GpioPin.Count; i++)
{
_GpioPin[i].Write(GpioPinValue.Low);
}
}
/// <summary>
/// 释放
/// </summary>
public void Release()
{
for (int i = 0; i < _GpioPin.Count; i++)
{
_GpioPin[i].Dispose();
_GpioPin[i] = null;
}
}
/// <summary>
/// 逆时针转动
/// </summary>
/// <param name="steps"></param>
public void TurnAnticlockwise(int steps)
{
for (int x = 0; x < steps; x++)//前进x次
{
for (int i = _GpioPin.Count - 1; i >= 0; i--)//一次前进,所有针脚从高到低
{
Thread.Sleep(2);
for (int j = _GpioPin.Count - 1; j >= 0; j--)//每步都设置电平,
{
if (j == i)
_GpioPin[j].Write(GpioPinValue.High);
else
_GpioPin[j].Write(GpioPinValue.Low);
}
}
}
Stop();
}
}
}
在我这个电机是Step=512正好是转动一圈。实例化后执行
var motor = new MotorService();
motor.TurnAnticlockwise(512);
- 点赞
- 收藏
- 关注作者
评论(0)