久违了真空成型

251

简介:久违了真空成型

最近,我成了这个CR克拉克真空成型1820年它被运往垃圾堆的惊喜所有人,而是在我的卡车后面结束了。这是因为经过快看,很明显,有人开始修复项目,并没有完成它我进入“已完成其”大赛。

除了是一个未完成的项目,如果我可以把这个东西回到正常工作状态它给了我一个机会,了解真空成型工艺,可能使一些很酷的东西前进的道路上。

我给这家造说明目标是不是一定要帮你修你自己的真空成型1820(好像具有在这种相同的情况一个人是极不可能的可能性),而是说明一些技巧,你可以用它来修复的东西,你可能不熟悉,或者别人把拆开,它是如何去重新走到一起,你没有任何信息。

第1步:检查 - 什么是我们在这里做什么?

做出的第一个决定是你打算用的东西做什么。理想情况下,你拥有它之前做到这一点。

  • 它是修?在这种情况下,我决定没错。
  • 值得修复吗?再次,是的。我猜几百美元就足以让它再次去相比,工作或DIY真空前者的成本这似乎是合理的。很明显,具有生产厂家的服务带来的费用或提供更换零件会望而却步,所以我会在我自己的。
  • 你打算用它做什么?我打算用它做很酷的东西!

二 - 弄清楚它是在什么条件

  • 腐蚀对大多数连接器的很多
  • 以前的电气问题的迹象(火!)
  • 一些加热器控制两个旋钮损坏
  • 有人已经用接线搞乱(这可能是最困难的问题)
  • 加热器和真空泵似乎是在良好的状态。

第2步:逆向工程

从未使用过这台机器,要做的第一件事就是弄清楚它是如何工作的,然后我们才能去修复它。幸运的是,制造商仍然在经营,即使这台机器看起来很老,我能够找到人工当前模型在线浏览:https://www.abbeon.com/ItemFiles/Manual/1820.pdf

也有一些YouTube视频展示了机器的使用,像这样的:

从这个信息,我看得出来,操作很简单:

  1. 加热器热身中后卫的位置上
  2. 一种模具/表单会在压板上的是上下移动
  3. 塑料被取缔了在压盘
  4. 加热器拉出热身塑料,也开始倒计时器
  5. 当计时器达到零蜂鸣器开启,而当加热器被回蜂鸣器关闭
  6. 真空泵被打开和压板上升
  7. 塑料硬化后,将压盘降低,真空截止

控制面板的背后,是所有的模拟/机电:继电器和开关只,没有数字的。

第3步:拿出一个计划

现在,我有一个想法,它是如何工作的,我需要决定做什么。我注意到一个重要的事情是,在机器上220V AC运行,所有在控制面板的布线的是在220伏(即使定时器)。由于导线的腐蚀和混乱的状态,我决定一定会带来更安全,把这一切都抛弃,并从头开始。一个Arduino是一个显而易见的选择,让我来代替几乎低压直流电的一切,除了在加热元件本身,并作为奖励它给了我没有触电的风险较低我的长椅上的能力测试和故障诊断。

这是我的计划是什么:

  • 添加一个12V电源
  • 更换新继电器12V加热器继电器
  • 替换电位器热控制旋钮,重用现有的旋钮
  • 用的旋转编码器和两个七段显示器替代定时器
  • 保持220V蜂鸣器,用继电器来控制它
  • 保持市电220V指示灯和加热灯

新继电器总成本,电源,定制的PCB,所有的连接器和各种电子元件的摸索出约$ 100我认为这是完全合理的。

第4步:设计一个新的电路

该电路的设计是基于我在上一步骤作出的决定。我推荐的,你需要控制事情的清单工作向后为了弄清楚你的电路需要包括。我有Arduino的纳米一堆克隆身边,所以我的主要限制是可用于输入/输出引脚的数量。幸运的是,我需要控制匹配得不错这种设备,在更复杂的东西我可能会选择使用MEGA,也许别的东西完全的事物的数量。

第一个图表上面绘制Digi-Key的计划,它是写生的事情弄成这样非常方便:https://www.digikey.com/schemeit/project/

