しょんぼり技術メモ

まいにちがしょんぼり

在宅医療を少しだけ改善する小物を3DプリンタとTPUフィラメントで作った

3DプリンタFusion360のおかげで「あー、こんなの欲しいかもなー」と思ったらちゃちゃっと作って試せるのでとても便利。

カニューレコネクタのキャップ

うちの子は人工呼吸器を使っていて、カニューレ(気管に入っている管)と呼吸器を繋ぐアダプタはインターサージカル社の3535000を使っている。このコネクタにはカテーテル等を通すための穴と塞ぐためのキャップがついているが、アールのついた三角形なので、子供の姿勢によっては胸に刺さってしまうので困っていた。

f:id:syonbori_tech:20190309150009j:plain

ので、この部分に付けるキャップをTPUフィラメントで作った。エッジをフィレットするだけでも効果はありそうだけど、TPUだとぶにょぶにょ柔らかいのでより安全な感じ。

f:id:syonbori_tech:20190309150028j:plain

ただ差し込むだけだけど、それなりの深さがあるので今のところ自然にすっぽ抜けることはない。サチュレーション下がってテンパってるとたまに引っ掛けて外しちゃうことがあるけど。

www.thingiverse.com

ベビーベッドのキャスター受け皿

で、この子を寝かせているベビーベッドはコルクマットの上に置いているんだけど、マットの切れ目のところにキャスターが来ていて少しずつめり込んでしまい困っていた。ので受け皿を作った。 市販品だとあまりフットプリントが大きくなくて効果が薄そうだったので、10cm四方で接地するようにした。 また、ケアの都合上、前後左右に結構な力がかかるので、飛び出さないように壁も高めに。

こういったカスタマイズが自由自在なのもDIYのメリット。

f:id:syonbori_tech:20190309145424j:plain

これもTPUフィラメントで。とはいえべにょべにょに沈んでは困るので、Infillを35%、Cubic Subdivisionに設定。1個の出力に8時間ぐらいかかるけど、上からの力に強い感じに仕上がった。

4つ作ってから気付いたけど、頭側の高さを少し高くするようにしておいた方が都合が良かったな。。。

www.thingiverse.com

買って良かった3Dプリンタ

おままごと用冷蔵庫の庫内灯を作った

嫁が娘のために作っているおままごとキッチンに、新たに冷蔵庫が追加された。例によってハンドルを3Dプリンタで作ったりした。

