2. Arduino Mega 설정 및 센서 통신

이승석·2024년 11월 5일

Delivery Robot

목록 보기
3/11

2. Arduino Mega 설정 및 센서 통신

이 단계에서는 Arduino MegaIMU, GPS, BLDC 모터를 연결하고 각각의 센서와 모터에서 데이터를 수집하거나 제어 신호를 보내는 방법을 다룹니다. Arduino Mega는 로봇의 하위 시스템으로서, 이들 센서와 모터의 데이터를 수집하거나 제어하는 역할을 합니다. 이 데이터를 바탕으로 로봇의 상태를 감지하고, 안정적인 이동을 위해 제어 명령을 실행하게 됩니다.


1. IMU 설정 및 캘리브레이션

IMU(Inertial Measurement Unit)는 가속도자이로 데이터를 제공하여 로봇의 방향과 자세를 추정하는 데 사용됩니다. 이 데이터를 통해 로봇이 주행 중 기울어지거나 회전하는 것을 감지하여, 안정성을 유지할 수 있습니다.

1.1 IMU 연결

IMU는 Arduino Mega의 I2C 또는 SPI 인터페이스를 통해 연결됩니다. I2C 방식으로 연결할 경우 다음 핀을 사용합니다.

  • VCC: IMU의 전원 (+5V) 핀을 Arduino의 5V 핀에 연결
  • GND: IMU의 접지 핀을 Arduino의 GND에 연결
  • SCL: IMU의 SCL 핀을 Arduino의 SCL 핀에 연결 (보통 A5 핀)
  • SDA: IMU의 SDA 핀을 Arduino의 SDA 핀에 연결 (보통 A4 핀)

1.2 IMU 데이터 수집 코드

Arduino에서 IMU 데이터를 수집하려면 IMU의 라이브러리를 사용합니다. 예를 들어, MPU6050 센서를 사용할 경우 Adafruit_MPU6050 라이브러리를 설치하고 사용할 수 있습니다.

#include <Wire.h>
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>

Adafruit_MPU6050 mpu;

void setup() {
  Serial.begin(115200);
  if (!mpu.begin()) {
    Serial.println("Failed to find MPU6050 chip");
    while (1);
  }
  Serial.println("MPU6050 Found!");
  mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
  mpu.setGyroRange(MPU6050_RANGE_500_DEG);
  mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
}

void loop() {
  sensors_event_t a, g, temp;
  mpu.getEvent(&a, &g, &temp);

  Serial.print("Accelerometer X: "); Serial.print(a.acceleration.x); Serial.print(", Y: "); Serial.print(a.acceleration.y); Serial.print(", Z: "); Serial.println(a.acceleration.z);
  Serial.print("Gyroscope X: "); Serial.print(g.gyro.x); Serial.print(", Y: "); Serial.print(g.gyro.y); Serial.print(", Z: "); Serial.println(g.gyro.z);
  delay(100);
}

위 코드에서 가속도 및 자이로 데이터를 출력합니다. 이러한 데이터는 나중에 ROS2를 통해 Jetson Nano로 전송하여 로봇의 주행 방향 및 기울기를 모니터링하는 데 사용할 수 있습니다.

1.3 IMU 캘리브레이션

IMU는 오차를 줄이기 위해 초기 캘리브레이션이 필요할 수 있습니다. Arduino에서 수집되는 가속도와 자이로 값이 고정된 위치에서 안정적으로 나오도록 캘리브레이션합니다. 이를 위해, mpu.setAccelerometerRange()mpu.setGyroRange() 설정을 통해 가속도와 자이로의 민감도를 조정할 수 있습니다.


2. GPS 데이터 처리

GPS는 위도, 경도, 고도와 같은 전역 위치 정보를 제공합니다. 이 정보는 로봇이 지정된 경로를 따라 목적지로 이동하는 데 중요한 역할을 합니다.

2.1 GPS 연결

GPS 모듈은 보통 UART 인터페이스를 통해 Arduino Mega에 연결됩니다. GPS의 RX/TX 핀을 Arduino의 TX/RX 핀에 각각 연결하여 시리얼 통신을 설정합니다.

2.2 GPS 데이터 수집 코드

GPS 데이터를 수집하려면 TinyGPS++ 라이브러리를 사용할 수 있습니다. 이 라이브러리를 통해 Arduino에서 GPS 데이터를 쉽게 파싱할 수 있습니다.

#include <TinyGPS++.h>
#include <SoftwareSerial.h>

TinyGPSPlus gps;
SoftwareSerial ss(4, 3); // GPS 모듈의 TX를 Arduino 핀 4에, RX를 핀 3에 연결

void setup() {
  Serial.begin(115200);
  ss.begin(9600);
}

