지난번 올렸던 C언어로 라즈베리파이 3의 LED제어 했던 것에 이어서 글을 올립니다.
C언어로 Raspberry Pi 3의 GPIO 레지스터 접근하여 LED켜보기
https://webnautes.tistory.com/1915
이번엔 버튼을 하나 추가하여 버튼을 누른 동안에는 LED가 켜지고 손을 떼면 LED가 꺼지게 됩니다..
GPIO18번에 LED가 연결되어 있고 아래 사진처럼 GPIO17번에는 버튼을 연결하고 풀다운저항을 추가했습니다.
GPFSEL1레지스터를 접근하여 핀을 입력으로 쓸지 출력으로 쓸지 결정해주어야 합니다.
입력의 경우에 디폴드값이 000이므로 아래 FSEL17는 건드릴 필요가 없습니다.
LED를 켜야하므로 FSEL18은 001로 해주어 출력으로 해주어야 합니다.
핀으로부터 입력을 읽어오는 레지스터의 오프셋은 0034입니다.
따라서 이 레지스터의 위치는 GPIO레지스터 시작위치 + 0034가 되겠죠.
하지만 mmap할때 레지스터의 시작위치부터 0이 되버리므로 0034만 알고 있으면 됩니다.
GPIO17번으로 부터 값을 읽어 올거기 때문에 17번 비트의 값이 1인지 여부를 체크하면 됩니다.
버튼을 누르게 되면 5V가 핀으로 입력되기 때문에 해당 핀에 대응되는 비트는 1로 바뀌기 때문입니다.
실행시켜보면 버튼 누를때 마다 LED가 켜집니다.
pi@raspberrypi:~ $ gcc button.c -o button
pi@raspberrypi:~ $ sudo ./button
아래는 전체 소스 코드 입니다.
#include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/mman.h> #define GPIO_BASE 0x3F200000 #define GPFSEL1 0x04 #define GPLEV0 0x34 #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); } char *gpio_memory_map = (char *)mmap( 0, 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_BASE ); if ( gpio_memory_map == MAP_FAILED ) { printf( " Error : mmap \n" ); exit(-1); } volatile unsigned int* gpio = (volatile unsigned int*)gpio_memory_map; gpio[GPFSEL1/4] |= (1<<24); while(1) { int input = gpio[GPLEV0/4] & (0x01<<17); if ( input > 0 ) gpio[GPSET0/4] |= (1<<18); else gpio[GPCLR0/4] |= (1<<18); } munmap( gpio_memory_map, 4096); return 0; } |
마지막 업데이트 2019. 2. 18
'Raspberry Pi > Raspberry Pi 활용' 카테고리의 다른 글
Raspberry Pi 400에 RetroPie 설치하기 (0) | 2024.04.19 |
---|---|
Raspberry Pi 4 에서 무선랜(WiFi) 설정하는 방법 (0) | 2023.10.21 |
C언어로 Raspberry Pi 3의 GPIO 레지스터 접근하여 LED켜보기 (0) | 2023.10.09 |
Raspberry Pi 4 - Python으로 7 Segment 제어하기 (0) | 2021.06.13 |
Raspberry Pi 4에서 캐릭터 LCD 사용하는 방법 ( wiringpi ) (6) | 2021.02.05 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!