I2C制御16bit ADC MCP3425(1)
秋月に1個250円で売っているI2C制御16bit ADCのMCP3425に関するメモ。
特徴
- 2.7V〜5.5V動作
- 精度により測定周波数が変わる(16bit精度では15 SPS)
- 内部に2.048V±0.05%(Vref)の基準電圧
- ×1・×4・×8のPGA
- Vin = (Vin+) - (Vin-)の 差動入力が測定可能
- 測定範囲は-Vref <= Vin * PGA <= Vref
回路は端子の名前通りに繋ぐだけです。
今回はV-端子をGNDに接地させて、シングルエンド入力で使いました。
動作を見るだけなので今回だけパスコンは省略。
npm install q npm install i2c
var Q = require('q'); var i2c = require('i2c'); var address = 0x68; var wire = new i2c(address, {device: '/dev/i2c-1'}); Q.delay(10) .then(function(){ wire.writeByte(0x88, function(err){ }) }) .delay(70) .then(function(){ wire.read(3, function(err, res){ var int16value = res[0] << 8 | res[1]; var voltage = 0.0000625 * int16value; console.log(int16value.toString(16) + ' -> ' + voltage + '[V]'); console.log(res[2].toString(16)); }); });
16bit精度で測定するために、ワンショットの測定になっています。PGAは1倍にしたため、+2.048Vまでが測定範囲です。70msのディレイは1/15SPS=66mから計算しています。
テスタでの測定値は1.230Vだったので正しく動作しているようです。
共用体を使わないワード設定(C/C++)
MCP3425のArduino用ライブラリに使われている1ワードのデータを設定する方法が簡単だったのでメモ。
void getResult(int16_t *dataPtr) { ((char*)dataPtr)[1] = read(); ((char*)dataPtr)[0] = read(); }
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の両方が必要になります。
プログラムはこちら
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で動かすまでのメモ。
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
[Hello]の文字を確認できました。
次はnode用のプログラムを作っていこうと思います。
マイコン内蔵RGB PL9823
秋月より
接続が簡単だったので秋月にて購入。 とりあえず光らせられたのでメモ。
買ってから気づいたのですが、少し変わった“味のある仕様書“な上に結構高速な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
とりあえず今回はレベル変換省いた次の回路でテスト。
Wiring | NeoPixels on Raspberry Pi | Adafruit Learning System
サンプル動かすだけなのでコマンドだけ。
npm install rpi-ws281x-native sudo node node_modules/rpi-ws281x-native/examples/rainbow.js
たまに光り方が怪しい時があるような気がしますが、ちゃんと動作します。
推奨は5Vなので、普通に使う時はレベル変換が必要な点に注意。
Promiseを使うためにNodeの手動インストール
Node.jsのコードをラズパイ上で走らせたらPromise is not definedと出て、バージョン確認したらv0.10.29だったため更新することに。
Node.js ES2015/ES6 support
sudo apt-get install nodejs
でインストールすると古かったり、コマンドがnodejsになったりと面倒が多い。
ラズパイでは別の方法でインストールが必要みたい。
参考になった主なリンク
- Ubuntuでaptを使って最新のnode.jsをインストールする | cupOF Interests
- 第三回 Raspberry Pi 3に最新のNode.jsをインストールする - Qiita
- Install Latest Node JS on Raspberry Pi All Models - OSH Lab
最後のリンク通りに進める。
$ 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/
で確認。
Chart.jsクオリティのきれいなグラフが描けました。
$scope.$apply();
することで自動的にデータが更新された時も値が反映され、リアルタイムにデータ更新することが出来ます。
グラフの種類が少なくても問題なければとても良さそう。
2017年1月10日 追記
directive内で表示させようとしても表示できない?
参考
angular-chart.js - beautiful, reactive, responsive charts for Angular.JS using Chart.js