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를 이용한 예제
기존 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);
}
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모드 설정
}
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모드
}
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;
}