Paso 3: electrónica
Aquí está el código de arduino que usé:
WiiChuck.h y ServoTimer1.h están disponibles en línea. Caer un mensaje si usted quiere y no puede encontrarlos.
******************
#include "Wire.h"
#include "WiiChuck.h"
#include "ServoTimer1.h"
#define TILL_POWER_PIN 8
#define TILL_STBD_PIN 10
#define TILL_PORT_PIN 9
#define THROTT_DIFF_PIN 12
#define THROTT_MAIN_PIN 11
#define MINTILLPULSE 1100 / / posición del servo de mínimo
#define MAXTILLPULSE 1900 / / posición del servo de mínimo
#define MINTHROTTPULSE 1000 / / posición del servo de mínimo
#define MAXTHROTTPULSE 1965 / / posición del servo de máximo
Excavadora de ServoTimer1 = ServoTimer1();
WiiChuck chuck = WiiChuck();
int tillerPulse = 1500; Cantidad para el servo
int throttlePulse = 1500; Cantidad para el servo
int throttleDiffPulse = 1500; Cantidad para el servo
int lastTillerPulse = 1500;
int baseTillerPulse = 1500;
mover int = 10;
lastPulse largo = 0; el tiempo en milisegundos del pulso del pasado
int refreshTime = 20; el tiempo entre pulsos
int analogValue = 0; el valor devuelto por el sensor análogo
int analogPin = 0; el pin analógico que el sensor de
Tras booleano = true;
sleeptimer largo = 0;
Boolean dothrottle = true;
void setup() {}
Serial.Begin(9600);
Chuck.Begin();
Chuck.Update();
tiller.setMaximumPulse(2500);
tiller.setMinimumPulse(500);
para (int i = 8; i < 13; i ++) {}
pinMode (i, salida); Pin Set servo como un pin de salida
}
}
int ángulo;
void loop() {}
Chuck.Update();
lastTillerPulse = tillerPulse;
Si (chuck.buttonC) {}
Tiller.Attach(9);
Tiller.Write(Angle);
Tiller.Attach(10);
Tiller.Write(Angle);
baseTillerPulse = (int) (1500.0 - chuck.readRoll() * 3);
throttleDiffPulse = (int) (1500.0 + chuck.readJoyX() * 5);
tillerPulse = baseTillerPulse;
}
Else {}
Si (abs(chuck.readJoyX()) > 10) {}
tillerPulse = baseTillerPulse - chuck.readJoyX();
}
Else {}
tillerPulse = baseTillerPulse;
}
}
Si (chuck.buttonZ) {}
throttlePulse = (int) (1500.0 + chuck.readJoyY() * 5);
}
Si (throttlePulse < MINTHROTTPULSE) {}
throttlePulse = MINTHROTTPULSE;
}
Si (throttlePulse > MAXTHROTTPULSE) {}
throttlePulse = MAXTHROTTPULSE;
}
Si (throttleDiffPulse < MINTHROTTPULSE) {}
throttleDiffPulse = MINTHROTTPULSE;
}
Si (throttleDiffPulse > MAXTHROTTPULSE) {}
throttleDiffPulse = MAXTHROTTPULSE;
}
Si (tillerPulse < MINTILLPULSE) {}
tillerPulse = MINTILLPULSE;
}
Si (tillerPulse > MAXTILLPULSE) {}
tillerPulse = MAXTILLPULSE;
}
Serial.Print(tillerPulse);
Serial.Print (",");
Serial.println(throttlePulse);
Si (tillerPulse! = lastTillerPulse) {}
despertar = true;
Sleeptimer = 0;
}
Else {}
Sleeptimer += 1;
}
Si (sleeptimer > 80)
despertar = false;
Si (reactivación) {}
digitalWrite (TILL_POWER_PIN, alto);
}
Else {}
digitalWrite(TILL_POWER_PIN,LOW);
}
updateServos();
}
void updateServos() {}
analogValue = analogRead(analogPin); Lee la entrada analógica
tillerPulse = (analogValue * 19) / 10 + MINPULSE; convertir el valor analógico
a un rango entre MINPULSE
y MAXPULSE.
Si (dothrottle) {}
tillerPulse el servo nuevo rhe actualizar tiempo (20 ms) haber pasado:
digitalWrite (THROTT_MAIN_PIN, alto);
delayMicroseconds(throttlePulse);
digitalWrite (THROTT_MAIN_PIN, bajo); Encienda el motor
digitalWrite (THROTT_DIFF_PIN, alto);
delayMicroseconds(throttleDiffPulse);
digitalWrite (THROTT_DIFF_PIN, bajo); Motores de Stear
delayMicroseconds (5000 - throttlePulse - throttleDiffPulse);
}
Else {}
delayMicroseconds(5000);
}
dothrottle =! dothrottle;
digitalWrite (TILL_STBD_PIN, alto); Encienda el motor
digitalWrite (TILL_PORT_PIN, alto); Encienda el motor
delayMicroseconds(tillerPulse); Longitud del pulso ajusta la posición del motor
digitalWrite (TILL_STBD_PIN, bajo); Encienda el motor
digitalWrite (TILL_PORT_PIN, bajo); Encienda el motor
delayMicroseconds(5000-tillerPulse);
}