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

LCD 애니메이션 및 게임

구성품 및 소모품

Arduino UNO
× 1
영숫자 LCD, 16 x 2
× 1

앱 및 온라인 서비스

Arduino IDE

이 프로젝트 정보

이 프로젝트는 arduino와 16 x 2 lcd를 사용한 애니메이션의 기초에 중점을 둡니다. 그러나 이 프로젝트는 다른 차원의 LCD로도 확장될 수 있습니다.

먼저 arduino에 대한 lcd의 배선으로 시작한 다음 lcd에 대한 간단한 메시지 인쇄로 시작합니다. 그런 다음 애니메이션으로 넘어갈 것입니다.

LCD 배선

이것은 위에 다이어그램으로 표시된 것과 같은 회로입니다.

LCD PIN

1:VSS:브레드보드의 포지티브 레일에(5v의 arduino도 포지티브 레일에 부착)

2:VDD:브레드보드의 네거티브 레일에(여기에도 arduino의 GND를 부착)

3:VO(대조):전위차계의 와이퍼로(전위차계의 측면 단자를 양극 및 음극 레일에 부착)

4:RS(등록 선택):Arduino 핀 12

5:R/W(읽기-쓰기):음의 레일로

6:E(활성화):Arduino 핀 11에

15:A(양극):220옴 저항의 양극 레일

16:K(음극):음극 레일

지금은 데이터 핀을 부착하지 않습니다.

전원을 켜고 맨 아래 줄에 불이 들어오면 LCD가 작동하는 것입니다. 다른 작업을 시작하기 전에 이것을 테스트해야 합니다.

lcd에 불이 들어오지 않으면 납땜, 배선을 확인(재점검)하고 그래도 불이 들어오지 않으면 lcd가 손상되었을 가능성이 높으므로 교체해야 합니다.

LCD가 작동한다면 브라보! 이 튜토리얼의 첫 번째 부분을 완료하셨습니다.

그런 다음 데이터 핀을 연결합니다.

11:D4(데이터 핀 4):Arduino 핀 4로

12:D5:Arduino 핀 5로

13:D6:Arduino 핀 6으로

14:D7:Arduino 핀 7에

이 업로드 샘플 코드 이후

#include LiquidCrystal lcd(12,11,4,5,6,7);//rs,e,d4,d5,d6,d7 각각 무효 setup(){lcd.begin (16,2);lcd.setCursor(0,1);lcd.print("작업");}무효 루프(){} 

