임베디드 SW개발

유성훈·2024년 1월 7일
0

임베디드SW 관련

목록 보기
1/1

📌프로젝트 주제 선정 과정

  • 브레인스토밍


  • 아이디어와 문제 결합


  • 선택된 주제


  • 최종 선택 주제
    ➡️ 근접센서 +모터로 파리지옥 만들기

📌파리지옥 동작 설명

  • 전원 공급
  • 인체감지 센서(PIR) 초기값은 LOW로 기본 설정

  • 가정1
    • 인체감지 센서에 움직임 감지
    • 초음파 센서 측정 시작
    • 하단에 위치한 초음파 센서에 거리가 5cm이하로 감지
    • 입 열기 + LCD에 hi출력

  • 가정2
    • 인체감지 센서에 움직임 감지
    • 초음파 센서 움직임 감지 시작
    • 입안에 위치한 초음파 센서에 거리가 5cm이하로 감지
    • 입 닫기 + LCD에 이모티콘 + yum-yum 출력

  • 인체감지 센서에 움직임이 감지X
  • 초음파 센서 측정 중지

📌프로젝트에 사용한 센서


  • 인체감지센서(PIR)
    • 역할 : 물체 or 사람의 움직임을 감지 -> 감지 시 초음파센서 측정 시작
    • 문제 : 기존 PIR을 사용하지 않았을 경우 초음파센서가 계속해서 측정  전력 낭비 발생
    • 해결방안 : PIR센서를 통해 움직임을 감지할 경우에만 초음파센서 측정을 시작하도록 설계  불필 요한 전력 낭비 해결




  • 서보모터
    • 서보모터(입을 닫을때)
      • 역할 : 파리지옥 입안에 있는 초음파 센서로 부터 신호를 전달  입을 닫는다.
      • (상단 모터 : 120°)
      • (하단 모터 : 60°)
    • 서보모터(입을 열때)
      - 역할 : 파리지옥 줄기 하단에 있는 초음파 센서로 부터 신호 전달  입을 연다.
      - (상단 모터 : 180°)
      - (하단 모터 : 15°)




  • 초음파센서
    • 초음파센서1
      • 위치 : 파리지옥 입안
      • 역할 : 초음파센서를 통해 거리를 측정하여 물체가 5cm 이내에 측정이 되면 서보모터에 신호를 보 내 입을 닫는다.
    • 초음파센서2
      - 위치 : 줄기 하단
      - 역할 : 초음파센서를 통해 거리를 측정하여 물체가 5cm 이내에 측정이 되면 서보모터에 신호를 보내 열도록 한다.




  • LCD모니터(16*4)
    • 역할 : 입을 열고 닫을때 LCD창에 상태를 나타냄
    • 동작
      • 초음파 센서로 부터 신호 전달  입 닫기 LCD창에 yum-yum + 이모티콘 출력
      • 초음파 센서로 부터 신호 전달  입 열기 LCD창에 hi 출력

📌서보 모터 설정

서보 모터 설정
// 서보 모터 변수
Servo myservo; // 모터1 -> 본체 머리 윗부분에 부착
Servo myservo2; // 모터2 -> 본체 머리 아랫부분에 부착
int pos;  // 모터1 각도 변수
int pos2; // 모터2 각도 변수

📌PIR 센서 설정

PIR 센서 설정
// 사람의 움직임 감지를 위한 pir센서 변수
int inputPin = 5;   // 센서 신호 핀 설정
int pirState = LOW; // 초기 상태-움직임이 없음을 가정
int val = 0;        // 센서 신호 판별을 위한 변수


void setup() 
{
  // 거리 감지를 위해 초음파센서의 trig 출력
  pinMode(trigPin, OUTPUT);  // 하단 초음파센서1
  pinMode(trigPin2, OUTPUT); // 상단 초음파센서2
  // echo 입력
  pinMode(echoPin, INPUT);   // 하단 초음파센서1
  pinMode(echoPin2, INPUT);  // 상단 초음파센서2
  // 모터 핀 연결
  myservo.attach(2);  // 입 윗부분 모터1을 2번 핀에 연결
  myservo2.attach(3); // 입 아랫부분 모터2를 3번 핀에 연결 
  // 모터1, 모터2의 시작 각도 설정
  myservo.write(160); 
  myservo2.write(45);
   pinMode(inputPin, INPUT); // pir센서의 input 설정  lcd.init();       // I2C LCD 초기화
  lcd.backlight();  // LCD 백라이트 켜기
}


