极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 16727|回复: 0

freeLabs--自由实验室-TB6612FNG驱动28BYJ-48步进电机

[复制链接]
发表于 2016-2-24 13:19:32 | 显示全部楼层 |阅读模式
本帖最后由 freeLabs 于 2016-2-25 20:08 编辑

简介
如果你想接近免费使用下面介绍的这款驱动芯片的话,可以关注我另外一片帖子--[url=freeLabs--自由实验室-只需押金,就能享受硬件和指导服务 freeLabs--自由实验室-只需押金,就能享受硬件和指导服务
如果你有兴趣的话,请不要觉得有什么,请放心联系我

未完待续
文章状态:未完成,欢迎讨论你在学习中遇到的问题

我们可能使用其他的驱动芯片驱动步进电机的情况比较多,经常看到的是使用ULN2003,还有一些专用的步进电机驱动芯片,这里我使用TB6612FNG来驱动的话,是因为自己手头上刚好有这款芯片,所以就拿着试了一下,发现是可以的,因为步进电机大都是脉冲控制工作方式的。


下面上面是TB6612FNG直流电机的驱动芯片但是这里用作一个步进电机驱动

这个驱动芯片的特点就是使电流可以达到平均电流1.2A,最大电流能够达到3A。所以用来驱动这款步进电机老化电流是足够的。
需要使用到的硬件和接线
1. arduino promini控制板,这款主板是Arduino系列最基本的一块控制板!如果你手头上还有其他的控制板的话,是完全可以的跑下面的代码的。
2. Tb6612FNG 驱动板,或者其他双H桥直流驱动芯片;
3. 若干的杜邦线;母头对母头,具体具体要看你手头上的,一个硬件端子接口的要求,
4.外接的电源,这里我选用的是5V开关电源,因为这款步进电机要求的电压就是5V;
5. 28BYJ-48 步进电机,这是一款非常基础的步进电机,体积很小,扭矩很小,淘宝上这款步进电机卖的比较便宜也非常热销,

这里接线有点乱了,因为这事跟我当时在测试的时候拍下来图片,所以只能将就着先看一下后面我会用fritzing画出来详细的接线图,不过现在你可以在下面arduino源代码注释里面可以找到一些接线的细节;
  1. /*
  2. *  Arduino Pin                TB6612FNG
  3. *       3                                   PWMA
  4. *       7                                   AIN1
  5. *       8                                   AIN2
  6. *       5                                   PWMB
  7. *       10                                 BIN1
  8. *       11                                 BIN2
  9. *       4                                   STBY
  10. */
复制代码
另外和驱动板的接线方式,用步进电机高温线红色的线接五伏电源,因为有四根线是橙色,黄色,粉色,蓝色,分别接Tb6612FNG的输出口 AO1,AO2, BO1,BO2

  1. 步进电机线       TB6612FNG
  2. 橙                     AO1
  3. 黄                     AO2
  4. 粉                     BO1
  5. 蓝                     BO2
复制代码


arduino 程序
下面的代码,我是自己写了一个C#的上位机来调试玩的,接受一个从C#那里传过来的指令,然后让步进电机转一下,当然如果你不想这样子做的话,没关系,也完全可以自己修改一下下面的代码。


  1. /* arduino csharp communication demo
  2. *  the sketch received the easy commands from the csharp application
  3. *  it obedients the GNU General Public License v2.0 or later
  4. *  2016/02/21 writed by wayen in LongGang ShenZhen
  5. */
  6. int PWMA = 3;
  7. int AIN1 = 7;
  8. int AIN2 = 8;

  9. int PWMB = 5;
  10. int BIN1 = 10;
  11. int BIN2 = 11;

  12. int STBY = 4;

  13. int pinLed = 13;
  14. void setup() {
  15.   // put your setup code here, to run once:
  16.   pinMode(PWMA, OUTPUT);
  17.   pinMode(PWMB, OUTPUT);
  18.   pinMode(AIN1, OUTPUT);
  19.   pinMode(AIN2, OUTPUT);
  20.   pinMode(BIN1, OUTPUT);
  21.   pinMode(BIN2, OUTPUT);
  22.   pinMode(STBY, OUTPUT);
  23.   Serial.begin(9600);
  24. }

  25. void loop() {
  26.   // put your main code here, to run repeatedly:
  27.   char readChar;
  28.   while (Serial.available() > 0) //read the betys from the serial buffer
  29.   {
  30.     readChar = Serial.read();
  31.     if (readChar == 'Y' || readChar == 'y') // always light the led onboard
  32.     {
  33.       digitalWrite(pinLed, HIGH);
  34.       for (int i = 0; i < 48; i++)
  35.       {
  36.         driveStepper();
  37.       }
  38.       Serial.println("read Y");
  39.     }
  40.     else if (readChar == 'S' || readChar == 's')// blink the led onborad
  41.     {
  42.       digitalWrite(pinLed, LOW);
  43.       delay(100);
  44.       digitalWrite(pinLed, HIGH);
  45.       delay(100);
  46.       digitalWrite(pinLed, LOW);
  47.       delay(100);
  48.       digitalWrite(pinLed, HIGH);
  49.       delay(100);
  50.       digitalWrite(pinLed, LOW);
  51.       Serial.println("read s");
  52.       stopStepper();
  53.     }
  54.     Serial.println(readChar);
  55.     delay(100);
  56.   }
  57. }

  58. void stopStepper()
  59. {
  60.   digitalWrite(STBY, LOW);
  61. }

  62. void stepStepper()
  63. {
  64.   digitalWrite(STBY, HIGH);
  65.   for (int i = 0; i < 4; i++)
  66.   {
  67.     delay(10);
  68.     if (i == 0)
  69.     {
  70.       digitalWrite(AIN1, HIGH);
  71.       digitalWrite(AIN2, LOW);
  72.       digitalWrite(BIN1, LOW);
  73.       digitalWrite(BIN2, LOW);
  74.     }
  75.     else if (i == 1)
  76.     {
  77.       digitalWrite(AIN1, LOW);
  78.       digitalWrite(AIN2, HIGH);
  79.       digitalWrite(BIN1, LOW);
  80.       digitalWrite(BIN2, LOW);
  81.     }
  82.     else if (i == 2)
  83.     {
  84.       digitalWrite(AIN1, LOW);
  85.       digitalWrite(AIN2, LOW);
  86.       digitalWrite(BIN1, HIGH);
  87.       digitalWrite(BIN2, LOW);
  88.     }
  89.     else if (i == 3)
  90.     {
  91.       digitalWrite(AIN1, LOW);
  92.       digitalWrite(AIN2, LOW);
  93.       digitalWrite(BIN1, LOW);
  94.       digitalWrite(BIN2, HIGH);
  95.     }
  96.   }
  97. }

  98. void driveStepper()
  99. {
  100.   analogWrite(PWMA, 255);
  101.   analogWrite(PWMB, 255);
  102.   stepStepper();
  103. }

复制代码


下面是C#的源代码,代码里面有一些注释,晚点我再补上详细的解释,这个代码包括一些控件的使用,其中主要还是SerialPort这个控件的使用,因为只要掌握了这个控件,就能很轻松的写一些C#的上位机和Arduino通信了。也挺好玩的。


[pre lang="Csharp" line="1"]//reference url:http://www.68idc.cn/help/buildlang/ask/20150507335891.html http://www.360doc.com/content/13/0829/09/7531335_310657574.shtml
// use the
// const baudrate 9600 databits 8 parity none stopbit 1
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;

namespace cs_SerialPortCommunication
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        //设置两个全局变量
        SerialPort sp1 = new SerialPort();
        bool flag = true;

        //窗体加载的时候执行下面的语句
        private void Form1_Load(object sender, EventArgs e)
        {
            //检查是否含有串口
            string[] str = System.IO.Ports.SerialPort.GetPortNames(); ;
            if (str == null) { MessageBox.Show("本机没有串口!", "Error"); return; }
            //添加串口项目
            foreach (string s in System.IO.Ports.SerialPort.GetPortNames())
            {
                //获取有多少个COM口
                cbSerial.Items.Add(s);
            }
            //串口设置默认选择项
            cbSerial.SelectedIndex = 0; //设置cbSerial的默认选项

            Control.CheckForIllegalCrossThreadCalls = false;
            sp1.DataReceived += new SerialDataReceivedEventHandler(sp1_DataReceived);

        }

        // 串口数据接受,并且显示在textbox上面
        void sp1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            if (sp1.IsOpen)
            {
                byte[] byteRead = new byte[sp1.BytesToRead];
                textBox1.Text = sp1.ReadLine();
                sp1.DiscardInBuffer();
            }
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void btn_Click(object sender, EventArgs e)
        {
            if (!sp1.IsOpen)
            {
                MessageBox.Show("请先打开串口", "Error");
                return;
            }
            string strSendOpen = "y";
            string strSendClose = "s";
            //MessageBox.Show("flag = " + flag);
            if (flag == true)
            {
                sp1.WriteLine(strSendOpen);
                flag = false;
            }
            else
            {
                sp1.WriteLine(strSendClose);
                flag = true;
            }
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void button2_Click(object sender, EventArgs e)
        {
            
            if (!sp1.IsOpen)
            {
                try
                {
                    string serialName = cbSerial.SelectedItem.ToString();
                    sp1.PortName = serialName;
                    string strBaudRate = "9600"; // 使用固定的9600波特率传输
                    string strDataBit = "8"; //使用8位传输
                    Int32 iBaudRate = Convert.ToInt32(strBaudRate);
                    Int32 iDataBits = Convert.ToInt32(strDataBit);

                    sp1.BaudRate = iBaudRate;
                    sp1.DataBits = iDataBits;
                    sp1.StopBits = StopBits.One;
                    sp1.Parity = Parity.None;

                    if (sp1.IsOpen == true)
                    {
                        sp1.Close();
                    }
                    sp1.Open();
                    button2.Text = "关闭串口";
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show("有错误产生: " + ex.Message, "Error");
                    return;
                }
            }
            else {
                sp1.Close();
                button2.Text = "打开串口";
            }

        }

        private void label3_Click(object sender, EventArgs e)
        {

        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }
    }
}
[/code]

[size]这次试验效果演示的gif动态图


因为这里有以前驱动直流电机的gif动态图


还有一个有趣的应用就是那这个驱动芯片来驱动四颗LED灯。

当然上面只是C#上位机这个工程里面的控制代码,还有一些其他的内容放在最后的帖子后面的附件里

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 20:28 , Processed in 0.043139 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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