생활

Arduino 핀볼 기계를 만드는 방법 : 15 단계 (그림 포함)

Arduino Pro IDE Debugger

Arduino Pro IDE Debugger

차례:

Anonim

당신이 나를 좋아한다면, 당신은 핀볼을 좋아하지만, 구매할 돈이 없거나 풀 사이즈 게임에 맞추기위한 공간이 없습니다. 그렇다면 자신 만의 것을 만들지 않으시겠습니까?

여기 Arduino가 제공하는 맞춤형 핀볼 게임을 만드는 방법을 살펴 보겠습니다. 이 게임에는 조명, 소리, 범퍼, 드롭 타겟, 슬링 샷을 포함한 실제 핀볼 부품이 포함되어 있으며 램프가 있습니다.

이 프로젝트는 매우 많은 양의 재료가 필요하므로 각 단계를 완료하는 데 필요한 새로운 자료에 대해서는 이후 섹션을 참조하십시오. 우선 기본적인 전자 및 하드웨어 툴킷뿐만 아니라 레이저 커터 또는 CNC 라우터에 액세스 할 수 있다면 매우 유용합니다.

작성자 주 :이 instructable은 최근에 출판되었으며 모든 설계 및 소프트웨어 파일이 완전히 정리 된 것은 아닙니다. 파일을 사용할 계획이라면 모든 것을 최신 상태로 유지할 수 있도록 의견을 남겨주십시오.

용품:

1 단계 : 디자인

위의 그림은 플레이 필드와지지 어셈블리의 Solidworks 디자인입니다. 플레이 필드는 완전히 맞춤식이지만 샷 라인 (백 루핑 샷의 커브와 같은)은 실제 핀볼 머신을 기반으로 설계되어 부드러운 플레이를 보장합니다. 여기서 하나의 난점은 복잡성으로 인해 실제 핀볼 파트 (예 : 범퍼 및 드롭 대상)가 모델링되지 않았지만 모든 것이 플레이 필드 아래에 맞는지주의해야한다는 것입니다. 부품이 훨씬 큽니다. 위보다 아래.

파일은 리포지토리에 포함되므로 멋지게 디자인을 조정하십시오.

디자인의 하이라이트 :

경기장은 42 "x 20.25"인치로 1980 년대 발리 스타일 게임 크기와 정확하게 일치합니다. 그것은 ½ "합판으로 만들어졌으며 표준이며 핀볼 부품 어셈블리가이 두께를 위해 설계되었으므로 변경하면 안됩니다. 여기 벽은 ¼ "층 위에 ½"층으로 구성됩니다. 첫 번째 프로토 타입에서는 ½ "벽만 포함되었지만 너무 짧아서 특히 딱딱한 장면에서 핀볼이 공중에 튀어 나올 수있었습니다. 두 번째로,이 디자인은 공을 경기장으로 약간 떨어 뜨릴 수는 있지만 약간 뒤로 물러 설 수는없는 위의 사수 라인을 약간 올릴 수 있습니다.

램프는 투명 아크릴 및 3D 인쇄물로 설계되었습니다. 그것은 플레이 필드를 가로 질러 플레이어가 왼쪽 플리퍼에서 연속적으로 램프를 여러 번 칠 수있는 기회를 제공합니다. 따라서 투명 아크릴은 플레이어의 테이블보기를 방해하지 않도록 사용됩니다.

마지막으로, 플레이 필드는 네 모퉁이의 짧은 벽에 의해 지원되며, 이는 플레이 필드를 표준 6.5 도의 경사면에 유지합니다. 뒤쪽 벽에는 제거 할 수있는 하단 "선반"이있어 전자 장치를 장착하는 데 사용됩니다. 풀 사이즈 플레이 필드로 게임을하게되지만 일반적인 게임보다 훨씬 콤팩트하며 한 사람이 손으로 들고 다닐 수 있습니다. 그러나 플레이 필드가 표준 크기이기 때문에 플레이 필드를 표준 핀볼 캐비닛에 넣으려면 이러한 지원을 제거 할 수 있습니다. 이렇게하려면이 디자인에 포함되지 않은 볼 반환 어셈블리를 추가하는 것이 좋습니다.

2 단계 : 목재 자르기

플레이 필드의 레이어를 자르기 위해 레이저 커터를 사용했습니다. 그러나 ½ "합판을 절단하기에 충분히 강력한 레이저 커터는 찾기가 어렵고 고품질 합판이 필요하며 조심하지 않으면 불을 낼 위험이 있습니다. 전형적인 경기장은 CNC 라우터를 사용하여 절단됩니다 - 모서리 중 일부는 선명하지 않을 수도 있지만 괜찮은 결과를 달성해야합니다. 간략하게하기 위해, 아래의 단계에서는 우리가 한 것과 동일한 레이저 커터를 사용할 수 있다고 가정합니다. 드릴과 퍼즐만을 사용하여 괜찮은 결과를 얻은 사람들이 있지만이 길로 가면 매우 조심스럽고 인내심을 가져야합니다.

플레이 필드를 만드는 첫 번째 단계는 디자인을 레이저 커터로 공급할 수있는 .DXF 파일로 변환하는 것입니다. 예를 들어, playfield .DXF 파일은 아래와 같습니다. 이 프로젝트에 사용 된 파일은 Google 저장소에 포함되어 있습니다.

레이저 커터를 사용하여 우리는 플레이 필드, ¼ "중간 레이어 (우리는 duron, 더 싼 목재와 같은 프로토 타이핑 재료를 사용했지만 ¼"합판도 사용할 수 있습니다), ½ "상단 레이어 및 ½" 지원.

필요한 자료 :

  • 플레이 필드와베이스를위한 ½ "합판
  • 중층 벽 레이어 용 ¼ "합판 또는 듀론
  • ½ ", ¾"및 1 "나무 나사
  • CNC 라우터 또는 레이저 커터에 대한 액세스

