久しぶりに一目惚れしたArudio互換機のSeeeduino XIAO

じゃんくはっく
じゃんくはっく

可愛すぎて一目惚れしました!

ぽっ! きゃー

ぴー
ぴー
じゃんくはっく
じゃんくはっく

・・・いや、ぴーちゃんの事じゃなくて、SeedのXIAOっていうArduio 互換機のことよ。

こんなチビっこいマシンに負けたのか・・・w

ぴー
ぴー

サムネでもわかるとは思いますが、これ全体のフォルムがかわいいんですよね。あと想像よりもちっさいんです。親指くらいの大きさなんですよ。発売は去年の3〜6月ごろだったみたいですが、今頃発見です。

3個入りパッケージで1,750円!

Wiki Seeeduino Xiaoをはじめよう

https://wiki.seeedstudio.com/jp/Seeeduino-XIAO/

Seeedの日本語版のWikiもありますので、大きさなどはそちらでどうぞ。上の写真は3個入りのをアマゾンからゲットしました。3個入りで1800円弱です。1つ600円ってとこですかね。

中身! 想像より、ちっちゃい!親指に乗りますよ。

ESP32と遊んでからだいぶ月日が経ちましたが、大きさはそのくらいです。ブレッドボードに刺さるのでPinつけてすぐ楽しめますね!

まずはボードをじろじろと見る!

Type-Cコネクタが付いていて、端面がスルーホールになっていて面実装も考慮されていますね。このType-Cコネクタは6ピンタイプじゃなくて12ピンです。あと、LEDらしきものが4つ付いています。

金属のカバーで覆われていますので、その中が気になるところですがまずは、PIN番号が表からわかるようにシールを貼っておきました。なかなか気が利いていますね! Seeedさん、このプロダクトをリリースするにあたりいろいろ気合いが入っているようです。

裏面を見ると、SMD実装したときのVIN,GNDがありますね。4つの丸いのは、なんでしょうか?

調べてみると、英語版Wikiによれば、Newバージョンだとこの丸いのが4つあるようです。

Seeed 英語版Wiki:hardware-overview

Wiki

どうやら、SWCLK (PA30) と SWDIO (PA31) のGPIOのようです。

qita : Seeeduino XIAO 背面パッドをGPIOとして使う

https://qiita.com/nanase/items/37ecca24aee8fbd4492e

だいぶ時間が経過しているので、先輩たちがあれこれ情報をあげていてくれて助かりますね。

やっぱり、Type-C が付いているところがうれしいです。接続しやすいですからね!

動作確認

Type-Cケーブル(スマホでいつも使っているやつね)をPCに繋げて、おもむろにXAIOに繋げてみます。ケーブルのほうが重いので、本体が浮きます! 

オレンジ色のLEDがピカピカしてますね!

とりあえずLチカ

Arudio IDEを使って、Lチカでもやってみます。SeeedのWikiにしたがってIDEは仕込みんでおきます。久しぶりすぎて書き方、だいぶ忘れちゃいました。

この2つのブルーLEDは、RX/TXのLEDなんですがIDEからも定義されているので、光らせることができるようです。デジタル出力だけかなと思っていましたが、アナログでもいけるようですね。

//setup()内の処理は最初の一回だけ行われる
void setup() {
  pinMode(PIN_LED2, OUTPUT );//Pinを出力用に設定
  pinMode(PIN_LED3, OUTPUT);
  int led_pw = 255; // 明るさ(通常とは逆) 明るい0 - 255暗い
}

void loop() {
  rx_led2( 2 ); //明るさ調整ステップ
  rest();
  tx_led3( 2 ); //明るさ調整ステップ
  rest();
}

// RXとLED 基盤側の青LED
void rx_led2(int n){
  int led_pw = 255;
  //点滅周期
  for (int i=0;i < 255;i++ ) {
    analogWrite(PIN_LED2, led_pw );
    led_pw = led_pw + n;
    if( led_pw ==   0 ) n =  n;
    if( led_pw == 255 ) n = -n;
    delay( 5 );//だんだん暗くなる速度
  }
//  digitalWrite(PIN_LED2, HIGH ); //通常とは逆 LOW で点灯、HIGH で消灯
analogWrite(PIN_LED2, 255 );// LED Off 上より暗くなる
}

// TXのLED USBコネクタ側の青LED
void tx_led3(int n){
  int led_pw = 255;
  for (int i=0;i < 255;i++ ) {
    analogWrite(PIN_LED3, led_pw );
    led_pw = led_pw + n;
    if( led_pw ==   0 ) n =  n;
    if( led_pw == 255 ) n = -n;
    delay( 5 );
  }
analogWrite(PIN_LED3, 255 );// LED Off
}

