프로그래밍과 잡담

[Rust] Rust로 라즈베리파이 GPIO 포트 제어하기 본문

프로그래밍/Rust

[Rust] Rust로 라즈베리파이 GPIO 포트 제어하기

크레온 2022. 4. 7. 22:46

라즈베리 파이 GPIO 제어

 

집에 남아도는 라즈베리파이2가 있길래 GPIO 포트를 제어하는 걸 한번 해보고 싶어서 인터넷에서 브래드보드, 저항, led, 점퍼하고 버튼을 샀다.  가격도 상당히 저렴함.  근데 이놈들 저항을 랜덤으로 보내준다면서 다 1k 옴으로 줌 ㅅㅂ.

 

난 전자과가 아니라 회로에 대한 이론이 개뿔도 없음.  고등학교나 중학교때 배운 거 밖에 모름 ㅋ 

그냥 인테넷 뒤져서 해봤다. 그냥 대충 돌아가는거에 만족해야겠음 ㅋㅋ 

 

사실 이런 하드웨어 제어는 아직까지 C언어로 많이 짠다.  어차피 기능이 무진장 들어가는게 아니면 C 로짜는게 간편하거든.

 

근데 난 옛날에 C 언어를 해봐서 기억도 안나고 Rust 는 그래도 가끔씩 사용해서 할 줄 아니 Rust로 해보았다 ㅋ 

 

위의 사진 보다 싶이 별거 없다. 그냥  버튼 누르면 led가 1초에 한번씩 켜졌다 꺼졌다 거리고 다시 버튼 누르면 꺼짐 ㅋ

 

회로 연결은 그냥 막 인터넷 보면서 만들어서 모르겠음.  led 는 그냥 연결하면 과전류가 흘러서 led가 망가진다해서 1k 옴 저항을 달았음. 그리고 그라운드는 gpio 4번에 연결

 

버튼을 그냥 2번에서 5볼트 가져와서 버튼에 연결해서 이것도 저항으로 빼고 다시 그라운드로 연결함.. 

 

rust 라이브러리를 찾아보니 이름이  gpio 라는 라이브러리가 떡하니 있어서 그거 사용했음.

 

아래의 소스는 led 깜빡이는 소스다. 그냥 별거 없음..  그냥 쓰레드 돌리고 1초 딜레이 주고 high low 셋팅하면 깜빡 거림.

 let mut gpio20 = SysFsGpioOutput::open(20).expect("can not open 20 pin");
 let mut value = false;
 
 thread::spawn( move || loop {

    unsafe{
    	// 전역번수 때문에 unsafe 씀
        if STOP {
            gpio20.set_low().expect("can not set value to gpio 20");

            break;
        }
    }

     println!("gpio set : {}" , cnt);
     cnt = cnt +1;

     if value {
     	 // led 켜기
         gpio20.set_high().expect("can not set value to gpio 20");
     }else{
     	 // led 끄기
         gpio20.set_low().expect("can not set value to gpio 20");
     }
     
     // 1초 대기
     thread::sleep(Duration::from_millis(1000));

     value = !value;

});

아래의 소스는 버튼을 눌렀을 때  처리 소스다.

let mut gpio16 = SysFsGpioInput::open(16).expect("can not open 16 pin");
println!("loop start");
let mut clicked = false;
let mut current_value: Option<GpioValue> = None;
loop { 

    // gpio 값 가져오기 
    let rst = gpio16.read_value();

    match rst {
        // 오류 시 처리 
        Err(e) => println!("{}" ,e),
        // 오류가 아닌 경우 
        Ok(v) => {

            // 버튼을 계속 누르고 있으면 계속 호출 하게 된다.
            if current_value  == None {
                current_value = Some(v);
            } else {
                // 같은 경우에는 중지
                if current_value.expect("current is none") ==  v {
                    thread::sleep(Duration::from_millis(100));
                    continue;
                } else {
                    current_value = Some(v);
                }

            }

            // High 인 경우에는 버튼을 누르면 High가 들어고 평소에는 LOW 가 들어옴
            if v == GpioValue::High {

                // 클릭 안한 상태인 경우, 깜빡이기 시작
                if !clicked {

                    println!("led blink start!! ");
                    clicked = true;

                    set_stop(false);

                    blink_led();

                }else{

                    println!("led blink stop!! ");

                    clicked = false;

                    set_stop(true);
                }

            } 

        }
    };

    thread::sleep(Duration::from_millis(100));

}


뭐 내용은 별거 없음.

버튼 누를 때 마다 led 깜빡이는 걸 멈추거나 실행하는게 다다..

 

 

소스:

gpio_test.7z
0.95MB

 

반응형
Comments