Hand Held PC (3 / 3 steg)
Steg 3: Tweaks & provning
Ardunio klon hade inte någon starthanterare så jag var tvungen att få den gamla trogna GQ4-X programmeraren och blixtrade klon men ICSP hamnen.
Arduino micro klonen jag hade hade inte funktionaliteten i ändra usb funktion än en seriell port emulering så jag var tvungen att skriva två program i stället för en.
Arduino programmet i princip fångar knappar och analog pinne och skickar data via seriell
Analog X -> A0
Analogt -> A1
Andra knappar D0 <> - D8
Här är koden för mikro
Dessa konstanter ändras inte. De är vana att ge namn < br > / / till stiften används:
CONST int analogInPinY = A0; Analog ingång pin som potentiometern är kopplad till
CONST int analogInPinX = A1; Analog ingång pin som potentiometern är kopplad till
int outputValueY = 0; värdet utdata till PWM (analog utgång)
int outputValueX = 0; värdet utdata till PWM (analog utgång)
int centreY = 0; Kalibrera
int centreX = 0; Kalibrera
int Ypos = 0;
int TempY = 0;
int NegY = 0;
int Xpos = 0;
int TempX = 0;
int NegX = 0;
konstanter ändras inte. De används här till
Ange pin-koder:
CONST int buttonup = 2; numrera av tryckknapp PIN-koden
CONST int buttonright = 3; numrera av tryckknapp PIN-koden
CONST int buttonleft = 4; numrera av tryckknapp PIN-koden
CONST int buttondown = 5; numrera av tryckknapp PIN-koden
CONST int buttonDiamond = 9; numrera av tryckknapp PIN-koden
CONST int buttonTriangle = 8; numrera av tryckknapp PIN-koden
CONST int buttonRed = 7. numrera av tryckknapp PIN-koden
CONST int buttonYellow = 6;
CONST int buttonAnalog = 10;
CONST int buttonMode = 11;
CONST int ledPin = 13. antal LED stift
CONST int led2Pin = A2;
variabler som ändras:
int dirState = 0; variabel för att läsa tryckknapp status
int buttonState = 0; variabel för att läsa tryckknapp status
int CTX;
int AnalogNegs = 0;
int PadMode;
int Fader = 0;
int FaderDir = 0;
void setup() {
Serial.BEGIN(19200);
initiera LED stift som en utgång:
pinMode (ledPin, produktionen);
pinMode (led2Pin, produktionen);
initiera tryckknapp PIN-koden som indata:
pinMode (buttonup, INPUT_PULLUP);
pinMode (buttondown, INPUT_PULLUP);
pinMode (buttonleft, INPUT_PULLUP);
pinMode (buttonright, INPUT_PULLUP);
pinMode (buttonTriangle, INPUT_PULLUP);
pinMode (buttonDiamond, INPUT_PULLUP);
pinMode (buttonYellow, INPUT_PULLUP);
pinMode (buttonRed, INPUT_PULLUP);
pinMode (buttonAnalog, INPUT_PULLUP);
pinMode (buttonMode, INPUT_PULLUP);
CTX = analogRead(analogInPinX);
centreY = map(analogRead(analogInPinY), 0, 1023, 0, 254);
centreX = map(analogRead(analogInPinX), 0, 1023, 0, 254);
Callib;}
void Callib() {
FÖRSÖK! Kalibrera centrum
centreY = map(analogRead(analogInPinY), 0, 1023, 0, 254);
centreX = map(analogRead(analogInPinX), 0, 1023, 0, 254); }
void loop() {
Läs statligt av tryckknapp värdet:
outputValueY = map(analogRead(analogInPinY), 0, 1023, 0, 254);
outputValueX = map(analogRead(analogInPinX), 0, 1023, 0, 254);
Ypos = 0;
NegY = 0;
TempY = (outputValueY - centreY);
om (TempY > 5 || TempY < -5) {
digitalWrite (ledPin, hög);
NegY = TempY < -5;
Ypos = TempY & 254;
};
Xpos = 0;
NegX = 0;
TempX = (outputValueX - centreX);
om (TempX > 5 || TempX < -5) {
digitalWrite (ledPin, hög);
NegX = TempX < -5;
om (TempX <-83) {TempX = -84;}
om (TempX > 83) {TempX = 84.}
Xpos = TempX & 254;
};
Serial.println(TempX);
Serial.println(Xpos);
dirState = 0;
dirState | = (digitalRead(buttonup) ^ 1) << 0;
dirState | = (digitalRead(buttondown) ^ 1) << 1.
dirState | = (digitalRead(buttonleft) ^ 1) << 2.
dirState | = (digitalRead(buttonright) ^ 1) << 3.
buttonState = 0;
buttonState | = (digitalRead(buttonTriangle) ^ 1) << 0;
buttonState | = (digitalRead(buttonDiamond) ^ 1) << 1.
buttonState | = (digitalRead(buttonYellow) ^ 1) << 2.
buttonState | = (digitalRead(buttonRed) ^ 1) << 3.
buttonState | = (digitalRead(buttonAnalog) ^ 1) << 4.
int d = (digitalRead(buttonMode) ^ 1);
om (PadMode > 0) {
Delay(30);
digitalWrite (led2Pin, hög);}
annat {
digitalWrite (led2Pin, låg);
}
om (PadMode = 0) {analogWrite (A2, 0);}
om (d > 0) {
PadMode = (PadMode ^ 1);
/ / PadMode = 1;
digitalWrite (A2, hög);}
returnera;}
medan ((digitalRead(buttonMode) ^ 1) > 0) {
{} delay(3);}
buttonState | = PadMode << 5.
AnalogNegs = NegX << 0;
AnalogNegs | = NegY << 2.
Serial.write(0xFF); Sync
Serial.write(dirState);
Serial.write(buttonState);
Serial.write(AnalogNegs);
Serial.write(Xpos);
Serial.write(ypos);
Kontrollera om tryckknappen trycks.
om det är, är buttonState hög:
om (dirState > 0 || buttonState > 0) {
Aktivera LED:
digitalWrite (ledPin, hög);
analogWrite (A2, 20);
}
annat {
Inaktivera LED:
digitalWrite (ledPin, låg);
Callib;
Delay(3);
}
Delay(2);
}
Jag har använt en sync byte för att synkronisera seriella data till programmet FreeBasic. Jag lade också till en LED som sitter i knappen i mitten som används som en Mode-knappen för att ge ytterligare ett lager av kontroll.
FreeBasic programmet konverterar den seriella data från Arduino in till tangentbordet tangenttryckningar, det körs vid start av windows som en bakgrundsaktivitet.
Tack vare Ben Heck för inspiration!