산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

Arduino 제어 핀볼 머신

구성품 및 소모품

Arduino Mega 2560
× 1
Adafruit 2핀 LCD 디스플레이
× 1
24V 전원 공급 장치
× 1
Adafruit 힘 센서
× 1
팝 범퍼 어셈블리
× 1
팝 범퍼 스위치
× 1
대상 스위치
× 1
롤오버 스위치
× 1
플리퍼 어셈블리
× 1
LED 램프
× 1

이 프로젝트 정보

Arduino 제어 핀볼 머신

Arduino 제어 핀볼 기계를 구축하려면 목공, 기계, 전자 및 프로그래밍 기술의 조합이 필요했습니다. 만드는 데 약 6개월의 시간제 노력이 필요했고 지금까지 만든 것 중 가장 복잡한 것이었습니다. 이것은 주로 핀볼 기계를 만드는 방법에 대한 많은 정보를 찾을 수 없었기 때문입니다.

이 문서는 이 기계가 어떻게 만들어졌는지에 대한 설명을 제공합니다. 나는 당신이 당신 자신을 구축하기로 결정했다면 나보다 더 쉬운 시간을 가질 수 있도록 충분한 참조를 제공하려고 노력할 것입니다. 동시에 모든 것을 테스트해야 할 필요성을 충분히 강조할 수 없습니다. 실제 기계에 설치하기 전에 예비 조각 합판을 사용하여 모든 구성 요소의 프로토타입을 만들었습니다. 이것은 장기적으로 많은 슬픔을 덜어줄 것입니다.

사진에서 볼 수 있듯이 기계는 나무 캐비닛을 가지고 있으며 시중에서 판매되는 핀볼 기계 교체 부품을 사용합니다. 이 기계는 단일 Arduino Mega 2560 보드로 제어됩니다. 기계가 작동하는 모습을 보려면 이 링크로 이동하거나 여기에서 시청하십시오.

케이스

케이스는 집에서 구입한 참나무 합판으로 제작되었습니다. 이 문서의 모든 치수는 인치 단위입니다. 전면 및 후면 패널은 20H x 23W입니다. 측면 패널은 20H x 47L입니다. 조각은 연귀 가장자리로 자르고 비스킷 소목과 나무 접착제를 사용하여 연결했습니다. 포켓 나사와 접착제도 효과가 있었을 것입니다. 기계는 많은 남용을 받을 것이므로 강해야 합니다. 함께 결합하기 전에 바닥에서 3/4 "dado를 1 인치 위로 자릅니다. 선반을 붙이지 마십시오. 팽창과 수축을 허용하려면 떠 있어야 합니다. 선반은 메인 전원 공급 장치와 덮개 아래에 장착된 장식용 LED 조명의 전원 공급 장치를 고정하는 데 사용되었습니다. 게임 표면은 22w x 42L입니다. 캐비닛보다 훨씬 짧습니다. 이것은 플리퍼 버튼과 LED 조명까지 전선을 통과시키기 위해 약 3인치의 전방을 제공합니다. 또한 볼 플런저 메커니즘을 위한 공간을 제공합니다. 게임 표면은 케이스 상단에서 약 4인치 아래 측면에 나사로 고정된 작은 나무 블록 위에 놓입니다. 기계의 내부를 확인하려면 뚜껑을 열고 경기장을 제거하고 뒤집기만 하면 됩니다.

케이스와 플레이 표면은 모두 직각으로 제작되었습니다. 게임의 피치는 이 측면도에서 볼 수 있듯이 다리에 의해 제공됩니다. 핀볼 기계는 최소 1도에서 최대 7도까지 각도를 가질 수 있습니다. 각도가 높을수록 게임이 빨라집니다. 어떤 각도가 필요한지 확실하지 않았기 때문에 다리를 조절할 수 있도록 설계했습니다. 다리 자체는 나무로 되어 있으며 대부분의 가정용품점에서 구입할 수 있습니다. 그런 다음 오거 비트를 사용하여 각 다리 끝에 12인치 깊이의 구멍을 뚫었습니다. 하단에서 3/8인치 티 너트를 삽입하기 위해 2액형 에폭시를 사용했습니다. 나사산이나 뚫은 구멍을 막을 위치에 접착제가 묻지 않도록 주의하십시오. 그런 다음 다리에 12인치 3/8인치 나사 막대를 삽입하고 막대에 너트를 끼웠습니다. 그런 다음 끝에 수평 조절 다리를 부착했습니다. 레벨링 풋과 티 너트는 아래 링크에서 얻었습니다.

