vorrei sapere tutto su unojoy, per creare un controller per mac/win e ps3 , unojoy cosa modifica ?, una volta fatto, cosa succede ad arduino , posso tornare a utilizzarlo normalmente ? vorrei creare un controller , sul sito ufficiale c è una specie di guida , ma devo creare l hardware ?, infine esistono i drive per istallarlo su OSX 10.8.5 . grazie
Vorrei saerlo anch' io. Non ho mai sentito niente di unojoy.
Ciao Uwe
Diciamo che le informazioni sono scarse e non esaustive. Non spiegano come programmare Arduino una volta riprogrammato.
Mi aspetterei una spiegazione come fare i Sketch e quali comandi spedire per usare Arduino per i diversi Dispositivi di gioco.
Il progetto prevede di cambiare il programma del controller (ATmega16U2) che gestisce il collegamente USB-seriale, usato per fare l' upload dello sketch e un Sketch per il controller principale (ATmega328).
Mi pare che poi Arduino UNO verrá riconosciuto come dispositivo HDI e non puó essere fatto un Upload di uno sketch attraverso la USB.
Puoi rimettere il programma originale ma temo che serve un programmatore ICSP che poi non costa granché.
Ciao Uwe
Salve, sono il creatore dell'articolo che ha linkato Gerardo in un altro thread (http://tecnomente.altervista.org/2014/03/28/usare-joystick-ps2-pc-ps3-arduino/).
Se volete tornare ad Arduino (dopo averlo riprogrammato per farlo diventare HID) non vi basta altro che metterlo di nuovo in DFU mode e avviare il TurnIntoAnArduino di UnoJoy.
In effetti su UnoJoy non si trova tanta documentazione in inglese e tanto meno in italiano ma il suo funzionamento è abbastanza semplice. Il codice di esempio che viene fornito non fa altro che rilevare se viene cliccato un bottone (un PIN che va a GND) e lo fa corrispondere al tasto del joystick. Questo implica che per ogni tasto venga utilizzato un PIN.
Nella mia guida troverai invece l'intero joystick funzionante in 4 PIN semplicemente perchè sfrutto la libreria PS2X "unendola" a UnoJoy (il codice l'ho fatto un pò a intuito ma funziona alla perfezione :D).
P.S. non so se l'avete notato ma questa discussione capita al momento giusto, ho pubblicato l'articolo ieri!
P.S. non so se l'avete notato ma questa discussione capita al momento giusto, ho pubblicato l'articolo ieri!
Che fortuna! oppure conosci Gerardo96 di persona??
mi sa il primo.
Ciao Uwe
no no , non ci conosciamo di persona l ho trovato il post navigando su internet
salve riguardate unojoy ( esempio PaintController) ,volevo chiedere come si fa ad abbassare il punto di toccaggio del "pulsante" e il tempo di durata del tasto premuto questo è il codice
/* Example code for a controller made with capacitive inputs.
Each input should have a 1 Megaohm resistor pulling it up
to +5v for the sensing to work well
*/
#include "UnoJoy.h"
int PressCutoff = 10;
int ReleaseCutoff = 1;
// We define our pins here
#define UP_PIN 11
#define RIGHT_PIN 8
#define LEFT_PIN 7
#define DOWN_PIN 4
#define SQUARE_PIN 9
#define TRIANGLE_PIN 12
#define CIRCLE_PIN 2
#define CROSS_PIN 10
#define L1_PIN 6
#define L2_PIN 5
#define R1_PIN 3
#define R2_PIN 2
#define START_PIN 6
#define HOME_PIN 7
// This array just helps us set our pins easily
#define NUMBER_OF_INPUTS 12
int pinArray[NUMBER_OF_INPUTS] = {UP_PIN, RIGHT_PIN, LEFT_PIN, DOWN_PIN,
TRIANGLE_PIN, CIRCLE_PIN, SQUARE_PIN, CROSS_PIN,
START_PIN, HOME_PIN, L1_PIN, R1_PIN};
// This stores the baseline cutoff value for the
// capacitive sensors on each pin
int baselineArray[20];
int lastPinValues[20];
dataForController_t ControllerData;
void setup(){
ControllerData = getBlankDataForController();
setupUnoJoy();
// Give things a chance to settle after power-up
delay(200);
// This function establishes the baseline reading
// for each capacitive sensor, effectively calibrating it
setupBaselines();
for (int i = 0; i < 20; i++){
lastPinValues[i] = baselineArray[i];
}
}
void loop(){
// Always be getting fresh data
getControllerData();
setControllerData(ControllerData);
delay(100);
//if ((millis() % 250) < 5){
// refreshBaselines(40);
// delay(5);
//printPins();
//}
}
// This function reads an average of each capacitive pin,
// calculates an appropriate cutoff value for the 'touched'
// condition, and stores that value.
void setupBaselines(void){
for (byte i = 0; i < NUMBER_OF_INPUTS; i++){
int baseReading = calibrateCapacitivePin(pinArray[i]);
baselineArray[pinArray[i]] = baseReading + (baseReading / 4);
}
}
void refreshBaselines(int cutoff){
for (byte i = 0; i < NUMBER_OF_INPUTS; i++){
int baseReading = readCapacitivePinModified(pinArray[i]);
int newValue = baseReading + (baseReading / 4);
if ((newValue - baselineArray[pinArray[i]]) < cutoff)
baselineArray[pinArray[i]] = newValue;
}
}
// This function takes an average of 8 readings on a
// capacitive sensor pin and returns that. It's used
// to establish a baseline value for each sensor.
int calibrateCapacitivePin(int pinNumber){
readCapacitivePinModified(pinNumber);
delay(1);
int averagingTotal = 0;
for (int i = 0; i < 8; i++){
int reading = readCapacitivePinModified(pinNumber);
averagingTotal += reading;
delay(1);
}
return averagingTotal / 8;
delay(10);
}
int readPin(int pin, int previousValue){
int returnValue = previousValue;
int reading = 0;
int reading2 = 0;
int reading3 = 0;
int reading4 = 0;
// Compare the reading of each capacitive pin to the cutoff we
// established at the start
reading = readCapacitivePinModified(pin) / 4;
reading2 = readCapacitivePinModified(pin) / 4;
reading3 = readCapacitivePinModified(pin) / 4;
reading4 = readCapacitivePinModified(pin) / 4;
reading = reading + reading2 + reading3 + reading4;
if (reading > (lastPinValues[pin] + PressCutoff))
returnValue = 1;
else if (reading < (lastPinValues[pin] - ReleaseCutoff))
returnValue = 0;
lastPinValues[pin] = reading;
return returnValue;
}
// This function reads each of the capacitive pins, and if
// the value is over the cutoff for a touch, assigns the
// appropriate button as pressed.
void getControllerData(void){
ControllerData.dpadDownOn = readPin(DOWN_PIN, ControllerData.dpadDownOn);
ControllerData.dpadUpOn = readPin(UP_PIN, ControllerData.dpadUpOn);
ControllerData.dpadLeftOn = readPin(LEFT_PIN, ControllerData.dpadLeftOn);
ControllerData.dpadRightOn = readPin(RIGHT_PIN, ControllerData.dpadRightOn);
ControllerData.leftStickY = 128;
ControllerData.leftStickX = 128;
if (ControllerData.dpadDownOn == 1)
ControllerData.leftStickY = 245;
if (ControllerData.dpadUpOn == 1)
ControllerData.leftStickY = 10;
if (ControllerData.dpadLeftOn == 1)
ControllerData.leftStickX = 10;
if (ControllerData.dpadRightOn == 1)
ControllerData.leftStickX = 245;
ControllerData.circleOn = readPin(CIRCLE_PIN, ControllerData.circleOn);
ControllerData.crossOn = readPin(CROSS_PIN, ControllerData.crossOn);
ControllerData.triangleOn = readPin(TRIANGLE_PIN, ControllerData.triangleOn);
ControllerData.squareOn = readPin(SQUARE_PIN, ControllerData.squareOn);
ControllerData.l1On = readPin(L1_PIN, ControllerData.l1On);
ControllerData.r1On = readPin(R1_PIN, ControllerData.r1On);
return;
}
// readCapacitivePin
// Input: Arduino pin number
// Output: A number, from 0 to 17 expressing
// how much capacitance is on the pin
// When you touch the pin, or whatever you have
// attached to it, the number will get higher
// In order for this to work now,
// THE PIN MUST HAVE A BEEFY PULL-UP RESISTOR
int readCapacitivePinModified(int pinToMeasure){
// This is how you declare a variable which
// will hold the PORT, PIN, and DDR registers
// on an AVR
volatile uint8_t* port;
volatile uint8_t* ddr;
volatile uint8_t* pin;
// Here we translate the input pin number from
// Arduino pin number to the AVR PORT, PIN, DDR,
// and which bit of those registers we care about.
byte bitmask;
if ((pinToMeasure >= 0) && (pinToMeasure <= 7)){
port = &PORTD;
ddr = &DDRD;
bitmask = 1 << pinToMeasure;
pin = &PIND;
}
if ((pinToMeasure > 7) && (pinToMeasure <= 13)){
port = &PORTB;
ddr = &DDRB;
bitmask = 1 << (pinToMeasure - 8);
pin = &PINB;
}
if ((pinToMeasure > 13) && (pinToMeasure <= 19)){
port = &PORTC;
ddr = &DDRC;
bitmask = 1 << (pinToMeasure - 13);
pin = &PINC;
}
// Discharge the pin first by setting it low and output
*port &= ~(bitmask);
*ddr |= bitmask;
delay(1);
// Make the pin an input WITHOUT the internal pull-up on
*ddr &= ~(bitmask);
// Now see how long the pin to get pulled up
int cycles = 16000;
for(int i = 0; i < cycles; i++){
if (*pin & bitmask){
cycles = i;
break;
}
}
// Discharge the pin again by setting it low and output
// It's important to leave the pins low if you want to
// be able to touch more than 1 sensor at a time - if
// the sensor is left pulled high, when you touch
// two sensors, your body will transfer the charge between
// sensors.
*port &= ~(bitmask);
*ddr |= bitmask;
return cycles;
}
// This is a debugging function to easily see what
// values the pins are returning.
void printPins(){
Serial.print("Baseline: ");
Serial.print(baselineArray[2]);
Serial.print(" 2: ");
Serial.println(readCapacitivePinModified(2));
Serial.print("Baseline: ");
Serial.print(baselineArray[3]);
Serial.print(" 3: ");
Serial.println(readCapacitivePinModified(3));
Serial.print("Baseline: ");
Serial.print(baselineArray[4]);
Serial.print(" 4: ");
Serial.println(readCapacitivePinModified(4));
Serial.print("Baseline: ");
Serial.print(baselineArray[5]);
Serial.print(" 5: ");
Serial.println(readCapacitivePinModified(5));
Serial.print("Baseline: ");
Serial.print(baselineArray[6]);
Serial.print(" 6: ");
Serial.println(readCapacitivePinModified(6));
Serial.print("Baseline: ");
Serial.print(baselineArray[7]);
Serial.print(" 7: ");
Serial.println(readCapacitivePinModified(7));
Serial.print("Baseline: ");
Serial.print(baselineArray[8]);
Serial.print(" 8: ");
Serial.println(readCapacitivePinModified(8));
Serial.print("Baseline: ");
Serial.print(baselineArray[9]);
Serial.print(" 9: ");
Serial.println(readCapacitivePinModified(9));
Serial.print("Baseline: ");
Serial.print(baselineArray[10]);
Serial.print(" 10: ");
Serial.println(readCapacitivePinModified(10));
Serial.print("Baseline: ");
Serial.print(baselineArray[11]);
Serial.print(" 11: ");
Serial.println(readCapacitivePinModified(11));
Serial.print("Baseline: ");
Serial.print(baselineArray[12]);
Serial.print(" 12: ");
Serial.println(readCapacitivePinModified(12));
Serial.println();
}
grazie