ソフトウェア開発者がハードウェア/IoTをやる意味

12月の .NET ラボ勉強会では「これから始める Windows IoT Core」ということで発表してきました。

[slideshare id=56308093&doc=windowsiotcore-151220031915]

その中で、さらっと流していきましたが「ソフトウェア開発者がIoTをやる意味」のところをもう少し掘り下げて解説しておきます。

垣根を超えるために

私がプログラミングを始めたのは30年以上前ですが、既にソフトウェア開発というジャンルは確立されていました。まだ N88Basic の頃だったり、MS-DOS や DR-DOS だったり、したものの直接「ハードウェア」に触るためには、ハードウェアにアクセスするための馬鹿高いインターフェースボードが必要でした。逆に言えば、ハードウェアとソフトウェアの垣根があって、その馬鹿高いインターフェースを買わない限り直接ハードを触ることはなかったのです。当然、一方では組込みシステムの開発者(当時はアセンブラ)が居たわけで、基板設計とあわせてハードの I/O を地道にたたくハードなソフトウェア屋さんもいらっしゃったわけです。

ともあれ、大学の頃は主に炉心のシミュレーションをやっていたので、ほとんどハードウェアに触ることがありませんでした。学生実験で計測器で測定するぐらいですね。おそらく工学系でも機械工学の方は、もっとハードウェア寄りのことを知っていると思います。

コンピュータ上で何でもできる。インターネットや仮想空間も含めて、コンピュータ内のソフトウェアの世界でかなりのことができます。昨今の人工知能や機械学習、VR なども含めればソフトウェアの世界で突っ切ることも可能な時代になってきています。

逆に言えば、「ハードウェアの世界」と「ソフトウェアの世界」という形で、垣根が現前に存在します。子供の科学などで、少しでも電子回路を組んだことがあれば、半田付けとかコンデンサの使い方とか計測誤差とか、そういう手を使ってアナログ的なところをうまく補完していく方法もあることが分かったのでしょうが、こう 30 年間もソフトウェア内だけでやっていると、ここのところがうまくわからなかったのですよ。

ハードウェアは誤差を許容する世界

ソフトウェアも小数点以下は正確に表せないので、誤差を許容するように作りますが。ハードウェア≒現実な世界では、誤差は範囲を以て対応させます。抵抗値にしても、教科書には 330Ω と書かれていても、だいたい 1kΩ ~ 100Ω ぐらいのを持ってきても大丈夫です。更に半田や銅線の内部抵抗があるので、ぴっちりと計算で決まるわけではありません。抵抗値では2,3倍違ってもだいたい動きます。また、有効桁数は1桁か2桁ぐらいしかありません。ソフトウェアの計算では有効桁数は8桁ぐらい簡単に取れるのですが(doubleの間ならば)のですが、そのあたりもハードウェアとソフトウェアの世界では値の扱いが異なります。

このあたり、即値でも幅があるし、合計値にも幅があります。しかし、RC回路を組んで振動させると分かるのですが、Δt の要素が入ってきて時間軸のある物理現象がかかわってくると、理想状態(定常状態)とは違ったものを見えてきます。また、細かいこところでは誤差が入っていても、全体の値は目の前にある物理現象が絶対なのですがから、合計値が計算で違っていたとしても「誤差」として考えなければいけません。これは、設計をいくらうまくやってもコードの動きが絶対だ、というところと似ています。理論上、あれこれと言い訳をしても、現実で動いているものが絶対的な「現実」ですからね(ああ、量子力学的な説明はまた別なので、これは別途)。

垣根が低くなっている

巷の IoT, Maker Faire などの展覧会に行ってみると、ソフトウェアとは一変した世界があります。到底、ソフトウェア開発者としては到底追いつけないような個人的な出展があって、ちょっと尻込みしてしまうぐらいです。

しかし、一部の高度なロボット技術者の方は別として、ソフトウェア的にはあまり複雑なことをやっている訳ではないことが分かります。データシートというハードウェアの仕様を読み込まないとうまく作れないものがたくさんありますが、ある意味 .NET Framework のような大量なクラスライブラリと同じような形で、ソフトウェア設計の知識を導入すればもう少し扱いやすくなるのではないか?と思われるものもあります。そのあたりは、どちらが主という訳でもなく、相互に乗り入れが可能ではないか、と思っています。

