二槽式洗濯機のタイマーをArduinoで自作
二槽式洗濯機の機械式タイマーが壊れたので修繕した。このタイマ部分を、Arduinoとリレーで作ったので、
記録を残す。
洗濯機は今は無き、サンヨー SW-550H2
洗濯機タイマーの構造
下図は洗濯機裏側に貼られたシールにある回路図の写真。多分どの洗濯機にもこのようなシールが
貼られていると思う。二槽式はとてもシンプルな回路なので扱いやすいね。
図中の「洗濯タイマー」部分だけが壊れたので、ここをArduinoとリレーで作った。
壊れたタイマーは機械式(ギアまでプラスティック製)。タイマーを回すとゼンマイが巻かれて、
カリカリ戻りながら、モータの
接点をON/OFFさせる物。ゼンマイは本来ゆっくり戻るようにラッチがひっかかる仕組みだったが
これが壊れて、一気に戻ってしまうようになった。プラスティック製なので自然摩耗したようだ。
それにしても4年で壊れるなんて、こういうもの作り思想だから、サンヨーは消滅したのだ。
結局はお客様の事を考えずに、自分で勝手にものを作っていただけの会社だったんだ。
消滅は当然の事だ。
下の回路図では、洗濯モータからの橙色線と黄色線を「洗濯タイマー」で、一定時間ごと、交互に
電源線(黒色線)へ接続している。これで左回り・右回りを切り替えている。「雑防コンデンサー」
から出ている灰色線はタイマー動作に関係なく、常に電源線(黒色線)に接続されていた。
「脱水タイマー」は未だ正常動作しているので、今回は作りこまない。
図中の「切換スイッチ」は、この洗濯機には”標準洗い”と”ソフト洗い”の2つのモードがあり、
それを切り替えている。
切換スイッチが空色線側なら、3秒ON、10秒OFF(ソフト洗い)の時間スケジュールで
左右交互回る
切換スイッチが紫色線側なら、5秒ON、5秒OFF(標準洗い)の時間スケジュールで左右交互
に回る
この「洗濯タイマー」部分をArduinoで作りこむ。図中の「ブザー」、「切換スイッチ」は使わない。
「雑防コンデンサー」はそのまま使用(灰色線を黒色線に直結した)。
設計概要
- Arduinoやリレーなど電子回路部分は洗濯機から離して外付けとする(防水措置が面倒だから)
- 回路にはプッシュスイッチを1つ付け、押す毎に2つのモードと停止状態が順に切り変わる仕組みにする。
- もともとこの洗濯機の洗濯モードは「ソフト洗い」と「標準洗い」の2つで、これを切換スイッチで
選択してから、動作させる時間をタイマーでセットする仕組みだった。
今回このようなモードは廃止し、新しく「標準回転モード」と「オート浸け置き洗いモード」の2つ
を作る。そして時間設定もなくして、標準回転モードは5分固定、オート漬け置き洗いモードは30分
固定とする。
- 「標準回転モード」は5秒回転、4秒休止、これを5分間動作してモードを終了する。
モータの回転は自動で交互に切り替える。動作時間の5分固定にする。
これは従来の標準洗いのイメージ。
- 「オート浸け置き洗いモード」は3秒回転、8秒休止、これを5分間動作させ、その後
5分間はモータ動作を停止する。5分間漬け置きするイメージ。
これを1ユニットとして3ユニット実行してモードを終了する。つまり漬け置きしながら30分間
かけて洗濯するイメージ。
これは洗濯槽をやんわりかき混ぜ、長い時間かけて洗うもの。洗濯は漬け置き洗いが大事だからね。
回転方向は自動で交互に切り替える。
- LEDを赤・青2つ装備して、赤LED点灯で「標準回転モード」、青LED点灯で「オート浸け置き洗いモード」、
消灯で停止状態を表示する。
回路図
<全体回路図>
下図中の「モード切替SW」のプッシュスイッチは、チャタリング防止コンデンサーを書いていない。
必要に応じて入れる。また電源回路も書いていない。5Vレギュレータ回路を入れて、9Vぐらいを
入力するのがいい。
<リレー・モジュールの回路図>
リレー・モジュールへの入力は「LOW」でリレーが動作するので要注意。
リレー・モジュール基板のIN1ピンかIN2ピンをLOWにすると、各リレーの「常時開」
側が「閉」(ON)になる。
このモジュールを使うと、ArduinoからLOWを出力するだけで、洗濯機のモータを回す事ができて便利だ。
Arduinoの出力はフォトカプラ経由になり、リレー側とは完全に分離されているので安心して
大きな電源の制御ができる。
プログラミング
概要
モータを動作させる関数から作る。動かしたい秒数だけ引数にいれて関数を呼ぶと、その秒数だけ
モータが動くが、関数を呼ぶごとに左回転・右回転は自動で交代するようにする。
次に洗濯モードを2つ作る。何秒動かし、何秒停止するかのパタンを作る。
次はスイッチを受け付ける仕組みを作る。割込機能でスイッチ押下を検出し、押下のたびに
状態を示す変数を1(モード1)>2(モード2)>0(停止)>1(モード1)>・・・と
変数値を巡回させる仕組みを作る。
最後に状態を示す変数を常時監視し、それによって動作モードが移行する仕組みを作る。
(1)モータを動作させる関数
|
洗濯モータを動かしたい秒数を引数にして、リレーを動作させる関数 on_dousa( ) を作る。
「洗濯モータを動作させる秒数」を引数にして、関数on_dousa( ) をコールする。
変数rln には出力ピン番号の4か5が入る。この関数をコールする毎に、4か5が
自動で入れ替わって、4番ピン、5番ピンにつながるリレーが交互に動作する。つまり左回転・右回転
が交互に動作する。( if(rln==5) の行 )
呼ぶ側で動作させるリレーを入れ替える必要はない。
変数rln は on_dousa( ) 関数を抜けても、次回コールされるまで内容を保持しておく
必要があるので関数の外で定義しておく。
リレー向けの出力はLOWでモータがONになる。
|
(2)洗濯モードの関数
|
洗濯モードの「オート浸け置き洗いモード」と「標準回転モード」の関数を作る。
「標準回転モード」は5秒回転、4秒休止。これを5分間続けてモードを終了。
関数 hyo()で作成。
for(unsigned int i=0; i<33; i++) で、5秒回転、4秒休止を33回(約5分)実行して終了。
4秒休止を delay(2*1000) 2行に分けて作っているのは、後にスイッチ制御を入れるため。
下(5)参照。
「オート浸け置き洗いモード」は3秒回転、8秒休止。これを5分間継続後、5分間モータ動作
を停止する。
さらにこれを1ユニットとして、3ユニット実行後、モードを終了する。
関数 tuke()で作成。 最初の for(unsigned int j=0; j<3; j++) で3ユニットの実行制御。
次の for(unsigned int i=0; i<27; i++) で、3秒回転、8秒休止を27回(約5分)。
次の for(unsigned int i=0; i<30; i++) で約5分休止。
自分流の洗濯モードを自作するときは、ここのパタンを好みで修正すればよい。
|
(3)スイッチの読み込み
|
スイッチを押す事で、ストップ−>「標準回転」−>「オート浸け置き洗い」と
モード変化する仕組みを作る。
とりあえず、スイッチを押す毎に、グローバス変数 sc の値を書き換える仕組みを作る。
スイッチ押下のタイミングをプロセッサで感知するには、attachInterrupt( ) という割込機能を利用する。
割込機能を利用すると、2番ピン(または3番ピン)が LOW になった瞬間、プログラムのどこを実行して
いても、予め指定した関数へ飛び、その関数からリターンすれば、元の実行していたプログラムの場所へ
復帰する事ができる。
setup( )の所で、attachInterrupt( ) を実行すると、それ以降、割込受付を開始する。
attachInterrupt(0, sw1, FALLING) 関数を実行すると、それ以降、2番ピンが
LOWになった瞬間に、関数 sw1( ) へ制御が飛んでいき、sw1( )の処理が終わり次第、
元いた所に戻ってくるようになる。この関数中の FALLING は2番ピンがLOWになる瞬間をトリガに
することを指定している。
関数 sw1( ) では、スイッチが押されるたびに、グローバル変数 sc の中身が 0 -> 1 -> 2 -> 0 ・・・
と変化する
ようにしてある。それと同時に sc=1 なら赤LED(6番ピン)を点灯し、sc=2 なら青LED(7番ピン)
を点灯する。
チャタリングがひどいと、プッシュスイッチを一度しか押していないのに、すぐ赤から青に変わったりする。
そんなときは、この最後の行の attachInterrupt 命令の前に、delay(200); ぐらい入れておく。
中国製安物のプッシュスイッチだとぎしぎしチャタリングするので要注意。
|
(4)スイッチによる動作
|
スイッチが押されると、グローバル変数 sc に (0, 1, 2) のどれかの値が設定される。初期値は0。
loop( ) 内で、もし sc=1 なら 標準回転モードの hyo( ) を実行。sc=2 なら オート浸け置き洗いモードの
tuke( ) を実行。
しかし、これだけでは洗濯機の動作中に、スイッチが押されても、それぞれのモードが終了するまで
停止させたり、モードを変更する事ができない。それで各モード動作の関数の中で、sc をチェックする。
|
(5)モード動作中のスイッチによる動作
|
スイッチが押されると、モード動作中でも停止したり、別のモードに移行したりできるようにする。
関数 tute( )、関数 hyo( ) の行の中に、いちいち sc の値をチェックして、変化していたら、関数を
抜け出す仕組みを入れる。赤矢印のところ。
抜け出せば、loop( ) の所に戻るので、また sc の値で動作が判定されて、そちらに動作が移る。sc=0 なら停止状態
を続ける。
各モードの終了時には、sc=0 にしてから関数を終了するようにする。(モード動作終了後に停止する)
プログラムはこれで完成。プログラム全体はここ
|
|
元の「洗濯タイマー」につながっていた橙色線、黄色線、黒色線を切って、それにコードをつなぎ、
洗濯機から引っ張り出している様子。これをリレーモジュールにつなぐ。
|
|
Arduinoとリレーモジュールで自作した制御部分。全体をビンに入れて、洗濯機の外に置く。
ビンに入れるのは、リレーモジュールから発火しても大丈夫なように。リレーモジュールは中国製
の安物なので信用できない。半年ほど使っているが今のところ発火の様子はない。
写真の左は電源スイッチとプッシュスイッチとLEDをビンの外に付けるための部分。
当初電源は9V電池を使っていたが、すぐになくなるので、家にあった9VDCアダプタに変えた。
製作費用はArduinoPromini、リレーモジュールなどほぼ全て中国製の安物なので500円ほど。
|
|