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);//暂缓 
    
  
  }



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