ジャンクや中古パーツで自作PCを作ってみた-その1-

昔から自作PCに憧れがありました。自分でこだわってパーツを用意してそれを合わせることで自分好みのPCができるのって素敵ですよね。

とはいえいきなり新品のパーツを組むのは失敗したときにすごい損する気がします。

なので中古やジャンクのパーツを集めれば格安で自作PCができて壊れても安心です。

物色

というわけで大須の中古PCショップのパウに行ってきました。

pcshop.jpn.com

電子工作部品を買い集めていたときに偶然見つけたのですが、土日に行くとCPUガチャをやっていて名古屋のPC好きにはたまらないお店だと思います。

ちなみに店舗が入居しているアメ横ビルにはツクモも入っているので新品のPCパーツを求めているならそっちに行くのがいいです。

で、パウであれこれパーツを物色した結果最初の自作PCなので確実に動かす動作確認済みの中古のマザボとCPUとメモリを最初に買いました。

こうやって見ると思ったより値段がかかりましたね。まぁ初めてPC組むくせにi7使うのもどうかなとは思いましたがガラスケースに置かれてたCPUを見てたらつい惹きつけられたんですよね…

そしてメモリーも便乗していいヤツを選んでしまいました。

ジャンクセールで爆買い

当然ですがこれだけではまだPCが動かなくて後は電源を用意すればBIOSは開けます。

というわけでまた物色に行こうと思ったのですが、ちょうど先日パウでは年に一度(?)のジャンクセールが開催されました。

paw.stws.co.jp

他のパーツはどうせならここで買うか!ということで張り切ってジャンクセールに出向きましたがものすごい人だかりでした。

このご時世にはよろしくない景色ですw。

もしかしたら掘り出しものに出会えるかもしれないと思い2日間通いましたが、なんとか電源を入手できました。

そしてタイムセールにつられてSATAケーブルとHDDも買い占めました。

このツイートに載せているのはほんの一部でこの他にもグラボも買いました。

そんな苦労もあってなんとかPC動かすための最低限の用意は整いました。

組み立て

パーツも揃ったところで組み立てを始めていきます。

今回の目標としては最小構成で組み立ててBIOSが起動できることにします。

使うパーツはこんな感じです。

  • CPU:Intel Core i7 2700K
  • CPUファン:Intel純正
  • マザボ:ECS H61H2-M2
  • メモリ:ADATA 8GB×2
  • 電源:POWER MAN IP-S300CQ2-0

使うCPUやマザボによっては内蔵グラフィックがないので画面表示のためにグラボが必要だったりしますが、今回は特に気にする必要はなさそうです。

まずはCPUを取り付けます。CPUの両脇にあるくぼみとソケットの突起をあわせてそっと乗せるだけです。

f:id:KMiura:20210707010550p:plain

後はCPUカバーを取り付けてグリスを塗りたぐります。

ちなみにこのグリスはパウのガチャガチャでゲットしたもので、グリスを塗るための指サックもついてるお得なやつです。

グリスは使い切りタイプなので、頻繁にPC組み立てることがなければこれで十分でしょう。

f:id:KMiura:20210707011035p:plain

グリスを塗ったら上からCPUファンをかぶせます。CPUファンって固定するとき結構クセがありますよね。

f:id:KMiura:20210707011340p:plain

モリーを挿します。最大で2本挿せますが、動作確認用にとりあえず1本だけ挿してみます。

f:id:KMiura:20210707011615p:plain

今回は基板むき出しの状態で動作確認をするので、電源を入れるときはフロントパネルの電源ピンをショートさせる必要があります。

というわけでマニュアルでピン配置を調べて電源ピンにあたる箇所にジャンパーケーブルを挿しました。

www.manualslib.com

これで電源を入れるときの目印にもなってだいぶ楽になりました。

f:id:KMiura:20210707012126p:plain

後は電源を諸々の端子に接続して完成です。

f:id:KMiura:20210707012225p:plain

いざ動作確認

組み立てが終わったところでモニターをつないで動作確認です。

が、全く動かない…

何度か起動し直してみましたがだめでした。

何が原因あるんだろう…と思いながらその日は一旦切り上げました。

原因を探る

後日何が原因か考えてみましたが、いくつか心当たりがありました。

  • CPUクーラーがちゃんと固定されていない
  • メモリがちゃんと挿せてない
  • メモリが不足(一本でも動かせていたっぽいから多分違う)

