Darkside(リンクエラー修正しました)

2019年06月04日の記事

2019年6月4日(火) 22:20

傾斜センサー成功

 センサーが i2c 経由で認識されているのは、良い兆候だ。しかし、実用になるかどうかは読み取り通信速度に依存する。コマンドラインから命令を送っていたのでは、自動化困難だし速度も論外。
 ここは、可能ならC言語でバリバリ読みたいところである。
 調べると、Jetson Nano にも使える i2c アクセスライブラリが公開されていることが判明。ここの src 中にある i2c.c と i2c.h が核心である。 

 i2c.c の最後に、自前の処理関数を追加する。

double get_gxc(void) {
	/* Open i2c bus */
	int bus;
	if ((bus = i2c_open("/dev/i2c-1")) == -1) {
		/* Error process */
		return 0;
	}
	I2CDevice device;
	memset(&device, 0, sizeof(device));
	/* ADXL355 */
	device.bus = bus;       /* I2C Bus fd, return from i2c_open */
	device.addr = 0x1d;     /* I2C device(slave) address */
	device.tenbit = 0;      /* I2C is 10 bit device address */
	device.iaddr_bytes = 1;	/* I2C device internal(word) address bytes, such as: 24C04 1 byte, 24C64 2 bytes */
	device.page_bytes = 1;  /* I2C max number of bytes per page, 1K/2K 8, 4K/8K/16K 16, 32K/64K 32 etc */
	unsigned char buf[32];
	/* activate ADXL355  */
	buf[0] = 0;
	if (i2c_write(&device, 0x2d, buf, 1) != 1) {
		return 0;
	}
	/* read data */
	if (i2c_read(&device, 0x06, buf, 11) != 11) {
		/* Error process */
		return 0;
	}
	i2c_close(bus);
	signed char c = (signed char)buf[8];
	signed long z = (signed long)c;
	z = (z << 8) + buf[9];
	z = (z << 4) + (buf[10] >> 4);
	return (double)z;
}

 ADXL355 は、電源投入直後スリープしていて働かない。起動するには、内部 0x2D 番地に0を書き込まねばならない。それが、23行目である。
 センサー値は、内部 0x06 番地から「温度データーバイト」「X軸の値3バイト」「Y軸の値3バイト」「Z軸の値3バイト」の順に入っており、その連続した合計11バイトを28行目で読んでいる。
 取得した値は、一番後ろのZ軸加速度だけを取り出し、符号付なのでちゃんと符号付きのまま取り出して実数に放り込んでいる。メインのスーパーインポーズ処理では python による実数演算を行うので、便利なように処理しておくのだ。

 角度変換もCルーチン内で済ませた方が速いだろうし、複数の値を返す方法も試さねばならない。つまりは未完成なのだが、それらは純粋にソフトの問題であって「解が無い」という可能性はない。だから、センサー値取得は成功したとみなして構わない。
 いちおうオシロでセンサーの i2c クロック線をモニターし、速度を確認。

 通信が3つに分かれている。最初が、2D へ0を書き込む「起きろ!」命令。これは最初の1回だけで良いので、事実上は通信時間に含まれない。
 2つ目の通信は、読み取りアドレスの送信である。最後の長い通信が、11バイトの一気読みである。
 すべての通信は4ミリ秒で完了しており、「起きろ!」命令を除外すれば3ミリ秒も掛からない。センサー値を角度変換する計算やルーチン呼び出しの時間が加わるが、おおむね python から3ミリ秒で取得できると考えて良いだろう。充分に実用速度である。

 これにて、傾斜センサーの読み取りは解決したとみなせる。

 なお、ハードウェア i2c 通信も GPIO 同様にファイルアクセス方式なわけだが、/dev/i2c-1 ファイルに読み書きする権限がないと動かない。どうやら、デフォルトユーザーは権限グループに含まれていないようで、グループに所属させねばならない。だが、どういう名称のグループに所属させれば良いのか分からない。面倒なので、パーミッションは 0x666 に設定した。
 ラジコン戦車に搭載するグローバルネットと未接続のマイコンで、i2c アクセスが誰にでもできたところで問題はない。問題になるようであれば、PICだって搭載できない。

written by higashino [Sタンク 1/16] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL
Darkside(リンクエラー修正しました)

Generated by MySketch GE 1.4.1

Remodelling origin is MySketch 2.7.4