Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Giant Animatronics Lego Minfig Operation Game

Componenten en benodigdheden

Arduino UNO
× 2
Adafruit Arduino MP3 Shield
× 1
MG90S Gear Micro Servo
× 6
Luidspreker:3W, 4 ohm
× 2
OpenBuilds kogellager – 688Z 8x16x5
× 12

Benodigde gereedschappen en machines

Lulzbot Taz 5 FDM-printer
X-Carve CNC

Over dit project

Dit project is in 4 fasen gerealiseerd. Ik zal snel de eerste 3 fasen behandelen (die geen elektronica bevatten) en de 4 fase beschrijven die Frank in het operatiespel veranderde en audio en animatronics toevoegde.

Fase 1:De Megafigs bouwen

Ik begon met het maken van de hand. Ik dacht dat dit het moeilijkste deel van de eerste build zou zijn en het definieerde de schaal voor de rest van de onderdelen die moesten worden gefabriceerd. De hand is gemaakt van PVC-buis en glasvezelhars om de leegte tussen de binnenste en buitenste hand te vullen.

De hoofdfabricage was de volgende. Het is gemaakt van PVC-buis (een grote buisfitting voor het grootste deel van het hoofd), MDF en hars om de leegte in de bovenste knobbel te vullen.

De body van de megafigs was gemaakt van MDF en een vrij ongecompliceerde doos gebouwd. PVC-fittingen worden gebruikt als verbindingen tussen de appendages en de romp

De poten zijn gemaakt van MDF en PVC om de rondingen van de bovenbenen te definiëren.

De armen (die uiteindelijk het moeilijkste deel waren) werden opgeruwd met PVC-buis tegen de onderarm en MDF voor de bovenarm. Steekschuim werd gebruikt als ruimtevuller. Bondo werd gebruikt om de vorm van de bovenarm te creëren, en tonnen schuren en plamuren brachten het tot zijn uiteindelijke vorm.

De armen en handen zijn gegoten en gegoten met Smoothcast 300.

Alles is geschilderd op basis van de Monster Hunters Lego-kit.

Fase 2:Haar

Deze fase bestond uit het fabriceren van het Wetenschappershaar. Gereedschapsschuim werd met behulp van de lintzaag in de basisvormen van de haarslierten gesneden. De verschillende delen van de haarstukken werden aan elkaar gelijmd met epoxy.

Het hele haarstuk werd bedekt met Smoothcast 300 om een ​​plastic omhulsel over het schuim te creëren. het werd vervolgens geschuurd en gevuld.

Epoxy sculpt werd gebruikt om alle naden tussen de haarsecties op te vullen.

Het was gegrond en geverfd.

Fase 3:Frank's bed

De derde fase was de constructie van Franks bed op basis van de Crazy Scientist en zijn Monster Lego-kit. Het is een eenvoudige doos die gemaakt is van MDF en PVC-buis voor de noppen.

De hoekdetails zijn gemaakt met PVC-buis die een schijf MDF heeft ingeklemd.

Alles werd geschuurd, geprimed en geverfd.

Fase 4:Operatie Spel en beweging

Het laatste deel van dit project (tot nu toe) is het omzetten van Frank in een operatiespel en het toevoegen van zowel audio als beweging aan de Megafigs. Ik zal elk lichaamsdeel van de build gedetailleerd beschrijven in plaats van in chronologische volgorde te gaan van hoe de dingen zijn gebeurd (er werd tegelijkertijd aan gewerkt).

Torso :

De torso had 3D-geprinte beugels toegevoegd aan de verbindingen die 2 rolschaatslagers bevatten. Deze fungeren als een draaipunt voor de armen en het hoofd.

Het bovenlichaam van Frank had 2 snoepschalen die 3D-geprint waren, bedekt met gefreesde aluminium lippen en bedekt met een nieuwe torsoplaat. De aluminium lippen fungeren als een schakelaar voor het operatiespel. Wanneer de tang (die is aangesloten op het MP3-scherm) het aluminium raakt, voltooit het het circuit en wordt het programma geactiveerd.

Hoofden:

Beide koppen zijn aangepast om luidsprekers te verplaatsen en vast te houden. Eerst werd een 3D-geprinte beugel aan de nek toegevoegd om de 5/16e bout vast te houden die als as fungeert.

Geperforeerd metaal werd gebruikt als richtlijn om de gaten voor de luidsprekergrill in kaart te brengen. Ik was het meest nerveus over dit proces. Elke fout zou mijn verfbeurt op de gezichten verpesten. De gaten zijn erin geverfd om overeen te komen met de omringende kleur.

Er is een 3D-geprinte beugel gemaakt om de luidsprekers achter de spreekroosters te houden.

Benen:

