あっきぃ日誌

鉄道ブログのような技術系ブログのようななにか

Raspberry Piで走らせるカメラ付きプラレール

年末に東急2020系のプラレール車両を買いました。ほしかったのはおまけの2020系のカタログの方だったのは言うまでもないですが、せっかくなので車両も何かしら遊んでみることにして、1月から気が向いたときにちまちまといじくっていました。

f:id:Akkiesoft:20190220133335j:plain:w480

で、いじくった結果がこちら。元の車体に穴を開けたりするような破壊的な改造は加えないとだけ決めて、Raspberry Piを載せたりなんだりした結果、リモートから運転操作しながら運転台からの映像が見られる物体になりました。

f:id:Akkiesoft:20190220222450j:plain:w640

f:id:Akkiesoft:20190220140117j:plain:w640

動画で。

youtu.be

……あらかじめ書いておくと、こんなことをしなくてもタカラトミー自らがそう言う製品を売っています。しかし、私ドクターイエローいまだに見たことなくて身近な乗り物ではないからなあ?

使った部材

使用した部材は、Pimoroniで販売されているPiZero向けの小型カメラモジュール、LiPo SHIMとLiPoバッテリー、前にイジェピラーで使っていたL9110Sモータードライバー、単3形ダミー電池、細い電線です。あと、本当は2.5インチSSDのシャーシに埋め込んで使うつもりだったPiZero W。

Wide Angle Camera Module for Raspberry Pi Zero – Pimoroni

akkiesoft.hatenablog.jp

LiPo SHIM – Pimoroni

akkiesoft.hatenablog.jp

www.dx.com

単3型ダミー電池 UM-3Dの通販ならマルツオンライン

https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-585G

組成

先頭動力車には屋根にPiZero Wと、運転席に小型カメラモジュールを設置。車体は非破壊の方針なので、固定はひっつき虫です。電池は単3ですが、加工したダミー電池(後述)を差し込み、ここでの電池交換は基本的にしません。

中間車にはモータードライバーとLiPo SHIMを搭載。LiPo SHIMはLiPo電池のコネクターがあり、抜き差しできる必要があるので屋根にひっつき虫で固定しました。配線は極力車内を通しています。モータードライバーは車内に雑に放り込み、固定はしていません。ピンヘッダーとかがついていて扱いやすいモジュールですが、面倒なのでケーブルはすべてはんだ付けしました。配線のため、先頭動力車とは連結解除できなくなっています。

付随先頭車である反対側の先頭車にはLiPoバッテリーを固定無しで放り込んでいます。コネクター部分だけ外出ししてあり、中間車と接続するか連結解除して充電器につなぐかができるようにしました。

各部の工作の過程

カメラ

とりあえずPiZero Wとカメラをつけて、走行は制御せず走るようすが録画できるみたいなものを作りました。

f:id:Akkiesoft:20190220134257j:plain:h480

後からカメラを小型に変更しました。

f:id:Akkiesoft:20190220134222j:plain:w480

ダミー電池の加工

モーターの制御は、モータードライバーでPWMコントロールするため、プラレールに入れる電池はダミー電池として、ダミー電池の+と-からそれぞれ伸ばしたケーブルをモータードライバーと接続します。ダミー電池は+と-がワイヤーでつながった状態なので、ニッパーで切り離して、ケーブルをはんだ付けしました。試作段階では、単4電池を単3電池に変換するアダプターを使い、-側にアルミホイルを詰めていました。このまま使っても良かったのですが、ケーブルを補足するタイミングで交換しました。

f:id:Akkiesoft:20190220133523j:plain:w480

モータードライバーの追加

リモート走行するためのモータードライバーを追加し始めた様子。

f:id:Akkiesoft:20190220134534j:plain:w480

テスト段階ではひとまず屋根上に載せていましたが、結構かさばって見栄えが悪いので後から車内に格納しました。

youtu.be

モータードライバーには3V以上の電源が必要ですが、Raspberry Piの3.3Vを利用するのと不安定っぽいので考えていたところ、LiPo SHIMにバッテリーの電源(3.6V or 3.7V)がそのまま取り出せる穴(BAT+, GND)があいていたのでここから取るようにしました。バッテリーの容量が小さいのでどのみちすぐ容量がなくなって不安定になるんですけど。

