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

Animasi dan Permainan LCD

Komponen dan persediaan

Arduino UNO
× 1
LCD alfanumerik, 16 x 2
× 1

Aplikasi dan layanan online

Arduino IDE

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 dimensi lain.

Pertama kita akan mulai dengan pengkabelan lcd ke arduino, kemudian dengan mencetak pesan sederhana ke lcd. Kemudian kita akan beralih ke animasi.

Kabel LCD

Ini adalah rangkaian seperti yang ditunjukkan secara diagram di atas.

PIN LCD

1:VSS:ke rel positif papan tempat memotong roti (pasang 5v arduino ke rel positif juga)

2:VDD:ke rel negatif papan tempat memotong roti (lampirkan GND arduino di sini juga)

3:VO(kontras):ke wiper potensiometer (pasang ujung sisi potensiometer ke rel positif dan negatif)

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

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

6:E (aktifkan):ke pin Arduino 11

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

16:K(katoda):ke rel negatif

Kami tidak akan melampirkan pin data sekarang.

Nyalakan daya dan jika baris bawah menyala maka lcd Anda berfungsi. Anda harus menguji ini sebelum mulai melakukan hal lain.

Jika lcd tidak menyala, periksa solderan, wiring (periksa ulang) dan jika masih tidak menyala kemungkinan besar lcd Anda rusak, jadi Anda perlu menggantinya.

Jika lcd Anda berfungsi, Bravo! Anda telah menyelesaikan bagian pertama dari tutorial ini.

Setelah ini, sambungkan pin data:

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

12:D5:ke pin 5 Arduino

13:D6:ke pin 6 Arduino

14:D7:ke pin Arduino 7

Setelah ini unggah kode contoh

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

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

Jika masih tidak terjadi apa-apa, jangan putus asa, jika Anda telah melihat baris bawah menyala di bagian pertama, itu berarti layar lcd Anda baik-baik saja. bermain-main dengan sirkuit dan penyolderan sampai berhasil.

Jika Anda melihat pesan "Bekerja", maka Anda telah berhasil memasang kabel lcd Anda dan menyelesaikan bagian kedua dari tutorial ini. Biarkan sirkuit Anda apa adanya, kami tidak akan mengacaukannya lagi, yang harus kami lakukan sekarang adalah perangkat lunak.

Penjelasan Kode di Bagian2

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

Baris ini mendeklarasikan objek lcd dengan pin antarmuka seperti yang disediakan dalam argumen. Sekarang semua antarmuka lcd Anda akan dilakukan melalui objek 'lcd' ini. (perhatikan bahwa Anda dapat memberi nama ini apa pun yang Anda inginkan tetapi mempertahankan nama itu di seluruh).

lcd.begin(16,2);

Baris ini menyatakan layar lcd kami berdimensi 16 kolom dan 2 baris, perhatikan bahwa lcd Anda mungkin tidak berukuran 16 kali 2, sesuaikan angkanya.

lcd.setCursor(0,1);

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

lcd.print("Selamat datang");

Baris ini akan mencetak pesan Selamat datang di tempat yang ditunjuk kursor, yaitu 0 kolom 1 baris.

Teks Bergulir

Yah, kami mencetak pesan ke layar, tetapi tidak terlalu menarik untuk duduk menatap pesan yang sama, apalagi tidak ada gunanya. Jadi pada bagian ini kita akan mencetak pesan yang akan bergulir dari kanan ke kiri seperti pada papan iklan. Hanya fungsi setup() dan loop() yang akan berbeda, jadi saya hanya menampilkan fungsi tersebut, sisanya tetap sama.

pengaturan batal(){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); jika(n<0){ ptr++; } lcd.print(ptr); n--;delay(250);}} 

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

Dalam fungsi loop, kami mendefinisikan pesan Anda sebagai string konstan.

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

Kemudian kita set pointer ptr untuk menyimpan alamat pesan. Nilai penunjuk ini akan bertambah agar sesuai dengan pesan di jendela lcd bahkan setelah karakter keluar dari pandangan ke kiri. Kami melakukan ini untuk ekstremitas kiri dan bukan untuk kanan karena perpustakaan LiquidCrystal dapat menanganinya untuk ekstremitas kanan (teks bergulir keluar) tetapi tidak dapat menangani alamat kolom negatif seperti yang diperlukan untuk program kami.

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

Karakter Khusus

Untuk semua penggunaan fungsi lcd.print(), kami tidak dapat menampilkan, katakanlah dinosaurus, di layar lcd. Namun kita dapat melakukan ini dengan menggunakan fitur perpustakaan LiquidCrystal yang disebut Karakter Kustom.

Untuk ini kami mendefinisikan satu byte data, yang berisi 1s untuk semua piksel aktif dan 0s untuk semua piksel mati, seperti ini:

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

