Stap 16: Schakelaar bediend helm
Dus wat moet u doen als u niet dat een draadloze helm wilt?
Een andere vriend van mij wilde animatie zijn MkIV helm (in een zeer specifieke volgorde) en hij wilde alleen maar een eenvoudige push-knop om het te activeren. Één druk om het te openen en één druk om te sluiten. De elektronica zijn net als de draadloze helm behalve ditmaal die de XBee radio is vervangen door een pulsdrukschakelaar. Hij wilde ook een knipperende rode LED in de helm, dus dat is ook in de code. De ogen lijken echt helder in de video omdat de helm nog niet geschilderd en de achterkant van de ogen zijn niet blacked uit.
Hier is de code nodig-
Const int servoPin1 = 2; gezicht plaat servo aangesloten op digital pin 1
Const int servoPin2 = 3; kin servo aangesloten op digital pin 2
Const int buttonPin = 6; activering knop aangesloten op digital pin 6
Const int ledPin1 = 4; LED ogen aangesloten op digital pin 4
Const int ledPin2 = 5; rode LED aangesloten op digital pin 5
#include < Servo.h >
Servo faceplateServo;
Servo chinServo;
VOID Setup {}
faceplateServo.write(30); aanvangspositie gezicht plaat-servo
chinServo.write(65); aanvangspositie kin-servo
faceplateServo.attach(servoPin1);
chinServo.attach(servoPin2);
pinMode (buttonPin, INPUT); LAGE wanneer geduwd
pinMode (ledPin1, OUTPUT);
pinMode (ledPin2, OUTPUT);
digitalWrite (ledPin1, hoge); LED ogen inschakelen
digitalWrite (ledPin2, laag); rode LED uitschakelen
}
void loop {}
statische unsigned long lastPushedTime = 0;
statische Boole faceplateClosed = waar;
statische Boole lastButtonState = hoog;
Boole newButtonState = digitalRead(buttonPin);
Als de knop ingedrukt is en het heeft al een tijdje geleden was het laatste down...
Als (newButtonState == LOW & & lastButtonState == HIGH & & millis() - lastPushedTime > 100) {}
lastPushedTime = millis();
Als (faceplateClosed) {}
faceplateServo.write(120); Open voorplaat
faceplateClosed = false;
delay(300); een beetje wachten
digitalWrite (ledPin2, hoge); inschakelen van rode LED
delay(200);
digitalWrite (ledPin2, laag); rode LED uitschakelen
chinServo.write(20); de kin servo tot 20 graden draaien
delay(100);
digitalWrite (ledPin1, laag); zwenking vandoor LED ogen
delay(100);
digitalWrite (ledPin2, hoge);
delay(200);
digitalWrite (ledPin2, laag);
delay(200);
digitalWrite (ledPin2, hoge);
delay(200);
digitalWrite (ledPin2, laag);
delay(200);
digitalWrite (ledPin2, hoge);
delay(200);
digitalWrite (ledPin2, laag);
delay(200);
digitalWrite (ledPin2, hoge);
delay(200);
digitalWrite (ledPin2, laag);
delay(200);
digitalWrite (ledPin2, hoge);
delay(200);
digitalWrite (ledPin2, laag);
}
else {/ / voorplaat is open
chinServo.write(65); kin servo tot 65 graden roteren
delay(500); een halve seconde wachten
faceplateServo.write(30); gezicht plaat servo op 30 graden te draaien
delay(500);
digitalWrite (ledPin1, hoge); Zet LED ogen
delay(100);
digitalWrite (ledPin1, laag); zwenking vandoor LED ogen
delay(100);
digitalWrite (ledPin1, hoge);
delay(100);
digitalWrite (ledPin1, laag);
delay(100);
digitalWrite (ledPin1, hoge);
faceplateServo.write(30); flaceplate sluiten
faceplateClosed = true;
}
}
lastButtonState = newButtonState;
}
Wat als u wilt gebruiken de RFID tag lezer als een schakelaar?
U kunt dat ook doen. In plaats van met behulp van een drukknop kan je ook de helm activeren door bedrading van een RFID tag lezer rechtstreeks aan de helm. Deze code zal openen de helm voor een bepaald aantal seconden en sluit het. Er is ook een tweede RFID-tag in de code gelezen als u wilt toevoegen een andere functie, zoals een guantlet openen of een repulsor verlichting up.
De code zou er ongeveer als volgt uitzien-
#include "Servo.h" / / de servo-bibliotheek
Servo faceplateServo;
Servo chinServo;
int ledPin1 = 4; controle pin voor LED ogen
int servoPin1 = 2; controle pin voor gezicht plaat servo
int servoPin2 = 3; controle pin voor kin
int RFIDResetPin = 13;
Registreer hier uw RFID-tags
Label1 char [13] = "440085E77452"; Dit moet overeenkomen met uw label-ID
tag2 char [13] = "440085FC330E";
VOID Setup {}
faceplateServo.attach(servoPin1); de servo op pin 2 hecht aan de servo-object
chinServo.attach(servoPin2); de servo op pin 3 hecht aan de servo-object
faceplateServo.write(30); gezicht plaat servo op 30 graden te draaien
chinServo.write(95); kin servo tot 95 graden roteren
pinMode (ledPin1, OUTPUT); Hiermee stelt u de LED-pin als uitvoer
digitalWrite (ledPin1, hoge); Zet LED ogen
Serial.begin(9600);
pinMode (RFIDResetPin, uitvoer);
digitalWrite (RFIDResetPin, hoge);
}
void loop {}
char tagString [13];
int index = 0;
lezing van Boole = vals;
while(Serial.available()) {}
int readByte = Serial.read(); Lees volgende beschikbaar byte
if(readByte == 2) lezen = true; die beginnen van tag
if(readByte == 3) lezen = false; einde van tag
Als (lezen & & readByte! = 2 & & readByte! = 10 & & readByte! = 13) {}
opslaan van de tag
tagString [index] = readByte;
index ++;
}
}
checkTag(tagString); Controleer of het is een match
clearTag(tagString); Schakel de char van alle waarde
resetReader(); opnieuw instellen van de RFID-lezer
}
VOID checkTag (char tag[]) {}
///////////////////////////////////
Controleer de Lees tag tegen bekende tags
///////////////////////////////////
if(STRLEN(tag) == 0) keren; leeg, geen behoefte om te bevorderen
Als (compareTag (label, Label1)) {/ / als gematched Label1, dit doen
digitalWrite (ledPin1, laag); zwenking vandoor LED ogen
delay(500); een halve seconde wachten
faceplateServo.write(95); de servo plaat gezicht tot 95 graden roteren
chinServo.write(20); de kin servo tot 20 graden draaien
delay(4000); 4 seconden
chinServo.write(95); de kin servo tot 95 graden roteren
faceplateServo.write(30); draaien van het gezicht plaat servo op 30 graden
digitalWrite (ledPin1, hoge); Zet LED ogen
} else if (compareTag (label, tag2)) {//if gematched tag2, hiervoor
Schrijf hier wat code voor iets gebeurt wanneer tag2 wordt gelezen
} else {}
Serial.println(tag); voorlezen aan een onbekende tag
}
}
VOID lightLED (int pin) {}
///////////////////////////////////
LED op pin "pin" inschakelen voor 250ms
///////////////////////////////////
Serial.println(PIN);
digitalWrite (pin, hoge);
delay(250);
digitalWrite (pin, laag);
}
ongeldig resetReader() {}
///////////////////////////////////
Reset de RFID-lezer om opnieuw te lezen.
///////////////////////////////////
digitalWrite (RFIDResetPin, laag);
digitalWrite (RFIDResetPin, hoge);
delay(150);
}
VOID clearTag (char one[]) {}
///////////////////////////////////
de char-matrix duidelijk door het invullen met null - ASCII 0
Zal denken dat dezelfde tag is anders gelezen
///////////////////////////////////
for (int i = 0; ik < strlen(one); i ++) {}
een [i] = 0;
}
}
Booleaanse compareTag (char [een], char two[]) {}
///////////////////////////////////
Vergelijk twee waarde om te zien of hetzelfde,
killerid niet 100% werken, zodat we dit doen
///////////////////////////////////
if(STRLEN(One) == 0) geretourneerd als false; leeg
for (int i = 0; ik < 12; i ++) {}
Als (een [i]! = two[i]) return false;
}
return true; geen incongruenties
}