失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > arduino uno + tb6600 + 42步进电机 自制自动绕线机

arduino uno + tb6600 + 42步进电机 自制自动绕线机

时间:2019-01-23 06:29:31

相关推荐

arduino uno + tb6600 + 42步进电机 自制自动绕线机

自动绕线机 V1.0

记录分享一下,后续有需要会迭代新版本。

目录

自动绕线机 V1.0

1. 各组件介绍:

1.1 arduino uno :最简洁的控制板。

1.2 tb6600:步进电机控制模块

1.3 42步进电机:

1.4 键盘显示模块板(自制)

1.4.1 原理图与PCB

1.4.2 画好的板子3d预览

1.5 光耦检测器

1.6 机械结构

2. 各个模块接线说明

2.1 tb6600 与 arduino 接线说明

2.2 arduino 与 键盘液晶接口板 的接线与功能说明

2.2.1 具体功能设计:

2.2.2 操作顺序:

3. 代码

4. TODO: 准备添加的功能

4.1 没有设定线圈匝数的功能

4.2 显示屏要更换

1. 各组件介绍:

1.1 arduino uno :最简洁的控制板。

1.2 tb6600:步进电机控制模块

可以很方便的调节脉冲细分和电流大小。

我在这家买的,不知道为啥比别人家便宜很多。

/item.htm?spm=a230r.1.14.25.19fd7d2bHMFpJJ&id=561803347369&ns=1&abbucket=0#detail

1.3 42步进电机:

四线两相电机,也是这家买的,属实便宜,还送线。

/item.htm?spm=a230r.1.14.30.67611f23ZZ8EDW&id=561578136188&ns=1&abbucket=20#detail

1.4 键盘显示模块板(自制)

这块板子是我自己画的,可以根据自己的需要自己调整。

1.4.1 原理图与PCB

这里我使用了立创eda来进行画板子。怎么画板子bilibili有教程,我就不细说了。

放个教程链接:

立创EDA快速入门_哔哩哔哩_bilibili

在立创商城里根据自己需要选好元器件,放置好,这里我画的比较丑,不过也无所谓了。

这里主要就一个液晶1602,按照管脚功能连好就完事了。

自动生成pcb,调整一下元件位置,布好线后,预览一下。

1.4.2 画好的板子3d预览

生成gerber文件后就可以在嘉立创下单助手免费下单打样了,记住板子要画成10cm*10cm以内的,这样才能白嫖。

1.5 光耦检测器

因为我想要根据绕线端每绕一圈这边排线的一端就往前走个0.2mm之类的,好让排的线比较整齐,所以需要一个光耦检测器来进行输出一个信号。

这个换成霍尔传感器也可以。

1.6 机械结构

家里本来就有一台传送带的架子我拿过来用了,等我新电脑到了,我再重新画一个结构。

2. 各个模块接线说明

2.1 tb6600 与 arduino 接线说明

这里我采用共阴极接法。因为arduino 输出不超过5v,所以下图的电阻可以省略。只需要接pus+(脉冲),dir+(方向),还有公共地线 三根线到arduino。

电机接线就很简单:A+A-B+B-接到tb6600就好了。

两相四线(红蓝绿黑或者红绿黄蓝对应接A+A-B+B-) 相数是指电机内部的线圈组数,目前常用的有二相-五相步进电机。电机相数不同,其步距角也不同,一般二相电机的步距角为0.9°/1.8°。 然后四线就是说电机出线有四根线。

tips:

1. 注意tb6600模块的供电一定要12v-24v直流电源,不然即使控制器灯亮也不会工作。

2. 怎么判别步进电机是否是同一相:步进电机什么都不接,转动轴的话是很轻松的。随便拿两根线接在一起,转动轴费劲的话就是同一相。

3. tb6600 的细分要设置好,最好多些倍数(4倍8倍16倍都可,我程序里是设置的4倍细分,也就是频率需要乘以4),好让tone()函数能发送的频率高一些,需要注意tone()函数只能生成31hz以上的频率,当设置成31hz以下时,它生成的就不知道是多少hz了,时快时慢。

2.2 arduino 与 键盘液晶接口板 的接线与功能说明

1602液晶有几种接线方式,这里为了省端口,我将4个数据线的接法。剩余线的接法因为每个人需要的功能不同,接口板的设计也不一样。

这里我的板子主要有四个按键,两个b5k电位器,一个lcd1602

2.2.1 具体功能设计:

排线电机:这里控制的步进电机是排线电机,只负责控制线的横向位移,从而达到自动排线的目的。

绕线电机:另有一个电机在那边带着被绕的线圈不停转动。这个轴上放置一个纸片用于遮挡光耦检测器。(此电机可以使用普通的马达即可。需要外接开关控制是否转动,当时忘了考虑这一茬了,板子上就没有画。)

key1:设定往返绕线位置。

key2:步进电机右转微调

key3:步进电机左转微调

key4: 自动检测绕线是否进行开关,根据光耦检测器输出,绕线电机的轴上每转一圈,控制排线电机转动多少(需要根据与电机连接的螺纹杆的参数和线径自行计算,在程序中进行设置。也可以不看线径,直接用sw电位器自己调整)。

第一个电位器用于控制lcd1602液晶显示屏光栅,用于调整液晶显示效果,调整好以后可以换成固定电阻。

第二个电位器 sw 用于调整线径大小,是可以直接调整绕线电机转动一圈,排线电机转动多少的旋钮。

