0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

JetsonNanoとArduino間でUSB経由のシリアル通信

Last updated at Posted at 2024-10-22

JetsonNanoとArduino間でUSB経由のシリアル通信

JetsonNanoのサブボードとして、ArduinoにPWM変換を一任してもらう。

Arduino側準備

プログラム

 Arduino側は以下のプログラム
 「A」を受信するとPPM1500(計測値は1477)
 「B」を受信するとPPM1800(計測値は1770)になる

#include <Wire.h>                 
#include <Adafruit_PWMServoDriver.h>
  
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40); // PCA9685のI2Cアドレスを指定
  
#define SERVOMIN 1500    // 最小パルス幅(μs)
#define SERVOMAX 1800    // 最大パルス幅(μs)
  
int Servo_pin = 0; // サーボ接続ピンを0番に
  
void setup() {
  Serial.begin(9600);   // シリアル通信を9600bpsで開始
  pwm.begin();          // 初期設定
  pwm.setPWMFreq(50);   // PWM周期を50Hzに設定
  delay(1000);
}
  
void loop() {
  if (Serial.available() > 0) 
    char command = Serial.read();  // シリアルデータを読み取る
  
    if (command == 'A') {
      pwm.writeMicroseconds(Servo_pin, SERVOMIN);  // 「A」が送信されたらパルス幅を1500μsに設定
      Serial.println("Pulse width set to 1500μs");
    }
    else if (command == 'B') {
      pwm.writeMicroseconds(Servo_pin, SERVOMAX);  // 「B」が送信されたらパルス幅を1800μsに設定
      Serial.println("Pulse width set to 1800μs");
    }
  }

接続

 Pasted image 20241022155355.png


JetsonNano側の準備

C言語でシリアル通信を制御する。
termios fcntlのライブラリを使ってシリアル通信を実現

C言語でのシリアル通信コードを作成した例。
このコードは、指定したデバイス(/dev/ttyACM0)に対して9600baudの速度で接続し、データ'A'を送信する。

serial_write.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>

int main() {
    int fd;
    struct termios options;

    // シリアルポートを開く
    fd = open("/dev/ttyACM0", O_RDWR | O_NOCTTY | O_NDELAY);
    if (fd == -1) {
        perror("Unable to open serial port");
        return 1;
    }

    // シリアルポートの設定
    tcgetattr(fd, &options);
    cfsetispeed(&options, B9600); // ボーレートを9600に設定
    cfsetospeed(&options, B9600);
    options.c_cflag |= (CLOCAL | CREAD); // ローカル接続、読み込み有効
    options.c_cflag &= ~PARENB; // パリティビット無効
    options.c_cflag &= ~CSTOPB; // ストップビット1
    options.c_cflag &= ~CSIZE; // データビットサイズをクリア
    options.c_cflag |= CS8; // データビットサイズを8ビットに設定
    tcsetattr(fd, TCSANOW, &options); // 設定を適用

    // データを交互に送信
    while (1) {
        char dataA = 'A';
        char dataB = 'B';

        // 'A'を送信
        write(fd, &dataA, 1);
        printf("Sent: %c\n", dataA);
        sleep(2); // 2秒待機

        // 'B'を送信
        write(fd, &dataB, 1);
        printf("Sent: %c\n", dataB);
        sleep(2); // 2秒待機
    }

    // シリアルポートを閉じる
    close(fd);
    return 0;
}

説明

  • open(): シリアルポートを開く。エラーが発生した場合は、エラーメッセージを表示する
  • tcgetattr() / tcsetattr(): シリアルポートの設定を取得し、設定を適用する
  • write(): 指定したデータをシリアルポートに書き込む
  • close(): シリアルポートを閉じる

コンパイルと実行

このコードをファイル(例: serial_write.c)に保存し、以下のコマンドでコンパイルする。

gcc -o serial_write serial_write.c

実行するには、次のコマンドを使用。

sudo ./serial_write

シリアルポートへのアクセスには、適切な権限が必要な場合もあるので、sudoを使用する。

完成

IMG_1726.jpeg

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?