PaiZero Wのアンテナを見つつ、アレクサとかGoogleアシストを呼び出すものを作る構想なんぞを練ってみる

Banana Pi に浮気していましたが、RasPi Zero W に戻ってきました。
この子は、2017/02 にリリースされたんですね。だいぶ遅れましたがあれこれ見ていきましょう。まずは、何事も観察から始まります。

今日は、RasPai Zero W のアンテナには工夫があるっていうことで各記事を参照してみた後、その部分をみてみました。

スイッチサイエンスマガジン:Rapberry Pi Zero Wのアンテナのお話

S20181121_001.jpg

手前に見えているのは、普通のボールペンの先っちょです。上がアンテナ部分。
基盤の各層の銅箔部分と、コンデンサ3つで2.4GHz 帯の電波をキャッチするようです。

スゥーデンのProant社ってとこがライセンスしたみたいです。こんな工夫があるんですね。

 

アンテナの設計エンジニアが書いた記事が紹介されていました。

Enbedded COMPUTING DESIGN
A lesson in wireless engineering from the Raspberry Pi

そのほか、いろいろ調査してみます。Zero の基盤と W との比較は以下。

C5viOAmWAAA9VEh.jpg

部品レイアウトもちょっと変更されています。サイズは同じなんでケースなんかは流用できます。

GIF-640px-med.gif

面白いですね〜。

最後に、回路の概要図のリンクを。PCB のデータは見つかりませんでした。どっかにはあると思うんですが。この基盤、裏側には部品が実装されてないんですよね。すごいなと。

rpi_SCH_ZeroW_1p1_reducedSCHEMATIC1___PAGE2_-_POWER__XOS.png

とりあえず、なにかまたPCB基盤を作ってみたくなりました。〇〇HAT基盤とか、なにか、作ってみたいですね。

というか、ちゃんと1つの機能が動作するモノを最近何も作っていなくて、そういう役立つ何かを作ってみたいです。

あれこれ調査していますが、いろいろ作れて迷います。一番興味が引くもので面白く、かつみんなが興味を持つもので、何より自分が作りたいもの。

1つ候補が上がっています。それは、Amazon EchoとGoogle Home の2つの機能を1つにまとめたものがあると楽しいかなと。こういうジャンルってなんていうんですかね? スマートスピーカー? うーん、実際には裏側で通信して受け答えをしているわけなんで、音声認識のAIの先っちょって感じでしょうか?Amazon EchoとGoogle Homeは、両方ともなんだかんだと買いそびれてしまい、まだ持っていないんですよね。自作できたら、作りたいなと。どうやら、できそうなんですよね。

まぁそれでも、「ねぇ、アレクサとGoogle 。7時か8時くらいになったらやさしく起こして。」

なんて、お願いできたら、いいなと思っています。さらには、アレクサとGoogle の名前部分を家族の名前にしたら面白いんじゃないかと。猫とかの名前でもいいです。結構笑えるモノができそうな予感。
〇〇→猫1
△△→猫2

「ただいま〜、〇〇。△△、今日のご飯は何にしよう?」とか、話かけたりできたら面白いかもしれません。

 

Raspberry Pi Zero セットアップ2

今日は、RasPi Zero に接続する MicroUSB の OTG ケーブルが届いたので少し遊んでみた。LED が点灯せず、焦りましたが、SDカードをフォーマットしていて OS が入っていないのを忘れていました。テスター当てて、電源がきているか確認です。ここが参考になりますね。

S20181119_001.jpg

普通に扱っていれば、滅多に壊れないのでLED が付かなくてもとりあえずは、SDカードの内容を確認してみるのがいいですね。自分の場合は、SDカードに刺した状態で、USB認識しなかったんで、もしかすると本当にどこかおかしいのかもしれません。

S20181118_001.jpg

で、無事ブートしました。3本も接続すると、本体がちっこすぎてケーブルに引っ張られますね。まずは、定番の UnixBenchです。OS は、2018-10-09-raspbian-stretch-lite です。Update も何もせずとりあえず、UnixBench をコンパイルして実行。

