Ultimate Nerf Stryfe Mod (6 / 7 steg)
Steg 6: elektronik
Setpoint signalen styr även makt LED stift D5-D13 antingen direkt via funktionen PWM eller indirekt genom att vrida hamnarna på och av i jämna intervaller.
Styrelsen märkt med det gröna området innehåller strömtillförselen för Atmega styrenheten samt en egen låsning relä (U3). Reläet är aktiverad med programvara som driver D4 och håller banan stängd när ursprungliga tryckknapp för Nerf släpps. När potentiometern vrids till vänster position i 3 sekunder stannar registeransvarige sätta D4 och befogenheter sig stänga.
Jag använde en Arduino UNO ladda upp följande kod till Atmega:
int motorPin = 3; motorisk kontroll
int inputPot = A5; ingående potentiometer
int potMin = 943; minsta värde på PotRes = 0
int potMax = 1023; maximal värde
int holdPin = 4; spänning stabilitet
int LEDPins [] = {13, 12, 11, 10, 9, 8, 7, 6, 5};
int LEDCount = sizeof(LEDPins)/sizeof(int); antal lampor
Motorsteuerung
osignerade långa motorTimer = 0; motorisk kontroll i ms
int motorLoopTime = 100; motorn i ms responstid
int outTime = 2500; Hur länge har potentiometern vände 0 tills motorn stängs av? [ms]
osignerade långa outLoop = 0;
int powerSet = 0;
int powerOut = 0;
int maxPower = 120; maxhastighet på motorn
int minPower = 30. lägsta hastighet på motorn
int LEDFak [] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
void setup() {
Serial.BEGIN(9600);
pinMode (inputPot, ingång);
pinMode (motorPin, produktionen);
pinMode (holdPin, produktionen);
Delay(20);
Aktivera relais, så snart potentiometern är satt till 0 under början
om (analogRead(inputPot) < = (potMin + 5)) {digitalWrite (holdPin, hög);}
annat {digitalWrite (holdPin, låg);}
för (int ii = 0; ii < LEDCount; ii ++)
{
pinMode (LEDPins [ii], OUTPUT);
}
}
void loop() {
om (millis() > (motorTimer + motorLoopTime)) {
motorTimer = millis();
int motorSP = analogRead(inputPot);
digitalWrite (holdPin, hög);
inaktiverar relais, så länge potentiometern är aktiverad under en viss tid 0
om (motorSP < = (potMin + 5)) {outLoop = outLoop + motorLoopTime;}
annat {outLoop = 0;}
Serial.println(outLoop);
om (outLoop > outTime) {digitalWrite (holdPin, låg);}
Serial.println(motorSP);
int motorPower = karta (motorSP, potMin, potMax, minPower, maxPower);
Serial.println(motorPower);
analogWrite (motorPin, motorPower);
beräkna LED inställningarna
int LEDVal = karta (motorPower, minPower, maxPower, 30, LEDCount * 100-30);
för (int ii = 0; ii < LEDCount; ii ++) {
om (LEDVal > 100) {LEDFak [ii] = 100;}
annars om (LEDVal > 0) {LEDFak [ii] = LEDVal;}
annat {LEDFak [ii] = 0;}
LEDVal = LEDVal - 100.
}
}
dimLEDs();
}
void dimLEDs() {
flyta fördröjningstid = 500.
för (int ii = 0; ii < LEDCount; ii ++)
{
om (LEDFak [ii] == 100) {digitalWrite (LEDPins [ii], hög);}
annars om (LEDFak [ii] > 0)
{
int onTime = (int) (fördröjningstid * ((float)LEDFak[ii]) / 100);
digitalWrite (LEDPins [ii], hög);
delayMicroseconds(onTime);
digitalWrite (LEDPins [ii], låg);
delayMicroseconds (fördröjningstid - onTime);
}
annat {digitalWrite (LEDPins [ii], låg);}
}
}