http://www.mscdirect.com/product/details/40610032

http://www.mscdirect.com/product/details/67300962

테이블 다리 장착 플레이트는 간단히 하단 선반에 나사로 고정하고 다리는 나사로 조였습니다. 기계 높이를 조정하려면 너트를 풀고 나사 막대를 조이거나 빼기만 하면 됩니다. 그런 다음 너트를 다시 조여 테이블이 고정되도록 합니다.

사진에서 전기 코드와 USB 케이블이 보입니다. 전기 코드는 기기 뒷면에 부착한 멀티탭에서 나옵니다. 모든 것이 거기에 연결되어 하나의 스위치로 모든 것을 켜거나 끌 수 있습니다. USB 케이블이 있어 경기장을 제거하지 않고도 Arduino 보드를 다시 프로그래밍할 수 있습니다.

뚜껑

뚜껑 프레임은 오크로 만들어졌으며 캐비닛과 동일한 치수입니다. 상단과 측면 너비는 1.5인치이고 하단 너비는 5인치입니다. 하단의 추가 너비는 경기장과 캐비닛 사이의 간격을 숨기는 데 사용됩니다. Plexiglas 덮개를 고정하기 위해 프레임 조각의 내부 가장자리를 따라 다도가 실행되었습니다. 유리 대신 플렉시글라스를 사용했는데, 그 이유는 더 가볍고 안전하며 자르기 쉽기 때문입니다. 덮개는 포켓 나사를 사용하여 결합되었습니다. Plexiglas를 교체해야 할 경우에 대비하여 분해할 수 있도록 했습니다. 또한 장식용으로 뚜껑 아래에 다채로운 LED 조명 스트립을 설치했습니다. 마지막으로 뚜껑과 케이스 모두에 끼워 넣은 피아노 경첩을 사용하여 케이스에 뚜껑을 장착했습니다.

아두이노

Arduino Mega 2560은 기본적으로 4가지 작업을 수행합니다. 스위치가 활성화되면 그에 따라 조명을 켜거나 끄고 득점을 추적하고 작은 LCD에 점수와 볼 번호를 표시합니다. 대부분의 배선은 매우 간단합니다. 예를 들어 대상은 Arduino의 디지털 입력 중 하나와 접지에 연결됩니다. 입력은 아래와 같이 구문을 사용하여 구성됩니다.

핀모드(Pin_Number,INPUT_PULLUP)

코드가 입력이 높음에서 낮음으로 변경되었음을 감지하면 대상이 맞았음을 알고 적절한 LED 핀볼 조명을 켭니다.

이것의 유일한 합병증은 Pop Bumpers입니다. 이 게임에 사용된 롤오버 스위치와 대상은 모두 Arduino에서 전원을 얻습니다. 팝 범퍼는 Arduino가 공급할 수 있는 것보다 더 많은 주스가 필요하므로 별도의 25볼트 전원 공급 장치에서 얻습니다. Pop Bumpers에는 스위치가 활성화되어 있지만 높은 전압 때문에 직접 읽을 수 없습니다. 따라서 먼저 Pop Bumper 스위치의 출력을 전압 분배기로 보냅니다. 전압 분배기의 예는 아래 링크에서 찾을 수 있습니다.

전압 분배기

전압 분배기를 통과하면 전압이 5V로 감소하고 Arduino가 이를 처리할 수 있습니다. 전압 분배기가 항상 약간의 전류를 누출하는 것처럼 보이기 때문에 아날로그 입력을 사용하는 경우 잘못된 판독값이 적다는 것을 알았습니다. 아날로그 입력을 사용하여 임계값이 초과되었는지 확인할 수 있으므로 신호와 노이즈를 쉽게 분리할 수 있습니다.

