Arduino 項目筆記 |一種自動清洗毛筆的裝置

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

主要材料:

  • 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);//暫緩 
    
  
  }



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章