De nieuwe benen werden 3D-geprint in twee helften, evenals een botvormige snoepschaal. Een aluminium plaat werd gefreesd zoals de torso. De poten werden aan elkaar gelijmd, geschuurd, gladgestreken met bondo en geverfd.

Armen :

De originele master voor de armen werd aangepast om een ​​3D-geprinte beugel te accepteren die een 5/16e vet voor een as bevatte. Ze werden vervolgens omgevormd, gegoten, schoongemaakt en geverfd.

Servo's:

De servo's werden geïnstalleerd met behulp van 3D-geprinte beugels en verbonden met de appendages via draad en een aluminium hoorn bevestigde de 5/16e bouten. Later werden veren toegevoegd om te helpen bij het optillen van de armen.

Elektronica:

Alle elektronica werd op een stuk MDF gemonteerd om een ​​prototype testbed te creëren. Deze opzet stelde mij en Daniel in staat om de programmering, tweek-dingen en glitches uit te zoeken. Alles werkte goed.

De manier waarop de elektronica werkt is

1:het MP3-schild wacht op 1 van de 3 ingangen (de tang op een van de aluminium platen)

2:Wanneer een aluminium plaat wordt geactiveerd, speelt het MP3-schild het bijbehorende MP3-bestand af en stuurt het een signaal naar de servo-Arduino.

3:Wanneer de servo-arduino een signaal krijgt van het MP3-schild, voert het de bijbehorende code voor de servo's uit.

Beide arduino's waren aan de onderkant van Franks bed gemonteerd en alles opnieuw bedraad.

Klaar voor trick or treaters:

Alles werkt fantastisch en hield een nacht vol misbruik door.

Ga voor een meer gedetailleerd bouwlogboek naar ... http://www.therpf.com/showthread.php?t=195101. Daar heb ik elke stap gedetailleerd zoals ik die heb gemaakt.

Code

  • Servo's
  • Geluidseffecten