플레이하는 동안 특정 유형의 장치(타겟, 팝 범퍼 또는 롤오버)가 모두 활성화된 경우 해당 장치의 모든 조명을 깜박이도록 Arduino를 프로그래밍한 다음 점수를 높였습니다.

또한 작은 힘 센서를 사용하여 공을 분실했을 때 알 수 있었습니다. 이를 통해 플레이한 공의 수를 추적하고 게임이 끝나는 시점을 결정할 수 있습니다. 게임이 끝나면 모든 표시등이 차례로 깜박입니다.

마지막으로 아두이노를 이용하여 점수와 공번호를 표시해보았습니다.

첨부된 배선 다이어그램은 각 주요 구성 요소 중 하나가 어떻게 배선되었는지 보여줍니다. 다이어그램이 모두 표시되면 너무 혼란스러울 것입니다.

전원 공급 장치

핀볼 구성 요소에 전원을 공급하기 위해 24볼트 전원 공급 장치를 사용했습니다. 이 부대는 오리발과 조수들에게 충분한 힘을 가지고 있었습니다. 팝 범퍼에는 조금 약합니다. 이를 위해 더 강력한 전원 공급 장치를 사용할 수 있습니다. 그렇게 하면 최대 25볼트의 전압 분배기만 찾을 수 있으므로 자신만의 전압 분배기를 만들어야 합니다. 전압 분배기를 만드는 방법에 대한 정보는 여기에서 찾을 수 있습니다.

모든 것을 전원 공급 장치에 직접 연결하는 대신 경기장 아래쪽에 장착하는 것보다 전선을 한 쌍의 버스 바에 연결했습니다. 이를 통해 다양한 구성 요소를 훨씬 쉽게 연결할 수 있습니다. Slingshot 섹션의 두 번째 사진에서 버스 바 중 하나를 볼 수 있습니다. 전기 부서의 홈 스토어에서 구입할 수 있습니다.

볼 슈터 또는 플런저

볼 슈터 또는 플런저는 다음 링크에서 구매했습니다.

http://www.marcospecialties.com/pinball-parts/B-12445

플런저가 통과하려면 케이스 전면에 구멍을 뚫어야 합니다. 그런 다음 케이스 내부에 나사로 고정됩니다. 플런저가 경기장과 적절하게 정렬되도록 세심한 주의를 기울여야 합니다. 경기장에 직선 모서리를 놓고 케이스 내부에 닿는 지점을 표시하십시오. 그런 다음 플런저의 중간 높이가 핀볼 높이의 절반과 같도록 충분히 올라갑니다. (핀볼은 1인치 및 1/16인치 크기이며 핀볼에서 구매 가능합니다.)

경기장

경기장은 ¼인치 자작나무 합판으로 만들어졌습니다. 게임을 더 장식적으로 만들기 위해 아래 나사 링크에서 사진을 구입했습니다.

http://hubblesite.org/gallery/printshop/ps35/

먼저 합판에 접착식 접착제를 뿌린 다음 그 위에 포스터를 라미네이트했습니다. 그런 다음 뒤집어서 크기에 맞게 잘라냈습니다.

오리발

오리발은 아래 링크에서 구입했습니다.

http://www.pinballlife.com/index.php?p=product&id=172

대부분의 핀볼 구성 요소를 구입할 때 유용한 지침이 제공되지 않는 경향이 있습니다. 오리발을 배선하는 방법은 아래 그림과 같습니다. 이 링크에서 가져왔습니다.

플리퍼 메커니즘 외에도 플리퍼 배트, 플리퍼 스위치 및 버튼이 필요합니다.

새총

전체 새총 어셈블리는 여기에서 찾을 수 있습니다. 핀과 고무줄도 필요합니다. 같은 위치에서 찾을 수 있습니다. 또한 아래에 장착된 새총의 사진이 표시됩니다. 24볼트 전원 공급 장치에 연결된 모든 구성 요소에 16게이지 와이어가 사용되었고 Arduino 보드에 연결하는 데 22게이지 와이어가 사용되었음을 지적해야 합니다.

