今回からスイッチサイエンス版Eaglet
を使って実験してみたことを書いてみます。どんなことをするのかと言うと、以下の動画を見て下さい。
Edisonから送ったデータをiPhoneで実機テストしています。iPhone側はOpenframeworks、Edison側はPythonで動かしています。iPhoneは標準UIを使っているので、本格的でしょ!!。これがiOS初心者の私にも作れるのですから自分でも驚いてます。この手の記事の定番で、思いつくことてんこもりで、統一性がなくっなっている気がしないでもないんですが、見た目はまーまーでしょうか。この例では、電源はLipo電池のみです。右の写真はEdisonに接続しているディスプレイ(4Dsystems uOLED-3028 ここでは画面がカスタマイズできるタッチパッドとして利用)の拡大写真です。マッキントッシュアンプみたいにデザインしてます。
今回は一番説明しやすい「スイッチサイエンス版Eglet使ってみて分かったこと」と「OMURON非接触温度センサーがEdisonで動くまで」です。
スイッチサイエンス版Eagletのできること
この基板は、今現在解説がほとんどありません。売りだしているのに、サンプルも使用方法もがない上、入出力PINに関しては確証が取れてないなんて、信じられない殿様商売ですが、このあたりが趣味人としては、とってもくすぐられる部分ではあります。ちょっと実験してみた結果を報告します。
Henry基板との差
両者の最大の違いはUSB Micro-Bコネクタの挙動です。Henry基板は電源供給+コンソール出力、スイッチサイエンスEagletは普通のコンピューターであるところのUSB機能+電源供給です。この2つのボードには、intel BreakoutボードのJ3とJ16が各々一個ずつ標準で付いていると言った方が良いかも。
スイッチサイエンス版Eglet実験結果
- 標準のGraveコネクタはArduino標準ライブラリWireで操作できる(今回の実験)。
- 10個並んでいるスルーホールの内、Arduino標準シリアルとしてRX、TXが使える。また、これはデジタルピン(0、1)として動作する。
- Pythonでmraaをを使う場合は、標準のGraveコネクタのi2cは6番、もう1つの方は1番として指定。10個並んでいるスルーホールの内、TX,RXは /dev/ttyMFD1 で指定すればPySelrialで動作可能。
- 標準のGraveコネクタはArduino側とPython側両方同時に動作可能(Yoctoはマルチタスクなので当然と言えば当然だが)
これらはIntel ArduinoボードとEgletとの公開回路図を比べてみれば大体わかります。
このボードの惜しいところは、USB外部機器が使えないところでしょうか。回路図を見るともうちょっとでできそうな気配です。が、残念。ですが、Lipoバッテリーが充電できる点は超便利です。
OMURON非接触温度センサーがEdisonで動くまで
OMURON非接触温度センサー(D6T-44L-06)は、スイッチサイエンスから購入しました。このセンサーは4X4マトッリックスで遠くの物体の温度を非接触で測定できます。そしてスイッチサイエンスで公開されているArduinoプログラムMEMS温度センサを使おう | スイッチサイエンス マガジンでとても簡単に動くので気に入っています。
今回はEdisonで動かすのですが、問題点が2つほどあります。
- このセンサーは5V動作(3.3Vでは動作が不安定)
- 標準の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を使う必要あり。
これだけではつまらないので、今回はスイッチサイエンスで買った「BSS138搭載4CH-I2C用双方向ロジックレベルコンバータ」と「Pololu ステップアップ/ステップダウン 電圧レギュレータ S7VF5」と「GROVE - I2C OLEDディスプレイ128×64」を組み合わせて
こんなのを作ってみました。
作っている過程の写真がないのでゴメンなさい。OLEDディスプレイは3.3Vで動作可能なので3.3Vスルー。センサーだけ同じ電源で5Vに昇圧してレベル変換しています。
レベル変換に関してはプルアップ抵抗付きでしたが、今回はなんとか動いてます。基板の上に各部品を半田付けして、グルーガンでガチガチに固め、両面テープで薄い皮を貼っています(凸凹はご愛嬌!!)
センサー値をOLEDディスプレイに表示させるArduinoプログラムは、以下の通り。スイッチサイエンスEagletをMacとつなぎ、Arduino Ideでコンパイルします。ほとんどが表示用コードです。SeedOLED.hはWebからMacのArduinoのライブラリフォルダにコピーしておきます。
#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に接続した機器でおもしろいことができそうですね。
ArduinoとPython間のデータのやり取りは、すぐできそうな気がしますが、決定的に簡単な方法が無いようです。誰か両者間ファイルの読み書き以外の方法で、知っていたら教えてください。
自己満足かもしれませんが、この後2016.1.8に解決しました!!。以下の記事を覗いて見てください。これを使うと膨大なArduino資産が簡単にPythonで使えそうです。(ただしEdison用ArduinoIDEでコンパイルできるプログラムに限る)
この写真は今回のプログラム+αをHenryボードで実行している様子です。
次回は、「iOSとEdisonとのデータ送受信概要と、実現方法」の前にHenry基板とSparkfun社製Intel Edison Blockを使ったOmuron非接触温度センサーの稼働方法を紹介します。(早い話i2cの5Vセンサー接続方法の例です、)