========================================================================
BYTE UNIX Benchmarks (Version 5.1.3)

System: pizero: GNU/Linux
OS: GNU/Linux — 4.14.71+ — #1145 Fri Sep 21 15:06:38 BST 2018
Machine: armv6l (unknown)
Language: en_US.utf8 (charmap=”ANSI_X3.4-1968″, collate=”ANSI_X3.4-1968″)
CPU 0: ARMv6-compatible processor rev 7 (v6l) (0.0 bogomips)

21:00:01 up 22 min, 2 users, load average: 0.08, 0.25, 0.21; runlevel 3

————————————————————————
Benchmark Run: Sun Nov 18 2018 21:00:01 – 21:28:09
1 CPU in system; running 1 parallel copy of tests

Dhrystone 2 using register variables 2152307.8 lps (10.0 s, 7 samples)
Double-Precision Whetstone 461.6 MWIPS (10.0 s, 7 samples)
Execl Throughput 222.2 lps (29.8 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks 37774.2 KBps (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks 12292.0 KBps (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks 94535.6 KBps (30.0 s, 2 samples)
Pipe Throughput 129589.5 lps (10.0 s, 7 samples)
Pipe-based Context Switching 20014.2 lps (10.0 s, 7 samples)
Process Creation 564.7 lps (30.0 s, 2 samples)
Shell Scripts (1 concurrent) 465.9 lpm (60.1 s, 2 samples)
Shell Scripts (8 concurrent) 59.6 lpm (60.4 s, 2 samples)
System Call Overhead 441679.0 lps (10.0 s, 7 samples)

System Benchmarks Index Values BASELINE RESULT INDEX
Dhrystone 2 using register variables 116700.0 2152307.8 184.4
Double-Precision Whetstone 55.0 461.6 83.9
Execl Throughput 43.0 222.2 51.7
File Copy 1024 bufsize 2000 maxblocks 3960.0 37774.2 95.4
File Copy 256 bufsize 500 maxblocks 1655.0 12292.0 74.3
File Copy 4096 bufsize 8000 maxblocks 5800.0 94535.6 163.0
Pipe Throughput 12440.0 129589.5 104.2
Pipe-based Context Switching 4000.0 20014.2 50.0
Process Creation 126.0 564.7 44.8
Shell Scripts (1 concurrent) 42.4 465.9 109.9
Shell Scripts (8 concurrent) 6.0 59.6 99.4
System Call Overhead 15000.0 441679.0 294.5
========
System Benchmarks Index Score 97.0

100くらいだとは知っていましたが、おそっ(笑)まぁ、シングルコアなんで仕方ありませんね。使い道に困るデバイスかもしれません。というか、今までのこれ系のボードも結局転がっていますしね。ベンチマーク取って、あぁ、安いね、小さいね。で終わっています(笑)

でも本体が小さいので、Linux の何かを使ったものを作るにはいいかもしれません。例えば、カメラとか? 家の IoT デバイスを集中的に処理するものとか。あと、アリエク物色していて、Banana Pi M2 Zero っていう互換?ボードも見つけました。2400円(送料込)

zero2.png

特色は、CPU コア数が4つで、メモリがDDR3 なんで処理速が早い(とは行っても、たかが知れてるかもですが)いや、この大きさで4core なのはいいんじゃないでしょうか?

HardWare Specification of Banana pi BPI-M2 zero VS Raspberry Pi Zero W
Module Banana Pi BPI-M2 Zero Raspberry Pi Zero W
CPU H2+ Quad-core Cortex-A7 H265/HEVC 1080P Broadcom BCM2835 32 Bit 1 GHz ARM1176JZF-S single-core
GPU Mali400MP2 GPU @600MHz,Supports OpenGL ES 2.0 VideoCore IV
Memory \(SDRAM\) 512M DDR3(shared with GPU) 512 MB DDR2
Onboard Storage TF card \(Max. 64GB\) TF card \(Max. 64GB\)
Onboard Network NOPE NOPE
Onboard WIFI SDIO AP6212(option AP6181、AP6335)Bluetooth 4.0 (AP6212) 802.11n wireless, Bluetooth 4.1
Video decoding 1080p@60fps,H.264 Video encoding 1080p@30fps,H.264 1080p30 H.264/MPEG-4 AVC high-profile decoder and encoder
Video input A CSI input connector Camera CSI camera connector
Video Outputs mini HDMI 1.4,1080P@30fps, DHCP Mini HDMI and USB On-The-Go ports
Audio Output Mini HDMI Mini HDMI
Power Source Micro USB with 5V/2A 5V/2A
USB 2.0 Ports one USB 2.0 OTG one USB 2.0 OTG
Buttons Power Button, Reset Button Composite video and reset headers
Low-level peripherals 40 Pins Header,compatible with Raspberry Pi 3 40 PIN
uart GPIO\(1×3\) pin UART, ground UART
LED Power led & Status led Power Status LED
IR N/A N/A
Supported OS Android, Ubuntu, Debian, Rasberry Pi Image Linux
Product size 65mm × 30mm 65mm x 30mm
Weight 15g 9G

比較は、ここがわかりやすいですも。一部、Bluetooth がないなど情報の間違えはありますが。到着するまで、ここのWikiでも読んでますか。

こういう小さくて、手頃なやつを見つけるとつい買っちゃうんですよね。WiFi のAP6212も技適は AMPAK社 が通しているようで問題ないと思うんで、ポチってみました。

AP6212_V1.1_09022014

giteki_AP6212.png

また、これでゴミが1つ増えたかも。(笑)いや、これは壮大なる、汎用品で作る UMPC プロジェクトの始まりになるのかもしれません。たぶん、海外のかたでやっているかたがいるはず。

モバイルで使いたいのは、快適なテキスト入力と、常時data通信で、ssh 端末として使いたいんですよね。こんな限定的に使う人は、たぶんLinux エンジニアか、テキスト入力で原稿作りたい記者か、作家くらいのもんで、需要は一定数あると思うんですが、日本のメーカーはこの分野はもうからないと撤退したようです。

ないなら、作れです。いつどこでも、メンテナンスできて、ブログのネタも快適にテキスト入力できる端末っていうのがあると嬉しいんです。多少大きくてもキーボードはフルピッチのキーがほしい。横幅26cm あってもいいんでそういう端末がほしいんですよね。昔、Libretto って端末があったんですが結局買えず仕舞いでした。

じゃ、普通のうっすいノートPCでいいじゃんとはならないんです。キーボードが打ちにくいんですよね。できればメカニカルなやつで、ファンクションキーがないタイプ。

Raspberry Pi Zero セットアップ1

ちょこっと時間が出来たので、Raspberry Pi Zeroをセットアップ。
セットアップは大きく2つ方法があります。

(1)USBを母艦に繋げてSDカードに展開しセットアップする方法
>WiFi設定など入れれるのでモニタなしでも可能
(2)SDカードにimg を展開。hdmi モニタやキーボード使って、boot する
>モニタやキーボードなど繋げる必要あり

とりあえず、HDMI出力もされるか確認したかったので(2)の方法でやることに。
SDカードに書き込むのは、コマンドライン、ツールを使う方法がありますが、マカーなのでGUIツールのEtcherを使って書き込み。

.
├── 2018-10-09-raspbian-stretch-lite.zip
└── 2018-10-09-raspbian-stretch.zip

GUIがない、lite ってやつから遊んでみることにします。
Etcher_–_7__Flashing.png

ツールを使うとdisk を間違えなくていいですね。書き込むと、fatの boot領域とlinux の領域が最低限で作られます。

$ diskutil list | grep -A5 external
/dev/disk2 (external, physical):
#: TYPE NAME SIZE IDENTIFIER
0: FDisk_partition_scheme *16.0 GB disk2
1: Windows_FAT_32 boot 45.9 MB disk2s1
2: Linux 1.8 GB disk2s2

電源のUSB は外側です。内側のUSBは母艦に繋げてUSB 接続し、SDカードをマウントできるようです。次回試して見ましょう。

S20181116_001.jpg

ここで、キーボードがMicroUSB なんで繋げない事に気がついた・・・・OTGケーブルを調達することに。

amazonusb.png

microUSB を分解して繋げればいいんですが、ま1つくらいあってもいいかと変換ケーブルを発注。時間もなくなってきたようなんで、また土日にセットアップすることに。

とりあえず、HDMI出力し無事bootしたのを確認したところまで。

一応、Fedora も入れてみたかったのでimg を用意しておきました。

.
├── Fedora-LXDE-armhfp-29-1.2-sda.raw.xz
├── Fedora-Server-armhfp-29-1.2-sda.raw.xz
├── Fedora-Workstation-armhfp-29-1.2-sda.raw.xz
└── Fedora-Xfce-armhfp-29-1.2-sda.raw.xz

kernel モジュールなど、どのくらいFedoraで動くかなど、あれこれ、検討してみたいと思います。

 

VNC 設定と osx10.11 の画面共有

いつも VNC の設定の仕方を忘れるので備忘録。

参考

Raspberry Piの設定【VNCサーバ(tightVNC)の設定】

ARMBIAN のデスクトップ版は、nodm で自動ログインするので、まずこれを中止。

---- /etc/default/nodm
::
#NODM_ENABLED=true
NODM_ENABLED=false

続いて、vnc のインストール

# apt-get install tightvncserver

設定

---- /etc/init.d/vncboot
### BEGIN INIT INFO
# Provides: vncboot
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start VNC Server at boot time
# Description: Start VNC Server at boot time.
### END INIT INFO

#! /bin/sh
# /etc/init.d/vncboot

USER=junkhack
HOME=/home/junkhack

export USER HOME

case "$1" in
 start)
 echo "Starting VNC Server"
 #Insert your favoured settings for a VNC session
 su $USER -c '/usr/bin/vncserver :1 -geometry 1440x900 -depth 24'
 ;;

 stop)
 echo "Stopping VNC Server"
 su $USER -c '/usr/bin/vncserver -kill :1'
 ;;

 *)
 echo "Usage: /etc/init.d/vncboot {start|stop}"
 exit 1
 ;;
