hiro yamamoto works

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

 

カレンダー

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

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

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

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

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

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 | 《前のページ | 次のページ》
/1 
 
AutoPage最新お知らせ