|
本帖最后由 sqt 于 2024-5-13 14:31 编辑
中周线圈绕着绕着突然来个电话,挂掉电话忘了到底多少圈,只得拆掉重来。于是想着给手摇绕线机加个技术装置,便开始学习arduino 编程,搭电路,买减速电机,终于成功。
该绕线机特点:
1、先设定绕制圈数,然后手动开机,完成自停,且由于断电后继电器常闭接点将电机短路,不会因电机惯性产生位移,因而计数准确可靠。
2、基本满足常规线圈绕制需求,不管是KB15、KB35线圈骨架,还是7*7、10*10常见尺寸封装。
这里要特别感谢天天爱玛丽老师,学习arduino编程曾得其指点迷津。
线圈保持器制作链接见:http://www.crystalradio.cn/forum ... =2105174&extra=
arduino 程序
// Rotary Encoder Inputs IC2 计数、中断
//原12口输出设定为高,存在问题:继电器被中断口控制
//绕线电机无法自启动,将此口设置为低则控制器通电即
//绕线电机启动,可在电机回路增加一手动开关
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define NU 3//中断1接口,霍尔元件入口pin3
#define Aio 2//中断0接口,旋转编码器A
#define Bio 4//旋转编码器B
#define Reset
int flag = 0; //标志位
boolean CW_1 = 0;
boolean CW_2 = 0;
int counter = 0;//绕制圈数计数
int number = 0 ; //设定绕制圈数
LiquidCrystal_I2C mylcd(0x27, 16, 2);
void setup() {
pinMode(Aio, INPUT);//中断0,旋转编码器A接口
pinMode(Bio, INPUT);//旋转编码器B接口
pinMode(NU, INPUT);//中断1,霍尔元件输入端口pin3
pinMode(SW, INPUT);//开关键
pinMode(8, OUTPUT);//继电器端口
pinMode(12, OUTPUT);//蜂鸣器端口
mylcd.init();
mylcd.backlight();
//Call updateEncoder() when any high/low changed seen
//on interrupt 0 (pin 2), or interrupt 1 (pin 3)
attachInterrupt(1, updateEncoder, RISING);//中断1,pin3
//中断0,只要消耗一个外部中断资源
attachInterrupt(0, Aio_inter, CHANGE);//中断0,pin2
}
void loop() {
mylcd.setCursor(0, 0);
mylcd.print("number :");
mylcd.setCursor(8, 0);
mylcd.print(number);
mylcd.setCursor(0, 1);
mylcd.print("counter:");
mylcd.setCursor(8, 1);
mylcd.print(counter);
delay(50);
}
void updateEncoder() {
if (counter <= number-1) {
counter ++;
digitalWrite (8, LOW); //继电器吸合
// digitalWrite (12, LOW);//有源蜂鸣器不响
}
else {
digitalWrite(8, HIGH );//继电器释放
digitalWrite (12, HIGH);//有源蜂鸣器响
delay(150);
digitalWrite(12, LOW);
}
}
void Aio_inter() {
// 只要处理一个脚的外部中断--上升沿&下降沿
int alv = digitalRead(Aio);
int blv = digitalRead(Bio);
if (flag == 0 && alv == LOW) {
CW_1 = blv;
flag = 1;
}
if (flag && alv) {
CW_2 = !blv; //取反是因为 alv,blv必然异步,一高一低。
if (CW_1 && CW_2) {
number++;
}
if (CW_1 == false && CW_2 == false) {
number--;
}
flag = 0;
}
}
|
评分
-
7
查看全部评分
-
|