Minecraft Creeper Sentry Avec Arduino Uno, Ultrasons et LED: 7 étapes (avec photos)

Minecraft Creeper Sentry Avec Arduino Uno, Ultrasons et LED: 7 étapes (avec photos)

Table des matières:

Anonim

SssssssssssBOOM!!! Tu es mort. Respawn?

Oups. Je suppose qu'une épée de diamant aurait été une bonne idée. Ces torches ont de terribles dégâts d'attaque, vous ne pensez pas?

Je sais que les sentinelles ne sont pas nouvelles. Les creepers non plus. Mais les deux combinés? Je n'ai pas encore vu ça, n'est-ce pas? Probablement pas. Et c'est la base de ce projet.

Contexte: Je suis obsédé par les LED, Arduino et Robotic Stuff. Et les explosions sont cool aussi. En fait, je ne joue pas beaucoup à Minecraft, mais je considère son mérite comme un stimulant éducatif et créatif. Et ça me donne une excuse pour faire sauter des choses. Sans rien faire sauter. Ce qui est cool. En tout cas, je voulais créer quelque chose de robotique qui a des LED et peut exploser sans exploser. Et puis j'ai vu le Minecraft Challenge ici sur Instructables, et je savais que je venais de EU faire une plante grimpante.

Alors, quelle est cette chose quand même?

Nous allons construire une petite «plante grimpante» robotisée qui agit comme une sentinelle et qui clignotera en rouge et sifflera lorsque quelque chose se rapprochera de trop près. Je veux le rendre entièrement open source, et je veux aussi le rendre bon marché pour que tout le monde puisse le construire (et parce que mon projet ROB était coûteux).

Après avoir démarré la construction, j'ai décidé de la rendre capable de fonctionner dans différents «modes», en plus d'être une sentinelle. A partir de maintenant, j'ai ajouté un mode veille dans lequel il devient essentiellement une veilleuse "respirante" RVB, deux versions du mode sentinelle, une où il siffle et une où il émet juste des bips, et un mode après lequel il suivra le premier objet qu'il voit dans une plage prédéfinie.

Ouf! Ai-je tout obtenu?

Non, attendez, encore une chose. Les améliorations potentielles sont un effet sonore d'explosion (ce qui est très difficile à obtenir, comme je le fais depuis des mois), ainsi qu'un pilote de moteur, une batterie interne et des roues, offrant ainsi un cinquième mode d'évitement d'obstacles.

Mais comment puis-je le construire?

Eh bien, suivez-nous et voyons ce que cela donne.

Provisions:

Étape 1: Rassembler les matériaux

Toujours, toujours, toujours rassembler du matériel avant de commencer un projet. De cette façon, vous n’aurez jamais à le conserver pour plus tard, car vous n’avez rien de vital.

Tu auras besoin de:

Papier carton

Papier d'imprimante

1x Arduino Uno

1x servo de 9 grammes et corne de servo

1x capteur à ultrasons HC-SR04 ou équivalent

1x Buzzer (passif)

4x LED RVB (cathode commune)

7 x LONGs fils de jonction mâle-mâle (les plus longs parmi les assortiments standard de Dupont conviendront)

Beaucoup de fils de connexion hommes-hommes (toutes tailles conviendront)

4x fils de jonction mâle-femelle

1x source d'alimentation externe (au moins 5 volts et 1 ampère)

Peinture acrylique:

Barrel Pomme "Vert Feuille" 20528

Delta Ceramcoat "Sunshine Pearl" 02615

Delta Ceramcoat "Phythalo Green" 02501

Barrel Pomme "Noir" 20504

Barrel de pomme "Gris étain" 20580

Étape 2: le cadre

Nous avons donc besoin d’un endroit où tout monter. Et cela doit ressembler à une vigne vierge. J'aimerais pouvoir imprimer ceci en 3D, mais hélas, le carton est tout ce que j'ai. (Il semble que j'en parle beaucoup, n'est-ce pas?)

