×

车床电子丝杠开源硬件

消耗积分:0 | 格式:zip | 大小:0.43 MB | 2022-11-15

刘波

分享资料个

描述

背景

这个项目从一个简单的请求开始,我希望能够在我的 Atlas Craftsman 车床上切割公制螺纹,并消除手动更换丝杠驱动齿轮的麻烦。在网上搜索后,我找不到有关制造或购买电子丝杠的好信息,所以我决定开始制造一个。此外,我决定添加一个 VFD 来控制电机主轴的速度。

由于 VFD 驱动主轴是独立于电子丝杠的系统,因此我将其分为两部分:主轴驱动系统和丝杠驱动系统。

主轴驱动系统非常简单。用三相代替单相驱动电机,用VFD驱动。

丝杠驱动系统使用 Arduino 来创建一种电子变速箱。Arduino 读取主轴速度并根据用户输入调整伺服 RPM 以匹配正确的比率,以创建公制或英制螺纹。LCD 显示屏与两个用于用户界面的瞬时按钮一起使用。这允许用户选择公制或英制单位和螺纹尺寸。一旦选择了所需的螺纹或螺距,就可以使用 3 向开关以 CW 或 CCW 方向转动电机。电机运行后,LCD 不会更新,并且在电机停止之前您无法更改螺距。

主轴驱动系统 (VFD)

我决定从 eBay 购买 1/3hp 3ph 电机和 VFD 套件,电机框架尺寸与现有的 1/2hp 1ph 电机相似,因此可以直接安装。

对于驱动系统,我还购买了一个内联 EMI 滤波器(这个 TECO VFD 会发出很多噪音并干扰 Arduino)。EMI 滤波器放置在 VFD 的电源侧。

铁氧体环用于降低从 VFD 到电机的噪音。

开/关开关用于为主轴和丝杠驱动系统供电。它安装在面板门上。

VFD 也可以与外部电位器一起使用,在操作车床时控制电机速度。10k 的底池效果很好。它安装在 Arduino 外壳上。

这些物品被组装成一个 nema 4 外壳并连接在一起(我是一个机械人,不注意电线的鸟巢)。

 
poYBAGNy2qOAZy6yAA6W2rFDOaM179.jpg
显示 VFD、滤波器、铁氧体环和步进电机 P/S 的外壳
 

丝杠驱动系统

使用 24v 20 a 电源为步进电机供电(您可能使用较小的安培数 P/S)。电源安装在 VFD 外壳中。

我决定使用扭矩为 3Nm 的 NEMA 23 步进电机,如果我能再做一次,我会升级到 NEMA 24,这个电机有足够的功率来切割螺纹而不会失速。

使用钢制安装支架将电机安装在车床工作台上

14t 3/8in L 正时皮带轮用于步进器上的小齿轮驱动

对于丝杠上的正时皮带轮,我使用了 22t 3/8in L 正时皮带轮和锥形锁适配器。该适配器有一个 0.75 英寸的孔,其键槽与现有的丝杠相匹配。无需对车床进行任何修改。

下面是带有同步带系统的步进电机的图片。我切掉了安全门的底部以安装在步进电机上,这样它就可以关闭了。

 
pYYBAGNy2qmABxRyAAyCy8DB4gE277.jpg
梯形丝杠驱动系统显示步进和同步带驱动
 

我使用微步进驱动器来连接 Arduino 和步进电机。驱动器使用 24v 电源根据来自 Arduino 的信号为步进器提供脉冲。我只是将它安装在靠近步进器的长凳底部。我没有把它放在 VFD 面板中,因为 EMI 太多。

为了测量主轴的转速,我使用了这个感应霍尔效应传感器。由于它带有自己的 LCD,我可以使用它来校准 Arduino 速度计算。我将磁铁粘在主轴上,如下所示。

 
poYBAGNy2rCAMbZsAAvFx_wpLGw901.jpg
 

我用一个小塑料盒来装液晶屏、Arduino、面包板和开关。

塑料外壳

阿杜诺

液晶显示器

按按钮

3路开关

 
pYYBAGNy2raAL5f6AAy6a6yjKWg239.jpg
带有 LCD、按钮、Arduino、开关和电位器的外壳,用于主轴转速
 

编码

该程序有几个功能。使用了 LiquidCrystal_I2C 库和 AccelStepper 库。屏幕是使用数组设置的,因此它是可扩展的。它使用 X 变量来表示公制与英制,y 变量在屏幕上打印每个数据字段。

const int x = 2;
int currentX = 0;
String screens[x][5] = {{"TPI","Dir","LatheRPM ","ServoRPM","tpi/mm"}, {"Pitch","Dir","LatheRPM","ServoRPM","tpi/mm"}};

设置按钮标志循环使用 for 循环来读取按钮状态并在状态已更改时发出信号。

