Onion Omega 着弾

Onion Omega: Build Hardware with JavaScript, Python, PHP by Onion — Kickstarter
https://www.kickstarter.com/projects/onion/onion-omega-invention-platform-for-the-internet-of
Raspberry Piの4分の1でWi-Fi機能。小型ボード「Onion Omega」 | fabcross
https://fabcross.jp/news/2015/04/20150403_onion_omega.html

勢いで Kickstater で買った Onion Omaga が届きました。当時の私は Raspberry Pi と Arduino でモーターを動かして喜んでいた頃で、ともかく「1/4 のサイズで」というのに惹かれて買ってみました。まあ、何に使うかわからない感じだったので、どういう風に使うか決めてはいなかったのですが…意外とさっくりと動きます。

これは、セットアップした後に Tera Term で Omega に接続しているところです。中身は組込み Linux が入っているので電源を入れるだけで動きます。CPU速度やメモリ容量は Raspberry Pi 2 などよりも低いのですが、大きさが小さいのと電力が少なくて済むことです。ワットモニターで測ったところ、1.0 から 1.2W 程度で動いています。Raspberry Pi が 2.0W 程度なので半分ぐらいの電力で動きます。

大きさでは 1/4、値段は Orange Pi より高い

Omega のピン幅は 2.54mm より狭いので何らかの変換基盤が必要です。

Omega – Onion Store – Onion
https://store.onion.io/products/omega-dock?variant=7907062145

写っているのは MiniDock を加えたもので、あわせて $25 です。使い捨て…な感じでは使えないけど、Raspberry Pi 2 ほど高いわけでもないという感じですね。ただし、単に Linux ボードで実験したいだけならば、Orange Pi が $15 で手に入ります(実際は、micro SD カードが必須になるので、結果的には $25 ぐらいになるかと)。

ただし、Omega の場合は小さいので、そのまま Arduino mini 感覚でラジコンカーやロボットに載せることが可能かなと。

Onion Omega は WiFi が標準で使える

おそらく、Onion Omega の最大の特徴は、WiFi が標準で搭載されているところです。すでにボード自体に Wifi が載せられているので別の拡張ボードを買う必要がありません。単純に組込み Linux 上で何かをやらせるだけならば、先の MiniDock にある USB コネクタに電源を供給すれば ok です。

WiFi は通常のクライアント方式と、アクセスポイント方式の2つから選べます。通常はクライアントとしてネットワークに参加させておけばよいでしょう。

image

セッティングは USB ケーブル直結でもよいし、WiFi の設定をした後はブラウザから操作ができます。ブラウザは Firefox や Edge は動かないないので、Chrome を使っています。たぶん、内部で使っている JavaScript の関係のような気がします。

こんな感じでブラウザ上でターミナルを動かすことも可能です。

image

opkg で python をインストールする

中身をみていくと OpenWrt がベースになっているようです。OpenWrt は Intel Edition にも載っているそうなので、その練習用にもよいかもしれませんね。

OpenWrt – Wikipedia
https://ja.wikipedia.org/wiki/OpenWrt

パッケージのインストールは opkg コマンドでやるそうなので、opkg install python とすると python がインストールできます。結構な容量を使ってしまいますが、ちょっとした Python スクリプトを動かすぐらいだろうから、これで十分でしょう。ちなみ、私は Python は詳しくないので、これからどうやるのかよくわかりません(苦笑)。サーボモーターを動かすスクリプトを見つけてきて試してみましょう。

image

残念ながら opkg install mono は動かないかったので、.NET は動かないようです。.NET Core とか別途インストールすればいけますかね?

工場出荷状態に戻す

ブラウザからさっくりと工場出荷状態に戻すことができます。

image

というわけで、組込み Linux として使えば結構応用範囲は広いんじゃないかと思います。画像エンコード等は CPU パワー的には無理ですがカメラキットがあるので、撮影はできるようです。Rolling Spider も組込み Linux なので、このあたりも似たような感じじゃないかなと。

Mini Dock に USB コネクタがあるので、何か接続できるのかもしれません。マウスとかキーボードとか、ひょっとしたら UVC Camera とか(カメラキットが 720p WebCam になっているのでたぶんできると思う)。そのあたりの調査はおいおいに。

カテゴリー: 開発 | Onion Omega 着弾 はコメントを受け付けていません

LEGO Mindstorms EV3 を Xamarin Studio でデバッグする

怒涛の EV3 シリーズの第3弾めです。

LEGO Mindstorms EV3 を C# で動かす | Moonmile Solutions Blog では、Visual Studio で作成した実行ファイルを WinSCP でアップロードしていたのですが、これが結構手間です。プログラムを修正するたびにいちいちアップロードをしないといけませんね。バッチ化してアップロードしてもよいのですが、Xamarin Studio を使うとビルド後にアップロード、かつ C# でデバッグ実行ができるので、これを紹介します。

ET ロボコンで MonoBrick が使われている

etroboEV3 / Wiki / MonoBrickWin
http://sourceforge.net/p/etroboev3/wiki/MonoBrickWin/#11-monobrick-ev3-firmware

参加するのはなかなか(財布的に)大変なのですが、個人的に使ってみる分にはタダです。このサイトの解説で十分ではあるのですが、メモ的に Bluetooth 接続部分と Xamarin Studio のアップロード部分を補足しておきましょう。

ETロボコンには、TOPPERS/EV3RT という uTronベースのリアルタイム OS も使われているので、こっちのほうも後で試してみます。EV3RT のほうは C++ で記述するようです。RTOS の勉強によいかと。

Windows 10 では USB ケーブル接続ができない

最初に注意しておきますが、Windows 10 では MonoBrick との USB ケーブル接続ができません。Windows 7/8 の場合は可能なのですが、10 の場合は、RNDIS/Ethernet Gadget が自動的に COM ポートに割り当てられてしまうらしく、etroboEV3 / Wiki / MonoBrickWin にあるようにネットワークアダプタに割り当てられませんでした。

EV3 Connection problem – USB and BT – Windows 10 – leJOS 海外でも問題になっているようです。

Bluetooth 接続する

そんな訳で、Bluetooth を使って接続をします。WiFi ドングルの場合は、IP が割り当てられますが、Bluetooth のほうはどうするのかというと、TCP/IP on Bluetooth というのを使って、同じように IP アドレスで接続ができます。EV3 側が「10.0.1.1」にして接続ができます。