それだけだと味気ないなーと思っていたところで、「そうだ、庫内灯作ろう(ピコーン」となったので勢いで作った。 動作としては、

  • ドアが閉まってるときはスリープ
  • ドアが開いたらLED点灯
  • 節電のために60秒つきっぱなしになったら消してスリープ
  • ドアが閉められたら即スリープ

という感じ。最初は「Normally CloseなリードスイッチでLEDつけりゃいいだろ」と思っていたものの、手元にあったリードスイッチはNormally Openなものだったので断念。ON-NO-NCのマイクロスイッチも検討したが、ドアの固定が弱くてスイッチの反発力でドアが開いちゃうのでNG。

というわけで、ATTiny13Aと乾電池で制御することに。AVRのスリープ周り(とEAGLE)の勉強も兼ねて。

f:id:syonbori_tech:20190309142920p:plain

外観はこんな感じ。普通の冷蔵庫は棚板が透明なので庫内灯は1つで済むが、今回は区切り付きの段ボールをベースに作っているので各段を照らす必要がある。電池本数削減のために白色LEDを3並列に。 f:id:syonbori_tech:20190303102152j:plain

裏側・側面は見えないところになるのでいい加減。電池交換を見越して側面に回路を配置したけど、どうせ引き出さないと交換できないので裏面配置で良かった気がする。 f:id:syonbori_tech:20190303102215j:plain

冷蔵庫のハンドルはこれ。 www.thingiverse.com

メタルラック用の3Dプリンタフィラメントホルダーを作った

3DプリンタはQiDi TechのX-Smartを使っているが、スプールホルダが背面にあるためうちの設置環境では交換が面倒だったりする。たまにもつれたりするので、手が届くところにスプールを設置したいと思ったので、メタルラックの棚板に引っ掛けるホルダーを作った。

f:id:syonbori_tech:20190216071557j:plain f:id:syonbori_tech:20190216071946j:plain

メタルラック棚板の隙間に差し込んで90度ひねり、棚のバーにひっかけてぶら下げる。メス側はPETGで、オス側はPLAで。

www.thingiverse.com

強度的にはあまり良くなさそうなので、もっと良い方法がないかなあ……

おままごと用コンロのノブと五徳を作った

3Dプリンタでおままごと用コンロのノブと五徳を作った

嫁が「娘のために、カラーボックスでおままごとキッチンを作るぞ!DIYするぞ!」とノリノリだったので、「何か手伝えることあったら言ってね」と応援していたところ「コンロのノブ、良いのがないから作って欲しい。あとできれば五徳も」とのこと。

というわけで、Fusion 360でさくっと作った。

180度だけ回るノブ

ただ回るだけのノブなら適当にノブと軸を作ってやれば良いところだが、コンロのノブなので180度の回転範囲になるようにしたい。 というわけで、台座に突起を作り、その突起が180度の半円の範囲を移動できるようにはめ合わせるように作ってみた。 手持ちのタッピングねじを適当に使ったので台座からねじ頭が浮いてしまっていてあまりイケてないが、厚手の両面テープで固定するので今回は気にしない。

f:id:syonbori_tech:20190112180221j:plain

www.thingiverse.com

五徳

Thingiverse見ればあるだろ、と思ったらあんまり外国にはいわゆる五徳ってないんですね……というわけでこちらもFusion360でさくっと。円形配置で5等分が簡単にできるのは本当にありがたい。適当に直方体を作ってエッジをフィレットしてやるだけでそれっぽく。

f:id:syonbori_tech:20190113162607j:plain

www.thingiverse.com

子供がトイレの電気を点けられるようにLEDテープ用リモコンを作った

我が家には3歳の娘がいて、最近やっとおむつ離れが出来るようになってきた。本当に長かった……という話は横に置いておくとして。今回は「3歳児が一人でトイレに行けるように色々工夫した」という話。

便座に座れない

トイレトレーニングの最初の一歩として、いわゆるおまるを使っていた。娘が「トイレ行きたい!」と言ったら連れて行き、便座にセットしてその上に座らせてやる。ある程度慣れてきたら、ステップ式の便座を購入し自分で設置できるようにしてやった。

これで一人で便座に座り用を足して拭いて降りて流すことが出来るようになった。

電気が点けられない

で、次の問題がこれ。廊下の高い位置にスイッチがあるため、子供の身長では手が届かないのだ。しかも困ったことに、このスイッチが「内部にゼンマイが入っていて、消灯後も一定時間換気扇が回り続けるタイプ」なのである。なので「常時ONにして、室内の電灯をリモコンで操作」しようとすると、換気扇が常に回りっぱなしになってしまう。まあだからどうした感はあるけれども。残念ながら第二種電気工事士は受験すら出来ずに資格を持っていないので交換するわけにもいかないので、どうしたものかと悩んでいた。

そこで、旧居で使っていたLEDテープを活用して、娘がリモコンでトイレを明るく出来るようにした。要は、トイレの天井付近に突っ張り棒を通して、そこにLEDテープを走らせるだけである。あとはリモコンを娘が使いやすいように設置してやればよい。

よい、のだけれども、手持ちのLEDテープはリモコンがでかい。いろんな色に変えられる機能があるが、今回は一切使わない。間違って赤ボタンを押してしまい、大変アレなトイレになってしまった。娘が間違ってこれを押してしまってトイレが真っ赤になってしまったら、それはもう強烈に泣かれるだろう。その事態は避けたい。

専用リモコンを作る

当初は「リモコンのON/OFFボタン以外を段ボールでマスクしたもの」をトイレのドアに貼り付けていた。これでも基本的には問題ないのだが、耐震ゲルだけでは粘着力が足りないようで、朝になると床に落ちてしまっていた。そんなわけで、こいつはただの赤外線リモコンなので、ON/OFF専用リモコンを作ることにした。

リモコンコード

まずは学習リモコンを適当に作ってやれば良いかと思っていたものの、送信専用なら受光素子付けるのは無駄だな……と思って「LED tape ir remocon」で検索したら、そのものズバリのサイトが出てきた。本当にありがたい。

woodsgood.ca

44キーモデルのリモコンなので、

#define  IR_OFF    0xFF02FD  // 

がまさにそれ。IR_OFFという名前は実際にはあまり正しくなくて、IR_ON_OFFあたりが妥当だがあまり気にしないことにしよう。 規格としては、拡張NECプロトコルになるようだ。

www.sbprojects.net

あとはIRRemoteライブラリを使って、sendNECで上記コードを送ってやればOK。非常にシンプルに作れる。 今回は手持ちにいっぱいあったATTiny85を使った。電源はCR2032。赤外線LEDは、パーツ箱を漁ったら100個入り袋で買ったやつが出てきたのでそれを使用。

github.com

本来のリモコンなら、基本はスリープしておいてボタン押されたら割り込みで起きて信号を送信する処理になると思うが、今回は単一機能しか実装しないので

  • タクトスイッチが主電源
  • 起動後に信号を送って即終了

としている。チャタリングが起きたところで赤外線信号を送り終わるだけの時間は導通しないだろうし、処理は一瞬で終わるので長押しする必要もないのでこれで十分。

ケース

ボタン一つにLED一つのケースを3Dプリンタででっち上げる。寸法ピッタリで作ってはめ合わせる作り。たぶん電池交換のときに割れたりもげたりしそうな気がするが、とりあえず気にしない。

www.thingiverse.com

にしても、SUNLUのABS+フィラメント、底面が白化しちゃって残念なんですがなんとかなりませんかね……

完成品

結果、こうなりました。 f:id:syonbori_tech:20190102150958j:plain みんな大好き「例の激安ユニバーサル基板基板」でさくっと。

f:id:syonbori_tech:20190102170729j:plain ドアの内側に、娘の手が届く位置に耐震ゲルで貼り付け。

f:id:syonbori_tech:20190102170743j:plain 白の設定で使っているが、やっぱりちょっと青い。でも娘は「これならひとりでおといれできる!」と大喜びだったので気にしない。

一方ロシアは

スイッチの下に踏み台を置いた。

ZabbixでWindows10のバッテリ残量・状態を記録する

我が家では、在宅医療の息子の情報をZabbixに登録して、リビングのモニタに常時映している。以前は型落ちのiPad3を使っていたのだが、いい加減サポートも切れて動作も遅いため、余り物のGPD WINを使っている。

先日、朝になったらモニタがブラックアウトしていて、確認したところバッテリが切れていた。調べたところ、Cortanaがバックグラウンドで動き回って充電量より放電量が多くなっていたらしい。その他、USBハブをセルフパワーのものに変えるなどして対応した。

で、再発防止のためにZabbixでWindowsのバッテリ状態を記録することにした。Zabbixのエージェントをインストールし、下記のようなアイテムをホストに追加するだけで良い。

  • Type: Zabbix agent
  • Key: wmi.get[root\cimv2, select EstimatedChargeRemaining from Win32_Battery]
  • Type of Information: Numeric (unsigned)
  • Data type: Decimal
  • Units: %
  • Update interval: 60

しばらく放っておくとそれっぽい値が記録されているはず。 取れる値については Win32_Battery class | Microsoft Docs を参照。

key: wmi.get[root\cimv2, select BatteryStatus from Win32_Battery]にすればステータスがそれっぽく取れるので、value mappingを適当に作って表示してやれば人間に優しい表示ができる。

f:id:syonbori_tech:20181030054910p:plain

↑夕方ぐらいに接触が悪くなって充電が止まった模様。まだまだ落とし穴がいっぱい。。。

ダイソーBluetoothリモートシャッターで、押された時刻をGoogle SpreadSheetに記録する

TL;DR: ダイソーBTボタン+bluebutton+GASで押された時刻を記録するやつ作った

我が家には気管切開を行って24時間人工呼吸器を着けている息子がおり、呼吸器から送られた空気は加温加湿器を通って息子の気管に流れ込むようになっている。本来ならば加温・加湿は鼻がもつ機能だが、気管に直接空気を送るため機械で補う必要があるのだ。

気管に直接送り込む関係で水道水を使うわけにはいかず、注射用水のような無菌のものを使う。これが案外ハイペースで消費してしまい、1日1リットル、一ヶ月で30リットルぐらい使ったりする。しかもこのペースは室温や湿度に影響され、補充は月に1度の通院の際だけだ。

前置きが長くなってしまった。そんな事情から、水の消費ペースをある程度把握しておきたくなったので、ダイソーBluetoothリモートシャッターとRaspberry Pi 3B、Google SpreadSheetを使って記録する仕組みを作ってみた。

簡単に書くと:

  • BTリモートシャッターを押す
  • RPi3で検知して、SpreadSheetに現在時刻を記録する
  • 記録された時刻をもとに、シート上で消費ペースと在庫数、枯渇までの猶予を計算する

というシステムにした。これまでの経験上、せいぜい2~3回/日の消費ペースなので、スケーラビリティはまったく気にしないしロックも不要だ。とりあえず動けば良い。枕元のホワイトボードに時刻を手書きしてペースを把握するアナログ手法より楽なら何でも良い。

下準備

基本的には下記のページに従う。 qiita.com

セットアップ~bluebuttonの設定までは書かれているとおり。

POSTされたらSpreadSheetに現在時刻を記録する

あらかじめGoogle SpreadSheetにドキュメントを作り、useシートにこんな感じの値を入れておく。

timestamp quantity
2018/10/21 01:23:45 1

スクリプトエディタを起動して、SpreadSheet処理を書く。スプレッドシートのIDはURLなどから広うのが手っ取り早い。 要するにdoPost()というメソッドが呼ばれたら、スプレッドシートの末尾に現在時刻を登録して、HTTPでHTMLの応答を返すようにすればよい。

function doPost(e){
  addConsume();
  return HtmlService.createHtmlOutputFromFile('register');
}

function addConsume() {
  const ssId = "your spread sheet id";
  var ss = SpreadsheetApp.openById(ssId);
  var sheet = ss.getSheetByName("use");
  
  const timestamp = Utilities.formatDate(new Date(), "Asia/Tokyo", "yyyy/MM/dd HH:mm:ss");
  const quantity = 1;
  sheet.appendRow([timestamp, quantity]);
}

register.htmlを作って応答を適当に書く。ぶっちゃけ何でも良い。 あとは「ファイル>版を管理」でバージョンを保存して、「公開>ウェブアプリケーションとして導入」で公開する。アプリケーションにアクセスできるユーザーとして、「全員(匿名ユーザーを含む)」を選択しておく。URLが十分にランダムなので、外部からはアクセス困難なはず。今回の用途であればこれで問題ない。ダイアログに表示されているURLをメモしておく。保存すると、アプリケーション連携の認可要求が出るのでよしなに。

curlコマンドでPOSTして、シートの最下行に時刻が記録されることを確認する。

curl -XPOST --data "" "https://script.google.com/macros/s/HOGEHOGE/exec"

bluebuttonでPOSTする

こんなスクリプト(on_button.sh)を作っておく。

#!/bin/bash
curl -XPOST --silent --data "" "https://script.google.com/macros/s/HOGEHOGE/exec" >/dev/null 2>/dev/null
if [ $? -eq 0 ]; then
    python /etc/bluebutton/success_led.py
fi

別件でRPiのGPIOにはフルカラーLEDが付いているので、フィードバック用のLED点滅処理を呼んでいる。 ダイソーBluetoothリモートシャッターは1分半でスリープするらしく、初回押下ではbluebuttonまで処理が来ないことがあるので、フィードバックがあった方が使い勝手が良い。

bluebuttonのコンフィグをこんな感じで書いておいて

keyup=true
keydown=/etc/bluebutton/on_button.sh
longup=true
longdown=true

systemdの設定を雑に書いて、systemctl daemon-reloadしてからenable、startする。

[Unit]
Description=BlueButton water management server
After=syslog.target network-online.target

[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/bluebutton -d="AB Shutter3" -c /etc/bluebutton/bluebutton.conf
Restart=on-failure
RestartSec=10
KillMode=mixed
WorkingDirectory=/root

[Install]
WantedBy=multi-user.target

ダイソー Bluetoothリモートシャッター スリープ問題

どうやらこの製品は1分半でスリープするらしい。ペアリング後、最終利用から時間が経つとスリープに入り、ボタンを押すと起きて再接続が走る。このときLEDが3回点滅する。その後もう一度ボタンを押すと通信が飛んでいく模様。このときはLEDは1回点滅するが、必ずしもちゃんとbluebuttonまでリクエストが飛んでいるとは限らないようだ。

仕方ないので、bluebutton側のスクリプトでフィードバックを返すようにしている。使い途にもよるが、LED光らせる以外にも圧電ブザーを繋いで音を鳴らしたり、LINEなどに通知を飛ばすなりの方法を使うのが良さそう。

仕上げ:消費ペース等を表示する

useシートに消費した時刻が記録されるようにしているので、あとは表計算アプリケーションとして書いていけば良い。あとは在庫数をstockシートに記録したりして、まあ適当にでっち上げる。テストデータを消したいときには、useシートのテストデータの行をまるごと消してやれば良い。その後ボタンを押すと、ちゃんと最下行に追加される。

f:id:syonbori_tech:20181021172716p:plain

……ご覧のように、ちょっと多めに貰いすぎてしまっている。次回通院時には貰わなくても大丈夫か、1箱ぐらいでいいか、って感じですね……

オチ

ボタンは枕元の加湿器付近に固定している。RPiから1メートルぐらいの距離。つまり、RPiのGPIOにスイッチを繋いで線を延ばしてやれば、リモートシャッターのスリープ問題に悩まされることなく実現できる。これ、本当にリモートにする必要なかった……