DC ペリスタポンプ + arduino パルス動作による液滴マシン

使用する DC ペリスタポンプ、及び、使い方

  • 下記のペリスタポンプ( 直流モータ )を使用する.

    • DC 12 V

    • 1mm x 3mm

    • ViaGasaFamido

  • PWMでは、 モータの最低稼動電圧を下回ってしまい、安定に回転できない.

    • 4-6 V 程度でモータが回転しなくなる.

  • Arduino で、直流動作する期間をごく短時間に限定することで、1滴ずつ落とす.

    • 動作電圧は、8-10 V程度.

    • Arduino で PWM + リレー 制御.

    • 5秒に1回、1滴落とす間のみリレー運転する、など.

実装

ハードウェアの実装

端子 No.

接続対象

用途

2

タクトスイッチ1

出力状態の設定ボタン(トグル)

3

タクトスイッチ2

モータ逆回転ボタン(トグル)

4

タクトスイッチ3

モータ電力設定(PWM - 10段階)

5

LED0

主電源確認用のLED

6

LED1

出力状態の表示LED

7

LED2

モータ順・逆回転の表示LED

9

LED3

モータ電力設定 (PWM - 10段階) 明暗で表示

8

LED4

モータのデューティの表示LED

10

モータ イネーブル

モータを使用するか否かの出力信号

11

モータ 出力モード1

モータドライバ出力信号1

12

モータ 出力モード2

モータドライバ出力信号2

A1

ポテンショメータ1

パルス構造設定用(パルス周期=スリープ時間)

A2

ポテンショメータ2

パルス構造設定用(パルス長=モータ回転時間)

ソフトウェアの実装


// ----------------------------- //
// -- [1] Pin Layouts         -- //
// ----------------------------- //
const int tSW1   = 2;  // output status (toggle)
const int tSW2   = 3;  // backward direction (toggle)
const int tSW3   = 4;  // PWM duty for DCMotor
const int LED0   = 5;  // Main Switch
const int LED1   = 6;  // output status (out/none)
const int LED2   = 7;  // backward direction (T/F)
const int LED3   = 9;  // PWM duty indicator
const int LED4   = 8;  // motor indicator
const int MT_EN1 = 10;
const int MT_IN1 = 11;
const int MT_IN2 = 12;
const int Ain1   = A1; // potentiometer1 :: T_period
const int Ain2   = A2; // potentiometer2 :: T_length


// ----------------------------- //
// -- [2] Motor control       -- //
// ----------------------------- //
const int  HALT              =  0;      // stop motor.
const int  FORWARD           = +1;      // direction == Forward
const int  BACKWARD          = -1;      // direction == Backward

const int   V_MSPEED_NUM     =  10;    // num of adjust.
const float V_MSPEED_MIN     =  160.0; // 8-bit value.
const float V_MSPEED_MAX     =  256.0; // 8-bit value.
const float T_PERIOD_MAX     =   30.0; // (s)
const float T_LENGTH_MAX     =    1.0; // (s)
const float sec2ms           = 1000.0;
const float T_UNIT           =    1.0; // (ms)


// ----------------------------- //
// -- [3] Variables           -- //
// ----------------------------- //
int tsw_in1    = 0;
int tsw_in2    = 0;
int tsw_in3    = 0;
int out_stat   = 0;
int rot_stat   = 0;
int pwm_stat   = 0;
int dir        = FORWARD;
int count      = 1;
float T_period = 0.1 * T_PERIOD_MAX * sec2ms;
float T_length = 0.1 * T_LENGTH_MAX * sec2ms;
float V_Mspeed = 0.5*(V_MSPEED_MAX+V_MSPEED_MIN);
unsigned long millis_buf = millis();


// ----------------------------- //
// -- [4] Initialization      -- //
// ----------------------------- //
void setup() {
  // put your setup code here, to run once:
  pinMode(   tSW1, INPUT  );
  pinMode(   tSW2, INPUT  );
  pinMode(   tSW3, INPUT  );
  pinMode(   LED0, OUTPUT );
  pinMode(   LED1, OUTPUT );
  pinMode(   LED2, OUTPUT );
  pinMode(   LED3, OUTPUT );
  pinMode(   LED4, OUTPUT );
  pinMode( MT_IN1, OUTPUT );
  pinMode( MT_IN2, OUTPUT );
  pinMode( MT_EN1, OUTPUT );
  Serial.begin( 9600 );
  digitalWrite( LED0, HIGH );    // Main Switch Lamp.
}