Bluetooth ドングルを EV3 インテリジェントブロックに差し込んで MonoBrick を起動します。以前、もともとの EV3 と接続している場合にはペアリングをやり直します。

image

ペアリングをすると、パスコードが出るのでそのまま「はい」を押してください。パスコード自体が インテリジェントブロック側に出て来ないので不安といえば不安ですがw。

image

うまくペアリングができると接続状態になります。

ここでネットワーク接続を開いて、×印になっている Bluetooth ネットワークをダブルクリックします。

image

ペアリングができていると、EV3 が見えていると思うのでこれを選択して、「接続方法」→「アクセスポイント」を選択します。

image

すると、Blueooth のマークが暫く出て接続が完了します。この「アクセスポイントに接続する」作業は EV3 を起動するたびに行います。

ping を飛ばすと、きちんと応答を返すし、

image

Tera Tearm で SSH 接続して、ifconfig を見ると 10.0.1.1 が割り当てられていることが解ります。

image

ちなみに、PC 側は 10.0.1.10 で接続が可能です。

image

Mono runtime をインストールする

デバッグ実行するのに、Mono Runtime が必要です。Xamarin Studio だけを入れた状態では入っていないので、別途入れます。

Download | Mono
http://www.mono-project.com/download/#download-win

からダウンロードしてインストールすれば ok です。

Xamarin Studio にアドインを入れる

MonoBrick EV3 Firmware | MonoBrick.DK
http://www.monobrick.dk/software/ev3firmware/

から Xamarin Studio の Add-in をダウンロードします(もともと、MonoBrick とワンセットなんですね)。ファイル名は「addin.mpack」です。

Xamarin Studio を起動して、「Install from file」から、先の addin.mpack をしてします。

image

インストールができると「ツール」→「オプション」の「その他」の項目に MonoBrick が増えているのが解ります。

image

ここで、デバッグ先の EV3 の IP を指定(Bluetooth 接続なので 10.0.1.1)しておきます。

Xamarin Studio でプログラミングする

やっとこさ準備が整ったのでデバッグ実行してみます。Xamarin Studio を立ち上げて、新しいプロジェクトを作るときに、「その他」→「Miscellaneous」→「MonoBrick Project」を選択します。

F# でも作れるのですが、少しコツがいるので、また後で。

image

サンプルプロジェクトが作成されます。

image

Visual Studio で作ったときと同じように、コマンドラインのプロジェクトで、MonoBrickFirmware を読み込んでいるところです。

ダイアログ(EV3 の液晶ディスプレイ)にメッセージを表示させてモーターを3秒間だけ動かします。

(現状ではテンプレートに間違いがあるらしく、一か所だけ修正が必要です。InfoDialog クラスのコンストラクタにある ture を削除してください)

デバッグ実行をする前に「プロジェクト」→「有効なランタイム」で、「Mono 4.0.3 …」のほうを選択しておきます。

image

Microsoft .NET にしておくとビルドは通るのですが、デバッグ実行時に You must use the Mono runtime for debugging! のエラーがでます。もちろん、

image

有効なランタイムを Mono に変更してビルド、そしてデバッグ実行をすると、以下のようにアプリケーション出力がでて、EV3 インテリジェントブロックへアセンブリが自動アップロード、かつ実行されます。

image

インテリジェントブロックにダイアログが出るので、真ん中の OK ボタンを押します。すると、モーターが3秒だけ動いて、プログラムが終了します。

image

ブレークポイントは貼れないみたいですね。ダイアログを表示しているときに、一時停止ボタンを押すとスタックトレースが出るので、何らかのブレークはできそうです。

Debug.WriteLine をしても何処にも出ないので、いわゆるプリントデバッグは難しそうですね。インテリジェントブロックの液晶ディスプレイに出すか、別途 PC にログを飛ばす方式を考えたほうがよさそうです。

やっぱり F# で作ってみる

往年の F#er(ってほど使ってないけど)、としては F# プロジェクトを使ってみたいですよね。

そんな訳で C# と同じように組んでみます。

open System
open System.Threading
open MonoBrickFirmware
open MonoBrickFirmware.Display.Dialogs
open MonoBrickFirmware.Display
open MonoBrickFirmware.Movement

let main() = 
    Lcd.Clear()
    LcdConsole.WriteLine("Hello World!")
    Thread.Sleep(2000)
    Lcd.Clear()

    let dialog = InfoDialog("Attach a motor to port A in F#")
    let b = dialog.Show()
    let motor = Motor(MotorPort.OutA)
    motor.SetSpeed(sbyte(50))
    Thread.Sleep(3000)
    motor.Off()
    Lcd.Clear()
    Lcd.Update()

main()

F# の場合は、何故かビルド時に「有効なランタイム」を Mono にするとビルドができないので、

  • ビルド時には「Microsoft .NET」を選択する
  • 実行時には「Mono 4.0.3 …」を選択する

という妙なことをやります。

image

こんな風に無事 F# で動いていることが解ります。

Mono 4.0.3 を使ってビルドをするとこんな感じになります。

image

「指定された実行可能ファイルはこのOSプラットフォームに対して有効なアプリケーションではありません」と出るので、Mono 4.0.3 のランタイムと F# コンパイラのバージョンがずれていると思うんですけどね。これは後で調査しましょう。

Visual Studio では動かないのか?

アドインのコードは、monoev3/AddIn at release · Larsjep/monoev3 にあるので、SCP で送るだけなのでなんとかなるかなと。SshNet を使って SCP しているようなので、monoev3/AddIn/Source at master · Larsjep/monoev3 アドイン自体のコード量はそう多くないので、おいおいに。

カテゴリー: C#, EV3, Xamarin | LEGO Mindstorms EV3 を Xamarin Studio でデバッグする はコメントを受け付けていません

LEGO Mindstorms EV3 を C# で動かす

レゴ エデュケーションと日本マイクロソフトが日本発 IT 人材育成を目的としたプログラミング ロボット教育カリキュラムの提供で連携 | News Center Japan
http://news.microsoft.com/ja-jp/2015/10/27/151027-azure-lego-education/

ということで、日本でも LEGO と Microsoft が組むそうです。カリキュラム自体は Azure が必須(まあ Microsoft としてはそれが IoT の売りなので外せない)なのですが、個人的には Azure はいりません…が、ドキュメントがダウンロードできるので利用させていただきます。