Étape 1: coupe

Coupé:

1x rectangle 2,5 pouces x 5 pouces - Nommez ce "A1"

4x rectangles 2,75 pouces x 2,5 pouces - étiqueter ces "B1" à "B4"

4x rectangles 2,75 pouces x 5,75 pouces - étiqueter ces "C1" à "C4"

6x rectangles 2,25 pouces x 4,75 pouces - étiquetez ces "D1" à "D6"

2x carrés 2,75 pouces x 2,75 pouces - étiqueter ces "E1" et "E2"

1x carré 4,25 pouces x 4,25 pouces - Nommez ce "F1"

Étape 2: collage

Faites chauffer votre pistolet à colle et utilisez les schémas et les images ci-dessus pour créer les pieds, la tête et le corps principal.

Étape 3: Trappe d'accès

Couper et coller de petites bandes de carton d'environ 1/2 pouce de large autour du périmètre du dernier rectangle de carton. Cette pièce sera notre porte. (Ne vous occupez pas de l'électronique de la photo, je l'ai prise après avoir fini la plante grimpante, car toutes mes photos de la construction sont terribles.)

Utilisez une bande de papier pour imprimante et de la colle pour créer une charnière, puis attachez la porte au corps afin qu’elle se ferme bien, mais nécessite un peu de force pour s’ouvrir. (Encore une fois, ignorez la peinture.)

Maintenant, vous pouvez passer aux circuits!

Étape 3: Les circuits!

Cette partie devient un peu délicate. J'ai conçu des PCB pour cette étape, bien que je ne sois pas capable de les fabriquer moi-même. Je les attacherai ici, cependant, pour que vous puissiez les utiliser si vous le souhaitez.

(Désolé, je n'ai pas de schéma de circuit cette fois-ci … Peut-être que je les ajouterai plus tard si j'en ai le temps.)

Remarque: J'ai deux boutons-poussoirs et vous explique comment l'assembler avec les deux. Cependant, le code utilise uniquement celui de A1 et l'autre est un disque de rechange que j'avais initialement prévu d'utiliser pour changer les couleurs en mode veille.

Étape 1: l'Arduino

Sur une mini planche à pain, poncez les deux boutons-poussoirs, le buzzer et le potentiomètre.

Connectez un côté de chaque bouton à une broche latérale du potentiomètre.

Connectez la même broche latérale que je viens de mentionner à la masse sur l’Arduino et au côté négatif de la sonnerie.

Connectez l'autre côté du potentiomètre à 5V sur l'Arduino.

Connectez la broche centrale du potentiomètre à A0 sur l’Arduino.

Connectez les côtés ouverts des boutons-poussoirs à A1 et A2 sur l’Arduino.

Connectez le côté positif de la sonnerie à A5 sur l’Arduino.

Connectez un cavalier de la broche 5V du servo au côté positif du potentiomètre.

Connectez un cavalier de la broche négative du servo à la terre sur l’Arduino.

Connectez un cavalier de la broche Signal du servo à la broche 9 de l’Arduino.

Étape 2: les lumières et les ultrasons

Sur une deuxième mini planche à pain, placez 4 DEL RGB dans les coins.

Connectez les broches rouge, verte, bleue et la terre des voyants ensemble pour former des broches communes rouge, verte, bleue et la terre, respectivement.

Connectez 4 cavaliers Dupont hommes / femmes au HC-SR04.

Connectez GND du HC-SR04 à la terre commune et branchez les 3 autres broches dans leurs rangées respectives de la planche à pain.

Étape 3: Deux trous carrés et une boîte

Dans un morceau de carton, découpez un rectangle de la même taille que la mini planche à pain.

Découpez des bandes d'environ 1/4 de pouce de largeur et collez-les au périmètre du rectangle. Collez la boîte que vous venez de créer au centre de la tête, sur le servo-klaxon.

Faites pivoter la section de la tête vers la position centrale, c’est-à-dire jusqu’à ce qu’elle regarde vers l’avant (même si elle n’a pas encore les yeux)

