Vi volevo far vedere lo spinner che mi sono costruito. E' basato su Teensy, un clone economico e miniaturizzato di Arduino. E' stato anche l'unico pezzo acquistato; il resto e' stato recuperato in giro.
Ho usato: Una testina di un vecchio videoregistratore, uno scaffale di un mobile bagno, una ruota ottica di una stampante e un sensore di un mouse. Chi riesce a trovare tutti i pezzi?
A parte gli scherzi, lo spinner funziona perfettamente. Ho implementato anche un controllo sulla risoluzione, in modo da poter variare la velocita' con un semplice interruttore (di recupero pure lui e che devo ancora installare). Il cambio velocita' serve a gestire i diversi giochi. Arkanoid vuole una reazione immediata, quelli di guida meno!
Lo spinner montato in verticale servira' anche da volante con un semplice accessorio che sto costruendo necessario ad accogliere il volante che mi ha appena venduto PaTrYcK
Visto che lo spinner viene visto come mouse, ho previsto anche la gestione di tre pulsanti aggiuntivi che emulino i tasti del mouse.
Allegate un po' di foto, il codice sorgente e un breve test di inerzia. Ah, non sono un programmatore, per cui immagino che il codice non sia ne' pulito ne' ottimizzato. Ma funziona e a me tanto basta....
Se servono altre info chiedete pure.
Ciao,
Alessandro
[youtube]http://www.youtube.com/watch?v=ZgxyWQH_1D8[/youtube]
Codice: Seleziona tutto
#define ENCODER_OPTIMIZE_INTERRUPTS
#include <Encoder.h>
const int encPin1 = 7; // Piedino pin 1 encoder
const int encPin2 = 8; // Piedino pin 2 encoder
const int SpeedPin = 12; // Piedino controllo velocita'
const int SpeedLedPin = 11; // Piedino led controllo velocita'
const int MousePinLeft = 13; // Piedino pulsante sinistra
const int MousePinCenter = 14; // Piedino pulsante centrale
const int MousePinRight = 15; // Piedino pulsante destra
const long debounceDelay = 150; // Tempo per il Debounce (in millisecondi)
const int SpeedSlow = 2; // Velocita' lenta
const int SpeedFast = 5; // Velocita' rapida
int Speed = 0;
int buttonStateLeft = 0;
int buttonStateCenter = 0;
int buttonStateRight = 0;
long lastDebounceTime = 0;
Encoder myEnc(encPin1, encPin2);
long encOldPosition = -999;
void setup() {
pinMode(SpeedPin, INPUT_PULLUP);
pinMode(MousePinLeft, INPUT_PULLUP);
pinMode(MousePinCenter, INPUT_PULLUP);
pinMode(MousePinRight, INPUT_PULLUP);
pinMode(SpeedLedPin, OUTPUT);
}
void loop(){
Spinner();
}
void Spinner(){
Mouse.set_buttons(0, 0, 0);
// Imposto la velocita'
if(digitalRead(SpeedPin) == HIGH){
Speed = SpeedSlow;
digitalWrite(SpeedLedPin, LOW);
}
else {
Speed = SpeedFast;
digitalWrite(SpeedLedPin, HIGH);
}
// Gestione Pulsanti Mouse
buttonStateLeft = digitalRead(MousePinLeft);
buttonStateCenter = digitalRead(MousePinCenter);
buttonStateRight = digitalRead(MousePinRight);
if((millis() - lastDebounceTime) > debounceDelay){
if(buttonStateLeft == LOW && buttonStateCenter == LOW && buttonStateRight == LOW){
Mouse.set_buttons(1, 1, 1);
Mouse.set_buttons(0, 0, 0);
lastDebounceTime = millis();
}
else if(buttonStateLeft == LOW && buttonStateCenter == LOW && buttonStateRight == HIGH){
Mouse.set_buttons(1, 1, 0);
Mouse.set_buttons(0, 0, 0);
lastDebounceTime = millis();
}
else if(buttonStateLeft == LOW && buttonStateCenter == HIGH && buttonStateRight == LOW){
Mouse.set_buttons(1, 0, 1);
Mouse.set_buttons(0, 0, 0);
lastDebounceTime = millis();
}
else if(buttonStateLeft == HIGH && buttonStateCenter == LOW && buttonStateRight == LOW){
Mouse.set_buttons(0, 1, 1);
Mouse.set_buttons(0, 0, 0);
lastDebounceTime = millis();
}
else if(buttonStateLeft == LOW && buttonStateCenter == HIGH && buttonStateRight == HIGH){
Mouse.set_buttons(1, 0, 0);
Mouse.set_buttons(0, 0, 0);
lastDebounceTime = millis();
}
else if(buttonStateLeft == HIGH && buttonStateCenter == LOW && buttonStateRight == HIGH){
Mouse.set_buttons(0, 1, 0);
Mouse.set_buttons(0, 0, 0);
lastDebounceTime = millis();
}
else if(buttonStateLeft == HIGH && buttonStateCenter == HIGH && buttonStateRight == LOW){
Mouse.set_buttons(0, 0, 1);
Mouse.set_buttons(0, 0, 0);
lastDebounceTime = millis();
}
}
// Gestione spostamento mouse asse x
long encNewPosition = myEnc.read();
if (encNewPosition != encOldPosition) {
if (encNewPosition > encOldPosition){
encOldPosition = encNewPosition;
Mouse.move(-Speed, 0);
}
else {
encOldPosition = encNewPosition;
Mouse.move(Speed, 0);
}
}
}