ロボット×クラウドではじめての本格プログラミング~レゴ® マインドストーム® で地球を探査 | Microsoft Virtual Academy – 専門家が提供する e ラーニング コース – | Channel 9
https://channel9.msdn.com/Series/Microsoft-Virtual-Academy-Japan/lego-mindstorms-programming-curriculum

image

上記からカリキュラムで利用するプレゼン資料とプログラム一式がダウンロードできます。この中で結構ありがたいのは、EV3Azure_Workshop_SetupManual.pptx のプレゼン資料です。この中で、

  • MonoBrick Firmware のインストールの仕方
  • WiFi の設定の仕方

が書いてあります。ちなみに、WiFi は、暗号化なしか、WPA2(WPA-PSK(AES)) の二種類しか選択できません。無線ルータの設定にもよるので、結構ここは躓きやすいところです。探査機ロボットの場合は、センサーで取得した結果を Azure に飛ばすので WiFi が必須になっていますが、無線だけやりたいのであれば Bluetooth のほうが手軽です。

MonoBrick の micro SD カードを作る

Creating A Bootable SD Card On Windows | MonoBrick.DK
http://www.monobrick.dk/guides/firmware-guides/monobrickfirmwaresdcardwindows/

image

上記から MonoBrick のイメージをダウンロードできます。Win32 Disk Imager の使い方も書いてあるので解りやすいでしょう。512MB, 2GB, 4GB 版と3種類ありますが中身は一緒で容量だけが違います。8GB のメモリカードに 512MB を入れてもよいし、4GB 版を入れてもよいでしょう。作業領域の違いだけですね。Raspberry Pi や Windows IoT の場合は 8GB が必要なのですが、MonoBrick の場合はグラフィック系がないためか 512MB でも十分なようです。

EV3 で MonoBrick を起動する

micro SD カードに MonoBrick を焼きこんだら、インテリジェントブロックに差し込んで電源を入れます。CPU が遅いのか、Linux の起動が遅いためか分かりませんが、起動時間は1分弱ぐらいかかります。

image

起動が終わると、Main Menu が出るので「Brick Information」を選択すると、ファームウェア等の情報が見れます。

image

現時点(2015/10/29)では、

  • Firmware 1.2.0.39486
  • Mono version 2.10.9
  • Mono CLR v4.0.30.319

になっています。.NET Framework のバージョンは最新が v4.6 なので、ちょっと古いのですが、愛艇の C#/F# のプログラムは動くはずです。

WiFi を設定する

WiFi の暗号化が「None」か「WPA/2」しか選べないので、うまくつながらないときは無線ルーターの設定を見直してください。暗号化なしが選べるので、パスワードなしのオープンな無線ルータに接続できるかもしれません。

image

SSIDとパスワードの設定が結構面倒(DSでぽちぽち設定するぐらい面倒)ですが、きちんと設定すると「Brick Information」で割り振られた IP が見れます。

image

Tera term で SSH で入ることができます。ユーザ名は「root」で、パスワードはありません。Linux 2.6 が動いていることが解りますね。

image

ifconfig などのコマンドも動くので、細かい設定は /etc/network/interface をいじったほうが早いかもしれません。ただ、iwconfig 等のコマンドがないので、別で設定している可能性もあります。

image

Visual Studio プログラムを書く

Microsoft 提供のサンプルコードを見ると、プログラムはコマンドラインアプリになります。参照設定に「MonoBrickFirmware」を加えて、EV3 のモーターやセンサーの類が使えるようになりますね。

image

他にも、MonoBrickFirmware.UserInput でインテリジェントブロックのボタン押下のイベントが取れたり MonoBrickFirmware.Services.WebServer で簡易 WebServer が作れたりします。ネットワークを通じて EV3 のロボットを操作することが可能ですね。

CLR のバージョンが v4.0 なので async/await が使えないはずですが、これは後で確かめます。

MonoBrick のサンプルは Larsjep/monoev3 で公開されています。MonoBrickFirmware 自体は monoev3/MonoBrickFirmware at master · Larsjep/monoev3 で公開されているので、C# から直接 EV3 のセンサーを叩く時に参考になるでしょう。

WinSCP で実行ファイルを EV3 に送る

Visual Studio でビルドした実行ファイルを、EV3 に送るには、WinSCP を使います。SCP クライアントならば何でもいいはずですが、MS のドキュメントにもあるのでそのまま使うのがいいかなと。

WinSCPとは :: WinSCP
https://winscp.net/eng/docs/lang:jp

転送プロトコルを「SCP」にして、ポート番号は「22」のまま。ユーザ名は「root」で、パスワードはなしです。ログインボタンを押すとと、接続時に戻り値のエラーがでますが、そのまま接続ができます。

image

SSH 上でファイル転送をできるようにした方式だそうなので、FTP のように2ポート開けなくてすみます。使い方は同じですね。

image

/home/root/apps/ の下に適当なフォルダ名をつけて(これが EV3 で動かすプログラム名になります) *.exe と *.dll をコピーします。画像をディスプレイに表示する場合は、それらもコピーします。

 

プログラムを実行する

WinSCP で実行ファイルをコピーしたら、インテリジェントブロックでプログラムを実行します。

image

ぽちぽちとカーソルを動かして、実行すれば EV3 で動きます。これは何もモーターなどがついていませんが、ディスプレイに表示だけするとかもできますね。

そんな訳で C# で EV3 が動く環境までできたのですが、この実行の部分が面倒くさい。先の LabVIEW のように PC から直接動かしたり、なんかデバッグしたりできないですかね?というので、Xamarin Studio の登場です。

etroboEV3 / Wiki / MonoBrickWin
http://sourceforge.net/p/etroboev3/wiki/MonoBrickWin/#11-monobrick-ev3-firmware

この手順に従って環境を構築すれば、Xamarin Stduio で EV3 をデバッグ実行することができます。これ自体もともと MonoBrick に含まれているので、ET ロボコン専用という訳ではなくて普段の EV3 開発にも使えます。

というわけでで引き続き。

補足
SSH で接続して apps に移動した後、「mono プログラム名」で起動できますね。WinSCP をバッチ化して Tera Term で常時繋げておけば、インテリジェントブロックのカーソルキーを使わなくてもアプリを起動できます。

