📘

Zao SDKシリアルトンネリングをGPIOヘッダのUARTピンで使う方法

2023/07/17に公開

はじめに

Jetson Nano Developer Kit (以下 Jetson Nano) はUARTを内蔵していて信号線がGPIOヘッダ (J41、40-Pin Expansion Header) に出ています。
この記事では、Zao SDKのシリアルトンネリングをデフォルトのUSBシリアルケーブルではなく内蔵UARTで使用し、GPIOヘッダでデータ入出力する方法を解説します。
これにより、3.3V UARTに対応したマイコンやセンサとの接続が容易になります。


接続イメージ

接続

Jetsonと通信をするためのデバイスを以下のように接続します。

  • Jetson Nano Pin 6 (GND) --- 通信デバイスのGND
  • Jetson Nano Pin 8 (TxD) --- 通信デバイスのRxD
  • Jetson Nano Pin 10 (RxD) --- 通信デバイスのTxD

Jetson NanoのJ41ヘッダ配列はこちらでも確認することができます。


GPIOヘッダからの信号取り出し

ログイン

既にZao SDKが動作している場合は、Jetson Nano の画面はZao SDKのTUI画面になっているはずです。 以降の操作をするためにログインが必要ですのでAlt+F2を押下してtty2のログイン画面に移ってログインして下さい。 TUI画面に戻る場合はAlt+F1入力で戻れます。

シリアルコンソールの停止

Zao SDKでUARTを使うため、デフォルトでUARTポートで動いているシリアルコンソールを無効にします。以下のコマンドを実行して、nvgetty.serviceが自動起動しないようにします。

$ sudo systemctl disable nvgetty.service

今後の起動では内蔵UARTがシリアルコンソールに占有されなくなります。

Zao SDKの設定

Zao SDKのZaoSerialProxyTtyの設定を変更します。これは、どのポートをZao SDKが利用するかを指定します。
/dev/ttyTHS1が内蔵UARTに対応するLinux上のシリアルポート名になります。

sudo vi /usr/local/etc/zao/SerialProxyTty.conf等でテキストエディタを起動し設定ファイルを編集します。

/usr/local/etc/zao/SerialProxyTty.conf
SERIAL_TTY_DEVICE=/dev/ttyTHS1

これで準備は完了です!

Jetson Nano再起動後にZao Cloud View側とシリアルデータを送受信できるようになります。

距離センサのデータをArduino経由で送信

次に、超音波距離センサーのデータをZaoSDKを介して送信する方法について解説しています。この方法は、温度センサーやCO2センサーなどの他の様々なセンサーデータを送信する際にも使用することができます。

まずは配線図デス。Arduinoは5V信号を、Jestonは3.3V信号を使用します。したがって、これらの信号レベルを一致させるために、ロジックレベル変換ICを利用します。下記の画像は具体的な配線方法を示しています。

次にArduinoにプログラムを書き込みます。以下に示すコードは、超音波距離センサーから取得したデータをシリアル経由で送信するためのものです。

#include <SoftwareSerial.h>

#define TrigPin 3 
#define EchoPin 2 
#define TXPin 0
#define RXPin 1
 
double soundspeed = 331.5 + 0.61 * 25; 
double distance = 0;
bool f = true;

SoftwareSerial serial1(RXPin, TXPin);

void setup() {
  Serial.begin(9600);
  serial1.begin(115200);

  pinMode(LED_BUILTIN, OUTPUT);

  pinMode(TrigPin, OUTPUT);
  pinMode(EchoPin, INPUT);
}


void loop() {
  trigger();

  double t = pulseIn(EchoPin, HIGH); 

  if (t > 0) {
    t = t / 2; 
    distance = t * soundspeed * 100 / 1000000; 
    Serial.println(distance);
    serial1.println(distance);
  }
  delay(200);

  f = ! f;
  digitalWrite(LED_BUILTIN, f); 
  
}

void trigger() {
  digitalWrite(TrigPin, LOW); 
  delayMicroseconds(2);
  digitalWrite(TrigPin, HIGH );
  delayMicroseconds( 10 );
  digitalWrite(TrigPin, LOW );
}

これを実行すると、ZaoViewのシリアルポートから距離データが取得できます。

以上の方法により、映像と共に多種多様なセンサーデータを送信することが可能となります。

関連資料

  • Zao SDKのWEBサイト
  • NVIDIA Application Note: "Jetson Nano Developer Kit 40-Pin Expansion Header GPIO Usage Considerations"

Discussion