void loop() {
  while (ss.available() > 0)
    gps.encode(ss.read());

  if (gps.location.isUpdated()) {
    Serial.print("Latitude= "); Serial.print(gps.location.lat(), 6);
    Serial.print(" Longitude= "); Serial.println(gps.location.lng(), 6);
  }
}

위 코드에서는 GPS 모듈이 수신한 데이터를 Arduino Mega가 읽고, 위도와 경도 데이터를 시리얼 모니터에 출력합니다. 이 데이터를 Jetson Nano로 전송하여 위치 기반 경로 계획에 사용할 수 있습니다.


3. BLDC 모터 제어

BLDC 모터는 로봇의 바퀴를 구동하며, PWM 신호를 통해 속도방향을 제어할 수 있습니다. Arduino Mega는 Jetson Nano로부터 모터 제어 명령을 받아, 해당 명령을 BLDC 모터에 전달합니다.

3.1 모터 드라이버 연결

BLDC 모터는 모터 드라이버를 통해 Arduino Mega에 연결됩니다. 모터 드라이버는 모터의 전류를 조절하여 속도와 방향을 제어합니다. 일반적으로 사용되는 모터 드라이버는 L298N 또는 ESC (Electronic Speed Controller)입니다.

  • PWM 핀: Arduino의 PWM 핀을 모터 드라이버의 PWM 입력 핀에 연결합니다.
  • 제어 핀: Arduino에서 속도 및 방향 제어를 위해 모터 드라이버의 IN1, IN2 핀에 연결합니다.

3.2 모터 제어 코드

다음은 Arduino에서 PWM 신호로 BLDC 모터의 속도를 제어하는 코드 예제입니다.

const int pwmPin = 9; // PWM 핀
const int dirPin = 8; // 방향 제어 핀

void setup() {
  pinMode(pwmPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
}

void loop() {
  // 정방향 회전
  digitalWrite(dirPin, HIGH);
  analogWrite(pwmPin, 200); // 0 ~ 255 사이의 값으로 속도 제어
  delay(2000);

  // 반대 방향 회전
  digitalWrite(dirPin, LOW);
  analogWrite(pwmPin, 200);
  delay(2000);
}

위 코드에서 dirPin은 회전 방향을 제어하며, pwmPin은 속도를 제어합니다. 속도 값을 조정하여 로봇의 이동 속도를 변경할 수 있습니다.


4. Arduino Mega와 Jetson Nano 간의 통신

모든 센서 데이터(IMU, GPS)는 Arduino Mega에서 수집되며, Jetson Nano로 전송되어 자율 주행 제어에 활용됩니다. 이를 위해 Arduino와 Jetson Nano 간의 시리얼 통신을 설정하여 데이터를 전송할 수 있습니다.

4.1 시리얼 통신 설정

Arduino Mega와 Jetson Nano는 시리얼 포트를 통해 통신합니다. Arduino는 센서 데이터를 정기적으로 전송하고, Jetson Nano는 해당 데이터를 받아서 처리하게 됩니다.

4.2 센서 데이터 전송 코드

다음은 Arduino에서 IMU, GPS, 모터 상태 데이터를 시리얼로 전송하는 예제입니다.

void sendSensorData(float accelX, float accelY, float accelZ, float lat, float lon, int motorSpeed) {
  Serial.print("IMU,"); Serial.print(accelX); Serial.print(","); Serial.print(accelY); Serial.print(","); Serial.print(accelZ);
  Serial.print(" GPS,"); Serial.print(lat); Serial.print(","); Serial.print(lon);
  Serial.print(" Motor,"); Serial.println(motorSpeed);
}

void loop() {
  // 예시 데이터
  float accelX = 0.0, accelY = 0.0, accelZ = 0.0;
  float lat = 37.7749, lon = -122.4194;
  int motorSpeed = 200;

  sendSensorData(accelX, accelY, accelZ, lat, lon, motorSpeed);
  delay(1000);
}

위 코드에서는 Arduino가 IMU, GPS, 모터 데이터를 시리얼로 전송합니다. Jetson Nano에서는 이 데이터를 수신하여 자율 주행과 경로 계획에 활용할 수 있습니다.


결론

이 과정에서 우리는 Arduino Mega에 IMU,

GPS, BLDC 모터를 연결하고 각 장치에서 데이터를 수집하거나 제어하는 방법을 학습했습니다. 이제 Arduino Mega는 로봇의 하위 시스템으로서 로봇의 상태와 위치 정보를 수집하며, 이를 바탕으로 모터 제어 명령을 수행하게 됩니다. 다음 단계에서는 ROS2를 사용하여 Jetson Nano와의 통신을 설정하고, 이러한 데이터를 이용해 로봇의 자율 주행을 구현해 보겠습니다.

profile
student studying Embedded-development

0개의 댓글