embedded

Lab1 - Digital in & out

이타심 2021. 5. 22. 03:20
728x90
Lab 1. Digital In & Out

 

#개발 환경

임베디드를 공부하기에 앞서 공부와 Lab 진행에 필요한 개발 환경 세팅이 필요하다. 컴파일러는 온라인 컴파일러인 mbed-OS를 사용하여 공부를 진행할 것이다. 따라서 먼저, mbed-OS 사이트에 접속하여 회원가입을 하고 컴파일러를 생성하는 것을 순서로 한다. 또한 실제 보드를 사용하여 회로를 구성하고 실험하였지만, 포스팅 시에 좀더 명확한 회로도를 보여주기 위해 fritzing을 사용하여 온라인 회로도를 사용하였다. 아래 첨부한 레퍼런스들은, mbed-OS에서 공부하는데 필요한 정보들을 찾아볼 수 있는 참고 자료이다.

References

  • Mbed-OS github

https://github.com/ARMmbed/mbed-os

 

ARMmbed/mbed-os

Arm Mbed OS is a platform operating system designed for the internet of things - ARMmbed/mbed-os

github.com

  • Mbed document

https://os.mbed.com/docs/mbed-os/v6.9/introduction/index.html

 

Introduction - Introduction to Mbed OS 6 | Mbed OS 6 Documentation

Docs › Introduction to Mbed OS 6 › Introduction An introduction to Arm Mbed OS 6 Mbed OS is an open-source operating system for Internet of Things (IoT) Cortex-M boards: low-powered, constrained and connected. Mbed OS provides an abstraction layer for

os.mbed.com

  • Fritzing

https://fritzing.org/

 

Fritzing

Fritzing is an open-source hardware initiative that makes electronics accessible as a creative material for anyone. We offer a software tool, a community website and services in the spirit of Processing and Arduino, fostering a creative ecosystem that allo

fritzing.org

 

#NUCLEO-F411RE

실험에 사용할 보드는 Nucleo-F411RE 보드이다. 해당 보드는 STM32F411RET6 마이크로프로세서를 이용한다.

Nucleo-F411RE

  • ARM 32-bit Cortex-M4 CPU with FPU
  • Clock: Max. 100MHz
  • VDD from 1.7V to 3.6V
  • 512KB Flash & 128KB SRAM
  • GPIO(50) with external interrupt capability
  • 12-bit ADC with 16 channels
  • RTC and Timer(8)
  • I2C(3), USART(3), and SPI(5)
  • USB OTG Full Speed
  • User LED(LD2)
  • Two push buttons: USER, RESET

 

#Lab1-1 (Interrupt Input)

해당 실험은 두 가지 LED를 사용하여, 한 LED는 blinking 동작을 주고, 다른 하나는 USER BUTTON을 이용하여 LED를 on/off하는 간단한 동작을 알아볼 것이다. 

#include "mbed.h"
DigitalOut redLed(D2);
DigitalOut greenLed(D3);
Interrupt button(PC_13);

 위 코드는, 해당 실험을 실행하기 위한 선언 코드이다. 먼저 mbed 헤더파일을 include한다.

다음으로 GPIO 포트의 핀을 디지털 입 출력 장치로 설정하는 DigitalOut class를 사용하여 D2, D3핀에 LED를 연결한다. USER BUTTON을 사용하기 위해 Interrupt class를 사용하여 PC_13 핀을 설정한다. 해당 class는 인터럽트 처리를 위한 구조체를 형성하고, 기본적 인터럽트 설정을 수행한 후 해당 GPIO 핀을 디지털 입력 장치로 설정한다.

 

void button_pressed(){
	redLed = !redLed
}

int main(){
	button.fall(&button_pressed);
}    

해당 코드는 main 함수에서 void fall(callback<void()> func) 함수를 선언하여, 하강 edge 이벤트 발생 시 실행될 ISR인 func을 등록한다. 앞서 PC_13(USER BUTTON) 핀으로 설정한 button 변수를 통해, Interrupt가 발생했을 때 button_pressed 함수를 실행시켜 User button을 클릭할 때마다 redLed가 blinking 되도록 설정해 주었다.

 

while(1){
   greenLed = !greenLed;
   ThisThread::sleep_for(500ms);
}

