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

ATtiny85 미니 아케이드:뱀

구성품 및 소모품

Microchip Technology ATtiny85
× 1
그래픽 OLED, 128 x 64
× 1
SparkFun microB USB 브레이크아웃
× 1
Arduino Nano R3
× 1

필요한 도구 및 기계

납땜 인두(일반)
3D 프린터(일반)

앱 및 온라인 서비스

오토데스크 퓨전 360
Arduino IDE

이 프로젝트 정보

영감과 과거 프로젝트

2017년 12월, 저는 Arduino Nano와 OLED 화면과 두 개의 버튼을 사용하는 휴대용 Arduino Pong 콘솔을 만들었습니다.

당시에는 괜찮았지만 콘솔이 너무 크고 거추장스러웠습니다. 그러나 최근에 나는 과거 프로젝트 중 일부를 재창조하려고 노력하고 있습니다. 이번에는 사람들이 스네이크 게임을 할 수 있는 아주 작은 콘솔을 만들고 싶었습니다.

선택된 구성요소

콘솔을 작게 만들기 위해 아두이노 개발 보드를 사용할 수 없어서 ATtiny85를 선택했습니다.

ADC 핀 2개, I2C 포트 및 GPIO 핀을 포함하여 게임을 실행하기에 충분한 I/O가 있습니다. 간단한 2축 조이스틱/스위치 모듈을 사용하기로 결정했습니다. 인터페이스가 쉽고 신호용으로 3개의 핀만 필요하기 때문입니다.

마지막으로 어떤 디스플레이가 필요한지 결정할 때였습니다. DFRobot의 128 x 64 OLED 화면은 크기는 작지만 해상도는 충분하기 때문에 선택했습니다.

시스템 납땜

시작하려면 ATtiny85를 SOP-8에서 DIP-8 브레이크아웃 PCB에 연결하고 작은 성능 보드 조각에 납땜했습니다. 다음으로 두 개의 헤더를 납땜했습니다. 하나는 프로그래밍용이고 다른 하나는 화면용입니다. 그런 다음 아날로그 조이스틱의 핀을 성능 보드에 연결하고 그에 따라 배선했습니다. 마지막 단계에서는 전원을 공급하기 위해 마이크로 USB 브레이크아웃 보드를 시스템의 나머지 부분에 연결했습니다.

인클로저 설계

인클로저는 Fusion 360으로 설계되었습니다. 먼저 실제 빌드에 사용한 구성요소를 만들고 배치한 다음, 이를 중심으로 인클로저를 만들었습니다.

80년대 아케이드 박스를 모방하고 싶었지만 여전히 매우 작은 크기를 유지하고 있습니다. 다음은 인클로저의 일부 렌더링입니다.

게임 프로그래밍

Snake는 프로그래밍하기 상당히 쉬운 게임입니다. RAM을 절약하기 위해 최대 스네이크 길이를 30으로 설정했습니다. 즉, 스네이크가 29픽셀을 먹으면 플레이어가 승리합니다. 뱀의 세그먼트를 추적하기 위해 각 세그먼트에 대해 순서쌍을 저장하는 2차원 배열을 만들었습니다.

헤드가 새 위치로 이동할 때마다 이전 위치가 아래로 계단식으로 내려갑니다. 세그먼트가 소모될 때마다 임의의 지점에 새로운 세그먼트가 생성됩니다. 충돌 검사는 각 세그먼트의 좌표를 반복하고 헤드의 좌표가 동일한지 확인하여 수행됩니다. 또한 벽을 따라 뱀을 치면 플레이어도 패배하게 됩니다.

스네이크 재생

나는 콘솔의 전원을 켜고 화면이 음식과 뱀의 첫 번째 부분에 로드되기를 기다리는 것으로 시작했습니다. 그런 다음 나는 음식을 먹는 것을 보면서 조이스틱을 올바른 방향으로 움직여 뱀을 조종했습니다. 이 게임은 플레이하는 재미가 있으며 작은 패키지에 들어 있어 지루함을 없애줍니다.

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

코드

<울>
  • ATTiny85 코드
  • ATTiny85 코드C/C++
    U8g2lib를 먼저 설치해야 합니다.
    //#include #include U8G2_SSD1306_128X64_NONAME_1_SW_I2C u8g(U8G2_R0,/* clock=ONE) 2, / data=_/IN U8_reset;#define MAX_LENGTH 30 //30 세그먼트 max#define X 0#define Y 1#define JOYSTICK_X 2#define JOYSTICK_Y 3#define DIR_THRESH 300 //값은 0-300 또는 723-1023이어야 합니다. 2];uint8_t 헤드 위치[2] ={63, 31}; // 시작 부분에 뱀을 배치합니다. startuint8_t foodPosition[2]; //음식이 있는 곳uint8_t tempPosition0[2]; //nexuint8_t에 전달할 이전 세그먼트의 위치를 ​​저장합니다. tempPosition1[2]; //다음에 전달할 이전 세그먼트의 위치를 ​​저장합니다. segmentLength =1;void gameUpdate();enum DIRECTIONS { RIGHT, DOWN, LEFT, UP} currentDirection;void setup() { //TinyWireM.begin(); u8g.begin(); u8g.setPowerSave(0); 핀모드(JOYSTICK_X, 입력); 핀모드(JOYSTICK_Y, 입력); randomSeed(analogRead(0)); beginGame();}무효 루프() { u8g.firstPage(); { gameUpdate(); u8g.setColorIndex(1); } while(u8g.nextPage());}beginGame(){ 현재방향 =오른쪽; 스폰푸드(); delay(1000);}bool checkCollisions(){ for(int i=1; i=128) return 1; else if(headPosition[Y] <=0 || headPosition[Y]>=64) return 1; 반환 거짓;} 무효 spawnFood(){ int randomX =random(5, 123); int randomY =random(5, 60); foodPosition[X] =randomX; foodPosition[Y] =randomY;} 무효 checkFoodEaten(){ if(headPosition[X] ==foodPosition[X] || headPosition[Y] ==foodPosition[Y]){ segmentLength +=1; 스폰푸드(); }} 무효 updateDirection(){ int joy_x_val =analogRead(JOYSTICK_X); int 기쁨_y_val =analogRead(JOYSTICK_Y); if(joy_x_val <=DIR_THRESH) 현재 방향 =왼쪽; else if(joy_x_val>=1023-DIR_THRESH) 현재 방향 =오른쪽; else if(joy_y_val <=DIR_THRESH) currentDirection =UP; else if(joy_y_val>=1023-DIR_THRESH) currentDirection =DOWN;} 무효 displaySegments(){ for(int segment=0; segment =MAX_LENGTH) endGame(); 지연(50);} 무효 endGame(){ segmentLength =1; 머리 위치[0] =63; 헤드포지션[1] =31; 시작 게임();}

    맞춤형 부품 및 인클로저

    회로도


    제조공정

    1. TinyML-Language Detector 기반 Edge Impulse 및 Arduino
    2. MPU-6050을 사용한 Arduino 자이로스코프 게임
    3. Arduino 디지털 주사위
    4. DIY 37 LED 룰렛 게임
    5. 휴대용 거리 감지기
    6. Arduino Audio Reactive Desk Light
    7. 구리로 전기도금
    8. NeoMatrix Arduino Pong
    9. 광 시퀀스 생성기
    10. 스마트 플러그