2.2.2 操作顺序:

首先转动sw电位器,调整好线径按下key4, 打开自动监测绕线运行打开绕线电机开关,调整好挡板位置,开始绕线等待第一次绕线,绕到合适的宽度时,按下key1按键,保存当前位置。然后排线电机就会反向转动到起始位置,再反向,循环往复。

3. 代码

具体程序如下

#include<LiquidCrystal.h>// 管脚定义const int sw = A1, rs = 3, rw = 4, en = 5;const int d4 = 10, d5 = 11, d6 = 12, d7 = 13;const int k1 = A5, k2 = A4, k3 = A3, k4 = A2, detect = A0;const int dir = 6, cp = 7, stepenb = 8;//tb6600 控制器,共阴极接法。LiquidCrystal lcd(rs, rw, en, d4, d5, d6, d7); //LiquidCrystal 对象名称(寄存器选择, 使能, 数据脚, 数据脚, 数据脚, 数据脚);unsigned int speedx = 500;unsigned int cpNum = 0;unsigned int cpSetNum = 9999;boolean lastHide = true;boolean autorun = false;boolean lastdir = false; //上一次的方向,默认falsevoid setup() {lcd.begin(16, 2);//设置LCD的行列数lcd.clear();lcd.print("hello, world!"); //在屏幕上打印hello, world!pinMode(sw, INPUT);pinMode(k1, INPUT);pinMode(k2, INPUT);pinMode(k3, INPUT);pinMode(k4, INPUT);pinMode(detect, INPUT);pinMode(dir, OUTPUT);pinMode(cp, OUTPUT);digitalWrite(dir, LOW);//默认顺时针}void keyScan() {boolean val;val = digitalRead(k1);if (val) {noTone(cp);lcd.clear();lcd.print("1 set position:");cpSetNum = cpNum;}val = digitalRead(k2);if (val) {lcd.clear();lcd.print("2 dir=R");digitalWrite(dir, LOW);//方向设置成顺时针lastdir = false; //记录方向tone(cp, speedx * 4);}val = digitalRead(k3);if (val) {lcd.clear();lcd.print("3 dir=L");digitalWrite(dir, HIGH);//方向设置成逆时针lastdir = true;tone(cp, speedx * 4);}val = digitalRead(k4);if (val) {lcd.clear();lcd.print("4 Auto run set:");if (autorun)//按键切换是否根据检测器来自动运行。{autorun = false;lcd.setCursor(15, 0);lcd.print("F");}else{autorun = true;lcd.setCursor(15, 0);lcd.print("T");}}}void hideScan(){boolean hide = digitalRead(detect);if (hide){if (!lastHide){//新的一次被遮挡if (autorun){if (cpNum < cpSetNum)//未达到设置距离,就继续维持转动{//tone(cp, speedx * 4); //跟tb6600细分设置有关,,这里使用四倍细分,用于规避tone函数只能生成31hz以上频率问题。//delay(1000);//1stone(cp, speedx * 4 * 10); //提高检测速度 转速delay(100);noTone(cp);cpNum++;}else {if (lastdir)//检测上一次的方向{digitalWrite(dir, LOW); //方向改变cpNum = 0; //cp计数清零0lastdir = false;}else {digitalWrite(dir, HIGH); //方向改变cpNum = 0; //cp计数清零0lastdir = true;}}}else{noTone(cp);}}lastHide = true; //设置被遮挡状态标志,用于检测是否经历了一轮}else{lastHide = false;noTone(cp);}}//电位器,用于控制线径宽度void swScan() {int swVal = 0;swVal = analogRead(sw); //0-1023delay(200);lcd.setCursor(0, 1);lcd.print("wire=");speedx = swVal / 10;//0-1023 /10以后对应 0-100hz,给到控制器float wire = swVal / 1023;lcd.print(wire, 0);lcd.print(".");wire = speedx % 100;lcd.print(wire, 0);lcd.print("mm");}void loop() {keyScan();hideScan();swScan();lcd.setCursor(12, 1);lcd.print(cpNum, DEC);}

4. TODO: 准备添加的功能

4.1 没有设定线圈匝数的功能

目前我是外加了一个计数器,以后肯定要换掉。

应该光耦每检测到一次,就是一匝,在cpNum清零前将这个次数记录下来到wireNum。当这个匝数达到设定值时,就noTone(cp),把脉冲停掉。

这就要看这个匝数怎么设置,以后可能会外加两个按键用来设置,或者不加按键直接做成menu滚动菜单?

开机默认主界面显示 当前匝数, 设定匝数,线径,自动检测运行的设置状态。

按下key1打开菜单(第一行print "menu",第二行print 功能);

key2 往下选择功能(按一下,功能num加1,到达功能总数num清零,并根据功能num在第二行print出来对应功能名称);

key3确认,根据功能num,设置按键服务函数组的num,然后对按键123的服务函数进行改变。

key4 返回按键 ,用于返回上一层。(这里就按下直接print主界面需要的内容,如果需要,可以设置一个记录当前层数的num)

4.2 显示屏要更换

这一次因为手头上现有一块lcd1602,所以就凑合用了,不过1602不能显示汉字就不太行。

下一次换成oled彩色液晶屏,我看也挺便宜的,得能显示汉字才能让使用的人看明白。

暂时想到就这么多,以后有机会再加。

如果觉得《arduino uno + tb6600 + 42步进电机 自制自动绕线机》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。