CPUクーラが刺さってないせいでCPUが冷却されなくて熱暴走をおこしたと考えることもできますし、メモリも奥まで挿せてなかったのも考えられます。

メモリは1本でも動かせますが、もしかしたら指す位置が違ってて動かせなかった可能性もあるので保険でもう1本挿しました。

再度確認

とりあえず考えられる原因を解消して再度セッティングをしました。

これが動かなかったらどうしよう…と思ってドキドキしながら電源を入れました。

すると、無事に起動して画面が表示されました!

とりあえずすぐに解決するような問題でよかったです。

そして時計は狂ってましたが、現在時刻に直せば大丈夫そうでした(次に狂ってたらボタン電池交換したほうがいいかな…)

これで自作PCづくりの第一歩を踏み出せた気がします。あとは、ストレージを載せてケースに収納すれば実用性のあるPCの完成です。

ケースはまだ買ってませんが、どうせなら中古で良さそうなやつを探そうと思います。

つづく

【続きはこちら】

supernove.hatenadiary.jp

SORACOM ArcでiPhoneをつないでみた

前回SORACOM Arcを使ってWifi経由でRaspberry PiをSORACOMのプラットフォームに接続してみました。

supernove.hatenadiary.jp

これで、SIMがなくてSORACOMを試せないという課題を解消できました。

がまだまだ課題があります。

それはRapsberry Piやセンサーを誰もが持っているわけではないということです。IoTに興味があってもなかなか始められない…という人たちもいるわけなのでそれを解決せねばなりません。

そうは言ってもIoTでセンサーがなければ意味がないといえばそれまでですけど、今どきセンサーだって仮想で作ることは出来てしまいます。

そして、その仮想センサーを手元のスマホで動かして仮想IoTデバイスに見立ててれば物理センサーがない問題を解決してシステムの全体像を理解しやすいわけです。

というわけで今回はSORACOM Arcを利用してiPhoneをSORACOMのプラットフォームに接続する方法を試してみます。

用意するもの

バーチャルSIMの作成

前回Rapsberry Piで試したときにはsoratunを使ってバーチャルSIMの作成が出来ましたが、今回はスマホで使うバーチャルSIMを用意するためSORACOMのコンソールから操作をしていきます。

始める前にSIM管理画面が以下の表示になっている場合はWiregruadの接続情報を登録するときに面倒なので、新しい画面に切り替えておきましょう。(以降の作業は新しいSIM管理画面に対応しています)

f:id:KMiura:20210627201206p:plain

ユーザーコンソール画面からSIM登録をクリックします。

f:id:KMiura:20210627184032p:plain

バーチャルSIMを登録タブをクリックして、登録ボタンをクリックします。

登録の前に画面の注意事項はよく確認しましょう。

f:id:KMiura:20210627185224p:plain

登録を終えたらSIM IDとWiregruadの接続情報が表示されます。

この中のPrivateKeyはSIMを作成したときにだけ確認できるので、Wiregruadの接続情報はどこかにメモしておきます。

コピーを終えたら終了して元の画面に戻るをクリックして登録を終えます。

f:id:KMiura:20210627195534p:plain

iPhoneをSORACOMのプラットフォームへ接続

WireGuardクライアントをインストール

これで接続情報を用意できたのでiPhoneに接続するための準備をします。

以下のリンクからWireGuardのクライアントをお使いのOSに合わせてインストールします。

www.wireguard.com

WireGuardアプリを起動するとトンネルの追加ボタンで接続情報を登録することができます。

f:id:KMiura:20210627213101p:plain

登録方法はいくつかありますが、iPhoneで設定を登録するときに一番簡単な方法はQRコードを読み込んで登録する方法です。

ただ、今はそのQRコードがないので今度はそのQRコードを作っていきます。

QRコードを作成

それではQRコードを作成するために以下のサイトを使います。

www.the-qrcode-generator.com

FREE TEXTタブをクリックして先程メモした接続情報を貼り付けます。

すると接続情報が書き込まれたQRコードが生成されます。

f:id:KMiura:20210627214844p:plain

iPhoneに接続情報を登録

WireGuardアプリを起動してトンネルの追加ボタンをタップしてQRコードから作成からQRコードリーダーを立ち上げます。

f:id:KMiura:20210627215323p:plain

