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

トリガ信号に同期してデータログ

ch(チャンネル)毎にトリガ信号に同期して
アナログ信号データログします。

現在の課題
・ある周期のトリガ信号で、チャンネル選択とトリガの
タイミング不一致でログされない。(ほぼ改善)
・記録タイミングが遅れたデータが混ざる(残念)
早まることはないので読み捨てることもできるが
どうしたものか
ADCはI2C、DigitalIOはSPI接続なので仕方ないのかも
しれない。スキル不足でタイミング合せはムリ
SeeeduinoXIAOで本体ADC、DigitalIOで試すと大きくズレた
データは記録されなかった。

クリックすると元のサイズで表示します

仕様
4chを切換えながらトリガ信号を待ち、トリガ信号でログ開始します。
選択されたch以外でトリガ信号が入力されても記録しません。
選択chでも全てのトリガでログされません。
選択ch切換えはトリガ信号に同期しません。(暫定)
トリガ信号を受け取るとで5mSおきに10回測定します。(暫定)
何回目のデータを表示させるかを選べます。(暫定)

1chのみであれば100%全てのトリガでログできると思います。

ArduinoIDEでソフト開発しています。
0
投稿者:管理人

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

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


マイコン: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最新お知らせ