中間車に詰め込んだ後の様子。

f:id:Akkiesoft:20190220135037j:plain:w480

LiPo SHIMの配置

試作の段階ではLiPo SHIMはピンソケットがつえた状態で、PiZero Wもヘッダーがついた状態でした。ただ走らせるぶんにはこれでも問題ありませんが、橋をくぐるときに建築限界を確実に超えてしまうため、ヘッダーを外して分散させる方法にしました。

ピンソケットの取り外し。買ってすぐの状態に戻したとも言う。

f:id:Akkiesoft:20190220135528j:plain:w480

ブックオフのホビーコーナーで仕入れた橋を無事にくぐる様子。

f:id:Akkiesoft:20190220222709j:plain:w480

Web UI

カメラモジュールの映像をライブストリーミングする方法を調べたところ、PythonのPiCameraモジュールのドキュメントにサンプルが載っており、そのまま使えるレベルだったので使用しています。これは先日のOSC2019 OsakaでEjectコマンドユーザー会のリモートブースで使用したのと同じです。

akkiesoft.hatenablog.jp

マスコンはINPUTタグのスライダーを90度回したものをそれっぽくカラーリングしました。マスコンの操作で現在の位置を出す部分にはイベント駆動を利用して、移動結果をAPIに送るにはonupdateを利用しています。

f:id:Akkiesoft:20190220222937j:plain:h480

f:id:Akkiesoft:20190220223000j:plain:h480

モーターの制御は先述のイジェピラーのコードを少し流用する形で実装しつつ、マスコンの位置に合わせてスピードを変えたり、ブレーキのかかり具合を決めたりしています。w

課題/TODO

  • バッテリーがすぐ無くなる。デカいバッテリーは車内に入らないのが難点。
  • バック機能。優先順位が低いだけ。
  • WebUIのデザインセンスを磨く(?)

展示予定です!

Raspberry Piで走行可能にしたカメラ付きプラレールは、今週末のOSC2019 Tokyo/Springで展示予定です。建築限界的に問題なければ、加算器とのコラボもできるかも知れませんね(建築限界を気にしていたのはこれが理由!)。

event.ospn.jp

また、3/3に日本橋サイボウズさんの会場をお借りして、「Raspberry Jam Big Birthday Weekend 2019 in TOKYO」と題し、今年もラズパイのお誕生日を祝います。こちらでも展示予定ですので、ぜひご参加ください。

www.raspi.jp

充電時間のほうが長いかも知れませんが、ぜひ見に来てくださいね。

じゃがビー山わさび5倍味

日高晤郎ショーフォーエバセブンイレブン探検隊タイアップ商品のじゃがビー山わさび5倍味!実家に頼んで箱で送ってもらいました。スキマには北の勝の酒粕初音ミクの全面広告の新聞紙入り。

f:id:Akkiesoft:20190219092728j:plain

箱は今回パッケージの蓋をコレクションできるようになっていて、そこに伝票がはられないようにカレンダーで包んでもらっていました。ありがてえ。実際にはそこから更に根室クロネコヤマトの営業所がビニールとバンドでガチガチに留めてくれていました。根室のヤマト梱包好きだなあ!

f:id:Akkiesoft:20190219092908j:plain

んで今早速1個開けて食べてるんですけど、うまから〜〜。名言は「あ〜がとちゃんぽこりんのけ」。いきなりすごいのが出てきたな。

f:id:Akkiesoft:20190219092938j:plain

先週のラジオでも、見つけ次第箱買いしている人のお便りが読まれていて、ガチ勢すっげ…と思って聞いてました。が、先週のエンディングの時間、自転車で散歩に出ていて聞き逃したら、3月23日が最終回との告知がされていたんですね……。radikoのタイムフリーで聞いてポカーンとなってしまいました。

www.stv.jp