3 단계 : 플레이 필드 조립

¼ "duron 레이어의 조각을 각각의 위치에있는 합판에 고정하십시오. 핸드 드릴을 사용하여 먼저 3/32 "비트를 사용하여 파일럿 구멍을 뚫은 다음 평면 헤드 ¾"나무 나사를 사용하여 ¼ "레이어를 플레이 필드에 부착하십시오. 하향식에서 이것을 수행하는 것이 중요합니다 (예 : 나사가 처음으로 ¼ "층을 통과 한 다음 ½"베이스로), ¼ "부분이 작고 얇기 때문에 반대 방향으로 뚫었을 때베이스 층에서 멀리 구부러집니다. 스크류 헤드가 ¼ "층과 같은 높이인지 확인하고 추가 두께를 제공하지 않는 것도 중요합니다.

마지막으로,이 나사는 플레이 필드가 조립되면 플레이어가 거의 보이지 않기 때문에 거의 모든 곳으로 갈 수 있습니다. 그러나 예외가 있습니다 - 사수 레인에 나사를 넣지 마십시오. (우리는 처음에이 실수를 범했습니다.)

다음으로, 측면 벽을 부착하고 가장 긴 나무 나사를 사용하여 보드 상단에서 드릴을 돌려서 나사 머리가 상단과 같은 높이가되게하십시오. 그것이 완료되면, 1 "나사를 사용하여 바닥에서 나사못으로 죄는 것을 제외하고는, duron의 꼭대기에 ½"층 조각을 고정시키고 이전과 같이 나사로 고정하십시오. 상단 층이 ½ "두께이므로 덜 가능성이 있습니다 받침대에서 떨어져서 구부러지며 바닥에서 나사를 조이면 나사가 플레이어에게 보이지 않게됩니다.

마지막으로 2 개의 나사를 사용하여 아래쪽에서 나사를 조여 블록이 쉽게 비 틀리지 않도록 슈팅 블록 (위 그림, 사수)을 부착합니다. 슈터 블록에는 슈터에 맞는 "U"자형 슬롯이 있으며, 다른 쪽 너트를 조여서 설치할 수 있습니다. 슈팅로드와 볼 사이의 마찰을 줄이기 위해 윤활제를 사용해야 할 수도 있습니다.

디자인은이 시점에서 약간의 조정이 필요할 수 있습니다. 예를 들어, 우리 설계에서 드롭 타겟에 대한 컷이 너무 좁아서 드레 멜을 사용하여 확장해야했습니다. 참조 이상의 파일을 사용하는 경우 업데이트 된 파일을 제공 할 수있는 저자에게 문의하십시오. 또한 두 개의 나무 조각이 만나는 곳에서 거친 부분을 모래에 뿌리는 것이 좋습니다.

대부분이 부분에서 목공을 마치고 구성 요소를 넣을 수 있습니다.

