

Genuino101には制御機器をイメージした基板を接続し、Bluetooth経由で制御機器の動作状態をRaspberry Piに送ります。Raspberry Piはその情報から制御機器の状態を把握し、モニター画面上で管理者に動作状況を伝えます。今回の制御対象はリレーです。
リレーなどの機械的な動作をする部品には故障がつきものです。また半導体部品と比べると製品寿命も短いので、長期間使用する為には寿命が尽きる前に交換するなどのメンテナンスが必要になります。そこで、動作状況を監視して部品がなんらかの原因で故障したことを検知したり、故障する前に予測できれば便利です。
今回は制御対象が一つですが、制御対象を増やし色々なデータを取れる様に拡張する事が出来ます。また、オープンソースとして公開されているソフトウェアを利用した故障検知、予測システムを開発する事も可能です。
| 番号 | 個数 | 部品番号 | 型番 |
|---|---|---|---|
| 1 | 1 | D1 | D1NS4-5060 |
| 2 | 1 | CN1 | B4B-XH-A |
| 3 | 1 | K1 | 941H-2C-5D |
| 4 | 1 | LED1 | LED(赤) |
| 5 | 1 | LED2 | LED(黄) |
| 6 | 1 | PC1 | TLP624 |
| 7 | 1 | Q1 | 2SC1815 |
| 8 | 2 | R1,R2 | 3.3K |
| 9 | 3 | R3,R4,R6 | 510 |
| 10 | 1 | R5 | 10K |
| 11 | 1 | SW1 | トグルスイッチ |

フォトカプラは、リレー接点の状態をGenuino101に知らせます。
トグルスイッチはOnにするとリレーの接点側の回路に電源を供給します。このスイッチをOffにして接点側の回路を動作させなくする事で、疑似的な故障状態をつくれるようにしています。
この回路をユニバーサル基板上に組み立てた物が、左図になります。

コネクタのピンアサインは下記(表)の通りです。
| コネクタのピン番号 | Genuino101の信号名 | 制御基板の信号名 |
|---|---|---|
| 1 | 5V | VCC_1 |
| 2 | A1(入力) | リレー接点信号 |
| 3 | A0(出力) | リレー励磁信号 |
| 4 | GND | GND |

