高校生のときからほしいなあと思いつつも何もわからなすぎて手が出なかったラズパイをやっと買うことにした。きっかけは家づくりの計画を進める中でスマートホーム(家の諸々の自動化)に興味が湧いて、家が建つ前からでもさっさと習作すればいいじゃん!という思考。実際に家建ててから勉強してもいいんだけど、最初から実践というのはエンジニアリングで大体うまくいかないやつなので勉強時間はいくらあってもいいよね。
だいたいの目次は以下の通り。
あくまで感想とかのログなので詳しい説明は公式やつよい人の記事を参考にしたほうがいいと思う。そもそもド素人エンジニアなので語彙やら間違っている部分があれば是非教えてください!
わたしが知らんかった情報を抑えて書くと「ラズパイはデフォルトでストレージがない」「映像出力は microHDMI のみ」の 2 点。意外な落とし穴で**せっかくラズパイゲットしたのに動かない…!**とならないためにも覚えておこう。
ラズパイのブートに使うやつは公式から適当にインストールできる。Linux 入れたことある人は分かると思うけどだいたい一緒の流れ。
Windows から書き込みしてたんだけど、書き込み終了時に「フォーマットしますか?」と聞かれた。何も読んでないとフォーマットしそうなので気をつけて。地味にそこそこ時間かかる。
ラズパイ持ってる人が複雑なことやってる印象のせいかセットアップから結構むずかしいものかと思っていたけどOS の入ってないデスクトップに Ubuntu 入れるのと多分大差ない。
ラズパイに直接マウスやキーボードを繋いでもいいんだけど、SSH とか VNC とかを使えるようにしたほうが後々楽だと思うので左上の Preferences(うろ覚え)から設定しておく。
ラズパイ上で動かすなら Apache なの?Nginx なの?と迷った挙げ句、自分が文字通りチョットワカル方なのが Nginx なので Nginx にした。ちなみに Apache 全くわからない。
sudo apt install nginx
デフォルトでサービスが動いてるのでそのままブラウザから http://localhost に行けば Welcome to Nginx(うろ覚え)みたいなのが出てくるはず。もちろん同じ Wi-Fi に繋いでいる端末からアクセスすることもできるので念の為自分のローカル IP アドレスをチェックするコマンド(のうちの一つ)もここに書いとく。
hostname -I
http://192.168.1.xxxにアクセスできたら何もしない立派な Web サーバーができたことがよく分かる。
とりあえず Nodejs が動くように nodejs と npm をインストールする。(参考)
curl -sL https://deb.nodesource.com/setup_14.x | sudo bash -
sudo apt install nodejs npm
いろいろあると思うけど n だと何故か動かないみたいなのを見たのでそのまま行くのが無難だと思う。 node 環境が出来たら Hello, World!なレスポンスをくれるバックエンドを書いてサーブする。
Express 公式に載ってる Hello World プログラムを参考にしてもいいかも。というか正直動けばなんでもいい。
Nodejs はポート 3000 で動いてるので http://localhost:3000 に行けばアクセスできるはず。
でもこのポート 3000 いちいち書かずに localhost(ポート 80)にアクセスできたらもっといいよねえということで Nginx でリバースプロキシを設定する。Nginx 公式サイトを参考に/etc/www/sites-enabled/default で proxy-pass をいじる。default ファイルを変えたあとに nginx を再起動するのも忘れずに。
これで http://localhost に Hello, world が現れたので立派な Web サーバーになった。
ここでやっと「あれ?ラズパイってただの Linux マシン機では?」と気づく。これではまずい。たしかに自宅サーバーは欲しいけれどもっと電子工作っぽいことがしたい!ということでパーツを買いに行くことにした。
ラズパイのケースは 3D プリンタで刷ったし、ファンが 5 ユーロとかしたので AliExpress から注文することにした。まあこの辺は最重要でもないけど普通にファン付きのケースとか買っておくのが良さそう。
電子工作初心者なら一度は通らないといけない気がする LED チカチカ!ピンと繋げてわやわやして初めて電子工作っぽい部分が(理解できるわけじゃないけど)わかった。物理で回路図は見たことあっても実際にごちゃごちゃしたピンとケーブルで指示通りに回路を作るのって案外難しい。少なくとも電子工作ド素人にとっては「抵抗どこにおくの?」「そもそもどことどこが繋がってるの?」みたいな状態になった。
プログラムは W3Schools のデモを借用するだけで LED チカチカする。もちろん回路が正しければ、の前提だけどこれだけでかなり感動する。兄は抵抗挟まなかったら焼けたらしいけどわたしは抵抗挟まなくても普通に動いた。一応あとから 100Ω の挟んだけど。コードもかなり読みやすいのでこれをいじってsetTimeout
で何秒後につけるを設定したりsetInterval
の感覚を縮めたりちょこっといじってみるのも楽しいかもしれない。
さっき書いたバックエンドサーバーと LED チカチカプログラムを組み合わせて/light/1/on で1つ目の LED をつけて、/light/2/off で 2 つ目の LED を消すようなスマートホームのチュートリアルみたいなものを作ってみる。あまりに内容が薄いので割愛するけど、これだけでもうスマートホームって感じなので Apple Home、Alexa などなどなんでも繋げるようになるらしい。やってないけど。
pigpio というパッケージの例を LED チカチカプログラムと同じノリで動かす。なんか回路がだいぶ複雑になったせいで普通にあれ?わからん?となってパートナーを呼んで少し手直ししてもらったのは秘密にしといたほうがいいかも。冷静になれば真似するだけでできるんだけど、とりあえず 1000Ω のを 2 つ挟んでおいた。そのままプログラムを実行するとセンサーからの距離を 1 秒毎に出力してくれる。これだけで「Future…」という気持ちになった。
LED と超音波センサのプログラムを混ぜて近づくと LED が光るようなプログラムを書いた。IoT 完全に理解した天才の気持ちになるが基本部分はコピペである。ちょっと発展して 1 秒かざすと光るプログラムも書いたので、スマートホームで使うであろう 1 秒かざしたら何かが動く仕組みに転用できると思う。コピペ最高。
ここまで SSH だけの自力でやったけど、チュートリアル以上のものを作るなら普段使ってるマシンから全部操作したいので Ansible で自動化することにした。Ansible プレイブックを使ってぽちっとやるだけで動くようになった。とはいえ 1 時間ちょろっとスクリプトを書いたところでバグも多いし一部 SSH で人力舌部分もある(そもそもラズパイのネット速度があまりにも遅すぎて切れたりした)し、つまり完成してないしたぶんこれからも完成しない。スクリプトをコピーして実行できるし Nginx のインストールや default ファイルの変更(リバースプロキシ)できるし、やりたいことは大体ボタン一つで動くので自分で遊ぶ分には十分だと思う。いいエンジニアは最初から Ansible から操作したほうがいい気もするけれど、ラズパイ上で動かすのもそれはそれでラズパイを触ってる感じがして良いという意見もここに書いておく(?)
基本的にコピペで済むようになっているので、普通に 3 時間もあれば余裕で全部できると思う。(わたしはインターネットトラブルも挟んだのでなんやかんや 6 時間ぐらい遊んでた)感想は一言ですごい。ラズパイがあればなんでもできる。これからスマートホームのためにいろいろ計画するのが楽しみだし、来月には Arduino も届くはずなのでアナログ信号とうまくラズパイを組み合わせてかっこいいことしたい。ラズパイ本体はあまり優しくない値段だったけど、ラズパイでできる夢は無限大。一年後に家を全部 Web アプリで管理するのが目標なので頑張れわたし。