自由課題

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

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

前回までの記事

今回はラジコンを操縦するための入力機器をJetson Nanoに接続してみる。 もちろん入力機器を無線接続したいので、bluetooth接続のゲームパッドを使用することにする。

選定理由は、動作環境としてラズパイ(Linux)が入っていたこと、比較的品質が高そうなコメントが多かったこと、それからデザインがシンプルだったからである。

JetsonにはBluetooth機能がないのでUSBドングルを購入した。

選定理由はほぼ同じ機種がLinuxの動作実績があったのと、出力が高く最大通信距離が100mとなっていたからである。通常のbluetooth機器だと最大通信距離が10m程度なので、ラジコンとして使うには少し物足りないように思った。

USBポートにドングルを挿入して様子を見てみたところ、bluetooth関連のドライバもロードされている。なので特に追加のドライバインストールなどは必要なさそうに見える。

$ lsusb
Bus 002 Device 002: ID 0bda:0411 Realtek Semiconductor Corp. 
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 005: ID 046d:0825 Logitech, Inc. Webcam C270
Bus 001 Device 004: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
Bus 001 Device 003: ID 0bda:8179 Realtek Semiconductor Corp. RTL8188EUS 802.11n Wireless Network Adapter
Bus 001 Device 002: ID 0bda:5411 Realtek Semiconductor Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
$ lsmod
Module                  Size  Used by
fuse                  103969  2
zram                   25920  2
bnep                   16562  2
r8188eu               470585  0
btusb                  40277  0
btrtl                   7318  1 btusb
cfg80211              589932  1 r8188eu
btbcm                   8808  1 btusb
btintel                10771  1 btusb
overlay                48718  0
uvcvideo               90512  1
spidev                 13282  0
userspace_alert         5756  0
nvgpu                1581474  21
bluedroid_pm           13912  0
ip_tables              19441  0
x_tables               28951  1 ip_tables

製品仕様にはQualcommのチップを使っていると書いてあるが、USBデバイスとしてはCambridge Silicon Radioとなっている。よくわからないがメジャーなチップのエミュレーションなのだろうか。

あとは以下のサイトを参考にbluetoothctlを操作したところ、特に問題なくペアリングや接続ができた。

wiki.archlinux.jp

ハマったのは、上記サイトの実行例を見ればわかるのだがペアリングの際はroot権限が必要なことくらい。

接続状態でbluetoothctlを実行すると以下のような出力になる。
無事SN30 Pro+を認識している。

$ sudo bluetoothctl 
[sudo] password for kimito: 
[NEW] Controller XX:XX:XX:XX:XX:XX jetson-nano [default]
[NEW] Device XX:XX:XX:XX:XX:XX 8BitDo SN30 Pro+
Agent registered
[bluetooth]# quit
Agent unregistered
[DEL] Controller 00:1B:DC:FB:ED:56 jetson-nano [default]

Linuxではゲームパッドもそれなりにサポートされているらしい。今回は主にここここを参照した。 ubuntuの場合はjoystickというパッケージをインストールする。

$ sudo apt install joystick

そうすると動作確認用のevtestというパッケージが使用できる。今の環境だと/dev/input/event/3というデバイスファイルがゲームパッドに対応していた。 ゲームパッドの機種や存在している各ボタン、値域(通常のボタンなのかアナログのボタンなのかで値域が異なる)が表示され、ボタンを操作するとログが表示される。

$ sudo evtest /dev/input/event3 
Input driver version is 1.0.1
Input device ID: bus 0x5 vendor 0x45e product 0x2e0 version 0x903
Input device name: "8BitDo SN30 Pro+"
Supported events:
  Event type 0 (EV_SYN)
  Event type 1 (EV_KEY)
    Event code 139 (KEY_MENU)
    Event code 304 (BTN_SOUTH)
    Event code 305 (BTN_EAST)
    Event code 306 (BTN_C)
    Event code 307 (BTN_NORTH)
    Event code 308 (BTN_WEST)
    Event code 309 (BTN_Z)
    Event code 310 (BTN_TL)
    Event code 311 (BTN_TR)
    Event code 312 (BTN_TL2)
    Event code 313 (BTN_TR2)
  Event type 3 (EV_ABS)
    Event code 0 (ABS_X)
      Value  32671
      Min        0
      Max    65535
      Fuzz     255
      Flat    4095
    Event code 1 (ABS_Y)
      Value  32768
      Min        0
      Max    65535
      Fuzz     255
      Flat    4095
    Event code 2 (ABS_Z)
      Value      0
      Min        0
      Max     1023
      Fuzz       3
      Flat      63
    Event code 3 (ABS_RX)
      Value  32768
      Min        0
      Max    65535
      Fuzz     255
      Flat    4095
    Event code 4 (ABS_RY)
      Value  32768
      Min        0
      Max    65535
      Fuzz     255
      Flat    4095
    Event code 5 (ABS_RZ)
      Value      0
      Min        0
      Max     1023
      Fuzz       3
      Flat      63
    Event code 16 (ABS_HAT0X)
      Value      0
      Min       -1
      Max        1
    Event code 17 (ABS_HAT0Y)
      Value      0
      Min       -1
      Max        1
    Event code 40 (ABS_MISC)
      Value      0
      Min        0
      Max      255
      Flat      15
  Event type 4 (EV_MSC)
    Event code 4 (MSC_SCAN)
