はじめに
以前現場改善を目的にCH32Vマイコンを使用した電子オルゴールプログラムを作成しました。
以前の投稿は以下を参照↓
CH32Vマイコンプログラミング(2)|Arduino ide環境、電子オルゴール
しかしあのプログラムでは厳密に狙い通りのものとは言えないです。
今回は本当にやりたいことの説明を第一章に行い、第二章でプログラムの改善を説明します。
さらに第三章でC言語ではなくタイマーリレーを使用したプログラムレスのシーケンス制御で実現します。
第一章 狙いの動作
現場のおっちゃんを助けるためには以下の動作が必要です。
- 生産ラインの通常サイクルタイムは10[s]とする(本来は5[s]だが余裕を取る)。
- 通常サイクルタイムを過ぎてから製品が投入されたときに音で知らせる。
- 通常サイクルタイム内で製品が流れ続ける限りブザーは鳴らない。
これをマイコンプログラミングとシーケンス制御の2通りで実現します。
第二章 前回のプログラムの問題点
前回のプログラムでは第一章の仕様を十分に満たしていませんでした。
10[s]以内にボタンが押されれば(製品が流れれば)カウントがリセットされること、ドレミのブザーが鳴ることは実現できていましたが、『通常サイクルタイムを過ぎてから製品が投入されたときに音で知らせる』の仕様が達成できていません。
※製品の投入を検出する透過センサをボタンのON, OFFに置き換えています。
今回はこれを追加します。
さらにボタンの接続方法も少し変更しました。プルアップ抵抗を追加して安定性を増しています。
その関係でif文のinの条件をHIGHからLOWに変更しました。
回路図とプログラムは以下の通りです。

//timereset_doremi_ver2.ino
byte countdowntime;
int b;
void setup() {
delay(5000);
Serial.begin(115200);
pinMode(PC2, OUTPUT);
pinMode(PC1, INPUT);
countdowntime = 10;
b = 0;
Serial.println("CountDown Start!");
}
void loop() {
bool in = digitalRead(PC1);
if(countdowntime>0){
if(in == LOW){
countdowntime = 10;
b = 0;
Serial.println("CountDown reset");
}else{
countdowntime--;
Serial.println(countdowntime);
delay(500);
}
}else{
b = 1;
if(b == 1 && in == LOW){
Serial.println("melody time");
int a=0;
while(a<200){
int y=f(239);
a++;
delay(1);
}
while(a<400){
int y=f(213);
a++;
delay(1);
}
while(a<600){
int y=f(190);
a++;
delay(1);
}
countdowntime = 10;
b = 0;
}
}
}
int f(int n){
digitalWrite(PC2, HIGH);
delayMicroseconds(n);
digitalWrite(PC2, LOW);
delayMicroseconds(n);
return;
}
これで狙いの動作ができるようになりました。
第三章 シーケンス制御でプログラムレス
そもそもプログラムレスで実現しようと思った背景
C言語プログラムを実現した時から感じていたことですが、「これってプログラミングするほどのものでは無くね?」と思っていました。
そんな折、地元の電子パーツ屋さんにお邪魔していた時、OMRONのタイマーリレーH3FA-Aを見つけました。
現場で使用されるタイマーリレーは100V稼働や低くても12V稼働のものが多く、趣味で使用するには不向きですし何より高かったです。
しかしこれは5VDCで稼働し、何より数百円で購入できました(ジャンクだからということもある)。
今回はこれを使用し、シーケンス制御での実現をします。
ラダー回路図
ペイントソフトを使用して以下のラダー回路図を作成しました。

CH32Vマイコンの時はドレミの音階を鳴らすブザーを発生させていましたが、今回は簡単に5[s]のLED点灯(上記ラダー図のL)で実現します。
このラダー回路をブレッドボード上で実現しました。

R1(SW)
4回路2接点モーメンタリのスイッチです。
これは地元の電子パーツショップで購入しました。上記のラダー回路図では3回路で十分です。
端子形状はラグなのでこのままではブレッドボードにさせません。はんだ付けを行いジャンパーワイヤーで接続できるようにしました。

このままでは不安定なのでブレッドボードの写真に写っているように、3Dプリンタを使用してスイッチボックスを作りました。
3Dモデルの設計はFreeCADを使用し、3DプリンターはBambu lab A1 miniを使用しました。
作成したモデルは後ほど情報共有します。
TR1, TR2
タイマーリレーH3FA-Aは2つ使用しました。TR1は10[s]のカウント用、TR2はブザー用です。
24pinに+側、1pinに-側を接続します。
H3FA-Aは1~3pinの接続状況によってタイマのレンジを変更できます。
今回は10[s]レンジで使用するため1と2pinを短絡させました。タイマーリレー表面のメータを回すことでレンジ内で時間を変更できます。
上記の場合、Lまで回した時が10[s]、Sが0[s]。メモリが2[s]毎になります。
ただし設定時間には大分誤差があり、TR1では11[s]くらい、TR2では5[s]ぐらいとなっていました。
あと備忘録ポイントなのですが、22と21pinは短絡させる必要があります。
ブレッドボード
ブレッドボードはArduEZ製のものを購入しました。
これはType Cケーブルで電源供給でき、上のスライドスイッチで各ステーションごとの電源を3V、5V、12Vに切り替えられるブレッドボードです。
今回は5V電源のみしか使用しませんが、今後異なる電圧を混合した電気回路で使っていこうと思い購入しました。
私は秋月電子通商で購入しましたが、amazonでも売られていました。
amazon販売リンク↓
LED回路
LED回路は別の小さいブレッドボードで組んでます。LEDの前に3kΩの抵抗を3本並列に接続しています。
(なぜ抵抗3本を並列に接続しているのか?1kΩの抵抗がストックも買う気も無かったからです。ケッチ~)
動作結果
- ブレッドボードに電源投入後、R1(SW)を1回押すとカウントダウンが開始します。
- 10[s]以内に再度押せばR1(SW)のB接点によりカウントはリセットされます。
- 10[s]を過ぎるとR3のリレーが立ち上がり、その状態でR1(SW)を押す(*1)とLEDが5[s]点灯します。この時R1(SW)のB接点によりTR1とR3の状態はリセットされます。
- LED消灯後5[s]過ぎるとR3のリレーが立ち上がり、その状態でR1(SW)を押すとLEDが5[s]点灯。5[s]以内ならLEDは消灯のままです。
上記説明ではわかりにくくなってしまったのですが、10[s]のカウントは『R1(SW)を押してから』がトリガとなります。
R3の立ち上がりはTR1のタイマによるもののため、そのスタートであるR1(SW)が押されてから10[s]に毎回立ち上がります。
4の『LED消灯後5[s]過ぎてから』はLEDの点灯時間が5[s]なので、その差5[s]後にTR1の10[s]タイマがカウント完了ということです。
こちらでも狙いの動作ができるようになりました。
総評_C言語とシーケンス制御どちらがいいか?
今回同じ目的の動作をマイコンC言語プログラミングとシーケンス制御の2通りで実現しました。
一概にどちらがいいというのは言いづらいかなと思いました。
C言語に慣れている人はマイコンプログラミングでいいですし、何より汎用性が高い制御ができます。
ただしあらかじめ目的の動作が決まっているのであれば、リレーとタイマーリレーを組み合わせたシーケンス制御でも十分で、かつパソコンもプログラミングも不要です。マイコンの故障リスクもありません。
必要に応じて使いこなせればいいと思います。
最近はPLCが普及してシーケンス制御でもラダープログラミングで実現するのが一般的ですが、アナログなシーケンス制御も捨てたもんじゃないなと感じました。
FA備忘録の村