Arduino Pro MiniとOLEDディスプレイを使ったインテリジェント洗濯機タイマー
部品と材料
| 部品 | 数量 |
|---|---|
| SparkFun Arduino Pro Mini 328 - 5V/16MHz | 1 |
| 1306 OLEDディスプレイ (SSD1306) | 1 |
| DFRobot Gravity: デジタルプッシュボタン (黄色) | 2 |
| Seeed Grove - 2チャネルSPDTリレー | 1 |
| Digilent 5V 2.5A スイッチング電源 | 1 |
| SparkFun USB UART シリアルブレイクアウト - CY7C65213 | 1 |
| HC-05 Bluetoothモジュール | 1 |
必要な工具と機器
- はんだごて (汎用)
- グルーガン (汎用)
- 両面テープ
- グリーンテープ
アプリとオンラインサービス
- Arduino IDE
プロジェクト概要
はじめに
壊れた洗濯機の洗いタイマーを電子制御タイマーで置き換えるプロジェクトです。元の機械式タイマー/方向スイッチは、洗濯槽のモーターを以下のように制御していました:
- ユーザーから洗い時間(分)を入力受付
- モーターを数秒間時計回りに回転
- 数秒間停止
- モーターを数秒間反時計回りに回転
- 数秒間停止
- タイマーが切れるまで最後の4ステップを繰り返す
同じ動作を実現する電子タイマーを製作します。
デモ
以下のビデオで電子タイマーの動作を確認できます。
ハードウェア構成
- Arduino Pro Mini: コード実行と全体制御
- 1306 OLED: ユーザー指示とタイマーカウントダウン表示
- 赤/黒プッシュボタン: タイマー設定と開始
- 5Vリレーモジュール: モーターへのAC電源供給と回転方向制御
- 5Vアダプター: 電子タイマーへの給電
1306 OLEDはPro Miniに直接はんだ付けされています。2つのリレーモジュール、2つのプッシュボタン、Arduino Pro Mini + 1306 OLEDはユニバーサル基板上に配線されています。
プログラミング手順
ステップ1: HC-05 Bluetoothシリアルモジュールを入手し、ボーレートを57600に変更します。このステップには別のArduino UnoまたはUSB-シリアルモジュールが必要です。以下のATコマンドを使用:
AT
AT+UART = 57600,0,0
AT+RESET
ステップ2: ボーレート変更後、以下の配線図に従ってHC-05をArduino Pro Miniに接続します。
ステップ3: Arduino IDEでボードを選択し、コードを貼り付けてアップロードします。
Bluetoothシリアルを使用する理由は、ワイヤレスでインシステム・フィールド・プログラミングが可能になり、必要に応じてPro Miniのコードを更新できるためです。
配線とデバイス動作の説明
配線は洗濯機のモデルによって異なる場合があります。ここでは筆者の機種について説明します。右下の「Sharp」回路図に注目してください。白色リード線が商用電源から洗いタイマーへ、赤色と青色リード線が洗いタイマーから出ています。これら3本を故障した元の洗いタイマーから外し、洗濯機天板の穴から引き出しました。
白色リード線を赤色リード線に切り替えるとモーターが時計回りに、青色リード線に切り替えると反時計回りに回転します。
このArduino Pro Mini製電子タイマーは洗い時間を管理し、白色と赤色リード線を一方のリレー接点で接続して5秒間モーターを一方向に回転、その後停止して5秒待機、次に白色と青色リード線をもう一方のリレー接点で接続して5秒間逆方向に回転、再び停止して5秒待機、というシーケンスを繰り返します。すべてのタイミングはコードで変更可能です。
以下の図は、単相誘導モーターのコンデンサの片側またはもう片側にAC商用電源を切り替えることで回転方向を変える原理を示しています。
参考資料
- リレーチュートリアル
- ボタンチュートリアル
免責事項
このプロジェクトはAC商用電源を扱います。自己責任で実施してください。
コード
#include "U8glib.h" //SSD1306 oled waveshare(clk,din,cs,d/c,res); U8GLIB_SSD1306_128X64 u8g(A4,A5,12,11,10); volatile int rbc = 0; volatile int bbc = 0; int sec =0; int mi = 0; int motor_rotation = 0; void setup() { u8g.setRot180(); analogReference(INTERNAL); pinMode(2,INPUT_PULLUP); pinMode(3,INPUT_PULLUP); attachInterrupt(0, ISR_SW_RED,FALLING); attachInterrupt(1, ISR_SW_BLACK,FALLING); pinMode(5,OUTPUT); digitalWrite(5,LOW); pinMode(4,OUTPUT); digitalWrite(4,LOW); } void loop(void) { while(!rbc) { // タイマー設定メニュー表示 u8g.firstPage(); do { draw_menu(); } while( u8g.nextPage() ); // ユーザーへの操作メッセージ表示 if (rbc>0 && bbc==0) { u8g.firstPage(); do { draw_message(); } while( u8g.nextPage() ); delay(2000); rbc=0; } } // タイマー開始 if(rbc>0) { sec =59; mi = bbc-1; while(mi>=0) { // カウントダウンタイマー表示 unsigned long temp = millis()+1000; while(temp>=millis()) { u8g.firstPage(); do { draw_timer(); } while( u8g.nextPage() ); } sec=sec-1; if(sec%5==0) { control_motor(); // 5秒ごとに呼び出し } if (sec <= 0) { sec = 59; mi = mi - 1; } } rbc = 0; bbc = 0; mi = 0 ; sec = 0; digitalWrite(5,LOW);digitalWrite(6,LOW); } } // 以下、描画関数と割り込み処理、モーター制御関数が続く...
回路図
回路図とブレッドボード配線図が提供されています。
製造プロセス