hiro yamamoto works

ESP8266 Web logger
RaspberryPi HiRes Audio
Mini Solar power system
当ブログ掲載内容は無保証です。利用は自己責任でお願いいたします。

 

カレンダー

2021
May
Sun Mon Tue Wed Thu Fri Sat
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          

QRコード

検索



このブログを検索

カウンター

本日のアクセス
昨日のアクセス
総アクセス数

ブログサービス

Powered by

teacup.ブログ
RSS

アクチェータのストローク時間を測定

アクチェータのストローク両端にセンサを取り付けて、
ストローク間を移動する時間をシリアルモニタへ表示する
スケッチを考えてみました。


マイコン:ESP-WROOM-02
デジタルIO:MCP23S08(8Bit I/Oエクスパンダ)
(E-温度品(動作電圧4.5〜5.5V)を3.3V動作させてます。)

・4Bitを入力、残り4Bitを出力に設定(必須はI/O0,1入力)
・入力は抵抗でプルダウン、スイッチ押すとHIGH
・デジタルI/Oポート全体(レジスタ)を読んで、
 使用するI/O以外の変化に影響されない。
・micros()のオーバーフローは考慮しない。
・センサはアクチェータの両ストローク端で検出時ON
 IO0 アクチェータの押し(push)側端
 IO1 アクチェータの戻り(pull)側端
・Time表示数値の単位は ミリ秒(mS)
クリックすると元のサイズで表示します
動作の説明
 IO0に接続したスイッチを押して離し、IO1のスイッチを
押したとき表示される値が戻り時間(pull Time)
 IO1に接続したスイッチを押して離し、IO0のスイッチを
押したとき表示される値が押し時間(push Time)

スケッチ例 StateChangDetectionをベースにしました。
コピペ後修正必要です。(修正不要な書き方わからんです)
<を半角に修正する。&を半角&に修正する。
#include <MCP23S08.h>//<を半角に直す

#define CS_PIN 16 //MCP23S08のCS PIN
MCP23S08 expander(CS_PIN, 0x20);//アドレスA0,A1 PIN-GND接続

uint8_t buttonState; //現在の入力状態
uint8_t lastButtonState = 0; //以前の入力状態
unsigned long pushStartTime;
unsigned long pullStartTime;

void setup() {
Serial.begin(115200);
//ESP本体pinModeはSPI.beginの前に置く
SPI.begin();
expander.begin();// I/O expander MCP23S08
for (uint8_t pin = 0; pin < 4; pin++) { // 0から3を入力設定
expander.pinModeIO(pin, INPUT);
}
for (uint8_t pin = 4; pin < 8; pin++) { // 4から7を出力設定
expander.pinModeIO(pin, OUTPUT);
}
}

void loop() {
// 現在の状態を読み込んでbuttonStateに入れます。
// 0x03(0b00000011)とのANDを取って、GPIO0,1以外に影響されないようにします。
buttonState = expander.getInputStates() & 0x03;

//buttonState(現在)をlastButtonState(以前)と比較して等しくない時(状態変化)
if (buttonState != lastButtonState) {
//現在0x00(0b00000000) 以前0x02(0b00000010)だったら
if ((buttonState == 0x00) && (lastButtonState == 0x02)) {
pushStartTime = millis();//millis()の値をpushStartTimeへ代入

//現在0x01(0b00000001) 以前0x00(0b00000000)だったら
} else if ((buttonState == 0x01) && (lastButtonState == 0x00)) {
//millis()の値からpushStartTimeの値を引いてpushTimeへ代入
unsigned long pushTime = millis()-pushStartTime;
Serial.print("push Time = ");Serial.println(pushTime);//pushTimeをシリアル出力

//現在0x00(0b00000000) 以前0x01(0b00000001)だったら
} else if ((buttonState == 0x00) && (lastButtonState == 0x01)) {
pullStartTime = millis();//millis()の値をpushStartTimeへ代入

//現在0x02(0b00000010) 以前0x00(0b00000000)だったら
} else if ((buttonState == 0x02) && (lastButtonState == 0x00)) {
//millis()の値からpullStartTimeの値を引いてpullTimeへ代入
unsigned long pullTime = millis()-pullStartTime;
Serial.print("pull Time = ");Serial.println(pullTime);//pullTimeをシリアル出力
}
// Delay a little bit to avoid bouncing
//バウンスを避けるために少し遅らせます。
delay(50);
}
//現在の状態を以前の状態へ保存します。
lastButtonState = buttonState;
}

シリアルモニタの表示
クリックすると元のサイズで表示します
右スイッチがIO0、左スイッチがIO1
クリックすると元のサイズで表示します
0
投稿者:管理人
1 | 《前のページ | 次のページ》
/1 
 
AutoPage最新お知らせ