自动绕线机 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步进电机 自制自动绕线机》对你有帮助,请点赞、收藏,并留下你的观点哦!