void rest() {
    delay( 500 );
}

いろんな値を書き換えて遊んでみてください。

注意点としては、HIGHとLOWが逆なのと、255が暗く、0が明るい状態となるようです。これは仕様なのかバグなのか? Seeedさん、これは修正してほしいです。

XIAOはどんなスペックなのか?

このボード、一目惚れして速攻買ったのでどんなスペックかまだよくわかっていません。改めて、記載してみます。

製品名称Seeeduino XIAO
マイコンARM Cortex-M0+ CPU(SAMD21G18) 
動作電圧3.3V
デジタル I/O ピン11
PWM Pins10
アナログ I/O ピン11
フラッシュメモリ256 KB
SRAM32KB
EEPROM
クロックスピード48 MHz
大きさ23.5mm x 17.5mm
価格$4.90

だいぶarduinoから離れていて、このあたり疎いのですがどうやら ATSAMD21は、アーキテクチャーはARM Cortex-M0+ CPU(SAMD21G18) のようです。Arduino Zero・M0 Proっていうボードにも使われているやつみたいですね。SAMD21系のarduinoとか表現されている感じです。または、単にSAMD系Arduinoとか。

ARM CORTEX-M0+

https://www.arm.com/ja/products/silicon-ip-cpu/cortex-m/cortex-m0-plus

メジャーなArduino との比較表です。自分は、Nanoシリーズ互換機か、Pro Miniが好きです。安いからw

ボードマイコン動作電圧Digital I/O PWM Analog I/O Flash MemorySRAMEEPROMクロックスピード大きさ価格
Arduino Nano v3ATmega3285V226832KB2KB1KB16MHz45 mm x 18 mm$45.90
Seeeduino NanoATmega3285V226832KB2KB1KB16MHz45 mm x 18 mm$6.90
Arduino MicroATmega32u45V2071232KB2.5KB1KB16MHz48 mm x 18 mm$24.90
Arduino Pro MiniATmega3285V / 3.3V146632KB2KB1KB8 /16MHz33 mm x 18 mm$9.95
Trinket M0ATSAMD213.3V523256KB32KB48MHz27mm x 15.3 mm$8.95
Seeeduino XIAO
ATSAMD21
3.3V111011256KB32KB48MHz23.5mm x 17.5mm$4.90

NanoやProMiniの互換機は、アリエクで200〜300円くらいなんですが、それと比べると600円は高いかもしれませんが、倍以上のスペックはありますね。

こうして比較してみると、コスパがいいんじゃないでしょうか。まぁ、こんな高スペックは必要ないっていう用途もあるんで使い所次第ですかね。

今後に備え応用例や試したことなどメモ

発売からもうすぐ1年経過するので、どんな応用例があるかリサーチしてみました。また、開発する上で役立ちそうなメモをしておきます。

Seeed:Seeeduino XIAO Resources Roundup. What will be your next project idea made by Seeeduino XIAO?

リンク

まず、オフィシャルのSeeedのブログでいくつか紹介されています。その中から独断と偏見で面白そうなプロジェクトをピックアップ。

MIDIをコントロールできるので、オリジナルコントローラとかセンサー駆動の楽器とか?

サイトでは、違うボードを使っていますがXIAOでも同じことが可能。画像や図形を組み合わせて空中にお好みの絵を投影する装置。

PovRanian 装置

PovRanian (ポブラニアン):画像や図形を組み合わせて空中にお好みの絵を投影する装置

これ作りたいなー!

エアロバイクでストリートビュー進みたい!! (その3)(Seeeduino XIAO化してみた)

ツールのUSB Stack は、 TinyUSBを選択とな。ほほー。

あれこれ調査していると、PlatformIOも対応しているようです。まだ試していませんが、メモしておきます。

開発環境:PlatformIO Seeeduino XIAO

USBホストライブラリSAMD

SeeedのWikiにあるやつですが、リンク先だけメモしておきます。

Seeeduino XIAOをUSBデバイス(TinyUSB)として使う

Seeeduino XIAO の使い方

カムロボの顔用基板を作ってみた [Xiao版]

Seeeduino XIAOを使って二酸化炭素測定する SparkFunライブラリVer

fritzingのパーツ

Seeeduino XIAOのタッチ入力

Seeeduino XIAOのデジタル入力

Seeeduino XIAOのデジタル出力

