hiro yamamoto works

マイコンハード、ソフトを作ったりしています。
お家や現場のお困りごと解決に!
内容利用は自己責任でお願いします。

シリンダ移動時間測定器(仮)

2021-09-10 11:35:00 | マイコンハードウェア


ブレッドボードでのテストとデバック


簡単な作りです。
ケース上側にI2C LCD、ケース下側にArduinoNANO
互換機、ターミナルブロックを基板にレイアウト、
側面にスイッチを取り付けました。
電源はDC5VをUSB-Aで供給
センサはDC5~24V対応のシリンダセンサが使えます。
写真はホールセンサで自作したものです。


ターミナルブロックにセンサと電源を接続


電源スイッチと表示クリアスイッチ


測定値表示の様子


配線も少ないです。

稚拙スケッチの紹介
注意 コピペ後#includeの後の不等号を半角に直します。
/*
millis()約50日でオーバーフローは考慮しない
PORTBは、Arduinoのデジタルピンの8番から13番に対応する。
ポートBをすべて入力
D8(sensor0) アクチェータの出(push)側端とする
D9(sensor1) アクチェータの戻り(pull)側端とする
Bit0,1(D8,9)入力はプルアップすること。active LOW
LCDは 参考HiLetgo HD44780 1602 LCDディスプレイ
I2C I/Fアダプタ PCF8574 付き
ArduinoIDEにライブラリLiquidCrystal_PCF8574.hインクルード必要
*/
#include <LiquidCrystal_PCF8574.h>
#include <Wire.h>

LiquidCrystal_PCF8574 lcd(0x27); // set the LCD address to 0x27 for a 16 chars and 2 line display

uint8_t buttonState = 0;
uint8_t lastButtonState = 0;
unsigned long pushStartTime = 0;
unsigned long pushTime = 0;
unsigned long pullStartTime = 0;
unsigned long pullTime = 0;
const uint8_t clearPBS = 2;//測定値クリアプッシュスイッチ

void setup() {
Serial.begin(115200);

Wire.begin();

pinMode(clearPBS, INPUT_PULLUP);//測定値クリアプッシュスイッチ
DDRB = B00000000; // ポートBをすべて入力

lcd.begin(16, 2); // initialize the lcd
lcd.clear();//LCD初期表示関係
lcd.setCursor(0, 0); lcd.print("Push ");
lcd.setCursor(5, 0); lcd.print(pushTime);
lcd.setCursor(14, 0); lcd.print("mS");
lcd.setCursor(0, 1); lcd.print("Pull ");
lcd.setCursor(5, 1); lcd.print(pullTime);
lcd.setCursor(14, 1); lcd.print("mS");
}

void loop() {
lcd.setBacklight(255);
/*/B PORT入力ピンレジスタの下位2Bitだけ(D8,D9)使う*/
buttonState = PINB & 0x03; // D8:PortB Bit0 D9 Bit1 磁気検出ON = L

//D9,D8どちらかがLOWになったときから始める
if (buttonState != lastButtonState) {//以前と現在が違う時

/*/D9pull端戻り限ONの時LOW,D8push端出限ONの時LOW PORT Bのbit0がD8,bit1がD9*/
/*/以前D9L(pull端戻り限ON),D8H,現在D9H,D8H(移動中)*/
if ((buttonState == 0x03) && (lastButtonState == 0x01)) {//
pushStartTime = millis(); //戻り限から出発した時間を変数に記録
/*/以前D9H,D8H(移動中),現在D9H,D8L(push端出限ON)*/
} else if ((buttonState == 0x02) && (lastButtonState == 0x03)) {
/*/出限到着時間 - 戻り限出発時間 = 戻り〜出移動時間 変数へ記録*/
pushTime = millis() - pushStartTime;//移動中H,Hから到着H,L(D8push端出限)
lcd.clear();//LCD表示を消す
lcd.setCursor(0, 0); lcd.print("Push ");//LCD表示関係
lcd.setCursor(5, 0); lcd.print(pushTime);
lcd.setCursor(14, 0); lcd.print("mS");
lcd.setCursor(0, 1); lcd.print("Pull ");
lcd.setCursor(5, 1); lcd.print(pullTime);
lcd.setCursor(14, 1); lcd.print("mS");
Serial.print("push Time = "); Serial.println(pushTime);
/*/以前D9H(pull端戻り限OFF)D8L(push端出限ON),現在D9H,D8H(出限から戻り限へ移動中)*/
} else if ((buttonState == 0x03) && (lastButtonState == 0x02)) {
pullStartTime = millis();//出限を出発した時間を変数に記録
/*/以前D9H,D8H(出限から戻り限へ移動中),現在D9L(pull端戻り限ON),D8H(push端出限OFF)*/
} else if ((buttonState == 0x01) && (lastButtonState == 0x03)) {
/*/戻り限到着時間(現在時間) - 出限出発時間 = 出〜戻り移動時間 変数へ記録*/
pullTime = millis() - pullStartTime;
lcd.clear();//LCDに表示されている情報を消す
lcd.setCursor(0, 0); lcd.print("Push ");
lcd.setCursor(5, 0); lcd.print(pushTime);
lcd.setCursor(14, 0); lcd.print("mS");
lcd.setCursor(0, 1); lcd.print("Pull ");
lcd.setCursor(5, 1); lcd.print(pullTime);
lcd.setCursor(14, 1); lcd.print("mS");
Serial.print("pull Time = "); Serial.println(pullTime);
}
/*clearBPSが押されて変数は0になっても、millis()カウントは電源投入から進んでいるので
clearBPS使い方 sensor1,2のいずれかがONする位置で押して下さい。sensor1,2両方がOFF状態で
押すと、アクチェータを移動してsensor1,2のいずれかがONした時に、数値が表示されてしまいます。再度clearBPを押すと数値がクリアされ測定できます。*/
}
//測定値クリアプッシュスイッチ
if (digitalRead(clearPBS) == LOW) {
buttonState = 0;
lastButtonState = 0;
pushStartTime = 0;
pushTime = 0;
pullStartTime = 0;
pullTime = 0;
lcd.clear();//LCDに表示されている情報を消す
lcd.setCursor(0, 0); lcd.print("Push ");
lcd.setCursor(5, 0); lcd.print(pushTime);
lcd.setCursor(14, 0); lcd.print("mS");
lcd.setCursor(0, 1); lcd.print("Pull ");
lcd.setCursor(5, 1); lcd.print(pullTime);
lcd.setCursor(14, 1); lcd.print("mS");
Serial.println("LCD clear ");
}
}