beaglebone black GPIO ピンの謎

GPIOというのはGeneral Programmable IOという意味でつまりは、用途に合わせて設定できる入出力ピンということだ。 ソフトウエアで設定すれば入力ピンにも出力ピンにもなるという便利もので、40年前に電気工学を勉強した自分にとっては夢みたいなハードウエアなのだ。
BeagleboneBlackにはこのGPIOピンが69pinも用意されている。(とはいうもののHDMIとeMMC support用にリザーブされているピンもあるので全部が即使える、というわけではない. それでも30本以上はありそうだ) デジタル入出力のほかにもアナログ入力や出力に使えるピンも何本か用意されている。

ただ、出力ピンにした場合、その出力電流はソースで4ミリアンペア、シンクで6ミリアンペアとなっており、それほど大きな電流が流せるわけではない。 ちなみにArduino は 各ピン20mA、ピントータルで400mA。 Derek Molloy さんのyoutube ビデオでは、これを鑑み、LEDを点灯させるのに小さなトランジスタをかましている。(http://www.youtube.com/watch?v=wui_wU1AeQc)

これが正解だと思うのだが、 Adafruitのサイトのチュートリアルでは初心者を考えたのか、トランジスタを省略し、470オームの抵抗をLEDに直列にいれて、これを直接駆動している。 あのSimon Monk氏が書いているTutorialで、470オーム以下の抵抗値は使わないように、という指示がある。 この場合、 普通に売っているLEDのフォワード電圧が20mA通電時で1.85V~2.5Vと考えると(3.3-2.0)/470~(3.3-1.85)/470=1.7mA~3.08mA. 一応4mA以下となるので、OKということらしい。写真を見ると、これでも結構明るく点灯している。

最近みたこのサイトの場合はもっと過激で、50~100オームの抵抗を指定している。 (ちなみに作者はMaker: からRaspberry PiやBBBの入門書も出版していて、ちらっと見た限りではこの書籍の中でも100オームを指定していた。)
100オームを使った場合だと、電流量は 最悪 12mA程度になる。 50オームだとその倍で、20mAになる。さらに、100オームの場合だとフォワード電圧が飽和しないので、実際には12mA以上になるはずで、当然ICメーカーの指定仕様は超えている。 平気なのか、と思うが、実際に数分だけやってみたところ平気だった(おい) ただし、これはTIのチップの設計および現物が仕様に対してマージンを持っている、ということで、、LED1個点灯くらいならまだしも複数個点灯させるのはやはりまずいだろ。

20年前の電気屋の頭でLEDには20mAとはいかなくてもその半分くらいは流したいとおもっっているので、出力ピンにはNPNトランジスタをかませる、というのが、今の自分の結論。

3者三様、LEDの点灯回路
3者三様、LEDの点灯回路
driving-led2
Circuitlab のDCシュミレーションでの計算値。

boneScriptで遊ぶ

Beagleboneblackを電子工作用にリザーブしたので、Angrstrom Linux についてくるbonescriptで遊んでみた。(Debian wheezyのイメージになっていたeMMCにAngstromの最新イメージを改めて焼き直した。) 普通javascriptといえばWEBクライエント用のプログラム言語だし、 C++やJavaなどいじっているプロの方から見るとToy Lanuguageなどとバカにされがちだけれど、自分のような日曜プログラマにとっては非常に重宝するtool なんである。 boneScriptは、このjavascriptをサーバー側で使えるようにしたnode.jsというプログラム上で走る。 BBBのハードウエアをJavaScriptの文法で操作してしまおうという優れものだ。 node.js は一般的にはwebサイトのサーバー側を能動的に管理するような形で使われるのだと思うけれど、boneScriptと組み合わせるとPC上のプログラミング言語として機能する。

JavaScriptの特徴としてプログラムの非同期実行ということがあげられる。jQueryの使い方で一度はまったことがあって、 関数によっては前に呼び出して得たreturn情報を次のステートメントで使うためにはちょっと待てという感じでプログラムの流れをブロッキングするかコールバック処理を使う必要がある。 逆に言えばコールバックを使ってのイベント処理には力を発揮する。

その特徴を使って以下のようなbonescriptをいたずら書きしてみた。BBBに実装されている4つのLEDをてんでバラバラに明滅させる、というだけのプログラム。

//#!/usr/bin/node
//uncomment the above line and chmod +x  to make it shell executable.
//This program will randomly turn on/off four on board LEDs.
// 11/28/2013
//setup()
  var b = require('bonescript');
  var LEDs=['USR0','USR1','USR2','USR3'];
  for (var i=0; i < LEDs.length;i++) b.pinMode(LEDs[i], b.OUTPUT);

//loop();
    for (var i=0;i < LEDs.length;i++) animateLED(LEDs[i]);

//helpers
function animateLED(led){
    function toggleLED(led){ //randomly toggle LED
        b.digitalWrite(led,Math.floor(Math.random()*2)?b.HIGH:b.LOW);
    }
    function randomTimer(){ //randomly set timer between 0~199msec)
        return Math.floor(Math.random()*200);
    }

    setInterval(function(){toggleLED(led);},randomTimer());
}

Arduino の流儀に従って、setup 部分と loop部分を書いてみたが、ごらんのとおり、while/until 的なloopなどしていない。 animateLED()という関数を4回呼び出したあとは、それぞれの関数インスタンスが勝手にタイミングを作って繰り返しの明滅を行っているわけで、それぞれ非同期実行されている。

ところで、
上のスクリプトはCloucd9というIDEから直接実行させる他にも、command line でも

node randomLED.js

というように、実行可能。 いちいちnode を指定するのが面倒ならば、 プログラムの一番上の行にシュバング(#!)を追加してNodeプログラムだということを明示し、

#! /usr/bin/node

randomLED.js を実行可能としておけばプログラム名を指定するだけで実行できる。

$ chmod +x rondomLED.js
$ ./randomLED.js

もともとNode.jsがPHPと同じようにサーバー側のスクリプトを実行することを目的に書かれていることを考えると、bonseScript+Node.jsだけでハードウエアをリモートコントロールできるアプリが書けそうである。

Computing is fun, once again

image of zx80
My first “system”

This was my first personal computer, Sinclair ZX-80 from U.K . (BTW, It’s not ZEE-X. It should be pronounced, Zedd-X) for $199. You still needed a TV monitor. So I had to shell out another $70 for portable tube based TV. Membrane keyboard was so primitive it took me 30 minutes to enter a simple basic program. It came with 1k byte of S-RAM and Z80 CPU operated on 1Mhz speed. The screen memory was shared with program memory, so if you enter long program, it starts reducing the displayable screen lines. It did not have dedicated display driver so every time key is pressed, the screen would blink. Still I had a lot of fun from this “system” back in…. 1981.
 
 
 
Fast forward to today. The core of the system is Raspberry Pi , so called $35 computer from UK. It actually cost me $42(plus shipping) from Amazon.com. There is also BeagleBone Black (aka “American” Pi) for $45 that can be used in approximately the same way. The Raspi runs on 700Mhz Arm processor and comes with 512MB of RAM. (BBB runs on a bit more powerful Arm processor@1GHz with 512MB or RAM) You use2GB or larger SDHC card to copy bootable linux image downloaded from the internet and pop into the SD card slot. (BBB has 2GB internal memory that is already prepped) The system will boot up Linux OS.
It connects to USB keyboard and HDMI monitor. Since it has Ehternet connection, one can also use it headless. I ran mine headless and use terminal program from my PC to control it.
 
It has some of I/O pins exposed so you can connect it to electronic components such as LED or motor, or get input from temp sensor or switch or whatever. If you goof up and destroy it, it will cost you mere $42 to replace it, so, have no fear.
 
As said, to make a complete computer out of it, you will need a keyboard and monitor.
USB keyboard is cheap, but HDMI monitor is not. Enter “lapdock” from Motorola. This was sold as a docking station for Motorola smart phones but apparently was a big flop although Lapdock itself appears to be a beautiful device. It looks like a Macbook Air.
One time you could buy this thing for $40 from Amazon. Original price was more than $500. Then somebody “discovered” that the lapdock can be used with the Pi. Now the instruction of how to connect the Pi (or BBB, or whatever the dev board you want to connect) to the Lapdock is everywhere on the Internet. As of today, the cost of “Atrix 4G Motorola Lapdock” is about $120. I got mine for about $80 just a few weeks ago. Economy of scale must be working nicely. Spend another $20 for cables and you really have a real computer for less than $200.
Computing is fun, once again.

$35(Raspi)+$80(Lapdock)+$20(cable Set)+$8(SD Card) + S&H($12)=$155 system
$35(Raspi)+$80(Lapdock)+$20(cable Set)+$8(SD Card) + S&H($12)=$155 system

NetBeans でクロスプラットフォーム開発環境を作る

BBBやRasPiで使うC/C++のプログラムをWindows上のNetBeans IDE で開発してしまおう、という話。 NetBeansはもともとJavaの開発環境だが、plugin で c/c++ もサポートしている。自分のようにWeekend hoby でプログラミングをやっているものにとってはAutocomplete やSyntax check、変数の使用状況のチェックなどを自動的にやって間違いを指摘してくれるeditor というのは重宝する。
こちらに、Eclipseを使ったアプリケーションの開発及びクロスコンパイルの方法を説明したビデオがあったので、NetBeansを使って同じようなことができないか調べてみた。

リソースの乏しいRasPi上ではなく、普通のデスクトップコンピューターでIDEを使ったアプリケーション開発を行い、コードの生成だけはRasPi上で行う。という環境を作りたかったわけだが、NetBeans.orgにちゃんとやり方の説明が載っていた。

設定は以外と簡単にできた。  Netbeans からLinux BoxにSSHで接続し、さらにLinuxBox からはSambaを使ってLinuxのfile system をWindows側にネットワークドライブとしてシェア、 netbeans のプロジェクトをこのシェアされたフォルダーに書き込んでいき、デバッグはLinuxBox側から行う。 設定さえきちんとできれば、すべてWindows上のnetbeans IDEから処理できる。
この場合、gcc, make, gdbなどのツールはlinuxbox 上に存在するものがsshを使って操作される。よって、こられのツールがLinux側にインストールされている必要があるが、きちんとインストールされていれば、設定の途中でnetbeansがちゃんと検出してくれる。
Linux Box 側からは以下の下準備が必要
1.Sambaのインストール及びsmb.configの設定。(sudo apt-get install samba samba-common-bin)
2.SSH (RasPiもBBBも初期設定でインストール済み)
3.g++, gcc, make, gdb のインストール(sudo apt-get install g++ gcc make gdb)

詳細はこのヘルプページの解説に従えばよい。 Sambaを使ってFolder を Shareする方法のほかにファイルの作成管理はWindows側で行って、コンパイル時にLinux側にすべてコピーするscpを使ったautomatic copy という方法も述べてある(小さなプロジェクトではこちらのほうが早いとある)のだが、自分の環境ではうまくできなかった。

American Piのほうが好きかもしれない。

というわけで、BeagleBone Black(以下BBB)である。 値段が$45ドル。Raspberry Pi (以下RasPi)の実勢価格が$42なので比較してしまうわけだが、あちらが英国製なのに対して、こちらはTIがサポートするコミュニティハードウエア・ソフトウエア。米国製なので、別名 American Pi  ハード的にはアームプロセッサも一つ格が上のグレード、そしてクロックも1Mhzと優位である。回路図を眺めるとちゃんとパワーマネージメントのICが実装されていて、Raspberry Piとは大違い。USBクライエントからの5Vととバレルプラグからの5Vの供給も別チャンネルでしっかり管理されている。(ICの仕様書では7V AC入力となっているんだけど、交流でも大丈夫ということか?)基盤上にはリチュームイオンセル用のパッドまで用意されている。 そのかわり、USBホスト側から5Vぶっこんで電源元にする、というRasPi では許されるいい加減なことがこちらではできない。RasPi に触発されてこの値段になったのは明らかで、前のGeneration (Beaglebone、以後BB)は90ドルくらいした。自由競争というのはいいことだ。  BBにはついていなかったHDMIソケットもBBBにはついていて、かつ2ギガバイトの内臓eMMCにはLinux が実装されているため、付属してくるUSBケーブルをPCに接続(してminiUSBソケットにPC側から電源を供給)するだけでとりあえずは始動する。 イーサネットを使わなければ、専用のUSBドライバーを組み込まないとWindowsとはお話しをしないが、Windows 8 ではコントロールセンターから第3者のドライバーを組み込むことを許可しないとWindows 側がインストールを拒否するので注意。 親機がLinuxの場合は専用ドライバは必要ない。何もしないでもUSB経由のIP接続が可能である。

eMMCに最初から組み込んであるLinuxはAngstromという組み込み系のもので、その起源を紐解けば、Free Zaurus などというものまで出てきて日本人としての因縁をかんじたりする。 自分の環境ではすぐにDebian Wheezy に書き換えてしまったが、これは単にRasPiのRaspbian がDebian そのもので、新しいディストロを覚える手間を省きたかったということが大きい。

で、これにNginx +mysql + php5を実装してWeb Serverを試してみた。 手順はRasPi のときとまったく同じなので、詳しく述べないが、ModX Revolutionという、バックエンドがかなり重いCMSをインストールしてみたところ、問題なく使える。 RasPi では、WEB作成画面の反応が遅くなって実用にならなかった。 RasPi でも少し軽めのModx Evolutionのほうは軽快に使えるので、それはそれで良いのだけれど、あらためて、パワーの違いを感じたわけで、 なんとなく、RasPiよりはBBBのほうになびくわけである。 ちなみに内蔵のeMMCメモリーへのアクセス速度は14MB/S と、RasPiでクラス10のSDカードを差した場合とほとんど変わらず、単純にプロセッサの能力の差がでているようだ。あとはramの違いかRAMの速度も400Mhzと同様。

その他に気が付くところとしては、
RTC が実装されている。
外に出ているIO ピンが 多い(実はそのうちの半分くらいはHDMIとeMMCの入出力ピンとして使われているので、全部使うにはこれらのデバイスを無効化する必要がある。が、それでもRasPiよりも多い。)。
このIOピンはメールコネクタヘッダになっていて、リード部品などそのまま差し込めるので、RasPiのヘッダーピンより使いやすそう。

パワースイッチ、リセットスイッチ、 そして、ブートをSDカードから行うためのスイッチ、とミニボタンスイッチが三つもついている。
パワーLEDのほかにユーザーがコントロールできるLEDが4つついている。
Shutdown -h now を実行すると、ちゃんと電源が落ちる。前述の電源コントローラICがついていることによると思われる。再起動はパワーボタンを押すだけ。
RasPiに比べて見劣りするのはUSBホストソケットが一つしかついていないことくらいか。
それとVideo Codecがハードウエア処理ではないので、HTPC用途ではRasPiに軍配が上がりそうだ。
BoneScriptというNode.js上で動くJavascript ライブラリがAngstromには実装されていて、これをやはり実装されているCloud9 というブラウザベースのIDE上で開発していく、ということらしいが、Debian で置き換えてしまったので、とりあえずはRaspiと同様、Pythonを使えばGPIOモヂュールを使って外部とのインターフェースも可能なようだ。(Adafruit.comに多くの教材がアップされている) BoneScriptもそのうちDebian/UbuntuをサポートするようなのでJavaScriptによる外部機器のコントロールのほうは少し待つとしようか。

Physical Computingとして、去年まで熱を上げてたArduinoはどうするよ、と自分に突っ込みをいれたくなるが、これが答えが出ていて、「両方とも使う」というもの。 Arduinoのスケッチ自体はサーバーとの通信とそれに基づく外部接続部品とのインターフェースに特化させ、つまり、簡略化したループを回し、難しいところはBBBでPytonなり BoneScriptを使って行ってシリアル通信でArduinoに指示をしたり、データを受け取ったりする、
従来はこのサーバーの側がPCでDelphiクローンのオープン版Lazarus。 いかにももったいない感じだったが、BBB/RasPiにすると見た目にも機能的にもバランスが取れると思う。

BBB とRasPi 比較表