×

Windows IoT:双向直流电机控制

消耗积分:0 | 格式:zip | 大小:0.29 MB | 2022-12-21

倪山骋

分享资料个

描述

在许多物联网场景中,可能需要自动化来物理移动某些东西。为此,您需要使用某种类型的电机。在此示例中,我们将使用L293DNE芯片和运行 Windows IoT Core 操作系统的 Raspberry Pi 2控制单个直流电机。

l293d.pdf

 

所需材料

硬件设置

单直流电机控制接线图

 
poYBAGOiXpCAdyJtAAGLomQWjI4098.png
 

数据表中的 L293D 引脚输出图

 
poYBAGOiXpqAGFiwAAC11jnUIMY084.jpg
 

接线细节

  • Cobbler 5v 到面包板电源轨 #1
  • Cobbler GND 到面包板接地轨 #1
  • 面包板接地轨 #1 到对面的面包板接地轨 #2
  • L293D 引脚 4、5、12、13 到面包板接地轨
  • L293D 引脚 16 (VCC1) 到面包板电源轨
  • Cobbler 引脚 21 到 L293D 引脚 1 (1,2EN)
  • Cobbler 引脚 20 到 L293D 引脚 2 (1A)
  • Cobbler 引脚 16 到 L293D 引脚 7 (2A)
  • 电池组正极(红线)到面包板电源轨 #2
  • 电池组接地(黑线)到面包板接地轨 #2
  • L293D 引脚 8 (VCC2) 到面包板电源轨 #2
  • 一根电机线(可互换)到 L293D 引脚 3 (1Y)
  • 一根电机线(可互换)到 L293D 引脚 6 (2Y)

直流电机控制接线

 
poYBAGOiXqOAXxPlAAFOIhr2SCA100.jpg
 

LD293D集成威廉希尔官方网站

该项目对实现直流电机的双向控制进行了简单的考察。有多种方法可以实现此解决方案,这只是其中一种。L293D 芯片能够控制两个电机,但在本例中,我们将仅使用 IC 的一侧来控制一个电机。该 IC 依靠 5V 逻辑工作,通过引脚 16 或 VCC1 馈送到芯片。直流电机需要的安培数比 Raspberry Pi 所能输出的要大,因此我们通过引脚 8 或 VCC2 使用外部电池为它提供不同的电源。为了控制电机,其使能引脚必须设置为高电平,在我们的例子中,我们使用电机控制 IC 的左侧,因此将是引脚 1 (1,2 EN)。微控制器输入(1A 或引脚 2 和 2A 或引脚 7)用于控制电机旋转的方向,

数据表中的直流电机控制表

 
poYBAGOiXqeATTI6AACdYXr96cs159.jpg
 

软件

在此解决方案中,创建了一个新的空白通用 Windows 应用程序并将其命名为 PiDCMotorControl。添加了对 UWP 的 Windows IoT 扩展的引用。为了创建 UI,将 MainPage.xaml 清单替换为以下内容:

用户界面定义:


    x:Class="PiDCMotorControl.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:PiDCMotorControl"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">
 
    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <Grid.RowDefinitions>
            "50" />
            "50" />
            "50" />
            "50" />
            "50" />
        Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            "200" />
            "200" />
            
        Grid.ColumnDefinitions>
        FontSize="30" Grid.Row="1" Grid.ColumnSpan="3">Motor Control
        <Button Name="btnIgnitionOn" Margin="5" Background="Green" Foreground="White"  Grid.Row="2" 
                Click="btnIgnitionOn_Click">Ignition ONButton>
        <Button Name="btnIgnitionOff" Margin="5" Background="Red" Foreground="White" IsEnabled="False" 
                Grid.Row="2" Grid.Column="1" Click="btnIgnitionOff_Click">Ignition OffButton>
        <Button Name="btnForward" Margin="5" Background="LightBlue" Foreground="DarkBlue" IsEnabled="False" 
                Grid.Row="3" Click="btnForward_Click">ForwardButton>
        <Button Name="btnReverse" Margin="5" Background="Orange" Foreground="OrangeRed" IsEnabled="False" 
                Grid.Row="3" Grid.Column="1" Click="btnReverse_Click">ReverseButton>
        <Button Name="btnStop" Click="btnStop_Click" Background="Salmon" Foreground="Sienna" IsEnabled="True"
                Grid.Row="4" Margin="5">StopButton>
     Grid>

