정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

i2c 통신이문제인지 코딩에문제인지 잘모르겠어요
매드닥터 | 2023-07-01

현재 i2c통신을 사용하고싶은데 SDA SCL선만연결하면 슬레이브쪽의 아두이노가 멈춤니다. 

제가만들려고하는것은 슬레이브쪽의 아두이노가 초음파와 서보모터를움직이며 초음파센서20CM이내에 탐지되었을때만 마스터 아두이노에게 정보를송신하는것인데 잘안됩니다. 밑에 코딩도같이올려서 보여드립니다 도와주세요

 

오른쪽 슬레이브아두이노

#include <Wire.h>
#include <Servo.h>

#define TRIGGER_PIN 6
#define ECHO_PIN 7
#define SERVO_PIN 9
#define MASTER_ADDRESS 10

Servo servo;
long duration;
int distance;
String slaveName = "오른쪽"; // 슬레이브 아두이노 이름

void setup() {
  pinMode(TRIGGER_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);

  servo.attach(SERVO_PIN);
  servo.write(90); // 서보 모터 초기 각도 설정

  Wire.begin(MASTER_ADDRESS); // 슬레이브 주소 설정
  Wire.onRequest(sendInformation); // 데이터 요청에 대한 이벤트 핸들러 등록

  Serial.begin(9600); // 시리얼 통신 시작
}

void loop() {
  // 서보 모터 각도 90도에서 180도까지 10도씩 증가하며 왕복 운동
  for (int angle = 90; angle <= 180; angle += 10) {
    servo.write(angle); // 서보 모터 각도 설정
    delay(200); // 0.2초 대기

    if (angle >= 90 && angle <= 180) {
      distance = measureDistance();

      // 거리가 20cm 이내인 경우에만 정보를 전송
      if (distance <= 20) {
        sendInformation();
      }
    }
  }
}

int measureDistance() {
  digitalWrite(TRIGGER_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIGGER_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGGER_PIN, LOW);

  duration = pulseIn(ECHO_PIN, HIGH);
  distance = duration * 0.034 / 2;

  return distance;
}

void sendInformation() {
  Wire.beginTransmission(MASTER_ADDRESS); // 마스터 아두이노와 통신 시작
  Wire.write(slaveName.c_str()); // 이름 전송
  Wire.write(',');
  Wire.write(servo.read()); // 각도 전송
  Wire.write(',');
  Wire.write(distance); // 거리 전송
  Wire.endTransmission(); // 통신 종료

  Serial.print("Name: ");
  Serial.print(slaveName);
  Serial.print(", Angle: ");
  Serial.print(servo.read());
  Serial.print(" degrees, Distance: ");
  Serial.print(distance);
  Serial.println(" cm");
}

 

 

 

 

 

 

 

 

왼쪽슬레이브 아두이노

#include <Wire.h>
#include <Servo.h>

#define TRIGGER_PIN 6
#define ECHO_PIN 7
#define SERVO_PIN 9
#define MASTER_ADDRESS 9

Servo servo;
long duration;
int distance;
String slaveName = "왼쪽"; // 슬레이브 아두이노 이름

void setup() {
  pinMode(TRIGGER_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);

  servo.attach(SERVO_PIN);
  servo.write(0); // 서보 모터 초기 각도 설정

  Wire.begin(MASTER_ADDRESS); // 슬레이브 주소 설정
  Wire.onRequest(sendInformation); // 데이터 요청에 대한 이벤트 핸들러 등록

  Serial.begin(9600); // 시리얼 통신 시작
}

void loop() {
  // 서보 모터 각도 0도에서 90도까지 10도씩 증가하며 왕복 운동
  for (int angle = 0; angle <= 90; angle += 10) {
    servo.write(angle); // 서보 모터 각도 설정
    delay(200); // 0.2초 대기

    if (angle >= 0 && angle <= 90) {
      distance = measureDistance();

      // 거리가 20cm 이내인 경우에만 정보를 전송
      if (distance <= 20) {
        sendInformation();
      }
    }
  }
}

int measureDistance() {
  digitalWrite(TRIGGER_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIGGER_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGGER_PIN, LOW);

  duration = pulseIn(ECHO_PIN, HIGH);
  distance = duration * 0.034 / 2;

  return distance;
}

void sendInformation() {
  Wire.beginTransmission(MASTER_ADDRESS); // 마스터 아두이노와 통신 시작
  Wire.write(slaveName.c_str()); // 이름 전송
  Wire.write(',');
  Wire.write(servo.read()); // 각도 전송
  Wire.write(',');
  Wire.write(distance); // 거리 전송
  Wire.endTransmission(); // 통신 종료

  Serial.print("Name: ");
  Serial.print(slaveName);
  Serial.print(", Angle: ");
  Serial.print(servo.read());
  Serial.print(" degrees, Distance: ");
  Serial.print(distance);
  Serial.println(" cm");
}

 

 

 

 

 

마스터아두이노

#include <Wire.h>
 
#define SLAVE_ADDRESS_1 9 // 첫 번째 슬레이브 아두이노 주소
#define SLAVE_ADDRESS_2 10 // 두 번째 슬레이브 아두이노 주소
 
void setup() {
  Wire.begin(); // I2C 통신 초기화
 
  Serial.begin(9600); // 시리얼 통신 시작
}
 
void loop() {
  Wire.requestFrom(SLAVE_ADDRESS_1, 3); // 첫 번째 슬레이브 아두이노로부터 3바이트 데이터 요청
 
  String receivedData1 = "";
  while (Wire.available()) {
    char receivedChar = Wire.read();
    receivedData1 += receivedChar;
  }
 
  Wire.requestFrom(SLAVE_ADDRESS_2, 3); // 두 번째 슬레이브 아두이노로부터 3바이트 데이터 요청
 
  String receivedData2 = "";
  while (Wire.available()) {
    char receivedChar = Wire.read();
    receivedData2 += receivedChar;
  }
 
  // 첫 번째 슬레이브 아두이노 데이터 처리
  String name = receivedData1.substring(0, 1);
  int angle = receivedData1.substring(2, 3).toInt();
  int distance = receivedData1.substring(4, 5).toInt();
 
  // 데이터 출력
  Serial.print("Name: ");
  Serial.print(name);
  Serial.print(", Angle: ");
  Serial.print(angle);
  Serial.print(" degrees, Distance: ");
  Serial.print(distance);
  Serial.println(" cm");
 
  // 두 번째 슬레이브 아두이노 데이터 처리
  name = receivedData2.substring(0, 1);
  angle = receivedData2.substring(2, 3).toInt();
  distance = receivedData2.substring(4, 5).toInt();
 
  // 데이터 출력
  Serial.print("Name: ");
  Serial.print(name);
  Serial.print(", Angle: ");
  Serial.print(angle);
  Serial.print(" degrees, Distance: ");
  Serial.print(distance);
  Serial.println(" cm");
 
  delay(1000); // 1초 대기
}
이전글   |    센서 측정값이 일정시간 유지되어야 알림이 울리게 하는법 ㅠㅠ ... 2023-06-30
다음글   |    아두이노로 웹서버 만들기 질문 2023-09-22