일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Qt4
- 고속도로
- 스타2
- 스타크래프트2
- 자바
- 정성하
- 바이크
- Java
- 잡담
- QTcpServer
- HTML
- 재귀함수
- 알람프로그램
- 엑티브엑스
- 디자이어HD
- 오토바이
- android SAF
- 자료구조
- Qt OpenGL
- FFI
- 안드로이드
- c언어
- 마영전
- QT
- vuejs
- qt 설치
- 이륜차
- 윈도우7
- Qt 소켓프로그래밍
- 양평역
- Today
- Total
프로그래밍과 잡담
[Rust] Rust로 라즈베리파이 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 깜빡이는 걸 멈추거나 실행하는게 다다..
소스:
'프로그래밍 > Rust' 카테고리의 다른 글
Rust 구조체를 C#에서 사용하기 (0) | 2020.07.23 |
---|---|
[Rust] 안드로이드용 Rust 라이브러리 빌드를 위한 셋팅 (0) | 2020.07.05 |
Rust dll을 다른 언어에서 사용하기 (FFI) (0) | 2019.10.24 |