Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Buat Animasi LCD dan Game Menarik dengan Arduino UNO

Komponen dan Perlengkapan

KomponenJumlah
Arduino UNO1
LCD Alphanumeric, 16 x 21

Aplikasi dan Layanan Online

Tentang Proyek Ini

Proyek ini berfokus pada dasar-dasar animasi menggunakan Arduino dan LCD 16 x 2. Namun, proyek ini juga dapat diperluas ke LCD dengan dimensi lain.

Pertama kita akan memulai dengan penambangan kabel LCD ke Arduino, kemudian dengan pencetakan pesan sederhana ke LCD. Kemudian kita akan melanjutkan ke animasi.

Penambangan Kabel LCD

Buat Animasi LCD dan Game Menarik dengan Arduino UNO

Ini adalah sirkuit sebagaimana ditunjukkan secara diagram di atas.

PIN LCD

1:VSS:ke rel positif papan roti (sambungkan 5V Arduino ke rel positif juga)

2:VDD:ke rel negatif papan roti (sambungkan GND Arduino di sini juga)

3:VO(kontras):ke pengayun potensiometer (sambungkan sisi terminal potensiometer ke rel positif dan negatif)

4:RS(register select):ke pin Arduino 12

5:R/W(baca-tulis):ke rel negatif

6:E(enable):ke pin Arduino 11

15:A(anoda):ke rel positif dengan resistor 220 ohm

16:K(katoda):ke rel negatif

Kami tidak akan memasang pin data saat ini.

Nyalakan daya dan jika baris bawah menyala, maka LCD Anda berfungsi. Anda harus menguji ini sebelum memulai apa pun.

Jika LCD tidak menyala, periksa solder, penambangan kabel(periksa kembali) dan jika masih tidak menyala, sangat mungkin LCD Anda rusak, jadi Anda perlu menggantinya.

Jika LCD Anda berfungsi, Bagus! Anda telah menyelesaikan bagian pertama dari tutorial ini.

Setelah ini, hubungkan pin data:

11:D4(pin data 4):ke pin Arduino 4

12:D5:ke pin Arduino 5

13:D6:ke pin Arduino 6

14:D7:ke pin Arduino 7

Setelah ini unggah kode contoh

#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,4,5,6,7);//rs,e,d4,d5,d6,d7 masing-masing
void setup(){
  lcd.begin(16,2);
  lcd.setCursor(0,1);
  lcd.print("Working");
}
void loop(){
}

Setelah mengunggah jika Anda melihat karakter acak atau sama sekali tidak ada, periksa kontras Anda (putar dial potensiometer ke atas dan ke bawah), periksa solder pin Anda (pin data TIDAK boleh terhubung satu sama lain bahkan sedikit), dan akhirnya sirkuit Anda dan baris 2 dalam kode contoh (pastikan bahwa nomor pin yang diberikan ke LiquidCrystal cocok dengan yang ada di sirkuit Anda.

Jika masih tidak terjadi apa-apa, jangan kehilangan harapan, jika Anda telah melihat baris bawah menyala di bagian pertama, itu berarti layar LCD Anda OK. Mainkan dengan sirkuit dan solder hingga berfungsi.

Jika Anda melihat pesan "Working", maka Anda telah berhasil menambang kabel LCD Anda dan menyelesaikan bagian kedua dari tutorial ini. Biarkan sirkuit Anda seperti itu, kita tidak akan mengganggunya lagi, semua yang harus kita lakukan sekarang akan di perangkat lunak.

Penjelasan Kode di Bagian 2

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

Baris ini mendeklarasikan objek lcd dengan pin antarmuka yang diberikan dalam argumen. Sekarang semua antarmuka LCD Anda akan dilakukan melalui objek 'lcd' ini.(catat bahwa Anda dapat memberi nama ini apa pun yang Anda inginkan tetapi pertahankan nama tersebut selama proses).

lcd.begin(16,2);

Baris ini mendeklarasikan layar LCD kita berdimensi 16 kolom dan 2 baris, catat bahwa LCD Anda mungkin tidak 16 x 2, sesuaikan angka sesuai kebutuhan.

lcd.setCursor(0,1);

Baris ini akan mengatur kursor pada kolom pertama dan baris kedua(hitungan dalam C++ dimulai dengan 0 bukan 1!). Catat bahwa Anda tidak dapat melihat kursor, tetapi kursor selalu ada, itu menetapkan tempat di mana karakter berikutnya akan muncul.

lcd.print("Welcome");

Baris ini akan mencetak pesan Welcome pada tempat yang ditunjuk kursor, yaitu, 0 kolom 1 baris.

Teks Menggulung

Nah, kita telah mencetak pesan ke layar, tetapi tidak begitu menarik untuk menatap pesan yang sama, selain itu tidak berfungsi apa pun. Jadi kita akan di bagian ini mencetak pesan yang akan menggulung dari kanan ke kiri seperti papan iklan. Hanya fungsi setup() dan loop() yang akan berbeda, jadi saya hanya menunjukkan fungsi-fungsi tersebut, sisanya tetap sama.

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);
  }
}