カテゴリー: C#, EV3 | LEGO Mindstorms EV3 を C# で動かす はコメントを受け付けていません

LEGO Mindstorms EV3 をフリーの LabVIEW で動かす

手元にある LEGO Mindstorms EV3 は、以前いきおいで買ったもので基本+拡張セットがひと揃いあります。引っ越し前に買って、家で動かしてみたもののかなりの間放置状態だったんですよね。実は、同時に教育プログラムセットの LiveVIEW 版も一緒に買ったのですが使わず仕舞い。引っ張り出そうと思ったんですがダウンロードURLだったか会員番号だったかを SSD ごと紛失してしまったので、なんともなりません。株式会社アフレル で買ったので、再問合せすればダウンロードできたりしませんかね。

フリーの LabVIEW を使う

プログラミング自体は、四角いインテリジェントブロックのボタンを使ってぽちぽち押せば作れるのですが、まあ、なかなか大変です。確か EV3 の Bluetooth シリアル通信は解析されているので、それ経由でハックすることも可能なはずですが、パンダ Scratch みたいに手軽にやりたいところです。

ソフトウェアをダウンロード – ダウンロード – レゴ®マインドストーム LEGO.com
http://www.lego.com/ja-jp/mindstorms/downloads/download-software?ignorereferer=true

ということで、上記からフリーの LabVIEW がダウンロードできます。製品版との違いは、Community: NI LabVIEW for LEGO® MINDSTORMS® / LabVIEW Module for LEGO MINDSTORMS – Download – National Instruments にあるのか…ちょっとわかりませんが、インテリジェントブロックと似たような感じで PC 上でプログラムができます。

image

が…、残念なことに EV3 の基本セットに入っている超音波センサーと地軸センサーがありません!

image

その代わりに、最近発売されたらしい赤外線距離センサーが入っています。モジュール自体が追加できるかどうかわかりませんが、まあモーター制御とカラーセンサー、タッチセンサーがあれば、それなりに使えるでしょう。

※既存のプロジェクトから「インテリジェントブロックのインポート」をすると超音波センサーの画像が出て来るので何らかのガードがかかっているのかもしれません。

追記 2015/11/01

いや、違った。Downloads – Mindstorms LEGO.com  にある EV3 Software Block Download から特定のブロックをダウンロードできます。その後に、「ツール」→「ブロックのインポートウィザード」で取り込みができます。なんか、外部ブロックの仕様書もダウンロードできるので、かなりオープンな体制になっているようです。

20151101_01

EV3 と無線接続する

PC と EV3 インテリジェントブロックとの接続は、USB ケーブルか Bluetooth の2種類になります。Bluetooth ドングルは手元の安価な iBuffalo の USB ドングル(千円弱)で動くのでたいていのものが動くと思います。Raspberry Pi もそうなのですが、Linux では iBuffalo か Planex が確実に動くので財布的に助かります。

ちなみに、Wi-Fi ドングルは EV3 では動きません。というか、フリーの LabVIEW では動かず、製品版では動くそうです。まあ、Bluetooth で十分なのでこれを使います。

EV3 インテリジェントブロックに Bluetooth のドングルを差し込んだら、設定→Bluetooth を指定します。この中で「Visibility」と「Bluetooth」だけチェックを入れます。「iPhone/iPad/iPod」にチェックを入れると PC から繋がりません。たぶん、BLE 専用のドングルを使うパターンだと思うんですが、ちょっとよくわからず。

image

Windows PC 側はペアリングが必要です。ペアリングします。

image

ペアリングをしようとすると、コントローラ側でホスト名が出るので、ok ボタン(真ん中のボタン)を押します。パスコードの初期値が「1234」なので、そのままにしておいてokボタンを押すと、

image

PC 側でパスコードを要求するダイアログがでるので同じように「1234」を入れます。

image

その後で、LabVIEW の左下で Bluetooth 接続します。先にPCでペアリングしないとうまくいきません。たぶん、Mac のほうはここだけで設定できるのかも。

image

USB ケーブルでつなげるときは、左の「USB」にチェックを入れれば ok です。

LabVIEW でプログラミングする

で、ブロックを使ってぽちぽちと作って、実行ボタンを押すと EV3 が動きます。転送は自動的に行われるし、今どのブロックが動いているかがちかちかするので分かりやすいです…が、実は作りにくい。EV3 インテリジェントブロックでぽちぽち作っているのに慣れていれば大丈夫なのかもしれませんが。やっぱり C# とかで作りたいですよね。

image

これは、タッチセンサーでボタンを押したらピープ音を鳴らしてちょっとだけモーターを動かします。よくわからないと、これを作るだけでも結構面倒くさい。

接続しているモーターとかセンサーとかは、接続したときに右下に表示されます。また、プログラムは EV3 インテリジェントブロックにアップロードが可能です。既存のプログラムはメモリブラウザを使って追加削除ができます。

image

LabVIEW で作ったプログラムと、インテリジェントブロックで作ったプログラムは互換がないのですが、「ツール」→「インテリジェントブロックプログラムのインポート」を行うと、既存のプログラムを LabVIEW に取り込めます。

このあたりは、LabVIEW 付属のヘルプがあるので読むとよいでしょう(ネット上にはない模様)。

お次は C# で動かそう

そんな訳で手始めに LabVIEW を使ってブロックプログラミングをしておきます。じゃあ、これでは物足りないから普段使っているプログラム言語の場合はどうなるのか?ってのが、

レゴ エデュケーションと日本マイクロソフトが日本発 IT 人材育成を目的としたプログラミング ロボット教育カリキュラムの提供で連携 | News Center Japan
http://news.microsoft.com/ja-jp/2015/10/27/151027-azure-lego-education/

になる訳です。これでは MonoBrick という Linux を使うわけですが、これを引き続き。

カテゴリー: EV3 | LEGO Mindstorms EV3 をフリーの LabVIEW で動かす はコメントを受け付けていません

Electroharmonix フォントが何故、日本人に読めないのかを Tesseract-OCR で紐解く

日本人にだけ読めないという Electroharmonix というフォントが話題なので、どうして読めないのか?というのを OCR を使って解説します…と言いますか、理由は日本はカタカナを知っているけど、欧米人はカタカナが解らないから字形を見てアルファベットにしか見えない(という似た感じの文字を探す)というだけなんですけど、そのあたりを OCR を使って動作確認をしてみようという話。

