freeLabs 发表于 2016-2-24 13:19:32

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

本帖最后由 freeLabs 于 2016-2-25 20:08 编辑

简介
如果你想接近免费使用下面介绍的这款驱动芯片的话,可以关注我另外一片帖子--freeLabs--自由实验室-只需押金,就能享受硬件和指导服务
如果你有兴趣的话,请不要觉得有什么,请放心联系我
未完待续
文章状态:未完成,欢迎讨论你在学习中遇到的问题

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


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

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

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


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


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

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

int STBY = 4;

int pinLed = 13;
void setup() {
// put your setup code here, to run once:
pinMode(PWMA, OUTPUT);
pinMode(PWMB, OUTPUT);
pinMode(AIN1, OUTPUT);
pinMode(AIN2, OUTPUT);
pinMode(BIN1, OUTPUT);
pinMode(BIN2, OUTPUT);
pinMode(STBY, OUTPUT);
Serial.begin(9600);
}

void loop() {
// put your main code here, to run repeatedly:
char readChar;
while (Serial.available() > 0) //read the betys from the serial buffer
{
    readChar = Serial.read();
    if (readChar == 'Y' || readChar == 'y') // always light the led onboard
    {
      digitalWrite(pinLed, HIGH);
      for (int i = 0; i < 48; i++)
      {
      driveStepper();
      }
      Serial.println("read Y");
    }
    else if (readChar == 'S' || readChar == 's')// blink the led onborad
    {
      digitalWrite(pinLed, LOW);
      delay(100);
      digitalWrite(pinLed, HIGH);
      delay(100);
      digitalWrite(pinLed, LOW);
      delay(100);
      digitalWrite(pinLed, HIGH);
      delay(100);
      digitalWrite(pinLed, LOW);
      Serial.println("read s");
      stopStepper();
    }
    Serial.println(readChar);
    delay(100);
}
}

void stopStepper()
{
digitalWrite(STBY, LOW);
}

void stepStepper()
{
digitalWrite(STBY, HIGH);
for (int i = 0; i < 4; i++)
{
    delay(10);
    if (i == 0)
    {
      digitalWrite(AIN1, HIGH);
      digitalWrite(AIN2, LOW);
      digitalWrite(BIN1, LOW);
      digitalWrite(BIN2, LOW);
    }
    else if (i == 1)
    {
      digitalWrite(AIN1, LOW);
      digitalWrite(AIN2, HIGH);
      digitalWrite(BIN1, LOW);
      digitalWrite(BIN2, LOW);
    }
    else if (i == 2)
    {
      digitalWrite(AIN1, LOW);
      digitalWrite(AIN2, LOW);
      digitalWrite(BIN1, HIGH);
      digitalWrite(BIN2, LOW);
    }
    else if (i == 3)
    {
      digitalWrite(AIN1, LOW);
      digitalWrite(AIN2, LOW);
      digitalWrite(BIN1, LOW);
      digitalWrite(BIN2, HIGH);
    }
}
}

void driveStepper()
{
analogWrite(PWMA, 255);
analogWrite(PWMB, 255);
stepStepper();
}



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


//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;
                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)
      {

      }
    }
}


这次试验效果演示的gif动态图
http://7xr7ko.com1.z0.glb.clouddn.com/28BYJ-48%E6%AD%A5%E8%BF%9B%E7%94%B5%E6%9C%BA.gif

因为这里有以前驱动直流电机的gif动态图
http://7xr7ko.com1.z0.glb.clouddn.com/TB6612FNG%E9%A9%B1%E5%8A%A8%E7%9B%B4%E6%B5%81%E7%94%B5%E6%9C%BA.gif

还有一个有趣的应用就是那这个驱动芯片来驱动四颗LED灯。
http://7xr7ko.com1.z0.glb.clouddn.com/TB6612FNG%E7%82%B9%E4%BA%AE%E4%B8%A4%E7%BB%84LED%E7%81%AF%E4%BA%A4%E6%9B%BF.gif
当然上面只是C#上位机这个工程里面的控制代码,还有一些其他的内容放在最后的帖子后面的附件里
页: [1]
查看完整版本: freeLabs--自由实验室-TB6612FNG驱动28BYJ-48步进电机