Dotship: Juego en Arduino (LCD + Pot + Pushbutton)

Ok, esto es algo que se me ocurrió hacer al programar un poco en un framework de Lua llamado Löve (luego les contaré sobre eso). Se trata de un juego simple que podemos programar en nuestro arduino haciendo uso de un LCD y una pequeña función llamada lcd.createChar().

dotship lcd game

En este juego tú eres un simple pixel que se desplaza únicamente lateralmente y que puede disparar. El objetivo es evitar que ‘el enemigo’ llegue hasta donde estás tú. Cada vez que matas al enemigo éste reaparece más enojado y con mayor velocidad, así que en realidad no puedes ganar, sólo se trata de sobrevivir por el mayor tiempo posible.

Lo que se necesita

  • Arduino
  • LCD 16×2 Hitachi HD44780 compatible (es decir, la más común)
  • 2 Potenciómetros (cualquier tamaño está bien)
  • 1 Pushbutton
  • 1 Resistencia de 10 Kohms
  • 1 Resistencia de 100 ohms
El potenciómetro va a ser nuestro ‘analog stick’ de bajos recursos: con él controlaremos a nuestra nave-pixel. El pushbutton es el gatillo de nuestra superduper arma destructora.

El diagrama

dotship diagrama

 

dotship lcd game 2

En la foto hay dos pushbuttons por otro programa que estaba haciendo antes, sólo es necesario uno. El segundo potenciómetro (el de abajo) es el que ajusta el contraste del LCD.

El código

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
/*
  __DOTSHIP__
  "The adventure of a dot-shaped ship versus the thing-shaped 
  immortal enemy"
 
  A simple Arduino game that uses a common 16x2 LCD (Hitachi 
  HD44780 compatible) and a potentiometer and a pushbutton as 
  a controller.
 
  You can find the LCD wiring here: 
  http://arduino.cc/en/Tutorial/LiquidCrystal
    - RS to 12
    - Enable to 11
    - Data pins to 5, 4, 3, 2
    - R/W to GND
 
  also you will need a:
  * Potentiometer: 
    - end pins to +5v and GND
    - middle pin to A0 pin
  * Pushbutton:
    - attached to pin 8 from +5V
    - 10K resistor attached to pin 8 from ground
 
  More details: http://thebatzuk.org/2011/09/dotship-juego-en-
  arduino-lcd-pot-pushbutton.html
 
  11 Sep 2011
  by Raúl Rivas (thebatzuk)   <--------\
                                        \  
  You can use, copy and modify           \
  this code but do not remove this  line -\
*/
 
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
 
unsigned long time = 0;
boolean game = true;
unsigned int score = 0;
 
// potentiometer and button pins
int pot_pin = 0;
int bttn_pin = 8;
int bttn_val = 0;
int bttn_last = 0;
 
// ship variables 
int ship_px = 0;
int ship_y = 0;
 
// shoots variables
boolean shot = false;
int shoot_time = 0;
byte shot_pos[5] = {B00001, B00010, B00100, B01000, B10000};
int shoot_x = 14;
int shoot_y = 0;
int shoot_px = 0;
int mi = 0;
 
// enemies variables
byte enemies[8] = {B00000, B00110, B00001, B01111, B01111, 
                   B00001, B00110, B00000};
int enemy_y = 0;
int enemy_x = 0;
int enemy_vel = 100;
int vel_increment = 20;
 
void setup() 
{
  lcd.begin(16, 2);
  lcd.createChar(2, enemies);
  randomSeed(analogRead(1));
}
 