필요한 자료 :

  • 3/4 인치 납작한 나무 나사
  • 슈터 어셈블리
  • 더 길고 (~ 1.5 ") 나무 나사
  • 3/32 "비트 핸드 드릴
  • 윤활유
  • 1 "플랫 헤드 나무 나사
  • 파일 및 / 또는 dremel 및 샌드페이퍼

4 단계 : 구성 요소 추가

디자인 단계의이 시점에서 모든 구성 요소가 실제로 경기장 아래에 맞는지 확인하는 데 필요한 방향에 대한 일반적인 아이디어가 있어야합니다. (우리의 디자인을 사용하는 경우 위 표의 밑면 그림을 참조하십시오).

먼저 ½ "나무 나사를 조립품의 장착 구멍에 넣어 낙하물, 스탠드 업 대상 및 새총 조립품을 설치합니다. 팝 범퍼와 동일하게하십시오. 그러나 먼저 캡을 제거해야합니다. 그렇지 않으면 조립품이 구멍에 들어 가지 않습니다!

둘째, 플리퍼 어셈블리를 설치하십시오. 그것들이 올바른 방향으로 회전하는지 확인하십시오. 솔레노이드는 발사 될 때 핀을 코일 안으로 피 웁니다. 그러면 플리퍼가 경기장을 향해 위로 회전하도록 샤프트가 회전해야합니다. 플리퍼 어셈블리가 설치되면 플리퍼 박쥐를 다른 쪽에서 부착하십시오.어셈블리의 고정 너트에 렌치를 사용하여 제자리에 조인 다음 조립품과 함께 제공 될 스프링을 사용하여 해고되지 않을 때 오리발이 뒤로 젖혀 지도록하십시오.

마찬가지로 1/2 "나사를 사용하여 모든 롤오버 스위치를 설치하십시오. 상단과 스프링에서 쉽게 밀어 넣을 수 있습니다 .6-32 볼트를 사용하여 왼쪽 상단에 게이트 스위치를 부착하십시오. 우리의 설계.이 게이트 스위치는 또한 오른쪽과 사수의 샷을 범퍼에 떨어 뜨리는 일방 통행의 통로 역할을합니다. 이것은 샷이 오른쪽 램프로 들어가고 오른쪽 루프가 다른 곳을 선택하고 더 많은 다양성을 게임에 추가합니다.

조명을 설치하려면 먼저 플라스틱 삽입물을 구멍에 삽입하십시오. 이 인서트는 약 ¼ "두께입니다. CNC 라우터를 사용하는 경우 적절한 방법은 삽입 구멍보다 약간 큰 ¼ "레이어를 자르는 것입니다. 레이저 커터는 부분적인 레이어를자를 수 없기 때문에 우리는 인서트를지지하는 3D 인쇄 브래킷을 설계했습니다. 에폭시를 사용하여 인서트를 제 위치에 놓고 (가장자리를 먼저 거칠게) 샌드페이퍼를 사용하여 인서트가 운동장과 수평을 유지하는지 확인하십시오.

그런 다음 LED를 브래킷에 넣고 제자리에 끼워 넣습니다. 그런 다음 브래킷을 제자리에 끼 우고이 LED가 각 인서트 바로 아래에 놓 이도록하십시오. 아래 링크 된 가벼운 브래킷은 매우 얇아서 실제로 1/2 "나사가 테이블 상단을 뚫을 수있을 정도로 얇습니다. 이런 일이 발생하지 않도록 두 개의 와셔를 사용하십시오.

플레이 필드 게시물 6-32 볼트를 사용하여 설치됩니다. 설치가 끝나면 수동 고무 범퍼를 만들기 위해 고무 키트에서 고무를 감싸십시오. 디자인이 완전히 합판이되는 것보다 테이블에 훨씬 더 많은 "삶"을줍니다. 동일한 볼트를 사용하여 지느러미 바로 위에 차선 가이드를 부착하십시오. 또한 게임의 끝 부분을 제자리에 붙입니다.

대부분의 게임에는 여기와 같은 전용 볼 반환 어셈블리가 있습니다. 그러나 이것은 주로 비용 때문에이 디자인에 포함되지 않았습니다. 물론, 트레이드 오프는 선수가 배수가되면 사수 레인에 공을 다시 놓을 책임이 있습니다. 그래도 우리는 사수를 가지고 있습니다, 그것은 이전에 묘사 된 것처럼 사수 블록에 붙어 있습니다.

플리퍼 버튼과 시작 버튼은 구멍에 넣고 견과류를 넣고 고정합니다. 플리퍼 버튼 리프 스위치는 6-32 볼트를 사용하여 버튼 내부에 볼트로 고정되어 있으며 버튼을 누르면 스위치 회로가 닫힙니다.

이 시점에서, 당신의 플레이 필드는 (위에서) 거의 완성 된 핀볼 테이블과 비슷합니다! 누락 된 것은 모두 경사로뿐입니다. 얼마나 많은 배선과 납땜이 필요한지 개인적으로 두려워하는 동안 친구들이 얼마나 멋진지를 떠올리십시오.

필요한 자료 (대다수는 PinballLife.com에서 구입했으며 간단히 아래 조건을 검색하여 찾을 수 있음).

  • 1 개의 3-bank 드롭 타겟 어셈블리
  • 3x 팝 범퍼 어셈블리
  • 좌측 리퍼 어셈블리 1 개
  • 1 우측 플리퍼 어셈블리
  • 플리퍼 박쥐 2 마리
  • 플리퍼 버튼 2 개
  • 2 플리퍼 버튼 상추
  • 1 시작 버튼
  • 1 개의 고무 링 세트
  • ~ 30 개의 플레이 필드 별표 (1 1/16 "사용)
  • 2 차선 가이드
  • 2 플리퍼 버튼 리프 스위치
  • 2 개의 새총 어셈블리
  • 스탠드 업 타겟 1 개
  • 롤오버 스위치 10 개
  • 8 개의 LED # 44 총검 스타일의 조명
  • 8 개의 베이어 닛 스타일 라이트 브래킷 (롱 마운팅 브래킷이있는 소형 베이 요닛베이스 2- 리드 소켓)
  • 5 1-1 / 2 "x 13/16"파란색 화살표 삽입물
  • 3 "x 3/4"클리어 탄환 삽입물
  • 6-32 볼트 (2.5 ", 더 작은 크기), 너트 및 와셔
  • ~ 2 "와이드 게이트 스위치 (여기 하나와 같은, 이것은 찾기 어려울 수 있습니다, 우리는 ebay에서 구입 한 오래된 깨진 핀볼 램프에서 우리를 폐기)

5 단계 : 경사로 건설

경사로를 만들려면 바닥 판에 ¼ "아크릴을 사용하고 측벽에는 1/8"아크릴을 사용하십시오. 투명한 아크릴은 플레이어의 플레이 필드를 보지 않고 깨끗하고 멋진 외관을 제공합니다. 컬러 아크릴을 사용하는 것도 멋진 옵션 일 수 있지만 나무와 같이 완전히 불투명 한 재료는 사용하지 않는 것이 좋습니다.

진입로에 대한 지지대는 제조업체 봇을 사용하여 3D로 인쇄되고 동일한 6-32 볼트를 사용하여 경기장과 플라스틱에 볼트로 고정됩니다.

여기에있는 아크릴 조각은 본질적으로 플라스틱을 녹여 용접하는 용제 인 아크릴 시멘트를 사용하여 함께 접착됩니다. 소량을 사용하십시오, 그리고 그것은 거의 보이지 않는 매우 강한 유대를 만들 것입니다.

진입로의 입구에는 위의 그림과 같은 진입로가 있습니다. 이것은 플라스틱의 ¼ "두께까지 핀볼을"뛰어 넘어야 "하는 대신에 경기장에서 플라스틱으로 매우 부드럽게 전환하는 얇은 금속 조각입니다. 핀볼 전문점이나 이베이 (Ebay)에서이 중 하나를 값 싸게 구입하거나, 판금으로 자신 만의 것을 하나 만들 수 있습니다. 상업용 게임에서는 볼트가 튀어 나와 공의 방해가되지 않도록주의를 기울입니다. 우리가 할 수있는 적절한 장비가 없었기 때문에, 우리는 납작 머리 나사를 사용하고 플라스틱과 금속에 구멍을 적절히 모따기하여 동일한 효과를 얻었습니다.

진입로의 전면 오른쪽 구석에있는 3D 지지대에 부착 된 좁은 게이트 스위치가 있으며,이 스위치가 경기장을 가로 질러갑니다. 이 스위치는 성공적인 램프 샷이 맞았을 때 기록합니다.

필요한 자료 :

  • 1/4 "투명 아크릴 (12x24"시트)
  • 1/2 "투명 아크릴 (12x24"시트)
  • 아크릴 시멘트
  • 3D 프린터 및 레이저 커터에 대한 액세스
  • 램프 플랩
  • 램프 플랩 용 플랫 헤드 6-32 볼트
  • 챔버 드릴 비트 또는 핸드 툴
  • 좁은 게이트 스위치

6 단계 : 전자 블록 및 핀 레이아웃 계획

(저자의 업데이트 : 확장 된 사용으로 48V가이 구성에서 일부 트랜지스터를 끊을 수 있습니다.이 전자 장치로 35V 이하를 사용하거나 여기에 나열된 것과 같은보다 전문적인 제어 보드 리소스를 사용하는 것이 좋습니다. http : // pinballmakers .com / wiki / index.php / Construction)

이 기계는 솔레노이드 전원이 48V, LED가 6.3V, 로직 및 사운드가 5V의 3 가지 전압 레벨을 가지고 있습니다. 이러한 전압 레벨을 제공하기 위해 우리는 48V 용 CNC 전원 공급 장치와 기성품 DC 어댑터를 사용하여 6.3V 및 5V를 제공했습니다. (Arduino가 5V 출력 핀에 공급 전압을 하향 조정하기 때문에 6.3V를 사용할 수도 있지만, 우리는 이들 전원 공급 장치를 절연 상태로 유지했다). 48V는 고전압이며 회로 자체에 치명적이지는 않지만 부품에 손상을 줄 수 있으며 회로에 문제가 있으면 부품이 과열 될 수 있습니다. 주 트랜지스터 48V의 입력과 출력 모두에 5-A 저속 퓨즈를 사용하여 트랜지스터가 부족할 경우 발사를 피하십시오.

Arduino shield에는 솔레노이드 드라이버 보드, 조명 / 사운드 드라이버 보드 및 입력 보드의 3 가지 서브 보드 각각의 입력 및 출력 요구 사항과 일치하도록 설계된 암 몰 렉스 커넥터가 결선되었습니다.

우리 디자인에서는 다음과 같은 핀 배열을 사용했습니다. 이것은 물론 매우 유연합니다. 핀 0은 열린 채로 남아 있습니다. (Instructables는 0으로 시작하는 numberes리스트를하지 않습니다.)

  1. 열다
  2. 열다
  3. 인터럽트 / 입력 액티브 핀
  4. 인코딩 된 입력 핀
  5. 인코딩 된 입력 핀
  6. 인코딩 된 입력 핀
  7. 인코딩 된 입력 핀
  8. 인코딩 된 입력 핀
  9. 오른쪽 범퍼 출력
  10. 중간 범퍼 출력
  11. 왼쪽 범퍼 출력
  12. 타겟 출력을 버리십시오.
  13. 플리퍼 마스터 스위치 출력
  14. 마스터 전등 스위치 출력
  15. 광 출력 핀
  16. 광 출력 핀
  17. 광 출력 핀
  18. 사운드 출력 핀
  19. 열다

우리의 디자인에서는 구현되지 않았지만, SCL 및 SDA 핀은 디스플레이 용으로 사용될 수 있으며 나머지 핀은 기능 추가 (볼 반환) 또는 더 많은 조명 조합과 같은 추가 제어에 사용될 수 있습니다.

필요한 자료 :

  • 48V CNC 전원 공급 장치 (이와 비슷한)
  • 기성품 인 6.3V 및 5V 전원 공급 장치 (이 제품과 동일)
  • 5A 저속 송풍 휴즈 및 퓨즈 홀더 및 열 수축 튜브
  • 몰 렉스 커넥터
  • Arduino 프로토 타입 쉴드 보드
  • 넉넉한 22AWG 선, 솔더 및 인내

7 단계 : 드라이버 보드 만들기

드라이버 보드는 아두 이노 (Arduino), 플리퍼 버튼 (flipper button) 및 새총 스위치 (slingshot switches)에서 입력을 돌려 코일을 발사하는 역할을 담당합니다. 신호가 5V 레벨이고 솔레노이드가 48V이기 때문에 신호를 중계하기 위해서는 상당한 전력 MOSFET이 필요합니다. 이 디자인에 사용 된 트랜지스터는 Mouser의 100V 정격 MOSFET입니다.

위 그림의 세 개 그림이 있는데, 오리발, 슬링 샷, 범퍼 / 드롭 대상이 포함됩니다. 각각은 약간 다른 요구 사항을 가지고 있지만, 모두 트랜지스터에 5V 신호가 주어지면 전류 경로가 솔레노이드에 대해 열리고 5-8 암페어가 코일을 통해 밀어 넣어 강력한 킥을줍니다. 이것은 많은 현재입니다! 사실, 트랜지스터가 매우 짧은 펄스 이상으로 계속 켜져 있다면 이러한 많은 전류가 구성 요소를 태워 버릴 것이다. 이 회로를 소프트웨어 또는 다른 방법으로 테스트 할 때 솔레노이드에 약 1 초 이상 전원을 공급하지 마십시오.

위의 회로에서 문제의 주요 원인은 유도 킥입니다. 솔레노이드는 강력한 인덕터이며, 알고 계시 겠지만 인덕터의 전류는 즉시 바뀔 수 없습니다. 따라서 트랜지스터가 꺼지면 5-8 암페어가 솔레노이드를 통해 흐르는 짧은 순간이 있으며 현재 필요한 모든 것이 필요합니다. 접지에 대한 경로가 주어지지 않으면,이 전류는 트랜지스터 드레인에서 전압을 수백 볼트까지 끌어 올려 트랜지스터를 파괴합니다. 또한 트랜지스터가 파괴되면 3 개의 단자가 모두 단락되어 연속 전류의 암페어가 흐르고 올바른 퓨즈가 설치되지 않은 경우 솔레노이드가 파괴 될 수 있습니다. (우리는 우리의 발견에서 8 개의 트랜지스터를 파괴하고이 문제를 다루려고했지만 다행스럽게도 솔레노이드가 없었기 때문에 우리는 항상 수동으로 전원을 차단했다.)

유도 킥을 방지하는 방법에는 두 가지가 있습니다. 첫째, 각 핀볼 어셈블리에는 트랜지스터 드레인 백업에서 전원 공급 장치를 가리키는 다이오드가 있어야합니다. 이것은 이론상 트랜지스터의 드레인이 전원 전압을 초과하지 못하도록 방지해야합니다. 한 번 발생하면 다이오드가 켜지고 인덕터의 나머지 모든 에너지가 소모되기 때문입니다. 불행하게도 실제로는 이러한 다이오드만으로는 유도 킥을 충분히 억제 할만큼 빠르게 켜지지 않습니다.

문제를 해결하기 위해 RC '스 너버'회로를 추가했습니다. 이 회로는 저항과 직렬로 커패시터를 갖추고 있습니다. 커패시터는 인덕터로부터 충분한 전류를 흡수하여 다이오드가 켜지고 그 기능을 수행 할 시간을 갖는다. RC 스 너버 회로에 대한 자세한 내용은 여기를 확인하십시오.

범퍼 / droptarget 솔레노이드 드라이버 회로는 매우 간단하며 Arduino에서 입력을 수신하기 위해 트랜지스터, 솔레노이드, 스 너버 및 연결 만 있습니다. 이 보드 및 후속 보드에서 다이오드 (회로도에 표시되지 않음)가 고전압 쪽을 향하도록 솔레노이드를 배선하십시오.

플리퍼 드라이버 회로는 세 가지 이유로 조금 더 복잡합니다. 먼저, 버튼 누름과 플리퍼 동작 사이에 빠른 반응을 얻기 위해 Arduino가 처리하는 별도의 입력 및 출력이 아닌 회로에서 직접 응답을 생성하는 것이 좋습니다. Arduino로 인한 지연은 적지 만 숙련 된 플레이어는 즉시 말할 수있을 것이고 컨트롤이 부족하여 좌절 할 것입니다.

두 번째로, 오리발에는 두 개의 다른 코일 (저전력 및 고출력 코일)이 있으며, 플리퍼가 높을 때 트리거되는 엔드 스트로크 스위치가 있습니다. 이 스위치는 고전력 코일이 초기에 강력한 발사를 할 수있게 해주는 중요한 기능을 수행하지만 플리퍼를 '위로'유지하기에 충분한 전력을 제공하는 저전력 코일 (~ 130 ohms vs. 4 ohms)로 전환합니다. 버튼이 놓여져있는 한 오래지만, 솔레노이드를 태우는만큼 많은 전류를 소모하지는 않습니다. 아래 그림에서 EOS 스위치는 일반적으로 닫혀 있지만 조립품에는 정상적으로 열린 스위치가있어이를 정상적으로 닫힌 신호로 변환 할 다른 트랜지스터가 필요합니다.

셋째, 버튼이 오리발을 직접 컨트롤하기를 원했지만 Arduino의 '마스터'스위치 신호가 포함되어있어 볼의 유무에 따라 오리발를 활성화 또는 비활성화 할 수있었습니다. 이것은 회로 내에 제 3 트랜지스터를 사용하게한다.

마찬가지로, 새총 게시판에는 자체적 인 복잡성이 있습니다. 단 하나의 트랜지스터 만 사용하는 반면 오리발과 마찬가지로 입력 스위치 (직렬로 연결)를 사용하여 신속하게 응답하고 Arduino에 추가 출력 핀이 필요하지 않도록해야합니다. 불행하게도, 트랜지스터의 게이트가 스위치에 직접 연결되면, 스위치가 너무 오랫동안 닫혀 있지 않기 때문에 응답이 너무 빨라서 거의 눈에 띄지 않는 킥 이상을 가질 수 있습니다. 더 강력한 킥 (예 : 슬링 샷 솔레노이드를 "따라 가기")을하기 위해 트랜지스터의 게이트에 다이오드와 커다란 저항을 추가 했으므로 신속한 응답이 가능하지만 전압 감쇠의 큰 시간 상수가 생성됩니다 이 노드에서 게이트는 5V (및 트랜지스터가 켜짐)에 가깝게 남아있어 새총 스위치가 다시 열린 후에도 눈에 띄는 차기가 발생할 수 있습니다. 또 다른 문제는이 입력을 Arduino에 보내는 것입니다. 입력 보드는 (나중에 보게 될 것입니다.) 낮은 입력을 밀어 넣으면 슬링 샷이 작동합니다. 이 문제를 해결하기 위해 입력이 높을 때마다 닫히는 제 3 트랜지스터를 포함하여 플레이 필드의 다른 입력 스위치처럼 취급 할 수 있습니다

드라이버 보드 (실제로 두 개의 보드)는 나머지 솔레노이드에 대해 두 개의 플리퍼 드라이버, 두 개의 슬링 샷 드라이버 및 네 개의 단일 스위치 드라이버로 구성됩니다. 솔더링보다는 솔더링, 파워 서플라이 및 스위치에이 보드를 부착하기 위해 0.1 "molex 커넥터를 사용했기 때문에 수리 나 조정이보다 쉽게 ​​이루어질 수있었습니다.

우리는 디자인을 위해 납땜 가능한 브레드 보드를 사용했지만 이러한 기능을 갖춘 실제 PCB를 설계하면 훨씬 더 깨끗한 결과를 얻을 수 있으며 필연적으로이 기계가 가지고있는 배선의 혼란을 줄일 수 있습니다.

기재:

  • 100V 정격 전력 트랜지스터 12 개
  • 10-50 uF 커패시터 (가능한 경우 비극성)
  • 300, 5k, 500k 및 3M 저항
  • 슬링 샷 스위치 용 소형 트랜지스터 1 개
  • 여러 1N4004 다이오드
  • 프로토 타이핑 할 수있는 브레드 보드 (또는 더 좋은 것은 자신의 PCB 디자인)

8 단계 : 센서 입력 보드 만들기

Arduino 만 사용하기 때문에 20 개의 디지털 핀으로 제한됩니다. 그러나 핀볼 머신에는 조명, 사운드 및 구동 솔레노이드에 필요한 출력은 물론, 몇 가지 고유 한 스위치 입력이 있습니다. 이 문제를 완화하기 위해 우리는 한 번에 두 개의 입력이 트리거되지 않는다는 가정을했습니다 (따라서 1 개의 공만 사용하는 것으로 제한했습니다). 이 가정은 유효 스위치 입력이 수신 될 때마다 인터럽트를 트리거 한 여섯 번째 핀을 사용하여 스위치 입력을 5 비트 2 진 레지스터로 변환하여 스위치 입력을 '인코딩'할 수있게합니다. 이를 위해 위의 그림에 표시된 레이아웃에서이 엔코더를 사용하여 24 : 5 엔코더를 만들기 위해 8 대 3 엔코더의 캐스케이드를 사용했습니다.

우리가 오리발, 범퍼 및 하나 또는 두 개의 목표물을 갖는 초기 계획에서 우리 기계의 복잡성을 크게 증가시킬 수 있었기 때문에 이것은 프로젝트의 가장 중요한 발전 중 하나였습니다.

두 번째 프로토 타입 보드를 사용하여 Molex 커넥터 24 개를 각각 배치했습니다. 플레이 필드의 각 스위치는이 보드에 꽂혀있는 긴 와이어 끝에 여성 커넥터가 있습니다. 드롭 대상은 여러 가지 방법으로 처리 할 수있는 고유 한 사례입니다. 우리가 한 것은 각각의 드롭 대상 스위치를 직렬로 연결하여 입력이 모두 내려 갔을 때 입력이 닫히고 Arduino가 드롭 타겟을 다시 작동시키기 위해 솔레노이드에 신호를 보낼 수있게하는 것입니다.

기재:

  • 4-state 출력 우선 순위 8-to-3 인코더

9 단계 : 빛 / 소리 / 점수 주변 장치 보드 만들기

인코더와 비슷한 방식으로 핀을 저장하기 위해 우리는 3-to-8 디코더를 사용하여 조명을 제어했습니다. 이로 인해 우리는 한 번에 둘 이상의 빛을 낼 수 없다는 한계를 갖게되었지만 다른 요소에 핀을 비우는 것이 허용되는 절충안이었습니다. 우리는 또한 모든 조명을 한 번에 제어 할 수있는 네 번째 "마스터"광 출력을 포함 시켰습니다. 예를 들어, 게임을 처음 켰을 때 모든 조명을 여러 번 깜박일 수 있습니다 (시작 버튼을 눌렀을 때 실제로 플레이어에게 어떤 일이 일어나고 있다는 것을 강하게 나타냅니다. 볼 트로프 또는 다채로운 디스플레이).

위의 회로도는 드라이버와 유사한 트랜지스터 회로를 특징으로하지만, 더 낮은 전압 (빛에 대해서는 6.3V)이 훨씬 더 작기 때문에 훨씬 작은 트랜지스터가 필요하며 많은 보호 회로가 필요하지 않습니다. 트랜지스터에 다이오드 OR 게이트를 사용하여 마스터 스위치 신호와 개별 광 신호를 분리했습니다. 이것은 우리가 두 개 대신 빛 하나당 하나의 트랜지스터만을 사용할 수있게 해주 며, Arduino와 인코더 칩이 전류를 소스 또는 싱크하도록 '싸우는'것을 방지합니다.

우리가 플레이 필드 라이트 (인서트 아래에있는 것들) 각각에 대해 저 전류 LED를 사용했지만, 시작 버튼과 3 개의 팝 범퍼에는 백열 전구가 각각 약 250mA를 소비했습니다. 이 트랜지스터는 530mA의 연속 전류를 제공하므로이 값을 초과하지 않도록 단일 트랜지스터를 통해 불과 2 개의 백열등을 사용했습니다.

우리는이 보드에 기본 사운드를 재생할 수있는 수동 5V 피에조 버저를 첨부했습니다.

사용자 정의 조명 및 사운드 시퀀스는 함수 light_sequence + sound_sequence 또는 핀볼 언어 인터페이스를 사용하여 프로그래밍 할 수 있습니다.

  • 10 개의 조명 트랜지스터 (우리는 이것들을 사용했다)
  • 5V 피에조 버저

10 단계 : 11 단계 : 게임 규칙 디자인

핀볼 게임의 규칙을 정의하는 데는 두 가지 옵션이 있습니다. 사용자 정의 가능한 핀볼 문서 또는 하드 코드 게임 규칙을 사용하여 게임과 상호 작용할 수 있습니다. 핀볼 문서 / 파서 시스템을 사용하면보다 유연하지만 단순한 규칙이 가능하지만 하드 코딩 된 게임 규칙을 사용하면 순차적 샷 및 시간 보너스를 비롯한 더 많은 유연성을 확보 할 수 있습니다. 구성 가능한 게임에 대한 인터페이스부터 시작하여 하드 코딩 된 게임 규칙에 대해 자세히 설명하므로 자신의 핀볼 게임에 필요한 구성을 선택할 수 있습니다.

이 프로젝트에서 참조하는 파일에 대해서는 github 저장소를 참조하십시오.

1 부. 게임 규칙 디자인

핀볼 게임을위한 기본 상태 머신이 그림에 제공됩니다.

이것은 기본 시작 코드에서 제공됩니다. 이제 기계에 대한 코드를 작성하거나 핀볼 게임에 지정된 형식을 사용하는 두 가지 옵션이 있습니다.

11 단계 : 옵션 1. 자신의 Pinball.txt 파일 쓰기

핀볼 - 텍스트 문서에서는 파트 용, 상태 용 및 동작 용의 세 부분으로 나뉩니다. 여기에서 각 구성 요소에 대한 특정 작업을 정의 할 수 있습니다. 대부분의 구성 요소의 경우, 원 상태의 상태 시스템을 고수하고 싶을 것입니다. 예를 들어, 범퍼가 부딪 칠 때마다 플레이어가 100 점을 더 획득하고 램프 표시등을 켜고 100 점을 얻으면 상태 다이어그램은 그림 1과 같은 코드로 표시됩니다. 예를 들어, 범퍼에 충돌했을 때 표시등을 켜고 다시 켜면 표시등이 꺼지기를 원한다면 상태 다이어그램 / 해당 상태는 그림 2와 같이 보일 것입니다 우리의 특정 머신은 그림 3과 같이 규칙을 정의 할 수있는 구조를 제공합니다. 이들의 이름, 내부 코드화 된 매크로 (걱정할 필요는 없지만 소스 코드를 조사하기로 결정한 경우 유용 할 수 있음) 및 인터럽트 코드는 그림 3에 나와 있습니다. 그림 4는이 이름을 플레이 필드 구성 요소에 연결합니다.

핀볼 게임 작성 팁
게임 구성 요소는 하드웨어에 의해 정의되는 특정 인터럽트 ( "pos"필드로 표시됨)에 연결되기 때문에 "states"필드 외부에서 "parts"섹션을 너무 많이 수정하지 않는 것이 좋습니다. 우리는 시작 버튼 및 게임 스위치와 같은 스코어링에 영향을 미치지 않는 구성 요소에 대해 상태 0 및 동작 0을 예약합니다. 우리 코드는 그림 5와 같습니다.

12 단계 : 조명 및 사운드 시퀀스 정의

보드의 8 개 표시등은 앞에서 설명한대로 3-8 디코더 + 마스터 스위치를 사용하여 제어됩니다. 부품 코드 하이의 바이너리 인코딩 버전에 해당하는 핀을 작성하여 특정 표시등을 켤 수 있습니다. light_sequence 도우미 함수는 사용자가 불을 켜고 자하는 빛을 지정하기위한 인터페이스를 제공하며, 매크로는 state_machine_headers.h 문서에 정의되어 있습니다. 프로그래밍 편의를 위해 테이블이 다시 제공되었습니다. 사운드의 경우 Arduino 톤 라이브러리를 사용하여 다양한 게임 이벤트의 짧은 사운드 시퀀스를 프로그래밍했습니다. executeSound (<원하는 사운드 #)를 사용하여 선택할 수있는 네 가지 사전 제작 사운드가 있습니다. 이 소리는 길고 쾌활한 시퀀스, 짧은 쾌활한 시퀀스, 짧은 슬픈 시퀀스 및 긴 슬픈 시퀀스에 해당합니다. 자신의 사운드를 프로그램하고 싶다면 여기에서 pitch.h가 리포지토리에 포함되어있는 방법을 살펴보십시오. http://www.arduino.cc/en/Reference/Tone

13 단계 : Arduino에 Pinball.txt 파일로드

일단 FSM 작성을 마치면, Arduino에 게임을로드하는 방법이 있습니다 (Mac을 사용한다고 가정). 모든 파일은 github 저장소에서 찾을 수 있습니다.

  1. arduino-serial zip 파일의 압축을 풉니 다.
  2. arduino-serial 파일을 탐색하고 여기에 게임 구성 파일을 저장하십시오. "Pinball.txt"는 사용할 수있는 샘플 템플릿을 제공합니다.
  3. Arduino를여십시오. 핀볼 게임 스케치를 업로드하십시오.
  4. 터미널을 열고 다음 명령을 입력하십시오.
    • 하다
    • ./arduino-serial -b 9600 -p pinball.txt
  5. 이제 Arduino의 내부 메모리에 데이터를 읽고 저장해야합니다. 잘못된 형식의 줄이 있으면 Arduino는 오류 메시지를 인쇄하고 파일을 다시 보낼 수 있습니다.
  6. 터미널을 사용하여 코드를 업로드하면 (예 : Arduino가 "완료된"메시지를 인쇄하면 Arduino Serial을 열고 진행중인 게임의 메시지를 읽을 수 있습니다.

소프트웨어 게임에 대한 일반적인 문제 / 최적화

  1. 하드 코딩 된 게임과 구성 가능한 게임 - 우리는 하드 코드 된 게임의 인터럽트가 사용자 지정 가능한 게임의 인터럽트보다 훨씬 정확하게 반응하는 것을 알아 챘습니다. 이는 사용자 정의 게임에 조건문이 필요한 많은 범용 기능이 있었기 때문일 수 있습니다. 이로 인해 루프의 읽기 속도가 느려졌습니다. 이로 인해 여러 번의 인터럽트가 발생하여 게임의 전반적인 작동 속도가 저하되었습니다. 이 문제를 해결하기 위해, 우리는 회로에서 수용 가능한 응답 시간을 얻기 위해 설정 파일 게임의 사용자 정의 가능성을 줄였습니다. 원래 Arduino의 RAM 용량과 저장할 수있는 게임 규칙에 대한 우려가 있었지만 원래 예상했던 것보다 문제가 적게 드러났습니다. 더 큰 제한 요소였던 루프의 속도였습니다.
  2. 디버깅 인터럽트 - 핀볼 게임의 빠른 동작 때문에 인터럽트 핀이 핀볼이 하나의 게임 구성 요소에만 부딪히는 몇 가지 인터럽트를 수신하는 몇 가지 경우가있었습니다. 또한 인코더가 모든 입력을 올바르게 읽을 시간이 있기 전에 이러한 인터럽트가 수신 되었기 때문에 인터럽트가 잘못된 구성 요소에 연결됩니다. 이 문제를 해결하기 위해 첫 번째 인터럽트가 수신 된 후 1ms 동안 응답하는 외부 디버깅 라이브러리를 사용하여 게임이 입력 코드를 읽기 전에 엔코더 핀이 하이에 도달하는 시간을 제공했습니다.
  3. 디스플레이 - 직렬 디스플레이를 사용하면 게임에서 자세한 메시지를 인쇄 할 수 있지만 빠르게 진행되는 핀볼 게임을 할 때 플레이어가 출력 메시지를 읽을 수 없습니다. 또한 플레이어가 컴퓨터를 연결하여 게임을해야하는 경우 다루기가 어렵습니다. 앞으로는 LED 매트릭스 또는 7 세그먼트 디스플레이와 같이 사용자가 쉽게 볼 수있는 디스플레이에 스코어 및 기타 게임 정보를 표시 할 수있는 디지털 디스플레이를 구현하기를 희망합니다.

14 단계 : 옵션 2 : 자신의 게임을 하드 코딩하는 것에 대한 조언

먼저 state_machine_headers.h 문서를 읽어서 상태 시스템에 대한 정보를 저장하는 전역 데이터 구조를 이해하십시오. Arduino 코드를로드하기 전에 Arduino IDE 내에서 이러한 데이터 구조를 게임 규칙으로 초기화해야합니다. 다음과 같은 데이터 구조가 제공됩니다.

각 파트에 대한 정보를 보유하는 게임 구조체 상태 전이에 대한 정보를 보유 할 상태 실행될 작업에 대한 정보를 보관하는 작업 이러한 구조는 읽기 파일로 채워집니다. 모든 핀에 대한 입력 / 출력을 정의하십시오. 인터럽트 핀은 INPUT 핀으로 정의해야합니다.

메인 루프 내에서 각 게임 구성 요소에 대해 인터럽트가 발생했는지 확인하려면 각주기를 확인하십시오. switch 문 안에 각 게임 구성 요소를 정의하십시오.

도우미 함수 executeState는 파트의 현재 상태를 업데이트하고 코딩 된 정보를 기반으로 작업을 수행합니다.

하드 코딩 된 게임 코드의 첫 번째 버전은 "simplepinballgame.ino"파일에서 찾을 수 있습니다.

15 단계 : 모든 것을 연결하십시오.

Arduino와 우리의 드라이버 보드를 인터페이스하기 위해 다른 보드의 핀에보다 쉽게 ​​접근 할 수 있도록 protoshield를 사용했습니다. 전선이 너무 많으므로 조심하십시오! Electronic Pins and Layout에있는 레이아웃을 따라 Arduino 콘센트를 해당 핀에 연결하십시오. Molex 커넥터는 어떤 커넥터가 어느 커넥터와 연결되는지 파악하는 데 많은 도움이됩니다.

다음은 자주 발생하는 문제가 발생했을 때를 대비 한 간단한 문제 해결 FAQ입니다.

입력 엔코더의 특성은 Arduino에 6 개의 입력 핀이 있다는 것입니다 : 5는 어떤 입력이 트리거되는지 보여 주며, 하나의 입력이 트리거되면 높게되는 6 번 핀입니다. 작성된 코드는이 여섯 번째 핀이 로우에서 하이로 변할 때만 감지합니다. 따라서 Arduino가 입력을받지 못하고 스위치의 전부 또는 적어도 대부분이 작동한다고 확신한다면 스위치가 닫혀 있는지 확인하십시오. 예를 들어 모든 드롭 대상이 다운되어 다시 시작되지 않은 경우 닫힌 스위치이며 Arduino가 다른 입력을받지 못하게합니다.

사수를 제 위치에 놓은 너트가 완전히 조여 졌는지, 사수 블록이 느슨한 지 확인하십시오. 또는 사수 봉에 기름을 칠하십시오.

스위치가 너무 넓은 차선에 배치되어 공이 주변을 돌아 다니게되면 기계적 / 디자인상의 문제가 될 수 있습니다. 그렇지 않으면 코드 어딘가에 지연이 너무 길어질 수 있습니다. 예를 들어, 톤 라이브러리와 delay () 문을 사용하여 톤을 재생하는 중 바쁜 경우 Arduino는 그 시간 동안 입력을 수신 할 수 없습니다. 우리가 사용한 한 가지 해결 방법은 램프 샷, 스탠드 업 타겟, 시작 버튼 및 게임 종료 스위치에 대한 사운드 만 재생하는 것이 었습니다. 새로운 입력이 트리거되기 전에 이러한 샷 이후에 얼마나 많은 시간이 걸릴지 알았 기 때문입니다 .

분명히 특정 조명이나 특정 솔레노이드에 특정 헤더를 할당하지 않았습니다. 즉, 처음에 모든 것을 연결하거나 나중에 레이블을 지정하지 않으면 이후에 출력 핀 (또는 출력 조명 인코딩)이 임의의 순서. 시험 및 오류를 사용하여 어떤 핀이 어느 출력에 해당하는지 분석하고 그에 따라 코드를 조정하십시오. 조명과 범퍼의 경우 이것은 그리 나쁘지는 않지만 모든 입력에 라벨을 붙이고 적어 둡니다.이 과정에서 최대 24 개의 값을 가질 수 있으며 보정하는 데 조금 더 시간이 걸릴 것입니다.

인코더는 5 개의 인코더 핀이 완전히 값을 결정하기 전에 인디케이터 핀을 높게 펄스하는 불행한 속성이 있습니다. 우리는 스위치를 눌렀다 떼어 놓은 횟수가 줄었을 때 발생했음을 알았지 만 다르게 나타날 수 있습니다. 우리는 스위치가 바뀌 었음을 알았을 때와 스위치가 무엇인지 기록 할 때 사이에 약간의 지연을 생성하기 위해 디 바운싱 라이브러리를 사용하여이 문제를 해결했습니다. 너무 많은 지연 (15-20mS 이상)으로 인해 투입물을 완전히 놓칠 수 있으므로 조심하십시오.

죄송하지만 아직이 솔루션에 대한 좋은 해결책을 찾지 못했습니다.