QRコードリーダーで先程作成したQRコードを読み込むと以下のダイアログが表示されるので接続設定を管理できるように任意の接続名を設定します。

f:id:KMiura:20210627215819p:plain

設定後VPNの構成を追加するか聞かれるので許可をタップします。

f:id:KMiura:20210627220232p:plain

しばらくしたら接続設定の一覧に先程設定した接続が表示されていたら設定は完了です。

後は使いたいときに設定を有効にすればSORACOMのプラットフォームに接続できるようになります。

接続確認

いよいよ接続確認です。接続確認は例の如くping pong.soracom.ioを叩くのですが、iPhoneなのでコマンドが叩けません。

そこでiPhonepingを実行するアプリをダウンロードします。

色々ありますが、今回は「Network Ping Lite」をダウンロードします。

Network Ping Lite

Network Ping Lite

  • MochaSoft
  • ビジネス
  • 無料
apps.apple.com

ダウンロードしたら、起動画面からpingをタップしてデフォルトで設定しているアドレスを消してpong.soracom.ioに書き換えてstartをタップします。

実行後以下のようにSORACOMのプラットフォームからの応答があれば無事にSIMを使わずにiPhoneをSORACOMのプラットフォームに接続できています。

f:id:KMiura:20210627222504p:plain

まとめ

今回はSORACOM Arcを使ってiPhoneをつないでみました。

これでスマホで仮想のIoTデバイスを用意してIoTシステムのプロトタイピングを加速します。

これでSORACOMを使ったオンラインハンズオンでデバイスが手元にない問題が解決することは間違い無いでしょうね。(なんかのフラグかなw)

SORACOM ArcをRaspberry Piで試してみた

先日ソラコムのカンファレンス「SORACOM Discovery 2021」にて非常に素敵な新サービスが発表されました。

その名もSORACOM Arc

blog.soracom.com

今までのSORACOMを使ったIoTシステム開発ではSORACOMが提供するSIMカードやデバイスありきでIoTシステム構築をする必要がありました。

ところが、このSORACOM Arcを使えばそのようなデバイスがなくてもWifiや有線経由でSORACOMのシステムにアクセスすることができるようになります。

つまり、手元にあるデバイスをSORACOMのシステムと連携させてIoTのプロトタイピングを簡単にするということなんです!

もうSORACOMのSIMを注文を待って技術検証する必要がなくなるわけですね。

というわけで今回はリリースしたばかりのSORACOM ArcをRaspberry Piで使えるようにセットアップして動かしてみました。

用意するもの

soratunのインストール

まずは、soratunをインストールします。

soratunを使えばバーチャルSIMの作成から接続までのサポートを行うクライアントエージェントです。

以下のダウンロードページの中でRaspberry Pi向けの実行ファイルをダウンロードします。

[vesion]はダウンロードするバージョンによって異なります。

ダウンロードするファイル名は、soratun_[version]_linux_armv7.tar.gzです。

github.com

ダウンロードするファイルのリンクをコピーして以下のコマンドを実行します

wget https://github.com/soracom/soratun/releases/download/v[version]/soratun_[version]_linux_armv7.tar.gz

ダウンロードしたtar.gzファイルを以下のコマンドで展開します。

tar xvf soratun_[version]_linux_armv7.tar.gz

展開したフォルダ内にあるsoratunの実行ファイルをシステム上のディレクトリにコピーします。

sudo cp soratun_[version]_linux_armv7/soratun /usr/local/bin/

これでインストールは完了です。あとは以下のコマンドを実行してエラーが出ずにsoratunのヘルプが表示されたらコマンドが正常に機能しています。

soratun --help

ブートストラップ

さて、soratunのインストールを済ませたら今度はsoratunでSORACOMのサービスに接続するためにブートストラップを行います。

ブートストラップとはバイス側から新しいバーチャル SIM/Subscriber を作成することを指します(ドキュメントからまんま引用)。

ブートストラップを行うには3つの方法がありますが、今回はSIMがなくてもできるSORACOM API の認証キーを使用したブートストラップをやってみます。

SAMユーザを作成

SORACOMのユーザーコンソールを開き右上のアカウントのボタンをクリックしてセキュリティをクリックします。

f:id:KMiura:20210626013458p:plain

SORACOM Access Management (SAM) ユーザーの一覧ページがあるので、新規でSAMユーザーを作成します。

