Rsapberry Piは、標準的なデスクトップコンピュータの数分の1の価格で販売されている小型シングルボードコンピュータのシリーズで、メディアセンタやレトロなゲームマシン、低価格デスクトップなどで広く採用されている。
一方でRaspberry Piは、GPIOすなわち"汎用目的I/O(General Purpose Input Output)"ピンを備えており、センサやモータといった外部電気デバイスを接続してコントロールすることも可能だ。
ピンの役割や数は個々のモデル毎に異なるが、全体的には電源、グラウンド、多目的(general-purpose)ピンに分けられる。
電源とグラウンドピンはプログラムでは制御できない。電源ピンは回路に3.3V/5Vの定電圧を供給し、グラウンドは回路の陰極(cathode)の接続に使用される。
多目的ピンの方はプログラムが可能で、出力と入力のいずれにも使用することができる。出力モードに設定した場合は、3.3Vの低電圧を供給し、オンとオフの切り替えが可能だ。入力モードに設定した場合は、回路から供給される電流を読み取って、3.3Vの電力の受信の有無を示すBoolean値を返す。
このような機能は当然目新しいものではなく、ArduinoやNodeMCUといったマイクロコントローラで開発者には馴染みのものだ。しかしながら、これらのデバイスはメモリや演算能力に制限があったり、特殊なプログラム言語を使用する必要のあることが一般的である。
それに対してRaspberry Piでは、Linuxの動作する強力なCPUを備えてNodeJSをサポートすることにより、JavaScript開発者が既存のスキルセットを使って、高度なデバイスを比較的簡単に構築することが可能である。
GPIOピンの操作には、個々のピンへの簡単なアクセスを可能にするonoffというNodeJSモジュールを使用する。
マイクロコントローラの世界での"hello world"に相当するのは、LEDを点滅するプログラムである。例としてあげたコードの大部分は、JavaScript開発者にはお馴染みのものであるはずだ。
const Gpio = require('../onoff').Gpio;
const led = new Gpio(17, 'out');
モジュールをrequireした後、操作対象とするピンの役割を定義する。数値はボード上のピン番号を示しており、続くパラメータでピンを読み取り("in")あるいは書き込み("out")に使用することを指定する。
この例では、ledというピンを定義して、物理的な17番ピンでアサインし、書き込みモード("out")にセットしている。
const blinkInterval = setInterval(blinkLED, 500);
function blinkLED() {
if (led.readSync() === 0) {
led.writeSync(1);
} else {
led.writeSync(0);
}
}
後は500msのインターバルを生成して、状態に応じてledをon/offすれば、LEDを点滅させることができる。
setTimeout(() => {
clearInterval(blinkInterval);
led.writeSync(0);
led.unexport();
}, 5000);
LEDの点滅を永遠に続けるつもりがなければ、最後にクリーンアップする必要がある。この例では、インターバルをクリーンするまで5秒間待機して、LEDを消灯し、リソースを解放している。
当然ながらRaspberry Piでは、LEDを点滅させる以外のことも可能である。ドローンや、Raspberry Piスケートボードを作った開発者もいるのだ。JavaScriptで記述されたものばかりではないが、さまざまなレベルのエキサイティングなプロジェクトが、Raspberry PiのWebサイトには多数紹介されている。