Properties:
Testing ... (interrupt to exit)
Event: time 1617221268.254622, type 3 (EV_ABS), code 3 (ABS_RX), value 31743
Event: time 1617221268.254622, -------------- SYN_REPORT ------------
Event: time 1617221268.275902, type 3 (EV_ABS), code 3 (ABS_RX), value 32768
Event: time 1617221268.275902, -------------- SYN_REPORT ------------
Event: time 1617221273.088606, type 4 (EV_MSC), code 4 (MSC_SCAN), value 90002
Event: time 1617221273.088606, type 1 (EV_KEY), code 305 (BTN_EAST), value 1
Event: time 1617221273.088606, -------------- SYN_REPORT ------------
Event: time 1617221273.241186, type 4 (EV_MSC), code 4 (MSC_SCAN), value 90002
Event: time 1617221273.241186, type 1 (EV_KEY), code 305 (BTN_EAST), value 0
Event: time 1617221273.241186, -------------- SYN_REPORT ------------
Event: time 1617221274.056230, type 3 (EV_ABS), code 5 (ABS_RZ), value 71
Event: time 1617221274.056230, -------------- SYN_REPORT ------------
Event: time 1617221274.077404, type 3 (EV_ABS), code 5 (ABS_RZ), value 699
Event: time 1617221274.077404, -------------- SYN_REPORT ------------
Event: time 1617221274.078572, type 3 (EV_ABS), code 5 (ABS_RZ), value 1023
Event: time 1617221274.078572, -------------- SYN_REPORT ------------
Event: time 1617221274.218626, type 3 (EV_ABS), code 5 (ABS_RZ), value 607
Event: time 1617221274.218626, -------------- SYN_REPORT ------------
Event: time 1617221274.219881, type 3 (EV_ABS), code 5 (ABS_RZ), value 271
Event: time 1617221274.219881, -------------- SYN_REPORT ------------
Event: time 1617221274.242378, type 3 (EV_ABS), code 5 (ABS_RZ), value 103
Event: time 1617221274.242378, -------------- SYN_REPORT ------------
Event: time 1617221274.263637, type 3 (EV_ABS), code 5 (ABS_RZ), value 35
Event: time 1617221274.263637, -------------- SYN_REPORT ------------
Event: time 1617221274.264880, type 3 (EV_ABS), code 5 (ABS_RZ), value 0
Event: time 1617221274.264880, -------------- SYN_REPORT ------------
Event: time 1617221275.844978, type 3 (EV_ABS), code 2 (ABS_Z), value 35
Event: time 1617221275.844978, -------------- SYN_REPORT ------------
Event: time 1617221275.866229, type 3 (EV_ABS), code 2 (ABS_Z), value 363
Event: time 1617221275.866229, -------------- SYN_REPORT ------------
Event: time 1617221275.867456, type 3 (EV_ABS), code 2 (ABS_Z), value 543
Event: time 1617221275.867456, -------------- SYN_REPORT ------------
Event: time 1617221275.889996, type 3 (EV_ABS), code 2 (ABS_Z), value 1023
Event: time 1617221275.889996, -------------- SYN_REPORT ------------
Event: time 1617221276.003716, type 3 (EV_ABS), code 2 (ABS_Z), value 871
Event: time 1617221276.003716, -------------- SYN_REPORT ------------
Event: time 1617221276.004964, type 3 (EV_ABS), code 2 (ABS_Z), value 483
Event: time 1617221276.004964, -------------- SYN_REPORT ------------
Event: time 1617221276.027465, type 3 (EV_ABS), code 2 (ABS_Z), value 0
Event: time 1617221276.027465, -------------- SYN_REPORT ------------

ボタンを全て試してみたが特に問題なく認識している。もう少し難航するのかと思っていたが割とあっさり動作確認ができた。Linuxすごい。

ということで、今回まででラジコンを成立させるための基本的なハードウェアの確認が終わった。
次回からはいよいよソフトウェアを実装する。

前回記事

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