コンテンツにスキップ
地震や土砂災害、海上輸送の影響で一部地域に配送遅延が出ている可能性があります。心当たりのある地域にお住まいの方は、こちらから詳細をご確認ください。
大雪や地震、土砂災害、海上輸送の影響で一部地域に配送遅延が出ている可能性があります。心当たりのある地域にお住まいの方は、こちらから詳細をご確認ください。
ネコと楽しむ やさしい電子工作ライフ その3

ネコと楽しむ やさしい電子工作ライフ その3

 こんにちは。スイッチサイエンス・マーケティングアドバイザーのSHIGS(シーグス)です。

趣味で電子工作を楽しむメイカーでもあります。ただし私のテーマはいつも一つ。

「電子工作とネコ」。

「最近、電子工作を始めました」「電子工作に興味はあるんだけど、何を作ったらいいのかわかりません」そんな電子工作ビギナーの方でネコを飼っていらっしゃる方もいると思います。「もしかしたら、私の『ネコと楽しむ やさしい電子工作ライフ』がお役に立つかもしれない」そんな思いでブログを書かせていただいてます。

 

●マイキャットご紹介

 私のネコ飼い歴は、電子工作歴よりはるかに長く、20年以上になります。現在もノルウェージャンフォレストキャットとスコティッシュフォールドの2頭を飼っています。血統種にこだわったわけではなく、贔屓のネコカフェが閉店の憂き目に会い、たまたま引き取った2頭がこの品種だったというわけです。2頭ともオスの去勢ネコでともに10歳を超えています。彼らのための工作に日夜励んでおります。

↑マイキャット。左がミー(ノルウェージャンフォレストキャット)で右がハッピー(スコティッシュフォールド)。

<第3回 光が変化! ネコライト>

◎製作編

●今回のターゲット

 窓辺から差し込む光が腕時計などに反射して、暗いところに映った光をネコちゃんが追いかける。そんな光景を見たことはありませんか? ネコは光が大好きです。市販のネコおもちゃにも様々な光をつくってネコちゃんと遊ぶグッズがあります。電子工作してみたいと思います。

 どうせなら、ネコが好きそうな形や色に変えたり、アニメにして像を動かしたりすれば、ますます喜んでくれて楽しそうです。LEDをマイコンでコントロールするプロジェクターをつくりたいと思います。

 光そのものの調節はマイコンでできますが、鮮明な画像をつくるにはレンズが大切です。レンズを使うとなると、光源からの距離(焦点距離)、レンズからスクリーン(壁)までの距離など、を考えることがポイントになります。

 基本的な構想としては、遮光性のある筐体を用意し、先端にレンズ、後端に光源となる装置をセッティングします。構造は単純ですが、どんなレンズを使うかによって、焦点距離が決まってくるので、筐体の大きさ、長さなどが変わります。また光源の強さによっても像の明るさが変わります。試してみないとわからないことが多く、それなりに手間がかかりそうです。まあ、その手間が楽しいのですが…。

 全体としては図のような構成になります。

↑全体の構成図。

 まずは100円ショップの拡大鏡ルーペで使われているものを自分の目でチェックして入手しました。筐体についても遮光性の問題があるので、使えそうなものを集めてみました。

 筐体、レンズ、光源の組み合わせが今回は工作のポイントになります。「100円だから」と買ってはみたものの全部が使えるわけではないので、もったいない感はぬぐえません。しかし実はこの中に大あたりの組み合わせがあったのです。

↑入手したいろいろなレンズ。

↑筐体になりそうな部材。

●焦点距離を探る

 薄暗い室内で筐体から1mぐらいの床や壁になるべく鮮明な像が映せることが理想です。筐体の長さは30cmぐらいまでに収めたいところです。まずはどのレンズが使えそうか、大雑把に実験してみることにしました。

 光源としてmicro:bit<https://switch-education.com/products/microbit/>に載っているLEDを使うことにしました。25個のLEDがすべて点灯するプログラムをつくって光らせます。電源には電池ボックスを使いました。

 光源は固定で、筐体はこの段階では使いません。知りたいのはレンズと光源の距離なので、壁までの距離や像の明るさは気にしないことにしました。暗いところで各種レンズをかざして、光を白い壁に映します。

 像が結べなかったり、結べても近すぎるなど、結果はいろいろです。最終的にレンズA(口径60mm)、レンズB(口径40mm)の大小2つのレンズとカードレンズ(80mm

×40mm)の3種を選びました。それぞれ、大雑把な焦点距離は10cm~20cmという感じだったので筐体には入りそうです。