void setup() 
{
  // 거리 감지를 위해 초음파센서의 trig 출력
  pinMode(trigPin, OUTPUT);  // 하단 초음파센서1
  pinMode(trigPin2, OUTPUT); // 상단 초음파센서2
  // echo 입력
  pinMode(echoPin, INPUT);   // 하단 초음파센서1
  pinMode(echoPin2, INPUT);  // 상단 초음파센서2
  // 모터 핀 연결
  myservo.attach(2);  // 입 윗부분 모터1을 2번 핀에 연결
  myservo2.attach(3); // 입 아랫부분 모터2를 3번 핀에 연결 
  // 모터1, 모터2의 시작 각도 설정
  myservo.write(160); 
  myservo2.write(45);
   pinMode(inputPin, INPUT); // pir센서의 input 설정  lcd.init();       // I2C LCD 초기화
  lcd.backlight();  // LCD 백라이트 켜기
}



void loop()
{
  // pir 센서가 사람의 움직임을 감지하기 위함
  val = digitalRead(inputPin); // 센서 신호값을 읽어와서 val 변수에 저장
  // pir센서에 움직임이 감지되면 초음파센서가 작동
  if (val == HIGH) // 센서 신호 값이 HIGH면 – 움직임이 감지되었을 경우
  {
    if (pirState == LOW) // 센서 초기상태면 – 움직임이 없는 상태
    { ...// 파리지옥의 동작 수행
    }
  }
  else // 센서 신호값이 LOW면 - 움직임이 없을 경우
  { ...// 아무 동작도 수행하지 않음
  }
} 


  if (val == HIGH) // 움직임이 감지되었을 경우
  {
    if (pirState == LOW) // 상태가 센서 초기상태면
    {...// 초음파센서의 trig를 출력하여 물체와의 거리 감지하기
      digitalWrite(trigPin, LOW); 
      delay(2);
      digitalWrite(trigPin, HIGH); 
      delay(10);
      digitalWrite(trigPin, LOW);
      // 하단 초음파센서1 거리 측정
      duration = pulseIn(echoPin, HIGH); // 초음파 보낸 시간 저장
      distance = ((float)(340 * duration) / 10000) / 2; 
      digitalWrite(trigPin, LOW); 
      delay(2);
      digitalWrite(trigPin2, HIGH);
      delay(10);
      digitalWrite(trigPin2, LOW);
      // 상단 초음파 센서2 거리측정
      duration2 = pulseIn(echoPin2, HIGH); 
      distance2 = ((float)(340 * duration2) / 10000) / 2; 

📌LCD 모니터 설정

LCD 모니터 설정1
LiquidCrystal_I2C lcd(0x27, 20, 4); // lcd 주소 설정
// lcd 한 칸의 픽셀 on/off 설정 -> 1:on, 0:off
byte customChar[] = {
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111
}; // 모두 1로 설정 -> lcd 한 칸을 키면 한 칸 전체 on


LCD 모니터 설정2
// lcd 화면에 파리지옥이 입 열고 있는 모습 출력하는 함수
void OpenMouse()
{
  lcd.createChar(1, customChar); // 픽셀on/off 설정을 1로 지정
  for (int i = 5;i < 9;i++) 
    {
      lcd.setCursor(i,0); // i행 0열 
      lcd.write(1);	    // 픽셀 모두 켜기
      lcd.setCursor(i,3); // i행 3열 
      lcd.write(1);       // 픽셀 모두 켜기
    }
    lcd.setCursor(4,1);   // 4행 1열
    lcd.write(1); 	    // 픽셀 모두 켜기
    lcd.setCursor(4,2);   // 4행 1열
    lcd.write(1);         // 픽셀 모두 켜기
}


LCD 모니터 설정3
// lcd 화면에 파리지옥이 입 닫는 모습 출력하는 함수
void CloseMouse()
{
  lcd.createChar(1, customChar); // 픽셀on/off 설정을 1로 지정
  for (int i = 4;i < 9;i++)
  {
    lcd.setCursor(i,1); // i행 1열 
    lcd.write(1);       // 픽셀 모두 켜기
    lcd.setCursor(i,2); // i행 2열 
    lcd.write(1);       // 픽셀 모두 켜기
  }
}
![](https://velog.velcdn.com/images/gnos456/post/1b359df9-f6df-4bb4-999d-b316e0f6d18c/image.png)

📌구현 모습 및 동작 영상

  • 파리지옥 입

  • 서브모터 활용

  • 초음파 센서, 모니터 활용

  • 기타 제작



  • 동작 영상





profile
프로그래밍 공부

0개의 댓글