Fabriquez un sac de frappe dans Arduino et Unity à l'aide d'un joystic et d'un ballon: 5 étapes

Fabriquez un sac de frappe dans Arduino et Unity à l'aide d'un joystic et d'un ballon: 5 étapes

Table des matières:

Anonim

ce instructable consiste simplement à lire les entrées d'un joystic arduino mais avec une légère torsion! nous allons transformer notre manette de jeu en sac de boxe:) et, encore mieux, nous allons visualiser le processus dans son intégralité avec unity3D

s'il vous plaît noter tout cet instructable est disponible en tant que playlist sur ma chaîne youtube, si vous cherchez des instructions plus détaillées s'il vous plaît regardez le lien ci-dessous:

playlist

Provisions:

Étape 1: collectons les composants

tout ce dont vous avez besoin pour cela est

1- joystick

2- ballon

3- silicium et briquet

4- 4 fils mâles à femelles

Étape 2: Permet de faire notre sac de boxe

1- gonflez le ballon à la taille de votre choix

2- Enroulez la tête du noeud du ballon sur le pommeau du joystick

* Si nous frappions le ballon à ce moment-là, le joystick ne bougerait pas car le noeud sert d'articulation, nous devrons donc:

3- en utilisant du silicium chaud attachez le noeud au bouton

et félicitations notre sac de boxe est prêt:)

Étape 3: Code Arduino

en arduino, nous allons simplement lire les valeurs x et y du joystick, mais la question principale est de savoir quand puis-je envoyer mes valeurs et comment les comprendre. est-ce que je veux l'envoyer tout le temps? la réponse est non, comme nous le verrons plus tard, nous ajouterons de la force dans l'unité et l'ajouterons constamment, peu importe sa taille, ce qui la ferait se comporter comme un fou. Nous devons donc déterminer une valeur indiquant qu'un joystick a suffisamment bougé, c'est-à-dire poinçonné

remarquez que le joystick en position de repos ne vous donne pas 0,0 mais une valeur médiane comprise entre 0 et la valeur maximale qui est par défaut 1023, i a mappé les valeurs pour faciliter les calculs à partir de (0, 255); notre position de repos est donc environ (124,124), puis j’ai déterminé qu’à mi-chemin entre 124 et 255 (186) et 124 et 0 (62) indiqueraient un mouvement important et que c’est au moment où j’ai besoin de mes valeurs

void setup() {

// mettez votre code d'installation ici, pour exécuter une fois:

Serial.begin (9600); }

void loop () {// place ton code principal ici, pour l'exécuter à plusieurs reprises:

int x = analogRead (A0); int y = analogRead (A2); x = carte (x, 0, 1023, 0, 255); y = carte (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 (); retarder (20); }

delay (20); // writeetimout

}

Étape 4: Code de l'unité, partie 1

dans cette partie, nous fabriquerons le sac de boxe et, comme toujours, assurez-vous que vos projets d'unité permettent la communication en série par

modifier> paramètres du projet> lecteur> faites défiler jusqu'à l'optimisation et réglez la compatibilité des API sur.NET 2.0

1- créer un cylindre qui sera sorti du sac de boxe

2-attacher un composant de corps rigide à elle. un corps rigide permet simplement à l'objet d'être soumis aux lois de la physique de l'unité telles que la gravité, la force, la masse, etc.

3- Fixez un joint à ressort et assurez-vous de placer le pivot (centre de rotation) en haut au centre du cylindre

4-Il faut maintenant changer certaines propriétés physiques de nos articulations et de nos corps rigides pour rendre le sac plus résistant.

un changement angulaire de traînée à 10

b-changer le printemps à 70

c-set l'amortisseur à 40

Étape 5: Unity Partie 2 permet de lire et de déplacer le sac

Vous pouvez suivre le didacticiel vidéo pour une explication étape par étape ou simplement joindre le script suivant à votre cylindre et vous amuser:)

using UnityEngine;

using System.Collections; using System.IO.Ports;

public class Punch: MonoBehaviour {

public int x, y; public int power; angle de flottement public; lecteur AudioSource public;

privé Vector3 punchDir; poinçonneuse privée Rigidbody; flux SerialPort privé = nouveau SerialPort (@ ". " + "COM11", 9600);

// Utiliser ceci pour l'initialisation void Start () {

stream.Open (); stream.ReadTimeout = 25; StartCoroutine (readData ()); punchingBag = GetComponent (); } // La mise à jour est appelée une fois par image. Void Update () {punchDir = new Vector3 (x, 0, y); angle = Vector2.Angle (Vector2.up, punchDir); if (angle <0) {Debug.Log ("Valeur négative"); }}

public vide punchIt (int _x, int _y) {punchDir = new Vector3 (_x, 0f, _y); punchingBag.AddForce (power * punchDir); player.Play (); }

IEnumerator readData () {

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

essayer {

valeur de chaîne = stream.ReadLine (); string values ​​= value.Split (','); int x1 = int.Parse (valeurs 0); int y1 = int.Parse (valeurs 1); Debug.Log (x1); si (x1> = 62 && x1 <= 185) {x1 = 0;

} sinon si (x1> 185) {x1 = -1; } sinon si (x1 <62) {x1 = 1; }

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

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

} return return null;

}

} }