[Arudino] LED 제어

HEEJOON MOON·2022년 6월 4일
0
post-thumbnail

500ms 간격으로 LED 1개를 ON/OFF

< HW setting >

< Led1.ino >

#define LED 5; // 아두이노 출력 핀 정의

void setup(){ // 아두이노 초기화시 실행되는 함수
	pinMode(LED, OUTPUT); // LED핀을 출력모드로 설정
}

void loop(){ // 전원이 켜지면 동작을 반복하는 함수
	digitalWrite(LED, HIGH); // 5번 PIN에 HIGH 출력(RED LED 1 ON)
    delay(500); // 500ms 지연
	digitalWrite(LED, LOW); // 5번 PIN에 LOW 출력(RED LED 1 OFF)
	delay(500); // 500ms 지연
}

500ms 간격으로 LED 4개를 순차적으로 ON/OFF

int Led[4] = {5, 6, 7, 8}; // Arduino pin을 리스트로 정의

void setup(){ // 아두이노 초기화시 실행되는 함수
	int i;
    for (i=0; i<4; i++)
    	pinMode(LED[i], OUTPUT); // LED핀들을 출력모드로 설정
}

void loop(){ // 전원이 켜지면 동작을 반복하는 함수
    for (i=0; i<4; i++){
      digitalWrite(LED[i], HIGH); // Led[i]번 PIN에 HIGH 출력
      delay(500); // 500ms 지연
      digitalWrite(LED[i], LOW); // Led[i]번 PIN에 LOW 출력
      delay(500); // 500ms 지연
      }
}

MsTimer2 라이브러리를 추가한 실행

MsTimer2는 3개의 함수로 구성되어 동작

  • MsTimer2::set(millisecond, function) : 타이머 사용시 시간 및 타이머 처리 함수를 설정. millisecond 이후 타이머 처리 함수(function)를 실행.
  • MsTimer2::start() : 타이머 실행
  • MsTimer2::stop() : 타이머 정지
#include <MsTimer2.h>

int Led[4] = {5, 6, 7, 8}; // Arduino pin을 리스트로 정의

void LedControl(){ // 타이머 처리 함수
	static int counter = 0; // static 변수: 지역 변수이면서, 초기화는 1번만 일어남.
    static byte output = HIGH; // LED ON,OFF를 결정할 변수
    
    digitalWrite(Led[counter++], output); // LED ON/OFF 수행
    if(counter > 3){
    	counter = 0; // counter index를 초기화
        output = ! output; // 현재와 반대 상태로 전환
    }
    
}

void setup(){ // 아두이노 초기화시 실행되는 함수
	int i;
    for (i=0; i<4; i++)
    	pinMode(LED[i], OUTPUT); // LED핀들을 출력모드로 설정
    MsTimer2::set(500, LedControl); // Timer 설정. 500ms이후 LedControl함수가 실행
    MsTimer2::start(); // Timer 시작
    
}

void loop(){ // 전원이 켜지면 동작을 반복하는 함수
}

Arduino GPIO Register를 이용한 예제

  • DDRx : INPUT/OUTPUT설정 레지스터 (ex. DDRB = 0x80 -> portB의 7번 번째인 PB7를 출력모드로 설정)(pinMode)
  • PORTx : DDRx가 OUTPUT 모드인 경우 high/low 출력(digitalWrite)
  • PINx : DDRx가 INPUT 모드인 경우 현재 핀의 상태를 읽음(digitalRead)

예제

기존 13번 핀에 연결된 LED를 1초동안 끄고 키는 function을 bit단위로 실행 가능

void setup(){
	// Digital 13번 핀을 출력으로 설정 => 0b1000000 
	DDRB = 0x80; // DDRx : 입출력 설정 Reigster
	// pinMode(LED_BULTIN, OUTPUT);
}

void loop(){
	// Digital 13번 핀에 5V인가 -> 전원 ON 
    PORTB = 0x80; // PORTB = 0b1000000 ; => portB의 7번 핀에 1을 주어 출력
    // digitalWrite(LED_BULTIN, HIGH);
	delay(1000);
    
    // Digital 13번 핀에 0V인가 -> 전원 OFF, PORTB=0b00000000;
    PORTB = 0x00; // portB의 모든 비트값을 0으로 만들어 모든 핀을 off 
    // digitalWrite(LED_BULTIN, LOW);
    delay(1000);
}

PinMode(uint8_t pin, uint8_t mode)를 GPIO로 직접 구현

void pinMode(uint8_t pin, uint8_t mode){
	
    // 전달된 pin에 대응되는 레지스터를 표시하는 bit를 찾음
    uint8_t bit = digitalPinToBitMask(pin); // 이 매크로가 하는 역할은 DDRB의 레지스터 슬롯 8비트 중 7개를 0으로 세팅하고 우리가 원하는 핀을 나타내는 슬롯 하나만 1로 설정한 byte(=8bit)를 리턴해 주는겁니다.
    // 전달된 pin에 해당하는 port를 찾음
    uint8_t port = digitalPinToPort(pin);
    
    if(port==NOT_A_PIN)
    	return; // 전달된 pin이 존재하지 않으면 함수를 종료. 사용자의 pin번호 오입력을 대비.
    
    // PORT에 해당하는 DDR값을 찾음
    reg = portModeRegister(port); 
    
   	if (mode==INPUT)
    	*reg &= ~bit; // INPUT모드 설정
    else
    	*reg |= bit; // OUTPUT모드 설정
}

digitalWrite(uint8_t pin, uint8_t val)를 GPIO로 직접 구현

void digitalWrite(uint8_t pin, uint8_t val){
	
    // 전달된 pin에 대응되는 레지스터를 표시하는 bit를 찾음
    uint8_t bit = digitalPinToBitMask(pin);
    // 전달된 pin에 해당하는 port를 찾음
    uint8_t port = digitalPinToPort(pin);
    volatile uint8_t *out; //
    
    if(port==NOT_A_PIN)
    	return; // 전달된 pin이 존재하지 않으면 함수를 종료. 사용자의 pin번호 오입력을 대비.
    
    // PORT에 해당하는 DDR값을 찾음
    out = portModeRegister(port); 
    
   	if (val==LOW)
    	*out &= ~bit; // bit(현재 핀의 bit)와 반대와 교집합 연산한다. 따라서 0이 입혀짐.
    else
    	*out |= bit; // OUTPUT모드 
}

digitalRead(uint8_t pin)를 GPIO로 직접 구현

int digitalRead(uint8_t pin){
	uint8_t bit = digitalPinToBitMask(pin);
    uint8_t port = digitalPinToPort(pin);
    volatile uint8_t *out;
    
    if(port==NOT_A_PIN)
    	return LOW;
    // Port에 해당하는 INPUT레지스터 값과의 비교
    if(*portInputRegister(port) & bit) return HIGH; //
    return LOW;
}
profile
Robotics, 3D-Vision, Deep-Learning에 관심이 있습니다

0개의 댓글