Ini adalah karakter khusus, yang akan menampilkan dinosaurus 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:

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

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

Menembak Panah

Program ini akhirnya akan mengajari Anda cara menganimasikan menggunakan layar lcd, baca ini dengan cermat.

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

Di sini kami menggunakan tiga karakter khusus untuk mensimulasikan panah. Sisanya akrab bagi Anda. Saat menjalankan ini di lcd Anda, Anda mungkin melihat jejak di belakang panah sehingga terlihat lebih panjang dari itu, jangan khawatir, itu hanya sisa dari posisi panah sebelumnya.

Itu dia! Anda telah menyelesaikan animasi pertama Anda dengan Arduino dan LCD! Main-main dengan kodenya, dan gabungkan ini dengan input tombol untuk mengubahnya menjadi game yang lengkap!

Permainan LCD

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

Tujuan Game Ini

Sebelum memulai game, kita perlu mengetahui tujuan gameplay.

Dalam permainan ini, tujuannya adalah sebagai berikut:

Ada pahlawan, seseorang di baris 1 (perhatikan bahwa baris pertama adalah baris 0) (biasanya) di mana serangkaian panah akan ditembakkan. Jika pahlawan terkena, permainan 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 putaran dan ditampilkan di sudut kanan.

Ini sebenarnya merupakan perpanjangan dari animasi panah eariler, jadi saya hanya akan menyertakan bagian yang telah berubah.