f:id:KMiura:20210626013929p:plain

名前と概要の設定が出てきますが、ここは適当なものを設定します。迷ったら下記のやつを真似してもOKです

f:id:KMiura:20210626112929p:plain

作成できたら今度はSAMユーザーにアクセス権限や認証キーを設定します。

先程作成したSAMユーザーをクリックして、ユーザー権限の設定画面を開きます。

f:id:KMiura:20210626113522p:plain

権限設定

権限はドキュメントにあった以下の最低限の構成をコピペします。

右側のドキュメントには用途に応じた権限のテンプレートがあるようですが、いつかArcのテンプレも追加されるといいですね

{
  "statements": [
    {
      "api": ["Sim:createSim", "Sim:createArcSession"],
      "effect": "allow"
    }
  ]
}

以下のように設定できたら保存ボタンをクリックして設定を保存しちゃいましょう

f:id:KMiura:20210626114614p:plain

認証設定

今度は認証設定を行います。

認証設定タブをクリックして認証キーを生成をクリックします。

f:id:KMiura:20210626114948p:plain

クリックされると以下のダイアログが出ます。ダイアログの注意にもある通り、認証キーシークレットは一度ダイアログを閉じると再確認出来ないので、クリップボードにコピーをクリックして手元にメモしておきましょう。

ちなみに、クリップボードにコピーされた文字列はコンマ区切りなので、ファイルで保存するときにはCSV形式で保存すると後で見やすくなります。

f:id:KMiura:20210626115818p:plain

ブートストラップの実行

SAMユーザーを作成したところでブートストラップを実行します。

ブートストラップは以下のコマンドで実行します。

arc.jsonとはSORACOM Arcの設定ファイルでブートストラップを実行したときに作成されます。

SAMユーザーを変更するようなことがなければこの作業は1回だけやれば良さそうです

soratun --config ~/arc.json bootstrap authkey

コマンドを実行するといくつか質問が来ます。

最初の質問では認証キーIDを入力します。認証キーIDはkeyId-から始まる文字列です。

✗ SORACOM API auth key ID (starts with "keyId-"):

次の質問では認証キーシークレットを入力します。認証キーシークレットはsecret-から始まる文字列です。

✗ SORACOM API auth key (starts with "secret-"):

今度はバーチャルSIMを作成するカバレッジを選択します。今回はJapan coverageを選択します。

Use the arrow keys to navigate: ↓ ↑ → ←
? Coverage to create a new virtual SIM:
  ▸ Global coverage (g.api.soracom.io)
    Japan coverage (api.soracom.io)

実行後に以下のようにバーチャルSIM IDができて、arc.jsonの保存先のパスが表示されたらブートストラップは完了です。

Virtual subscriber SIM ID: 1234567890
Created/updated configuration file: /home/pi/arc.json

接続確認

それでは接続確認です。soratunを使ってsoracomのプラットフォームに接続するには以下のコマンドを使います。

sudo soratun --config ~/arc.json up

実行するとログが表示されるので、ちゃんと接続できるか別ターミナルで以下のコマンドを実行します。

ping pong.soracom.io

無事に応答が返っていればSORACOMのプラットフォームに接続出来ています。

systemdを使う

ここは必須ではありませんが、Raspberry Piを立ち上げたときにSORACOMの接続をするためには、systemdを使う方法があります。

そしてそのserviceファイルはなんと先程ダウンロードしたsoratunの実行ファイル一式の中のsoratun_[version]_linux_armv7/soratun.service.sampleに入っています。

なので、以下のコマンドでserviceファイルを保管しておきます。

sudo cp soratun_[version]_linux_armv7/conf/soratun.service.sample /etc/systemd/system/soratun.service

あと、設定ファイルの内容に合わせてarc.jsonも以下のコマンドでコピーしておきます。

sudo cp arc.json /etc/

以下のコマンドでsoratun.serviceを立ち上げます。

sudo systemctl start soratun.service

立ち上げた後にping pong.soracom.ioを実行してシステムから応答があればサービスは正常に起動しています。

この時点でバックグラウンドで起動しているのでこの先の作業はターミナル一つだけでできるようになります。

Raspberry Piの起動時にsoratunを立ち上げるには以下のコマンドを実行してデーモンに登録します。

sudo systemctl enable soratun.service

センサーデータを送信する

