Arduino UNOで作るLCDアニメーション&ゲーム入門
必要な部品
| 部品 | 数量 |
|---|---|
| Arduino UNO | 1 |
| アルファベット数字LCD 16×2文字 | 1 |
使用ソフトウェア
- Arduino IDE
プロジェクト概要
Arduinoと16×2キャラクタLCDを使ったアニメーションの基礎から、簡単なゲーム制作までをステップバイステップで解説します。他のサイズのLCDにも応用可能です。
Step 1: LCDの配線

電源・コントラスト・制御ピン(まずはここだけ接続)
| LCDピン | 機能 | 接続先 |
|---|---|---|
| 1 | VSS (GND) | ブレッドボードのマイナスレール(Arduino GNDもこちら) |
| 2 | VDD (VCC) | ブレッドボードのプラスレール(Arduino 5Vもこちら) |
| 3 | VO (コントラスト) | ポテンショメータのワイパー(両端をプラス/マイナスレールへ) |
| 4 | RS (レジスタ選択) | Arduino D12 |
| 5 | R/W (読/書) | マイナスレール(GND固定=書き込み専用) |
| 6 | E (イネーブル) | Arduino D11 |
| 15 | A (バックライトアノード) | プラスレール(220Ω抵抗経由) |
| 16 | K (バックライトカソード) | マイナスレール |
この状態で電源を入れ、下段(2行目)が光ればLCD自体は正常です。光らない場合ははんだ付け・配線を見直し、それでもダメならLCD不良の可能性があります。
データピン(4ビットモード)
| LCDピン | 機能 | 接続先 |
|---|---|---|
| 11 | D4 | Arduino D4 |
| 12 | D5 | Arduino D5 |
| 13 | D6 | Arduino D6 |
| 14 | D7 | Arduino D7 |
動作確認スケッチ
#include <LiquidCrystal.h>
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() {}
「Working」と表示されれば配線成功です。文字化けや無表示の場合はコントラスト調整、データピンのはんだブリッジ、ピン番号の一致を確認してください。
Step 2: コード解説
LiquidCrystal lcd(12, 11, 4, 5, 6, 7);
LCDオブジェクトを生成。引数は (RS, E, D4, D5, D6, D7) の順。
lcd.begin(16, 2);
16桁×2行のLCDとして初期化。他サイズの場合は数値を変更。
lcd.setCursor(0, 1);
カーソル位置を設定(列0、行1=2行目)。C++は0始まり。
lcd.print("Welcome");
カーソル位置に文字列を出力。
Step 3: スクロールテキスト
広告看板のように右から左へ文字を流すアニメーション。
void setup() {
lcd.begin(16, 2);
}
void loop() {
int n = 15;
char message[] = "scrolling text!";
char* ptr = message;
while (n != -14) {
lcd.clear();
lcd.setCursor(n, 1);
if (n < 0) ptr++;
lcd.print(ptr);
n--;
delay(250);
}
}
ポインタ操作で文字列の表示開始位置をずらし、スクロールを実現。delay(250)で速度調整可能。
Step 4: カスタムキャラクタ(自作文字)
8×5ドットのパターンを定義して独自の絵文字を作成。
byte dino[] = {
B01110,
B01110,
B01100,
B01111,
B11101,
B01010,
B01010,
B01010
};
作成支援ツール:LCD Character Creator
表示方法
void setup() {
lcd.createChar(0, dino); // スロット0に登録
lcd.begin(16, 2);
lcd.setCursor(0, 1);
lcd.write(byte(0)); // 登録済みキャラクタを出力
}
lcd.print()では出力できず、lcd.write(byte(スロット番号))を使用します。
Step 5: 矢印アニメーション(シューティング)
3つのカスタムキャラクタ(矢尻・矢身・矢尻)を組み合わせて矢を飛ばすアニメーション。
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 };
void setup() {
lcd.createChar(0, arrowhead);
lcd.createChar(1, arrowbody);
lcd.createChar(2, arrowtail);
lcd.begin(16, 2);
}
void loop() {
int n = 15;
while (n != -1) {
lcd.clear();
lcd.setCursor(0, 1);
lcd.write(byte(0));
lcd.write(byte(1));
lcd.write(byte(2));
n--;
delay(50);
}
}
残像で矢が長く見えることがありますが仕様です。
Step 6: LCDゲーム「矢よけ」
ゲームルール
- プレイヤー(人型キャラ)は通常2行目(行1)に待機
- 右から矢が飛んでくる
- ボタン押下で1行目(行0)へジャンプ回避
- ボタン離すと2行目へ戻る
- 矢に当たるとゲームオーバー、スコア表示
キーポイント:割り込みと乱数
attachInterrupt(0, buttonin, CHANGE); // D2ピンの変化で割り込み
randomSeed(analogRead(A0)); // A0未接続のノイズをシードに真の乱数生成
割り込みにより、メインループのどこにいてもボタン入力を即座に検知。CHANGEはHIGH↔LOW両エッジで発火。
完全なゲームコード
元記事の「Code」セクションに全文掲載。主要構成:
- キャラクタ定義(矢3種+人型)
setup()で割り込み登録・乱数シード設定loop()で矢を右から左へ移動、衝突判定、スコア更新drawman()でプレイヤー描画(行切替)buttonin()割り込みハンドラで行切替stopgame()でゲームオーバー処理
回路図

発展のヒント
- ボタンを複数にして上下移動や攻撃アクションを追加
- 複数行LCD(20×4等)でより複雑なゲームを実装
- サウンド用ブザーを追加して効果音をつける
- ハイスコアをEEPROMに保存
製造プロセス
- Arduboyクローンで作る自作携帯ゲーム機 – PCB設計から実装まで
- Arduinoとスマホで作るスマート電圧計 – 簡単DIYプロジェクト
- Arduinoで温湿度ロガーを作る – DHT11とEthernetシールドでSDカード記録
- Python 3からArduino UNOを制御 – シリアル通信でLED点滅デモ
- Arduino Nanoと128x64 OLEDで実行するセルラーオートマトン「ライフゲーム」
- Arduino NanoとRDA5807Mで作るコンパクトFMラジオ
- DHT センサで作る信頼性の高い Arduino 気象ステーション
- Arduino UNOで作るクラシックLCDアーケードゲーム(ブザー・ジョイスティック付き)
- MKR1000 + DHT22: 温湿度データをAzureへリアルタイム送信
- Raspberry Pi 3とArduinoで作る自作ノートPC:ステップバイステップガイド
- Arduinoセンサー:種類、応用、実世界プロジェクト