Take’s diary

Macとマイコンに関すること--ワクワクの製作日記

Edison と スイッチサイエンス版 Eaglet で iPhone をWifiで連携させる(MEMS非接触温度センサー応用編その1)

 今回からスイッチサイエンス版Eaglet

       f:id:TAKEsan:20150810150305p:plain

を使って実験してみたことを書いてみます。どんなことをするのかと言うと、以下の動画を見て下さい。

            f:id:TAKEsan:20150810145006j:plain

 Edisonから送ったデータをiPhoneで実機テストしています。iPhone側はOpenframeworks、Edison側はPythonで動かしています。iPhoneは標準UIを使っているので、本格的でしょ!!。これがiOS初心者の私にも作れるのですから自分でも驚いてます。この手の記事の定番で、思いつくことてんこもりで、統一性がなくっなっている気がしないでもないんですが、見た目はまーまーでしょうか。この例では、電源はLipo電池のみです。右の写真はEdisonに接続しているディスプレイ(4Dsystems uOLED-3028 ここでは画面がカスタマイズできるタッチパッドとして利用)の拡大写真です。マッキントッシュアンプみたいにデザインしてます。

 今回は一番説明しやすい「スイッチサイエンス版Eglet使ってみて分かったこと」と「OMURON非接触温度センサーがEdisonで動くまで」です。

スイッチサイエンス版Eagletのできること

 この基板は、今現在解説がほとんどありません。売りだしているのに、サンプルも使用方法もがない上、入出力PINに関しては確証が取れてないなんて、信じられない殿様商売ですが、このあたりが趣味人としては、とってもくすぐられる部分ではあります。ちょっと実験してみた結果を報告します。

Henry基板との差

  1. USBコネクタで自分のコンピューターに接続すれば、Edison用Arduino IDEが使える。
  2. USB外部機器は接続できない。

 両者の最大の違いはUSB Micro-Bコネクタの挙動です。Henry基板は電源供給+コンソール出力、スイッチサイエンスEagletは普通のコンピューターであるところのUSB機能+電源供給です。この2つのボードには、intel BreakoutボードのJ3とJ16が各々一個ずつ標準で付いていると言った方が良いかも。

スイッチサイエンス版Eglet実験結果

  1. 標準のGraveコネクタArduino標準ライブラリWireで操作できる(今回の実験)
  2. 10個並んでいるスルーホールの内、Arduino標準シリアルとしてRX、TXが使える。また、これはデジタルピン(0、1)として動作する。
  3. Pythonでmraaをを使う場合は、標準のGraveコネクタのi2cは6番、もう1つの方は1番として指定。10個並んでいるスルーホールの内、TX,RXは /dev/ttyMFD1 で指定すればPySelrialで動作可能。
  4. 標準のGraveコネクタArduino側とPython側両方同時に動作可能(Yoctoはマルチタスクなので当然と言えば当然だが)

  これらはIntel ArduinoボードとEgletとの公開回路図を比べてみれば大体わかります。

このボードの惜しいところは、USB外部機器が使えないところでしょうか。回路図を見るともうちょっとでできそうな気配です。が、残念。ですが、Lipoバッテリーが充電できる点は超便利です。

OMURON非接触温度センサーがEdisonで動くまで

 OMURON非接触温度センサー(D6T-44L-06)は、スイッチサイエンスから購入しました。このセンサーは4X4マトッリックスで遠くの物体の温度を非接触で測定できます。そしてスイッチサイエンスで公開されているArduinoプログラムMEMS温度センサを使おう | スイッチサイエンス マガジンでとても簡単に動くので気に入っています。

 

          f:id:TAKEsan:20150809111402j:plain

今回はEdisonで動かすのですが、問題点が2つほどあります。

  1. このセンサーは5V動作(3.3Vでは動作が不安定)
  2. 標準のWier入力バッファの容量が不足している(スイッチサイエンス紹介プログラムではWierExtraライブラリを使用しているが、Edison専用Arduino IDEではコンパイルエラーとなってしまい、使えない)

今回も諦めかけましたが、なんとかなりました。

 1については、この基板に5V出力端子が無いので、ステップアップ電源レギュレーターとレベルコンバータを噛ませればOK。(その後のテストで分かったのですが、電源さえ5Vが確保できれば信号は3,3Vのままでも一応動きます。)

 2については、IDEの中身を変更。つまり、MAC画面上でEdisonのArduino IDEアイコンを右クリック 「パッケージの内容を表示する」を選択。で、以下の場所にあるWire.hを開いて、 最初の方に記述されている#define BUFFER_LENGTH 32 の数値を32から好きな数値に変更(48でも64でもOK)。

 最初からこれがわかっていたら、WierExtraライブラリなんか必要なかった。ただしIDEをバージョンアップすると当然動かなくなるので、その時は変更が必要。

2016/3/11現在intelからArduinoIDE最新版をインストールすると、Edisonコンパイラはアドオン形式になっている様です。下図の様なディレクトリ構成になっていません。場所は

XXXXXXXX/Arduino.app/Contents/Java/hardware/arduino/avr/libraries/Wire.h

ですが、ここを直して最後のデータを取りこぼす場合は、intelで公開している初期バージョンのIDEを使う必要あり。