첫 번째 사진은 오리발 배트 옆에 있는 금속 레일도 보여줍니다. 레일을 살 수 있는 곳이 없어서 직접 만들었습니다. 나는 홈 스토어에서 찾은 일부 크롬 스틸 와이어를 사용했습니다. 잔디밭에 살충제를 뿌렸을 때 표시하는 데 사용되었습니다. 나는 철사를 자르고 구부렸다. 그런 다음 경기장에 구멍을 뚫고 레일을 제자리에 에폭시로 고정했습니다.


팝 범퍼

팝 범퍼 어셈블리는 여기에서 구입할 수 있습니다. 스위치와 캡도 필요합니다. 팝 범퍼는 3개의 구멍을 뚫어서 설치됩니다. 2개는 금속 지지 막대용이고 1개는 스위치를 작동시키는 샤프트용입니다. 공이 평면도에서 볼 수 있는 흰색 원반 속으로 굴러갈 때 샤프트를 아래로 밀어냅니다. 그러면 리프 스위치가 트리거되어 솔레노이드가 활성화됩니다. 그런 다음 솔레노이드는 반대 방향으로 공을 보내는 금속 링을 아래로 당깁니다.

대상, 롤오버 스위치 및 조명

대상은 아래 링크에서 확인하실 수 있습니다.

http://www.marcospecialties.com/pinball-parts/A-14691-5

롤오버 스위치 및 마운트는 아래에서 찾을 수 있습니다.

http://www.actionpinball.com/parts.php?item=A-12687

내가 사용한 램프는 더 이상 만들지 않았지만 동등한 것은 아래에 표시됩니다.

http://www.actionpinball.com/parts.php?item=LED4555

아래에 표시된 램프 마운트도 필요합니다.

http://www.actionpinball.com/parts.php?item=077-5030-00

이 모든 배선은 기본적으로 동일하며 Arduino 섹션에서 언급했습니다.

요약

일단 시작하면 추가하고 싶은 다른 종소리와 휘파람을 분명히 찾을 수 있지만 이것이 시작해야합니다.

<섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

코드

