2016年7月31日日曜日

秋月電子で売っていたCEREVOのワイルドミニ四駆をスマホで動かす改造キットを作ってみました

 こんかいのがらくたは、秋月電子で売っていたCEREVOの「ワイルドミニ四駆をスマホで動かす改造キット 」です。製造元は CEREVO です。ネットで調べると元々CEREVOさんのブログ記事やそれを使ったワークショップ等で使われている3Dプリンタで作ったもののようですが、サーボを使ったサスペンション周り等を新しく型を起こして作りやすいようにキット化して販売しているもののようです。秋月電子さんやスイッチサイエンスさんあたりのWebショップを徘徊していて、たまたま見つけてポチってしまいました。改造元にするタミヤのワイルドミニ四駆キットが必要なので、アマゾンで「マンモスダンプ」と「ワイルドザウルス」も購入。
 アマゾンはいつもの中身の二回りは大きい箱にダンボール板にシュリンクというかビニールで巻きつけた梱包で届きました。秋月は昔からそうですが、新聞紙を丸めて緩衝材にしてありました。この秋月の新聞紙緩衝材は再生利用で悪く無いですよね。捨てるまで新聞紙を広げて平にしてかさばらないようにはしますが、通販の梱包で一番面倒で最悪なのはシールドエアーみたいなビニールを空気で膨らましたようなやつで、カッターやハサミで一個一個中の空気を抜いてやるのが面倒くさい・・。


 では、早速開梱。基板・パーツ、改造用プラパーツ、シール(シールには改造したい本体に貼り付けて穴位置を決められるシールも入っています。)、説明書等が入っています。


 まずは、基板のハンダ付け。表面実装抵抗が一つありますがそれ以外はESP8266を除いては簡単です。ハンダ♪それハンダ♫
 ただし、ESP8266はちょっと面倒です。説明書のハンダ付けの順番は無視して、表面実装抵抗とESP8266は先にハンダ付けしたほうが良さそうです。周りに他の部品があるとハンダ付けの邪魔になります。


 一応、この段階で ESP8266 にスケッチを書き込み、スマートフォンとの無線接続、スマートフォンから操作してモータの回転、サーボの回転を確認しました。

 次はワイルドミニ四駆のシャーシの加工です。


 ワイルドミニ四駆のキットのシャーシをニッパで加工するように書いてあったので、はじめはニッパで少しずつ切り取っていたのですが、面倒になって、途中でバンドソーを引っ張り出してきてぶった切ってしまいました。


 穴あけは3mmと小径で薄いプラスチックなのでボール盤は使わずに、ハンドドリルで行いました。



 改造用オリジナルプラパーツでサーボを使ったステアリング機構を組み立てます。


 切断・穴あけ加工したミニ四駆のボディパーツにネジ止め。


 足回り、ホイール・タイヤを取り付け。


 モータをはめ込んで、基板を両面テープで固定します。


 ワイアをねじりっこで束ねて、出来上がり。


 本当はミニ四駆キットのボディカバーをかぶせるんですが、ステアリングの動きなどもみたいので、このまま動かしてみました。
 実際に動かしてみたところ、ステアリングが右に偏っており、まっすぐ進まない状態だったので、サンプルプログラムのサーボ位置を決める定数定義の値を調整して、直進、左、右、それぞれのステアリングが所望の位置に来るようにしました。


 CEREVOさんから提供されているサンプルプログラムはESP8266側を無線LAN APにしてスマホをダイレクトに接続させるものですが、別の(家の)APにミニ四駆を接続して、PC等からもコントロールできるようにしたり、ESP8266の開いているポート(アナログ入力とか)にセンサを接続したりして遊べないか、今後検討予定です。

2016年7月18日月曜日