我希望我的计时器更换,显示设定时间以及目前的倒计时,所以这意味着一个显示器,可以同时显示两个数字。我考虑使用OLED或类似的图形显示,但最终决定,七段显示器将是最容易阅读。有很多方法可以从一个Arduino驱动这些 - 直接驱动它们不是一种选择,由于需要多少针需要,所以我跟TM1637司机去让每个人只要求每两个引脚。旋转编码器被用来设置和保存的时间的定时器。

12V的继电器开/关切换用N沟道MOSFET(IRFZ44),因为Arduino的不是设计来切换电压的高(也电流)。用于继电器的接地连接被分解在单独的一对螺丝端子的 - 这点是使用一个开关来打开电路时,我们不希望在加热器;这意味着我们不必这样做,在固件担忧。

我运气好这段时间并没有使对电路或PCB设计任何错误,我焊了第一个完美的工作!

第5步:编写固件

我作出了努力,投入了大量的笔记在此代码,这样就很容易理解/排查未来。完整的代码可能不会是任何人,但我是有用的,但也有可能是有一些技术,也能从中吸取(和我欢迎任何意见,如果你比我更清楚呢!)。我开始用的所需要的代码做一个列表:

  1. 确定从在前面的4个热处理旋钮热定形水平
  2. 打开加热器继电器开启和关闭定期
  3. 显示在7段显示的一组时间和倒数时间
  4. 设置和保存新的时间与旋转编码器输入
  5. 启动定时器当加热器被拉出时,发出蜂鸣声,当它击中零,当加热器放回重置

关于加热器重要提示:继电器只有开和关,所以不同耐热等级由具有可变占空比切换它们的开/关完成。Arduino的analogWrite()函数正是这样做的,但它是在这个应用程序,因为频率的无用。默认情况下,PWM频率为1000赫兹,如果我们快速切换继电器我们开/关这一点,他们将在短期内被破坏。的手册真空前者有一对夫妇了解这个提示的,第一个问题是加热器应打开/关闭大约每分钟一次,和第二即“1”的最小热定形将提供关于在热减少了45%(相比最大)......这意味着,除了切换速度比较慢,我们也有变化55-100%不0-100%之间的占空比。

我最好的建议是在小块编写和测试:写的功能的一小部分,它闪到设备,并对其进行测试你的板凳上。直到你得到它的权利不要动。当你知道这使得故障排除更加容易先前工作版本和最近的测试之间,只有少量发生了变化。这里是加热器继电器切换的简短视频,我能够测试这个在板凳上没有与交流电源电压和搞乱,而不需要在我的电脑旁边店里的机器。

如果你把它粘贴到Arduino的IDE,记事本+ +,或与语法高亮别的,这可能是更容易阅读。


//替换控制器,用于克拉克真空前1820
// Elliotmade 2020年4月27日
//手册机器:https://www.abbeon.com/ItemFiles/Manual/1820.pdf


