找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 17117|回复: 4
打印 上一主题 下一主题
收起左侧

Arduino机械学习笔记1(从Easydriver开始)

[复制链接]
跳转到指定楼层
楼主
***********************
从淘宝上买了光驱式激光雕刻机DIY,目前还没有能力装上。相比安装要求,配套教程确实不够详细。虽然不需要知道原理,只知道步骤也可以完成雕刻机安装,但是步骤不清楚,另外自己对arduino和easydriver也不是很熟悉,所以难上加难。

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

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

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

机械坊已经有两个例子,
*******
http://www.51hei.com/bbs/dpj-47861-1.html
微型CNC制作基于开源项目GRBL

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

*******
http://www.51hei.com/bbs/dpj-47860-1.html
arduino当Gcode解释程序(CNC)

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

直接找到easydriver的老家,
http://schmalzhaus.com/EasyDrive ... DriverExamples.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 次脉冲 / 秒。

这样第一例子就完成了。

例子1的测试效果并不是很好,可能与我使用的步进电机有关,我是淘宝上买的12元一只的,个头比单片机配套的那种大很多。最大的问题是发热。

例子2
  1.     int Distance = 0;  // Record the number of steps we've taken
  2.      
  3.     void setup() {               
  4.      
  5.       pinMode(8, OUTPUT);     
  6.      
  7.       pinMode(9, OUTPUT);
  8.      
  9.       digitalWrite(8, LOW);
  10.      
  11.       digitalWrite(9, LOW);
  12.      
  13.     }
  14.      
  15.      
  16.     void loop() {
  17.      
  18.       digitalWrite(9, HIGH);
  19.      
  20.       delayMicroseconds(100);         
  21.      
  22.       digitalWrite(9, LOW);
  23.      
  24.       delayMicroseconds(100);
  25.      
  26.       Distance = Distance + 1;   // record this step
  27.      
  28.       // Check to see if we are at the end of our move
  29.      
  30.       if (Distance == 3600)
  31.      
  32.       {
  33.      
  34.         // We are! Reverse direction (invert DIR signal)
  35.      
  36.         if (digitalRead(8) == LOW)
  37.      
  38.         {
  39.      
  40.           digitalWrite(8, HIGH);
  41.      
  42.         }
  43.      
  44.         else
  45.      
  46.         {
  47.      
  48.           digitalWrite(8, LOW);
  49.      
  50.         }
  51.      
  52.         // Reset our distance back to zero since we're
  53.      
  54.         // starting a new move
  55.      
  56.         Distance = 0;
  57.         // Now pause for half a second
  58.         delay(500);
  59.       }
  60.     }
复制代码


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

*******************************
找到问题:easydriver 发烫

后面例子都不需要更换电路图

第三个例子使用了一个库,需要另外安装(非常简单,下载AccelStepper库,然后放到 arduino安装目录Arduinolibraries 下就可以了
AccelStepper-1.39.zip (73.9 KB, 下载次数: 23)

只有安装了上面的库,才可以运行例子3
  1.     #include
  2.      
  3.      
  4.     // Define a stepper and the pins it will use
  5.      
  6.     AccelStepper stepper(1, 9, 8);
  7.      
  8.      
  9.     int pos = 3600;
  10.      
  11.      
  12.     void setup()
  13.      
  14.     {  
  15.      
  16.       stepper.setMaxSpeed(3000);
  17.      
  18.       stepper.setAcceleration(1000);
  19.      
  20.     }
  21.      
  22.      
  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.     }
