主要材料:
- 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);//暫緩
}