#include // Bluetoothライブラリ
#include // タイマー割り込みライブラリ
#include // EEPROMライブラリ
#define relayPin A0 // リレー制御出力信号
#define PCPin A1 // リレー接点入力信号
BLEPeripheral blePeripheral; // BLEペリフェラルインスタンスの生成
BLEService RlyService("19B10010-E8F2-537E-4F6C-D104768A1214"); // BLEサービスの生成
// リレー制御開始用キャラクタリスティックの生成
BLECharCharacteristic actCharacteristic("19B10011-E8F2-537E-4F6C-D104768A1214", BLERead | BLEWrite);
// リレー接点信号用キャラクタリスティックの生成
BLECharCharacteristic sigCharacteristic("19B10012-E8F2-537E-4F6C-D104768A1214", BLERead);
// リレー励磁信号用キャラクタリスティックの生成
BLECharCharacteristic rlyCharacteristic("19B10013-E8F2-537E-4F6C-D104768A1214", BLERead);
// リレー駆動回数用キャラクタリスティックの生成
BLEUnsignedIntCharacteristic cntCharacteristic("19B10014-E8F2-537E-4F6C-D104768A1214", BLERead);
// 変数の初期化
static boolean output = LOW; // リレー励磁信号
static boolean output_enb = LOW; // リレー励磁信号の出力許可
static boolean rly = LOW; // リレーの状態
static int sigValue; // リレー接点信号
static unsigned int count; // リレー駆動回数
static unsigned int eeAddress=0; // EEPROMアドレス
// リレーをOn/Offする関数
void onoff() {
output = !output; // リレー励磁信号の論理を反転
digitalWrite( relayPin, ( output & output_enb ) ); // リレー励磁信号を出力
if ( output & output_enb ) { // リレー励磁信号がHIGHレベルのとき
rly = HIGH; // リレーの状態を設定
count++; // 駆動回数をカウントアップ
cntCharacteristic.setValue( count ); // リレー駆動回数用キャラクタリスティックに値を設定
}
else { // リレー励磁信号がLOWレベルのとき
rly = LOW; // リレーの状態を設定
}
}
// setup関数
void setup() {
EEPROM.get(eeAddress, count); // EEPROMに保持している駆動回数を読み込み
pinMode( LED_BUILTIN, OUTPUT ); // オンボードLED制御信号を出力ピンに設定
pinMode( relayPin, OUTPUT ); // リレー励磁信号を出力ピンに設定
pinMode( PCPin, INPUT ); // リレー接点信号を入力ピンに設定
digitalWrite( LED_BUILTIN, LOW ); // オンボードLEDを消灯
digitalWrite( relayPin, LOW ); // リレーをOff
// ローカルネームを設定
blePeripheral.setLocalName( "RelayCtrl" );
// アドバタイズするサービスのUUIDを設定
blePeripheral.setAdvertisedServiceUuid( RlyService.uuid() );
// サービスのアトリビュートを追加
blePeripheral.addAttribute( RlyService );
// リレー制御開始用キャラクタリスティックのアトリビュートを追加
blePeripheral.addAttribute( actCharacteristic );
// リレー接点信号用キャラクタリスティックのアトリビュートを追加
blePeripheral.addAttribute( sigCharacteristic );
// リレー励磁信号用キャラクタリスティックのアトリビュートを追加
blePeripheral.addAttribute( rlyCharacteristic );
// リレー駆動回数用キャラクタリスティックのアトリビュートを追加
blePeripheral.addAttribute( cntCharacteristic );
// リレー制御開始用キャラクタリスティックの書き込みイベント発生時のコールバック関数を設定
actCharacteristic.setEventHandler(BLEWritten, actCharacteristicWritten);
// リレー制御開始用キャラクタリスティックに0を設定
actCharacteristic.setValue( 0 );
// リレー接点信号用キャラクタリスティックに0を設定
sigCharacteristic.setValue( 0 );
// リレー励磁信号用キャラクタリスティックに0を設定
rlyCharacteristic.setValue( 0 );
// リレー駆動回数用キャラクタリスティックに駆動回数を設定
cntCharacteristic.setValue( count );
// BLEペリフェラルの初期化、アドバタイズ開始
blePeripheral.begin();
// 3,000,000usごとにonoff関数を実行するように設定
CurieTimerOne.start( 3000000, &onoff );
}
// loop関数
void loop() {
// イベントをポーリング
blePeripheral.poll();
if ( rly == HIGH ) { // リレーの状態がHIGH
rlyCharacteristic.setValue( 1 ); // リレー励磁信号用キャラクタリスティックに1を設定
}
else {
rlyCharacteristic.setValue( 0 ); // リレー励磁信号用キャラクタリスティックに0を設定
}
sigValue = digitalRead( PCPin ); // リレー接点信号入力ピンを読み込み
// リレー接点信号の状態が変化していたとき
if ( sigCharacteristic.value() != sigValue ) {
// リレー接点信号用キャラクタリスティックにリレー接点信号の状態を設定
sigCharacteristic.setValue( sigValue );
}
delay( 100 ); // 100msecウェイト
}
// リレー制御開始用キャラクタリスティックの書き込みイベント用コールバック関数
void actCharacteristicWritten(BLECentral& central, BLECharacteristic& characteristic) {
// リレー制御開始用キャラクタリスティックが1のとき
if ( actCharacteristic.value() ) {
digitalWrite( LED_BUILTIN, HIGH ); // オンボードLEDを点灯
output_enb = HIGH; // リレー励磁信号の出力許可
} else {
digitalWrite( LED_BUILTIN, LOW ); // オンボードLEDを消灯
output_enb = LOW; // リレー励磁信号の出力禁止
EEPROM.update(eeAddress, count); // EEPROMに駆動回数を書き込み
}
}
それではこのプログラムを順番に説明します。
Copyright © 2025 TAHARA ELECTRIC CO., LTD. all right reserved