esac

exit 0

権限付与と、自動起動設定

# chmod 755 /etc/init.d/vncboot
# update-rc.d vncboot defaults

 

リブートするか、起動スクリプトをたたく。

# /etc/init.d/vncboot start

osx からの画面共有

osxvnc

 

junkhack_s_X_desktop__orangepilite_1_

osx10.11 の画面共有は少し良くなった感じ。

SDCard16GB 来たのでRasbian Jessie 入れてみた

SDCard の16GB のテスト代わりに、RasPi に Raspbian Jessie を入れてベンチマークしてみました。

 

環境はこんな感じ。

# uname -a
Linux raspberrypi 4.1.13-v7+ #826 SMP PREEMPT Fri Nov 13 20:19:03 GMT 2015 armv7l GNU/Linux

で、ベンチマーク

========================================================================
   BYTE UNIX Benchmarks (Version 5.1.3)

   System: raspberrypi: GNU/Linux
   OS: GNU/Linux -- 4.1.13-v7+ -- #826 SMP PREEMPT Fri Nov 13 20:19:03 GMT 2015
   Machine: armv7l (unknown)
   Language: en_US.utf8 (charmap="ANSI_X3.4-1968", collate="ANSI_X3.4-1968")
   CPU 0: ARMv7 Processor rev 5 (v7l) (0.0 bogomips)
          
   CPU 1: ARMv7 Processor rev 5 (v7l) (0.0 bogomips)
          
   CPU 2: ARMv7 Processor rev 5 (v7l) (0.0 bogomips)
          
   CPU 3: ARMv7 Processor rev 5 (v7l) (0.0 bogomips)
          
   23:14:27 up 11 min,  3 users,  load average: 0.23, 0.16, 0.10; runlevel 5

