開発ノート (91)

川内 康雄

if (divider !== 0 && (divider & (divider – 1)) !== 0)

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){/*” 本文は当時のrpioを対象とする実験です。分周値を制限する条件式で使う減算記号はASCIIの-です。整数が2の累乗かを調べる基本式は、正の整数nに対して(n & (n - 1)) === 0となります。分周器が許す値かどうかは別の問題なので、この条件を外せばすべての値がハードウェア上で有効になるわけではありません。

Continue reading...
川内 康雄

Raspberry PiでIoTなシステム開発:デバッグ用のスイッチ・LED基盤作りました

休日の小ネタ。デバッグ用の基板作りました。スイッチはプルアップしています。LEDは4つ付いていますが、スリーステートの状態が把握できるように以下の様な回路にしてみました。ハイとローで点灯するLEDが変わります。VFが1.8VあるLEDを使ったので、ハイインピーダンスだと点灯しないと思いましたが、うっすらと点灯しています。実際のVFは1.65V以下なのかもしれません。“””

Continue reading...
川内 康雄

Angular2でSPAなシステム開発:serviceのデータを同期するならPromiseよりもEmitter、EmitterよりもObservable

Ionic2がAngular2を前提している関係上、作法に則った形でアプリケーションを作ろうとすると、どうしてもAngular2の知識が必要になります。今回やりたかったのは、websocketの接続やデータを一括してserviceで行い、serviceがwebsocketでデータを受信したら、関係しているPageでデータのアップデートを行うという作業。各Pageでwebsocketの接続を作るのであれば考えることは少ないのですが、一つのアプリケーションで複数の接続を張るというのは合理的では無いですし、同じデータを複数のPageで使うこともあるので、ばらばらに接続すると整合性に問題も出そうです。Angular2で各Pageで同じデータを共有するには依存性注入に登録したserviceを使うのが基本のお作法の様です。Services – tsでここで困ったのが、service側で情報を取得して管理する情報が変化したときに、これをPage側に働きかけてPageを更新する方法。Page側からserviceのメソッドを実行するのは簡単なのですが、Service側がきっかけとなって更新をする方法がすぐには分かりませんでした。本当はserviceとPageの各変数を直接バインドしてしまう方法があればいいなと思ったのですが、今日かなり検索した限りでは見つかりませんでした。最初に気づいたのが、先ほどのページで解説されているPromiseを使う方法。JavaScript Promiseの本このサイトは素晴らしいですね。無茶苦茶わかりやすい。みんな買いましょう。 getAfterFalse() { console.log(""getAfterFalse""); return new Promise(resolve =>{ setInterval(()=>{ if(this.flag == false){ this.flag = true; console.log(""flag change""); resolve(HEROES); } },1000); }); } service内で目的の条件が達成されるかどうかをウォッチしておいて、条件達成時にresolveをして、呼出元に処理を戻します。 this._heroService.getAfterFalse().then(heroes => this.heroes = heroes); Pageに戻ってきたらPageの変数を更新します。が、ポーリングをしているというのがいかにもださく、処理に即時性も無いですし、負荷も大きいはずです。そこで次に発見したのがEventEmitterを使う方法。Angular2 detect change in service – Stack Overflow import {EventEmitter} from 'angular2/core';@Injectable()export class HeroService…

Continue reading...
川内 康雄

node.jsでサーバサイドのJavaScrpt開発:socket.ioはwscatではなくiocatでデバッグ

久しぶりにsocket.ioを使うので、簡単なプログラムを作ってテストをしてみることにしました。サーバサイドはこれ。 /// var fs = require(“”fs””);var server = require(“”http””).createServer(function(req, res) { res.writeHead(200, {“”Content-Type””:””text/html””}); var output = fs.readFileSync(“”./index.html””, “”utf-8″”); res.end(output);}).listen(8080);var io = require(“”socket.io””).listen(server);var reply:string;io.sockets.on(“”connection””, (socket) => { io.sockets.emit(“”message””, “”thank you for connecting””); console.log(“”connection from socket.io client””); socket.on(“”message””, (message) => { console.log(“”key:message %s””, message); reply= “”I got…

Continue reading...
川内 康雄

ionic2でハイブリッドなアプリ開発:ionic2/Angular2でsocket.ioを使う

Creating a Real Time Chat Application with Ionic 2 and Socket.ioionic2でsocket.ioを使うにはどうしたら良いかと思い最初に見つけたのがこの記事。ですが、index.htmlでインポートするというのはionic2/angular2の作法に沿っていない様に思われ、もしindex.htmlがアップデートされたときに記述が消失してしまうリスクもあるように思いました。そこでもう少し検索して発見したのがこちら。How to include socket.io-client · Issue #221 · AngularClass/angular2-webpack-starternpmでsocket.io-clientというモジュールを入れて、これを呼ぶとのこと。npmからローカルインストールされたものがクライアントのビルドの中に入るのかちょっと不安でしたがやってみたらできました。 npm install socket.io-client --savetypings install socket.io-client --save --ambient このとおりインストールしてコードを書いてみます。書き方は公式より。socketio/socket.io-client: Realtime application framework (client) import {Page, NavController, NavParams} from 'ionic-angular';import {ItemDetailsPage} from '../item-details/item-details';import * as io from…

Continue reading...