Adafruit TTL Serial Camera (VC0706) を ESP8266 で動かしてみる

 本日のがらくたは、Adafruit の TTL Serial JPEG Camera (VC0706) です。この VC0706 はシリアル通信で VGA (640x480), QVGA (320x240), QQVGA (160x120) の解像度のJPEG画像が取得できるカメラモジュールです。
 今回はこの VC0706 を ESP8266 でコントロールして画像を取得してみようと思います。例によって今回もESP8266 は スイッチサイエンスさんの ESPr Developer を使います。 VC0706 に関しては Adafruit から Arduino 用のライブラリが提供されているので、これを ESP8266 でもそのまま利用できるだろう前提で進めます。
 やりたいこととしては、Adafruit の VC0706 ライブラリの機能(VC0706のハード自体の機能?)で動体検知 (Motion Detect) が可能なので、画像に動きを検出したら撮影画像を microSDカードに保存して、ブラウザに表示(ただし、今回は手動でブラウザの更新ボタンを押して手動で最新表示にすることとします)するようなものです。今回、内蔵Flash領域のSPIFFSを使わずに microSDカードをわざわざ外付けにしたのは、プログラム作成・デバッグ時に撮影されたJPEG画像を直接ファイルを開いて参照したかったっからです。SPIFFSだと作成されたJPEGファイルを手動で取り出し、参照する方法がわかりませんでした。SDカードなら取り外してPCで確認できますからね。


 今回のプログラムは Arduino core for ESP8266 のサンプルスケッチ ESP8266WebServer → SDWebServer をほぼそのままコピペして流用しています。この SDWebServer.ino スケッチに VC0706 の動体検知撮影サンプルのスケッチの処理をくっつけて作ったような感じです。
 で、結論から言うと、一応目指していた動作はできたんですが・・・遅い・・・画像のSDカードへの書き込み(デバッグ用シリアル出力で書き始めと書き終わりのタイミングで印字)もSDから読んでWebページに表示するのも遅い(昔、ISDNとかでインターネット接続していた頃のような画像表示スピード)です。移動体に載せることも考えていたけど、無理かな。SPIFFSに変えたら早くなるかな?
 とりあえず、ソースは以下のような感じです。また、SDカードの配線はこちらを参考にしました。VC0706 は ESP8266 の4ピンと5ピンをSoftwareSerialとして利用して接続しました。カメラ側TXを4ピン(RX)へカメラRXを5ピン(TX)に接続します。index.htm はSDカードのルートに置いておきます。

2016年7月13日水曜日

Visual Studio で Raspberry Pi のリモートデバッグ ( ApplePi の例)

 ずっと以前に Raspberry Pi のクロス開発環境構築 というのをやったんですが、実際に自分でC/C++でRaspberry Piの開発を行うときは VisualGBD というツールを使って Visual Studio でリモートデバッグ or クロス開発をしています。この VisualGDB はとってもおすすめなんですが、有料で決して安くはない価格です。
 そこで、今回は Visua C++ for Linux Development という 無料で利用できるMicrosoft純正の Visual Studio用 Linuxリモートデバッグ開発ツールを試してみようと思います。

 まずは、拡張機能のインストールです。Visual Studio 2015 の「ツール」→「拡張機能と更新プログラム」を選択して、「オンライン」の「Visual Studio ギャラリー」で右上の検索ボックスに「Visual C++ for Linux」的な言葉を入れて検索します。「Visual C++ for Linux Development」というのが見つかるはずなので「ダウンロード」ボタンをクリックしてダウンロードして、インストールを行います。Visual Studioの再起動が必要かと思います。


 Visual Studio の「ファイル」→「新規作成」→「プロジェクト」で新しいプロジェクトダイアログが表示されたら、右側のテンプレートから「インストール済み」→「テンプレート」→「Visual C++」→「クロスプラットフォーム」→「Linux」を選択、右側の「Blink(Raspberry Pi)」を選択して、プロジェクト名を入力してプロジェクトを作成します。


 WiringPi を使って、17pin に接続したLEDを 0.5秒間隔で点滅させるサンプルコードが main.cpp として作成されるようです。
 
 今回はサンプルとして トラ技2016年8月号に基板(だけ)が付録としてついてきた ApplePi をターゲットにしてみたいと思います。まずはターゲットの接続情報を設定します。Visual Studioの「ツール」→「オプション」でオプションダイアログを表示して、左のツリーで「Cross Platform」→「C++」→「Linux」→「Connection Manager」と選択して、右側の「Add」ボタンをクリックすると接続情報を設定するダイアログが表示されるので、ApplePiへの接続情報を入力します。


  例えば、ホスト名が "ApplePi"とすると以下のような感じになります。SSHログインが出来るようにRaspberry Pi側を設定しておく必要があるかと思います。自分は以前に設定してあったので、特にその部分を気にすること無く接続できてしまいました。


 SSHサーバや gcc(g++)の開発環境自体まだ使っていない場合は、

     sudo apt-get install -y openssh-server g++ gdb gdbserver freeglut3-dev

