0%

OctalBoneScriptを使って3.14 kernelのBeagleBone BlackでLチカする

BeagleBone ScriptのSDカードからブートしているUbuntu 14.04でBoneScriptを使いLチカを試してみようと思ったのですがエラーが発生して動作しません。kernelを3.8.13から3.14に上げているのが問題になっているようです。OctalBoneScriptを使うと3.14でもLチカできそうなので試してみます。

GPIOのワイヤリング

ブレッドボートとのGPIOのワイヤリングは、Blinking an LED with BeagleBone Blackを参考にしました。

beaglebone_fritzing.png

LEDや抵抗、ジャンパーワイヤーはAmazonで購入したArduinoをはじめようキットの付属品を使います。

GPIOの拡張コネクタレイアウトはこちらを見ながら作業します。P8とP9の位置は間違えないようにします。

cape-headers.png

BoneScriptのサンプル

BoneScriptはNode.jsでハードウェアをコントロールできるパッケージです。eMMCにインストールしたDebianのイメージでは最初から使える状態になっています。SDカードにインストールしたUbuntuにはBoneScriptはインストールされていないので、package.jsonに記述してnpmからパッケージをインストールします。サンプルプログラムはINSPIRE: BEAGLEBONE BLACK RESOURCESのワークショップを参考にコードを書きました。

app.js
/*eslint-env node */
var b = require('bonescript'); // Read library

var ledPin = "P8_10"; // Select pin
var state = 1; // Set LED state
var interval = 200; // Set interval (in ms)

b.pinMode(ledPin, b.OUTPUT); // Set pin to output

function toggleLED() { // Switch LED on or off
state = state ? 0 : 1;
b.digitalWrite(ledPin, state);
}
setInterval(toggleLED, interval);  // Call function at set interval

BoneScriptのバージョンは0.2.4です。

$ npm list bonesctipt
cylon-test@0.0.1 /home/ubuntu/node_modules/orion/.workspace/led
└── bonescript@0.2.4 extraneous

pinModeのエラー

プログラムを実行するとGPIOを操作するpinModeメソッドでエラーが発生してしまいます。どうもカーネルのバージョンが変わるとデバイス名に変更があるようです。BoneScriptは3.8.xのカーネルでないとpinModeのメソッドは動作しないようです。

$ sudo node app.js
...
/home/ubuntu/node_modules/orion/.workspace/led/node_modules/bonescript/index.js:161
if(typeof resp.err != 'undefined') {
^
TypeError: Cannot read property 'err' of undefined
at Object.f.pinMode (/home/ubuntu/node_modules/orion/.workspace/led/node_modules/bonescript/index.js:161:19)

SDカードのUbuntu14.04はカーネルを3.14に上げていました。

$ uname -a
Linux arm 3.14.31-ti-r49 #1 SMP PREEMPT Sat Jan 31 14:17:42 UTC 2015 armv7l armv7l armv7l GNU/Linux

Problem with GPIO / pinMode #93を読むとOctalScriptを推奨しているのでこちらを試してみます。

3.8.x kernelでないとCylon.jsもエラーになる

だだしこの状態だとCylon.jsのcylon-beagleboneもLEDのデバイスを操作できません。Cylon.jsを動かすことが目標なので不都合がでてきます。しばらくはCylon.jsを使う場合、kernelを3.8.13のままにしているeMMCのDebianをブートします。

OctalBoneScriptのサンプル

OctalScriptはBoneScriptをより安定させ良くテストされたNode.jsのライブラリを提供することを目的としています。そのためBoneScriptで書いたコードはOctalBoneScriptと互換性があります。前回コードからrequireするモジュールをoctalbonescriptに変更します。また秒でLチカが終了するようにタイマーのクリアも追加しました。

app.js
/*eslint-env node */
var b = require('octalbonescript'); // Read library

var ledPin = "P8_10"; // Select pin
var state = 1; // Set LED state
var interval = 200; // Set interval (in ms)

b.pinMode(ledPin, b.OUTPUT); // Set pin to output

function toggleLED() { // Switch LED on or off
state = state ? 0 : 1;
b.digitalWrite(ledPin, state);
}

var timer = setInterval(toggleLED, interval); // Call function at set interval

setTimeout(function(){ clearInterval(timer)},3000);

OctalBoneScriptのバージョンは0.4.12です。

$ npm list octalbonescript
cylon-test@0.0.1 /home/ubuntu/node_modules/orion/.workspace/led
└── octalbonescript@0.4.12

DEBUG=boneを追加して起動するとデバッグモードで起動できます。ようやくLチカができるようになりました。

$ sudo DEBUG=bone node app.js 
debug: is_ocp() = /sys/devices/ocp.3
debug: is_cape_universal() = /sys/devices/ocp.3/cape-universal.61
debug: Using Universal Cape interface
debug: Enabling analog inputs
debug: load_dt_sync(cape-bone-iio,,)
debug: onFindCapeMgr: path = undefined
error: CapeMgr not found: undefined
debug: load_dt resp: {"err":"CapeMgr not found: undefined"}
debug: load_dt return: false
debug: index.js loaded
debug: pinMode(P8_10,out);
debug: hw.setPinMode(P8_10,gpio,{"value":true});
debug: returned from setPinMode
debug: hw.exportGPIOControls(P8_10,out,[object Object]);
debug: gpio: 68 already exported.
debug: digitalWrite(P8_10,0);
debug: gpioFile = /sys/class/gpio/gpio68/value
debug: digitalWrite(P8_10,1);
debug: gpioFile = /sys/class/gpio/gpio68/value
debug: digitalWrite(P8_10,0);
debug: gpioFile = /sys/class/gpio/gpio68/value
debug: digitalWrite(P8_10,1);

error: CapeMgr not found: undefined

Lチカは成功しましたがerror: CapeMgr not found: undefinedのエラーメッセージが出ています。すでにリポジトリのIssuesに上がっていました。error: CapeMgr not found: undefined #11

kernel 3.14ではCapeの構成を動的に変更することができなくなっているようです。OctacBoneScriptではGPIOとしてPinを使うモード変更はサポートされていないためエラーが発生しますが、一応Lチカはできるみたいです。