byte man[] ={ B01110, B01110, B00100, B01110, B10101, B00100, B01010, B10001};void setup() { // mengatur jumlah kolom dan baris LCD:lcd.createChar( 0, panah); lcd.createChar(1,panah); lcd.createChar(2,panah); lcd.createChar(3,man); lcd.begin(16, 2); attachInterrupt(0,buttonin,CHANGE); randomSeed(analogRead(A0)); // Mencetak pesan ke LCD. //lcd.print("hello, world!");} int n;void loop() { // atur kursor ke kolom 0, baris 1 // (catatan:baris 1 adalah baris kedua, karena penghitungan dimulai dengan 0)://lcd.setCursor(0, 1); // cetak jumlah detik sejak reset://lcd.print(millis() / 1000); n=15; int rnd; nd=acak(15,25); while(n!=-1){ lcd.clear(); penundaan (10); penarik(); lcd.setCursor(n,1); if(n==1){ if(level==1){ stopgame(); melanjutkan; } } lcd.tulis(byte(0)); lcd.write(byte(1)); lcd.write(byte(2)); lcd.setCursor(10,0); lcd.print(skor); penundaan (100-rnd); n--; skor++; skor if(level==0)--; }}void drawman(){ lcd.setCursor(1,level); lcd.write(byte(3));}void buttonin(){ if(digitalRead(2)==LOW){ level=0; } lain{ tingkat=1; }}batalkan stopgame(){ lcd.clear(); lcd.setCursor(0,0); lcd.print("Permainan selesai"); lcd.setCursor(10,0); lcd.print(skor); tingkat=1; skor=0; n=15; penundaan(3000); kembali;} 

Tidak semua kode ini tentang lcd, tetapi SEMUA penting untuk pengembang game.

Kita mulai dengan definisi karakter man[] yang akan menyimpan byte untuk karakter man(pahlawan kita). Kemudian kami memiliki fungsi pengaturan, di mana hanya dua baris yang berubah. Kedua garis tersebut hanya mewakili sebagian dari kelompok besar tempat mereka berada, yaitu interupsi dan angka acak. Keduanya adalah fasilitas yang sangat berguna, informasi lebih lanjut dapat Anda temukan di situs web arduino.cc.

Pertama kita memiliki fungsi attachInterrupt. Perhatikan bahwa definisi yang akan saya berikan bukanlah definisi yang sangat komprehensif, tetapi definisi yang singkat diperlukan untuk memahami apa yang terjadi di sini.

Interupsi adalah fungsi-fungsi yang dapat dipanggil atas terjadinya suatu peristiwa NO MATTER DI MANA EKSEKUSI itu terjadi. Ini adalah fakta penting yang berguna untuk mengimplementasikan fungsi input waktu nyata. Di sini kami menggunakannya untuk memastikan bahwa di titik mana pun dari eksekusi tombol ditekan, kami akan mengambil tindakan yang sesuai (setidaknya program akan melakukannya).

Sintaks untuk attachInterrupt:

attachInterrupt(pin_number-2,function_to_call_without_parenthesis,condition_for_calling);

CHANGE adalah nilai #define yang digunakan untuk menandakan bahwa untuk setiap perubahan status pada input pin_number, fungsi yang dilampirkan akan dipanggil.

Kemudian kami memiliki nomor acak. Salah satu kualitas luar biasa yang dimiliki oleh prosesor fisik seperti Arduino yang tidak dimiliki oleh prosesor normal adalah bahwa angka acak yang dihasilkan oleh Arduino benar-benar acak karena derau analog hadir di pin A0 jika pin A0 mengambang (yaitu tidak terhubung) acak seperti yang diprediksi oleh fisika kuantum (kurang lebih).

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

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

Itu saja, kami memiliki permainan yang berfungsi penuh!!

Kode

  • kode untuk animasi
  • kode untuk permainan
kode untuk animasiArduino
// sertakan kode library:#include // inisialisasi library dengan mengaitkan pin antarmuka LCD yang diperlukan// dengan nomor pin arduino yang terhubung keconst int rs =12, en =11, d4 =4, d5 =5, d6 =6, d7 =7;LiquidCrystal lcd(rs, en, d4, d5, d6, d7);byte panah[]={ B00001, B00011, B00111, B01111, B00111, B00011, B00001 , B000000};byte arrowbody[]={ B00000, B00000, B00000, B11111, B11111, B00000, B00000, B00000};byte arrowtail[]={ B00011, B00111, B11111, B11111, B11111, B00111, B00011, B000000}; byte man[] ={ B01110, B01110, B00100, B01110, B10101, B00100, B01010, B10001};void setup() { // mengatur jumlah kolom dan baris LCD:lcd.createChar(0,arrowhead); lcd.createChar(1,panah); lcd.createChar(2,panah); lcd.createChar(3,man); lcd.begin(16, 2); // Mencetak pesan ke LCD. //lcd.print("hello, world!");}void loop() { // atur kursor ke kolom 0, baris 1 // (catatan:baris 1 adalah baris kedua, karena penghitungan dimulai dengan 0)://lcd.setCursor(0, 1); // cetak jumlah detik sejak reset://lcd.print(millis() / 1000); int n; n=15; while(n!=-1){ lcd.clear(); penundaan (10); lcd.setCursor(0,0); lcd.print("oleh Debanshu Das"); /* lcd.setCursor(1,1); lcd.write(byte(3)); lcd.setCursor(n,1); lcd.tulis(byte(0)); lcd.write(byte(1)); lcd.write(byte(2));*/ delay(65); n--; }}
kode untuk gameArduino
// sertakan kode library:#include // inisialisasi library dengan mengaitkan pin antarmuka LCD yang diperlukan// dengan nomor pin arduino yang terhubung keconst 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 anak panah[]={ B00000, B00000, B00000, B11111, B11111, B00000, B00000, B00000};byte tanda panah[]={ B00011, B00111, B11111, B11111 , B11111, B00111, B00011, B000000};byte man[] ={ B01110, B01110, B00100, B01110, B10101, B00100, B01010, B10001};void setup() { // mengatur jumlah kolom dan baris LCD:lcd.createChar(0,panah); lcd.createChar(1,panah); lcd.createChar(2,panah); lcd.createChar(3,man); lcd.begin(16, 2); attachInterrupt(0,buttonin,CHANGE); randomSeed(analogRead(A0)); // Mencetak pesan ke LCD. //lcd.print("hello, world!");} int n;void loop() { // atur kursor ke kolom 0, baris 1 // (catatan:baris 1 adalah baris kedua, karena penghitungan dimulai dengan 0)://lcd.setCursor(0, 1); // cetak jumlah detik sejak reset://lcd.print(millis() / 1000); n=15; int rnd; nd=acak(15,25); while(n!=-1){ lcd.clear(); penundaan (10); penarik(); lcd.setCursor(n,1); if(n==1){ if(level==1){ stopgame(); melanjutkan; } } lcd.tulis(byte(0)); lcd.write(byte(1)); lcd.write(byte(2)); lcd.setCursor(10,0); lcd.print(skor); penundaan (100-rnd); n--; skor++; skor if(level==0)--; }}void drawman(){ lcd.setCursor(1,level); lcd.write(byte(3));}void buttonin(){ if(digitalRead(2)==LOW){ level=0; } lain{ tingkat=1; }}batalkan stopgame(){ lcd.clear(); lcd.setCursor(0,0); lcd.print("Permainan selesai"); lcd.setCursor(10,0); lcd.print(skor); tingkat=1; skor=0; n=15; penundaan(3000); kembali;}

Skema


Proses manufaktur

  1. Sensor Arduino – Jenis dan Aplikasi
  2. Konsol Permainan Genggam | Klon Arduboy
  3. Voltmeter DIY Menggunakan Arduino dan Smartphone
  4. Pencatat Data Suhu dan Kelembaban
  5. Python3 dan Komunikasi Arduino
  6. Otomata Seluler berbasis Arduino dan OLED
  7. Radio FM Menggunakan Arduino dan RDA8057M
  8. Stasiun Cuaca Arduino
  9. Game Video LCD Arduino
  10. Sensor Suhu dan Kelembaban MKR1000