hiro yamamoto works

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

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

2021-08-14 10:03:00 | マイコンハードウェア


ブレッドボード上での試作とデバック


暫定仕様完成


仕様変更しました。

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;

}