PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Maus-Sensor an NIBObee



rofe
30.04.2011, 16:14
Hallo RN-Com,

ich möchte versuchen meine kleine Biene mit einem Maus‐Sensor verbinden.
Als Grundlage habe ich mir https://www.roboternetz.de/phpBB2/files/pan3101_und_rn-control.pdf angeschaut und gedacht, dass ich das einmal testen möchte.
Doch das alles schien zu leicht: Maus bestellt und rein geschaut. Es ist ein PAN 3402/3504 verbaut und hat 14 Pins. Nun besteht mein Problem darin, dass ich Pinbelegung nicht kenne, da ich keine Datenblätter gefunden habe.
Nun zur Frage: Was ist der PAN3402/3504?
Sind das zwei in einen? (Es steht noch in der Maus: "PAN3401: Y1,C3 OPEN; Reversed for future use" und "PAN 3502: Y1,C3 CLOSED")
Und wie bekomm ich jetzt heraus, wie ich die Daten auslesen kann?

Vilem
30.04.2011, 19:03
Hallo,
Hallo,
ich kann Deine Frage nicht konkret beantworten, aber vielleicht helfen Dir folgende Hinweise ein Stück weiter. Im Internet fand ich bei www.pixart.com.tw unter products einen mousesensor für PS2 PAW3402 und einen mousesensor für USB PAW3504, beide leider nicht mit 14 sondern mit nur 12 Pins. Aber klingt doch sehr verdächtig, oder ?
Die beiden haben offenbar laut Datenblatt ein integriertes PS2 bzw. USB-Interface also extra ohne Interface Chip (von Cypress) wie das sonst üblich ist.
Ist bei Dir noch ein zweiter Chip drin ? Wenn nicht, hast Du vielleicht einen Vorgänger-Typ auch mit integrierten interfaces. Das ist meiner Ansicht nach leider schlecht, denn man muß den Maus Sensor bei dem von Dir zitierten Programm direkt über 2 Pins (I/O und clock (vom mikrocontroller)) auslesen können.
Außerdem sind die Register, aus denen die Mausdaten ausgelesen werden, immer ganz verschieden, müßten also umprogrammiert werden.
Ich bin auch sehr an einem Maussensor an meinem Asuro interessiert bin aber leider in C noch ein totales Programmier-greenhorn und kriege das Programm noch nicht mal kompiliert.Gelingt Dir das ?
Evtl. könnten wir uns zusammentun, ich könnte Dir vielleicht zwar nicht den PAN3101 aber eine ähnlichen Sensor besorgen.
Gruß Vilem

rofe
02.05.2011, 21:28
Danke, dass du dich mit meinem Problem befasst hast. Aber nach langem Suchen habe ich es aufgegeben nach diesem Sensor weiter zu suchen. Ich habe jetzt in einer anderen Maus den ADNS2051 gefunden, zu dem es auch umfangreiche Infos gibt. Ich versuche es später genauere Erfolge berichten zu können

rofe
17.05.2011, 12:15
Soo, ich habe jetzt ein wenig mehr gefunden, doch funktioniert es noch nicht so recht

#include "nibobee.h"

#include <stdlib.h>
#include <avr/io.h>
#include <avr/pgmspace.h>

#include <util/delay.h>

#define DDR_SCK DDRA /*!< DDR fuer Maus-SCLK */
#define DDR_SDA DDRC /*!< DDR fuer Maus-SDA */

#define PORT_SCK PORTA /*!< PORT fuer Maus-SCK */
#define PORT_SDA PORTC /*!< PORT fuer Maus-SDA */
#define PIN_SDA PINC /*!< PIN fuer Maus-SDA */

#define SCK_PIN (1<<PA3) /*!< PIN nummer fuer Maus-SCK */
#define SDA_PIN (1<<PC3) /*!< PIN nummer fuer Maus-SDA */


/*!
* Uebertraegt ein Byte an den Sensor
* @param data das Byte
*/
void pan_writeByte(unsigned char data){
signed char i;

DDR_SDA|= SDA_PIN; // SDA auf Output

for (i=7; i>=0; i--){

PORT_SCK &= ~SCK_PIN; //SCK auf Low, daten vorbereiten

if(data&(1<<i)){ //BIT rausschieben
PORT_SDA|=SDA_PIN;
}else{
PORT_SDA&=~SDA_PIN;
}

PORT_SCK |= SCK_PIN; // SCK =1 Sensor uebernimmt auf steigender Flanke

_delay_us(1); //sensor Zeit lassen um Bit zu holen
}

DDR_SDA &=~ SDA_PIN; //HI-Z state
PORT_SDA &=~ SDA_PIN;

}