void setButtonFlags() 
{
 for(int i=0; i < n; i++)
 {
   buttonState[i] = digitalRead(buttonPin[i]);
   delay[1];
   if(buttonState[i] != lastButtonState[i])
   {
     if(buttonState[i] == HIGH)
     {
       //Serial.print("Button: ");
       //Serial.println(buttonPin[i]);
       buttonFlags[i] = HIGH;
     }
   }

如果按钮已更改状态,则解决按钮标志会触发按钮操作。

void resolveButtonFlags() 
{
 for(int i = 0; i < n; i++)
 {
   if(buttonFlags[i] == HIGH)
   {
     buttonAction(i);
     buttonFlags[i] = LOW;
     printScreen();
   }
 }
}

按钮动作循环确定在显示某个屏幕时按下某个按钮时要执行的操作。因此,当您在公制屏幕上并按下按钮 A 时,音高将会改变。如果您使用英语,则 TPI 会发生变化。

void buttonAction(int button) 
{
 if (button == 0)
 {
   if (currentX == x-1)
   {
     currentX = 0;
   }
   else
   {
     currentX++;
   }
 }
 if (button == 1)
 {
   if (currentX == 0)
   {
     if(currentTPI == nTPI-1)
     {
       currentTPI = 0;
     }
     else
     {
       currentTPI++;
     }
   }

速度传感器回路使用去抖来触发计算主轴 RPM 回路和步进 RPM 回路。每主轴旋转一次,步进器 RPM 只会改变一次。同样,根据您在哪个屏幕上,它将计算英制或公制。

void speedSensor() 
{
 time = millis();
 int currentSensorState = digitalRead(SensorPin);
 if (currentSensorState != lastSensorState)
 {
   lastDebounceTime = millis();
 }
 if ((millis() - lastDebounceTime) > debounceDelay)
 {
   if (currentSensorState != sensorState)
   {
     sensorState = currentSensorState;
     if (sensorState == LOW) 
     {
       calculateRPM(); // Real RPM from sensor
       if (currentX == 0)
       {
         englishCalc();
       }
       else if (currentX == 1)
       {
         metricCalc();
       }
     }
   }
 }

发送数据循环在步进器不运行时运行,用于将信息发送到 LCD 屏幕。当步进器运行时,这个循环不活跃,因为它减慢了 arduino 的处理器。

void sendData()
{
 unsigned long currentMillis = millis();
 if(currentMillis - prevMillis >= interval)
 {
   prevMillis = currentMillis;
   lcd.setCursor(9,2);
   lcd.println(lcdRPM);
   lcd.rightToLeft();
   lcd.print("   ");
   lcd.leftToRight();
   lcd.setCursor(9,3);
   lcd.println(servoRPM);
   lcd.rightToLeft();
   lcd.print("   ");
   lcd.leftToRight();
   lcdRPM = 0;
 }
}

步进速度计算基于每英寸的丝杠螺纹(在本例中为 8TPI)、同步带齿轮比(在本例中为 1.529)、微步(在本例中为 400)和 RPM。

void metricCalc()
{
   stepperRPM = 1.529 * 0.315 * 400 * RPM * pitch[currentPitch] / 60.00;
   servoRPM = 0.482 * RPM * pitch[currentPitch];
}
// =========================== metric stepper speed =========================
void englishCalc()
{
   stepperRPM = 1.529 * 8.00 * 400.00 * RPM / ( tpi[currentTPI] * 60.00 );
   servoRPM = 1.529 * 8.00 * RPM / tpi[currentTPI];
}

这是主循环,一旦你让步进器运行,只有速度传感器循环与步进器设置速度库函数和 if 语句一起运行以停止电机。

void loop()
{
 setButtonFlags();
 resolveButtonFlags();
 sendData();
 speedSensor();
 if (digitalRead(leftPin) == HIGH)
 {
   //direction = 1;
   lcd.setCursor(4,1);
   lcd.print("CW ");
   lcd.setCursor(9,3);
   lcd.println(servoRPM);
   lcd.rightToLeft();
   lcd.print("   ");
   lcd.leftToRight();
   lcd.setCursor(9,2);
   lcd.println(lcdRPM);
   lcd.rightToLeft();
   lcd.print("   ");
   lcd.leftToRight();
   delay(5);
   stepper.enableOutputs();
   stepper.setSpeed(stepperRPM);  
   stepper.run();
   while(stepper.isRunning())
   {
     speedSensor();
     stepper.setSpeed(stepperRPM);  
     stepper.run();
     if(digitalRead(leftPin)==LOW)
     {
       stepper.disableOutputs();
       lcd.setCursor(4,1);
       lcd.print("OFF");
       break;
     }
   }
 }
 else if (digitalRead(rightPin) == HIGH)
 {
   //direction = -1.00;
   lcd.setCursor(4,1);
   lcd.print("CCW");
   lcd.setCursor(9,3);
   lcd.println(servoRPM);
   lcd.rightToLeft();
   lcd.print("   ");
   lcd.leftToRight();
   lcd.setCursor(9,2);
   lcd.println(lcdRPM);
   lcd.rightToLeft();
   lcd.print("   ");
   lcd.leftToRight();
   delay(5);
   stepper.enableOutputs();
   stepper.setSpeed(-stepperRPM);  
   stepper.run();
   while(stepper.isRunning())
   {
     speedSensor();
     stepper.setSpeed(-1*stepperRPM);  
     stepper.run();
     if(digitalRead(rightPin)==LOW)
     {
       stepper.disableOutputs();
       lcd.setCursor(4,1);
       lcd.print("OFF");
       break;
     }
   }
 }
}

*更新*

我添加了一个 if 语句,这样当程序处于切割/螺纹模式时,如果您按住蓝色瞬时按钮,主轴将以快速模式反向运行,以快速切割材料。

if(digitalRead(buttonPin[1]) == HIGH)
     {
       stepper.setSpeed(1500);
       stepper.run();
     }

结论

总而言之,该系统运行良好。如果您正在切割螺纹,请不要停止伺服电机,因为这会导致主轴和丝杠超时。您将无法回溯相同的螺纹轮廓。如果我有更多时间,我会在步进电机上安装一个编码器以形成一个闭合控制回路,以便主轴和丝杠也可以根据位置同步。但这似乎工作正常,只要伺服器保持运行,我就可以用这种设置切割公制螺纹(只需像平常一样脱离托架)。您将在下面找到构建项目的组件列表和每个项目的基本描述以及原理图。

接线图与源代码一起附上。您应该能够将所有这些部分放在一起,上传代码并开始切割金属。

 


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !