nyabot’s diary

電気猫の夢を見るお話

Fusion360+3Dプリンターで自作ロボットのしっぽを作る

しっぽを作ったのでまとめ。 1号には尻尾がなかったので、もしかすると最大の変更箇所になるかもしれない。

尻尾の役割1:表現に使う

ロボットの尻尾には、2つの機能・役割を持たせます。
一つは、表現のための可動。生物と比較すると、自作ロボットは表情や発声による感情等の表現が難しく、どうしても劣ります。しかしながら、表情や発声のパターンを増やして表現力を高める、といった方向性は今の自分には難しく、できそうにありません。
そこで、代わりに足や尻尾の動きで多様な表現ができるようにしたいと思っています。
足には自重を支えるという役割もあるため、あまり自由には動かせませんが、尻尾はどのような状況でも比較的自由に動かすことができ、ロボットの行動とリンクさせて表現に用いるのも容易なはず。

尻尾の役割2:赤外線照射角度の調整に使う

もう一つの役割は、家電操作用の赤外線LEDの照射角度を変更すること。
ロボットには赤外線LEDを搭載し、万能リモコンとして記憶させた赤外線を発することで家電を操作します。対象の家電はテレビや照明、エアコンなどの予定ですが、それぞれの家電はロボットから見て上方向や前方向など別々の角度にあるため、一工夫必要になります。
具体的には、以下のような方法が考えられます。

  1. 角度が違っても反応するくらいの強さで赤外線を発する
  2. 赤外線LEDを全方向に取り付ける
  3. 対象に合わせて赤外線LEDの向きを変更する

1はLEDに大電流を流すだけですが、通常LEDはそこまでの大電流に対応していないため、壊れたり寿命が短くなったりしそうです。
もっとも簡単なのは2の全方向にLEDを取り付ける方法ですが、見た目も考慮するとあまり個人的にはやりたくなく……。
尻尾の先端にLEDを取り付けたい、という考えもあり、尻尾を動かして赤外線の照射角度を変更できるようにする方法をとりました。
もっとも、対象とする家電の位置の把握は実装が難しそうなので、当面の間は天井の照明に向けるか正面のテレビに向けるか、という程度になりそうですが。

リンク機構を用いた尻尾の試作、失敗

当初はリンク機構を用いた設計にしていましたが、実際に印刷してみるとガタつきが大きく、角度を指定して固定するのは難しい状態でした。

プリントするまでもプリント後も、何度も修正を繰り返しようやくできたモデル。

f:id:sizohu:20200831213148j:plain

動作の増幅率が大きいため、ギアを使ってサーボのトルク不足を補う設計です。
リンクを用いた動き方も生物的な柔らかさがあり、複雑な構造は機械っぽさもあり、かなり気に入っていたのですが、結局ゼロから作り直すことに。
ガタつきの原因は0.2mmくらいの印刷誤差と思われるため、FDMではなく光造形のプリンターなら(あるいは高精度なFDMでも)うまくいくかもしれません。いつか再挑戦するかも。

シンプルな尻尾の設計

根元から縦横に動かす、という単純な構造で作り直した尻尾がこちら。

f:id:sizohu:20200822225052p:plain

尻尾を上げたときに、先端がロボットの頭部より高くなるようにしたかったため、長さ約20センチと少し長めの設計になっています。 尻尾の胴(?)部分は後々塗装することも考慮し、二層を重ねるかたちにしました。
先端はLEDとレンズを仕込むために複数のパーツを組み合わせています。
尻尾の根元、サーボモータを固定する部分は、動作を安定させるためサーボ(MG90)を両軸化し、加えて外からサーボが見えなくなるように作ってあります。
なお、メンテナンス性を考慮し、胴部と根元、先端はネジとナットで固定しつけ外しができるようにしてあります。
配線用の空洞も、先端から根元までばっちり通っています。「配線用の穴を空けたまま、いかに部品同士を固定するか」という点に一番頭を悩ませました。
複数作成する足と違い、一つ作るだけの尻尾は部品数を多くしても印刷や組み立ての労力をあまり気にしなくていいのが良いところですね。

3Dプリンターで一部出力した後、動作テストの様子。

動くように作っているとはいえ、実際に無事動くかどうかを試す瞬間は毎回緊張します。
動作させる上での注意点として、動かすスピードを速くすると(サーボモーターの角度を直接指定すると)トルクが負けてしまいます。重量だけ見てトルクは足りるだろうと高をくくっていたので少し焦りました。。
そこで、今回はループ処理で指定角度を徐々に変えるようにし、ゆっくりと動かすようにしています。
サーボそのままの速さでカクカクと動くロボットはあまり見かけませんし、基本的なことなのかもしれません。

足としっぽはサーボモーターの大きさにあわせて設計する必要がありました。
今後は足としっぽのサイズに合わせて、バランスをとりながら胴体と頭部を作成します。各種センサーやモジュールなどの配置を考慮して設計する必要はあるものの、可動しない部位はそこまで寸法をシビアに決めなくていいので楽……だといいなぁ。

つづく。

Fusion360で作ったモデルをAR.jsで表示させる

Webで表示するARモデルを作ったので、表示するまでのざっくりした覚え書き。
間違った方法・非効率な方法が満載な気がするので、とりあえず形になればいい、という人以外は真似しないでください。

対象:Fusion360を使ったことがあり、3DCGソフトが全くわからず、色つきのARを手軽に作りたい人

Fusion360でモデルを作る

まずは表示するモデルを作ります。
モデルが複数のボディ・コンポーネントで作成されていると、Webで表示する際に重なった部分がぶれてしまうようなので、結合しておくといいかも。

Fusion360で外観を指定する

大まかに外観を指定します。
ここで指定した外観は、実際に表示するとき色味や質感がかなり変わってしまうので、適当でOK。
色分けができたら、FBX形式でエクスポートします。

Blenderで色や質感を調整

Blenderをインストールします。
Blenderを使いこなせればBlenderだけで全部なんとかなりそうな気がしますが、私はメニューに書かれた用語から各画面まで、何が何だかさっぱりでした。
今後使う予定があるなら学ぶと良いのでしょうが、ここは学習コストをかけないことにしました。
大まかな手順は以下。

  1. FBXファイルをインポートします。(軸の方向がFusion360と違います。手動でYが前にするといいかも。)
  2. 対象の色を設定している部分を調整します。
  3. glTF2.0(glb)でエクスポートします。

※ しっかり色分けしなくてもいい場合は、fbxからglbに変換するWebサービスを使うと簡単です。
使える外観が限られているのかわかりませんが、いろいろ失われがちで私は断念しました……。

マーカーを用意する

オリジナルのマーカーを使用する場合は、マーカー画像を作ります。 普通の画像を用意すれば以下のジェネレータで簡単に作れるので、オリジナルにした方がたぶん楽しいです。

jeromeetienne.github.io

公開環境を用意する

SSLで暗号化された公開環境が必要になります。 NetlifyとBitbucketというサービスを組み合わせて使うのが無料で良さそう。

gitを使う必要があるので、インストールして基本的な使い方を学びます。

HTMLを書く

<html>
  <head>
    <title>AR test</title>
    <script src="https://aframe.io/releases/0.9.2/aframe.min.js"></script>
    <script src="https://cdn.rawgit.com/jeromeetienne/AR.js/1.7.7/aframe/build/aframe-ar.js"></script>
  </head>
  <body>
    <a-scene embedded arjs="debugUIEnabled:false; sourceType:webcam; debpatternRatio:0.50;" vr-mode-ui="enabled: false" renderer="gammaOutput: true;">
        <a-marker type="pattern" url="pattern-marker.patt" >
          <a-gltf-model src="ar-model.glb" scale="0.4 0.4 0.4" position="0 0 0" rotation="0 0 0"></a-gltf-model>
        </a-marker>
        <a-entity camera></a-entity>
    </a-scene>
  </body>
</html>

scaleで大きさ、positionで位置、rotationで角度を調整します。 マーカーの生成時にPattern Ratioを変更した場合は、debpatternRatioの値をあわせます。 ライトは指定しなくても設定されていますが、変更したい場合は以下を参考に。

https://aframe.io/docs/1.0.0/primitives/a-light.html#attributes_intensity

カメラの設置方法はググったら他の書き方も見られましたが、私がうまくいったのは上記の記述方法でした。(公式ドキュメントが見つけられなかったため手探り)

他にもアニメーション等も設定できるようです。

完成

公開したら、スマホSafariChromeからページを開き、ARマーカーをカメラにとらえます。
うまくモデルが表示されたらOK!

多脚歩行ロボットの脚部の設計

多脚歩行ロボットの足の設計とプリントをしました。
見た目の面でも機能面でも脚部が占める割合は大きく、設計に際し留意する項目も多くなりました。
かなり個人的なメモ的内容ですが、多脚ロボットを作りたい誰かの参考になれば幸い。

当初は8足駆動にする予定でしたが、足の動作スペースの確保と後述する電流量がネックとなり、現在は6足を想定しています。

足の作成にかかった時間や労力の割合は、前提知識の習得3:部品の選定1:構想3:CAD1:調整2、といったところ。
知識ゼロからのスタートだったため、"何を学ぶべきか"から学ばなくてはならない、というなかなか難儀なことになっていましたが(いつもですが)、なんとか納得いく形にたどりつきました。

できあがったCADデータはこんな感じ。

f:id:sizohu:20200602125604p:plain

f:id:sizohu:20200602125634p:plain
陰線エッジ表示で各面から。

以下、実際に考えたこと・やったこと等を書き連ねていきます。

関節について

関節はサーボモータで動かします。
サーボモータは角度を指定して動作させることができるモーターで、ロボット作りでは関節にはこれを用いるのが定石となっているようです。

サーボモータの選定

市販のサーボモータには様々な種類があります。以下を基準に、採用するサーボモータを検討しました。

  1. トルク
  2. 価格
  3. 動作電圧
  4. 動作角度

1.トルクはどれだけの力でモーターを動かせるかという値で、大きいほど動作の安定につながります。
一方で、高トルクのサーボモータは消費電力も重量も大きい傾向にあるため、予め必要なトルクを見極める必要があります。
トルクの計算については後述します。

2.価格はサーボモータの種類によって様々で、一個あたり数百円から数千円です。
今回作成する多脚ロボットでは、足だけでも軸数(3軸)×足数(6本)=18個と、多数のサーボモータが必要になります。あまり高価なものは予算の都合上使用できません。

3.動作電圧はサーボモータの種類によって一定の範囲が定められており、指定の電圧の電源を用意する、もしくは使用する電源の電圧にあったサーボモータを選ぶ必要があります。
今回は、ロボットの頭脳として使用するRaspberry Piの動作電圧に合わせて5Vの電源を用意するため、サーボモータも同じ電圧で動かす予定です。
(2セルリポバッテリの7.4Vを降圧して5Vにしますが、電源を共通にするとサーボに負荷がかかった際に電圧降下でラズパイが落ちる恐れがあるため、何かしら対策予定です。コンデンサを使えばいけるのかな?)

4.サーボの動作角度は180度(プラスマイナス90度)が多いようですが、それ以外のものもあるため、留意します。

上記を踏まえ、使用するサーボモータはMG996R(MG995でも可)とMG90S(SG90でも可)に決定しました。
どちらも5Vで動作します。入手性が高いのも○。
価格は国内で1,000円/個くらい、中国からの個人輸入(正規品でない?)なら300円/個くらい。安心を取るか価格を取るか、といったところですね。

ちなみに、MG90SはSG90とスペックはほぼ同じですが前者はメタルギアで値段がほぼ倍となっており、どちらを使うか悩ましいところです。
試しに一つだけ買ったMG90SとSG90を比較したところ、MG90Sの方が心なしか指定角度でプルプルしたりせずしっかり止まるので、こちらを使うつもりです。

やや話が逸れますが、もし予算に余裕があれば、秋月電子で販売されている薄型サーボ「[GWSサーボ S11HP/2BBMG/JRタイプ](http://akizukidenshi.com/catalog/g/gM-01724/)」を使いたいです。現在2,200円/個で販売されていますが、今回は予算オーバーです。MG996Rよりトルクはやや劣るものの小さく、これを使えば足をより細くすることができ、例えば8足に増やしたとしても、干渉したり不恰好になったりしにくいはず。8本×2軸×2200円=35200円、8本×3軸×2200円=52800円……。 一般的に多脚ロボットが多数の足を持たされるのは、悪路や過酷な環境での走破性・安定性を求めた結果です。実際に各国で実用化を目的に設計された多脚ロボットを調べてみると、宇宙や火山、砂漠など、タイヤやキャタピラでは走行困難な場所での活動を前提とされたものがほとんどです。 しかし、ロボットの足はただ歩くためだけにあるわけではない、と私は考えます。我々人間がジェスチャーを用いて意思の疎通を図ることができるように、多脚ロボットは足を用いて様々な表現をすることも可能です。足の数が多ければ、それだけ多様な表現が可能になるはずです。と、将来的に8本に増やしたいなぁという願望を綴っておきます。

トルクの計算

データシートにあるストールトルクは以下。

  • MG90S:1.8kg/cm(4.8V)
  • MG996R:9.4kg/cm(4.8V)

ストールトルク≒最大トルクですが、出し続けてはいけないトルクなので、余裕を持たせて設計をします。
1.8kg/cmという値は、サーボモータの軸から1cmの距離で1.8kgのものを持ち上げる力がある、ということだそうです。
距離が2cmなら0.9kg、3cmなら0.6kgと、距離に反比例して力は弱くなります。

作成するロボットの総重量は2.5kgほどを想定しており、歩行時に接地している足数(最少3本)でそれを支えなくてはなりません。ロボットの重量(2.5kg)/最少接地足数(3本)でおよそ0.83kgが一本あたりで支える重量となりますが、これはそれぞれの足に均等に重さが加わった場合の値であり、実際にはこの数値に対しても余裕を持たせて設計する必要があります。

f:id:sizohu:20200601113354p:plain

上図において、トルク計算に用いる距離は、A(サーボの中心から動作させる点間の距離)ではなく、B(サーボの中心と動作させる点間の水平距離)になるそうです。
以上を踏まえると、余剰トルクを仮に100%とした場合、MG90SならBをおよそ1cm以内(1.8÷(0.83×2)≒1.07)、MG996RならBをおよそ5.6cm(9.4÷(0.83×2)≒5.62)以内に収めればいい、ということがわかります。
本当は水平方向のトルクも計算しておくべきなのでしょうが、加わる力の算出方法がわからないのと、垂直方向の必要トルクよりも小さくなるだろうと見て省きます。

f:id:sizohu:20200601113921p:plain

今回作成する足は上図のような形を想定しているので、サーボ1に高トルクのMG996R、サーボ2にMG90Sを使い、各節の長さを調整すればなんとなくできそうですね。

多脚と電源

少し足自体の話からは脱線します。
多脚ロボットの自作において、最も頭を悩ませるのは電源かもしれません。
サーボモータを用いて多数の可動軸を持たせる今回のような設計では、歩行時に大量の電流を要します。

サーボモータを一つ動作させるのに仮に1A必要だとすると、6足の場合6A(3足2軸同時動作)、8足なら8A(4足2軸同時動作)程度の電流は使いたいところ。
実際にサーボを動かした際の電流量はMG90S、MG996Rのどちらも1A以下でしたが、MG996Rのストール電流は1Aよりも大きそうな気がします。
加えて、同時に動かさないサーボも、角度を保持するためにある程度の電流を常時必要とします。
足を一本ずつ動かす歩容にする、など消費電流量を抑える方法は考えられるものの、その分歩行速度が遅くなり、動きが緩慢な印象になってしまいます。

当初は安全性の高いとされるニッケル水素電池で動かすことを目指していましたが、購入したニッケル水素電池をテストしたところ、電圧を落とさず流せたのは2A程度。
これでは必要な電流量を賄うことができないため、放電能力の高いリチウムポリマーバッテリを用いることにしました。

リポバッテリであれば十分な放電能力を持った製品が数多くありますが、サーボモータを動作させる際には変圧が必要になることが多く、その場合、今度は変圧器がボトルネックになって大電流を流せない、というケースに陥りがちなように思います。
そこで、15Aまで流せるという大きめの降圧レギュレータを輸入したので、追々試してみます。

なお、発火や爆発等の大事故を起こしがち、ということで敬遠していたリポバッテリですが、発火に至る仕組みを一通り学んでみると、しっかりと適切な管理さえすれば危険性はそれほど高くないように思えました。それでも念のため、保管用に金属製の弾薬箱を購入。こんなやつ↓

海外の検証動画によると、これの蓋のシーリングを剥がして使うのが比較的安全らしいです。
それにしても、ロボットのエネルギー源が爆弾になるのって映画の世界だけじゃないんだなぁ。

電源周りについては、電圧の監視をはじめ色々とやることがあるので、いずれ別記事にまとめる予定です。

3Dプリント用データの作成

使用するサーボモータが決まったら、次はその組み方を考えます。 以前購入した3Dプリンターと、勉強を始めたfusion360がようやく出番を迎えます。

まず、最低限抑えたいことは以下の2点です。

  • サーボを両軸にする
  • トルクを考慮する

安価なサーボモータは片側にのみ軸があり、そこから動力をパーツに伝えます。
動作する軸の反対側にも軸を設けることで、軸にかかる力を分散させ、動作時のブレを抑えたりすることができます。
マーク1作成時にもSG90サーボを使って低精度ながら挑戦しましたが、両軸化をやるのとやらないのとではかなり安定感に差が出ました。

そして、前述したトルク計算の結果から、各パーツのサイズを検討・調整します。
各部位が大きすぎるとトルク不足になりますが、小さすぎると見栄えがよくなかったり歩幅が小さくなるため、いい塩梅に調整します。

さらに、以下の条件を加えます。

  • 部品の固定はネジで行う
  • 外装パーツとフレームパーツを分ける
  • ネジ、サーボモータ、配線などを隠す
  • ある程度の強度を持たせる
  • 曲面を取り入れる

私が作りたいのは、単なる玩具ではなく、生活のパートナーです。

長期的な使用を前提とし、各部品は劣化・破損時等に個別に交換できるよう、基本的にすべてネジとナットで固定します。
また、外装は後々塗装する予定なので、骨格としてサーボモータを固定するフレーム部と外装部は別パーツになるよう設計します。
配線やサーボモータが露出すると自作ロボット感が出すぎるので、可能な範囲で覆い隠します。

各部位にはそれなりの負荷が加わることが想定されます。
折れたり曲がったりしないよう、厚みや形状にも配慮が必要です。計算は知識がなくできそうにないので、試行錯誤します。
ちなみにマーク1を作った際は、部品同士を接着剤で固定していたため、動作させるうちにそれが剥がれたり、加えてトルクや電流の計算を知らずに作ったために、次第に生まれたての子鹿のようになってしまいました(それはそれでかわいい)。

元気な頃のマーク1はこちら。

曲面を使用する意義

さて、日々自作ロボットの動画をyoutubeで眺めていると、どうも平面だけを用いたデザインが多いことに気がつきます。マーク1も平面が多かったことを思い出します。
金属板やプラ板などを素材として利用すると、どうしても曲げ加工は困難で、曲面を作ることが大変だということに気がつきます。また、曲面を用いたところで構造的なメリットが薄いため、自作ロボットが直線や平面を多用したものになるのは自然なことなのでしょう。

翻って考えると、曲面を用いれば、それだけで多くの自作ロボットとは違う印象を自他に与えることができる、とも捉えることができます。
特に重要なのは、自分の認識に影響を与える、という点です。実際はそうでもなくても、「この子は特別なんだ」という思い込みを持てることが大事です。
ロボットの完成はまだまだ遠いうえ、SNSを覗けば天才か賢者か魔法使いなのでは?と思える方がごろごろいらっしゃいます。こういうところでモチベを高めておかないと挫折しかねません。

3Dプリントに際しての留意項目

パーツの出力には熱溶解積層方式の3Dプリンタを使用するため、以下のような欠点も頭に入れておく必要があります。

  • 0.数mmの誤差が生じる(印刷誤差+素材の熱収縮)
  • 一定角度以上の傾斜にはサポートをつける必要があるが、きれいに取るのは困難

パーツ同士やパーツとサーボモータの接合面、ネジ穴などには0.2mmから0.8mmくらいの隙間を作っておくと、いい具合に収まります。
ネジ穴に関しては、固定するのか軸にするのかによっても多少大きさを調整します。穴を円で作成するか多角形で作成するかによっても、多少大きさが異なります。
パーツのCADデータの作成前に、0.2mm単位くらいで複数の径の穴を円と多角形であけたモデルを作成・プリントし、試しておくと良いと思います。
なお、テストプリントに使用したPLAは他のフィラメントと比較して収縮しにくい素材のようなので、本出力ではABSやPETGなどを使用することを考慮して気持ち緩めに設計しました。

また、水平に近い角度の面を出力する際には、印刷開始面を作り出力物を支えるためにサポートを使用します。

f:id:sizohu:20200601113336p:plain

形状によっては必要不可欠なサポートですが、基本的にあまり綺麗には取り除けません。無闇にサポートをつけると、出力後にサポートの除去ができなかったり、表面が汚くなったり、サポートを取るときにパーツが折れたり割れたりします。しました。
私のプリンタの場合、水平から45度くらいまでの傾斜であればサポートなしでもある程度きれいに印刷でき、30度くらいではサイズが小さければ印刷はギリギリできるものの、印刷面がブレます。オーバーハングというらしい。
設計時には、出力の向きと各面の角度を考慮し、極力サポートを減らすよう心がけると良いです。
また、2mm径ほどの小さな穴にサポートをつけると、サポートが一体化して穴が完全にふさがってしまう場合があります。円ではなく多角形を用いるとサポートなしで穴を作れるので、小径かつ横向きの穴は特に多角形で作成するのがおすすめです。

f:id:sizohu:20200601113343p:plain

また、3Dプリンタ(熱溶解積層方式)は出力結果を左右する要因がかなり多く、気をつけていても一定の確率でプリントに失敗します。たぶん私だけではないと思います。
出力時間も一辺5cmの直方体くらいのサイズで1時間弱くらいと中々かかるため、部品点数が多くなる(=印刷回数が多くなる)のは精神衛生上よくありません。部品点数は可能な限り少なくしたいです。
仮に、部品が1点増えれば足数6として計6点、一度に複数印刷できないサイズ・形状であれば印刷回数が6回も増えます。6回に1回くらいは印刷も失敗します。
と書いたけどこれは完全に単なる設計力不足。

先述したサポートも、手間さえかければ綺麗に除去することが可能なケースもあります。しかし、印刷と同様に、足の本数とパーツの数だけその手間がかかります。
……多脚が流行らない理由が少しわかる気がしますね。

試作品の完成

上記すべてを踏まえ、実際にプリントした3軸可動の足がこちら。

f:id:sizohu:20200603154910j:plain
組み上げ前

f:id:sizohu:20200603154822j:plain
伸ばしたところ

f:id:sizohu:20200603154814j:plain
曲げたところ

一足あたりのプリントするパーツ数は7、足の付け根は角張っていますが、胴部に納まるため問題ありません。
爪先は別パーツになっており、足先が外に出たときのトルクを考慮して内側に少し入れ込んでいます。また、後から接地の微調整をする際も爪先だけ作り直せばいいので、プリントが楽になります。 配線は一部露出しますが、基本的には外装パーツとサーボモータの間に隙間を設けて通しています。

各ネジ穴はサポートを使用しないで印刷できるよう6角形で作成しています。
また、固定に使用しているネジは、サーボの固定に2M×6mmを10本、パーツ同士の固定に同じく2M×6mmを7本使用しています。
サーボの両軸化には、シカゴネジ?と呼ばれるものを見つけ、使用しています(5M×6mm)。 本当は軸にはベアリングとかも使うといいのでしょうが、一旦はこれだけで作り、様子を見ようと思います。

ちなみに、今回ここに至るまで各パーツ3度ほどプリント→設計修正を繰り返しました。CADでは問題なかった部分が印刷すると0.数ミリ合わなかったり、気づかないミスがあったり……。

f:id:sizohu:20200603155244j:plain
使われなかった部品たち

プリントして初めて得られる気づきも多く、設計→プリント→修正のサイクルをいかに早く回せるようになるかが今後の課題ですね。

つづく。

追記。動かしてみた

Raspberry Piで赤外線の送受信をする

以前の方法(以下記事)では、赤外線の送受信が完全ではなかったので、作り直しました。

nyabot.hatenablog.com

今回作りたい赤外線送信モジュールの条件は以下。

  1. テレビ以外の電子機器も操作できること
  2. 数メートル離れた位置から操作できること
  3. 多少角度が違っても赤外線が届くこと
  4. LEDを複数使わないこと

赤外線LEDはロボットの尻尾に搭載する予定なので、角度を変えて複数個LEDを設置する、という方法はとりたくありません。 そのため、基本方針として電流とソフト側の調整でなんとかしたいと思っていました。

ソフトに関しては、以下の記事をもとにpigpioを導入し使用します。

qiita.com

赤外線送信部の回路についてだけ、いくつか変更をしています。
上記記事でFETを使用しているところを、メジャーなトランジスタ2SC1815GRで代用。抵抗も少し大きくしています。

前回のLIRCを用いたテストでは、50mA程度の電流でも十分に機器の操作ができたことから、今回もLIRCのときと同じ電流値50mAで試したところうまくいかず。
機器が全く反応しないため、てっきり設定等にミスがあったかと思い色々試すもうまくいかず。。
そのまま数ヶ月放置していたのですが、結局、電流を大きくしたら無事動作が確認できました。

赤外線LEDに流す電流量について

赤外線LEDに流す電流の大きさですが、お高いLEDだと絶対最大定格が300mAのものがあります。電流が大きければ大きいほど赤外線は遠くまで飛ぶはずですが、私の場合は電流は300mAに収まる程度で十分と予想。そもそも前回は50mAで届いたので、200mAもあれば十分かなぁと(部屋も広くないし)。
上記記事の引用先を読んでみたところ、より大きな電流を流そうとする場合、2SC1815ではhFEの降下があるためFETを使用した、ということみたいです。なるほど。

抵抗計算

抵抗器は47Ωと4.7kΩの2種類を使用します。
抵抗器にも定格電力があるので、それをオーバーしないように計算。

抵抗器の定格電力は、次の三種類があるみたいです。

  • 1/4W
  • 1/2W
  • 1W

今回は低い抵抗で大きな電流を流したいため、1Wの抵抗器を追加で購入しました。 抵抗器に流れる電流と電圧は、以下のようになります。

47Ω抵抗器に流れる電流

I = V / R
I = 5[V] / 47[Ω]
I ≒ 0.106[A] = 106[mA]

電力は電流と電圧の積だから、0.106*5でおよそ0.53Wになるはず。

定格電力は値の半分以下で使用するものらしいので、1Wの半分と考えると若干オーバーしていますが、赤外線LEDに電気を流す時間はごく短時間なので問題ないだろうという考え。

LEDに47Ωの抵抗器を並列に二つ繋いで、合計最大約212mAの電流が流れるようにします。
実際に流れる電流は、トランジスタ2SC1815のベースに流す電流によって決まります。

4.7kΩ抵抗器に流れる電流

I = V / R
I = 5[V] / 4700[Ω]
I ≒ 0.00106[A] = 1.06[mA]

およそ1mA。ラズパイのGPIOに流す電流は8mAまでにすべきですが、この電流量なら問題ありません。
今回用意したトランジスタ2SC1815GRの増幅率(hFE)はデータシートによると200~400なので、コレクタからの電流はおおよそ212~424mA程度までエミッタに流れることになります。つまりエミッタおよびLEDには、先ほど計算したコレクタに流れる電流の最大(約212mA)+ベース電流(約1mA)=約213mAが流れる。はず。

赤外線送信回路

赤外線送信部の回路は以下のような形に(実際は向きや配置を少し変えているけど、わかりにくかったので調整)。

f:id:sizohu:20200421112800p:plain

トランジスタの各足は、画像の左から順にエミッタ、コレクタ、ベースになっています。
ラズパイからは5Vを赤外線LEDの陽極に、GPIO17をトランジスタのベースに繋いでいます。

実際はこれに赤外線受信モジュールが加わりますが、回路図作成ソフトに該当する部品が見つからなかったので省略。

結果

pigpioのインストール、上記記事にある設定およびIR Record and Playbackのダウンロード後、以下のコマンドで学習&送信。

学習

例)GPIO18を用いて照明ONの赤外線コードを学習、codesファイルに記録