曰く、当初はひとまず3ヶ月、そこから半年に変わり、1年続く結果になったと。吉川アナのラジオけっこうすぐ自分の中では馴染むくらい楽しんでいたので、とても残念です。次の番組、どうなるんだろうなあ。

radikoプレミアムはもともと日高晤郎ショーフォーのために契約していたので、聞くことがなくなってしまうと解約が視野に入ってしまうなあ。いま他にはマッキーのWho Cares?を聞いているところですが、これは関東にいるなら無料で聞けるので……。

2018年(度)はいろんな人がこの世を(しかも大体突然に)去っていったり、あれやこれやが終了したりと、なんか平成の終わりを爪でこれでもかとぎっちり印でもつけているんじゃないかと思うくらい、はっきりと区切りがつけられているような気持ちにさせられる今日このごろです。自分で何言ってるのかよくわからんけど。

はてなハイクのデータをはてな製CSVより充実したJSONで自力エクスポートする

ハイク終了1ヶ月前まで焦らしておいて、ようやく出てきたエクスポート機能。

d.hatena.ne.jp

えっCSV……?必要な項目があったら連絡してね……?何言ってるんだろうと思いながらも、早速ダウンロードしようとしたら、エラー吐いて死んだんですが、これは????

f:id:Akkiesoft:20190214000147p:plain

は?バカにしてくれちゃって〜www。自分で書きました。こんなギリギリまで引っ張ってこんなゴミ機能しかリリースできないとは笑止!(ここにタテジワネズミの画像を貼る)

私のスクリプトではAPIが返すJSONをそのまま保存するので、一見よくわからん情報もあるように見えますが、はてな謹製のエクスポートデータよりも完全なデータが取得できます。ハイクがなくなった後で「このパラメータがほしかった」となっても、もう手に入らないので。

Python: https://gist.github.com/Akkiesoft/afd6a0d2aeaac95780c651d8f759b7b7

UserScript: https://gist.github.com/Akkiesoft/bf94c62e993174e29411475eca456a70

Python分かる人は普通にこれでやったらいいような気がします。わかんない人はUserScript版をChrome + TamperMonkey環境で実行してください。

Tampermonkey - Chrome ウェブストア

UserScriptをインストールすると、ハイクの投稿ボックスの上になんかメッセージが出始めます。「ダウンロード」ボタンを押すとデータをハイクから取得します。取得中はこんなかんじでデータの取得状況が出ます。タブを閉じたり、ページを移動したりしないで待ちます。

f:id:Akkiesoft:20190214210113p:plain

取得が終わったら「ダウンロード」というリンクが増えます。これをクリックしてZIPファイルをダウンロードします。

f:id:Akkiesoft:20190214220127p:plain

というわけで、私の場合は複数のJSONが27MBくらい分降ってきました。12年の重みよ……いっかいエクスポートした後全消しやったので別のところにもうちょっとあるんだけど。

FAQ

スターの情報とかスタコメ(吹き出しマーク内のコメント)は入ってるの

はてなハイクはてなスターはもともと別サービスなので、ハイクAPIで取得ができません。今回終了するのはハイクなので、スターは終了しません。スターの情報はURLに紐付いて管理されているので、URLがわかればスターやスタコメも参照できます。むかし作った謎ページで見られます。なんか適当なハイクのエントリーURLを入れて見てみてください。

https://kokuda.org/service/star.html

ちなみにJSONにはスターをつけたユーザーのユニーク数がfavoritedに格納されています。

写真は

はてなフォトライフにアップロードされているので消えません。はてなが提供しているCSVでどういう書かれ方をしているか知りませんが、記法かURLであればそれをたどって画像を参照できるでしょう。

時刻は入ってるの

UTC+0なので自分で+9時間する必要はありますが、入ってますね。APIから帰ってくるのはunixtimeではないので。

JSON取って何するの

今のところ何もないけど、誰かがデータをインポートしてなにかできるサービスとかを作ったときに、手元にデータが無いと何もできないよ。私が取得したということはなにかしようと思っていないことはないよ。

特定の日付まで云々の入力ボックスについて

初めて取得した時点から、ハイク終了日までのエントリーをエクスポートをするときに使うやつです。

