自由課題

学んだり、考えたり、試したりしたこと。

Jetson NanoでFPVラジコンを作る(8)

前回までの記事

相変わらずタミヤのランチボックスをJetson Nanoで制御しようとしている。

今のところシステム構成は以下。

f:id:kimito_k:20210403113108p:plain

前回まででハードの基本的な動作確認が終わったので、今回から本格的にコーディングを行う。
(あまりよく見ていないが)JetRacerDonkyCarPythonっぽいが、今回はC++を使うことにする(f:id:kimito_k:20210403113108p:plain)。

まだまともに何か動くレベルではないが*1、ぼちぼちgithubソースコードをpushしている。

github.com

今日はステアリングモーターと駆動モーターを制御するためのI2C通信の基本部分をコーディングする。

ユーザー空間上でI2C通信の制御ができるのでkernel objectを作る必要はない。

仕様はLinux Kernelのドキュメントに記載されている。

www.kernel.org

のだが、サンプルコードとして載っているread()write()を使用したインターフェイスは事実上ほとんど使われていないとドキュメント自身に書いてある。なんだこりゃ。

ドキュメントをもう少し読み進めると、以下のインターフェイスが使えそうだった。

ioctl(file, I2C_RDWR, struct i2c_rdwr_ioctl_data *msgset)

上記に出てくるstruct i2c_rdwr_ioctl_data構造体には複数のi2c_msg構造体のデータを設定することができる。i2c_msg構造体の説明は例えばここにあり、デバイスアドレスやレジスタアドレス、データが含まれることがわかる。

使い方はざっくりいうと

fd = open("/dev/i2c-X", O_RDWR);

して(上記のXはI2Cアダプタ番号で今回は1)、

struct i2c_rdwr_ioctl_data data = {...};`

し、

ioctl(adapter_fd, I2C_RDWR, &data);

すればよい。
readの場合はdata内に設定したポインターに値が入る。

i2c_rdwr_ioctl_data には複数のI2Cメッセージ(i2c_msg構造体)が設定できるので、例えば複数のレジスタの読み書きが一度にできる。

もう少し詳細な使用方法はここを参照した。

上記の処理を簡素化するようなライブラリはGithubにいくつかあるのだけれど、今回はあえてDIYしたいので簡単なライブラリを作った。

uint8_t val;
I2CDevice(0x01, 0x40).read(0xFE, val);

のような感じで使うとvalレジスタ*2が入る。

テストを兼ねて、このライブラリを使用して第6回で出てきたi2csetのようなものを書いてみたが、特に問題はなさそうだった。

次回は、このライブラリを使用してラジコンのステアリングと速度を制御するライブラリを書いてみる。

(追記)次回 : Jetson NanoでFPVラジコンを作る(9) - 自由課題

前回までの記事

Jetson NanoでFPVラジコンを作る(1) - 自由課題
Jetson Nanoを使ってFPVラジコンを作る(2) - 自由課題
Jetson Nanoを使ってFPVラジコンを作る(3) - 自由課題
Jetson Nanoを使ってFPVラジコンを作る(4) - 自由課題
Jetson Nanoを使ってFPVラジコンを作る(5) - 自由課題
Jetson Nanoを使ってFPVラジコンを作る(6) - 自由課題
Jetson Nanoを使ってFPVラジコンを作る(7) - 自由課題

*1:momoを自動起動にしているだけ

*2:これはPCA9685の周波数レジスタ