$ python3 irrp.py -r -g18 -f codes light:on --no-confirm --post 130

送信

例)GPIO17を用いて、学習した照明ONの赤外線コードを送信

$ python3 irrp.py -p -g17 -f codes light:on

動作は完璧!
大体の角度だけあわせてあげれば、3mほどの距離から問題なく機器の操作ができるようになりました。

失敗もしつつ、数ヶ月越しに完成したからとても嬉しい。

つづく。

DHT22を使用して気温と湿度を取得する

Raspberry Piで気温と湿度を取得してみたのでメモ。
取得した温湿度データは、ロボットの対話・家電操作機能に利用する予定です。気温が一定の範囲を超えたり湿度が一定値を下回ったりしたときに、家電を付けてくれたり、注意を促してくれるようにしたい。
実用面で言えば、細かい気温・湿度の取得はあまり必要なく、だいたいの数値さえわかれば発話等の判定に使うことができます。そのためDHT11でもよかったのですが、湿度0.1%単位で計測できる自宅の温湿度計に負けるのが嫌だったので、細かい数値で計測可能なDHT22の方を選択。機能はとりあえず盛っておこうという安直な考え。

DHT22の購入はAliexpressで、値段は国内の1/3くらいで買えました。国内のショップで買うならDHT11にしてたかも。

プログラム等は以下を参考にさせていただきました。とっても助かりました。ありがとうございます!

ラズパイで温湿度を測定(DHT11) | そう備忘録

ラズパイで温湿度を測定(DHT22) | そう備忘録

データシート見てもそれをどうプログラムに反映すればよいかわからなかったので、これ自分じゃできなかったろうなぁ……。勉強していかなくては。
上記記事の通りにdht11関連のモジュールをダンロードしてリネームし、一部書き換えてからサンプルプログラムを作成。
配線も上記の記事の通り。3本しかないので簡単。
電源は3.3Vで問題なく動作しました。

実行。

f:id:sizohu:20200319090711p:plain

10秒ごとに数値が取得できればOK。

市販の温湿度計と数値もほぼ同じだったので、ばっちりです。