これでSIMを使わずにRaspberry PiをSORACOMのプラットフォームに接続ができるようになりました。

ということでここからRaspberry Piでとったセンサーの値をSORACOM Harvest Dataに送信してみます。

SIMグループの作成

SORACOMのコンソール画面にあるSIMの一覧で先ほど作成したバーチャルSIMには名前が何もありません。

なので作業するときにSIMの管理をしやすくするために名前をつけておきましょう。

名前の項目にマウスカーソルを当てると名前が設定できるようになるので、そこで変更が出来ます。

f:id:KMiura:20210626223833p:plain

これでSIMの名前を変更したのでここからSIMグループを作成します。

SIMの一覧画面から先程作成したバーチャルSIMを選択して詳細ボタンをクリックします。

f:id:KMiura:20210626225824p:plain

SIMの詳細画面が開くのでグループのセレクトボックスから新しいグループを作成をクリックします。

f:id:KMiura:20210626230740p:plain

グループ名の入力が要求されるので任意の名前を設定します。

f:id:KMiura:20210626231235p:plain

作成が完了してグループ名に設定した名前が表示されたらグループの作成は完了です。

f:id:KMiura:20210626232026p:plain

SORACOM Harvest Dataを有効にする

作成したSIMグループでSORACOM Harvest Dataを使えるように設定します。

Menu → SIMグループから先程作成したSIMグループを選択してSORACOM Harvest DataをONにして保存します。

f:id:KMiura:20210626234335p:plain

センサーの接続

Grove Base HATをRaspberry Piに取り付けたら、温湿度センサーは12, 11ピンに接続します。

f:id:KMiura:20210627023753p:plain

プログラムの作成

次にRaspberry Piでセンサーの値をHarvestに送信するプログラムを用意します。

以下のコードをRaspberry Pi上の任意のディレクトリに保存します。

# coding: utf-8

import time
import seeed_dht
import requests

sensor = seeed_dht.DHT('11', 12)

while True:
    humi, temp = sensor.read()
    if not humi is None:
        print('Humidity: {0:.1f}%, Temperature: {1:.1f}'.format(humi, temp))
        data = {'Humidity': humi, 'Temperature': temp}
        res = requests.post('http://harvest.soracom.io', json=data)
        print(res.status_code)
    else:
        print("None")
    time.sleep(30)
  

このプログラムを実行するときに使うライブラリを以下のコマンドでインストールします

sudo pip3 install seeed-python-dht

動作確認

いよいよ動作確認です。以下のコマンドで先程作成したプログラムを起動します。

python3 send_harvest.py

実行後、センサーの値が表示されてステータスコード201と表示されていたらSORACOMにデータ送信は出来ています。

ちゃんとデータが保存できてるか確認

それではちゃんとデータが取れているかを確認してみます。

コンソール画面のSIM一覧からSIMを選択して、操作 → データを確認で開きます。

f:id:KMiura:20210627022141p:plain

以下のようにデータの確認画面が表示されてセンサーデータのグラフが表示されたらデータが正常に保存されています。

f:id:KMiura:20210627022946p:plain

まとめ

今回はSORACOM Arcを使ってRaspberry Piからセンサーの値を送信してみました。

SORACOM ArcはSORACOM Discoveryでも話していた「IoTの民主化」を体現された究極のサービスと言っても過言ではありません。

そしてsoratunを使えば面倒な通信の設定がコマンド操作だけであっという間に終わってしまうのでめちゃくちゃ便利です。

これさえあればSORACOMのサービスと連携したIoT開発がより手軽になって「IoTの民主化」がさらに加速していくことでしょう!

AWSのLightsailを使ってドメインを設定してみた

以前Lightsailを使ってVPNサーバーを用意しました。

supernove.hatenadiary.jp

あれから数ヶ月経ち結局Clubhouse自体起動することもなくなってもう使うことがなくなったので、この時作ったVPNサーバーは削除しましたw。

で、最近とある案件でアプリを作成することになりそれを公開できるようにしようと考えて、いつもならHerokuを使うのですがなんとなくルーティンになってつまらない気がしました。

せっかくならAWSを使って、本格的なシステムのWebアプリケーションを作ってみたいと思ったわけです。となるEC2かな?となりますが、なんかハードルが高いし個人で運用するには見積もりがめんどくさそう…

そこで再びLightsailの出番です。Lightsailなら定額でアプリを運用できるので、個人開発で本格的なWebサービスを公開するには丁度いいです。

