본문 바로가기
.study/embedded

[임베디드 플젝] - 2

by hackisha 2024. 11. 19.
728x90

이번 글에서는 내가 담당한 초음파 센서와 lcd 화면 출력에 대해 작성해 보겠음

개판 5분전

내가 담당한 부분은 슬레이브(slave) 아두이노가 차량의 여석을 초음파 센서로 감지하여 마스터(master) 아두이노로 여석 정보를 넘겨주면, 마스터 아두이노에서 lcd에 여석을 표시하도록 코드를 작성하고 하드웨어를 구성하는 것이다.

코드(통신 적용 전)

통신을 배우기 전에 하나의 아두이노에서 두 가지 작업을 처리하도록 작성한 코드이다.

#include <LiquidCrystal.h>

// LCD 핀 설정
const int RS = 2;
const int EN = 3;
const int D4 = 4;
const int D5 = 5;
const int D6 = 6;
const int D7 = 7;
const char* colors[]={"red","green"}; //유도할 LED 색깔
LiquidCrystal lcd(RS, EN, D4, D5, D6, D7);

const int trigPins[6] = {8, 9, 10, 11, 12, 13};  // 트리거 핀
const int echoPins[6] = {A0, A1, A2, A3, A4, A5};  // 에코 핀

const int defaultDistance = 20;  // 차량 감지 거리 디폴트 값 (cm)
const int totalSpaces = 9;  // 전체 주차 공간 수
int availableSpaces = totalSpaces;  // 초기 주차 공간 9개로 세팅

void setup() {
  lcd.begin(16, 2);
  update();  // 초기 LCD 상태 업데이트
  for (int i = 0; i < 6; i++) {
    pinMode(trigPins[i], OUTPUT);
    pinMode(echoPins[i], INPUT);
  }
}

void loop() {
  int usingSpaces = 0;
  // 6개의 초음파 센서를 사용하여 각 주차 공간의 상태 확인(나중에 9개로 수정)
  for (int i = 0; i < 6; i++) {
    int distance = getDistance(trigPins[i], echoPins[i]);
    if (distance > 0 && distance < defaultDistance) {
      usingSpaces++;  // 차량이 감지되면 점유된 자리 수 증가
    }
  }

  availableSpaces = totalSpaces - usingSpaces;  // 남은 자리 수 계산
  update();  // LCD 업데이트

  delay(500);  // 0.5초마다 업데이트
}

// 초음파 센서를 사용해 거리 계산
int getDistance(int trigPin, int echoPin) {
  long time;
  int distance;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  time = pulseIn(echoPin, HIGH);
  distance = time/58.82;  // 거리 계산 (cm)
 
  return distance;
}

void update() { //남은 자리 업데이트 함수
  lcd.clear();  // LCD 화면 초기화
  
  lcd.setCursor(0, 0);
  lcd.print("Available: ");
  lcd.print(availableSpaces);
  lcd.print(" / ");
  lcd.print(totalSpaces);
  lcd.print("   ");
  //따라갈 색상 출력
  lcd.setCursor(0, 1);
  lcd.print("Follow ");
  lcd.print(colors[0]);//통신하면 변경
}

 

통신 전 코드 동작 영상

동작 영상이다.
영상에서는 최대 여석이 6석으로 표시되지만, 실제 코드는 최대 9석으로 세팅하였다.

코드(통신 적용)

마스터 아두이노(수신 측)

#include <LiquidCrystal.h>

// LCD 핀 설정
const int RS = 2;
const int EN = 3;
const int D4 = 4;
const int D5 = 5;
const int D6 = 6;
const int D7 = 7;

const char* colors[] = {"red", "green"};  // 유도할 LED 색깔
LiquidCrystal lcd(RS, EN, D4, D5, D6, D7);

const int totalSpaces = 9;  // 전체 주차 공간 수
int availableSpaces = totalSpaces;  // 초기 주차 공간 9개로 세팅

void setup() {
  lcd.begin(16, 2);  // LCD 초기화
  Serial.begin(9600);  // UART 통신 초기화
  updateLCD();  // 초기 LCD 상태 업데이트
}

void loop() {
  // UART로부터 데이터를 수신
  if (Serial.available() > 0) {
    String receivedData = Serial.readStringUntil('\n');  // 수신 데이터 읽기
    Serial.print(receivedData);
    availableSpaces = receivedData.toInt();  // 여석 데이터 변환
    updateLCD();  // LCD 업데이트
  }
}

// LCD 업데이트 함수
void updateLCD() {
  lcd.clear();  // LCD 화면 초기화
  lcd.setCursor(0, 0);
  lcd.print("Available: ");
  lcd.print(availableSpaces);
  lcd.print(" / ");
  lcd.print(totalSpaces);
  lcd.print("   ");
  
  // 따라갈 색상 출력
  lcd.setCursor(0, 1);
  lcd.print("Follow ");
  lcd.print(colors[0]);  // 추후 변경
}

슬레이브 아두이노(송신 측)

const int trigPins[6] = {8, 9, 10, 11, 12, 13};  // 트리거 핀
const int echoPins[6] = {A0, A1, A2, A3, A4, A5};  // 에코 핀
const int defaultDistance = 20;  // 차량 감지 거리 디폴트 값 (cm)
const int totalSpaces = 9;  // 전체 주차 공간 수
int availableSpaces = totalSpaces;  // 초기 주차 공간 9개로 세팅

void setup() {
  Serial.begin(9600);  // UART 통신 초기화
  for (int i = 0; i < 6; i++) {
    pinMode(trigPins[i], OUTPUT);
    pinMode(echoPins[i], INPUT);
  }
}

void loop() {
  int usingSpaces = 0;
  // 6개의 초음파 센서를 사용하여 각 주차 공간의 상태 확인
  for (int i = 0; i < 6; i++) {
    int distance = getDistance(trigPins[i], echoPins[i]);
    if (distance < defaultDistance) {
      usingSpaces++;  // 차량이 감지되면 점유된 자리 수 증가
    }
  }

  availableSpaces = totalSpaces - usingSpaces;  // 남은 자리 수 계산

  Serial.println(availableSpaces);
  // UART를 통해 여석 데이터 전송

  delay(500);  // 0.5초마다 업데이트
}

// 초음파 센서를 사용해 거리 계산
int getDistance(int trigPin, int echoPin) {
  long time;
  int distance;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  time = pulseIn(echoPin, HIGH);
  distance = time / 58.82;  // 거리 계산 (cm)
  return distance;
}

보완할 점

통신도 성공했고 센서가 동작하는 것도 확인했지만 전압이 부족하여 센서를 4개 이상 연결하면 슬레이브 아두이노가 동작하지 않는 문제가 발생했다.
 
따라서 다음 작업 때는 외부 전원인 배터리를 Vin을 사용해보려 한다.

728x90

'.study > embedded' 카테고리의 다른 글

라즈베리파이4B WiFi CSI 추출  (0) 2025.05.17
[임베디드 플젝] - 1  (0) 2024.11.18