제조공정
| × | 1 | ||||
| × | 1 | ||||
| × | 4 | ||||
| × | 4 | ||||
| × | 1 | ||||
| × | 12 | ||||
| × | 4 | ||||
| × | 4 | ||||
| × | 1 |
|
소개
우리 모두는 올바른 조명 순서에 해당하는 버튼을 눌러 조명 순서를 복사하려고 하는 오래된 Simon Says 게임을 보았습니다. Hackster Live의 경우 Upverter라는 PCB 설계 도구를 선보였습니다. 이것은 PCB를 만들고 바꾸는 재미있고 간단한 프로젝트입니다. 다음은 하드웨어와 코드로 완성된 게임 제작을 보여주는 기본 프로젝트입니다.
이 프로젝트 시리즈에는 세 부분이 있습니다.
<울>
이 시리즈에서 배울 내용 <울>
소프트웨어
Arduino에 코드를 작성하고 업로드하기 위한 Arduino IDE가 없는 경우 여기에서 운영 체제의 최신 버전을 다운로드하십시오.
하드웨어 설정
Sparkfun의 Inventor 's Kit 예제를 하드웨어 설정에 대한 영감으로 사용하고 약간 조정했습니다. 아래 Fritzing 다이어그램을 확인하십시오.
코드
이 게임의 재미있는 점은 다양한 변형이 가능하다는 것입니다. 위에서 언급했듯이 Sparkfun의 예제를 하드웨어 설정의 시작점으로 사용하고 코드를 처음부터 작성했습니다. 자신의 코드를 작성하는 것이 관심 있는 것이 아닌 경우 아래의 코드를 사용하거나 위에서 언급한 예제에서 Sparkfun의 코드를 약간 조정하여 사용하거나 다른 Simon이 하드웨어 설정에서 작동하는 게임/코드를 검색할 수 있습니다. .
게임이 실행되는 동안 직렬 모니터에서 무슨 일이 일어나는지 볼 수 있도록 자세한 설명과 디버깅 직렬 인쇄 라인을 내 코드에 포함했습니다. 아래에서 Simon Says 게임 실행 동영상을 확인하세요!
Simon은 게임 비디오를 말합니다.
*참고:이 영상에서는 이기기 위해 필요한 연속 조명 수를 5개로 설정했습니다. 게임을 더 어렵게 만들기 위해 변경할 수 있지만 상대적으로 영상을 짧게 유지하고 싶었습니다 :).
이제 브레드보드를 PCB로 만들 준비가 되었습니다! Breadboard to PCB Part 2 - Upverter를 사용하여 PCB 설계에서 방법을 알아보세요.
섹션> <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">int ledArray[] ={12, 9, 5, 2};// ledArray[0]은 녹색, ledArray[1]은 빨간색, ledArray[2]는 노란색, ledArray[3]은 파란색입니다. int buttonArray[] ={13, 10, 6, 3};// buttonArray[0]은 녹색, buttonArray[1]은 빨간색, buttonArray[2]는 노란색, buttonArray[3]은 파란색입니다. 정수 핀 수 =4; // ledArray와 buttonArray는 모두 같은 pinCount를 가집니다 --> 버튼과 led 모두에 이것을 사용합니다 int buzzer =8; 정수 ledState =0; int 게임 상태 =0; #define NUMBERTOWIN 5 //이기기 위해 매치해야 하는 조명의 수 --> 이 숫자를 변경하여 게임에서 승리하기가 다소 어렵게 만들 수 있습니다. int gameValues[NUMBERTOWIN]; 정수 roundNum =0; unsigned long previousMillis =0; //지연 없이 불빛을 깜박이는 게임 전 상태에 필요 --> 지연을 사용하면 게임을 시작하기 위해 버튼을 누르는 것이 감지되지 않을 수 있습니다. unsigned long interval1 =500; // 깜박임 사이에 시간이 필요함 // 함수 선언void setLed(int ledNum);void displayClue(int roundNum);boolean waitForInput(int buttonNum); 무효 설정 () {Serial.begin(9600);Serial.println("설정"); for(int Pin =0; Pin섹션>function setLed()는 ledNum이 <0이면 led가 LOW임을 나타냅니다. setLed(-1); // 라운드 번호를 0으로 설정하여 첫 번째 라운드에서 시작하도록 합니다. roundNum =0; 지연(1000); // gameState를 1로 설정 gameState =1; } } if (gameState ==1) { gamePlay(); } if (gameState ==2) { //당신이 이겼습니다!! - 승리하는 소리를 재생하고 LED(winDisplay)를 3번 스크롤한 다음 좋은 전환을 위해 디스플레이를 한 번 잃습니다. //플레이어에게 버튼 누름을 놓을 시간을 주기 위해 지연 시간을 제공한 후 승리한 사운드가 재생됩니다. delay(500); win_sound(); 윈디스플레이(); 윈디스플레이(); 윈디스플레이(); 분실디스플레이(); Serial.println("윈디스플레이"); // pre_game을 실행하기 전에 잠시 지연합니다. delay (1000); // pre_game을 호출하기 위해 gameState를 0으로 재설정 gameState =0; } if (gameState ==3) { //당신은 잃습니다 :( - 좋은 전환을 위해 손실된 사운드를 재생하고 LED(loseDisplay)를 3번 깜박입니다. // 플레이어가 사운드를 잃기 전에 버튼 누름을 해제할 시간을 주기 위해 지연 재생 지연(500);losing_sound();losDisplay();losDisplay();losDisplay(); Serial.println("loseDisplay"); //pre_game delay(1000)를 실행하기 전에 잠시 지연; // pre_game을 호출하기 위해 gameState를 0으로 재설정 gameState =0; } }//pre_gamevoid pre_game(){ //부호 없는 LED를 켜는 LED 사이에 충분한 시간이 경과했는지 확인합니다. ledState ==0) { Serial.println("전 녹색"); setLed(0); ledState =1; } else if (ledState ==1) { Serial.println("전 빨간색"); setLed(1); ledState =2; } else if (ledState ==2) { Serial.println("전 노란색"); setLed(2); ledState =3; } else if (ledState ==3) { Serial.println("전 파란색 "); setLed(3); ledState =0; } //시간 재설정 previousMillis =currentMillis; }}//게임이 재생되는 동안에 대한 함수 무효 gamePlay(){ Serial.println("gamePlay"); // 게임을 위한 난수 배열을 미리 로드합니다. for ( int i=0; i 버튼이 눌려지면 나머지 코드로 이동 if (!button0 || !button1 || !button2 || !button3) { //버튼을 두 번 계산하는 것을 방지하기 위해 잠시 지연 버튼 누름 지연( 250); //버튼을 눌렀을 때 해당 LED를 켭니다. if (buttonNum ==0) { digitalWrite(ledArray[0], HIGH); 지연(250); digitalWrite(ledArray[0], LOW); } else if (buttonNum ==1) { digitalWrite(ledArray[1], HIGH); 지연(250); digitalWrite(ledArray[1], LOW); } else if (buttonNum ==2) { digitalWrite(ledArray[2], HIGH); 지연(250); digitalWrite(ledArray[2], LOW); } else if (buttonNum ==3) { digitalWrite(ledArray[3], HIGH); 지연(250); digitalWrite(ledArray[3], LOW); } // 올바른 버튼을 눌렀는지 확인 if (buttonNum ==0 &&button0 ==0) { Serial.println("0 Pressed"); true를 반환합니다. } else if (buttonNum ==1 &&button1 ==0) { Serial.println("1 누름"); true를 반환합니다. } else if (buttonNum ==2 &&button2 ==0) { Serial.println("2 누름"); true를 반환합니다. } else if (buttonNum ==3 &&button3 ==0) { Serial.println("3 누름"); true를 반환합니다. } else { false를 반환합니다. } } }}//승리 후 - 조명이 빠르게 스크롤됩니다.void winDisplay(){digitalWrite(ledArray[0], HIGH);delay(75);digitalWrite(ledArray[0], LOW);delay(75);digitalWrite(ledArray [1], HIGH);delay(75);digitalWrite(ledArray[1], LOW);delay(75);digitalWrite(ledArray[2], HIGH);delay(75);digitalWrite(ledArray[2], LOW );delay(75);digitalWrite(ledArray[3], HIGH);delay(75);digitalWrite(ledArray[3], LOW);delay(75);digitalWrite(ledArray[2], HIGH);delay(75) );digitalWrite(ledArray[2], LOW);delay(75);digitalWrite(ledArray[1], HIGH);delay(75);digitalWrite(ledArray[1], LOW);delay(75);digitalWrite(ledArray [0], HIGH);delay(75);digitalWrite(ledArray[0], LOW);delay(75);}void win_sound(void){ //tone(핀 번호, 주파수 - 찾기 위해 온라인에서 찾았습니다. 내가 원하는 음표의 주파수, 조정 시간) Serial.println("buzzer1"); 톤(부저, 294, 250); 지연(200); 톤(부저, 294, 250); 지연(200); 톤(부저, 294, 250); 지연(200); 톤(부저, 392, 500); 지연(500); Serial.println("초 392"); 톤(부저, 392, 250); 지연(200); 톤(부저, 440, 250); 지연(200); 톤(부저, 392, 250); 지연(200); 톤(부저, 440, 250); 지연(200); 톤(부저, 494, 500);}무효 손실 표시(){ digitalWrite(ledArray[0], HIGH); digitalWrite(ledArray[1], HIGH); digitalWrite(ledArray[2], HIGH); digitalWrite(ledArray[3], HIGH); 지연(200); digitalWrite(ledArray[0], LOW); digitalWrite(ledArray[1], LOW); digitalWrite(ledArray[2], LOW); digitalWrite(ledArray[3], LOW); delay(200);}무효 손실_사운드(무효){ Serial.println("losing_sound"); 톤(부저, 98, 250); 지연(250); 톤(부저, 93, 250); 지연(250); 톤(부저, 87, 250); 지연(250);}
제조공정
더 작고 웨어러블한 회로에 대한 높은 수요로 인해 임베디드 시스템의 판매가 꾸준히 증가하고 있습니다. 또한 임베디드 시스템은 표준 PCB가 처리할 수 없는 보다 복잡한 애플리케이션을 생성하는 데 도움이 됩니다. 그렇다면 임베디드 시스템의 힘을 감당할 수 있는 것은 무엇일까요? 단순한! 임베디드 PCB. 이 보드는 신호 무결성 손실 가능성을 줄이는 임베디드 구성 요소를 사용합니다. 하지만 그게 다가 아닙니다. 임베디드 시스템과 작동 방식에 대해 배워야 할 다른 사항이 많이 있습니다. 임베디드 PCB와 임베디드 시스템에 영향을 미치
2019년 1월 3일 BGA(Ball Grid Array) 패키지는 인쇄 회로 기판(PCB) 설계 및 제조 산업에서 매우 인기를 얻고 있습니다. 이 패키지는 PCB의 크기를 줄이는 데 도움이 될 뿐만 아니라 기능을 향상시킵니다. BGA는 제품의 크기 감소로 인한 증가하는 압력을 견딜 수 있지만 유지 보수 및 수리가 거의 필요하지 않습니다. BGA 패키지는 어떻게 수리합니까? BGA 재작업과 관련된 단계는 무엇입니까? 이 게시물은 이러한 질문에 답하기 위한 것입니다. BGA 조립의 전체 과정을 알아보려면 계속 읽으십시오. BGA