// ----------------------------- //
// -- [5] Main Loop           -- //
// ----------------------------- //
void loop() {
  
  acquire__pulseStructure();
  controll__outputStatus();
  controll__DCMotorMode();
  controll__MotorTiming();
  count = count + 1;

}

// ----------------------------- //
// -- [6] output control      -- //
// ----------------------------- //
void controll__outputStatus() {
  int past, V_LED3;
  float resol;

  // -- output status -- //
  past     = tsw_in1;
  tsw_in1  = digitalRead( tSW1 );
  if ( ( past == 0 ) and ( tsw_in1 == 1 ) ) {
    if ( out_stat == LOW  ){
      out_stat = HIGH;
    } else if ( out_stat == HIGH ){ 
      out_stat = LOW;
    }
    digitalWrite( LED1, out_stat );
  }
  
  // -- rotate direction -- //
  past     = tsw_in2;
  tsw_in2  = digitalRead( tSW2 );
  if ( ( past == 0 ) and ( tsw_in2 == 1 ) ) {
    if ( dir == FORWARD ){
      dir = BACKWARD;
      digitalWrite( LED2, HIGH );
    } else if ( dir == BACKWARD ){ 
      dir = FORWARD;
      digitalWrite( LED2, LOW  );
    }
  }

  // -- pwm power controll -- //
  past     = tsw_in3;
  tsw_in3  = digitalRead( tSW3 );
  if ( ( past == 0 ) and ( tsw_in3 == 1 ) ) {
    pwm_stat = ( pwm_stat+1 ) % V_MSPEED_NUM;
    resol    = ( V_MSPEED_MAX - V_MSPEED_MIN ) / ( (float) V_MSPEED_NUM );
    V_Mspeed = resol * pwm_stat + V_MSPEED_MIN;
    V_LED3   = (int) ( 256 * ( pwm_stat / (float) V_MSPEED_NUM ) );
    analogWrite( LED3, V_LED3 );
  }
  
}


// --------------------------------------------- //
// -- [7] acquire pulse structure control     -- //
// --------------------------------------------- //
void acquire__pulseStructure() {
  
  float v1  = ( analogRead(Ain1) / 1023.0 ); // pulse period
  float v2  = ( analogRead(Ain2) / 1023.0 ); // pulse duration
  T_period  = v1 * T_PERIOD_MAX * sec2ms;
  T_length  = v2 * T_LENGTH_MAX * sec2ms;
  Serial.println( v1 );
  
  
}


// --------------------------------- //
// -- [8] controll__DCMotorMode   -- //
// --------------------------------- //
void controll__DCMotorMode(){
  
  // -- Motor Speed settings -- //
  analogWrite ( MT_EN1, V_Mspeed );

  if ( ( out_stat == HIGH ) and ( rot_stat == HIGH ) ){

    if ( dir == FORWARD ){
      // -- Forward  -- //
      digitalWrite( MT_IN1, HIGH );  // (IN1,IN2) == (HIGH,LOW )
      digitalWrite( MT_IN2, LOW  );
    } else
    if ( dir == BACKWARD ) {
      // -- Backward -- //
      digitalWrite( MT_IN1, LOW  );  // (IN1,IN2) == (LOW,HIGH )
      digitalWrite( MT_IN2, HIGH );
    }
    
  }
  else {
    digitalWrite( MT_IN1, HIGH );  // (IN1,IN2) == (HIGH,HIGH) => Halt Motor.
    digitalWrite( MT_IN2, HIGH );

  }
  
}


// --------------------------------------------- //
// -- [9] Controll Motor Timing               -- //
// --------------------------------------------- //
void controll__MotorTiming() {

  if ( rot_stat == HIGH ){
    if ( millis() - millis_buf >= T_length ){
      rot_stat = LOW;
      digitalWrite( LED4, LOW  );
      millis_buf = millis();
    }
  } else
  if ( rot_stat == LOW  ){
    if ( millis() - millis_buf >= T_period ){
      rot_stat  = HIGH;
      digitalWrite( LED4, HIGH );
      millis_buf = millis();
    }
  }
}

Reference