hiro yamamoto works

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

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

2021-10-08 08:53:00 | マイコンソフトウェア

間違いを修正しました2023/05</ br>RP2040への移植でトラブル発生!!</ br>最終版スケッチ

センサ1だけを使って往復合計時間を測定するモードを
追加しました。
切換えはクリアスイッチを押しながら電源をいれ、約2秒
後に離すことでできるようにしました。

気になる点
スケッチ実行速度が測定値にどのくらい影響するか
わからない。


通常測定
シリンダセンサをシリンダの両ストロークエンドに取り付け
ONすることを確認します。測定前はどちらかのセンサが
ONしている状態にします。クリアを押してからシリンダを
動作させて測定します。
Push、Pull時間を表示します。


1センサ往復測定
クリアスイッチを押しながら電源をいれ、約2秒
後に離す。
センサ1取り付け位置は通常測定と同様(センサ2有無不問)
測定前はセンサ1がONしている状態にします。
クリアを押してからシリンダを動作させて測定します。
時間を表示します。




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


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

稚拙スケッチの紹介
注意 コピペ後#includeの後の不等号を半角に直します。
   コメント表現の揺れあります。
/*
millis()約50日でオーバーフローは考慮しない
PORTBは、Arduinoのデジタルピンの8番から13番に対応する。
ポートBをすべて入力
D8(sensor0) アクチェータの出(push)側端
D9(sensor1) アクチェータの戻り(pull)側端
Bit0,1(D8,9)入力はプルアップすること。active LOW*/
#include
#include

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 pushEndTime = 0;
unsigned long pushTime = 0;
unsigned long pullStartTime = 0;
unsigned long pullEndTime = 0;
unsigned long pullTime = 0;
unsigned long PP_Time = 0;
const uint8_t clearPBS = 2;//測定値クリアプッシュスイッチ
bool PPMode = false;

void setup() {
//Serial.begin(115200);
Wire.begin();
//Wire.setClock(100000);//400kHzでも動きそうだが(デフォルトは100kHz 100000)
pinMode(clearPBS, INPUT_PULLUP);//測定値クリアボタンスイッチ
DDRB = B00000000; // ポートBをすべて入力
//
//電源投入時に測定値クリアボタンスイッチHIGHなら従来通りPush-Pull測定モード
//LOWだったら、往復測定モードとする。
lcd.begin(16, 2); //initialize the lcd *修正
lcd.setBacklight(1);//1でも255でも明るさは変化しません
if (digitalRead(clearPBS) == LOW) {
//フラグを立てる
PPMode = true;
//Push-Pull Modeのlcd初期表示
//lcd.begin(16, 2);//間違だが動いてたbegin()をsetBacklight(1)の前に移動 *修正
lcd.clear();//
lcd.setCursor(0, 0); lcd.print("Push-Pull(Sen1)");
lcd.setCursor(5, 1); lcd.print(PP_Time);
lcd.setCursor(14, 1); lcd.print("mS");

} else {

lcd.begin(16, 2); // initialize the lcd
lcd.clear();//
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() {

/*B PORT入力ピンレジスタの下位2Bitだけ(D8,D9)使う
入力との論理積を取ることで必要以外bitの影響を受けないようにする & 0x03 00000011
*/
if (PPMode == false) {
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*/
/*現在D9H,D8H(移動中) && 以前D9L(pull端戻り限ON),D8H*/
if ((buttonState == 0x03) && (lastButtonState == 0x01)) {
pushStartTime = millis(); //戻り限から出発した時間を変数に記録
/*現在D9H,D8L(push端出限ON) && 以前D9H,D8H(移動中)*/
} else if ((buttonState == 0x02) && (lastButtonState == 0x03)) {
/*出限到着時間 - 戻り限出発時間 = 戻り〜出移動時間 変数へ記録*/
pushEndTime = millis();
pushTime = pushEndTime - pushStartTime;//移動中H,Hから到着H,L(D8push端出限)
lcd.setCursor(5, 0); lcd.print(" ");
lcd.setCursor(5, 0); lcd.print(pushTime);
/*現在D9H,D8H(出限から戻り限へ移動中) && 以前D9H(pull端戻り限OFF)D8L(push端出限ON)*/
} else if ((buttonState == 0x03) && (lastButtonState == 0x02)) {
pullStartTime = millis();//出限を出発した時間を変数に記録
/*現在D9L(pull端戻り限ON),D8H(push端出限OFF) && 以前D9H,D8H(出限から戻り限へ移動中)*/
} else if ((buttonState == 0x01) && (lastButtonState == 0x03)) {
/*戻り限到着時間(現在時間) - 出限出発時間 = 出〜戻り移動時間 変数へ記録*/
pullEndTime = millis();
pullTime = pullEndTime - pullStartTime;
lcd.setCursor(5, 1); lcd.print(" ");
lcd.setCursor(5, 1); lcd.print(pullTime);
}
/*clearBPSが押されて変数は0になっても、millis()カウントは電源投入から進んでいるので
clearBPS使い方 sensor1,2のいずれかがONする位置で押して下さい。sensor1,2両方がOFF状態で
押すと、アクチェータを移動してsensor1,2のいずれかがONした時に、数値が表示されてしまいます。
再度clearBPを押すと数値がクリアされ測定できます。 */
}
lastButtonState = buttonState;
if (digitalRead(clearPBS) == LOW) {//20210904>
buttonState = 0;
lastButtonState = 0;
pushStartTime = 0;
pushEndTime = 0;
pushTime = 0;
pullStartTime = 0;
pullEndTime = 0;
pullTime = 0;
PP_Time = 0;
lcd.clear();//LCDに表示されている情報を消す
delay(100);
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");
}
} else {
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*/
/*現在D9H,D8H(移動中) && 以前D9L(pull端戻り限ON),D8H*/
if ((buttonState == 0x03) && (lastButtonState == 0x01)) {
pushStartTime = millis(); //戻り限から出発した時間を変数に記録

} else if ((buttonState == 0x01) && (lastButtonState == 0x03)) {
/*戻り限到着時間(現在時間) - 出限出発時間 = 出〜戻り移動時間 変数へ記録*/
pullEndTime = millis();
PP_Time = pullEndTime - pushStartTime;//1センサで往復時間を測定
lcd.setCursor(5, 1); lcd.print(" ");
lcd.setCursor(5, 1); lcd.print(PP_Time);
}
/*clearBPSが押されて変数は0になっても、millis()カウントは電源投入から進んでいるので
clearBPS使い方 sensor1,2のいずれかがONする位置で押して下さい。sensor1,2両方がOFF状態で
押すと、アクチェータを移動してsensor1,2のいずれかがONした時に、数値が表示されてしまいます。
再度clearBPを押すと数値がクリアされ測定できます。*/
}
lastButtonState = buttonState;
if (digitalRead(clearPBS) == LOW) {
buttonState = 0;
lastButtonState = 0;
pushStartTime = 0;
pushEndTime = 0;
pushTime = 0;
pullStartTime = 0;
pullEndTime = 0;
pullTime = 0;
PP_Time = 0;
lcd.clear();//LCDに表示されている情報を消す
delay(100);
lcd.setCursor(0, 0); lcd.print("Push-Pull(Sen1)");
lcd.setCursor(5, 1); lcd.print(PP_Time);
lcd.setCursor(14, 1); lcd.print("mS");
}
} //PPMode == true
}