hiro yamamoto works

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

 

カレンダー

2021
October
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

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

クリックすると元のサイズで表示します
ブレッドボードでのテストとデバック

クリックすると元のサイズで表示します
簡単な作りです。
ケース上側にI2C LCD、ケース下側にArduinoNANO
互換機、ターミナルブロックを基板にレイアウト、
側面にスイッチを取り付けました。
電源はDC5VをUSB-Aで供給
センサはDC5~24V対応のシリンダセンサが使えます。
写真はホールセンサで自作したものです。

クリックすると元のサイズで表示します
ターミナルブロックにセンサと電源を接続

クリックすると元のサイズで表示します
電源スイッチと表示クリアスイッチ

クリックすると元のサイズで表示します
測定値表示の様子

クリックすると元のサイズで表示します
配線も少ないです。

稚拙スケッチの紹介
注意 コピペ後#includeの後の不等号を半角に直します。
/*
millis()約50日でオーバーフローは考慮しない
PORTBは、Arduinoのデジタルピンの8番から13番に対応する。
ポートBをすべて入力
D8(sensor0) アクチェータの出(push)側端とする
D9(sensor1) アクチェータの戻り(pull)側端とする
Bit0,1(D8,9)入力はプルアップすること。active LOW
LCDは 参考HiLetgo HD44780 1602 LCDディスプレイ
I2C I/Fアダプタ PCF8574 付き
ArduinoIDEにライブラリLiquidCrystal_PCF8574.hインクルード必要
*/
#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 = 0;
uint8_t lastButtonState = 0;
unsigned long pushStartTime = 0;
unsigned long pushTime = 0;
unsigned long pullStartTime = 0;
unsigned long pullTime = 0;
const uint8_t clearPBS = 2;//測定値クリアプッシュスイッチ

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

Wire.begin();

pinMode(clearPBS, INPUT_PULLUP);//測定値クリアプッシュスイッチ
DDRB = B00000000; // ポートBをすべて入力

lcd.begin(16, 2); // initialize the lcd
lcd.clear();//LCD初期表示関係
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() {
lcd.setBacklight(255);
/*/B PORT入力ピンレジスタの下位2Bitだけ(D8,D9)使う*/
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*/
/*/以前D9L(pull端戻り限ON),D8H,現在D9H,D8H(移動中)*/
if ((buttonState == 0x03) && (lastButtonState == 0x01)) {//
pushStartTime = millis(); //戻り限から出発した時間を変数に記録
/*/以前D9H,D8H(移動中),現在D9H,D8L(push端出限ON)*/
} else if ((buttonState == 0x02) && (lastButtonState == 0x03)) {
/*/出限到着時間 - 戻り限出発時間 = 戻り〜出移動時間 変数へ記録*/
pushTime = millis() - pushStartTime;//移動中H,Hから到着H,L(D8push端出限)
lcd.clear();//LCD表示を消す
lcd.setCursor(0, 0); lcd.print("Push ");//LCD表示関係
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");
Serial.print("push Time = "); Serial.println(pushTime);
/*/以前D9H(pull端戻り限OFF)D8L(push端出限ON),現在D9H,D8H(出限から戻り限へ移動中)*/
} else if ((buttonState == 0x03) && (lastButtonState == 0x02)) {
pullStartTime = millis();//出限を出発した時間を変数に記録
/*/以前D9H,D8H(出限から戻り限へ移動中),現在D9L(pull端戻り限ON),D8H(push端出限OFF)*/
} else if ((buttonState == 0x01) && (lastButtonState == 0x03)) {
/*/戻り限到着時間(現在時間) - 出限出発時間 = 出〜戻り移動時間 変数へ記録*/
pullTime = millis() - pullStartTime;
lcd.clear();//LCDに表示されている情報を消す
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");
Serial.print("pull Time = "); Serial.println(pullTime);
}
/*clearBPSが押されて変数は0になっても、millis()カウントは電源投入から進んでいるので
clearBPS使い方 sensor1,2のいずれかがONする位置で押して下さい。sensor1,2両方がOFF状態で
押すと、アクチェータを移動してsensor1,2のいずれかがONした時に、数値が表示されてしまいます。再度clearBPを押すと数値がクリアされ測定できます。*/
}
//測定値クリアプッシュスイッチ
if (digitalRead(clearPBS) == LOW) {
buttonState = 0;
lastButtonState = 0;
pushStartTime = 0;
pushTime = 0;
pullStartTime = 0;
pullTime = 0;
lcd.clear();//LCDに表示されている情報を消す
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");
Serial.println("LCD clear ");
}
}
0
投稿者:管理人

装置に機能を追加するコントローラ

クリックすると元のサイズで表示します
ブレッドボード上での試作とデバック

クリックすると元のサイズで表示します
暫定仕様完成

クリックすると元のサイズで表示します
仕様変更しました。

Arduino NANO互換機(ATmega328P)
使用入力3(ホトカプラ)
使用出力3(ホトカプラ Ic=100mA)
機能
ダイナミック点灯方式LEDに並列接続して入力信号を取り出し
入力信号に同期した出力をする。

ダイナミック点灯方式はパルス信号(?)なので
リレー等を動かしたい場合はすこし厄介です。
マイクロコントローラを使って、LED点灯時出力ONする物を
作りました。
クリックすると元のサイズで表示します