En utilisant une longue lame sur un couteau X-Acto, faites un trou carré à côté de la boîte, à travers la tête et le haut du corps simultanément. En d'autres termes, coupez à l'intérieur du corps de la vigne vierge.

Étape 4: fils

Tout d’abord, décollez le papier cireux et collez la planche à pain avec les lumières au-dessus de la boîte que nous avons fabriquée à la dernière étape.

Maintenant, sortez 7 des plus longs câbles de démarrage Dupont que vous avez. Environ 6 pouces chacun devrait suffire, ou vous pouvez souder deux ou trois plus courts ensemble.

Attachez un de ceux-ci aux rangées Rouge, Vert, Bleu, Trig, Echo, VCC et Ground sur la mini planche à pain supérieure.

Enfilez-les dans les trous que nous avons faits à la dernière étape.

Connectez le fil VCC à la broche positive du potentiomètre de la deuxième planche à pain.

Connectez le fil de terre à l’une des broches de terre ouvertes de l’Arduino.

Connectez le fil Trig à la broche 4 de l’Arduino.

Connectez le fil Echo à la broche 5 de l’Arduino.

Connectez le fil rouge à la broche 6 de l’Arduino.

Connectez le fil vert à la broche 11 de l’Arduino.

Connectez le fil bleu à la broche 3 de l’Arduino.

Tournez doucement la tête dans les deux sens jusqu'à ce que le servo atteigne sa limite. Avec l'arduino et la mini planche à pain à l'intérieur du corps, les fils ne doivent jamais être pincés ou tendus. Si tel est le cas, vous devrez les rallonger (c’est-à-dire que vous devrez souder un autre petit câble de raccordement à la fin du câble actuel).

Maintenant, vous pouvez attacher le haut de la tête!

Étape 4: Le reste de la tête

Ainsi, la partie à laquelle je me réfère comme la tête n'est pas encore une tête, mais une plate-forme. Ici, nous allons donner vie au visage distinctif de la plante grimpante! Pas vraiment. Nous le faisons plus tard quand nous le peignons. Mais ceci est la base pour cette étape ultérieure.

Étape 1: papier

En utilisant soit du papier pour imprimante, soit un Bristol plus épais (que je préfère car il ne se froisse pas aussi facilement et ne plissera pas autant que je le peins), découpez 5 carrés de 11 centimètres d'acrt, en laissant des onglets sur les bords pour pouvoir les coller eux autres ensemble.

En utilisant une colle de votre choix, assemblez les carrés en un cube dont l’un des côtés manque.

Étape 2: Plus de carton (Sérieusement, que ferais-je sans ce matériel?)

Imprimez le document Creeper Template que j'ai joint.

Posez le gabarit sur le carton et découpez les yeux et la bouche en laissant intactes les zones blanches. Faites ceci aussi proprement que possible, nous avons toujours besoin de la zone ombrée.

Étendez la zone ombrée sur l'un des côtés du cube adjacent au côté manquant et tracez légèrement les yeux et la bouche, en gardant à l'esprit que le côté manquant du cube est le fond.

À l’aide d’une colle de votre choix, collez soigneusement les yeux et la bouche en carton sur le à l'intérieur du cube, aligné sur le calque sur le à l'extérieur.

Découpez soigneusement les cercles sur le cube en utilisant le carton comme guide.

Étape 3: Capteur à ultrasons

Insérez le HC-SR04 dans les cercles que nous venons de créer, de sorte que le recto soit aligné avec le cube. Les broches d'en-tête doivent être orientées à l'opposé du côté manquant du cube.

Colle à chaud le capteur en place.

Étape 4: Coller la tête

REMARQUE: Vous voudrez peut-être tester le code avant de le faire pour vous assurer que vos voyants et votre HC-SR04 sont correctement câblés

