[라즈베리파이] Led 제어

HEEJOON MOON·2022년 6월 5일
0

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 complie : 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;
}
profile
Robotics, 3D-Vision, Deep-Learning에 관심이 있습니다

0개의 댓글