void loop() 
{
  if(game)
  {
    time++;
    // ship stuff
    byte ship[8] = {B00000, B00000, B00000, B00000, B00000, 
                    B00000, B00000, B00000};
    ship_px = map(analogRead(pot_pin), 0, 1023, 0, 16);
    if(ship_px >= 0 && ship_px <= 7)
      ship_y = 0;
    else if(ship_px >= 8 && ship_px <= 15)
      ship_y = 1; 
    ship[ship_px - ship_y * 8] = B10000;
    lcd.createChar(0, ship);
    lcd.setCursor(15, ship_y);
    lcd.write(0);
 
    // shoots stuff
    byte shoot[8] = {B00000, B00000, B00000, B00000, B00000, 
                     B00000, B00000, B00000};
    bttn_val = digitalRead(bttn_pin);
    if(bttn_val != bttn_last && bttn_val == HIGH && !shot)
    {
      shot = true;
      shoot_time = 0;
      mi = 0;
      shoot_px = ship_px - ship_y * 8;
      shoot_y = ship_y;
    }
    if(shot)
    {
      for(int i = 0; i < 15; i++)
      {
        if(shoot_time >= mi && shoot_time <= mi+4)
        {
          shoot_x = 14 - (mi / 5);
          mi += 5;
          if(shoot_x == 0)
            shot = false;
          break;
        }
      }
      shoot[shoot_px] = shot_pos[shoot_time - (14 - shoot_x) * 5];
      lcd.createChar(1, shoot);
      lcd.setCursor(shoot_x, shoot_y);
      lcd.write(1);
      shoot_time++;
    }
 
    // enemies stuff
    if(time % enemy_vel == 0)
    {
      enemy_x++;
      enemy_y = random(0, 2);
    }
    lcd.setCursor(enemy_x, enemy_y);
    lcd.write(2);
    // enemy got shot:
    if(shoot_y == enemy_y && shoot_x == enemy_x && 
       shoot_px > 0 && shoot_px < 7)
    {
      score += 10 * enemy_x;
      enemy_x = 0;
      enemy_vel -= vel_increment;
      vel_increment -= 5;
      if(enemy_vel <= 0)
        enemy_vel = 2;
      if(vel_increment <= 0)
        vel_increment = 5;
      shot = false;
      shoot_x = 14;
      delay(25);
    }
    else if(enemy_x > 14)
      game = false;
 
    // other stuff
    delay(15);
    lcd.clear();
    bttn_last = bttn_val;
  }
  else
  { 
    lcd.setCursor(0, 0); 
    lcd.print("Game Over.");
    lcd.setCursor(0, 1); 
    lcd.print("Score: ");
    lcd.print(score);
    // reset Arduino to play again
  }
}

También puedes encontrar el código aquí: Dotship, an Arduino Game (LCD, Pot and Pushbutton)

La función de las LCD es mostrar caracteres (a-z, 0-9), sin embargo cada segmento tiene pixeles individuales que puede ser ‘explotados’ para hacer este tipo de juegos. La función lcd.createChar() te permite crear caracteres extras a los que admite la pantalla LCD, por medio de una matriz puedes decidir cual pixel se enciende y cual no. Además éstos caracteres especiales pueden ser creados dinámicamente, por lo que las posibilidades son bastante amplias.

Eso es todo, espero y alguien lo pruebe en su arduino y nos cuente que tal está.

Mi Tumblr

Hola, tengo Tumblr, adiós.

tumblr logo

Bueno, bueno, escribiré un poco más. Tumblr es un servicio para bloggear, tiene todas las herramientas básicas que un blogger necesita, sin embargo tiene un enfoque de red social: puedes seguir a personas y otras personas te pueden seguir. Cuando sigues a alguien todas sus publicaciones te llegan a tu dashboard, por lo tanto (si sigues a las personas indicadas) tu dashboard se convierte en un feed muy interesante.

La mejor herramienta de Tumblr es el botón reblog. Mientras que en este tipo de blogs ‘normales’ el reblog se considera como robar un post, en Tumblr es algo que todo mundo hace y es bien recibido. Claro que hay gente que crea el contenido, pero muchas otras personas (yo incluido) sólo nos dedicamos a rebloggear lo que sea que nos pegue la gana.