Insérez soigneusement le cube au-dessus de la base de la tête et collez à chaud les bords une fois que vous êtes satisfait. Assurez-vous que votre capteur est orienté vers l'avant lorsque la tête est en position centrale.

Maintenant, vous pouvez passer à télécharger et tester le code!

Étape 5: Le code!

Le code de ce projet m'a pris un certain temps à écrire et est un peu partout. Au départ, j'avais l'intention d'utiliser un code différent pour les modes suivi et veille, mais des problèmes liés aux bibliothèques et aux broches du minuteur m'ont obligé à écrire une toute nouvelle section pour chacun de ceux-ci.

À l’origine, j’avais aussi l’intention d’avoir un sixième mode dans lequel la creeper joue le thème Calm de Minecraft, mais des tests préliminaires ont exclu cette idée car le thème semblait terrible et en conflit avec la bibliothèque Servo.

Quoi qu'il en soit, faites une lecture pour avoir une idée de ce que je fais avec, puis téléchargez le code sur votre Arduino.

/ * ---------------------------------------------------- -------------------------------------------- Ceci est un code pour une Sentinelle Arduino avec ultrasons. La conception originale est destinée à être un Creeper de Minecraft. Plusieurs "modes" peuvent être sélectionnés à l’aide de boutons-poussoirs et d’un potentiomètre. Le premier bouton-poussoir fait défiler les modes et le potentiomètre ajuste la "plage active". -------------------------------------- Les modes sont les suivants: 1 - Mode veille - 7 -couleur "respiration" (essentiellement une veilleuse) 2 - Creeper Sentry - Clignote et siffle lorsque quelqu'un pénètre dans la plage active 3 - Standard Sentry - Emettra un bip lorsque quelqu'un se trouvera dans la plage active 4 - Suivi d'objet - Suivra la première object qu'il "voit" tant qu'il se trouve dans la plage -------------------------------------- Code écrit par Dangerously Explosif Pas pour un usage commercial. -------------------------------------------------- --------------------------------------------- */ #comprendre / / initialise les bibliothèques // servo vars Servo sentryServo; // lance le servo int servoPosition = 0; // la position du servo const int numReadings = 3; // le nombre de lectures à prendre, augmentez cette valeur pour un scan plus lent et plus précis. int index = 0; // l'index de la lecture en cours int total; // la valeur totale de la somme de toutes les lectures effectuées à une position. int angle = 1; // le nombre de degrés décalés lors de chaque balayage tout en suivant un objet // ultrasons vars int echoPin = 5; // la broche d'écho du HCSR04 int trigPin = 4; // le trig pin du HCSR04 unsigned long pulseTime = 0; // variable pour chronométrer l'impulsion unsigned long distance = 0; // variable pour distance int moyenne; // pour l'avg. distance int minrange = 50; // la distance maximale en centimètres doit être quelque chose pour déclencher l'alarme // light vars int RED = 6; // broche RED des DEL int GREEN = 11; // Broche VERT des LEDs int BLUE = 3; // Broche BLEUE des voyants // Peu importe la broche que vous affectez, vous pouvez toujours la changer plus tard. // debouncing vars const int buttonPin = A1; // la broche du bouton-poussoir const int potPin int = A0; // la broche du potentiomètre int buttonState; // la lecture actuelle de la broche d'entrée int buttonState1; int lastButtonState = LOW; int lastButtonState1 = LOW; // lecture précédente de la broche d'entrée int mode = 0; // le mode sentinelle int colorMode = 0; // le mode LED en veille long lastDebounceTime = 0; // la dernière fois que la broche de sortie a été basculée long lastDebounceTime1 = 0; long debounceDelay = 50; // le temps de rebond; augmente si la sortie scintille // Autres variables int buzzerPin = A5; // fonction debounce void debounce () {// lit l'état du commutateur dans une variable locale: int reading = digitalRead (buttonPin); if (lecture! = lastButtonState) {// réinitialiser le temporisateur de rebond lastDebounceTime = millis (); } if ((millis () - lastDebounceTime)> debounceDelay) {// si l'état du bouton a changé: if (reading! = buttonState) {buttonState = reading; // change uniquement le mode si le nouvel état du bouton est BAS si (l'état du bouton == BAS) {mode ++; ton (buzzerPin, 500, 50); // bip pour que je sache qu'il s'est passé quelque chose si (mode> = 5) {mode = 0; }}}} // enregistrer la lecture. La prochaine fois dans la boucle, // ce sera le lastButtonState: lastButtonState = reading; } void getRange () {// recherche la plage à laquelle l'alarme doit se déclencher int rawRange = analogRead (potPin); // récupère les lectures du potentiomètre minRange = map (rawRange, 0, 1023, 0, 150); // mappé sur une valeur comprise entre 0 et 1,5 mètres} void getAlert1 () {getRange (); if (moyenne <= minRange) {bip (); Alerte(); }; } void getAlert () {getRange (); if (moyenne <= minRange) {blinky (); // clignote en rouge hiss (); // sifflement // les bons sons d'explosion sont très difficiles à produire, je les ai donc sifflés}; } void blinky () {digitalWrite (GREEN, LOW); analogWrite (BLUE, 0); int duration = 100; pour (int l = 0; l <= 10; l ++) {analogWrite (RED, 255); délai (durée); analogWrite (RED, 0); délai (durée); durée = durée - 10; }} int var1; int var2; void hiss () {for (int j = 0; j <= 100; j ++) {var1 = aléatoire (300, 700); var2 = aléatoire (300, 700); tonalité (buzzerPin, var1); retarder (2); tonalité (buzzerPin, var2); retarder (2); } noTone (buzzerPin); digitalWrite (GREEN, HIGH); } int duration = 500; int i = 0; void beep () {digitalWrite (GREEN, LOW); analogWrite (BLUE, 0); fréquence int = 500; durée = 200; pour (int i = 0; i <= 20; i ++) {analogWrite (RED, 255); digitalWrite (GREEN, LOW); ton (buzzerPin, fréquence); délai (durée); analogWrite (RED, 0); digitalWrite (GREEN, HIGH); délai (durée); noTone (buzzerPin); fréquence = fréquence + 10; durée = durée - 10; } ton (buzzerPin, fréquence); retard (500); noTone (buzzerPin); } int q = 200; void Alert () {digitalWrite (GREEN, LOW); ton (buzzerPin, 500); analogWrite (RED, 255); délai (q); analogWrite (RED, 0); délai (q); ton (buzzerPin, 300); analogWrite (RED, 255); délai (q); analogWrite (RED, 0); délai (q); ton (buzzerPin, 200); analogWrite (RED, 255); délai (q); analogWrite (RED, 0); délai (q); ton (buzzerPin, 100); analogWrite (RED, 255); délai (q); analogWrite (RED, 0); noTone (buzzerPin); délai (q); ton (buzzerPin, 100); analogWrite (RED, 255); délai (q); analogWrite (RED, 0); noTone (buzzerPin); délai (q); ton (buzzerPin, 100); analogWrite (RED, 255); délai (q); analogWrite (RED, 0); noTone (buzzerPin); digitalWrite (GREEN, HIGH); } int numReadings1 = 1; void getAverage () {for (index = 0; index <= numReadings1; index ++) {digitalWrite (trigPin, LOW); délaiMicrosecondes (50); digitalWrite (trigPin, HIGH); // envoi du signal delayMicroseconds (50); // attend 50 microsecondes pour qu'il retourne digitalWrite (trigPin, LOW); // ferme le signal pulseTime = pulseIn (echoPin, HIGH); // calcule le temps de retour du signal = pulseTime / 58; total = distance + total; délai (10); } moyenne = total / numReadings; total = 0; } / * Le code de suivi est très simple. Tout d'abord, il détermine si un objet est dans la plage. Si tel est le cas, alors il tourne jusqu’à ce qu’il ne voie pas l’objet, c’est-à-dire qu’il regarde juste au-delà d’un côté. Ensuite, tournez à gauche jusqu'à ce qu'il revoie l'objet et répétez l'opération. De cette façon, nous pouvons garder une trace de l'objet. Il s’agit essentiellement de l’ancienne logique "Le missile sait où il se trouve". Si nous savons où l’objet n’est pas, nous pouvons raisonnablement déterminer où il se trouve. La façon dont je l'ai configuré est plutôt instable, et je ne fais que suivre le bord d'un objet plutôt que l'objet lui-même. Si vous envisagez de suivre des objets plus volumineux, vous pouvez augmenter la valeur de la variable "angle" afin que le servo tourne par incréments plus importants, ce qui permet une analyse plus rapide et moins détaillée dans laquelle les petits objets risquent davantage d'être manqués. Je devrais mentionner qu'il s'agit d'un système très primitif, complexe et facile à tromper. Je ne recommande donc pas de l'utiliser comme mesure de sécurité ou comme système de ciblage. Ce n'est pas non plus nécessairement exact. * / void track () {sentryServo.write (servoPosition); // commence par obtenir le servo va getAverage (); // trouve ensuite la distance à cibler getRange (); // trouve la plage dans laquelle nous allons suivre un objet si (moyenne <= minRange) {// si l'objet est dans la plage, tourne à gauche servoPosition = servoPosition + angle; } if (average> = minRange) {// sinon tournez à droite servoPosition = servoPosition - angle; } if (servoPosition <= 10 || servoPosition> = 170) {// vous pouvez modifier ces valeurs afin que votre sentinelle effectue un balayage plus petit. angle = -angle; // si nous atteignons le bord de notre balayage, allons dans l'autre sens}} void setup () {sentryServo.attach (9); // le servo est sur la broche 9 sentryServo.write (90); pinMode (trigPin, OUTPUT); pinMode (echoPin, INPUT); pinMode (buttonPin, INPUT_PULLUP); // active low pinMode (RED, OUTPUT); pinMode (BLEU, SORTIE); pinMode (GREEN, OUTPUT); analogWrite (GREEN, 255); // séquence de couleurs pour notifier la réinitialisation et tester les DEL delay (1000); analogWrite (GREEN, 0); retard (500); analogWrite (RED, 255); délai (1000); analogWrite (RED, 0); retard (500); analogWrite (BLUE, 255); délai (1000); analogWrite (BLUE, 0); retard (500); pinMode (buzzerPin, OUTPUT); } int fade = 5; int état = 0; int compte = 0; int h = 50; void loop () {debounce (); while (mode == 0) {if (state == 0) {analogWrite (RED, colorMode); analogWrite (GREEN, 0); analogWrite (BLUE, 0); rebounce (); colorMode = colorMode + fade; délai (h); if (colorMode> = 255 || colorMode <= 0) {fade = -fade; compter ++; } if (nombre == 2) {nombre = 0; state ++; }} if (state == 1) {analogWrite (RED, 0); analogWrite (GREEN, colorMode); analogWrite (BLUE, 0); rebounce (); colorMode = colorMode + fade; délai (h); if (colorMode> = 255 || colorMode <= 0) {fade = -fade; compter ++; } if (nombre == 2) {nombre = 0; state ++; }} if (state == 2) {analogWrite (RED, 0); analogWrite (GREEN, 0); analogWrite (BLUE, colorMode); rebounce (); colorMode = colorMode + fade; délai (h); if (colorMode> = 255 || colorMode <= 0) {fade = -fade; compter ++; } if (nombre == 2) {nombre = 0; state ++; }} if (state == 3) {analogWrite (RED, colorMode); analogWrite (GREEN, colorMode); analogWrite (BLUE, 0); rebounce (); colorMode = colorMode + fade; délai (h); if (colorMode> = 255 || colorMode <= 0) {fade = -fade; compter ++; } if (nombre == 2) {nombre = 0; state ++; }} if (state == 4) {analogWrite (RED, colorMode); analogWrite (GREEN, 0); analogWrite (BLUE, colorMode); rebounce (); colorMode = colorMode + fade; délai (h); if (colorMode> = 255 || colorMode <= 0) {fade = -fade; compter ++; } if (nombre == 2) {nombre = 0; state ++; }} if (state == 5) {analogWrite (RED, 0); analogWrite (GREEN, colorMode); analogWrite (BLUE, colorMode); colorMode = colorMode + fade; délai (h); rebounce (); if (colorMode> = 255 || colorMode <= 0) {fade = -fade; compter ++; } if (nombre == 2) {nombre = 0; state ++; }} if (state == 6) {analogWrite (RED, colorMode); analogWrite (GREEN, colorMode); analogWrite (BLUE, colorMode); colorMode = colorMode + fade; délai (h); rebounce (); if (colorMode> = 255 || colorMode <= 0) {fade = -fade; compter ++; } if (nombre == 2) {nombre = 0; state ++; }} if (state == 7) {debounce (); état = 0; } debounce (); }; while (mode == 1) {debounce (); analogWrite (GREEN, 255); analogWrite (BLUE, 0); analogWrite (RED, 0); for (servoPosition = 0; servoPosition <180; servoPosition ++) {debounce (); sentryServo.write (servoPosition); for (index = 0; index <= numReadings; index ++) {// effectue des lectures à partir du capteur et les compare à digitalWrite (trigPin, LOW); délaiMicrosecondes (50); digitalWrite (trigPin, HIGH); // envoi du signal delayMicroseconds (50); // attend 50 microsecondes pour qu'il retourne digitalWrite (trigPin, LOW); // ferme le signal pulseTime = pulseIn (echoPin, HIGH); // calcule le temps de retour du signal = pulseTime / 58; // convertir en centimètres total = distance + total; délai (10); } moyenne = total / numReadings; // récupère notre moyenne getAlert (); // exploser si trop proche total = 0; // réinitialiser nos totaux} debounce (); // sens inverse lorsque nous arrivons de part et d'autre pour (servoPosition = 180; servoPosition> 0; servoPosition--) {// aller de droite à gauche debounce (); sentryServo.write (servoPosition); for (index = 0; index <= numReadings; index ++) {digitalWrite (trigPin, LOW); délaiMicrosecondes (50); digitalWrite (trigPin, HIGH); délaiMicrosecondes (50); digitalWrite (trigPin, LOW); pulseTime = pulseIn (échoPin, HAUT); distance = pulseTime / 58; total = distance + total; délai (10); } moyenne = total / numReadings; getAlert (); total = 0; }}; while (mode == 2) {// agit toujours comme une sentinelle, mais avec des sons différents debounce (); for (servoPosition = 0; servoPosition <180; servoPosition ++) {debounce (); sentryServo.write (servoPosition); for (index = 0; index <= numReadings; index ++) {// effectue des lectures à partir du capteur et les compare à digitalWrite (trigPin, LOW); délaiMicrosecondes (50); digitalWrite (trigPin, HIGH); // envoi du signal delayMicroseconds (50); // attend 50 microsecondes pour qu'il retourne digitalWrite (trigPin, LOW); // ferme le signal pulseTime = pulseIn (echoPin, HIGH); // calcule le temps de retour du signal = pulseTime / 58; // convertir en centimètres total = distance + total; délai (10); } moyenne = total / numReadings; // récupère notre moyenne getAlert1 (); // exploser si trop proche total = 0; // réinitialise nos totaux} // sens inverse lorsque nous arrivons d'un côté ou de l'autre debounce (); for (servoPosition = 180; servoPosition> 0; servoPosition--) {// allant de droite à gauche debounce (); sentryServo.write (servoPosition); for (index = 0; index <= numReadings; index ++) {digitalWrite (trigPin, LOW); délaiMicrosecondes (50); digitalWrite (trigPin, HIGH); délaiMicrosecondes (50); digitalWrite (trigPin, LOW); pulseTime = pulseIn (échoPin, HAUT); distance = pulseTime / 58; total = distance + total; délai (10); } moyenne = total / numReadings; getAlert1 (); total = 0; }}; // recentre le servo pour la fonction de piste servoPosition = 90; while (mode == 3) {debounce (); analogWrite (BLUE, 255); analogWrite (GREEN, 0); Piste(); }; while (mode == 4) {sentryServo.write (90); rebounce (); }; analogWrite (BLUE, 0); // éteint la lumière bleue pour la prochaine fois. délai (10); // laisse le processeur reposer un peu}