として、SSHと開発ツールをインストールして下さい。
 以下、接続設定が成功した場合の表示例です。



 次に Raspberry Pi 側の include ファイルのフォルダを共有して Visual Studio の include 参照先に設定することで intellisense等を有効にします。この辺の設定は こちらを参考にしています。

 まず、sambaをまだインストールしていない場合は、

     sudo apt-get install -y samba

 共有フォルダを追加するために /etc/samba/smb.conf の末尾に記述を追加します。

     sudo vi /etc/samba/smb.conf

 以下を追記。

     [share]
     path = /home/pi
     writable = yes
     guest ok = yes
     guest only = yes
     create mode = 0777
     directory mode = 0777
     share mode = yes
     force user = pi

     [usr_include]
     path = /usr/include
     writable = no
     guest ok = yes
     guest only = yes

 [share]フォルダは pi ユーザのホームディレクトリをWindows側から操作できるようにするのと、このホームディレクトリをに ApplePi のインストールファイルを展開してあるので、その中に bcm2835.h , bcm2835.c 等のApplePi のプロジェクトで参照したいファイルが存在するために共有しました。[usr_include]は一般的なincludeファイルを参照するための共有でリードオンリーに設定しています。ここで、サービスを再起動します。

     sudo service smbd restart

 これで Windows 側から Raspberry Pi の /home/pi = "share" と /usr/include = "usr_include" が参照可能になります。



 Raspberry Pi 側で Avahi を設定していない、あるいは、Windows 側が Windows 10 ではない(Win 7とか)だと名前ではアクセス出来ないかもしれません。その場合はIPでアクセスします。

 次にプロジェクトの各種設定を行っていきます。プロジェクトのプロパティ画面を開いて、「構成」を「すべての構成」(またはDebug)を選択して、「構成プロパティ」の「General」の「Configuration Type」を「Application (.out)」を選択します。


 次に Includeパスに Raspberry Pi の共有フォルダを追加します。同プロジェクトのプロパティ画面の「VC++ Directories]の「Include Directories」に共有フォルダのパス、この例では、「\\ApplePi\usr_inclue」と「\\ApplePi\share\bcm2835-1.50/src」(ここに bcm2835.h がある)を設定します。


 次はリンクするライブラリの設定です。作成されたプロジェクトでは wiringPi のライブラリが設定されていますが、今回は ApplePi を使うので bcm2835 をライブラリに指定します。



 念のため、「Remote settings」の「Target machine」が正しく設定されていることを確認しておきます。選ばれていない場合はプルダウンで選択します。


 main.cpp の内容をそっくり全て置き換えます。

 これで「Remote GDB Debugger」ボタン(「デバッグの開始」)でクロスコンパイルが行われ、プログラムが実行されます。ApplePiのボード上の2つのLEDが交互に点滅します。
 ブレークポイントを置いてステップ実行したり、ブレーク中に変数にマウスを合わせて値をポップ表示させたりもできます。下記は条件ブレーク(条件 i==5)を設定してブレークをかけたところです。



2016年7月9日土曜日

ESP8266でLEGO Power Functions IR を動かしてみる

 今回のがらくたは 例のESP8266にUSBコネクタIFやブート(書き込み)スイッチ等を使いやすく実装した スイッチサイエンスさんの ESPr Developer 開発ボードと LEGO Power Function シリーズの赤外線リモコン受信モジュール LEGO 8884 Power Function IR Reciever です。

 今回は、ESP8266を使ってWebサーバを構成し、ブラウザ操作で LEGO Power Function IR Reciever を制御する赤外線信号を生成して LEGOを動かしてみたいと思います。

 LEGO Power Functions IR Reciever はLEGO Power Function シリーズの電池ボックスと各種モータの間に中継することで赤外線リモコンでモータの回転速度を制御できるユニットです。