でサーバーの選定はこれで解決できますが、サービスを公開するために必要なのがアプリにアクセスするためのドメインです。

流石にサーバーのポート番号をそのまま公開するのは、その後の管理が辛いですしあまり聞きません。なのでDNSを使って独自でドメインを指定したいわけです。

AWSのサービスを使ってドメイン周りの設定だとRoute53が使われますが、LightsailにはDNSを管理する機能があり、それを使えばLightsailのインスタンスと接続するのが簡単にできます。

というわけで今回はLightsailを使ってドメインを設定してみたいと思います。

ドメインの取得

まずは今回使用するドメインを取得します。今回は無料でドメインを取得できるfreenomを使っていきます。

このサービスはオランダで提供されているドメインを発行するサービスです。

ドメインでよく使われるトップレベルドメイン.com.netのものは有料ですが、それにこだわらなければ無料で作れます。

有効期限は1年ですが更新手続きをすれば簡単に更新できます。

以下のリンクから使いたいドメインで検索していきます。このときはログインをしなくても大丈夫です。

www.freenom.com

以下のスクショのように使いたいトップドメインを含めてドメイン検索をするとドメインを選択出来るようになります。

取得できるドメインであれば【チェックアウト】ボタンをクリックします。ここでログインをしてチェックアウトします。

アカウントを作成していない場合はここでアカウントを作成した後にチェックアウトします。

f:id:KMiura:20210613235705p:plain

ドメインの設定

ドメインを取得出来たらここからLightsailでの作業になります。

前提条件として予めlightsailでnginxなどでWebサーバーの設定ができている状態だとします。

はじめ外部に公開するための静的IPを作成します。

Lightsailの【ネットワーキング】タブをクリックして、【静的IPの作成】をクリックします。

f:id:KMiura:20210614001800p:plain

任意のリソース名を設定して【作成】をクリックします。

作成後にアタッチしたいインスタンスを選択します。

f:id:KMiura:20210614002152p:plain

続いてDNSゾーンを設定します。

同じく【ネットワーキング】タブから【DNSゾーンの作成】をクリックします。

f:id:KMiura:20210616003351p:plain

登録済みドメインに先程freenomで取得したドメインを記入します。記入したら一番下にある【DNSゾーンの作成】をクリックします。

f:id:KMiura:20210616003831p:plain

ゾーンが作成されたらDNSレコードを設定します。

サブドメインには任意の名前、解決先は先程作成したインスタンスの静的IPを選択します。

f:id:KMiura:20210616005016p:plain

DNSレコードの下に書かれた4行のネームサーバーは次のfreenomの設定で必要になるので、どこかにメモしておきます。

DNSサーバーの登録

再度freenomを開き、「services」→「My Domains」で取得したドメインが出てきます。

取得したドメインの「Manage Domain」でドメインの設定画面を開きます。

f:id:KMiura:20210616011722p:plain

「Management Tools」→「Nameservers」をクリックします。

f:id:KMiura:20210616011739p:plain

Use custom nameservers (enter below)を選択して先程メモしたDNSサーバーを選択して【Change Nameservers】をクリックします。

f:id:KMiura:20210616012435p:plain

これでドメインの設定が完了しました。あとはDNSレコードで設定したドメインをNginxなどのWebサーバーシステムに適用すれば、そのドメインWebサービスに接続できるようになります。

obnizとNode-REDで自作スマートロックを作ってみた

スマートロック、便利ですよね。

最近では家で簡単に取り付けれるものが増えてきて価格もお手頃になりました。

ただ、こういうシステムっていざ買ったら全然サイズ合わなくて使えなかったって話をよく聞きますよね(僕も何度かそんな経験してます…)

それだったら最初から自分で作ったほうがいいじゃないって思ったわけです。

というわけで今回は家のスマートロックを作ってみました。

実は数年前から構想はあったのですが、やれずじまいでした。

ですが、今回は舞台が整ったので実行にうつします。

用意するもの

obnizが6000円ほどしますが、他を揃えても大体1万円前後で作れると思います。

僕はobnizを人からもらったのでobnizがタダになって、綿棒ケースとかサーボモータやモバイルバッテリーは家にあるものを使ったので、実際はつまみ回す器具を3Dプリンターで出力するのにお金を出費した程度なのでかなり安く作れたと思います。(3Dプリンターの出力はだいぶ前で覚えてないので実質タダで構築したようなものw)

