2024/04/07

洗濯物干しの修理

 タオルなどを干す洗濯物干しの足についている保護キャップが削れてきたので3Dプリンターでキャップを作って修理しました.


中の金属パイプが露出してきたので,このままだと床を傷つけてしまう状態でした.
Fusion360でキャップを設計して印刷しました.足の開き角度(57°)を測って開いておいたときに平らな面で接するように工夫しました.それ以外の部分は大きくフィレットをつけ,畳んで置いた時も床に優しく当たるように設計しました.
キャップが大きくなりすぎても困るので,パイプにはめる中空になる部分はwallの厚みをギリギリまで薄くするよう調整しました.今日はTPU 85Aで4mmなら安定して印刷できたのでこのパラメータで設計しました.
古いキャップを取り外すのに苦労しつつなんとか取って(壊して),1枚目の写真のように取り替えました.
ついでに,取れていたクロスの部分のネジも付け直しました.ゆるまないようにナイロンナットを取り付けました.
まだまだ長く使えそうなのでよかったです.

2020/07/31

やわらかい空気圧アクチュエータを印刷してみた

前回の記事で3Dプリンタの導入をご紹介しました.せっかく導入したので,まずはやわらかい空気圧アクチュエータを印刷してみようと思います.

空気圧アクチュエータとは

空気圧アクチュエータとは,空気圧を加えることによって動くアクチュエータです.このうち,今回は柔軟な材料で作られたやわらかい空気圧アクチュエータを印刷していきます.硬い材料とモータ等で作られたものよりしなやかに動くため,例えば手につけて手の運動を助けリハビリ用に用いるなどのアプリケーションが考えられています (Yap, Ng and Yeow, 2016).

FDM方式の3Dプリンターによる空気圧アクチュエータの印刷

樹脂のフィラメントを溶かして積み上げていくタイプの3DプリンタをFDM (Fused Deposition Modeling) 方式の3Dプリンターと言います.FDM方式の3Dプリンターは,1層ずつ樹脂の層を積み重ねていく印刷方法のため,どうしても隙間ができてしまいがちです.このため,適当に印刷しただけでは密閉されたものを製作することはできないのです.

このような課題がある中で,FDM方式のプリンターを用いてやわらかい空気圧アクチュエータを印刷する際のパラメータが,High-Force Soft Printable Pneumatics for Soft Robotic Applicationsという研究で明らかにされています (Yap, Ng and Yeow, 2016).今回は,この論文の中で紹介されているパラメータを参照しながら,空気圧アクチュエータを印刷してみたいと思います.

完成品

まずは,印刷した空気圧アクチュエータをご覧ください.500g程度のランプを持ち上げることができています.




使用機材

  • 3Dプリンタ:Sidewinder X1
  • 3DCAD:Fusion360
  • スライサ:Cura4.6.1
  • フィラメント:Pxmalion Flexible TPU クリア
    • Q&Aによるとショア硬度85A (NinjaFlexと同じ)

試作の過程

基本的には論文に記載されているパラメータでOKでしたが,一部自分の環境に合わせて変更した点もありました.試作の順に説明していきます.それぞれ変更しているパラメータのみ記載していきます.パラメータの一覧は論文を確認してみてください.誰でもダウンロードできるようになっていると思います.

試作1

まず初めは,ほぼ論文通りにしました.変更したのは以下の点です.
  • Extruder temperature: 240°C
    • フィラメントがこげるのが心配だったため.
  • リトラクション: On
    • オフにし忘れてしまった
出来上がったものは以下です.中に水を入れた状態で空気を吹き込むと水が染み出してきており,エアタイトではないことがわかります.

試作2

エアタイトにならない原因を考えてみたのですが,印刷中にブチブチという音がしていることに気が付きました.ブチブチと音が出るのはフィラメントの湿気がノズル内で気泡となりでているものだ,と言う指摘が見られます.今回はフィラメントを開封した直後なのでまともな包装がされているなら(夏で周囲の湿気は高いですが)そこまでフィラメントの状態が悪いとも思えませんが,TPU印刷の温度設定として泡立つなら温度設定を下げてみましょうと言う情報もあります.今回は温度を高めにすることがエアタイトにするポイントらしいので,あまり温度を下げたくありません.理由は十分考察できていないですが,樹脂を大量に押し出している時は泡立ちのないものが出てきますが,押し出し量が小さい時は泡立ったものが出てくる様子が観察できました.
押し出しが十分な場合

押し出し量が不足している場合
このことから,Flow rateを上げることにしました.また,とりあえず焦げることはなかったので論文に合わせて温度も上げてみることにしました.試作2で変更したパラメータは以下です.試作1ではミスしていましたが,リトラクションはOFFにしました.
  • Extruder temperature: 245°C
  • Flow rate: 150%
結果は以下です.空気漏れがなくなりました.Flow rateを上げたのが効いているようです.しかし,温度の方はやはり高すぎたようで,少し焦げてしまいました.多少空気もれしているような音が聞こえると思いますが,空気入れのコネクタとの接続部分で少し漏れてしまっています.なお,印刷時間短縮のために試作1よりサイズを小さくしました.

試作3

手元の環境でエアタイトになる条件がわかったので,しっかりと曲がるアクチュエータを印刷をすることにしました.試作1,2では論文中のモデルよりも随分太いものになっていることに気づいたので,寸法を似たようなものにしました.ただし,壁の厚さは1周多い1.6mmとしました.このモデルの場合,なぜかTravelがたくさん生成されてしまったので(外形には沿っていましたが),Travelの速度を念のため遅くしました.また,焦げてしまった点や,まだ少しブチブチ音がしていたことを考慮してパラメータを少し調節しました.他は,試作2と同じです.
  • Extruder temperature: 242°C
  • Flow rate: 160%
  • Travel: 50mm/s 
結果は以下です.しっかりと曲がるアクチュエータができました.しかし,変形量は壁が厚いせいかやや小さい気がします.

試作4

変形量が小さかったので,壁の厚さを1周減らして1.2mmにすることにしました.試作3まではFusion360の中で空洞もモデリングしていたのですが,1.2mmにすると不要なTravelが大量にできてしまったり,曲線に沿わずにジグザグに埋めたりするデータになってしまいました.曲線部分の厚さがSTLファイルからは正確に読み取れていないのかもしれません.1.6の場合に問題にならなかったのはたまたまうまくいっていただけかもしれません.
この対策として,モデルは空洞がないもので作って,infillを0%にする方法を使いました.これは論文中でも説明されている方法です.これを使うとコネクタ部分に穴が開かなくなるのでやめてましたが,壁がきれいに印刷できるならばと変更しました.変更すると,正しくスライスできます.
このデータを使って,印刷をしました.パラメータは,トラベルの問題が解決できたのでその速度を元の120mm/sに戻しました.また,底と上面の厚さはFill density 0%の場合のパラメータの1.5mmにしました.

結果はこちらです.試作3よりも変形量が大きくなりました.ものを持ち上げている様子は冒頭の動画の通りです.

挟めるタイプ

アクチュエータを2つ向かい合わせて,掴めるタイプも印刷してみました.適当に設計してしまったためあまり重いものは掴めませんでしたが,タワシを掴む事はできました.

まとめ

論文を参考に,やわらかい空気圧アクチュエータを印刷しました.FDM式のプリンタで柔らかくエアタイトな構造物を印刷し,簡単なグリッパーを製作できました.今回は自宅にある自転車用の空気入れを簡単に用いたためその部分で空気漏れが発生してしまいましたが,この点はエアチューブや継ぎ手などできちんと接続すれば改善すると考えられます.

参考文献

Yap, Hong Kai & Ng, Hui & Yeow, Raye Chen-Hua. (2016). High-Force Soft Printable Pneumatics for Soft Robotic Applications. Soft Robotics. 3. 144-158. 10.1089/soro.2016.0030. 

3Dプリンタを自宅に導入

新型コロナウイルスの流行が収まる気配がなく,大学に積極的には登校しない生活がまだしばらく続きそうです.研究室に通っていた頃は3Dプリンタに囲まれて作業をしていたため自宅にも欲しいとは全く思わなかったのですが,4ヶ月ぐらい経って3Dプリンタが恋しくなってきたため自宅にも導入してしまいました.3Dプリンタのレビューなどは山ほどありますが,何を悩んで選んだか,また今回参考にした情報について簡単に紹介します.

プリンタの選定

今回は以下の条件を決めて選定してみました.
  • 動作音が静かであること
  • ダイレクト式であること
まず,自宅に置くので静かであることは必須条件です.3Dプリンタでは特に工夫していないものではステッピングモータの動作音がそれなりにうるさいです.後からモータドライバを交換しても良いですが,今回は初めから静かなものがついているのを選ぶことにしました.

続いてダイレクト式という点ですが,フレキシブルフィラメントも印刷したいためこの条件をつけました.フレキシブルフィラメントというのは一般的なPLAやABSよりも柔軟性の高い樹脂(TPU等)のフィラメントのことで,柔軟性が高いためフィラメントを送るギアがエクストルーダの近くにあるダイレクト式での印刷が適しています.

この条件に当てはまるものはたくさんあるのですが,今まで使ったことがないタイプがいいなと思い,はじめに検討したのはM3DのTHE CRANE QUAD 3D PRINTER です.4種類のフィラメントを使ってフルカラー印刷ができます.複数のフィラメントを混ぜられるタイプは経験がなかったので,興味を持ちました.しかしセールはしていましたが,それでも予算オーバーだったので諦めました.

THE CRANE QUADはヘッドだけ購入することができます.そこで,あとでヘッドを取り替えて使えそうなものを探しました.見つけたのは,Amazon.co.jpで購入でき,YouTube等にレビューなども豊富にあるArtillery Sidewinder X1です.静音のドライバを搭載しており,ダイレクト式です.Amazonのレビューは少なく商品名に型番が入っていなくて本物が届くか心配でしたが,大丈夫でした.

セットアップ

Sidewinder X1のセットアップは簡単です.ベッドがついてる土台と上の構造物をつなげて配線するだけで完成しました.

設置

階段下に設置しました.ちょうどいい感じにはまっています.

フィラメントが出ないトラブル

テスト印刷をしようとしたところ,なぜか初め装着されていたノズルからフィラメントが出力されませんでした.エクストルーダを分解してみるとか熱したクリップで中を掃除するとか試しましたが,出るようになりませんでした.

幸い,予備のノズルが同梱されていたので,交換したところ無事出力されました.単にノズルを交換するだけの場合は分解の必要はなく,ノズルだけ外すことができます.交換は以下の動画が参考になりました.


早速予備がなくなってしまったので,ノズルをすぐ注文しました.AliExpressなどから購入できます.Sidewinder X1のノズルは高温の印刷も可能なロングなタイプで,Volcanoという名前が付いているようです (まだ届いていないので,正しい交換品か自信がないですが).

印刷パラメータ

3Dプリンタを使う上で重要な点として,印刷のパラメータ調整があります.この点,Sidewinder X1はパラメータを公開してくれている方がいるため,すぐに利用を始められます.私はスライサーとして普段Curaを使っているので,以下のサイトのプロファイルを利用しました.

まとめ

自宅用の3DプリンタとしてSidewinder X1を導入しました.ノズルが詰まっているトラブルはありましたが,予備パーツがあったため無事に印刷できました.これから活用していきたいと思います.

2020/04/09

フットスイッチでミュート解除する

オンラインミーティングである程度参加人数が多くなってくると,「話さない時はミュートにする」ことが推奨されたりします.Zoomではスペースキーを押している間だけミュート解除という機能があり,常にZoomがアクティブなウィンドウになっているなら話す時だけミュート解除するのは簡単です.しかし,オンラインミーティングをしながらメモを取るなど他の作業をしていると発言するために,
  1.  Zoomのウィンドウをアクティブにする 
  2. ミュート解除操作をする
  3. はなす
という手順が必要になります.オンラインミーティングはなんか疲れるという声を聞いたりしますが,これが原因の1つではないかと思いました.リアルミーティングなら3だけでよかったのに1, 2が増えて煩わしいです.

そこで,フットスイッチを足で押すだけでミュート解除できるものを作りました.お金がないのでフットスイッチを自作していきます.

フットスイッチの製作と配線

今回は自宅で工作をするので段ボール工作になりました.段ボール箱をカットして,ペダルの形にします.Nintendo Laboのドライブキットのペダルを参考にしました.
ペダルができたら,マイクロスイッチを取り付けます.
そして,Arduinoに接続します.

ソフトウェア

とてもシンプルです.Arduinoはスイッチの入力を読み取って,値が変化したらシリアル通信で送ります.一応チャタリング対策をしました.
Mac側は,pySerialでArduinoからのデータを読み取り,入力音声のボリュームを変更します.入力音声のボリュームを変更するというところがポイントで,どのアプリケーションでミーティングしていても使えます.またシステムのボリューム操作は簡単で,osascriptコマンドを使って容易に変更できるところも良い点です.

ソースコードはGitHubに置いてあります.

動作の様子

こんな感じで動きます.赤枠で囲まれたところがボリュームで,押していない時はミュートされています.

使ってみて

試しに使ってみましたが,議事録担当をしていてもスムーズに発言ができて快適です.引き続き使っていきたいと思います.

2017/01/07

日の出が遅いので、Raspberry Piで電気を点けて気持ちよく目覚めてみる

みなさん、今日は2017年の東京の日の出が最も遅い日ですね。*1 寒い上に日の出が遅いと早起きができない方も多いのではないでしょうか? 私もその一人です。

「朝起きたら日光を浴びる」これは早起き術としてよく紹介されている技ですが、日の出より前に起きる場合には適用不可能です。そこで、今回はそろそろ日本でも発売するというRaspberry Pi Zeroを使って、朝になったら部屋の電気を点けて部屋を明るくするということをしてみたいと思います。

実行環境

  • とても寒い冬季の日本
  • 日の出前の6時ごろ
  • LEDシーリングライト(赤外線リモコンによる操作が可能)

ハードウェアの準備

今回は赤外線を使ってシーリングライトをRaspberry Pi Zeroで制御します。このため、リモコンの信号を学習するための受信モジュールと赤外線LEDが必要です。まず、これらをRaspberry Pi Zeroに接続します。
Raspberry Pi のGPIOはそれほど多くの電流を流せないため、トランジスタで増幅しています。10Ωの抵抗をつけてだいたい100mAぐらい流すようにしてあります。

受信モジュールの出力は5Vであるのに対して、Raspberry Pi のGPIOは3.3Vであり5Vトレラントではないそうです。そこで、出力ピンに40kΩの抵抗(実際には10kΩの直列4本)をぶら下げておき、分圧することで3.3Vにしています。

使用している部品は全て秋月電子で入手可能です。型番などは以下の表の通りです。

部品名 型番 個数 URL
赤外線リモコン受信モジュール PL-IRM2121-A538 1 http://akizukidenshi.com/catalog/g/gI-01570/
赤外線LED OSI5LA5113A 2 http://akizukidenshi.com/catalog/g/gI-04311/
トランジスタ 2SC1815GR 2 http://akizukidenshi.com/catalog/g/gI-00881/
抵抗 10Ω 2 http://akizukidenshi.com/catalog/g/gR-25100/
抵抗 10kΩ 4 http://akizukidenshi.com/catalog/g/gR-25103/

作成した回路はこのような感じになりました。(ピンヘッダは1のModel B用に作ってしまったため、今回はジャンパで接続...)手前の白いキャップが付いているのが赤外線LEDで、その隣の黒いのが受信モジュールです。

ハードウェアの準備はこれで完了です。

LIRCの導入

LIRCというソフトウェアを使うと、Linuxで赤外線信号の送受信ができるようになります。まずはこれをインストールしましょう。OSはRaspbianを使用しました。
sudo apt update
sudo apt install lirc
インストールが終わったら、LIRCの有効化とピンの設定を行います。/boot/config.txtの51行目を次のように変更します。
# dtoverlay=lirc-rpi (変更前)
↓
dtoverlay=lirc-rpi,gpio_in_pin=17,gpio_out_pin=18 (変更後)
また、/etc/lirc/hardware.confも次のように変更します。
########################################################
# /etc/lirc/hardware.conf
#
# Arguments which will be used when launching lircd
LIRCD_ARGS="--uinput"

# Don't start lircmd even if there seems to be a good config file
# START_LIRCMD=false

# Don't start irexec, even if a good config file seems to exist.
# START_IREXEC=false

# Try to load appropriate kernel modules
LOAD_MODULES=true

# Run "lircd --driver=help" for a list of supported drivers.
DRIVER="default"
# usually /dev/lirc0 is the correct setting for systems using udev
DEVICE="/dev/lirc0"
MODULES="lirc_rpi"

# Default configuration files for your hardware if any
LIRCD_CONF=""
LIRCMD_CONF=""
変更が終わったら再起動します。
sudo reboot

再起動が終わったら、受信がうまくできるか確認します。
mode2 -d/dev/lirc0
このコマンドを実行を始めたら、リモコンを受信モジュールに向けてリモコンのボタンを押します。ここで、次のような出力が現れたらうまくいっています。出力の確認が終わったらCtrl-Cで実行を終了します。
space 1907936
pulse 10217
space 5133
space 641
pulse 632
.
.
.

リモコンの信号の学習

irrecord というコマンドを実行すると対話的にリモコンの学習を行うことができます。学習が終わると、設定ファイルが生成されます。-dオプションはデバイスの指定(デフォルトのデバイス名と違ったものが現れるので明示的に指定します)、--disable-namespaceはリモコンのボタンの名前を自由につけるためのオプション、-fオプションはraw mode(届いた信号をコード化せずにそのまま保存する)で学習を行うためのオプションです。以下はコマンドの実行例です。
$ sudo /etc/init.d/lirc stop  # 学習を行うので一旦止める
$ irrecord -d/dev/lirc0 --disable-namespace -f ceiling_light.conf

irrecord -  application for recording IR-codes for usage with lirc

Copyright (C) 1998,1999 Christoph Bartelmus(lirc@bartelmus.de)
省略
Press RETURN to continue. (ENTERを押す)


Now start pressing buttons on your remote control.

It is very important that you press many different buttons and hold them
down for approximately one second. Each button should generate at least one
dot but in no case more than ten dots of output.
Don't stop pressing buttons until two lines of dots (2x80) have been
generated.

Press RETURN now to start recording.(ENTERを押したらボタンをランダムに1秒ずつ押し続ける)
................................................................................
Found const length: 122383
Please keep on pressing buttons like described above.
Creating config file in raw mode.
Now enter the names for the buttons.

Please enter the name for the next button (press <ENTER> to finish recording)
FULL(ボタンの名前を入力してENTERを押す、押したらすぐに学習したいボタンを押下する)

Now hold down button "FULL".
Got it.
Signal length is 69

Please enter the name for the next button (press <ENTER> to finish recording)
OFF

Now hold down button "OFF".
Got it.
Signal length is 67

Please enter the name for the next button (press <ENTER> to finish recording)
(ENTERを押して終了する)
設定ファイルが出来上がったら、/etc/lirc/lircd.confに生成した設定を追記し(初回の場合は>>を>に変えて、上書きします)、lircdを起動します。
sudo bash -c "cat /path/to/ceiling_light.conf(生成した設定ファイル) >> /etc/lirc/lircd.conf"
$ sudo /etc/init.d/lirc start
起動できたら、実際に電気を操作してみます。
$ irsend SEND_ONCE ceiling_light.conf(設定の名前) FULL(ボタンの名前)
うまく動かなかったら、信号を複数回送信するオプションをつけてみます。raw modeで学習した場合は、信号のきちんとした区切りではないところで切れて学習されている場合があるので、複数回送るとつながってうまくいく場合があります。
$ irsend -#2 SEND_ONCE ceiling_light.conf(設定の名前) FULL(ボタンの名前)
それでもうまくいかない場合は学習をやり直してみましょう。

タイマーを設定する

朝になったらコマンドを実行する、という機能を実現するためにcronを使いました。次のコマンドを実行して設定ファイルを開きます。
touch /home/pi/crontab.log  # 適当なログを取るファイルを作っておく
crontab -e
設定ファイルの中には、次のような記述をします。これで、毎朝6時に電気がつきます。絶対に起きたいのでボタンは10回押します。
  0 6    *   *   *   irsend -#10 SEND_ONCE ceiling_light FULL && echo "`date` - Light turned on" >> /home/pi/crontab.log
タイムゾーンがJSTになってないとUTCで起こされたりして大変なので、ちゃんとタイムゾーンも確認しておきましょう。
timedatectl  # 確認。違ったら以下を実行
timedatectl set-timezone Asia/Tokyo
sudo systemctl restart cron.service  # タイムゾーンの変更をcronにも反映
これで朝のお目覚めバッチリですね!!!

参考サイト

http://alexba.in/blog/2013/01/06/setting-up-lirc-on-the-raspberrypi/