日本人にだけ読めないフォント「Electroharmonix」が面白いと話題に! | netgeek
http://netgeek.biz/archives/53486

font_confuse (1)

ちなみに、Electroharmonix フォントは 1985年にできたのでフォント的には古いものです。なので、あちこちのゲームやポスターに使ってあるみたいです。

Tesseract-OCR

OpenCV 3.0 に入りましたが、もともとは Google Code にあります。tesseract-ocr – An OCR Engine that was developed at HP Labs between 1985 and 1995… and now at Google. – Google Project Hosting 1995年という結構古いものですが、アルファベットと数字だけなど字形を限って使えば認識率は高くなります。ざっと確認すると、Microsoft OCR よりも認識率が高かったので、なんだろうな、という感じなんですが。

最新のコードは Github に移っています。tesseract-ocr

Tesseract-OCR の学習データを作る

Tesseract-OCRの学習 – はだしの元さん
http://hadashi-gensan.hatenablog.com/entry/2014/01/15/135316

を参考にすると、OCR に学習データが作れます。結構手順がややこしいので後できちんとまとめますが、英語版(eng)と日本語版(jpn)の2つを作りました。

英語版の文字セットは、アルファベットと数字のみで構成

image

日本語版の文字セットは、アルファベットに加えて、カタカナを入れます。

image

image

これをもとに学習データを作成して、

  • アルファベットしか理解しない 英語 OCR
  • アルファベットとカタカナを理解する日本語OCR

ができます。

そこで、例の Electroharmonix フォントで作った文字を与えてやって、どのように認識するのか?を調べればよいわけです。

image

アルファベットを OCR 認識させる

最初に「MASUDA TOMOAKI」のアルファベットを認識させてみます。

image

認識対象のフォントが Broadway のため、若干ずれていますが、まあまあアルファベットとして認識されてますよね。

image

同じものを日本語OCRで認識させると、「A」の箇所が「ム」に誤認されています。英語OCRは「ム」という文字を知らないので、そのままアルファベットに割り当てますが、日本語OCRの場合はカタカナを知っているので「A」に似た「ム」の文字に割り当てます。

例のフォントを OCR 認識させる

今度は Electroharmonix フォントを使った認識させてみます。

image

思ったほど、正確には認識できていませんがw、まあ、無理矢理アルファベットと数字に割り当てて読み解こうとしています。文字数が異なるのは、隣あう文字をひとつの文字にしたり、逆にふたつの文字として誤認しているからです。このあたりは学習データのバリエーションを増やすとか、フォントの間を開けるとかで避けられる問題です。

まあ、なんとなく英語圏の人はこんな感じで認識しているんじゃないかな、という想像ができますね。

今度はカタカナを知っている日本語OCRで試してみましょう。

image

やたらに四角がありますが、「ロ」(ろ)です。Oの部分がロに見えているという訳です。先の英語OCRがアルファベットに割り当てているのと違って、日本語OCRは主にカタカナに割り当てていますよね。もともと、Electroharmonix フォントがカタカナを意識しているので、そちらに引っ張られて、日本人の場合はもともとの読み方ができないわけです。

単純なカタカナならば?

逆にカタカナだけだったどうだろうか?というと、

 

image

英語圏の人には、数字とアルファベットの組み合わせにしか読めないけど、

image

カタカナを知っている日本人には、普通に読めますね、という具合です。

結論…ってほどではないけど

そんな訳で、Tesseract-OCR を使って、日本人だけが読めない理由(実験的にはアルファベット圏の人にも読めませんがw)が実証できたと思います。

具体的なコードは後からまとめましょう。

このあたりを応用して、k近傍法の IkaLog も試してみたいと思う…のですが、スプラトゥーンは持ってないし、Wii U は持ってないし…というわけで、Youtube あたりの動画か認識させればよいかと思案中。

カテゴリー: 開発 | Electroharmonix フォントが何故、日本人に読めないのかを Tesseract-OCR で紐解く はコメントを受け付けていません

割り箸でロボットアームを作ってみる(中編)

既に支柱を LEGO で作ってるので割り箸ではないのですが、タイトルはそのままで。

 

8個のサーボを使って、同時に動かそうと思ったのだけど、実に面倒くさい。デモっぽく動かしたり、最終的には画像認識を使ったりするのだが、その途中で挫折しそうになる…ので、もうちょっと手軽方法を考えていました。

確か、人形を使って三次元映像を作る製品があったはずで、同じようなことはロボットアームでもできるでしょう、ってことです。7Bot: a $350 Robotic Arm that can See, Think and Learn! by 7Bot — Kickstarter の映像で出て来る、手でロボットアームを動かしてやって、それと同じ動きを実現するというものですね。安川電機の居合切りの映像も似たようなことをやっているはずです。

image

要は、ポテンショメーター( potentiometer 回転式の可変抵抗器)をぐるぐる回したときにアナログ値を取ってきて、それをパルスに直してサーボに送ればよい。この場合は、ポテンショメーターとサーボが別々になっているけど、同じ構造のロボットアームを2台用意してやって、片方はモーション入力専用、片方は出力専用にすればok。そもそも、高いサーボだと角度を取得できる(内部的にはポテンショメーターで角度を判断しているので、それを取り出す機能が入っていればよい)ので、同じアームを使っても動作ができる、ってわけですね。

でもって、私の場合は安価なサーボを使っているので、ここの入力と出力は分けないといけない。そのあたりは、別々のものを使ってコントロールすることの具合の良さが実現できればよいかな。

image

可変抵抗からの値は、analogRead で取れるので、それを 180 度に直してやればよい。似たようなことはモーター制御でもできるので、自作のラジコンコントローラを作るのにいいかもしれない。スマートフォンのほうが手軽だけど、専用コントローラー/インターフェースのほうが使い勝手は良さそう。

カテゴリー: Arduino, ロボットアーム | 割り箸でロボットアームを作ってみる(中編) はコメントを受け付けていません

割り箸でロボットアームを作ってみる(前編)

mDrawBot のロボットアームで iPad をすりすりしてみたら結構うまくいったので、唐突にロボットアームを自作したくなって作ってみる。Kickstarter にもロボットアームがあって、それなりの値段(5万円位)で買えるようになったのが(以前は10万円以上したので)、そこはもうちょっと勉強も兼ねて構成を考えてみよう。

