tag:blogger.com,1999:blog-12096163513363640662024-02-28T12:27:10.408+09:00neuralassemblyのメモTakashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.comBlogger50125tag:blogger.com,1999:blog-1209616351336364066.post-44472633001011471162024-02-26T17:27:00.005+09:002024-02-28T12:26:36.799+09:00Raspberry Pi Pico で倒立振子を制御してみた<h3>1. はじめに</h3>
最近、古典制御理論を集中的に勉強する機会があったのですが、ラプラス変換などの理論をいくら勉強しても、制御の実際がわかった気にはあまりならないのですよね。手を動かして体験できるような制御の教材が欲しいと思っていました。
<br /><br />
そんななか、「いつか作ろう」と思って昔買っていた「<a href="https://toragi.cqpub.co.jp/tabid/892/Default.html" target="_blank">トランジスタ技術 2019年7月号</a>」で特集されている「カルマン倒立振子」を思い出し、それを作ってみることにしました。<br />
下図のようなものです。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDgQCmKvqzKaaJc3dp1EvpNQbMOX0G904FzvH5T5y-wATbFtLAhbYHO_4Ih7cKPhleEQSThz-piQmfnkatb59S5e5aHMySDu_S1aoe5obV_DHFgx8WDLsDQLrOyGVlhCOp-H-Qx12ASjV5YuZeCIxQAMzcfmwK-L5H6-kdVIY4K_-cMXOykIFm51jvh_Y/s1920/pico_iv.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="1080" data-original-width="1920" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDgQCmKvqzKaaJc3dp1EvpNQbMOX0G904FzvH5T5y-wATbFtLAhbYHO_4Ih7cKPhleEQSThz-piQmfnkatb59S5e5aHMySDu_S1aoe5obV_DHFgx8WDLsDQLrOyGVlhCOp-H-Qx12ASjV5YuZeCIxQAMzcfmwK-L5H6-kdVIY4K_-cMXOykIFm51jvh_Y/s600/pico_iv.jpg"/></a></div>
「倒立振子」とは、支点よりも重心が高い位置にある振り子のことを言い、上図で言えばタイヤのシャフトが支点、板全体が振り子であり、この板が倒れないようにタイヤの回転を制御するのが目標です。<br />
上述のトランジスタ技術の作例では、カルマンフィルタの技術により振り子の角度 θ と 支点の位置 x の読み取りを安定させ、現代制御理論を使って倒立振子を直立させ続ける模型の工作方法が解説されています。
<br /><br />
作例ではマイコンとして「<a href="https://akizukidenshi.com/catalog/g/g107723/" target="_blank">STM32 Nucleo Board STM32F401</a>」が使われていたのですが、全く同じでは面白くないかなと思い、Raspberry Pi Pico を使ってみることにしました。<br />
Raspberry Pi Pico に愛着があり、使用経験を増やしたかったという理由もあります。推しマイコンボードってやつですね。何も下調べせずに決めたために色々と苦労することになりましたが(浮動小数点ユニット(FPU)がない、タイマーが一つしかない、など)、最終的に動いたので結果オーライです(そうか?)。
<br /><br />
実際に動作している様子を示した動画はこちらです。
<br /><br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="allowfullscreen" frameborder="0" height="400" src="https://www.youtube.com/embed/fMdAoxCGIAg?rel=0" width="640"></iframe>
</div>
<br />
ちなみに、この作例はバリバリに現代制御理論を使っているので、古典制御理論の教材が欲しいという本来の目的は達成できていないのですが、まあその点はそのうちなんとかしましょう。
<br /><br />
そんなわけで、このトランジスタ技術 2019年7月のカルマン倒立振子の Raspberry Pi Pico への移植版を作るうえでのメモを本ページに残します。
<br /><br />
<h3>2. 注意</h3>
本ページを読むうえでいくつか注意がありますので、順に述べていきます。
<br /><br />
<h4>「トランジスタ技術 2019年7月号」が必須</h4>
カルマン倒立振子は「<a href="https://toragi.cqpub.co.jp/tabid/892/Default.html" target="_blank">トランジスタ技術 2019年7月号</a>」の特集「月着陸船アポロに学ぶ確率統計コンピュータ」で特集されているのですが、これは全体で 150 ページにも及ぶ大特集です。その内容全てを解説することはできないので、同じような倒立振子を自分でも作ってみたいと思った場合この書籍は必須です。「<a href="https://cc.cqpub.co.jp/lib/system/doclib_item/1230/" target="_blank">トランジスタ技術 2019年7月号 (電子版)</a>」の PDF は今でも入手可能ですので、こちらはそれほど問題にはならないでしょう。
<br /><br />
<h4>「トランジスタ技術 2019年7月号」の付録 DVD に含まれるプログラムのソースコードが必須</h4>
ここが一番ネックになると思うのですが、上述の電子版にはプログラムのソースコードがごくごく一部しか含まれていません。全てのソースコードを入手するには付録 DVD が必須なのですが、古本などでは DVD が付属しないことが多いですよね。私が勝手に公開するわけにはいかないので、なんとかして入手する必要があります。図書館などで付録 DVD も一緒に貸し出しているところを探すのが良いでしょうか。ちなみに、Raspberry Pi Pico 用のソースコードは元のソースコードへのパッチという形で提供します。ビルド済のバイナリファイルも提供しますのでそれを試すことはできますが、パラメータを変更する等のためにはソースが必要となります。
<br /><br />
<h4>タミヤのユニバーサルプレートL を入手しにくい</h4>
これは時期によると思うのですが、執筆時は「<a href="https://www.amazon.co.jp/dp/B001VZHRYK" target="_blank">タミヤ 楽しい工作シリーズ No.172 ユニバーサルプレートL 210×160mm</a>」を入手しにくい状態が続いています。タミヤに問い合わせたところ、生産終了確定ではないが次回生産時期は未定だそうです。これについては、同じサイズの ABS 樹脂板を購入し、必要な個所に自分でピンバイスで 3mm の穴をあけることにしました。購入した ABS 樹脂板の写真が以下です。左が、通常サイズのユニバーサルプレートのサイズ(160×60mm)、右が今回用いる 210×160mm サイズです。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-4MYjJzUtwTOGd7cO6zTBn5PQSqmeTPeteepqMFNdj4w647sCdsGC60pM5lQwMRFtc3e0DFFKZsAuNhM0V71NrF1yANkHRo68njlvcO0jRe2SXgXAmW70tWdokNOTHwaySfwhJJTrAOGW0omZOXMKtsWa7VXbke5MdOKnp3Ocxk2ohk8YiNV3H_avCkw/s1280/hazaiya.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="960" data-original-width="1280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-4MYjJzUtwTOGd7cO6zTBn5PQSqmeTPeteepqMFNdj4w647sCdsGC60pM5lQwMRFtc3e0DFFKZsAuNhM0V71NrF1yANkHRo68njlvcO0jRe2SXgXAmW70tWdokNOTHwaySfwhJJTrAOGW0omZOXMKtsWa7VXbke5MdOKnp3Ocxk2ohk8YiNV3H_avCkw/s600/hazaiya.jpg"/></a></div>
<br />
<h4>モータードライバ TA7291P を入手しにくい</h4>
長らく電子工作で愛用されてきた TA7291P は既に生産終了となり、現在入手がしにくいです(amazon では足が短い、足にはんだが残っているなど、いかにも中古という見た目の製品が売られていますね)。別の入手しやすいものを使おうかとも考えたのですが、そうするとモデル化の手間が増えるので、手元に複数あった TA7291P をそのまま使うことにしました。
<br /><br />
<h4>ロータリーエンコーダが高価</h4>
倒立振子の位置 x を計測するために「<a href="https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=3AWB-A5LL" target="_blank">ロータリーエンコーダ EC202A100A</a>」を用いるのですが、6500 円以上となかなかに高価ですよね。この価格を見たときが、この倒立振子の作成に最もくじけそうになった瞬間でした。ランクを下げたもう少し安価なものは使えないかとも考えたのですが、トラブルを避けるためにマイコン以外はなるべく同じものを用いることにしました。
<br /><br />
<h4>Raspberry Pi Pico のプログラムを C 言語で書く</h4>
Raspberry Pi Pico を使うと決めたときは「当然プログラムは Python で書くでしょ」と思っており、途中まではそうしていたのですが、「動作速度が足りない」、「安定性も足りない」など問題が多発したため、やむなく C 言語を用いることにしました。Raspberry Pi Pico を C 言語で開発するためには、開発環境として Raspberry Pi 上で cmake を使うのが一番簡単だと思います。他の Linux や Windows でもできるかもしれませんが未検証です。
<br /><br />
<h4>はんだ付けが超大変</h4>
ユニバーサル基板を用いた回路の作成は超久しぶりだったのですが、恐ろしく大変で泣きそうでした。はんだ付けをした面はとても人には見せられません。
<br />
<br />
<h3>3. 必要なもの</h3>
必要なものをリストアップすると以下のようになります。
<br /><br />
<table border="1">
<tr>
<td>カテゴリ</td><td>物品</td><td>個数</td><td>備考</td>
</tr>
<tr>
<td>マイコン</td><td><a href="https://akizukidenshi.com/catalog/g/g118085/" target="_blank">Raspberry Pi Pico H</a></td><td>1</td><td>ピンヘッダ取り付け済の H が良いでしょう。無線機能は不要なので、W や WH を選ぶ必要はありません</td>
</tr>
<tr>
<td rowspan="2">加速度センサ関連</td><td><a href="https://akizukidenshi.com/catalog/g/g113010/" target="_blank">BMX055使用9軸センサーモジュール</a></td><td>1</td><td>-</td>
</tr>
<tr>
<td><a href="https://akizukidenshi.com/catalog/g/g108616/" target="_blank">ICソケット ( 6P)</a></td><td>1</td><td>-</td>
</tr>
<tr>
<td rowspan="3">ロータリーエンコーダ関連</td><td><a href="https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=3AWB-A5LL" target="_blank">岩通マニュファクチャリング EC202A100A ロータリーエンコーダ</a></td><td>1</td><td>買うのに覚悟が必要な価格です</td>
</tr>
<tr>
<td><a href="https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-4B5E" target="_blank">岩通マニュファクチャリング A150 EC202用ハーネス</a></td><td>1</td><td>-</td>
</tr>
<tr>
<td><a href="https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-5F3D" target="_blank">4Pカップリング ボリュームシャフト中継用ジョイント 4P</a></td><td>1</td><td>ロータリーエンコーダとシャフトの結合に用います。シャフト側にはM3ナットをかませておきます(<a href="https://qiita.com/Kosuke_Matsui/items/85969850da7209a465d2" target="_blank">参考</a>)。</td>
</tr>
<tr>
<td rowspan="2">タイヤ関連</td><td><a href="https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=K5BX-7MLY" target="_blank">タミヤ 72003 ハイパワーギヤーボックス HE</a></td><td>2</td><td>-</td>
</tr>
<tr>
<td><a href="https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=2ABC-7GJL" target="_blank">タミヤ 70111 スポーツタイヤセット</a></td><td>1</td><td>-</td>
</tr>
<tr>
<td>モータードライバ</td><td>TA7291P</td><td>2</td><td>この入手が問題ですね…</td>
</tr>
<tr>
<td rowspan="3">電池関連</td><td><a href="https://akizukidenshi.com/catalog/g/g112240/" target="_blank">電池ボックス 単3×3本 リード線・スイッチ付</a></td><td>1</td><td>なんでも良いと思いますが、私が使ったのはこれです。多分、ペンチなどで側面のプラスチックを広げておかないと電池の取り出しが困難です</td>
</tr>
<tr>
<td><a href="https://akizukidenshi.com/catalog/g/g115449/" target="_blank">皿小ねじ(+) 皿ねじ M3×12</a></td><td>2本</td><td>このタイプの頭が平らなねじでないと電池と干渉します。私が使ったのはこのねじではないのですが、多分大丈夫なはず(?)</td>
</tr>
<tr>
<td>充電池と対応充電器</td><td>3本</td><td>私はエネループプロを持っていたのでそれを使いましたが、雑誌ではプロではない通常のエネループを用いていますね</td>
</tr>
<tr>
<td rowspan="4">車体関連</td><td><a href="https://tamiyashop.jp/shop/g/g70172/" target="_blank">タミヤ 楽しい工作シリーズ No.172 ユニバーサルプレートL 210×160mm</a></td><td>1</td><td>上述したように、執筆時は入手しにくい状態です。これがない場合、代用として以下の3点を用います</td>
</tr>
<tr>
<td><a href="https://www.hazaiya.co.jp/category/gousei_abs.html" target="_blank">はざいや ABS樹脂板 【住友ベークライト】白 厚さ 3mm サイズ 160×210 mm</a></td><td>1</td><td>「はざいや」さんでタミヤのユニバーサルプレートと同じ寸法を指定して購入します。私が購入したときは一枚339円でした。複数枚買うとお得になります</td>
</tr>
<tr>
<td><a href="https://tamiyashop.jp/shop/g/g74050/" target="_blank">タミヤ 精密ピンバイスD (0.1~3.2mm)</a></td><td>1</td><td>ABS 樹脂板への穴あけ用の手動のドリルです</td>
</tr>
<tr>
<td><a href="https://tamiyashop.jp/shop/g/g74049/" target="_blank">タミヤ ベーシックドリル刃セット (1,1.5,2,2.5,3mm)</a></td><td>1</td><td>ピンバイスとセットで用いるドリル刃です。3mmのもののみを使います</td>
</tr>
<tr>
<td rowspan="3">抵抗</td><td><a href="https://akizukidenshi.com/catalog/g/g125221/" target="_blank">カーボン抵抗 220Ω</a></td><td>4</td><td>LED用に3つ、PWMのローパスフィルタ用に1つ。LED用の抵抗の大きさはこの値でなくても構いません。私はLED用の3つには330Ωを使いました。なお、秋月電子通商だと100本セットでの販売が多いです。千石電商だと10本から購入できますが、値段は上がります</td>
</tr>
<tr>
<td><a href="https://akizukidenshi.com/catalog/g/g125332/" target="_blank">カーボン抵抗 3.3kΩ</a></td><td>2</td><td>ロータリーエンコーダの4.8Vの出力を3.3Vに落とすためのもの</td>
</tr>
<tr>
<td><a href="https://akizukidenshi.com/catalog/g/g125202/" target="_blank">カーボン抵抗 2kΩ</a></td><td>2</td><td>ロータリーエンコーダの4.8Vの出力を3.3Vに落とすためのもの</td>
</tr>
<tr>
<td rowspan="3">コンデンサ</td><td><a href="https://akizukidenshi.com/catalog/g/g100090/" target="_blank">セラミックコンデンサー 0.1μF</a></td><td>5</td><td>モータ用2つ、モータードライバ用2つ、BMX055用1つ。10個パックでちょうど良いと思います</td>
</tr>
<tr>
<td><a href="https://akizukidenshi.com/catalog/g/g117114/" target="_blank">セラミックコンデンサー 2.2μF</a></td><td>1</td><td>PWMのローパスフィルタ用に1つ。10個パックへのリンクを張っていますが、<a href="https://akizukidenshi.com/catalog/g/g108152/" target="_blank">単品売りのほう</a>で良いかも</td>
</tr>
<tr>
<td><a href="https://akizukidenshi.com/catalog/g/g110272/" target="_blank">電解コンデンサー 220μF</a></td><td>2</td><td>モータードライバ用2つ。極性(+/-)があるので使用時は注意</td>
</tr>
<tr>
<td>LED</td><td><a href="https://akizukidenshi.com/catalog/g/g111577/" target="_blank">赤</a>、<a href="https://akizukidenshi.com/catalog/g/g111637/" target="_blank">緑</a>、<a href="https://akizukidenshi.com/catalog/g/g111639" target="_blank">黄</a></td><td>各1</td><td>なんでも良いのですが、例えば左記のものでしょうか</td>
</tr>
<tr>
<td rowspan="12">その他</td><td><a href="https://akizukidenshi.com/catalog/g/g100181/" target="_blank">ユニバーサル基板</a></td><td>1</td><td>手元にあったこれを使いましたが、なんでも良いと思います</td>
</tr>
<tr>
<td><a href="https://akizukidenshi.com/catalog/g/g102220/" target="_blank">スズメッキ線(0.6mm 10m)</a></td><td>-</td><td>回路の配線用。0.6mm が手元にあったのでそれを使いましたが、やや固いので <a href="https://akizukidenshi.com/catalog/g/g114232/" target="_blank">0.5mm</a>の方が使いやすいかも?</td>
</tr>
<tr>
<td><a href="https://akizukidenshi.com/catalog/g/g111090/" target="_blank">被覆付きの配線</a></td><td>-</td><td>回路の配線が交差することもあるので被覆付きの配線もあると良いでしょう。個人的には単芯のものをよく使うのですが(どこで買ったのか覚えていない)、秋月電子通商では撚線のものしかなかったのでそれにリンクしました</td>
</tr>
<tr>
<td><a href="https://akizukidenshi.com/catalog/g/g106756/" target="_blank">耐熱電子ワイヤー</a></td><td>-</td><td>なんでも良いのですが、モーターやロータリーエンコーダの配線を延長するために必要になります</td>
</tr>
<tr>
<td><a href="https://akizukidenshi.com/catalog/g/g106788/" target="_blank">熱収縮チューブ</a></td><td>-</td><td>ワイヤー同士の結合部や、ワイヤーとピンコネクタとの結合部の保護に用います</td>
</tr>
<tr>
<td><a href="https://akizukidenshi.com/catalog/g/g100167/" target="_blank">ピンヘッダ</a></td><td>-</td><td>ニッパでカットして使います。カット時に隣接部が割れることがあるので、多めに買っておくのが安全です。私はモーター結合用に2ピン×2、ロータリーエンコーダ結合用に4ピン×1、電池結合用に2ピン×1、シリアル通信用に3ピン×1だけ使いました。
</td>
</tr>
<tr>
<td><a href="https://akizukidenshi.com/catalog/g/g105779/" target="_blank">ピンソケット</a></td><td>-</td><td>ニッパでカットして使います。やはりカット時に隣接部が割れることがあるので、多めに買っておくのが安全です。Raspberry Pi Pico の差し込み用に20ピン×2、モータードライバの差し込み用に10ピン×2、モーター結合用に2ピン×2、ロータリーエンコーダ結合用に4ピン×1、電池結合用に2ピン×1だけ使いました。なお、モータードライバとピンソケットの接触が良くないことがあるので、その点は注意が必要です
</td>
</tr>
<tr>
<td><a href="https://akizukidenshi.com/catalog/g/g102539/" target="_blank">はんだ吸い取り線</a></td><td>-</td><td>一度はんだ付けしたパーツを取り外すときに用います。トラブルが一切なければ不要ですが、トラブル時にないと詰みます</td>
</tr>
<tr>
<td><a href="https://akizukidenshi.com/catalog/g/g107566/" target="_blank">スペーサー M3 10mm TP-10</a></td><td>-</td><td>基板を車体に固定する際に最低4本必要になります。私は、さらにスペーサー3つをつなげたものを保護用として車体上に2本立て、倒立振子が倒れたときに地面に回路が激突しないようにしています(上の動画ではそれがわかるはず)
</td>
</tr>
<tr>
<td><a href="https://akizukidenshi.com/catalog/g/g110359/" target="_blank">3mmプラネジ(8mm)</a></td><td>-</td><td>M3のボルトとナットはタミヤのキットに付属するのでそれで済むことが多いのですが、このようなプラネジがあると便利です
</td>
</tr>
<tr>
<td><a href="https://akizukidenshi.com/catalog/g/g103584/" target="_blank">3mm六角ナット M3</a></td><td>-</td><td>このようなプラナットもあると便利です
</td>
</tr>
<tr>
<td>工具類</td><td>-</td><td>リンクは張りませんが、ニッパ、ラジオペンチ、はんだごて、はんだなどは必要です。ピンセットやワイヤストリッパもあった方が良いでしょう</td>
</tr>
</table>
<br /><br />
<h3>4. Raspberrry Pi Pico の開発環境の設定</h3>
さて、ここから先は倒立振子の作成に入っていくわけですが、いきなり車体の組み立てに入るわけではありません。まずは、ブレッドボードを用いた「9軸センサーBMX055とカルマンフィルタを用いた角度の推定」から話を進めていきます。
書籍でいうと、p.41 から始まる「第3節 傾斜計のソフトウェア開発」および p.49 の Inclinometer.cpp の動作の部分です。
<br /><br />
そのために、まずは Raspberrry Pi Pico の開発環境の設定から始めていきましょう。
C 言語で開発を行うための基本的な情報は「<a href="https://www.raspberrypi.com/documentation/microcontrollers/c_sdk.html" target="_blank">The C/C++ SDK</a>」に書かれています。
<br /><br />
まず、通常の Raspberry Pi のデスクトップ環境を用意し、Raspberrry Pi Pico の開発に必要なツールのインストールから始めましょう。下記の2つのコマンドを順に行います。最後の「minicom」はターミナル上でシリアル通信を行うためのものです。
<pre class="prettyprint">
sudo apt update
sudo apt install cmake gcc-arm-none-eabi libnewlib-arm-none-eabi libstdc++-arm-none-eabi-newlib minicom
</pre>
インストールが終わったら、お使いのユーザーのホームディレクトリに、Raspberry Pi Pico 用の SDK をダウンロードしましょう。一つ目のコマンドはホームディレクトリに移動するためのものです。
<pre class="prettyprint">
cd
git clone https://github.com/raspberrypi/pico-sdk.git
</pre>
次に、ダウンロードを終えた pico-sdk の場所を環境変数 PICO_SDK_PATH にセットしましょう。そのためには、ファイル .bashrc の末尾に設定を追加する必要があります。
まずは以下のコマンドで .bashrc を編集用に開きましょう。
<pre class="prettyprint">
mousepad .bashrc
</pre>
そして、開いたファイルの末尾に移動し、以下の3行を追記してファイルを保存して閉じます。一つ目で 環境変数 PICO_SDK_PATH にホームディレクトリにある pico-sdk を指定しています。
二つ目は「minicom -b 115200 -o -D /dev/ttyACM0」という長いコマンドを「miniacm」という短いコマンド(エイリアス)で実行するためのものです。
二つ目は倒立振子の完成前に用いるエイリアスで、三つ目は倒立振子の完成後に(人によっては)用いるデバッグ用のエイリアスです。
<pre class="prettyprint">
export PICO_SDK_PATH=/home/$USER/pico-sdk
alias miniacm="minicom -b 115200 -o -D /dev/ttyACM0"
alias miniusb="minicom -b 115200 -o -D /dev/ttyUSB0"
</pre>
追記が終わったら、そのターミナルで下記コマンドを実行すれば設定が反映されます。
<pre class="prettyprint">
source .bashrc
</pre>
なお、新たに起動したターミナルでは追記した設定は自動的に読み込まれるので再度読み込む必要はありません。
<br /><br />
以上で Raspberry Pi Pico 用のライブラリの設定が終わりました。チュートリアルサイトを参考に簡単な例を試してみましょう。Pico で「"Hello, world!」と出力する printf 命令を実行し、
それを Rapsberry Pi のターミナルで受け取って表示する、というものです。
<br /><br />
まず、hello ディレクトリを作成し、そこに SDK から pico_sdk_import.cmake というファイルをコピーしてきましょう。
<pre class="prettyprint">
mkdir hello
cd hello
cp ~/pico-sdk/external/pico_sdk_import.cmake .
</pre>
次に、ビルド用の設定ファイル CMakeLists.txt ファイルを作成しましょう。hello ディレクトリにいるターミナルでそのまま以下のコマンドを実行します。
<pre class="prettyprint">
mousepad CMakeLists.txt
</pre>
空の mousepad が開いたら、以下の内容を記述しましょう。
<pre class="prettyprint">
cmake_minimum_required(VERSION 3.13)
# initialize the SDK based on PICO_SDK_PATH
# note: this must happen before project()
include(pico_sdk_import.cmake)
project(my_project)
# initialize the Raspberry Pi Pico SDK
pico_sdk_init()
# rest of your project
add_executable(hello_world
hello_world.c
)
# Add pico_stdlib library which aggregates commonly used features
target_link_libraries(hello_world pico_stdlib)
pico_enable_stdio_usb(hello_world 1)
pico_enable_stdio_uart(hello_world 0)
# create map/bin/hex/uf2 file in addition to ELF.
pico_add_extra_outputs(hello_world)
</pre>
記述が終わったら、保存してそのファイルを閉じます。このファイルは、書いたプログラムをビルドするための設定ファイルとなります。
<br /><br />
次に、C言語プログラム hello_world.c を記述しましょう。hello ディレクトリにいるターミナルでそのまま以下のコマンドを実行して
空の hello_world.c ファイルを開きます。
<pre class="prettyprint">
mousepad hello_world.c
</pre>
開いたら、下記の内容を記述しましょう。このファイルは、1秒おきに "Hello, world!" という文字を表示するというものです。正確には、1秒おきに"Hello, world!" という文字列をシリアル通信で送信する、という内容で、送信先は USB の接続先という設定になっています。
<pre class="prettyprint">
#include <stdio.h>
#include "pico/stdlib.h"
int main() {
stdio_init_all();
while(1){
printf("Hello, world!\n");
sleep_ms(1000);
}
return 0;
}
</pre>
記述が終わったら保存してファイルを閉じます。
<br /><br />
さて、C言語プログラムが書け、それをビルドするための設定ファイルも用意できたので次にビルドを行います。hello ディレクトリにいるターミナルで以下のコマンドを実行してビルドを行いましょう。
ビルド用のディレクトリ build を作成してから、そのディレクトリ内で「cmake ..」、「make」という二つのコマンドを実行しています。
<pre class="prettyprint">
mkdir build
cd build
cmake ..
make
</pre>
実行が終わると、下記のような表示になっているのではないでしょうか。
<pre class="prettyprint">
(中略)
[100%] Built target pioasm
[ 98%] No install step for 'PioasmBuild'
[100%] Completed 'PioasmBuild'
[100%] Built target PioasmBuild
</pre>
そして、その build ディレクトリ内に hello_world.uf2 というファイルができているのではないかと思います。このファイルが、Pico にコピーして実行すべきファイルとなります。
<br /><br />
Pico に hello_world.uf2 をコピーするため、Pico の BOOTSEL ボタンを押しながら Raspberry Pi に USB 接続しましょう。Pico がファイルマネージャで開きますのでその中(RPI-RP2)に hello/build ディレクトリにある hello_world.uf2 をコピーしましょう。ファイルマネージャによるドラッグアンドドロップで構いません。
<br /><br />
コピーが終わると Pico が再起動され、先ほどの C 言語プログラムが自動的に動作を開始します。
<br /><br />
Raspberry Pi のターミナル上でエイリアス miniacm を実行しましょう。
<pre class="prettyprint">
miniacm
</pre>
このエイリアスは「minicom -b 115200 -o -D /dev/ttyACM0」というコマンドを実行したのと同じ効果があるのでした。
これは、「/dev/ttyACM0 として認識されている Pico とシリアル通信をする」という意味になります。
<br /><br />
さて、miniacm を実行したターミナルでは、Pico が出力した「 Hello, world! 」という文字列が1秒おきに表示されているのではないでしょうか?すなわち、シリアル通信により、Pico からの文字列の送信を Raspberry Pi で受信できたことになります。
<br /><br />
以上で動作確認終了です。まず、miniacm で実行した minicom を終了しましょう。「 Hello, world! 」という文字列が表示されているターミナル上で、キーボードで「Ctrl-A」→「Q」→「Enter」と順に入力しましょう。minicom が終了します。そして、Pico との USB 接続を切り離すことで Pico の電源を切りましょう。
<br /><br />
<h3>5. 倒立振子用プログラムの準備</h3>
それでは、Pico 用のプログラムの準備に入りましょう。Raspberry Pi のホームディレクトリに移動し、下記のコマンドで必要なファイルをダウンロードしましょう。一つ目のコマンドがホームディレクトリへの移動を表します。
<pre class="prettyprint">
cd
git clone https://github.com/neuralassembly/pico-inverted-pendulum
</pre>
ダウンロードが終わったら、pico-inverted-pendulum ディレクトリに移動します。
<pre class="prettyprint">
cd pico-inverted-pendulum
</pre>
この中には3つのディレクトリがあります。
<ul>
<li>KalmanAngle: Inclinometor.cpp をビルドするためのディレクトリ</li>
<li>KalmanFinal: Inverted_Pendulum_Kalman.cpp をビルドするためのディレクトリ</li>
<li>Binaries: ビルド済ファイル Inclinometor.uf2 と Inverted_Pendulum_Kalman.uf2 を格納したディレクトリ</li>
</ul>
ここから先は、Inclinometor.cpp と Inverted_Pendulum_Kalman.cpp をRaspberry Pi Pico 向けにビルドする方法を記していきます。ソースコードを入手できない方は、Binarie フォルダに格納されたビルド済ファイルを試すこともできます。
<br /><br />
さて、KalmanAngle と KalmanFinal の二つのディレクトリに、pico_sdk_import.cmake ファイルを KalmanAngle ディレクトリと KalmanFinal ディレクトリにコピーします。先ほどの Hello, world! プログラムでも同等の作業を行いましたね。
<pre class="prettyprint">
cp ~/pico-sdk/external/pico_sdk_import.cmake KalmanAngle
cp ~/pico-sdk/external/pico_sdk_import.cmake KalmanFinal
</pre>
二つのディレクトリのうち、 KalmanAngle は書籍の p.41 から始まる「第3節 傾斜計のソフトウェア開発」および p.49 の Inclinometer.cpp を実行するためのものです。<br />
また、KanlanFinal は車体が完成したあとに動作させるプログラムが格納されるディレクトリです。
<br /><br />
以上を踏まえ、トランジスタ技術2019年7月号 付録DVD に含まれるオリジナルのプログラムのうち、3つのファイルを下記の場所にコピーします。
<pre class="prettyprint">
Inclinometer.cpp を pico-inverted-pendulum/KalmanAngle ディレクトリにコピー
SolveRiccatiEquation.py と Inverted_Pendulum_Kalman.cpp を pico-inverted-pendulum/KalmanFinal ディレクトリにコピー
</pre>
それが済んだら、pico-inverted-pendulum ディレクトリにいるターミナルで以下のコマンドを実行し、Raspberry Pi Pico 用のファイルに更新します。
<pre class="prettyprint">
patch -p0 -i pico-ip.patch
</pre>
このコマンドにより、Inclinometer.cpp 、SolveRiccatiEquation.py 、Inverted_Pendulum_Kalman.cpp が Raspberry Pi Pico 用のプログラムに更新されました。
もちろん、これら3ファイルがあらかじめ適切な場所にないと更新は失敗します。
失敗したら、各ディレクトリにある三ファイルを一旦消し、もう一度コピーからやり直すとよいでしょう。
<br /><br />
さて、プログラムの更新が済んだらビルドしてみましょう。下記のコマンドを順に実行します。まずは KalmanAngle ディレクトリです。
<pre class="prettyprint">
cd ~/pico-inverted-pendulum/KalmanAngle
mkdir build
cd build
cmake ..
make
</pre>
それが終わったら KalmanFinal ディレクトリです。
<pre class="prettyprint">
cd ~/pico-inverted-pendulum/KalmanFinal
mkdir build
cd build
cmake ..
make
</pre>
どちらもエラーなくビルドできたら、それぞれの build ディレクトリに uf2 ができているはずです。先に進みましょう。
<br /><br />
<h3>6. 9軸センサーBMX055とカルマンフィルタを用いた角度の推定</h3>
では、まずはブレッドボードを用いた「9軸センサーBMX055とカルマンフィルタを用いた角度の推定」を行ってみましょう。
書籍でいうと、p.41 から始まる「第3節 傾斜計のソフトウェア開発」および p.49 の Inclinometer.cpp の動作の部分なのでした。
<br /><br />
まず、9軸センサーBMX055 をはんだ付けしなければなりません。電源と信号レベルがともに 3.3V なので、説明書にあるように JP7 の部分にはんだを盛り、VCC と 3.3V の両方に電源を接続するようにします。
<br /><br />
ブレッドボード上で作成する回路は以下の通りです。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZqvAfbI0slltSEe-unYknEMtmyfy8gunUSj6ZD1zjpywIstMmP6xkd9p4qUhH4hBeYgzAuzf29nCvmrRs45syi08CD3jCVXepqZEE9Hx-P_d_C2z8m6-wox-wrjBmvDmTpkFJa099FOvSiYXGQBEUvfp4eHq0WljIkMw_HJSAqexzGzCMPFP9ljVucOE/s1000/pico-BMX055.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="790" data-original-width="1000" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZqvAfbI0slltSEe-unYknEMtmyfy8gunUSj6ZD1zjpywIstMmP6xkd9p4qUhH4hBeYgzAuzf29nCvmrRs45syi08CD3jCVXepqZEE9Hx-P_d_C2z8m6-wox-wrjBmvDmTpkFJa099FOvSiYXGQBEUvfp4eHq0WljIkMw_HJSAqexzGzCMPFP9ljVucOE/s600/pico-BMX055.png"/></a></div>
回路が組めたら、先ほどビルドして得られた pico-inverted-pendulum/KalmanAngle/build/Inclinometer.uf2 を Pico にコピーしましょう。ソースを入手できない場合は ~/pico-inverted-pendulum/Binaries ディレクトリにあるものも利用できます。
BOOTSELボタンを押しながら Pico を USB 経由で Raspberry Pi に接続し、ファイルマネージャーでファイルをコピーすれば良いのでしたね。コピーが終わると Pico が再起動し、プログラムが動き始めています。
<br /><br />
そうすると、「カルマンフィルタを通した角度のデータ」と、「センサから直接計算した角度のデータ」が空白で区切られて 0.1 秒ごとに送られてきます。
Raspberry Pi のターミナルで miniacm エイリアスで minicom を実行してみましょう。
<pre class="prettyprint">
miniacm
</pre>
すると、ターミナル上に角度が表示されるはずです。なお、回路図に記したように、Pico への電源投入時は、USB接続端子が真上を向いた状態(角度 θ=0)で接続する前提となっています。
一度 Pico への USB 接続を切り、向きを合わせた状態で USB 接続するようにしてみましょう。角度 0 付近から表示が始まり、傾けた向きによって正または負の角度が得られるはずです。
倒立振子はこのように角度 0 度付近で動作します。
<br /><br />
また、角度をなるべく一定に保ったまま、ブレッドボードを少し激しめに動かしてみましょう(例えばテーブル上でブレッドボードの角度を保ったままブレッドボードをテーブル上で前後に滑らせる、など)。「カルマンフィルタを通した角度のデータ」はあまり変化しないのに対し、「センサから直接計算した角度のデータ」は大きく変動するのがわかるはずです。例えば以下のような出力が得られます。
<pre class="prettyprint">
(中略)
60.476841 60.588188
60.568378 60.581692
59.464199 46.408962
57.363106 60.888397
61.548885 82.362831
64.96154 78.891701
63.586735 44.846802
59.855469 51.911228
59.990036 61.171368
60.115009 60.16819
</pre>
これは、角度60度をなるべく保ちつつ、センサを動かしたときの様子です。カルマンフィルタの出力である左側の数字は 60 度付近の値に保たれていますが、センサから直接求めた角度である右側の数値は、大きく変動しています。これを下図のようにグラフにするとよりはっきりします。5秒間で3回センサを激しく動かしたときの様子です。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhByFDpHgOQpThtN0WhpRcpysVE5xBjGQ5-W574h11IFR-5t5HHGMUYCaQb4YDszbhR5C6QM7BMEf53c3NARcH411AI0PzUqKvKORmw-WdpZwSHU0B913NW8VqXVC4iuqgi57jwe19Q_sTNKHQNnXNqaXOzEI6By-KLliMrazw8xhzfjhQbDYDvGVOiBw0/s1037/kalmanGraph.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="400" data-original-height="794" data-original-width="1037" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhByFDpHgOQpThtN0WhpRcpysVE5xBjGQ5-W574h11IFR-5t5HHGMUYCaQb4YDszbhR5C6QM7BMEf53c3NARcH411AI0PzUqKvKORmw-WdpZwSHU0B913NW8VqXVC4iuqgi57jwe19Q_sTNKHQNnXNqaXOzEI6By-KLliMrazw8xhzfjhQbDYDvGVOiBw0/s400/kalmanGraph.png"/></a></div>
カルマンフィルタの出力の変動が小さくなっていることがわかるでしょう。これがカルマンフィルタの効果です。
<br /><br />
さて、このカルマンフィルタによる角度の推定ですが、計算にどれくらいの時間がかかるのでしょうか。カルマンフィルタの計算は浮動小数演算を用いた行列計算を多用するので、計算コストは高いはずです。
<br /><br />
オリジナルの Inclinometer.cpp を見ると、関数「void update_theta()」の冒頭に「//It takes 650 usec. (NUCLEO-F401RE 84MHz, BMX055)」とコメントが書いてあります。<br />
一方、私の Raspbery Pi Pico バージョンで計測を行ってみたところ、およそ 800 μs でした。
<br /><br />
この計測方法ですが、以下の二つの方法を思いつきます。
<ul>
<li>オシロスコープを持っている場合:update_theta の冒頭でどこかの GPIO を 1 にし、update_theta 終了時にその GPIO を 0 にする。その信号をオシロスコープで観測する。プログラムの修正が最低限で済むのがメリット</li>
<li>オシロスコープを持っていない場合:update_theta を多数回繰り返すプログラムを書き、開始時と終了時の時刻の差を printf する。800μs だと10,000 回で 8 秒くらいになる。計測専用のプログラムを書かなければならないのがやや面倒</li>
</ul>
さて、Raspberry Pi Pico ではオリジナルの NUCLEO-F401RE に比べて動作が遅くなってしまいました。Raspberry Pi Pico のクロック周波数は 125MHz で NUCLEO-F401RE の 84MHz よりも速いのになぜだろうと一瞬考えてしまいます。これは、 NUCLEO-F401RE に搭載されている MPU STM32F401RE には浮動小数点ユニット (FPU) が搭載されているのに対し、Raspberry Pi Pico に搭載されている RP2040 にはそれがないからだと考えられます。
<br /><br />
「Raspberry Pi Pico FPU」で検索すると、「Interface 2021年8月号」の宮田賢一さんによる記事「MicroPython×Picoの実力検証」がヒットします。<a href="https://interface.cqpub.co.jp/wp-content/uploads/if2108_197.pdf" target="_blank">無料で読める1ページ目</a>に「FPUを持つCortex-M4系ボードとPicoでは約1.5倍の差が出ました」と書いてあり、おおむねその記事を反映した結果と言えると思います。
<br /><br />
カルマンフィルタを仕事などで本格的に使う方ならば、FPU 搭載のボードを選ぶべきなのでしょう。それはそれとして受け入れた上で、本ページでは Raspberry Pi Pico での倒立振子の実現を目指します。
<br /><br />
余談ですが、C言語で 800μsかかったカルマンフィルタの計算を MicroPython で実装した場合、 4.2ms と 5 倍くらいの時間がかかりました。それに加え、I2C 経由でのセンサの値の取得が時折ランダムにエラーを返す問題があり、Python の利用を断念しました。
<br /><br />
ちなみに、C 言語におけるカルマンフィルタの計算のスケジュールを図示すると下図のようになります。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEis1YDtSjKnVUTeRJ5gxLD8yUBOZ_1pt6u500DI1PXMSSRzfJiu7603HWyd_Av6bx2TsZCJb-Md5cqUPhQpXJGSu9SPOqe2B2V-E63ylREQWKmATN8J5akiIXotN-Iypxk6bylnqO3VRjdxqcuj_jXPC3SrcPKFAtNoYoOq-kDGrMQXppoGaPHHfNurF0o/s754/schedule1.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="400" data-original-height="378" data-original-width="754" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEis1YDtSjKnVUTeRJ5gxLD8yUBOZ_1pt6u500DI1PXMSSRzfJiu7603HWyd_Av6bx2TsZCJb-Md5cqUPhQpXJGSu9SPOqe2B2V-E63ylREQWKmATN8J5akiIXotN-Iypxk6bylnqO3VRjdxqcuj_jXPC3SrcPKFAtNoYoOq-kDGrMQXppoGaPHHfNurF0o/s400/schedule1.png"/></a></div>
カルマンフィルタによる角度の計算が2.5msごと、すなわち 400Hz の周波数で行われるのは、プログラム中の下記の部分によります。実際にプログラム中で使われるのは周期にした theta_update_interval の方です。この値がタイマに渡され、2.5ms ごとの処理を実現しています。
<pre class="prettyprint">
const float theta_update_freq = 400; //Hz
const float theta_update_interval = 1.0/theta_update_freq;
</pre>
2.5ms から 0.8ms を引いた 1.7ms の時間で残りの制御などを行わなければいけないわけですが、若干スケジュールが窮屈な気がしますね。その部分がどうなるか気にしつつ、先に進みましょう。
<br /><br />
<h3>7. 車体の組み立て</h3>
さて、カルマンフィルタを通した角度の取得に成功したら、いよいよ車体の作成です。ここから先は Pico の使い方が大きく変わりますので、車体作成前に注意しておきましょう。
<br /><br />
ここまでは、Pico への電源を USB 端子により供給してきました。しかし、ここからは Pico 上の USB 端子を用いません。Pico への電力は、VSYS 端子へ単三充電池3本の出力を加えることで供給します。
<br /><br />
また、倒立振子が動作しているときは USB 端子を用いませんから、USB 端子を通して Raspberry Pi とシリアル通信することはできません。上の動画のように倒立振子が正常動作しているときはシリアル通信は不要ですからそれで大きな問題はないのですが、デバッグ時などに Raspberry Pi 上で Pico からの出力を読みたいときがあるかもしれません。そのような場合は、Pico の UART0 TX と UART0 RX のピンを用いてシリアル通信をすることになります。通信相手としては「<a href="https://www.switch-science.com/products/2782" target="_blank">FTDI USBシリアル変換アダプター Rev.2</a>」を 3.3V モードで用いるのが簡単でしょう。「RX←TX」、「TX→RX」、「GND-GND」の組み合わせからなる3本で Pico とシリアル変換アダプタを接続し、シリアル変換アダプタと USB 接続した Raspberry Pi で miniusb エイリアスにより minicom を起動し、/dev/ttyUSB0 と通信すれば良いのです。この辺りはオプションであり必須ではありません。
<br /><br />
以上の注意を踏まえて車体を作成していきます。
<br /><br />
<h4>足回り</h4>
まず、書籍に記されている通りハイパワーギアーボックス HE は、ギア比 64.8:1 で2つ作成することになります。いもねじによるシャフトの固定位置は、車体への取り付けや、ロータリーエンコーダの取り付けの際に変わる可能性がありますので、位置が確定するまではいもねじは軽めに締めておきましょう。
<br /><br />
ギアーボックスが完成した後、モーターの端子を橋渡しするように 0.1μF のコンデンサをはんだ付けする必要があります。これは。書籍図14の回路図において、Mで表されたモーターの近くに配置されているコンデンサのことです。<br />
少しわかりにくいですが、下図に水色のコンデンサが見えますね。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUZfeOSmk2zViEJ8o0FXHL08ZTIIyleyxqIsbtxE3WzRVzCr7bCD3bN0W6nMHn4y0Gp_12qv0dn-LwWihHRWzUcSNeTFkQrGmqplgb_jabLYpQras28VolDi5jqkwLdeevE1ktzxJC2lTmzEPUrbRwpUVPB4L7bTdmtB_Hch5IqWclcxkM26HHzJVT0D4/s1280/condenser.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="982" data-original-width="1280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUZfeOSmk2zViEJ8o0FXHL08ZTIIyleyxqIsbtxE3WzRVzCr7bCD3bN0W6nMHn4y0Gp_12qv0dn-LwWihHRWzUcSNeTFkQrGmqplgb_jabLYpQras28VolDi5jqkwLdeevE1ktzxJC2lTmzEPUrbRwpUVPB4L7bTdmtB_Hch5IqWclcxkM26HHzJVT0D4/s600/condenser.jpg"/></a></div>
さて、モーターにコンデンサを取り付けたハイパワーギアーボックス HE は、タミヤのユニバーサルプレートにねじで固定しますが、ABS 樹脂板を購入した場合は自分で穴を空ける必要があります。雑誌でのユニバーサルプレートの利用方法に合わせるなら、下図のように 3mm の穴を4つピンバイスで開けることになるでしょう。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzuXAIx9DfV4FAYocYUtzVHWcEH6hYohcBrowoD8gIEfqfYU6M_CkYQ3NpNtAhupC_4cZdVM8D9gcW4mmpZn40cjIzAYIcwX2DnmHDmLb4YDgpPIFUmNrqrNUMG7kK9ztN7ajeI0rdCS9Yi8bTGqh9H3xemusvlXDb_Z86vHaBbtU6borGsynuqHpu8sw/s1006/hole.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="400" data-original-height="843" data-original-width="1006" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzuXAIx9DfV4FAYocYUtzVHWcEH6hYohcBrowoD8gIEfqfYU6M_CkYQ3NpNtAhupC_4cZdVM8D9gcW4mmpZn40cjIzAYIcwX2DnmHDmLb4YDgpPIFUmNrqrNUMG7kK9ztN7ajeI0rdCS9Yi8bTGqh9H3xemusvlXDb_Z86vHaBbtU6borGsynuqHpu8sw/s400/hole.png"/></a></div>
以上のようにして、ABS樹脂板にハイパワーギアーボックス HE を固定した様子が下図になります。この辺りはまだまだ楽しく作業ができる段階です。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhia_CvDko_S_c3WpZGLgZgSGJQrZrNRI-GNRnkzzkclu1yuIeW-6-LRqkXdHF9VOro1gob6v9obz14Qk7ceEuu6Qc6WsstdktBLehWugWZquMZYfY3od3yndQcCmYTL6RKNLFY4bvxXuw7Dd34mEIGDqVPwV-14oQrs5cps5ENzZdhXDvUVSe4PAxsdHE/s1280/ashimawari.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="960" data-original-width="1280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhia_CvDko_S_c3WpZGLgZgSGJQrZrNRI-GNRnkzzkclu1yuIeW-6-LRqkXdHF9VOro1gob6v9obz14Qk7ceEuu6Qc6WsstdktBLehWugWZquMZYfY3od3yndQcCmYTL6RKNLFY4bvxXuw7Dd34mEIGDqVPwV-14oQrs5cps5ENzZdhXDvUVSe4PAxsdHE/s600/ashimawari.jpg"/></a></div>
<br />
<h4>ロータリーエンコーダ</h4>
ロータリーエンコーダの取り付けは、@Kosuke_Matsui(松井 耕介)さんによるqiitaの記事「<a href="https://qiita.com/Kosuke_Matsui/items/85969850da7209a465d2" target="_blank">トランジスタ技術7月号「倒立振子」の制作記録</a>」を参考にしました。ギアボックスの製作過程も写真が豊富ですので参考になると思います。
<br /><br />
私がカップリングとロータリーエンコーダを固定した様子を示したのが下図です。ロータリーエンコーダはABS樹脂板から浮いているので、タミヤのユニバーサルアームの切れ端と、1mm程度の厚さの両面テープを挟み、ABS樹脂板に穴をあけたうえで「<a href="https://www.amazon.co.jp/dp/B000QUD1EQ/" target="_blank">ねじりっこ</a>」で固定しています。雑な工作ですが、一応は機能しています。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj11T0MYFHBQ-nlcyQiBziBHNhigenbXaNYXDCgkKCqV1l-s3tPg2gYAkhOBDksUPIFHPOfHYfJe4gzlk-Er_BpPU0EfaAdWUV9xfgMi06Pe_O7oPVohqhISxmVoWn-Mok-X9Kq9UN8K7yDwgEFXJ5F8S5J7094I_qPa7YxXrDesPGVT2mFaTMlM5X-HnY/s1280/encoder.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="896" data-original-width="1280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj11T0MYFHBQ-nlcyQiBziBHNhigenbXaNYXDCgkKCqV1l-s3tPg2gYAkhOBDksUPIFHPOfHYfJe4gzlk-Er_BpPU0EfaAdWUV9xfgMi06Pe_O7oPVohqhISxmVoWn-Mok-X9Kq9UN8K7yDwgEFXJ5F8S5J7094I_qPa7YxXrDesPGVT2mFaTMlM5X-HnY/s600/encoder.jpg"/></a></div>
<br />
<h4>回路の作成</h4>
回路の作成は、書籍 p.54 の図14とほぼ同じです。NUCLEO-F401RE を Raspberry Pi Pico に置き換えるわけですから、その違いの部分のみを図示すると下図のようになります。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgq6JQ_JG49S8sAJiN3dh19n0pNjfF6DvE_bievdrPGiFqp6aKdaDMWt8aWhrnArMS5pqy9kAeqd0AtTVp5w0N3wDL7MZ8N5HM1ipn11kXFrmx0Dz6fwAHl2qTge_gCE3ygj8O8Im0MokgWQF2OYK2A9EK4iFfYy2X9NtXCJPmRLxLu3v-b9ApESr5XKWE/s950/pico-all.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="570" data-original-width="950" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgq6JQ_JG49S8sAJiN3dh19n0pNjfF6DvE_bievdrPGiFqp6aKdaDMWt8aWhrnArMS5pqy9kAeqd0AtTVp5w0N3wDL7MZ8N5HM1ipn11kXFrmx0Dz6fwAHl2qTge_gCE3ygj8O8Im0MokgWQF2OYK2A9EK4iFfYy2X9NtXCJPmRLxLu3v-b9ApESr5XKWE/s600/pico-all.png"/></a></div>
回路をユニバーサル基板上に実現した様子が下図です。ピンヘッダやピンソケットを用いてパーツやケーブルを着脱可能にしています。なお、モータードライバの OUT1、OUT2 の信号ですが、OUT1 にはモーターの青のケーブル、OUT2 にはモーターの赤のケーブルを接続します。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6Y7w_vjd2434D481vG0n2XAQKavgnrjFuTkYvISeF4cXq9m4w97xvQ2txYjygqduX7_EhacGTmsf0VJFEOIqFrQGt3uJs-FVYmdr_nsulbvO6IWJyFEqfhuLOu0chyGhyphenhyphenlj7lJKGJn-6jnUxJyzIdx-_QASErCbKIIFh_sr8mXmGqqMkBdpsh-r2Fk3A/s1280/circuit-all.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="1092" data-original-width="1280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6Y7w_vjd2434D481vG0n2XAQKavgnrjFuTkYvISeF4cXq9m4w97xvQ2txYjygqduX7_EhacGTmsf0VJFEOIqFrQGt3uJs-FVYmdr_nsulbvO6IWJyFEqfhuLOu0chyGhyphenhyphenlj7lJKGJn-6jnUxJyzIdx-_QASErCbKIIFh_sr8mXmGqqMkBdpsh-r2Fk3A/s600/circuit-all.jpg"/></a></div>
はんだ付けに関しては根気よく行うしかありません。注意すべき点は、はんだを付けたいパーツを十分熱することでしょうか。
<br /><br />
回路についてもう一点注意すべきなのは、モータードライバのピンの形状がやや特殊なので、ピンソケットと接触が悪いことがまれにある、ということです。<br />
回路を完成させた後、片方のタイヤが全く回転せず、接続が悪いのか、パーツが悪いのか、パーツの配置が悪いのかなど、はんだをつけたり外したり何時間も試行錯誤しました。
結局、モータードライバとピンソケットの接触が悪かったことが原因とわかり、ピンソケットを取り外し、新たなピンソケットを切り出してまたはんだ付けし直して解決しました。
このあたりの試行錯誤では「<a href="https://akizukidenshi.com/catalog/g/g102539/" target="_blank">はんだ吸い取り線</a>」が必須でした。
<br /><br />
<h4>車体の作成</h4>
最終的に全ての部品を車体に取り付けた様子が下図です。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzbQ93AyihCdecm9cJ8qIB7cL3wUMw0JOk0o9umaHoAT80aDiBWuFykpIIe0IKhoGe3BObWoMLGQVCIReIOrvY02X1GZfv-n0Zqh_mT1YGANZ1QrZDn7cazHNq2x5L-2i75C1FhbOedBVclzg-cbmMLq1vyuF0Ng7YuCG7MdWXlgQzeQSnN1lRzGh1FUQ/s1000/body-all.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" height="600" data-original-height="1000" data-original-width="960" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzbQ93AyihCdecm9cJ8qIB7cL3wUMw0JOk0o9umaHoAT80aDiBWuFykpIIe0IKhoGe3BObWoMLGQVCIReIOrvY02X1GZfv-n0Zqh_mT1YGANZ1QrZDn7cazHNq2x5L-2i75C1FhbOedBVclzg-cbmMLq1vyuF0Ng7YuCG7MdWXlgQzeQSnN1lRzGh1FUQ/s600/body-all.jpg"/></a></div>
ギアボックスを取り付ける際は、書籍に合わせようと慎重に行いましたが、このあたりになると力尽きていたので、「この辺かな?」と思った位置にサインペンで印をつけ、すぐに穴をあけて取り付けてしまいました。図中に記したように、書籍と比べると重心が上に来るように取り付けてしまったようです。
<br /><br />
このように重さや重心位置が変わると、倒立振子の微分方程式が変わり、それに伴い状態方程式やフィードバックゲインも変わってきます(そもそもタミヤのユニバーサルプレートではなくABS樹脂板を使っている時点で大きな変化です)。その変化をプログラムに反映させるためのツールも書籍で用意されており、それが SolveRiccaciEquation.py です。その使い方は後述します。
<br /><br />
さらに、重さや重心位置が多少違ってもプログラムは動作することが多いと思います。
<br /><br />
ですので、回路や電池ボックスの取り付け位置についてはそれほど神経質になる必要はありません。
<br /><br />
以下は回路が完成してあと一息、といった状況の様子です。まだモーターの配線を行っていない段階ですね。動くかどうか、ドキドキです。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglhf2kZPfFc4MvH8CEVlXaDK-dP4tr9d4ioVhccBadWr4Mm_57paXsQHHjVG6eCxw2rzTdee2oCEKdAtMGk5eE4ZW5oIYTsOSPx01sSVcXa_Z3d5_4-6QIGfKorZVLVIgK6z7dOQvPrJHeVo5O78E8k4eVDqU8_wblr8usSzH-cR7PrnjiKdZm6VkZMT0/s1280/atohitoiki.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="960" data-original-width="1280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglhf2kZPfFc4MvH8CEVlXaDK-dP4tr9d4ioVhccBadWr4Mm_57paXsQHHjVG6eCxw2rzTdee2oCEKdAtMGk5eE4ZW5oIYTsOSPx01sSVcXa_Z3d5_4-6QIGfKorZVLVIgK6z7dOQvPrJHeVo5O78E8k4eVDqU8_wblr8usSzH-cR7PrnjiKdZm6VkZMT0/s600/atohitoiki.jpg"/></a></div>
<br />
<h3>8. 倒立振子の起動</h3>
さて、倒立振子が完成したら、Pico にプログラムを書きこんで動作させてみましょう。「5. 倒立振子用プログラムの準備」で行ったビルドにより ~/pico-inverted-pendulum/KalmanFinal/build ディレクトリに Inverted_Pendulum_Kalman.uf2 ができていますので、これを書き込みます。ソースを入手できない場合は ~/pico-inverted-pendulum/Binaries ディレクトリにあるものも利用できます。
その際に注意がいくつかあります。
<br /><br />
まず、Pico を USB 接続するまえに、充電池による電源を切っておきましょう。電源のソケットをピンから抜いてしまうのが確実です。<br />
なお、これは環境によるのかもしれませんが、私の場合 Pico を基板にとりつけたままだと、BOOTSEL を押しながら Raspberry Pi に差しても認識しないという問題がありました。これは USB に流れる電流量が不足しているからかもしれません。
<br /><br />
そのような問題があったので、私は Pico を基板から抜いて Raspberry Pi に取り付けるようにしました。なお、Pico を基板に深く差していると抜くのはなかなか難しいです。ピンソケットと Pico の隙間にマイナスドライバを差し込み、隙間を広げながら少しずつ抜くようにしました。力任せに抜こうとするとせっかく作った基板を破損する恐れがありますので注意しましょう。ですから、Pico を何度も抜き差しする可能性があるときは、基板にあまり深く差し込まない、という注意をするとよいでしょう。
<br /><br />
また、Raspberry Pi に対してではなく、Windows マシンに接続すると、Pico を基板に差したままでも認識されることがありました。その場合、ビルドによりできた uf2 ファイルをあらかじめ Windows に移動しておいて、Windows から Pico にコピーする、というのも手です(それはそれで面倒ですが)。
<br /><br />
いずれにせよ、Pico に uf2 ファイルをコピーすると再起動がかかり、倒立振子の回路が動作し始めます。しかし、USB から電源が供給されている状況ではモーターに電力が供給されませんので倒立振子は動きません。USB から Pico を切り離し、改めて充電池を接続して動作を開始させましょう。
<br /><br />
ブレッドボードで行ったように、電源投入時は倒立振子を直立させた状態、すなわち θ=0 付近の状態を維持します。黄色のLED が点灯している間は、様々な初期化が行われていますので、可能な限り θ=0 を維持するようにしましょう。黄色のLED が消えると倒立振子は動作を開始します。タイヤの回転の向きによって緑と赤のLEDのどちらかが点灯し、倒立振子の安定性が維持されます。
<br /><br />
電源投入時が最も安定性が崩れやすいタイミングであり、操作にはある程度の慣れが必要です。何度も練習して慣れてみましょう。
<br /><br />
うまく動作しないという場合は。回路などの見直しをすることになります。
<br /><br />
<h3>9. 倒立振子のパラメータの変更</h3>
さて、私と似たパーツを使って倒立振子を作る限り、プログラムを変更する必要はあまりないはずです。基板や電池ボックスの取り付け位置が多少違っても、プログラムはおおむね動作するのではないかと思います。
ですが、参考のためにパラメータ(重さや重心位置など)を変更する方法を記しておきます。
<br /><br />
pico-inverted-pendulum/KalmanFinal ディレクトリに SolveRiccatiEquation.py という Python プログラムがあります。
これは、倒立振子のパラメータから倒立振子の状態方程式やフィードバッゲインを計算してくれるものです。
<br /><br />
テキストエディタ mousepad や Python 開発環境 Thonny などでこのファイルを開いてみてみると、オリジナルのファイルから私が変更した部分がいくつかみつかります。
以下のような部分です。
<pre class="prettyprint">
# タミヤユニバーサルプレートから ABS 樹脂板に変えたので重さが変わった部分
#mass (kg)
#m_plate = 0.080 /2
m_plate = 0.108 /2
# シャフトからバッテリーの重心位置が 6.5cm から 8.5cm に変わった部分
#The length between the center of gravity and the axis (m)
#d_battery = 0.065
d_battery = 0.085
# 基板の重さ、大きさ、シャフトからの距離が変わった部分
#mass (kg)
#m_circuit = 0.100 /2
m_circuit = 0.0406 /2
#length (m)
x_circuit = 0.010
#y_circuit = 0.095
y_circuit = 0.070
#The length between the center of gravity and the axis (m)
#d_circuit = 0.140
d_circuit = 0.165
</pre>
それ以外では下記の部分も重要です。<br />
ここはもともとのプログラムでは T=0.01 と記されており、モーターへの制御が 10ms ごとに行われることを決めている部分です。<br />
しかし、後述するように Pico では速度がぎりぎり追いつかないので、モーターへの制御を14ms ごとに変更しています。<br />
この変更により、状態方程式も影響を受けます。
<pre class="prettyprint">
#sampling rate of the discrete time system
T = 0.014 #sec
</pre>
以上の中身を確認したうえで、SolveRiccatiEquation.py を実行してみましょう。その前に必要なライブラリを以下のコマンドでインストールしておく必要があります。
<pre class="prettyprint">
sudo apt update
sudo apt install python3-numpy python3-matplotlib
sudo pip3 install control --break-system-packages
</pre>
インストールを終えたら実行してみましょう。pico-inverted-pendulum/KalmanFinal ディレクトリで以下を実行します。
<pre class="prettyprint">
python3 SolveRiccatiEquation.py
</pre>
書籍 p.68 図27 に類似したシミュレーション結果のグラフが現れますが、ここで重要なのはグラフではなく、コンソールに表示された下記の部分です。
<pre class="prettyprint">
(中略)
sampling rate = 0.014 sec
matrix Ax (discrete time)
[[ 1.00447563e+00 1.40208911e-02 0.00000000e+00 9.73784303e-05]
[ 6.39181504e-01 1.00447563e+00 0.00000000e+00 1.37291716e-02]
[ -2.00253350e-03 -9.40752945e-06 1.00000000e+00 1.34265323e-02]
[ -2.82332812e-01 -2.00253350e-03 0.00000000e+00 9.19205414e-01]]
matrix Bx (discrete time)
[[-0.00062615]
[-0.08827914]
[ 0.00368742]
[ 0.51951251]]
(中略)
Gain (calculated)
[[ 28.38403323 4.29034848 0.09009136 0.36309152]]
</pre>
これらの数値を、制御プログラム Inverted_Pendulum_Kalman.cpp に反映させねばなりません。なお、上で見た重さや重心位置などの数値を変えていない場合は、
出力された数値は既に私が反映済です。
Inverted_Pendulum_Kalman.cpp を開けば、下記のような部分がみつかるはずです。
<pre class="prettyprint">
(中略)
float A_x[4][4] = {
{1.00447563e+00, 1.40208911e-02, 0.00000000e+00, 9.73784303e-05},
{6.39181504e-01, 1.00447563e+00, 0.00000000e+00, 1.37291716e-02},
{-2.00253350e-03, -9.40752945e-06, 1.00000000e+00, 1.34265323e-02},
{-2.82332812e-01, -2.00253350e-03, 0.00000000e+00, 9.19205414e-01}
};
(中略)
float B_x[4][1] = {
{-0.00062615},
{-0.08827914},
{0.00368742},
{0.51951251}
};
(中略)
float Gain[4] = {28.38403323, 4.29034848, 0.09009136, 0.36309152};
</pre>
皆さんも必要に応じてここを書き換えればよいわけです。なお、書き換えたら、pico-inverted-pendulum/KalmanFinal/build ディレクトリに移動して make コマンドを実行すれば、uf2 ファイルが更新されます。
<br /><br />
<h3>10. 倒立振子の制御のタイムスケジュール</h3>
さて、倒立振子の制御のためには、以下の3つが定期的に実行される必要があり、書籍では以下の周期と実現方法になっていました。
<br /><br />
<table border="1">
<tr>
<td>タスク</td><td>周期</td><td>書籍での実現方法</td><td>Pico での実現方法</td>
</tr>
<tr>
<td>ロータリーエンコーダの読み取り</td><td>25 μs</td><td>タイマ1</td><td>2つ目のCPUコアで while + sleep</td>
</tr>
<tr>
<td>カルマンフィルタによる角度の推定</td><td>2.5 ms</td><td>タイマ2</td><td>タイマ</td>
</tr>
<tr>
<td>モータへの制御</td><td>10 ms</td><td>while文 + sleep</td><td>1つ目のCPUコアで while + sleep</td>
</tr>
</table>
<br />
これを Pico に移植する場合、まずタイマが1つしかないのをどうするのかが問題でした。
<br /><br />
上記のタスクのうち、「カルマンフィルタによる角度の推定」と「モーターへの制御」は時間に対して正確に実行しなければなりません。
なぜかというと、カルマンフィルタの計算式や状態方程式に時間間隔 Δt が入っているため、その Δt の通りに計算を実行しなければならないからです。<br />
一方、ロータリーエンコーダの読み取りはそれほど時間に正確である必要はありません。「値の変化を取りこぼさない程度に速い」という条件が満たされれば良いのです。
<br /><br />
以上を踏まえ、上記のように2つのCPUコアに計算を割り振ることにしました。
<br /><br />
そうすると、1つ目のCPUコアでカルマンフィルタによる角度の推定とモーターへの制御の2つのタスクをうまくこなさねばなりません。
<br /><br />
結論から言うと、制御周期 10ms は Pico にとっては速すぎました。オシロスコープの出力から作った下記のグラフをご覧ください。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtDuPyhqK6l7-BO7DgJFEO0C3ls0n0rDVN9RY_Jx1XAH8suutzvMe2cATo7AxA5z73uKxuyBlHn8RPJfdkc6L9CuDXh-C7jmeLBENY_0neg6N3M9kvWRX3t2cXpdY8MHh74X9dqHg4dGrLR8YKskFqyuMFR1f0TWTYeTychJ4oLQexFxclb2fwBKWk9rw/s513/T10.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="400" data-original-height="404" data-original-width="513" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtDuPyhqK6l7-BO7DgJFEO0C3ls0n0rDVN9RY_Jx1XAH8suutzvMe2cATo7AxA5z73uKxuyBlHn8RPJfdkc6L9CuDXh-C7jmeLBENY_0neg6N3M9kvWRX3t2cXpdY8MHh74X9dqHg4dGrLR8YKskFqyuMFR1f0TWTYeTychJ4oLQexFxclb2fwBKWk9rw/s400/T10.png"/></a></div>
カルマンフィルタによる角度の推定が 2.5ms で行われており、その合間に 4 倍の 10ms 周期で制御が行われるのですが、
角度の推定を行っていない時間に対して、制御にかかる時間がギリギリ収まる程度で長すぎるのです。このグラフでは問題なさそうに見えるのですが、モーターを実際に回すと、このグラフは大きく乱れてしまいます。
<br /><br />
そのようなわけで、もう少し時間に余裕を持たせた制御の方が良いだろうと考え、制御の周期を 14ms、カルマンフィルタによる角度の推定はその 1/4 の周期 3.5ms にしてみました。実際に制御時にオシロスコープの出力から作成したグラフが下図です。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRajB4Xh5fwccy3Eom2g2wiUXm4_Ylir4llh8L_fAfGEz8MX_PfyxHue46hW1jiAVymzhbhAMaAYTly7Dl-lAU6-OjmsaZjlOkfPurVzuIRTlC2NLWo-O0QvFaFhmkNRC0iK0d7l0sS8PjSYHU3xaYMb9fV_bvLcCpCrtYfwkqDhlbJoh8jzm9UdvkAOM/s513/T14.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="400" data-original-height="404" data-original-width="513" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRajB4Xh5fwccy3Eom2g2wiUXm4_Ylir4llh8L_fAfGEz8MX_PfyxHue46hW1jiAVymzhbhAMaAYTly7Dl-lAU6-OjmsaZjlOkfPurVzuIRTlC2NLWo-O0QvFaFhmkNRC0iK0d7l0sS8PjSYHU3xaYMb9fV_bvLcCpCrtYfwkqDhlbJoh8jzm9UdvkAOM/s400/T14.png"/></a></div>
制御に時間の余裕があることが見て取れます。
<br /><br />
実際には、10ms 周期でも 14ms 周期でも倒立振子は安定させられるのですが、心持ち 14ms 周期の方が安定してるかも?という気がします。
<br /><br />
以上の内容は、プログラム中の下記の部分の変更により実現しています。
<pre class="prettyprint">
//const float theta_update_freq = 400; //Hz (Not Used)
const float theta_update_interval = 0.0035;
(中略)
float feedback_interval_sec = 0.014; //sec
float feedback_interval_sec_wait = 0.0122; //sec
</pre>
最後の feedback_interval_sec_wait の 0.0122 という数値は、制御を行う while ループの sleep に使われるのですが、適切な値はオシロスコープで上のような波形を見ながら調節するしかないのが厄介でした。
<br /><br />
<h3>11. おわりに</h3>
いかがでしたか?
<br /><br />
倒立振子の作成にも苦労しましたが、ブログを書くのも非常に大変でした。
<br /><br />
「とりあえず動く」という状態ならば割と早いうちから実現できていました。実際、書籍のパラメータのままでも、なんとか倒立振子を安定させることができるほどです。
<br /><br />
しかし、ブログを書くために細かく調べていくと、カルマンフィルタや制御が一定周期で動いていないなど問題がたくさん見つかり、それを一つ一つ潰していかなければならない、といった具合です。<br />
問題をつぶしていくと、少しずつではありますが、制御の安定性が増していくのが可愛いところです。
<br /><br />
そんな感じに苦労しただけあって、完成した倒立振子へはかなりの愛着がわいています。特に必要もないのに毎日ちょくちょく電源を入れて倒立させています。<br />
皆さんも一家に一台、倒立振子を作成してみてはいかがでしょうか。
Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com0tag:blogger.com,1999:blog-1209616351336364066.post-51521741195650487662021-02-18T16:37:00.009+09:002024-02-22T15:41:57.652+09:00Raspberry Pi 4をSSDから起動しよう<h3>0. はじめに</h3>
Raspberry Pi は microSDカード(旧タイプはSDメモリーカード)にOSをインストールして起動するのが一般的です。その場合、microSDカードへのアクセス速度の遅さから、OSが一瞬止まったような動作をすることが時々あります。
<br /><br />
それを解消するためにはいくつかの方法があります。例えば、2020年10月に発表された<a href="https://pc.watch.impress.co.jp/docs/news/1284210.html" target="_blank">Raspberry Pi 4 Compute Module</a>にはeMMCというストレージが搭載されているモデルがあります。eMMCにOSをインストールすることで、microSDカードを用いる場合よりも快適に動作することが期待されます。
<br /><br />
しかし2021年2月現在、Raspberry Pi 4 Compute Moduleは日本ではまだ発売されておりませんし、発売されていたとしても、<a href="https://www.switch-science.com/catalog/6689/" target="_blank">別途I/Oボードが必要になる</a>など、通常のRaspberry Pi 4よりも利用する際の敷居は高くなるでしょう。
<br /><br />
一方、Raspberry Pi 4 では、microSDカードからではなくUSBデバイスからOSを起動することが容易になっており、USB接続のSSDにOSをインストールすることで快適にRaspberry Piを利用できるようになります。この方法は、以前は64ビット版のベータ版OSでの検証記事が多かったのですが、今回32ビット版の公式OSでも問題なく実現できたので、記事にまとめることにしました。
<br /><br />
以下の2つの方法を紹介します。
<ul>
<li>[方法1] Buffalo のUSBスティックタイプのSSD (SSD-PUT250U3) を用いる方法</li>
<li>[方法2] M.2 SSDを利用可能にするケース Argon One M2 を用いる方法</li>
</ul>
下図は[方法1]に従い、Raspberry Pi 4 をBuffalo のUSBスティックタイプのSSD (SSD-PUT250U3) で利用している様子です。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgELYgJVcdMYE2FJ6ZIMGHqgpy5CAW2NyRqAf8BYPRFMd5Hp7t8jpBVkoNXfcyw5kfDZt32nkHK5Pd5AjEX26vmk6T0OZf3Hq1IwWJLk38rZe7XCo13_o9rO6ywMK6Jt7Rpg_kIvI8dveg/s1193/SSD_img01.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="774" data-original-width="1193" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgELYgJVcdMYE2FJ6ZIMGHqgpy5CAW2NyRqAf8BYPRFMd5Hp7t8jpBVkoNXfcyw5kfDZt32nkHK5Pd5AjEX26vmk6T0OZf3Hq1IwWJLk38rZe7XCo13_o9rO6ywMK6Jt7Rpg_kIvI8dveg/s600/SSD_img01.jpg"/></a></div>
以下で解説していきます。
<br /><br />
<h3>1. Raspberry Pi 4 に対する準備</h3>
上の[方法1]、[方法2]のどちらの方法をとるにせよ、Raspberry Pi 4であらかじめ以下の2点の準備をしておく必要があります。
<ul>
<li>Raspberry Pi 4 のファームウェアを最新にしておく</li>
<li>Raspberry Pi 4 の起動の優先順序を変更しておく</li>
</ul>
これらの設定を行うためには、あらかじめ Raspberry Pi 4 を microSD カードにインストールしたOSで起動できるようにしておく必要があります。このページを見るような方には不要かもしれませんが、<a href="https://mlbb1.blogspot.com/2018/03/raspberry-pios.html" target="_blank">microSDカードへのOSのインストール方法</a>を解説したページへのリンクを張っておきます。2020年3月より、Raspberry Pi Imagerというソフトウェアを用いてインストールする方法が主流となっておりますので、そちらに慣れておくことをお勧めします。
<br /><br />
以下の内容は2021年1月版のOSで検証しました。
<br /><br />
さて、microSDカードから起動したOSで、まずRaspberry Pi 4のファームウェアを最新にしましょう。
現在インストールされているファームウェアを確認するには、ターミナルで以下のコマンドを実行します。
<pre class="prettyprint">
sudo rpi-eeprom-update
</pre>
すると、例えば以下のような表示が現れます。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfbQoPRy1tgYADOsiuqp7oFhSVQ7VGiFHhJmJmJe2UaVm2wxhlWq7-JvVlXGne7ncHk7CwiR4x1MjkB9ebTr696J9VssGyh0hCJ9SdfzOaxvN6qsN0vlxFmyqC2l05J2dkmxCre-I3p-I/s0/SSD_img02.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="250" data-original-width="490" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfbQoPRy1tgYADOsiuqp7oFhSVQ7VGiFHhJmJmJe2UaVm2wxhlWq7-JvVlXGne7ncHk7CwiR4x1MjkB9ebTr696J9VssGyh0hCJ9SdfzOaxvN6qsN0vlxFmyqC2l05J2dkmxCre-I3p-I/s0/SSD_img02.png"/></a></div>
CURRENT と表示されているのが現在インストールされているファームウェア、LATESTと表示されいてるのがアップデート可能な最新のファームウェアです。上図ではCURRENTとLATESTが一致していることがわかります。
本ページの内容を確認するには、少なくともCURRENTが2021年1月以降のファームウェアである必要があります。
<br /><br />
Raspberry Pi 4のファームウェアをアップグレードしたい場合、以下の3コマンドを順に実行することで、OS自体を最新にする方法が<a href="https://www.raspberrypi.org/documentation/hardware/raspberrypi/booteeprom.md" target="_blank">公式</a>で紹介されています。
<pre class="prettyprint">
sudo apt update
sudo apt full-upgrade
sudo reboot
</pre>
もし、OS全体の更新ではなく、ファームウェアだけの更新を行いたい場合、以下の2つのコマンドを順に実行すると良いようです。
<pre class="prettyprint">
sudo rpi-eeprom-update -a
sudo reboot
</pre>
以上の操作により、Raspberry Pi 4 のファームウェアが最新になりました。次に、Raspberry Pi 4 の起動の優先順序を変更します。
<br /><br />
ターミナルで以下のコマンドを実行し、raspi-config を起動します。
<pre class="prettyprint">
sudo raspi-config
</pre>
raspi-config は、初めて使う方にとっては操作に癖のあるツールですので、以下の手順に丁寧に従っていきましょう。
<br /><br />
まず、raspi-configを起動すると以下のような画面になります。ここで、「↓」キーを5回押し、「6 Advanced Options」の項目にフォーカスを合わせます。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgC6BGdsfGP2YF8urq1NKBeFIyUrVcoqJmig5xycFLUbH8OD0jPcFMllqOuV8qSuI6cd7FH1HNuXyY9_AMlI8wwc0CrgAYN7MPBomr1pbKJahz6vaXSpnRrLxgToraxHVDyUzTLok-SUkQ/s0/SSD_img03.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="449" data-original-width="659" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgC6BGdsfGP2YF8urq1NKBeFIyUrVcoqJmig5xycFLUbH8OD0jPcFMllqOuV8qSuI6cd7FH1HNuXyY9_AMlI8wwc0CrgAYN7MPBomr1pbKJahz6vaXSpnRrLxgToraxHVDyUzTLok-SUkQ/s0/SSD_img03.png"/></a></div>
下図のようになりますので、ここでEnterキーを押し、Advanced Options の項目に入ります。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTMeZy63IEwAuZ1vxdcxgdZqDmyGCZl2_JjRWP42Ko_bAjIZb7zh5BznXEIEAcAarnCDYWUyyYwcolM9sEYpKUy0wCLg4tejFgSKiEjf794Z-82junITT37d18T3PaLvuQr-BdClg7FGQ/s0/SSD_img04.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="449" data-original-width="659" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTMeZy63IEwAuZ1vxdcxgdZqDmyGCZl2_JjRWP42Ko_bAjIZb7zh5BznXEIEAcAarnCDYWUyyYwcolM9sEYpKUy0wCLg4tejFgSKiEjf794Z-82junITT37d18T3PaLvuQr-BdClg7FGQ/s0/SSD_img04.png"/></a></div>
Advanced Optionsの項目で「↓」キーを5回押し、「A6 Boot Order」の項目にフォーカスを合わせ、Enterキーを押します。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkXCp0VHyCksZyf7JW8ziIUoXKkzutCavYEYTKhN_zt0eg6063wyIvKTjiCftqEFArxGYwgwhVR6CspZOeDdicMMtTxFR0RQ1DLuv7hyphenhyphenDDfTAuz1uc6vMnjKmK28xP_zyLni2HZz814Rw/s0/SSD_img08.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="449" data-original-width="659" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkXCp0VHyCksZyf7JW8ziIUoXKkzutCavYEYTKhN_zt0eg6063wyIvKTjiCftqEFArxGYwgwhVR6CspZOeDdicMMtTxFR0RQ1DLuv7hyphenhyphenDDfTAuz1uc6vMnjKmK28xP_zyLni2HZz814Rw/s0/SSD_img08.png"/></a></div>
すると、起動順序として下図の3つの選択肢が現れます。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7alVkCHkHt3IVOURAXMH_ILvdqdRlCx4miu3yJfdMlO40pLw3mKgI8SKY0oZ8_JBTZBiMQVizmA9xLTLFFb6OaMkL2ajrxXw24BefWpfyod_llKlVKbC2PieLt2sG3ryEoupyyx-TWew/s0/SSD_img05.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="449" data-original-width="659" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7alVkCHkHt3IVOURAXMH_ILvdqdRlCx4miu3yJfdMlO40pLw3mKgI8SKY0oZ8_JBTZBiMQVizmA9xLTLFFb6OaMkL2ajrxXw24BefWpfyod_llKlVKbC2PieLt2sG3ryEoupyyx-TWew/s0/SSD_img05.png"/></a></div>
ここで選んでよいのは、
<ul>
<li>B1 SD Card Boot(まずSDカードからの起動を試し、失敗したらUSBからの起動を試す)</li>
<li>B2 USB Boot(まずUSBからの起動を試し、失敗したらSDカードからの起動を試す)</li>
</ul>
のどちらかです。USB端子にSSDが接続されており、microSDカードが差さっていない状況なら、どちらを選んでもUSB接続のSSDからOSが起動するようになります。
<br />
(上記2つの選択肢で違いが現れるのは、USB接続のSSDとmicroSDカードの両方を同時に接続してRaspberry Pi 4を起動した場合です)
<br /><br />
「B1 SD Card Boot」を選ぶ場合は何も押さず、「B2 USB Boot」を選ぶ場合はキーボードの「↓」キーを一回押してから、Enterキーを押して下さい。
<br /><br />
なお、古いバージョンのraspi-configでは「SD Card Boot」に相当する項目がありませんので、必然的に「USB Boot」に相当する項目を選ぶことになります。
<br /><br />
例えば「B1 SD Card Boot」を選んでEnterキーを押した場合は以下の表示が現れますので、Enterキーを押します。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaCxOua3eVyZ2H1iW2flepI583Zh3IrUXSayfl8rTbd0wAV7Q68pVWueS3m8LYlDoDE-wTbeF5cMoSGJ1X25o9fXDMwrvybnkc7_jXDswb45SRskAr-ITHzEAlr9VSh7dtUjoZpHnd4c4/s0/SSD_img06.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="449" data-original-width="659" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaCxOua3eVyZ2H1iW2flepI583Zh3IrUXSayfl8rTbd0wAV7Q68pVWueS3m8LYlDoDE-wTbeF5cMoSGJ1X25o9fXDMwrvybnkc7_jXDswb45SRskAr-ITHzEAlr9VSh7dtUjoZpHnd4c4/s0/SSD_img06.png"/></a></div>
すると、raspi-configの最初の画面に戻りますので、TABキーを二回押し、「Finish」に項目を合わせてからEnterキーを押します。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgC6BGdsfGP2YF8urq1NKBeFIyUrVcoqJmig5xycFLUbH8OD0jPcFMllqOuV8qSuI6cd7FH1HNuXyY9_AMlI8wwc0CrgAYN7MPBomr1pbKJahz6vaXSpnRrLxgToraxHVDyUzTLok-SUkQ/s0/SSD_img03.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="449" data-original-width="659" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgC6BGdsfGP2YF8urq1NKBeFIyUrVcoqJmig5xycFLUbH8OD0jPcFMllqOuV8qSuI6cd7FH1HNuXyY9_AMlI8wwc0CrgAYN7MPBomr1pbKJahz6vaXSpnRrLxgToraxHVDyUzTLok-SUkQ/s0/SSD_img03.png"/></a></div>
すると、下図のように再起動を促されますので、Enterキーを押して再起動しましょう。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHPb2M0P6363_vKC4UTw0_0Jp9ug0OkY0h6Y8Tb4kGmnMDUcBoVbO8loCrbzR4trCCo4Gw0-WcvI3Wvdm5aSJYZWKxhesvrURZGeLRvXCpvId_kw5kaBloR_Qg44taajO3-EIyyQrVfTo/s0/SSD_img07.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="449" data-original-width="659" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHPb2M0P6363_vKC4UTw0_0Jp9ug0OkY0h6Y8Tb4kGmnMDUcBoVbO8loCrbzR4trCCo4Gw0-WcvI3Wvdm5aSJYZWKxhesvrURZGeLRvXCpvId_kw5kaBloR_Qg44taajO3-EIyyQrVfTo/s0/SSD_img07.png"/></a></div>
以上で Raspberry Pi 4に対する準備は終了です。再起動が終わったら、Raspberry Pi 4の電源を一旦切りましょう。
<br /><br />
<h3>2. Buffalo のUSBスティックタイプのSSD (SSD-PUT250U3) を用いて Raspberry Pi 4 を起動する</h3>
ここからは、Buffalo のUSBスティックタイプのSSD (SSD-PUT250U3) を用いて Raspberry Pi 4 を起動する方法を解説していきます。
<br /><br />
といっても、こちらは非常に簡単です。<a href="https://mlbb1.blogspot.com/2018/03/raspberry-pios.html" target="_blank">microSDカードへのOSのインストール方法</a>にて、Raspberry Pi Imagerを用いたOSのインストール方法を解説しています。その方法を用いて、Raspberry Pi Imager でUSBスティックタイプのSSD (SSD-PUT250U3)に対してOSを書き込むだけです。なお、OSは「Raspberry Pi OS (other)」の「Raspberry Pi OS Full (32-bit)」を選択しました。
<br /><br />
OSのインストールが完了した SSD を接続する際、以下のことに注意します。
<ul>
<li>Raspberry Pi 4 のUSB端子のうち、青い色のUSB3対応の端子にSSDを接続する</li>
<li>Boot Order(起動順序)で「SD Card Boot」を選択した方は、microSDカードをRaspberry Pi 4から取り外す</li>
<li>Boot Order(起動順序)で「USB Boot」を選択した方は、microSDカードが接続されていても、SSDからRaspberry Pi 4が起動する</li>
</ul>
さて、以上の解説でUSB接続のSSDからOSは起動したでしょうか?
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgELYgJVcdMYE2FJ6ZIMGHqgpy5CAW2NyRqAf8BYPRFMd5Hp7t8jpBVkoNXfcyw5kfDZt32nkHK5Pd5AjEX26vmk6T0OZf3Hq1IwWJLk38rZe7XCo13_o9rO6ywMK6Jt7Rpg_kIvI8dveg/s1193/SSD_img01.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="774" data-original-width="1193" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgELYgJVcdMYE2FJ6ZIMGHqgpy5CAW2NyRqAf8BYPRFMd5Hp7t8jpBVkoNXfcyw5kfDZt32nkHK5Pd5AjEX26vmk6T0OZf3Hq1IwWJLk38rZe7XCo13_o9rO6ywMK6Jt7Rpg_kIvI8dveg/s600/SSD_img01.jpg"/></a></div>
起動した後は通常のRaspberry Pi OSと変わらないので難しいことはありません。私が使った上での感想をいくつか述べます。
<br /><br />
<h4>[長所]</h4>
microSDカードに比べるとアクセスが速いので快適に感じるはずです。ただし、「通常のPCと同程度の速度になるのでは?」などと期待しすぎると「大したことないじゃん」と感じるかもしれません。この辺りの感じ方には個人差があるでしょう。
なお、逆にSSD起動のOSに慣れてからmicroSDカード起動にOSに戻るとかなり動作の遅さを実感できます。特に、ディスクアクセスの多いOSの更新などでは大きな違いを実感します。まとめると、劇的というほどではないけれど堅実な速度向上、といったところでしょうか。
<br /><br />
<h4>[短所]</h4>
これはBuffaloのSSD-PUT250U3特有の問題なのですが、小型とは言え通常のUSBメモリに比べると大きいので、USB端子部で他のUSBデバイスと物理的に干渉します。具体的には、マウスをUSB端子に差そうとするとSSDとぶつかるという問題が起こりました。ギリギリ差せるので大きな問題にはなりませんが、気になる人は気になるでしょう。
<br /><br />
あと、これは私が所持しているマウスデバイスの問題かもしれないのですが、無線2.4GHzの無線マウスを使うとマウスポインタの動きが滑らかではなくなる、という問題が起こりました。
<br /><br />
結局、マウスに関する上記2点の問題を解決するため、私は Bluetooth 3 のマウスとキーボードを購入しました。<a href="https://www.elecom.co.jp/products/M-BT15BRSBK.html" target="_blank">これ (M-BT15BRSBK)</a>と<a href="https://www.elecom.co.jp/products/TK-FBP102BK.html" target="_blank">これ (TK-FBP102BK)</a>です。Bluetooth 4 (BLE) のマウスやキーボードはデフォルトではRaspberry Pi に接続できないはずですので注意してください。
また、ペアリング時は有線または無線2.4GHzのマウスが必須となりますので、購入する場合はそれをわかった上で購入しましょう。
<br /><br />
<h3>3. M.2 SSDを利用可能にするケース Argon One M2 を用いて Raspberry Pi 4 を起動する</h3>
次に、もう一つの Argon One M2 というケースを用いる方法を紹介します。これは、<a href="https://www.itmedia.co.jp/news/articles/2012/28/news030_2.html" target="_blank">2020年末のITmediaの記事</a>で紹介されていたもので、今回私がSSDを試してみたいと思ったのも、この記事がきっかけでした。
<br /><br />
実際に使用している様子が下図です。GPIO部が開けられるようになっており、電子工作にも向いているのが特長です。他にも、microHDMI端子がHDMI端子に変換されている点もメリットといえるかもしれません。
デザインがもう少し洗練されていればよいのになあと個人的には思いますが、これは好みの問題でしょう。なお、このケースにはとんでもない欠点もあるのですが、それは後述します。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRtK4HJeSB2NaLj5KJ9HOaXpLq_3zWOtp0jOixgN8xM6t7vq6NeiJ04u7y-vTq68ilqP2xKGCcTzzRDhBy23Y1dnDxSWLOvgxjPJTYEC7hyygiTzwVWBkvMsRKLa96nvbXWPcwopjAc-M/s1200/SSD_img09.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="940" data-original-width="1200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRtK4HJeSB2NaLj5KJ9HOaXpLq_3zWOtp0jOixgN8xM6t7vq6NeiJ04u7y-vTq68ilqP2xKGCcTzzRDhBy23Y1dnDxSWLOvgxjPJTYEC7hyygiTzwVWBkvMsRKLa96nvbXWPcwopjAc-M/s600/SSD_img09.jpg"/></a></div>
Argon One M2を利用するには、M.2 SATA SSD (Key-BまたはKey-B&M) を別途用意する必要があります。私が購入したのは下記の二つです。
<ul>
<li><a href="https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-5PL4" target="_blank">Argon One M2</a></li>
<li><a href="https://kakaku.com/item/K0000969850/" target="_blank">Western Digital WDS250G2B0B</a></li>
</ul>
組み立ては付属の説明書に従い、OSのインストールは上に記したITmediaの記事に従うと良いでしょう。
<br /><br />
組み立て時の注意としては、下図のジャンパが挙げられます。
デフォルトでは図のように1-2ピンをショートするようにジャンパが接続されており、これは「電源接続後にパワーボタンを押す必要がある」ことを意味します。Raspberry Pi のデフォルトの挙動のように「電源を接続すると即電源が入る」状態が良い場合はショートするのを2-3ピンに変更しましょう。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUwESZtu0JyLm5RRpL1Ir6QuUn0N1j7mZxVHW6blNFmy4GAEPNSEmm7I14hNPiITwv-7GMR8P10Qwwz1XrAluz2_PjIzS1XOl04MSZYkSZ6vi0mgj3ErkJXBPwO49N97AGG8hy2A_erIk/s1280/SSD_img10.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="1040" data-original-width="1280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUwESZtu0JyLm5RRpL1Ir6QuUn0N1j7mZxVHW6blNFmy4GAEPNSEmm7I14hNPiITwv-7GMR8P10Qwwz1XrAluz2_PjIzS1XOl04MSZYkSZ6vi0mgj3ErkJXBPwO49N97AGG8hy2A_erIk/s600/SSD_img10.png"/></a></div>
OSインストール時のポイントは、「microSDカードにあらかじめRaspberry Pi OSをインストールして起動し、そのmicroSDカード上のOSをRaspberry Pi上でSD Card CopierというツールでSSDにコピーする」ということです。その際、microSDカードとSSDを同時に差した状態でOSを起動することがあり得ますので、raspi-configの起動順序(Boot Order)の設定は「B2 USB Boot」とするのがよいでしょう。
<br /><br />
さて、無事 Argon One M2 を用いてSSDでRaspberry Pi 4 を起動できたでしょうか。起動後はターミナルを起動して以下のコマンドを実行しましょう。ケースファンを制御するプログラムがインストールされます。
<pre class="prettyprint">
curl https://download.argon40.com/argon1.sh | bash
</pre>
そのプログラムの設定は下記のコマンドで行うようです。これらは<a href="https://www.waveshare.com/wiki/PI4-CASE-ARGON-ONE-M.2" target="_blank">こちらのWiki</a>に書いてあります。
<pre class="prettyprint">
argonone-config #configure driver
argonone-uninstall #uninstall driver
</pre>
このようにSSDをケース付きで利用できるようになる Argon One M2 なのですが、大きな欠点があります。
<br /><br />
それは、事務机のように金属が埋め込まれた机の上に置いて利用すると、Wifiがほとんどつながらなくなる、ということです。ケースの上半分が金属であり、机も金属だとほぼシールドされるからだと思うのですが、
この仕様を知ったときはさすがに驚きました。大手メーカーの商品ならばあり得ないような設計ミスだと思います。
<br /><br />
仕方ないので、私はArgon One M2を下図のように、手元にあったニンテンドーDSのソフトウェアの空きケースの上に置いて使っています。これだけでWifi接続がかなりマシになります。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0wdfh9RS8oDoRSyoTr3O0fGxia-6b4HsCxaov50d4TEBz3Ws3TtsbeOLhvrfWOY2BhCt4QpcwvFC7oH5p-qcacJRZm9Tuqa0PQEZ7-nRH1eQHrykAxsL8o9-myOgWDh-qAowyaN6QWQ8/s1280/SSD_img11.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="960" data-original-width="1280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0wdfh9RS8oDoRSyoTr3O0fGxia-6b4HsCxaov50d4TEBz3Ws3TtsbeOLhvrfWOY2BhCt4QpcwvFC7oH5p-qcacJRZm9Tuqa0PQEZ7-nRH1eQHrykAxsL8o9-myOgWDh-qAowyaN6QWQ8/s600/SSD_img11.jpg"/></a></div>
というわけでこの Argon One M2、個人的にはあまりお勧めできないですね。木やプラスチック製の机の上で使うならば問題ないと思うのですけどね。もちろん、有線LANを使う場合も大丈夫でしょう。
<br /><br />
<h3>4. おわりに</h3>
以下の2つの方法でRaspberry Pi 4をSSDから起動する方法を紹介しました。価格の面でも難易度の面でも、USBスティックタイプのSSDの方がお勧めです。興味のある方は試してみてはどうでしょうか。
<ul>
<li>[方法1] Buffalo のUSBスティックタイプのSSD (SSD-PUT250U3) を用いる方法</li>
<li>[方法2] M.2 SSDを利用可能にするケース Argon One M2 を用いる方法</li>
</ul>
<br />
<br />
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/gp/product/4065193397/" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7DRwdHUOfdPJtPAeH0UiIjW1Bi0s94ukn5JFN1x56glI-jjGVy9HyIB1FKHC6cWh15bKybLLYJqhtFmsAMMjyrb3ahHlVpvR_xT7lqEqlvubJ14XBUZQehLFTWTT71WykdZIDNUIr24g/s1600/cover3.png" /></a></div>
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/dp/4062579502/" style="clear: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_dmvycn6QM24eV1ZEoT6lg2TVi108iFt8BG6P1znEj0HtuWPBdYA2KxnD_uy1gw8CZI0UVilZ6noZJbqpagWZmQz5_9iScdkNo_ugvjoFInSMcArrkAYxuOFxoticmpPb1ZvSTJ8S_EM/s1600/raspi2_bb.jpg" /></a></div>
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/dp/4065020522/" style="clear: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="145" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOsxLVgVnFI0m-FUJlBK_CqKYJC8dNo3zjk8MOMX2xcJO4omTyOy-aAh3mmqGzXm5P3hGgpkUpaQy-7j7oqdIXyLE2_y686CI2Eda8EMYhME0INhU6irK9jw8b3iUhq7ojs2rrPZrnJtw/s1600/mlbb_title_mini.png" /></a></div>
<br clear="all" />
<div>
「ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作」、「実例で学ぶRaspberry Pi電子工作」、「Raspberry Piではじめる機械学習」を執筆しました。</div>Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com0tag:blogger.com,1999:blog-1209616351336364066.post-56028728296471228152020-06-24T18:28:00.003+09:002022-11-19T13:01:20.537+09:00Intel RealSenseでSkeleton Trackingを行うCubemosのライブラリをPythonで使ってみた<h3>
はじめに</h3>
(2022.11追記:調べたら、Skeleton Tracking SDK は既に利用できなくなっているようですね。Cubemos 社と Intel 社の契約が切れたのでしょうか。そのため、RealSense と骨格認識を組み合わせるには、<a href="https://google.github.io/mediapipe/" target="_blank">mediapipe</a> などを使うのが良いと思います)
<br />
<br />
距離を計測可能な深度カメラとして、<a href="https://www.intelrealsense.com/stereo-depth/?utm_source=intelcom_website&utm_medium=button&utm_campaign=day-to-day&utm_content=D400_learn-more_button" target="_blank">Intel RealSense D415 および D435</a>が良く知られています。
<br />
<br />
RealSense をロボットなどに搭載すれば、映像を取得できるだけではなく対象物までの距離も取得できるようになるというわけです。しかし、その「対象物」の位置自体はなんらかの方法で事前に見つけておく必要があります。例えば、人物までの距離を測定したい場合、人物の位置をあらかじめ知る必要があるのです。
<br />
<br />
RealSense を用いて人物の骨格の位置を得る方法として、Raspberry Pi と Coral USB Accelerator を用い、ディープラーニングの PoseNet を用いる方法を別サイトで紹介しました。
<br />
<ul>
<li><a href="https://mlbb1.blogspot.com/2020/05/raspberry-pi-realsense-coral-usb.html" target="_blank">Raspberry Pi + RealSense + Coral USB Accelerator + PoseNet で深度情報と姿勢情報を表示する</a></li>
</ul>
この方法により、RealSense を用いて人物の姿勢とその距離を得られるようになったのですが、この方法は Windows などの一般的な PC では速度が非常に遅いという難点がありました(そのため、上記ページではWindows 用プログラムは公開しませんでした)。
<br />
<br />
そこで、本ページでは、RealSense を用いて人物の骨格の位置を得る方法として、公式サイトで紹介されている <a href="https://www.intelrealsense.com/skeleton-tracking/" target="_blank">Cubemos 社による Skeleton Tracking SDK</a> を用いる方法を紹介します。これにより、Windows などの一般的な PC でも RealSense を用いて人物の骨格の位置を高速に得ることができます。
<br />
<br />
なお、Cubemos 社による Skeleton Tracking SDK は 75ドルの商品なのですが、本ページの内容は 30 日間の無料トライアルでも試すことができます。私自身は 30 日間の無料トライアルで本ページの内容を記しましたが、最終的このライブラリを購入する予定です。
<br />
<br />
実際に RealSense を用いて人物の骨格の位置を得ている様子が下図です。青~赤に色付けされているのは距離に相当し、骨格に相当する黄色の線分で表示されています。
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggYaCyBLUR_CO-yKmRjyWxs-QcJMPgP5cwW4pzo6qzs0Ii63SfpnFJMuow2EOQvQNejVmP50P4VUsX_qVilzYKaW1dDp7hg5yLTvBptmKjWeev8CH_Sx9R1Z_N7i9JNxJNTecb_glsONI/s1600/cubemos_sshot05d.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="751" data-original-width="1281" height="374" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggYaCyBLUR_CO-yKmRjyWxs-QcJMPgP5cwW4pzo6qzs0Ii63SfpnFJMuow2EOQvQNejVmP50P4VUsX_qVilzYKaW1dDp7hg5yLTvBptmKjWeev8CH_Sx9R1Z_N7i9JNxJNTecb_glsONI/s640/cubemos_sshot05d.png" width="640" /></a></div>
<br />
本ページでは、これを Windows 10 + Python (Anaconda) で実現する方法を記します。RealSense は D415 と D435 が使えます。なお、公式によるシステム要件として以下が挙げられて言いますのでご注意ください。
<ul>
<li>CPUs: 6th to 10th generation Intel Core and Xeon Processors</li>
<li>GPUs: Intel Iris Pro, Inte HD Graphics 520, 530, 630</li>
</ul>
<br />
<h3>
Skeleton Tracking SDK のインストール</h3>
ここでは、Skeleton Tracking SDK のインストールを行います。本ページではこの SDK を Windows 上の Python で利用することを意図しています。その場合、Visual Studio や RealSense SDK が PC にインストールされている必要はありません。
<br />
<br />
まず、<a href="https://www.intelrealsense.com/skeleton-tracking/" target="_blank">Skeleton Tracking SDK のページ</a>にある「Try for free」ボタンをクリックしましょう。名前やメールアドレスを入力する欄が現れますので、英語で入力して Submit (送信) ボタンをクリックします。少し待つと、30日間の無料トライアル用のライセンスキーと、SDKのダウンロードリンクが書かれたメールが届きますので、まずは SDK をダウンロードしましょう。
<br />
<br />
ダウンロードした圧縮ファイル cubemos_SDK.zip を右クリックして「すべて展開」を選択することなどにより、展開してください。そして中に含まれている Windows 用のインストーラー(執筆時は cubemos-SkeletonTracking_2.3.1.6cffde4.exe )をダブルクリックし、インストールしましょう。なお、「Microsoft Visual C++ 2017 Redistributable (x64)」も(インストール済でなければ)合わせてインストールされます。
<br />
<br />
インストールが終わったら、ライセンスの設定を行います。このとき、職場や学校などのプロキシ環境下ではライセンスの設定ができません(Skeleton Tracking自体はプロキシ環境下でも実行できるのですが)。そのため、ライセンスの設定時のみは、PC をスマートフォンのテザリングなどによりインターネットに直接接続する必要があります。
<br />
<br />
さて、PCをインターネットに直接接続したら、エクスプローラーで「C:\Program Files\Cubemos\SkeletonTracking\scripts」に移動し、中にある「post_installation.bat」をダブルクリックして実行します。すると、以下のようなウインドウが現れますので、先ほど届いたライセンスキーをコピーして貼り付け、「OK」ボタンをクリックすると、ライセンスの登録が始まります。
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqaOWHasE2tgVSIFRLVQc6PFpzOYhADohBftyteX7SAfSZgR15OZWVzQx99DjpkMy3wndTTLwZ1poiBFIbuhRzKubgY18j72hfB9sf0ZFfjZRg66hvWO0-iBqX4udkmGIsrG7ch3UAcgw/s1600/cubemos_sshot01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="139" data-original-width="302" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqaOWHasE2tgVSIFRLVQc6PFpzOYhADohBftyteX7SAfSZgR15OZWVzQx99DjpkMy3wndTTLwZ1poiBFIbuhRzKubgY18j72hfB9sf0ZFfjZRg66hvWO0-iBqX4udkmGIsrG7ch3UAcgw/s1600/cubemos_sshot01.png" /></a></div>
<br />
途中で「Visual Studio 用のファイルを生成するか? (y/n)」というようなメッセージが現れますが(スクリーンショットを取り忘れました)、Python で Skeleton Tracking SDK を使う限り不要なので、「n」を入力して Enter して先に進めます。
<br />
<br />
最終的にこのプログラムは終了するのですが、ライセンスの登録に成功したかどうかは注意して確認する必要があります。
ライセンス登録のログは「C:\Users\ユーザー名\AppData\Local\Cubemos\SkeletonTracking\logs」フォルダに格納されています。AppData フォルダは隠しフォルダになっているのでエクスプローラーで「隠しフォルダを表示する」設定を行わないと見られませんので注意してください。そのフォルダにあるログファイルをテキストエディタで開いたとき、ライセンスの設定がうまくいっていれば、末尾が下記のようになっているはずです。
<br />
<pre class="prettyprint">(中略)
[CUBEMOS_LOG_20][2020-Jun-19 18:21:11.519998][info]Loaded the cubemos plugin C:\Program Files\Cubemos\SkeletonTracking\bin\cubemos_intel_inference_engine_plugin.dll
[CUBEMOS_LOG_21][2020-Jun-19 18:21:11.520994][debug]Cubemos handle is now valid
</pre>
しかし、ライセンスの登録に失敗している場合は、その問題を解消しない限り Skeleton Tracking SDK は使えません。
私が遭遇したエラーとしては、まず下記のものがあります。
<br />
<pre class="prettyprint">(中略)
[CUBEMOS_LOG_16][2020-Jun-12 17:24:28.132243][info]The provided activation key has been accepted for creation of the cubemos handle.
[CUBEMOS_LOG_17][2020-Jun-12 17:24:28.203042][error]Exception caught in file C:\Users\sid\Documents\core_binaries\sources_and_scripts\core\modules\engine\src\engine.cpp and line 226 with error message: "boost::dll::shared_library::load() failed: 指定されたモジュールが見つかりません。"
</pre>
このエラーの原因はよくわからなかったのですが、Skeleton Tracking SDK とともにインストールされる「Microsoft Visual C++ 2017 Redistributable (x64)」との連携がうまくいっていないのかもしれません。私の場合、一度 Skeleton Tracking SDK をアンインストールし、もう一度 Skeleton Tracking SDK をインストールしたらこの問題は解決しました。その際、再インストール時もスマホのテザリングによりPCを直接インターネットに接続したので、それが効いたのかもしれませんが未確認です。
<br />
<br />
もう一つ遭遇したのは、以下のエラーです。 CPU がサポート外だと言われています。
<br />
<pre class="prettyprint">(中略)
[CUBEMOS_LOG_9][2020-Jun-19 18:06:42.372179][error]Exception thrown in file C:\Users\sid\Documents\core_binaries\sources_and_scripts\core\modules\engine\src\internal_api.cpp and line 79 with error message: "An attempt to activate the cubemos SDK was made on an incompatible CPU (Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz) . In order to avoid consuming the license, the process will abort here. Please retry activation on a compatible hardware. . Return code: 6"
[CUBEMOS_LOG_10][2020-Jun-19 18:06:42.372179][error]Hardware information reading failed: An attempt to activate the cubemos SDK was made on an incompatible CPU (Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz) . In order to avoid consuming the license, the process will abort here. Please retry activation on a compatible hardware.
[CUBEMOS_LOG_11][2020-Jun-19 18:06:42.372179][error]Exception thrown in file C:\Users\sid\Documents\core_binaries\sources_and_scripts\core\modules\engine\src\internal_api.cpp and line 134 with error message: "An attempt to activate the cubemos SDK was made on an incompatible CPU (Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz) . In order to avoid consuming the license, the process will abort here. Please retry activation on a compatible hardware. . Return code: 1"
</pre>
古い PC がサポート外と言われるならわかるのですが、私の場合、2020年に購入した Surface Laptop 3 (Core i7-1065G7) でもこのエラーが出ました。サポートに問い合わせたらまだサポート外だそうです。古い PC だけでなく、新しいPC でもサポート外のエラーが出ることがあるのは注意が必要です。
<br />
<br />
最終的に、私の場合 2016年頃に購入した Surface Pro 4 (Core i7-6650U) でライセンス登録に成功しました。
<br />
<br />
なお、ライセンスの登録に成功すると、その情報が C:\Users\ユーザー名\AppData\Local\Cubemos フォルダに格納されます。同一マシンの別ユーザーで Skeleton Tracking SDK を使いたい場合(例えば、ライセンス登録するユーザーとプログラム開発をするユーザーが違う場合など)、このフォルダを別ユーザーにコピーすれば問題なく使えます。
<br />
<br />
<h3>
Anacondaのインストールと設定</h3>
SDKをインストールしたら、それを使うための環境である Anaconda をインストールしましょう。Anaconda は、Python で機械学習を行うためのパッケージを提供するプラットフォームです。Python での機械学習の利用が容易になるので用います。
以下では、Windows 10 に Anaconda をインストールし、含まれている開発環境 Spyder で Python を利用する方針で記します。
<br />
<br />
その前に、いくつか設定が必要です。まず、下図のような Windows 10 の環境変数を設定するウインドウを表示します。このウインドウの表示方法は、Google などで検索すれば見つかるでしょう。
<br />
<br />
そして、上側にある「新規」ボタンを押し、
変数名に
<pre class="prettyprint">CUBEMOS_SKEL_SDK
</pre>
を、変数値に
<pre class="prettyprint">C:\Program Files\Cubemos\SkeletonTracking
</pre>
を入力してOK
という変数を新規で作成し、以下の値を保存しましょう。下図の最上部に見えているように「CUBEMOS_SKEL_SDK」というユーザー環境変数が保存されます。
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcU-PI6TcKN8vGxy5AsM6lXrG63al_xfDe2N1UbT86zjAHm6SAokTntPRoaqOmo6MBl8KaXjdEOzSdjgVZRpuXYhsofCY4n4Fp-k2Gn02uIvUjBvjXktYBRGuJGfIbyaOiXE6O9kl8nWI/s1600/cubemos_sshot02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="585" data-original-width="618" height="603" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcU-PI6TcKN8vGxy5AsM6lXrG63al_xfDe2N1UbT86zjAHm6SAokTntPRoaqOmo6MBl8KaXjdEOzSdjgVZRpuXYhsofCY4n4Fp-k2Gn02uIvUjBvjXktYBRGuJGfIbyaOiXE6O9kl8nWI/s640/cubemos_sshot02.png" width="640" /></a></div>
<br />
なお、環境変数 CUBEMOS_SKEL_SDK は、SDKのインストール時に「システム環境変数」(上図の下半分の領域)として自動的に登録されています。しかし、本ページで用いる Spyder では「システム環境変数」(下半分)ではなく「ユーザー環境変数」(上半分)しか読み込まないようなので、
「ユーザー環境変数」に新たに追加する、というわけです。
<br />
<br />
次に、Windows 10に Anaconda をインストールします。
「<a href="https://www.anaconda.com/products/individual" target="_blank">Anaconda のページ</a>」をページ末尾までスクロールすると、下記のような内容が現れます。
<br /><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmQD0NbMIjhGmMR1qv5UShEmNjs6A1W7siYFAJqKYyVhxjs227HFYy_EePkoLCVLrxmw0yrn17bdr3v_qUK6WxI0dr0OLNLCV9pbWR1TnzPNwCleqLd0IILv2xs6hAJYz9qfkY2pBnIUr6/s1190/dl_anaconda26.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="280" data-original-width="1190" height="148" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmQD0NbMIjhGmMR1qv5UShEmNjs6A1W7siYFAJqKYyVhxjs227HFYy_EePkoLCVLrxmw0yrn17bdr3v_qUK6WxI0dr0OLNLCV9pbWR1TnzPNwCleqLd0IILv2xs6hAJYz9qfkY2pBnIUr6/w625-h148/dl_anaconda26.png" width="625" /></a></div>
<br />
64ビット版 Windows をご利用の場合、Python 3.8 用の「64-Bit Graphical Installer」をクリックします。なお、上図には macOS や Linux 用のリンクも見えます。ですから、それらの OS でも本ページの内容は実行可能なはずです。本ページの以下では Windows を例に実行方法の解説を行いますのでご了承ください。
<br />
<br />
ダウンロードが完了すると、「ダウンロード」フォルダなどに「Anaconda3-2020.07-Windows-x86_64.exe」のようなファイルが保存されています。ダブルクリックし、Anaconda のインストールを開始しましょう。
<br />
<br />
インストールが終わったら、スタートメニューの「A」の項目に下図のように「Anaconda3 (64bit)」という項目が増えています。 このうち「Anaconda Prompt (Anaconda3)」を選択して実行してください。
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPMfjwQOOqC55JpUghKYODHLm_PYgbWJ8Xf4e_-aE2SMRZVljCNLSUELcwVu5Pgv5uRd2aYZm5EhVca19J03WfYOQ_rlT97mUQ9tT124OtLsB4WpVyKniGlDS0vRZIbVushvNvFiCEXW8/s1600/anaconda01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="260" data-original-width="276" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPMfjwQOOqC55JpUghKYODHLm_PYgbWJ8Xf4e_-aE2SMRZVljCNLSUELcwVu5Pgv5uRd2aYZm5EhVca19J03WfYOQ_rlT97mUQ9tT124OtLsB4WpVyKniGlDS0vRZIbVushvNvFiCEXW8/s1600/anaconda01.png" /></a></div>
<br />
現れた下記の画面がプロンプトであり、ここでコマンド(命令)を実行することで、各種ツールのインストールを行います。「neura」の部分はユーザー名であるので人により異なります。
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgP5v7T1pJ_1PySvd138EPVc4GLrAUNOk_hO9yJm059e-ZEGAp3fmMd72KrLZBohk_F-jfuo2yGWQFdojRSLPOhM7AZtVKjntJ-WR5pGGtS-S0-YdtYswFT54xxnlClKSB6cQzvKuYqzpHJ/s1600/dl_anaconda09.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="79" data-original-width="372" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgP5v7T1pJ_1PySvd138EPVc4GLrAUNOk_hO9yJm059e-ZEGAp3fmMd72KrLZBohk_F-jfuo2yGWQFdojRSLPOhM7AZtVKjntJ-WR5pGGtS-S0-YdtYswFT54xxnlClKSB6cQzvKuYqzpHJ/s1600/dl_anaconda09.png" /></a></div>
<br />
まず、プロンプト上で下記のコマンドを入力して実行して、「仮想環境」と呼ばれるものを作成します。「仮想環境」とは、Anacondaのデフォルトの環境とは別に、本ページ用の環境を作るために用います。ここでは本ページの演習を実行するために作成する仮想環境の名称を「cubemos」としました。<br />
また、Anaconda は Python 3.8用のものをダウンロードしましたが、仮想環境は Python 3.7 用のものを作成しますのでご注意ください。
<br />
<pre class="prettyprint">conda create -n cubemos python=3.7
</pre>
なお、以後長いコマンドが続きます。ブラウザ上で上のコマンドをコピーし、下図のようにプロンプトの左上のアイコンをクリックして現れるメニューから「貼り付け」を選択すればコマンドをプロンプトに貼り付けられます。
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpSkF8GMkY3XPeKSckqBjgl1zYSDfC9_pkZnCFDxOBWcaK8kfPAwvxNXvRp82EVzf5Az8g1VUQuyXlnuLhJLtW8Gd5RxxX0RVSLjWl8lFT1eC_tfskfPlHfjYdcv8roX-6h_5RXSKygfA/s1600/anaconda_ml_new01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="316" data-original-width="384" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpSkF8GMkY3XPeKSckqBjgl1zYSDfC9_pkZnCFDxOBWcaK8kfPAwvxNXvRp82EVzf5Az8g1VUQuyXlnuLhJLtW8Gd5RxxX0RVSLjWl8lFT1eC_tfskfPlHfjYdcv8roX-6h_5RXSKygfA/s1600/anaconda_ml_new01.png" /></a></div>
<br />
すなわち、本ページからコピーしたコマンドを上図の方法でプロンプトに貼り付け、Enterキーを入力することでコマンドを実行するのです。この方法により、確実にコマンドを実行するようにしましょう。
<br />
<br />
なお、このとき「Continue creating environment (y/[n])?」や「Proceed (y/[n])?」と聞かれますので、どちらの場合もキーボードで「y」をタイプして「Enter」キーを押して作業を進めてください。
仮想環境の作成が完了したら、下記のコマンドを実行して作成した仮想環境「cubemos」に入ります。
<br />
<pre class="prettyprint">conda activate cubemos
</pre>
その結果、プロンプトの行頭が「(base)」から「(cubemos)」に変化しており、環境が「base」から「cubemos」に変わったことがわかります。
<br />
<br />
そのままの状態で、下記の3つのコマンドを一つずつ順に実行して、本ページの演習に必要なツールをインストールしましょう。これらコマンドは特に長いので、一つずつ注意してコピーして実行しましょう。先ほどと同様、 「Proceed (y/[n])?」などと聞かれたときはキーボードで「y」をタイプして「Enter」キーを押して作業を進めてください。
<br />
<pre class="prettyprint">conda install py-opencv spyder console_shortcut toml
pip install pyrealsense2
pip install --find-links="%CUBEMOS_SKEL_SDK%\wrappers\python" cubemos-skeletontracking
</pre>
なお、最後のコマンドは以前の Cubemosのバージョン(バージョン2系)では以下でした。
<pre class="prettyprint">pip install --find-links="%CUBEMOS_SKEL_SDK%\wrappers\python" cubemos-core cubemos-skel
</pre>
これらのコマンドの実行が終わると(正確には一つ目のコマンドの実行が終わると)、スタートメニューの「Anaconda3 (64bit)」の項目には「Anaconda Prompt (cubemos)」や「Spyder (cubemos)」が追加されています。どちらも、仮想環境 cubemos で必要なツールです。「Anaconda Prompt (cubemos)」は仮想環境 cubemos へツールをインストールしたいときに、「Spyder (cubemos)」は仮想環境 cubemos でPythonプログラムを実行するときに用います。
<br />
<br />
ここまでが終わったらプロンプトを閉じ、スタートメニューから「Anaconda3 (64bit)」の「Spyder (cubemos)」を実行してください。カッコ内の文字が cubemos であることが重要です。
<br />
<br />
起動した Spyder(cubemos) で、メニューから「ツール」→「現在のユーザーの環境変数」を選択してください。警告画面でOKすると、以下のように Spyder で読み込まれている環境変数のリストが現れます。先ほど自分で登録した「CUBEMOS_SKEL_SDK」が存在することがわかります。それを確認できたら、この画面を閉じて構いません。
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgv7w9W5REIDbFj6aYdoRL5t6bfm47kPiXhiD0zvMD53oz8nc-6GOTUq4HyfbF_f3BeZ72lngzWdDtN9pf_880DkO5P8hmh2ivr6GtZXgFVNCwwXNdNNteE_nM0GNwjB9g3iDAzWNHHEJo/s1600/cubemos_sshot04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="375" data-original-width="709" height="338" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgv7w9W5REIDbFj6aYdoRL5t6bfm47kPiXhiD0zvMD53oz8nc-6GOTUq4HyfbF_f3BeZ72lngzWdDtN9pf_880DkO5P8hmh2ivr6GtZXgFVNCwwXNdNNteE_nM0GNwjB9g3iDAzWNHHEJo/s640/cubemos_sshot04.png" width="640" /></a></div>
<br />
なお、仮想環境 cubemos 用のSpyder が起動して、インターフェースが日本語ではなかった場合、メニューから「Tools」→「Preferences」を選択し、現れたウインドウで「General」→「Advanced settings」を選択してLanguageを日本語に設定してください。その際、再起動を促されますのでそれに従えばインターフェースが日本語になります。
<br />
<br />
<h3>
Skeleton Tracking SDK を Windows の Anaconda 上の Python で使ってみる</h3>
以上が終わったら、サンプルファイルを実行してみましょう。Skeleton Tracking SDK をインストールした PC に RealSense D415 または D435 を接続しましょう。本ページのスクリーンショットは D435 で試した結果です。
<br />
<br />
<a href="https://github.com/neuralassembly/realsense-cubemos-skeleton" target="_blank">neuralassembly/realsense-cubemos-skeleton</a>のページに移動し、「Clone」→「Download ZIP」とたどることで、realsense-cubemos-skeleton-master.zip をダウンロードしましょう。realsense-cubemos-skeleton-master.zip は圧縮ファイルなので、右クリックして「すべて展開」を選択することなどにより、展開してください。中に含まれる realsense_skeleton.py がサンプルプログラムなので、先ほど起動した Spyder (cubemos) のメニューから「ファイル」→「開く」を選択して読み込みます。
<br />
<br />
実行する前に、Spyder (cubemos) のメニューから「実行」→「ファイルごとの設定」を選択します。現れたウインドウで、下図のように、「コンソール」→「外部システムターミナルで実行」にチェックを入れ、OKボタンをクリックします。
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwf0Kni-R-qKStEzX6xJLjRz_15eeBTj8no5QmlxdCddG5W0pcIFnKD9JpAerAbAttjutZlN2mp5KMmKshOOPQBvsRTJ4zqMMrB67w-DfxCWPsEUOMwlU5VS7GTuuVS3UmYzKyKpj4r80/s1600/cubemos_sshot03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="690" data-original-width="474" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwf0Kni-R-qKStEzX6xJLjRz_15eeBTj8no5QmlxdCddG5W0pcIFnKD9JpAerAbAttjutZlN2mp5KMmKshOOPQBvsRTJ4zqMMrB67w-DfxCWPsEUOMwlU5VS7GTuuVS3UmYzKyKpj4r80/s1600/cubemos_sshot03.png" /></a></div>
<br />
以上が終わったら、Spyder (cubemos) のメニューから「実行」→「実行」を選択します。以下のように3つのウインドウが開きます。順に、カラー画像(骨格表示)、深度画像、上記2枚の重ね書きです。
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
カラー画像(骨格表示)
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs6VatV666JFeVkj61CgFaoLUWuz1tnjSOmova3IG2OiWYrIp2wJQQIhbfgdzm_w7TTWRXosLiGbZNgEN4hRJsLHkk3zxw5YTKYLWqPqjSbZlauSbH-7Xun_66Qy6tRvYK1btZIuRNAYA/s1600/cubemos_sshot05b.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="751" data-original-width="1281" height="375" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs6VatV666JFeVkj61CgFaoLUWuz1tnjSOmova3IG2OiWYrIp2wJQQIhbfgdzm_w7TTWRXosLiGbZNgEN4hRJsLHkk3zxw5YTKYLWqPqjSbZlauSbH-7Xun_66Qy6tRvYK1btZIuRNAYA/s640/cubemos_sshot05b.png" width="640" /></a></div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
深度画像
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGHJRRwFMGlCKdmk0pTQXeEpGw08ZAN1P53tDJHx7nM0dXO9610pnTKC0NVLCoAJ0I95Zz4wxzLpkCmdUmam6mgqwdHKLScemTH4RYvDOv5QJpowZMoi78e2d8xJh1_tUMLw_9cM-h-4s/s1600/cubemos_sshot05c.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="751" data-original-width="1281" height="374" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGHJRRwFMGlCKdmk0pTQXeEpGw08ZAN1P53tDJHx7nM0dXO9610pnTKC0NVLCoAJ0I95Zz4wxzLpkCmdUmam6mgqwdHKLScemTH4RYvDOv5QJpowZMoi78e2d8xJh1_tUMLw_9cM-h-4s/s640/cubemos_sshot05c.png" width="640" /></a></div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
上記2枚の重ね書き
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggYaCyBLUR_CO-yKmRjyWxs-QcJMPgP5cwW4pzo6qzs0Ii63SfpnFJMuow2EOQvQNejVmP50P4VUsX_qVilzYKaW1dDp7hg5yLTvBptmKjWeev8CH_Sx9R1Z_N7i9JNxJNTecb_glsONI/s1600/cubemos_sshot05d.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="751" data-original-width="1281" height="374" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggYaCyBLUR_CO-yKmRjyWxs-QcJMPgP5cwW4pzo6qzs0Ii63SfpnFJMuow2EOQvQNejVmP50P4VUsX_qVilzYKaW1dDp7hg5yLTvBptmKjWeev8CH_Sx9R1Z_N7i9JNxJNTecb_glsONI/s640/cubemos_sshot05d.png" width="640" /></a></div>
<br />
これらはプログラム中の132~134行目で表示されています。不要ならばコメントアウトなどしてください。
<br />
<pre class="prettyprint"> cv2.imshow('color', color_image)
cv2.imshow('depth', depth_image)
cv2.imshow('overlay', added_image)
</pre>
<br />
<h3>
少しだけコメント</h3>
関数 render_result の内部にあるfor 文
<pre class="prettyprint">
for index, skeleton in enumerate(skeletons):
</pre>
の内部では、
<pre class="prettyprint">
skeleton.joints[i][0] : 関節 i の x 座標
skeleton.joints[i][1] : 関節 i の y 座標
skeleton.confidences[i] : 関節 i の confidence
</pre>
を用いることができます。2つの関節の confidence がともに 0.5 以上のときにその間が線分で結ばれます。「関節 i」の数字 i (0~17) は、「C:\Program Files\Cubemos\SkeletonTracking\docs\doc_doxygen\html\group__skeleton.html で表示される図の数値 (1~18) から 1 を引いたもの」となっています。
<br /><br />
<h3>
おわりに</h3>
以上、お疲れさまでした。
<br /><br /><br /><br />
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/gp/product/4065194032/" style="clear: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" data-original-height="145" data-original-width="160" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6HM3irgCWx5J83OKdNCUtD6ZWzJA0-x19GoKfPF1xmkwkoj9bLlUQhFdj5D2LnHVO5_Hw1qZUOYUKdW1cA-tCZtCpJYzVaPhBEOGK2VmmAQkk9DckUqOXUPeG8fE_4BtLCi1zpd7pJRMH/s1600/dlbb_title_mini2.png" /></a>
<a href="https://www.amazon.co.jp/dp/4065020522/" style="clear: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="145" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOsxLVgVnFI0m-FUJlBK_CqKYJC8dNo3zjk8MOMX2xcJO4omTyOy-aAh3mmqGzXm5P3hGgpkUpaQy-7j7oqdIXyLE2_y686CI2Eda8EMYhME0INhU6irK9jw8b3iUhq7ojs2rrPZrnJtw/s1600/mlbb_title_mini.png" /></a></div>
<br clear="all" />
<div>
「高校数学からはじめるディープラーニング」、「Raspberry Piではじめる機械学習」を執筆しました。</div>
Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com0tag:blogger.com,1999:blog-1209616351336364066.post-56159848499726920032018-06-15T18:01:00.000+09:002020-06-16T18:30:56.108+09:00pi-top v2を購入してStretch系列のpi-topOSで使ってみた<h3>
0. はじめに</h3>
Raspberry Piを組み込んだノートPCであるpi-topの新しいバージョンが2017年10月に発売されたのですが、なかなか買う気になれずにスルーしてきました。<br />
<br />
pi-topに関しては2015年10月頃に発売された旧バージョンを入手し、いくつかブログ記事を書いてきました。
<br />
<ul>
<li><a href="https://neuralassembly.blogspot.com/2015/11/raspberry-pipcpi-top.html" target="_blank">Raspberry PiをノートPC化するPi-Topが届いた</a></li>
<li><a href="https://neuralassembly.blogspot.com/2015/11/raspberry-pipcpi-topli2c.html" target="_blank">Raspberry PiをノートPC化するPi-Topで電子工作(LチカとI2C通信)してみた</a></li>
<li><a href="https://neuralassembly.blogspot.com/2015/11/raspberry-pipcpi-toppi.html" target="_blank">Raspberry PiをノートPC化するPi-Topにユーザーpiでログインしてみた</a></li>
<li><a href="https://neuralassembly.blogspot.com/2016/02/jessiepi-top-os.html" target="_blank">JessieにアップデートされたPi-Top OSを試してみた</a></li>
</ul>
この旧バージョンを使った上で、ちょっとひどいなと思ったのは下記の二点です。
<br />
<ul>
<li>とにかくキーボードのクオリティが低すぎる。なかなか反応しないキーがありノートPCとしては使い物にならない。外付けでUSBキーボードをつなぎたくなるレベル</li>
<li>なんらかの原因でバッテリーが突然使用不能になる。私の場合、使用時にはACアダプタの接続が必須となってしまいました</li>
</ul>
キーボードのクオリティの低さについては過去に<a href="https://neuralassembly.blogspot.com/2015/11/raspberry-pipcpi-top.html" target="_blank">ブログに記しました</a>。バッテリーが使用不能になる件については今回初めて記しますが、ネットで検索すると、同じ問題に当たった人がかなりいらっしゃるようです。Li-Poバッテリーのように過放電すると以後バッテリーが使えなくなる、という症状に似ているように思えます。<br />
<br />
旧バージョンでそんな体験をしていますので、決して安くはない価格でまた似たようなクオリティの製品だったら嫌だなあと思い、なかなか手を出しにくかったのです。<br />
<br />
しかし、発売後しばらくたってもこの新バージョンが旧バージョンと比べて進化しているのかどうかなど、私が知りたい情報があまり入ってこないので、諦めて購入して自分で確かめてみることにしました。<br />
<br />
<h3>
1. 外観</h3>
そんなわけで購入したpi-top v2の外観です。<br />
<br />
<div style="text-align: center;">
pi-top v2の外観</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEyzMjrrQ38ub-91TWxFSur9ZpE565dPyN0qPcTqjwDRPHB_ka14opTTCPHEl6XDoRkRgE5c1GlUUBp8BMJjuLqVqtJ2SKElJayHdCSOwoq-nIEwHfDHjAr8Iie_e8GXUlwvLFSWYNvXk/s1600/2018-06-08+18.06.25.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEyzMjrrQ38ub-91TWxFSur9ZpE565dPyN0qPcTqjwDRPHB_ka14opTTCPHEl6XDoRkRgE5c1GlUUBp8BMJjuLqVqtJ2SKElJayHdCSOwoq-nIEwHfDHjAr8Iie_e8GXUlwvLFSWYNvXk/s400/2018-06-08+18.06.25.jpg" width="400" /></a></div>
<br />
旧バージョンに比べると、マウスのタッチパッドの位置が一般的なノートPCと同じ位置になり、洗練された印象を与えます。サイズは一般的なノートPCと比べるとかなり大きく持ち運びには向かないのですが、これは旧バージョンからそうですので割り切るしかないでしょう(ちなみにサイズは34.5x22x4cm、重さは1.5kg)。<br />
<br />
なお、OSは<a href="https://pi-top.com/products/os#download" target="_blank">公式サイト</a>からStretch系列のpi-topOSをダウンロードして用いました。付属のOSインストール済SDカードには、古いJessie 系列のpi-topOSが入っていたためです。<br />
なお、付属のSDカードはSanDisk Ultra 8GBでしたが、このSDカードは動作中に瞬間的に動作が固まる現象(プチフリ)が多いように思われますので、別のSDカードを用意した方が良いと思います。<br />
<br />
Stretch系列でもいつも通り、起動時にスプラッシュスクリーン動画が流れ、Dashboardというアプリケーションが自動起動するのですが、これを無効にするには、下記の2コマンドをターミナルで実行すればOKです。
<br />
<pre class="prettyprint">sudo systemctl disable pt-splashscreen.service
sudo systemctl disable pt-os-dashboard.service
</pre>
さらに、ターミナルソフトウェアが最大化して開くのを抑制したければ、「<a href="https://neuralassembly.blogspot.com/2015/11/raspberry-pipcpi-toppi.html" target="_blank">Raspberry PiをノートPC化するPi-Topにユーザーpiでログインしてみた</a>」の設定を参考に.config/openbox/lxde-pi-rc.xmlを編集してください。
<br />
<br />
組み立て時の写真は撮っていませんが、基本的にはRaspberry Piを組み込むだけですので、旧バージョンより組み立ての難易度は低めです。ただし、はめ込みのかみ合わせが合いにくかったり、ねじ穴の位置が微妙にずれていてねじが締めにくかったりなどの問題があり、慎重な作業が必要になりますので、小さな子供に任せられる作業ではないと思います。<br />
<br />
<h3>
2. キーボード</h3>
さて、問題のキーボードですが、結論から言えば旧バージョンのpi-topのものに比べると、大幅にクオリティアップしています。<br />
<br />
<div style="text-align: center;">
pi-top v2のキーボード</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEig68m1953-qZgNZs4qdJLkCxLJo3b1s_qg4smL6xDpDWYRe1tw750o4SXfPaDLFVuw4QtLr4wA3dr5L6d0Fqyuv5d6HTjv3MNsSk9gAyFT0ZN7QkpDS7eLtxRN1dW-uvSQT4Nfasi2LVY/s1600/2018-06-08+18.06.55.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEig68m1953-qZgNZs4qdJLkCxLJo3b1s_qg4smL6xDpDWYRe1tw750o4SXfPaDLFVuw4QtLr4wA3dr5L6d0Fqyuv5d6HTjv3MNsSk9gAyFT0ZN7QkpDS7eLtxRN1dW-uvSQT4Nfasi2LVY/s400/2018-06-08+18.06.55.jpg" width="400" /></a></div>
<br />
pi-top v2内蔵のキーボードとマウスだけで作業をしても、まったく苦にならないレベルです。<br />
何を当たり前のことを、と思うかもしれませんが、旧バージョンは普通の作業を内蔵キーボードとマウスで行うだけでもストレスを感じる作業だったのです。<br />
<br />
ただし気になる点もいくつかあり、例えば図からもわかるように、
<br />
<ul>
<li>左Shiftキーが小さく、その右隣に<、>キーがある</li>
<li>Enterキーの右隣にHome、Endキーなどがある</li>
</ul>
などの問題が挙げられます。これらは慣れないと何度もミスタイプします。不満と言えば不満ですが、この程度の特殊な配置のキーボードはノートPCにはよくあるので、まあ許容範囲かな?<br />
<br />
<h3>
3. キーボードをスライドさせる</h3>
pi-top v2の目玉の一つはキーボードをスライドさせてGPIOにアクセスできることでしょう。<br />
<br />
緑色のプラスチックに触って下図のようにスライドさせると、素材のおもちゃっぽさを感じずにはいられないものの、仕組み自体はなかなかよくできていることがわかります。<br />
<br />
<div style="text-align: center;">
pi-top v2のキーボードをスライドさせた様子</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1D8QKfsaHLfTU8VkgcN7pSKayYhWrEmLYquDbjrSIK8taeHhGijSMrYgXlMQV5VvGEHbqynjGKvtYxM5HkJcINRysUWPfBOp0KUJ5V0lnx82xNjvxZe486Blmt08ZS8GobZL2-14-hPs/s1600/2018-06-13+13.55.16.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1D8QKfsaHLfTU8VkgcN7pSKayYhWrEmLYquDbjrSIK8taeHhGijSMrYgXlMQV5VvGEHbqynjGKvtYxM5HkJcINRysUWPfBOp0KUJ5V0lnx82xNjvxZe486Blmt08ZS8GobZL2-14-hPs/s400/2018-06-13+13.55.16.jpg" width="400" /></a></div>
<br />
スライドにより、図のようにRaspberry PiおよびHUB2.0というメイン基板が露出されます。その横にさらにブレッドボードが見えますが、これはpi-topPROTO+という電子工作用のモジュールで、今回これが標準搭載されています。<br />
<br />
旧バージョンのときはpi-topPROTOは別売りで、さらにpi-top本体の発売後しばらく入手可能にならないという問題がありましたので、今回これが標準搭載されたのは良い点だと思います。<br />
<br />
<div style="text-align: center;">
旧バージョンのpi-topでのpi-topPROTO</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtUNT7te6bH6ltqb4_0PprAeR6Y9p1UMCNRHkNkHxaZDBMFF5JdJCKXEONCn9d8EE8fDakQmu9Z6E49p73KQQsOXT-JfAS1knmDtpVtneaPof0r_3BNdcZPewQBpZWhOHPuQjIrdREupk/s1600/2018-06-11+12.05.04.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtUNT7te6bH6ltqb4_0PprAeR6Y9p1UMCNRHkNkHxaZDBMFF5JdJCKXEONCn9d8EE8fDakQmu9Z6E49p73KQQsOXT-JfAS1knmDtpVtneaPof0r_3BNdcZPewQBpZWhOHPuQjIrdREupk/s400/2018-06-11+12.05.04.jpg" width="400" /></a></div>
<br />
なお、このpi-topPROTO+からRaspberry Piの全てのGPIOにアクセスできるのですが、今回そのピンがArduinoなどと同じメスピンになっているのですね。<br />
<br />
個人的には、Raspberry Pi本体と同じくオスピンの方が混乱が少なくて良いと思うのですが、メスピンの方がショートのリスクが小さい、などと配慮した結果なのかもしれません。<br />
<br />
ただまあ、そもそもHUB2.0のすぐ隣で電子工作をするというのはかなりリスクが高いですよね。手がすべってHUBを壊してしまったらそれでpi-topが使えなくなってしまいますから。<br />
<br />
なお、キーボードをスライドさせると、Raspberry Pi本体に取り付けたSDカードが見えるようになりますが、これを手で取り外すのは困難です。<br />
<br />
そのため、SDカード取り外し用の器具が添付されており、下図のようにSDカードをひっかけて引き抜けるようになっています。<br />
<br />
<div style="text-align: center;">
SDカード取り外し用の器具の使い方</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIaFh9jngM4o_RErF6hDmJfbiXel1O2Yti7-O2Sx5doGncxEtZK9SWeGpXolg_7aboLj9k3qh-BhOBVVwN2ucY40iQjhh2zeBfE1sy5a2tpfyykyKaFHsXSg9DJAmjrd5K6gZnRgHUzO0/s1600/2018-06-13+13.55.34.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIaFh9jngM4o_RErF6hDmJfbiXel1O2Yti7-O2Sx5doGncxEtZK9SWeGpXolg_7aboLj9k3qh-BhOBVVwN2ucY40iQjhh2zeBfE1sy5a2tpfyykyKaFHsXSg9DJAmjrd5K6gZnRgHUzO0/s400/2018-06-13+13.55.34.jpg" width="400" /></a></div>
<br />
世の中には、Raspberry Pi本体からSDカードを取り出すことを全く考慮していない商品もありますので(例えば<a href="https://www.amazon.co.jp/dp/B01HT0EMUM" target="_blank">公式のディスプレイケース</a>)、このような対処法が用意されているのは好ましいことだと思います(必ずしもスマートな方法ではないとは言え)。<br />
<br />
<h3>
4. 各種端子へのアクセス</h3>
USB端子2つ、LAN端子、およびイヤフォンジャックへは下図のように背面からアクセスできるようになっています。<br />
<br />
<div style="text-align: center;">
USB端子2つ、LAN端子、およびイヤフォンジャック</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzfue82Y55_JmcOO_qDBQ8jkD2GvLf0lQQ4QnZTjYN6S4w7KMX06SC4NnZJYdhwAulh7NBwJpNjjJI3LeqnFAmA0xY3DIr_54lbT288iZZ-oizOG-LkvA7yixyt6Ji75Na5lZIxrrAZEc/s1600/2018-06-13+13.56.58.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzfue82Y55_JmcOO_qDBQ8jkD2GvLf0lQQ4QnZTjYN6S4w7KMX06SC4NnZJYdhwAulh7NBwJpNjjJI3LeqnFAmA0xY3DIr_54lbT288iZZ-oizOG-LkvA7yixyt6Ji75Na5lZIxrrAZEc/s400/2018-06-13+13.56.58.jpg" width="400" /></a></div>
<br />
旧バージョンでは、これらの端子へのアクセスが悪く、下記のようにUSBハブやヘッドフォン用の延長ケーブルを用いるなどの工夫が必要でした。LAN端子に至っては本体に固定するためのねじを取り外せばなんとか使えるかも?というレベルでした。<br />
<br />
<div style="text-align: center;">
旧バージョンのpi-topでのUSB端子とイヤフォンジャックの利用</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7Fhy7h7y47FqjcE5u7u7OiHcYqSvAe1d2lotDeFHG2yXUDBVockSnd7RvhQhL68J-wxHkr-a27bL_Am3CzBMkGifdGb-o3fcR5EoQyftkqwzsl5crYwmlD3pJMi7cuqS2-6p_tzLPjSg/s1600/2018-06-11+12.04.40.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7Fhy7h7y47FqjcE5u7u7OiHcYqSvAe1d2lotDeFHG2yXUDBVockSnd7RvhQhL68J-wxHkr-a27bL_Am3CzBMkGifdGb-o3fcR5EoQyftkqwzsl5crYwmlD3pJMi7cuqS2-6p_tzLPjSg/s400/2018-06-11+12.04.40.jpg" width="400" /></a></div>
<br />
このように、これらの端子へのアクセスは旧バージョンから比べるとかなり進歩したところです。<br />
<br />
ただし、残念な点もあります。下図のように<span style="text-align: center;">公式カメラモジュールを接続する端子が銀色のカバーに塞がれており、実質</span><span style="text-align: center;">公式カメラモジュールが使えなくなっているのです。</span><span style="text-align: center;">銀色のカバーは、GPIOとHUB2.0との接続や、CPUのヒートシンクの役割をしているものです。</span><br />
<span style="text-align: center;"><br /></span>
<span style="text-align: center;">銀色のカバーを取り付ける前にあらかじめ</span><span style="text-align: center;">公式カメラモジュールを取り付けておけば恐らく使えるでしょうが、</span><span style="text-align: center;">銀色のカバーは</span><span style="text-align: center;">頻繁に取り外すものではないので、</span><span style="text-align: center;">公式カメラモジュールの使用を諦める方が多いのではないでしょうか。これは、非常に詰めが甘いと感じた点です。</span><br />
<br />
<div style="text-align: center;">
公式カメラモジュールを接続する端子がふさがれている</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmdrwVWkQZwSnxcrHj6SUjEnjjtJs675WUuyfwqR8APZnQpFEx7aW9Ce8wk_1F7yM4WbQeInTaVgQgUYfd83r_EAnZIvtJFSVWXI99GTxvaBx8GtKuZs-SjfLYUnycRvnwlDiuMDyDBuI/s1600/2018-06-15+12.07.53-1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmdrwVWkQZwSnxcrHj6SUjEnjjtJs675WUuyfwqR8APZnQpFEx7aW9Ce8wk_1F7yM4WbQeInTaVgQgUYfd83r_EAnZIvtJFSVWXI99GTxvaBx8GtKuZs-SjfLYUnycRvnwlDiuMDyDBuI/s400/2018-06-15+12.07.53-1.jpg" width="400" /></a></div>
<br />
<h3>
5. バッテリー</h3>
バッテリーについては、今後使用していく上でどうなるか検証していきたいと思います(個人的にはあまり期待していませんが…)。<br />
<br />
恐らく、「過充電、過放電しないよう気をつける」という方針で使うことになりますので、すぐ利用不能になることはないのではないでしょうか。<br />
<br />
<h3>
6. まとめ</h3>
そんなわけで、旧バージョンのpi-topを体験した方ならば、その欠点の多くがpi-top v2で解消されていることに驚くのではないかと思います。2015年当時からこのクオリティで出ていれば…と思いますが、ものづくりはそんなに甘くないということなのでしょう。<br />
<br />
なお、この出来の良さだけに、公式カメラモジュールが使えないという詰めの甘さは残念なところです。<br />
<br />
さて、ここまでpi-top v2について比較的高めの評価を与えてきましたが、これはあくまで旧バージョンのpi-topと比較してのことです。<br />
<br />
Windows PCの代替にしようとか、子供にはじめて与えるPCにしようとか、という用途に用いるのは慎重になった方が良いと思います。大手メーカーの製品のように「正常動作し、なおかつ保証があって当然」というものではありませんので。<br />
(そもそも英語キーボードの時点で、人を選ぶ商品ではあります)<br />
<br />
<br />
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/gp/product/4065193397/" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7DRwdHUOfdPJtPAeH0UiIjW1Bi0s94ukn5JFN1x56glI-jjGVy9HyIB1FKHC6cWh15bKybLLYJqhtFmsAMMjyrb3ahHlVpvR_xT7lqEqlvubJ14XBUZQehLFTWTT71WykdZIDNUIr24g/s1600/cover3.png" /></a></div>
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/dp/4062579502/" style="clear: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_dmvycn6QM24eV1ZEoT6lg2TVi108iFt8BG6P1znEj0HtuWPBdYA2KxnD_uy1gw8CZI0UVilZ6noZJbqpagWZmQz5_9iScdkNo_ugvjoFInSMcArrkAYxuOFxoticmpPb1ZvSTJ8S_EM/s1600/raspi2_bb.jpg" /></a></div>
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/dp/4065020522/" style="clear: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="145" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOsxLVgVnFI0m-FUJlBK_CqKYJC8dNo3zjk8MOMX2xcJO4omTyOy-aAh3mmqGzXm5P3hGgpkUpaQy-7j7oqdIXyLE2_y686CI2Eda8EMYhME0INhU6irK9jw8b3iUhq7ojs2rrPZrnJtw/s1600/mlbb_title_mini.png" /></a></div>
<br clear="all" />
<div>
「ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作」、「実例で学ぶRaspberry Pi電子工作」、「Raspberry Piではじめる機械学習」を執筆しました。</div>
Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com2tag:blogger.com,1999:blog-1209616351336364066.post-78334120425504484032018-06-02T17:12:00.000+09:002020-06-16T18:31:20.294+09:002つのmicro:bitで無線コントロールカーを作ってみた<h3>
0. はじめに</h3>
小中学生へのプログラミング教育用教材について興味があり、これまで下記のエントリを書いてきました。<br />
<br />
<ul>
<li><a href="https://neuralassembly.blogspot.com/2016/06/raspberry-piscratchdc.html" target="_blank">Raspberry Pi上のScratchでDCモーターを制御してみた</a></li>
<li><a href="https://neuralassembly.blogspot.com/2016/06/raspberry-piscratch.html" target="_blank">Raspberry Pi上のScratchでアナログ入力を利用してみた</a></li>
</ul>
<br />
どちらも Raspberry Pi 上の Scratch 1.4 を用いて物の制御を行う、という内容になっています。<br />
<br />
しかし、この方法では以下の問題があり、やや敷居が高いのが難点です。<br />
<br />
<ul>
<li>Raspberry Pi を初めて触る方にとっては物品の準備やOSのインストールから始めなければならないこと</li>
<li>Raspberry Pi 上ではScratch の新しいバージョン2が動作するものの、Flashベースのため動作が遅く、さらに電子工作に必ずしも適していないという点から、古いバージョン1.4を使わざるを得ない場面が多いこと</li>
</ul>
<br />
そこで、今回は目先を変えてBBC micro:bit をプログラミング教材として用いた場合に何が可能かを試してみました。BBC micro:bit とは、イギリスの英国放送協会 (BBC) が小学生の教育用に開発したマイコンボードです。<br />
<br />
用いたのは以下のものです。<br />
<br />
<ul>
<li>一般的なPCとブラウザ(micro:bitのプログラミングを行うためです)</li>
<li><a href="http://akizukidenshi.com/catalog/g/gM-12513/" target="_blank">micro:bit</a> 2つ</li>
<li><a href="http://akizukidenshi.com/catalog/g/gK-12833/" target="_blank">micro:bit 用小型バギーカー (:MOVE mini)</a></li>
</ul>
<br />
下図が完成状態です。<br />
micro:bitを2つ持っていなかったので、コントローラー用の1台は、<a href="https://www.switch-science.com/" target="_blank">スイッチサイエンス</a>により開発されたmicro:bitの互換機である<a href="https://www.switch-science.com/catalog/2900/" target="_blank">chibi:bit</a>を用いました。もちろん、chibi:bitでなくmicro:bitを用いても同じです。<br />
<br />
chibi:bitには、スマートフォン用のモバイルバッテリーを電源として用いてます。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9KnEa5uJ64Yp-sVSupO0PKzxWkf5stp6Xf2AaUmTCB2jpW39J6k9lAEKnxA55O0HphgxabPpNwlZWw1Y2N46UPwe7O0Ar8TGEauF18jt1TyEYebi4tsXJ7vMKYvShdp49sMCpaLBXoI0/s1600/2018-06-01+16.29.40.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9KnEa5uJ64Yp-sVSupO0PKzxWkf5stp6Xf2AaUmTCB2jpW39J6k9lAEKnxA55O0HphgxabPpNwlZWw1Y2N46UPwe7O0Ar8TGEauF18jt1TyEYebi4tsXJ7vMKYvShdp49sMCpaLBXoI0/s400/2018-06-01+16.29.40.jpg" width="400" /></a></div>
<br />
今回作成したのはタイトルにもあるように無線コントロールカーです。完成品の動画が下記になります。<br />
<br />
2台のmicro:bitがBLEで通信して、バギーカー上のmicro:bitが車体を動かしています。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="allowfullscreen" frameborder="0" height="290" src="https://www.youtube.com/embed/W4OstZNpI8o?rel=0" width="420"></iframe>
</div>
<br />
<h3>
1. プログラム</h3>
プログラムはmicro:bitの公式サイトでプログラミング用のブロックを組み合わせることで作成します。<br />
<br />
まず、受信側(機体側)のプログラムです。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKfRF5I0eX-IizoZa3QkZm1L9j663gj45tk9GO94fJbRZS5TsQR2Fpl2Ko5bpjQ5qY1cismojs3zP6ar_CSkzBIThV2Ecrg4qbEEdGgUj63VG2DqV6GViZWJrIn1ruC1MFpzGl0duDjJ4/s1600/Receiver.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="576" data-original-width="776" height="296" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKfRF5I0eX-IizoZa3QkZm1L9j663gj45tk9GO94fJbRZS5TsQR2Fpl2Ko5bpjQ5qY1cismojs3zP6ar_CSkzBIThV2Ecrg4qbEEdGgUj63VG2DqV6GViZWJrIn1ruC1MFpzGl0duDjJ4/s400/Receiver.png" width="400" /></a></div>
<br />
送信機から 0 (静止)、1(前進)、2(左折)、3(右折)に対応する数値が送られてきますので、それに応じて2つの連続回転サーボを動かしています。<br />
<br />
(P1, P2)のピンに対し、(90, 90)を出力すると静止です。<br />
(0, 180)は全速で前進、(180, 0)は全速で後退、<br />
(0, 0)は全速で左回転、(180, 180)は全速で右回転です。<br />
<br />
上記のプログラムでは後退を用いず、左回転と右回転は速度を遅めにするためそれぞれ(80, 80)、(95, 95)と設定しています。これらは好みやモーターの特性によると思いますので、お好みで調整します。<br />
<br />
次に、送信側のプログラムです。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjH7p4lfsRJXTSvGqDwoiDAjJRKU0AZ1AjjzxhPzQUtmW_XggNS6Q-XhDpl-krx69KWroPflDSGmE310SaDHcyKU-2mfW8iVW9BczbLNwSgM5mrCkv7gllkko9-jHOr_ohBrwQyKGUByUU/s1600/Sender.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="734" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjH7p4lfsRJXTSvGqDwoiDAjJRKU0AZ1AjjzxhPzQUtmW_XggNS6Q-XhDpl-krx69KWroPflDSGmE310SaDHcyKU-2mfW8iVW9BczbLNwSgM5mrCkv7gllkko9-jHOr_ohBrwQyKGUByUU/s400/Sender.png" width="381" /></a></div>
<br />
こちらはあまり美しいプログラムにはなっていません。<br />
<br />
micro:bitには「ボタンが押されたら」というイベントハンドラはあるのですが、「ボタンから指を離したら」というイベントハンドラがありません。<br />
<br />
そのため、そのままでは「ボタンAを押したら」、「ボタンBを押したら」、「ボタンAとBを同時押したら」という3パターンしか動作を作れません。<br />
<br />
このプログラムでは前進、左回転、右回転、静止、の4つの動作を作りたかったので、上記のプログラムではイベントハンドラを用いず、200msごとにボタンの状態をチェックすることにしています。<br />
<br />
さらに、そのままでは最悪200msごとに通信が行われてしまいます。それを避けるために、現在のボタンの状態を表すstateという変数を導入し、stateの値が変化した場合のみ通信を行う、ということをしています。<br />
<br />
上記を実現するため、「もし~なら~でなければ」の分岐命令を4重に組み合わせることになり、プログラミングの講義ではあまり教えたくないようなプログラムになってしましました。<br />
<br />
<h3>
2. まとめ</h3>
最後に、この題材の良いところと悪いところを列挙します。<br />
<br />
良いところ<br />
<ul>
<li>普段使っているPC(Windowsなど)でブロックによるプログラミングができる</li>
<li>BLEによる通信が簡単</li>
<li>PCから切り離してもスタンドアロンで動作するプログラムが簡単に書ける(Raspberry Piでそれをやろうとするとそれなりに大変)</li>
<li>連続回転サーボは標準のブロックだけで制御できるのでmicro:bitと相性が良い</li>
</ul>
<div>
悪いところ</div>
<ul>
<li>作ってみればわかりますが、:MOVE miniの機体の組み立てが、見た目ほどフレンドリーではない</li>
<li>「ボタンを離したら」というイベントハンドラがないので表現できる状態が少ない</li>
</ul>
そんなところでしょうか。
<br />
<br />
どんな環境を用いる場合も当てはまりますが、後は用意する題材の工夫次第で十分面白い講義ができるのではないかと思いました。
<br />
<br />
<br />
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/gp/product/4065193397/" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7DRwdHUOfdPJtPAeH0UiIjW1Bi0s94ukn5JFN1x56glI-jjGVy9HyIB1FKHC6cWh15bKybLLYJqhtFmsAMMjyrb3ahHlVpvR_xT7lqEqlvubJ14XBUZQehLFTWTT71WykdZIDNUIr24g/s1600/cover3.png" /></a></div>
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/dp/4062579502/" style="clear: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_dmvycn6QM24eV1ZEoT6lg2TVi108iFt8BG6P1znEj0HtuWPBdYA2KxnD_uy1gw8CZI0UVilZ6noZJbqpagWZmQz5_9iScdkNo_ugvjoFInSMcArrkAYxuOFxoticmpPb1ZvSTJ8S_EM/s1600/raspi2_bb.jpg" /></a></div>
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/dp/4065020522/" style="clear: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="145" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOsxLVgVnFI0m-FUJlBK_CqKYJC8dNo3zjk8MOMX2xcJO4omTyOy-aAh3mmqGzXm5P3hGgpkUpaQy-7j7oqdIXyLE2_y686CI2Eda8EMYhME0INhU6irK9jw8b3iUhq7ojs2rrPZrnJtw/s1600/mlbb_title_mini.png" /></a></div>
<br clear="all" />
<div>
「ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作」、「実例で学ぶRaspberry Pi電子工作」、「Raspberry Piではじめる機械学習」を執筆しました。</div>
Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com0tag:blogger.com,1999:blog-1209616351336364066.post-74573987513538887492017-12-13T21:47:00.005+09:002022-07-01T17:11:25.258+09:00Raspberry PiのGPIOが引き出せる小型タッチスクリーンが届いたので電子工作に使ってみた<h3>
0. はじめに</h3>
(2022/4/14動作確認済)<br />
2017年12月10日頃、Raspberry Pi用の小型タッチスクリーンでGPIOを引き出せるものが、amazonでセールされているというので話題になっていました。こちらです。<br />
<ul>
<li><a href="https://www.amazon.co.jp/gp/product/B075K56C12/" target="_blank">Quimat 3.5インチタッチスクリーン HDMIモニタTFT LCDディスプレイ Raspberry Pi 3 2 Model B Rpi B B+ A A+ 映画 アーケードゲーム オーディオ入力 RPi GPIOブレークアウト拡張ボード 保護ケースキット アクリル(透明) QC35C</a></li>
</ul>
セール中は2656円でしたが、通常時でも十分安いですね。
<br />
<br />
この手の小型液晶はGPIOが塞がれてしまうものが多いのですが、それが利用可能なものは珍しいと思い、入手して利用してみました。
<br />
<br />
利用イメージはこちらです。ターミナルソフトウェアのLXTerminalが映った画面がこのタッチスクリーンです。そこから下方向に横向きにGPIOのピンが出ており、電子工作などに利用可能になっています。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh19nzwNzjJHAWkAUi3FxSp-hUvpYdtmEFgqk4xniVW89KAw5earDQimuW1fGxK-pv84Y1dhLgud9iiXV94niiqBBpBdKgT-3UOua9t6VsXQ2IWgabEx86mEaIw0LR7BhGkLnrNgoj1EvE/s1600/2017-12-13+16.16.21.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh19nzwNzjJHAWkAUi3FxSp-hUvpYdtmEFgqk4xniVW89KAw5earDQimuW1fGxK-pv84Y1dhLgud9iiXV94niiqBBpBdKgT-3UOua9t6VsXQ2IWgabEx86mEaIw0LR7BhGkLnrNgoj1EvE/s400/2017-12-13+16.16.21.jpg" width="400" /></a></div>
<br />
以下、利用時におこなった設定などをメモしていきます。<br />
<br />
<h3>
1. まずは起動してみる</h3>
2017/11/29にリリースされたNOOBS 2.4.5でRaspbianをインストール済のRaspberry Pi 3が手元にあったので、そのままタッチスクリーンを差して起動してみたのが次の写真です。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKoWnGJy2HQvYRPyOjZp9dfxHfiOfzSKYmvQQdnfzvtYnmcIdK7LQ4wbAvKyV5nK-RsYpivMSolxAbVvKEmq0PRsDDinboTs5orRcQx_cGr6XsaQ83DelEQSOHigv3p3LWOOS2bf4luN0/s1600/2017-12-13+14.34.56.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKoWnGJy2HQvYRPyOjZp9dfxHfiOfzSKYmvQQdnfzvtYnmcIdK7LQ4wbAvKyV5nK-RsYpivMSolxAbVvKEmq0PRsDDinboTs5orRcQx_cGr6XsaQ83DelEQSOHigv3p3LWOOS2bf4luN0/s400/2017-12-13+14.34.56.jpg" width="400" /></a></div>
<br />
特に何の設定もすることなく画面が映りました。画面の解像度は1280x720でした。さすがにこの解像度では文字が小さすぎて全く読めず、解像度を変更する必要があります。また、この状態ではタッチには反応しません。<br />
<br />
以下でそれらの設定を行っていきます。<br />
<br />
<h3>
2. 設定</h3>
設定方法は付属のDVDのドキュメントに書いてあります。DVDにある圧縮ファイル Driver/LCD-show.tar.gz を展開すると LCD-show というディレクトリが現れるのですが、その中のスクリプトファイル MPI3508_480_320-show を管理者権限で実行すると設定が完了するようです。<br />
<br />
しかし、/boot/config.txtなどのファイルを丸ごと差し替えられるのが嫌なので、 MPI3508_480_320-show の中身を見ながら必要な設定を行っていくことにしました。<br />
<br />
まず、/boot/config.txt に設定を記します。例えば、下記のように管理者権限のテキストエディタで/boot/config.txt を開きます。テキストエディタはviなどお好みのものをどうぞ。<br />
<pre class="prettyprint">sudo leafpad /boot/config.txt
</pre>
なお、NOOBS 3.2.1以降ではテキストエディタとしてleafpadではなくmousepadを用います。
<pre class="prettyprint">sudo mousepad /boot/config.txt
</pre>
開いたファイル末尾に下記の内容を追記し、保存してからファイルを閉じます。<br />
<pre class="prettyprint">hdmi_drive=2
hdmi_force_hotplug=1
hdmi_group=2
hdmi_mode=87
#hdmi_cvt 480 320 60 6 0 0 0
#hdmi_cvt 800 480 60 6 0 0 0
hdmi_cvt 800 600 60 6 0 0 0
dtparam=spi=on
dtoverlay=ads7846,cs=1,penirq=25,penirq_pull=2,speed=50000,keep_vref_on=0,swapxy=0,pmax=255,xohms=150,xmin=200,xmax=3900,ymin=200,ymax=3900
</pre>
最後の2行がタッチの設定を行っており、それ以外は解像度の設定です。800x600のみを有効にしています。実用に耐える解像度は800x480か800x600ではないでしょうか。<br />
<br />
なお、2022年に久しぶりに最新の Raspberry Pi OS Bullseye で設定を試してみたところ、上記内容の追加だけでは駄目で、「左上のメニューボタン」→「設定」→「Screen Configuration」を起動し、
そこから「Configure」→「Screens」→「HDMI-1」→「解像度」→「800x600」を選択する必要がありました。「解像度」にはデフォルトで利用可能な解像度に、 /boot/config.txt で有効にした解像度が追加されて現れるようです。
<br /><br />
このとき、/boot/config.txt の解像度を(例えば800x600から800x480に)後から変更する場合、GUI アプリでデフォルトで利用可能な解像度(例えば1024x768 など)に一旦変更しておかないと、画面表示できなくなりますので注意しましょう。
<br /><br />
さて、このままではタッチの位置が上下逆転してしまうので、キャリブレーションによりタッチの位置を正しく反映するようにします。<br />
<br />
次に、まず、下記のコマンドを実行し、/etc/X11/xorg.conf.d/99-calibration.conf を管理者権限で開きます。テキストエディタはお好みで。<br />
<pre class="prettyprint">sudo mkdir -p /etc/X11/xorg.conf.d
sudo leafpad /etc/X11/xorg.conf.d/99-calibration.conf
</pre>
空のファイルが開きますので、下記の内容を記して保存し、ファイルを閉じます。
<br />
<pre class="prettyprint">Section "InputClass"
Identifier "calibration"
MatchProduct "ADS7846 Touchscreen"
Option "Calibration" "3936 227 268 3880"
Option "SwapAxes" "1"
Option "InvertY" "1"
EndSection
</pre>
この内容は、LCD-show/usr/99-calibration.conf-3508 を元にした内容です。
<br />
<br />
なお、上の設定にある「Option "InvertY" "1"」という行は、<br />
2018年3月にリリースされた NOOBS 2.7.0 (Raspbian 2018-03-13) 以降で<br />
横方向の軸の向きを正しくするための設定です。<br />
後で動作確認する際、上記の設定で「横方向の向きが正しくない」という方は「Option "InvertY" "1"」の行を削除して保存し、Raspberry Piを再起動してください。
<br /><br />
さて次に、以下のコマンドで xserver-xorg-input-evdev をインストールします。
<br />
<pre class="prettyprint">sudo apt update
sudo apt install xserver-xorg-input-evdev
</pre>
最後に、下記のコマンドを実行します。設定ファイルの優先順位を変更しているようです。
<br />
<pre class="prettyprint">sudo cp -rf /usr/share/X11/xorg.conf.d/10-evdev.conf /usr/share/X11/xorg.conf.d/45-evdev.conf
</pre>
以上で再起動すると、/boot/config.txtで設定した解像度で、冒頭の写真のような画面の向きでタッチが効くようになっていると思います。<br />
<br />
この解像度でもターミナルの文字を読むのはやや厳しいので、私の場合LXTerminalのメニューの「編集」→「設定」から、フォントサイズを14、ウインドウサイズを70x16(解像度800x480の場合)または70x22(解像度800x600の場合)に変更しました。この設定もお好みで。<br />
LXTerminalの設定画面で「OK」ボタンが画面外にあるので苦労しますが、キーボードのTABキーで選択肢のフォーカスを画面範囲内の最下部のものに移動し、そこから「TABキー二回押してからEnter」で「OK」ボタンを押したことになります(この表現で伝わるか不安ですが)。<br />
<br />
<h3>
3. 画面タッチのキャリブレーションについて</h3>
以上で画面タッチによる操作が可能になったと思いますが、タッチ位置と画面上のカーソルの位置の微妙なずれが気になる方がいるかもしれません。その場合、xinput_calibrator というソフトウェアでキャリブレーションを行うと良いでしょう。まず、以下のコマンドで xinput_calibrator をインストールします。
<pre class="prettyprint">sudo apt update
sudo apt install xinput-calibrator
</pre>
インストールが終わったら下記のように xinput_calibrator を起動します。
<pre class="prettyprint">xinput_calibrator
</pre>
画面を4か所タッチするよう指示がありますので、指示通りペンでタッチします。すると、キャリブレーション結果が表示されますので、それを参考に /etc/X11/xorg.conf.d/99-calibration.conf を編集し、再起動すればよいのです。
私の場合、下記の3行を
<pre class="prettyprint"> Option "Calibration" "3936 227 268 3880"
Option "SwapAxes" "1"
Option "InvertY" "1"
</pre>
下記の2行に置き換えることになりました。
<pre class="prettyprint"> Option "Calibration" "3948 236 3823 328"
Option "SwapAxes" "1"
</pre>
気になる方は色々試してみてください。
<br /><br />
<h3>
4. GPIOについて</h3>
GPIOはそのまま使えますが、下図のSPI関係のピンとGPIO 25はタッチスクリーンで使用済であるようなので使わないようにしましょう。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiv5nUQBNbFuxftLHpya1k1Gt9EMU1jdJ9DSHHH_Jh1TDbV74MsCNl-ThScUs_AMInaMySrzMg5V8jfpzDiSOullXuhyphenhyphenGpM3gs695-hN4WcK1F_oXHISoAGaywGZGMPXqizP5pz8XGD1E/s1600/UsedPin.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="440" data-original-width="260" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiv5nUQBNbFuxftLHpya1k1Gt9EMU1jdJ9DSHHH_Jh1TDbV74MsCNl-ThScUs_AMInaMySrzMg5V8jfpzDiSOullXuhyphenhyphenGpM3gs695-hN4WcK1F_oXHISoAGaywGZGMPXqizP5pz8XGD1E/s320/UsedPin.png" width="189" /></a></div>
<br />
<h3>
5. 終わりに</h3>
この手の小型タッチディスプレイは沢山出ていますが、GPIOが利用可能なものは貴重ですね。設定もそれほど難しくありませんし、3000円前後なら十分試す価値はあるのではないでしょうか。<br />
<br />
<br />
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/gp/product/4065193397/" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7DRwdHUOfdPJtPAeH0UiIjW1Bi0s94ukn5JFN1x56glI-jjGVy9HyIB1FKHC6cWh15bKybLLYJqhtFmsAMMjyrb3ahHlVpvR_xT7lqEqlvubJ14XBUZQehLFTWTT71WykdZIDNUIr24g/s1600/cover3.png" /></a></div>
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/dp/4062579502/" style="clear: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_dmvycn6QM24eV1ZEoT6lg2TVi108iFt8BG6P1znEj0HtuWPBdYA2KxnD_uy1gw8CZI0UVilZ6noZJbqpagWZmQz5_9iScdkNo_ugvjoFInSMcArrkAYxuOFxoticmpPb1ZvSTJ8S_EM/s1600/raspi2_bb.jpg" /></a></div>
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/dp/4065020522/" style="clear: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="145" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOsxLVgVnFI0m-FUJlBK_CqKYJC8dNo3zjk8MOMX2xcJO4omTyOy-aAh3mmqGzXm5P3hGgpkUpaQy-7j7oqdIXyLE2_y686CI2Eda8EMYhME0INhU6irK9jw8b3iUhq7ojs2rrPZrnJtw/s1600/mlbb_title_mini.png" /></a></div>
<br clear="all" />
<div>
「ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作」、「実例で学ぶRaspberry Pi電子工作」、「Raspberry Piではじめる機械学習」を執筆しました。</div>
Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com2tag:blogger.com,1999:blog-1209616351336364066.post-68265316355703507292016-10-21T11:20:00.004+09:002021-08-05T13:21:56.896+09:00Raspberry PiのGPIOを用いてPICマイコンに書き込みをしてみた<h3>
はじめに</h3>
「<a href="http://neuralassembly.blogspot.jp/2016/06/raspberry-piscratch.html" target="_blank">Raspberry Pi上のScratchでアナログ入力を利用してみた</a>」というエントリにて、PICマイコンを用いると、Raspberry Pi上のScratchにて簡単かつ安価にアナログセンサを取り扱えることを紹介しました。<br />
<br />
ただし、PICマイコンには自作プログラムを書き込まなければならず、その書き込み用のツールPICkit3が6千円程度することがややネックでした。<br />
<br />
しかし今回、PICkit3を必要とせず、Raspberry PiのGPIOからPICのプログラムを書き込む方法が分かったので紹介します。Raspberry Piをお使いの方ならば、数百円でPICマイコンにプログラムを書き込むことができるようになります。<br />
<br />
この方法により、Raspberry Pi上のScratchでアナログセンサを取り扱うことがさらに身近になります。もちろん、それ以外の用途への応用も可能です。<br />
<br />
<h3>
用意するもの</h3>
今回、PICマイコンへプログラムを書き込むために用意するものは下記の通りです。
<br />
<ul>
<li>3.3Vで動作するPICマイコン。本ページではAD変換とシリアル通信を取り扱うことのできる<a href="http://akizukidenshi.com/catalog/g/gI-04557/" target="_blank">PIC12F1822</a>と<a href="http://akizukidenshi.com/catalog/g/gI-04347/" target="_blank">PIC16F1823</a>を用いました。5V以上でしか動作しないPICマイコンでも原理的に書き込み可能だと思いますが、3.3V←→5Vのレベル変換がさらに必要になるので、回路がやや複雑になるでしょう。</li>
<li>9Vの角形電池1つ</li>
<li><a href="http://akizukidenshi.com/catalog/g/gP-00452/" target="_blank">9Vの角形電池用スナップ</a>1つ</li>
<li><a href="http://akizukidenshi.com/catalog/g/gI-09723/" target="_blank">MOSFET 2N7000</a>を1つ:3.3V←→9Vのレベル変換に用います</li>
<li><a href="http://akizukidenshi.com/catalog/g/gR-25103/" target="_blank">10kΩの抵抗</a>2つ</li>
<li>ブレッドボード、ジャンパワイヤ:適宜</li>
</ul>
<h3>
<br />ソフトウェアの準備</h3>
まず、Raspberry Piに<a href="https://wiki.kewl.org/dokuwiki/projects:pickle" target="_blank">pickle</a>というソフトウェアをインストールする必要があります。<br />
<br />
pickleのページの「Installation」という項目に pickle-5.01.tgz と書かれたリンクがあるのでクリックし、ファイルをダウンロードします。<br />
<br />
Raspberry Piのブラウザでは、通常「Downloads」または「ダウンロード」ディレクトリに保存されますので、ファイルマネージャでそれをユーザーpiのホームに移動しておきます。<br />
<br />
そして、ターミナルソフトウェアLXTerminalを起動し、下記のコマンド順にを実行し、pickleをインストールします。
<br />
<pre class="prettyprint">$ tar zxf pickle-5.01.tgz
$ cd pickle
$ make
$ sudo make install
</pre>
以上で必要なソフトウェアのインストールが終わりました。そのターミナルを終了せず、そのまま下記のコマンドを実行します。pickleを用いるための設定ファイルを適切な位置に作成しています。
<br />
<pre class="prettyprint">$ mkdir /home/pi/.pickle
$ leafpad /home/pi/.pickle/config
</pre>
なお、NOOBS 3.2.1以降ではテキストエディタとしてleafpadではなくmousepadを用います。その場合、二つ目のコマンドは次のようになります。
<pre class="prettyprint">$ mousepad /home/pi/.pickle/config
</pre>
テキストエディタleafpadで空のファイルが開きますので、下記の内容をコピーして貼り付け、保存してください。
<pre class="prettyprint">DEVICE=RPI2
SLEEP=1
BITRULES=0x1000
BUSY=0
VPP=4
PGM=65535
PGC=17
PGD=27
MCP=0x20
FWSLEEP=30
DEBUG=1
</pre>
「DEVICE」が「RPI2」となっているのはRaspberry Pi 2 または 3 用の設定ファイルであるという意味です。<br />
Raspberry Pi 4を用いている場合は、「DEVICE」を「RPI4」に設定してください。<br />
また、Raspberry Pi 1系やZero系を用いている場合は数字を省いて「DEVICE」を「RPI」に設定してください。
<br />
<br />
その他の設定の意味については、<a href="https://wiki.kewl.org/dokuwiki/projects:pickle" target="_blank">公式サイト</a>に説明があります。
<br />
<br />
<div>
<h3>
回路の準備</h3>
</div>
次に、PICマイコンに書き込みを行うための回路を準備します。そのために、利用するPICマイコンのピン配置をあらかじめ調べておく必要があります。<br />
<br />
PICマイコンへプログラムを書き込むにはいくつかの方法がありますが、今回用いるのは「High voltage programming」という手法です。一般に、マイコンにプログラムを書き込むことを「プログラミング(programming)」と呼ぶことにも注意しておきましょう。<br />
<br />
この手法には「VDD」、「VSS(GND)」、「ISCPDAT」、「ISCPCLK」、「~MCLR」という5つのピンを用いますので、そのピンの位置を事前に調べておきます。<br />
<br />
今回用いるPIC12F1822およびPIC16F1823の仕様書は<a href="http://ww1.microchip.com/downloads/en/DeviceDoc/41413C.pdf" target="_blank">英語版</a>と<a href="http://ww1.microchip.com/downloads/jp/DeviceDoc/41413C_JP.pdf" target="_blank">日本語版</a>がありますが、それらによると、該当するピンは下記のように配置されていることがわかります。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEij0zPJJ0wqXQ06H4RpH4VVOt_-9RoA9hQSrD4YAc1Jh_CAJD8tfcBLBGT0X9wmTG_u6bM2igI3juH95DrF0qTtTE2ib35zxSusYU8gnisc0-CC7ZlZWfiobO0dDB3AiIIjewcE2tOPtOw/s1600/PICProgrammingPinAssign.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="133" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEij0zPJJ0wqXQ06H4RpH4VVOt_-9RoA9hQSrD4YAc1Jh_CAJD8tfcBLBGT0X9wmTG_u6bM2igI3juH95DrF0qTtTE2ib35zxSusYU8gnisc0-CC7ZlZWfiobO0dDB3AiIIjewcE2tOPtOw/s400/PICProgrammingPinAssign.png" width="400" /></a></div>
<br />
High voltage programmingでは、~MCLRピンにPICマイコンの動作電圧より高い電圧(ここでは9V)の信号を与える必要があります。<br />
<br />
Raspberry PiのGPIOから出力される信号は3.3Vなので、これを9Vに変換する必要があります。そのために、本ページではNチャネルMOSFETを用いた下記のようなレベル変換回路を利用します。<br />
<br />
これは、「<a href="http://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-4JEB" target="_blank">ロジックレベル双方向変換モジュールBOB-12009</a>」で<a href="https://learn.sparkfun.com/tutorials/bi-directional-logic-level-converter-hookup-guide" target="_blank">用いられている回路</a>と同等なものです。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRf-LpcHyZbnEDT48fdfF1_qMxuWKolu1GaxSjA-qf5zWgdcWufBbS2NuhtFxhWlsPsXXaJFQ-dhRQ1B5DcfeK0R4O5jlggqe42k3aADz0FViUdXN-yUaMpHFKt9OEnfPYwC1CneL1dNk/s1600/LevelShift9V.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="214" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRf-LpcHyZbnEDT48fdfF1_qMxuWKolu1GaxSjA-qf5zWgdcWufBbS2NuhtFxhWlsPsXXaJFQ-dhRQ1B5DcfeK0R4O5jlggqe42k3aADz0FViUdXN-yUaMpHFKt9OEnfPYwC1CneL1dNk/s400/LevelShift9V.png" width="400" /></a></div>
<br />
以上をまとめると、PIC12F1822を用いるときに構成すべき回路は下図のようになります。<br />
<br />
この回路を構成する場合、9V電池の取り扱いには十分注意してください。9Vの部分をRaspberry Piに接触させると、Raspberry Piが壊れる可能性があります。同様に、回路の接続が正しいことのチェックも重要です。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeqkSxJyfkV2x-GE7JxDhAwgwADwUdhFEKCUHSL46plesPViTaXGDKqid3UDOjOKKfN7sf0U1nww9rPwK6GMKFLOONlroQSmNBYytS-SpDlP7l4lQXCB1JyjpBZ55qeKmcI4Sn-MWaneY/s1600/PicProgrammingNMOS_12f1822.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="282" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeqkSxJyfkV2x-GE7JxDhAwgwADwUdhFEKCUHSL46plesPViTaXGDKqid3UDOjOKKfN7sf0U1nww9rPwK6GMKFLOONlroQSmNBYytS-SpDlP7l4lQXCB1JyjpBZ55qeKmcI4Sn-MWaneY/s400/PicProgrammingNMOS_12f1822.png" width="400" /></a></div>
<br />
ほぼ同じですが、PIC16F1823の場合は下図のようになります。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVH4nNSJeDI_XFRUWNVf7jWulmAdIONzanWmpU-tvS0m3AqMgW8CeHsuO_oV4bEDVuBp3rhb9ia1LlQ8Eh_C_zioV-PXn3hyphenhyphenE_7Cc-J1ml1qXgnSAbwAauwKyrKxwMHei4Tpu1cjoFtIM/s1600/PicProgrammingNMOS_16f1823.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="258" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVH4nNSJeDI_XFRUWNVf7jWulmAdIONzanWmpU-tvS0m3AqMgW8CeHsuO_oV4bEDVuBp3rhb9ia1LlQ8Eh_C_zioV-PXn3hyphenhyphenE_7Cc-J1ml1qXgnSAbwAauwKyrKxwMHei4Tpu1cjoFtIM/s400/PicProgrammingNMOS_16f1823.png" width="400" /></a></div>
<br />
<h3>
書き込み</h3>
最後に、書き込みを行いましょう。<br />
<br />
書き込むプログラムをビルドしてできるHEXファイルを用意する必要がありますが、ここでは冒頭で紹介した「<a href="http://neuralassembly.blogspot.jp/2016/06/raspberry-piscratch.html" target="_blank">Raspberry Pi上のScratchでアナログ入力を利用してみた</a>」というエントリで用いるファイルを書き込んでみます。<br />
<br />
HEXファイルはPIC12F1822用とPIC16F1823用の2つしか用意しておりませんのでご注意ください。<br />
<br />
まず、LXTerminalを新たに開き、下記のコマンドでファイルをダウンロードし、そのディレクトリに移動します。
<br />
<pre class="prettyprint">$ git clone https://github.com/neuralassembly/TinyPicoBoard
$ cd TinyPicoBoard
</pre>
pickleというソフトウェアをインストールした際、p12、p14、p16、p24、p32、などといったコマンドがインストールされ、用いるPICマイコンの種類によって使い分けるのですが、本ページではp14コマンドを用います。
まず、Raspberry Piに接続されているPICマイコンの情報を取得するには、下記のコマンドを実行します。
<br />
<pre class="prettyprint">$ p14 id
</pre>
その結果、下図のように、PICマイコンの情報が表示されます。PIC12F1822が認識されていることが見て取れますね。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6lXc4jHikc9-d_vwrZ031SYMVYhAPE3cGJdUMC5FVsH_d5oxR7FrOPgA6zqnso8V25gddggTU_JqLqMfmACHDlZhmsgOLh0j0MqmRMqWRxS6pgolY8xshvCAl7G1u1RjZibOWj0UlA14/s1600/PickleResult.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="263" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6lXc4jHikc9-d_vwrZ031SYMVYhAPE3cGJdUMC5FVsH_d5oxR7FrOPgA6zqnso8V25gddggTU_JqLqMfmACHDlZhmsgOLh0j0MqmRMqWRxS6pgolY8xshvCAl7G1u1RjZibOWj0UlA14/s400/PickleResult.png" width="400" /></a></div>
<br />
TinyPicoBoardディレクトリにある「12f1822.hex」というファイルをPIC12F1822に書き込むには、下記のコマンドを実行します。上図にその様子が示されていますね。
<br />
<pre class="prettyprint">$ p14 program 12f1822.hex
</pre>
同様に、「16f1823.hex」というファイルをPIC16F1823に書き込むには、下記のコマンドを実行します。
<br />
<pre class="prettyprint">$ p14 program 16f1823.hex
</pre>
なお、PICに書き込まれているプログラムを消すためのコマンドとしては下記が使えます。消すことの確認を英語で求められたら、「y」をタイプしてEnterします。
<br />
<pre class="prettyprint">$ p14 blank
</pre>
書き込みが終わったPICは、「<a href="http://neuralassembly.blogspot.jp/2016/06/raspberry-piscratch.html" target="_blank">Raspberry Pi上のScratchでアナログ入力を利用してみた</a>」に基づいて使用することができます。
<br />
<br />
<h3>
終わりに</h3>
以上です。~MCLRピンに接続する信号を9Vにレベル変換する必要があることに気づくまで時間がかかってしまいました。<br />
<br />
なお、本ページでは3.3Vで動作するPIC12F1822やPIC16F1823を対象としました。4V以上でないと動作しないPICマイコンの場合、恐らく下記のようにする必要があるでしょう(試していません)。<br />
<ul>
<li>VPPピン:Raspberry PiのGPIOから5Vを与える</li>
<li>ISCPDAT、ISCPCLKピン:Raspberry Piの17ピン、27ピンと接続する際、3.3V←→5Vのレベル変換回路を介する必要がある</li>
</ul>
<br />
<br />
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/gp/product/4065193397/" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7DRwdHUOfdPJtPAeH0UiIjW1Bi0s94ukn5JFN1x56glI-jjGVy9HyIB1FKHC6cWh15bKybLLYJqhtFmsAMMjyrb3ahHlVpvR_xT7lqEqlvubJ14XBUZQehLFTWTT71WykdZIDNUIr24g/s1600/cover3.png" /></a></div>
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/dp/4062579502/" style="clear: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_dmvycn6QM24eV1ZEoT6lg2TVi108iFt8BG6P1znEj0HtuWPBdYA2KxnD_uy1gw8CZI0UVilZ6noZJbqpagWZmQz5_9iScdkNo_ugvjoFInSMcArrkAYxuOFxoticmpPb1ZvSTJ8S_EM/s1600/raspi2_bb.jpg" /></a></div>
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/dp/4065020522/" style="clear: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="145" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOsxLVgVnFI0m-FUJlBK_CqKYJC8dNo3zjk8MOMX2xcJO4omTyOy-aAh3mmqGzXm5P3hGgpkUpaQy-7j7oqdIXyLE2_y686CI2Eda8EMYhME0INhU6irK9jw8b3iUhq7ojs2rrPZrnJtw/s1600/mlbb_title_mini.png" /></a></div>
<br clear="all" />
<div>
「ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作」、「実例で学ぶRaspberry Pi電子工作」、「Raspberry Piではじめる機械学習」を執筆しました。</div>
Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com2tag:blogger.com,1999:blog-1209616351336364066.post-29243940324318083682016-06-27T23:32:00.000+09:002020-06-16T18:32:06.798+09:00Raspberry Pi上のScratchでアナログ入力を利用してみた<h3>
-1. はじめにのはじめに</h3>
本ページの内容は、<b>NOOBS 1.9.3およびNOOBS 2.0.0ではScratchのバグにより動作しません</b>のでご注意ください。最新のNOOBSで試すことをおすすめします。
<br /><br />
なお、本ページで対象としているのはメニューの「プログラミング」→「Scratch」で起動できるScratch バージョン1.4です。Scratch 2は対象としていませんのでご了承ください。
<br />
<br />
<h3>
0. はじめに</h3>
中学生を対象とした電子工作関連のセミナーを担当するにあたり、Scratchによる電子工作で何ができるかを調査しました。<br />
<br />
前回のエントリ「<a href="http://neuralassembly.blogspot.jp/2016/06/raspberry-piscratchdc.html" target="_blank">Raspberry Pi上のScratchでDCモーターを制御してみた</a>」でRaspberry Pi上のScratchを試してみたところ、と、デフォルトで<br />
<ul>
<li>デジタル(0/1)の入出力</li>
<li>ソフトウェアPWM出力</li>
</ul>
<div>
が取り扱えることがわかりました。</div>
<div>
<br /></div>
<div>
ここまでできるのならアナログ入力も取り扱えるようにしよう、というのが今回のエントリです。</div>
<div>
<br /></div>
<div>
結論から言うと、PicoBoardというボードの通信仕様をそのまま用いることで、アナログ入力を利用できることがわかりました。</div>
<div>
<br /></div>
<div>
下図は、前回取り扱ったDCモーター搭載のキャタピラ式模型の前面に距離センサを取り付け、障害物までの距離を一定に保つというデモの様子です。</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnoxZ4YXJnFp5K_r5sXttNlikZ6ONUccW5WO-LqTbkQhapDjoYTTvvjCqviRjKS8GhD41zTuY-cRueJMqwJNOT-6hclbM8G_KMQc9HuRT_8lEFEuWSOCCFt5u40Ci4BLVB4v2KfZ4gv3Y/s1600/2016-06-27+13.50.16.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnoxZ4YXJnFp5K_r5sXttNlikZ6ONUccW5WO-LqTbkQhapDjoYTTvvjCqviRjKS8GhD41zTuY-cRueJMqwJNOT-6hclbM8G_KMQc9HuRT_8lEFEuWSOCCFt5u40Ci4BLVB4v2KfZ4gv3Y/s400/2016-06-27+13.50.16.jpg" width="400" /></a></div>
<div>
<br />
その様子を示した動画がこちらです。
<br />
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="allowfullscreen" frameborder="0" height="290" src="https://www.youtube.com/embed/zczEgQNWSyQ?rel=0" width="420"></iframe>
</div>
<div>
<br /></div>
<h3>
1. 方針</h3>
まずは方針について解説します。<br />
<br />
<a href="https://www.switch-science.com/catalog/1961/" target="_blank">PicoBoard</a>というボードを用いると、Raspberry Piに限らず、WindowsやOS X上のScratchでセンサ入力を取り扱えるようになります。しかし、セミナなどで使うために複数購入するには、価格がやや高いのが難点です。<br />
<br />
PicoBoardはシリアル通信でScratchにデータを送るのですが、その<a href="http://swikis.ddo.jp/WorldStethoscope/uploads/54/ScratchBoard_Tech_InfoR2.pdf" target="_blank">仕様は公開されています</a>。これを自分で実装すれば良さそうです。<br />
<br />
一番簡単なのは、「<a href="http://www.instructables.com/id/Scratching-with-Arduino/" target="_blank">Scratching with Arduino</a>」に基づいて、Arduinoで「AD変換+シリアル通信」の機能を実現することでしょう。しかし、この方法もやはり一つあたり数千円かかるので、低価格で複数用意したい、という今回の目的を満たしません。<br />
<br />
なお、本ページではArduinoによる実現については解説しませんが、Arduino UnoではRaspberry Pi上のScratchから認識されないので注意が必要です(/dev/ttyACM0 が使われるため)。「<a href="https://www.switch-science.com/catalog/1032/" target="_blank">FTDI USBシリアル変換アダプター(5V/3.3V切り替え機能付き)</a>」などのように、/dev/ttyUSB0 が使われるデバイスを介する必要があります。<br />
<br />
さて、「AD変換+シリアル通信」をなるべく低価格で実現するため、本ページでは「<a href="http://akizukidenshi.com/catalog/g/gI-04557/" target="_blank">PIC12F1822</a>」または「<a href="http://akizukidenshi.com/catalog/g/gI-04347/" target="_blank">PIC16F1823</a>」用いることにしました。<br />
<br />
PIC12F1822では3個の入力、PIC16F1823では8個の入力を取り扱うことができます。学習目的ならば入力3個のPIC12F1822で十分かな、と個人的には思います。PIC12F1822の方がピン数が少なくて中学生には取り扱いが容易、というのも理由の一つです<br />
<br />
なお、シリアル通信はUSB経由ではなく、Raspberry Piのピン番号8, 10のGPIOを用います。<br />
<br />
<h3>
2. Raspberry Piでシリアルコンソールを無効に</h3>
さて、上述のようにRaspberry Piのピン番号8, 10のGPIOをPICとのシリアル通信で用いるため、Raspberry Piでシリアルコンソールを無効にする必要があります。<br />
<br />
まず、/boot/cmdline.txtを管理者権限のテキストエディタで編集します。
<br />
<pre class="prettyprint">sudo leafpad /boot/cmdline.txt
</pre>
その中に下記のように「console=serial0,115200」という部分があるので…
<br />
<pre class="prettyprint">dwc_otg.lpm_enable=0 console=tty1 <strong>console=serial0,115200</strong> root=/dev/mmcblk0p7 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
</pre>
これを以下のように削除して保存し、テキストエディタを閉じます。
<br />
<pre class="prettyprint">dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p7 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
</pre>
さらに、ターミナルを起動し、下記のコマンドを実行してシリアルコンソールを無効にします。
<br />
<pre class="prettyprint">sudo systemctl disable serial-getty@ttyAMA0.service
</pre>
以上が終わったらRaspberry Piを再起動します。
<br />
<br />
なお、Raspberry Pi 3ではさらにオンボードのBluetooth機能を無効にしする必要があります。
まず、ターミナルLXTerminalを起動し、下記のコマンドを実行します。
<br />
<pre class="prettyprint">sudo leafpad /boot/config.txt
</pre>
このコマンドにより、設定ファイル/boot/config.txtが管理者権限のテキストエディタleafpadで開きますので、末尾に下記の1行を追記して保存し、Raspberry Piを再起動します。
<br />
<pre class="prettyprint">dtoverlay=pi3-disable-bt
</pre>
もし、オンボードのBluetooth機能とシリアル機能を両方使いたい場合、<a href="http://www.neko.ne.jp/~freewing/raspberry_pi/raspberry_pi_3_uart_with_bluetooth/" target="_blank">こちら</a>などを参考にしてください。<br />
<br />
<h3>
3. PICにプログラムを書き込む</h3>
Raspberry Piに対してシリアル通信でデータを送るために、PICマイコンにこちらで用意したプログラムをあらかじめ書き込んでおく必要があります。<br />
<br />
以前はこれをWindowsやMac OS X上でPICkit3というツールを用いて実現する方法を記していましたが、PICkit3を必要とせずRaspberry Piのみで実現する方法がわかりました。<br />
<br />
その方法を別ページの「<a href="http://neuralassembly.blogspot.jp/2016/10/raspberry-pigpiopic.html" target="_blank">Raspberry PiのGPIOを用いてPICマイコンに書き込みをしてみた</a>」に記しましたので、そちらを参照して準備を整えてから先に進んでください。<br />
<br />
<h3>
4. 回路を組んで動作させる</h3>
プログラムを書き込んだPICの用意ができたら、回路を組んで動作させるだけです。<br />
<br />
今回PIC12F1822用に組んだ回路はこちら。<a href="http://neuralassembly.blogspot.jp/2016/06/raspberry-piscratchdc.html" target="_blank">前回</a>同様、DCモーター一つを動かすプログラムになっています。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSNuYzrVrQbMTJqefFPcSfNIW3XIqYyGI6uarhD8-KnYy99Xc50rh5yhl05nQtilwdF05h1Ilurb7bAjDTXvADVeEHDel5bn-I8xlgNfDmLNf3tdV8HF0U0LLLMvIxBYSb_wNY36rA9oo/s1600/SensorCircuit.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="272" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSNuYzrVrQbMTJqefFPcSfNIW3XIqYyGI6uarhD8-KnYy99Xc50rh5yhl05nQtilwdF05h1Ilurb7bAjDTXvADVeEHDel5bn-I8xlgNfDmLNf3tdV8HF0U0LLLMvIxBYSb_wNY36rA9oo/s400/SensorCircuit.png" width="400" /></a></div>
<br />
<br />
PIC12F1822の「A, B, C」と書かれた3つのピンがアナログセンサを接続できる箇所となっています。<br />
<br />
モーター用電源以外は3.3Vで動作する回路としましたので、アナログセンサも3.3Vで動作するものを選択する必要があります。今回は「<a href="http://akizukidenshi.com/catalog/g/gI-07546/" target="_blank">シャープ測距モジュールGP2Y0E02A</a>」を選んでみました。<br />
<br />
なお、ほぼ同じですが、PIC16F1823を用いた回路は下記の様になります。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMeW3h5uvy1fhxWzxxVkCLu1SgUk4kHpJytwdFU9iudwsj-DdhEuZBo047WCBxZTINGBil44NiZV3bitzzBWOgn_Wl7mbOybKlYTGkV0NJR56QHkK8qCdSD6hd99io8zCwiWSc2cYChtI/s1600/SensorCircuit16F1823.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="272" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMeW3h5uvy1fhxWzxxVkCLu1SgUk4kHpJytwdFU9iudwsj-DdhEuZBo047WCBxZTINGBil44NiZV3bitzzBWOgn_Wl7mbOybKlYTGkV0NJR56QHkK8qCdSD6hd99io8zCwiWSc2cYChtI/s400/SensorCircuit16F1823.png" width="400" /></a></div>
<br />
こちらは、「A, B, C, D, スライダ, 明るさ, 音」と記されたピンにアナログセンサを取り付けられます。「ボタン」と記されたピンにはタクトスイッチからの入力を取り付けることができます。なお、「明るさ」は大小の向きが他と異なること、「音」は大小の変化の仕方が他と異なることに注意してください。これはもともとのPicoBoardの仕様だと思います。<br />
<br />
さて、回路が組めたら、Scratchを起動します。<br />
<br />
今回組んだプログラムはこちらです。PICから送られるセンサ値は0~100の整数値となっていますので、その値が55~65の場合と30~55の場合とで、モーターの向きを逆にしています。それ以外の値が入力された場合はモーターを止めています。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPZdM_BtqaQeDCL6p7Tq5mrku4H0dpmVZTVJw9vUOXOv41DQUzDFPbFFLzs-Ig0cblB10cGiaTZC-GeanW4svvX_pqEINxn-N0pKoIeGJZ4INAqbDjN57Z8GmOJp08edvbhntUNwfEhNM/s1600/sensorscratch00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPZdM_BtqaQeDCL6p7Tq5mrku4H0dpmVZTVJw9vUOXOv41DQUzDFPbFFLzs-Ig0cblB10cGiaTZC-GeanW4svvX_pqEINxn-N0pKoIeGJZ4INAqbDjN57Z8GmOJp08edvbhntUNwfEhNM/s400/sensorscratch00.png" width="382" /></a></div>
<br />
なお、このプログラムを動作させるためには、あらかじめScratchでセンサを読み取れるようにしておかねばなりません。<br />
<br />
下図のように、センサの値を読み取るブロックで右クリックし、「ScratchBoard監視板を表示」を選択します。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlDCMJpW0s7CyQHXNt16Lx2AD8RJ9FuBdy_xc5ZL4LryCevbmylJT0PSnRzgg7cdrKjPLk3UBUMys4PmLh4vLmMU8N7Sga5i7Rp7KQ6Gc-4L8sxKDg2ChsFgOs7ONee-xn3XHAoP9Jnro/s1600/sensorscratch01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlDCMJpW0s7CyQHXNt16Lx2AD8RJ9FuBdy_xc5ZL4LryCevbmylJT0PSnRzgg7cdrKjPLk3UBUMys4PmLh4vLmMU8N7Sga5i7Rp7KQ6Gc-4L8sxKDg2ChsFgOs7ONee-xn3XHAoP9Jnro/s400/sensorscratch01.png" width="210" /></a></div>
<br />
すると、下図のようにスプライト表示部に「ScratchBoard監視板」が表示されます。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlO4YqhuhO16XR0l1nIG4sM6Zw7M0Otp_Q1DcBC_dMHO4YYRDoNyPZDXHIMqIhyphenhyphenY1P_L-ZjL_vF77jqpuTJySbrurceCjF2CP8UyAt3TuQbMDfDKjF5ddmprLGNuC2RWiLXJm_owZbfT0/s1600/sensorscratch02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlO4YqhuhO16XR0l1nIG4sM6Zw7M0Otp_Q1DcBC_dMHO4YYRDoNyPZDXHIMqIhyphenhyphenY1P_L-ZjL_vF77jqpuTJySbrurceCjF2CP8UyAt3TuQbMDfDKjF5ddmprLGNuC2RWiLXJm_owZbfT0/s1600/sensorscratch02.png" /></a></div>
<br />
この「切」の部分で右クリックし、「シリアルかUSBのポートを選択」を選択します。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrgm5VbeyJ8QBMvmt6QnSTxJqlr0VlARBjbtCWZtikz8nwGb4E4mXuEp-E80AVnV8GRVk7gcQC2jitnkOC_LwGgKF05GPLZR4ZveKfEYTC54wnosujyC0HEB5CFc6nLAKpakcjJCOPnxw/s1600/sensorscratch03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrgm5VbeyJ8QBMvmt6QnSTxJqlr0VlARBjbtCWZtikz8nwGb4E4mXuEp-E80AVnV8GRVk7gcQC2jitnkOC_LwGgKF05GPLZR4ZveKfEYTC54wnosujyC0HEB5CFc6nLAKpakcjJCOPnxw/s1600/sensorscratch03.png" /></a></div>
<br />
そこで、ピン番号8と10のGPIOに対応する/dev/ttyAMA0を選択します。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjm7fhM8vitfQ4B7Scx3XrApST8DDrh7wAqzsKcXFN5Fb7RfHfXr1XRhkUQqm6CTF6UlLruIQdsggBHXlp9coae2yUKcs3RAH8RAzOFLH1KaVI2m7xwZBN6ovl04Wed_wEENsLWu8Btt6A/s1600/sensorscratch04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjm7fhM8vitfQ4B7Scx3XrApST8DDrh7wAqzsKcXFN5Fb7RfHfXr1XRhkUQqm6CTF6UlLruIQdsggBHXlp9coae2yUKcs3RAH8RAzOFLH1KaVI2m7xwZBN6ovl04Wed_wEENsLWu8Btt6A/s1600/sensorscratch04.png" /></a></div>
<br />
すると、下図のようにセンサからの入力が表示されるようになります。PIC12F1822の場合、値が有効なのは「A、B、C」の三つのみです。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiI4TzBVFffXzIeS3tIYTEgqO6LgpCSMXDAWe0ubLSg57Rq5wcrAS8t-TdnI9xiLvTpJjbLiQWKzhwMIhlUGGWJ7Y8fsPE9dgSU_kXHFqTrGgopXtWQAhuBaVbm7c1qQGCpf7zK9_SDog8/s1600/sensorscratch05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiI4TzBVFffXzIeS3tIYTEgqO6LgpCSMXDAWe0ubLSg57Rq5wcrAS8t-TdnI9xiLvTpJjbLiQWKzhwMIhlUGGWJ7Y8fsPE9dgSU_kXHFqTrGgopXtWQAhuBaVbm7c1qQGCpf7zK9_SDog8/s1600/sensorscratch05.png" /></a></div>
<br />
この状態でキャタピラ式模型を動作させたのが冒頭の動画だったというわけです。<br />
<br />
<h3>
5. 終わりに</h3>
というわけで、Raspberry Pi上のScratchで下記の入出力が取り扱えることがわかりました。
<br />
<ul>
<li>デジタル(0/1)の入出力</li>
<li>ソフトウェアPWM出力</li>
<li>アナログ入力(0~100の整数値が読まれる)</li>
</ul>
ここまでできると、LEGOロボットのマインドストームのような教材として十分に使えそうですね。
<br />
<br />
実際にこの教材を用いて中学校で行なった講義の資料がこちらです。<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="430" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/key/oMW9XFtCbulDlc" style="border-width: 1px; border: 1px solid #ccc; margin-bottom: 5px; max-width: 100%;" width="500"> </iframe> <br />
<div style="margin-bottom: 5px;">
<a href="https://www.slideshare.net/neuralassembly/ss-66834848/" target="_blank" title="ラズベリー・パイでプログラミングと電子工作を体験してみよう">ラズベリー・パイでプログラミングと電子工作を体験してみよう</a>
</div>
<br />
こちらもどうぞ
<br />
<ul>
<li><a href="http://neuralassembly.blogspot.jp/2016/06/noobs-192raspbian-jessie-scratch.html" target="_blank">NOOBS 1.9.2でインストールしたRaspbian (jessie) 上のScratchで日本語入力を可能にしてみた</a></li>
<li><a href="http://neuralassembly.blogspot.jp/2016/06/raspberry-piscratchdc.html" target="_blank">Raspberry Pi上のScratchでDCモーターを制御してみた</a></li>
</ul>
<br />
<br />
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/gp/product/4065193397/" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7DRwdHUOfdPJtPAeH0UiIjW1Bi0s94ukn5JFN1x56glI-jjGVy9HyIB1FKHC6cWh15bKybLLYJqhtFmsAMMjyrb3ahHlVpvR_xT7lqEqlvubJ14XBUZQehLFTWTT71WykdZIDNUIr24g/s1600/cover3.png" /></a></div>
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/dp/4062579502/" style="clear: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_dmvycn6QM24eV1ZEoT6lg2TVi108iFt8BG6P1znEj0HtuWPBdYA2KxnD_uy1gw8CZI0UVilZ6noZJbqpagWZmQz5_9iScdkNo_ugvjoFInSMcArrkAYxuOFxoticmpPb1ZvSTJ8S_EM/s1600/raspi2_bb.jpg" /></a></div>
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/dp/4065020522/" style="clear: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="145" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOsxLVgVnFI0m-FUJlBK_CqKYJC8dNo3zjk8MOMX2xcJO4omTyOy-aAh3mmqGzXm5P3hGgpkUpaQy-7j7oqdIXyLE2_y686CI2Eda8EMYhME0INhU6irK9jw8b3iUhq7ojs2rrPZrnJtw/s1600/mlbb_title_mini.png" /></a></div>
<br clear="all" />
<div>
「ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作」、「実例で学ぶRaspberry Pi電子工作」、「Raspberry Piではじめる機械学習」を執筆しました。</div>
Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com0tag:blogger.com,1999:blog-1209616351336364066.post-25635269914283696882016-06-17T19:58:00.000+09:002020-06-16T18:32:24.758+09:00Raspberry Pi上のScratchでDCモーターを制御してみた<h3>
0. はじめに</h3>
前回のエントリ「<a href="http://neuralassembly.blogspot.jp/2016/06/noobs-192raspbian-jessie-scratch.html" target="_blank">NOOBS 1.9.2でインストールしたRaspbian (jessie) 上のScratchで日本語入力を可能にしてみた</a>」にて、Raspberry Pi上のScratchを使えるようになりましたので、本来の目的に戻り、ScratchでGPIOにアクセスしてみました。<br />
<br />
目標は、DCモーターを一つ搭載したタンク型模型をScratchから操作することです。タンク型模型は下図のようにタミヤの楽しい工作シリーズで作成しました。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9vQW01vitrGKt0KTjcyIUp-KIf0IVvbaD_QjiVg9d03OCMLsjiu0xVE9QEeoDaHbvUmX9pwpgZVpnuK7AUR1gka12vuJ9smImND1QoctnnwrN9PAkorliUV4fWahUvoSHVC_9x49S3V8/s1600/2016-06-17+17.25.23.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9vQW01vitrGKt0KTjcyIUp-KIf0IVvbaD_QjiVg9d03OCMLsjiu0xVE9QEeoDaHbvUmX9pwpgZVpnuK7AUR1gka12vuJ9smImND1QoctnnwrN9PAkorliUV4fWahUvoSHVC_9x49S3V8/s400/2016-06-17+17.25.23.jpg" width="400" /></a></div>
<br />
このタンク型模型をスプライトの動きに合わせて左右にコントロールしている様子を示した動画がこちらです。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="allowfullscreen" frameborder="0" height="290" src="https://www.youtube.com/embed/-AsHuHPPDoA?rel=0" width="420"></iframe>
</div>
<br />
<h3>
1. 回路とプログラム</h3>
まず、作成した回路はこちら。モータードライバTA7291Pを用いています。GPIO 25と24からソフトウェアPWM信号を出力する回路としています。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBFRGFSCLC4drFD840aqC0_iYnIDcIntBJ1dgybiRZT93QB8SQA46K97OTpK1P8B_EENk1xnIV1Zlz3CqSR_w-dab7CwVFdIiz4Lr1X5ACxxG0rV6Vw8cTCqEp0ixuru9qG5Oz2iVSkn8/s1600/MotorScratchCircuit.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="345" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBFRGFSCLC4drFD840aqC0_iYnIDcIntBJ1dgybiRZT93QB8SQA46K97OTpK1P8B_EENk1xnIV1Zlz3CqSR_w-dab7CwVFdIiz4Lr1X5ACxxG0rV6Vw8cTCqEp0ixuru9qG5Oz2iVSkn8/s400/MotorScratchCircuit.png" width="400" /></a></div>
<br />
<br />
そして、この回路に対して作成したプログラムは下図のようになります。<br />
<br />
スプライトの動き(「向き」)が反転するたびに、「向き」は-90と90との間を切り替わります。それに応じてモータードライバへの出力を切り替えるプログラムとなっています。<br />
<br />
プログラム動作中にスペースキーが押されると、モーターを止め、アプリケーションを終了しています。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBKfkLDEfdiE9OJ8BYZeihB1bsor980D69zuY2ScGRhToaSgGJnezhP5Po9dtJOrrA1q5tR8LC5GKbdbHaKZoX1bomOuonMcbo_kAuJH96NUqbvSkplRbrUUqVYN3xcBhO1LthFQ2HujU/s1600/MotorScratchProgram.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBKfkLDEfdiE9OJ8BYZeihB1bsor980D69zuY2ScGRhToaSgGJnezhP5Po9dtJOrrA1q5tR8LC5GKbdbHaKZoX1bomOuonMcbo_kAuJH96NUqbvSkplRbrUUqVYN3xcBhO1LthFQ2HujU/s400/MotorScratchProgram.png" width="338" /></a></div>
<br />
<h3>
2. ソフトウェアPWMについて</h3>
プログラム作成には、「<a href="https://www.amazon.co.jp/dp/4822297314/" target="_blank">Raspberry Piではじめる どきどきプログラミング</a>」および公式のドキュメント「<a href="https://www.raspberrypi.org/documentation/usage/scratch/gpio/README.md" target="_blank">SCRATCH GPIO</a>」を参考にしました。<br />
<br />
公式のドキュメントでは、PWMの指定法について「gpio + pin number + pwm + [ 0..1024 ] 」と書いてあったので、0~1024でデューティ比を指定するのかと最初は思いました。<br />
<br />
しかし、試してみるとどうも「0~256」程度の範囲がデューティ比0%~100%に対応しているようでした。上記のプログラムでは、デューティ比50%に相当する値128を用いています。<br />
<br />
さらに、そのソフトウェアPWM信号の周波数ですが、オシロスコープで波形を見たところ、800Hzでした。100Hz程度だろう、と思っていたので、思いのほか高い周波数で驚きました。<br />
<br />
また、下図では値128に対応するデューティ比が確かに50%程度になっていることも観察できます。<br />
<br />
(追記:しかし、これはこの時期のScratchのバグであり、バグが修正されたバージョンでは1024でデューティ100%、512でデューティ50%になっているはずです)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxsPshFdXSCtrGVCg6I7RA4fYsB8sUmZv8sMI8IzHpZ__hYpI6L0ttKOWV5uzfoMs0tD-nMnsGImuTX6uxSQUWbewE-OpjXh0_9raQ9CbYrKDn-wOuHMxLVO_bsiaIGlzx26YxA4bEufQ/s1600/scratchpwm.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxsPshFdXSCtrGVCg6I7RA4fYsB8sUmZv8sMI8IzHpZ__hYpI6L0ttKOWV5uzfoMs0tD-nMnsGImuTX6uxSQUWbewE-OpjXh0_9raQ9CbYrKDn-wOuHMxLVO_bsiaIGlzx26YxA4bEufQ/s1600/scratchpwm.png" /></a></div>
<br />
<h3>
3. 終わりに</h3>
そのようなわけで、ScratchでGPIOにアクセスしてDCモーターを制御することができました。<br />
<br />
これにより、タミヤの楽しい工作シリーズの様々な模型をScratchから操作できます。うまく使うと、小中学生のプログラミングの教材として面白いものができるのではないでしょうか?<br />
<br />
こちらもどうぞ
<br />
<ul>
<li><a href="http://neuralassembly.blogspot.jp/2016/06/noobs-192raspbian-jessie-scratch.html" target="_blank">NOOBS 1.9.2でインストールしたRaspbian (jessie) 上のScratchで日本語入力を可能にしてみた</a></li>
<li><a href="http://neuralassembly.blogspot.jp/2016/06/raspberry-piscratch.html" target="_blank">Raspberry Pi上のScratchでアナログ入力を利用してみた</a></li>
</ul>
<br />
<br />
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/gp/product/4065193397/" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7DRwdHUOfdPJtPAeH0UiIjW1Bi0s94ukn5JFN1x56glI-jjGVy9HyIB1FKHC6cWh15bKybLLYJqhtFmsAMMjyrb3ahHlVpvR_xT7lqEqlvubJ14XBUZQehLFTWTT71WykdZIDNUIr24g/s1600/cover3.png" /></a></div>
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/dp/4062579502/" style="clear: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_dmvycn6QM24eV1ZEoT6lg2TVi108iFt8BG6P1znEj0HtuWPBdYA2KxnD_uy1gw8CZI0UVilZ6noZJbqpagWZmQz5_9iScdkNo_ugvjoFInSMcArrkAYxuOFxoticmpPb1ZvSTJ8S_EM/s1600/raspi2_bb.jpg" /></a></div>
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/dp/4065020522/" style="clear: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="145" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOsxLVgVnFI0m-FUJlBK_CqKYJC8dNo3zjk8MOMX2xcJO4omTyOy-aAh3mmqGzXm5P3hGgpkUpaQy-7j7oqdIXyLE2_y686CI2Eda8EMYhME0INhU6irK9jw8b3iUhq7ojs2rrPZrnJtw/s1600/mlbb_title_mini.png" /></a></div>
<br clear="all" />
<div>
「ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作」、「実例で学ぶRaspberry Pi電子工作」、「Raspberry Piではじめる機械学習」を執筆しました。</div>
Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com0tag:blogger.com,1999:blog-1209616351336364066.post-10177202341700049552016-06-16T22:47:00.000+09:002020-06-16T18:32:41.146+09:00NOOBS 1.9.2でインストールしたRaspbian (jessie) 上のScratchで日本語入力を可能にしてみた<h3>
0. はじめに</h3>
Raspberry PiでGPIOにアクセスする場合、プログラミング言語としてPythonばかり使ってきたのですが、ふとScratchではどうなんだろう、と思い、調べてみることにしました。<br />
<br />
ところが、Scratchに触れること自体が初めてだったので、GPIOへアクセスする以前に、Scratchで日本語入力を実現する設定に手こずってしまいました。<br />
<br />
そこで、日本語入力を実現するために行った方法をまとめておきます。用いたのは、執筆時に最新であったNOOBS 1.9.2に含まれるjessie系列のRaspbian (2016-05-27)です。Raspberry Pi 2のみで試しました。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFojpBPBP1h1K74F95TQiSwSrJlsUZzsjbEfLFKlziYNhcfSNi74FYaDQUk4dGZ8QadETd2CKSfctxyl064nz-_d1X_CV3Lmgc1tQwfVqXi67qBFc4ReOVUGnERx5hlK_Gney1z54QWbc/s1600/scratch05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="311" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFojpBPBP1h1K74F95TQiSwSrJlsUZzsjbEfLFKlziYNhcfSNi74FYaDQUk4dGZ8QadETd2CKSfctxyl064nz-_d1X_CV3Lmgc1tQwfVqXi67qBFc4ReOVUGnERx5hlK_Gney1z54QWbc/s400/scratch05.png" width="400" /></a></div>
<br />
<h3>
1. Raspbianの日本語表示設定</h3>
Scratchの前に、まずはRaspbianで日本語を表示できるようにします。<br />
<br />
jessie系列のRaspbianには日本語フォントが含まれないので、日本語表示設定の前にまず日本語フォントをインストールする必要があります。ターミナルを起動し、下記のコマンドを実行しましょう。
<br />
<pre class="prettyprint">$ sudo apt-get update
$ sudo apt-get install fonts-vlgothic
</pre>
フォントのインストールが終わったら、デスクトップ左上のメニュー(Menu)から、「Preferences(設定)」→「Raspberry Pi Configuration(Raspberry Piの設定)」をマウスで選択してください。<br />
<br />
現れた設定用アプリケーションで「Localisation」→「Set Locale」を選択し、「Language」を「ja (Japanese)」に、「Country」を「JP (Japan)」に、「Character Set」を「UTF-8」に設定します。その後Raspberry Piを再起動すると、日本語表示されたデスクトップ環境が起動します。
<br />
<br />
その後、メニューから「プログラミング」→「Scratch」を選択すると、下図のようにメニューが日本語化されたScratchが起動します。<br />
<br />
しかし、よく見ると文字があまりなめらかではありませんね。そこで、Scratch用には別のフォントを設定することにします。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVp1JNNoG8Uq4iIhDsShp35VyEeTzLLLd9nsH4eTCu4RlfL02jnxc0nv3jjjC6bG_Wb9ju_ffrIGusjYfWgF0s7R2UR0fuw8sr5iNLH423tZXhFXtwuKGu7hF_SyX9_KWFy3NO0biF2e0/s1600/scratch01mod.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="256" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVp1JNNoG8Uq4iIhDsShp35VyEeTzLLLd9nsH4eTCu4RlfL02jnxc0nv3jjjC6bG_Wb9ju_ffrIGusjYfWgF0s7R2UR0fuw8sr5iNLH423tZXhFXtwuKGu7hF_SyX9_KWFy3NO0biF2e0/s400/scratch01mod.png" width="400" /></a></div>
<br />
<h3>
2. Scrachの日本語表示設定</h3>
Scrachでの日本語表示に適したフォントをインストールし、それを用いるよう設定します。本節の内容は「<a href="http://swikis.ddo.jp/WorldStethoscope/52" target="_blank">Raspberry PiでScratchを使う際の覚書</a>」を参考にしました。<br />
<br />
まず、ターミナルを起動し、下記のコマンドでフォントをインストールしましょう。
<br />
<pre class="prettyprint">$ sudo apt-get update
$ sudo apt-get install ttf-sazanami-gothic
</pre>
インストール後、「/usr/share/scratch/locale/ja.po」および「/usr/share/scratch/locale/ja_HIRA.po」という2つの設定ファイルをテキストエディタで編集し、上記のさざなみフォントを用いるよう設定します。
<br />
<br />
まず、下記のコマンドにより、管理者権限のテキストエディタで「/usr/share/scratch/locale/ja.po」を開きます。
<br />
<pre class="prettyprint">$ sudo leafpad /usr/share/scratch/locale/ja.po
</pre>
この中で、
<br />
<pre class="prettyprint">msgid "Linux-Font"
msgstr "Mona"
</pre>
という2行を見つけ、これを下記のように編集します。
<br />
<pre class="prettyprint">msgid "Linux-Font"
msgstr "Sazanami Gothic"
</pre>
編集が終わったら保存してテキストエディタを閉じます。<br />
<br />
同様に、下記のコマンドにより、「/usr/share/scratch/locale/ja_HIRA.po」をテキストエディタで開きます。
<br />
<pre class="prettyprint">$ sudo leafpad /usr/share/scratch/locale/ja_HIRA.po
</pre>
編集内容は「/usr/share/scratch/locale/ja.po」と全く同じです。編集したら保存してテキストエディタを閉じてください。<br />
<br />
その後、Scratchを起動しなおすと、下記のようにメニューなどがきれいなフォントで表示されます。
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCZiLjgkKReO0N-2u6DeLvRvFnNZbEvkvo_R-K0Mo9Z9Soq46OlzfWz0DllL3SU5rp8Xw12x4j0VZ-I0pnaylJUi8r98u-Uw47Jj03vNNgmBNFU9XsvmraX4LevJ-3Iksb3ELqclVZF6M/s1600/scratch02mod.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="255" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCZiLjgkKReO0N-2u6DeLvRvFnNZbEvkvo_R-K0Mo9Z9Soq46OlzfWz0DllL3SU5rp8Xw12x4j0VZ-I0pnaylJUi8r98u-Uw47Jj03vNNgmBNFU9XsvmraX4LevJ-3Iksb3ELqclVZF6M/s400/scratch02mod.png" width="400" /></a></div>
<br />
<h3>
3.日本語入力用アプリケーションのインストール</h3>
jessie系列のRaspbianでは、日本語入力アプリケーションとして、Googleが開発したMozcをインストールするのが良いでしょう。<br />
<br />
ターミナルを起動し、下記のコマンドでインストールします。
<br />
<pre class="prettyprint">$ sudo apt-get update
$ sudo apt-get install ibus-mozc
</pre>
インストールが終わったらRaspberry Piを再起動します。<br />
<br />
その後、下図のように「US」と書かれた部分をマウスでクリックし「日本語 - Mozc」を選択してください。あとは「半角/全角」キーで日本語入力のオンオフを切り替えられます。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMM0UXTDZqx7gKqr8XpTHhrZbMvXVD2hDjeFQPLxyG4vGD3J9Lw89md4F_WDtKXmv-KeXDAMU7cSH-P9AVBkPvrSgpNqEm9dTsl_S9XjJWIxA7gKwHwUTet_eEGVfiAXd0p56_YjPzRe4l/s1600/mozc-all.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="102" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMM0UXTDZqx7gKqr8XpTHhrZbMvXVD2hDjeFQPLxyG4vGD3J9Lw89md4F_WDtKXmv-KeXDAMU7cSH-P9AVBkPvrSgpNqEm9dTsl_S9XjJWIxA7gKwHwUTet_eEGVfiAXd0p56_YjPzRe4l/s400/mozc-all.png" width="400" /></a></div>
<br />
<h3>
4. Scrachに日本語入力を受け付けさせるための設定</h3>
次に、上で可能になった日本語入力をScrachに受け付けさせるための設定を行います。<br />
<br />
ターミナルを起動し、テキストエディタでScratchの起動スクリプトを編集します。
<br />
<pre class="prettyprint">$ sudo leafpad /usr/bin/scratch
</pre>
最後付近にある下記の行を見つけます。
<br />
<pre class="prettyprint">$WRAPPER "$VM" "$IMAGE" "$DOCUMENT" $IMOPTIONS
</pre>
ここに、下記のように「 -vm-display-x11 -compositioninput 」を追記します。
<br />
<pre class="prettyprint">$WRAPPER "$VM" <strong>-vm-display-x11 -compositioninput</strong> "$IMAGE" "$DOCUMENT" $IMOPTIONS
</pre>
追記したら保存してテキストエディタを閉じます。
<br />
<br />
その後Scratchを起動し、文字を入力できる部分で「半角/全角」キーを押すと、左下に変換候補が表示され、日本語入力が受け付けられそうなことがわかります。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLE5Sa1edEGv2iIqZVdvfWvBAWxpsOdncy4T2IuZ9k5SpcjevgRRW6GouMQvwjbc44s-2FCp4CksQabiyOeV1zwpPZi8nzLqWKzw7vLssH1H5BVUq2SMqbEXkYdzRSXAGRNvU3pMNMBlI/s1600/scratch03mod2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="311" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLE5Sa1edEGv2iIqZVdvfWvBAWxpsOdncy4T2IuZ9k5SpcjevgRRW6GouMQvwjbc44s-2FCp4CksQabiyOeV1zwpPZi8nzLqWKzw7vLssH1H5BVUq2SMqbEXkYdzRSXAGRNvU3pMNMBlI/s400/scratch03mod2.png" width="400" /></a></div>
<br />
ここで、確定した変換が文字化けすることなく入力部に表示されれば、設定は終了です(将来のRaspbianではそうなると思います)。<br />
<br />
しかし、NOOBS 1.9.2に含まれるRaspbianでは確定した文字列が下記のように文字化けしてしまいます。<br />
<br />
これを直す設定をさらに行っていきましょう。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDsFBLMvQjCdqvTcl2RGK5mLT26Khj79EX362Wok17_JUIeQEySAtZnFFv0KDf-hFSLtIxoA5viu-5RnRfy4Y58C2hOalOcqlFzCIoJy_fJH-PNB2WYJGdCJuw5xpRbOzWzKgQG-p5VkU/s1600/scratch04mod2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="85" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDsFBLMvQjCdqvTcl2RGK5mLT26Khj79EX362Wok17_JUIeQEySAtZnFFv0KDf-hFSLtIxoA5viu-5RnRfy4Y58C2hOalOcqlFzCIoJy_fJH-PNB2WYJGdCJuw5xpRbOzWzKgQG-p5VkU/s400/scratch04mod2.png" width="400" /></a></div>
<br />
<h3>
5. Squeakのvm-display-x11をビルドしなおす</h3>
最後の手順です。長いですが一つずつ実行していきましょう。なお、この節の内容は「<a href="http://www2.asu.ac.jp/hachi/v3/scratch14imePi.html" target="_blank">RaspbianのScratch1.4で日本語入力(QEMU上だけど)</a>」を参考にさせて頂きました。<br />
<br />
Squeakというアプリケーションを再ビルドし、vm-display-x11というプラグインを差し替える必要があります。まず、ターミナルを起動し、
ビルドに必要なパッケージをインストールします。
<br />
<pre class="prettyprint">$ sudo apt-get update
$ sudo apt-get install subversion cmake g++ xorg-dev uuid-dev libasound2-dev libssl-dev libgl1-mesa-dev
</pre>
その後、Squeakのソースをダウンロードし、ビルドします。
<br />
<pre class="prettyprint">$ svn co http://www.squeakvm.org/svn/squeak/branches/Cog
$ cd Cog/build.linux32ARM/squeak.cog.spur/build
$ ./mvm
</pre>
ここで「clean?」と聞かれますが「n」を入力してEnterします。<br />
<br />
Raspberry Pi 2で5分くらい待つと、ビルドが完了します。
後は、下記の要領でできたプラグインを差し替えます。
<br />
<pre class="prettyprint">$ sudo mv /usr/lib/squeak/5.0-3663/vm-display-X11 /usr/lib/squeak/5.0-3663/vm-display-X11.orig
$ sudo cp /home/pi/Cog/products/cogspurlinuxhtARM/lib/squeak/5.0-3744/vm-display-X11 /usr/lib/squeak/5.0-3663/
</pre>
その後、Scratchを起動すると、日本語を入力しても文字化けしなくなっているはずです。<br />
<br />
何が起こっているかというと、NOOBS 1.9.2に含まれるRaspbianのSqueakは、ダウンロードしたソースよりも若干バージョンが古いのですね。最新のソースでは文字化けを解消するコードが既に取り込まれているので、ビルドして差し替えるだけで文字化けが解消した、というわけです。
<br />
<br />
<h3>
6. 終わりに</h3>
<br />
以上でした。最近のScratchはデフォルトでGPIOにアクセスできたり、カメラモジュールが使えたりするらしいので(<a href="https://www.raspberrypi.org/blog/a-new-version-of-scratch-for-raspberry-pi-now-with-added-gpio/" target="_blank">参考</a>)、試してみたいと思います。<br />
<br />
こちらもどうぞ<br />
<br />
<ul>
<li><a href="http://neuralassembly.blogspot.jp/2016/06/raspberry-piscratchdc.html" target="_blank">Raspberry Pi上のScratchでDCモーターを制御してみた</a></li>
<li><a href="http://neuralassembly.blogspot.jp/2016/06/raspberry-piscratch.html" target="_blank">Raspberry Pi上のScratchでアナログ入力を利用してみた</a></li>
</ul>
<br />
<br />
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/gp/product/4065193397/" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7DRwdHUOfdPJtPAeH0UiIjW1Bi0s94ukn5JFN1x56glI-jjGVy9HyIB1FKHC6cWh15bKybLLYJqhtFmsAMMjyrb3ahHlVpvR_xT7lqEqlvubJ14XBUZQehLFTWTT71WykdZIDNUIr24g/s1600/cover3.png" /></a></div>
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/dp/4062579502/" style="clear: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_dmvycn6QM24eV1ZEoT6lg2TVi108iFt8BG6P1znEj0HtuWPBdYA2KxnD_uy1gw8CZI0UVilZ6noZJbqpagWZmQz5_9iScdkNo_ugvjoFInSMcArrkAYxuOFxoticmpPb1ZvSTJ8S_EM/s1600/raspi2_bb.jpg" /></a></div>
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/dp/4065020522/" style="clear: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="145" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOsxLVgVnFI0m-FUJlBK_CqKYJC8dNo3zjk8MOMX2xcJO4omTyOy-aAh3mmqGzXm5P3hGgpkUpaQy-7j7oqdIXyLE2_y686CI2Eda8EMYhME0INhU6irK9jw8b3iUhq7ojs2rrPZrnJtw/s1600/mlbb_title_mini.png" /></a></div>
<br clear="all" />
<div>
「ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作」、「実例で学ぶRaspberry Pi電子工作」、「Raspberry Piではじめる機械学習」を執筆しました。</div>
Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com0tag:blogger.com,1999:blog-1209616351336364066.post-15679822993604313862016-04-09T21:20:00.000+09:002017-03-13T17:33:38.415+09:00Windows 7からWindows 10にアップグレードしたらポータブルハードディスクが使えなくなった話遅ればせながらWindows 7をWindows 10にアップグレードしています。メイン機は怖いのでサブ機から少しずつ試しているのですが、あるとき、タイトル通り「Windows 10でポータブルハードディスクが使えない」という状況に遭遇しました。<br />
<br />
<a href="http://www.iodata.jp/product/hdd/portable/hdpa-ut/" target="_blank">IO-DATAのHDPA-UT1.0XK</a>というHDPA-UTシリーズのポータブルハードディスクなんですが、こちらの「<a href="http://www.iodata.jp/pio/os/win8/" target="_blank">Windows 8対応製品リスト</a>」を見るとしっかり「☓」がついてますね。<br />
<br />
実際にWindows 10に接続してアクセスすると、エクスプローラが固まってどうにもなりません。ファームウェアのアップデートも見当たらないですし、これはWindows 10対応のポータブルハードディスクを買い直し、Windows 7上でデータを退避するしかなさそう。<br />
<br />
調べたら、<a href="http://ognac-az.cocolog-nifty.com/blog/2013/05/hddwindows8-ae5.html" target="_blank">こちらの方</a>と全く同じ状況でした。<br />
<br />
しかし、OSのバージョンアップでハードディスクが読めなくなるなんて初めての体験で驚きました。FATではなくNTFSなのが影響してるんでしょうか。<br />
<br />
重要なデータが全てポータブルハードディスクにしまっている方がこの問題にハマったら、と考えると恐ろしいですね。Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com0tag:blogger.com,1999:blog-1209616351336364066.post-86530638006016307182016-04-09T20:51:00.000+09:002017-03-13T17:33:49.737+09:00Boot Camp上のWindows 7をWindows 10にアップグレードしてみた<h3>
はじめに</h3>
普段、Mac Book AirのBoot Camp上でWindows 7を使っているのですが、Windows 10の強制アップグレードが始まる、という話をちらほら耳にしたので、その前に試してみました。Mac Book Airモデルとしては2011年と2012年のモデルを1台ずつ行いました。<br />
<br />
その際、正しい手順をとらないとハマることがあることがわかったので、以下にメモします。<br />
<br />
<h3>
推奨する手順</h3>
<br />
先に、推奨する手順を記します。この手順なら恐らくトラブルは起こらないのではないでしょうか?<br />
<ul>
<li>まず、Windowsで動いているBoot Campヘルパーツールを最新にします。そのためには、下記の手順に従いました。
<ul>
<li>
Mac Book AirをOS Xで起動し、「アプリケーション→ユーティリティ→Boot Campアシスタント」を実行し、Boot Campヘルパーツールを更新するためのUSBメモリを作製します。
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMRMZmtDiQrzX6d_ZdeM8RJ3D9NpqIeSuXQIp291riOfLXvUHEiBTpplG3IPATc7Qn5tDk9i6KFTcDLOcJce3HZFYovjHsHReo2UZ0z_lmD8pByFHolE01isw2FT704tmBRw_TVah2EyA/s1600/OSXBootCamp.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="293" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMRMZmtDiQrzX6d_ZdeM8RJ3D9NpqIeSuXQIp291riOfLXvUHEiBTpplG3IPATc7Qn5tDk9i6KFTcDLOcJce3HZFYovjHsHReo2UZ0z_lmD8pByFHolE01isw2FT704tmBRw_TVah2EyA/s400/OSXBootCamp.png" width="400" /></a></div>
</li>
<li>
Windows 7に戻り、作製したUSBメモリのSetup.exeを実行し、Boot Campヘルパーツールを最新にします。Mac Book Airのバージョンによりますが、Boot Camp バージョン5.1かバージョン6.0になるのではないかと思います。なお、RealTekオーディオドライバのインストールがいつまでも終わらない場合、一旦セットアップを終了し、USBメモリ内のRealTekフォルダを削除してからもう一度セットアップする必要があります(これは検索すれば情報が多く見つかります)。<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiQVt2sqFo8HcuoHEui1Y2o7D_DovpOpAM1_YuxVPCdsZRpdxOQC8B6WRDQW2KfoSAG5_dGBZ2UQwdIlaN8OZVZg0I4JQDICN8wBR5mr-m9C3SKZiDmFCEt7C9ug61wm0ApokBpavIKug/s1600/bootcamp51.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiQVt2sqFo8HcuoHEui1Y2o7D_DovpOpAM1_YuxVPCdsZRpdxOQC8B6WRDQW2KfoSAG5_dGBZ2UQwdIlaN8OZVZg0I4JQDICN8wBR5mr-m9C3SKZiDmFCEt7C9ug61wm0ApokBpavIKug/s320/bootcamp51.png" width="320" /></a></div>
</li>
</ul>
</li>
<li>あとは通常の手順でWindows 7をWindows 10にアップグレードします。タスクバーにアップデート用のアイコンがある場合はそちらからでも良いですし、<a href="https://www.microsoft.com/ja-jp/windows/windows-10-upgrade" target="_blank">こちらのリンク</a>からでも構いません。</li>
<li>Windows 10へのアップグレードが終わったら、Bluetoothが機能しない状態になっていると思います。そこで、上で作製したUSBメモリのSetup.exeをもう一度実行すると、Boot Campの修復が行えるので、それで全てのデバイスが利用可能になります(先ほどと同様、USBメモリ内のRealTekフォルダの事前の削除が必要な場合があります)。</li>
</ul>
<br />
<div>
以上です。<br />
<br />
<h3>
Boot Camp 4.xの状態でWindows 10にアップグレードしてしまったら?</h3>
上で見たように、Boot Camp上のWindows 7をWindows 10にアップグレードする前にBoot Campヘルパーツールを最新にするのが重要です。<br />
<br />
それを行わず、Boot Camp 4.xのままWindows 10にアップグレードしてしまったら何が起こるか、そしてどう対処すべきかを以下に記します。<br />
<br />
Boot Camp 4.xのままWindows 10にアップグレードすると、アップグレード自体は問題なく終わるのですが、以下の様な状態になります。<br />
<ul>
<li>トラックパッドが効かない</li>
<li>キーボードに対するIMEの設定変更が保存されない</li>
<li>Bluetoothが効かない</li>
</ul>
そのため、Boot Campヘルパーツールを最新にしようとするのですが、上で作製したUSBメモリ上のSetup.exeを実行しても、エラーが出てすぐ終了してしまい、ドライバの更新などが行われません。<br />
<br />
また、旧バージョンのBoot Campをコントロールパネルのプログラムのアンインストールから削除しようとしても、「削除にはWindows 7が必要」と言われ、削除できません。<br />
<br />
この状態に結構困ったのですが、下記の手順で解決出来ました。<br />
<ul>
<li><a href="http://www.revouninstaller.com/revo_uninstaller_free_download.html" target="_blank">Revo Uninstaller</a>をインストールし、Boot Campに関するファイルとレジストリを全て削除する</li>
<li>最新のBoot Campヘルパーツールをインストールする</li>
</ul>
Revo Uninstallerは、私は30日間の体験版を使い使用後にアンインストールしたのですが、無料版でも多分大丈夫なのではないでしょうか。また、最新のBoot Campヘルパーツールのインストール時にエラーがいくつか出ましたが、インストールは最後まで進み、Boot Campヘルパーツールは最新のものがインストールされました。もちろん、それで全てのデバイスが利用可能になりました。<br />
<br />
おしまいです。</div>
Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com0tag:blogger.com,1999:blog-1209616351336364066.post-37599937161031859602016-02-09T22:51:00.001+09:002020-06-16T18:33:14.873+09:00JessieにアップデートされたPi-Top OSを試してみた<h3>
はじめに</h3>
(注)こちらのページは、2015年に発売されたpi-topの旧バージョンについての記事です。2017年に発売された新バージョンについての記事は<a href="https://neuralassembly.blogspot.com/2018/06/pi-top-v2stretchpi-topos.html" target="_blank">こちら</a>になります。<br />
<br />
Raspberry PiをノートPC化するPi-Topについては、これまで以下の3つのエントリで紹介してきました。
<br />
<ul>
<li><a href="http://neuralassembly.blogspot.com/2015/11/raspberry-pipcpi-top.html" target="_blank">Raspberry PiをノートPC化するPi-Topが届いた</a></li>
<li><a href="http://neuralassembly.blogspot.com/2015/11/raspberry-pipcpi-topli2c.html" target="_blank">Raspberry PiをノートPC化するPi-Topで電子工作(LチカとI2C通信)してみた</a></li>
<li><a href="http://neuralassembly.blogspot.jp/2015/11/raspberry-pipcpi-toppi.html" target="_blank">Raspberry PiをノートPC化するPi-Topにユーザーpiでログインしてみた</a></li>
</ul>
このPi-Topには、Raspbianにアプリケーションをいくつか追加したPi-Top OSというOSがバンドルされており、Pi-Top OSを用いることで<br />
<ul>
<li>バッテリーの残量を知ることができる、</li>
<li>ディスプレイの輝度やボリュームなどをキーボードで変更できる</li>
</ul>
<div>
という恩恵を得られます。しかしその半面、</div>
<div>
<ul>
<li>ログイン時にPi-Topの公式サイトで登録したIDをネットワーク越しに入力しなければならない</li>
</ul>
<div>
という欠点がありました。つまり、インターネットにアクセスできない環境ではログインすらできなかったわけです。</div>
<div>
<br /></div>
<div>
上記の3つめのエントリ「<a href="http://neuralassembly.blogspot.jp/2015/11/raspberry-pipcpi-toppi.html" target="_blank">Raspberry PiをノートPC化するPi-Topにユーザーpiでログインしてみた</a>」ではネットワークログインを無効化する方法を解説しており、個人的にはそこまで実行して初めてPi-Topを使う気になったのでした。</div>
</div>
<div>
<br /></div>
<div>
今回、Pi-Topチームから、Pi-Top OSのアップデートのお知らせが届きました。これまでWheezyベースだったのに対し、今回からJessieベースになったとのことで、早速試してみました。下の図は、インストール後、前回同様「Raspbian風に使う」設定を施した後の状態です。以下で解説していきます。</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9R43cgncTPztlqG_a3rhlszgEWwFR1aMBtPZJvCrTgZyocTwagKDTytwLopOosTGJG0r4ji93GxX-qSXmIvNiRpPEICVCa2R2RTHlkkj4g_E37pIyQDoe00fe9WsQ33B4K7s2qtaGh9o/s1600/2016-02-09-181558_1366x768_scrot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="223" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9R43cgncTPztlqG_a3rhlszgEWwFR1aMBtPZJvCrTgZyocTwagKDTytwLopOosTGJG0r4ji93GxX-qSXmIvNiRpPEICVCa2R2RTHlkkj4g_E37pIyQDoe00fe9WsQ33B4K7s2qtaGh9o/s400/2016-02-09-181558_1366x768_scrot.png" width="400" /></a></div>
<br />
<h3>
インストール</h3>
<div>
インストールは、これまでのOSのアップデートではなく、新しいmicroSDカードに新規にインストールする必要があります。8GBのmicroSDカードが必要ですが、運が悪いと16GBのものが必要かもしれません。</div>
<div>
<br /></div>
<div>
まず、Pi-Topチームからのメールに従うと、pi-topOS.zipという約2.5GBのファイルがダウンロードされます(リンクは貼らないでおきます)。</div>
<div>
<br /></div>
<div>
このzipファイルを解凍すると、8GBのpi-topOS-jessie.imgが現れます。すなわち、ディスクに2.5GB+8GBの空きがないとzipファイルの展開が行えませんので注意が必要です。このイメージは、8GBのmicroSDカードのイメージを吸い出しただけですね。</div>
<div>
<br /></div>
<div>
あとはこのイメージを新しいmicroSDカードに書き込みます。Windowsの場合、個人的には<a href="http://sourceforge.net/projects/win32diskimager/" target="_blank">Win32 Disk Imager</a>というアプリケーションを使っています。<a href="https://www.raspberrypi.org/documentation/installation/installing-images/windows.md" target="_blank">Raspberry Pi公式ページ</a>にWin32 Disk Imagerを用いたインストール法の解説があります。microSDカードを指すドライブの指定を間違うとPCの環境を破壊してしまうので注意しましょう。</div>
<div>
<br /></div>
<div>
8GBを書き込むのでそれなりに時間がかかります。この時、無事書き込みが完了すれば問題ないのですが、microSDカードの個体差が原因でサイズが足りずにエラーが出る場合があるかもしれません。そういった場合、16GBのmicroSDカードならば書き込みは成功するでしょう。<br />
<br /></div>
<h3>
起動、ログイン、そしてRaspbian風に使う設定</h3>
<h3>
(2017年2月リリースのpi-topOS Polarisの場合)</h3>
イメージ書き込みが完了したら、microSDカードをPi-TopのRaspberry Piにさし、電源を投入します。これまで通り、Pi-Top購入時と同様のスプラッシュスクリーン動画が見られます。 しかしこのリリースでは、起動時にpi-topサイトでのログインが求められません。これによりかなり使いやすくなっています。<br />
<br />
しかし、それなりの時間待たされるスプラッシュスクリーンは相変わらずありますし、起動されるパネルも個人的には不要なものです。これらを無効にしてみます。
まずLXTerminalを起動し、下記のコマンドを実行します。
<br />
<pre class="prettyprint">$ leafpad .config/lxsession/LXDE-pi/autostart
</pre>
.config/lxsession/LXDE-pi/autostartというファイルをテキストエディタで編集します(使うエディタはお好みで)。下記のような内容が見られるはずです。
<br />
<pre class="prettyprint">@pt-os-dashboard
@pt-display
@lxpanel --profile LXDE-pi
@pcmanfm --desktop --profile LXDE-pi
@xscreensaver -no-splash
@/opt/pt-hub-controller/restartXscreensaver
@screen-daemon
@point-rpi
@pt-speaker
</pre>
ここで、電源投入時に起動されるアプリケーションを起動しているのですが、いくつかを無効にしてみましょう。下記の通りに編集します。
<br />
<pre class="prettyprint">#@pt-os-dashboard
#@pt-display
@lxpanel --profile LXDE-pi
@pcmanfm --desktop --profile LXDE-pi
#@xscreensaver -no-splash
#@/opt/pt-hub-controller/restartXscreensaver
@xset s on s 60
@screen-daemon
@point-rpi
@pt-speaker
</pre>
1、2、5、6行目の先頭に半角で「#」を記述し、6行目の次の行に「@xset s on s 60」を記述しています。
これは「60秒で画面をブランクにする」というスクリーンセーバーの機能をしています。<br />
<br />
次に、スプラッシュスクリーン動画を無効にします。ターミナル上で下記のコマンドを実行しましょう。次回起動時よりスプラッシュスクリーン動画が無効となります。
<br />
<pre class="prettyprint">$ sudo systemctl disable pt-splashscreen.service
</pre>
<br />
pi-topOS のこのバージョンには日本語フォントが含まれますが、見栄えがあまり良くありませんので、ターミナルを起動して下記のようにフォントを追加すると良いでしょう。
インストール後は再起動するとフォントが変わります。
<br />
<pre class="prettyprint">$ sudo apt-get update
$ sudo apt-get install fonts-vlgothic
</pre>
<br />
あとは、
<br />
<ul>
<li>ホスト名:pi-top(avahiを使ってpi-top.localでアクセスできる)</li>
<li>ユーザー名:pi</li>
<li>デフォルトパスワード:pi-top</li>
<li>バッテリー残量を知るためのコマンド:pt-battery</li>
</ul>
であることを知っておくと良いでしょう。<br />
<br />
さらに、LXTerminalが最大化されて表示されるのを無効にしたり、デスクトップをRaspbian風にする設定は「<a href="http://neuralassembly.blogspot.jp/2015/11/raspberry-pipcpi-toppi.html" target="_blank">Raspberry PiをノートPC化するPi-Topにユーザーpiでログインしてみた</a>」を参考にしてください。
<br />
<br />
なお、このバージョンのpi-topOSのカーネルは「4.4.38-v7+」でした。2017/2/27にリリースされたNOOBS 2.2.0(4.4.48-v7+)より少し前のものですね。<br />
<br />
<h3>
起動、ログイン、そしてRaspbian風に使う設定</h3>
<h3>
(2016年2月リリースのものの場合)</h3>
<div>
ここから先は2016年2月リリースの古いバージョンの話です。
イメージ書き込みが完了したら、microSDカードをPi-TopのRaspberry Piにさし、電源を投入します。Pi-Top購入時と同様のスプラッシュスクリーン動画→ログイン画面が見られるはずです。</div>
<div>
<br /></div>
<div>
そのままPi-Top OSのデフォルト状態で使うならばこれで作業は終わりです。</div>
<div>
<br /></div>
<div>
個人的にはPi-Top OSを通常のRaspbianのように使いたかったので、以下のように作業しました。</div>
<div>
<br /></div>
<div>
まず、ログイン画面でネットワークに接続し、Pi-TopのIDで一回だけログインします。そして、LXTerminalを起動し、下記のコマンドを実行します。</div>
<pre class="prettyprint">$ sudo leafpad /etc/xdg/lxsession/LXDE-pi/autostart
</pre>
/etc/xdg/lxsession/LXDE-pi/autostartというファイルを管理者権限のテキストエディタで編集します(使うエディタはお好みで)。下記のような内容が見られるはずです。
<br />
<pre class="prettyprint">@lxpanel --profile LXDE-pi
@pcmanfm --desktop --profile LXDE-pi
@xscreensaver -no-splash
@omxplayer /opt/pt-splashscreen/splash.mp4
@sudo pt-hub-controller > /dev/null &
@pt-dashboard
</pre>
このうち、4行目と6行目の先頭に「#」を付加して無効化します。すなわち、下記の通りです。
<br />
<pre class="prettyprint">@lxpanel --profile LXDE-pi
@pcmanfm --desktop --profile LXDE-pi
@xscreensaver -no-splash
#@omxplayer /opt/pt-splashscreen/splash.mp4
@sudo pt-hub-controller > /dev/null &
#@pt-dashboard
</pre>
そして再起動すれば、ログインIDを求められることなく、デスクトップが開きます。通常のRaspbianと同様の挙動です。<br />
<br />
あとは「<a href="http://neuralassembly.blogspot.jp/2015/11/raspberry-pipcpi-toppi.html" target="_blank">Raspberry PiをノートPC化するPi-Topにユーザーpiでログインしてみた</a>」と同様にRaspbian風にする設定をしても良いでしょう。<br />
<div>
<br /></div>
なお、新しいPi-Top OSはJessieベースですので、新しい設定アプリケーション(Menu→Preferences→Raspberry Pi Configuration)が使えます。<br />
<br />
ただし、pi-topOSのこのバージョンには日本語フォントが含まれていませんので、そのまま日本語化するとメニュー等の文字が全て文字化けします。そのため、例えば下記のコマンドで日本語フォントをインストールしてから日本語化の設定を行うと良いでしょう。
<br />
<pre class="prettyprint">$ sudo apt-get update
$ sudo apt-get install fonts-vlgothic
</pre>
あともう一点、Wheezy版にはバッテリーの残量を知るためのコマンド「battery」があったのですが、Jessie版にはなくなっています。これはI2Cアクセスしてバッテリー残量を知るためのシェルスクリプトでした。移植は簡単で、Wheezy版の/usr/local/bin/batteryをコピーしてきてJessie版の同じ場所に配置すればそのまま使えます。
<br />
<br />
カーネルのバージョンは4.1.17-v7+でした。2月3日にリリースされた新しいRaspbianと同じですね。<br />
<br />
あと、JessieではChromiumブラウザがインストールできなくなったのですが、上の図にあるようにChromium 45.0.2454.85というバージョンがプリインストールされています。どうも「<a href="https://www.raspberrypi.org/forums/viewtopic.php?t=121195" target="_blank">Guide: Chromium 45 on Raspbian Jessie</a>」というページで紹介されている方法でインストールしたもののようですね。<br />
<br />
<h3>
終わりに</h3>
<div>
Pi-Top OS自体は、あまり高く評価できるものではないと個人的には思ってますが、腐れ縁という感じで使い続けています。</div>
<br />
<h3>
こちらもどうぞ</h3>
<ul>
<li><a href="http://neuralassembly.blogspot.com/2015/11/raspberry-pipcpi-top.html" target="_blank">Raspberry PiをノートPC化するPi-Topが届いた</a></li>
<li><a href="http://neuralassembly.blogspot.com/2015/11/raspberry-pipcpi-topli2c.html" target="_blank">Raspberry PiをノートPC化するPi-Topで電子工作(LチカとI2C通信)してみた</a></li>
<li><a href="http://neuralassembly.blogspot.com/2016/02/jessiepi-top-os.html" target="_blank">JessieにアップデートされたPi-Top OSを試してみた</a></li>
<li><a href="https://neuralassembly.blogspot.com/2018/06/pi-top-v2stretchpi-topos.html" target="_blank">pi-top v2を購入してStretch系列のpi-topOSで使ってみた</a></li>
</ul>
<br />
<br />
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/gp/product/4065193397/" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7DRwdHUOfdPJtPAeH0UiIjW1Bi0s94ukn5JFN1x56glI-jjGVy9HyIB1FKHC6cWh15bKybLLYJqhtFmsAMMjyrb3ahHlVpvR_xT7lqEqlvubJ14XBUZQehLFTWTT71WykdZIDNUIr24g/s1600/cover3.png" /></a></div>
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/dp/4062579502/" style="clear: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_dmvycn6QM24eV1ZEoT6lg2TVi108iFt8BG6P1znEj0HtuWPBdYA2KxnD_uy1gw8CZI0UVilZ6noZJbqpagWZmQz5_9iScdkNo_ugvjoFInSMcArrkAYxuOFxoticmpPb1ZvSTJ8S_EM/s1600/raspi2_bb.jpg" /></a></div>
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/dp/4065020522/" style="clear: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="145" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOsxLVgVnFI0m-FUJlBK_CqKYJC8dNo3zjk8MOMX2xcJO4omTyOy-aAh3mmqGzXm5P3hGgpkUpaQy-7j7oqdIXyLE2_y686CI2Eda8EMYhME0INhU6irK9jw8b3iUhq7ojs2rrPZrnJtw/s1600/mlbb_title_mini.png" /></a></div>
<br clear="all" />
<div>
「ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作」、「実例で学ぶRaspberry Pi電子工作」、「Raspberry Piではじめる機械学習」を執筆しました。</div>
Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com0tag:blogger.com,1999:blog-1209616351336364066.post-10027463984846042622015-12-18T19:46:00.001+09:002022-07-04T17:24:06.720+09:00SHARPのIGZO液晶用のスタンドをタミヤの楽しい工作キットで作り、Raspberry Piで使ってみた<h3>
はじめに</h3>
秋月電子通商を始めとする様々なショップでSHARPのIGZO液晶の取り扱いが開始されました(2018年4月時点ではどの店でも売り切れですが、本ページ末尾で類似商品を紹介します)。<br />
<ul>
<li><a href="http://akizukidenshi.com/catalog/g/gM-10016/" target="_blank">SHARP 7インチ高精細IGZO-LCDパネル 接続モジュールセット(秋月電子通商)</a></li>
<li><a href="https://raspberry-pi.ksyic.com/main/index/pdp.id/112" target="_blank">SHARP 7" 高精細 IGZO LCD 接続キット for Pi(Raspberry Pi Shop by KSY)</a></li>
<li><a href="https://www.switch-science.com/catalog/2565/" target="_blank">Raspberry Pi用 7インチ IGZO LCDパネル 接続モジュールキット(SWITCH SCIENCE)</a></li>
<li><a href="http://eleshop.jp/shop/g/gFCI311/" target="_blank">シャープ 7インチ高細密 IGZO LCD接続キット(共立エレショップ)</a></li>
</ul>
実は2015年8月のMaker Faire Tokyoで参考出展されていたようなのですが、私は今回初めて知りましたので、早速購入して試してみました。<br />
<br />
あまり深く考えずに購入したのですが、なかなか骨のある商品でした。<br />
<br />
タミヤの楽しい工作シリーズでスタンドを作成して表示している様子がこちら。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJmoHn9doAL9vX5yzWr0TjIAyj55Z3_GE0KjsY27n8vaD7H_JobRmvw8BJnMp1YsBbQ710Xn7dEdW9MBotl7EFaaKdbf2ny_RYCEVntYchAfCYF7HCOKB8uQGQcryyR_-12DUtx15uwNE/s1600/2015-12-18+12.31.43.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJmoHn9doAL9vX5yzWr0TjIAyj55Z3_GE0KjsY27n8vaD7H_JobRmvw8BJnMp1YsBbQ710Xn7dEdW9MBotl7EFaaKdbf2ny_RYCEVntYchAfCYF7HCOKB8uQGQcryyR_-12DUtx15uwNE/s400/2015-12-18+12.31.43.jpg" width="400" /></a></div>
<br />
<h3>
組み立てから電源投入まで</h3>
組み立ては詳細な説明書がついてくるので、流れ自体は難しくありません。<br />
<br />
ただし、フレキシブルケーブルを基板に取り付けるの作業がかなり繊細なので、慎重に行なう必要があります。また、このフレキシブルケーブルは非常に断線しやすい(後述)ので、注意する必要があります。<br />
<br />
Raspberry Piで用いる場合、/boot/config.txtにLCDの解像度に関する設定を追加する必要があります。/boot/config.txtの冒頭に、下記を追加します。<a href="https://raspberry-pi.ksyic.com/page/list" target="_blank">KSYさんのページ</a>を参考にしました。<br />
<pre class="prettyprint"># SHARP 7" Settings: (KSY)
hdmi_pixel_freq_limit=200000000
hdmi_timings=1200 0 164 8 32 1920 0 12 2 6 0 0 0 60 0 163430000 0
hdmi_drive=2
disable_overscan=1
max_framebuffer_width=1200
max_framebuffer_height=1920
# Landscape (display_rotate=1 for upside down)
display_rotate=3
framebuffer_width=1920
framebuffer_height=1200
# Test
hdmi_group=2
hdmi_mode=87
hdmi_force_hotplug=1
</pre>
なお、上記の秋月電子通商の商品ページで公開されているconfig.txtでは、2016-02-03以降のRaspbianで横向き表示ができないので注意しましょう。上記の設定の「hdmi_mode=87」が必要なようです。<a href="https://www.raspberrypi.org/documentation/configuration/config-txt.md" target="_blank">こちらの解説</a>によると、カスタムモードを作るための設定のようですね。<br />
また、上記設定にある「display_rotate=3」は、HDMI端子やUSB端子がディプレイの上側にある場合の設定です。これらの端子をディスプレイの下側に配置したい場合、「display_rotate=1」としてください。<br />
<br />
なお、2015年12月頃のRaspbianでは「NOOBSでインストールしたRaspbian」で映像が表示されず、イメージ書き込みである必要がある」ようでしたが、2016年5月現在、上記の設定を用いればNOOBSでインストールしたRaspbianでも表示可能でした。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimzTPE5MIzbW0X-sY7k1VTggv6RxugYPnNczbFBRsgZWBWV-Rk2QrHj7kMy9SzL9HnG9e3X1rZIRq55hf7vHRcEy5S5ic8KztAv_j6-hOctGtJNFicCExofuINrlDtUkbYRUN6GKHsFMo/s1600/2015-12-18+10.51.45-1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimzTPE5MIzbW0X-sY7k1VTggv6RxugYPnNczbFBRsgZWBWV-Rk2QrHj7kMy9SzL9HnG9e3X1rZIRq55hf7vHRcEy5S5ic8KztAv_j6-hOctGtJNFicCExofuINrlDtUkbYRUN6GKHsFMo/s400/2015-12-18+10.51.45-1.jpg" width="400" /></a></div>
<br />
2015年12月当時、NOOBSでは画面が映らないと気づくまでの数日間、「組み立て時に破損してしまったのではないか?」と思い、二個目の液晶を購入してしまいましたが、その心配は不要でした(少なくともこの時点では)。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYMjcu4C3p2gNVqf9PTBc_mx0aKzyfV2C_ZJ4-fddohd8phVgwjf2K8E0cRPHZ3beGz_e6hMKi9L_4QEKSwjku76wr92bhsubdsU4FM52fnqs2Zvj3fS1BXe6bgB-zGGRensrtTVE7E0g/s1600/2015-12-18+11.04.43-1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYMjcu4C3p2gNVqf9PTBc_mx0aKzyfV2C_ZJ4-fddohd8phVgwjf2K8E0cRPHZ3beGz_e6hMKi9L_4QEKSwjku76wr92bhsubdsU4FM52fnqs2Zvj3fS1BXe6bgB-zGGRensrtTVE7E0g/s400/2015-12-18+11.04.43-1.jpg" width="400" /></a></div>
<br />
<h3>
スタンドの作成</h3>
このままでは液晶を机にベタ置きで使う羽目になるので、スタンドを作成する必要があります。<br />
<br />
既に、フォトフレームを流用する方法を紹介されている方や、きれいなスタンドを自作している方がいらっしゃるのですが、私はタミヤの楽しい工作シリーズのキットが手元で余っているので、これを使うことにしました。<br />
<br />
それが冒頭の写真です。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJmoHn9doAL9vX5yzWr0TjIAyj55Z3_GE0KjsY27n8vaD7H_JobRmvw8BJnMp1YsBbQ710Xn7dEdW9MBotl7EFaaKdbf2ny_RYCEVntYchAfCYF7HCOKB8uQGQcryyR_-12DUtx15uwNE/s1600/2015-12-18+12.31.43.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJmoHn9doAL9vX5yzWr0TjIAyj55Z3_GE0KjsY27n8vaD7H_JobRmvw8BJnMp1YsBbQ710Xn7dEdW9MBotl7EFaaKdbf2ny_RYCEVntYchAfCYF7HCOKB8uQGQcryyR_-12DUtx15uwNE/s400/2015-12-18+12.31.43.jpg" width="400" /></a></div>
<br />
どのようなパーツを使っているのかを解説すると、まず、前面側は下図のようになっており、<br />
<br />
<ul>
<li>ユニバーサルプレートL</li>
<li>ユニバーサルアームセットのアームを2本</li>
<li>ユニバーサルアームセットのパイプ材(小)をスペーサーとして6個(ニッパなどで多少細らせる必要がある)</li>
<li>3mmのビスとナットを6組</li>
</ul>
<br />
が使われています。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJbtQ2ET9qw_INNHwtNuxj7Qf8rWa9ydjYo-EsHoqa4W-e71luZ3ceCe3DM2p5n9EcJArBO83cnmnYWNaEqmpZsr58cn3gqhIIwggkmhdVcOy4nvSD6Z9ZZA_uF_-Yt3geeeZt2RJRPRY/s1600/2015-12-18+14.02.54.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJbtQ2ET9qw_INNHwtNuxj7Qf8rWa9ydjYo-EsHoqa4W-e71luZ3ceCe3DM2p5n9EcJArBO83cnmnYWNaEqmpZsr58cn3gqhIIwggkmhdVcOy4nvSD6Z9ZZA_uF_-Yt3geeeZt2RJRPRY/s400/2015-12-18+14.02.54.jpg" width="400" /></a></div>
<br />
背面側は下図のようになっており、<br />
<ul>
<li>ユニバーサルアームセットのL型アーム2個</li>
<li>ユニバーサルアームを長さ10でカットしたものを2つ</li>
<li>3mmプッシュリベットを1つ(オレンジ色の部分)</li>
<li>3mmのビスとナットを適宜</li>
</ul>
が使われています。<br />
<br />
ユニバーサルプレートの穴と基板の穴の間隔が合わないため、ユニバーサルプレートへの固定は一箇所だけプッシュリベットを取りつけ、さらにタミヤのマスキングテープを貼って仮止めしています(これについては後述)。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjszcg500pe6pujPCoSDZw3qwuUUL6spJ0pb7VreQkH_8SaP5MtobuCP6eMXozNdaCsyc0e_MTEOguZnrnmXUM22xt5axrFlqPF2N_HrHgehdtNxvIU-xjGeXIRGdhQUQI1aY_24zO5QNs/s1600/2015-12-18+14.03.22.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjszcg500pe6pujPCoSDZw3qwuUUL6spJ0pb7VreQkH_8SaP5MtobuCP6eMXozNdaCsyc0e_MTEOguZnrnmXUM22xt5axrFlqPF2N_HrHgehdtNxvIU-xjGeXIRGdhQUQI1aY_24zO5QNs/s400/2015-12-18+14.03.22.jpg" width="400" /></a></div>
<br />
ひとまずはこれで使えるようになりました。このIGZO液晶(1920x1200)(左)と公式タッチパネル(800x480)(右)を比較したのが下図です。<br />
<br />
IGZO液晶の方が解像度が高いのですが、プログラムを書くなどのように文字を読み書きするためには、フォントを大きくするなどの設定が必須でしょう。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj74aEP-tkoq5dMUzYMR6TzefSChY-gsDbyshFAwvEnoADSyj8yYATDjIBbGXR3DfHaVzVo2YKY4G0Q2sKfL75ikf_qofwWtABlqPrcJdKbjYsc0CYfIDnRSeBdJI15xA7Iw8gQgLyNH7Y/s1600/2015-12-18+13.19.40.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj74aEP-tkoq5dMUzYMR6TzefSChY-gsDbyshFAwvEnoADSyj8yYATDjIBbGXR3DfHaVzVo2YKY4G0Q2sKfL75ikf_qofwWtABlqPrcJdKbjYsc0CYfIDnRSeBdJI15xA7Iw8gQgLyNH7Y/s400/2015-12-18+13.19.40.jpg" width="400" /></a></div>
<br />
<h3>
オチ</h3>
そのようなわけで、IGZO液晶をRaspberry Piで使えるようになってめでたい、で締めようと思っていました。<br />
<br />
しかし、ブログにまとめるにあたって、基板とユニバーサルプレートをマスキングテープで仮止めたままではカッコ悪いかなあと思い、うまい固定方法を考えることにしました。<br />
<br />
そのためにいろいろと試行錯誤している際、ビリッ、という異音がし、フレキシブルケーブルが下図のように断線してしまいました。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjV2Mno1nGtsT5UdjfNASWzHYWxqT_GBq3NI18QfqMaXLTPhQrGHyh_jS4PDan-ZqwpUrtPACKVcc0Nb6Thu9w2Ws3etFgQPtlo_FYtvU2ce5GYuQ8LLBlOzQOguEOQFjtPtqTR5CcVrjY/s1600/2015-12-18+18.00.40-1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjV2Mno1nGtsT5UdjfNASWzHYWxqT_GBq3NI18QfqMaXLTPhQrGHyh_jS4PDan-ZqwpUrtPACKVcc0Nb6Thu9w2Ws3etFgQPtlo_FYtvU2ce5GYuQ8LLBlOzQOguEOQFjtPtqTR5CcVrjY/s400/2015-12-18+18.00.40-1.jpg" width="400" /></a></div>
<br />
上述のようにIGZO液晶を2個購入していたので、2個目を使って復活させることはできましたが、断線に気づいたときはかなり落ち込みました。<br />
<br />
そんなわけで、私のIGZO液晶の基板はマスキングテープでユニバーサルプレートに仮止めされたままです。<br />
<br />
使いやすかったら常用しようかな、と考えていたのですが、また壊すと落ち込みそうなので、棚にしまっておくことにしました。<br />
<br />
<h3>
オチ2</h3>
そんなわけで棚で眠っていたIGZO液晶なのですが、<a href="https://shop.emergeplus.jp/igzo/" target="_blank">emerge+さんの「IGZOパネルエンクロージャ」</a>というアクリルケースを購入してうまれかわりました。これ、すごく良いですよ。お勧めです。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmACT3tpxoa2Ww1GMoPaqAXAhDD4amctxY9pkspnoLcAh03k5-_IdXKbDS_HmKdratZYxlnQosFCcKBTLXtt75HeKbO-TNX8iCoNxIDGPEjhmqdC12NwQOAw1INWxy9wp24voCDopAz20/s1600/2016-02-02+14.17.13.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmACT3tpxoa2Ww1GMoPaqAXAhDD4amctxY9pkspnoLcAh03k5-_IdXKbDS_HmKdratZYxlnQosFCcKBTLXtt75HeKbO-TNX8iCoNxIDGPEjhmqdC12NwQOAw1INWxy9wp24voCDopAz20/s400/2016-02-02+14.17.13.jpg" width="400" /></a></div>
<br />
<h3>
オチ3</h3>
そんなわけで、emerge+さんのエンクロージャで満足度の上がったIGZO液晶ですが、IGZO液晶の1920x1200という解像度では、文字が小さすぎて読むことが難しく、実用には難があるというのが正直なところでした。<br />
<br />
2018年4月時点で最新のRaspbianを用いると、GUIの設定アプリケーションに「Pixel Doubling」という、解像度を半分にするための設定が追加されています。Retinaディスプレイのように高解像度のディスプレイを用いるための設定のようです。<br />
これを有効にすると、下図のようにIGZO液晶が960x600という実用的な(文字が読める)解像度で使えるようになります。<br />
<br />
なお、2022年7月現在、Raspberry Pi OS Bullseye には、この Pixel Doubling の設定はないようです。代わりに、デスクトップ上で右クリックし、「デスクトップの設定」→「デフォルト」タブ→「大きな画面向け」の設定、を行うと似た効果を得ることができます。
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjG5KrUHp3_BUNFmnyMVwQy608fi8urhzhz1zO2mCWfVnkt_4E5G7aU7XpbjznUNydExH_MdCoGuihjkPjRK01aV5ePKIrQ-W-bfirbN82j_piIgsKg-Oek77RXhVFxFnq0XhyAuwQZftE/s1600/2018-04-26+11.28.53.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjG5KrUHp3_BUNFmnyMVwQy608fi8urhzhz1zO2mCWfVnkt_4E5G7aU7XpbjznUNydExH_MdCoGuihjkPjRK01aV5ePKIrQ-W-bfirbN82j_piIgsKg-Oek77RXhVFxFnq0XhyAuwQZftE/s400/2018-04-26+11.28.53.jpg" width="400" /></a></div>
<br />
<h3>
オチ4</h3>
「オチ2」と「オチ3」でemerge+さんのIGZOパネルエンクロージャをお勧めしましたが、IGZO液晶同様、こちらも2018年4月の時点では入手不可能ですね。<br />
<br />
代替として、下記の組み合わせをお勧めしておきます。
<br />
<ul>
<li><a href="http://akizukidenshi.com/catalog/g/gM-11967/" target="_blank">SHARP 5.5インチ高精細CGシリコン液晶パネルセット 1080×1920ドット ラズパイ用(秋月電子通商)</a></li>
<li><a href="https://shop.emergeplus.jp/cgsi-enclosure/" target="_blank">5.5インチCGシリコン液晶パネルエンクロージャ (emerge+)</a></li>
</ul>
こちらは、本ページで紹介したIGZO液晶よりも一回り小さいのですが、emerge+さんのエンクロージャが美しいので満足度が高いです。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigaHF6ud3zEXb0fyA3SQVQEJCGEdLfE5jOjyMe0g2CoIyTK1kGEkOrj38xtlttbp2cU4_46VWOtgfCCfnwuo1U1SSCLZNumyGkE2xYbbPlp8JNO1Di7SXqHqt-8OoGjmFJmeuH-v9HTgw/s1600/2018-11-14+15.33.01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigaHF6ud3zEXb0fyA3SQVQEJCGEdLfE5jOjyMe0g2CoIyTK1kGEkOrj38xtlttbp2cU4_46VWOtgfCCfnwuo1U1SSCLZNumyGkE2xYbbPlp8JNO1Di7SXqHqt-8OoGjmFJmeuH-v9HTgw/s400/2018-11-14+15.33.01.jpg" width="400" /></a></div>
<br />
なお、上記の写真で用いている短いHDMIケーブルは<a href="https://store.shopping.yahoo.co.jp/west-two/zacqzgmjps.html" target="_blank">こちら</a>です。<br />
<br />
また、電源は下記の組み合わせのもの用いており、これによりACアダプターが一個で済むので良い感じです。
<br />
<ul>
<li><a href="http://akizukidenshi.com/catalog/g/gM-10507/" target="_blank">スイッチングACアダプター (USB ACアダプター) Type-Aメス 5V2.5A (秋月電子)</a></li>
<li><a href="https://www.amazon.co.jp/gp/product/B0722NG2MR/" target="_blank">UGREEN Micro USB二股ケーブル</a></li>
</ul>
こちらの液晶の場合、config.txtの末尾に追加する設定は下記のようになります。
<br />
<pre class="prettyprint"># SHARP 5.5" Settings
hdmi_pixel_freq_limit=400000000
hdmi_timings=1080 0 60 10 35 1920 0 4 4 2 0 0 0 50 0 114352500 0
hdmi_drive=2
disable_overscan=1
max_framebuffer_width=1080
max_framebuffer_height=1920
# Landscape
display_rotate=1
framebuffer_width=1920
framebuffer_height=1080
hdmi_group=2
hdmi_mode=87
dmi_force_hotplug=1
</pre>
なお、2022年7月現在、Raspberry Pi OS Bullseye では上の設定では画面が縦向きになります。設定中の「# Landscape」の項目が機能していない、ということでしょう。その場合、画面左上のメニューから「設定」→「Screen Configuration」→「Configure」→「Screens」→「HDMI-1」→「向き」を「right」または「left」に設定すると画面が横向きになるでしょう。
<br /><br />
<br />
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/gp/product/4065193397/" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7DRwdHUOfdPJtPAeH0UiIjW1Bi0s94ukn5JFN1x56glI-jjGVy9HyIB1FKHC6cWh15bKybLLYJqhtFmsAMMjyrb3ahHlVpvR_xT7lqEqlvubJ14XBUZQehLFTWTT71WykdZIDNUIr24g/s1600/cover3.png" /></a></div>
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/dp/4062579502/" style="clear: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_dmvycn6QM24eV1ZEoT6lg2TVi108iFt8BG6P1znEj0HtuWPBdYA2KxnD_uy1gw8CZI0UVilZ6noZJbqpagWZmQz5_9iScdkNo_ugvjoFInSMcArrkAYxuOFxoticmpPb1ZvSTJ8S_EM/s1600/raspi2_bb.jpg" /></a></div>
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/dp/4065020522/" style="clear: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="145" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOsxLVgVnFI0m-FUJlBK_CqKYJC8dNo3zjk8MOMX2xcJO4omTyOy-aAh3mmqGzXm5P3hGgpkUpaQy-7j7oqdIXyLE2_y686CI2Eda8EMYhME0INhU6irK9jw8b3iUhq7ojs2rrPZrnJtw/s1600/mlbb_title_mini.png" /></a></div>
<br clear="all" />
<div>
「ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作」、「実例で学ぶRaspberry Pi電子工作」、「Raspberry Piではじめる機械学習」を執筆しました。</div>
Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com0tag:blogger.com,1999:blog-1209616351336364066.post-12523609519055159982015-11-30T20:34:00.000+09:002020-06-16T18:33:52.041+09:00Raspberry PiをノートPC化するPi-Topにユーザーpiでログインしてみた<h3>
はじめに</h3>
(注)こちらのページは、2015年に発売されたpi-topの旧バージョンについての記事です。2017年に発売された新バージョンについての記事は<a href="https://neuralassembly.blogspot.com/2018/06/pi-top-v2stretchpi-topos.html" target="_blank">こちら</a>になります。<br />
<br />
「<a href="http://neuralassembly.blogspot.com/2015/11/raspberry-pipcpi-top.html" target="_blank">Raspberry PiをノートPC化するPi-Topが届いた</a>」にて、Pi-Topに触って見ましたが、Pi-Top OSと呼ばれるOSを用いており、ログイン時にPi-Topサイトのアカウントでログインしなければならないことが不満でした。その主な理由は下記の通りです。<br />
<ul>
<li>ログインした後は普通のユーザーpiなので、Pi-Topアカウントでログインする必然性がないこと(CEED universeというものと連携させたいのでしょうが)</li>
<li>ログイン時にインターネットに接続していなければならないこと</li>
<li>ログイン時に相手側サーバーがダウンしていたらログインできないこと</li>
<li>インターネット接続にProxy接続は許されないこと</li>
</ul>
そのようなわけで、通常のRaspbianのようにユーザーpiでログインできるようにしてみます。さらに、このPi-Top OSを通常のRaspbianに近い外観で使用できるようにもしてみましょう。<br />
<br />
グラフィカルログイン方式、およびコンソールにログインしてstartxコマンドでXを起動する方式の両方でできました。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMItO8Q09ZzgNlQFPqc5QAkUfkPIusmQdfs6i6eygWPypvGjsmYBH84JZ_EAOSNpnMPAYaye1EIJvuHK4DWCXI1c3KLAMrXkELyO9TfiaHm-bItziMSBFFuhvfIO3OnpFIGn2rjvJvwWg/s1600/2015-11-30+20.16.07.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMItO8Q09ZzgNlQFPqc5QAkUfkPIusmQdfs6i6eygWPypvGjsmYBH84JZ_EAOSNpnMPAYaye1EIJvuHK4DWCXI1c3KLAMrXkELyO9TfiaHm-bItziMSBFFuhvfIO3OnpFIGn2rjvJvwWg/s400/2015-11-30+20.16.07.jpg" width="400" /></a></div>
<br />
<h3>
手順</h3>
LXterminalを起動し、.xinitrcを無効にします。<br />
<pre class="prettyprint">$ mv .xinitrc .xinitrc.bak
</pre>
さらに、X起動時に自動でdashboardというアプリケーションが起動してしまうのを以下で抑制します。
<br />
<pre class="prettyprint">$ mv .config/lxsession/LXDE-pi/autostart .config/lxsession/LXDE-pi/autostart.bak
</pre>
最後に、下記のコマンドでスプラッシュスクリーンを無効にしましょう。後で解説しますが、これは45秒間の動画を流しているだけです。
<br />
<pre class="prettyprint">$ sudo mv /etc/rcS.d/S01nasplashscreen /etc/rcS.d/K01nasplashscreen
</pre>
あとは再起動すれば、ユーザーpiのデスクトップで起動すると思います。
<br />
<br />
バッテリー残量表示のアイコンがありませんが、以下のコマンドで残量が表示できるのでそれほど問題にはならないかなと思います。
<br />
<pre class="prettyprint">$ battery
</pre>
コンソールログインが良いという方は次の作業も行なってください。なお、このページの末尾にはこのPi-Top OSを普通のRaspbian風に用いる方法も記していますので、必要に応じて最後までご覧ください。<br />
<br />
<h3>
コンソールログインしたい場合</h3>
コンソールにログインしたいという方は、下記に従います。
<br />
<br />
まず、ユーザーpiのパスワードを念のため確認しておきましょう。
Pi-Top OSにログインし、LXTerminalを起動して、
<br />
<pre class="prettyprint">$ su - pi
</pre>
というコマンドによりユーザーpiにログインしてみてください。パスワードは「raspberry」ではなく「pi-top」であると思います。そのことを確認できたら次に進みましょう。<br />
<br />
再びLXTerminalを起動して下記のコマンドを実行します。<br />
<pre class="prettyprint">sudo raspi-config
</pre>
そこで「3 Enable Boot To Desktop/Scrach」→「Console Text console, requiring login (default)」を選択して再起動しましょう。これでコンソールへログインする形式になります。<br />
<br />
このとき、ユーザーのIDとパスワードは先ほど確かめた通り、<br />
<ul>
<li>ID: pi</li>
<li>パスワード: pi-top</li>
</ul>
です。<br />
<br />
ログイン完了時に
<br />
<pre class="prettyprint">Cannot open display "default display"
</pre>
というエラーがでますが、これは気にしないことにします。多分.bash_profile内に書かれたコマンドのせいだと思うのですが、これを消すと別のエラーが出るためです。
あとは必要に応じてstartxコマンドでXを起動してください。
<br />
<br />
<h3>
何をしたのか?</h3>
上の設定で何をしたのかですが、基本的には「ユーザーpiのログイン時にdashboardというアプリケーションが起動されるのを抑制した」だけです。<br />
<br />
dashboardを通常通り起動すると、「ユーザーpiのデスクトップが起動→dashboardというアプリケーション(Pi-Top OSのログイン画面)が起動」という流れが見えてしまうので、Pi-Top OSでは45秒間の動画(/home/pi/.pi-top/media/splash.mp4)を流してそれを隠している、というわけです。しかし、45秒間待たされるというのはユーザーにとってはメリットは何もないわけで、ちょっとお粗末だなと思います。<br />
<br />
<h3>
通常のRaspbianのように使ってみる</h3>
以下、このPi-Top OSを通常のRaspbian風にする設定を列挙します。<br />
<br />
<h4>
LXTerminalが最大化されて起動されるのを防ぐ</h4>
.config/openbox/lxde-pi-rc.xmlをleafpadなどのテキストエディタで開き、下記の部分を見つけます。<br />
<pre class="prettyprint"> <application name="lxterminal">
<maximized>yes</maximized>
</application>
</pre>
この「yes」の部分を「no」に変更してからXを再起動すると、LXTerminalが最大化された状態で開くのを抑制することができます。なお、leafpadも最大化されてい開くかもしれませんが、こちらは、一度小さくしてから終了するとそのサイズが保存されます。
<br />
<br />
<h4>
パネルの位置を上に</h4>
<div>
パネル上で右クリックして「パネルの設定」を開き、「ジオメトリ」→「位置」→「端」→「上」</div>
<div>
<br /></div>
<h4>
タスクバーのアイコンに文字を出す</h4>
<div>
タスクバー上で右クリックして「タスクバー(ウインドウのリスト)Settings」→「アイコンのみ」のチェックを外す</div>
<div>
<br /></div>
<h4>
メニューボタンのアイコンをRaspbianのものに</h4>
<div>
メニューボタン上で右クリックして「メニューSettings」→「アイコン」を/usr/share/raspberrypi-artwork/raspitr.pngに</div>
<div>
<br /></div>
<div>
<h4>
壁紙をRaspbianのものに</h4>
<div>
壁紙上で右クリックして「デスクトップの設定」→「外観」で「壁紙のモード」を「原寸大のまま中央に配置する」に、「壁紙」を/usr/share/raspberrypi-artwork/raspberry-pi-logo-small.pngに、「背景色」を赤214、緑211、青222に。</div>
</div>
<div>
<br /></div>
<div>
以上で、Pi-Top OSが通常のRaspbianにこの程度近づきました。</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihLByXbIPX1bV7X2xKrchcbc_DwJc5sFd-is0tuRxDonEUbY8RrG_y2peSM8U9ntHzlvQadAy8tk-CSbM2dHsPA6Vu24kRixiLoPWW2eINKQl4adtv7pcBVvM2_jl8iP17Hq6hOKMHi68/s1600/2015-11-30-235202_1366x768_scrot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="223" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihLByXbIPX1bV7X2xKrchcbc_DwJc5sFd-is0tuRxDonEUbY8RrG_y2peSM8U9ntHzlvQadAy8tk-CSbM2dHsPA6Vu24kRixiLoPWW2eINKQl4adtv7pcBVvM2_jl8iP17Hq6hOKMHi68/s400/2015-11-30-235202_1366x768_scrot.png" width="400" /></a></div>
<div>
<br /></div>
<h3>
こちらもどうぞ</h3>
<ul>
<li><a href="http://neuralassembly.blogspot.com/2015/11/raspberry-pipcpi-top.html" target="_blank">Raspberry PiをノートPC化するPi-Topが届いた</a></li>
<li><a href="http://neuralassembly.blogspot.com/2015/11/raspberry-pipcpi-topli2c.html" target="_blank">Raspberry PiをノートPC化するPi-Topで電子工作(LチカとI2C通信)してみた</a></li>
<li><a href="http://neuralassembly.blogspot.com/2016/02/jessiepi-top-os.html" target="_blank">JessieにアップデートされたPi-Top OSを試してみた</a></li>
<li><a href="https://neuralassembly.blogspot.com/2018/06/pi-top-v2stretchpi-topos.html" target="_blank">pi-top v2を購入してStretch系列のpi-topOSで使ってみた</a></li>
</ul>
<br />
<br />
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/gp/product/4065193397/" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7DRwdHUOfdPJtPAeH0UiIjW1Bi0s94ukn5JFN1x56glI-jjGVy9HyIB1FKHC6cWh15bKybLLYJqhtFmsAMMjyrb3ahHlVpvR_xT7lqEqlvubJ14XBUZQehLFTWTT71WykdZIDNUIr24g/s1600/cover3.png" /></a></div>
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/dp/4062579502/" style="clear: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_dmvycn6QM24eV1ZEoT6lg2TVi108iFt8BG6P1znEj0HtuWPBdYA2KxnD_uy1gw8CZI0UVilZ6noZJbqpagWZmQz5_9iScdkNo_ugvjoFInSMcArrkAYxuOFxoticmpPb1ZvSTJ8S_EM/s1600/raspi2_bb.jpg" /></a></div>
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/dp/4065020522/" style="clear: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="145" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOsxLVgVnFI0m-FUJlBK_CqKYJC8dNo3zjk8MOMX2xcJO4omTyOy-aAh3mmqGzXm5P3hGgpkUpaQy-7j7oqdIXyLE2_y686CI2Eda8EMYhME0INhU6irK9jw8b3iUhq7ojs2rrPZrnJtw/s1600/mlbb_title_mini.png" /></a></div>
<br clear="all" />
<div>
「ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作」、「実例で学ぶRaspberry Pi電子工作」、「Raspberry Piではじめる機械学習」を執筆しました。</div>
Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com0tag:blogger.com,1999:blog-1209616351336364066.post-8960654018678884932015-11-27T21:12:00.000+09:002020-06-16T18:34:09.335+09:00Raspberry PiをノートPC化するPi-Topで電子工作(LチカとI2C通信)してみた<h3>
はじめに</h3>
(注)こちらのページは、2015年に発売されたpi-topの旧バージョンについての記事です。2017年に発売された新バージョンについての記事は<a href="https://neuralassembly.blogspot.com/2018/06/pi-top-v2stretchpi-topos.html" target="_blank">こちら</a>になります。<br />
<br />
前回のエントリ<br />
<ul>
<li><a href="http://neuralassembly.blogspot.jp/2015/11/raspberry-pipcpi-top.html" target="_blank">Raspberry PiをノートPC化するPi-Topが届いた</a></li>
</ul>
にて、Pi-TopではRaspberry PiのGPIOが全てふさがれている、と述べました。そのままではRaspberry Piの特徴の一つである電子工作との親和性の高さが失われてしまいます。<br />
<br />
ただし、内部の左側にあるHubという基板にはGPIOから引き出されたと思われるメスピンがあり、その仕様がわかれば電子工作ができると思われました。<br />
<br />
その仕様はいずれ公式に発表されるだろうと考えて放置していましたが、どうにも公開される雰囲気がないので、テスターを用いて自分でピン配置を調べ、実際に簡単な電子工作を行なってみました。<br />
<br />
下図は定番のLチカを行なっている様子です。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlNK_lFW0PbIP0mMJWNG4tKwl-wBbgg1wqith8-aUKJKg_eleZoRRB2OrnQpeiVyu_yH-lryWdJFBwtrGOwyeaALX_7vchIqsG398EdFHQazQnium54_vPeiRLumfBzvvVrLVRT3Yrfhs/s1600/2015-11-27+12.58.35.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlNK_lFW0PbIP0mMJWNG4tKwl-wBbgg1wqith8-aUKJKg_eleZoRRB2OrnQpeiVyu_yH-lryWdJFBwtrGOwyeaALX_7vchIqsG398EdFHQazQnium54_vPeiRLumfBzvvVrLVRT3Yrfhs/s400/2015-11-27+12.58.35.jpg" width="400" /></a></div>
<br />
<h3>
ピン配置</h3>
<b>※注:ここから先の情報を試す場合、操作を誤るとPi-Topが破壊される恐れがありますので、全て自己責任でお願いします。</b><br />
<br />
まず、下図のようにfront/back/upper/lowerを定義します。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyWf3cVOkf42G_wbj8qJWNthZyZIr-7pudX4fGLLlrHohzS1QhiAfomDyUpFK_cl2wrg8OajN6qHvOyp1Eq0aaD4lO17lTRwYwm6eZX1LwtD1VN916wbcdu7Md4-q0x4tyzD-qvC29SFQ/s1600/PiTopPinAssignmentExp.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyWf3cVOkf42G_wbj8qJWNthZyZIr-7pudX4fGLLlrHohzS1QhiAfomDyUpFK_cl2wrg8OajN6qHvOyp1Eq0aaD4lO17lTRwYwm6eZX1LwtD1VN916wbcdu7Md4-q0x4tyzD-qvC29SFQ/s400/PiTopPinAssignmentExp.png" width="400" /></a></div>
<br />
<br />
そうしたとき、Pi-TopのHub基板のピン配置は以下のようになっていました。各GPIOとGNDはRaspberry Piと直結されています。<br />
<br />
3.3V/5V/16Vのピンは、Pi-Topの電源やバッテリー側から供給されています。どれくらいの電流を流すことができるかわかりませんので、あまり負荷をかけないほうがよいでしょう。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimlklhdi79Szq0T_Lfz1HkI4NxPrYPIGq1dm0t4e2y1CnCbWQKu7rgcA6PFOs7u-Qcr6afKEUJuUdQx5HfhGHXbDScK99jfEENTbQWWN_2L2gBNt2-fYNgzANMPph0X4tGTklbTebpRa0/s1600/PiTopPinAssignment.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="357" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimlklhdi79Szq0T_Lfz1HkI4NxPrYPIGq1dm0t4e2y1CnCbWQKu7rgcA6PFOs7u-Qcr6afKEUJuUdQx5HfhGHXbDScK99jfEENTbQWWN_2L2gBNt2-fYNgzANMPph0X4tGTklbTebpRa0/s400/PiTopPinAssignment.png" width="400" /></a></div>
<br />
Raspberry PiのGPIOのピン配置と注意深く比較すると、全てのピンが引き出されていることがわかります。重複しているGNDは一つのみ引き出されています。<br />
<br />
注意点を以下に述べます。<br />
<ul>
<li>SPIに関わるピンは既にPi-Topに使われています。具体的には、.pi-top/sys/hub-controller.pyというPythonスクリプト内で、HUBとの通信(スクリーンの明るさ制御、シャットダウンボタンの命令受信)に使われています。動作検証の際、SPI CE1 (GPIO 7)でLチカしてみたところ、Pi-Topが強制的に再起動され、冷や汗をかきました</li>
<li>試していませんが、UART RXD/TXDのピンはシリアルコンソール用に使われているはずです</li>
<li>ID_SDとID_SCはRaspberry Piにもあるピンですが、使ったことはありません</li>
<li>I2Cのピンは、下図のように0x0bのアドレスを持つPi-Top Hub基板上のデバイスによってバッテリー状態の取得に使われています。具体的には、/usr/local/bin/batteryというシェルスクリプトがそれを実行します。ただし、I2Cは複数のデバイスを接続できるので、問題にはなりません</li>
</ul>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixYtk5T9YqvlDFqelwWfbpKhqAAPfR2VmeB8k69D4XyFyMbV7avcnG2dkZqR4bg4hCRrfjpH35F5kawEyT7EHyX60q-Dnsuogt0zzDSWIpleVz5lRkzdGuH-8IkiGEnF3qIYw23RTJ0wM/s1600/PiTopI2C.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="208" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixYtk5T9YqvlDFqelwWfbpKhqAAPfR2VmeB8k69D4XyFyMbV7avcnG2dkZqR4bg4hCRrfjpH35F5kawEyT7EHyX60q-Dnsuogt0zzDSWIpleVz5lRkzdGuH-8IkiGEnF3qIYw23RTJ0wM/s400/PiTopI2C.png" width="400" /></a></div>
<br />
そのようなわけで、SPIとUARTのピンを使わなければ一般的な電子工作は行なえそうです。<br />
<br />
<h3>
Lチカ</h3>
まずは定番のLチカから試してみます。
冒頭のLチカの図を再掲します。上のピン配置でGPIO番号を持っているピンのうち、UART/SPI/I2Cに関わるピン以外の全てでLチカができることを確認しました。下図はGNDピンとGPIO 4を使っています。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlNK_lFW0PbIP0mMJWNG4tKwl-wBbgg1wqith8-aUKJKg_eleZoRRB2OrnQpeiVyu_yH-lryWdJFBwtrGOwyeaALX_7vchIqsG398EdFHQazQnium54_vPeiRLumfBzvvVrLVRT3Yrfhs/s1600/2015-11-27+12.58.35.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlNK_lFW0PbIP0mMJWNG4tKwl-wBbgg1wqith8-aUKJKg_eleZoRRB2OrnQpeiVyu_yH-lryWdJFBwtrGOwyeaALX_7vchIqsG398EdFHQazQnium54_vPeiRLumfBzvvVrLVRT3Yrfhs/s400/2015-11-27+12.58.35.jpg" width="400" /></a></div>
<br />
用いた回路とプログラムは「<a href="http://www.amazon.co.jp/dp/4062578913/" target="_blank">Raspberry Piで学ぶ電子工作</a>」の4章で紹介したものを流用しています。
<br />
<br />
まず、回路はこちら。<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7wftuZnstnOfdd795k7Q0xC22wkTTujCfpkioU5H2WuUx8yCdooTttPemfE8obtU2pC1ndgfm7TQlYNYclkRsaw25BbqFWUarJD2LlfNcFB9hS-CoazgtLdRxRbN2EVDEYU1Gpjuceik/s1600/PiTopLEDBlinkingCircuit.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="183" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7wftuZnstnOfdd795k7Q0xC22wkTTujCfpkioU5H2WuUx8yCdooTttPemfE8obtU2pC1ndgfm7TQlYNYclkRsaw25BbqFWUarJD2LlfNcFB9hS-CoazgtLdRxRbN2EVDEYU1Gpjuceik/s400/PiTopLEDBlinkingCircuit.png" width="400" /></a></div>
<br />
そしてプログラムがこちら。
<br />
<pre class="prettyprint">import RPi.GPIO as GPIO
from time import sleep
LED = 4
GPIO.setmode(GPIO.BCM)
GPIO.setup(LED, GPIO.OUT)
try:
while True:
GPIO.output(LED, GPIO.HIGH)
sleep(0.5)
GPIO.output(LED, GPIO.LOW)
sleep(0.5)
except KeyboardInterrupt:
pass
GPIO.cleanup()
</pre>
これをled.pyという名前で保存した場合、ターミナルで下記のコマンドにより実行できます。
<br />
<pre class="prettyprint">sudo python led.py</pre>
<br />
<h3>
I2C通信によるLCDの利用</h3>
次に、I2C通信によりLCDに文字を表示してみました。下図のようになります。3.3V/GND/I2C SDA/I2C SCLの4ピンを使っています。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxCK_cf48q9aIo7JSkUQrNywdpy90OcmynFGXTyz-GI-xoMJ_hRSL_EFch_7Kb6ZUDl68LZ1C4x67yvvz1lLvx-W8zmn-r2B5b59gGfA1KXtHHC-s5XPuV2u0_r2uR2X9Clndlar5PqGw/s1600/2015-11-27+13.06.22.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxCK_cf48q9aIo7JSkUQrNywdpy90OcmynFGXTyz-GI-xoMJ_hRSL_EFch_7Kb6ZUDl68LZ1C4x67yvvz1lLvx-W8zmn-r2B5b59gGfA1KXtHHC-s5XPuV2u0_r2uR2X9Clndlar5PqGw/s400/2015-11-27+13.06.22.jpg" width="400" /></a></div>
<br />
LCDをより大きく撮影した様子がこちら。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilVjTWcJavztql4pmhKXp8vKNEjpjH350x9L2jv6TfR5SgCjHUbhcfsff06tssd2V8udaoQ7R0KN-BzSYziS7f8rwUl4rdd7rfvJnXTGrmeISA_HZqUy3tXObv__CTivEt2rCcmA1gN7w/s1600/2015-11-27+13.06.34.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilVjTWcJavztql4pmhKXp8vKNEjpjH350x9L2jv6TfR5SgCjHUbhcfsff06tssd2V8udaoQ7R0KN-BzSYziS7f8rwUl4rdd7rfvJnXTGrmeISA_HZqUy3tXObv__CTivEt2rCcmA1gN7w/s400/2015-11-27+13.06.34.jpg" width="400" /></a></div>
<br />
これは、「<a href="http://www.amazon.co.jp/dp/4062578913/" target="_blank">Raspberry Piで学ぶ電子工作</a>」の7章で紹介したプログラムを以下のコマンドで実行した様子です。詳細は書籍をご参照ください。
<br />
<pre class="prettyprint">sudo python 07-02-LCD.py 'Hello, Pi-Top!'</pre>
<br />
<h3>
おわりに</h3>
<div>
そのようなわけで、SPI通信以外のピンは通常のRaspberry Piと同様に利用できることがわかりました。<br />
<br />
なお、本エントリを記述した後にRaspberry Piのピン配置を復活させるための<a href="https://pi-top.com/product/addon" target="_blank">pi-topPROTO</a>という商品が発売されたので、これを購入すると、実は本ページの内容は不要だったりします。下図は、pi-topPROTOとpi-topSPEAKERを接続した様子です。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEqFmdYRAIgsidygPT9RLc6SDzRra5IOOkYF5A-LfBa5XuR4qasPr_7SR9-L8Bn8KBOcy6Z4oFjhwan8qrZCrvtkFkV5ernBti5FUbbTyY0nhcFTf9nCtUpExhK-CD3wPyuEMLcsF0e5U/s1600/2017-03-21+12.26.00.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEqFmdYRAIgsidygPT9RLc6SDzRra5IOOkYF5A-LfBa5XuR4qasPr_7SR9-L8Bn8KBOcy6Z4oFjhwan8qrZCrvtkFkV5ernBti5FUbbTyY0nhcFTf9nCtUpExhK-CD3wPyuEMLcsF0e5U/s400/2017-03-21+12.26.00.jpg" width="400" /></a></div>
<br />
では、このPi-Topは電子工作に向いているかというと、「ちょっと怖い」というのが正直なところです。<br />
<br />
例えば、手がすべるなどしてジャンパーワイヤをPi-TopのHub基板に落としてしまうと、なんらかのショートがおこり基板を壊してしまうことがあり得ます。写真を見ていただくとわかりますが、いかにも何かを落としてしまいそうな位置に基板があるのです。<br />
<br />
壊れたのがRaspberry Piならば交換できますが、Pi-TopのHub基板となると交換はちょっと厄介そうです。決して安いものではありませんので。<br />
<br />
そういう意味では、<a href="http://raspibb.blogspot.jp/2015/11/raspberry-pi.html" target="_blank">Raspberry Pi公式タッチディスプレイ</a>の方が、壊しにくい位置に基板があるという点で電子工作向きかな、と思います。あるいは、Pi-Topに続き資金調達に成功した<a href="https://www.indiegogo.com/projects/pi-topceed-the-first-99-raspberry-pi-desktop#/" target="_blank">pi-topCEED</a>でも良いかもしれません。<br />
<br /></div>
<h3>
こちらもどうぞ</h3>
<ul>
<li><a href="http://neuralassembly.blogspot.com/2015/11/raspberry-pipcpi-top.html" target="_blank">Raspberry PiをノートPC化するPi-Topが届いた</a></li>
<li><a href="http://neuralassembly.blogspot.com/2015/11/raspberry-pipcpi-toppi.html" target="_blank">Raspberry PiをノートPC化するPi-Topにユーザーpiでログインしてみた</a>
</li>
<li><a href="http://neuralassembly.blogspot.com/2016/02/jessiepi-top-os.html" target="_blank">JessieにアップデートされたPi-Top OSを試してみた</a></li>
<li><a href="https://neuralassembly.blogspot.com/2018/06/pi-top-v2stretchpi-topos.html" target="_blank">pi-top v2を購入してStretch系列のpi-topOSで使ってみた</a></li>
</ul>
<br />
<br />
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/gp/product/4065193397/" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7DRwdHUOfdPJtPAeH0UiIjW1Bi0s94ukn5JFN1x56glI-jjGVy9HyIB1FKHC6cWh15bKybLLYJqhtFmsAMMjyrb3ahHlVpvR_xT7lqEqlvubJ14XBUZQehLFTWTT71WykdZIDNUIr24g/s1600/cover3.png" /></a></div>
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/dp/4062579502/" style="clear: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_dmvycn6QM24eV1ZEoT6lg2TVi108iFt8BG6P1znEj0HtuWPBdYA2KxnD_uy1gw8CZI0UVilZ6noZJbqpagWZmQz5_9iScdkNo_ugvjoFInSMcArrkAYxuOFxoticmpPb1ZvSTJ8S_EM/s1600/raspi2_bb.jpg" /></a></div>
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/dp/4065020522/" style="clear: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="145" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOsxLVgVnFI0m-FUJlBK_CqKYJC8dNo3zjk8MOMX2xcJO4omTyOy-aAh3mmqGzXm5P3hGgpkUpaQy-7j7oqdIXyLE2_y686CI2Eda8EMYhME0INhU6irK9jw8b3iUhq7ojs2rrPZrnJtw/s1600/mlbb_title_mini.png" /></a></div>
<br clear="all" />
<div>
「ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作」、「実例で学ぶRaspberry Pi電子工作」、「Raspberry Piではじめる機械学習」を執筆しました。</div>
Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com3tag:blogger.com,1999:blog-1209616351336364066.post-26893159010808476932015-11-05T01:14:00.001+09:002020-06-16T18:34:35.492+09:00Raspberry PiをノートPC化するPi-Topが届いた<h3>
はじめに</h3>
(注)こちらのページは、2015年に発売されたpi-topの旧バージョンについての記事です。2017年に発売された新バージョンについての記事は<a href="https://neuralassembly.blogspot.com/2018/06/pi-top-v2stretchpi-topos.html" target="_blank">こちら</a>になります。<br />
<br />
2014年10月頃、Raspberry PiをノートPC化するPi-Topがクラウドファンディングで資金を調達するというので話題となりました(参考:<a href="http://jp.techcrunch.com/2014/10/15/20141014the-pi-top-a-raspberry-pi-powered-laptop-is-hitting-the-crowdfunding-trail/" target="_blank">Techcrunch</a>)。<br />
<br />
その後、資金調達に成功し、2015年2月頃には一般向けに販売を開始しました(参考:<a href="https://fabcross.jp/news/2015/02/20150223_pi_top.html" target="_blank">fabcross</a>)。<br />
<br />
当時は2015年5月頃の発送を予定していたようですが、延期が重なり、2015年11月に実際に送られて来ましたので組み立てて使ってみました。<br />
<br />
こちらが通常のRaspbianが動作している様子です。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRjZOlpOrxw4tWE8IhoC0r-GSmArcApDhJoNZStH4W_gTCgvkIxg_9onv4LaeGCNMlsSO9NoF8TKej1ikPCx-Y-rE8ulNoPTMc8cj8g2-T3_o85PcHIR-ytaO4MwyP97tXH5fNjWcGlE8/s1600/2015-11-04+19.36.06.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRjZOlpOrxw4tWE8IhoC0r-GSmArcApDhJoNZStH4W_gTCgvkIxg_9onv4LaeGCNMlsSO9NoF8TKej1ikPCx-Y-rE8ulNoPTMc8cj8g2-T3_o85PcHIR-ytaO4MwyP97tXH5fNjWcGlE8/s320/2015-11-04+19.36.06.jpg" width="320" /></a></div>
<h3>
価格</h3>
<div>
価格は下記の通りです。</div>
<br />
<ul>
<li>Raspberry Pi 2 込みで299.99ドル</li>
<li>Raspberry Pi 2 なしで264.99ドル</li>
</ul>
<br />
さらに、日本までの送料が85ドルかかります。価格が高すぎるということはクラウドファンディング時から言われていましたね。<br />
(追記:さらにFedExから関税として3,500円の請求がありました)<br />
<br />
なお、Raspberry Pi 2は筐体の中に固定され、取り外しも面倒なので、Pi-Top専用のRaspberry Pi 2を用意するのが無難だと思います。私はPi 2込みのものを注文しました。<br />
<br />
<h3>
開封から組み立てまで</h3>
箱がこちら。結構大きいです。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmV3PzOoT4jkt4NQrgryfwRDl7mX_5JtE1-B8e1XD0ER8K6YngnOXZJ9kqY0uy4VKPROFTbYP8m_k6fol7k4GAHLv4QM4H3EMiSI_iMFll1nMJor_oua-f_wN0xIp-QveIiil5fbZZGlc/s1600/2015-11-04+18.07.42.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmV3PzOoT4jkt4NQrgryfwRDl7mX_5JtE1-B8e1XD0ER8K6YngnOXZJ9kqY0uy4VKPROFTbYP8m_k6fol7k4GAHLv4QM4H3EMiSI_iMFll1nMJor_oua-f_wN0xIp-QveIiil5fbZZGlc/s320/2015-11-04+18.07.42.jpg" width="320" /></a></div>
<br />
箱を開けた瞬間、緑の天板が目につき、その予想外の大きさに圧倒されました。内容物は何段かにわかれて収納されています。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfq_-g8Dxkor8AAHFoRMjcZISxyou1DT7gv_TaZqgnPZGXT8QXSFAaWmKegllPaJWd1PdB0YtSnCDvppnZEljuIhK1KCDlJLFs8GshGzaIOnODAWnHGEtQsDzveD9Gpv-NO80TdEGrjjo/s1600/2015-11-04+18.08.30.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfq_-g8Dxkor8AAHFoRMjcZISxyou1DT7gv_TaZqgnPZGXT8QXSFAaWmKegllPaJWd1PdB0YtSnCDvppnZEljuIhK1KCDlJLFs8GshGzaIOnODAWnHGEtQsDzveD9Gpv-NO80TdEGrjjo/s320/2015-11-04+18.08.30.jpg" width="320" /></a></div>
<br />
組み立てに必要なパーツを全て取り出したのが下図です。緑色のUSBのドングルはWifiデバイスですが、技適は通っていないと思われるので、お手持ちのものを利用するのが良いと思います。<br />
<br />
また、Pi-Top OSと呼ばれる独自OSが入ったmicroSDも付属します。後述するように、通常のRaspbianでも制限はありますが動作します。<br />
<br />
なお、短くて柔らかいHDMIケーブルが付属するのですが(下図で上から3番目のケーブル)、これ単体で売って欲しいと思いました。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5yRt9vdJedXzcC9JLf_Cl-XVBAmgaCrJFU0nsKkpRq9rK1IpQarlRuhqqlzgLN1Lzi9eMnieGkS6Q4Sq39i4F0TzQ_IZ1ubDjB-_z_fc1y4UN6fMt97TmCLpnjR7oASTUlbGTHKjUlSU/s1600/2015-11-04+18.42.02.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5yRt9vdJedXzcC9JLf_Cl-XVBAmgaCrJFU0nsKkpRq9rK1IpQarlRuhqqlzgLN1Lzi9eMnieGkS6Q4Sq39i4F0TzQ_IZ1ubDjB-_z_fc1y4UN6fMt97TmCLpnjR7oASTUlbGTHKjUlSU/s320/2015-11-04+18.42.02.jpg" width="320" /></a></div>
<br />
組立自体は説明書の通りに行えば難しくないのですが、細いケーブルを取り扱う部分があるので、注意は必要です。<br />
<br />
なお、下図のStep 3-3はスクリューを付属の六角レンチで回すのですが、どこかにねじ込んでいるわけでもなく、意味があるのか疑問でした。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRtpXbTflnvUffgt4QEUJgAmre1TAi6IgndPwr1bn3zTOQCoSY4c9HJSwsPze0BxyfQw5qf5hZMVxZqXiQVT0_PYV2XQ2V6GUBhYtwf_JtIY6kvTMRwopyD6jS3WR80kfmu0HzlGLBvrw/s1600/3-3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="220" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRtpXbTflnvUffgt4QEUJgAmre1TAi6IgndPwr1bn3zTOQCoSY4c9HJSwsPze0BxyfQw5qf5hZMVxZqXiQVT0_PYV2XQ2V6GUBhYtwf_JtIY6kvTMRwopyD6jS3WR80kfmu0HzlGLBvrw/s320/3-3.png" width="320" /></a></div>
<br />
また、Step 8-5でキーボードをBall Head Screwsにはめ込むのですが、ここでキーボードの下に来るケーブルをうまくまとめないと、キーボードが上に盛り上がって非常に不格好になります。<br />
<br />
それを直すためにキーボードをBall Head Screwsから外すのはそこそこ大変なので、ここは組立中で最もストレスを感じました。<br />
<br />
なお、このキーボードの盛り上がりを完全になくすのは難しいのでは?という気がしています。組み立てた方ならわかると思いますが、本ページのPi-Topの写真は、キーボードの中央部が若干盛り上がっています。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgi3HNxh24fpA8MGviOxGbg1Q6uRyFk9CDhAC7AWmwhsCWASJghpgo4RJAF_hKqHTkkSxlQQHxymLhc8XKv71p2I3XMcKTFItTM1U9gFzG48te1PMl_6c4oJ4HRJNLILdHPR_Srvm4JTxU/s1600/8-5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="223" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgi3HNxh24fpA8MGviOxGbg1Q6uRyFk9CDhAC7AWmwhsCWASJghpgo4RJAF_hKqHTkkSxlQQHxymLhc8XKv71p2I3XMcKTFItTM1U9gFzG48te1PMl_6c4oJ4HRJNLILdHPR_Srvm4JTxU/s320/8-5.png" width="320" /></a></div>
<br />
<h3>
起動</h3>
組み立て終わったら、付属のPi-Top OSの入ったmicroSDで起動してみます。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFyXSvmiLhsz2QOn3Zos9DnjLgFUWaknH0H6ItH6AS4u6yRFGGnq1gElNnNfPCunIe74SsT3Bv12qJLBRKL2xRg78YMEtdsAqGIXI2wZJqP9ymv1Zek3HukGLiBwrZytZ4x3s8jULnZBY/s1600/2015-11-04+19.29.01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFyXSvmiLhsz2QOn3Zos9DnjLgFUWaknH0H6ItH6AS4u6yRFGGnq1gElNnNfPCunIe74SsT3Bv12qJLBRKL2xRg78YMEtdsAqGIXI2wZJqP9ymv1Zek3HukGLiBwrZytZ4x3s8jULnZBY/s320/2015-11-04+19.29.01.jpg" width="320" /></a></div>
<br />
起動画面の後、ログイン画面になるのですが、ここでできるのは、下記の通りです。
<br />
<ul>
<li>Wifiのセットアップ(Viewでパスワード入力可)</li>
<li>ネットワークログイン(Pi-Topサイトのアカウントでログインできるらしい)</li>
<li>ユーザーの作成</li>
<li>ゲストアカウントでのログイン(Read Onlyで、設定ファイル等変更できない)</li>
</ul>
<div>
Pi-Topサイトのアカウントでログインできるようなのですが、実際にログインしようとすると、下図のように「logging in」の状態のまま先に進みません。<br />
<br />
なお、ネットワークに接続していない状態では、Read Onlyなゲストアカウントでの作業になりますので、実用的ではありません。Raspbian wheezyベースであることはわかるのですが、いつものユーザーpiでのログインはできませんでした。</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_jnqCm1PdE6_ArkoBF8cxXMyqgyYVPLyUk92J2ESy_fSPcWXPpKbedGnS4oSgSQSgE7zlZoqhvBA5V7vnwsuCr4UMSdWp5jMQGvOIh0DpaQMXw2Y-79iK4rCVuOdmp9I13OzmokEFpM0/s1600/2015-11-04+22.35.02.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_jnqCm1PdE6_ArkoBF8cxXMyqgyYVPLyUk92J2ESy_fSPcWXPpKbedGnS4oSgSQSgE7zlZoqhvBA5V7vnwsuCr4UMSdWp5jMQGvOIh0DpaQMXw2Y-79iK4rCVuOdmp9I13OzmokEFpM0/s320/2015-11-04+22.35.02.jpg" width="320" /></a></div>
<br />
<div>
色々試行錯誤した結果、以下の方法でPi-Topサイトのアカウントでログインできるようになりました。あらかじめPi-Topサイトのアカウントを持っていることが条件です。<br />
<ul>
<li>まず、Wifiに接続します。Viewボタンをクリックするとパスワードを入力できたと思います</li>
<li>右下の設定アイコンをクリックし、Create Accountにより、アカウントを作成します。その際、ユーザーネーム、パスワード、メールアドレスは適当に設定します(このアカウントは最終的には使われなくなります)</li>
<li>すると一時的にログインできますが、そのまま再起動すると、またログインできなくなってしまいますので、再起動はしないようにしましょう</li>
<li>そこで、ターミナルを起動し、下記のコマンドを実行し、OSを更新します</li>
<li>curl -sL https://www.pi-top.com/download/patch1 | sudo bash -</li>
<li>コマンドを実行すると、自動的にログアウトされ、もう一度ログインを求められます。この段階で、Pi-Topのアカウントでログインできるようになっています</li>
</ul>
ログインしてみるとわかるのですが、Pi-Topのアカウントは認証に使われるだけで、ログインすると普通のRaspbianと同様、ユーザーpiなのですね。ですので、OS更新前に一時的に作成したアカウントのデスクトップがそのまま引き継がれていたりします。<br />
<br />
それなら最初からユーザーpiでログインさせてくれれば良いのに、と思いました。<br />
<br />
そこで、実際にユーザーpiでログインできるよう設定した結果をこちらのエントリにまとめました→「<a href="http://neuralassembly.blogspot.com/2015/11/raspberry-pipcpi-toppi.html" target="_blank">Raspberry PiをノートPC化するPi-Topにユーザーpiでログインしてみた</a>」。Pi-Top OSを普通のRaspbianに近い状態で使う方法も記しております。</div>
<div>
<br /></div>
<div>
なお、このPi-Top OSを用いるメリットは下記の通りです。</div>
<div>
<ul>
<li>バッテリーの残量がわかる</li>
<li>キーボードでディスプレイ輝度を調節できる</li>
<li>電源ボタンの長押しでシャットダウンコマンドが実行された後に電源が切れる</li>
</ul>
</div>
<br />
<h3>
通常のRaspbianで使うには?</h3>
Pi-Top OSが付属するからといって、通常のRaspbianで使えないわけではありません。以下、Pi-Topを通常のRaspbianで使う際の注意を記していきます。NOOBS 1.4.1 (wheezy)とNOOBS 1.4.2 (jessie)で試しました。<br />
<br />
まず、デフォルトでは画面端に黒い帯が現れて画面の広さが狭くなってしまいます。Overscanの設定をDisableに設定すると改善することができます。以前からあるraspi-configを用いる場合は「8 Advanced Options」→「A1 Overscan」から、NOOBS 1.4.2 (Jessie)からの新設定アプリケーションでは「System→Overscan」からDisableに設定できます。<br />
<br />
なお、通常のRaspbianを用いると、<br />
<ul>
<li>バッテリーの残量がわからない</li>
<li>キーボードでディスプレイ輝度を調節できない</li>
<li>電源ボタンを長押しするといきなり電源が落ちる</li>
</ul>
<div>
という問題があります。Pi-Top OSからこれらの機能を移植することも可能でしょうが、どちらかというと、Pi-Top OSをRaspbian風にするほうが簡単かもしれません。「<a href="http://neuralassembly.blogspot.com/2015/11/raspberry-pipcpi-toppi.html" target="_blank">Raspberry PiをノートPC化するPi-Topにユーザーpiでログインしてみた</a>」にその方法を記しております。</div>
<div>
<br /></div>
<div>
なお、通常のRaspianを終了するときは</div>
<div>
<ul>
<li>「sudo poweroff」を実行→シャットダウンプロセスが終わったら電源ボタン長押し</li>
</ul>
</div>
<div>
として電源を切るのが良さそうです。<br />
<br />
<h3>
感想など</h3>
</div>
Raspberry PiをノートPC風に使うということに関し、以前「<a href="http://neuralassembly.blogspot.jp/2015/04/lapdock-for-motorola-atrixraspberry-pi.html" target="_blank">Lapdock for Motorola Atrixを使ってRaspberry Pi 2をモバイルPCにしてみた</a>」というエントリを書きました。その方法に比べると余計なケーブルが必要なく、とてもシンプルなのは良いと思います。<br />
<br />
ただ、気になる点もいくつかあります。<br />
<br />
まず、サイズがおよそ340mm×210mm×47mm (最厚部)程度と大きく、実際に目にするとかなりの迫力です。<br />
<br />
また、キーボードのクオリティがやや低いです。押しても反応しにくいキーがあり、私の場合、「k」キーを押した際に 7/10 くらいの確率でしか入力されませんでした。まあこれは慣れである程度はカバーできるだろうとは思います。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5954Ofdhz3vkLu_uGWFXOVUAnsAc3V6h31nkvHk3gSwoB3h8bbgfOrO66AUTsUZF4QFIjM1B3d63GH7G8cSFLB3wYIuxX_TF2Y8wZzR0hlkWlSPyW11UNvcYRAcxasHicucUBuMHgAM0/s1600/2015-11-04+23.36.24.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5954Ofdhz3vkLu_uGWFXOVUAnsAc3V6h31nkvHk3gSwoB3h8bbgfOrO66AUTsUZF4QFIjM1B3d63GH7G8cSFLB3wYIuxX_TF2Y8wZzR0hlkWlSPyW11UNvcYRAcxasHicucUBuMHgAM0/s320/2015-11-04+23.36.24.jpg" width="320" /></a></div>
<br />
また、下図のようにRaspberry Piの40ピンのGPIOが全て塞がってしまうのが気になります。下図の左側の基板から、34ピンだけ引き出せそうなのですが、現時点ではその仕様が公式には公開されていないようです。この点はかなり気になったので自分で調べてみました。結果を以下のエントリにまとめました→「<a href="http://neuralassembly.blogspot.com/2015/11/raspberry-pipcpi-topli2c.html" target="_blank">Raspberry PiをノートPC化するPi-Topで電子工作(LチカとI2C通信)してみた</a>」。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5hwLwu7qgaJ-3lVy20U6KC_8g1Ic_Sx4girpFq-4kTU7qaxBkBVLMGiQfBCk-iZ1vLgeYHMhyphenhyphenLNPAXc4gRx4uDODquw2GQdwTZz3p-57oM9xKsao5J6aBb7Di0pEnyquUy2nxScYusFw/s1600/2015-11-04+19.38.28.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5hwLwu7qgaJ-3lVy20U6KC_8g1Ic_Sx4girpFq-4kTU7qaxBkBVLMGiQfBCk-iZ1vLgeYHMhyphenhyphenLNPAXc4gRx4uDODquw2GQdwTZz3p-57oM9xKsao5J6aBb7Di0pEnyquUy2nxScYusFw/s320/2015-11-04+19.38.28.jpg" width="320" /></a></div>
<br />
個人的には、Pi-Top OSと名乗って、ログイン法を通常のRaspbianから大きく変えてしまったのは残念でした。通常のRaspbianにボード制御用アプリケーションを追加インストールする形式で十分だったように思います。<br />
<br />
とは言え、触っていくほど愛着の湧く面白いおもちゃであるとも思います。やや高価な価格に納得できる方なら試してみても良いでしょう。<br />
<br />
なお、Pi-Topからキーボード、タッチパッドを取り除いた、<a href="https://www.indiegogo.com/projects/pi-topceed-the-first-99-raspberry-pi-desktop#/" target="_blank">pi-topCEED</a>と呼ばれるものも資金調達に成功しており、こちらは送料等を除いて99ドルとお得になっています。今ならこちらの方が良いかもしれませんね。<br />
<br />
<h3>
追記(2016.1.14)</h3>
…と、2015年11月に上記のエントリを書いたのですが、実際のところ、私のPi-Topはほとんど使われることなく積まれた状態でした。何が問題かというと、やはりキーボードの性能が低すぎるのが致命的です。<br />
<br />
ブラウジングメインで用いるためのパワーが足りないのはRapsberry Pi 2の現状での限界なので仕方ありませんが、サーバーにリモートで接続するための端末として用いようとしても、Ctrlキーの押下が認識されたりされなかったりでは使い物になりません。<br />
<br />
どうにかならないかと考え、ロジクールのワイヤレスキーボード&マウスである<a href="http://www.logicool.co.jp/ja-jp/product/wireless-combo-mk240?crid=27" target="_blank">MK240</a>を購入したところ、Pi-Topが非常に快適に使えるようになりました。キーボードの足を起こしてPi-Topに載せると、Pi-Topのキーボードに干渉しないので良い感じです。唯一の不満はキーボードに電源スイッチがないことですが、まあこれはしょうがないかな。<br />
<br />
そのようなわけで、今度こそPi-Topを使ってみようと思います。<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrAyBXFSg9RA5lw7TGj4ISlRTkgBIjv2uX6wTTGUtJrcOJFHsYUCi3z5Pr3dvJDlFoPTRDkTe6TvkczosRMkhVeFe4pvO_GJK8arQMcxeHjJ4ajZ2OLz9xy-HKQ1dmSphyphenhyphenQA5hbWAP3qA/s1600/2016-01-14+14.27.09.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrAyBXFSg9RA5lw7TGj4ISlRTkgBIjv2uX6wTTGUtJrcOJFHsYUCi3z5Pr3dvJDlFoPTRDkTe6TvkczosRMkhVeFe4pvO_GJK8arQMcxeHjJ4ajZ2OLz9xy-HKQ1dmSphyphenhyphenQA5hbWAP3qA/s400/2016-01-14+14.27.09.jpg" width="400" /></a></div>
<br />
<h3>
こちらもどうぞ</h3>
<ul>
<li><a href="http://neuralassembly.blogspot.com/2015/11/raspberry-pipcpi-toppi.html" target="_blank">Raspberry PiをノートPC化するPi-Topにユーザーpiでログインしてみた</a></li>
<li><a href="http://neuralassembly.blogspot.com/2015/11/raspberry-pipcpi-topli2c.html" target="_blank">Raspberry PiをノートPC化するPi-Topで電子工作(LチカとI2C通信)してみた</a></li>
<li><a href="http://neuralassembly.blogspot.com/2016/02/jessiepi-top-os.html" target="_blank">JessieにアップデートされたPi-Top OSを試してみた</a></li>
<li><a href="https://neuralassembly.blogspot.com/2018/06/pi-top-v2stretchpi-topos.html" target="_blank">pi-top v2を購入してStretch系列のpi-topOSで使ってみた</a></li>
</ul>
<br />
<br />
<br />
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/gp/product/4065193397/" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7DRwdHUOfdPJtPAeH0UiIjW1Bi0s94ukn5JFN1x56glI-jjGVy9HyIB1FKHC6cWh15bKybLLYJqhtFmsAMMjyrb3ahHlVpvR_xT7lqEqlvubJ14XBUZQehLFTWTT71WykdZIDNUIr24g/s1600/cover3.png" /></a></div>
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/dp/4062579502/" style="clear: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_dmvycn6QM24eV1ZEoT6lg2TVi108iFt8BG6P1znEj0HtuWPBdYA2KxnD_uy1gw8CZI0UVilZ6noZJbqpagWZmQz5_9iScdkNo_ugvjoFInSMcArrkAYxuOFxoticmpPb1ZvSTJ8S_EM/s1600/raspi2_bb.jpg" /></a></div>
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/dp/4065020522/" style="clear: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="145" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOsxLVgVnFI0m-FUJlBK_CqKYJC8dNo3zjk8MOMX2xcJO4omTyOy-aAh3mmqGzXm5P3hGgpkUpaQy-7j7oqdIXyLE2_y686CI2Eda8EMYhME0INhU6irK9jw8b3iUhq7ojs2rrPZrnJtw/s1600/mlbb_title_mini.png" /></a></div>
<br clear="all" />
<div>
「ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作」、「実例で学ぶRaspberry Pi電子工作」、「Raspberry Piではじめる機械学習」を執筆しました。</div>
Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com0tag:blogger.com,1999:blog-1209616351336364066.post-6007321624691219042015-09-02T02:49:00.001+09:002020-10-17T00:22:18.469+09:00Raspberry Pi + kernel 4.1 / 4.4 / 4.9 / 4.14 / 4.19系列で5GHz対応WifiドングルGW-450D/GW-450D2/Archer T1U/WI-U2-433DMを動かした<h3>
本ページで目指すもの</h3>
(注:本ページの内容はkernel 5.X 系では動作しません)
<br /><br />
Raspberry PiなどのLinuxボードをAndroid Bazaar and ConferenceやMaker Faireなどで展示する際、Wifiの混線を避けるために5GHz対応のWifiドングル<a href="https://www.planex.co.jp/products/gw-450d/" target="_blank">Planex製GW-450D</a>を使うことがよくありました。<br />
<br />
そこで、本ページではRaspberry Piを5GHz帯のネットワークに接続することを目標にします。必要なものは下記のどれかの無線LAN USBアダプタです。<br />
<ul>
<li><a href="https://www.planex.co.jp/products/gw-450d/" target="_blank">Planex製GW-450D</a></li>
<li><a href="https://www.planex.co.jp/products/gw-450d2/" target="_blank">Planex製GW-450D2</a></li>
<li><a href="https://www.tp-link.com/jp/products/details/cat-11_Archer-T1U.html" target="_blank">tp-link製AC450 Archer T1U</a></li>
<li><a href="http://www.iodata.jp/product/network/adp/wn-ac433u/" target="_blank">I-O DATA製WN-AC433UK</a>:ただし、Pi 3では動いたがPi 2では不安定だった経験があるので癖があるかも</li>
<li><a href="http://buffalo.jp/product/wireless-lan/client/wi-u2-433dm/" target="_blank">Buffalo製WI-U2-433DM</a></li>
</ul>
これらは、USBにさしただけでは認識されず、ドライバを別途インストールする必要があります。<br />
<br />
ただし、2018年6月に日本で発売になったRaspberry Pi 3 Model B+では、基板上に実装されているネットワークデバイスを用いてデフォルトで5GHz帯のネットワークにつなぐことができるのですよね。<br />
<br />
ですので、上記の無線LAN USBアダプタを使う理由はなくなりつつあるのですが、当面本ページメンテナンスは続けます。<br />
<br />
解説は、下記の順で行います。<br />
<ol>
<li>Planex製GW-450D / GW-450D2 /tp-link製Archer T1U 用ドライバのインストール</li>
<li>Buffalo製WI-U2-433DM 用ドライバのインストール</li>
</ol>
以前はカーネルの再構築が必要な方法で書いていましたが、カーネル再構築が不要な方法に改訂しました。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7u2L1EDbRdHLsAgFCmWy1kgU4P0-icbu1aE7xYJm7KFkDHN_yLDRdzgMlmVjU_sbeExoZ0BXspS_Cqz20TOaDgjJCdXcXvQETdna8Cscn4X8TKeSEqOM2Yczh_-UVQO9yWuo8m9pJNz0/s1600/rpi2-gw450d.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7u2L1EDbRdHLsAgFCmWy1kgU4P0-icbu1aE7xYJm7KFkDHN_yLDRdzgMlmVjU_sbeExoZ0BXspS_Cqz20TOaDgjJCdXcXvQETdna8Cscn4X8TKeSEqOM2Yczh_-UVQO9yWuo8m9pJNz0/s320/rpi2-gw450d.jpg" width="320" /></a></div>
<br />
<h3>
カーネルヘッダをインストール</h3>
まず、ドライバのインストールに必要なカーネルヘッダをインストールします。ターミナルで下記のコマンドを実行します。<br />
<pre class="prettyprint">$ sudo apt-get update
$ sudo apt-get install raspberrypi-kernel-headers
</pre>
これが終わったら、インストールしたカーネルヘッダディレクトリを/usr/src/linuxとしてリンクを張ります。
<br />
<pre class="prettyprint">$ cd /usr/src
$ sudo ln -s linux-headers-4.19.50-v7+ linux
</pre>
ここで、「linux-headers-4.19.50-v7+」の部分は皆さんの手元の環境のディレクトリ名に読み替えて実行します。用いているのがPi 2およびPi 3らば末尾が「数字-v7+」のディレクトリを、
Pi 1やPi Zeroでは「数字+」のディレクトリを選ぶようにしてください。これらは自分の用いているカーネルのバージョン番号になっています。
<br />
<br />
自分が用いているカーネルのバージョンの調べ方も知っておきましょう。下記のコマンドを実行します。<br />
<pre class="prettyprint">$ uname -r
</pre>
結果として、例えば「4.19.50-v7+」と表示されれば、「4.19系列」を用いていることになります。他には「4.14」、「4.9」、「4.4」、「4.1」などがあり得ると思います。
また、末尾に「-v7+」とつくのがPi 2およびPi 3です。Pi 1やPi Zeroでは末尾が「-v7+」ではなく「+」となっているはずです。
<br />
ここから、各Wifiデバイスのドライバーのインストールに入ります。<br />
<br />
<h3>
Planex製GW-450D / GW-450D2 /tp-link製Archer T1U 用ドライバのインストール</h3>
ここから解説するのは、GW-450D / GW-450D2 / Archer T1U 用ドライバのインストールの方法です。<br />
まず、<a href="http://www.planex.co.jp/support/download/gw-450d/driver_linux.shtml" target="_blank">http://www.planex.co.jp/support/download/gw-450d/driver_linux.shtml</a><br />
より、gw-450d_driver_linux_v3002.zipをダウンロードし、/home/piに置いておきます。<br />
<br />
そして、ドライバを下記のように展開します。
<br />
<pre class="prettyprint">$ cd /usr/src
$ sudo su
# unzip /home/pi/gw-450d_driver_linux_v3002.zip
# cd gw-450d_driver_linux_v3002
# tar xf mt7610u_wifi_sta_v3002_dpo_20130916.tar.bz2
# cd mt7610u_wifi_sta_v3002_dpo_20130916
</pre>
展開が終わったら、パッチをダウンロードして適用します。このとき、用いているカーネルが4.14~4.19系か、4.1~4.9系かで実行するコマンドが異なります。
<br />
<br />
まず、4.14~4.19系を用いている方は、次の2コマンドを実行してください。
<br />
<pre class="prettyprint"># wget https://raw.githubusercontent.com/neuralassembly/raspi/master/gw-450d/gw-450d-rpi-kernel414.patch
# patch -p0 < gw-450d-rpi-kernel414.patch
</pre>
4.1~4.9系を用いている方は、次の2コマンドです。
<br />
<pre class="prettyprint"># wget https://raw.githubusercontent.com/neuralassembly/raspi/master/gw-450d/gw-450d-rpi-kernel41.patch
# patch -p0 < gw-450d-rpi-kernel41.patch
</pre>
このパッチ当てがkernel 4.1、4.4、4.9、4.14、4.19でGW-450Dを動かす上で重要です。<br />
<br />
以上が終わったら、コンパイルを行います。
<br />
<pre class="prettyprint"># make
</pre>
コンパイルが終わったら、モジュールをインストールします。kernelのバージョン(「4.19.50-v7+」の部分)は自分の環境に応じて読み替えてください。<br />
<pre class="prettyprint"># cp -p os/linux/mt7650u_sta.ko /lib/modules/4.19.50-v7+/kernel/drivers/net/wireless
# depmod -a
</pre>
次に、設定ファイルのコピーを行います。
<br />
<pre class="prettyprint"># mkdir -p /etc/Wireless/RT2870STA
# cp RT2870STA.dat /etc/Wireless/RT2870STA/RT2870STA.dat
</pre>
最後に、ネットワークの設定を記述します。1つ目の命令はテキストエディタleafpadで/etc/network/interfacesを開いていますが、もちろんここはお好みのテキストエディタを用いて構いません。<br />
なお、NOOBS 3.2.1以降ではテキストエディタとしてleafpadではなくmousepadを用います。その場合のコマンドは「mousepad /etc/network/interfaces」です。<br />
また、your-ssidの部分はお使いのWifiルーターのネットワーク名、your-passwdの部分はそのネットワークパスワードを記してください。
<pre class="prettyprint"># leafpad /etc/network/interfaces
(末尾に以下を記述)
allow-hotplug ra0
auto ra0
iface ra0 inet manual
wpa-ssid "your-ssid"
wpa-psk "your-passwd"
</pre>
以上が終わったら、GW-450D / GW-450D2 / Archer T1U のどれかをさし、Raspberry Pi を再起動します。<br />
<br />
さしたネットワークデバイスでネットワークにつながっていると思います。Raspberry Pi 3のボード上のWifiデバイスを無効にしたい場合、デスクトップ右上のメニューから「Turn Off Wifi」を選択して下さい。<br />
<br />
なお、割り当てられるIPアドレスを固定したい場合、「<a href="http://raspibb.blogspot.jp/2016/04/raspberry-piip.html" target="_blank">Raspberry PiのIPアドレスを固定する | 「Raspberry Piで学ぶ電子工作」補足情報</a>」で紹介した方法が使えますので必要な方はご参照ください。<br />
<br />
<h4>
I-O DATA製WN-AC433UKについての注意</h4>
ここで、<a href="http://www.iodata.jp/product/network/adp/wn-ac433u/" target="_blank">I-O DATA製WN-AC433UK</a>についての注意を記します。上記の方法でドライバをインストールすることにより、Raspberry Pi 3で動作を確認することができました。ただし、過去にRaspberry Pi 2で試したところ、下記のように非常に安定性が悪いことがありました。<br />
<ul>
<li>流せる電流の大きな電源と、高品質な電源ケーブルを用いないと動作しないことが多い</li>
<li>Raspberry Piの起動前にI-O DATA製WN-AC433UKを差しておいても、認識に失敗することがある</li>
<li>Raspberry Pi起動後にI-O DATA製WN-AC433UKを抜き差しすると、認識に成功するときとしないときとがある。</li>
</ul>
<div>
Pi 3で安定動作したので今となってはあまり気にしていませんが、似たような状況の方はご参考ください。</div>
<div>
<br /></div>
<h3>
Buffalo製WI-U2-433DMのドライバのインストール</h3>
Buffalo製WI-U2-433DMについても動作を確認してみました。こちらについては、本ページのカーネルヘッダのインストールまでは共通で、ドライバのインストールからが異なります。<br />
<br />
以下の作業は「<a href="http://d.hatena.ne.jp/embedded/20151018/p4" target="_blank">Raspberry Pi 2でWiFiドングル BUFFALO WI-U2-433DMを使う</a>」を参考にしました。<br />
<br />
下記の手順で作業を進めます。
<br />
<pre class="prettyprint">$ cd /usr/src
$ sudo su
# git clone https://github.com/gnab/rtl8812au.git
# cd rtl8812au
</pre>
kernel 4.19以降を用いている方はさらに以下の2命令を実行してください。
<pre class="prettyprint">
# wget https://raw.githubusercontent.com/neuralassembly/raspi/master/rtl8812-rpi-kernel419.patch
# patch -p0 < rtl8812-rpi-kernel419.patch
</pre>
ここで、このディレクトリにあるMakefileを下記のように2箇所変更します。
<br />
<pre class="prettyprint">...
CONFIG_PLATFORM_I386_PC = n
...
CONFIG_PLATFORM_ARM_RPI = y
</pre>
すなわち、CONFIG_PLATFORM_I386_PCの値を「n」に、CONFIG_PLATFORM_ARM_RPIの値を「y」にするだけです。あとは下記のように作業を進めます。kernelのバージョン(「4.19.50-v7+」の部分)は各自読み替えてください。<br />
<pre class="prettyprint"># make
# cp 8812au.ko /lib/modules/4.19.50-v7+/kernel/drivers/net/wireless
# depmod -a
</pre>
以上で、Buffalo製WI-U2-433DMを差すとネットワークインターフェースがwlan0かwlan1の状態で認識されます。このままでは、Raspberry Pi 3で用いる場合下記の問題があります。
<br />
<ul>
<li>オンボードのWifiデバイスとWI-U2-433DMに対してwlan0とwlan1のように同じデバイス名が使われ、さらにこの番号が変わることがある</li>
</ul>
これを解消し、オンボードのWifiデバイスをwlan0、WI-U2-433DMがwlan1と固定されるよう設定が必要となります。<br />
以下では、Raspbianが「StretchまたはBuster」の場合とJessieの場合とにわけて解説しましょう。
<br />
<br />
<h4>
Stretch / BusterでのWI-U2-433DMの設定</h4>
下記のコマンドにより、/etc/udev/rules.d/70-persistent-net.rules というファイルを新規に開きます。
<br />
<pre class="prettyprint">$ sudo leafpad /etc/udev/rules.d/70-persistent-net.rules
</pre>
なお、NOOBS 3.2.1以降ではテキストエディタとしてleafpadではなくmousepadを用います。
<pre class="prettyprint">$ sudo mousepad /etc/udev/rules.d/70-persistent-net.rules
</pre>
leafpadはテキストエディタですので、お好みのものを用いて構いません。
この空のファイルに下記の内容を書き込みます。
<br />
<pre class="prettyprint"># Unknown net device (/devices/platform/soc/3f300000.mmc/mmc_host/mmc1/mmc1:0001/mmc1:0001:1/net/wlan0) (brcmfmac)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xx:xx:xx:xx:xx:xx", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="wlan*", NAME="wlan0"
# USB device 0x:0x (rtl8812au)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xx:xx:xx:xx:xx:xx", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="wlan*", NAME="wlan1"
</pre>
ここで、2箇所ある「xx:xx:xx:xx:xx:xx」の部分には、二つのネットワークデバイスのMACアドレスを記さねばなりません。
<br />
<br />
まず、オンボードのWifiデバイスのMACアドレスを調べるには、Raspberry PiからWI-U2-433DMを抜いた状態で下記のコマンドを実行します。
<br />
<pre class="prettyprint">$ ifconfig
</pre>
wlan0またはwlan1のところに「ether xx:xx:xx:xx:xx:xx」という項目が見つかるでしょう。これがオンボードのWifiデバイスのMACアドレスです。
これを/etc/udev/rules.d/70-persistent-net.rules の一つ目の設定項目に記します。<br />
<br />
同様に、WI-U2-433DMを差してからifconfigコマンドを実行します。wlan0またはwlan1のうち新たに追加された方のMACアドレスを/etc/udev/rules.d/70-persistent-net.rules の二つ目の設定項目に記します。<br />
<br />
以上で、「オンボードのWifiデバイスがwlan0、WI-U2-433DMがwlan1」と固定されます。<br />
次に、/etc/network/interfaces を管理者権限のテキストエディタで開きます。
<br />
<pre class="prettyprint">$ sudo leafpad /etc/network/interfaces
</pre>
なお、NOOBS 3.2.1以降ではテキストエディタとしてleafpadではなくmousepadを用います。
<pre class="prettyprint">$ sudo mousepad /etc/network/interfaces
</pre>
このファイルの末尾に、下記の内容を追加して保存します。
<br />
<pre class="prettyprint">allow-hotplug wlan1
iface wlan1 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
</pre>
これは、「オンボードのWifiデバイス(wlan0)と同じ設定ファイルをWI-U2-433DM(wlan1)でも用いる」という設定です。<br />
<br />
以上の設定を行った後、デスクトップの右上のアイコンから「Turn Off Wifi」を選択し、オンボードのWifiデバイス(wlan0)だけを無効にします。
その状態でRaspberry Piを再起動すると、WI-U2-433DM(wlan1)で/etc/wpa_supplicant/wpa_supplicant.confの情報に基づいてWifi接続が行われます。
必要に応じてwpa_supplicant.confをテキストエディタで編集すると良いでしょう。<br />
<br />
<h4>
JessieでのWI-U2-433DMの設定</h4>
同様の内容をJessieで行う方法を記します。<br />
設定ファイル /lib/udev/rules.d/75-persistent-net-generator.rules を管理者権限のテキストエディタで開き、下記の太字部を追加して保存します。さらにRaspberry Piを再起動します。
<br />
<pre class="prettyprint"># device name whitelist
KERNEL!="ath*|msh*|ra*|sta*|ctc*|lcs*|hsi*<strong>|wlan*</strong>", \
GOTO="persistent_net_generator_end"
</pre>
再起動が終わると、/etc/udev/rules.d/70-persistent-net.rules というファイルが生成されています。
これを管理者権限のテキストエディタで開くと、下記のようになっています。
<br />
<pre class="prettyprint"># This file was automatically generated by the /lib/udev/write_net_rules
# program, run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single
# line, and change only the value of the NAME= key.
# Unknown net device (/devices/platform/soc/3f300000.mmc/mmc_host/mmc1/mmc1:0001/mmc1:0001:1/net/wlan0) (brcmfmac)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xx:xx:xx:xx:xx:xx", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="wlan*", NAME="wlan0"
# USB device 0x:0x (rtl8812au)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xx:xx:xx:xx:xx:xx", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="wlan*", NAME="wlan1"
</pre>
ATTR{address}の部分は人により異なるので伏字にしました。
「# Unknown net device」に対応するNAMEがwlan0、「# USB device 0x:0x (rtl8812au)」に対応するNAMEがwlan1となっていることがポイントで、前者がRaspberry Piのボード上のWifiデバイス、後者がWI-U2-433DMを指し、それぞれwlan0とwlan1に指定されています。この/etc/udev/rules.d/70-persistent-net.rules が存在することで、以後デバイスの名前が固定されます。wlan0とwlan1の名前を入れ替えたい場合は適切に編集して保存してください。
<br />
<br />
以上で、デバイス名の固定が完了しました。後は、二つのデバイスでネットワークの設定ファイルを分けるとよいでしょう。管理者権限のテキストエディタで /etc/network/interfaces を開きます。wlan0とwlan1とで同一の設定ファイル「/etc/wpa_supplicant/wpa_supplicant.conf」が指定されていることがわかります。この設定ファイルを二つのデバイスで別のものにするとか、あるいはボード上の無線LANデバイスwlan0についての設定3行をコメントアウトするなどが良いでしょう。
<br />
<pre class="prettyprint">allow-hotplug wlan0
iface wlan0 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
allow-hotplug wlan1
iface wlan1 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
</pre>
Raspberry Pi 3のボード上のWifiデバイスを無効にしたい場合、デスクトップ右上のメニューから「Turn Off Wifi」を選択して下さい。USBデバイスのみが有効になるはずです。
<br />
<br />
<br />
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/gp/product/4065193397/" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7DRwdHUOfdPJtPAeH0UiIjW1Bi0s94ukn5JFN1x56glI-jjGVy9HyIB1FKHC6cWh15bKybLLYJqhtFmsAMMjyrb3ahHlVpvR_xT7lqEqlvubJ14XBUZQehLFTWTT71WykdZIDNUIr24g/s1600/cover3.png" /></a></div>
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/dp/4062579502/" style="clear: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_dmvycn6QM24eV1ZEoT6lg2TVi108iFt8BG6P1znEj0HtuWPBdYA2KxnD_uy1gw8CZI0UVilZ6noZJbqpagWZmQz5_9iScdkNo_ugvjoFInSMcArrkAYxuOFxoticmpPb1ZvSTJ8S_EM/s1600/raspi2_bb.jpg" /></a></div>
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/dp/4065020522/" style="clear: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="145" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOsxLVgVnFI0m-FUJlBK_CqKYJC8dNo3zjk8MOMX2xcJO4omTyOy-aAh3mmqGzXm5P3hGgpkUpaQy-7j7oqdIXyLE2_y686CI2Eda8EMYhME0INhU6irK9jw8b3iUhq7ojs2rrPZrnJtw/s1600/mlbb_title_mini.png" /></a></div>
<br clear="all" />
<div>
「ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作」、「実例で学ぶRaspberry Pi電子工作」、「Raspberry Piではじめる機械学習」を執筆しました。</div>
Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com5tag:blogger.com,1999:blog-1209616351336364066.post-88302875822906451152015-05-01T20:19:00.000+09:002020-06-16T18:35:09.309+09:00Windows 10 IoTが載ったRaspberry Pi 2でLチカサンプルを動かしてみた<h3>
1. はじめに</h3>
<br />
4/30に、Raspberry Pi 2用のWindows 10 IoTが公開されました。インストールしてLチカサンプルを動かすところまで試してみましたので、手順をメモします。公開されているチュートリアルに書かれた通りに解説します。<br />
<br />
下図が最終的に動かしたサンプルですが、LEDの点滅と連動して画面上の丸も点灯し、その下のスクロールバーを動かすことで点滅の速さも変更できました。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjH-eXaZVTiQZJ0U6_oGWxq2J2DjL2kgJt7131GuFeK5OWJMrA5SCAnzEz2vTLLIqH529d1pYkzRg2YGMYffhwfV8SsgNvM43H_aL3Z-Vou0aivziuEDXu-oVCkCgF0DRALF75vUE91USU/s1600/2015-05-01+16.54.51.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjH-eXaZVTiQZJ0U6_oGWxq2J2DjL2kgJt7131GuFeK5OWJMrA5SCAnzEz2vTLLIqH529d1pYkzRg2YGMYffhwfV8SsgNvM43H_aL3Z-Vou0aivziuEDXu-oVCkCgF0DRALF75vUE91USU/s1600/2015-05-01+16.54.51.jpg" width="400" /></a></div>
<br />
<h3>
2. Raspberry Pi 2用マイクロSDカードへのWindows 10 IoTのインストール</h3>
<br />
手順→「<a href="http://ms-iot.github.io/content/win10/SetupRPI.htm" target="_blank">Windows IoT - SetupBoard</a>」<br />
<br />
<h4>
必要なもの</h4>
<ul>
<li>Windows 10 Insider Preview(build 10074)以降を搭載したPC(マイクロSDカードの読み書きができること)<br />
<br />
実機が必要です。私は古いLet's Note (CF-W8) にインストールしましたが、後にVisual Studio Community 2015 RCを入れることを考えると、パワーのあるPCの方が良いかもしれません。なお、このLet's Noteではタッチパッドに触れるとブルースクリーンになるなど、Windows 10にはまだ問題は多そうでした。なお、「<a href="http://ms-iot.github.io/content/win10/SetupRPI.htm" target="_blank">Windows IoT - SetupBoard</a>」では「build 10069以降」と書かれているのですが、後にインストールするVisual Studio Community 2015 RCではbuild 10074以降が要求されています。<br /><br />
</li>
<li>Raspberry Pi 2およびHDMIディスプレイ<br />
<br />
有線LANでネットワークに接続します。マイクロSDカードは8GB以上。キーボードとマウスは特にささなくても問題なさそうです。
</li>
</ul>
<br />
<h4>
Windows 10 IoTをマイクロSDカードに書き込む</h4>
<br />
PC上のWindows 10で下記の手順でマイクロSDカードを準備します。<br />
<ol>
<li><a href="http://connect.microsoft.com/windowsembeddedIoT/Downloads/DownloadDetails.aspx?DownloadID=57782" target="_blank">こちら</a>から、Windows_IoT_Core_RPI2_BUILD.zipをダウンロードし、展開します
</li>
<li>展開したフォルダにFlash.ffuというファイルがあることを確認します
</li>
<li>PCに8GB以上のマイクロSDカードを接続します(私は16GBのものを用いました)</li>
<li>管理者権限でコマンドプロンプトを起動し、Flash.ffuがあるフォルダまでcdコマンドで移動します
</li>
<li>移動先で、diskpartコマンドを実行し、DiskPartを起動します
<pre class="prettyprint">> diskpart
</pre>
</li>
<li>
DiskPart上でlist diskコマンドを実行し、マイクロSDカードのディスク番号を調べます(下図では3)
<pre class="prettyprint">DISKPART> list disk
</pre>
</li>
<li>
exitコマンドでDiskPartを終了します。
<pre class="prettyprint">DISKPART> exit
</pre>
</li>
<li>調べたディスク番号を使って、Flash.ffuをマイクロSDカードに書き込みます。下の図の赤丸で示されている通り、「ディスク<span style="color: red;">3</span>」だったら「PhysicalDrive<span style="color: red;">3</span>」を指定する、という要領です。<div style="border: #888888 solid 1px; margin: 15px 0px 15px 0px;">
<pre style="margin: 0px;"><span style="color: black;">> dism.exe /Apply-Image /ImageFile:flash.ffu /ApplyDrive:\\.\PhysicalDrive<span style="color: red;">3</span> /SkipPlatformCheck</span></pre>
</div>
</li>
<li>書き込みが100%に達したら、Windowsの安全な取り外しを行ってからマイクロSDカードを抜き、Raspberry Pi 2にセットします。
</li>
</ol>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbUAtKtG7omXxPSHtDmkJl1QbvHJqq4e1BNKtvTBVyT2mCNaDbozH56xUV4bJn2_1VEWBPlJK-MRjBA_IzX_jjH5G3quooeScGWRNtcOSatC3MfJsssjuP7TQnDysB1yko-ezXYI6dVqk/s1600/RPiWinIoT01mod.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="227" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbUAtKtG7omXxPSHtDmkJl1QbvHJqq4e1BNKtvTBVyT2mCNaDbozH56xUV4bJn2_1VEWBPlJK-MRjBA_IzX_jjH5G3quooeScGWRNtcOSatC3MfJsssjuP7TQnDysB1yko-ezXYI6dVqk/s1600/RPiWinIoT01mod.png" width="400" /></a></div>
<br />
<br />
<h3>
3. Raspberry Pi 2の起動とWindows 10からの接続</h3>
<br />
手順→「<a href="http://ms-iot.github.io/content/win10/SetupRPI.htm" target="_blank">Windows IoT - SetupBoard</a>」および「<a href="http://ms-iot.github.io/content/win10/samples/PowerShell.htm" target="_blank">Using PowerShell to connect and configure a device running Windows IoT Core</a>」<br />
<br />
Raspberry Pi 2にマイクロSDカードをセットしたら、有線LAN、HDMIディスプレイを接続した上で電源を投入します。数分待つと、最終的に手順のページでも見られる下記のページまでたどりつきます。なお、相性の悪いディスプレイでは画面が乱れるということがあったため、相性の良いディスプレイに変更することで対処しました。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7Qhbw0ALySxVFhP8MG7vOfTCw-fs5TAleHHBtVjP3XlmhD5IIkwgl2Jbvm8WkO0SwbX9-X4qHt2igp3PWDDl06I7rkjJzCmF4TbnJhEFciUc-J-YYYFZJ22MgfYd9uFN2dDErUwhYsH4/s1600/2015-04-30+18.24.29.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7Qhbw0ALySxVFhP8MG7vOfTCw-fs5TAleHHBtVjP3XlmhD5IIkwgl2Jbvm8WkO0SwbX9-X4qHt2igp3PWDDl06I7rkjJzCmF4TbnJhEFciUc-J-YYYFZJ22MgfYd9uFN2dDErUwhYsH4/s1600/2015-04-30+18.24.29.jpg" width="400" /></a></div>
<br />
なお、画面右上に見える電源ボタン、右下に見える設定ボタンは、Raspberry Pi 2に接続したマウスでクリックすることができるのですが、マウスにも相性があるようで、手持ちのマウスで操作できるものは多くはありませんでした。<br />
<br />
下図左側がRaspberry Pi 2を操作できなかったマウス、右側が操作できたマウスです。メーカーによる傾向などはあまりありません。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUwOqV9z86oxr25huYI-9sW-gb2FN8XLtPwlkyqLjwo7IR7FLGrDCioqiyFpnKdw8N6VKlDlDNMdUG4Z-bSTA9dbbSsr7trL5N3LqaqJiuZAczZYxxO4Jkpj2I-ugbow4TH6PwYsl50Eo/s1600/IMG_20150501_113032.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUwOqV9z86oxr25huYI-9sW-gb2FN8XLtPwlkyqLjwo7IR7FLGrDCioqiyFpnKdw8N6VKlDlDNMdUG4Z-bSTA9dbbSsr7trL5N3LqaqJiuZAczZYxxO4Jkpj2I-ugbow4TH6PwYsl50Eo/s1600/IMG_20150501_113032.jpg" width="400" /></a></div>
<br />
ただし、マウスで操作できなくても、Lチカ自体は行えますので先に進みます。<br />
<br />
さて、この状態のRaspberry Pi 2に、Windows 10 PCからリモート接続してみることにします。<br />
<br />
<ol>
<li>PowerShellを管理者権限で起動します(検索窓にPowerShellと入力すると現れます)
</li>
<li>PowerShell上で下記を実行し、WinRMを起動します。
<pre class="prettyprint">> net start WinRM
</pre>
</li>
<li>PowerShell上で下記を実行します。Raspberry Pi 2のIPアドレスはディスプレイに表示されています。確認には「Y」と答えます<pre class="prettyprint">> Set-Item WSMan:\localhost\Client\TrustedHosts -Value (Raspberry Pi 2のIPアドレス)
</pre>
</li>
<li>PowerShell上で下記を実行すると、Raspberry Pi 2上のWindows 10 IoTにログインできます。デフォルトパスワードは「p@ssw0rd」です。<pre class="prettyprint">> Enter-PsSession -ComputerName (Raspberry Pi 2のIPアドレス) -Credential (Raspberry Pi 2のIPアドレス)\Administrator
</pre>
</li>
</ol>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjf5UPGQRxpa73uMsy6DQB6QkdYeByLkZscc4uYKfsGPDUKbgGYlmrO3UF8E5Dp0K64N4ooK2afn8tMIR1xaexCChb88Nh0aXqZmhgcMP6OjMJ37kRT89M8hACvi6O29ua2RbRifELZvB8/s1600/RPiWinIoT03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="227" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjf5UPGQRxpa73uMsy6DQB6QkdYeByLkZscc4uYKfsGPDUKbgGYlmrO3UF8E5Dp0K64N4ooK2afn8tMIR1xaexCChb88Nh0aXqZmhgcMP6OjMJ37kRT89M8hACvi6O29ua2RbRifELZvB8/s1600/RPiWinIoT03.png" width="400" /></a></div>
<br />
この状態でRaspberry Pi 2に対して様々な設定が行えますので、「<a href="http://ms-iot.github.io/content/win10/samples/PowerShell.htm" target="_blank">Using PowerShell to connect and configure a device running Windows IoT Core</a>」を参考にしてみてください。<br />
<br />
ここでは、Windows 10 PCに対するVisual Studio Community 2015 RCのインストールに入っていきます。<br />
<br />
<h3>
4. Visual Studio Community 2015 RCのインストールと設定</h3>
<br />
手順→「<a href="http://ms-iot.github.io/content/win10/SetupPC.htm" target="_blank">Windows IoT - Setup your PC for Raspberry Pi 2</a>」および「<a href="https://msdn.microsoft.com/library/windows/apps/xaml/dn706236.aspx?f=255&MSPPError=-2147217396" target="_blank">Enable your device for development</a>」<br />
<br />
Windows 10がインストールされたPCに、Visual Studio Community 2015 RCをインストールしていきます。<br />
<ol>
<li>「<a href="https://dev.windows.com/en-US/downloads/install-dev-tools-visual-studio-2015" target="_blank">Steps to install Windows 10 development tools for Visual Studio 2015 RC</a>」の左下にある「Get the tools」ボタンをクリックします。VSToolsForWindows.exeがダウンロードされますので、インストールします。Community版がインストールされますが、Professional版が良い場合は、リンク先の解説に従ってください。<br /><br />なお、「Universal Windows App Development Tools」というものをインストールしなければならないのですが、VSToolsForWindows.exeを「typical」でインストールしたら自動的にインストールされました。インストール後にコントロールパネルの「プログラムのアンインストールまたは変更」で「Microsoft Visual Studio Community 2015 RC」のインストール項目を調べてみると、
下図のように確かに「Universal Windows App Development Tools」がインストールされていました。<br /><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfLiDUy4l2NH1bifWg-oyckuG4zdngVT3Bc6pZgb3rF2u7mto3PFOoGjpLvKjHB1GXwTDqDOjYgAVCirPSqY948lpDCc7iqm2SNJAdYo8exEo1grUduN1GvQhvBoVC0APO8-bZdf_2ZvY/s1600/RPiWinIoT06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfLiDUy4l2NH1bifWg-oyckuG4zdngVT3Bc6pZgb3rF2u7mto3PFOoGjpLvKjHB1GXwTDqDOjYgAVCirPSqY948lpDCc7iqm2SNJAdYo8exEo1grUduN1GvQhvBoVC0APO8-bZdf_2ZvY/s1600/RPiWinIoT06.png" width="228" /></a></div>
<br />
</li>
<li>次に、Windows appの開発用にWindows 10をアンロックします。まず、検索ウインドウでGpedit.mscと入力し、現れたローカルグループポリシーエディターを管理者権限で起動します(エラーがでますが気にせず先に進みました)。そして
「ローカルコンピュータポリシー」→「コンピューターの構成」→「管理用テンプレート」→「Windowsコンポーネント」→「アプリパッケージの展開」と辿り、中にある「Allows development of Windows Store applications and installing(略)」と「信頼できるすべてのアプリのインストールを許可する」を有効にします<br /><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdywy-avo_2tRYZb8TYfU0vDoGzEdMFdgRZKm9VKkfFZ6gOwctDXqrqiMy5iQLWJv_Pwmn0NILbVXTKZ3elf4C2rB7PusOZqlkox7A6zSfTF9BpjEum4VaxR95Idb_2AbyV0XwJvhSUJM/s1600/RPiWinIoT09mod.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="283" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdywy-avo_2tRYZb8TYfU0vDoGzEdMFdgRZKm9VKkfFZ6gOwctDXqrqiMy5iQLWJv_Pwmn0NILbVXTKZ3elf4C2rB7PusOZqlkox7A6zSfTF9BpjEum4VaxR95Idb_2AbyV0XwJvhSUJM/s1600/RPiWinIoT09mod.png" width="400" /></a></div>
<br />
</li>
<li>最後に、Windows_IoT_Core_RPI2_BUILD.zipに含まれていたWindowsDeveloperProgramForIoT.msiをインストールします。なお、これにより「Windows IoT Core Watcher」というアプリケーションがインストールされ、自動起動するはずなのですが(スナップショットが「<a href="http://ms-iot.github.io/content/win10/SetupPC.htm" target="_blank">Windows IoT - Setup your PC for Raspberry Pi 2</a>」にあります)、私の環境では起動しませんでした。それでもVisual StudioからRaspberry Pi 2へのアプリケーションのインストールはできましたので、ここでは気にせず先に進むことにします。</li>
</ol>
<h3>
5. サンプルアプリケーションのダウンロードと実行</h3>
<br />
手順→「<a href="http://ms-iot.github.io/content/win10/samples/Blinky.htm" target="_blank">Blinky Sample</a>」および「<a href="http://ms-iot.github.io/content/win10/samples/HelloWorld.htm" target="_blank">‘Hello, World!’ Sample</a>」<br />
<br />
Lチカのサンプル「<a href="https://github.com/ms-iot/samples/tree/develop/Blinky" target="_blank">Blinky</a>」のC#版を試してみます。「<a href="https://github.com/ms-iot/samples/tree/develop/Blinky" target="_blank">Blinky</a>」ページに作るべき回路が示されているので、あらかじめ作成しておきます。3.3VピンとGPIO 5でLEDと抵抗の直列接続をはさむ回路になっており、GPIO 5がLOWのときにLEDが点灯する回路です。<br />
<div>
<br /></div>
ファイルは、「<a href="https://github.com/ms-iot/samples" target="_blank">ms-iot/samples</a>」の「Download ZIP」ボタンにより全てのサンプルをダウンロードしてしまうのが簡単でしょう。<br />
<br />
展開後に現れる「samples/Blinky/CS/Blinky.csproj」がVisutal Studio Community 2015 RCで開くべきプロジェクトファイルになります。<br />
<br />
開いたときの様子が下図です。図のように、MainPage.xaml.csにメインの処理が記述されています。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLOKDa0VK1f2llakHnYNVDT_4RMsiGkM_LUzu1xruOrAAr3PgYgA-S1aUTxvY5I0iTfOfR6hDun1WMQ8MVebqqpTMxwKVoyTmNuwEYNiRCBPNuLtNF5ziyQ4ypnVH-JZFPOLV4QGKdpk0/s1600/RPiWinIoT10mod.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="287" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLOKDa0VK1f2llakHnYNVDT_4RMsiGkM_LUzu1xruOrAAr3PgYgA-S1aUTxvY5I0iTfOfR6hDun1WMQ8MVebqqpTMxwKVoyTmNuwEYNiRCBPNuLtNF5ziyQ4ypnVH-JZFPOLV4QGKdpk0/s1600/RPiWinIoT10mod.png" width="400" /></a></div>
<br />
これをRasbperry Pi 2で実行するには、「<a href="http://ms-iot.github.io/content/win10/samples/HelloWorld.htm" target="_blank">‘Hello, World!’ Sample</a>」に示されているように、ターゲットを設定する必要があります。<br />
<br />
下図のように、「Device」を「Remote Machine」に変更します。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgExj9afHpOeOtQB63QxXmfEU60t7MC7Z1F0ug8ONdstwuATyE7HQy1CGd9cbOjCb-jD3K0vFO8thTpK3T6pXpOEhMpwWfrytt7OGcydhspfEPiCAI9kDtD0c438wNtF6BT6E2uwUl6WnM/s1600/RPiWinIoT13mod.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="137" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgExj9afHpOeOtQB63QxXmfEU60t7MC7Z1F0ug8ONdstwuATyE7HQy1CGd9cbOjCb-jD3K0vFO8thTpK3T6pXpOEhMpwWfrytt7OGcydhspfEPiCAI9kDtD0c438wNtF6BT6E2uwUl6WnM/s1600/RPiWinIoT13mod.png" width="320" /></a></div>
<br />
すると、下記のようなダイアログが現れるので、<br />
<br />
<ul>
<li>Address:Raspberry Pi 2のIPアドレス</li>
<li>Authentification Mode:None</li>
</ul>
<div>
と変更して、Selectをクリックします。</div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2gxTSRCOjIE4w-0IblmFR86nOmVjJ8PAyvAk2R8WPDnmaxxuOH17t-9NYBy-7IiRHHlRM8clSONYWJ6vUDQOudtRDKMb5ojEXZZKKBkl0EamT96h-R_ZYp0rN5HIRhBY0qXGQYXBTDSU/s1600/RPiWinIoT11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2gxTSRCOjIE4w-0IblmFR86nOmVjJ8PAyvAk2R8WPDnmaxxuOH17t-9NYBy-7IiRHHlRM8clSONYWJ6vUDQOudtRDKMb5ojEXZZKKBkl0EamT96h-R_ZYp0rN5HIRhBY0qXGQYXBTDSU/s1600/RPiWinIoT11.png" width="250" /></a></div>
<br />
その状態でアプリケーションを実行すると、それなりの時間待たされた後、アプリケーションがRaspberry Pi 2にインストールされ、冒頭の写真のように実行されます。<br />
<br />
お疲れ様でした。<br />
<br />
<br />
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/gp/product/4065193397/" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7DRwdHUOfdPJtPAeH0UiIjW1Bi0s94ukn5JFN1x56glI-jjGVy9HyIB1FKHC6cWh15bKybLLYJqhtFmsAMMjyrb3ahHlVpvR_xT7lqEqlvubJ14XBUZQehLFTWTT71WykdZIDNUIr24g/s1600/cover3.png" /></a></div>
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/dp/4062579502/" style="clear: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_dmvycn6QM24eV1ZEoT6lg2TVi108iFt8BG6P1znEj0HtuWPBdYA2KxnD_uy1gw8CZI0UVilZ6noZJbqpagWZmQz5_9iScdkNo_ugvjoFInSMcArrkAYxuOFxoticmpPb1ZvSTJ8S_EM/s1600/raspi2_bb.jpg" /></a></div>
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/dp/4065020522/" style="clear: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="145" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOsxLVgVnFI0m-FUJlBK_CqKYJC8dNo3zjk8MOMX2xcJO4omTyOy-aAh3mmqGzXm5P3hGgpkUpaQy-7j7oqdIXyLE2_y686CI2Eda8EMYhME0INhU6irK9jw8b3iUhq7ojs2rrPZrnJtw/s1600/mlbb_title_mini.png" /></a></div>
<br clear="all" />
<div>
「ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作」、「実例で学ぶRaspberry Pi電子工作」、「Raspberry Piではじめる機械学習」を執筆しました。</div>Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com0tag:blogger.com,1999:blog-1209616351336364066.post-41559922570252106292015-04-20T21:47:00.000+09:002020-06-16T18:35:27.182+09:00Lapdock for Motorola Atrixを使ってRaspberry Pi 2をモバイルPCにしてみた<h3>
はじめに</h3>
最近、仕事でRaspberry Piのデスクトップ環境を使う機会が増えているのですが、HDMI液晶ディスプレイ、キーボード、マウスを常に用意しておくのは場所をとるのであまり嬉しくありません。<br />
<br />
省スペース化する何かいい方法はないかと調べてみると、海外で販売されているスマートフォン用ドック「Lapdock for Motorola Atrix」をRaspberry Piで使うというのがメジャーなようで、ksksueさんによる下記のページが非常によくまとまっていましたので参考にさせて頂きました。<br />
<ul>
<li><a href="http://d.hatena.ne.jp/ksksue/touch/20130707/1373204783" target="_blank">Beaglebone BlackやRaspberry Piを使うときのオススメガジェット Lapdock(ksksueさん)</a></li>
</ul>
最終的には、下記のようにRaspberry Piと補助基板をこのLapdockの背面に貼り付け、モバイルPCのように使えるようにしてみました。LapdockとRapsberry Piの両方をバッテリー駆動できていますので、移動中に膝に乗せて使うことも可能です。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwETZMS-V0Et5VVVguT6JvFHRjWFnkpQtkjzoo0Tbv5LbfK-HR9ojLOQsXVlvltNUZF_ZmX2pEfC5k-hPe-okttOYpjm_SG3BtqymyfP2y2hEniMpAqNShVvuY-IC6khZxHIWHjmkWRcs/s1600/2016-02-11+02.20.17.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwETZMS-V0Et5VVVguT6JvFHRjWFnkpQtkjzoo0Tbv5LbfK-HR9ojLOQsXVlvltNUZF_ZmX2pEfC5k-hPe-okttOYpjm_SG3BtqymyfP2y2hEniMpAqNShVvuY-IC6khZxHIWHjmkWRcs/s400/2016-02-11+02.20.17.jpg" width="400" /></a></div>
<br />
背面に貼り付けず、もう少し配線が見えるようにした写真が下図です。
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkdZaIO9fbUEOsjA44ocwxjuMHajPLQ3O0iGZTlt5RYo0Jk-3DqC43NPulSiXem-V7aZhcHgW81KLff5hLsyi3tGNLeC0h1qbJ76UpRzCdFt2n9ydDSSbFh1ecgVs4cuhXJTXCcIuLgyE/s1600/2015-04-18+23.42.22.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkdZaIO9fbUEOsjA44ocwxjuMHajPLQ3O0iGZTlt5RYo0Jk-3DqC43NPulSiXem-V7aZhcHgW81KLff5hLsyi3tGNLeC0h1qbJ76UpRzCdFt2n9ydDSSbFh1ecgVs4cuhXJTXCcIuLgyE/s400/2015-04-18+23.42.22.jpg" width="400" /></a></div>
<br />
<h3>
手順</h3>
Lapdock for Motorola Atrixは、<a href="http://www.ebay.com/" target="_blank">ebay</a>を検索し、「Buy It Now(ヤフオクでいういますぐ落札)」でInternational Shippingが可能なものを探すとイスラエル発送のものが最安値だったのでそちらで注文しました。<br />
<br />
またこのLapdockをRaspberry Piに接続するためにはいくつか必要なケーブルやコネクタなどがあり、これらも全て「<a href="http://d.hatena.ne.jp/ksksue/touch/20130707/1373204783" target="_blank">Beaglebone BlackやRaspberry Piを使うときのオススメガジェット Lapdock(ksksueさん)</a>」で紹介されているものを購入しました。<br />
<br />
LapdockとRaspberry Piの接続の概略は下図(A)のようになります。旧型のRaspberry Pi Model A/BではLapdockのUSBをRaspberry PiのUSB端子に接続するだけでRaspberry Piが起動しました。これはLapdockのUSB端子にスマートフォン充電用の5Vが供給されているからですが、Raspberry Pi Model A/BがUSB端子からの給電で起動するのは今回初めて知りました。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCWObUmvcfRjo02ExbdNiXGu3RsaWLJ4bbnWXmHXqwiFe2XyS_871ppxLciATsa3-YDIneLHzy3NrvYjKltdccoZXoDkK5X3WRhaa8pqwWTP9fPZodGoJHXaVFU2ALaaVPJ4vE9iF0Ejs/s1600/connection.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="140" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCWObUmvcfRjo02ExbdNiXGu3RsaWLJ4bbnWXmHXqwiFe2XyS_871ppxLciATsa3-YDIneLHzy3NrvYjKltdccoZXoDkK5X3WRhaa8pqwWTP9fPZodGoJHXaVFU2ALaaVPJ4vE9iF0Ejs/s1600/connection.png" width="400" /></a></div>
<br />
しかし、Raspberry Pi Model A+/B+やRaspberry Pi 2では下図(A)のように別途5Vの電源を接続しなければRaspberry Piは起動しません。すると、図(A)の通りLapdockとRaspberry Piとで2系統の電源が必要になり、あまりスマートではありません。<br />
<br />
そこで、図(B)のように、LapdockのUSB端子からの信号を電源とUSB信号の2つに分配し、外部電源をLapdockの1系統に統一することにします。Lapdockにはバッテリーも搭載されているため、アダプタを接続しない状態でもRaspberry Piに給電することができ、モバイルでの利用も可能になります。<br />
<br />
参考にしたのはYouTube動画「<a href="https://www.youtube.com/watch?v=yZkz_a52I6s" target="_blank">Raspberry Pi Laptop with Atrix 4G Dock (by Adafruit Industries)</a>」ですが、この動画の通りにケーブルを分割するのは少し面倒です。なるべく作業を楽にするため、簡単な補助基板を作成することにしました。必要なものは下記のとおりです。<br />
<ul>
<li><a href="http://akizukidenshi.com/catalog/g/gC-00160/" target="_blank">基板取付用USBコネクタ(Aタイプ メス)</a>:2個</li>
<li><a href="http://akizukidenshi.com/catalog/g/gK-06656/" target="_blank">ブレッドボード用マイクロBメスUSBコネクタDIP化キット</a>:1個</li>
<li>その他:ホットボンド、ユニバーサル基板、配線</li>
</ul>
これらを下図のように配線します。なお、AタイプのUSBコネクタですが、4つの端子を基板にはんだづけするだけではグラグラして不安定なので、ホットボンドで基板に固定しました。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDVUhUDHIaUUdiBvWDqA3QzV1yEXYSIjGxDOYRgreM9wsHKexF266-wlHrR9YPqHOXgMXbgNuNQITpuMWzaMUMIoHbpMkFNd4za5ar2bJCEIHbgRAsQTyS68g0JbqyO9MXgCej4foIivo/s1600/circuit_all.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="325" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDVUhUDHIaUUdiBvWDqA3QzV1yEXYSIjGxDOYRgreM9wsHKexF266-wlHrR9YPqHOXgMXbgNuNQITpuMWzaMUMIoHbpMkFNd4za5ar2bJCEIHbgRAsQTyS68g0JbqyO9MXgCej4foIivo/s400/circuit_all.png" width="400" /></a></div>
<br />
補助基板が完成したら、Raspberry Piの5V電源とUSB端子との両方に接続しますが、どちらも市販の「USB(A)オス-USB(Micro B)オス」ケーブルを用いることができます(冒頭の2枚めの図をよく見ると接続の様子が見えます)。<br />
<br />
以上でRaspberry Piをモバイルで利用することが可能になりました。必要な物品の一覧は下図のようになります。最もかさばるのは左上に見えるLapdockのアダプタですが、バッテリーで動作させるならばこのアダプタは不要です。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaxces08xy8B0YoiJppBY94Ad1ycFPpwwwhwWXmTFFeTmh7lU1vTLNJuzXZ7rmAnk9GhgoqADe8esOr1sIwvSoCJEzo0c4y2L3D_lSlaH64-EaOHvc6v7G7FkE-SS7c0pMGtqYJRbDQx4/s1600/2015-04-20+01.06.34.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaxces08xy8B0YoiJppBY94Ad1ycFPpwwwhwWXmTFFeTmh7lU1vTLNJuzXZ7rmAnk9GhgoqADe8esOr1sIwvSoCJEzo0c4y2L3D_lSlaH64-EaOHvc6v7G7FkE-SS7c0pMGtqYJRbDQx4/s400/2015-04-20+01.06.34.jpg" width="400" /></a></div>
<br />
さらに、冒頭で述べたように、ケーブル類やRaspberry Pi本体をLapdockの背面に貼り付けると、さらに快適になりました。Raspberry PiをノートPC化する<a href="http://neuralassembly.blogspot.jp/2015/11/raspberry-pipcpi-top.html" target="_blank">Pi-Topも持っていますが</a>、キーボードがまともな分、このLapdockの方が断然使いやすいですね。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwETZMS-V0Et5VVVguT6JvFHRjWFnkpQtkjzoo0Tbv5LbfK-HR9ojLOQsXVlvltNUZF_ZmX2pEfC5k-hPe-okttOYpjm_SG3BtqymyfP2y2hEniMpAqNShVvuY-IC6khZxHIWHjmkWRcs/s1600/2016-02-11+02.20.17.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwETZMS-V0Et5VVVguT6JvFHRjWFnkpQtkjzoo0Tbv5LbfK-HR9ojLOQsXVlvltNUZF_ZmX2pEfC5k-hPe-okttOYpjm_SG3BtqymyfP2y2hEniMpAqNShVvuY-IC6khZxHIWHjmkWRcs/s400/2016-02-11+02.20.17.jpg" width="400" /></a></div>
<br />
作り方は単純で、例えば<a href="http://www.amazon.co.jp/dp/B00535JKOO/" target="_blank">こんな感じ</a>の耐震マットで
<br />
<ul>
<li>ケース入りのRaspberry Pi</li>
<li>上記の自作基板</li>
</ul>
<div>
を背面に貼り付けているだけです。ただし、ユニバーサル基板には耐震マットはほとんど貼りつかないので、基板にプラ板などをネジ止めし、そのプラ板を貼りつけるようにしています。</div>
<div>
<br /></div>
<div>
なお、短くてやわらかいHDMIケーブルが必要になったので、米amazonで<a href="http://www.amazon.com/gp/product/B00474YRE0" target="_blank">こちら</a>を購入してみました。日本でも似たようなものは売ってないでしょうか?<br />
<br />
<h3>
おわりに</h3>
</div>
もちろん、Raspberry PiだけではなくBeagleBone BlackやOdroidなども起動できます(下図はOdorid U3)。スタバでLinuxボードでドヤリングしたい方は是非。
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirvxX8qaXULEolFXnS0NhoHuBX2XzKHh8NGSBeO5XY49DvWGgPI-E3m9LytB5uWlPmudwtZRJxE-DCqZKihbO97KxAbhugqgXR0Q5Ulvu9qPmS31pGD59sAzSXu8zXLQ0AGf4YGtPXMyg/s1600/2015-04-20+11.20.19.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirvxX8qaXULEolFXnS0NhoHuBX2XzKHh8NGSBeO5XY49DvWGgPI-E3m9LytB5uWlPmudwtZRJxE-DCqZKihbO97KxAbhugqgXR0Q5Ulvu9qPmS31pGD59sAzSXu8zXLQ0AGf4YGtPXMyg/s400/2015-04-20+11.20.19.jpg" width="400" /></a></div>
<br />
<br />
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/gp/product/4065193397/" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7DRwdHUOfdPJtPAeH0UiIjW1Bi0s94ukn5JFN1x56glI-jjGVy9HyIB1FKHC6cWh15bKybLLYJqhtFmsAMMjyrb3ahHlVpvR_xT7lqEqlvubJ14XBUZQehLFTWTT71WykdZIDNUIr24g/s1600/cover3.png" /></a></div>
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/dp/4062579502/" style="clear: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_dmvycn6QM24eV1ZEoT6lg2TVi108iFt8BG6P1znEj0HtuWPBdYA2KxnD_uy1gw8CZI0UVilZ6noZJbqpagWZmQz5_9iScdkNo_ugvjoFInSMcArrkAYxuOFxoticmpPb1ZvSTJ8S_EM/s1600/raspi2_bb.jpg" /></a></div>
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/dp/4065020522/" style="clear: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="145" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOsxLVgVnFI0m-FUJlBK_CqKYJC8dNo3zjk8MOMX2xcJO4omTyOy-aAh3mmqGzXm5P3hGgpkUpaQy-7j7oqdIXyLE2_y686CI2Eda8EMYhME0INhU6irK9jw8b3iUhq7ojs2rrPZrnJtw/s1600/mlbb_title_mini.png" /></a></div>
<br clear="all" />
<div>
「ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作」、「実例で学ぶRaspberry Pi電子工作」、「Raspberry Piではじめる機械学習」を執筆しました。</div>Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com0tag:blogger.com,1999:blog-1209616351336364066.post-67573910310188942582015-02-28T12:28:00.001+09:002017-03-13T17:36:10.460+09:00Intel Edison備忘録<h4>
はじめに</h4>
Intel Edisonについての過去の投稿の内容を久しぶりにアップデートをしようとして、ログイン方法すら思い出せず途方にくれることがありました。<br />
<ul>
<li><a href="http://neuralassembly.blogspot.com/2014/12/intel-edisonwebmjpg-streamer.html" target="_blank">Intel EdisonでWebカメラを有効にしmjpg-streamerで映像を配信してみた</a></li>
<li><a href="http://neuralassembly.blogspot.com/2014/12/intel-edison.html" target="_blank">Intel Edisonで映像配信中のカメラのパン・チルトを制御してみた</a></li>
</ul>
そこで、自分用のメモを残すことにしてみました。<br />
<br />
用いるのはIntelが配布しているYocto Linuxとします。<br />
<br />
<h3>
ユーザー名とパスワード</h3>
<ul>
<li>ユーザー名:root</li>
<li>パスワード:なし</li>
</ul>
<div>
<br /></div>
<h3>
タイムゾーンの設定</h3>
参考:<a href="http://www.ebimemo.net/diary/?date=20030207" target="_blank">えびめも</a>
<br />
<pre class="prettyprint"># rm -f /etc/localtime
# ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
</pre>
<br />
<h3>
時刻の設定</h3>
参考:<a href="http://www.ebimemo.net/diary/?date=20030207" target="_blank">えびめも</a>
<br />
<pre class="prettyprint"># date -s "2014.12.3-15:55:00"
</pre>
<br />
<h3>
usb0のネットワークを変更する</h3>
usb0ではデフォルトで192.168.2.15/24が使われますが、これが既存のネットワークとかぶる場合、/etc/systemd/network/usb0.network内下記の行を書き換えます。
<br />
<pre class="prettyprint">Address=192.168.2.15/24
</pre>
<br />
<h3>
名前、Wifi接続などの設定</h3>
参考:<a href="http://trac.switch-science.com/wiki/IntelEdisonStartGeneric" target="_blank">スイッチサイエンス</a>
<br />
<pre class="prettyprint"># configure_edison --setup
</pre>
これを複数回実行すると、ネットワークの設定が/etc/wpa_supplicant/wpa_supplicant.conf にどんどん追記されていくので、削除したい場合はファイルを直接編集します。<br />
<br />
<h3>
IPアドレス固定</h3>
参考:<a href="https://communities.intel.com/message/262955" target="_blank">Intelのフォーラム</a><br />
/etc/wpa_supplicant/wpa_cli-actions.shにて、下記のようにudhcpcを起動している部分を見つけてコメントアウトし、2行追加します。下記の例は、192.168.1.2に固定する場合を示しています。
<br />
<pre class="prettyprint">if [ "$CMD" = "CONNECTED" ]; then
kill_daemon udhcpc /var/run/udhcpc-$IFNAME.pid
# udhcpc -i $IFNAME -p /var/run/udhcpc-$IFNAME.pid -S
ifconfig $IFNAME 192.168.1.2 netmask 255.255.255.0
route add default gw 192.168.1.1
fi
</pre>
<br />
<h3>
proxy設定</h3>
参考:<a href="http://wiki.openwrt.org/doc/techref/opkg" target="_blank">OpenWrt</a><br />
/etc/opkg/opkg.confに、下記の例のような行を追加します(サンプルが中にあるので真似します)。
<br />
<pre class="prettyprint">option http_proxy http://proxyサーバー名:ポート番号/
option ftp_proxy ftp://proxyサーバー名:ポート番号/
</pre>
これで、下記が通るはずです。
<br />
<pre class="prettyprint">opkg update
opkg upgrade
</pre>
他のコマンド用に、.profile にも下記を記入して保存します。
<br />
<pre class="prettyprint">export http_proxy=http://proxyサーバー名:ポート番号/
export https_proxy=https://proxyサーバー名:ポート番号/
export ftp_proxy=ftp://proxyサーバー名:ポート番号/
</pre>
<br />
<h3>
sshによるログイン可能に</h3>
参考:<a href="http://trac.switch-science.com/wiki/IntelEdisonSSH" target="_blank">スイッチサイエンス</a><br />
外部からIntel Edisonにsshでログインできなくなった場合、/lib/systemd/system/sshd.socket 内の1行を下記のようにコメントアウトします。
<br />
<pre class="prettyprint">#BindToDevice=usb0
</pre>
<br />
<!--
<h3>
OSアップグレード</h3>
vi /etc/opkg/myfeeds.conf<br />
<br />
<pre class="prettyprint">src intel-iotdk http://iotdk.intel.com/repos/1.1/intelgalactic
src all http://iotdk.intel.com/repos/1.1/iotdk/all
src i586 http://iotdk.intel.com/repos/1.1/iotdk/i586
src x86 http://iotdk.intel.com/repos/1.1/iotdk/x86
</pre>
<br />
<h3>
ディスクが減ることの対策</h3>
<pre class="prettyprint">umount /etc/machine-id
systemd-machine-id-setup
rm -rf /var/log/journal/*
reboot
</pre>
-->Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com0tag:blogger.com,1999:blog-1209616351336364066.post-57924872556342405252014-12-12T20:51:00.000+09:002017-03-13T17:37:47.929+09:00Intel Edisonで映像配信中のカメラのパン・チルトを制御してみた<h3>
はじめに</h3>
<br />
<ul>
<li><a href="http://neuralassembly.blogspot.com/2014/12/intel-edisonwebmjpg-streamer.html" target="_blank">Intel EdisonでWebカメラを有効にしmjpg-streamerで映像を配信してみた </a></li>
</ul>
<br />
にて、Intel EdisonにてWebカメラを有効にし、mjpg-streamerで映像を配信してみました。<br />
<br />
今回は、Intel Edisonを使ったデモとして、そのWebカメラにサーボモーターを2つ取り付け、Web経由でパン・チルト(水平方向と垂直方向)を制御してみました。<br />
<br />
全体像は下図のようになります。カメラの他は、Intel Edison Breakout Board、レギュレータやレベルシフタを含む周辺回路、バッテリー(Eneloop Pro6本)が見えます。<br />
<br />
コントローラーはPC、タブレット、スマートフォンなどのブラウザです。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHeWumQTtKUVuYXFdk_wFo8UtGzFPrKSzDub4dbBY69MfEK1stjKXiOhlHuxg49pHYXByZJm1nkcdn7yb17kRVgZNCfNtibfS51jOlXZUqbC80P_kDTEe9DkAaV41lWAsTDE7AXHtW0MU/s1600/IMG_20141212_112439.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHeWumQTtKUVuYXFdk_wFo8UtGzFPrKSzDub4dbBY69MfEK1stjKXiOhlHuxg49pHYXByZJm1nkcdn7yb17kRVgZNCfNtibfS51jOlXZUqbC80P_kDTEe9DkAaV41lWAsTDE7AXHtW0MU/s1600/IMG_20141212_112439.jpg" width="320" /></a></div>
<br />
<br />
動作状況の動画はこちらになります。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="allowfullscreen" frameborder="0" height="290" src="https://www.youtube.com/embed/iMIQoqMRbHY?rel=0" width="420"></iframe>
</div>
<br />
<br />
<br />
<h3>
カメラ雲台の準備</h3>
カメラとサーボモータ2つを接続する方法ですが、なるべく楽をしたかったので、秋月電子通商にある<br />
<br />
<ul>
<li><a href="http://akizukidenshi.com/catalog/g/gM-07186/" target="_blank">Web Cam 3-axis Servo Kit for Real Time Video for pcDuino</a></li>
</ul>
<br />
を用いました。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidRn11G97IZcV3jh-3lTKeaazC3oQisHYf49g4lA-blV1IewYGHf1-2497u-XzqBEYpn6HBpxud7KlTsxqTCP5nETLRAFabKBP2ehxqwMmHLq9PnzYPzdAnL2LDGaT5qdhGJX1MjPMBzY/s1600/IMG_20141212_112609.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidRn11G97IZcV3jh-3lTKeaazC3oQisHYf49g4lA-blV1IewYGHf1-2497u-XzqBEYpn6HBpxud7KlTsxqTCP5nETLRAFabKBP2ehxqwMmHLq9PnzYPzdAnL2LDGaT5qdhGJX1MjPMBzY/s1600/IMG_20141212_112609.jpg" width="320" /></a></div>
<br />
<br />
この組み立て方は<br />
<br />
<ul>
<li><a href="http://linksprite.com/wiki/index.php5?title=Web_Cam_3-axis_Servo_Kit_for_Real_Time_Video_for_pcDuino" target="_blank">公式の解説</a></li>
</ul>
<br />
にあります。これを見るだけでも大変そうなのはわかりますが、実際に手元に届いてみると<br />
<br />
<ul>
<li>ニッパ、ピンバイス、ヤスリによるパーツの加工が必須</li>
<li>必要なネジが全然足りない(と思う)</li>
<li>2つのサーボSG-90の品質が悪く、最初から正常動作しないことがある</li>
</ul>
<br />
のように、なかなか骨のあるキットです。<br />
<br />
ちなみにサーボSG-90は秋月やamazonなどでも追加注文できますが、店によってはバージョン違いなのかサーボのケースサイズやサーボホーンの径が異なり、さらに加工が必要になったりします。なお、私の場合、SG-90を計12個入手して、正常動作したものは10個でした。<br />
<br />
さらに、このキットに付属するWebカメラはMJPEGモードに対応していないので、「<a href="http://neuralassembly.blogspot.com/2014/12/intel-edisonwebmjpg-streamer.html" target="_blank">Intel EdisonでWebカメラを有効にしmjpg-streamerで映像を配信してみた </a>」で紹介した方法では映像配信できません。<br />
<br />
私は手元で余っていた<a href="http://www.amazon.co.jp/dp/B004Q1XD5I" target="_blank">Logicool C210</a>を加工して取り付けました。Logicoolのものなら大抵大丈夫だと思います(今にして思えば、もっと画質の良いものにすれば良かったかも)。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjweUl0wOW3fLfRQst9KLxQKSdV9cfPw_ME_sxkefo1G0ithimVHr8BPVEaCo4o8ud_jTUZ4wg0ADTeey7Vosau1Rs5l2YPWd2DeaZK2uHI8xk4GYYYZc71MsuN6_f72MkkSw8GtXBA1G8/s1600/IMG_20141212_112758.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjweUl0wOW3fLfRQst9KLxQKSdV9cfPw_ME_sxkefo1G0ithimVHr8BPVEaCo4o8ud_jTUZ4wg0ADTeey7Vosau1Rs5l2YPWd2DeaZK2uHI8xk4GYYYZc71MsuN6_f72MkkSw8GtXBA1G8/s1600/IMG_20141212_112758.jpg" width="320" /></a></div>
<br />
<h3>
回路の接続</h3>
作成したカメラ雲台を下図のようにIntel Edisonと接続します。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIFQ8Iem6yR91xT2o1m67D_BacQXLIzW8RbQJYDiTvDLjVr5r7S-Cpb5huT-Xor1AzwlM-7hdFMuF8_jFOQiIuuGnFinrAuX35W9nbpyRc0V8Y_jpAZ7aYwyGGCLgb6n80uknGeZM5Swk/s1600/circuit.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="307" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIFQ8Iem6yR91xT2o1m67D_BacQXLIzW8RbQJYDiTvDLjVr5r7S-Cpb5huT-Xor1AzwlM-7hdFMuF8_jFOQiIuuGnFinrAuX35W9nbpyRc0V8Y_jpAZ7aYwyGGCLgb6n80uknGeZM5Swk/s1600/circuit.png" width="400" /></a></div>
<br />
いくつかコメントします。<br />
<br />
USBカメラを使うため、電源は7V~15VをJ21に入力します。バッテリーを用いたかったので、Enelooop6本を用いることにしました。容量の大きいEneloop Proにしましたが、これはお好みで。<br />
<br />
サーボモーターは5Vで駆動するため、レギュレータ<a href="http://akizukidenshi.com/catalog/g/gI-00537/" target="_blank">TA4805S</a>で5Vを作ります。これは手元にあったものをそのまま用いました。<br />
<br />
Intel Edisonからは下記の5つの信号を引っ張りだしました。Intel Edisonを外した状態で、Breakout Boardにケーブルを直接半田づけしました。<br />
<br />
<ul>
<li>J17-1:サーボ用PWM</li>
<li>J18-1:サーボ用PWM</li>
<li>J18-2:GPIO。プルアップされた入力として用いて、シャットダウンスイッチに利用します。</li>
<li>J19-2:1.8V</li>
<li>J19-3:GND</li>
</ul>
各ピンの情報は<a href="https://communities.intel.com/docs/DOC-23252" target="_blank">Intel Edison Breakout Board Hardware Guide</a>のPDFファイルを参考にしてください。<br />
<br />
サーボモータ用に出力するPWM信号は1.8Vなので、サーボモータに与えるために5Vにレベル変換します。これも手元にあった「<a href="http://akizukidenshi.com/catalog/g/gM-04522" target="_blank">8ビット双方向ロジックレベル変換モジュール</a>」を用いました。<br />
<br />
PCとの接続は、J3のシリアルコンソールにより行います。<br />
<br />
<h3>
libmraaライブラリの準備</h3>
ここからはIntel Edison上での作業になります。あらかじめ、「<a href="http://neuralassembly.blogspot.com/2014/12/intel-edisonwebmjpg-streamer.html" target="_blank">Intel EdisonでWebカメラを有効にしmjpg-streamerで映像を配信してみた</a><span id="goog_339862040"></span><span id="goog_339862041"></span><a href="https://www.blogger.com/"></a>」に基づいてWebカメラの映像配信を有効にしておいてください。エントリ作成当時はポート8080を用いていましたが、ポート9000を用いるように変更しましたので、ご注意ください。<br />
<br />
さて、スイッチサイエンスさんのページ「<a href="http://trac.switch-science.com/wiki/IntelEdisonOpkgFeeds" target="_blank">Intel Edison opkgのフィードを設定する</a>」および「<a href="http://trac.switch-science.com/wiki/IntelEdisonC%2B%2BDev" target="_blank">libmraaを使ってC++で開発する</a>」を参考に、GPIOにアクセスするためのlibmraaライブラリをインストールします。<br />
<br />
<pre class="prettyprint"># vi /etc/opkg/myfeeds.conf
</pre>
<br />
このファイルに下記の内容を記述して保存します。
<br />
<br />
<pre class="prettyprint">src intel-iotdk http://iotdk.intel.com/repos/1.1/intelgalactic
src all http://iotdk.intel.com/repos/1.1/iotdk/all
src i586 http://iotdk.intel.com/repos/1.1/iotdk/i586
src x86 http://iotdk.intel.com/repos/1.1/iotdk/x86
</pre>
<br />
書けたら、下記のコマンドを実行します。
<br />
<br />
<pre class="prettyprint"># opkg update
# opkg upgrade
# opkg install libmraa0
</pre>
<br />
これでlibmraaのインストールが完了しました。
<br />
<br />
<h4>
node.jsで用いるモジュールの準備</h4>
node.jsによるWeb連携で用いるconnectモジュールとsocket.ioモジュールをインストールします。
<br />
<br />
<pre class="prettyprint"># npm install connect@2.27.4
# npm install socket.io@0.9.17
</pre>
<br />
使っているスクリプトの関係上、バージョンを指定して最新のものではないファイルをインストールしました。
<br />
<br />
これらのモジュールは/home/root/node_modules以下にインストールされます。<br />
<br />
なお、libmraaライブラリに対応するmraaモジュールは/usr/lib/node_modules/mraaとしてインストールされていますが、これを/home/root/node_modulesにリンクしておかないと、自作のnodeスクリプトを/etc/rc.localから起動するときに失敗します。そのため、下記を実行しておきます。<br />
<br />
<pre class="prettyprint"># ln -s /usr/lib/node_modules/mraa /home/root/node_modules/mraa
</pre>
<br />
<h3>
ソースのダウンロード</h3>
ソースのダウンロードのために、gitをインストールします。<br />
<br />
<pre class="prettyprint"># opkg update
# opkg install git
</pre>
<br />
次に、ソースをダウンロードし、pantiltという名前のディレクトリに保存します。<br />
<br />
<pre class="prettyprint"># cd
# git clone https://github.com/neuralassembly/Edison_pantilt.git pantilt
</pre>
<br />
以下、いくつか解説を加えていきます。<br />
<br />
<h3>
シャットダウンスイッチ</h3>
シャットダウンスイッチを有効にするためには、下記のコマンドを実行します。<br />
<br />
<pre class="prettyprint"># python /home/root/pantilt/shutdown.py &
</pre>
<br />
この状態で、回路上のタクトスイッチを2~3秒程度長押しすると、poweroffコマンドが実行され、シャットダウンが始まります。<br />
<br />
中身は下記のようなPythonプログラムになっています。GPIO15はJ18-2のことであり、プルアップ抵抗つきの入力として設定しています。GPIO番号とピン番号の対応は<a href="https://github.com/intel-iot-devkit/mraa/blob/master/docs/edison.md" target="_blank">こちら</a>を参照。<br />
<br />
<pre class="prettyprint">import mraa
import time
import subprocess
sw = mraa.Gpio(15)
sw.dir(mraa.DIR_IN)
sw.mode(mraa.MODE_PULLUP)
state = 0
while True:
if sw.read() == 0:
if state == 2:
state = 0
args = ['poweroff']
subprocess.Popen(args)
else:
state += 1
else:
state = 0
time.sleep(0.5)
</pre>
<br />
このshutdown.pyスクリプトを起動時に有効にするには、mjpg-streamerの自動起動の際に作成した/etc/rc.localに上記のコマンドを追記してください。<br />
<br />
<h3>
サーバーの起動</h3>
サーバーを起動するには、下記のコマンドを実行してください。<br />
<br />
<pre class="prettyprint"># node /home/root/pantilt/pantiltserver.js &
</pre>
<br />
その状態でブラウザで<br />
<br />
<br />
<ul>
<li>http://(Intel EdisonのIPアドレス):8080/</li>
</ul>
<br />
<br />
にアクセスすると、操作用のアプリが開きます。使用されているポートは下記の通りです。<br />
<br />
<ul>
<li>8080:ページの閲覧</li>
<li>8888:socket.ioによるソケット通信</li>
<li>9000:mjpg-streamerによる映像配信</li>
</ul>
<br />
JavaScriptで記述したpantiltserver.jsの中では、下記のようにJ17-1およびJ18-1ピンに対してPWM信号を出力しています。<br />
<br />
<pre class="prettyprint">var mraa = require('mraa');
var p0 = new mraa.Pwm(0); // J17-1
var p1 = new mraa.Pwm(14); // J18-1
p0.period_us(19500);
p0.enable(true);
p1.period_us(19500);
p1.enable(true);
// For upper servo
var duty0min = 0.03; // min
var duty0max = 0.11; // max
var duty0 = (duty0min + duty0max)/2;
// For lower servo
var duty1min = 0.031; // min
var duty1max = 0.115; // max
var duty1 = (duty1min + duty1max)/2;
p0.write(duty0);
p1.write(duty1);
</pre>
サーボモータに50Hzの信号を与えるのですが、細かな周期やパルス幅はオシロスコープの波形を見たりサーボモーターの振る舞いを見ながら微調整しました。Duty比は0~1の実数で指定します。<br />
<br />
このpantiltserver.jsをIntel Edison起動時に自動実行する場合は、やはり/etc/rc.localに上記コマンドを追記してください。<br />
<br />
<h3>
ブラウザ上のアプリ</h3>
ブラウザのアプリは下図のように映像の下と右にjQuery UIによるスライダを配置してサーボモーターへの指令をJavaScriptで送るようにしています。iOSのSafari/ChromeやAndroidのChrome/Firefoxなどで動作を確認しています。画面の回転にも対応しています。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6kqySRu1m-RTPrtz25xTH9YU9scke1Ybn_HYrieZWlXb3MSiAB2RrDNLidOKuBY6fUrCO_Ih4bM724kFIKYH70sIHnoMedeRDZRJMrVjij2TUo1CVZjvjNVw6857cbwy4XvUmDhQta6c/s1600/IMG_0009.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6kqySRu1m-RTPrtz25xTH9YU9scke1Ybn_HYrieZWlXb3MSiAB2RrDNLidOKuBY6fUrCO_Ih4bM724kFIKYH70sIHnoMedeRDZRJMrVjij2TUo1CVZjvjNVw6857cbwy4XvUmDhQta6c/s1600/IMG_0009.PNG" width="300" /></a></div>
<br />
<br />
このアプリは、主に下記のファイルで構成されています。<br />
<br />
<ul>
<li>index.html</li>
<li>js/pantilt.js</li>
<li>js/socket.io.js:node_modules/socket.io/node_modules/socket.io-client/dist/socket.io.jsと同じもの</li>
<li>js/jquery/:jQuery UI用ファイル</li>
<li>css/pantilt.css</li>
</ul>
<br />
js/pantilt.js内で、映像の取得と命令の送信を行っています。<br />
<br />
<h3>
展示</h3>
<div>
このデモを2014年12月21日に東海大学高輪キャンパスで開催されたAndroid Bazaar and Conference 2014 Winterで展示しました(<a href="http://weekly.ascii.jp/elem/000/000/286/286021/" target="_blank">週アスPLUS</a>さんにも写真があります)。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQsEeWZHaTV6ix-ud5hcQCzNJN0nBS1Xz7XvAHSM3O8k_2LnuV7db14iW2mO6WZdBhGfxbKNU4CzmdDCB8ACD7RDk0FjFL332KJdNpEdDf_ijvw_FTRMk9TewsZnYaQ4GnlD2LB-Zmll0/s1600/2014-12-21+10.21.40.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQsEeWZHaTV6ix-ud5hcQCzNJN0nBS1Xz7XvAHSM3O8k_2LnuV7db14iW2mO6WZdBhGfxbKNU4CzmdDCB8ACD7RDk0FjFL332KJdNpEdDf_ijvw_FTRMk9TewsZnYaQ4GnlD2LB-Zmll0/s1600/2014-12-21+10.21.40.jpg" width="320" /></a></div>
<br />
Androidのイベントなので、カメラを「Androidタブレットおよびそれとペアリングされた腕時計Android Wear」から操作できるデモとしました。Android Wearでの操作の技術的詳細は、「<a href="http://neuralassembly.blogspot.jp/2014/09/android-wear-lg-g-watch.html" target="_blank">Android Wear (LG G Watch) でカメラからの映像を見ながら三輪ロボットを操作してみた</a>」が関連します。<br />
<br />
沢山の方にお越しいただき、ありがとうございました。<br />
<br /></div>
<h3>
終わりに</h3>
Intel Edisonを用いた簡単なデモということで、カメラのパンチルトを制御してみました。<br />
<br />
mraaモジュールを用いるとJavaScriptで直接GPIOにアクセスできるので、Web連携が容易であるという印象を持ちました。ただし、ドキュメントがあまり充実していないように思われるのが残念なところです(Pythonの入力ピンのプルアップ抵抗を有効にする方法を調べるために、mraaのソースをgrepしたりしました)。そのあたりは今後に期待でしょうか。<br />
<br />
あとは、7V以上の電源の確保と1.8VのGPIO入出力のレベルシフトがやや面倒、というところです。<br />
<br />
他のボードとの比較で言えば、Raspberry Piで同じことをやろうとする場合、Webカメラでは性能が出ないので、<a href="http://neuralassembly.blogspot.com/2013/11/raspberry-pipi-noirandroid.html" target="_blank">Raspberry Pi用のカメラモジュールを用いる</a>必要があります。さらに、Raspberry PiではハードウェアPWMが一つしか使えないので、全く同じことをするのは少し面倒です。<br />
<br />
BeagleBone Blackでは全く同じことを実現できるはずですが、私はBeagleBone BlackでのGPIOプログラミングは未経験なのでノーコメントです。<br />
<br />
以上でした。Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com0tag:blogger.com,1999:blog-1209616351336364066.post-14883711675367296312014-12-03T18:39:00.000+09:002017-03-13T17:38:22.742+09:00Intel EdisonでWebカメラを有効にしmjpg-streamerで映像を配信してみた<h3>
はじめに</h3>
<br />
(<b>2015.2.27 内容をアップデートしました</b>)<br />
<br />
Intel Edisonは特に使い途が思いつかなかったので手を出していなかったのですが、2014月11月末のMaker Faire Tokyo 2014にて初めて実物を見たことと、スイッチサイエンスさんのブースで「<a href="https://www.switch-science.com/catalog/2070/" target="_blank">スイッチサイエンス版Eaglet (MFTバージョン)</a>」を購入したことをきっかけに、試してみることにしました。<br />
<br />
目指すのは、いつもやっている「Webカメラを接続してmjpg-streamerで映像を配信する」こととします。<br />
<br />
結果を先にお見せすると下図のような感じでです。Intel Edisonで配信した映像がAndroidタブレットに表示されていることがわかります。<br />
<br />
なお、本ページで言う「Intel Edison」は、ほとんどの場合「Intel Edison Breakout Board Kit」を指していますのでご了承ください。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizKyFMKGz40K3a4eS-LvAyAl3FoyYauuweOswwyjeXpt9gR3uBQ3ie8eHOvFPZHvJYgoQgqF6SG8JbA3tDJwWsWCIXsVSao-I65nAVqNepVG6SyyYj4kmxcrPIweD9f2nEi9jejQV6bqo/s1600/IMG_20141203_170355~2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizKyFMKGz40K3a4eS-LvAyAl3FoyYauuweOswwyjeXpt9gR3uBQ3ie8eHOvFPZHvJYgoQgqF6SG8JbA3tDJwWsWCIXsVSao-I65nAVqNepVG6SyyYj4kmxcrPIweD9f2nEi9jejQV6bqo/s1600/IMG_20141203_170355~2.jpg" width="400" /></a></div>
<br />
<h3>
Intel Edisonのアップデート</h3>
このブログを執筆した2014年12月当時は、Intel EdisonでWebカメラを使うために、OSのイメージを自分でビルドする必要がありました。しかし、2015年1月に公開されたバージョンでは、デフォルトでWebカメラを利用可能になっています。<br />
<br />
そこで、ここではまずその方法を解説します。Intel EdisonでのOSのイメージをビルドする方法が知りたい方は、このページの末尾に記録を残しておきますのでご覧ください。<br />
<br />
本ページでは、Intel EdisonのアップデートをUbuntuで行うことにします。<br />
まず、Ubuntuにて<br />
<br />
<pre class="prettyprint">$ sudo apt-get install dfu-util
</pre>
<br />
を実行してdfu-utilをインストールしておきます。<br />
<br />
次に、<a href="http://www.intel.com/support/edison/sb/CS-035180.htm" target="_blank">こちら</a>よりYocto complete imageをダウンロードします。2015年2月27日の時点ではedison-image-ww05-15.zipがダウンロードされました。<br />
<br />
その後、edison-image-ww05-15.zipと同じディレクトリにいるとして、下記のコマンドで書き込みます。<br />
<br />
<pre class="prettyprint">$ mkdir edison-image-ww05-15
$ cd edison-image-ww05-15
$ unzip ../edison-image-ww05-15.zip
$ sudo ./flashall.sh
</pre>
<br />
このコマンドによりアップデートの待機状態になるので、Intel EdisonのJ16コネクタとUbuntuマシンをUSB接続してIntel Edisonに電源を投入すると、アップデートが始まります。J3コネクタにてシリアルコンソールに接続しておくと、進行状況がわかって安心です。<br />
<br />
なお、UbuntuマシンとIntel Edisonとを既に接続済みだった場合はIntel Edisonをリブートすると、起動時に更新が始まります。<br />
<br />
再起動が終わったら、Intel EdisonのJ16コネクタにUSBカメラ(要変換コネクタ)、J21ピンに7V~15Vの電源を接続します。J3コネクタのシリアルコンソールでログインすると、/dev/video0ができていることがわかります。<br />
<br />
なお、この状態でIntel Edisonを再起動すると、カメラが認識されなくなります。一度電源を切ってから再投入することで認識されるようです。<br />
<br />
<h3>
mjpg-streamerのインストールと起動</h3>
ここからは主にシリアルコンソールで接続したIntel Edison上の作業になりますが、まず、「configure_edison --setup」コマンドにより、あらかじめIntel EdisonをWifi接続しておきます。詳細は<a href="http://trac.switch-science.com/wiki/IntelEdison" target="_blank">スイッチサイエンスさんのページ</a>が詳しいです。<br />
<br />
また、あらかじめUbuntuマシンでmjpg-streamerのソースをダウンロードしておきます。このダウンロードにはSubversionが必要なのですが、Intel Edison用のSubversionのパッケージが見当たらず、ソースからインストールするのは面倒だったため、Ubuntuであらかじめダウンロードしておく、というわけです。<br />
<br />
<pre class="prettyprint">(Ubuntuマシンで)
$ sudo apt-get install subversion
$ svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer mjpg-streamer
</pre>
<br />
そして、できたmjpg-streamerディレクトリをWifi経由でIntel Edisonへ移動しておきます。<br />
<br />
ここからIntel Edisonでの作業です。<br />
<br />
まず、スイッチサイエンスさんのページ「<a href="http://trac.switch-science.com/wiki/IntelEdisonOpkgFeeds" target="_blank">Intel Edison opkgのフィードを設定する</a>」を参考に、myfeeds.confというファイルを作成して編集を開始します。
<br />
<pre class="prettyprint"># vi /etc/opkg/myfeeds.conf
</pre>
このファイルに下記の内容を記述して保存します。
<br />
<pre class="prettyprint">src intel-iotdk http://iotdk.intel.com/repos/1.1/intelgalactic
src all http://iotdk.intel.com/repos/1.1/iotdk/all
src i586 http://iotdk.intel.com/repos/1.1/iotdk/i586
src x86 http://iotdk.intel.com/repos/1.1/iotdk/x86
</pre>
書けたら、下記のコマンドを実行します。
<br />
<pre class="prettyprint"># opkg update
# opkg install libjpeg-dev libv4l-dev
# cd mjpg-streamer
# vi Makefile
</pre>
<br />
ここで、Makefileの39行目でinput_testpicture.soをビルド対象に含めている部分を下記のようにコメントアウトします。<br />
<br />
<pre class="prettyprint"># PLUGINS += input_testpicture.so
</pre>
<br />
input_testpicture.soのビルドにはImageMagickが必要なのですが、ImageMagickのIntel Edison用のパッケージがなく、またその名前の通り、input_testpicture.soはテスト時以外なくても困らないためです。<br />
<br />
以上のもと、ビルドします。<br />
<br />
<pre class="prettyprint"># make
</pre>
<br />
ビルドが完了したら、下記のコマンドにより、mjpg-streamerを起動します。<br />
<br />
<pre class="prettyprint"># export LD_LIBRARY_PATH="$(pwd)"
# ./mjpg_streamer -i "./input_uvc.so -d /dev/video0 -r 640x480 -f 15" -o "./output_http.so -p 9000 -w ./www"
</pre>
<br />
あとは、ブラウザで<br />
<br />
http://Intel EdisonのIPアドレス:9000/<br />
<br />
にアクセスすると、映像が配信されていることがわかります(2014.12.11追記。後に追加するエントリとの整合性をとるため、ポート番号を8080から9000に変更しました)。<br />
<br />
Androidの場合は<a href="https://play.google.com/store/apps/details?id=com.tk.android.simplemjpeg&hl=ja" target="_blank">簡単MJPEGビューア</a>を使ってもよいです。ポート番号はソフトウェアキーボードで9000と変更してください。<br />
<br />
<h3>
mjpg-streamerの自動起動</h3>
最後に、Intel Edisonに電源を入れた際にmjpg-streamerが自動で起動するようにしておきます。<br />
<br />
まず、mjpg-streamerディレクトリにstart_mine.shファイルを作成します。<br />
<br />
<pre class="prettyprint"># cd
# vi mjpg-streamer/start_mine.sh
</pre>
<br />
中には例えば以下の内容を記します。
<br />
<br />
<pre class="prettyprint">#!/bin/sh
cd /home/root/mjpg-streamer
export LD_LIBRARY_PATH="$(pwd)"
./mjpg_streamer -i "./input_uvc.so -d /dev/video0 -r 640x480 -f 15" -o "./output_http.so -p 9000 -w ./www"
</pre>
<br />
次に、このスクリプトを/etc/rc.localに記述して、起動時に自動的に呼び出されるようにします。
<br />
<br />
<pre class="prettyprint"># vi /etc/rc.local
</pre>
<br />
内容は下記の通りです。
<br />
<br />
<pre class="prettyprint">#!/bin/sh
sh /home/root/mjpg-streamer/start_mine.sh &
</pre>
<br />
最後に、/etc/rc.localのパーミッションを755にしておきます。
<br />
<br />
<pre class="prettyprint"># chmod 755 /etc/rc.local
</pre>
<br />
以上が済んだ後、Intel Edisonの電源を切り、電源再投入してください(リブートでは駄目)。mjpg-streamerが自動で起動していることがわかるはずです。
<br />
<br />
<h3>
終わりに</h3>
Intel EdisonでWebカメラの映像を配信してみましたが、Raspberry PiやBeagleBone Blackと比べた場合のメリットは、5GHz帯のネットワークにデフォルトで接続できることでしょうか。Raspberry PiやBeagleBone Blackで5GHz帯のネットワークにつなぐには<a href="http://www.amazon.co.jp/dp/B00H71C2KG/" target="_blank">GW-450D</a>を使う方法がありますが、kernelの再構築が必要であるなど、やや面倒です。<br />
<br />
とは言え、Intel Edisonの方でも、7V~15Vの電源が必要な点など使いにくいところはあります。<br />
<br />
以上です。<br />
<br />
<h3>
こちらもどうぞ</h3>
このページの話の続きです。<br />
<br />
<ul>
<li><a href="http://neuralassembly.blogspot.com/2014/12/intel-edison.html" target="_blank">Intel Edisonで映像配信中のカメラのパン・チルトを制御してみた</a></li>
</ul>
<div>
<br />
<br />
<hr />
<h3>
kernelとOSイメージの作成</h3>
既に述べたように、2014年12月の時点では、EdisonのデフォルトのkernelはUSB Video Class (UVC)が有効になっていなかったので、それを有効にしたkernelと、それを含むOSイメージを作成する方法を解説しました。<br />
<br />
現在はUVCがデフォルトで有効になっていますのでこの作業は必要ないのですが、記録としてその方法を以下に残しておきます。<br />
<br />
この作業はUbuntuで行いました。作業の概略は<a href="https://communities.intel.com/docs/DOC-23159" target="_blank">Intel Edison BSP User Guide</a>にまとめられています。<br />
<br />
まず、Ubuntuに必要なパッケージをインストールします。<br />
<br />
<pre class="prettyprint">$ sudo apt-get update
$ sudo apt-get install build-essential git diffstat gawk chrpath texinfo libtool gcc-multilib
</pre>
<br />
次に、<a href="http://www.intel.com/support/edison/sb/CS-035180.htm" target="_blank">こちら</a>よりLinux source filesをダウンロードします。2015年2月27日の時点ではedison-src-ww05-15.tgzでした。このファイルを<br />
<br />
<pre class="prettyprint">$ tar zxf edison-src-ww05-15.tgz
</pre>
<br />
により解凍します。edison-srcというディレクトリができますので、以下の順でまずはデフォルトのイメージを作成してみます。なお、この際環境変数PATHにカレントディレクトリ「.」が含まれているとエラーが出ますので、あらかじめPATHから「.」を削除しておきます。<br />
<br />
<pre class="prettyprint">$ cd edison-src
$ ./device-software/setup.sh
$ source poky/oe-init-build-env
(ここで、自動的にedison-src/buildにcdされる)
$ bitbake edison-image
</pre>
<br />
なお、最後のコマンドを実行すると、途中で様々なファイルのダウンロードが行われますが、環境やタイミングによりダウンロードエラーが起こることがありますので、エラー出ずにビルドが終了するまで繰り返します。<br />
<br />
私の場合、成功時に下記のようなメッセージが現れてビルドが完了しました。<br />
<br />
<pre class="prettyprint">NOTE: Tasks Summary: Attempted 2802 tasks of which 29 didn't need to be rerun and all succeeded.
Summary: There were 79 WARNING messages shown.
</pre>
<br />
ビルドが完了した後、以下のコマンドにより、書き込み用のファイル群をまとめます。<br />
<br />
<pre class="prettyprint">$ cd ../..
$ ./edison-src/device-software/utils/flash/postBuild.sh
</pre>
<br />
以上により、書き込み用のファイルがディレクトリedison-src/build/toFlashにまとめられます。このイメージを上で行ったようにflashall.shを用いて書き込めます。<br />
<br />
なお、kernelの設定を変更したい場合は下記のようにして再ビルドしてください。<br />
kernelの設定ファイルはedison-src/device-software/meta-edison/recipes-kernel/linux/files/defconfigですので、手作業で変更する場合はこちらを編集します。<br />
<br />
menuconfigにより設定を行う場合は以下のようにします。まず、<br />
edison-src/build ディレクトリにて<br />
<br />
<pre class="prettyprint">$ bitbake virtual/kernel -c menuconfig
</pre>
<br />
を実行します (Xが必要)。<br />
<br />
Webカメラを有効にする場合は下記の操作を行ったのですが、既にこれはデフォルトで有効になっています。<br />
Device Drivers→<br />
MultiMedia Support→<br />
Media USB Adapters でスペース→Enter<br />
USB Video Class (UVC) で M<br />
→Save<br />
→Exit (複数回)<br />
と辿ることで設定ファイルが<br />
<br />
edison-src/build/tmp/work/edison-poky-linux/linux-yocto/3.10.17+gitAUTOINC+6ad20f049a_c03195ed6e-r0/linux-edison-standard-build/.config<br />
<br />
として書き込まれます。これをkernelの設定ファイルの格納場所にコピーします。<br />
edison-src/buildディレクトリにいるとして、<br />
<br />
<pre class="prettyprint">$ cp ../device-software/meta-edison/recipes-kernel/linux/files/defconfig ../device-software/meta-edison/recipes-kernel/linux/files/defconfig.orig
$ cp tmp/work/edison-poky-linux/linux-yocto/3.10.17+gitAUTOINC+6ad20f049a_c03195ed6e-r0/linux-edison-standard-build/.config ../device-software/meta-edison/recipes-kernel/linux/files/defconfig
</pre>
<br />
さて、以上が済んだら、edison-src/build ディレクトリにて下記コマンドによりイメージの作成を行います。<br />
<br />
<pre class="prettyprint">$ bitbake virtual/kernel -c configure -f -v
$ bitbake edison-image
$ cd ../..
$ ./edison-src/device-software/utils/flash/postBuild.sh
</pre>
<br />
以上で、edison-src/build/toFlashに書き込み用のファイルができました。<br />
<div>
<br /></div>
<br /></div>
Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com3tag:blogger.com,1999:blog-1209616351336364066.post-79338960268897633072014-11-02T21:06:00.000+09:002020-06-16T18:36:07.654+09:00Raspberry PiとArduinoで16x32 RGB LEDパネルにカメラモジュールの映像を表示してみた<h3>
はじめに</h3>
<div>
5月頃に秋月で「<a href="http://akizukidenshi.com/catalog/g/gM-07764/" target="_blank">RGBフルカラードットマトリクスLEDパネル 16x32ドット</a>」を購入し、長いこと放置していたのですが、少し時間ができたので試してみることにしました。</div>
<div>
<br /></div>
<div>
最近ずっと仕事で使っていたRaspberry Piで試すことにします。ただし、Raspberry Piに直接接続するわけではなく、</div>
<div>
<br /></div>
<div>
RaspberryPi―(シリアル通信)→Arduino→RGB LEDパネル</div>
<div>
<br /></div>
<div>
という構成にしました。そうすることで、<a href="https://learn.adafruit.com/32x16-32x32-rgb-led-matrix/" target="_blank">Adafruit</a>で公開されているArduino用のライブラリを流用することができます。</div>
<div>
<br /></div>
<div>
なお、この構成で始めた後に、やはり<a href="https://learn.adafruit.com/connecting-a-16x32-rgb-led-matrix-panel-to-a-raspberry-pi/overview" target="_blank">AdafruitでRaspberry Pi用のチュートリアル</a>が出てることを知りました。そちらのチュートリアルでは画像ファイルをスクロールする例を取り扱っていますが、本ページでは、それとは異なる構成でRaspberry Piのカメラモジュールの映像をRGB LEDパネルに表示するところまでを試してみます(下図)。</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeBha_GiK95-AEWXlnNiYlJNpB1Kz50Lns436ZYg0B0iBAy4_denQIjcfolNWcBVGsD80ERP9YOGzF31FwzW0TKgfUscU_baVbu1mB-9gbsQdMh2FCUYEaDFCnsDk44AluNzMSBh2ooCc/s1600/2014-10-10+17.14.20.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeBha_GiK95-AEWXlnNiYlJNpB1Kz50Lns436ZYg0B0iBAy4_denQIjcfolNWcBVGsD80ERP9YOGzF31FwzW0TKgfUscU_baVbu1mB-9gbsQdMh2FCUYEaDFCnsDk44AluNzMSBh2ooCc/s1600/2014-10-10+17.14.20.jpg" width="400" /></a></div>
<div>
<br /></div>
<h3>
準備</h3>
<div>
まず、<a href="https://learn.adafruit.com/32x16-32x32-rgb-led-matrix" target="_blank">AdafruitのArduino用のチュートリアル</a>を元に、Arduinoで動作することを確かめてください。ArduinoのIDEでFile→Examples→RGBmatrixPanelとたどった時に「16x32」が含まれているサンプルは動作します。<br />
<br />
用いるArduinoはチュートリアルにあるようにArduino Unoで良いですが、私は「<a href="http://www.switch-science.com/catalog/946/" target="_blank">Arduino Pro Mini 328 5V 16MHz</a>」+「<a href="http://www.switch-science.com/catalog/342/" target="_blank">FT232RL搭載小型USB-シリアルアダプタ 5V</a>」の組み合わせを用いました。ソースを少し変更するだけでArduino Megaでもいけるようですが、こちらでは試していません。<br />
<br /></div>
<h3>
C++ & OpenCVの場合</h3>
<div>
それでは、Raspberry Piでの準備に入っていきます。Raspberry Piのカメラモジュールの映像を取得し、それをRGB LEDパネルに表示することを目指しますが、そのためにC++とOpenCVの組み合わせを用いることにします。<br />
<br />
最初はPythonと画像処理ライブラリのPillowの組み合わせで試していたのですが、思った速度が出なかったので、C++とOpenCVの組み合わせに切り替えました。Python+Pillow版についてはページ末尾にメモを残しますので、興味のある方はどうぞ。<br />
<br />
さて、Raspberry Pi、Arduino、RGB LEDパネルを下記のように接続しておきます。この場合、Arduinoの電源はRaspberry PiのUSBから供給されます。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOa1KX-Tk3uB3Ytz1gm3zFszrpdLsDAqC9gPPOsFlfa88KDlE_W33eE31_lpBQGcLjp1g0I9cLuKc3bdE9LSOYyESgNn9OZTJ1SYXrd1zdRGp77CX_pljj81lvloGAiycU0Ru5sg_Wf3Y/s1600/RGBLED1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="176" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOa1KX-Tk3uB3Ytz1gm3zFszrpdLsDAqC9gPPOsFlfa88KDlE_W33eE31_lpBQGcLjp1g0I9cLuKc3bdE9LSOYyESgNn9OZTJ1SYXrd1zdRGp77CX_pljj81lvloGAiycU0Ru5sg_Wf3Y/s1600/RGBLED1.png" width="320" /></a></div>
<br />
<br />
さらに、Raspberry Piではカメラモジュールを使えるようにしておきましょう。「sudo raspi-config」で設定を起動し、「5. Enable Camera」→「Enable」とたどれば良いのでした。</div>
<div>
<br /></div>
<div>
次に、Raspberry PiでOpenCV、および後に必要なcmakeをインストールします。</div>
<br />
<pre class="prettyprint">sudo apt-get update
sudo apt-get install libopencv-dev cmake
</pre>
<div>
<br /></div>
次に、このRaspberry Piのカメラモジュールに対してOpenCVを用いることができるよう、「<a href="http://www.uco.es/investiga/grupos/ava/node/40" target="_blank">RaspiCam : C++ API for using Raspberry camera with/without OpenCv</a>」をインストールします。まず、<a href="http://sourceforge.net/projects/raspicam/files/?" target="_blank">SourceForge</a>からraspicam-0.1.1.zip (129.5 kB)をダウンロードし、下記のコマンドでインストールします。<br />
<br />
<pre class="prettyprint">unzip raspicam-0.1.1.zip
cd raspicam-0.1.1
mkdir build
cd build
cmake ..
make
sudo make install
sudo ldconfig
</pre>
<div>
<br /></div>
<div>
このRaspiCamを用いると、Raspberry Piのカメラモジュールで取得した画像に対してOpenCVを利用できるので良さそうです。私は普段OpenCVを使っているわけではなく、RaspiCamも今回初めて触ったので、「良さそう」という程度しか言えないのですが。<br />
<br />
次に、RGB LEDパネル用に私が用意したファイルを準備します。</div>
<br />
<pre class="prettyprint">cd
git clone https://github.com/neuralassembly/raspi_16x32RGBLED
cd raspi_16x32RGBLED
make
</pre>
<div>
<br /></div>
makeを実行した後、しばらく待つとビルドが完了します。画像ファイル表示用のimage2LEDmatrix、カメラモジュール表示用のcamera2LEDmatrixの2つの実行ファイルができています。
<br />
<br />
さらに、Arduino用のserial2LEDmatrix.inoというC言語ファイルが存在します。このserial2LEDmatrix.inoをWindowsなどであらかじめArduinoに書き込んでおきましょう。
<br />
<br />
このスケッチは、下図のように16x32x3バイトの階調(各階調は0~Fで表示)をシリアル通信で受け取り、「.」(ピリオド)を受け取ったタイミングでLEDパネルの内容を更新するように記述されています。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjA2MO3uioH9J9v4XK5fQh3Z4xtDHKnVkR35LdN6lWfRsIyuJbaSk06YoO0-id_S12MTbMviSCiHuvyYi0fDrAhtHLq9ffRAhyamXdxrwi1BKKvemUdd4LV-j7VMoNkVIRV7cpzqZu8LXM/s1600/RGBLED3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="95" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjA2MO3uioH9J9v4XK5fQh3Z4xtDHKnVkR35LdN6lWfRsIyuJbaSk06YoO0-id_S12MTbMviSCiHuvyYi0fDrAhtHLq9ffRAhyamXdxrwi1BKKvemUdd4LV-j7VMoNkVIRV7cpzqZu8LXM/s1600/RGBLED3.png" width="320" /></a></div>
<br />
<br />
以下、image2LEDmatrixとcamera2LEDmatrixの使用法を解説してきます。
<br />
<br />
<h4>
画像ファイルの表示 </h4>
image2LEDmatrixはSDカード上の画像をRGB LEDパネルに表示するプログラムです。練習兼動作検証用に書きました。<br />
<br />
任意サイズの画像を与えることができます。画像の形式は、JPEGやPNGなど、OpenCVが読み込みに対応しているものです。動作モードは下記の2モードあります。<br />
<br />
<pre class="prettyprint">./image2LEDmatrix filename 0
</pre>
<br />
末尾の0は省略することができます。こちらは下図のように画像の全体をスケーリングして表示します。なお、このページの画像は、見やすくするために全てRGB LEDパネルに紙をかぶせて撮影しています。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirBvNOhUgZTVbkn5NUFUhAWJLswQ1iWE8BqMa_3JGVLTRzbVIlcD9UEI4JDbanu9nxO4WrqRBnn9UB9Gzya0nmU85AQeoM1Y88beYnHuJHCLxg_0iPgxJyTyiO9oY8yy41ZcwiconT-7U/s1600/2014-10-31+13.59.12.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirBvNOhUgZTVbkn5NUFUhAWJLswQ1iWE8BqMa_3JGVLTRzbVIlcD9UEI4JDbanu9nxO4WrqRBnn9UB9Gzya0nmU85AQeoM1Y88beYnHuJHCLxg_0iPgxJyTyiO9oY8yy41ZcwiconT-7U/s1600/2014-10-31+13.59.12.jpg" width="400" /></a></div>
<br />
一方、下記の用に末尾に1をつけて起動すると、下図のように画像の左右または上下を捨て、なるべく画像を大きく表示します。<br />
<br />
<pre class="prettyprint">./image2LEDmatrix filename 1
</pre>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8Dn75sNssxSsc8ah9kaZSCGdE5dYPdKEM6ZEJwb2vHGcLKihnd5VrK6vcHLg7yobsC6KpGGbRJGNGob0LjTAO10yjikaWsDJekcPr7YhEVLB-2kARIIoG5aewkMCNpMNs-FgL3fGgWes/s1600/2014-10-31+13.52.30.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8Dn75sNssxSsc8ah9kaZSCGdE5dYPdKEM6ZEJwb2vHGcLKihnd5VrK6vcHLg7yobsC6KpGGbRJGNGob0LjTAO10yjikaWsDJekcPr7YhEVLB-2kARIIoG5aewkMCNpMNs-FgL3fGgWes/s1600/2014-10-31+13.52.30.jpg" width="400" /></a></div>
<br />
<h4>
Raspberry Piのカメラモジュールの映像の表示</h4>
カメラモジュールの映像を表示するには、下記のコマンドを実行します。<br />
<br />
<pre class="prettyprint">./camera2LEDmatrix
</pre>
<br />
すると、下図のようにカメラモジュールの映像がRGB LEDパネルに表示されます。真面目に計測していませんが、体感で5fps以上は出ているのではないかと思います。<br />
<br />
なお、フレームレートが低いのは、動作の安定化のためにwhileループ内でusleep関数によるウェイトを入れているためです。RaspiCam自体は約30fpsで映像を取得する能力がありますのでご注意ください。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxdTh0th9ialxYTw_tqDGItuzZGmlRn13L-CRsWy96K3g8NGZMPbvgRgZmKNcOagNhXiR_d5B4WzlKampGz07Np-VNjfwYINCuikO4f_CzE1em4wyxKynZn7k53GVSERr3UXPAmD8odgk/s1600/2014-10-28+20.28.41.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxdTh0th9ialxYTw_tqDGItuzZGmlRn13L-CRsWy96K3g8NGZMPbvgRgZmKNcOagNhXiR_d5B4WzlKampGz07Np-VNjfwYINCuikO4f_CzE1em4wyxKynZn7k53GVSERr3UXPAmD8odgk/s1600/2014-10-28+20.28.41.jpg" width="400" /></a></div>
<br />
やってみるとわかりますが(いや、やる前にわかるか)、解像度があまりにも小さいことと、LEDが明るすぎることとがあいまって、何が映っているかわからないことが多く、ちょっと厳しいです。<br />
<br />
普通に周囲の映像を映すと、ほとんどのLEDがかなりの輝度で輝くので、1.0A以上の電流がパネルに流れてしまいます。<br />
<br />
そのため、使いこなすには何らかの画像処理が必要そうです。せっかくOpenCVを使っているので、エッジ抽出、ビット反転、時間差分などを試したのですが、解像度の小ささから、何が起こっているのかわからず、イマイチでした。<br />
<br />
何か面白い応用があれば、お知らせ頂ければ幸いです。<br />
<br />
<h3>
(おまけ)Pythonの場合</h3>
<div>
上で、C++とOpenCVでの例を紹介しましたが、その前にはPython + Pillowで試していました。この方法にはいくつか欠点があったため途中でやめてしまったのですが、メモとして記録を残しておきます。<br />
<br /></div>
<h4>
準備</h4>
<div>
まず回路ですが、Python用いてArduinoとシリアル通信する場合は、<a href="http://stackoverflow.com/questions/21866762/sending-serial-communication-from-raspberry-pi" target="_blank">こちらのstackoverflow</a>にかかれているように、ArduinoのRESETとGNDの間に220μF程度のコンデンサを挟む必要があります。ただし、このコンデンサはスケッチ書き込み時は外してください。<br />
(追記:すいません、コンデンサなしでも問題なく動くかもしれません。追試の必要あり)</div>
<div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhq0CdiTwFDqEka1rcx7xHNFry1OOmx0L1JQX6BYJoEX0BjeKP_M6THbPkPZHNY7kvNDFm_oJJVnFTDc1YvoIJx0Z3PDd1hBX3mfFLVOvwVWZYW9HGLB055IT1aCAIfkfGV0SfozRAvRsI/s1600/RGBLED2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="151" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhq0CdiTwFDqEka1rcx7xHNFry1OOmx0L1JQX6BYJoEX0BjeKP_M6THbPkPZHNY7kvNDFm_oJJVnFTDc1YvoIJx0Z3PDd1hBX3mfFLVOvwVWZYW9HGLB055IT1aCAIfkfGV0SfozRAvRsI/s1600/RGBLED2.png" width="320" /></a></div>
<br /></div>
次に、Raspberry Piでpipとpython-devとlibjpeg8-devをインストールします。
<br />
<br />
<pre class="prettyprint">sudo apt-get update
sudo apt-get install python-pip python-dev libjpeg8-dev
</pre>
<div>
<br /></div>
次に、Pillow をインストールします。
<br />
<div>
<br /></div>
<pre class="prettyprint">sudo pip install pillow
</pre>
<br />
以上の準備のもと、次に、RGB LEDパネル用に私が用意したファイルを準備します。<br />
<br />
<pre class="prettyprint">git clone https://github.com/neuralassembly/raspi_16x32RGBLED_Python
</pre>
<div>
<br /></div>
raspi_16x32RGBLED_Pythonの中に、画像ファイル表示用のimage2LEDmatrix.pyとカメラモジュールの映像表示用のcamera2LEDmatrix.pyとが入っています。<br />
<br />
これらを用いるのは、C++版でも用いたserial2LEDmatrix.inoをArduinoに書き込んでおいてください。これは <a href="https://github.com/neuralassembly/raspi_16x32RGBLED">https://github.com/neuralassembly/raspi_16x32RGBLED</a> に含まれています。<br />
<div>
<br /></div>
<h4>
画像ファイルの表示</h4>
<div>
C++版と同様に、画像全体表示</div>
<br />
<pre class="prettyprint">python image2LEDmatrix.py filename 0
</pre>
<br />
<div>
および、画像の切り出し表示<br />
<br />
<pre class="prettyprint">python image2LEDmatrix.py filename 1
</pre>
<br />
に対応しています(末尾の0は省略できます)。画像ファイルのサイズも任意ですが、画像リサイズのアルゴリズム(PIL.Image.NEAREST、PIL.Image.BILINEAR、PIL.Image.BICUBIC、PIL.Image.ANTIALIAS)がイマイチなため、縮小後の画像があまり綺麗に表示されないことがあるのが欠点です(OpenCV版ではINTER_AREAを用いました)。<br />
<br />
そのため、Python版ではWindowsのgimpなどで事前に画像を横32x縦16にリサイズしておいた方が良い場合があります。<br />
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwOWC669KgLVJVYA43GZMD5fsQoSjvrdfMXTtk3T7yWp47pjr4u_c8HyyCn5JdVRv1mBBzQlmfmfpgM2fd0GXQfQZFWBEib2-v6hBKnQzVcrsPVepPaO7NvgdQEiMD7jwPXId0RIXpGCc/s1600/2014-10-10+10.54.13.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwOWC669KgLVJVYA43GZMD5fsQoSjvrdfMXTtk3T7yWp47pjr4u_c8HyyCn5JdVRv1mBBzQlmfmfpgM2fd0GXQfQZFWBEib2-v6hBKnQzVcrsPVepPaO7NvgdQEiMD7jwPXId0RIXpGCc/s1600/2014-10-10+10.54.13.jpg" width="400" /></a></div>
<div>
<h4>
Raspberry Piのカメラモジュールの映像の表示</h4>
</div>
<div>
カメラモジュールの映像を表示するには、下記のコマンドを用います。<a href="http://picamera.readthedocs.org/en/release-1.8/recipes1.html#capturing-to-a-network-stream" target="_blank">この辺り</a>を参考にしました。</div>
<div>
<br />
<pre class="prettyprint">python camera2LEDmatrix.py
</pre>
<br />
残念ながら、こちらはでは、2秒に1回程度しか映像が更新されません。そのため、Pythonをあきらめ、C++とOpenCVによる方法に移行したのでした。<br />
<br /></div>
<br />
<br />
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/gp/product/4065193397/" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7DRwdHUOfdPJtPAeH0UiIjW1Bi0s94ukn5JFN1x56glI-jjGVy9HyIB1FKHC6cWh15bKybLLYJqhtFmsAMMjyrb3ahHlVpvR_xT7lqEqlvubJ14XBUZQehLFTWTT71WykdZIDNUIr24g/s1600/cover3.png" /></a></div>
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/dp/4062579502/" style="clear: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_dmvycn6QM24eV1ZEoT6lg2TVi108iFt8BG6P1znEj0HtuWPBdYA2KxnD_uy1gw8CZI0UVilZ6noZJbqpagWZmQz5_9iScdkNo_ugvjoFInSMcArrkAYxuOFxoticmpPb1ZvSTJ8S_EM/s1600/raspi2_bb.jpg" /></a></div>
<div class="separator" style="float: left; text-align: center;">
<a href="https://www.amazon.co.jp/dp/4065020522/" style="clear: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="145" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOsxLVgVnFI0m-FUJlBK_CqKYJC8dNo3zjk8MOMX2xcJO4omTyOy-aAh3mmqGzXm5P3hGgpkUpaQy-7j7oqdIXyLE2_y686CI2Eda8EMYhME0INhU6irK9jw8b3iUhq7ojs2rrPZrnJtw/s1600/mlbb_title_mini.png" /></a></div>
<br clear="all" />
<div>
「ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作」、「実例で学ぶRaspberry Pi電子工作」、「Raspberry Piではじめる機械学習」を執筆しました。</div>Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com2tag:blogger.com,1999:blog-1209616351336364066.post-4754662996197529492014-09-06T00:08:00.001+09:002017-03-13T17:39:37.212+09:00Android Wear (LG G Watch) でカメラからの映像を見ながら三輪ロボットを操作してみた<h3>
はじめに</h3>
Android wear (LG G Watch) で、カメラからの映像を見ながら三輪オムニホイールロボットをラジコンのように操作してみました。動画はこちら。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="allowfullscreen" frameborder="0" height="290" src="https://www.youtube.com/embed/XwBhovAiHIM?rel=0" width="420"></iframe>
</div>
<br />
<br />
<br />
<h3>
経緯など</h3>
「<a href="http://neuralassembly.blogspot.com/2014/08/android-wear-lg-g-watch.html" target="_blank">Android Wear (LG G Watch) で三輪ロボットを操作してみた</a>」にて、Android wear搭載のLG G Watchで三輪ロボットを制御しました。<br />
<div>
<br /></div>
<div>
このロボットにはRaspberry Piとそのカメラモジュールが搭載されており映像を配信しているのですが、せっかくなのでLG G Watchでもその映像を表示してみよう、というのが今回のお話。</div>
<div>
<br /></div>
<h3>
仕組みなど</h3>
動画の後半にも示されているように、LG G WatchだけではなくペアリングされたAndroid端末とその上で動くアプリが必要です。システム全体の模式図は下図のようになります。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_8S46Oe8PQaChqtGYSedmea9VkF_JMQtWEqa0A_dLrS-jPxXeFOoOz1rkgLaPjwtA_hAgNPbjBzJ04QXxUoj0lEN2HpvW1WjP6-nsg1atBJKNL1ScookBdEp1JqkTZ0t8HlS0DwTffBM/s1600/omnicamerawear_exp.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="220" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_8S46Oe8PQaChqtGYSedmea9VkF_JMQtWEqa0A_dLrS-jPxXeFOoOz1rkgLaPjwtA_hAgNPbjBzJ04QXxUoj0lEN2HpvW1WjP6-nsg1atBJKNL1ScookBdEp1JqkTZ0t8HlS0DwTffBM/s1600/omnicamerawear_exp.png" width="400" /></a></div>
<br />
スマートフォン側のアプリが三輪ロボット上のカメラからの映像を受け取り、それをWear側のアプリに送ります。カメラからの映像は640x480、15fpsで送られてきますが、Wear側へはそれを280x280、5fps程度に変換してから送っています。スマートフォンとWearはBLEで接続されていますので、データ量を極力減らさないとまともに動作しません。<br />
<br />
アプリのスクリーンショットはこちら。<br />
<br />
<h4>
Wear側のアプリ</h4>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNtt29bMxpvXB9MorUCNuyryiJGOI8yN3JQhMnaYTlHpu0J9N84DWUm6aEW-tvMJj39AOMo3eHLuiybfzsL2MLARcwibLnZuecEzg1ev-p8SeB_cdO2oSpJ92fBPt5TmhlKKe5RtLkZnk/s1600/device-2014-09-05-180021.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNtt29bMxpvXB9MorUCNuyryiJGOI8yN3JQhMnaYTlHpu0J9N84DWUm6aEW-tvMJj39AOMo3eHLuiybfzsL2MLARcwibLnZuecEzg1ev-p8SeB_cdO2oSpJ92fBPt5TmhlKKe5RtLkZnk/s1600/device-2014-09-05-180021.png" width="200" /></a></div>
<br clear="all" />
<br />
<h4>
スマートフォン側のアプリ</h4>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZ28z-Xc8Sac4jzqOH93qdB2mdfG0r35K1WACMeGOBsPcrsTNC_-0TP4_-3yY3GqFlNQKtQHVqIXJu-IWCO1eULiDW36ERyvUYnh6UFVkHdSg4a5Mc75GKRjoktfmPqevKden5_yr_c7M/s1600/2014-09-05+08.59.25.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZ28z-Xc8Sac4jzqOH93qdB2mdfG0r35K1WACMeGOBsPcrsTNC_-0TP4_-3yY3GqFlNQKtQHVqIXJu-IWCO1eULiDW36ERyvUYnh6UFVkHdSg4a5Mc75GKRjoktfmPqevKden5_yr_c7M/s1600/2014-09-05+08.59.25.png" width="225" /></a></div>
<br clear="all" />
<br />
<h3>
ソース</h3>
操作命令送信のサンプルは「<a href="http://neuralassembly.blogspot.com/2014/08/android-wear-lg-g-watch.html" target="_blank">Android Wear (LG G Watch) で三輪ロボットを操作してみた</a>」にあります。<br />
<br />
映像受信のサンプルは <a href="https://github.com/neuralassembly/MjpegViewWear" target="_blank">neuralassembly/MjpegViewWear</a> になります。Android Studio でインポートして、スマホとWearの両方にインストールしてください。<br />
<br />
MjpegViewerWearを試すには、上の動画で行っているように、<a href="http://neuralassembly.blogspot.com/2013/11/raspberry-pipi-noirandroid.html" target="_blank">Raspberry Piで動画配信する</a>という方法もありますが、より簡単に試すには、Androidスマートフォン(以下「別スマホ」と表記)を用意してその上で<a href="https://play.google.com/store/apps/details?id=com.pas.webcam&hl=ja" target="_blank">IPWebcam</a>というアプリを動かすのが簡単です。以下、この方法を簡単に示します。<br />
<br />
<ol>
<li>別スマホで、IPWebcamをインストールして起動します。設定は「Video preference / Video resolution を640x480」、「FPS Limit を15または10」程度に設定し、「Start server」。起動すると画面にIPアドレスとポート番号が表示されるのでメモします。FPS Limitが小さいほうがWear側のアプリは安定します</li>
<li>WearとペアリングしたスマホでMjpegViewWearを起動。メニューの設定で、IPアドレスと番号をセットします。コマンドは「videofeed」。「画像スキップの頻度 n」は「n回に一回、Wearに画像を送る」の意味です。大きくすると安定しますが遅いです。小さくすると不安定になるので、nは3より小さくできなくしています。4か5程度にするとWear側のアプリが安定します</li>
<li>ペアリングしたスマホで画像が表示されたら、メニューから「Wearアプリ起動」を実行します。Wearがスリープ状態のときは画面を一回タップしないと映像が表示されません。</li>
</ol>
<div>
注意</div>
<div>
(2014.12追記) スマホとWear間の通信ですが、データを大量に送りすぎると、通信が切れてしまうことがあります。これは、Wear側の時計画面でクラウドアイコンに斜線が入ることでわかります。以前は、「通信が一度切れると、スマホ側かWear側の本体を再起動しないと通信が再開しない」ということがありましたが、Android Wearがアップデートされるにともない、その問題は起こりにくくなっているように思います。現在は「通信が一度切れたら、スマホ側とWear側のアプリを終了して通信が回復するのを待つ」で済むことが多いです。<br />
<br />
<h3>
展示</h3>
</div>
<div>
この内容を、2014年12月21日に東海大学高輪キャンパスで開催されたAndroid Bazaar and Conference 2014 Winterで展示しました(<a href="http://weekly.ascii.jp/elem/000/000/286/286021/" target="_blank">週アスPLUSさん</a>、<a href="http://tappli.org/column-detail.php?id=188&cid=25" target="_blank">TAPPLI</a>さん、<a href="http://unsolublesugar.com/20141223/132059/" target="_blank">星影さんのブログ</a>にも写真があります)。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTCSCDQjn5cJCAWnXfuHypOl_hOVf39DDV2nAxXRlhPNWbG64PCD8xmhPUiPgyfmxe70CkkZFKm-5uO3YW0n6d_8LJo5ILrtBqRZqDBQHJ14F_72d3ftg7wQN7F2TLuLSXvP-QYnE2ngM/s1600/2014-12-21+10.19.13.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTCSCDQjn5cJCAWnXfuHypOl_hOVf39DDV2nAxXRlhPNWbG64PCD8xmhPUiPgyfmxe70CkkZFKm-5uO3YW0n6d_8LJo5ILrtBqRZqDBQHJ14F_72d3ftg7wQN7F2TLuLSXvP-QYnE2ngM/s1600/2014-12-21+10.19.13.jpg" width="320" /></a></div>
<br /></div>
<div>
この時は下記の構成でデモしました。<br />
<br />
<ul>
<li>映像送信:Raspberry Pi + カメラモジュール (10fps)</li>
<li>ペアリングされたAndroid:Nexus 10 (画像スキップの頻度 5)</li>
<li>Android Wear:LG G Watch R</li>
</ul>
<br />
映像送信の頻度はかなり安全側に振って設定しましたが、その甲斐あってか10:00~17:00の展示時間中、かなり安定して動作しました。</div>
<div>
<br /></div>
<div>
たくさんの方にお越しいただき、ありがとうございました。</div>
<br />
<h3>
余談</h3>
今回実現したのは、2013年に「i'm Watch」というAndroidベースのスマートウォッチで実現したことの焼き直しです。下にリンクがあります。<br />
<br />
それと比べると、Android Wearを搭載した、Googleにより正式に認証を受けた端末で実現した、というのが今回の違いです。<br />
<br />
「i'm Watch」でのデモは「i'm Watch」という時計でしか実現できなかったのに対し、今回のデモは今後増えていくであろうAndroid Wear搭載の時計ならばどれでも動作する(はず)、というメリットがあります。<br />
<br />
<h3>
こちらもどうぞ</h3>
<div>
三輪オムニホイールロボットの操作について</div>
<ul>
<li><a href="http://neuralassembly.blogspot.com/2014/08/android-wear-lg-g-watch.html" target="_blank">Android Wear (LG G Watch) で三輪ロボットを操作してみた</a></li>
<li><a href="http://neuralassembly.blogspot.jp/2013/10/enchantmoon.html" target="_blank">enchantMOONで三輪オムニロボットを操作してみた</a></li>
<li><a href="http://neuralassembly.blogspot.jp/2013/08/firefox-osraspberry-pi.html" target="_blank">Firefox OSとRaspberry Piで三輪オムニホイールロボットを操作してみた</a></li>
</ul>
<div>
Raspberry Piでの映像配信について</div>
<ul>
<li><a href="http://neuralassembly.blogspot.jp/2013/11/raspberry-pipi-noirandroid.html" target="_blank">Raspberry Pi用カメラモジュールおよび赤外線カメラPi NoIRの映像をandroidで表示してみた</a></li>
</ul>
<div>
時計での模型操作について(i'm Watchという時計でのデモ)</div>
<ul>
<li><a href="http://neuralassembly.blogspot.jp/2013/04/im-watchrc.html" target="_blank">スマートウォッチi'm WatchでタミヤのRCモデルを操作してみた</a></li>
<li><a href="http://neuralassembly.blogspot.jp/2013/01/im-watchmjpeg.html" target="_blank">スマートウォッチi'm WatchでMJPEGストリームを表示してみた</a></li>
<li><a href="http://neuralassembly.blogspot.jp/2013/01/im-watch.html" target="_blank">スマートウォッチi'm Watchでプラレールを操作してみた</a></li>
</ul>
Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com0