Windows IoT借助树莓派驱动步进电机

举报
神龙居市 发表于 2021/12/10 00:52:45 2021/12/10
【摘要】 智能机械控制中步进电机是少不了的,某宝上智能机械手就是步进电机精准控制动作角度完成。步进电机使用特别广泛,而且都是需要精雕细琢的场景,比如电脑绣花机、针式打印机、电脑绘图仪等。为了完成试验,出了吃灰很久的树莓派3B+,8.8元买了一个5v进步电机和驱动板。说到树莓派不得不吐槽一下,前两年200左右,现在翻倍不止了,4B+超过一千元了,二手的都是我当初的1.5倍价格。不废话了,进入正题。1、硬...

智能机械控制中步进电机是少不了的,某宝上智能机械手就是步进电机精准控制动作角度完成。

步进电机使用特别广泛,而且都是需要精雕细琢的场景,比如电脑绣花机、针式打印机、电脑绘图仪等。

为了完成试验,出了吃灰很久的树莓派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);
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。