趣味的なIT・ネットの話題

Raspberry PiでIoTなシステム開発:node.jsでGPIO割り込みを使うならonoff、ハードウェアPWMを使うならrpioがオススメ

nodeはnpmで提供されているパッケージが豊富なのが魅力ですが、メンテされていなくて現状では使えないものも多いです。GPIO割り込みとハードウェアPWMも対応を謳っているパッケージがそれぞれいくつかあります。が、いろいろ試して見ていずれも事実上一択状態でした。

GPIO割り込みが使えそうなのは、pidriver、onoff、rpi-gpioです。試して見たところ、pidriverはコンパイル失敗、rpi-gpioは動くには動くけれどもドキュメントが意味不明でした。onoffはちゃんと動作するし、ドキュメントもわかりやすいです。APIも使いやすそうなのでこれで行こうと思います。

onoff

ハードウェアPWMが使えそうなパッケージは沢山ありましたが、インストールできた、サンプルコードで動いたのがrpioのみでした。WiringPiの設定を踏襲しているので、CでWiringPiを使った経験があるのであれば、移行もスムーズだと思います。

rpio

ちなみにClockDividerの設定で2の累乗以外を設定すると怒られるのですが、WiringPiで使用していた時に2の累乗以外でもちゃんと動いていて、正確な周波数になっていました。圧電ブザーの発振に使いたいので、正確な音程を出すためには中途半端な数を設定したいです。そこでrpioのコードを修正して、引数のチェックを外しました。node_modules/rpio/lib/rpio.jsの516行目あたりです。

rpio.prototype.pwmSetClockDivider = function (divider)
{
/*  	if (divider !== 0 && (divider & (divider - 1)) !== 0)
		throw "Clock divider must be zero or power of two desu";*/

	return binding.pwm_set_clock(divider);
}

書いてみたコードがこちら。書いてみたというかそれぞれのサンプルをむりやりくっつけただけですね。それでもちゃんと動作して、PWMを出しながら割り込みに反応しています。

var rpio = require('rpio');

var pin = 12;           /* P12/GPIO18 */
var range = 100;       /* LEDs can quickly hit max brightness, so only use */
var clockdiv = 216;       /* Clock divider (PWM refresh rate), 8 == 2.4MHz */

/*
 * Enable PWM on the chosen pin and set the clock and range.
 */
rpio.open(pin, rpio.PWM);
rpio.pwmSetClockDivider(clockdiv);
rpio.pwmSetRange(pin, range);
rpio.pwmSetData(pin, 50);


var Gpio = require('onoff').Gpio,
  led = new Gpio(4, 'out'),
  button = new Gpio(17, 'in', 'both');

function exit() {
  led.unexport();
  button.unexport();
  process.exit();
}

button.watch(function (err, value) {
  if (err) {
    throw err;
  }

  led.writeSync(value);
  console.log("%d pushed %d", Date.now(), value);
});

process.on('SIGINT', exit);

 


Facebooktwitterpinterestlinkedinmail
納得したらすぐにシェア!