업로드 후 임의의 문자가 보이거나 전혀 표시되지 않으면 대비를 확인하고(전위차계 다이얼을 위아래로 돌림) 핀 땜납을 확인하고(데이터 핀이 서로 약간이라도 연결되어서는 안 됨) 마지막으로 회로와 라인 2를 샘플 코드(LiquidCrystal에 제공된 핀 번호가 회로의 핀 번호와 일치하는지 확인하십시오.

여전히 아무 일도 일어나지 않으면 희망을 잃지 마십시오. 첫 번째 부분에서 맨 아래 행에 불이 들어오는 것을 본다면 LCD 화면이 정상임을 의미합니다. 작동할 때까지 회로와 납땜을 가지고 놀아보세요.

"작업 중"이라는 메시지가 표시되면 LCD를 성공적으로 연결하고 이 자습서의 두 번째 부분을 완료한 것입니다. 회로를 그대로 두십시오. 더 이상 문제를 해결하지 않겠습니다. 이제 우리가 해야 할 일은 소프트웨어뿐입니다.

Part2의 코드 설명

LiquidCrystallcd(12,11,4,5,6,7);

이 줄은 인수에 제공된 대로 인터페이스 핀이 있는 lcd 개체를 선언합니다. 이제 모든 lcd 인터페이스는 이 'lcd' 개체를 통해 수행됩니다.

lcd.begin(16,2);

이 줄은 LCD 화면이 16열 2행으로 되어 있다고 선언합니다. LCD가 16x2가 아닐 수 있으므로 그에 따라 숫자를 조정하십시오.

lcd.setCursor(0,1);

이 줄은 커서를 첫 번째 열과 두 번째 행에 설정합니다(C++에서 계산은 1이 아닌 0으로 시작함). 커서가 보이지 않지만 커서는 항상 거기에 있으므로 다음 문자가 나타날 지점을 고정합니다.

lcd.print("환영합니다");

이 줄은 커서가 가리키는 위치, 즉 0 열 1 행에 Welcome 메시지를 인쇄합니다.

스크롤 텍스트

글쎄요, 우리는 화면에 메시지를 출력했지만, 같은 메시지를 바라보고 앉아 있는 것은 그다지 매력적이지 않고, 더군다나 아무 소용이 없습니다. 따라서 이 섹션에서는 광고 게시판에서처럼 오른쪽에서 왼쪽으로 스크롤되는 메시지를 인쇄합니다. setup() 및 loop() 함수만 다르므로 해당 함수만 표시하고 나머지는 모두 동일하게 유지합니다.

void setup(){lcd.begin(16,2);}void loop(){int n;char message[]="텍스트 스크롤!";n=15;char* ptr=message; 동안(n!=-14){lcd.clear(); lcd.setCursor(n,1); if(n<0){ ptr++; } lcd.print(ptr); n--;delay(250);}} 

Arduino 언어는 실제로 AVR-C++에 불과하므로 이 코드를 이해하려면 C 및 C++의 포인터에 대한 상당한 지식이 필요합니다.

루프 함수에서 우리는 당신의 메시지를 상수 문자열로 정의하고 있습니다.

lcd.clear()는 모든 반복에 대해 화면을 지우는 데 사용됩니다.

그런 다음 포인터 ptr을 설정하여 메시지 주소를 저장합니다. 이 포인터 값은 문자가 왼쪽으로 시야에서 사라진 후에도 lcd 창에 메시지를 맞추기 위해 증가합니다. 우리는 LiquidCrystal 라이브러리가 오른쪽 말단에 대해 처리할 수 있지만(텍스트 스크롤 아웃) 프로그램에 필요한 음수 열 주소를 처리할 수 없기 때문에 오른쪽 말단이 아니라 왼쪽 말단에 대해 이 작업을 수행합니다.

그런 다음 왼쪽에서 오른쪽으로 다양한 위치에 메시지를 표시하여 텍스트가 움직이는 것처럼 보이게 하는 while 루프가 있습니다. 마지막에 있는 delay()는 텍스트를 읽을 수 있고 읽을 수 없는 속도로 오른쪽에서 왼쪽으로 흔들리지 않도록 하기 위한 것입니다. 애니메이션이 너무 느리거나 너무 빠른 것 같으면 지연 값을 변경할 수 있습니다.

사용자 정의 문자

lcd.print() 함수의 모든 사용에 대해 lcd 화면에 공룡을 표시할 수 없습니다. 그러나 Custom Characters라고 하는 LiquidCrystal 라이브러리의 기능을 사용하여 이 작업을 수행할 수 있습니다.

이를 위해 다음과 같이 모든 픽셀에 대해 1이 포함되고 모든 픽셀이 꺼져 있는 경우 0을 포함하는 데이터 바이트를 정의합니다.

바이트 디노[]={B01110, B01110, B01100, B01111, B11101, B01010, B01010, B01010} 

LCD 화면에 공룡을 표시하는 커스텀 캐릭터입니다. 여기에서 자신만의 캐릭터를 만들 수 있습니다:https://maxpromer.github.io/LCD-Character-Creator/

이 후에 우리는 그것들을 표시해야 합니다. 그러나 이러한 문자는 일반 lcd.print 방법을 사용하여 표시할 수 없습니다. 이것을 사용해야 합니다:

<사전><코드> 무효 setup(){lcd.createChar(0,dino);lcd.begin(16,2);lcd.setCursor(0,1);lcd.write(byte(0));}

이 코드를 사용하여 이전에 정의한 dino[] 바이트에서 사용자 지정 주소 지정 가능한 문자를 만듭니다. 우리의 커스텀 캐릭터의 주소는 0번 캐릭터를 dino[]로 정의하는 lcd.createChar() 메소드에 의해 주어집니다. 그런 다음 이 문자를 사용자 지정 문자의 주소를 반환하는 byte(0)로 참조하고 마지막으로 lcd.Write() 메서드를 사용하여 화면에 인쇄합니다.

화살 쏘기

이 프로그램은 마침내 LCD 화면을 사용하여 애니메이션을 만드는 방법을 알려줄 것입니다. 이 내용을 주의 깊게 읽으십시오.

#include LiquidCrystal lcd(12,11,4,5,6,7);byte 화살촉[]={B00001, B00011, B00111, B01111, B00111, B000011, B000 }byte arrowbody[]={B00000, B00000, B00000, B11111, B11111, B00000, B00000, B00000}byteB00011,B00111, B01111, B01111, B101 createChar(1,arrowbody);lcd.createChar(2,arrowtail);lcd.begin(16,2);}voidintwhile(n!=-1){lcd.clear();lcd.setCursor(0,1); lcd.write(byte(0));lcd.write(byte(1));lcd.write(byte(2));n--;delay(50);}} 

여기에서는 세 개의 사용자 지정 문자를 사용하여 화살표를 시뮬레이션합니다. 나머지는 당신에게 친숙합니다. LCD에서 이것을 실행하는 동안 화살촉 뒤에 흔적이 있어 실제보다 더 길게 보일 수 있습니다. 걱정하지 마십시오. 이는 이전 화살표 위치의 잔여물일 뿐입니다.

그게 다야! Arduino와 LCD로 첫 번째 애니메이션을 완성했습니다! 코드를 가지고 놀고 이것을 버튼 입력과 결합하여 본격적인 게임으로 변환하십시오!

LCD 게임

드디어 게임을 만들 수 있습니다! 그러나 이 튜토리얼에서는 매우 복잡한 게임으로 시작하지 않고 초기 아케이드 게임과 매우 유사한 매우 간단한 게임으로 시작합니다.

이 게임의 목표

게임을 시작하기 전에 게임 플레이의 목적을 파악해야 합니다.

이 게임의 목표는 다음과 같습니다.

영웅이 있습니다. 1행(첫 번째 행은 0행입니다)(보통)에 일련의 화살이 발사됩니다. 영웅이 공격을 받으면 게임이 종료됩니다. 영웅은 버튼으로 조작할 행 0으로 점프하여 화살표를 피할 것입니다. (버튼 누름=row 0 not=row1). 점수는 루프당 증가하며 오른쪽 모서리에 표시됩니다.

이것은 실제로 앞서 설명한 화살표 애니메이션의 확장이므로 변경된 부분만 포함하겠습니다.

byte man[] ={ B01110, B01110, B00100, B01110, B10101, B00100, B01010, B10001};void setup() { // LCD의 열과 행 수 설정:lcd.createChar( 0, 화살촉); lcd.createChar(1,화살표 몸체); lcd.createChar(2, 화살촉); lcd.createChar(3,남자); lcd.begin(16, 2); attachInterrupt(0, 버튼, 변경); randomSeed(analogRead(A0)); // LCD에 메시지를 인쇄합니다. //lcd.print("hello, world!");} int n;void loop() { // 커서를 컬럼 0, 라인 1로 설정 // (참고:라인 1은 두 번째 행입니다. 0)://lcd.setCursor(0, 1); // 재설정 이후의 초 수를 출력합니다. //lcd.print(millis() / 1000); n=15; int rnd; rnd=무작위(15,25); 동안(n!=-1){ lcd.clear(); 지연(10); 드로맨(); lcd.setCursor(n,1); if(n==1){ if(레벨==1){ stopgame(); 계속하다; } } lcd.write(바이트(0)); lcd.write(바이트(1)); lcd.write(바이트(2)); lcd.setCursor(10,0); lcd.print(점수); 지연(100번째); N--; 점수++; if(레벨==0) 점수--; }}무효 drawman(){ lcd.setCursor(1,레벨); lcd.write(byte(3));} 무효 buttonin(){ if(digitalRead(2)==LOW){ 레벨=0; } else{ 레벨=1; }} stopgame(){ lcd.clear(); lcd.setCursor(0,0); lcd.print("게임 종료"); lcd.setCursor(10,0); lcd.print(점수); 레벨=1; 점수=0; n=15; 지연(3000); 반환;} 

이 코드가 모두 LCD에 관한 것은 아니지만 게임 개발자에게는 모두가 중요합니다.

man 캐릭터(우리의 영웅)에 대한 바이트를 저장할 man[]의 캐릭터 정의로 시작합니다. 그런 다음 두 줄만 변경된 설정 기능이 있습니다. 두 라인 모두 해당 라인이 속하는 광대한 그룹, 즉 인터럽트 및 난수 중 일부만을 나타냅니다. 둘 다 매우 유용한 편의 시설이며 arduino.cc 웹사이트에서 더 많은 정보를 찾을 수 있습니다.

먼저 attachInterrupt 함수가 있습니다. 제가 제공할 정의는 매우 포괄적인 정의는 아니지만 여기서 무슨 일이 일어나고 있는지 이해하려면 짧은 정의가 필요합니다.

인터럽트는 실행이 발생하는 위치에 관계없이 이벤트가 발생하면 호출할 수 있는 기능입니다. 이것은 실시간 입력 기능을 구현하는 데 유용한 중요한 사실입니다. 여기서 우리는 실행의 어느 지점에서 버튼을 누르든 관계없이 적절한 조치를 취할 것인지 확인하기 위해 이를 사용합니다(적어도 프로그램에서 수행할 것임).

attachInterrupt의 구문:

attachInterrupt(pin_number-2, function_to_call_without_parenthesis, condition_for_calling);

CHANGE는 pin_number 입력의 상태 변경에 대해 첨부된 함수가 호출됨을 나타내는 데 사용되는 #define 값입니다.

그런 다음 난수를 얻습니다. Arduino와 같은 물리적 프로세서가 갖고 있는 뛰어난 품질 중 하나는 일반 프로세서에는 없는 것입니다. Arduino에서 생성된 난수가 정말 if 핀 A0에 존재하는 아날로그 노이즈로 무작위 핀 A0은 부동(즉, 연결되지 않음)이며 양자 물리학에서 예측한 대로 무작위입니다(다소 또는 적음).

randomSeed는 랜덤 프로세스의 시드를 설정하는 데 사용됩니다. random()은 시퀀스의 다음 난수를 얻기 위해 MIN, MAX 또는 MAX 매개변수만 있는 함수입니다.

그런 다음 버튼이 눌렸는지(LOW) 누르지 않았는지(HIGH) 확인하고 그에 따라 영웅의 레벨(행)을 변경하는 인터럽트 기능 buttonin()이 있습니다.

그게 다야, 우리는 완전한 기능의 게임을 가지고 있습니다!!

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

코드

<울>
  • 애니메이션용 코드
  • 게임용 코드
  • 애니메이션용 코드Arduino
    // 라이브러리 코드 포함:#include // 필요한 LCD 인터페이스 핀을 연결하여 라이브러리를 초기화합니다. // const int rs =12, en =11, d4에 연결된 arduino 핀 번호와 연결합니다. =B4, d5 =5, d6 =6, d7 =7;LiquidCrystal lcd(rs, en, d4, d5, d6, d7);바이트 화살촉[]={ B00001, B00011, B00111, B01111, B000011, B000011 , B00000};바이트 화살촉[]={ B00000, B00000, B00000, B11111, B11111, B00000, B00000, B00000};B0,B10,10,B11,B11,B0111, B001111, B1 byte man[] ={ B01110, B01110, B00100, B01110, B10101, B00100, B01010, B10001};void setup() { // LCD의 열과 행 수 설정:lcd.createChar(0,arrowhead); lcd.createChar(1,화살표 몸체); lcd.createChar(2, 화살촉); lcd.createChar(3,남자); lcd.begin(16, 2); // LCD에 메시지를 인쇄합니다. //lcd.print("hello, world!");}void loop() { // 커서를 열 0, 줄 1로 설정 // (참고:줄 1은 두 번째 행입니다. 계산이 0부터 시작하기 때문입니다)://lcd.setCursor(0, 1); // 재설정 이후의 초 수를 출력합니다. //lcd.print(millis() / 1000); 정수 n; n=15; 동안(n!=-1){ lcd.clear(); 지연(10); lcd.setCursor(0,0); lcd.print("Debanshu Das 작성"); /* lcd.setCursor(1,1); lcd.write(바이트(3)); lcd.setCursor(n,1); lcd.write(바이트(0)); lcd.write(바이트(1)); lcd.write(byte(2));*/ delay(65); N--; }}
    게임용 코드Arduino
    // 라이브러리 코드 포함:#include // 필요한 LCD 인터페이스 핀을 연결하여 라이브러리를 초기화합니다. // const int rs =12, en =11, d4에 연결된 arduino 핀 번호와 연결합니다. =4, d5 =5, d6 =6, d7 =7;LiquidCrystal lcd(rs, en, d4, d5, d6, d7);int 수준=1;int 점수=0;바이트 화살촉[]={ B00001, B00011 , B00111, B01111, B00111, B00011, B00001, B00000};byte arrowbody[]={ B00000, B00000, B00000, B11, B11111, B111111, B00000, B00 , B11111, B00111, B00011, B00000};byte man[] ={ B01110, B01110, B00100, B01110, B10101, B00100, B01010, B10001} // LCD의 행 수 및 설정(행 수) 무효화 lcd.createChar(0, 화살촉); lcd.createChar(1,화살표 몸체); lcd.createChar(2, 화살촉); lcd.createChar(3,남자); lcd.begin(16, 2); attachInterrupt(0, 버튼, 변경); randomSeed(analogRead(A0)); // LCD에 메시지를 인쇄합니다. //lcd.print("hello, world!");} int n;void loop() { // 커서를 컬럼 0, 라인 1로 설정 // (참고:라인 1은 두 번째 행입니다. 0)://lcd.setCursor(0, 1); // 재설정 이후의 초 수를 출력합니다. //lcd.print(millis() / 1000); n=15; int rnd; rnd=무작위(15,25); 동안(n!=-1){ lcd.clear(); 지연(10); 드로맨(); lcd.setCursor(n,1); if(n==1){ if(레벨==1){ stopgame(); 계속하다; } } lcd.write(바이트(0)); lcd.write(바이트(1)); lcd.write(바이트(2)); lcd.setCursor(10,0); lcd.print(점수); 지연(100번째); N--; 점수++; if(레벨==0) 점수--; }}무효 drawman(){ lcd.setCursor(1,레벨); lcd.write(byte(3));} 무효 buttonin(){ if(digitalRead(2)==LOW){ 레벨=0; } else{ 레벨=1; }} stopgame(){ lcd.clear(); lcd.setCursor(0,0); lcd.print("게임 종료"); lcd.setCursor(10,0); lcd.print(점수); 레벨=1; 점수=0; n=15; 지연(3000); 반환;}

    회로도


    제조공정

    1. Arduino 센서 – 유형 및 애플리케이션
    2. 휴대용 게임 콘솔 | 아두보이 클론
    3. Arduino와 스마트폰을 사용한 DIY 전압계
    4. 온도 및 습도 데이터 로거
    5. Python3 및 Arduino 통신
    6. Arduino 및 OLED 기반 Cellular Automata
    7. Arduino 및 RDA8057M을 사용하는 FM 라디오
    8. Arduino 기상 관측소
    9. Arduino LCD 비디오 게임
    10. MKR1000 온습도 센서