Animatronic Iron Man Mk III kostym (16 / 17 steg)
Steg 16: Switch drivs hjälm
Så vad gör du om du inte vill en trådlös hjälm?
En annan vän till mig ville animera hjälmen MkIV (i en mycket specifik sekvens) och han ville ha bara en enkel tryckknapp till aktivera den. Ett tryck att öppna den och en push att stänga. Elektroniken är precis som den trådlösa hjälmen men den här gången XBee radion skall ersättas med en tillfällig switch. Han ville också en blinkande röd lysdiod i hjälmen så det är i koden alltför. Ögonen verkar vara riktigt ljusa i videon eftersom hjälmen har inte målats och baksidan av ögonen är inte blackout.
Här är koden behövs-
CONST int servoPin1 = 2; ansikte plattan servo ansluten till digital stift 1
CONST int servoPin2 = 3; hakan servo ansluten till digital stift 2
CONST int buttonPin = 6; aktiveringen knappen ansluten till digital stift 6
CONST int ledPin1 = 4; LED ögon ansluten till digital stift 4
CONST int ledPin2 = 5; röd lysdiod ansluten till digital stift 5
#include < Servo.h >
Servo faceplateServo;
Servo chinServo;
void setup() {
faceplateServo.write(30); utgångsläge för ansikte plattan servo
chinServo.write(65); utgångsläge för hakan servo
faceplateServo.attach(servoPin1);
chinServo.attach(servoPin2);
pinMode (buttonPin, ingång); LÅG när man trycker
pinMode (ledPin1, produktionen);
pinMode (ledPin2, produktionen);
digitalWrite (ledPin1, hög); Aktivera LED ögon
digitalWrite (ledPin2, låg); Inaktivera röd LED
}
void loop() {
statiska osignerade långa lastPushedTime = 0;
statisk boolean faceplateClosed = sant;
statisk boolean lastButtonState = hög;
booleska newButtonState = digitalRead(buttonPin);
Om knappen är nere och det har varit ett tag sedan det var sista ner...
om (newButtonState == låg & & lastButtonState == hög & & millis() - lastPushedTime > 100) {
lastPushedTime = millis();
om (faceplateClosed) {
faceplateServo.write(120); Öppna frontpanelen
faceplateClosed = false;
Delay(300); vänta lite
digitalWrite (ledPin2, hög); slå på röd LED
Delay(200);
digitalWrite (ledPin2, låg); stänga av röd LED
chinServo.write(20); rotera hakan servo till 20 grader
Delay(100);
digitalWrite (ledPin1, låg); stänga av LED ögon
Delay(100);
digitalWrite (ledPin2, hög);
Delay(200);
digitalWrite (ledPin2, låg);
Delay(200);
digitalWrite (ledPin2, hög);
Delay(200);
digitalWrite (ledPin2, låg);
Delay(200);
digitalWrite (ledPin2, hög);
Delay(200);
digitalWrite (ledPin2, låg);
Delay(200);
digitalWrite (ledPin2, hög);
Delay(200);
digitalWrite (ledPin2, låg);
Delay(200);
digitalWrite (ledPin2, hög);
Delay(200);
digitalWrite (ledPin2, låg);
}
annat {/ / frontplåten är öppen
chinServo.write(65); rotera hakan servo till 65 grader
Delay(500); vänta en halv sekund
faceplateServo.write(30); rotera ansikte plattan servo till 30 grader
Delay(500);
digitalWrite (ledPin1, hög); slå på LED ögon
Delay(100);
digitalWrite (ledPin1, låg); stänga av LED ögon
Delay(100);
digitalWrite (ledPin1, hög);
Delay(100);
digitalWrite (ledPin1, låg);
Delay(100);
digitalWrite (ledPin1, hög);
faceplateServo.write(30); Stäng flaceplate
faceplateClosed = sant;
}
}
lastButtonState = newButtonState;
}
Vad händer om du vill använda RFID-tagg läsare som en switch?
Du kan göra det också. Istället för att använda en knapp kan du också aktivera hjälmen av ledningar en RFID-tagg läsare direkt till hjälmen. Denna kod kommer öppna hjälmen för ett visst antal sekunder och sedan stänga den. Det finns också en andra RFID-tagg läsa i koden om du vill lägga till en annan funktion, till exempel en guantlet öppning eller en repulsor-belysning.
Koden skulle se ut så här-
#include "Servo.h" / / include servo biblioteket
Servo faceplateServo;
Servo chinServo;
int ledPin1 = 4; kontroll stift för LED ögon
int servoPin1 = 2; kontroll stift för ansikte plattan servo
int servoPin2 = 3; kontroll pin för haka
int RFIDResetPin = 13.
Registrera din RFID-taggar här
char tag1 [13] = "440085E77452"; Detta måste matcha din tagg-ID
char tag2 [13] = "440085FC330E";
void setup() {
faceplateServo.attach(servoPin1); tillmäter objektet servo servo på pin 2
chinServo.attach(servoPin2); tillmäter objektet servo servo på stift 3
faceplateServo.write(30); rotera ansikte plattan servo till 30 grader
chinServo.write(95); rotera hakan servo till 95 grader
pinMode (ledPin1, produktionen); Anger den LED stiftet som utdata
digitalWrite (ledPin1, hög); slå på LED ögon
Serial.BEGIN(9600);
pinMode (RFIDResetPin, OUTPUT);
digitalWrite (RFIDResetPin, hög);
}
void loop() {
char tagString [13].
heltal index = 0;
booleska läsning = false;
While(Serial.available()) {
int readByte = Serial.read(); läsa nästa tillgängliga byte
IF(readByte == 2) läsning = sant; början av tag
IF(readByte == 3) läsning = false; slutet av taggen
om (reading & & readByte! = 2 & & readByte! = 10 & & readByte! = 13) {
lagra etiketten
tagString [index] = readByte;
index ++;
}
}
checkTag(tagString); Kontrollera om det är en match
clearTag(tagString); Rensa röding av alla värde
resetReader(); återställa RFID-läsare
}
void checkTag (char tag[]) {
///////////////////////////////////
Kolla Läs etiketten mot kända märken
///////////////////////////////////
IF(strlen(tag) == 0) återvända; Tom, utan att behöva contunue
om (compareTag (tag, tag1)) {/ / om matchade tag1, göra detta
digitalWrite (ledPin1, låg); stänga av LED ögon
Delay(500); vänta en halv sekund
faceplateServo.write(95); rotera ansikte plattan servo till 95 grader
chinServo.write(20); rotera hakan servo till 20 grader
Delay(4000); vänta 4 sekunder
chinServo.write(95); rotera hakan servo till 95 grader
faceplateServo.write(30); rotera ansikte plattan servo till 30 grader
digitalWrite (ledPin1, hög); slå på LED ögon
} else om (compareTag (tag, tag2)) {//if matchas tag2, göra detta
Skriv lite kod här för något att hända när tag2 läses
} annat {
Serial.println(tag); läste ut en okänd tagg
}
}
void lightLED (int pin) {
///////////////////////////////////
Slå på lampan på pin "pin" för 250ms
///////////////////////////////////
Serial.println(PIN);
digitalWrite (pin, hög);
Delay(250);
digitalWrite (pin, låg);
}
void resetReader() {
///////////////////////////////////
Återställa RFID-läsare att läsa igen.
///////////////////////////////////
digitalWrite (RFIDResetPin, låg);
digitalWrite (RFIDResetPin, hög);
Delay(150);
}
void clearTag (char one[]) {
///////////////////////////////////
Rensa char matrisen genom att fylla med null - ASCII 0
Kommer att tänka samma tagg har lästs annars
///////////////////////////////////
för (int jag = 0; jag < strlen(one); i ++) {
en [i] = 0;
}
}
booleska compareTag (char [en], char two[]) {
///////////////////////////////////
Jämför två värde att se om samma,
Strcmp inte fungerar 100% så det gör vi
///////////////////////////////////
IF(strlen(One) == 0) return false; Tom
för (int jag = 0; jag < 12, i ++) {
om (en [i]! = two[i]) return false;
}
return true; inga avvikelser
}