気ままにIoTメモ

Iotに関わること関わらないこと備忘録

共用体を使わないワード設定(C/C++)

MCP3425のArduino用ライブラリに使われている1ワードのデータを設定する方法が簡単だったのでメモ。

void getResult(int16_t *dataPtr) {
       ((char*)dataPtr)[1] = read();
       ((char*)dataPtr)[0] = read();
}

データの読み込みは1バイトずつで、測定データは2バイトと言う場合に使えそうです。

I2C接続小型キャラクタLCDモジュール(2)

I2Cで制御するLCD用のライブラリを作ったので、使い方のメモ。

回路図はI2C接続小型キャラクタLCDモジュール(1)を参考にしてください。

まずは使っているモジュールのインストール。

npm install i2c
npm install q

サンプルコード

var Lcd = require('./lcd');
// lcd = new Lcd({cols:16, rows:2, contrast: 35}); 
// lcd = new Lcd(); // デフォルト値は省略可
lcd = new Lcd({largeFont:true, rows:1});

lcd.on('ready', function(){
    lcd.print('Hello, world!');
});

I2Cのアドレスは0x3e、16文字2行、コントラストは35がデフォルトになっています。
アドレスを変更したい時には直接ライブラリ内のアドレスを変える必要あり。
カタカナは使う予定が無かったので、ASCIIコード内の文字しか表示できないようになっています。

2行分の文字を表示させる時にはlargeFontとrowsの両方が必要になります。

f:id:htn_hs:20170115004035j:plain

プログラムはこちら
iot_lab/07_i2c_lcd at master · hsgwa/iot_lab · GitHub

本当はCのマクロのようなビット演算

#define bitcheck(a,b) (a >> b) & 1
#define bitset(a,b)     a |= (1 << b)
#define bitunset(a,b)  a &= ~(1 << b)

のようなことをしたかったのですが、プリミティブ型は値渡しになってしまうので毎度丁寧にビット演算式を書いてます(Javascriptにビット操作は向かないのですね)。

今回、ライブラリの作成にはNode.js Hitachi HD44780 LCD driverを参考にさせていただきました。

参考:
aqm0802a-i2c-lcd by saraf
GitHub - fivdi/lcd: Node.js Hitachi HD44780 LCD driver
H8で学ぶマイコン開発入門(7):LCDに文字を表示させるプログラミング (1/3) - MONOist(モノイスト)
i2c
トリッキーなコード - bit演算マクロ
【Javascript】値渡しと参照渡しについてあらためてまとめてみる - Qiita

I2C接続小型キャラクタLCDモジュール(1)

秋月に550円でi2C接続のLCDがあったのでラズパイのnodeで動かすまでのメモ。

f:id:htn_hs:20170114124950j:plain AQM1602XA-RN-GBW
ST7032で制御されており、I2Cで制御できるようになっています。

LCD側の電流の引き込み能力が低いため、ラズパイとLCDモジュールの間にI2Cバスリピーターが必要になるようです。
Umbrella RaspberryPi I2C接続のキャラクタLCDを使う (AQM1602)

今回はバスリピーターには秋月に売ってるPCA9515ADを使いました。 秋月さまが用意してくれている「Raspberry Pi B3/B2/A+ と I2C 液晶モジュールの接続方法」通りに接続。

npmにはLCD用のモジュールもあるのですが、I2Cで制御するようなモジュールは良いものがまだありませんでした。
唯一、ちょうどaqm0802a-i2c-lcdがあったのですが、「This npm module is not yet ready for use.」とのこと。

nodeのモジュールは無くても、First stepsなどのドキュメントはあったのでその通りに進めます。

I2Cを有効にする

sudo raspi-config

i2c-toolsのインストール

sudo apt-get update
sudo apt-get install i2c-tools

I2Cバスデバイスの番号( i2c-1)を確認

sudo i2cdetect -l

バスに接続されているデバイス(0x3e)を確認

sudo i2cdetect -y 1

LCDの初期設定