f:id:TAKEsan:20150809105017p:plain

 これだけではつまらないので、今回はスイッチサイエンスで買った「BSS138搭載4CH-I2C用双方向ロジックレベルコンバータ」と「Pololu ステップアップ/ステップダウン 電圧レギュレータ S7VF5」と「GROVE - I2C OLEDディスプレイ128×64」を組み合わせて

  f:id:TAKEsan:20150809111055j:plainf:id:TAKEsan:20150809112333j:plainf:id:TAKEsan:20150809111056j:plain

こんなのを作ってみました。

f:id:TAKEsan:20150809112453j:plain

 作っている過程の写真がないのでゴメンなさい。OLEDディスプレイは3.3Vで動作可能なので3.3Vスルー。センサーだけ同じ電源で5Vに昇圧してレベル変換しています。

 レベル変換に関してはプルアップ抵抗付きでしたが、今回はなんとか動いてます。基板の上に各部品を半田付けして、グルーガンでガチガチに固め、両面テープで薄い皮を貼っています(凸凹はご愛嬌!!)

 センサー値をOLEDディスプレイに表示させるArduinoプログラムは、以下の通り。スイッチサイエンスEagletをMacとつなぎ、Arduino Ideコンパイルします。ほとんどが表示用コードです。SeedOLED.hはWebからMacArduinoのライブラリフォルダにコピーしておきます。

#include <Wire.h>

//標準だとbufferが32byteしかないので Arduino.app/Contents/Resources/Java/arduino/edison/librarise/Wire/Wire.h の#define BUFFER_LENGTH 64とする

#include <SeeedOLED.h>

 

#define D6T_addr 0x0A

#define D6T_cmd 0x4C

 

int rbuf[35];

//float tdata[16];

void setup()

{  

  Wire.begin();

  SeeedOled.init();  //initialze SEEED OLED display

  SeeedOled.clearDisplay();      //clear the screen 

  SeeedOled.setNormalDisplay();  //Set display to normal mode 

  SeeedOled.setPageMode();       //Set addressing mode to Page Mode

  SeeedOled.setTextXY(0,0);

  SeeedOled.putString("----------------");

  SeeedOled.setTextXY(1,0);

  SeeedOled.putString(" <<D6T DATA!!>> ");

  SeeedOled.setTextXY(2,0);

  SeeedOled.putString("----------------");  

 

      Wire.beginTransmission(D6T_addr);

      Wire.write(D6T_cmd);

      Wire.endTransmission();

      delay(100);   //これを入れないと識別信号を受け取っても続けて処理不能   

}

void loop()

{

  int i;

     Wire.beginTransmission(D6T_addr);

     Wire.requestFrom(D6T_addr,36);

      delay(500);

      if (Wire.available() >= 35) {  //このバイト数を厳密に合わせないとlinuxの致命的なエラーとなる

        for (i = 0; i < 35; i++) {

          rbuf[i] = Wire.read(); 

        }

        Wire.endTransmission(); 

        for (i = 0; i < 16; i++) {

          int tdata=(rbuf[(i*2+2)]+(rbuf[(i*2+3)]<<8));

          SeeedOled.setTextXY((i/4)+4,-(i % 4)*4+12); 

          SeeedOled.putNumber(tdata); 

          SeeedOled.putChar(' ');

 

        }

   }

}

 次にこの回路のセンサー部分だけを利用した場合のPythonのプログラム(コンソール上にデータが表示されますが実数に変換していません)。mraaをインストールしていない場合は、要インストール)

import mraa

import time

D6T_addr = 0x0A

D6T_cmd =  0x4C

tdata=

i=0

x = mraa.I2c( 6 )

 

while i<1000:

        x.address(D6T_addr)

        x.writeByte(0x4C)

        time.sleep(0.1)# konohenn ga genkai!!

        y=x.read(35)   # y=byte array

        for var in range(0, 16):

                tdata.append((y[(var*2+2)]+(y[(var*2+3)]<<8)))

        print tdata

        tdata=

        i=i+1

上記tdata= 以降消えている場合は(編集時は見えているが)、 tdata=[ ] としてください。

 Edison上のPythonで、 mraaを使ってi2cを操作する方法について、Web上ではいろいろややこしいことが書いてありますが、見ての通りとても簡単に実現できました。

 で、この2つのプログラムをたまたま同時に動かしてみたら、同時にセンサー値を読み取ってしまいました!!。どちらかがタイミングによってi2cのバッファをに読み取っているだけなんでしょうが、これは結構衝撃的でした。

 i2c機器に関するライブラリは、はるかにArduinoの方が揃っているので、同じi2cに接続した機器でおもしろいことができそうですね。

 ArduinoPython間のデータのやり取りは、すぐできそうな気がしますが、決定的に簡単な方法が無いようです。誰か両者間ファイルの読み書き以外の方法で、知っていたら教えてください。

自己満足かもしれませんが、この後2016.1.8に解決しました!!。以下の記事を覗いて見てください。これを使うと膨大なArduino資産が簡単にPythonで使えそうです。(ただしEdison用ArduinoIDEでコンパイルできるプログラムに限る)

takesan.hatenablog.com

 

                   f:id:TAKEsan:20150805174651j:plain

     この写真は今回のプログラム+αをHenryボードで実行している様子です。

  次回は、「iOSとEdisonとのデータ送受信概要と、実現方法」の前にHenry基板とSparkfun社製Intel Edison Blockを使ったOmuron非接触温度センサーの稼働方法を紹介します。(早い話i2cの5Vセンサー接続方法の例です、)

takesan.hatenablog.com