3D 関係のソフトウェアが苦手なので、LEGO を使って試作する。この日の午前中に、歯車を使ってギアボックスを作ったりピストンを使って練習した後で、これを作ってみている。関節部分を2軸にするという非常に冗長な構成なんだが、こうするとアーム自体がぐにゃぐにゃと自由に動く。構成が簡単になるので初手としてはこれで十分。

自由度が高ければいいというものではないだろうが、手元にある10個ぐらいのマイクロサーボを全部使ってもいいかなという贅沢な構成にしてみる。富豪的プログラミングと同じですね。

昼にこれを作った後で、どうやって実現しようと思って午後いっぱい悩んでいたのだが、ふとどうせならば割り箸でいいじゃないか、夜中に思い立って作ってみたのがこれ。

割り箸を適当に切って、手芸用のマスキングテープでサーボを止めてしまう。強度的には心もとないけど、アイデアを現実にするための試作としてはこれで十分なはず。…が、ちょっと動かしてみると、やっぱり強度が足りないので不安が出てきて、この支柱の部分をレゴで置き換えてみた。

LEGO マインドストームの支柱を使うと軽いので、マイクロサーボでも十分に支えられる。最終的にはアルミフレームを考えるんだろうけど、これまた、途中の段階では試行錯誤するために LEGO が有効だ。まあ、LEGO とはいえサーボの接続部分はマスキングテープで止めてあるので LEGO っぽい使い方は全くしていない。

そして、1本の支柱では強度的に足りないので、2本以上の支柱を考えたのがこれ。

https://pbs.twimg.com/media/CRNT5N3UwAA4E3s.jpg

これだとギアを支柱で挟む形になるので強度が保てる。が、それをどうやって実際のサーボにつなげるかよく分からずにいたのがこの状態。ひとまず、マスキングテープで形だけ作ってみる。

https://pbs.twimg.com/media/CRNT5N5UsAAyPa4.jpg

さらにバリエーションとして1本支柱でサーボの接続の向きを変えてみる。台座はカメラ撮影でつかうものを流用している。台座自体は2点支持なのでしっかりしているが、腕の部分は1点支持のためゆらゆら揺れてしまう。

じゃあ、台座のように二点支持にすればよいだろう。その場合、アルミフレームをまげて作るのが定番だろうと再び悩んだのだが、この段階でその工作は避けたい。トライ&エラーのサイクルがのろくなってしまうからね。で、何とかならないだろうかと思って作ったのがこれ。

普通はサーボの脇の部分にU字型のフレームを置いて二点で支持することになるのだが、直接サーボのお尻の部分にねじを埋め込んでしまった。安価なサーボなのでこれで十分だし、試作なのでこのほうが取り外しが利いてよい。サーボの回るところにも二本のビスをつけて LEGO の支柱を支えられるようにしてある。

2つのサーボを2本の支柱でつなげるので強度が増している。ただし、サーボから直接動力を得るスタイルなので関節部分が大きくなってしまうが、まあ、これはこれで良しとする。

https://pbs.twimg.com/media/CRQ3_0lVAAAngoL.jpg

肩が台座に相当して、肘に当たる部分が2つある。冗長ではあるけど、これだと動きがスムースになりそうなのでこれで試作していく予定。肩に近い1つめの肘の負担が大きい(左の2つ目の肘と手を支えることになる)ので、ここの関節は梁を使って台座のほうから引っ張るようにしないとダメかなと思っている。

ひとまずは Arduino Uno で適当に動かしてみよう…という訳で続く。

カテゴリー: Arduino, ロボットアーム | 割り箸でロボットアームを作ってみる(前編) はコメントを受け付けていません

TiddlyBot を組み立てる

mDrawBot に引き続き、TiddlyBot も組み立ててしまいます。TiddlyBot は Kickstarter で買ったもので、約1年遅れで出荷されてきたものです。途中に Raspberry Pi  が新しくなってしまったり、資金が足りなくなったり、ソフトウェア制作に苦心していたりして、遅れていたわけですが無事届きました。

おととしの夏に自分で Raspberry Pi で自走ロボットを作ろうと思ったときに、ちょうど参考になるので買ったんですよね。今だと、ほどほどにはモータードライバの使い方も分かったし、無線のやり方もわかった、Windows IoT Core を使うこともできるようになったので、それほど必要ではないのですが、でも「何よりも真似から始める」ことで学習はスタートするものですから、真似られるところは真似ていきます。

見栄え的には mBot よりも見劣りがしますが、Raspberry Pi Model A を使っていて、モータードライブのハット&充電池を使っているところがミソです。久々に Rasbian を扱います。あと、Raspberry Pi なのでカメラと WiFi の扱いが楽になります。TiddlyBot の制御も WiFi 経由で行う(内部的は Apache 待ち受けで Python 動作かも)ので、ブラウザやスマートフォンから操作ができます。

WiFi はホスティング機能で動いています。どうやって、無線LAN に参加させようかと思ってあれこれ見ていのですが違いました。起動時に内部で 192.168.42.1 固定でホスティングを行い、SSIDのパスワードは Raspberry になっています。ホストに接続したら SSH で接続できるので、raspi-config 等で設定ができます。Rasbian が入っている micro SD カードは同梱されていて、起動時の設定もされた状態になっています。カメラ機能もすでに有効な状態です。

カメラのエラーに対応する

が、カメラを使おうと思うと、なぜか表示ができない。Tera Term で接続して raspistill -o test.jpg してもエラーを出しています。raspistill は、カメラで写真を撮って JPEG に落とすコマンドです。おかしいなぁ、と思っていろいろ調べれみると、

BABUKUMA (^(工)^): Raspberry Piで専用のカメラを試してみてる時にエラーが。。
http://blog.babukuma.com/2014/02/raspberry-pi.html

な感じで SUNNY っていうラベルの部分が外れていることが分かりました。ソケット形式になっているので、小さなカチッと音がするまではめ込んでやります。そうすると、うまくつながるります。

で、テスト用にもう一度 raspistill -o test.jpg を動かしてみたのですが、やっぱりエラーがでます。先のエラーとは違うエラーなので見ていたのですが、これは TiddlyBot のデーモンプロセスのほうでカメラ機能を使っているからです。なので、TiddlyBot のブラウザで見るときちんと画像が撮れいていることが解ります。