Así que si tienen Tumblr pueden seguirme aquí: thebatzuk.tumblr.com o si no pueden ver porqué vas a amar Tumblr.

Los nuevos héroes

No se a qué edad o qué es lo que tenga que pasar para que un ser humano vea ciencia ficción (en series o películas) y simplemente diga “cámbiale” o “quita eso”. Sé que depende de gustos pero conozco personas que se pierden de historias geniales por no aceptar ver algunos cuantos aliens, mutantes, superhéroes, monstruos, fantasmas o cosillas así. En la mayoría de los casos (que son los que valen la pena) toda esta fantasía es un pretexto para contar una buena historia.

Por ejemplo, mucha gente se enojó con el fin de Lost (la serie esa) porque dejó sin explicar muchísimas cosas. Pero todos los misterios de la isla (y los mismo escritores lo dijeron) eran sólo estrategias para tener enganchado al público, en realidad la serie trata de la vida personal (pasada, presente y hasta futura) de un puñado de personas que coincidieron en estar en un accidente de avión.

the mentalist

Pero bueno, el asunto es que (yo pienso) que los escritores se han estado fijando que a mucha gente simplemente no le gusta la fantasía, y para darles gusto han creado a los nuevos héroes, que simplemente son personas con alguna habilidad fuera de lo común pero sin salirse de la realidad. Ejemplos hay muchos:

  • Lie to me. En esta serie el Dr. Cal Lightman tiene el ‘superpoder’ de reconocer microexpresiones faciales e interpretar el lenguaje corporal para detectar si una persona está mintiendo.
  • Numb3rs. Charlie Eppes es un genio matemático que ayuda al FBI a resolver crímenes usando modelos matemáticos y demás cosas matemáticas.
  • The Mentalist. Patrick Jane era un estafador que fingía ser psíquico y médium, sin embargo tiene la capacidad de analizar psicológicamente a las personas y es excelente para deducir (por eso era buen estafador). Por ciertas razones ahora trabaja como consultor resolviendo crímenes para el CBI.

Son exactamente como nuestros superhéroes de siempre pero sin trajes ridículos ni poderes increíbles. ¿A ustedes les gustan este tipo de héroes o prefieren los superhéroes?

Sutil diferencia

Un día hace ya bastante rato un compañero de escuela (con el que me junté un rato porque también tocaba guitarra) me mostró un video de Dragonforce, a su criterio la hipermegamejor banda de todos los tiempos, específicamente este: Through The Fire And Flames, específicamente entre 3:00 y 4:30, y yo le tuve que reconocer que son bastante buenos, pero siempre me quedé con las ganas de decirle “Bitch, please” y luego mostrarle este:

¡BB King y Gary Moore juntos! ¡Tocando! ¡TOCANDO! *se desmaya de la emoción*

Lo nuevo en mi biblioteca: Xavier Rudd

Hace un buen rato me recomendaron el juego Machinarium (y yo se los recomiendo a ustedes), pero lo importante es una canción que aparece en una parte del juego donde le ayudas a una banda a recuperar sus instrumentos. La pueden oír aquí: Machinarium Robot Band Song. ¿Ya la escucharon…? ¿Ahora…? Pues es una canción jazz bastante buena y pegajosilla y lo que mas me llamó la atención es el instrumento que toca el robot rojo. Ya después supe que es un instrumento indígena australiano que se llama didgeridoo. Luego me puse a buscar alguna banda moderna que usara didgeridoo en su música y así es como dí con Xavier Rudd y su canción Maná.

Xavier Rudd es un multi-instrumentalista y cantautor de algo que puede llegar a describirse como indie folk rock, que en mi opinión suena genial.

Esa fue Fortune Teller del álbum Food in the Belly, sin embargo mi rola recomendada es Food in the Belly, de la cual no hallé un buen video en vivo.

Y bueno, aquí es donde pondría un link a su página oficial, pero parece que está caída…