본문 바로가기

Computer Science/Embedded Software

[Embedded Software] Embedded System 개발 (example)

+ 한국항공대학교 최차봉 교수님의 임베디드 SW 과목 내용을 정리한 글입니다.

Embedded System 개발 프로세스

임베디드 시스템 개발 프로세스의 V자 모델

1. 시스템 요구 정의

- 사용자 관점에서 생각하며 시스템 개발에서 요구되는 것들을 정의한다.

ex) User Interface, Scenario, QCD(Quality, Cost, Delivery) 등

2. 시스템 아키텍처 설계 - 구조 설계 

- HW와 SW의 역할과 기능을 분담하고, 구성과 동작을 구체화하며 기능간 연동과 제한사항을 기술한다.

3. 소프트웨어 개발 - 상세 설계 

- HLD(High Level Description, 크게 설계) => LLD(Low Level Description, 보고 바로 구현할 수 있을 정도의 설계) => 구현

ex) Unit Test(단위 테스트), Integration Test(결합 테스트), Debugging

4. 품질 검사, 출시


Embedded System 종류

1. OS가 있는 시스템

OS가 있는 시스템

ex) Raspberry Pi: Linux OS

 

2. OS가 없는 시스템

OS가 없는 시스템

ex) Arduino: Libraries instead of OS


Arduino Simulator 예제 1번: LED 회로

LED + 저항 (220옴) + 3V 배터리 + 스위치 + 멀티 미터

LED 회로

 

+ 스위치의 튀어나온 부분이 가까우면 떨어져 있고, 멀면 붙어있다.

스위치

+ 멀티 미터는 연결된 지점의 특정 값을 화면에 나타낸다.


Arduino Simulator 예제 2번: LED Blinking

아두이노 + 저항(220옴) + LED + 프로그램

LED Blinking

전원: 양극을 나타내는 +, 일반적으로 전기는 양극에서 출발한다.

접지(GND, Ground): 음극을 나타내는 -,  회로의 모든 경로가 전원에서 시작하는 것처럼, 모든 경로의 끝은 접지이다.

int n;
void setup()
{
  pinMode(12, OUTPUT); // 12번 포트를 OUTPUT으로 사용
  Serial.begin(9600);// 시리얼 모니터에 9600 속도로 통신
}

void loop()
{
  digitalWrite(12, HIGH); // HIGH: 1, LOW: 0
  delay(1000); // Wait for 1000 millisecond(s)
  digitalWrite(12, LOW);
  delay(1000); // Wait for 1000 millisecond(s)
  n++;
  Serial.println(n); // n을 시리얼 모니터에 출력
}

 

setup : 전원을 켤 때 한 번만 실행되는 함수

loop : setup 함수가 종료되면 무한 반복 실행되는 함수

 

pinMode(a, OUTPUT / INPUT) : a번 포트를 OUTPUT 또는 INPUT으로 사용

Serial.begin(a) : 시리얼 모니터에  a 속도로 통신

digitalWrite(a, HIGH / LOW) : a번 포트에 HIGH(전류가 흐르는 상태. 1) 또는 LOW(전류가 흐르지 않는 상태. 0) 입력

delay(a) : a 밀리 초동안 정지

Serial.println(a) : 시리얼 모니터에 a 출력 (줄바꿈)

 

- Serial Monitor: 코드 실행 진행 상황을 관찰하는 모니터 (터미널)


Arduino Simulator 예제 3번: LED (+ 스위치)

아두이노 + 스위치 + 저항 2개 + LED

 

=> 스위치를 한 번 누르면 켜지고, 다시 한 번 누르면 꺼진다. (togle)

but, 스위치를 한 번 누른다고 해서 한 번만 접촉하는 것이 아니라 여러번 접촉하는 현상(글리치)이 있어 마음처럼 되지 않는다. (시리얼 모니터을 확인하면 알 수 있다.)

LED Blinking (+ 스위치)

+ 스위치를 누르지 않으면 GND에서 LOW(0)가 저항을 거쳐서 들어온다.

int sw; // 스위치를 누르면 1, 누르지않으면 0
int flag = 0; // LED의 상태 (켜져 있으면 1, 꺼져 있으면 0)

void setup()
{
  pinMode(8, OUTPUT);
  pinMode(7, INPUT);
  Serial.begin(9600);
}

void loop()
{
  sw = digitalRead(7); // 7번 포트의 전압 저장 (스위치의 전압)
  if (sw == HIGH) { // 7번 포트에 전압이 들어왔다면
    flag = flag ? 0 : 1; // flag가 1이라면 0, 0이라면 1 반환
    Serial.print("flag = ");
    Serial.println(flag);
  }
  digitalWrite(8, flag); // 8번 포트에 1 or 0 을 전달
}

Arduino Simulator 예제 4번: 조도 센서 회로

아두이노 + 저항 (10KΩ, 700Ω, 1KΩ) + Cds(포토 레지스터)

조도 센서 회로

+ Cds (포토 레지스터): 빛이 세게 들어오면 저항이 약해지고 약하게 들어오면 저항이 약해진다.

+ 아날로그를 디지털로 바꾸기 위해 A0포트를 이용한다.

int val;

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

void loop()
{
  val = analogRead(A0); // A0포트에 들어오는 전압 세기
  Serial.println(map(val, 4, 448, 1, 10));
  // 4부터 448 사이의 val값을 1 ~10 값으로 변환해서 출력 (1KΩ)
  
  /*
  Serial.println(map(val, 3, 392, 1, 10));
  // 3~ 392 사이의 val값을 1 ~10 값으로 변환해서 출력 (700Ω)
  Serial.println(map(val, 36, 643, 1, 10));
  // 36~ 643 사이의 val값을 1 ~10 값으로 변환해서 출력 (10KΩ)
  */
}

Arduino Simulator 예제 5번: Tone 발생기

피에조(소리를 생성하는 전자 부품) + 아두이노

Tone 발생기

+ '~'가 앞에 붙은 포트: 아날로그 출력이 가능한 포트

 

int note[] = {262, 294, 330, 349, 392, 440, 494, 523};
// {도, 레, 미, 파, 솔, 라, 시, 도}
void setup()
{
  tone(9, note[2], 750); 
  // note[2] 주파수를 9번 포트에 750 millisecond 동안 울려라
  delay(750);
  // delay가 없으면 다같이 울려버림
  tone(9, note[1], 250);
  delay(250);
  tone(9, note[0], 750);
  delay(750);
  tone(9, note[1], 250);
  delay(250);
  tone(9, note[2], 1000);
  delay(1000);
  tone(9, note[7], 2000);
  delay(1000);
  tone(9, note[2], 2000);
  delay(2000);
  tone(9, note[2], 250);
  delay(250);
  tone(9, note[0], 750);
  delay(750);
}

void loop()
{
}