Étape 6: Monter des objets, de la puissance et de la peinture!

Ok, maintenant votre sentinelle devrait être fonctionnelle. Faisons-le joli!

Étape 1: Monter des objets

À l’aide d’un adhésif de votre choix, montez l’Arduino en position verticale le long du "mur arrière" du corps.

Pelez le papier cireux au bas de la mini planche à pain et collez-le aussi loin que possible sur le "plancher" du corps.

Fermez la porte d'accès pour vous assurer que tout va bien.

Étape 2: Puissance

Découpez un trou au bas du corps de la plante grimpante. Le point de sortie devrait être quelque part entre les pieds.

Connectez une prise d'alimentation de votre choix (j'ai utilisé une prise de canon standard que j'ai récoltée d'un Arduino frit) aux broches Vin et GND de l'Arduino, puis collez-la à chaud dans le trou que vous venez de créer.

Vérifiez que cela fonctionne, puis passez à autre chose.

Étape 3: peinture!

Je pense que cette partie est assez explicite. Vous pouvez utiliser les détails et les couleurs que vous préférez, ou même ne pas les peindre du tout. Tout dépend de comment vous le voulez.

Je n'ai utilisé qu'une seule nuance de vert pour le tout et ça a l'air diablement bon. Mon mélange est un rapport 1: 1 de Delta Ceramcoat "Sunshine Pearl" jaune avec Apple Barrel Plaid "20528 Leaf Green" et un peu (une goutte sur 10 de jaune) de Delta Ceramcoat "Phthalo Green" pour ce bleu La teinte qui fait que le tout brille bien au soleil.

