LED 1개를 500ms 간격으로 ON/OFF
Led1.c
// WiringPi를 이용한 헤더파일 선언
#include <wiringPi.h>
// LED ON,OFF 정의
#define LED_ON 1
#define LED_OFF 0
// 라즈베리파이 및 LED 핀 정의
const int Led[16] = {4, 17, 18, 27, 22, 23, 24, 25,
6, 12, 13, 16, 19, 20, 26, 21};
int main(void){
int i;
// Wiringpi 초기화
if(wiringPiSetupGpio() == -1)
return 1;
for(i=0; i<16; i++){
pinMode(Led[i], OUTPUT); // LED핀 출력모드 설정
digitalWrite(Led[i], LED_OFF); // LED 전체 OFF
}
while(1){
digitalWrite(Led[0], LED_ON); // LED1 ON
delay(500);
digitalWrite(Led[0], LED_OFF); // LED2 OFF
delay(500);
}
return 0;
}
gcc -o led1 led1.c -lwiringPi
./lab2-2_1
LED RED/GREEEN 교차 ON/OFF
Led2.c
// Wiringpi 헤더 선언
#include <wiringPi.h>
#define LED_OFF 0
#define LED_ON 1
// LED RED, GREEN 정의
#define LED_RED 2
#define LED_GREEN 3
// 라즈베리파이 및 LED RED / GREEN 핀 정의
const int LedRed [8] = { 4, 17, 18, 27, 22, 23, 24, 25 };
const int LedGreen [8] = { 6, 12, 13, 16, 19, 20, 26, 21 };
// LED 제어 함수
void LEDControl(int color){
int i;
if(color==LED_RED){
for(i=0; i<8; i++){
// LedRed는 키고 LedGreen은 OFF
digitalWrite(LedRed[i], LED_ON);
digitalWrite(LedGreen[i], LED_OFF);
}
}
else if(color==LED_GREEN){
for(i=0; i<8; i++){
// LedGREEN는 키고 LedRED은 OFF
digitalWrite(LedRed[i], LED_OFF);
digitalWrite(LedGreen[i], LED_ON);
}
}
}
int main(void){
int i;
// wiringPi 초기화
if(wiringPiSetupGpio()==-1)
return 1;
// pin 출력 모드 설정 및 OFF
for(i=0; i<8; i++){
pinMode(LedRed[i], OUTPUT);
pinMode(LedGreen[i], OUTPUT);
digitalWrite(LedRed[i], LED_OFF);
digitalWrite(LedGreen[i], LED_OFF);
}
while(1){
LedControl(LED_RED);
delay(500);
LedControl(LED_GREEN);
delay(500);
}
}
LED 순서대로 1개씩 ON.OFF
led3.c
#include <wiringPi.h>
// LED ON/OFF 정의
#define LED_ON 1
#define LED_OFF 0
// 라즈베리파이 및 LED 핀 정의
const int Led[16] = {4, 17, 18, 27, 22, 23, 24, 25,6, 12, 13, 16, 19, 20, 26, 21};
// pinnum의 LED만 키는 함수
void LedControl(int pinnum){
int i;
for(i=0; i<16; i++){
if (i==pinnum){
digitalWrite(Led[i], LED_ON);
}
else
digitalWrite(Led[i], LED_OFF);
}
}
int main(void){
int i;
if(wiringPiSetupGpio()==-1)
return 1;
for(i=0;i<16;i++){
pinMode(Led[i], OUTPUT);
digitalWrite(Led[i], LED_OFF);
}
while(1){
for(i=0;i<16;i++){
LedControl(i); // i반쩨 LED만 oN
delay(500);
}
}
return 0;
}
Raspberry Pi GPIO를 이용한 18번 LED 1초 간격 깜박이는 프로그램
- GPFSELn : 입/출력 모드 설정
- GPSETn : Output set bit. 전원 ON
- GPCLRn : Clear bit. 전원 OFF
GPIO 18 => GPFSEL1: 24~26번 bit, GPSET0 : 18번 bit, GPCLR0 : 18번 bit
Led4.c
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
// GPIO Address 설정
#define GPIO_BASE 0x32F200000
#define GPFSEL1 0x04
#define GPSET0 0x1C
#define GPCLR0 0x28
int main(){
int fd = open("/dev/mem", O_RDWR|O_SYNC);
if(fd<0){
printf("Can't open /dev/mem \n");
exit(-1);
}
// mmap syscall을 이용해서 Virtual address 포인터 반환. 이를 이용하여 대응되는 physical address접근 가능
char *gpio_memory_map = (char *)mmap(0, 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_BASE);
// memeory-mapping 실패시
if (gpio_memory_map == MAP_FAILED){
printf("Error:mmap\n");
exit(-1);
}
// char pointer에서 int pointer로
volatile unsigned int* gpio = (volatile unsigned int*)gpio_memory_map;
// Shift 연산자를 이용하여 GPFSEL1의 24비트를 1로 바꿈
gpio[GPFSEL1/4] = (1<<24);
// *(gpio + (GPFSEL1/4))=(1<<24);
int i;
// 5번 LED OFF/ON 수행 반복
for(i=0; i<5; i++){
// CLR 18번 비트를 1로 줌으로써 LED OFF
gpio[GPCLR0/4] = (1<<18);
sleep(1);
// SET 18번 비트를 1로 줌으로써 LED ON
gpio[GPSET0/4] = (1<<18);
sleep(1);
}
munmap(gpio_memory_gap, 4096); // mmap을 해줬으니, munmap도 해줘야한다.
return 0;
}