工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

LCDアニメーションとゲーム

コンポーネントと消耗品

>
Arduino UNO
× 1
英数字LCD、16 x 2
× 1

アプリとオンラインサービス

>
Arduino IDE

このプロジェクトについて

このプロジェクトは、arduinoと16 x 2lcdを使用したアニメーションの基本に焦点を当てています。ただし、このプロジェクトは他の次元の液晶ディスプレイにも拡張できます。

まず、液晶ディスプレイをarduinoに配線し、次に液晶ディスプレイにメッセージを簡単に印刷します。次に、アニメーションに移ります。

LCD配線

<図>

これは、上に図式的に示されている回路です。

LCDピン

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が破損している可能性が高いため、交換する必要があります。

液晶が機能する場合は、ブラボー!このチュートリアルの最初の部分を終了しました。

この後、データピンを接続します:

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それぞれvoid setup(){lcd.begin (16,2); lcd.setCursor(0,1); lcd.print( "Working");} void loop(){}  

アップロード後、ランダムな文字が表示されるか、まったく表示されない場合は、コントラストを確認し(ポテンショメータのダイヤルを上下に回します)、ピンはんだを確認します(データピンは少しでも接続しないでください)。最後に、回路とライン2を入力します。サンプルコード(LiquidCrystalに提供されているピン番号が回路のピン番号と一致していることを確認してください。

それでも何も起こらない場合は、希望を失わないでください。最初の部分で一番下の行が点灯しているのを確認した場合は、液晶画面に問題がないことを意味します。回路が機能するまで、回路とはんだ付けをいじってみてください。

「Working」というメッセージが表示された場合は、液晶ディスプレイが正常に配線され、このチュートリアルの2番目の部分が終了しています。回路はそのままにしておいてください。もう混乱することはありません。今やらなければならないのはソフトウェアだけです。

パート2のコードの説明

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

この行は、引数で指定されたインターフェイスピンを持つlcdオブジェクトを宣言します。これで、すべてのlcdインターフェースがこの「lcd」オブジェクトを介して実行されます(これには任意の名前を付けることができますが、その名前はずっと維持することに注意してください)。

lcd.begin(16,2);

この行は、液晶画面のサイズが16列2行であることを宣言しています。液晶は16 x 2でない場合があることに注意してください。それに応じて、数値を調整してください。

lcd.setCursor(0,1);

この行は、カーソルを最初の列と2番目の行に設定します(C ++でのカウントは1ではなく0から始まります!)。カーソルは見えませんが、カーソルは常にそこにあり、次の文字が表示される場所を修正することに注意してください。

lcd.print( "Welcome");

この行は、カーソルが指している場所、つまり0列1行にWelcomeというメッセージを出力します。

テキストのスクロール

さて、画面にメッセージを印刷しましたが、同じメッセージを見つめて座っているのはあまり魅力的ではなく、しかも何の役にも立ちません。したがって、このセクションでは、広告ボードのように右から左にスクロールするメッセージを印刷します。 setup()関数とloop()関数のみが異なるため、これらの関数のみを表示し、残りはすべて同じままです。

  void setup(){lcd.begin(16,2);} void loop(){int n; char message [] ="scrolling text!"; n =15; char * ptr =message; while(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画面に恐竜などを表示することはできません。ただし、これは、カスタム文字と呼ばれるLiquidCrystalライブラリの機能を使用して行うことができます。

このために、次のように1バイトのデータを定義します。whcihには、オンのすべてのピクセルに1が含まれ、オフのすべてのピクセルに0が含まれます。

  byte dino [] ={B01110、B01110、B01100、B01111、B11101、B01010、B01010、B01010}  

これはカスタムキャラクターで、LCD画面に恐竜を表示します。ここで独自のキャラクターを作成できます:https://maxpromer.github.io/LCD-Character-Creator/

この後、それらを表示する必要があります。ただし、これらの文字は通常のlcd.printメソッドを使用して表示することはできません。これを使用する必要があります:

  void 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()メソッドを使用して画面に出力します。

射撃の矢

このプログラムは、最終的に液晶画面を使用してアニメーション化する方法を教えてくれます。これを注意深く読んでください。

  #include  LiquidCrystal lcd(12,11,4,5,6,7); byte arrowhead [] ={B00001、B00011、B00111、B01111、B00111、B00011、B00001、B00000 } byte arrowbody [] ={B00000、B00000、B00000、B11111、B11111、B00000、B00000、B00000} byteB00011、B00111、B01111、B11111、B11111、B01111、B00111、B00011} voidlcd.createChar(0、arrowhead); lcd。 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);}}  

ここでは、3つのカスタム文字を使用して矢印をシミュレートします。残りはおなじみです。これを液晶ディスプレイで実行していると、アローテールの後ろにトレイルがあり、実際よりも長く見える場合があります。うっとうしいことはありません。これは、以前のアロー位置の残りの部分にすぎません。

それでおしまい! ArduinoとLCDを使った最初のアニメーションが完成しました!コードをいじって、これをボタン入力と組み合わせて、これを本格的なゲームに変換してください!

LCDゲーム

いよいよゲームが作れます!ただし、このチュートリアルでは、非常に複雑なゲームから始めるのではなく、初期のアーケードゲームと非常によく似た非常に単純なゲームから始めます。

このゲームの目的

ゲームを開始する前に、ゲームプレイの目的を理解する必要があります。

このゲームの目的は次のとおりです。

一連の矢が発射される主人公、1列目(最初の列は0列目であることに注意)(通常)の人物がいます。ヒーローがヒットした場合、ゲームオーバーです。主人公は、ボタンで操作する行0にジャンプして、矢印を回避します。 (ボタンpress =row 0 not =row1)。スコアはループごとにインクリメントされ、右隅に表示されます。

これは実際には初期の矢のアニメーションの拡張であるため、変更された部分のみを含めます。

  byte man [] ={B01110、B01110、B00100、B01110、B10101、B00100、B01010、B10001}; void setup(){// LCDの列と行の数を設定します:lcd.createChar( 0、矢じり); lcd.createChar(1、arrowbody); lcd.createChar(2、arrowtail); lcd.createChar(3、man); lcd.begin(16、2); attachInterrupt(0、buttonin、CHANGE); randomSeed(analogRead(A0)); //メッセージをLCDに出力します。 //lcd.print("hello、world! ");} int n; void loop(){//カーソルを列0の1行目に設定します//(注:カウントはで始まるため、1行目は2行目です0)://lcd.setCursor(0、1); //リセットからの秒数を出力します://lcd.print(millis()/ 1000); n =15; int rnd; rnd =random(15,25); while(n!=-1){lcd.clear(); delay(10); drawman(); lcd.setCursor(n、1); if(n ==1){if(level ==1){stopgame();継続する; }} lcd.write(byte(0)); lcd.write(byte(1)); lcd.write(byte(2)); lcd.setCursor(10,0); lcd.print(score); delay(100-rnd); n--;スコア++; if(level ==0)スコア-; }} void drawman(){lcd.setCursor(1、level); lcd.write(byte(3));} void buttonin(){if(digitalRead(2)==LOW){level =0; } else {level =1; }} void stopgame(){lcd.clear(); lcd.setCursor(0,0); lcd.print( "ゲームオーバー"); lcd.setCursor(10,0); lcd.print(score);レベル=1;スコア=0; n =15; delay(3000); return;}  

このコードのすべてが液晶に関するものではありませんが、ゲーム開発者にとってはすべてが重要です。

まず、manキャラクター(ヒーロー)のバイトを格納するman []のキャラクター定義から始めます。次に、2行だけが変更されたセットアップ機能があります。両方の線は、それらが属する広大なグループの一部、つまり割り込みと乱数を表しています。どちらも非常に便利なアメニティであり、詳細についてはarduino.ccWebサイトを参照してください。

まず、attachInterrupt関数があります。ここで説明する定義はそれほど包括的なものではありませんが、ここで何が起こっているのかを理解するには短い定義が必要です。

割り込みは、実行が発生している場所に関係なく、イベントの発生時に呼び出すことができる機能です。これは、リアルタイム入力関数を実装するのに役立つ重要な事実です。ここでは、実行のどの時点でボタンが押されても、適切なアクションを実行することを確認するために使用します(少なくともプログラムは実行します)。

attachInterruptの構文:

attachInterrupt(pin_number-2、function_to_call_without_parenthesis、condition_for_calling);

CHANGEは、pin_number入力の状態が変化すると、接続されている関数が呼び出されることを示すために使用される#define値です。

次に、乱数があります。 Arduinoのような物理プロセッサが通常のプロセッサにはない優れた品質の1つは、Arduinoによって生成された乱数が本当にであるということです。 ピンA0に存在するアナログノイズとしてランダム if ピンA0はフローティング(つまり、接続されていない)であり、量子物理学によって予測されるようにランダムです(多かれ少なかれ)。

randomSeedは、ランダムプロセスのシードを設定するために使用されます。 random()は、シーケンス内の次の乱数を取得するためだけに、パラメーターMIN、MAX、またはMAXを持つ関数です。

次に、ボタンが押されているか(LOW)、押されていないか(HIGH)をチェックし、それに応じてヒーローのレベル(行)を変更する割り込み関数buttonin()があります。

これで、完全に機能するゲームができました!!

コード

  • アニメーションのコード
  • ゲームのコード
アニメーションのコード Arduino
 //ライブラリコードを含める:#include  //必要なLCDインターフェイスピンを関連付けてライブラリを初期化する//接続されているarduinoピン番号constint rs =12、en =11、d4 =4、d5 =5、d6 =6、d7 =7; LiquidCrystal lcd(rs、en、d4、d5、d6、d7); byte arrowhead [] ={B00001、B00011、B00111、B01111、B00111、B00011、B00001 、B00000}; byte arrowbody [] ={B00000、B00000、B00000、B11111、B11111、B00000、B00000、B00000}; byte arrowtail [] ={B00011、B00111、B11111、B11111、B11111、B00111、B00011、B00000}; byte man [] ={B01110、B01110、B00100、B01110、B10101、B00100、B01010、B10001}; void setup(){// LCDの列と行の数を設定します:lcd.createChar(0、arrowhead); lcd.createChar(1、arrowbody); lcd.createChar(2、arrowtail); lcd.createChar(3、man); lcd.begin(16、2); //メッセージをLCDに出力します。 //lcd.print("hello、world! ");} void loop(){//カーソルを列0の1行目に設定します//(注:カウントは0から始まるため、1行目は2行目です): //lcd.setCursor(0、1); //リセットからの秒数を出力します://lcd.print(millis()/ 1000); int n; n =15; while(n!=-1){lcd.clear(); delay(10); lcd.setCursor(0,0); lcd.print( "by Debanshu Das"); / * lcd.setCursor(1,1); lcd.write(byte(3)); lcd.setCursor(n、1); lcd.write(byte(0)); lcd.write(byte(1)); lcd.write(byte(2)); * / delay(65); n--; }} 
ゲームのコード Arduino
 //ライブラリコードを含める:#include  //必要なLCDインターフェイスピンを関連付けてライブラリを初期化する//接続されているarduinoピン番号constint rs =12、en =11、d4 =4、d5 =5、d6 =6、d7 =7; LiquidCrystal lcd(rs、en、d4、d5、d6、d7); int level =1; int score =0; byte arrowhead [] ={B00001、B00011 、B00111、B01111、B00111、B00011、B00001、B00000}; byte arrowbody [] ={B00000、B00000、B00000、B11111、B11111、B00000、B00000、B00000}; byte arrowtail [] ={B00011、B00111、B11111、B11111 、B11111、B00111、B00011、B00000}; byte man [] ={B01110、B01110、B00100、B01110、B10101、B00100、B01010、B10001}; void setup(){// LCDの列と行の数を設定します: lcd.createChar(0、arrowhead); lcd.createChar(1、arrowbody); lcd.createChar(2、arrowtail); lcd.createChar(3、man); lcd.begin(16、2); attachInterrupt(0、buttonin、CHANGE); randomSeed(analogRead(A0)); //メッセージをLCDに出力します。 //lcd.print("hello、world! ");} int n; void loop(){//カーソルを列0の1行目に設定します//(注:カウントはで始まるため、1行目は2行目です0)://lcd.setCursor(0、1); //リセットからの秒数を出力します://lcd.print(millis()/ 1000); n =15; int rnd; rnd =random(15,25); while(n!=-1){lcd.clear(); delay(10); drawman(); lcd.setCursor(n、1); if(n ==1){if(level ==1){stopgame();継続する; }} lcd.write(byte(0)); lcd.write(byte(1)); lcd.write(byte(2)); lcd.setCursor(10,0); lcd.print(score); delay(100-rnd); n--;スコア++; if(level ==0)スコア-; }} void drawman(){lcd.setCursor(1、level); lcd.write(byte(3));} void buttonin(){if(digitalRead(2)==LOW){level =0; } else {level =1; }} void stopgame(){lcd.clear(); lcd.setCursor(0,0); lcd.print( "ゲームオーバー"); lcd.setCursor(10,0); lcd.print(score);レベル=1;スコア=0; n =15; delay(3000); return;} 

回路図


製造プロセス

  1. Arduinoセンサー–タイプとアプリケーション
  2. ハンドヘルドゲームコンソール| Arduboyクローン
  3. Arduinoとスマートフォンを使用したDIY電圧計
  4. 温度および湿度データロガー
  5. Python3とArduinoコミュニケーション
  6. ArduinoおよびOLEDベースのセルオートマトン
  7. ArduinoとRDA8057Mを使用したFMラジオ
  8. Arduino Weather Station
  9. ArduinoLCDビデオゲーム
  10. MKR1000温度および湿度センサー
  11. RaspberryPiとArduinoラップトップ