코인기 제작
코인기를 넣고 싶었는데, 아무리 봐도 10인치 바탑에는 기존 코인기(https://goo.gl/s7XVrT)를 넣을 공간이 보이지 않았습니다.
방법이 없을까 폭풍검색하다 보니 라즈겜동에 영민님이 올리신 글(http://cafe.naver.com/raspigamer/8350)에서 힌트를 얻어 직접 제작해 보았습니다.
포토인터럽터
포토인터럽터(https://goo.gl/hEd9E2)는 적외선 센서를 통해 뭔가 지나가면 신호를 보내주는 부품입니다.
아직까지 라즈베리파이나 아두이노에 대해 무지하여 또 다시 검색해 보니 파이썬으로 라즈베리파이의 GPIO를 제어할 수가 있더군요.

- RPi.GPIO 0.6.3 : https://pypi.python.org/pypi/RPi.GPIO
코인기 구성
대략적으로 아래와 같이 동작하고 싶었습니다.
- 기존 Select 버튼 (Coin용) : Select 버튼 배선에 스위치를 달아서, 내가 할때는 Select 버튼을 활성화, 남이 할때는 비활성화
- 코인기 : 포토인터럽터를 GPIO에 연결하여 동전이 지나갈때, 기존 Select 버튼 누른것과 같은 신호를 전송
포토인터럽터 제어를 위한 파이썬 코드는 아래의 링크를 참고하였습니다.
전자적 이론이 부족하다 보니, 풀업/풀다운이 뭔지를 몰라 한참해맸는데요. 아주 쉽게 정리된 블로그가 있네요
미니바탑의 측면에는 구멍을 뚥고 코인기 슬롯으로 꾸며주었습니다.
처음에는 구글링한 이미지를 사용했는데요.
최종적으로는 코인기 슬롯에 자판기에서 사용하는 것(https://goo.gl/K4o4u3)으로 교체하였습니다.


바탑의 내부에는 동전이 지나갈 수 있도록 우드락으로 동전길을 만들어주고, 포토인터럽터를 중간에 끼워줬습니다.
동전통은 다이소에서 1000원짜리 나무그릇을 사용하였습니다.

SELECT 버튼에는 키 스위치(https://goo.gl/jzsBFm)를 연결해주었습니다.
열쇠로 잠궈두면 버튼을 통한 무한 코인은 못하게 됩니다.

GPIO 연결 및 제어
코인기를 위해 GPIO는 아래와 같이 연결하였습니다.
빨간색 네모로 표시한 부분이 포터인터럽터를 연결한 부위입니다.

파이썬에서 GPIO를 제어하기 위해 관련 패키지를 설치하였습니다.
sudo apt-get install rpi.gpio코인기를 위해 작성한 파이썬 코드입니다.
GPIO 모드를 BOARD로 설정하였고, 위의 그림처럼 COIN과 SELECT를 핀번호를 설정하였습니다.
동전이 지나가면 이벤트 핸들러가 실행되는데요. 동전으로 적외선 센서가 막혔을때 0, 동전이 지나가면 1 값이 찍힙니다.
0값일때 SELECT 버튼과 연결된 GPIO쪽으로 GPIO.LOW와 GPIO.HIGH를 출력했습니다.
import RPi.GPIO as GPIO
import time
COIN_PIN = 24
SELECT_PIN = 21
SELECT_OFF = GPIO.HIGH
SELECT_ON = GPIO.LOW
def setup():
GPIO.setmode(GPIO.BOARD)
GPIO.setup(SELECT_PIN, GPIO.OUT, initial=SELECT_OFF)
GPIO.setup(COIN_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) # Set pull up to high level(3.3V)
GPIO.add_event_detect(COIN_PIN, GPIO.BOTH, callback=detect, bouncetime=200)
def Coin(x):
# 0 : Photo-interrupter Blocked
# 1 : Photo-interrupter Released
if x == 0:
print("Coin !!")
GPIO.output(SELECT_PIN, SELECT_ON)
time.sleep(0.1)
GPIO.output(SELECT_PIN, SELECT_OFF)
def detect(chn):
Coin(GPIO.input(COIN_PIN))
def loop():
while True:
pass
def destroy():
#GPIO.output(SELECT_PIN, SELECT_OFF)
GPIO.cleanup()
if __name__ == '__main__':
setup()
try:
loop()
except KeyboardInterrupt: # When pressed 'Ctrl+C' child program destroy() will be executed.
destroy()
자동 실행
부팅시 자동으로 실행되도록 하기 위해서는 서비스에 등록할 수 있습니다.
1) /lib/systemd/system/coin.service
[Unit]
Description=RetroPie-Coin Service
After=multi-user.target
[Service]
Type=idle
ExecStart=/usr/bin/python /home/pi/kimstar/coinmachine.py
[Install]
WantedBy=multi-user.target2) 시스템 부팅시 자동실행되도록 서비스 등록
sudo systemctl enable coin.service저는 retropi 환경이므로, 그냥 쉽게 autostart.sh 에서 실행될 수 있도록 수정하였습니다.
/opt/retropie/configs/all/autostart.sh 의 맨 윗줄에 아래와 같이 등록합니다.
sudo /usr/bin/python /home/pi/kimstar/coinmachine.py &






[…] 포토인터럽터를 사용한 코인기 제작 […]