まりま

移転しました→5hyn3.github.io

mbedが公式にC++11に対応したら

f:id:ewvss:20160420233818p:plain

 これは普通のタイマー割り込みLチカコード。たかだかLEDを点滅させるという一行だけの処理にわざわざ関数flip()を定義していてとても無駄に見えます。

f:id:ewvss:20160420233819p:plain

 これはラムダ式を利用したタイマー割り込みLチカコード。さきほどのプログラムと完全に同じ動作をしますが、ラムダ式を利用することによりコードがよりすっきりしています。見た目がよくなっただけではなく、関数の名前を考える必要が無いという命名の苦手なプログラマには嬉しい効果もあります。苦手でなくとも、割り込みで動作させる関数が複数あり、それらの関数の動作が非常に似ている場合などは関数名を考えるのは少し大変ですし、量が増えてくると関数定義が多すぎて読みにくい&命名の手間が関数の数だけかかる、というつらいプログラムが出来上がってしまいます。早くmbedも公式でC++11以降に対応して欲しい…と願う僕でした。

 

ちなみに、現状ではオフラインIDEを使う、Cloud9や自前のLinuxにmbedコンパイラを導入し、Makefileを書き換える、と言った方法でC++11やC++14の機能を使うことが出来ます。最先端を行きたい(今時の本当の最先端はC++17なんでしょうが...)という方は挑戦してみてはどうでしょうか。

 

mbedとArduino

移転のお知らせ

ブログはこちらに移転しました。現在はこちらで更新をしています。

5hyn3.github.io

 

 お手軽二大マイコン弄り環境としてmbedとArduinoがあります。どちらもマイコンを扱う上で必要なレジスタとかそういう小難しい知識を知らなくても、開発者の思うようにポート入出力を行い、計算をし、制御することが出来ます。最近だとロボコンに活用しているチームも幾つかあるのではないかと思います。簡単に出来るということは決して初心者だけにメリットがあるわけではなく、マイコンの扱いに慣れたような人でも開発スピードを早める事ができ、大会までに限られた時間を有効に使えるようになるはずです。僕の所属するチームでも最近そういった理由で、僕が主体となって開発スピードを上げるためにPICからmbedへと開発環境を移行しました。

マイコンを容易に扱うことのできるこの2つのシステム、何が違い、どちらが優れて、使うべきはどちらなのか。結論から言ってしまうと、僕はmbedが優れていると判断し、だから僕のチームでもmbedを採用することにしました。以下にその理由となる根拠を示します。

1.コスパが良い

 物を作るためには当然ですがお金がかかります。なので、コスパの良い製品を選び、お金を有効に使う事は良い物を作る上で必要なことです。以下の表はmbedとArduinoマイコンの価格と性能をまとめたものです。mbedからはNucleoF401REとLPC1114FN28、ArduinoからはArduino M0とArduino Pro miniを用います。これらを選んだ理由はそれぞれで探した中でコスパが良いと個人的に感じたものだからです。

製品名 価格[円] bit 周波数[MHz] RAM[KB] Flash[KB]
NucleoF401RE 1,900 32 84 96 512
LPC1114FN28 216 32 50 4 32
Arduino M0 3,240 32 48 32 256
Arduino Pro mini 355 8 16 2 32

 価格はページ作成当時の物です。現在の価格やさらに詳細な性能は表下の各製品のamazonへのリンクで確認してください。この表にあるスペックが全てではありません。ピン性能やボードに備わった電源性能なども考慮した上で考える必要がありますが、とりあえずCPUの処理速度に関係するスペックについて纏めた表です。こうして並べると、mbedのコスパの良さが際立つと思います。特にたった216円のLPC1114FN28のメモリ周りを除けば3000円以上のコストがかかるArduino M0に匹敵する性能を持っていることは凄まじいと感じます。但し、前者はマイコン単体、後者はマイコンボードであり、電源やUSB接続等のインターフェースは後者のほうが充実していることにも注意が必要です。なお、NucleoF401REもマイコンボードであり、電源として幅広い電圧(3.3V~12V)に対応し、ピンは5Vトレラント、ピンの数もこの表の中のもので最多と扱いやすさとコスパを両立しているのでこの中ではもっともおすすめの製品です。特に、この中でFPUを積んでいるのはNucleoF401REのみなので、浮動小数点型が絡むような高度な演算、制御を行う場合は実質これしか選択肢がありません。

2.プログラミングの方法が明快である

 mbedはC++98(もしかしたら03かな?)を使いプログラミングを行えます。そのため、PC向けソフトの作成で得た知識や経験などをそのまま活かす事ができます。しかし、ArduinoC++を"元にした"Arduino言語を使います。これはC++とは似て非なるものなので、慣れるまでは結構使いにくかったりします。全くプログラミングなんてしたことがない!という人向けには確かに使いやすく作ってあるのかなぁと思うところもあります。実際C++未経験者にC++でプログラムを書けというのは結構厳しいところもありますし。しかし、独自の言語というところからくる言語仕様がなんだかよくわからないというのは既にある程度プログラミングをこなしている自分にとってはちょっと受け入れられませんでした。

3.IDEが便利

 mbedはIDEが非常に便利です。クラウドIDEなので開発環境をわざわざ新しいPCにインストールする必要もない上、作ったプログラムやライブラリをそのまま公開、チームで共有することが可能です。但し、時々メンテナンスが行われ、使えなくなる時があるなど、クラウドならではのデメリットも存在します。ArduinoIDEもインストール自体は簡単ですが、やはりコードの共有をしようとすると一旦githubに上げるとか別のサービスを介さなければならないのは多少不便です。

