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

Arduino Game By LCD

구성품 및 소모품

Arduino UNO
× 1
Adafruit RGB 백라이트 LCD - 16x2
× 1
브레드보드(일반)
× 1
저항 220옴
× 1
SparkFun 푸시버튼 스위치 12mm
× 1
점퍼 와이어(일반)
× 1
USB-A-B 케이블
× 1

앱 및 온라인 서비스

Arduino IDE

이 프로젝트 정보

필요한 부품은 위의 그림과 같습니다. 전원이 공급되지 않은 Arduino로 시작하십시오. USB 케이블을 연결하지 마십시오. 나중에 프로그래밍하고 게임을 시도할 때 이 작업이 수행됩니다.

연결

긴 연결선을 사용하여 Arduino의 5V 신호를 브레드보드 상단의 빨간색 행의 맨 왼쪽에 연결합니다.

긴 연결선을 사용하여 GND 신호를 브레드보드 상단의 검은색(또는 일부 브레드보드의 경우 파란색) 행의 맨 왼쪽에 연결합니다.

LCD(Liquid Crystal Display) 모듈의 아래쪽에는 16핀 수 헤더가 있습니다. 이것을 그림과 같이 브레드보드에 꽂습니다. LCD에 전원을 공급하고 제어하는 ​​모든 전자 신호는 이 헤더를 통과합니다.

이 핀은 (왼쪽에서 오른쪽으로):

