ホール効果センサA3144を試しています。
センサエアシリンダの磁力検出が目的です。
ユニポーラタイプ(単極検出)
オープンコレクタ output to sink up to 25mA
動作電圧:4.5〜24V
ホールセンサにはいくつか種類があるようです。
よく知らなかったので、ラッチタイプ買ってしまい
買い直しました。
ホールセンサ
スイッチタイプ:磁力接近時だけON
(単極検出と両極検出タイプがある)
アナログリニア出力:磁力に応じた出力
ラッチタイプ:N極接近HIGH,S極接近LOW
HIGH又はLOWは磁力が離れても保持
アクチェータのストローク両端にセンサを取り付けて、
ストローク間の移動時間を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;
シリアルモニタにも表示します。
無保証です。