bonjour,
je suis nouveau sur le forum, l'arduino (duemilanove) et la programmation, ça fait pas mal de nouveauté pour moi ! ![]()
j'essaye de récupérer les données x,y d'une souri à base de ADNS 2051 (d'un mac) avec du code trouvé (et traficoté) ça et là !
ça marche presque mais lorsque je débranche l'arduino et que je la rebranche,
il me faut débrancher le +5v de la souris à chaud, la rebrancher , puis réinitialiser l'arduino... avant de pouvoir lire des valeurs cohérentes.
bizarre et pas très performant !!!
une idée ???
merci d'avance !!!
je colle mon code ci dessous :
//////////
//credits : http://www.bidouille.org/hack/mousecam
/////
/////ATTENTION DÉBRANCHER ET REBRANCHER L'ALIMSOURIS POUR QUE ÇA MARCHE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
/// PUIS RESETER L'ARDUINO !!!!!!!!
///
////////////////////////////////definition/declaration pour la lecture optique///////////////////////////////////////////
#include <LiquidCrystal.h>
//#define PD 4 bouton pour plus tard.......
#define REG_MOTION 0x02
#define REG_DELTA_X 0x03
#define REG_DELTA_Y 0x04
#define REG_CONFIG_BITS 0x0A
int dumpWidth = 128; // Number of pixels to read for each frame.
byte frame[128];
LiquidCrystal lcd(7, 8, 9, 10, 11, 12); // initialize the library with the numbers of the interface pins
#define SCLK 2
#define SDIO 3
float x=0; //variable pour stoker le nombres de pas
//int incomingByte = 0; // for incoming serial data
////////////////////////////////////////////////////////////
void setup() {
reset();
byte config = readRegister(REG_CONFIG_BITS);
config |= B00000001; // Don't sleep (LED always powered on).
writeRegister(REG_CONFIG_BITS, config);
Serial.begin(115200);
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print(" machin");
delay (1000);
lcd.clear();
Serial.begin(115200);
}
void loop() {
if(Serial.available() > 0) { // si le port de la souris est ouvert alors.....
}
readRegister(REG_MOTION); // Freezes DX and DY until they are read or MOTION is read again.
char dx = readRegister(REG_DELTA_X); //lecture des registres
char dy = readRegister(REG_DELTA_Y);
x=(x+dx); // on ajoute dx à la variable x....
lcd.setCursor(0,1);
lcd.print(x); //affichage.... de x
Serial.println(x);
}
////////////////////// sous programmes /////////////////
void reset() {
pinMode(SCLK, OUTPUT);
pinMode(SDIO, INPUT);
//pinMode(PD, OUTPUT);
digitalWrite(SCLK, LOW);
// digitalWrite(PD, HIGH);
delayMicroseconds(100);
// digitalWrite(PD, LOW);
}
byte readRegister(byte address) {
pinMode (SDIO, OUTPUT);
for (byte i=128; i >0 ; i >>= 1) {
digitalWrite (SCLK, LOW);
digitalWrite (SDIO, (address & i) != 0 ? HIGH : LOW);
digitalWrite (SCLK, HIGH);
}
pinMode (SDIO, INPUT);
delayMicroseconds(100); // tHOLD = 100us min.
byte res = 0;
for (byte i=128; i >0 ; i >>= 1) {
digitalWrite (SCLK, LOW);
digitalWrite (SCLK, HIGH);
if( digitalRead (SDIO) == HIGH )
res |= i;
}
return res;
}
void writeRegister(byte address, byte data) {
address |= 0x80; // MSB indicates write mode.
pinMode (SDIO, OUTPUT);
for (byte i = 128; i > 0 ; i >>= 1) {
digitalWrite (SCLK, LOW);
digitalWrite (SDIO, (address & i) != 0 ? HIGH : LOW);
digitalWrite (SCLK, HIGH);
}
for (byte i = 128; i > 0 ; i >>= 1) {
digitalWrite (SCLK, LOW);
digitalWrite (SDIO, (data & i) != 0 ? HIGH : LOW);
digitalWrite (SCLK, HIGH);
}
delayMicroseconds(100); // tSWW, tSWR = 100us min.
}