Le noir est "Apple Barrel Plaid" "20504 Black" et le gris, "Apple Barrel Plaid" "20580 Pewter Grey". J'ai utilisé une brosse plate pour le tout.

Laissez sécher et alto! Un fini Creeper Sentry!

Étape 7: les résultats

Dans l’ensemble, j’aime l’évolution de celui-ci. Même si je ne l'avais pas planifié de cette façon, c'est en fait à l'échelle de l'horloge de mon appareil de chauffage et presque à l'échelle de ma torche (qui est juste un peu grosse).

Le code est un peu nerveux, ce que j'espère bien corriger dans les prochains jours, mais l'effet est toujours là. Si jamais je découvre comment, je reviendrai et j'ajouterai quelques lignes de code pour le son d'explosion symbolique que les creepers doivent ajouter d'autant plus de spécificité.

En fait, j'ai ajouté le code de suivi à la dernière minute sur un coup de tête, et j'aime beaucoup son résultat, même si cela ne fonctionne pas très bien. C'est vraiment cool d'entrer dans une pièce et de vous regarder, puis de continuer à vous regarder pendant que vous passez, comme dans Minecraft. Eh bien, sauf la partie où elle me poursuit et explose.Mais c'est un projet pour une autre fois.

Comme toujours, ce sont les projets de Dangerously Explosive, sa mission de toute une vie, "de construire hardiment ce que vous voulez construire, et plus encore".

Vous pouvez trouver le reste de mes projets ici.

S'il vous plaît, s'il vous plaît voter si vous avez aimé ce projet et que vous voulez en voir plus.

Assurez-vous de commenter si vous avez des questions, des commentaires (duh?) Ou des suggestions, je veux tout entendre!