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");
}
}
接続
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
を使用する。