极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 134703|回复: 48

Arduino机械坊学习笔记01(从Easydriver开始)_2014_2_28

  [复制链接]
发表于 2014-2-28 10:35:46 | 显示全部楼层 |阅读模式
***********************
从淘宝上买了光驱式激光雕刻机DIY,目前还没有能力装上。相比安装要求,配套教程确实不够详细。虽然不需要知道原理,只知道步骤也可以完成雕刻机安装,但是步骤不清楚,另外自己对arduino和easydriver也不是很熟悉,所以难上加难。

为了不半途而废,所以打算边学基础边实践,最终完成对激光雕刻机的理解和实践。

***********************

选择easydriver作为起点,是因为它式连接 arduino 和 步进电机的 关键核心。

机械坊已经有两个例子,
*******
http://www.geek-workshop.com/thread-8147-1-1.html
微型CNC制作基于开源项目GRBL

这个例子就是最终要完成的,只是觉得该例子对于基础差的不够详细,而且步骤有跳跃,一上来就按照该教程失败率较高。

*******
http://www.geek-workshop.com/thread-4722-1-1.html
arduino当Gcode解释程序(CNC)

这个例子虽然有用,但对新手来说更不完整,新手无从下手。
********

直接找到easydriver的老家,
http://schmalzhaus.com/EasyDriver/Examples/EasyDriverExamples.html
果然提供新手的例子(并推荐进阶可以参考blogspot 上面的turorial,遗憾的是打不开,不知道是不是与长城有关)

第一个例子是 设置,怎样连线
***************************************
Example 1: Basic Arduino setup


上面的示意图可以使用 Arduino设计助手来画,刚刚才搜到。

为什么这样连接,需要看easydriver 示意图


从上图可以看出,步进电机是4根线,选择2相4线类型,淘宝上非常多。接线顺序示意图很清晰很简单。

这里有个事项,easydriver的排针是没有焊接上,需要玩家自己焊接,这时就有两种选择:
1、仿照上面的示意图(使用面包板)


2、不使用面包板


需要仔细看,就是排针的方向,排针焊接在正面,就是使用面板板;焊接在反面,就不用面包板。

步进电机需要单独供电,6~30v。
******************************************

例子1的目的在于连线,代码反而很简单,

void setup() {               

  pinMode(8, OUTPUT);     

  pinMode(9, OUTPUT);

  digitalWrite(8, LOW);

  digitalWrite(9, LOW);

}


void loop() {

  digitalWrite(9, HIGH);

  delay(1);         

  digitalWrite(9, LOW);

  delay(1);         

}



pin8 是方向控制,pin9是脉冲控制,内容解释可以看原文,这里不翻译了。
除了这里
Well, with the STEP signal 1ms high and 1ms low, each complete pulse will take 2ms of time. Since there are 1000ms in 1 second, then 1000/2 = 500 microsteps/second.

脉冲信号是 1ms 高电平 1ms 低电平,所以一个完整的脉冲是 2ms。1秒 等于 1000ms,所以 1秒 / 2ms = 500 次脉冲 / 秒。

这样第一例子就完成了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

 楼主| 发表于 2014-2-28 13:24:56 | 显示全部楼层
后面例子都不需要更换电路图

第三个例子使用了一个库,需要另外安装(非常简单,下载AccelStepper库,然后放到 arduino安装目录\Arduino\libraries 下就可以了)

只有安装了上面的库,才可以运行例子3
[pre lang="arduino" line="1" file="example3"]#include <AccelStepper.h>


// Define a stepper and the pins it will use

AccelStepper stepper(1, 9, 8);


int pos = 3600;


void setup()

{  

  stepper.setMaxSpeed(3000);

  stepper.setAcceleration(1000);

}


void loop()

{

  if (stepper.distanceToGo() == 0)

  {

    delay(500);

    pos = -pos;

    stepper.moveTo(pos);

  }

  stepper.run();

}[/code]

上面的代码暂时不打算仔细研究,
如果要深入理解的话,可以到 http://www.airspayce.com/mikem/arduino/AccelStepper/index.html
上看例子。

****************************
在使用时,发现如果电机不固定,根据牛顿作用力反作用力定理,转到效果不佳。
另外查到使用电机步距角是 3.75度,转一圈96步,所以转的圈数比描述的多一倍(例子使用1.8 度)。