ダイオード下はリレーです。追加機能として通電時ON接点
を設けています。
24V小型リレー Y14H-1C-24DS P-06695

スケッチの概要
入力パルスの幅を計って一定以上の場合に出力をONします。
一定未満の場合出力をOFFします。
稚拙スケッチをご紹介

const uint8_t input2 = 2;
const uint8_t input3 = 3;
const uint8_t input4 = 4;
const uint8_t input2Out = 10;
const uint8_t input3Out = 11;
const uint8_t input4Out = 12;

int input3State = 1;
int input4State = 1;
int lastinput3State = 1;
int lastinput4State = 1;
int input2State = 1;
int lastinput2State = 1;

unsigned long input3ONtime = 0;
unsigned long input4ONtime = 0;
unsigned long input3OFFtime = 0;
unsigned long input4OFFtime = 0;
unsigned long input2ONtime = 0;
unsigned long input2OFFtime = 0;
unsigned long in3Time = 0;
unsigned long in4Time = 0;
unsigned long in2Time = 0;

const uint16_t ONWidthTime = 700; //input3,4共用
const uint16_t in2ONWidthTime = 700;

const unsigned long offDelayTime = 100000; //input3,4共用
const unsigned long in2OFFDelayTime = 100000;
unsigned long in3OffWidthTime = 0;
unsigned long in4OffWidthTime = 0;
unsigned long in2OFFWidthTime = 0;

void setup() {
//Serial.begin(115200);//Serial.printは動作に影響します。

pinMode(input3, INPUT_PULLUP);
pinMode(input4, INPUT_PULLUP);
pinMode(input2, INPUT_PULLUP);
pinMode(input3Out, OUTPUT);
pinMode(input4Out, OUTPUT);
pinMode(input2Out, OUTPUT);
}
void loop() {
//input3 LOW activeパルス1つずつ立ち下がり〜立ち上がりパルス幅を評価して一定時間を超えるとき点灯
input3State = digitalRead(input3);
if (input3State != lastinput3State) { //前回の評価時と変わった?
if (input3State == LOW) { //入力LOW? LED点灯でホトカプラ出力はLOW
input3ONtime = micros(); //入力LOWの時 プログラム開始からのマイクロ秒を記録
in3OffWidthTime = 0;
} else {
input3OFFtime = micros(); //入力LOW以外の時(HIGH)プログラム開始からのマイクロ秒を記録
in3Time = input3OFFtime - input3ONtime;
if (in3Time > ONWidthTime) { //const uint16_t ONWidthTime=700 共用
digitalWrite(input3Out, HIGH);
} else {
digitalWrite(input3Out, LOW);
}
}
} else { //前回評価時と変わらない
if (input3State == HIGH) {
in3OffWidthTime = micros() - input3OFFtime;
if (in3OffWidthTime > offDelayTime)digitalWrite(input3Out, LOW);//offDelayTime=100000
} //offDelayTimeはinput3,2共用
}
lastinput3State = input3State;

//input4 LOW activeパルス1つずつ立ち下がり〜立ち上がりパルス幅を評価して一定時間を超えるとき点灯
input4State = digitalRead(input4);
if (input4State != lastinput4State) { //前回の評価時と変わった?
if (input4State == LOW) { //入力LOW? LED点灯でホトカプラ出力はLOW
input4ONtime = micros(); //入力LOWの時 プログラム開始からのマイクロ秒を記録
in4OffWidthTime = 0;
} else {
input4OFFtime = micros(); //入力LOW以外の時(HIGH)プログラム開始からのマイクロ秒を記録
in4Time = input4OFFtime - input4ONtime;
if (in4Time > ONWidthTime) { //const uint16_t ONWidthTime=700 input3,4共用
digitalWrite(input4Out, HIGH);
} else {
digitalWrite(input4Out, LOW);
}
}
} else { //前回評価時と変わらない
if (input4State == HIGH) {
in4OffWidthTime = micros() - input4OFFtime;//offWidthTime Serial.printは動作に影響が出ます。
if (in4OffWidthTime > offDelayTime)digitalWrite(input4Out, LOW);//offDelayTime=100000
}//offDelayTimeはinput3,2共用
}
lastinput4State = input4State;

//input2
input2State = digitalRead(input2); //int input2State = 0
if (input2State != lastinput2State) { //int lastinput2State = 0
if (input2State == LOW) {
input2ONtime = micros(); //unsigned long input2ONtime = 0;
in2OFFWidthTime = 0; //in2OFFWidthTime = 0;
} else {
input2OFFtime = micros(); //入力LOW以外の時(HIGH)プログラム開始からのマイクロ秒を記録
in2Time = input2OFFtime - input2ONtime;
if (in2Time > in2ONWidthTime) { //uint16_t in2ONWidthTime=700
digitalWrite(input2Out, HIGH);
} else {
digitalWrite(input2Out, LOW);
}
}
} else { //前回評価時と変わらない
if (input2State == HIGH) {
in2OFFWidthTime = micros() - input2OFFtime;//in2OFFWidthTime
if (in2OFFWidthTime > in2OFFDelayTime)digitalWrite(input2Out, LOW);//in2OFFDelayTime=100000
}
}
lastinput2State = input2State;

}
0
投稿者:管理人
1 2 3 4 5 | 《前のページ | 次のページ》
/39 
 
AutoPage最新お知らせ