这将创建一个屏幕,其中包含一系列用于控制电机的按钮。点火按钮将 LD293D 电机使能引脚设置为高电平,点火关闭按钮将其设置为低电平。还包括用于向前和向后移动电机的按钮。停止按钮可用于停止电机(无需关闭“点火装置”)。

直流电机控制用户界面

 
pYYBAGOiXqmAEo-SAAB_vQBEV-g302.jpg
 

接下来,我们将用以下内容替换屏幕实现列表 (MainPage.xaml.cs):

直流电机控制实现:

using Windows.Devices.Gpio;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
 
namespace PiDCMotorControl
{
    /// 
    /// Basic Bi-Directional Control of a single DC Motor
    /// 
    public sealed partial class MainPage : Page
    {
        private int _pinEn1_2 = 21; 
        private int _pin1A = 20; 
        private int _pin2A = 16; 
 
        private GpioController _controller;
        private GpioPin _motorEnable;
        private GpioPin _motorControl1A;
        private GpioPin _motorControl2A;
      
        public MainPage()
        {
            this.InitializeComponent();
 
            _controller = GpioController.GetDefault();
            _motorEnable = _controller.OpenPin(_pinEn1_2);
            _motorControl1A = _controller.OpenPin(_pin1A);
            _motorControl2A = _controller.OpenPin(_pin2A);
            _motorEnable.SetDriveMode(GpioPinDriveMode.Output);
            _motorControl1A.SetDriveMode(GpioPinDriveMode.Output);
            _motorControl2A.SetDriveMode(GpioPinDriveMode.Output);     
        }
 
        private void _turnOnIgnition()
        {
            _motorEnable.Write(GpioPinValue.High);
        }
 
        private void _forwardMotor()
        {
            _motorControl1A.Write(GpioPinValue.High);
            _motorControl2A.Write(GpioPinValue.Low);
        }
 
        private void _reverseMotor()
        {
            _motorControl1A.Write(GpioPinValue.Low);
            _motorControl2A.Write(GpioPinValue.High);
        }
 
        private void _stopMotor()
        {
            _motorControl1A.Write(GpioPinValue.Low);
            _motorControl2A.Write(GpioPinValue.Low);
        }
 
        private void _turnOffIgnition()
        {
            _motorEnable.Write(GpioPinValue.Low);
            _motorControl1A.Write(GpioPinValue.Low);
            _motorControl2A.Write(GpioPinValue.Low);
        }
 
        private void btnIgnitionOn_Click(object sender, RoutedEventArgs e)
        {
            btnIgnitionOn.IsEnabled = false;
            btnIgnitionOff.IsEnabled = true;
            btnForward.IsEnabled = true;
            btnReverse.IsEnabled = true;
            _turnOnIgnition();
        }
 
        private void btnIgnitionOff_Click(object sender, RoutedEventArgs e)
        {
            btnIgnitionOn.IsEnabled = true;
            btnIgnitionOff.IsEnabled = false;
            btnForward.IsEnabled = false;
            btnReverse.IsEnabled = false;
            _turnOffIgnition();
        }
 
        private void btnForward_Click(object sender, RoutedEventArgs e)
        {
            btnForward.IsEnabled = false;
            btnReverse.IsEnabled = true;
            _forwardMotor();
        }
 
        private void btnReverse_Click(object sender, RoutedEventArgs e)
        {
            btnReverse.IsEnabled = false;
            btnForward.IsEnabled = true;
            _reverseMotor();
        }
 
        private void btnStop_Click(object sender, RoutedEventArgs e)
        {
            _stopMotor();
        }
    }
}

当应用程序部署到树莓派上时,您可以通过操作屏幕上的按钮来控制电机。

 
poYBAGOiXpCAdyJtAAGLomQWjI4098.png
 

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'Windows IoT:双向直流电机控制',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);