2015/02/13

RaspberryPiでI2Cアクセス(その2)

前回は本題に入らず終わってしまいました。。。(^^;
今回こそはRaspberry PiとセンサとがI2Cで接続できるまでを説明します。

I2C接続の準備

Raspberry PiはデフォルトではI2Cが無効化されていますので、有効にするため設定を変更します。
  • /etc/modulesの編集
      $ sudo vi /etc/modules
      i2c-bcm2708
      i2c-dev
    
  • /etc/modprobe.d/raspi-blacklist.confの編集
      $ sudo vi /etc/moduprobe.d/raspi-blacklist.conf
      #blacklist i2c-bcm2708
    
これらの編集が済んだら、Raspberry Piを再起動します。
その後、i2c-toolsをインストールします。
$ sudo apt-get install i2c-tools
これで準備が完了しました。

センサとのI2C接続

Raspberry PiとMPL115A2を接続し、i2cdetectコマンドを実行するとセンサのアドレスが
表示されます。
raspberrypi ~ $ sudo i2cdetect -y 1

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- UU -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- UU -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: 60 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- -- 
この方のRubyプログラムは完璧なので、そのまま使わせていただきました。(ありがとうございます)
http://lowreal.net/2013/12/26/1
これを実行すると0.5秒おきに気圧がSTDOUTに表示されます。
続きます!

2015/02/03

Raspberry PiでI2Cアクセス

Raspberry Piを買って1年以上放置していたのですが、ようやくI2Cでセンサーとお話し
させて何やらやらせようという気になり、インストールしただけのRaspbianを24時間
動作させても安心な設定に変更しました。
という訳で、その備忘録です。
相変わらずですが、詳しい説明は他の方の説明をお読みください。(^^;)
http://qiita.com/makoto_kw/items/393e098f214f81449c9f

Raspbianがインストールされた状態(ssh接続設定できているものとします)から、
・rootのパスワード変更
・新アカウントの作成
・新アカウントでsudoが使えるように、visudoで新アカウントを追加
・新アカウントでssh, sudoが使えるか確認を行った上で、piユーザの削除
を行いました。

さて次はRaspberry Piの延命処置をおこないました。
・Swapの停止
foo@raspberrypi ~ $ free
             total       used       free     shared    buffers     cached
Mem:        448776      59988     388788          0       9528      28348
-/+ buffers/cache:      22112     426664
Swap:       102396          0     102396
foo@raspberrypi ~ $ sudo swapoff --all
[sudo] password for foo: 
foo@raspberrypi ~ $ free
             total       used       free     shared    buffers     cached
Mem:        448776      59988     388788          0       9528      28348
-/+ buffers/cache:      22112     426664
Swap:            0          0          0
foo@raspberrypi ~ $ sudo apt-get remove dphys-swapfile
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages will be REMOVED:
  dphys-swapfile
0 upgraded, 0 newly installed, 1 to remove and 64 not upgraded.
After this operation, 69.6 kB disk space will be freed.
Do you want to continue [Y/n]? Y
(Reading database ... 62309 files and directories currently installed.)
Removing dphys-swapfile ...
Stopping dphys-swapfile swapfile setup ..., done.
Processing triggers for man-db ...
foo@raspberrypi ~ $ 
・tmp, logディレクトリのNFS化
Swap以外にも/tmpや/var/tmp, /var/logなど、書き込み頻度が高いディレクトリを退避
します。よく見られるのはRAMディスクを作りそこに書き込む方法ですが、今回私は
ファイルサーバにNFS接続しHDDに書き込む事にしました。
まずはサーバ側:
# aptitude install nfs-kernel-server
# mkdir /var/nfs →NFSで接続するディレクトリの作成
# vi /etc/exports
/var/nfs/tmp 192.168.10.xx(rw,sync,fsid=0,no_subtree_check) の追加(Raspberry Piのみの接続にしました)
# /etc/init.d/nfs-kernel-server start
これでサーバ側の準備が整いました。次にRaspberry Pi側:
portmapやidmapdはrpcbindにあり、既にインストールされているようですので、
$ sudo apt-get install nfs-common
$ sudo mount -t nfs 192.168.10.x:/var/nfs /mnt
$ sudo vi /var/fstab
で、何故かnfs4では接続できませんでした。orz
いえ、理由は分かっておりidmapdがRaspberry Pi側で立ち上がらず、それで
接続できないのですが、何故立ち上がらないのかが分かりません。。。
mountコマンドの実験でnfsの接続ができたので、とりあえずそれで良しとします。(^^;)
続きます。

2015/01/17

続・ひねリモコン(プロトタイプ)

まぁ、プロトタイプにケースなんか必要無いのかもしれませんが、ふと玩具屋さんで
nano blockのコレクションケースを見た時に「これだ!」と思い購入しました。

一番気になったのはArduinoの基板の穴とnano blockの凸が同じサイズか?という所
ですが、1000円以下だったので とりあえず購入。
家に帰り、早速穴とブロックの凸を合わせてみたら、その為に作ったかのように嵌った
のでArduinoの穴位置を確認しながら台座となるプレートにブロックをつけます。

ただ、リセットボタンの横にある穴だけはブロックの凸と位置がずれているので
ブロックはつけませんでした。代わりにUSBコネクタ付近がガタつくので、そこに
ブロックをつけてみました。(効果不明)
組み上げるとこんな感じです。このままではUSBケーブルを挿せないので、一面外すか
穴を開けてしまうかですね。

Arduino、nano blockで検索してみると、ブロックでケースを作る人もいましたので、
意外とArduinoとnano blockは相性がいいのかもしれませんね〜。(^^)

2015/01/08

Intel Curie

http://japanese.engadget.com/2015/01/06/curie-quark-se-soc-6-ble/
CESにてIntelがウェアラブルデバイス向けのモジュール「Curie」を発表しました。
GalileoもEdisonも とても興味があったのですが、CPUボードの枠から出なかったので
Raspberry Piを持っている私は買うまでには至りませんでした。
ただし、今度はモジュール内にBluetoothや6軸モーションセンサーがついているので、
とぉ〜っても興味があります!
後は、市販化するのかという点と価格がどうなるのでしょうか?

2015/01/02

ひねリモコン(プロトタイプ)

夏頃、日本のスタートアップが「Ring」というウェアラブルデバイスを開発している
という記事を読んだ時、ひねった動作でコントロールする物を作りたいなぁ、、、と
ふと思いました。
以前、赤外線LEDを100個まとめ買いしていたので、赤外線、ひねる、リモートコント
ロールというキーワードで、安直にテレビのリモコンを作る事にしました。(^^;
理想はボールのようなケースにボタンが一つ、というようなシンプルな物を作りたいの
ですが、とりあえずはArduino+赤外線LED+ジャイロ(L3GD20)という構成で試す
ことにします。
秋月電子で売られているユニバーサル基板に小型のブレッドボードを付けて2階建て
構造にしました。
接続とソフトについては、以下の2つのサイトを参考にさせてもらいました。

http://eikatou.net/blog/2012/07/1796/
http://n.mtng.org/ele/arduino/tutorial012.html

接続はこんな感じです。

ソフトは上の2つのサイトのソースをほぼコピペで、Y軸の傾きに対して紫外線LEDを
CH upするか、CH downするかという簡単なプログラムです。
#include 

#define LED_PIN 2

//CH up
unsigned int chup[] = {432,1664,352,728,324,708,352,704,356,736,348,1716,364,
696,348,732,328,708,348,1724,396,720,348,704,352,720,352,1716,364,696,396,45856,
364,1712,368,684,356,708,348,704,348,736,364,692,356,1720,356,1716,360,1716,368,
688,352,1720,360,1720,356,1728,356,696,352,1728,392};
//CH down
unsigned int chdown[] = {480,1620,352,704,352,708,344,704,356,740,352,700,360,
1716,352,696,360,696,348,1728,364,688,352,704,360,712,356,1716,364,716,388,45792,
372,1704,364,696,352,700,360,696,356,728,348,1724,368,692,356,1720,360,1708,368,
688,356,1716,368,1708,368,1724,352,704,352,1720,408};

const byte L3GD20_ADDR = B1101010;  // SA0 = GND
//const byte L3GD20_ADDR = B1101011;// SA0 = VDD_IO

const byte L3GD20_WHOAMI = 0x0f;
const byte L3GD20_CTRL1 = 0x20;
const byte L3GD20_CTRL2 = 0x21;
const byte L3GD20_CTRL3 = 0x22;
const byte L3GD20_CTRL4 = 0x23;
const byte L3GD20_CTRL5 = 0x24;
const byte L3GD20_X_L = 0x28;
const byte L3GD20_X_H = 0x29;
const byte L3GD20_Y_L = 0x2A;
const byte L3GD20_Y_H = 0x2B;
const byte L3GD20_Z_L = 0x2C;
const byte L3GD20_Z_H = 0x2D;

void L3GD20_write(byte reg, byte val)
{
  Wire.beginTransmission(L3GD20_ADDR);
  Wire.write(reg);
  Wire.write(val);
  Wire.endTransmission();  
}

byte L3GD20_read(byte reg)
{
  byte ret = 0;
  // request the registor
  Wire.beginTransmission(L3GD20_ADDR);
  Wire.write(reg);
  Wire.endTransmission();  
  // read
  Wire.requestFrom((unsigned int)L3GD20_ADDR, 1);
    while (Wire.available()) {
    ret = Wire.read();
  }
  return ret;
}

void SendData(unsigned int *data, int datasize) {
  Serial.println(datasize);
  for (int i = 0; i < datasize; i++) {
    unsigned long start_t = micros();
    unsigned long length = data[i];
    do {
      digitalWrite(LED_PIN, 1 - (i&1));
      delayMicroseconds(9);
      digitalWrite(LED_PIN, 0);
      delayMicroseconds(7);
    } while(long(start_t + length - micros()) > 0);
  }
}

void setup() {
  Serial.begin(9600);
  while (!Serial) {}

  Wire.begin();
  Serial.println(L3GD20_read(L3GD20_WHOAMI), HEX); // should show D4
  L3GD20_write(L3GD20_CTRL1, B00001111);
  pinMode(LED_PIN, OUTPUT); // LED setup
}

void loop() {
  short X, Y, Z;
  float x, y, z;
  int datasize;

  X = L3GD20_read(L3GD20_X_H);
  x = X = (X << 8) | L3GD20_read(L3GD20_X_L);
  Y = L3GD20_read(L3GD20_Y_H);
  y = Y = (Y << 8) | L3GD20_read(L3GD20_Y_L);
  Z = L3GD20_read(L3GD20_Z_H);
  z = Z = (Z << 8) | L3GD20_read(L3GD20_Z_L);
 
  x *= 0.00875; // +-250dps
  y *= 0.00875; // +-250dps
  z *= 0.00875; // +-250dps
  
  if ( y > 10 ) {
    datasize = sizeof(chup) / sizeof(chup[0]);
    digitalWrite(LED_PIN, HIGH);
    SendData(chup, datasize);
    digitalWrite(LED_PIN, LOW);
    Serial.println("CH up");
  }
  
  if ( y < -10 ) {
    datasize = sizeof(chdown) / sizeof(chdown[0]);
    digitalWrite(LED_PIN, HIGH);
    SendData(chdown, datasize);
    digitalWrite(LED_PIN, LOW);
    Serial.println("CH down");
  }
  
  Serial.print(x);    // X axis (deg/sec)
  Serial.print("\t");
  Serial.print(y);    // Y axis (deg/sec)
  Serial.print("\t");
  Serial.println(z);  // Z axis (deg/sec)

  delay(1000);
}

そう、昔のダイアル型のテレビと同じ動作です。(^^;)
X軸でボリュームまでコントロールする予定です。

2014/11/18

マックでワイン

ようやく、諸問題が収束してきたので再びネタを書いていこうかと思います。

マックでワインと言っても、食事の話ではありません。(^^;
MacintoshでWineを動作させる話です。
Wineというのは、WindowsではないOS上でWindowsアプリを動作させるプログラム(群)です。

うちにはWindows PCとMacと2台持っているので、Windowsアプリを使いたい時は
Windows PCを立ち上げればいいのですが、そこはやはり面倒なので どうにかMacで
Windowsアプリを動かせないかと悩んでいました。
ただ、MacにはBoot CampでWindows8.1が入っており、且つParallels Desktopで仮想
起動もできるのですが、目的のWindowsアプリが8.1に対応していません。。。

と言う訳で、WineでMacで直接起動しようと思い、下のリンクを参考にMac版Wineの
Wineskinをインストールしました。
   WindowsアプリをMac上で簡単に動かせるようにするツールWineskin
空のアプリ作成も順調に進み、アプリのインストールに少々手こずりましたが、なんとか
インストールも完了。
さて、アプリを起動し、無事成功!
。。。
なにやらWindows PCで見ていた時とレイアウトが違う。。。
試しにWindows PCでレイアウトを見ると、、、違う。レイアウトが変わっている。
なんか情報が足りないのかもしれませんが、同じアプリでこれでは余り意味が無い。。。
という事で、 WineでWindowsアプリは本当に動くんだね、という検証を行っただけになりました。(T-T)

2014/08/24

東京メトロ

ある所からの負のオーラにより、ここ1年趣味に対する意欲が減退していたのですが、
ちょっと危機感を感じたので復活しようとしています。
先週、東京メトロの運行情報をオープンデータ化するというニュースが出ていました。
http://tokyometro10th.jp/future/opendata/index.html
しかも、賞金100万円!!
賞金は別に良いけど、結構色々なデータが公開されるらしいので、楽しみにしていたのですが。。。
どうやら、応募しないとそのオープンデータ情報が見られないようです。orz
まだ、公開されていないので詳細はつかめませんが、本当に公開されたらいいなぁ〜。