<울>
  • Arduino 핀볼 기계 코드
  • Arduino 핀볼 기계 코드Arduino
    Arduino가 집에서 만든 핀볼 기계의 게임 플레이를 제어할 수 있도록 합니다.
     const int TxPin =17; 긴 점수 =0; 긴 OldScore =0; 긴 대상 =1; 긴 팝 =1; 긴 롤 =10; int 대상[8]; int 롤[3]; 정수 팝[4]; 정수 밀리 =10; 정수 합계 =0; 정수 플래시 =100; 정수 공 =0; 정수 i=0; 정수 샷 =0; 손실 =0; 정수 압력 =1024; #include ;SoftwareSerial mySerial =SoftwareSerial(255, TxPin);void setup() { /* s가 없는 단어는 장치와 상호 작용하여 얻은 값입니다. * s와 함께 작동하여 어떤 개인이 상호 작용했는지 추적합니다. * 후자는 모두 적중되고 값을 업그레이드해야 하고 * 조명을 꺼야 할 때를 결정하는 데 필요합니다. */ 핀모드(TxPin, 출력); 디지털 쓰기(TxPin, HIGH); mySerial.begin(9600); mySerial.write(12); // 삭제 mySerial.write(17); // 백라이트 켜기 //대상 입력 pinMode(2,INPUT_PULLUP); 핀모드(3,INPUT_PULLUP); 핀모드(4,INPUT_PULLUP); 핀모드(5,INPUT_PULLUP); 핀모드(6,INPUT_PULLUP); 핀모드(7,INPUT_PULLUP); 핀모드(8,INPUT_PULLUP); 핀모드(9,INPUT_PULLUP); //롤오버 입력 pinMode(10,INPUT_PULLUP); 핀모드(11,INPUT_PULLUP); 핀모드(12,INPUT_PULLUP); //하단 볼 샷 스위치 pinMode(15,INPUT_PULLUP); //어퍼볼 샷 스위치 pinMode(16,INPUT_PULLUP); //LCD 출력 pinMode(17,OUTPUT); //대상 조명, 각각의 pinMode(32,OUTPUT); 핀모드(33, 출력); 핀모드(34, 출력); 핀모드(35, 출력); 핀모드(36, 출력); 핀모드(37, 출력); 핀모드(38, 출력); 핀모드(39, 출력); //롤오버 조명, 각각의 pinMode(40,OUTPUT); 핀모드(41, 출력); 핀모드(42, 출력); //범퍼 라이트 팝 pinMode(50,OUTPUT); 핀모드(51, 출력); 핀모드(52, 출력); pinMode(53,OUTPUT);}void loop() { // 여기에 메인 코드를 넣어 반복적으로 실행합니다. //풀다운 저항을 사용하는 경우 입력 핀은 스위치가 열려 있을 때 LOW이고 스위치가 열려 있을 때 HIGH입니다. 스위치가 닫혀 있습니다. //타겟이 적중되었는지 확인//****** Targets ***** for (int i=0; i<8; i++){ if (digitalRead(i+2) ==LOW){ / /대상 활성화 대상[i]=1; 점수 =점수 + 목표; //타겟 라이트 켜기 digitalWrite(i+32,HIGH); //한 번의 히트로 여러 포인트를 얻지 못하도록 지연합니다. delay(Milli); 부서지다; } } 합계 =0; for (int i=0; i<8; i++){ Sum =Sum + Targets[i]; } if (Sum ==8){ //모든 대상이 켜져 있으므로 깜박인 다음 끕니다. for (int j=0; j<3; j++){ for (int i=0; i<8; i++){ digitalWrite(i+32, LOW); } 지연(플래시); for (int i=0; i<8; i++){ digitalWrite(i+32, HIGH); } 지연(플래시); } for (int i=0; i<8; i++){ digitalWrite(i+32, LOW); 타겟[i]=0; } 지연(플래시); //목표값에 10을 곱합니다. Target =Target * 5; // 이동 ​​건너뛰기; } // *********** 롤오버 ********* for (int i=0; i<3; i++){ if (digitalRead(i+10) ==LOW) { //롤오버 활성화 Rolls[i]=1; 점수 =점수 + 롤; //롤오버 라이트 켜기 digitalWrite(i+40,HIGH); //한 번의 히트로 여러 포인트를 얻지 못하도록 지연합니다. delay(Milli); 부서지다; } } 합계 =0; for (int i=0; i<3; i++){ Sum =Sum + Rolls[i]; } if (Sum ==3){ //모든 롤오버가 켜져 있으므로 깜박인 다음 끕니다. for (int j=0; j<3; j++){ for (int i=0; i<3; i++){ digitalWrite(i+40, LOW); } 지연(플래시); for (int i=0; i<3; i++){ digitalWrite(i+40, HIGH); } 지연(플래시); } for (int i=0; i<3; i++){ digitalWrite(i+40, LOW); 롤[i]=0; } 지연(플래시); //점수에 2를 곱합니다. Score =Score * 2; 롤 =롤 * 10; // 이동 ​​건너뛰기; } //********** 팝 범퍼 ********** for (int i=0; i<4; i++){ if (analogRead(i)> 500){ / /pop 활성화 Pops[i]=1; 점수 =점수 + 팝; //팝 범퍼 라이트 켜기 digitalWrite(i+50,HIGH); //하나의 히트에 대해 여러 포인트를 얻지 않도록 지연 //mySerial.print(analogRead(i)); //mySerial.print(" "); 지연(밀리); 부서지다; } } 합계 =0; for (int i=0; i<4; i++){ Sum =Sum + Pops[i]; } if (Sum ==4){ //모든 팝 범퍼가 켜져 있으므로 깜박인 다음 끕니다. for (int j=0; j<3; j++){ for (int i=0; i<4; i++){ digitalWrite(i+50, LOW); } 지연(플래시); for (int i=0; i<4; i++){ digitalWrite(i+50, HIGH); } 지연(플래시); } for (int i=0; i<4; i++){ digitalWrite(i+50, LOW); 팝[i]=0; } 지연(플래시); //목표값에 10을 곱합니다. Pop =Pop * 2; // 이동 ​​건너뛰기; }건너뛰기://볼 번호 결정 if (digitalRead(15) ==LOW){ //볼 히트 하단 골목 스위치 //아직 수행하지 않은 경우 볼 증가 if (Shot ==0){ //Set Lost =0 압력 패드가 없기 때문에 Lost =0; 압력 =analogRead(7) + 20; //LCD에 볼 값을 다시 출력하도록 OldScore를 설정합니다. OldScore =-1; 공 =공 + 1; if (볼 ==6){ 볼 =1; 점수 =0; 목표 =1; 롤 =1; 팝 =1; } 샷 =1; } } if (digitalRead(16) ==LOW){ //볼 히트 하단 골목 스위치 //아직 수행하지 않은 경우 볼 증가 if (Shot ==0){ //압력 패드에 있지 않기 때문에 Lost =0으로 설정 Lost =0; 압력 =analogRead(7) + 15; //LCD에 볼 값을 다시 출력하도록 OldScore를 설정합니다. OldScore =-1; 공 =공 + 1; if (볼 ==6){ 볼 =1; 점수 =0; 목표 =1; 롤 =1; 팝 =1; } 샷 =1; } } if (analogRead(7)> Pressure){ //압력 패드의 공 Shot =0; if (분실 ==0){ //mySerial.print(analogRead(7)); //점수 =점수 + 100; 분실 =1; if (Ball ==5){ //게임 오버 //플래시 롤오버 후 끕니다. for (int j=0; j<3; j++){ for (int i=0; i<3; i++){ digitalWrite(i+40, LOW); } 지연(플래시); for (int i=0; i<3; i++){ digitalWrite(i+40, HIGH); } 지연(플래시); } for (int i=0; i<3; i++){ digitalWrite(i+40, LOW); 롤[i]=0; } // 팝 범퍼를 플래시한 다음 끕니다. for (int j=0; j<3; j++){ for (int i=0; i<4; i++){ digitalWrite(i+50, LOW); } 지연(플래시); for (int i=0; i<4; i++){ digitalWrite(i+50, HIGH); } 지연(플래시); } for (int i=0; i<4; i++){ digitalWrite(i+50, LOW); 팝[i]=0; } //대상을 플래시한 다음 끕니다. for (int j=0; j<3; j++){ for (int i=0; i<8; i++){ digitalWrite(i+32, LOW); } 지연(플래시); for (int i=0; i<8; i++){ digitalWrite(i+32, HIGH); } 지연(플래시); } for (int i=0; i<8; i++){ digitalWrite(i+32, LOW); 타겟[i]=0; } mySerial.write(12); // 지연 지우기(5); // 필요한 지연 mySerial.print(Score); // 첫 번째 줄 mySerial.write(13); // 폼 피드 mySerial.print("게임 오버!!!"); // 두 번째 줄 } } } //LCD에 인쇄 if (Score !=OldScore){ mySerial.write(12); // 지연 지우기(5); // 필요한 지연 //mySerial.print(analogRead(7)); mySerial.print(점수); // 첫 번째 줄 mySerial.write(13); // 폼 피드 mySerial.print("Ball ="); // 두 번째 줄 mySerial.print(Ball); OldScore =점수; }}

    회로도


    제조공정

    1. Raspberry Pi / 홀로그램 SMS 제어 AC 전원 스위치
    2. Bluetooth를 통해 제어되는 Raspberry Pi Robot
    3. 제스처 제어 대화형 테이블 조명
    4. ARDUINO를 사용하는 초음파 부상 기계
    5. Raspberry Pi를 통한 Alexa 제어 LED
    6. 조이스틱 제어 RC 자동차
    7. Nunchuk 제어 로봇 팔(Arduino 포함)
    8. 무선 조명 스위치 조작기
    9. 음성 제어 로봇
    10. Arduino Apple Watch