*1: 実は冬至と一番遅い日の出の日はズレています。(http://kuusou.asablo.jp/blog/1970/03/07/7925757?year=2017&rg=r25)

2016/01/11

VSCode使用中にKarabinerのVimモード(エミュレーション)に入らないようにする

KarabinerのVim Emulationを使用すると、Vim以外で文書を編集するときでもhjklでカーソルを動かしたりできて便利です。しかし、それ自体がVimモードを持っているアプリケーションを使うときは無効にする必要があります。

有効にするアプリケーションの選択

有効にするアプリケーションの設定はprivate.xmlに記述します。private.xmlについて詳しくはリファレンスを参照してください。 このXMLファイルは例えば次のようになります。 VIM_EMU_IGNORE_APPSと書いてあるところの下に列挙されているのが、Vim エミュレーションを使用しないアプリケーションです。この中で指定されたアプリケーション使用中はescキーを押してもVimエミュレーションが始まりません。

VSCodeの設定はまだない

たいていのアプリケーションはすでに設定が用意されているので、そのアプリケーションに対応するコードを調べて書けば良いのですが、VSCodeについてはまだありませんでした。このため自分で追加する必要があるようです。アプリケーション内のappdef.xmlに記述した方がキレイなのではないかと思ったものの、今後VSCodeが追加される可能性もありそうなので、ひとまずprivate.xmlの中にVSCodeの設定も一緒に書いてみました。
上に示したprivate.xmlの先頭にあるのがVSCodeの設定です。<appdef>から</appdef>までを記述してVIM_EMU_IGNORE_APPSのリストにVSCODEを追加すればVSCode使用中はVimエミュレーションが発動しなくなります。

2015/05/23

markdown->latexの変換をしたときに、表のキャプションを上にもってくる

最近、markdownで報告書を記述して、pandocを用いて一旦latexに変換し、そこからpdfにするということをしています。

このとき、markdownで記述した表はlatexのlongtableに変換されるようなのですが、表のキャプションが下に来てしまいます。表のキャプションは上に書きたいので、これでは困るわけです。

これを
こうしたい

始めの状態

記述したMarkdownはこんな感じです。
# 表 #################################

表

Table:例

|A        |B           |C           |D            |
|:--------|:-----------|:-----------|:------------|
|11111    |222         |33          |4            |
|5        |6           |7           |8            |
変換すると、キャプションが\end{longtable}の直前にきます。
\section{表}\label{ux8868}

表

\begin{longtable}[c]{@{}llll@{}}
\toprule\addlinespace
A & B & C & D
\\\addlinespace
\midrule\endhead
11111 & 222 & 33 & 4
\\\addlinespace
5 & 6 & 7 & 8
\\\addlinespace
\bottomrule
\addlinespace
\caption{例}
\end{longtable}

下に持ってくる

pandocで変換された後のTeXファイルに手を加えてなんとかしました。sedとかに慣れてないので、Pythonで作っています。

Makefileに書いて使っています。 Makefileの一部
convertmd: $(MDSCRIPT)
 @cat $^ \
 | sed s/.png/.eps/g \
 | pandoc -t latex \
 | sed 's/includegraphics/includegraphics[width=0.65\\columnwidth]/g' \
 | sed 's/\mathrm/\,\\mathrm/g' \
 | python FixTableCaption.py \
 | sed 's/\caption{\(.*\)}/\caption{\1\\label{fig:\1}}/g' \
 > $(MDSCRIPT:.md=.tex)
無事、キャプションが上にきました。
\section{表}\label{ux8868}

表

\begin{longtable}[c]{@{}llll@{}}
\caption{例\label{fig:例}}
\\
\toprule\addlinespace
A & B & C & D
\\\addlinespace
\midrule\endhead
11111 & 222 & 33 & 4
\\\addlinespace
5 & 6 & 7 & 8
\\\addlinespace
\bottomrule
\addlinespace
\end{longtable}

キャプションが\end{longtable}の直前にこない場合に遭遇すると失敗しますが、そうなったことがないので、一旦気にしないことにします。

まとめ

これが本当に良い方法なのかわかりませんが、とりあえずキャプションを上に持ってくることができました。
根本的に、pandocから出てくるときにキャプションを上にしておく方法などがあれは、ぜひ教えてください。