复制代码


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

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

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

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



  1.     #include
  2.      
  3.      
  4.     // Define two steppers and the pins they will use
  5.      
  6.     AccelStepper stepper1(1, 9, 8);
  7.      
  8.     AccelStepper stepper2(1, 7, 6);
  9.      
  10.      
  11.     int pos1 = 3600;
  12.      
  13.     int pos2 = 5678;
  14.      
  15.      
  16.     void setup()
  17.      
  18.     {  
  19.      
  20.       stepper1.setMaxSpeed(3000);
  21.      
  22.       stepper1.setAcceleration(1000);
  23.      
  24.       stepper2.setMaxSpeed(2000);
  25.      
  26.       stepper2.setAcceleration(800);
  27.      
  28.     }
  29.      
  30.      
  31.     void loop()
  32.      
  33.     {
  34.      
  35.       if (stepper1.distanceToGo() == 0)
  36.      
  37.       {
  38.      
  39.             pos1 = -pos1;
  40.      
  41.         stepper1.moveTo(pos1);
  42.      
  43.       }
  44.      
  45.       if (stepper2.distanceToGo() == 0)
  46.      
  47.       {
  48.      
  49.         pos2 = -pos2;
  50.      
  51.         stepper2.moveTo(pos2);
  52.      
  53.       }
  54.      
  55.       stepper1.run();
  56.      
  57.       stepper2.run();
  58.      
  59.     }
复制代码

懒得解释。

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



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

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



测试效果:

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

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

反复。
  1.     #define DIR_PIN 2
  2.     #define STEP_PIN 3
  3.      
  4.     void setup() {
  5.       pinMode(DIR_PIN, OUTPUT);
  6.       pinMode(STEP_PIN, OUTPUT);
  7.     }
  8.      
  9.     void loop(){
  10.      
  11.       //rotate a specific number of degrees
  12.       rotateDeg(360, 1);
  13.       delay(1000);
  14.      
  15.       rotateDeg(-360, .1);  //reverse
  16.       delay(1000);
  17.      
  18.       //rotate a specific number of microsteps (8 microsteps per step)
  19.       //a 200 step stepper would take 1600 micro steps for one full revolution
  20.       rotate(1600, .5);
  21.       delay(1000);
  22.      
  23.       rotate(-1600, .25); //reverse
  24.       delay(1000);
  25.     }
  26.      
  27.     void rotate(int steps, float speed){
  28.       //rotate a specific number of microsteps (8 microsteps per step) - (negitive for reverse movement)
  29.       //speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
  30.       int dir = (steps > 0)? HIGH:LOW;
  31.       steps = abs(steps);
  32.      
  33.       digitalWrite(DIR_PIN,dir);
  34.      
  35.       float usDelay = (1/speed) * 70;
  36.      
  37.       for(int i=0; i < steps; i++){
  38.         digitalWrite(STEP_PIN, HIGH);
  39.         delayMicroseconds(usDelay);
  40.      
  41.         digitalWrite(STEP_PIN, LOW);
  42.         delayMicroseconds(usDelay);
  43.       }
  44.     }
  45.      
  46.     void rotateDeg(float deg, float speed){
  47.       //rotate a specific number of degrees (negitive for reverse movement)
  48.       //speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
  49.       int dir = (deg > 0)? HIGH:LOW;
  50.       digitalWrite(DIR_PIN,dir);
  51.      
  52.       int steps = abs(deg)*(1/0.225);
  53.       float usDelay = (1/speed) * 70;
  54.      
  55.       for(int i=0; i < steps; i++){
  56.         digitalWrite(STEP_PIN, HIGH);
  57.         delayMicroseconds(usDelay);
  58.      
  59.         digitalWrite(STEP_PIN, LOW);
  60.         delayMicroseconds(usDelay);
  61.       }
  62.     }
复制代码

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?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:98618 发表于 2016-4-9 23:03 | 只看该作者
很不错的帖子,我也是被那个激光的雕刻机拉下水的,机器没做成,但是认识了arduino。哈哈

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

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

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

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

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

使用道具 举报

板凳
ID:156302 发表于 2017-9-27 23:21 | 只看该作者
好好研究下,谢谢分享
回复

使用道具 举报

地板
ID:237069 发表于 2017-10-4 17:47 | 只看该作者
新人加入,等级够了再来下载学习
回复

使用道具 举报

5#
ID:282047 发表于 2018-2-3 22:14 | 只看该作者
为什么我接线正确,电机不转啊,电机卡住了,而且是一开始可以转,然后过一会就不能转了。
另外我用两节一样的9V电池供电,一个可以,一个不可以。
回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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