主要材料:
- Arduino Nano x1
- N20减速电机/电机驱动 x1
- 上拉10k电阻 x1
- 振动电机 x1
- 5V风扇 x1
- 有源蜂鸣器 x 1
- 洞洞板 x1
- 3D打印外壳
硬件设计方案图
软件主程序流程图
总 结:
- 负责上下伸缩的电机,没有设置限位开关控制电机的伸缩行程,运用延时函数delay()控制效果较差,若电机损坏,同一时间上下伸缩的行程不能保持一致会出现卡壳的现象。
- 超声波清洗模块没有实现,采用振动马达模拟。
- 焊接的洞洞板太简陋,拉桥搭线的布局很丑陋。
- 毛笔挂上架子上的侦测是用上拉电阻,单片机读取PIN9默认没有毛笔的时候为1。毛笔挂笔尾镶嵌磁铁,运用导电的磁铁去连接架子上的两个金属触电 从而改变上拉电阻从"1"到"0",整个系统开始工作。
- 程序后半部分运用旗标判断是否毛笔进入使用阶段,若洗干净之后再次使用,M>5表示毛笔长时间不在架子上,说明毛笔正在被使用中。(让架上毛笔从挂上去得那一刻起启动清洗步骤,而且只启动一次,避免重复。)
参考程序
/*************************************************************
* 名称:一种自动清洗毛笔的装置
* 作者:Naiva
*
**************************************************************/
#define delayTime1 18000
#define delayTime2 1000
#define Fan_Seepd 256
boolean flag = true ;
void BUZZER(int i);
int Vibration_Motor();
void setup() {
Serial.begin(9600);
pinMode(9,INPUT); //Pin_9引脚---------笔尾磁铁感应触点
pinMode(3,OUTPUT); //Pin_3引脚---------INT1_电机正转_笔架下降
pinMode(5,OUTPUT); //Pin_5引脚---------INT2_电机反转_笔架上升
pinMode(6,OUTPUT); //Pin_6引脚---------INT3_电机转动_风扇风干
pinMode(2,OUTPUT); //Pin_2引脚---------蜂鸣器鸣叫
pinMode(13,OUTPUT);//Pin_13引脚--------震动电机触发_HIGH
//模块设置初始化
digitalWrite(9,HIGH);//触发信号无
digitalWrite(13,LOW);//停止震动
digitalWrite(3,LOW);//电机下降停
digitalWrite(5,LOW);//电机上升停
// digitalWrite(6,LOW);//风干停
/***开机自动上升至最高点,避免电机下降行程太短导致电机卡死(最好使用限位开关)***/
// Serial.println("上升中...");
// digitalWrite(3,LOW);//上升
// digitalWrite(5,HIGH);
//
// delay(delayTime1);
//
// digitalWrite(3,LOW);//停止
// digitalWrite(5,LOW);
//
// delay(delayTime2);//暂缓
}
void loop() {
int M = 0; //M 是 记录跳出while循环的标签旗标,以免导致误触发
int N = 5; //N 是 记录“跳出循环”的条件M 达到 5 次就跳出while循环
Serial.println(digitalRead(9));
if(digitalRead(9) == LOW && flag == true )
{
Serial.println("蜂鸣器...");
BUZZER(1);//蜂鸣器提醒
/*******************************************/
Serial.println("下降中...");
digitalWrite(3,HIGH);//下降
digitalWrite(5,LOW);
delay(delayTime1);
digitalWrite(3,LOW);//停止
digitalWrite(5,LOW);
delay(delayTime2);//暂缓
/*******************************************/
//清洗
Serial.println("清洗中...");
Vibration_Motor();//电机震动
/*******************************************/
Serial.println("上升中...");
digitalWrite(3,LOW);//上升
digitalWrite(5,HIGH);
delay(delayTime1);
digitalWrite(3,LOW);//停止
digitalWrite(5,LOW);
delay(delayTime2);//暂缓
/*******************************************/
// Serial.println("风干中...");
// analogWrite(6,Fan_Seepd);//风干
//
// delay(delayTime1);
//
// analogWrite(6,0);
//
// delay(200);
/*******************************************/
while(( M < N) ||(digitalRead(9) == LOW) )//循环 让以上程序只运行一次
{
Serial.println("死循环中...");
if(digitalRead(9) == HIGH )
{
Serial.print("M:");
Serial.println(M);
M++;
delay(500);
}
else if( M >= N && digitalRead(9) == HIGH )
{
Serial.println("跳出死循环中...");
break;//break
}
else
{
M = 0;
}
delay(500);
}
flag == false ;
}
else
{
digitalWrite(3,LOW);
digitalWrite(5,LOW);
analogWrite(6,LOW);
digitalWrite(2,LOW);
digitalWrite(13,LOW);
flag == true ;
}
delay(100);
}
/**************************/
/**************************/
void BUZZER(int i)
{
for(i;i>0;i--)
{
digitalWrite(2,HIGH);//buzzer
delay(100);
digitalWrite(2,LOW);
delay(100);
digitalWrite(2,HIGH);//buzzer
delay(100);
digitalWrite(2,LOW);
delay(100);
}
//delay(200);
}
int Vibration_Motor()
{
digitalWrite(13,HIGH);//震动
delay(15000);
digitalWrite(13,LOW);//停止震动
delay(200);//暂缓
}
改进版本20200413
/*************************************************************
* 名称:一种自动清洗毛笔的装置
* 作者:Naiva
*
**************************************************************/
#define delayTime1 18000
#define delayTime2 1000
#define Fan_Seepd 256
boolean flag = true ;
void BUZZER(int i);
int Vibration_Motor();
void setup() {
Serial.begin(9600);
pinMode(9,INPUT); //Pin_9引脚---------笔尾磁铁感应触点
pinMode(3,OUTPUT); //Pin_3引脚---------INT1_电机正转_笔架下降
pinMode(5,OUTPUT); //Pin_5引脚---------INT2_电机反转_笔架上升
pinMode(6,OUTPUT); //Pin_6引脚---------INT3_电机转动_风扇风干
pinMode(2,OUTPUT); //Pin_2引脚---------蜂鸣器鸣叫
pinMode(13,OUTPUT);//Pin_13引脚--------震动电机触发_HIGH
//模块设置初始化
digitalWrite(9,HIGH);//触发信号无
digitalWrite(13,LOW);//停止震动
digitalWrite(3,LOW);//电机下降停
digitalWrite(5,LOW);//电机上升停
digitalWrite(6,HIGH);//风干电机停 备注:风扇电机12v驱动,继电器为低电平触发!!!
/***开机自动上升至最高点,避免电机下降行程太短导致电机卡死(最好使用限位开关)***/
// Serial.println("上升中...");
// digitalWrite(3,LOW);//上升
// digitalWrite(5,HIGH);
//
// delay(delayTime1);
//
// digitalWrite(3,LOW);//停止
// digitalWrite(5,LOW);
//
// delay(delayTime2);//暂缓
}
void loop() {
int M = 0; //M 是 记录跳出while循环的标签旗标,以免导致误触发
int N = 5; //N 是 记录“跳出循环”的条件M 达到 5 次就跳出while循环
Serial.println(digitalRead(9));
if(digitalRead(9) == LOW && flag == true )
{
Serial.println("蜂鸣器...");
BUZZER(1);//蜂鸣器提醒
/*******************************************/
Serial.println("下降中...");
digitalWrite(3,HIGH);//下降
digitalWrite(5,LOW);
delay(delayTime1);
digitalWrite(3,LOW);//停止
digitalWrite(5,LOW);
delay(delayTime2);//暂缓
/*******************************************/
//清洗
Serial.println("清洗中...");
Vibration_Motor();//电机震动
/*******************************************/
Serial.println("上升中...");
digitalWrite(3,LOW);//上升
digitalWrite(5,HIGH);
delay(delayTime1);
digitalWrite(3,LOW);//停止
digitalWrite(5,LOW);
delay(delayTime2);//暂缓
/*******************************************/
Serial.println("风干中...");
digitalWrite(6,LOW);
delay(delayTime1);
Serial.println("关闭...");
digitalWrite(6,HIGH);
delay(200);
/*******************************************/
while(( M < N) ||(digitalRead(9) == LOW) )//循环 让以上程序只运行一次
{
Serial.println("死循环中...");
if(digitalRead(9) == HIGH )
{
Serial.print("M:");
Serial.println(M);
M++;
delay(500);
}
else if( M >= N && digitalRead(9) == HIGH )
{
Serial.println("跳出死循环中...");
break;//break
}
else
{
M = 0;
}
delay(500);
}
flag == false ;
}
else
{
digitalWrite(3,LOW);
digitalWrite(5,LOW);
analogWrite(6,HIGH);//停止
digitalWrite(2,LOW);
digitalWrite(13,LOW);
flag == true ;
}
delay(100);
}
/**************************/
/**************************/
void BUZZER(int i)
{
for(i;i>0;i--)
{
digitalWrite(2,HIGH);//buzzer
delay(100);
digitalWrite(2,LOW);
delay(100);
digitalWrite(2,HIGH);//buzzer
delay(100);
digitalWrite(2,LOW);
delay(100);
}
//delay(200);
}
int Vibration_Motor()
{
digitalWrite(13,HIGH);//震动
delay(15000);
digitalWrite(13,LOW);//停止震动
delay(200);//暂缓
}