Scratch 風のプログラム

TiddlyBot は2つの動かし方があります。あらかじめ Scratch 風のプログラムで動作を決めてやって動かす方法と、ブラウザや(たぶんスマートフォン)で直接操作してやる方法です。

ブラウザ上で Scratch 風なプログラムが作れます。Scratch で良かったのでは?と思うのですが、どうもこの部分に手間が掛かりすぎたのではと想像しています。ぽちぽちとブロックをつなげて作ることができます。mBot のパンダ Scratch は Arduino の C に直してファームにアップロードしますが、TiddlyBot Scratch は Python に変換して送信しています。面倒な場合は、Python で直接書くことができます。

ラインセンサーとか超音波距離センサーを利用して自動制御ができるという仕組みです。

直接操作する

いわゆるリモコン的な操作もできます。TiddlyBot にブラウザで接続して、モーターを前後に動かしたり、カメラのサーボを動かしたりします。カメラで撮影した映像は随時画像ファイルで送らてきているようです。

たぶん、内部的に Python で送っているだろうから、似たようなプログラムを自前で書くこともできますよね。たぶん、コードを Python に貶すればよいだけなので F# や C# でクライアントを書いて送信することも可能なはずです。ストアアプリにしてタブレットからも送信でいるんじゃないでしょうか。

実は、Raspberry Pi のカメラモジュールは高かったので手を出さなかったんですよね。買うと 3,500円ぐらいして、RasPi 自体と同じ値段になってしまうので躊躇していました。が、これだけ小さくて、さっくりと動くのだったら USB カメラと同じように考えてもいいかなと思い始めています。そうそう、Orange Pi PC 専用のカメラもあって、そちらのほうは 1,000円ぐらいなのでちょっと手を出してみてもよいかなと。

カテゴリー: RaspberryPi, TiddlyBot | TiddlyBot を組み立てる はコメントを受け付けていません

mDrawBot と mBot を組み立てる

Makeblockのお絵描きロボット「mDrawBot」が日本に上陸! | クラウドファンディング - Makuake(マクアケ)
https://www.makuake.com/project/mdrawbot/

で、支援した mDrawBot が届いたので組み立ててみました。サポータは180名ほどいるので、ぼちぼちとアップされるでしょう…とか思ってたら、誰もアップしないのでさっくりと紹介しておきます。

ちなみに、私の場合は Makuake で買ったものですが、本家 からも買えます。$230 程度なので 3,000円ぐらい高い感じですね。Makeblock のシリーズは LEGO のようにパーツを別々に変えます。基本のパーツを買って、それを増やすパターンで少しずつ増やしていくということが可能です。パーツ自体は、金属(アルミ?)なのでねじ止めでしっかりと作ることができます。塗装は剥げやすい感じなので注意が必要(ドライバーとかで擦ると落ちそう)なのですが、まあ、遊びの範疇だし、それはそれで ok です。

ざっと組み立てるとこんな感じです。ねじ止めをしながらやるので、2時間弱ぐらいかかりました。なぜか、上に乗っかるパーツのねじ位置がずれていて(設計ミス?)はまらないのですが、特にはずれることもないのでそのままです。駆動系は、ステッピングモーターが2つと、サーボモーターが1つになります。どちらも既存のもので、ねじ穴さえ合えばきっちりと固定ができます。このあたりは、LEGO Mindstorms で部品を揃えるよりも安く手に入りそうです。秋月の ステッピングモーターST-42BYG0506H と同型のような気がします。

絵を描かせるアプリがあって、SVG や BMPを書かせることができます。こんな風に、付属のアプリをダウンロードして、SVG 画像を読み込ませて描きます。SVG の Path を読み取っているので、Inkscape などを使って自前で作ることもできます。

image

mDrawBot 自体の頭は Arduino なので、プログラムを組んで2個のサーボを動かすこともできますよね。そうすると、水平移動のアームとしても使えるわけで、水性ペンの部分をタブレット用のすたライスに変えると iPad に書くこともできるかなと。無理矢理ですが、こんな感じ。

ペン先の上げ下げはサーボモーターで制御するので、うまくやればタップとかスワイプができるはずです。マルチタップとピンチや二本指が必要なので、もうひとつアームを作るか指先を作るか考えていきます。まあ、そんな妙なことをしなくても、mDrawBot が絵を描いているのを見るのは結構楽しいですよ。もうちょっと本格的に絵をかかせようと思ったら、XY-Plotter Robot Kit | Makeblock のほうがいいのですが、これはこれで 3万円以上かかりそうなのでお財布と検討が必要です。あと場所を取りそうだし。
XY プロッターのほうは、ABU ロボコンのロボミントンで使われていた機構と同じです。ラケットを XY の平行軸を高速移動させるには、このプロッタ方式が有効です。あと、基板実装のチップマウンターも同じ方式ですよね。

私としては、このアーム部分に Web カメラを取り付けて物体認識に使う予定です。吸引モータが届いたら実験していこうかなと。

実は mDrawBot の前に mBot も購入しています。こっちのほうはもっと安くて、Kicksterter で $49 でした。本家のほうでは $75 ですね。この mBot のほうは、Scratch 2.0 を使って制御ができます。赤外線のコントローラのボタンを押すと、モーターや LED を動作させることができます。ボード自体に IR 発信/受光 がついて、スピーカーもついます。モータードライバーも載っているので、実は結構お手軽に使える便利ボードだったりします。

Bluetooth の拡張チップも一緒に購入したので BLE で接続ができるので、適当な iPhone アプリを作れば mBot を動かすことができます。

というわけで、足回りが結構揃ってきたので本格的に作品制作に入ろうかというところ。頭(RasPi/Arduino)、通信(Bluetooth/IR/WiFi)、駆動系(ブラシモーター/ステッピングモーター/サーボモーター)、構造系(mBot/タミヤ/LEGO)を組み合わせていきます。あと、Webカメラ、9軸センサーの類も。

カテゴリー: Arduino, mBot | 1件のコメント

Comm Tech Festival で Windows IoT Core の発表

09/26 の Comm Tech Festival で Windows 10 IoT Core の話をしてきたので、その補足をつらつらと書いておきます。

発表スライドは、こちらから。

