Hello! I have some problems with ADNS5050 on Arduino atmega328 board?I appreciate anyone who can help me out.I get some code on the internet but it doesnot work well.Can you post your code ? I will learn it very hard .Thank you very much!
I have some problems
, but I'm not going to tell you what they are.
Here is my code ,Can you help me find the problem with it ?Thank you !
#include "arduino.h"
#include "Adns.h"
/******************************************************************************
* Definitions
******************************************************************************/
#define SCLK 6
#define SDIO 5
#define NCS 4
#define PRODUCT_ID 0x00
#define DELTA_Y_REG 0x03
#define DELTA_X_REG 0x04
#define SQUAL_REG 0x05
#define MAXIMUM_PIXEL_REG 0x08
#define MINIMUM_PIXEL_REG 0x0a
#define PIXEL_SUM_REG 0x09
#define PIXEL_DATA_REG 0x0b
#define SHUTTER_UPPER_REG 0x06
#define SHUTTER_LOWER_REG 0x07
#define RESET 0x3a
#define MOUSE_CONTROL2 0x19
#define RES_CPI 0x1B
#define NUM_PIXELS 361
byte pix[361];
char dx;
char dy;
void setup()
{
Serial.begin(9600);
pinMode(SDIO, OUTPUT);
pinMode(SCLK, OUTPUT);
pinMode(NCS, OUTPUT);
sync();
byte productId = ADNS_read_old(PRODUCT_ID);
Serial.print("Found productId ");
Serial.print(productId);
}
void loop()
{
// Freezes DX and DY until they are read or MOTION is read again.
dx = ADNS_read_old(DELTA_X_REG);
dy = ADNS_read_old(DELTA_Y_REG);
Serial.print("DELTA:");
Serial.print( dx, DEC);
Serial.print(" ");
Serial.print( dy, DEC);
Serial.print(" ");
Serial.print('\r');
Serial.print('\n');
// pixelGrab();
// Serial.print("FRAME:");
// for(int i = 0; i < NUM_PIXELS; i++)
// {
// byte p = pix;
// if( p < 0x10 )
// Serial.print("0");
// Serial.print(p, HEX);
// }
// Serial.println();
}
//byte surfaceQuality()
//{
// return ADNS_read_old(SQUAL_REG);
//}
void sync()
{
pinMode(NCS, OUTPUT);
digitalWrite(NCS, LOW);
delayMicroseconds(2);
digitalWrite(NCS, HIGH);
ADNS_write_old(RESET, 0x5a);
delay(100); // From NRESET pull high to valid motion, assuming VDD and motion is present.
if(ADNS_read_old(PRODUCT_ID) == 0x12)
{
ADNS_write_old(MOUSE_CONTROL2, 0x1B);
}
}
void pixelGrab()
{
//ADNS_write(PIXEL_DATA_REG, 0); // start reading
//delayMicroseconds(20);
int grabCount = 0;
while( grabCount < NUM_PIXELS )
{
byte data = ADNS_read_old(PIXEL_DATA_REG);
if( (data & 0x80) != 0 ) { // Data is valid
pix[grabCount++] = data&0x7f;
}
}
}
void ADNS_write_old(unsigned char addr, unsigned char data) {
char temp;
int n;
digitalWrite(NCS, LOW);//nADNSCS = 0; // select the chip
temp = addr ;
digitalWrite(SCLK, LOW);//SCK = 0; // start clock low
pinMode(SDIO, OUTPUT);//DATA_OUT; // set data line for output
for (n=0; n<8; n++) {
digitalWrite(SCLK, LOW);//SCK = 0;
pinMode(SDIO, OUTPUT);
delayMicroseconds(1);
if (temp & 0x80)
digitalWrite(SDIO, HIGH);//SDOUT = 1;
else
digitalWrite(SDIO, LOW);//SDOUT = 0;
temp = (temp << 1);
digitalWrite(SCLK, HIGH);//SCK = 1;
delayMicroseconds(1);//delayMicroseconds(1); // short clock pulse
}
temp = data;
for (n=0; n<8; n++) {
digitalWrite(SCLK, LOW);//SCK = 0;
delayMicroseconds(1);
if (temp & 0x80)
digitalWrite(SDIO, HIGH);//SDOUT = 1;
else
digitalWrite(SDIO, LOW);//SDOUT = 0;
temp = (temp << 1);
digitalWrite(SCLK, HIGH);//SCK = 1;
delayMicroseconds(1); // short clock pulse
}
delayMicroseconds(20);
digitalWrite(NCS, HIGH);//nADNSCS = 1; // de-select the chip
}
byte ADNS_read_old(unsigned char addr) {
byte temp;
int n;
digitalWrite(NCS, LOW);//nADNSCS = 0; // select the chip
temp = addr;
digitalWrite(SCLK, OUTPUT); //SCK = 0; // start clock low
pinMode(SDIO, OUTPUT); //DATA_OUT; // set data line for output
for (n=0; n<8; n++) {
digitalWrite(SCLK, LOW);//SCK = 0;
pinMode(SDIO, OUTPUT); //DATA_OUT;
if (temp & 0x80) {
digitalWrite(SDIO, HIGH);//SDOUT = 1;
}
else {
digitalWrite(SDIO, LOW);//SDOUT = 0;
}
temp = (temp << 1);
delayMicroseconds(1);
digitalWrite(SCLK, HIGH); //SCK = 1;
delayMicroseconds(1); // short clock pulse
}
temp = 0; // This is a read, switch to input
pinMode(SDIO, INPUT); //DATA_IN;
for (n=0; n<8; n++) { // read back the data
digitalWrite(SCLK, LOW);
if(digitalRead(SDIO)) {// got a '1'
temp |= 0x1;
}
if( n != 7) temp = (temp << 1); // shift left
digitalWrite(SCLK, HIGH);
}
digitalWrite(NCS, HIGH);// de-select the chip
return temp;
}
You still haven't told us what you perceive "the problem" to be.
You still haven't told us what you perceive "the problem" to be.
Thank you for your responses.I am not sure the application of Motion ,Squal ,Pixel_Sum,Pixel_Grab.I use ADNS5050 to location on robot.I want to get X_displacement and Y_displacement. dx = ADNS_read_old(DELTA_X_REG); dy = ADNS_read_old(DELTA_Y_REG);
in my code ,Now but the changes are not very noticeable.please experts to analyze why.Thanks!