Servo'sArduino
Deze code wordt geladen op de Arduino uno die alle 6 servomotoren bestuurt. In principe wacht het om een ​​van de 3 signalen van het MP3-schild te ontvangen. Wanneer het signaal wordt ontvangen, voert de servo Arduino Uno de bijbehorende servobewegingen uit.
/****************************** Targus - Bediening - Servo's **************************//****** Opmerkingen******// / Digitale pinnen 0 en 1 worden normaal gesproken gebruikt voor seriële communicatie bij het uploaden en bewaken van een Arduino vanaf een computer.// Digitale pinnen 0 en 1 kunnen worden gebruikt voor servo's als de Arduino niet is aangesloten op een computer.// Als digitale pinnen 0 en 1 worden gebruikt voor servo's, becommentarieer alle regels die beginnen met 'Serial'. in dit bestand.// Zorg ervoor dat deze Arduino is ingeschakeld voor de andere Arduino, aangezien deze Arduino 5V-signalen zal ontvangen.// Zorg ervoor dat een GND-draad op deze Arduino is aangesloten op GND op de andere Arduino./**** ***** Omvat**********/#include /********** Variabelen***********/Servo servo5;Servo servo6;Servo servo7;Servo servo8;Servo servo9;Servo servo10;Servo servo11;int pin2 =2;int pin3 =3;int pin4 =4;/************** Arduino Setup***************/void setup() { Serial.begin(9600); // schakel seriële communicatie in voor ontwikkeling en probleemoplossing Serial.println ("Targus - Operation - Servos\n"); /**************************************** Servo's aansluiten en beginposities instellen ** ****************************************/ servo5.attach(5); // digitale pin 5 servo5.write (90); // ga naar 90 graden servo6.attach (6); // digitale pin 6 servo6.write (90); servo7.attach(7); // digitale pin 7 servo7.write (90); servo8.attach(8); // digitale pin 8 servo8.write (90); servo9.attach (9); // digitale pin 9 servo9.write (80); servo10.attach(10); // digitale pin 10 servo10.write (90); servo11.attach (11); // digitale pin 11 servo11.write (80); /************************* Instellingen digitale ingangspinnen ******************** ******/ // Stel invoerpinnen in zodat de Arduino met geluidseffecten ons kan vertellen wanneer servo's moeten worden geactiveerd. pinMode (pin2, INPUT_PULLUP); pinMode (pin3, INPUT_PULLUP); pinMode (pin4, INPUT_PULLUP);}/************* Arduino Loop ***********/void loop () {if (digitalRead (pin2) ==HOOG) { zap2(); } else if (digitalRead(pin3) ==HOOG) { zap3(); } else if (digitalRead(pin4) ==HOOG) { zap4(); } delay(300);}/********** Functies***********/int moveServo(Servo &servo, int degreeStart, int degreeEnd, unsigned long timeEnd, unsigned long timeStart , float (*easing)(float), unsigned long timeNow) { // deze functie retourneert een nummer 1 als er nog werk aan de winkel is timeEnd +=timeStart; // voeg een vertraging toe aan de eindtijd if (timeNow  timeEnd) { // servobewegingsfase gedaan, niets te doen return 0; } // als we zo ver komen, bereid je dan voor op het verplaatsen van een servo float percentToMove =float(timeNow - timeStart) / float(timeEnd - timeStart); procentToMove =versoepeling(percentToMove); // map gradenbereiken 0-180 tot microsecondenbereik 500-2400 voor een SG-92R http://www.servodatabase.com/servo/towerpro/sg92r degreeStart =map(degreeStart, 0, 180, 500, 2400); gradenEnd =kaart(graadEnd, 0, 180, 500, 2400); vlotter servoTo =0; if (degreeEnd> degreeStart) {// draai tegen de klok in servoTo =((degreeEnd - degreeStart) * procentToMove) + degreeStart; } else { // roteer met de klok mee percentToMove =1 - percentToMove; // inverse procent dus waarden als 0,8 worden 0,2 servoTo =((degreeStart - degreeEnd) * percentToMove) + degreeEnd; } servo.writeMicroseconden(servoTo); // Serial.print ("Zou toewijzen aan:"); Serial.println(servoTo); // Serial.print("degreeStart:"); Serial.println(graadStart); // Serial.print("degreeEnd:"); Serial.println(graadEnd); // Serial.print ("timeEnd:"); Serial.println(timeEnd); // Serial.print ("timeStart:"); Serial.println(timeStart); // Serial.print ("timeNow:"); Serial.println(timeNow); // Serial.print ("percentToMove:"); Serial.println(percentToMove); // Serial.print ("servoTo:"); Serial.println(servoTo); // Serial.print ("\n"); return 1;}/**************** Functies:Easing********************/// Easing functies van https://github.com/warrenm/AHEasing/blob/master/AHEasing/easing.c hernoemd om overeen te komen met http://easings.net/ voor eenvoudige previewing.float gemakInBack(float pos) { // Gemodelleerd naar de overschrijding kubieke y =x^3-x*sin(x*pi) return pos * pos * pos - pos * sin(pos * M_PI);}float gemakOutBack(float pos) {// Gemodelleerd na overschrijding van kubieke y =1-( (1-x)^3-(1-x)*sin((1-x)*pi)) float f =(1 - pos); return 1 - (f * f * f - f * sin(f * M_PI));}float gemakInOutBack(float pos) { // Gemodelleerd naar de stuksgewijs voorbijschietende kubieke functie:// y =(1/2)*(( 2x)^3-(2x)*sin(2*x*pi)); [0, 0,5) // y =(1/2)*(1-((1-x)^3-(1-x)*sin((1-x)*pi))+1); [0.5, 1] ​​if (pos <0.5) { float f =2 * pos; retourneer 0,5 * (f * f * f - f * sin(f * M_PI)); } else { float f =(1 - (2 * pos - 1)); retourneer 0,5 * (1 - (f * f * f - f * sin(f * M_PI))) + 0,5; }}float gemakInBounce(float pos) { return 1 - gemakOutBounce(1 - pos);}float gemakOutBounce(float pos) { if (pos <4 / 11.0) { return (121 * pos * pos) / 16.0; } else if (pos <8 / 11.0) { return (363 / 40.0 * pos * pos) - (99 / 10.0 * pos) + 17 / 5.0; } else if (pos <9 / 10.0) { return (4356 / 361,0 * pos * pos) - (35442 / 1805.0 * pos) + 16061 / 1805.0; } else { return (54 / 5.0 * pos * pos) - (513 / 25.0 * pos) + 268 / 25.0; }} float gemakInOutBounce(float pos) { if (pos <0.5) { return 0.5 * gemakInBounce(pos * 2); } else { return 0,5 * gemakOutBounce(pos * 2 - 1) + 0,5; }}float gemakInCirc(float pos) { // Gemodelleerd naar verschoven kwadrant IV van eenheidscirkel return 1 - sqrt(1 - (pos * pos));}float gemakOutCirc(float pos) { // Gemodelleerd naar verschoven kwadrant II van eenheid circle return sqrt((2 - pos) * pos);}float gemakInOutCirc(float pos) { // Gemodelleerd naar de stuksgewijs circulaire functie // y =(1/2)(1 - sqrt(1 - 4x^2)); [0, 0,5) // y =(1/2)(sqrt(-(2x - 3)*(2x - 1)) + 1); [0.5, 1] ​​if (pos <0.5) { return 0.5 * (1 - sqrt(1 - 4 * (pos * pos))); } else { return 0.5 * (sqrt(-((2 * pos) - 3) * ((2 * pos) - 1)) + 1); }} float gemakInCubic (float pos) { // Gemodelleerd naar de kubieke y =x ^ 3 return pos * pos * pos;} float gemakOutCubic (float pos) { // Gemodelleerd naar de kubieke y =(x - 1) ^ 3 + 1 vlotter f =(pos - 1); return f * f * f + 1;}float gemakInOutCubic(float pos) { // Gemodelleerd naar de stuksgewijs kubieke // y =(1/2)((2x)^3); [0, 0,5) // y =(1/2)((2x-2)^3 + 2); [0.5, 1] ​​if (pos <0.5) { return 4 * pos * pos * pos; } else { float f =((2 * pos) - 2); retourneer 0,5 * f * f * f + 1; }}float gemakInElastic(float pos) { // Gemodelleerd naar de gedempte sinusgolf y =sin(13pi/2*x)*pow(2, 10 * (x - 1)) return sin(13 * M_PI_2 * pos) * pow(2, 10 * (pos - 1));}float gemakOutElastic(float pos) { // Gemodelleerd naar de gedempte sinusgolf y =sin(-13pi/2*(x + 1))*pow(2, - 10x) + 1 return sin(-13 * M_PI_2 * (pos + 1)) * pow(2, -10 * pos) + 1;}float gemakInOutElastic(float pos) { // Gemodelleerd naar de stuksgewijs exponentieel gedempte sinusgolf :// y =(1/2)*sin(13pi/2*(2*x))*pow(2, 10 * ((2*x) - 1)); [0,0.5) // y =(1/2)*(sin(-13pi/2*((2x-1)+1))*pow(2,-10(2*x-1)) + 2 ); [0.5, 1] ​​if (pos <0.5) { return 0.5 * sin(13 * M_PI_2 * (2 * pos)) * pow(2, 10 * ((2 * pos) - 1)); } else { return 0.5 * (sin(-13 * M_PI_2 * ((2 * pos - 1) + 1)) * pow(2, -10 * (2 * pos - 1)) + 2); }}float gemakInExpo(float pos) { // Gemodelleerd naar de exponentiële functie y =2^(10(x - 1)) return (pos ==0.0) ? pos :pow(2, 10 * (pos - 1));}float gemakOutExpo(float pos) {// Gemodelleerd naar de exponentiële functie y =-2^(-10x) + 1 return (pos ==1.0) ? pos:1 - pow(2, -10 * pos);}float gemakInOutExpo(float pos) { // Gemodelleerd naar de stuksgewijs exponentiële // y =(1/2)2^(10(2x - 1)); [0,0.5) // y =-(1/2)*2^(-10(2x - 1))) + 1; [0.5,1] if (pos ==0.0 || pos ==1.0) return pos; if (pos <0.5) { return 0.5 * pow(2, (20 * pos) - 10); } else { return -0.5 * pow(2, (-20 * pos) + 10) + 1; }}float linear(float pos) {return pos;}float gemakInQuad(float pos) { // Gemodelleerd naar de parabool y =x^2 return pos * pos;}float gemakOutQuad(float pos) { // Gemodelleerd naar de parabool y =-x^2 + 2x return -(pos * (pos - 2));}float gemakInOutQuad(float pos) { // Gemodelleerd naar de stuksgewijs kwadratische // y =(1/2)((2x)^2 ); [0, 0,5) // y =-(1/2)((2x-1)*(2x-3) - 1); [0.5, 1] ​​if (pos <0.5) { return 2 * pos * pos; } else { return (-2 * pos * pos) + (4 * pos) - 1; }}float gemakInQuart(float pos) { // Gemodelleerd naar de quartic x^4 return pos * pos * pos * pos;}float gemakOutQuart(float pos) { // Gemodelleerd naar de quartic y =1 - (x - 1) ^4 float f =(pos - 1); return f * f * f * (1 - pos) + 1;}float gemakInOutQuart(float pos) { // Gemodelleerd naar de stuksgewijs quartic // y =(1/2)((2x)^4); [0, 0,5) // y =-(1/2)((2x-2)^4 - 2; [0.5, 1] ​​if (pos <0.5) { return 8 * pos * pos * pos * pos; } else { float f =(pos - 1); retourneer -8 * f * f * f * f + 1; }} float gemakInQuint (float pos) { // Gemodelleerd naar de quintic y =x ^ 5 return pos * pos * pos * pos * pos;} float gemakOutQuint (float pos) { // Gemodelleerd naar de quintic y =(x - 1)^5 + 1 float f =(pos - 1); return f * f * f * f * f + 1;}float gemakInOutQuint(float pos) { // Gemodelleerd naar de stuksgewijs quintic // y =(1/2)((2x)^5); [0, 0,5) // y =(1/2)((2x-2)^5 + 2); [0.5, 1] ​​if (pos <0.5) { return 16 * pos * pos * pos * pos * pos; } else { float f =((2 * pos) - 2); retourneer 0,5 * f * f * f * f * f + 1; }} float gemakInSine (float pos) { // Gemodelleerd naar kwartcyclus van sinusgolfretour sin ((pos - 1) * M_PI_2) + 1;} float gemakOutSine (float pos) { // Gemodelleerd naar kwartcyclus van sinus wave (verschillende fase) return sin(pos * M_PI_2);}float gemakInOutSine(float pos) {// Gemodelleerd na halve sinusgolf return 0.5 * (1 - cos(pos * M_PI));}/****** ********** Functies:Zap********************//****** Zap 2******/void zap2() { Serial.println("ZAP 2 gebeld!"); //Bone unsigned long timeStart =millis(); int todo; do { unsigned long timeNow =millis() - timeStart; todo =0; // M Leg Kick //todo +=moveServo (servo5, 90, 50, 100, 0, gemakInOutCubic, timeNow); // verplaats servo5 van 90 naar 180 graden gedurende 1 seconde na een vertraging van 0 seconden // todo +=moveServo (servo5, 50, 90, 500, 500, gemakOutBounce, timeNow); // verplaats servo5 van 180 naar 90 graden gedurende 1 seconde na een vertraging van 1 seconde // M Ga heen en weer om te doen +=moveServo (servo7, 90, 110, 500,0, gemakInOutCubic, timeNow); // verplaats servo7 van 90 naar 180 graden gedurende 1 seconde na een vertraging van 0 seconden todo +=moveServo (servo7, 110, 70, 500, 500, gemakInOutCubic, timeNow); // verplaats servo7 van 180 naar 90 graden gedurende 1 seconde na een vertraging van 1 seconde todo +=moveServo (servo7, 70, 110, 500, 1000, gemakInOutCubic, timeNow); todo +=moveServo(servo7, 110, 70, 500, 1500, gemakInOutCubic, timeNow); todo +=moveServo(servo7, 70, 110, 500, 2000, gemakInOutCubic, timeNow); todo +=moveServo(servo7, 110, 70, 500, 2500, gemakInOutCubic, timeNow); todo +=moveServo(servo7, 70, 90, 500, 3000, gemakInOutCubic, timeNow); // M linkerarm op en neer om te doen +=moveServo (servo8, 90, 170, 1000, 0, gemakInOutCubic, timeNow); // verplaats servo8 van 90 naar 180 graden gedurende 1 seconde na een vertraging van 0 seconden todo +=moveServo (servo8, 170, 90, 1000, 4000, gemakOutBounce, timeNow); // verplaats servo8 van 180 naar 90 graden gedurende 1 seconde na een vertraging van 1 seconde // M rechterarm op en neer om te doen +=moveServo (servo6, 90, 130, 1000, 1500, gemakInOutCubic, timeNow); // verplaats servo8 van 90 naar 180 graden gedurende 1 seconde na een vertraging van 0 seconden todo +=moveServo (servo6, 130, 90, 1000, 5000, gemakOutBounce, timeNow); // verplaats servo8 van 180 naar 90 graden gedurende 1 seconde na een vertraging van 1 seconde // S Ga heen en weer om te doen +=moveServo (servo10, 90, 40, 1000, 500, gemakInOutCubic, timeNow); // verplaats servo7 van 90 naar 180 graden gedurende 1 seconde na een vertraging van 0 seconden todo +=moveServo (servo10, 40, 105, 1000, 2000, gemakInOutCubic, timeNow); // verplaats servo7 van 180 naar 90 graden gedurende 1 seconde na een vertraging van 1 seconde todo +=moveServo (servo10, 105, 90, 1000, 6000, gemakInOutCubic, timeNow); // S linkerarm op en neer om te doen +=moveServo (servo11, 80, 160, 1000, 2000, gemakInOutCubic, timeNow); // verplaats servo8 van 90 naar 180 graden gedurende 1 seconde na een vertraging van 0 seconden todo +=moveServo (servo11, 160, 80, 1000, 5000, gemakInOutCubic, timeNow); // verplaats servo8 van 180 naar 90 graden gedurende 1 seconde na een vertraging van 1 seconde // S rechterarm op en neer om te doen +=moveServo (servo9, 80, 20, 1000, 1000, gemakInOutCubic, timeNow); // verplaats servo8 van 90 naar 180 graden gedurende 1 seconde na een vertraging van 0 seconden todo +=moveServo (servo9, 20, 80, 1000, 2000, gemakInOutCubic, timeNow); // verplaats servo8 van 180 naar 90 graden gedurende 1 seconde na een vertraging van 1 seconde (20); } while (todo> 0);}/****** Zap 3*******/void zap3() { Serial.println("ZAP 3 gebeld!"); unsigned long timeStart =millis(); int todo; do { unsigned long timeNow =millis() - timeStart; todo =0; // M Ga heen en weer om te doen +=moveServo (servo7, 90, 130, 1000, 0, gemakInOutCubic, timeNow); // verplaats servo7 van 90 naar 180 graden gedurende 1 seconde na een vertraging van 0 seconden todo +=moveServo (servo7, 130, 90, 1000, 5000, gemakInOutCubic, timeNow); // verplaats servo7 van 180 naar 90 graden gedurende 1 seconde na een vertraging van 1 seconde // M linkerarm op en neer om te doen +=moveServo (servo8, 90, 170, 1000, 0, gemakInOutCubic, timeNow); // verplaats servo8 van 90 naar 180 graden gedurende 1 seconde na een vertraging van 0 seconden todo +=moveServo (servo8, 170, 90, 1000, 4000, gemakOutBounce, timeNow); // verplaats servo8 van 180 naar 90 graden gedurende 1 seconde na een vertraging van 1 seconde // M rechterarm op en neer om te doen +=moveServo (servo6, 90, 130, 1000, 1500, gemakInOutCubic, timeNow); // verplaats servo8 van 90 naar 180 graden gedurende 1 seconde na een vertraging van 0 seconden todo +=moveServo (servo6, 130, 90, 1000, 5000, gemakOutBounce, timeNow); // verplaats servo8 van 180 naar 90 graden gedurende 1 seconde na een vertraging van 1 seconde // S Ga heen en weer om te doen +=moveServo (servo10, 90, 40, 1000, 500, gemakInOutCubic, timeNow); // verplaats servo7 van 90 naar 180 graden gedurende 1 seconde na een vertraging van 0 seconden todo +=moveServo (servo10, 40, 105, 1000, 2000, gemakInOutCubic, timeNow); // verplaats servo7 van 180 naar 90 graden gedurende 1 seconde na een vertraging van 1 seconde todo +=moveServo (servo10, 105, 90, 1000, 6000, gemakInOutCubic, timeNow); // S linkerarm op en neer om te doen +=moveServo (servo11, 80, 160, 1000, 0, gemakInOutCubic, timeNow); // verplaats servo8 van 90 naar 180 graden gedurende 1 seconde na een vertraging van 0 seconden todo +=moveServo (servo11, 160, 80, 1000, 5000, gemakInOutCubic, timeNow); // verplaats servo8 van 180 naar 90 graden gedurende 1 seconde na een vertraging van 1 seconde // S rechterarm op en neer om te doen +=moveServo (servo9, 80, 20, 1000, 1000, gemakInOutCubic, timeNow); // verplaats servo8 van 90 naar 180 graden gedurende 1 seconde na een vertraging van 0 seconden todo +=moveServo (servo9, 20, 80, 1000, 6000, gemakInOutCubic, timeNow); // verplaats servo8 van 180 naar 90 graden gedurende 1 seconde na een vertraging van 1 seconde (10); } while (todo> 0);}/****** Zap 4******/void zap4() { Serial.println("ZAP 4 gebeld!"); unsigned long timeStart =millis(); int todo; do { unsigned long timeNow =millis() - timeStart; todo =0; // M Ga heen en weer om te doen +=moveServo (servo7, 90, 130, 1000, 0, gemakInOutCubic, timeNow); // verplaats servo7 van 90 naar 180 graden gedurende 1 seconde na een vertraging van 0 seconden todo +=moveServo (servo7, 130, 90, 1000, 5000, gemakInOutCubic, timeNow); // verplaats servo7 van 180 naar 90 graden gedurende 1 seconde na een vertraging van 1 seconde // M linkerarm op en neer om te doen +=moveServo (servo8, 90, 170, 1000, 0, gemakInOutCubic, timeNow); // verplaats servo8 van 90 naar 180 graden gedurende 1 seconde na een vertraging van 0 seconden todo +=moveServo (servo8, 170, 90, 1000, 4000, gemakOutBounce, timeNow); // verplaats servo8 van 180 naar 90 graden gedurende 1 seconde na een vertraging van 1 seconde // M rechterarm op en neer om te doen +=moveServo (servo6, 90, 130, 1000, 1500, gemakInOutCubic, timeNow); // verplaats servo8 van 90 naar 180 graden gedurende 1 seconde na een vertraging van 0 seconden todo +=moveServo (servo6, 130, 90, 1000, 5000, gemakOutBounce, timeNow); // verplaats servo8 van 180 naar 90 graden gedurende 1 seconde na een vertraging van 1 seconde // S Ga heen en weer om te doen +=moveServo (servo10, 90, 40, 1000, 500, gemakInOutCubic, timeNow); // verplaats servo7 van 90 naar 180 graden gedurende 1 seconde na een vertraging van 0 seconden todo +=moveServo (servo10, 40, 105, 1000, 2000, gemakInOutCubic, timeNow); // verplaats servo7 van 180 naar 90 graden gedurende 1 seconde na een vertraging van 1 seconde todo +=moveServo (servo10, 105, 90, 1000, 6000, gemakInOutCubic, timeNow); // S linkerarm op en neer om te doen +=moveServo (servo11, 80, 160, 1000, 2000, gemakInOutCubic, timeNow); // verplaats servo8 van 90 naar 180 graden gedurende 1 seconde na een vertraging van 0 seconden todo +=moveServo (servo11, 160, 80, 1000, 5000, gemakInOutCubic, timeNow); // verplaats servo8 van 180 naar 90 graden gedurende 1 seconde na een vertraging van 1 seconde // S rechterarm op en neer om te doen +=moveServo (servo9, 80, 20, 1000, 1000, gemakInOutCubic, timeNow); // verplaats servo8 van 90 naar 180 graden gedurende 1 seconde na een vertraging van 0 seconden todo +=moveServo (servo9, 20, 80, 1000, 2000, gemakInOutCubic, timeNow); // verplaats servo8 van 180 naar 90 graden gedurende 1 seconde na een vertraging van 1 seconde (10); } while (todo> 0);}
GeluidseffectenArduino
Deze code wordt op de Arduino Uno geladen met het MP3-schild erop gemonteerd. In principe ontvangt het een signaal van een van de drie schakelaars, speelt het bijbehorende audiobestand af en stuurt een signaal naar de Arduino Uno die de servo's bestuurt. Two buttons can also be mounted to it to control volume.
/*********************************** Targus - Operation - Sound Effects************************************//****** Notes*******/// Digital Pins 0 and 1 are normally used for serial commucation when uploading and monitoring an Arduino from a computer.// Digital Pins 3, 4, 6, 7, 11, 12, and 13 are used by the Adafruit Music Maker Shield.// This Arduino should be powered on after the servos Arduino since this Arduino will be sending 5V signals.// Make sure a GND wire on this Arduino is connected to GND on the other Arduino./********* Includes**********/#include #include #include /********** Variables***********/int relayPin5 =5;int relayPin8 =8;int relayPin9 =9;int pinVolDown =14; // aka Analog In 0int pinVolUp =15; // aka Analog In 1int volume =50; // this is the default volume which can be changed later by the volDown() and volUp() functions/******************************************************************** Adafruit Music Maker Shield - https://www.adafruit.com/product/1788*********************************************************************/// Adafruit Music Maker Shield Pins#define SHIELD_RESET -1 // VS1053 reset pin (unused!)#define DREQ 3 // VS1053 Data request, ideally an Interrupt pin. See http://arduino.cc/en/Reference/attachInterrupt for more info.#define CARDCS 4 // Card chip select pin#define SHIELD_DCS 6 // VS1053 Data/command select pin (output)#define SHIELD_CS 7 // VS1053 chip select pin (output)// the most important thing on the line below is the variable 'musicPlayer' which we will use to play music laterAdafruit_VS1053_FilePlayer musicPlayer =Adafruit_VS1053_FilePlayer(SHIELD_RESET, SHIELD_CS, SHIELD_DCS, DREQ, CARDCS);/************** Arduino Setup***************/void setup() { Serial.begin(9600); // enable serial communication for development and troubleshooting Serial.println("Targus - Operation - Sound Effects\n"); if (! musicPlayer.begin()) { // initialise the music player Serial.println(F("Couldn't find VS1053, do you have the right pins defined?")); while (1); // loop forever since we could not connect to the Adafruit Music Maker Shield } SD.begin(CARDCS); // initialise the SD card // Set volumes for the left and right channels. musicPlayer.setVolume(volume,volume); // 0-255 with 0 being crazy loud // If DREQ is on an interrupt pin (on uno, #2 or #3) we can do background audio playing musicPlayer.useInterrupt(VS1053_FILEPLAYER_PIN_INT); // DREQ int // Specify which GPIO pins to use for input. musicPlayer.GPIO_pinMode(2, OUTPUT); // switch for ... musicPlayer.GPIO_pinMode(3, OUTPUT); // switch for ... musicPlayer.GPIO_pinMode(4, OUTPUT); // switch for ... // Specify which digital pins we will use for volume control pinMode(pinVolDown, INPUT_PULLUP); pinMode(pinVolUp, INPUT_PULLUP); // Specify which digital pins we will use to communicate with the other Arduino (aka the Arduino with all the servos). pinMode(relayPin5, OUTPUT); pinMode(relayPin8, OUTPUT); pinMode(relayPin9, OUTPUT);}/************* Arduino Loop**************/void loop() { int gpio2 =musicPlayer.GPIO_digitalRead(2); int gpio3 =musicPlayer.GPIO_digitalRead(3); int gpio4 =musicPlayer.GPIO_digitalRead(4); int ioDown =digitalRead(pinVolDown); // volume down int ioUp =digitalRead(pinVolUp); // volume up// Serial.println(ioDown);// Serial.println(ioUp);// Serial.println(gpio2); if (gpio2 ==1) { Serial.println("GPIO 2 triggered.\n"); zap2(); } else if (gpio3 ==1) { Serial.println("GPIO 3 triggered.\n"); zap3(); } else if (gpio4 ==1) { Serial.println("GPIO 4 triggered.\n"); zap4(); } else if (ioDown ==LOW) { Serial.println("Analog 0 triggered.\n"); volDown(); } else if (ioUp ==LOW) { Serial.println("Analog 1 triggered.\n"); volUp(); } delay(2); // this delay may need to be reduced or removed depending on how responsive hitting the tongs to the side of a container feels}/********** Functions***********/void audioPlay(String file) { Serial.println("Playing " + file); musicPlayer.startPlayingFile(file.c_str()); vertraging (500); // wait half a second before returning so the audio can get going}void audioStop(String file) { musicPlayer.stopPlaying(); Serial.println("Done playing " + file);}void activate(int pin) { digitalWrite(pin, HIGH); delay(300); // delay as long as needed for the other Arduino to notice an event digitalWrite(pin, LOW);}void volDown() { volume =volume + 1; if (volume> 255) { volume =255; } // Set volumes for the left and right channels. musicPlayer.setVolume(volume,volume); // 0-255 with 0 being crazy loud Serial.print("Volume set to "); Serial.println(volume);}void volUp() { volume =volume - 1; if (volume <0) { volume =0; } // Set volumes for the left and right channels. musicPlayer.setVolume(volume,volume); // 0-255 with 0 being crazy loud Serial.print("Volume set to "); Serial.println(volume);}/*************** Functions:Zap****************/ /****** Zap 2 *******/ void zap2() { // Audio and Servo(s) triggered by GPIO 2 String file ="02.mp3"; // this file should exist on the SD card /*********** Play Audio ************/ audioPlay(file); /************************************* Tell other Arduino to Animate Servos **************************************/ activate(relayPin5); delay(6000); // Customize delay to match end of servo movements, go by feel vs. accurate math since this Arduino's clock may not sync with the other Arduino. /*********** Stop Audio ************/ audioStop(file); } /****** Zap 3 *******/ void zap3() { // Audio and Servo(s) triggered by GPIO 3 String file ="03.mp3"; // this file should exist on the SD card /*********** Play Audio ************/ audioPlay(file); /************************************* Tell other Arduino to Animate Servos **************************************/ activate(relayPin8); delay(6000); // Customize delay to match end of servo movements, go by feel vs. accurate math since this Arduino's clock may not sync with the other Arduino. /*********** Stop Audio ************/ audioStop(file); } /****** Zap 4 *******/ void zap4() { // Audio and Servo(s) triggered by GPIO 4 String file ="04.mp3"; // this file should exist on the SD card /*********** Play Audio ************/ audioPlay(file); /************************************* Tell other Arduino to Animate Servos **************************************/ activate(relayPin9); delay(6000); // Customize delay to match end of servo movements, go by feel vs. accurate math since this Arduino's clock may not sync with the other Arduino. /*********** Stop Audio ************/ audioStop(file); } 

Aangepaste onderdelen en behuizingen

3D grown Parts
CAD-bestand op thingiverse.com

Schema's

Connect GPIO 2, 3, 4 of the MP3 shield to the aluminum Plates.
Connect 3v of the MP3 shield to the tongs.
Connect pins 5, 8, 9 of the MP3 shiled to pins 2, 3, 4 of the servo Arduino.
Connect pins 6, 7, 8, 9, 10, 11 of the servo Arduino to the servos.
Wire the positive and negative of the servos to a 5v plug.
Wire the graounds of both the servo Arduino and the MP3 shield to the 5v plug.
Wire up both speaker inputs. These are the scaled and dimensioned drawings I used to construct the megafigs.

Productieproces

  1. Maak Monitor Ambilight met Arduino
  2. Arduino Pong Game - OLED-scherm
  3. Arduino-gamecontroller
  4. Geautomatiseerde Lego Shooter
  5. Arduino Touch Breakout-spel
  6. Audiofrequentiedetector
  7. Arduino Tamagotchi Clone - Digital Pet
  8. Draadloze lichtschakelaarmanipulator
  9. Tech-TicTacToe
  10. Bewegingssensor-waterpistool
  11. Arduino Countdown Timer