配線

配線は以下の図のとおりです。

f:id:KMiura:20210519221613p:plain

プログラム

ソフトはNode-REDを使いました。

obnizのAPIを叩くノードも使えますし、UIもダッシュボードを使って簡単にできるのでNode-REDだけでシステム構築ができるわけです。

何よりエッジ側に何もプログラムを書かなくてもいいのはいいですね。

そして実際用意したフローはめちゃくちゃシンプルです!

f:id:KMiura:20210519214410p:plain

予めダッシュボードノードとobnizノードを用意しておきます。

obnizノードについてはこちらのブログで紹介しています。

supernove.hatenadiary.jp

obniz functionノードには以下のコードを使用します。

// サーボモータを動かす
var servo = obniz.wired("ServoMotor", {gnd:0, vcc:1, signal:2});
servo.angle(msg.payload);

// ディスプレイに状態を表示
var status = msg.payload == 85 ? 'Close' : 'Open'; 
obniz.display.clear();
obniz.display.print(status);

組み立てと取り付け

サーボモーターに付属しているパーツとツマミ回す器具をホットグルーでくっつけて後は綿棒ケースの底にサーボモータを差し込む穴を用意してネジで固定すれば組み立ては終わります。

後はドアに諸々を取り付ければ完成です。

見た目が凄くダサいw。

f:id:KMiura:20210519223135p:plain

動作チェック

実際に動かしてみました。

サーボのトルクが心配でしたが、歯車がギシギシ言わずかなりスムーズに回ってくれました!

課題

実際に一日動かしてみて課題に感じたことをピックアップします。

綿棒ケースが外れる

これはサーボモーターとケースそのもの重みで下に落ちてしまうんですね。

なのでここは4箇所テープを貼って更にその周りを囲むように厳重に固定して落ちないようにしました。

つまみを回す器具が外れている

何度か使っていると気づいたらつまみが外れているせいで鍵が開かないことがありました。

これも上のように綿棒ケースが外れることでサーボモーターが回るのと同時に器具が外れてしまっていました。

なので綿棒ケースを厳重に固定したら外れることはなくなりました。

サーボモータが回らなくなる

綿棒ケースがしっかり固定されているのにも関わらずサーボモータが回らなくなるんですね。

これはError: No More pwm Available.と表示されてサーボモータが制御不能になるっぽいです。

これはESP32に切り替えたほうがいいのかな…なんて思っていましたが、ドキュメントを見ているとPWMを切るメソッドがあるようです。

obniz.com

これを入れればいいと思ったのですが、obniz Functionで書いたコードは非同期で動くのでサーボモータが動く前にPWMが切れてしまいます。

そこで、obnizのwait関数を使ってサーボモータの動作が終わるまで処理を待つようにしてみました。

obniz.com

これらを踏まえて先程のfunctionノードのコードを修正したものがこちらです。

// サーボモータを動かす
var servo = obniz.wired("ServoMotor", {gnd:0, vcc:1, signal:2});
servo.angle(msg.payload);

// PWMを切る(New)
await obniz.wait(500);
servo.off();

// ディスプレイに状態を表示
var status = msg.payload == 90 ? 'Close' : 'Open'; 
obniz.display.clear();
obniz.display.print(status);

これで一連のフローが終わるとPWMがリセットされるので、サーボモーターの動作が安定するわけです。

まとめ

今までずっとやろうとしていたスマートロックをついに完成させました。

実際使ってみたからわかる課題があってそれを解決して今の所動作が安定するようになりました。

改めて作って動かしてみないとどこが行けないのかがわかるのはとてもいいなと思いました。

あとは家族が不安がっているので安心できるように安定動作できるようにしていきたいですね。

1週間M1 Macを使い続けた結果…

この記事はM1Mac触ってみたの7日目のエントリです

さて、今日は誕生日です。毎年子供の日に一つ歳を取る日々を送っております。

今日は天気が悪くておとなしく家でひたすらコード書いていました。

さて、M1のMacBook Airが届いて1週間が経ちました。

supernove.hatenadiary.jp

supernove.hatenadiary.jp

supernove.hatenadiary.jp

この1週間新しいMacBook AirをメインPCとして使っていての感想ですが…

すげー快適!!

