전체 source code는 아래 github 주소에 있습니다.
https://github.com/jyu9551/SmartBoardGame
GitHub - jyu9551/SmartBoardGame
Contribute to jyu9551/SmartBoardGame development by creating an account on GitHub.
github.com
스마트보드게임판 관련 글
2023.05.20 - [Projects] - [스마트 보드게임판] 1. 딥러닝을 이용해 아날로그와 디지털을 결합한 보드게임
2023.05.21 - [Projects] - [스마트 보드게임판] 2. 라즈베리파이 환경 구축 (OS설치, 원격접속)
2023.06.14 - [Projects] - [스마트 보드게임판] 3. 라즈베리파이에서 Yolov5 (설치, 학습)
2024.06.23 - [Projects] - [스마트 보드게임판] 4. 시리얼 통신, 모터 제어하기
1. 시리얼(UART) 통신하기
(라즈베리파이 기준)
라즈베리파이에서 처리한 주사위 값 결과는 시리얼 통신을 통해 게임으로 전달되고 그에 따라 게임이 진행된다.
동시에 주사위 값을 인식했다는 신호를 보드게임판에도 전달해 모터를 동작시켜 주사위가 수거되도록 해야한다. 이 때에도 시리얼 통신(UART 통신)을 사용했다. 참고로 UART가 가장 사용하기 쉬워서 사용했다.
![](https://blog.kakaocdn.net/dn/NklEB/btsIiftoro7/E65psThGWX5xigCHOiOQ91/img.png)
첫 번째로 라즈베리파이에서 주사위값 결과를 알아내고 해당 데이터를 데스크톱 게임에 보내기 위해 파이썬 코드를 작성해줘야 한다.
주사위 값을 감지하는 detect.py의 코드 수정 내역이다.
![](https://blog.kakaocdn.net/dn/qcNwe/btsH94ZnJEG/ePx2Cu9keVaem7YZJSkdY0/img.png)
UART는 비동기 방식이므로 시리얼 포트를 열고 보드레이트를 맞춰줘야하는데
보드 레이트는 9600으로 맞춰주었다. (1초에 9600개의 데이)
![](https://blog.kakaocdn.net/dn/qE1uC/btsH82Bvvsu/FAfKMRsJr9guXkZDQ0HsPk/img.png)
Detection되면 결과값들 중 가장 정확도가 높은 Detection 결과 값과 해당 결과 값의 정확도를 log로 출력해준다.
Detection 결과는 끊임없이 들어오는데 이중에 정확도가 0.7이 넘을 경우만 결과 값을 문자열로 serial write를 해주면 된다.
(Desktop기준)
데스크톱에서는 게임(.py)이 돌아가고 데스크톱은 라즈베리파이와도 통신하고 아두이노와도 통신해야한다.
![](https://blog.kakaocdn.net/dn/shslI/btsIgEVLioW/5JnJ0CJiM9Hc8RqKeseSCk/img.png)
아두이노, 라즈베리파이 각각의 포트와 보드레이트를 설정해준다.
시리얼 통신을 통해 라즈베리파이로부터 값을 받아와 주사위 값을 반환하는 함수 read_serial()을 정의했다.
![](https://blog.kakaocdn.net/dn/c4rFvW/btsIg8oyUs2/OPPoRemqrOZRIy6gJSojC1/img.png)
먼저 read_serial() 함수는 player의 턴이 돌았을 때마다 실행되며
반환한 주사위 값에 따라 게임이 진행된다.
주사위 값을 받고 난 뒤에는 아두이노 보드에 끝났다는 데이터 'r'을 보내게 되고 아두이노 보드에서 해당 데이터를 받으면 DC모터를 동작시켜 보드게임판의 문을 열었다 닫는다.
위 두 과정은 dice_roll()함수에서 실행된다.
![](https://blog.kakaocdn.net/dn/Ua0Ga/btsIihksCoG/ugPsezWkKc1u5ATskra1DK/img.png)
(아두이노 기준)
아두이노는 단순하게 데스크톱으로부터 'r' 데이터를 받으면 모터를 동작시키면 된다.
![](https://blog.kakaocdn.net/dn/EpZbm/btsIibkhEhK/aA5IZArTcBng5krYvGozc0/img.png)
![](https://blog.kakaocdn.net/dn/3m6ms/btsIgZrOsQK/EUfnbQL9c9pu8jiWGUgoTk/img.png)
2. DC모터 제어하기
![](https://blog.kakaocdn.net/dn/nEFb7/btsIhUiJYjF/znXZr1dFszsNqWfK7lboj1/img.png)
DC모터를 사용해 보드게임판의 문을 열고 닫았다. DC모터는 전압 차에 따라 회전하며 360도 회전 가능해서 스텝모터나 서보모터 대신 사용하였다.
![](https://blog.kakaocdn.net/dn/dgFISi/btsIhQgosHh/Zn0Ht8pIv5v6nPG59NoG3K/img.png)
DC모터는 전기에너지를 기계에너지로 바꾸는 장치로 두 개의 단자에 전압을 가해주면 회전한다. DC모터는 말그대로 직류로 전기가 흐르는데 이 전기가 코일에 따라 흘러 강한 전자기장을 생성하고 플레밍의 왼손 법칙에 따라 힘이 회전력을 만들게 되면서 모터가 동작한다. 중요한 것은 전압 차에 따라 회전하며, 따라서 전압의 세기에 따라 회전 속도를 조절할 수 있다. 아두이노에서는 PWM을 통해 펄스의 폭을 변조해 전압 차를 변화시켜 DC모터 회전 속도를 조절할 수 있다.
![](https://blog.kakaocdn.net/dn/FDBYP/btsIigeMQ6X/Uo4IWg3QFLebVSt5BtKDR1/img.png)
코드처럼 analogWrite에 255값을 0~255 사이의 값으로 설정하여 DC모터의 전압차를 조절할 수 있다.
'Projects' 카테고리의 다른 글
[스마트 보드게임판] 3. 라즈베리파이에서 Yolov5 (설치, 학습) (0) | 2023.07.08 |
---|---|
[스마트 보드게임판] 2. 라즈베리파이 환경 구축 (OS설치, 원격접속) (0) | 2023.05.21 |
[스마트 보드게임판] 1. 딥러닝을 이용해 아날로그와 디지털을 결합한 보드게임 (0) | 2023.05.20 |