Arduinoで超音波センサHC-SR04の使い方【距離測定】

ArduinoでOLED

シリアルLED(WS2812B)をArduinoで制御

【Seeeduino XIAO】RS232cから受信した信号をUSB HIDで送信してみる

Seeeduino XIAO でPWM調光のLチカとI2CのLCDを使ってみる

いろいろありますねー。こんなこともできるみたいです。

Seeeduino XIAO マイコンで TOPPERS を始めよう

TOPPERS/R2CAというマルチタスク処理ができる

Seeeduino_XIAOでArduino Keyboard.h互換ライブラリを利用してMicrosoft Teamsミュートキーを作製する

楽しそうなのがいっぱいありますね。

XIAOを組み込んでいるハードウェア作家さんもいましたよ!

XIAO DAP
Seeeduino XIAO をメインコントローラとした、DigitalAudioPlayer

https://sites.google.com/view/chikoidac/home/xiao_dap

まだ販売はされていないとのことですが、販売されたら組み立てKITを買ってみたいです!

まとめ

今回、なんとなくわかったのは以下となります。

・XIAOはコスパ最高でないか!
・Type-Cが良い!
・Arduino IDE 互換で、SAMD21系のarduino
・本家では、Arduino Zero・M0 Proに使われている
・3.3v動作でクロックが速く、フラッシュメモリも多い
・しかしEEPROMがないようです フラッシュメモリに保存する?
・USB関連のプロダクトやシリアル通信系の応用とか相性良さそう
・SMD実装がやりやすい(ので、基板設計して使うのとか良いですね)

あとがき

このボード、本当に小さくて応用次第では面白い組込ができそうだなーと感じています。まずは3つあるので、何か実用的な何かを1、2つ作ってみたいですね。1つは、開発用にしておいて残りは実験的に何か実際に作ってみようと思います。まずは、できそうなことからやってみましょうか!

著者にメッセージ

