Jetson NanoでFPVラジコンを作る(8)
相変わらずタミヤのランチボックスをJetson Nanoで制御しようとしている。
1/12 XBシリーズ No.49 XB ランチボックス 2.4GHz プロポ付き 塗装済み完成品 57749
- 発売日: 2012/04/07
- メディア: おもちゃ&ホビー
今のところシステム構成は以下。
前回まででハードの基本的な動作確認が終わったので、今回から本格的にコーディングを行う。
(あまりよく見ていないが)JetRacerやDonkyCarはPythonっぽいが、今回はC++を使うことにする(f:id:kimito_k:20210403113108p:plain)。
まだまともに何か動くレベルではないが*1、ぼちぼちgithubにソースコードをpushしている。
今日はステアリングモーターと駆動モーターを制御するためのI2C通信の基本部分をコーディングする。
ユーザー空間上でI2C通信の制御ができるのでkernel objectを作る必要はない。
仕様はLinux Kernelのドキュメントに記載されている。
のだが、サンプルコードとして載っている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);
テストを兼ねて、このライブラリを使用して第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) - 自由課題