もうこの一言につきます。最初は悪い話しか出てこなくてこれは買うべきか迷う…

なんて思っていましたが、つかってみるとかなり快適に使うことができて先代のMacBook Airとは比にならないぐらいパワフルなPCでした。(まぁ先代は9年前のモデルなので比べるのが野暮な気もしますがw。)

少なくともMacBook Proを買わなくて正解だったと思います。

パフォーマンス面

Chromeでタブをたくさん開いても動作がもっさりすることなくYouTubeもしっかり動きました。

更にDockerを長時間動かし続けていても動作が安定していました。

なおかつパソコン本体が熱くなることなく安定して動作していました。

CPU使用率もだいたい30% を切るぐらいで安定しているのはいいですね。

ただ、メモリーChrome&Dockerを動かして7割近くですが普段開発する分にはそんなに困らないかなと言う感じです(今のところは)

気になるところ

ただひたすら「MacBook Proはいいぞ」といってましたが、気になることがあるとすればBluetoothの接続が不安定です。

これは、仕事で使っているIntel MacでもそうですがAppleBluetoothに弱いのかなというのが気になりました。

ただ、つかっているフルワイヤレスイヤホンが安物だからそっちにも原因がある気がしますね…

それ以外は特に気になることはないので、MacBook Airを買ってよかったと思います。

M1 MacでDocker動かしてみた

この記事はM1Mac触ってみたの5日目のエントリです(3, 4日目は別ネタにするかスキップしますw)

MacBook Airが届いてセットアップができたので動作検証も兼ねて開発環境を整えて開発作業をしてみました。

supernove.hatenadiary.jp

supernove.hatenadiary.jp

最近自分でWebアプリを開発するときには、もっぱらDockerで環境構築をして仮想環境上で開発をすることが多いです。

特にDB周りはコンテナでまとめたほうが作り直しや掃除が簡単なので、めちゃめちゃ重宝してます。

そんなDockerですが、先日M1 Macで正式にサポートされるようになりました

forest.watch.impress.co.jp

これもあったのでM1のMacを買っても大丈夫だろうと革新をしていたわけです。

というわけで今回はM1 MacにDockerを入れて動かしてみたのでそのレビューです。

インストール

インストールは以下のURLからできます。

www.docker.com

ダウンロードボタンにカーソルを当てると各OSに合わせたインストーラーを選択できるようになっているのでDownload for Mac - Apple Chipを選択してダウンロードします。

f:id:KMiura:20210503154853p:plain

ダウンロードしたインストーラでインストールします。

とりあえず動かしてみた

ダウンロードが終わり初回起動すると出てくるコマンドを実行してみます。

docker run -dp 80:80 docker/getting-started

ブラウザでlocalhostを開くとページがちゃんと開きました。

f:id:KMiura:20210503162153p:plain

開発環境を構築してみた

以下のコンテナを組みわせてDjangoの環境構築を構築してみました。

本当はMySQLを使おうとしましたがAppleシリコンだとオプションを入れてセットアップしないといけないっぽいので面倒だと感じたのでAppleシリコンでも使えるmariadbで代用しました。

設定やポートはMySQLと同じものが使えたので良かったです。

構築はdocker-composeをつかってやってみました。

参考までにyamlファイルはこんな感じです。

version: '3' 
services:
  db:
    image: mariadb:10.1
    ports: 
      - "3306:3306"
    environment:
      MYSQL_DATABASE: app-db
      MYSQL_ROOT_USER: root
      MYSQL_ROOT_PASSWORD: admin
      TZ: 'Asia/Tokyo'
  
  app:
    build: .
    command: python3 manage.py runserver 0.0.0.0:8000
    volumes:
      - ./app:/code
    ports:  
      - "8000:8000"
    depends_on:
      - db

後、アプリ側のDockerfileはこんな感じです。

# syntax=docker/dockerfile:1
FROM python:3
ENV PYTHONUNBUFFERED=1
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/

これらを用意してdocker-compose buildしてからdocker-compose upすると普通にアプリが起動できました。

ただ、これはDockerの挙動が原因かコンテナの挙動が原因かわかりませんが、アプリの動作が重く感じました。

リクエスト投げてもレスポンスが遅かったのが気になりました。

Djangoを使っているので仕方ないのかもしれませんね…

まぁあくまで開発環境なのでそこまで気にすることではないかと(と信じたい)