sudo i2cset -y 1 0x3e 0x00 0x38 0x39 0x14 0x70 0x56 0x6c i  
sudo i2cset -y 1 0x3e 0x00 0x38 0x0d 0x01 i

文字の出力

sudo i2cset -y 1 0x3e 0x40 0x48 0x65 0x6c 0x6c 0x6f i

f:id:htn_hs:20170114132346j:plain
[Hello]の文字を確認できました。

次はnode用のプログラムを作っていこうと思います。

マイコン内蔵RGB PL9823

秋月より

マイコンで1個ずつ制御することができるマイコン(シフトレジスタ)内蔵の画期的なフルカラーRGBのLEDです。

接続が簡単だったので秋月にて購入。 とりあえず光らせられたのでメモ。

買ってから気づいたのですが、少し変わった“味のある仕様書“な上に結構高速なPWMを必要とし、Arduinoだと駆動させるだけでCPUが精一杯になっちゃうぐらい難ありなLEDらしいです。

Raspberry PiでフルカラーLED:腰も砕けよ 膝も折れよ:So-net blog

PL9823の制御 - ロボボボいじりにうってつけのwiki

ただ、中身に使われているWS281xで調べてみればライブラリもドキュメントも多く、npmにもrpi-ws281x-nativeというライブラリがありました。今回は説明通りにサンプルを動かします。

他のライブラリの説明を読むと、5V推奨だけど3.3Vでも一応動かせられるみたい。 GitHub - jgarff/rpi_ws281x: Userspace Raspberry Pi PWM library for WS281X LEDs

とりあえず今回はレベル変換省いた次の回路でテスト。

f:id:htn_hs:20170112005420j:plain

Wiring | NeoPixels on Raspberry Pi | Adafruit Learning System

サンプル動かすだけなのでコマンドだけ。

npm install rpi-ws281x-native
sudo node node_modules/rpi-ws281x-native/examples/rainbow.js

www.youtube.com

たまに光り方が怪しい時があるような気がしますが、ちゃんと動作します。

推奨は5Vなので、普通に使う時はレベル変換が必要な点に注意。

Promiseを使うためにNodeの手動インストール

Node.jsのコードをラズパイ上で走らせたらPromise is not definedと出て、バージョン確認したらv0.10.29だったため更新することに。
Node.js ES2015/ES6 support

sudo apt-get install nodejsでインストールすると古かったり、コマンドがnodejsになったりと面倒が多い。
ラズパイでは別の方法でインストールが必要みたい。

参考になった主なリンク

最後のリンク通りに進める。

$ sudo curl -sL https://deb.nodesource.com/setup_4.x | sudo bash -

## You appear to be running on ARMv6 hardware. Unfortunately this is not currently supported by the NodeSource Linux distributions. Please use the 'linux-armv6l' binary tarballs available directly from nodejs.org for Node.js v4 and later.

仕方ないので手動でインストール。
Node.js v4以降のlinux-armv6lを使ってくれ、と言うことなのでMacと同じv7.4.0をインストールすることに。

wget  https://nodejs.org/dist/v7.4.0/node-v7.4.0-linux-armv6l.tar.xz
tar -xvf node-v7.4.0-linux-armv6l.tar.xz
cd node-v7.4.0-linux-armv6l
sudo cp -R * /usr/local/
sudo reboot

Node v7.4.0 (Current) | Node.js

今回は手動インストールしましたが、nvmを使ったほうが無難。

Raspberry PiでIoTなシステム開発:nodeのインストールが楽になった | 法務ネット:弁護士 川内康雄

Error: Module did not self-register.と言われましたが、node_modules内を一度削除し、再度npm installすることで解消されました。

An angular.js wrapper for Chart.js

Epochも良かったのですがAngularJSと相性の良さそうなライブラリがあったので試し。

The 38 best tools for data visualization
試してみるのはリンク先でperfect data visualization tool for hobbies and small projects と評されている Chart.js。

大体サンプル通りにやってみます。