何を話したかというと、Windows 10 IoT Core を Raspberry Pi に乗せて、Tamiya の Boxing Fighter を動かすというデモです。前半を Windows 10 IoT の概要(かつ、裏事情など諸々)と、後半が Boxing Fighter を動かすデモになっています。発表でも強調しましたが、Boxing Fighter も戦車も、2個のブラシモーター&ギアボックスという組み合わせなので、動作させる部分は切り替え可能です。戦車の場合は本格的に動かそうと思うと、キャタピラで動いてしまうので戦車自体に Raspberry Pi と電源を積まないといけない制限が出てきてしまいますが、Boxing Fighter の場合は、あまりあちこち動かないので線が出てても結構見栄えがします。どっか行っちゃうことがないので、モーターを動かす学習とかにちょうどいいのです。

埋め込み画像への固定リンク

デモのコード

デモで使ったコードは、github の RPiBoxing からダウンロードできます。MS 品川の会場では Wi-Fi がうまくつながらない可能性があったので、

  • 通常のマウス操作のデモ
  • SenserTag を使って Bluetooth 経由で操作するデモ
  • Windows IoT 側に簡易 HTTP サーバーを起動させて、ブラウザから操作するデモ

になっています。3つ目の HTTP サーバーを起動させるパターンは、クライアント側を iPhone などで作ることも可能です。実際、iPhone 用に Swift で作って持って行ったのですが、Wi-Fiが繋がらないので断念。簡易サーバーへは Web API を利用した GET コマンドを送信するパターンで作って理ます。

以下、ちょっとコードの補足をしておきます。

モータークラスを作る

モーターを正逆で動かすためには、GPIO を2本用いる必要があります。モーターを動かすたびに2本の GPIO を制御してもよいのですが、適当な Motor クラスを作っておきます。

public class Motor
{
    GpioPin out1 { get; set; }
    GpioPin out2 { get; set; }
    public Motor(int pin1, int pin2)
    {
        this.out1 = RPi.gpio.OpenPin(pin1);
        this.out2 = RPi.gpio.OpenPin(pin2);
        this.out1.Write(GpioPinValue.Low);
        this.out2.Write(GpioPinValue.Low);
        this.out1.SetDriveMode(GpioPinDriveMode.Output);
        this.out2.SetDriveMode(GpioPinDriveMode.Output);
        _dir = 0;
    }
    int _dir = 0;
    /// <summary>
    /// 回転方向を変える
    /// </summary>
    public int Direction
    {
        get { return _dir; }
        set
        {
            if (_dir != value)
            {
                _dir = value;
                if (_dir == 0)
                {
                    this.out1.Write(GpioPinValue.Low);
                    this.out2.Write(GpioPinValue.Low);
                }
                else if (_dir > 0)
                {
                    this.out1.Write(GpioPinValue.High);
                    this.out2.Write(GpioPinValue.Low);
                }
                else
                {
                    this.out1.Write(GpioPinValue.Low);
                    this.out2.Write(GpioPinValue.High);
                }
            }
        }
    }
}

 

BLE を利用する

リモート制御をするときには、Bluetooth か Wi-Fi を使うとよいのですが、Bluetooth の場合は、ちょっと手順がややこしくなっています。もっと手軽に使えるクラスにすればいいんですけどね。BluetoothGATT から該当箇所を抜き出して使っています。iOS や Android の場合は、特定の BLE デバイスを使うときにはそれを利用するライブラリもワンセットになることが多いので、それを使えばいいのですが、Windows IoT の場合は当然のことながら提供されないので自前で作ることになります。

サンプルコードでは、画面でボタンを押して BLE デバイスを探すことになっていますが、アプリの起動時に自動的に探しに行って接続してもよいですね。

BLE を使うときにはコツがあって、

  • Package.appxmanifest に <DeviceCapability Name=”bluetooth.genericAttributeProfile” /> を追加する。
  • あらかじめ、該当する BLE デバイスをペアリングしておく。
  • BLE のイベントから UI を扱うときは、Dispatcher.RunAsync を使ってスレッドを変える必要がある。

ということになります。実は、3つめの UI スレッドのところが曲者で、確かに BLE などのイベントから UI スレッドにアクセスする(画面表示をさせる)ときには Dispatcher.RunAsync を使ってスレッドを切り替えることは忘れないのですが、MVVM を使って INotifyPropertyChanged で UI アクセスをするときにも Dispatcher.RunAsync  が必要です。

具体的には以下のように、ViewModel を媒介するときにも Dispatcher を効かせないといけないってことです。ふつうのストアアプリを使っているときは分からない落とし穴ですが、デバイス系は UI スレッドではないので、見えないところでアクセスすると落ちるってことになります。まあ、これはストアアプリで作ったときにもスレッドで動かすときには注意するわけですが。

await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
    if ((data & 0x01) == 0x01)
    {
        _model.BLETap = "Right F";
        KeyRFront.Background = new SolidColorBrush(Colors.Green);
        motorRight.Direction = 1;
    }
    else
    {
        _model.BLETap = "";
        KeyRFront.Background = new SolidColorBrush(Colors.Red);
        motorRight.Direction = 0;
    }
    if ((data & 0x02) == 0x02)
    {
        _model.BLETap = "Left F";
        KeyLFront.Background = new SolidColorBrush(Colors.Green);
        motorLeft.Direction = 1;
    }
    else
    {
        _model.BLETap = "";
        KeyLFront.Background = new SolidColorBrush(Colors.Red);
        motorLeft.Direction = 0;
    }
});

 

簡易 HTTP サーバーを作る

System.Net.HttpListener がないので、StreamSocketListener を使って自作をします。サンプルとしては、Blinky WebServer を参考にすればよいでしょう。私のデモコードもここから引っ張ってきています。単純な Web API を作りたいときに、こうやっていちいち簡易サーバーのコードを作らないといけないのは面倒なのでライブラリしたいところですね。本来ならば標準で用意してほしいところなのですが、AllJoyn 関係とダブってしまうのか割愛されています。

ただし、ここをクリアすると、ブラウザから制御ができるようになるので是非おさえておきたいところです。ブラウザだけでなくスマートフォンを使っての呼び出しも楽になります。

そんな訳で、このあたりは少しまとめて、近々 hacker.io にアップする予定です。

カテゴリー: RaspberryPi, Win IoT | Comm Tech Festival で Windows IoT Core の発表 はコメントを受け付けていません