<울>
  • GND - 전원 접지 신호
  • <울>
  • VCC - 양의 전원 신호
  • <울>
  • V0 - 대비 조정
  • <울>
  • RS - 등록 선택
  • <울>
  • R/W - 읽기/쓰기 선택
  • <울>
  • E - 작동 가능 신호
  • <울>
  • DB0 - 데이터 비트 0(여기에서는 사용되지 않음)
  • <울>
  • DB1 - 데이터 비트 1(여기에서는 사용되지 않음)
  • <울>
  • DB2 - 데이터 비트 2(여기서 사용되지 않음)
  • <울>
  • DB3 - 데이터 비트 3(여기에서는 사용되지 않음)
  • <울>
  • DB4 - 데이터 비트 4
  • <울>
  • DB5 - 데이터 비트 5
  • <울>
  • DB6 - 데이터 비트 6
  • <울>
  • DB7 - 데이터 비트 7
  • <울>
  • LED+ - 백라이트 LED 포지티브
  • <울>
  • LED- - 백라이트 LED 네거티브
  • 짧은 연결선을 사용하여 GND와 LED-(핀 1 및 16)를 상단의 검은색 줄에 연결합니다.

    마찬가지로 짧은 연결선으로 VCC(핀 2)를 상단의 빨간색 줄에 연결합니다.

    220Ω 저항기(적-적-갈색 띠)의 선 리드를 구부려 LED+와 브레드보드 상단의 빨간색 행 사이에 연결합니다.

    더 긴 연결선을 사용하여 나머지 연결을 만드십시오.

    <울>
  • DB7을 Arduino 핀 3에 연결
  • <울>
  • DB6을 Arduino 핀 4에 연결
  • <울>
  • DB5를 Arduino 핀 5에 연결
  • <울>
  • DB4를 Arduino 핀 6에 연결
  • <울>
  • E를 Arduino 핀 9에 연결
  • <울>
  • R/W를 Arduino 핀 10번(또는 브레드보드 상단의 검은색 행)에 연결
  • <울>
  • RS를 Arduino 핀 11에 연결
  • <울>
  • V0을 Arduino 핀 12(또는 브레드보드 상단의 검은색 행)에 연결
  • 누름 버튼을 LCD 화면 왼쪽 어딘가에 연결하고 브레드보드 중앙을 따라 흐르는 채널을 가로지릅니다(위 그림 참조). 버튼의 상단 두 핀 중 하나를 짧은 연결 와이어를 사용하여 브레드보드 상단의 검은색 행에 연결합니다. 버튼 상단의 다른 핀을 Arduino의 2번 핀에 연결합니다.

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

    코드

    <울>
  • LCD_Game.ino
  • LCD_Game.ino아두이노
    #include #define PIN_BUTTON 2#define PIN_AUTOPLAY 1#define PIN_READWRITE 10#define PIN_CONTRAST 12#define SPRITE_RUN1 1#define SPRITE_RUN2 2#define SPRITE_JUMP 3#define SPRITE_JUMP 3#define SPRITE_UPPER // 사용 '.' # 머리에 대한 문자#define SPRITE_JUMP_LOWER 4#define SPRITE_TERRAIN_EMPTY ' ' // ' ' 문자를 사용합니다.#define SPRITE_TERRAIN_SOLID 5#define SPRITE_TERRAIN_SOLID_HORIZON_DEFINITE SPRITE_TERRAIN_SOLID_1화면의 위치 PODEfine HERRAIN_7#define_LEFT TERRAIN_EMPTY 0#define TERRAIN_LOWER_BLOCK 1#define TERRAIN_UPPER_BLOCK 2#define HERO_POSITION_OFF 0 // 영웅은 투명하지 않습니다.#define HERO_POSITION_RUN_LOWER_1 1 // 영웅은 아래쪽 행에서 실행 중입니다(포즈 1). / 점프 시작#define HERO_POSITION_JUMP_2 4 // 반올림#define HERO_POSITION_JUMP_3 5 // 상단 점프#define HERO_POSITION_JUMP_4 6 // 상단 점프#define HERO_POSITION_JUMP_5 7 // 점프 상단 HEROMP_6define 8 // 점프는 상단 행#define HERO_POSITION_JUMP_7 9 // 반쯤 내려감#define HERO_POSITION_JUMP_8 10 // 착지 예정#define HERO_POSITION_RUN_UPPER_1 11 // 영웅은 위쪽 행에서 실행 중입니다. (포즈 1)#define HERO_POSITION_RUN_UPPER_2 12 // (포즈 2)LiquidCrystal lcd(11, 9, 6, 5, 4, 3);static char TerrainUpper[TERRAIN_WIDTH + 1];static char TerrainLower [TERRAIN_WIDTH + 1];static bool buttonPushed =false;void initializeGraphics(){ static byte graphics[] ={ // 위치 1 실행 B01100, B01100, B00000, B01110, B11100, B01100, B10010, B1 위치 실행 B01100, B01100, B00000, B01100, B01100, B01100, B01100, B01110, // 점프 B01100, B01100, B00000, B11110, B01101, B11111, B10000, B00000, // 점프 낮은 B11110, B01101, B11111, B10000, B00000, B00000 , B00000, B00000, // 접지 B11111, B11111, B11111, B11111, B11111, B11111, B11111, B10, B10, B0 B0101, // 접지 오른쪽 B00011, B00011, B000010, B000010 B11000, B11000, B11000, B11000, B11000, B11000, B11000, }; 정수 나; // 문자 0을 사용하여 건너뛰면 lcd.print()를 사용하여 // 여러 문자를 빠르게 그릴 수 있습니다. for (i =0; i <7; ++i) { lcd.createChar(i + 1, &graphics[i * 8]); } for (i =0; i  9999) ? 5 :(점수> 999) ? 4 :(점수> 99) ? 3 :(점수> 9) ? 2:1; // 장면 지형 그리기Upper[TERRAIN_WIDTH] ='\0'; 지형낮음[TERRAIN_WIDTH] ='\0'; 문자 온도 =지형상단[16자리]; TerrainUpper[16자리] ='\0'; lcd.setCursor(0,0); lcd.print(지형상단); TerrainUpper[16자리] =온도; lcd.setCursor(0,1); lcd.print(지형 하강); lcd.setCursor(16 - 숫자, 0); lcd.print(점수); TerrainUpper[HERO_HORIZONTAL_POSITION] =upperSave; TerrainLower[HERO_HORIZONTAL_POSITION] =lowerSave; return collide;}// 버튼 푸시를 인터럽트로 처리합니다. buttonPush() { buttonPushed =true;}void setup(){ pinMode(PIN_READWRITE, OUTPUT); 디지털 쓰기(PIN_READWRITE, 낮음); 핀모드(PIN_CONTRAST, 출력); 디지털 쓰기(PIN_CONTRAST, LOW); 핀모드(PIN_BUTTON, 입력); 디지털 쓰기(PIN_BUTTON, HIGH); 핀모드(PIN_AUTOPLAY, 출력); 디지털 쓰기(PIN_AUTOPLAY, 높음); // 디지털 핀 2는 인터럽트 0에 매핑됩니다. attachInterrupt(0/*PIN_BUTTON*/, buttonPush, FALLING); 초기화 그래픽(); lcd.begin(16, 2);}무효 루프(){ 정적 바이트 heroPos =HERO_POSITION_RUN_LOWER_1; 정적 바이트 newTerrainType =TERRAIN_EMPTY; 정적 바이트 newTerrainDuration =1; 정적 부울 재생 =false; 정적 부울 깜박임 =거짓; 정적 unsigned int 거리 =0; if (!playing) { drawHero((blink) ? HERO_POSITION_OFF :heroPos, TerrainUpper, TerrainLower, 거리>> 3); if (깜박임) { lcd.setCursor(0,0); lcd.print("시작을 누르세요"); } 지연(250); 깜박임 =!깜박임; if (buttonPushed) { initializeGraphics(); 영웅 위치 =HERO_POSITION_RUN_LOWER_1; 재생 =사실; 버튼푸시 =거짓; 거리 =0; } 반품; } // 지형을 왼쪽으로 이동 AdvanceTerrain(terrainLower, newTerrainType ==TERRAIN_LOWER_BLOCK ? SPRITE_TERRAIN_SOLID :SPRITE_TERRAIN_EMPTY); AdvanceTerrain(terrainUpper, newTerrainType ==TERRAIN_UPPER_BLOCK ? SPRITE_TERRAIN_SOLID :SPRITE_TERRAIN_EMPTY); // 오른쪽에 들어갈 새 지형을 만듭니다. if (--newTerrainDuration ==0) { if (newTerrainType ==TERRAIN_EMPTY) { newTerrainType =(random(3) ==0) ? TERRAIN_UPPER_BLOCK :TERRAIN_LOWER_BLOCK; newTerrainDuration =2 + random(10); } else { 새로운 지형 유형 =TERRAIN_EMPTY; newTerrainDuration =10 + random(10); } } if (buttonPushed) { if (heroPos <=HERO_POSITION_RUN_LOWER_2) heroPos =HERO_POSITION_JUMP_1; 버튼푸시 =거짓; } if (drawHero(heroPos, TerrainUpper, TerrainLower, 거리>> 3)) { 재생 =거짓; // 영웅이 무언가와 충돌했습니다. 너무 나빠. } else { if (heroPos ==HERO_POSITION_RUN_LOWER_2 || heroPos ==HERO_POSITION_JUMP_8) { heroPos =HERO_POSITION_RUN_LOWER_1; } else if ((heroPos>=HERO_POSITION_JUMP_3 &&heroPos <=HERO_POSITION_JUMP_5) &&TerrainLower[HERO_HORIZONTAL_POSITION] !=SPRITE_TERRAIN_EMPTY) { heroPos =HERO_POSITION_RUN_UPPER_1 } else if (heroPos>=HERO_POSITION_RUN_UPPER_1 &&TerrainLower[HERO_HORIZONTAL_POSITION] ==SPRITE_TERRAIN_EMPTY) { heroPos =HERO_POSITION_JUMP_5; } else if (heroPos ==HERO_POSITION_RUN_UPPER_2) { heroPos =HERO_POSITION_RUN_UPPER_1; } else { ++heroPos; } ++거리; digitalWrite(PIN_AUTOPLAY, 지형낮음[HERO_HORIZONTAL_POSITION + 2] ==SPRITE_TERRAIN_EMPTY ? HIGH :LOW); } 지연(100);}

    회로도

    문서가 없습니다.


    제조공정

    1. TinyML-Language Detector 기반 Edge Impulse 및 Arduino
    2. MPU-6050을 사용한 Arduino 자이로스코프 게임
    3. Arduino 디지털 주사위
    4. DIY 37 LED 룰렛 게임
    5. Arduino 게임 컨트롤러
    6. 조이스틱 게임
    7. 나를 찾기
    8. 픽셀 체이서 게임
    9. 128x64 LCD 디스플레이의 DIY 10Hz-50kHz 오실로스코프
    10. Arduino Audio Reactive Desk Light