因为自己焊接水平不到家,所以使用时出现由于 easydriver 焊接不好而产生的故障,多准备几个互相校准还是有用的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2014-2-28 11:26:34 | 显示全部楼层
例子1的测试效果并不是很好,可能与我使用的步进电机有关,我是淘宝上买的12元一只的,个头比单片机配套的那种大很多。最大的问题是发热。

例子2
[pre lang="arduino" line="1" file="example2"]int Distance = 0;  // Record the number of steps we've taken

void setup() {               

  pinMode(8, OUTPUT);     

  pinMode(9, OUTPUT);

  digitalWrite(8, LOW);

  digitalWrite(9, LOW);

}


void loop() {

  digitalWrite(9, HIGH);

  delayMicroseconds(100);         

  digitalWrite(9, LOW);

  delayMicroseconds(100);

  Distance = Distance + 1;   // record this step

  // Check to see if we are at the end of our move

  if (Distance == 3600)

  {

    // We are! Reverse direction (invert DIR signal)

    if (digitalRead(8) == LOW)

    {

      digitalWrite(8, HIGH);

    }

    else

    {

      digitalWrite(8, LOW);

    }

    // Reset our distance back to zero since we're

    // starting a new move

    Distance = 0;
    // Now pause for half a second
    delay(500);
  }
}[/code]

代码清晰简洁,没有算法和绕弯,就像看说明书一样。
这段代码的执行效果比较好,正转一下(3600个脉冲)然后反转。
问题也是,半分钟easydriver就有些烫了,感觉不能适应功率稍微大一些的电机。下一个笔记试试TB6560。

*******************************
找到问题:easydriver 发烫
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-28 14:17:27 | 显示全部楼层
oldbeginner 发表于 2014-2-28 13:24
后面例子都不需要更换电路图