使い方のイメージとしてはこんな感じです。


 このIR Reciever の赤外線受光部、上部の黒いドーム状の部分に上面から赤外線LEDを対向させるように次のようなパーツをLEGOブロックに赤外LEDをホットボンドで固定して作成しました。


 これをIR Reciever にかぶせて、確実に赤外線をIR Reciever が受信できるようにします。



 赤外線LEDは今回は ESP8266 の 13ピンから220Ωの抵抗を介して ESP 13ピン → 220Ω → 赤外線LED → GND のように配線しています。 


 ブラウザからの制御を実現するためのソフトウェアに関しては色々調べてみたんですが、スマホのゲームなんかでよく使われる画面上に仮想のアナログスティックのようなものを表示しているものがありますが、あんな感じのをJavaScriptのライブラリを使って簡単に実現できるようなのがないかと探して、結局「enchant.js」というゲーム用のライブラリに行き着きました。この「enchant.js」はゲーム用のライブラリですが、自分が使いたかった仮想ジョイスティックが簡単に実現できるのと、ドキュメントが日本語で用意されているのがありがたがったので、こちらを利用させてもらうことにしました。
 ブラウザ側JavaScriptプログラムとESP8266側Webサーバプログラム間の通信はWebSocketを使ってコネクションを張ることにします。WebSocketのライブラリはこちらを利用しました。
 ESP8266にはSPIFFSというフラッシュメモリの一部をファイルを格納する領域として使える機能があるので、このSPIFFSにHTMLやJavaScriptファイルを保存して、ESP8266でWebサーバを実装します。と、いってもサンプルプログラムにほぼそのままWebサーバのサンプルなどがありますので、このあたりは比較的簡単に実現できます。
 ※SPIFFSの使い方についてはこちらとかを参考にしてください。

 次にLEGOの赤外線リモコンですが、実はこの仕様は LEGO社が公開してくれていて、さらに 従来のArduinoでこのLEGOの赤外線リモコンを利用するためのライブラリをすでに作成してくれている方が何人かいます。そのなかで、今回はこちらのライブラリを利用させてもらうことにしました。従来のArduino用のライブラリですが、ライブラリ内で特殊なことは行っていないのでESP8266でも使えます。ただし、信号のタイミングをdelay()関数で作っているのでメインループで処理をぐるぐる回すとだんだん遅れというか処理が詰まってきます。他の処理(ループ)の何回に一回だけ呼ぶ、といった工夫をしてやる必要があります。


 以下、ESP8266 for Arduino のスケッチです。

 以下がHTML。適宜、enchant.jsのライブラリやイメージファイル、次のmain.jsプログラムを配置する必要があります。

 以下が JavaScript。

2016年7月8日金曜日

Visual Studio で LEGO の python をデバッグする

 久々更新の今回は、LEGO Mindstorms で Python を使って開発する場合に Visual Studio 2015 を開発環境として利用する方法についてまとめてみようと思います。

 そもそも、LEGO Mindstorms で python を使ったプログラミング環境として、とりあえず、自分が思いつくのは、 純正 LEGO Mindstorms EV3 の OSを ev3dev にして利用するパターン、Dexter Industories社の BrickPi をコントローラにするパターン、Mindsensors社の PiStorms をコントローラにするパータンで、これらで python による開発をする場合を想定します。そういう意味では、LEGO に限らず、Dexter Industories社の GoPiGoロボットやGrovePi なんかでも同じように利用できます。

 まず、Windows 側でソリューションを作成するフォルダの共有を行い、Linux側ユーザからフルコントロールアクセスできるように設定しておきます。たとえば、 pi ユーザをWindows側に作成し、このユーザでフルコントロールアクセスできる共有フォルダ(仮に Workspace とする)を用意しいておきます。

 Linux側で cifsマウントで Windows側の共有フォルダを適宜マウントします。

   cd ~
   mkdir Workspace
   sudo mount.cifs -o username=pi,password=raspberry //winpc_name_or_ip.local/Workspace ~/Workspace

 ev3dev 以外の通常の Debian Jessie Linux環境ではデフォルトでcifsマウントが可能ですが、ev3dev ではcifsマウントを行うには カーネル再構築 が必要です。手間がかかるので Windows側で作成した pythonソースファイルをデバッグ時に ev3dev へコピーする方法もあります。

 次に Linux側に ptvsd (Python Tools for Visual Studio remote Debugging server) をインストールします。ptvsd は pip でインストールできます。

   sudo apt-get update
   sudo apt-get install python-pip
   sudo pip install ptvsd

 もし、Firewallが稼働している場合は、ポート:5678 を開ける必要があります。

 Visual Studio で 「新しいプロジェクト」→「Python」→「Python Application」のように選択して、新しい python プロジェクトを作成します。


 python のソース冒頭付近にデバッグ用の記述を入れます。以下は一例です。

   import ptvsd
   import platform
   ptvsd.enable_attach(secret = 'ptvsd')
   print 'Waiting for attach...'
   if platform.system() != 'Windows' :
       ptvsd.wait_for_attach()

 デバッグ対象のソースを cifsマウントしたものをLinux側から実行するか、Linux側にコピーして実行すると、待ち状態になります。


 次にVisual Studio 側で 「デバッグ」→「プロセスにアタッチ」を選択して、


 「トランスポート」で「Pyton remote (ptvsd)」を選択して、修飾子に secretキー@ホスト名  を入力すると選択可能なプロセスにターゲットのプロセスが表示されるので「アタッチ」ボタンをクリックしてアタッチします。


 デバッグが開始されます。上の画面ではブレークポイントで一時停止して、変数の値を参照しています。