hiro yamamoto works

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

ホールセンサを試してみる

2021-07-19 17:40:00 | マイコンハードウェア





ホール効果センサA3144を試しています。
センサエアシリンダの磁力検出が目的です。
ユニポーラタイプ(単極検出)
オープンコレクタ output to sink up to 25mA
動作電圧:4.5〜24V

ホールセンサにはいくつか種類があるようです。
よく知らなかったので、ラッチタイプ買ってしまい
買い直しました。
ホールセンサ
スイッチタイプ:磁力接近時だけON
(単極検出と両極検出タイプがある)
アナログリニア出力:磁力に応じた出力
ラッチタイプ:N極接近HIGH,S極接近LOW
 HIGH又はLOWは磁力が離れても保持


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

2021-07-14 17:37:00 | マイコンハードウェア

アクチェータのストローク両端にセンサを取り付けて、
ストローク間の移動時間をLCD表示するスケッチを考えて
みました。2021.07.16間違い修正


スイッチをホールラッチセンサに置き換えて、センサ付きエア
アクチェータ(磁石内蔵)動きを検出する予定です。

マイコン:AE-ATMEGA328-MINI(Arduino Pro mini互換秋月電子)
LCD:HiLetgo HD44780 I2C 1602 LCD(I2C変換PCF8574)

・PortBを入力に設定(DDRB = B00000000;)
 Bit6,7は使ってはいけないはずだが入力設定だけなら
 良いのか? Bit0,1(D8,9)入力はプルアップすること。
・ポートB入力ピンレジスタを読んで、
 使用するI/O以外の変化に影響されない。
・micros()のオーバーフローは考慮しない。
・センサはアクチェータの両ストローク端で検出時ON
 D8(sensor0) アクチェータの押し(push)側端
 D9(sensor1) アクチェータの戻り(pull)側端
・Time表示数値の単位は ミリ秒(mS)

動作の説明
 D9(1)に接続したスイッチを押して離し、D8(0)のスイッチを
押したとき表示される値が戻り時間(push Time)
 D8(0)に接続したスイッチを押して離し、D9(1)のスイッチを
押したとき表示される値が押し時間(pull Time)

コピペ後修正必要
<を半角に修正する。&を半角&に修正する。
#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;
uint8_t lastButtonState = 0;
unsigned long pushStartTime;
unsigned long pullStartTime;

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

Wire.begin();
DDRB = B00000000; // ポートBをすべて入力で良い?
lcd.begin(16, 2); // initialize the lcd
}

void loop() {
lcd.setBacklight(255);//Backlight数字変えても明るさ変化なし 0で消灯

buttonState = PINB & 0x03; // D8:PortB Bit0 D13:PortB Bit5
if (buttonState != lastButtonState) {
if ((buttonState == 0x03) && (lastButtonState == 0x01)) {
pushStartTime = millis();
} else if ((buttonState == 0x02) && (lastButtonState == 0x03)) {
unsigned long pushTime = millis() - pushStartTime;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Push ");
lcd.setCursor(5, 0);
lcd.print(pushTime);
lcd.setCursor(14, 0);
lcd.print("mS");
Serial.print("push Time = "); Serial.println(pushTime);
} else if ((buttonState == 0x03) && (lastButtonState == 0x02)) {
pullStartTime = millis();
} else if ((buttonState == 0x01) && (lastButtonState == 0x03)) {
unsigned long pullTime = millis() - pullStartTime;

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);

}
//delay(1);無くても問題ないようだ。
}
lastButtonState = buttonState;

シリアルモニタにも表示します。
無保証です。