Haz un saco de boxeo en Arduino y Unity usando un Joystic y un globo: 5 pasos

Haz un saco de boxeo en Arduino y Unity usando un Joystic y un globo: 5 pasos

Tabla de contenido:

Anonim

este instructivo simplemente se trata de leer los comentarios de un arduino joystic pero con un ligero giro. Vamos a convertir nuestro joystick en un saco de boxeo:) e incluso mejor visualizaremos todo el proceso en unity3D

tenga en cuenta que todo este instructivo está disponible como una lista de reproducción en mi canal de youtube; si está buscando instrucciones más detalladas, consulte el siguiente enlace:

lista de reproducción

Suministros:

Paso 1: Vamos a recoger los componentes

todo lo que necesitas para esto es

1- joystick

2- globo

3- silicona y encendedor

4- 4 cables macho a hembra

Paso 2: Vamos a hacer nuestro saco de boxeo

1- Inflar el globo a un tamaño de su preferencia.

2- Envuelve la cabeza del nudo del globo con el botón del joystick.

* Si tuviéramos que golpear el globo en este momento, no movería el joystick ya que el nudo sirve como una unión, así que necesitaremos:

3- Usando silicona caliente, une el nudo a la perilla.

y felicidades nuestro saco de boxeo esta listo:)

Paso 3: Código Arduino

en arduino simplemente vamos a leer los valores x e y del joystick, pero la pregunta principal es cuándo enviaré mis valores y cómo darles sentido. ¿Quiero enviarlo todo el tiempo? la respuesta es no, como veremos más adelante, agregaremos fuerza en la unidad y se agregará constantemente, independientemente de lo pequeño que lo haga comportarse como un loco, por lo que necesitamos determinar un valor que indique que un joystick se ha movido lo suficiente, es decir, era perforado

Observe que el joystick en la posición de reposo no le proporciona 0,0 sino un valor mediano entre 0 y la lectura máxima que es por defecto 1023, asigné los valores para cálculos más fáciles desde (0, 255); por lo tanto, nuestra posición de reposo es aproximadamente (124,124) y luego determiné que la mitad de camino entre 124 y 255 (186) y 124 y 0 (62) será indicativo de un movimiento significativo y eso es cuando necesito enviar mis valores

configuración vacía () {

// ponga su código de configuración aquí, para ejecutar una vez:

Serial.begin (9600); }

void loop () {// ponga su código principal aquí, para ejecutar repetidamente:

int x = analogRead (A0); int y = analogRead (A2); x = mapa (x, 0, 1023, 0, 255); y = mapa (y, 0, 1023, 0, 255); if (x> 185 || x <62 || y> 185 || y <62) {Serial.flush (); Serial.print (x); Serial.print (','); Serial.print (y); Serial.println (); retraso (20); }

retraso (20); // writetimout

}

Paso 4: Código de Unidad Parte 1

En esta parte haremos el saco de boxeo y, como siempre, asegúrese de que sus proyectos de unidad permitan la comunicación en serie mediante

Edición> Configuración del proyecto> Reproductor> Desplácese hacia abajo hasta la optimización y cambie la compatibilidad de API a.NET 2.0

1- crear un cilindro que estará fuera de saco de boxeo

2-adjuntar un componente de cuerpo rígido a ella. un cuerpo rígido simplemente permite que el objeto sea sometido a leyes de la unidad física como la gravedad, la fuerza, la masa … etc.

3- Coloque una junta de resorte en ella y asegúrese de colocar el pivote (centro de rotación) en la parte superior central del cilindro.

4-ahora necesitamos cambiar algunas propiedades físicas en nuestra articulación y cuerpo rígido para hacer que la bolsa sea más resistente

un cambio de arrastre angular a 10

b-cambiar la primavera a 70

c-configurar el amortiguador a 40

Paso 5: Unity Parte 2 permite leer y mover la bolsa

Puede seguir el video tutorial para una explicación paso a paso o simplemente adjunte el siguiente script a su cilindro y diviértase:)

utilizando UnityEngine;

utilizando System.Collections; utilizando System.IO.Ports;

Punch de clase pública: MonoBehaviour {

public int x, y; poder int público; ángulo de flotación pública; reproductor de AudioSource público;

Vector3 punchDir privado; Rigidbody privada perforando la bolsa; transmisión SerialPort privada = SerialPort nuevo (@ ". " + "COM11", 9600);

// Use esto para la inicialización void Start () {

stream.Open (); stream.ReadTimeout = 25; StartCoroutine (readData ()); punchingBag = GetComponent (); } // Se llama a Update una vez por fotograma nula Update () {punchDir = new Vector3 (x, 0, y); angle = Vector2.Angle (Vector2.up, punchDir); if (ángulo <0) {Debug.Log ("Valor negativo"); }}

public void punchIt (int _x, int _y) {punchDir = new Vector3 (_x, 0f, _y); punchingBag.AddForce (power * punchDir); jugador.Jugar (); }

IEnumerator readData () {

while (true) {if (stream.IsOpen) {

tratar {

valor de cadena = stream.ReadLine (); cadena valores = valor.Split (','); int x1 = int.Parse (valores 0); int y1 = int.Parse (valores 1); Debug.Log (x1); si (x1> = 62 && x1 <= 185) {x1 = 0;

} else if (x1> 185) {x1 = -1; } else if (x1 <62) {x1 = 1; }

si (y1> = 62 && y1 <= 185) {y1 = 0;

} else if (y1> 185) {y1 = -1; } else if (y1 <62) {y1 = 1; } Debug.Log (x1); //Debug.Log(y1); punchIt (x1, y1); } catch (System.Exception) {// Debug.Log ("TimeOut Exception"); }

} rendimiento rendimiento nulo;

}

} }