<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Arduino中国 &#187; 步进电机</title>
	<atom:link href="http://blog.flamingoeda.com/tag/%e6%ad%a5%e8%bf%9b%e7%94%b5%e6%9c%ba/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.flamingoeda.com</link>
	<description>Flamingo EDA</description>
	<lastBuildDate>Mon, 02 Aug 2010 05:45:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>用Arduino与EasyDriver驱动步进电机</title>
		<link>http://blog.flamingoeda.com/2009/06/30/%e7%94%a8arduino%e4%b8%8eeasydriver%e9%a9%b1%e5%8a%a8%e6%ad%a5%e8%bf%9b%e7%94%b5%e6%9c%ba/</link>
		<comments>http://blog.flamingoeda.com/2009/06/30/%e7%94%a8arduino%e4%b8%8eeasydriver%e9%a9%b1%e5%8a%a8%e6%ad%a5%e8%bf%9b%e7%94%b5%e6%9c%ba/#comments</comments>
		<pubDate>Mon, 29 Jun 2009 16:12:42 +0000</pubDate>
		<dc:creator>flamingoeda</dc:creator>
				<category><![CDATA[Arduino]]></category>
		<category><![CDATA[EasyDriver]]></category>
		<category><![CDATA[步进电机]]></category>

		<guid isPermaLink="false">http://blog.arduino.cn/?p=468</guid>
		<description><![CDATA[与其它普通直流电机相比，步进电机最大的特点就是它可以通过输入脉冲信号来进行控制的，也就是说电机的总转动角度可以由输入脉冲数决定，而电机的转速由脉冲信号频率决定。正因如此，你可以用Arduino来为步进电机产生相应的脉冲信号，来精确地控制电机转动的角度和速度！ 步进电机是机电控制中一种常用的执行机构，实际使用时通常会用到一个驱动电路来对其进行驱动，这里我们使用的是EasyDriver，使用它能够很方便地控制一个两相混合式步进电机。电路在工作时由Arduino负责给EasyDriver发送相应的控制脉冲信号，来驱动步进电机转动相应的角度。由于EasyDriver一边要接收Arduino的控制信号，一边要控制电机转过相应的角度，因此接线其实也可以分成两个部分。 一部分是同Arduino相连的GND, STEP, DIR三根接线，分别为地、步进脉冲引脚和方向控制引脚步，STEP和DIR使用Arduino上普通的数字I/O引脚即可： 另一部分则是为电机供电的GND和+V引脚（这里我使用的9V外接电源），以及与两相步进电机相连接的MA和MB这4个个引脚（分别同电机的一个相连接起来）： 为了演示的方便，我们还在A0和A1两个引脚上接上了两个按钮来分别控制电机的方向。顺便提一句，Arduino的A0 ~ A6在需要的时候也可以当成数字I/O引脚使用，其中A0对应的数字I/O为14，A1对应的数字I/O为15，依次类推。 接线并不算太复杂，最后电路接线的效果图： 相应的程序也比较简单： int dirPin = 6; int stepperPin = 5; int switch1 = 14; int switch2 = 15; int value; void setup() { pinMode(dirPin, OUTPUT); pinMode(stepperPin, OUTPUT); pinMode(switch1, INPUT); pinMode(switch2, INPUT); } void step(boolean dir,int steps){ digitalWrite(dirPin,dir); for(int i=0; i &#60; steps; i ++) { digitalWrite(stepperPin, [...]]]></description>
			<content:encoded><![CDATA[<p>与其它普通直流电机相比，步进电机最大的特点就是它可以通过输入脉冲信号来进行控制的，也就是说电机的总转动角度可以由输入脉冲数决定，而电机的转速由脉冲信号频率决定。正因如此，你可以用Arduino来为步进电机产生相应的脉冲信号，来精确地控制电机转动的角度和速度！</p>
<p>步进电机是机电控制中一种常用的执行机构，实际使用时通常会用到一个驱动电路来对其进行驱动，这里我们使用的是EasyDriver，使用它能够很方便地控制一个两相混合式步进电机。电路在工作时由Arduino负责给EasyDriver发送相应的控制脉冲信号，来驱动步进电机转动相应的角度。由于EasyDriver一边要接收Arduino的控制信号，一边要控制电机转过相应的角度，因此接线其实也可以分成两个部分。</p>
<p>一部分是同Arduino相连的GND, STEP, DIR三根接线，分别为地、步进脉冲引脚和方向控制引脚步，STEP和DIR使用Arduino上普通的数字I/O引脚即可：</p>
<p><a href="http://blog.flamingoeda.com/wp-content/uploads/2009/06/easy_driver_1.jpg"><img class="aligncenter size-full wp-image-470" title="easy_driver_1" src="http://blog.flamingoeda.com/wp-content/uploads/2009/06/easy_driver_1.jpg" alt="" width="460" height="384" /></a></p>
<p>另一部分则是为电机供电的GND和+V引脚（这里我使用的9V外接电源），以及与两相步进电机相连接的MA和MB这4个个引脚（分别同电机的一个相连接起来）：</p>
<p><a href="http://blog.flamingoeda.com/wp-content/uploads/2009/06/easy_driver_2.jpg"><img class="aligncenter size-full wp-image-471" title="easy_driver_2" src="http://blog.flamingoeda.com/wp-content/uploads/2009/06/easy_driver_2.jpg" alt="" width="460" height="345" /></a></p>
<p>为了演示的方便，我们还在A0和A1两个引脚上接上了两个按钮来分别控制电机的方向。顺便提一句，Arduino的A0 ~ A6在需要的时候也可以当成数字I/O引脚使用，其中A0对应的数字I/O为14，A1对应的数字I/O为15，依次类推。</p>
<p><a href="http://blog.flamingoeda.com/wp-content/uploads/2009/06/easy_driver_3.jpg"><img class="aligncenter size-full wp-image-472" title="easy_driver_3" src="http://blog.flamingoeda.com/wp-content/uploads/2009/06/easy_driver_3.jpg" alt="" width="460" height="345" /></a></p>
<p>接线并不算太复杂，最后电路接线的效果图：</p>
<p><a href="http://blog.flamingoeda.com/wp-content/uploads/2009/06/easy_driver_4.jpg"><img class="aligncenter size-full wp-image-473" title="easy_driver_4" src="http://blog.flamingoeda.com/wp-content/uploads/2009/06/easy_driver_4.jpg" alt="" width="460" height="345" /></a></p>
<p>相应的程序也比较简单：</p>
<pre><span style="color: #996600;">int</span> dirPin = 6;
<span style="color: #996600;">int</span> stepperPin = 5;
<span style="color: #996600;">int</span> switch1  = 14;
<span style="color: #996600;">int</span> switch2 = 15;
<span style="color: #996600;">int</span> value;

<span style="color: #cc6600;">void</span> <span style="color: #993300;"><strong>setup</strong></span>() {
  <span style="color: #996600;">pinMode</span>(dirPin, <span style="color: #cc0000;">OUTPUT</span>);
  <span style="color: #996600;">pinMode</span>(stepperPin, <span style="color: #cc0000;">OUTPUT</span>);
  <span style="color: #996600;">pinMode</span>(switch1, <span style="color: #cc0000;">INPUT</span>);
  <span style="color: #996600;">pinMode</span>(switch2, <span style="color: #cc0000;">INPUT</span>);
}

<span style="color: #cc6600;">void</span> <span style="color: #996600;">step</span>(<span style="color: #996600;">boolean</span> dir,<span style="color: #996600;">int</span> steps){
  <span style="color: #996600;">digitalWrite</span>(dirPin,dir);
  <span style="color: #cc6600;">for</span>(<span style="color: #996600;">int</span> i=0; i &lt; steps; i ++) {
    <span style="color: #996600;">digitalWrite</span>(stepperPin, <span style="color: #cc0000;">HIGH</span>);
    <span style="color: #996600;">delayMicroseconds</span>(50);
    <span style="color: #996600;">digitalWrite</span>(stepperPin, <span style="color: #cc0000;">LOW</span>);
    <span style="color: #996600;">delayMicroseconds</span>(50);

    <span style="color: #777755;">// speed control</span>
    <span style="color: #996600;">delayMicroseconds</span>(100);
  }
}

<span style="color: #cc6600;">void</span> <span style="color: #993300;"><strong>loop</strong></span>(){
  value = <span style="color: #996600;">digitalRead</span>(switch1);
  <span style="color: #cc6600;">if</span> (<span style="color: #cc0000;">HIGH</span> == value) {
    <span style="color: #996600;">step</span>(<span style="color: #cc6600;">true</span>,1600 * 5);
  }

  value = <span style="color: #996600;">digitalRead</span>(switch2);
  <span style="color: #cc6600;">if</span> (<span style="color: #cc0000;">HIGH</span> == value) {
      <span style="color: #996600;">step</span>(<span style="color: #cc6600;">false</span>,1600*5);
  }

}
</pre>
<p>按照前面的连线，控制电机转动的脉冲信号是通过Arduino上的数字I/O引脚5来提供的，而电机转动方向的控制则是通过数字I/O引脚6来实现的。两个按钮开关分别接在A0和A1号引脚上，对于数字I/O引脚14和15：</p>
<pre class="java">int dirPin = 6;
int stepperPin = 5;
int switch1  = 14;
int switch2 = 15;
</pre>
<p>步进电机的转动主要是通过step()函数来实现，该函数有两个参数：第一个是转动的方向，分别代表正转和反转；第二个是步进数目，即给的控制脉冲的数目。通过修改每个脉冲间隔之间的时间长度，可以非常容易地调整电机转动的速度：</p>
<pre class="java">    // speed control
    delayMicroseconds(100);
</pre>
<p>两个对step()函数的调用，分别控制电机正转/反转相应的圈数，由于每种电机步进的角度数不同，旋转一圈所需要的脉冲数也是不一样的：</p>
<pre class="java">  step(true,1600 * 5);
  step(false,1600 * 5);
</pre>
<p>最后提醒一下，EasyDriver上的R6是用来限流的，调节它可以设置经过驱动芯片的电流大小。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.flamingoeda.com/2009/06/30/%e7%94%a8arduino%e4%b8%8eeasydriver%e9%a9%b1%e5%8a%a8%e6%ad%a5%e8%bf%9b%e7%94%b5%e6%9c%ba/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