mkdir chartjs
cd chartjs
express --view=ejs
npm install
npm install --save
npm install --save angular-chart.js

app.jsに追記

app.use(express.static(path.join(__dirname, 'node_modules')));

views/index.ejsのbodyを書き換え

  <body ng-app="app">
    <div ng-controller="BarCtrl">
      <canvas id="bar" class="chart chart-bar" chart-data="data" chart-labels="labels" chart-series="series">
      </canvas>
    </div>

    <script src="/angular/angular.min.js"></script>
    <script src="/chart.js/dist/Chart.min.js"></script>
    <script src="/angular-chart.js/dist/angular-chart.min.js"></script>
    <script>
      angular.module("app", ["chart.js"]).controller("BarCtrl", function ($scope) {
        $scope.labels = ['2006', '2007', '2008', '2009', '2010', '2011', '2012'];
        $scope.series = ['Series'];
        $scope.data = [
          [65, 59, 80, 81, 56, 38, 11]
        ];

        setInterval(function(){
          $scope.data = $scope.data.map(function (data) {
            return data.map(function (y) {
              y = y + Math.random() * 10 - 5;
              return parseInt(y < 0 ? 0 : y > 100 ? 100 : y);
            });
          });
          $scope.$apply();
        }, 1000);
      });
    </script>
  </body>

npm startし、http://localhost:3000/で確認。

f:id:htn_hs:20170104165225p:plain

Chart.jsクオリティのきれいなグラフが描けました。

$scope.$apply();することで自動的にデータが更新された時も値が反映され、リアルタイムにデータ更新することが出来ます。

グラフの種類が少なくても問題なければとても良さそう。

2017年1月10日 追記
directive内で表示させようとしても表示できない?

参考

AngularJS: Parent scope is not updated in directive (with isolated scope) two way binding - Stack Overflow

angular-chart.js - beautiful, reactive, responsive charts for Angular.JS using Chart.js

iot_lab/06_chartjs at master · hsgwa/iot_lab · GitHub

リアルタイム用グラフライブラリ Epoch

A general purpose real-time charting library for building beautiful, smooth, and high performance visualizations.

公式いわく、美しく、滑らかで高いパフォーマンスの可視化のための汎用リアルタイムグラフライブラリ「Epoch」

ブラウザの更新をしなくてもSocket.IOと合わせてリアルタイムにグラフを更新したい、ということで使ってみます。
普通に公式のGetting started通りに進めます。

まずはExpressと必要なモジュールインストール。

mkdir epoch
cd epoch
express --view=ejs
npm install
npm install epoch-charting --save
npm install jquery --save

app.jsに追加

app.use(express.static(path.join(__dirname, 'node_modules')));

views/index.ejsのheadderタグに追加

  <link rel="stylesheet" type="text/css" href="epoch-charting/dist/css/epoch.min.css">
  <script src="jquery/dist/jquery.min.js"></script>
  <script src="d3/d3.min.js"></script>
  <script src="epoch-charting/dist/js/epoch.min.js"></script>

最後にviews/index.ejsのbodyタグでグラフ作成。

  <div id="area" class="epoch category10" style="height: 200px; width: 400px;"></div>
  <script>
  var data = [
  { label: 'Layer 1', values: [ {x: 0, y: 0}, {x: 1, y: 1}, {x: 2, y: 2} ] },
  { label: 'Layer 2', values: [ {x: 0, y: 0}, {x: 1, y: 1}, {x: 2, y: 4} ] }
  ];
  var areaChartInstance = $('#area').epoch({
  type: 'area',
  data: data,
  axes: ['left', 'right', 'bottom']
});
</script>

npm startで実行し、localhost:3000で確認。

f:id:htn_hs:20170104135053p:plain

あとは公式のサンプル通りにいじればデータの可視化ができそうです。

グラフの種類が多くないので、リアルタイムにこだわらない・もっとリッチなグラフを使いたい場合他のライブラリを使った方がいいかもしれません。

参考

Epoch

iot_lab/05_epoch at master · hsgwa/iot_lab · GitHub