C언어로 라즈베리파이4 레지스터 접근하여 LED점멸시키기

imalright.tistory.com/6

 

C언어로 라즈베리파이4 GPIO 레지스터 접근하여 LED점멸시키기

사용하려는 GPIO는 GPFSEL1 레지스터에서 GPIO18번을 사용하려고 합니다. gpio[GPFSEL1/4] |= (1< GPIO18번의 비트가 24~26비트까지기 떄문에 24~26번째 비트의 값을 001로 바꾸어주면 GPIO18번핀은 출력모드가..

imalright.tistory.com

를 해봤는데

이번에는 버튼을추가해서 버튼을 누르면 LED가 켜지고 손을 떼면 LED가 꺼지게 됩니다.

지난번 글에서 해놓았던 GPIO18번에는 LED가 연결되어 있습니다.

GPIO17번으로부터 값을 가져오기 떄문에 17번비트의 값이 1인지 여부만 알면 됩니다.

버튼을 누르게 되면 5V가 핀으로 입력되어서 해당핀에대응되는 비트는 1로 변경되기 때문입니다.

#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/gpiomem", O_RDWR|O_SYNC );    
    if ( fd < 0 ){    
        printf( "can't open /dev/gpiomem \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;    
}    

컴파일할때는

pi@raspberrypi:~$ g++ btn.c -o btn

 

실행은

pi@raspberrypi:~$ sudo ./btn

 

으로 실행하시면 버튼을 누르고 있을때 led가 켜지고 손을떼면 led가 꺼지는 것을 확인할 수 있습니다

 

라즈베리파이와 브레드보드 연결입니다.

 

사용하려는 GPIO는 GPFSEL1 레지스터에서 GPIO18번을 사용하려고 합니다.

gpio[GPFSEL1/4] |= (1<<24);

GPIO18번의 비트가 24~26비트까지기 떄문에 24~26번째 비트의 값을 001로 바꾸어주면 GPIO18번핀은 출력모드가 됩니다.

 

그리고 다음레지스터들에서 GPIO18번 위치에 해당되는 비트들을 세팅해주면 LED를 ON,OFF시킬수 있습니다.

gpio[GPSET0/4] |= (1<<18); 

 

gpio[GPCLR0/4] |= (1<<18);

 

전체소스코드 입니다.

#include <stdlib.h>    
#include <stdio.h>
#include <unistd.h>    
#include <sys/types.h>    
#include <sys/stat.h>    
#include <fcntl.h>    
#include <sys/mman.h>    
        
        
#define GPIO_BASE 0x3F200000    
#define GPFSEL1   0x04  
#define GPSET0    0x1C  
#define GPCLR0    0x28    
        
        
int main()    
{    
    int fd = open( "/dev/gpiomem", O_RDWR|O_SYNC );    
    if ( fd < 0 ){    
        printf( "can't open /dev/gpiomem \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] = 0b00000001000000000000000000000000;    
    gpio[GPFSEL1/4] |= (1<<24);    
        
    int i;    
    for ( i=0; i<5; i++ )    
    {    
        //gpio[GPSET0/4] = 0b00000000000001000000000000000000;    
        gpio[GPSET0/4] |= (1<<18);   
        sleep(1);    
        
        //gpio[GPCLR0/4] = 0b00000000000001000000000000000000;   
        gpio[GPCLR0/4] |= (1<<18);  
        sleep(1);    
    }    
        
     munmap( gpio_memory_map, 4096);    
    
    return 0;    
} 

라즈베리파이 2나3에선 /dev/mem 을 사용했지만 라즈베리파이4부터는 /dev/gpiomem 을 사용해서 gpio의 레지스터에 접근해서 사용할 수 있습니다.

 

컴파일 할땐

pi@raspberrypi:~$ g++ led.c -o led

이런식으로 명령어를 사용해주시고 실행할땐 관리자권한이 필요하기 때문에

pi@raspberrypi:~$ sudo ./led

sudo 를 사용해서 관리자권한을 주셔야 합니다.

실행하면 LED가 5번 깜빡이는것을 볼 수 있습니다.

기능 설명

1. 버튼 클릭시 QDialog를 띄운다.

2. QDialog에서 선택한 파일(txt, c, cpp되는것 확인)의 내용을 가져와서 띄움

 

소스코드

from PyQt5.QtWidgets import QWidget, QPushButton, QFileDialog, QApplication, QLabel, QTextEdit, QVBoxLayout
import sys

class Main(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        #불러오기 버튼
        btn1 = QPushButton('불러오기')
        btn1.clicked.connect(self.load_btn)

        lbl1 = QLabel('Text')
        #불러온 텍스트를 표시할 창
        self.te = QTextEdit()

        vbox = QVBoxLayout() #세로로정령
        vbox.addWidget(btn1)
        vbox.addWidget(lbl1)
        vbox.addWidget(self.te)


        self.setGeometry(1000, 150, 800, 700)
        self.setWindowTitle('TxTLoad')
        self.setLayout(vbox)
        self.show()

    def load_btn(self):
        fname = QFileDialog.getOpenFileName(self, './')

        if fname[0]:
            f = open(fname[0], 'r')

            with f:
                data = f.read()
                self.te.clear()
                self.te.setPlainText(data)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Main()
    sys.exit(app.exec_())

코드 설명

불러오기 버튼을 누르면 

이렇게 QFileDialog가 뜨는데 txt파일을 선택하면

이런식으로 안에있던 내용이 불러와지는것을 확인할 수 있습니다.

제가 해봤을땐 txt, c, cpp파일들은 텍스트가 불러와진것으로 확인했습니다

시작 2020-10-16

 

pip install labelimg

1.)

 

models/research/object_detection에 
    └imgaes

           ├ train

           └ test

폴더를 만듭니다

 

학습하고 싶은 이미지를 images폴더안에있는 train과test 폴더에 9:1 비율로 사진을 넣어줍니다.

 

2.)

Labelimg

이미지에서 object의 경계상자와 레이블을 지정해줘야합니다.

labelimg를 사용하여 각 이미지에 대한 xml파일로 생성할수있는데

labelimg가 없다면 cmd창(명령프롬프트)에서

pip install labelimg

를 사용하여 labelimg를 설치해주시고 cmd창에 

를 입력하시면

이렇게 실행이됩니다.

labelimg에서 open Dir을 클릭후 경로를

object_detection/images/train

로 선택하시고 Change Save Dir도 같은경로로 지정하시면 됩니다.

 

위 설정이 끝났으면

이렇게 이미지가 나옵니다.

 

조작법은 w를 누르면 라벨링을 할 수 있게 되고

여기에 라벨의 이름을 입력을 해줍니다.

저장을 편하게 하시려면 위에설정창에 

View에서 맨위에있는 Auto Save mode를 클릭해주시면 자동으로 저장이됩니다

그리고 라벨을 하나만 하신다면 오른쪽 위에있는

Use default label에 체크해주식 오른쪽에 라벨의 이름을 입력해 주시면 됩니다.

 

3.)

라벨링이 끝나셨다면 xml파일을 TFRecord파일로 변환을 해야합니다.

xml_to_csv.py

 

위 코드에서 약간 변경해야합니다.

def main():
    image_path = os.path.join(os.getcwd(), 'annotations')
    xml_df = xml_to_csv(image_path)
    xml_df.to_csv('raccoon_labels.csv', index=None)
    print('Successfully converted xml to csv.')

def main():
    for directory in ['train', 'test']:
        image_path = os.path.join(os.getcwd(), 'images/{}'.format(directory))
        xml_df = xml_to_csv(image_path)
        xml_df.to_csv('data/{}_labels.csv'.format(directory), index=None)
        print('Successfully converted xml to csv.')

로 바꿔주고 object_detection에 넣어준뒤 실행하면 data폴더에 csv파일이 생긴것을 확인할 수 있습니다.

 

 

임시저장 2020-10-16

안드로이드스튜디오 가상기기가아닌 카메라가 되는 공기계나 핸드폰에 하시는걸 추천드립니다.

 

우선 GitHub에서 기본예제어플을 가져와야 합니다.

https://github.com/tensorflow/examples

 

tensorflow/examples

TensorFlow examples. Contribute to tensorflow/examples development by creating an account on GitHub.

github.com

위 사이트에 직접들어가서

이렇게 직접 설치하고 압축을 풀어주는방법과

 

git

CMD창(명령프롬프트)창에서 설치가될 경로에 들어간 뒤

git clone https://github.com/tensorflow/examples

를 사용하여 설치하는 방법이 있습니다.

 

설치후에 AndroidStudio를 실행한뒤

두번째에 있는 Open an existing Android Studio project를 클릭합니다.

그후에 설치한경로로들어간뒤

examples/lite/examples/image_classification

위경로로 들어가서 Android를 클릭후 OK버튼을 누릅니다.

그러면 아래와같은 화면이 나옵니다.

아래쪽에 Build가 되고있을수 있는데 Build가 끝나길 기다린후 

버튼을 누르거나

Shitf+F10 을 누르시면 됩니다.

어플이 실행되고 모니터를 인식하는것을 볼 수 있습니다.

 

 

 

 

 

https://sourceforge.net/projects/win32diskimager/<= 사이트에 접속해서

 클릭후 조금기다리면 다운로드됩니다.

 

다운로드후 설치를 완료하고

 

Win32 Disk Imager를 실행한뒤

 

사진 순서대로 설정하고 Write를 눌러 SD카드에 설치를 하면 됩니다.

 

라즈비안 설치는

https://imalright.tistory.com/1

 

여기에 들어가시면 있습니다.

 

http://downloads.raspberrypi.org/raspbian/images/

 

Index of /raspbian/images

 

downloads.raspberrypi.org

위사이트에 들어가셔서 원하는라즈비안버전을 찾은 뒤 버전.zip을 다운받으시면 됩니다

+ Recent posts