위 while문은 Interrupt 발생 여부와 상관없이 main함수에서 실행된다. greenLed가 반복적으로 blinking되고, ThisThread::sleep_for() Method를 통해 주기를 설정한다.

 

  •  구성 회로도

Lab 1-1 회로도

#Lab1-2 (DigitalOut / PortOut)

두번째 실험은 LED 3개를 사용하여, RedLed는 1초간격, YellowLed는 2초, GreenLed는 4초간격으로 점멸하는 동작 DigitalOut과 PortOut을 사용하여 알아볼 것이다.

#include "mbed.h"
#define BLINKING_RATE     500ms

DigitalOut redLed(D3);
DigitalOut yellowLed(D4);
DigitalOut greenLed(D5);

먼저 DigitalOut부터 알아보면, 1-1과 동일하게 핀을 설정해준다. 

        redLed = !redLed;		//1초
        yellowLed = !yellowLed;	
        greenLed = !greenLed;
        ThisThread::sleep_for(BLINKING_RATE);
        redLed = !redLed;		//2초
        ThisThread::sleep_for(BLINKING_RATE);
        redLed = !redLed;		//3초
        yellowLed = !yellowLed;
        ThisThread::sleep_for(BLINKING_RATE);
        redLed = !redLed;		//4초
        ThisThread::sleep_for(BLINKING_RATE);

위 코드는 main함수의 while문으로 반복 실행되는 코드이다. 1초간격으로 점멸하기 위해서는 500ms 단위로 on/off되어야 하기 때문에, 주기를 500ms로 설정하고 코드를 작성하였다. 먼저 코드가 제일 처음으로 실행될때 모든 Led를 On상태로 동작시킨다. 이후 1초 간격으로 점멸하는 redLed만 off상태로 변경하고 다시 500ms를 기다린다. 이러한 방법으로 redLed는 ThisThread가 발생할 때마다, 즉 매초 점멸 동작을 적용시키고, yellow와 green은 2초와 3초간격의 위치에 점멸 코드를 작성하여 순차적인 점멸을 발생시킨다.

 

다음으로 PortOut은, PortOut class을 사용한다. 해당 class는 하나의포트(GPIOA, GPIOB 등)에 속한 다수의 디지털 출력 장치를 하나의 논리장치로 구성할 수 있다. 생성자는 PortOut(PortName port, int mask = 0xFFFFFFFF)으로 사용하고, 현재 사용하는 D3,D4,D5핀인 PB_3, PB_4, PB_5를 포트 출력으로 사용하기 위해서는 PortOut motorCtl(PortB, 0x0078)과 같은 형태로 사용한다. 위 mask는, 한 포트에서 어떤 비트들이 포함되어 있는가를 표시해주는 역할을 수행한다.

#include "mbed.h"

PortOut motorCtl(PortB, 0x0078); // PB_3 = red, PB_4 = yellow, PB_5 = green
#define BLINKING_RATE     500ms
 int count[8] = {0,1,4,5,2,3,6,7};
int main()
{
    while (true) 
    {
      for(int i=0 ; i<8 ; i++){
          motorCtl = count[i]<<3;
          ThisThread::sleep_for(BLINKING_RATE);  
      }
    }
}

main함수를 살펴보면, PortOut 변수로 설정한 motorCtl에 count 배열의 element들을 순차적으로 <<3 shift하여 대입해주는 것을 확인할 수 있다 이는 motorCtl 변수 값에 따라 변화하는 핀들의 동작에 의해 작성한 것인데, 먼저 count배열에 0이 들어가면 모든 핀이 off 상태로 설정된다. 잇다라 1이 대입되면 D3 핀이 on되고 2는 D5핀, 3은 D3, D5 두가지 핀을 on 시켜준다. 따라서 해당 동작들을 모두 살펴본 결과를 순차적으로 적용시켜 count 배열에 대입하고 실행해주어, 순차적으로 일정 시간 간격으로 점멸되는 LED를 구성하였다.

  • 구성 회로도

Lab 1-2 회로도

#마치며

본 챕터에서는 처음으로 실습에 들어감에 있어서 간단한 Led를 이용한 동작들을 살펴보았다. 앞으로는 점차적으로 심화되는 내용을 다루고, 다양한 port들과 class를 공부해볼 것이다. 

 

728x90

'embedded' 카테고리의 다른 글

Lab2 - GPIO IN & OUT  (3) 2021.05.24
임베디드 프로세스 응용  (2) 2021.05.22