Catat bahwa untuk memahami kode ini Anda memerlukan pengetahuan yang cukup baik tentang pointer dalam C dan C++, karena bahasa Arduino sebenarnya hanya AVR-C++ yang diproses ringan.

Dalam fungsi loop kita mendefinisikan pesan Anda sebagai string konstan.

lcd.clear() digunakan untuk membersihkan layar untuk setiap iterasi.

Kemudian kita setel pointer ptr untuk menahan alamat pesan. Nilai pointer ini akan ditingkatkan agar pesan muat di jendela LCD bahkan setelah karakter melucut dari pandangan ke kiri. Kami melakukan ini untuk ujung kiri dan bukan untuk ujung kanan karena perpustakaan LiquidCrystal dapat mengatasinya untuk ujung kanan(teks menggulung keluar) tetapi tidak dapat menangani alamat kolom negatif seperti yang diperlukan untuk program kami.

Kemudian kita memiliki loop while yang akan menampilkan pesan di berbagai lokasi dari kiri ke kanan sehingga memberikan ilusi bahwa teks bergerak. Catat bahwa delay() di akhir adalah untuk memastikan kita dapat membaca teks dan tidak menggulung dari kanan ke kiri dengan kecepatan yang tidak terbaca. Jika animasi terlalu lambat atau terlalu cepat, Anda dapat mengubah nilai delay.

Karakter Kustom

Untuk semua penggunaan fungsi lcd.print(), kita tidak dapat menampilkan, misalnya seekor dinosaur, di layar LCD. Namun kita dapat melakukannya menggunakan fitur perpustakaan LiquidCrystal yang disebut Karakter Kustom.

Untuk ini kita mendefinisikan byte data, yang berisi 1 untuk semua piksel nyala dan 0 untuk semua piksel mati, seperti ini:

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

Ini adalah karakter kustom, yang akan menampilkan seekor dinosaur di layar LCD. Anda dapat membuat karakter Anda sendiri di sini: https://maxpromer.github.io/LCD-Character-Creator/

Setelah ini kita perlu menampilkannya. Namun, karakter ini tidak dapat ditampilkan menggunakan metode lcd.print biasa; kita perlu menggunakan ini:

void setup(){
  lcd.createChar(0,dino);
  lcd.begin(16,2);
  lcd.setCursor(0,1);
  lcd.write(byte(0));
}

Dengan kode ini, kita membuat karakter yang dapat dialamat kustom dari byte dino[] yang telah kita definisikan sebelumnya. Alamat karakter kustom kami diberikan oleh metode lcd.createChar() yang mendefinisikan karakter 0 sebagai dino[]. Kita akan merujuk ke karakter ini sebagai byte(0) yang mengembalikan alamat karakter kustom kita, dan akhirnya mencetaknya di layar menggunakan metode lcd.Write().

Panah Melesat

Program ini akhirnya akan mengajarkan Anda cara menganimasikan menggunakan layar LCD, baca ini dengan hati-hati.

#include <LiquidCrystal.h>
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 }
byte B00011, B00111, B01111, B11111, B11111, B01111, B00111, B00011 }
void lcd.createChar(0,arrowhead);
lcd.createChar(1,arrowbody);
lcd.createChar(2,arrowtail);
lcd.begin(16,2);
}
void int while(n!=-1){
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.write(byte(0));
  lcd.write(byte(1));
  lcd.write(byte(2));
  n--;
  delay(50);
}
}

Di sini kita menggunakan tiga karakter kustom untuk mensimulasikan panah. Sisanya sudah familiar bagi Anda. Sementara menjalankan ini di LCD Anda, Anda mungkin melihat jejak di belakang panah yang membuatnya terlihat lebih panjang dari yang sebenarnya, jangan khawatir, itu hanya sisa dari posisi panah sebelumnya.

Itu saja! Anda telah menyelesaikan animasi pertama Anda dengan Arduino dan LCD! Mainkan dengan kode, dan gabungkan ini dengan input tombol untuk mengubahnya menjadi game yang utuh!

Game LCD

Akhirnya kita dapat membuat game! Namun selama tutorial ini saya tidak akan memulai dengan game yang sangat rumit, tetapi game yang sangat sederhana yang mirip dengan game arcade awal.

Tujuan Game Ini

Sebelum memulai game, kita perlu menentukan tujuan untuk gameplay.

Dalam game ini, tujuannya adalah sebagai berikut:

Ada pahlawan, seorang pria di baris 1 (catat bahwa baris pertama adalah baris 0)(biasanya) yang akan ditembaki oleh serangkaian panah. Jika pahlawan terkena, game berakhir. Pahlawan akan menghindari panah dengan melompat ke baris 0, yang akan kita manipulasi dengan tombol. (tekan tombol=baris 0 bukan=baris1). Skor bertambah per loop dan ditampilkan di sudut kanan atas.

Ini sebenarnya merupakan perluasan dari animasi panah yang lebih awal, jadi saya hanya akan menyertakan bagian yang telah berubah.