第三个例子使用了一个库,需要另外安装(非常简单,下载AccelStepper库,然 ...

第四个例子需要两个电动机,如下示意图,其实一个电机也可以,只不过把pin8 移到 pin6 ,pin9 移到 pin7 ;就可以作出,更简单。
例子4和例子3 都需要 AccelStepper 库。


[pre lang="arduino" line="1" file="example4"]

#include <AccelStepper.h>


// Define two steppers and the pins they will use

AccelStepper stepper1(1, 9, 8);

AccelStepper stepper2(1, 7, 6);


int pos1 = 3600;

int pos2 = 5678;


void setup()

{  

  stepper1.setMaxSpeed(3000);

  stepper1.setAcceleration(1000);

  stepper2.setMaxSpeed(2000);

  stepper2.setAcceleration(800);

}


void loop()

{

  if (stepper1.distanceToGo() == 0)

  {

        pos1 = -pos1;

    stepper1.moveTo(pos1);

  }

  if (stepper2.distanceToGo() == 0)

  {

    pos2 = -pos2;

    stepper2.moveTo(pos2);

  }

  stepper1.run();

  stepper2.run();

}

[/code]
懒得解释。

*************************
这样,基础的几个例子就看完了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2014-2-28 14:34:23 | 显示全部楼层
本帖最后由 マイナス37度 于 2014-2-28 14:51 编辑

能留个联系方式么,我也刚学步进电机,给你来段tb6560的视频,烫的化电流调小点
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-28 14:47:14 | 显示全部楼层
マイナス37度 发表于 2014-2-28 14:34
能留个联系方式么,我也刚学步进电机,给你来段tb6560的视频,烫的化电流调小点

我也刚学习,我基本不上qq(只注册用),如果交流的话,就在帖子里效果比较好。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-28 14:52:06 | 显示全部楼层
本帖最后由 oldbeginner 于 2014-2-28 14:53 编辑
oldbeginner 发表于 2014-2-28 14:17
第四个例子需要两个电动机,如下示意图,其实一个电机也可以,只不过把pin8 移到 pin6 ,pin9 移到 pin7  ...


如果刚买了easydriver,焊接后测试是否能用,推荐

http://www.tinyos.net.cn/?article-38.html
EasyDriver 步进电机驱动板测试笔记



测试效果:

转360度,
暂停1秒,
反转360度,
暂停1秒,

转1600个脉冲,速度5
暂停1秒
反转1600个脉冲,速度25
暂停1秒

反复。

[pre lang="arduino" line="1" file="easydriver_test"]#define DIR_PIN 2
#define STEP_PIN 3

void setup() {
  pinMode(DIR_PIN, OUTPUT);
  pinMode(STEP_PIN, OUTPUT);
}

void loop(){

  //rotate a specific number of degrees
  rotateDeg(360, 1);
  delay(1000);

  rotateDeg(-360, .1);  //reverse
  delay(1000);

  //rotate a specific number of microsteps (8 microsteps per step)
  //a 200 step stepper would take 1600 micro steps for one full revolution
  rotate(1600, .5);
  delay(1000);

  rotate(-1600, .25); //reverse
  delay(1000);
}

void rotate(int steps, float speed){
  //rotate a specific number of microsteps (8 microsteps per step) - (negitive for reverse movement)
  //speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
  int dir = (steps > 0)? HIGHOW;
  steps = abs(steps);

  digitalWrite(DIR_PIN,dir);

  float usDelay = (1/speed) * 70;

  for(int i=0; i < steps; i++){
    digitalWrite(STEP_PIN, HIGH);
    delayMicroseconds(usDelay);

    digitalWrite(STEP_PIN, LOW);
    delayMicroseconds(usDelay);
  }
}

void rotateDeg(float deg, float speed){
  //rotate a specific number of degrees (negitive for reverse movement)
  //speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
  int dir = (deg > 0)? HIGHOW;
  digitalWrite(DIR_PIN,dir);

  int steps = abs(deg)*(1/0.225);
  float usDelay = (1/speed) * 70;

  for(int i=0; i < steps; i++){
    digitalWrite(STEP_PIN, HIGH);
    delayMicroseconds(usDelay);

    digitalWrite(STEP_PIN, LOW);
    delayMicroseconds(usDelay);
  }
}[/code]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2014-2-28 15:08:42 | 显示全部楼层
这句能解释下么
23.void loop()
24.
25.{
26.
27.  if (stepper.distanceToGo() == 0)
28.
29.  {
30.
31.    delay(500);
32.
33.    pos = -pos;
34.
35.    stepper.moveTo(pos);
36.
37.  }
38.
39.  stepper.run();
40.
41.}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-28 15:21:54 | 显示全部楼层
マイナス37度 发表于 2014-2-28 15:08
这句能解释下么
23.void loop()
24.

你学得好仔细,我的重点是安装激光雕刻机,所以细节可能会省略,尤其非标准库函数。

你问的应该是
AccelStepper Class。

我目前用不到,所以暂时省略了细节,你如果感兴趣,可以看
http://www.airspayce.com/mikem/arduino/AccelStepper/classAccelStepper.html
AccelStepper Class Reference

虽然不打算仔细研究AccelStepper Class,但是从函数名字上也能看出大概意思,应该好理解的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-28 15:38:03 | 显示全部楼层
easydriver 常见问题 (http://schmalzhaus.com/EasyDriver/)
只把问题列出来,如果有类似的,则用上面的链接打开再看。

Q1) My motor says it can only take 2.1V at 2A. Will the EasyDriver (running from up to 30V) blow up my motor or damage it in any way?

Q2) So shouldn't I run the power to the EasyDriver at the voltage that my motor is rated for? (i.e. 2.1V as per the above example)

Q3) How much current does my power supply need to produce?

Q4) So why does my bench power supply show 12V at 400mA when I know my motor should be drawing 750mA/phase (1.5A total)? Huh smarty pants?

Q5) How do I adjust the current limit?

Q5.1) What kind of stepper motors can I use EasyDriver with?

Q6) Why does EasyDriver get so hot?

Q7) What hardware/software can I use to test my EasyDriver?

Q8) How do I connect my EasyDriver up?

Q9) My Easy Driver's labels don't match what I see in the picture. Why not? And how do I know which way to turn the current adjustment pot?

Q10) Man, this is a lot of work to just use the A3967 chip. Can't I just solder down a bunch of A3967s on my own board design and save a ton of money?

Q11) The datasheet for the driver chip shows that the motor connects to pins OUT1A, OUT1B, OUT2A and OUT2B, and the diagram in the datasheet has one coil connected across OUT1A and OUT1B, and the other across OUT2A and OUT2B.  But the Easy Driver only has A, A, B, B for motor connections, and it looks like one coil should be connected across the two A pins and the other across the two B pins. What's up with that?

