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¶
小型蠕動ポンプ ペリスタルティック 水槽ポンプ DC12V・24V 低脈動ポンプ DIY 水槽 ラボ 化学分析用ポンプ (ホワイト DC12V, チューブ内径1mm×外径3mm) "https://www.amazon.co.jp/gp/product/B08HX1SR2K/ref=ppx_yo_dt_b_asin_title_o07_s00?ie=UTF8&psc=1"
Arduino(アルディーノ)電子工作の基本⑤ モータを動かし自動制御する ( "https://deviceplus.jp/arduino/arduino_f05/" )
ArduinoでL293Dを使ってDCモーターをPWM駆動しました ( "https://arduinomakesiteasy.com/dcmotor-control/" )