私は Mesh のようなソフトウェアから手軽に扱えるもの、をあえて持っていません。これは、去年の夏から、ロボット戦車みたいなものを作りたかったので、もっとハードウェア寄りな考え方が必要だったので「ソフトウェアから扱う手軽さ」よりも「ハードウェアを扱う手軽さ」が自分にとって必要だったからです。このために、PIC やユニバーサル基板での半田付けなどを試していきました。

そこで、ちょうどよく、ハードウェアの扱いとソフトウェアの扱いとして自分の中で手足になっていきそうなものが、

  • Arduino Nano/Mini
  • Arduino Nano 3.1 (ATmega328P搭載)--販売終了

  • Raspberry Pi 2

商品画像1

  • mbed

です。組み立てのブロック周りとしては LEGO Mindstorms EV3 も良いのですが、いかんせん個人で買うには値段が高いので、あくまで教育用ですね。私の考えている「数を揃える」のが難しいのでちょっと後回しです。

 

これらの 3つは、ある程度値段も安く情報も手に入りやすいものです。通信の有線LAN/WiFi/Bluetooth も扱いやすくなっています。

かつては、PIC とユニバーサル基板で電子工作をしなければいけなかったことを考えると(参考用に、昔の電子工作用の本は数冊買いました)、だんぜん楽です。半田付けをしなくても、ブレッドボードで十分だし、固定したいのであればグルーガンで接着する方法もあります。ブレッドボードも安いものであれば200円前後ですから、試作ならばこれで十分です。かつ、ソフトウェア開発者からハードを触るだけだったら試作で十分です。

Lチカとモーターを回した後に進む場所

最初は、マイコンだけ買って Lチカする訳ですが、それも1時間ほどチカチカさせれば飽きてしまいます(クリスマスツリーとか、LED 制御も色々あるので実は奥が深いのですが)。じゃあ、その後は何か動かすものが必要かな、と思うと機械工学の知識が必要になってきます。アルミ板を曲げたり、切ったり、ドリルで穴をあけたりと専用の工具が必要になってきます。ソフトウェア開発の場合は、パソコンとスマートフォンぐらいで十分だったのですが、色々取り揃えないといけないわけです。

これが垣根になっています。

まあ、昨今の3Dプリンタを買って一気に工作環境を整えてしまうという方法もありますが、初期投資が大変ですよね。それに 3D ソフトウェアを覚えないといけません。

その前にお勧めなのが、既存のおもちゃを作ったり、改造したりすることです。イスペット社のグリッパーアームは5,000円程度と低価格なロボットアームです。関節にはサーボモーターじゃなくて普通のブラシモーターが使われていますが、試しに動かしてみるにはこれで十分でしょう。PC で動かせるバージョンもありますが、あえてコントローラだけ安価なものを買って Arduino などで動かしてみるとよいです。

http://ecx.images-amazon.com/images/I/51NmTEqRgEL.jpg

http://pds.exblog.jp/pds/1/201301/21/06/b0158406_134562.jpg

他にも、ダイソーの100円電車とか、電池で動くおもちゃは大抵改造が可能です。タミヤのギアボックスを買えばプラモデルの戦車を Bluetooth でラジコン化することもできます(Bluetooth には安い HC0-05 のシリアル通信を使えばよいのです)。

そういう安くて簡単なところから入るとよいでしょう。IoT というと、クラウドとセンサーの組み合わせがほとんどで、センサーの類も結構高価なものだったり、サーバーが月額で有料だったりしますが、いえいえ、そういうものを使う必要はありません。センサーの類は中華 Arduino と安価なセンサーの組み合わせで十分だし、サーバーは安価なホスティングサービスを借りて PHP で組む、というパターンでも良いわけです。

その先にあるもの

私のこれからになりますが、ハードウェアの世界を垣間見たら、ソフトウェアの世界に戻ってきましょう。ハードウェアの誤差やΔtの世界を、うまくモデル化してやるのがソフトウェアの役目です。ロボットを扱うための ROS でもよいし、組込みの RTOS を使ってもいいし、スマートフォンやタブレットからうまく制御できる仕組みを使ってもよいでしょう。カメラ機能と画像認識、各種センサーを組み合わせて人工知能的に動く iRobot のような制御も自作できると思います。これを数台作って相互通信させるところが目標です。

ハードウエア屋さんの良いところを持ってきて、うまくソフトウェアでモデル化して、それでハードウェアをうまく制御できるのが目標ですよね。来年こそ暇を見つけて蓮根に行きます。

カテゴリー: 開発 パーマリンク