間違いのご指摘など、コメントじゃなくて、個人的にやりとりしたい場合はこちらからどうぞ。お返事が遅くなるときもありますが、ご了承を。

    入力内容をご確認ください

    お問い合わせ頂きありがとうございます



      

    リポ充電基盤のType-C版が出てたんでポチった!

    じゃんくはっく
    じゃんくはっく

    最近また、電子工作熱が出てきたのでアリエク物色!

    はいはい、今日は何をポチったんですか?

    ぴー
    ぴー
    じゃんくはっく
    じゃんくはっく

    ぐぬぬぅ! なぜポチったのがわかるのだ! 

    衝撃だったんでしょ?w

    ぴー
    ぴー

    はい! またアリエクでポチってしまいました。

    今回は、備忘録として記載。まだ到着していませんが、到着するころには「これなんだっけ?」という事態になることが多発していましたので、ポチッとしたらブログに書いていくことにします。

     副次効果としては、ぽちったら記事を書かないといけなくなるので衝動買い防止にもなるかなと!今日買ったのはこれです。

    なんとお値段、送料込みで10個450円です。1個あたり45円と、価格破壊な値段ですね。たぶん、このUSB Type-Cコネクタは6pinだと思いますが、簡単な工作であればこれで十分です。マイクロUSBのタイプもありますが、やっぱり差し込む方向を意識しなくていいType-Cは便利です。今では100円均一でもケーブル売っていますしね。

    リポ充電基盤とは?

    5V 18650 リチウムバッテリー充電モジュール

    投稿日: 2015年5月10日

    5年くらい前にも購入していましたが、だいぶ数が少なくなったので追加購入です。この基盤は、リチウム電池を過充電、過放電しないための基盤です。メインチップは、TP4056で保護回路に、DW01A と ML8205A が乗っています。今回購入したのがどんなチップが乗っているかはまだ未調査ですが、まぁ仕様は同じでしょう。

    この基盤、ちょっと電子工作して何か試作版を作る際に、リチウム電池とともに組込セットで詰め込むときに重宝します。

    例えば、こんな感じで試作版に使っていました。

    2

    これはESP8266 ESP-12を使った温度・湿度・照度系のIoTデバイスなんですね。

    5

    ちょっと見えにくいですがマイクロUSBが刺さっている部分にその基盤があります。5Vからリチウム電池に充電し、5Vを放電します。他にも、ポケットオシロスコープを充電持ち運び仕様にしてみたりと。

    これの工作の記事は忙しくて書いていませんでしたが中にリポ電池とこの基盤などが入っています。簡単にでも書いておけばよかったなー。ちょっと持ち運んで何か計測したりとか便利でした。

    あと、自作基盤にこの充電ボードを乗っけた例もありますね。

    DSC00219
    ESP8266 BackBoost

    この白い基盤は自作基盤でESP8266とバックブースト電源回路などが乗っています。充放電管理基盤は自作だと高くつくのでこんな感じで基盤にリフローして、くっつけて使っていました。

    まとめ

    今回、なんとなくわかったのは以下となります。

    ・Type-C版のTP4056充電管理基盤はケーブル接続が便利そう
    ・以前のマイクロUSB版より安くなっていた
    ・仕様が変更になっているのか、未調査
    ・今後、この基盤で工作していこうと思う
    ・基本的な構造は前のと同じだと思う
    ・到着したらまた検討してみる

    あとがき

     それにしても以前、マイクロUSB版のを購入したときは1個あたり97円だったのに。Type-C版でさらに安くなっています。余分な機能をなくし需要があるものを大量に作って、良いものを広く販売するという基本的な考え方はすごく好きです。反面、検品コストという考え方も日本とは違いますので不良品率はあがります。しかし、入念に検品して全体のコストをあげるより、ある程度の検品品質で不良品が混入すれば交換すれば良いという考え方もあるのも事実のようです。

     薄利広商 という言葉があるようです。中国の文化なのか日本の文化なのか歴史に疎いので良くはわかりませんが、中国の商人の中にはこういう考え方があるんじゃないのかなと思います。意味合い的には、薄利多売と似ていますが、これは少しネガティブなイメージもあります。しかし、薄利広商 というのはあまり聞かない言葉ですが、薄い適切な利益を乗せて広く客に販売することが本来の商売であり、それは社会も良くしていくのだという考えのようです。売り手もどこよりお得にお客に販売するのは、本来気持ちの良いものだと思いますし、お客も安く良いものが入手できたら嬉しい。それは転じて地域もよくしていくのだという思想のようです。

     少し前のマスク買い占め転売、プレステ5 の転売などそういうのは本来の商売ではない、長く商売をやっていくためにはもっと違う視点を持つべきだというのが「薄利広商」という言葉の真意なのではと思います。

    著者にメッセージ

    間違いのご指摘など、コメントじゃなくて、個人的にやりとりしたい場合はこちらからどうぞ。お返事が遅くなるときもありますが、ご了承を。

      入力内容をご確認ください

      お問い合わせ頂きありがとうございます



        

      ネジはミスミで買う事にした

      M5 の 30mm のネジがやっぱり欲しいなということで、ミスミだといくらかなと見てみました。

      10300240130

      ACB5-30 がお安くて、よさげ。数を入れて値段を見てみると、

      まず、1本だと、221円。

      ACB5-30|六角穴付ボルト 全ねじタイプ|ミスミ|MISUMI-VONA【ミスミ】 2

      50本だと、1050円

      ACB5-30|六角穴付ボルト 全ねじタイプ|ミスミ|MISUMI-VONA【ミスミ】 4

      100本だと、なんと800円

      ACB5-30|六角穴付ボルト 全ねじタイプ|ミスミ|MISUMI-VONA【ミスミ】 3

      ということで、100本も使いませんが、ぽちっとしました。HNT3-ST3B-M5|六角ナット_3種|SUNCO|MISUMI-VONA【ミスミ】_と_注文の詳細___MISUMI-VONA

      ナットもワッシャーもゲットして、送料無料であさってには到着というお手軽さ。神です。ネジ以外もこれからたくさんお世話になるはずです。ただ、価格のソートがないのがおしいです。最終的に価格が安いのを検討しますから。

       

      と、記載している内にエヌアイシ・オートテックの三角アルミフレームが到着しました。400mm で購入。平らな面があるので、こっちの三角フレームに軍配があがったわけです。

      MISUMI-VONA

      梱包も丁重でさすが日本製。中国からの梱包とはグレードがぜんぜん違います。そして、このフレームものすごく良さそうです。ヘビー級とあるだけあって、肉厚も十分。ずっしりと重いです。20mmのも、40mm のもどちらもハイクオリティー。

      良い xy テーブルが出来ると思います。今週、土日含めて楽しみが増えました。

      あと、NSK と NTN の国産ベアリングも比較のため、3個分のローラー作る6個をゲット。どのくらいクオリティーが高いでしょうか?

      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ちょい超えたくらいだったはずです。

      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 のサンプルはすぐに見つからなかったけども、どうんな感じになるんだろう?

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

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