Proses manufaktur
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
| ||||
|
| ||||
|
Inspirasi dan Proyek Sebelumnya
Pada bulan Desember 2017, saya membuat Konsol Arduino Pong Genggam yang menggunakan layar Arduino Nano dan OLED, bersama dengan dua tombol.
Ini baik-baik saja pada saat itu, tetapi konsolnya agak terlalu besar dan tidak praktis. Namun, baru-baru ini, saya mencoba membuat ulang beberapa proyek saya sebelumnya. Kali ini, saya ingin membuat konsol yang sangat kecil yang bisa dimainkan oleh orang-orang.
Komponen yang Dipilih
Untuk membuat konsol menjadi kecil, saya tidak dapat menggunakan papan pengembang Arduino apa pun, itulah sebabnya saya menggunakan ATtiny85.
Ini memiliki fitur I/O yang cukup untuk menjalankan game, termasuk dua pin ADC dan, port I2C, dan pin GPIO. Saya memilih untuk menggunakan modul joystick/switch 2 sumbu sederhana, karena mudah untuk berinteraksi dan hanya membutuhkan 3 pin untuk pemberian sinyal.
Akhirnya, tiba saatnya untuk memutuskan tampilan mana yang dibutuhkan. Karena layar OLED 128 x 64 DFRobot berukuran kecil tetapi memiliki banyak resolusi, saya mengikutinya.
Menyolder Sistem
Untuk memulai, saya memasang ATtiny85 ke SOP-8 ke DIP-8 breakout PCB dan menyoldernya ke sepotong kecil papan perf. Selanjutnya, saya menyolder pada dua header- satu untuk pemrograman dan yang lainnya untuk layar. Setelah melakukan itu, saya menghubungkan pin joystick analog ke perf-board dan menghubungkannya dengan kabel yang sesuai. Untuk langkah terakhir, saya menghubungkan papan pemutus USB mikro ke seluruh sistem untuk mendapatkan daya.
Mendesain Enklosur
Enklosur dirancang di Fusion 360. Saya mulai dengan membuat dan meletakkan komponen yang saya gunakan di build sebenarnya, lalu saya membuat enklosur di sekelilingnya.
Saya ingin meniru kotak arcade dari tahun 80-an, tetapi tetap mempertahankan ukurannya yang sangat kecil. Berikut adalah beberapa render dari enklosur:
Memprogram Game
Snake adalah game yang cukup mudah untuk diprogram. Saya menetapkan panjang ular maksimum 30 untuk menghemat RAM, artinya setelah ular memakan 29 piksel, pemain menang. Untuk melacak segmen ular, saya membuat larik 2 dimensi yang menyimpan pasangan berurutan untuk setiap segmen.
Setiap kali kepala bergerak ke lokasi baru, posisi sebelumnya mengalir ke bawah. Setiap kali segmen dikonsumsi, segmen baru muncul di titik acak. Pengecekan tumbukan dilakukan dengan iterasi melalui koordinat setiap segmen dan melihat apakah koordinat kepala sama. Selain itu, memukul ular di sepanjang dinding mana pun akan menyebabkan pemain kalah juga.
Bermain Ular
Saya mulai dengan menyalakan konsol dan menunggu layar memuat makanan dan segmen pertama ular. Kemudian saya mengemudikan ular itu dengan menggerakkan joystick ke arah yang benar sambil melihatnya memakan makanannya. Game ini menyenangkan untuk dimainkan dan merupakan pembunuh kebosanan yang hebat dalam paket kecil.
//#include#include U8G2_SSD1306_128X64_NONAME_1_SW_I2C u8g(U8G2_R0,/* clock=/ 2, / data=/ 0, / reset=*/ U8X8);#define MAX_LENGTH 30 //30 segmen maks#define X 0#define Y 1#define JOYSTICK_X 2#define JOYSTICK_Y 3#define DIR_THRESH 300 //Nilai harus 0-300 atau 723-1023 untuk menghitung posisi segmen8_t][[MAX_LENGTH] 2);uint8_t headPosition[2] ={63, 31}; //Tempatkan ular di awal startuint8_t foodPosition[2]; //Tempat makanan beradauint8_t tempPosition0[2]; //Menyimpan posisi segmen sebelumnya untuk diteruskan ke nextuint8_t tempPosition1[2]; //Menyimpan posisi segmen sebelumnya untuk diteruskan ke segmen berikutnyaLength =1;void gameUpdate();enum DIRECTIONS { RIGHT, DOWN, LEFT, UP} currentDirection;void setup() { //TinyWireM.begin(); u8g.mulai(); u8g.setPowerSave(0); pinMode(JOYSTICK_X, INPUT); pinMode(JOYSTICK_Y, INPUT); randomSeed(analogRead(0)); beginGame();}void loop() { u8g.firstPage(); lakukan { gameUpdate(); u8g.setColorIndex(1); } while(u8g.nextPage());}void beginGame(){ currentDirection =KANAN; spawnMakanan(); delay(1000);}bool checkCollisions(){ for(int i=1; i =128) kembalikan 1; else if(headPosition[Y] <=0 || headPosition[Y]>=64) kembalikan 1; return false;}void spawnFood(){ int randomX =random(5, 123); int acakY =acak(5, 60); posisi makanan[X] =randomX; foodPosition[Y] =randomY;}void checkFoodEaten(){ if(headPosition[X] ==foodPosition[X] || headPosition[Y] ==foodPosition[Y]){ segmentLength +=1; spawnMakanan(); }}void updateDirection(){ int joy_x_val =analogRead(JOYSTICK_X); int joy_y_val =analogRead(JOYSTICK_Y); if(joy_x_val <=DIR_THRESH) currentArah =KIRI; else if(joy_x_val>=1023-DIR_THRESH) currentDirection =KANAN; else if(joy_y_val <=DIR_THRESH) currentDirection =UP; else if(joy_y_val>=1023-DIR_THRESH) currentDirection =DOWN;}void displaySegments(){ for(int segment=0; segment =MAX_LENGTH) endGame(); delay(50);}void endGame(){ segmentLength =1; posisi kepala[0] =63; posisi kepala[1] =31; beginGame();}
Proses manufaktur
Komponen dan persediaan Arduino Nano R3 × 1 Sensor Ultrasonik - HC-SR04 (Generik) × 1 Kapasitor 1000 F × 1 1N4148 – Pengalihan Cepat Tujuan Umum × 1 Melalui Resistor Lubang, 470 ohm × 1 Strip LED WS2812B 1M IP30 5VDC × 1 Alat da
Komponen dan persediaan Arduino MKR1000 × 1 Drone Balap Mikro × 1 Kapasitor 100 F × 4 Resistor 221 ohm × 4 Kabel jumper (generik) × 12 Breadboard (generik) × 1 Mindwave Neurosky × 1 Alat dan mesin yang diperlukan B
Komponen dan persediaan Arduino UNO × 1 Breadboard (generik) × 1 Sensor Ultrasonik - HC-SR04 (Generik) × 1 Buzzer × 1 LED (generik) × 3 Resistor 221 ohm × 1 Kabel jumper (generik) × 10 Tentang proyek ini Langk
Komponen dan persediaan Arduino UNO × 1 Adafruit RGB Backlight LCD - 16x2 × 1 Breadboard (generik) × 1 Resistor 220 ohm × 1 Sakelar Tombol Tekan SparkFun 12mm × 1 Kabel jumper (generik) × 1 Kabel USB-A ke B × 1 Aplik