/*!
* Liest ein Byte vom Sensor
* @return das Byte
*/
unsigned char pan_readByte(void){
signed char i;
unsigned char data=0;

_delay_us(3); //Sensor Zeit lassen um die Daten aus dem Register zu holen

for (i=7; i>-1; i--){
PORT_SCK &= ~SCK_PIN; // SCK =0 Sensor bereitet Daten auf fallender Flanke vor !

_delay_us(1); //Sensor kurz zeit lassen


PORT_SCK |= SCK_PIN; // SCK =1 Daten lesen auf steigender Flanke

if(PIN_SDA&SDA_PIN){ //BIT einlesen
data |= (1<<i);
}else{
data &=~ (1<<i);
}

}
return data;
}

/*!
* Uebertraegt ein write-Kommando an den Sensor
* @param adr Adresse
* @param data zu schreibendes byte
*/
void pan_write(unsigned char adr, unsigned char data){
adr|=(1<<7);
pan_writeByte(adr); //rl MSB muss 1 sein Datenblatt S.12 Write Operation
pan_writeByte(data);
//_delay_ms(4);
}



/*!
* Schickt ein Lesekommando an den Sensor
* und liest ein Byte zurueck
* @param adr die Adresse
* @return der registerwert
*/
unsigned char pan_read(unsigned char adr){

pan_writeByte(adr);
return pan_readByte();
}


/*!
* Initialisiere PAN3101

!! Muss unbedingt ganz am ANFANG von main stehen, sonst gibts FEHLER !!

*/
void pan_init(void){

DDR_SCK |= SCK_PIN; // SCK auf Output
DDR_SDA |= SDA_PIN; //SDA auf output

PORT_SCK |= SCK_PIN; // SCK auf high
PORT_SDA|= SDA_PIN; //SDA auf high


//Reset PAN3101
pan_write(0x0a,0x80);
// kein Sleep modus
pan_write(0x0a,0x01);
}


int main(void){
unsigned char ino;
signed char x,y;
signed short posx=0,posy=0;

pan_init();
//Platz für andere Initialiesierungen
while(1){

ino=pan_read(0x02);

if(ino&(1<<7)){ //wenn 7tes bit gesetzt ist wurde die Maus bewegt => bewegungsdaten abfragen
x=pan_read(0x03);
posx=posx+x;

y=pan_read(0x04);
posy=posy+y;

SerPrint("X-Pos: ");
PrintInt(x);
SerPrint(" | Y-Pos: ");
PrintInt(y);
SerPrint("\n\r");
}

_delay_ms(250);
_delay_ms(250);

}

return 0;
}


Ich habe so weit ich es herausfinden konnte alle Register Geändert:
0x0a Configuration_bits
0x02 Motion
0x03 Delta_X
0x04 Delta_Y

Auch die beiden Sensoren in der neuen Maus habe ich gerennt, wie es im Wiki steht. Die Spannung hab ich zwar nicht direkt am Sensor dran gelötet, dafür aber an die USB-Buchse.

Vilem
18.05.2011, 20:00
Hallo Rofe,
vielen Dank für die Quellcode-Einstellung im RN. Ich werde versuchen, das ein bißchen auf meinen Asuro umzustricken und hoffe daß mir das als Programmieranfänger gelingt. Ich habe auch den ADNS2051 und hoffe, daß die geänderten Register denen des beim PAN verlangten entsprechen, was ich bisher noch nicht ganz erkennen konnte. Der zweite Chip in der Maus (ich nehme an, auch bei Dir einer der Marke "Cypress") schaltete bei mir die Betriebsspannung für den 2051 ein, sodaß ich die Betriebsspannung für den 2051 direkt an 5 Volt (z.B. vom USB, bei mir von der Asuroplatine) legen muß.
Falls Du Dich mit Linux auskennst, habe ich in C für Linux geschrieben, ein interessantes Programm gefunden, das das Pixelbild des 2051 über den Parallelport (sofern man einen solchen noch hat) des PC ausliest (natürlich ohne Roboter). Leider habe ich nur Windows und das Programm umschreiben ist wohl kompliziert. Falls Dich's interessiert hier der link: www.joshuawise.com/parspi.c (http://www.joshuawise.com/parspi.c)
Gruß Vilem