Paso 16: Interruptor operado casco
¿Qué hacer si no desea que un casco inalámbrico?
Otro amigo mío quería animar su casco MkIV (en una secuencia muy específica) y que sólo quería un simple botón para activarlo. Un empujón para abrirlo y pulsar cerrar. La electrónica está al igual que el casco inalámbrico excepto que esta vez que la radio XBee es reemplazada con un interruptor momentáneo. También quería un LED rojo que parpadea en el casco por lo está en el código también. Los ojos parecen ser realmente brillante en el video porque no ha sido pintado el casco y la parte posterior de los ojos no están a oscuras.
Aquí está el código necesario-
const int servoPin1 = 2; servo de cara la placa conectado al pin digital 1
const int servoPin2 = 3; barbilla servo conectado al pin digital 2
const int buttonPin = 6; activación botón conectado al pin digital 6
const int ledPin1 = 4; Ojos de LED conectados al pin digital 4
const int ledPin2 = 5; rojo LED conectado al pin digital 5
#include < Servo.h >
Servo faceplateServo;
Servo chinServo;
void setup() {}
faceplateServo.write(30); posición inicial para el servo de la placa de cara
chinServo.write(65); posición inicial para servo de barbilla
faceplateServo.attach(servoPin1);
chinServo.attach(servoPin2);
pinMode (buttonPin, entrada); BAJA cuando
pinMode (ledPin1, salida);
pinMode (ledPin2, salida);
digitalWrite (ledPin1, HIGH); encender LED ojos
digitalWrite (ledPin2, LOW); apaga LED rojo
}
void loop() {}
lastPushedTime largo sin signo estático = 0;
Static boolean faceplateClosed = true;
Static boolean lastButtonState = alto;
Boolean newButtonState = digitalRead(buttonPin);
Si el botón está hacia abajo y hace ya un tiempo fue pasado abajo...
Si (newButtonState == baja & & lastButtonState == alto & & millis() - lastPushedTime > 100) {}
lastPushedTime = millis();
Si (faceplateClosed) {}
faceplateServo.write(120); Placa frontal abierto
faceplateClosed = false;
Delay(300); esperar un poco
digitalWrite (ledPin2, HIGH); enciende LED rojo
Delay(200);
digitalWrite (ledPin2, LOW); apaga LED rojo
chinServo.write(20); girar el servo de la barbilla a 20 grados
Delay(100);
digitalWrite (ledPin1, LOW); Apagar LED ojos
Delay(100);
digitalWrite (ledPin2, HIGH);
Delay(200);
digitalWrite (ledPin2, LOW);
Delay(200);
digitalWrite (ledPin2, HIGH);
Delay(200);
digitalWrite (ledPin2, LOW);
Delay(200);
digitalWrite (ledPin2, HIGH);
Delay(200);
digitalWrite (ledPin2, LOW);
Delay(200);
digitalWrite (ledPin2, HIGH);
Delay(200);
digitalWrite (ledPin2, LOW);
Delay(200);
digitalWrite (ledPin2, HIGH);
Delay(200);
digitalWrite (ledPin2, LOW);
}
Else {/ / placa frontal está abierto
chinServo.write(65); servo rotación mentón a 65 grados
Delay(500); esperar medio segundo
faceplateServo.write(30); servo de placa cara gire a 30 grados
Delay(500);
digitalWrite (ledPin1, HIGH); encender LED ojos
Delay(100);
digitalWrite (ledPin1, LOW); Apagar LED ojos
Delay(100);
digitalWrite (ledPin1, HIGH);
Delay(100);
digitalWrite (ledPin1, LOW);
Delay(100);
digitalWrite (ledPin1, HIGH);
faceplateServo.write(30); cierre flaceplate
faceplateClosed = true;
}
}
lastButtonState = newButtonState;
}
¿Qué pasa si quieres utilizar el lector de etiquetas RFID como un interruptor?
Usted puede hacer eso también. En lugar de utilizar un botón también podría activar el casco conectando un lector de etiquetas RFID directamente en el casco. Este código abrirá el casco para un número específico de segundos y luego ciérrela. También hay una segunda etiqueta RFID lee en el código si desea agregar otra función, como una correa de apertura o iluminar un repulsor.
El código sería algo como esto-
#include "Servo.h" / / incluye la librería servo
Servo faceplateServo;
Servo chinServo;
ledPin1 int = 4; pin de control de LED ojos
int servoPin1 = 2; pin de control de servo de la placa de cara
int servoPin2 = 3; pin de control de la barbilla
int RFIDResetPin = 13;
Registre aquí sus etiquetas RFID
char tag1 [13] = "440085E77452"; Esto tiene que coincidir con el ID de la etiqueta
char la etiqueta2 [13] = "440085FC330E";
void setup() {}
faceplateServo.attach(servoPin1); se fija el servo en el pin 2 al objeto servo
chinServo.attach(servoPin2); se fija el servo en el pin 3 al objeto servo
faceplateServo.write(30); servo de placa cara gire a 30 grados
chinServo.write(95); servo rotación mentón a 95 grados
pinMode (ledPin1, salida); establece el pin LED como salida
digitalWrite (ledPin1, HIGH); encender LED ojos
Serial.Begin(9600);
pinMode (RFIDResetPin, salida);
digitalWrite (RFIDResetPin, alto);
}
void loop() {}
char tagString [13];
Índice de int = 0;
lectura boolean = false;
{while(serial.Available())}
readByte int = Serial.read(); Lee el siguiente byte disponible
if(readByte == 2) de lectura = true; Inicio de etiqueta
if(readByte == 3) de lectura = false; final de la etiqueta
Si (lectura & & readByte! = 2 & & readByte! = 10 & & readByte! = 13) {}
Guarde la etiqueta
tagString [index] = readByte;
Índice ++;
}
}
checkTag(tagString); Comprobar si es un partido
clearTag(tagString); Claro al char de todo valor
resetReader(); reiniciar el lector de RFID
}
void checkTag (char tag[]) {}
///////////////////////////////////
Compruebe la etiqueta leída contra conocidas etiquetas
///////////////////////////////////
if(strlen(TAG) == 0) volver; vacío, no hay necesidad de continuar
Si (compareTag (etiqueta, tag1)) {/ / si tag1, ello
digitalWrite (ledPin1, LOW); Apagar LED ojos
Delay(500); esperar medio segundo
faceplateServo.write(95); girar el servo de la placa de cara a 95 grados
chinServo.write(20); girar el servo de la barbilla a 20 grados
Delay(4000); Espere 4 segundos
chinServo.write(95); girar el servo de la barbilla a 95 grados
faceplateServo.write(30); girar el servo de la placa de cara a los 30 grados
digitalWrite (ledPin1, HIGH); encender LED ojos
} else if (compareTag (etiqueta, etiqueta2)) {//if emparejado tag2, ello
escribir código aquí para que, cuando se lee tag2
} else {}
Serial.println(TAG); leer cualquier etiqueta desconocido
}
}
void lightLED (int pin) {}
///////////////////////////////////
Enciende LED en pin "pin" de 250ms
///////////////////////////////////
Serial.println(PIN);
digitalWrite (pin, HIGH);
Delay(250);
digitalWrite (pin, LOW);
}
void resetReader() {}
///////////////////////////////////
Reiniciar el lector de RFID para leer otra vez.
///////////////////////////////////
digitalWrite (RFIDResetPin, bajo);
digitalWrite (RFIDResetPin, alto);
Delay(150);
}
void clearTag (char one[]) {}
///////////////////////////////////
claro el array de char por relleno de null - ASCII 0
Pensará la misma etiqueta ha sido leer de otra manera
///////////////////////////////////
para (int i = 0; i < strlen(one); i ++) {}
uno [i] = 0;
}
}
Boolean compareTag (char uno [], char two[]) {}
///////////////////////////////////
comparar dos valor a si mismo,
strcmp no funcionando al 100% por lo que lo hacemos
///////////////////////////////////
if(strlen(One) == 0) devuelven el valor false; vacío
para (int i = 0; i < 12; i ++) {}
Si (una [i]! = false return two[i]);
}
verdaderas; no hay desajustes
}