↑簡易的に焦点距離をチェック。

↑選んだのは3種類のレンズ。右からレンズA、レンズB、カードレンズ。

●筺体にお菓子の空き箱を使ってみる

 レンズの大きさから考えてお菓子の箱が適当な筐体になりそうだったので、使ってみることにしました。全長は約24cm。先端にレンズを固定し、micro:bitを、6cm、12cm、18cm、24cm(後端)と距離を変えて設置しました。この組み合わせでどれが理想に近い1m先の壁に鮮明な像が結べるか探ります。

 多少面倒に思えますが、100円ショップのレンズでつくるプロジェクターですからこれぐらいの手間は致し方ないかと。やってみると小学校の夏休みの自由研究のようで案外おもしろかったです。

 でもこの実験はネコたちが部屋にいない状態で行いました。光を追いかけかねないので。何かを察知したのか、ネコたちは部屋のドアをガリガリして「開けてくれ」アピールをしています。いつもならすぐに開けてあげるところですが、「後でたっぷり遊んであげるから」と思いつつ、聞こえないふりをしました。そのうちネコたちもドア前から去ったようです。あきらめが早いのもネコのいいところです。

 実験に取り組むことおよそ1時間。組み合わせとしては、光源までの距離を24cmにしたときのレンズA、12cmにしたときのレンズBが残りました。いずれも50~80cmぐらい先の壁で、ある程度見える像を結びました。

↑きれいに像が結べた。

●新アイテム登場で一気に明るく

 レンズは2種までしぼれたのですが、どうにも気になる点が出てきました。明るさは周りの暗さとの兼ね合いでもあるのですが、そもそも足りないように思えます。プログラムを修正して明るさを最大値にしてみましたが、物足りなさは拭えません。

 思案の挙句、新アイテムを導入しました。フルカラーLEDボード(Matrix)<https://switch-education.com/products/microbit-ledboard-matrix/>です。

 25個のフルカラーLEDが載っているボードで、各LEDは個別にコントロールすることができます。これだと色の変化をつけることができるので、つくれる像のバリエーションが一気に広がります。大きさもほぼmicro:bitと同じで扱いやすそうです。micro:bitとの接続にはワークショップモジュール<https://switch-education.com/products/microbit-workshop-module/>を使用します。

 プログラムで全LEDを白色点灯させると明るさはハンパではありません。あらためてレンズAとレンズBを試しましたが、どちらもいい感じで、昼間の室内でも像がぐっと鮮明になりました。

↑ワークショップモジュールに接続したフルカラーLEDボード(Matrix)。

↑フルカラーLEDボードで画像がぐっと明るくなった。

●筺体も決まった

 手に入れた筺体候補にちょうどいいものがありました。ティッシュを収納する四角い縦型の筒です。先端にティッシュを抜き取るための穴が開いています。ちょうどレンズが活かせそうな大きさです。後端はふた状になっており、取り外し可能でコードの出し入れに都合のいい穴まで開いています。

「先端にレンズを、後端のふたの内側にLEDボードを貼り付ければ、もう完成じゃないの?」 

 レンズをセロテープで、LEDボードを両面テープで貼り付け、側面にワークショップモジュールを同じく両面テープで固定すると、もうバッチリ。後端の穴から出たコードをワークショップモジュールに挿せば完成です。

 最後にレンズAとレンズBのどちらを採用するか? できあがった筺体に貼り付け、試してみて最終的にレンズAとLEDの組み合わせを組み込む形にしました。

 結果的に100円ショップのものだけで完成です。電子部品を除けば4アイテムで400円。予算的にはリーズナブル。うまい筺体が見つかったおかげです。

 「さあ、どんなプロジェクションでネコたちを喜ばせてやろうか?」

 腕をぶしてプログラミングに取り組みます。

↑できあがったネコライト。

◎プログラミング編 

●NeoPixelのお作法

 今回使うフルカラーLEDボードは、Adafruit社の「NeoPixel」という製品です。制御のための拡張機能がMakeCodeには用意されています。ただ、使うときには押さえておかなければならないポイントが4つあります。