4.コミュニティが活発

 mbedはコミュニティが活発で、大量のライブラリがユーザーの手で開発・公開されており、そのライブラリはmbedのコミュニティサイトの中で容易に探し出して自作のプログラムの中に組み込む事が可能です。Arduinoでもライブラリはある程度多く出回っていますが、mbedのようにどこか一箇所にライブラリが集まっていてそこから検索することですぐさまライブラリを自作のプログラムにインポートできるような仕組みは無く、多少手順が増えるので面倒だと感じました。

5.種類が豊富

 mbedはArduinoよりも種類がたくさんあります。その為、用途に合わせて超高速なCPUを積んだもの、価格を抑えたもの、シリアル通信等通信機能をたくさん載せたもの、DSPの使えるもの、DACが出来るもの、など様々な種類の中から最適な物を選択することが出来ます。対してArduinoは基本的にはそんなに種類は多くなく、mbed程の選択の自由はありません。

 

ざっとこんな感じですね。mbedは最初からある程度マイコンやプログラミングに対して知識があるような人には使いやすく、Arduinoはこれが初めてのマイコンでプログラミングとかあんまりしたことないって人には触れやすいものだと思います。なのでロボコンに参加するような元々ある程度の技術力があるようなところの場合、mbedを使うとしっくりくるだろうし、デザイナーのような普段余りプログラミングに縁が無いような方はmbedは少し敷居が高いのでArduinoから触れてみると良いかなぁと思います。

バックアップは取ろう

f:id:ewvss:20160416175904j:plain

 

自作ソフトの話。Qtの練習の為に作ったこのソフトはTextの部分に

 

f:id:ewvss:20160416180903j:plain

 

このように適当に文字を入れてやると

 

f:id:ewvss:20160416180923j:plain

 

こんな感じにいい感じに見やすくボードの画像に文字を出力してくれる。設計の情報伝達とかの為にそれなりに役に立ってくれたがソースコードの方はとても人に見せられないような汚いものだった。このソフトを作った当時(1年くらい前だったかなぁ...)、自分は一体どんなコードを書いていたのか、ちょっと気になったのでソースコードを探してみるもどうやら消失してしまったらしく…バックアップはしっかり取っておこうと思った出来事でした。当時はgitの使い方もあまり分かっておらず、もっと早く身に付けておくべきだったなぁと。まぁ今もはっきり言って使えてるとは言えない状況ですけどね

Not compatible with Windows

Andoird SDK Managerを開くとAPI13以下のSDK PlatformがNot compatible with Windowsに。

f:id:ewvss:20160414004015p:plain

StackOverFlowにも同じような質問が。単純にAPI古すぎるから新しいのを使えとの事らしい。どうしても古いAPISDKが必要な場合に入手する方法もあった。

Download Android SDK standalone for offline installation | Quakeboy'z Dev Arena

stackoverflow.com

 

しかし、いつの間にかGingerbread以下のシェアが2.7%にまで落ちてるとは…時の移り変わりというのは早い。でもよくよく考えたら5年以上も前のOSだし妥当なんだろうなぁ…

環境の整理

現在、PCにセットアップされている環境のメモ

デスクトップPC

IDE

・VisualStudio2015

・AndroidStudio2.0

Eclipse Mars

ライブラリ

・Boost 1.60.0

・Boost 1.48.0(RasPi向け)

・自作Boost.asioラッパライブラリ

・OpenCV3.0.0(CUDA入、contrib入ビルド)

・OpenCV3.1.0(CUDA無、contrib入ビルド)

・TensorFlow

・Caffe

・Chainer

その他

Python 2.7

・Xamarin

・AndroidSDK(全部入り)

・VisualStudioCode

・Ubuntu14.04(Grub2を使ったWindowsとのマルチブート)

ノートPC

IDE

・VisualStudio2015

・AndroidStudio1.5

Eclipse Mars

Arduino IDE

・MPLABX

ライブラリ

・Boost 1.60.0

・Boost 1.48.0(RasPi向け)

・自作Boost.asioラッパライブラリ

・OpenCV3.1.0(CUDA無、contrib入ビルド)

その他

Python 2.7

python 3.4

・AndroidSDK(API23~)

・VisualStudioCode

 

ノートPC、デスクトップPC、ともに開発環境のソフトウェアの詰め込みすぎて常にストレージ不足にあえぐ毎日...

備忘録代わりに

 PCに新しい環境を導入する、言語のテクニックを学ぶ、ライブラリの使い方を知る、etc…

 プログラミングをしてソフトを作るには覚えなければならないこと、やらなければならないことが非常にたくさんあります。これまでは一度見たりしたりした情報は脳内のデータベースに保存することで何とかやっていけましたが、流石に数年間プログラミングに接し、様々な経験を積んでいくと人の脳にも限界があるので、詰め込み過ぎた本棚から本が崩れ落ちていくように、知識が脳から溢れてしまいます。そんな知識の溜め込みの限界を悟ったので脳内の情報を整理し、適切にアウトプットすることで後々自分が楽できたら良いなと思いブログを始めようかと。

 後は個人製作のライブラリやアプリを公開できたらいいかなぁとも、これまではそういうものを公開する環境がなかったのでなんとなくやる気が続かなくなることもありましたが公開してドヤれると考えると多少は良い動機付けにもなりそうですし。それなりに不純な動機ですけどやらないよりはずっとマシですしね(