byte man[] = { B01110, B01110, B00100, B01110, B10101, B00100, B01010, B10001 };
void setup() {
  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));
}
int n;
void loop() {
  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();
        continue;
      }
    }
    lcd.write(byte(0));
    lcd.write(byte(1));
    lcd.write(byte(2));
    lcd.setCursor(10,0);
    lcd.print(score);
    delay(100-rnd);
    n--;
    score++;
    if(level==0) score--;
  }
}
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("Game over");
  lcd.setCursor(10,0);
  lcd.print(score);
  level=1;
  score=0;
  n=15;
  delay(3000);
  return;
}

Tidak semua kode ini tentang LCD, tetapi SEMUA penting untuk pengembangan game.

Kami mulai dengan definisi karakter man[] yang akan menyimpan byte untuk karakter pahlawan(hero kita). Kemudian kita memiliki fungsi setup, di mana hanya dua baris yang berubah. Kedua baris ini mewakili hanya sebagian dari kelompok besar di bawahnya, yaitu interupsi dan angka acak. Keduanya sangat berguna, lebih banyak informasi yang dapat Anda temukan di situs arduino.cc.

Pertama kita memiliki fungsi attachInterrupt. Catat bahwa definisi yang akan saya berikan tidak sangat komprehensif, tetapi yang pendek diperlukan untuk memahami apa yang terjadi di sini.

Interupsi adalah fungsi yang dapat dipanggil saat terjadinya peristiwa TERLEPAS DI MANA EKSEKUSI sedang berlangsung. Ini adalah fakta penting yang berguna untuk menerapkan fungsi input real-time. Di sini kita menggunakannya untuk memastikan bahwa tidak ada titik mana dalam eksekusi tombol ditekan kita akan mengambil tindakan yang sesuai (setidaknya program akan).

Sintaks untuk attachInterrupt:

attachInterrupt(nomor_pin-2, fungsi_dipanggil_tanpa_kurung, kondisi_untuk_pemanggilan);

CHANGE adalah nilai #define yang digunakan untuk menunjukkan bahwa untuk setiap perubahan status pada input nomor_pin fungsi yang dilampirkan akan dipanggil.

Kemudian kita memiliki angka acak. Satu kualitas luar biasa yang dimiliki oleh prosesor fisik seperti Arduino yang tidak dimiliki oleh prosesor biasa adalah bahwa angka acak yang dihasilkan oleh Arduino adalah benar-benar acak karena kebisingan analog yang ada pada pin A0 jika pin A0 ter floating (yaitu tidak terhubung) adalah acak seperti yang diramalkan oleh fisika kuantum (lebih atau kurang).

randomSeed digunakan untuk mengatur benih untuk proses acak. random() adalah fungsi dengan parameter MIN,MAX atau MAX saja untuk mendapatkan angka acak berikutnya dalam urutan.

Kemudian kita memiliki fungsi Interupsi buttonin() yang memeriksa apakah tombol ditekan(LOW) atau tidak ditekan(HIGH) dan mengubah level(baris) pahlawan kita sesuai.

Itu saja, kita memiliki game yang berfungsi sepenuhnya!!

Kode

kode untuk animasiArduino
// include the library code:
#include <LiquidCrystal.h>
// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
const int 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.createChar(0,arrowhead);
  lcd.createChar(1,arrowbody);
  lcd.createChar(2,arrowtail);
  lcd.createChar(3,man);
  lcd.begin(16, 2);
}
void loop() {
  int n;
  n=15;
  while(n!=-1){
    lcd.clear();
    delay(10);
    lcd.setCursor(0,0);
    lcd.print("by Debanshu Das");
    delay(65);
    n--;
  }
}
kode untuk gameArduino
// include the library code:
#include <LiquidCrystal.h>
// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
const int 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.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));
}
int n;
void loop() {
  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();
        continue;
      }
    }
    lcd.write(byte(0));
    lcd.write(byte(1));
    lcd.write(byte(2));
    lcd.setCursor(10,0);
    lcd.print(score);
    delay(100-rnd);
    n--;
    score++;
    if(level==0) score--;
  }
}
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("Game over");
  lcd.setCursor(10,0);
  lcd.print(score);
  level=1;
  score=0;
  n=15;
  delay(3000);
  return;
}

Skematik

Buat Animasi LCD dan Game Menarik dengan Arduino UNO

Proses manufaktur

  1. Sensor Arduino: Jenis, Aplikasi, dan Proyek Dunia Nyata
  2. Buat Konsol Game Tangan dengan Klon Arduboy
  3. Buat Voltmeter Cerdas dengan Arduino & Smartphone – Proyek DIY Mudah
  4. Pencatat Suhu & Kelembaban Arduino dengan DHT11 dan Ethernet Shield
  5. Python 3 ke Arduino UNO: Kontrol Perintah Mudah dan Demo LED
  6. Bangun Automata Seluler Real-Time di Arduino dengan Layar OLED 128x64
  7. Membuat Radio FM Kompak dengan Arduino Nano dan RDA8057M
  8. Bangun Stasiun Cuaca Arduino yang Handal dengan Sensor DHT
  9. Membuat Game Arcade LCD Arduino Klasik dengan Buzzer dan Joystick
  10. MKR1000 dengan DHT22: Pemantauan Suhu dan Kelembaban Real-Time ke Azure