------------------------------------------------------------------------
Benchmark Run: 月  2月 01 2016 23:14:27 - 23:42:32
4 CPUs in system; running 4 parallel copies of tests

Dhrystone 2 using register variables       13364099.5 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     1935.3 MWIPS (9.9 s, 7 samples)
Execl Throughput                               1438.9 lps   (29.9 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        136337.7 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks           38047.7 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks        359110.7 KBps  (30.0 s, 2 samples)
Pipe Throughput                              788483.7 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                 141326.6 lps   (10.0 s, 7 samples)
Process Creation                               3012.6 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   3025.1 lpm   (60.1 s, 2 samples)
Shell Scripts (8 concurrent)                    406.0 lpm   (60.2 s, 2 samples)
System Call Overhead                        1760060.4 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   13364099.5   1145.2
Double-Precision Whetstone                       55.0       1935.3    351.9
Execl Throughput                                 43.0       1438.9    334.6
File Copy 1024 bufsize 2000 maxblocks          3960.0     136337.7    344.3
File Copy 256 bufsize 500 maxblocks            1655.0      38047.7    229.9
File Copy 4096 bufsize 8000 maxblocks          5800.0     359110.7    619.2
Pipe Throughput                               12440.0     788483.7    633.8
Pipe-based Context Switching                   4000.0     141326.6    353.3
Process Creation                                126.0       3012.6    239.1
Shell Scripts (1 concurrent)                     42.4       3025.1    713.5
Shell Scripts (8 concurrent)                      6.0        406.0    676.6
System Call Overhead                          15000.0    1760060.4   1173.4
                                                                   ========
System Benchmarks Index Score                                         491.8

あら、なんか速いんじゃないでしょうか?

以前計測したときは、400ちょい超えたくらいだったはずです。

I2Sというのに手を出してみる事に

RasPi2 も電源を付けることがだんだんと少なくなってきていますので、ここらでちょっと使い方を変えてみることに。

I2C を調査しているときに、I2S というキーワードも目に入りました。寄り道して散歩していると、なにやら 音関連のようです。どうやら、DAC を USB 経由じゃなくて、I2S インターフェイスを使ってやり取りしてDA 変換するものとのこと。こうして音だしすると、びっくりするくらい音が綺麗というじゃありませんか。

 

I2S するのは、以下のようなのが定番のようです。RasPi の GPIO ヘッダーにかぶせるタイプです。TI のチップである、PCM5122という 32bit のDAコンバータが載っています。

HIFI-DAC-I2S

お値段も手が出る範囲ですし、一回自分の耳で聞き分けれるかどうか、試してみたくなりました。今は、osx から内臓の音出力を使ってデジタルアンプに出しているだけのシンプルなものです。これでも、かなり気に入っていますが、果たしてよくなるのでしょうか。いや、良くなったしても自分の耳で判別できるでしょうか?

 

外付けで、音専用マシンとしてPCを付けなくても鳴らせるようにデジタルアンプも安いものですが購入してみました。こちらも、TIのチップ、TPA3116D2が載っているようです。電源は安定化電源から取る予定。

amp_TPA3116あと、アンプとRasPiをつなぐ短いRCAケーブルもゲット。ま、普通のビデオ線のあまりでもよかったのですが、それっぽい雰囲気を出してみたかったので。

 rca_cable

トータル50ドルほどです。スピーカーは今ある自作の天つり式のじゅうたんスピーカーです。さぁ、どんな感じになりますでしょうか。みんなオーバーにブログで言っているだけなんじゃないかと思っていますが。そんなに変わらないでしょう?

INA226 を RasPi の ruby でi2c

PCB が組みあがったのですが、これを RasPi で i2c するサンプルをググってみたら、いくつかありました。

RasPi は、i2c が使えるようにモジュールをロードしておきました。RasPi でi2c は初めて使います。無事に出来るでしょうか?

# lsmod
Module                  Size  Used by
★i2c_dev                 6027  0 
cfg80211              386508  0 
rfkill                 16651  1 cfg80211
rpcsec_gss_krb5        20958  0 
nfsd                  263569  2 
snd_bcm2835            18649  0 
snd_pcm                73475  1 snd_bcm2835
snd_seq                53078  0 
snd_seq_device          5628  1 snd_seq
snd_timer              17784  2 snd_pcm,snd_seq
snd                    51038  5 snd_bcm2835,snd_timer,snd_pcm,snd_seq,snd_seq_device
★i2c_bcm2708             4990  0 
joydev                  8879  0 
spi_bcm2708             5137  0 
evdev                   9950  2 
uio_pdrv_genirq         2958  0 
uio                     8119  1 uio_pdrv_genirq

 

先輩たちがサンプルコードは書いているはずなので、探したところ、python でやるのとか、ruby でやるのとかがすぐ見つかりました。

とりあえず、動作確認したいので以下のサイトのコードを参考に必要な部分だけ使わせてもらいました。

Rabbit Note

BeagleBone Black で作るロギング機能付き電力計 (ソフト編)

BeagleBone Black(BBBと略するようです)での環境ですが、大変参考になりました。

使わせていただいたコードは最下部に付けておきます。で、配線は写真のようにちょっと雑ですが配線。負荷には、ちっさいファンをつけてみました。

SingleShot0023 スレーブアドレスは、何も設定しないと、0x40 が設定されるようです。

# i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --  

 

プログラムを起動すると、以下のようになります。

# ./test.ruby
--------- 2016/01/25, 01:33:22
4.78125 V
151 mA
0.29 W
--------- 2016/01/25, 01:33:22
4.78125 V
151 mA
0.289 W
--------- 2016/01/25, 01:33:23
4.78875 V
152 mA
0.291 W
--------- 2016/01/25, 01:33:23
4.7875 V
151 mA
0.29 W
--------- 2016/01/25, 01:33:24
4.7875 V
150 mA
0.289 W
--------- 2016/01/25, 01:33:24
4.7875 V
151 mA
0.29 W
--------- 2016/01/25, 01:33:25
4.79 V
152 mA
0.292 W

負荷にLED を点けてみると、以下のようです。

# ./test.ruby 
--------- 2016/01/25, 01:35:31
4.88 V
2 mA
0.005 W
--------- 2016/01/25, 01:35:31
4.88 V
2 mA
0.005 W
--------- 2016/01/25, 01:35:31
4.9125 V
2 mA
0.005 W
--------- 2016/01/25, 01:35:32
4.91375 V
2 mA
0.005 W
--------- 2016/01/25, 01:35:32
4.91375 V
2 mA
0.005 W

 

まだあまりちゃんと理解していませんが、内部のレジスタの ox05 に、キャリブレーションする設定値を入れるようです。

以下の C のサンプルコードから、シャント抵抗に0.025R を使っている場合は、以下のように計算した16進数を入れればよいようです。書き込むとき、以下のコードでは、リトルエンディアンに変換していました。

https://github.com/jarzebski/Arduino-INA226/blob/master/INA226.cpp

0.025Ω = 0.00512/(0.025*0.0001)=2048 = 0x08 0x00

 

0x05 の補正レジスタを見てみると、

# i2cget -y 1 0x40 0x05 w

0x0008

という値が帰ってきました。

 

さて、そんな感じでとりあえずコードは以下のようにしてみました。

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
 
IOCTL_I2C_SLAVE = 0x0703
 
# Script for power meter using the following parts
# - Power Meter module (IC: INA226)

# # i2cdetect -y 1
#      0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
# 00:          -- -- -- -- -- -- -- -- -- -- -- -- --
# 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
# 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
# 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
# 40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
# 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
# 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
# 70: -- -- -- -- -- -- -- --

class PowerSenseor
  def initialize(i2c_bus=1, dev_addr=0x40)
    @i2c = File.open(sprintf('/dev/i2c-%d', i2c_bus), 'rb+')
    @i2c.ioctl(IOCTL_I2C_SLAVE, dev_addr)

    @dev_addr = dev_addr
    @v_val = 0
    @c_val = 0
    @p_val = 0

    # shunt resistor = 0.002Ω = 0.00512/(0.002*0.001)=2560 = 0x0a 0x00
    #                  0.025Ω = 0.00512/(0.025*0.0001)=2048 = 0x08 0x00
    #   内部レジスタ[0x04] (Current) = 内部レジスタ[0x01]×内部レジスタ[0x05] / 2048
    exec_cmd("i2cset -y 1 0x#{dev_addr.to_s(16)} 0x05 0x08 0x00 i")
    # conversion time = 332us, number of average = 16
    exec_cmd("i2cset -y 1 0x#{dev_addr.to_s(16)} 0x00 0x04 0x97 i")
  end

  def sense
    # i2cset/i2cget は 10ms オーダーの時間を消費するのでここでは使用しない 
    @i2c.write(0x02)
    @v_val = conver_signed(@i2c.read(2))

    # 0x04 電流レジスタ
    @i2c.write(0x04)
    @c_val = conver_signed(@i2c.read(2))

    # 0x03 Powerレジスタ
    @i2c.write(0x03)
    @p_val = conver_signed(@i2c.read(2))
  end

  def conver_signed(bytes)
    # convert endian
    return bytes.unpack('n').pack('S').unpack('s')[0].abs
  end

  def get_voltage
    return calc_voltage(@v_val)
  end

  def get_current
    return calc_current(@c_val)
  end

  def get_power
    return calc_power(@p_val)
  end

  def exec_cmd(cmd)
    val=`#{cmd} 2> /dev/null`
    raise StandardError, "FAIL: #{cmd}" unless $?.success?
    return val
  end

  def calc_voltage(v_val)
    return v_val * 1.25 / 1000.0
  end

  # 0x04 電流レジスタ
  def calc_current(c_val)
    return c_val / 10
  end

  # 0x03 Powerレジスタ
  def calc_power(p_val)
    # return p_val * 0.025
    return p_val * 0.001
  end
end

require 'optparse'
params = ARGV.getopts('lq')

data_list = []

Signal.trap(:INT){
  if params['l'] then
    printf("time,voltage,current,power\n")
    data_list.each{|data|
      printf("%10d,%.3f,%.3f,%.3f\n", data[0], data[1], data[2], data[3])
    }
  end
  exit(0)
}

sensor = PowerSenseor.new
require "date"

start_time = Time.now
i = 0
while true
  sensor.sense
  v = sensor.get_voltage
  c = sensor.get_current
  p = sensor.get_power

  dt = DateTime.now
  print "--------- "
  print(dt.strftime("%Y/%m/%d, %H:%M:%S"), "\n")

  print v
  print " V\n"
  print c
  print " mA\n"
  print p
  print " W\n"

  if ((i & 0x7F) == 0) then

  else
    sleep 0.5
  end
  i = (i & 0xff) + 1
end

 

▼まとめ

・0x05 にシャント抵抗値を入れた補正値を書き込む

・書き込む最は、16進をリトルエンディアンにして書き込む

・0x04 はPowerレジスタで、0x04 は電流レジスタ。

・LSB ってなに?

・ちっこい今使っているファンは、150mA くらい使っていて0.3W ほど

・c のサンプルはすぐに見つからなかったけども、どうんな感じになるんだろう?

・自分で作ったハードが動いてうれしぃ!

・レジスタって、どういう回路なの? どういう仕組みで覚えているんだろう?