Q12) So what's the deal with microsteps? How do I set what number of microsteps are used?

Q13) Help! I think my Easy Driver is not working like it should. How can I know if it's become damaged?

Q14) But Brian, can't you give us some real world numbers for power consumption and heat and stuff like that?

Q15) So I see that the EasyDriver has a pin labeled 5V. What is it for?
回复 支持 反对

使用道具 举报

发表于 2014-2-28 16:18:42 | 显示全部楼层
很不错的帖子,我也是被那个激光的雕刻机拉下水的,机器没做成,但是认识了arduino。哈哈

其实那个机器不做也罢,知道原理就行了。那个机器的精度真的是在是低的不能再。。。或者说是没有精度可言比较确切。

easydriver挺好,就是发热大了点。其实我们可以把easydriver看做是一个硬件的头文件,它有几个函数,我们只要调用函数就能比较精准的驱动步进电机了。 其实那种微型的步进电机完全可以用arduino直接驱动,但是需要占用4个口,并且需要更多的cpu资源。因为我们要不停的让那4个口high,low的来回调换。而且在程序中可能会有其他因素干扰,比如一些判断语句,会占用额外的cpu资源,可能驱动步进电机的方波就会有一些变形。这样以来电机的旋转就不是那么精准了。而easyd就不用考虑这些问题了,只要函数调用电机旋转(速度,时间,方向),其他的就不用我们操心了。

如果要驱动更大的电机,easyd就不行了,我感觉那个发热能把他自己烧死。 当然那个big easydriver也不行,太贵了要150¥而且也没见有几家卖的。 大电机直接用步进电机的驱动器就好了,原理、使用方法和easyd是完全一样的,只是那硕大的身躯和ardu的尺寸,有种猴骑骆驼的感觉。便宜的驱动器才50¥就够了。

前面这些东西都不是问题,都很容易掌握,最有技术含量的是,如何控制电机的加速和减速。让电机高速旋转只要一条指令就行了,但是电机所驱动的设备未必能承受的住这个启动过程。所以要有个加速的过程,才能平稳的运行。对于cnc的控制这点非常重要,如果是xy2个轴的运行就更复杂了,因为加速度不同,位置变化不同,运行轨迹都有变化。这些计算还是挺复杂的。很多cnc都有个硬件的“运动控制卡”来处理这些计算。一些工业级的运动控制卡起步就要4,5k,上万的也很正常。不过他们和软件一样都是计算,没什么特殊的地方,无非是速度快,运行稳定而已。

步进电机我也就只了解这些了,具体咋做我也迷迷糊糊的,随便聊一聊和大家分享一下而已。有兴趣的朋友可以仔细研究。
回复 支持 反对

使用道具 举报

发表于 2014-2-28 18:27:38 | 显示全部楼层
easydriver核心就是a3967,单一个模块可玩性也很高,很多可精简或定制的地方。在试如果不选用grbl,是不是能跟方便省事的cncusbcontroller结合一下。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-28 22:02:28 | 显示全部楼层
shihaipeng04 发表于 2014-2-28 16:18
很不错的帖子,我也是被那个激光的雕刻机拉下水的,机器没做成,但是认识了arduino。哈哈

其实那个机器 ...

很不错的信息,谢谢。
我刚起步,打算先完成入门
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-28 22:04:25 | 显示全部楼层
Micky 发表于 2014-2-28 18:27
easydriver核心就是a3967,单一个模块可玩性也很高,很多可精简或定制的地方。在试如果不选用grbl,是不是能 ...

我已经买了usb cnc,感觉相对新手比较复杂,不适合步进电机控制入门。我打算理解激光雕刻机后,再来理解usb cnc 和 mach3。
回复 支持 反对

使用道具 举报

发表于 2014-2-28 23:39:59 | 显示全部楼层
oldbeginner 发表于 2014-2-28 22:04
我已经买了usb cnc,感觉相对新手比较复杂,不适合步进电机控制入门。我打算理解激光雕刻机后,再来理解u ...


大同小异,cnc就是多个z轴,其他和激光机没什么区别。激光的z轴是2值化的,开关。 cnc的z轴是灰度的,有深度不同而已。哈哈
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-23 15:35 , Processed in 0.056201 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表