取得したZIPファイルに含まれている「ID-<数字>.json」のファイルのうち<数字>が一番大きいやつをボックスに貼り付けてからダウンロードボタンをクリックすると、途中でダウンロードを終わってくれます。

200エントリー単位で処理するので、データの重複が発生しますが許せ。

技術的なおもしろかったところ

jszip.jsをUserScript内で使ってみたんですが、大量に取得したJSONJavaScriptでZIPにまとめてダウンロードできるようにするとかめっちゃおもしろかった。ローカルに溜め込めるってことなんたよな。そんなこんなでハイクから引っ張ってくるのが130行ちょいでできちゃうと。すごい時代よね。

さいごに

データのエクスポートはいつまで提供されますか?って問い合わせたら、ハイクのサービス終了と同時にエクスポート機能も終了しますと回答を得ました。素敵ですね。終了直前のハイクははてな謹製エクスポートツールではエクスポートできないことが容易に想像できます。最後はスクショで保存しろと?笑

Haiku2Twitみたいに、登録してもらったユーザーのハイクをクロールして、転送ではなく保存しておくようなサービスでも今から書くべきなのかしら。悩ましい。

あと仕事中に書いてしまい、反省している。

CSV

どういう形式で降ってくるのか、ダウンロードできないから相変わらずわからなくて、どういうのか見たいんですけど。

追記

ダウンロードしたJSONを読み込んでそれっぽく表示するHTMLファイルというものも試しに作ってみました。思いつきで随時更新してます。とりあえずそれっぽい整形とスター・スタコメが出る辺りまで。いやほんと、今どきのJavaScript何でもかんたんにできるなまじで。

ハイクから拾ってきたJSONを食わせるとハイクっぽいTLに仕上げるやつ。JavaScriptまじで何でもできてすごいわね。 · GitHub

デザイン&リーズン

マッキーのニューアルバム、明日発売ですがCDはまあ前日から買えるというお約束のものなので、今日の昼休みに渋谷のツタヤでサクッとゲットです。また、サウンド・デザイナーという音楽雑誌でもインタビュー特集があると先週末のWho Cares?で告知されていたのでこれも購入。音のこだわりとかが、音楽全然わからないマンなりにも伝わるくらいアツく語られていました。

f:id:Akkiesoft:20190212224739j:plain

ラジオで何曲か先行で流れてはいましたが、「だらん」のけだるげだけどノれるアレンジが良くてすきです。「In The Snowy Site」も昔のマッキーらしいというか、懐かしさのあるナンバーでおすすめです。そして突然歌謡曲テイストな「微妙なお年頃」でハッ!!とさせられるのもまた面白い、今作も豊作な1枚ですよ。

あと、歌詞カードも味わいがある。はたらくくるまから引用されたアートもすてきですし、歌詞を文字でしっかり読むのも良しです。配信で買うのもったいない。

Design & Reason

Design & Reason

ライヴツアーは、ファンクラブ先行抽選を年末の忙しさで逃してしまいしょぼくれていたのですが、2次抽選があったので4月末のNHKホールで申し込みしています。当たることを祈る。ライヴでも新しいアルバムの曲聞きたいわ。当たる前提で、聴き込むぞ〜。

技術書典6落選しました。

というお知らせのみ。680サークル申しみで落選が多く出ているらしく、コミケの技術島にそんなおらんかったでしょ、どっから湧いてきたのってレベル。オンリーだと出してみようかなって人が増えるのかしら。すごいわねぇ!

で、特に新刊は予定していなかったというか、ラズピッピいじり4を出す気でいたので、技術書典で買いに行くつもりだった〜という方がいらっしゃいましたら、とらのあな(通販のみ)もしくはCOMIC ZIN(通販か新宿店がおすすめ)からお求めください。委託数少ないので忘れぬうちにどうぞ。もう私の手元にも保管用以外在庫がないラズピッピいじり3も委託の在庫分で終わりです。

ec.toranoana.shop

shop.comiczin.jp

次の出店予定はC96です。が、4日開催でホールも変則的なので、これも当選の確率はいつもより低そうです。ぐぬぬ