編集履歴一覧に戻る
Kodaのアイコン画像

Koda が 2021年05月16日23時58分52秒 に編集

初版

タイトルの変更

+

データをインテリアにする

タグの変更

+

obniz

+

サーボモーター

メイン画像の変更

メイン画像が設定されました

記事種類の変更

+

製作品

本文の変更

+

# データを飾る IoTやオープンデータの普及で、日々、様々なデータを見られるようになりました。 しかし、データが多いのも面倒です。毎日知りたいデータはスマホがなくても見たいです。 そこで、データをインテリアとして飾ることにしました。 # デモ動画:降水確率のグラフを飾る 一例で、今日の6時間ごとの降水確率を、吊るした手まりで表示します。 @[youtube](https://youtu.be/7HPmIr7AEg0) 玄関に飾っておけば、傘を忘れません。 # 部品と材料 |部品・材料名|個数| |:---|:---:| |obniz Board 1Y|1| |サーボモーターSG90|5| |手まり2cm(大きいビーズや鈴でもOK)|5| |ミシン糸|少々| |有孔ボードと台(ダイソー)|1| |木箱(ダイソー)|1| |ブレッドボード|1| |ジャンパーワイヤーやターミナルブロック|少々| |単三×3電池ボックス|1| ## 3Dプリントした材料 ![モデリング](https://camo.elchika.com/c00744e3a92b03cd845b78e6b30357ffa9d78989/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f62663234663732382d656233632d346130372d396235342d6562643266613762326566382f31356337656266652d383962622d343539372d616239652d656237613666666234613935/) サーボモーターを取り付ける台とビス。サーボホーン(8cm)をそれぞれ5セット3Dプリントしました。 見えない場所に使う部品なので、サーボホーンは割り箸で代用。サーボモーターはテープで止めでも良いと思います。 # 設計図:サーボモーターを5つ つなぐ ![回路](https://camo.elchika.com/c880c62af470cd2fd36b2a78946e504a055f8488/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f62663234663732382d656233632d346130372d396235342d6562643266613762326566382f30373036613365352d623635302d346666632d396439662d323430636361383566306630/) サーボモーターのsignal(オレンジのコード)をobniz Boardの0~4ピンにつなぎます。 電源は単三電池×3本を利用し、サーボモーターとobniz Boardに供給します。 # 制作工程 ![ボードの裏](https://camo.elchika.com/f77b1b524641f141b562fb89e5988a2ddcbc1b8a/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f62663234663732382d656233632d346130372d396235342d6562643266613762326566382f35323832643266332d393131362d346238612d613464642d636232343362353664643861/) サーボモーターを有孔ボードに取り付けます。サーボホーンは0度の状態にして、偶数列の穴の上に来るよう配置します。 有孔ボードが裏返しのため、一番右がobniz Boardの0番と接続したサーボモーターとなります。※写真では間違って逆に取り付けてしまいました。0~4ピンのジャンパーワイヤーを逆に差し替えれば解決します。 ## 箱詰めでほこり避け ![箱詰め](https://camo.elchika.com/5876518f4f919698976348aac1d1e2fc1d2d934c/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f62663234663732382d656233632d346130372d396235342d6562643266613762326566382f39363362333530342d623066362d343731662d613436392d346638613337383961646335/) 長期間設置すると、ほこりが溜まります。obniz Boardや電池ボックスを箱詰めしましょう。配線の散かりも防げます。 ## 手まりを吊るす ![手まり刺しゅう前](https://camo.elchika.com/0db97989bc353217e925fe52023fea747f1ff33e/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f62663234663732382d656233632d346130372d396235342d6562643266613762326566382f35633532333535322d326132312d343763662d626230612d626338343333303637333837/) 発泡スチロールの球体に糸を巻き、ニスで固めれば簡易手まりになります。これだけでも可愛いと思います。吊るせれば何でもよいので、大き目のビーズや、鈴でも代用できます。 サーボホーンにミシン糸を通し、有孔ボードの穴を通した後、手まりなどを吊るします。 ![完成](https://camo.elchika.com/2c5ba6e184038b8c02a4bf2aa3e3387c9e7cd9fd/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f62663234663732382d656233632d346130372d396235342d6562643266613762326566382f65613961616266322d336338622d346537302d383464652d613437373363616335386133/) 糸の長さを調整します。後述のコードでサーボモーターを動かしながら、上限位置と下限位置を決めます。有孔ボードの上から2番目の行と、下から2番目の行の範囲で、手まりが上下するようにしました。 # ソースコード [obniz開発者コンソールのリポジトリ](https://obniz.com/ja/console/repository)で新規作成ボタンを押し、「temari-graph.html」というWebAppを作成します。 ソースコードには下記を打ち込みました。 なお、天気予報は気象庁からJSONで頂いています。政府標準利用規約に準拠して利用できるとのことです。 ```html:temari-graph.html <!DOCTYPE html> <html> <head> <script src="https://unpkg.com/obniz@3.14.0/obniz.js"></script> </head> <body> <div id="obniz-debug"></div> <script> const obniz = new Obniz("obniz-ID"); //気象庁 天気予報JSON取得 const callWeather = async () => { let res = await fetch( "https://www.jma.go.jp/bosai/forecast/data/forecast/130000.json" //東京 ); let resjson = await res.json(); return resjson[0].timeSeries[1].areas[0].pops; //6時間ごとの降水確率 } obniz.onconnect = async () => { const data = await callWeather(), max = 100, //グラフ縦軸最大値 min = 0, //グラフ縦軸最小値 //縦軸自動調整の場合 //max = Math.max.apply(null,data.map((o) => {return o.weight;})), //min = Math.min.apply(null,data.map((o) => {return o.weight;})), len = 5, //サーボモーターの数(=データ数) servos = []; //サーボモーターの角度を計算 const getDeg = (val) => { let x, //底辺(糸を引く長さ) y = 7.4, //斜辺(サーボホーンの長さ) h, //高さ a, //底角 b; //頂角(サーボモーターの角度) //糸の可動距離調整(必要あれば) val *= 0.67; //サーボ角度計算 x = (val - min) / (max - min) * y * 2; h = Math.sqrt(y ** 2 -x ** 2 / 4); a = Math.atan2(h, x / 2) * 180 / Math.PI; b = 180 - a * 2; //可動限界を超えないように b = 180 < b ? 180 : b; b = 0 > b ? 0 : b; return b; }; //サーボモーター作動 for(let i = 0; i < len; i++) { servos[i] = obniz.wired("ServoMotor", {signal:i}); servos[i].angle(getDeg(data[i])); await obniz.wait(1000); servos[i].off(); } //翌日深夜1時までスリープ let dt = new Date(); dt.setDate(dt.getDate() + 1); dt.setHours(1,0,0,0); obniz.sleep(dt); await obniz.wait(1000); if (typeof done === "function") { done(); } } </script> </body> </html> ``` # サーバーレスイベント ![サーバーレスイベント](https://camo.elchika.com/34011ecab979337511643d015ca4bfca31d9fb86/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f62663234663732382d656233632d346130372d396235342d6562643266613762326566382f34356633666236322d666436352d346564622d383339372d623565316666333666313263/) 最後に[サーバーレスイベント](https://obniz.com/ja/console/events)に登録します。 obniz Boardがオンラインになったとき、先ほど登録したtemari-graph.htmlを実行するようにします。 これで毎日深夜1時に起動して、天気予報を更新したらスリープするようになります。省電力で長期間運用できるでしょう。 # 最後に 今回は降水確率を利用しましたが、様々なデータでも応用できます。必要なデータをインテリアにして、家を彩っていければと思います。 obniz Board 1Yだと電池で長期運用できるため、実用的になります。