この記事はMySQL Casual アドベントカレンダー の25日めの記事になります。
メリークリスマス! 皆さんMySQL好きですよね! そしてケーキが好きな人も多いと思います。なので今回は、12月25日ということでMySQLでパウンドケーキを焼いてみたいと思います。
仕組みとしては、MySQLのUDFからArduinoのPINの値を変更します。そして、Arduinoの値でリレーつき電源を動かしてオーブントースターにつながるコンセントの電源をON/OFFするという方法を取りました。
注意事項
また、今回の記事を見て試してみようと思った方は、通常の「道普請」の記事とは違い、圧倒的にやけど、感電等の怪我や事故に直結する可能性が高いので、追試を行う際には気をつけて試してみてください。
検証環境
今回はYumでインストールをしたMySQL 8.0.13と、システムワイドにインストールしたrbenvとruby-buildを利用してインストールをした2.5.3を利用しました。Arduinoの開発環境のバージョンは1.8.5です。今回、開発環境のインストール方法に関しては説明を行いません。
ケーキを焼くための道具
オーブントースターとリレー付き電源、そしてGPIOと接続するためのUSBケーブルとArduinoを利用して、ケーキを焼いていきます。リレー付き電源は、サンワサプライ社製のTAP-RE34U-5 を利用しております。通常の使い方では、PCとUSBでつないでおいて、PCの電源が切れたら連動したタップのコンセントの通電も切れるという仕組みです。今回はこの電源を利用します。
連動タップのコンセント口
右側の色が違うコンセントには常に電流が流れていて、左側の「連動」と書かれたコンセントはUSBの信号に合わせて電気が流れたり止まったりします。
連動タップ付属のUSBの口
上の写真の右側のUSBコネクタをPCに挿して使うことを想定しています。こちらのUSBに電流が流れると、「 連動」と書かれたコンセントに電気が流れ始めます。そこで、今回はこちらのUSBのケーブルのグラウンドとVCCをArduinoとを接続します。
Arduino接続用のUSBケーブル
ケーブルのGNDをArduinoのGNDに、今回の信号ピン(12)をVCCにつなぎます。逆にすると流れないので注意しましょう。12ピンがtrueになり電流が流れると、オーブントースターへ電流が供給されるようになります。
オーブントースターは機械式のものを使っています。電源がONになった時に勝手に電源が入るように、雑ではありますが目一杯ダイヤルを回した後にガムテープで止めました。
ダイヤルをガムテープ止め
このようにすることで、電源が入ると自動でオーブントースターに火が入るようになりますが、この状態で使用するのは危険なため利用するときには、目を離さないように注意をしてください。これらをこの写真のようににつないだら準備が完了です。
最終的なセッティング
Arduinoを制御する
今回はarudino_filmata というRubyのライブラリを使ってArduinoを制御していきます。まずは、ArduinoにPCと通信するためのプロトコルを解釈するプログラムを書き込みます。ファイル->スケッチ例->Firmata->Standard Firmata
とすると、Firmataプロトコルを解釈するためのスケッチが出てくるので、そちらを書き込みます。
続いて、Rubyのライブラリをgemコマンドを使ってインストールしましょう。gem install arduino_firmata
とすることでインストールができます。
ここまでうまく行っているかどうかは、お手持ちのLEDなどをArduinoの12ピンとGNDに差し込んで、以下のコマンドを試してみることで確認できます。
LEDで制御がうまく行っているか確認
コマンドを実行すると、12ピンに電流が流れ始めます。
$ arduino_firmata digital_write 12, true
以下のプログラムを実行すると、12ピンに流れていた電流が止まります。
$ arduino_firmata digital_write 12, false
ということで、これらを読んであげるUDF(User Defined Function)を作っていきます。
ちなみにですが、13ピンと接続すると表面実装されたLEDとも同期するため、通信の開始にスイッチが入ったり消えたりして慌てることになるので注意しましょう。
UDFを使って焼いてみる
UDFは、「第70回 UDFを動かしてみよう」 で紹介したMySQLを拡張するための仕組みです。まずは呼び出される側のコードを用意します。
require 'arduino_firmata'
arduino = ArduinoFirmata.connect
begin
arduino.digital_write 12, true
sleep 60 * 15
ensure
arduino.digital_write 12, false
end
次にこれを呼び出すUDFを用意します。
#include <mysql.h>
extern "C" {
bool bake_init(UDF_INIT *initid, UDF_ARGS *args, char *message);
void bake(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error);
void bake_deinit(UDF_INIT *initid);
}
bool bake_init(UDF_INIT *initid, UDF_ARGS *args, char *message){
return 0;
}
void bake(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error){
system("ruby /usr/local/bin/bake.rb");
}
void bake_deinit(UDF_INIT *initid){
}
ということでUDFをコンパイルして組み合わせてみましょう。今回はsleepする時間は固定で15分となっています。なので実行すると、12ピンが15分間オンになります。
その他の解決策
「第3回 MySQLのバグかな? と思ったその時は」 の記事で紹介されているMySQLのバグトラッキングシステムmysqlbugsの2番目に、「Does not make toast」 (トーストが焼けない)というチケットがあります。これに対して、UDFとオーブントースターとリレーつき電源とRaspberry piを利用するという、今回参考にさせていただいた構成で対応する解決策があります。今回は直にArduinoを利用したので利用しませんでしたが、Raspberry piとそれを制御するUDFに関してはGitHubにコードが公開されているので 、そちらをベースに進めても良いかもしれません。
実際にケーキを焼いてみました
今回はホットケーキミックスを利用してパウンドケーキを焼きます。レシピに関しては省略しますが、通常のホットケーキミックスにちょっとバターをアクセントとして加えております。
生地のセッティング
このようにセットをしてbakeコマンドを使ってみましょう。大体20~30分程度で焼き上がります。
焼き上がり
今回はちょっと焦げてしまったのですが、そうなりそうな場合はアルミホイルをかぶせるなどして対応してください。
というわけで、MySQLでケーキを焼くことができました!
まとめ
MySQLはトーストも焼けるしケーキも焼けるしおもちだって焼けます!(ただし効率的かは保証しません) ちょっと異色な記事だったかもしれませんが、ぜひ皆さんも焼いてみてはいかがでしょうか。それでは皆さん良いお年を!