/ *
*组件连接到Arduino:
* 4个加热器继电器(12V,使用IRFZ44 N沟道MOSFET切换这些
* 1个蜂鸣器继电器
* 4加热器电位
* 2 7段显示各自使用TM1637驱动
* 1个旋转编码器与按钮
* 2个从机器现有交换机用于加热器的位置
*
*操作应该类似于此:
*电源在机器上,开关加热器开启和关闭慢慢根据对旋钮功率水平集
*定时器设定值被存储在EEPROM中,第一7段显示在显示器上
*改变定时器的设定值与所述旋转编码器进行
*延长了加热器的触发器开关,定时器应该计数在第二显示器上
*当计时器达到零时,蜂鸣器应打开
*缩回加热器触发开关和定时器应该被重置和蜂鸣器关闭
*
*注意加热器位置开关和订购他们得到推
*定时器国:
*不运行时,蜂鸣器不会触发(正常怠速状态,假设我们从这里开始)
*运行,蜂鸣器不会触发(加热器扩展)
*运行,蜂鸣器触发(加热器延长,但时间已经用完)
*不运行时,蜂鸣器不会触发(加热器缩回,定时器被复位,蜂鸣器被取消)
* /

//////////////////////////////////////////////库////////////////////////////////////////////////////////////
的#include
//http://www.mathertel.de/Arduino/RotaryEncoderLibrary.aspx
//https://github.com/mathertel/RotaryEncoder

#包括“OneButton.h”
//https://github.com/mathertel/OneButton

的#include
//https://github.com/jfturcot/SimpleTimer

的#include
//https://github.com/avishorp/TM1637

的#include
//https://github.com/thijse/Arduino-EEPROMEx

//////////////////////////////////////////销////////////////////////////////////////////////////////////////
const int的encoderButton = A1;
const int的encoderA = A2;
const int的encoderB = A3;
const int的timerStart = 7;// D7
const int的timerReset = 6;// D6
const int的蜂鸣器= 8;// D8
const int的dispClock1 = 2;// D2
const int的dispClock2 = 4;// D4
const int的dispData1 = 3;// D3
const int的dispData2 = 5;// D5
const int的heatRelay [4] = {} 12,11,10,9;// D9-D12
const int的heatKnob [4] = {A4,A5,A6,A7};



///////////////////////////////////////////常量///////////////////////////////////////////////////////////////
//这将影响开/关循环的持续时间为加热器。毫秒。加热器应保持为占空比%,那么关闭100占空比
const的无符号长heatIntervalMult = 1000;

//读取器旋钮和更新每一个加热器(毫秒)
const int的updateHeatInterval = 500;

//最小占空比为加热器(旧对照为约根据手册55%“功率降低为45%的设定1”
const int的minDutyPct = 55;

//对于旋钮的阈值,以确定零和最大热(0-1023)
const int的minThreshold = 30;
const int的maxThreshold = 1000;

常量字节heaterCount = 4;

// EEPROM存储器位置
const int的minAddress = 10;
const int的secAddress = 20;
const int的Membase的= 350;

////////////////////////////////////////////变量//////////////////////////////////////////////////////////////

布尔heatStatus [4] = {FALSE,FALSE,FALSE,FALSE};//电流的开/关的加热器的状态
INT热定形[4] = {0,0,0,0};//当前热定形0-100%的在读旋钮更新
无符号长heatLastChange [4] = {0,0,0,0};以毫秒为单位//最后一次打开加热器上
布尔timerRunning = FALSE;//定时器的状态
布尔buzzerOn = FALSE;//蜂鸣器的状态
布尔minutesMode = FALSE;在此基础上的编码器//改变行为
INT分钟;//定时器设定时间
INT秒;//定时器设定时间
INT elapsedMinutes = 0;//计时器当前倒计时时间
INT elapsedSeconds = 0;//计时器当前倒计时时间
布尔侧翻= FALSE;//用于帮助显示倒计时

//初始化一些事情
SimpleTimer countdownTimer;
旋转编码器编码器(encoderA,encoderB);
OneButton startSwitch(timerStart,TRUE);
OneButton resetSwitch(timerReset,TRUE);
OneButton encoderButt(encoderButton,TRUE);
TM1637Display display1(dispClock1,dispData1);
TM1637Display显示2(dispClock2,dispData2);



空隙设置(){////////////////////////////////////////设置///////////////////////////////////////////////////
//串行调试
Serial.begin(9600);

Serial.println( “设置开始”);

//中断用于编码器
PCICR | =(1 << PCIE1);//这使引脚变化中断1覆盖模拟输入管脚或端口C.
PCMSK1 | =(1 << PCINT10)|(1个<< PCINT11);//这使得端口C对销2的中断和3

//设置EEPROM
EEPROM.setMemPool(Membase的,EEPROMSizeNano);

//销
pinMode(蜂鸣器,OUTPUT);
对于(字节I = 0;我<= heaterCount - 1; i ++在){
pinMode(heatRelay [I],OUTPUT);
pinMode(heatKnob [I],INPUT);
}

//按钮功能
startSwitch.attachClick(开始时间);
resetSwitch.attachClick(重新设定时间);
encoderButt.attachClick(encoderClick);
encoderButt.attachLongPressStart(saveTime);

//加载所存储的计时器值
分钟= EEPROM.readInt(minAddress);
秒= EEPROM.readInt(secAddress);


//显示
display1.setBrightness(2);
display2.setBrightness(2);
display1.showNumberDec(8008);
display2.showNumberDecEx(8008,0x40,TRUE);
延迟(50);

updateDisplay1();

countdownTimer.setInterval(1000,incrimentTimer);//使定时器计数每一秒
countdownTimer.setInterval(updateHeatInterval,readKnobs);
countdownTimer.setInterval(250,updateHeatStatus);
countdownTimer.setInterval(250,updateHeatRelays);

Serial.println( “安装完成”);
} //////////////////////////////////////////////端点设置/////////////////////////////////////////////////////





空隙环(){////////////////////////////////////环路/////////////////////////////////////////////////////
//显示器按钮
startSwitch.tick();
resetSwitch.tick();
encoderButt.tick();
readEncoder();
countdownTimer.run();
checkTimer();
updateDisplay1();
updateDisplay2();
updateBuzzer();
} ////////////////////////////////////////////// END LOOP /////////////////////////////////////////////////////


空隙encoderClick(){//当编码器按钮被点击时,从数分钟到数秒变化定时器调整

minutesMode = minutesMode!;//切换时间设定模式
Serial.print( “模式:”);
Serial.println(minutesMode);
}

空隙readEncoder(){
静态INT POS = 0;
INT newPos = encoder.getPosition();


如果(!timerRunning){//才让当计时器没有开始倒计时设定的时间来改变
如果(POS!= newPos){


如果(minutesMode){
分钟=分钟+(newPos - POS);

}
否则{
秒=秒+(newPos - POS);
如果(秒== 60){
秒= 0;
分钟++;
}
如果(秒<0){
秒= 59;
分钟 - ;
}
}
POS = newPos;

分钟=约束(分钟,0,59);
秒=约束(秒,0,59);

Serial.print( “分”);
Serial.print(分钟);
Serial.print( “秒:”);
Serial.println(秒);
}
}
否则{
encoder.setPosition(POS);//重新设置编码器,仿佛同时定时器计数它没动
}
}

空隙的StartTime(){//当加热器被延长,开始倒计时
如果(!timerRunning){
timerRunning = TRUE;
elapsedSeconds = 0;
elapsedMinutes = 0;
Serial.println( “启动计时器”);
}
}

空隙重新设定时间(){//当加热器缩回时,停止计数下来,休息定时器,并切断蜂鸣器
如果(timerRunning){
timerRunning = FALSE;
buzzerOn = FALSE;
elapsedMinutes = 0;
elapsedSeconds = 0;
}
updateBuzzer();
}

空隙saveTime(){//当编码器钮被按下,保存在设定的时间到EEPROM
EEPROM.writeInt(minAddress,分钟);
EEPROM.writeInt(secAddress,秒);
Serial.println( “定时器设定保存到EEPROM”);
}

空隙incrimentTimer(){//更新每个第二道次后的经过时间的变量
如果(timerRunning){
elapsedSeconds ++;
如果(elapsedSeconds ==秒&&侧翻==假){//用于帮助显示不同,如果秒的原始数已通过
侧翻= TRUE;
elapsedSeconds = 60;
elapsedMinutes ++;
}
如果(elapsedSeconds == 60){
elapsedSeconds = 0;
elapsedMinutes ++;
}
}
}

无效checkTimer(){//如果定时器运行时,蜂鸣器鸣叫一旦达到零
如果(elapsedMinutes> =分钟&&(elapsedSeconds%60)> =秒&&!buzzerOn){
Serial.println(“计时器已经达到零”);
buzzerOn = TRUE;//打开蜂鸣器
elapsedSeconds = 0;//重置经过的时间,因此可以很容易地显示计数
elapsedMinutes = 0;
}
}

空隙updateBuzzer()打开/ {//打开蜂鸣器关闭基于可变
如果(buzzerOn){
digitalWrite(蜂鸣器,LOW);
//Serial.println("Buzzer论“);
}
否则{
digitalWrite(蜂鸣器,HIGH);
//Serial.println("Buzzer关“);
}
}

空隙updateDisplay1(){
display1.showNumberDecEx(分钟* 100 +秒,0x40的,TRUE);//设置时间应一直显示1显示
}

空隙updateDisplay2(){
如果(timerRunning){
如果(buzzerOn){//向上计数,如果蜂鸣器是(定时器已经达到零)
display2.showNumberDecEx((elapsedMinutes)* 100 +(elapsedSeconds),0x40的,TRUE);//计数。这些都是重置为0时,定时器跑出
}
否则,如果(侧翻==真){//从60秒倒计时
display2.showNumberDecEx((分钟 - elapsedMinutes)* 100 +(60 - elapsedSeconds),0x40的,TRUE);//倒数
}

其他{//从原来的秒数倒计时
display2.showNumberDecEx((分钟 - elapsedMinutes)* 100 +(秒 - elapsedSeconds),0x40的,TRUE);//倒数
}
}
否则{
display2.showNumberDecEx(分钟* 100 +秒,0x40的,TRUE);//显示2为1一回事
}


//如果(buzzerOn){//向上计数,如果蜂鸣器是(定时器已经达到零)
// display2.showNumberDecEx(elapsedMinutes * 100 +(elapsedSeconds%60),0x40的,TRUE);//计数。这些都是重置为0时,定时器跑出
//}
//否则{
// display2.showNumberDecEx((分钟 - elapsedMinutes)* 100 +(秒 - (elapsedSeconds%60)),0x40的,TRUE);//倒数
//}
//}
//否则{
// display2.showNumberDecEx(分钟* 100 +秒,0x40的,TRUE);//显示2为1一回事
//}
}

空隙readKnobs(){//读取把手位置和更新的热量设定数组
对于(字节J = 0;Ĵ<= heaterCount - 1; J ++){

如果(analogRead(heatKnob [j])热定形[J] = 0;
}
否则,如果(analogRead(heatKnob [j]的)> maxThreshold){
热定形[J] = 100;
}
否则{
热定形[J] =地图(analogRead(heatKnob [J]),0,1023,minDutyPct * 10,maxThreshold)/ 10;
}


}
//Serial.println(”“);
}

空隙updateHeatStatus(){//更新的开/关基于所述把手位置阵列每个加热器
//计算到下一次变化
无符号长curMillis =米利斯();

对于(字节m = 0时,M <= heaterCount - 1; M ++){
如果(热定形== 0 && heatStatus [米] == TRUE){//完全关断,如果在旋钮处于最小位置
heatStatus [M] = FALSE;
heatLastChange [M] = curMillis;
}
否则,如果(热定形== 100 && heatStatus [米] == FALSE){//完全上如果旋钮是在最大位置
heatStatus [M] = TRUE;
heatLastChange [M] = curMillis;
}

否则如果(heatStatus [米] == TRUE){
如果(heatLastChange [M] +热定形[M] * heatIntervalMult heatStatus [M] = FALSE;
heatLastChange [M] = curMillis;
}
}
其他{//如果加热器是目前关闭,等到最后改变时间+(100 - 占空比*乘数)秒钟过去了,然后再开启
如果(heatLastChange [M] +(100 - 热定形[米])* heatIntervalMult heatStatus [M] = TRUE;
heatLastChange [M] = curMillis;
}
}


}


}

空隙updateHeatRelays(){//开启加热器的继电器接通或断开
为(K字节= 0; k <= heaterCount - 1; k ++){

如果(heatStatus [K] == TRUE){
digitalWrite(heatRelay [K],HIGH);
}
否则{
digitalWrite(heatRelay [K],LOW);
}
}


}

ISR(PCINT1_vect){//中断服务例程对引脚变化中断1
encoder.tick();//只是调用打勾()检查状态。
}

第6步:测试

我把整个控制面板到我的替补席上,并能检验一切就在这里。真理的时刻被封堵的东西到墙上,所幸没有起火也没有问题。我慢慢的测试每次打开一个功能之一,并证实他们都还在工作完全一样在板凳上,而加热器和真空泵也工作了。通常,这是当你开始故障排除,但我并没有在所有多出问题 - 唯一的问题是,我换插头为区域3和区域4电位器旋钮 - 简单的办法。

一旦我证实,我们没有起火,没有人再怀疑触电我不得不给它一个尝试。作为不熟悉的过程,并没有准备用模具或材料我只是抓住什么是得心应手,给它一个旋转。

第7步:最后一个改进和Done!

因为我没有用真空成型过程中的任何经验,但我想开始小,是经济与塑料,因为我希望能做出很多错误。本机的制造商还是销售减磨片,但我敢肯定它的成本比我更会投入在这整个交易...所以我不得不来看看一对夫妇的照片,并制成一起来喽。

完成它已经挑战速度

参加
完成它已经挑战速度

率先分享

    建议

    • 胶水和胶带速度挑战赛

      胶水和胶带速度挑战赛
    • Tinkercad学生设计竞赛

      Tinkercad学生设计竞赛
    • 后院大赛

      后院大赛

    讨论