①「最初だけ」ブロックでLEDを設定

 NeoPixelの拡張機能を入れ、変数「strip」を追加します。この場合の「strip」がNeoPixelのLEDを表すよう最初に設定します。「変数stripを端子P0に接続しているLED24個のNeoPixel(モードRGB(GBR順))にする」ブロックで、接続したピンとLEDの数を指定します。必ずこのプログラミングをしないとNeoPixelは使えません。もっとも重要なお作法です。今回は接続ピンとしてP0を、LEDの数を25個にします。

 今回はmatrixのLEDボードなので、結果がシミュレーション上でもわかるよう、最終的にはmatrixに関する2つのブロック(「strip set matrix width 5」「neooixel matrix width pin P0」<入出力端子→その他>)を追加しました。

②「LEDを消す」は「『black』の点灯」

 点灯したLEDを消すにはどうすればいいのか? NeoPixel関連のブロックに「消す」はありません。実はNeoPixelの「LEDを消す」作業は「『black』の点灯」を意味しています。これに気がつかないとプログラミングは難しくなります。LEDの色を変えるとき、なぜ「black」があるのか不思議だったのですが、これがわかって納得しました。

③「設定」したら最後に必ず「設定した色で点灯する」ブロックを使用

 実はすべてのLEDを同時に同じ色にする「stripを●色に点灯する」ブロックを使うときはそれ以上の作業は不要ですが、LEDの色を個別に設定する場合は「設定した色で点灯する」ブロックを最後に加える必要があります。「設定」は文字通り設定するだけで「点灯」を意味しません。「設定」という言葉の印象からすると、「設定した結果」までを含んでいるように思いますが…。micro:bit搭載LEDを使うときは、単色(赤)だけなので「設定」という概念はありません。同じLEDでもNeoPixelのLEDはmicro:bit搭載LEDとプログラミング上異なることを意識する必要があります。

④プログラミングは「0」から始まる

 これはNeoPixelだけの話ではありませんが、プログラミングの世界には「数字はOから始まる」という大原則があります。座標でLEDを指定する場合、勘違いしやすいところなので、意識しておく必要があります。

 以上、4つのお作法を守って、プログラミングしていきました。

●魚を点滅

 まずはMakeCodeに拡張機能NeoPixelを追加します。

 次に魚の形にしようと、プログラミングしました。LEDは5×5のマトリックス状に配置されているので、多少面倒でも座標指定すれば形は作れます。座標チャートをつくって確認しながら指定しました。

 座標設定の最後に「設定した色で点灯する」ブロックを入れ、その後に「一時停止」ブロックで点滅の間隔を決め、最後に「stripを『black』色に点灯する」ブロックと「一時停止」ブロックを入れます。魚そのものは赤にしました。

 やってみるといい感じで点滅します。昼間でも多少暗い部屋なら十分に見えます。

↑魚を赤色に点滅するプログラム。

↑「魚の点滅」をプロジェクション。ミーも注目。

●ボタンでパターン変化を演出

 魚以外にも、足跡、骨、ネズミとつくってみました。若干、形としては苦しいところもありますが、まあ見えなくもない、という感じです。ポイントはレンズを通しているので、壁に映したときは上下が逆になるという点です。いったん白紙のチャートを塗りつぶし、逆さにしてから、座標の入ったチャートに写し変えました。

 プログラミング上は、それぞれのパターンをボタンA、B、A+Bに割り当てました、こうすれば、ネコが喜びそうなタイミングで、パターンを変えることができます。

↑ネズミの形を映すと、さっそくハッピーが近づいてきた。

●果たしてネコの反応は?

 3種類のプログラムを用意して、ネコたちに試します。

 まずは赤い魚が点滅するパターンを試します。目では光を追っています。昼間でしたが、窓からの光が直接差しこまない隅に映したので、像は意外に見えています。点滅の間隔なども変えてみたのですが、あまり反応しません。

 ボタンでパターンを変化させるプログラムを試してみました。変化を興味深そうに見ていたので、前脚ぐらい出してくれないかと期待しましたが、そこまではいきませんでした。悔しいことに2匹とも似たような反応です。

 年寄りネコなので、昼間はたいてい寝ています。一番活発なのは、夜、エサをあげる前なので、その時間に再チャレンジすることにしました。

 夜。部屋の明かりをつけても壁には像が映っています。魚の点滅、ボタンパターンと試すと昼間より反応はよいようです。

 電気を消して、アニメも投影してみました。見た目はうまく絵が動いて、まあまあの出来です。ネコたちもそれなりに反応してくれました。

 どんな光にするか、アイデア次第で自在につくり出せるのはマイコン制御ならでは、です。ぜひつくって、あたなのネコちゃんでも試してみてください。

↑「泳ぐ魚」のアニメーションを見つめる。

 

前の記事 Poetic Brushless (Motor Driver)