PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : GeneralKeys Lasermaus als Sensor für die Odometrie



mpetz
09.08.2005, 17:13
Ich habe jetzt auch zwei von den Lasermäusen da (ist wirklich Laser) und will diese in meinen Catwiesel für die Odometrie (Positionbestimmung) einbauen. Ich versuche noch ein paar Bilder vom Innenleben zu machen und hier einzustellen.

Die Maus funktioniert bei mir auf allen getesteten Oberflächen sehr gut (hab noch nicht sooo viel ausprobiert!). der Abstand der Maus kann auf bis zu 22mm vom Untergrund angehoben werden. Aber da der Laser innen drin noch deutlich höher sitzt (nochmal ca. 18mm). Ich gehe also von einem möglichen Abstand von bis zu 40mm aus (ohne Veränderungen).

Nun brauch ich aber als Elektronikanfänger auch noch etwas Hilfe, ich habe das Ding ja nun als USB Version und würde aber gerne nur diese Mauswerte auslesen. Die Laserelektronik ist recht klein und nutzt einen PAN 301 Chip, der wie ich glaube ja auch in anderen Mäusen eingesetzt wird?!, naja von dort geht ein Kabel mit 5 Leitungen weiter zur Platine. Vielleicht hat jemand von euch Links zum auslesen von Mausdaten etc.

P.S. Bei mir Zittert/Wackelt die Maus nicht, sie ist nur sehr schnell (lässt sich aber einfach in Windows langsamer stellen)!

mpetz
09.08.2005, 17:16
Die Bezeichnung der Chips sind,
oben am Lasersensor: PAN 301, ASI-208, 31D50726C
unten auf der Mausplatine: "Elan", EM78M612ADK, 0514L BC5413

mpetz
09.08.2005, 17:20
Hab das Datenblatt des Lasersensor-Chips gefunden: http://www.actc.com.cn/en/products/../images/pdf/PAN301A.pdf

Manf
09.08.2005, 17:58
Hier gibt es auch Bilder von optischen Mäusen auch von einer Lasermaus mit weniger hohem Aufbau.

Die Quadratursignale sollten dirket am Chip abgreifbar sein, das habe ich zumindest bei meiner optischen LED Maus erfolgreich ausprobiert.

http://www.ida.net/users/oe1k/OpticalMouse/


http://www.ida.net/users/oe1k/OpticalMouse/Logitech%20MX1000%20images/Mouse%20PCB%20side%204%20DSCF0044small.png (http://www.ida.net/users/oe1k/OpticalMouse/.%5CLogitech%20MX1000%20images%5CMouse%20PCB%20sid e%204%20DSCF0044.jpg)

stupsi
09.08.2005, 19:35
ist ja interessant, das bei mpez die Maus sogar bis 22mm schweben darf. Das ist die richtige Einbaumöglichkeit für die Robbies.
meine Funkmaus konnte nur 7mm schweben; sie ist schon wieder in der PEARL-Heimat. Danke auch für den Link, manf. man kann sich vorstellen, das diese Funktion bei der Logitech-lasermaus (bild oben) nicht funktionier, da sie über ein Linsensystem verfügt. mpez, ich hoffe, das du schnell die Dekodierung schaffst; das Ergebnis ist bestimmt interessant.

gruß Stupsi

MarkusH
27.01.2006, 21:24
Hi Leute,
hab mir inzwischen auch die General Keys Lasermaus zugelegt da die meiner meinung nach den größten abstand zum boden ermöglicht. Das abgreifen der Signale hat sich wirklich als einfach herausgestellt. Nur versteh ich nicht wie man zwischen vorwärts und rückwärts unterscheiden kann. Wie habt ihr das gelöst?
Gruß, Markus

Vogon
28.01.2006, 10:40
Zähleransteuerung mit Quadratursignalen:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=10007

veloxid
30.01.2006, 21:40
Hi
Ich wollte mich auch mal da ran wagen. Frage ist jetzt welche LaserMaus das genau ist?
Bei Peal gibt es 2: eine mit 1200dpi und eine mit 1600dpi
Nr. 1: http://www.pearl.ag/p/PE9345-General-Keys-Laser-Maus-USB-1200dpi.html
Nr. 2: http://www.pearl.ag/pearl.jsp?redir=yes&screenX=1600&screenY=1200

Kannste mir sagen welche du hast? Haste schon weiter damit experimentiert?


gruss veloxid

anton-trony
08.05.2006, 08:31
Hi,

das ist die Maus mit 1200dpi. Hab mir diese auch gekauft und sie funktioniert super. Ich hab den Sensor ausgebaut und er funktioniert ohne Änderung bei einem Abstand von 15 bis 40mm zum Untergrund. Wenn man die Laserdiode ein wenig hoch biegt, funktioniert es bei mir sogar bei einem Abstand von 17 bis 60mm.

Gruß Anton

Despin
22.06.2006, 18:05
Hallo,

ich möchte auch einen Maussensor verwenden. Was mich jedoch stört ist der geringe Abstand zum Boden und das der Arbeitsbereich sehr begrenzt ist. Jetzt lese ich hier, daß auch Entfernungen von ca. 15-40mm und mehr diese Sensoren verwendbar sind. Kann mir einer sagen woran das liegt, das andere nur auf so kurzer Entfernung funktionieren?
1. Liegt das nur an der Optik oder ist dazu auch ein anderer Chip nötig?
2. In dem Datenblatt zum PAN301A ist auch eine Optik beschrieben. Bedeutet das, das die Optik nur zum verkürzen des Abstandes verwendet wird?
3. Ist die Empfindlichkeit des Sensors von der Wellenlänge des Lichts abhängig? Kann ich auch eine Blaue LED/Laser bzw IR-Laser verwenden?
4. Wie habt ihr den Sensor an den Controller angeschlossen, was muß noch an den Sensor und der Laserdiode angeschlossen werden? (Ein Bild wäre super).
Habe gerade gesehen, das der Chip ein I2C ähnliches Interface bietet. Habt ihr das verwendet?
5. Wenn ich die X/Y Ausgänge verwende, bei höherer Auflösung des Chips müsste ich doch auch mehr Impulse bekommen, bremse ich dann meinen Controller (ATMEGA32) nicht zu stark aus?

Super Idee einen Maussensor zu verwenden!!

starkeeper
15.11.2006, 08:27
Hi,
mich würde interessieren, was ihr für Teppich erfahrungen gemacht habt. Bei mir hier liegt fast überall Teppich und darauf sollte der Sensor natürlich auch Funktionieren.

Gruß Starkeeper

avr_mcu
15.11.2006, 12:25
@starkeeper: Das mit dem Teppich kannst du dir sehr schnell selbst beantworten: Einfach deine optische PC-Maus auf einem Stück Teppich plazieren und überprüfen, wie sich der "Mauszeiger" auf dem Bildschirm bei Bewegung verhält. Ich würde aber insbesondere keine hohen Erwartungen an die Reproduzierbarkeit einer derartigen "Messung" stellen.
@despin: Zur Optik kann ich dir nur wenig sagen, ich denke aber hier im Forum gibts schon mehrere threads, die und in denen das Thema diskutiert wird.
zu 3.: Ja, müsste aber auch im Datenblatt stehen, zumindest habe ich es dem Datenblatt des ADNS2620 entnommen, den ich seinerzeit dafür verwendet habe.
zu 4.: über SPI (also i2c-ähnlich), siehe Datenblatt ADNS2620 von Agilent. zu 5.: zu stark für was ? Wenn du den sensor via SPI ausliest ("digital") ist das sicherlich vorteilhafter in Bezug auf die benötigten Resourcen, als diesen im Polling-Betrieb ("analog") abzufragen

Datenblatt habe ich auf die schnelle nicht gefunden, einfach mal selbst bei www.agilent.com schauen. Bei Fragen kann ich gern versuchen, dir ein wenig auf die Sprünge zu helfen. Ist aber auch nicht so schwierig wie es aussehen mag.

Gruß,
S.

Correia
29.05.2007, 14:41
Hallo avr_mcu,

auch ich habe die Laser-Maus von General Keys mit 1200 dpi gekauft und
möchte sie bei meiner Diplomarbeit verwenden. Thema meiner Diplomarbeit ist der Aufbau eines Autonomen Mobilen Roboters. Die Navigation würde ich gerne mit dieser Lasermaus realisieren. Ich verwende einen 16 Bit Mikrocontroller von Freescale der 56F8347. Die Mikrocontrollerplatine ist auch bereits aufgebaut. Eine SPI Schnittstelle habe ich nach Aussen geführt. Jetzt höre ich hier, dass ich die Maus mit der SPI Schnittstelle auslesen kann. Kann mir einer vielleicht noch nähere Details geben, welche Leitungen an welche Signale verbunden werden müssen. Vielleicht auch noch eine Funktion in C, wie die Maus genau ausgelesen werden kann. Das wäre Super.

avr_mcu
29.05.2007, 22:39
Hallo Correia,
So schwierig sollte es nicht werden. Prinzipiell benötigst du ja nur zwei
Leitungen für SPI (SCK=also Taktleitung und SDA=Datenleitung).
Am besten du besorgst dir, falls noch nicht geschehen, zunächst das Datenblatt des verwendeten Chips deiner Maus ...
Gruß,
S.

schregge
11.06.2007, 08:31
Ich bin jetzt auch Besitzer dieser Maus, allerdings habe ich es noch nicht geschafft sie ueber SPI anzusteuern. Aus dem Datenblatt bin ich auch nicht schlauer geworden....
Wenn jemand ein Beispiel hat, nur her damit :-)

Danke

Correia
23.06.2007, 19:13
Hallo Zusammen,

ich bin jetzt mit der Laser-Maus von General Keys weitergekommen:

1) Ansteuerung habe ich seriell realisiert. Dafür werden 5 Leitungen benötigt:

a) SCLK - Clock Leitung
b) SDIO - Datenleitung, halb-duplex für Senden und Empfangen von Daten
c) PD - wird nicht unbedingt benötigt, kann aber für eine Re-Synchronisation zwischen Maus und µC hilfreich sein
d) 5V Leitung
e) GND Leitung

Im Datenblatt des Sensors PAN301A steht genau das Protokoll beschrieben, an dem man sich halten muss. Nachfolgend ist mein Quellcode in C für den µC 56F5847 von Freescale (16-Bit) angefügt.

Aber jetzt zum wichtigen Teil: Zu welchem Ergebnis bin ich gekommen?

Das Ergebnis ist kurz gesagt nicht zufriedenstellen, denn die Maus ist sehr ungenau in der Positionsermittlung. Ich habe dazu auf ein Milimeterpapierblatt ein Koordinatensystem aufgebaut. Beim Anfahren von z.B. von P(6cm;6cm), erst Fahren über x-Achse dann über y-Achse wird der Wert mal ziemlich genau erreicht, mal nur in etwa. Beim Anfahren des gleichen Punktes über die Y-Achse und dann über die X-Achse, bekomme ich dann wieder andere Werte. Ganz schlecht sieht es aus, wenn man den Punkt diagonal anfährt.
Darüber hinaus z.B. bei eine Strecke von 1m, gibt die Maus mal 84 cm oder auch mal 36 cm. Es scheint, dass sie zwischendurch keine Werte erfasst. Für einen Roboter, aus meiner Sicht, nicht zu gebrauchen.
Habt ihr andere Erfahrungen gemacht ? Gibt es vielleicht ein anderer Sensor der zuverlässiger arbeitet ? Sind die Werte beim Auswerten über Quadratur zuverlässiger ? Oder habt ihr noch eine andere Idee, warum ich zu einem solchen schlechten Ergebnis komme. Könnt ja mal mein Quellcode überprüfen. Bin gerne für Vorschläge, Anmerkungen offen.
Eine Sache noch. Was mich wundert ist auch die Aussage des Herstellers. Angeblich eine Auflösung von 800 cpi. Ich habe festgestellt, dass sie eine Auflösung von 1600 cpi hat. Aber jeder erzählt ja was anderes. Bei Pearl wird sie mit 1200 cpi verkauft und bei der "PCPraxis" war sie im Test mit 1600 cpi angegeben: Preis/ Leistungsverhältnis: gut war das Erbenis des Tests von "PCPraxis".
Bei Gamestar: http://www.gamestar.de/hardware/tests/eingabegeraete/maeuse/general_keys_laser_maus_1600dpi/1456625/general_keys_laser_maus_1600dpi.html

wurde sie für Spiele als "völlig ungeeignet" bewertet.


Quellcode:


/* Including used modules for compilling procedure */
#include "Cpu.h"
#include "Events.h"
#include "SCLK.h"
#include "SDIO.h"
#include "us1.h"
#include "us3.h"
#include "PD.h"
#include "ms2.h"
#include "FC1.h"
/* Include shared modules, which are used for whole project */
#include "PE_Types.h"
#include "PE_Error.h"
#include "PE_Const.h"
#include "IO_Map.h"


volatile bool us1_flag=FALSE; // Flag für 1us Timer
volatile bool us3_flag=FALSE; // Flag für 3us Timer
volatile bool ms2_flag=FALSE; // Flag für 2ms Timer

// Wartet bis der Timer 1us gelaufen ist

void wait_for_timer_1us (void);
void wait_for_timer_1us (void)
{
while(us1_flag==FALSE)
{
;
}
us1_flag=FALSE;
}

// Wartet bis der Timer 3us gelaufen ist

void wait_for_timer_3us (void);
void wait_for_timer_3us (void)
{
while(us1_flag==FALSE)
{
;
}
us3_flag=FALSE;
}


void wait_for_timer_2ms (void);
void wait_for_timer_2ms (void)
{
while(ms2_flag==FALSE)
{
;
}
ms2_flag=FALSE;
}


/* Funktion zur Übertragung von einem Byte an den Sensor*/

void pan_writeByte(unsigned char);
void pan_writeByte(unsigned char data)
{
signed char i;
SDIO_SetDir(TRUE); // SDIO auf Output setzen

for (i=7; i>=0; i--)
{
SCLK_ClrVal(); // SCLK auf Low setzen, Daten vorbereiten

if((data&(1<<i))!=0) // Bits werden rausgeschoben
{
SDIO_SetVal();


}

else
{
SDIO_ClrVal();

}

us1_Enable();
wait_for_timer_1us(); // Sensor Zeit lassen um Bit abzuholen
us1_Disable();
SCLK_SetVal(); //SCLK auf High setzen; Sensor übernimmt auf steigende Flanke
//us1_Enable();
//wait_for_timer_1us(); // Sensor Zeit lassen um Bit abzuholen
//us1_Disable();

}



}


/* Funktion zum Lesen eines Bytes vom Sensor */


unsigned char pan_readByte(void);
unsigned char pan_readByte(void)
{
signed char i;
unsigned char data=0;
volatile bool wert=FALSE; // Status SDIO


SDIO_SetDir(FALSE); // HI-Z state wird gesetzt
us3_Enable();
wait_for_timer_3us(); // Sensor Zeit geben, um die Daten aus dem Register zu holen
us3_Disable();


for (i=7; i>-1;i--)
{
SCLK_ClrVal(); // fallende Flanke; Sensor bereitet Daten vor
us1_Enable();
wait_for_timer_1us(); // Sensor Zeit geben
us1_Disable();

SCLK_SetVal(); // steigende Flanke; Daten werden gelesen
//us1_Enable();
//wait_for_timer_1us(); // Etwas warten damit das Signal sicher anliegt
//us1_Disable();

wert=SDIO_GetVal(); // Bit einlesen
//us1_Enable();
//wait_for_timer_1us(); // Etwas warten damit die Variable sicher geschrieben wird
//us1_Disable();

if (wert!=0)
{
data|=(1<<i);
}

else
{
; //data&= ~(1<<i);
}

}



return data;

}


/* Funktion überträgt ein write-Kommando an den Sensor */
/* Eingabeparameter: Adresse u. zu schreibendes byte*/



void pan_write(unsigned char, unsigned char);
void pan_write(unsigned char adr, unsigned char data)
{
adr|=(1<<7); // MSB wird auf 1 gesetzt
pan_writeByte(adr); // MSB muss 1 sein für Write Operation
pan_writeByte(data);

}


/* Funktion überträgt ein Lesekommando an den Sensor */
/* und liest ein Byte zurück */
/* Parameter: Adresse u. Rückgabe des Registerwertes*/



unsigned char pan_read(unsigned char);
unsigned char pan_read(unsigned char adr)
{
pan_writeByte(adr);
return pan_readByte();
}


/* Initialisierung des PAN301ASI-208

Diese Funktion muss unbedingt ganz am Anfang von main stehen.
Wenn der Sensor sich initialisiert hat, bevor der Controller
SCLK und SDIO auf Output gesetzt hat gibt es Fehler.

*/

void pan_init(void);
void pan_init(void)
{


us1_Disable(); // Timer zunächst deaktivieren
us3_Disable();
ms2_Disable();
FC1_Disable();




SDIO_SetDir(TRUE); // SDIO auf Output setzen
SCLK_SetDir(TRUE); // SCLK auf Output setzen
PD_SetDir(TRUE); // PD auf Output setzen


SCLK_SetVal(); // SCLK auf High setzen
SDIO_SetVal(); // SDIO auf High setzen
PD_ClrVal(); // PD auf low setzen


// Reset Sensor und kein sleep Modus

pan_write(0x05,0x01);



}


// Funktion zum reseten der seriellen Schnittstelle zur Maus;
// Serielle Schnittstelle wird nur re-synchronisiert; Register werden
// nicht gelöscht

void reset (void);
void reset (void)
{
int i=0;

SCLK_SetVal();
us1_Enable();
wait_for_timer_1us();
us1_Disable();
SCLK_ClrVal();
us1_Enable();
wait_for_timer_1us();
us1_Disable();
SCLK_SetVal();

us1_Enable();

for (i=1;i<2000;i++)
{
wait_for_timer_1us();
}

us1_Disable();



}


void main(void)
{

unsigned char motion=0; // Variable zur Angabe, ob eine Bewegung erfolgte
signed int x=0; // delta X
signed int y=0; // delta Y
signed long posx=0, posy=0; // Absolute Position in Counter
double posxcm=0.0, posycm=0.0;
int test=0; // Überprüfung, ob die Kommunikation fehlerfrei ist
int ueberlaufx=0; // Überprüfung, ob Überlauf im x-Buffer
int ueberlaufy=0; // Überprüfung, ob Überlauf im y-Buffer

unsigned int m=0; // Prüfung wie oft die Endlosschleife läuft
unsigned int ueberlaufxbei=0; // bei welchem Schleifengang ueberlauf x
unsigned int ueberlaufybei=0; // bei welchem Schleifengang ueberlauf y

unsigned char reg1=0; // Variable zum Speichern des gelesenen Registerwertes
unsigned char reg2=0; // Variable zum Speichern des gelesenen Registerwertes
unsigned int fehler=0;
unsigned int ende=0;

word counter=0;
word *pcounter=0;
word maxwert=0;



/*** Processor Expert internal initialization. DON'T REMOVE THIS CODE!!! ***/
PE_low_level_init();
/*** End of Processor Expert internal initialization. ***/

/* Write your code here */


// ganz an den Anfang wird initialisiert, damit der Controller
// schneller als der Sensor reagiert, um Fehler zu vermeiden


reset(); // Reseten der seriellen Schnittstelle
pan_init(); // Initialisierung der seriellen Schnittstelle

//pan_write(0x07,0x08); // Möglichkeit zum Schreiben eines Registers
reg1=pan_read(0x05); // Direkte Überprüfung des geschriebenen Wertes
reg2=pan_read(0x00); // Direkte Überprüfung des geschriebenen Wertes



for(;;)
{
/*
ms2_Enable();
wait_for_timer_2ms();
ms2_Disable();
*/
FC1_Enable();
FC1_Reset();


m=m+1;

if (pan_read(0x00)!=0x30)
{
test=1; // Prüfung ob Kommunikation i.O.
fehler=m;
}
else
{
;
}

motion=pan_read(0x02);

//Überprüfen, ob das Überlauf-Bit im Register 0x02 gesetzt ist. Wenn das der Fall
// ist, wird die Variabe ueberlaufx gesetzt.

if ((motion&(1<<3))!=0)
{
ueberlaufx=1;
ueberlaufxbei=m;

}
else
{
;
}

//Überprüfen, ob das Überlauf-Bit im Register 0x02 gesetzt ist. Wenn das der Fall
// ist, wird die Variabe ueberlaufy gesetzt.

if((motion&(1<<4))!=0)
{
ueberlaufy=1;
ueberlaufybei=m;
}
else
{
;
}

// wenn 7tes bit vom Register 0x02 gesetzt ist wurde die Maus bewegt
// Bewegungsdaten dann abfragen


if((motion&(1<<7))!=0)
{


ende=m;

// Delta x Register auslesen
x=(signed int)((signed char)pan_read(0x03));

// Delta y Register auslesen
y=(signed int)((signed char)pan_read(0x04));


// und zu der Positionsvariable addieren

posx=posx+((long)(x));
posy=posy+((long)(y));
posxcm=((double)(2.54/1600))*((double)(posx));
posycm=((double)(2.54/1600))*((double)(posy));




}

pcounter=&counter;
FC1_GetCounterValue(pcounter);
FC1_Disable();
if (maxwert<counter)
{
maxwert=counter;
}
else
{
;
}

}





}

/* END Maus */
/*
** ################################################## #################
**
** This file was created by UNIS Processor Expert 2.95 [03.58]
** for the Freescale 56800 series of microcontrollers.
**
** ################################################## #################
*/

rscheubr
23.06.2007, 19:23
Hallo Correia,
macht es denn bei der Genauigkeit einen Unterschied mit welchem Abstand die Maus über das Papier geführt? Welchen Abstand vom Papier kann die Maus denn überhaupt haben, sodass noch eine Richtung ausgegeben wird?

grüße

Correia
23.06.2007, 19:53
Hallo rscheubr,

die Maus kann wie auch hier schon beschrieben bis ca. 25 mm über das Papier geführt werden. In der Genauigkeit habe ich keine Unterschiede feststellen können. :-(

rscheubr
23.06.2007, 20:06
Die Abtastgenauigkeit erscheint ja dann leider anscheinend nicht so berauschend zu sein - vielleicht könnte man die Daten von der Maus mit einem Radencoder "verrechnen", um eine höhere Genauigkeit zu erzielen...
Grüße

mare_crisium
23.06.2007, 20:48
Correia,

ich finde die Frage nach der Abhängigkeit der Genauigkeit von dem Abstand zwischen Sensor und der Unterlage aus folgendem Grund interessant: Vor dem Bildaufnehmer des Sensors sitzt eine einfache Sammellinse, die den Leuchtpunkt des Lasers auf der Unterlage möglichst scharf auf dem Bildaufnehmer abbilden soll.

Wenn Du den Abstand zwischen Linse und Unterlage änderst, dann wird das Bild auf dem Bildaufnehmer unscharf. Das könnte ein Grund sein, warum die Genauigkeit so enttäuschend ist. Mit einer Linse anderer Brennweite liesse sich das aber wieder einrenken.

mare_crisium

Correia
24.06.2007, 09:17
Hallo mare_crisium,

lt. Datenblatt hat die Laser-Diode keine Optik. Optik ist also 1:1. Ich glaube also nicht daran, dass er Abstand hier ausschlaggebend ist. Ausserdem habe ich die Maus auch beim Originalabstand gestestet. Das Ergebnis war nach wie vor schlecht. Aber wenn Du Dir das Testergebnis von Gamestar Dir mal anschaust: http://www.gamestar.de/hardware/tests/eingabegeraete/logitech_g5/1469835/logitech_g5.html , dann bestätigt sich meine These.

mare_crisium
24.06.2007, 22:26
Correia,

schau' Dir mal diese Application Note an.

http://cp.literature.agilent.com/litweb/pdf/5989-3122EN.pdf

Sie ist zwar von Agilent, betrifft aber ebenfalls einen Maus-Sensor mit einer Laserdiode als Lichtquelle. Wie Du siehst, ist zwischen der Laserdiode und Unterlage wirklich keine Linse erforderlich. Die braucht man nur bei einer LED-Lichtquelle, weil die nicht so intensives Licht liefert wie eine Laserdiode. Aber zwischen dem Bildaufnehmer und der Unterlage muss eine Linse eingebaut sein.

Das ist völlig unabhängig davon, ob das Licht von einem Laser oder einer LED stammt. Der Sensor misst ja die Verschiebungen zwischen je zwei aufeinanderfolgenden Bildern, die er von der Unterlage gemacht hat. Und ohne Linse gibt's nun mal kein Bild! Schraub' mal das Objektiv aus Deiner Spiegelreflex-Kamera und schau' Dir an, was herauskommt, wenn Du ohne Objektiv eine Aufnahme machst.

Den besten Überblick über die diversen Maussensor-Typen und das Messprinzip findest Du übrigens hier:

http://www.mstarmetro.net/~rlowens/OpticalMouse/

mare_crisium

rscheubr
24.06.2007, 22:49
@mare_crisium,
hallo, ich vermute schon auch, dass vor dem Maussensor eine Linse ist und über deren Brennweite der Abstand festgelegt ist, bei dem der Sensor am "besten" sieht. Ich verstehe nur nicht ganz, warum der Sensor bei dieser Maus zwischen praktisch 0mm und 25mm funktioniert... Vielleicht ist diese Maus ja auch eine neuere Inkarnation einer "camera obscura" http://de.wikipedia.org/wiki/Camera_obscura

grüsse

schregge
24.06.2007, 22:52
Hallo,

ich habe inzwischen auch den PAN301 Chip ansteuern können, habe aber ähnliche Probleme wie Correia.

1. Bei der General Key Mouse ist keine Linse verbaut... wie die Genauigkeit im Originalzustand war, kann ich momentan leider nicht messen.

2. Bei mir ist die Genauigkeit auch eher schlecht als recht. Allerdings vermute ich, das ich bei mir noch ein kleinen Programmfehler habe.

Wo kriegt man denn geeignete Linsen her? Ich bräuchte eine Bodenfreiheit von ca. 5 cm.
Desweiteren scheint mir die General Keys Lasermouse keine wirkliche Lasermouse zu sein. Sie besitzt zwar eine Laserdiode, aber der Chip (PAN301A-208) ist von einer ganz gewöhnlichen optischen Maus. Es wird auch immer von LED als Lichtquelle gesprochen... Die einzigen mir bekannten Lasersensorchips sind doch die von ADNS-60xx und ADN-70xx

Mein PAN301A fokussiert jetzt von 50-70 mm, indem ich die Laserdiode etwas nach aussen gebogen habe... mit der gleichen fehlerstaerke....
und es existiert KEINE Linse... Das Loch im Chip ist frei...


Welche alternativen gibt es oder welcher preiswerte Maussensor funktioniert gut bis sehr gut bei einer Entfernung von ca. 5 cm?



Danke

rscheubr
25.06.2007, 10:50
nur als Anmerkung:
Eine Möglichkeit zum Testen einer (vollständigen) Maus ist, von Microsoft das DirectX-SDK herunterzuladen. Dort ist ein Beispielprogramm enthalten, mit dem man die x- und y-Werte, die eine Maus liefert, direkt angezeigt bekommt.

mare_crisium
25.06.2007, 15:30
@rscheubr,

die Lösung als Lochkamera hätte sogar noch den Vorteil "unendlich" grosser Schärfentiefe! Nachteil ist die Lochgrösse: Wenn sie viel grösser ist als ein Pixel, dann ist die Abbildung zu unscharf, ist sie so gross wie ein Pixel (und das Pixel ist ca. 50x50Mikrometer), dann ist die Lichtstärke schlecht und die Schärfe wird durch die Beugung beeinträchtigt. - Ich war der Meinung, dass die Pixel für eine Camera obscura viel zu klein seien. -

@schregge,
solange der Bildaufnehmer nicht Interferenzmuster auswertet, ist es völlig wurscht, ob das Licht von einer LED oder einer Laserdiode stammt. Die Laserdiode erzeugt dann einfach nur mit weniger Aufwand (keine Linse) eine grössere Leuchtdichte auf der Unterlage.

Wegen der Bezugsquellen für Linsen werde ich mich nochmal melden. - Ich habe 'mal auf dem hiesigen Flohmarkt für 5 Euro ein Okular für ein Fernrohr oder Mikroskop gekauft. Wenn man sowas auseinandernimmt, finden sich Linsen mit dem richtigen Durchmesser und geeigneten Brennweiten. Die Formeln bzgl. des Zusammenhangs von Bild-, Gegenstands- und Brennweite finden sich hier:

http://de.wikipedia.org/wiki/Linsengleichung


mare_crisium

mare_crisium
01.07.2007, 08:08
@Schregge,

nach langer Sucherei: Die Bezugsquelle für preiswerte Linsen aus Kunststoff ist

www.astromedia.de

Damit kann man keine Höchstleistungsmikroskope bauen, aber für eine Mausoptik langt's allemal. Eine sehr gute Seite über selbstgebaute Optik ist

www.eisenbroiler.de/bastelecke/diy-objektiv.php

mare_crisium

Manf
01.07.2007, 11:05
Wenn es hilft, hier wurde die Brennweite der Linse einer optischen Maus auch diskutiert. Kleine Glaskugeln als Linsen haben entsprechende Brennweiten.
https://www.roboternetz.de/phpBB2/viewtopic.php?t=8192
Manfred

LrtMor
19.07.2007, 14:00
Hallo!

Im Rahmen meiner Studienarbeit bin ich auf diese Seite gestoßen. Unter anderem soll ich für ein (autonom fahrendes) Elektro-Modellauto eine Odometrie mit Hilfe von Lasermaussensoren implementieren. Da ich dafür so ca. 3cm Bodenfreiheit brauche, habe ich mich für die GeneralKeys Lasermaus mit 1200 dpi entschieden, nachdem ich diesen Forenbeitrag gelesen habe. Hab mir dann gleichzeitig noch die GeneralKeys Lasermaus mit 1600 dpi mitbestellt zum Vergleich. Ich habe dann festgestellt, dass die 1600er einen geringeren Abstand zum Boden ermöglicht als die 1200er. Wenn man aber die Laserdiode aus der Plastikoptik herausnimmt und sie in ungefähr dem gleichen Winkel wie zuvor neben den optischen Sensor hält, erreicht man einen Abstand bis zu ca. 10cm (bei mir jedenfalls). Unten seht Ihr, wie ich die Laserdiode dann mit Heißkleber befestigt habe (anderes Mausmodell, nicht irritieren lassen, aber gleicher Sensorchip). Damit ist Bodenfreiheit kein Problem mehr.

Mein Problem ist ein ganz anderes. Meine Hauptaufgabe ist es, mit Hilfe der Lasermaus die Geschwindigkeit des Fahrzeugs zu messen. Dazu lese ich mit einem C-Programm die Mausevents über USB unter Linux (Debian-Distribution, Problem tritt aber auch unter Ubuntu auf) aus. Das funktioniert auch soweit sehr gut. Allerdings liegt die maximale Geschwindigkeit, die ich momentan berechnen kann, bei ca. 24 cm/s.

Hier das Originalprogramm, mit dem ich die Mausevents auslese(von http://www.frogmouth.net):[/img]

#include <stdlib.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <asm/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdint.h>

#include <linux/input.h>


int main (int argc, char **argv) {

int fd = -1; /* the file descriptor for the device */
int yalv; /* loop counter */
size_t read_bytes; /* how many bytes were read */
struct input_event ev[64]; /* the events (up to 64 at once) */

/* read() requires a file descriptor, so we check for one, and then open it */
if (argc != 2) {
fprintf(stderr, "usage: %s event-device - probably /dev/input/evdev0\n", argv[0]);
exit(1);
}
if ((fd = open(argv[1], O_RDONLY)) < 0) {
perror("evdev open");
exit(1);
}

while (1)
{
read_bytes = read(fd, ev, sizeof(struct input_event) * 64);

if (read_bytes < (int) sizeof(struct input_event)) {
perror("evtest: short read");
exit (1);
}

for (yalv = 0; yalv < (int) (read_bytes / sizeof(struct input_event)); yalv++)
{
printf("Event: time %ld.%06ld, type %d, code %d, value %d\n",
ev[yalv].time.tv_sec, ev[yalv].time.tv_usec, ev[yalv].type,
ev[yalv].code, ev[yalv].value);

}
}

close(fd);

exit(0);
}

Interessant ist für mich momentan der Wert ev[yalv].value. Dieser Wert gibt das Bewegungsinkrement von einem Mausevent relativ zum vorigen Mausevant an. Der Wertebereich geht von -127 bis +127. Wenn man die Maus mit der Hand bewegt, muss man sich schon etwas anstrengen, um in diesen Bereich zu kommen, da man zwar hohe Beschleunigungen erreicht, aber keine hohen Geschwindikeiten, da man die Maus schnell wieder in die andere Richtung bewegt. Am Modellfahrzeug angebracht, erreicht man sehr schnell den Bereich der Sättigung. Daher ändere ich die Abtastrate über sudo modprobe -r usbhid ,danach modprobe usbhid mousepoll=8. Mousepoll kann die Werte 10, 8, 4, 2 oder 1 Annehmen (10 Standartwert), was einer Abtastrate von 100Hz, 125Hz, 250 Hz 500 Hz und 1000Hz entspricht (http://gentoo-wiki.com/TIP_Change_mouse_hz).

Je höher die Abtastrate, desto kleiner der ev[yalv].value-Wert, da für die gleiche Strecke der Untergrund öfter abgetastet wird. Man kann das Fahrzeug z.B. mit mousepoll=8 etwas schneller bewegen als mit dem Standartwert 10, ohne dass man in die Sättigung kommt. Das Hauptproblem ist, dass ich ab mousepoll=4 gar nicht bis in die Sättigung komme, sondern einen maximalen Wert von 106 (bei mousepoll=4) erhalte. Wenn ich das Fahrzeug noch etwas schneller schiebe, kommen willkürliche Werte wie -1 1, 2, -2 und ähnliches heraus. Bei mousepoll=2 liegt die Grenze bei etwa 60 für den Wert von ev[yalv].value.

Ein Gedanke von mir war, dass die doch recht billige Maus kein USB 2.0 beherrscht und somit die Beschränkung zu erklären sei. Das Problem tritt aber auch bei Mäusen mit USB 2.0 auf, die eine höhere Übertragungsrate und auch eine höhere Abfragerate haben.

Meine Frage ist daher, ob es irgendeine Möglichkeit gibt, diese Beschränkung zu umgehen oder die Mauswerte komplett anders auszulesen, so dass ich höhere Geschwindigkeiten als 24cm/s messen kann. Denn die USB2.0-fähige Maus, die ich getestet habe soll laut Hersteller eine Übertragungsrate bis zu 1000Hz sowie eine Bewegungsgeschwindigkeit von 128 cm/s schaffen.
Außerdem lässt sich bei ihr die Auflösung zwischen 400dpi, 800 dpi, 1600 dpi und 2000 dpi an der Maus selbst umschalten. Bei allen Werten bleibt mein Problem bestehen.

Achja, ich war auch mit meinem Notebook in ein paar elektronik- und PC-Läden und hab etliche Mäuse mit dem Programm ausprobiert, alle mit dem selben Ergebnis.

Fällt Euch dazu irgend etwas ein? Ich wäre in jedem Fall über Antworten sehr dankbar

MfG
Christian

rscheubr
19.07.2007, 15:34
Hallo LrtMor,
welche Erfahrung hast du denn hinsichtlich der Genauigkeit der Abtastung gemacht? Gibt es einen Zusammenhang zwischen der Genauigkeit und der Geschwindigkeit?

Grüße

LrtMor
24.07.2007, 11:22
Hallo rscheubr,
ich konnte keinen Zusammenhang zwischen der Geschwindigkeit und der Genauigkeit der Messung feststellen. Solange ich nicht aufgrund zu hoher Geschwindigkeit in die Sättigung gerate, ist die Messung sehr genau.

MfG
Christian

rscheubr
25.07.2007, 17:31
Hallo LrtMor,
gerne würde ich mit dieser Maus auch einmal rumprobieren - um welchen Typ handelt es sich denn genau?
Grüße

LrtMor
26.07.2007, 17:57
Also die Maus, die ich jetzt verwende, habe ich in einer Conrad-Filiale in München gefunden. Leider steht auf der Verpackung kein Name oder ähnliches, ich hab momentan auch nur das Bild einer verpackten Maus hier. Ich hoffe das hilf Dir weiter. Auf jeden Fall ist in dieser Maus der selbe Sensorchip wie in der GeneralKeys Lasermaus 1600 dpi verbaut.

Grüße

rscheubr
26.07.2007, 21:11
Vielen Dank für die schnelle Antwort! Diese Maus scheint unter der Bestellnummer 954501 beim großen C zu leben...

TobiasBlome
29.07.2007, 19:34
Hallo,
hat jemand schon mal vesucht mit so einem Sensor die Geschwindigkeit zu messen und / oder die zurückgelegte Strecke? Ist das machbar oder sind die Sensoren zu ungenau?

Tobias

LrtMor
31.07.2007, 07:45
Hallo Tobias!

Das ist genau, was ich auch versuche und es klappt auch ganz gut. Die Genauigkeit ist auf jeden Fall ausreichend, denke ich. Ich habe auch schon die zurückgelegte Strecke gemessen, der Fehler lag bei mir auf einer Strecke von 60 cm bei +- 0,5 cm.

Das große Problem, dass sich bei mir ergeben hat, ist eben die begrenzte Geschwindigkeit, die gemessen werden kann (siehe mein Beitrag oben).

Grüße
Christian

TobiasBlome
31.07.2007, 15:23
also oben schreibst du etwas von 24cm/s das sind also (wenn ich mich nicht verrechnet habe) 8,64 Km/h das ist ja nicht so viel...

Also ich hatte an eine Geschwindigkeitsmessung für Modellbauauto´s gedacht und da sollten um die 80Km/h schon drin sein.

Habe noch einen anderen Artikel gefunden und dort wird geschrieben, dass bis über 200Km/h gemessen wurden:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=12579

Tobias

Manf
31.07.2007, 16:01
Habe noch einen anderen Artikel gefunden und dort wird geschrieben, dass bis über 200Km/h gemessen wurden:
Über eine Abbildung kann man die Auflösung verringern und die Geschwindigkeit erhöhen.
Manfred

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=114264#114264

TobiasBlome
31.07.2007, 16:28
was heist denn über eine Abbildung? Foto?

Ruppi
31.07.2007, 17:34
Nein, es ist kein Foto, sondern die Abbildung, also Projektion des Kamerabildes durch die Linse...
Eine Erhöhung der Geschwindigkeit ist nur mit einer Vergrößerung der projizierten Fläche möglich, im Klartext heist das also, dass man eine kleine Linse verwenden muss. Genaue Streckenmessungen sind durch die Linse aber nur möglich, wenn der Abstand zwischen Sensor und Messoberfläche wirklich konstant ist. Unter einem Modellauto ist diese Art der Messung sicher nicht genau, was die Angabe von 0,5cm auf 60cm (weiter oben im Beitrag) ja bestätigt. Ein Telezentrisches Objektiv würde dieses Problem sicher lösen...
Für eine reine Geschwindigkeitsmessung reicht jedoch eine einfache Linse. Bildet man aus einigen, der zuletzt gemessenen Geschwindigkeiten den Mittelwert, erhält man eine recht genaue Angabe zur Geschwindigkeit, so habe ich das damals auch gemacht. Für den Einsatz unter dem Modellauto ist eine Brennweite von ca 6mm sicher ausreichend.

Viel Spaß noch, Ruppi

TobiasBlome
31.07.2007, 17:41
und was für eine Linse ist in einer Maus, da ich die ja weitgehend ausschlachten wollte ;-)

Tobias

PTB
13.08.2007, 13:23
Funktioniert das mit der optischen Erkennung auch, wenn man eine sehr langsame Bewegung hat? Bzw. habt Ihr einen Erfahrungswert, wie schnell die Bewegung sein muss um detektiert zu werden?

rscheubr
13.08.2007, 14:38
Hallo,
nur ein kurzer Erfahrungsbericht mit der Conrad-Maus:
- Ich habe das DirectX-SDK benutzt, um die von der Maus über USB gelieferten Werte anzuzeigen: Je nach Gewindigkeit schwankt der Wert zwischen +/- 128.
- Laut Anleitung hat die Maus eine Auflösung von 800dpi.
- Ich habe die Diode anders montiert als oben in dem Bild von LrtMor. Dort ist der gleiche Winkel beibehalten worden, während der Abstand zum Sensor vergrößet wurde. Ich habe die Diode ganz nah an den Sensor aber dafür praktische "parallel" ausgerichtet. Dadurch kann der Abstand zur Oberfläche zwischen ca. 1 cm und ca. 5 cm schwanken und die Richtungsmessung funktioniert trotzdem.
- Vor der Diode ist im Orginal noch eine kleine Linse - es funktioniert aber auch ohne diese Linse.
- Die Messung funktioniert auch durch Plexiglas (= Staubschutz) hindurch. Ich war mir nicht sicher, wie das Licht der Diode dabei gebrochen wird.
- Man kann die Maus freihändig praktisch nicht ruhig in der Luft halten, ohne dass eine Bewegung gemessen wird. Von daher finde ich, dass auch "kleine" Bewegungen schon erfasst werden.
- Wenn man die Maus schnell bewegt, erscheint recht bald der Maximalwert. Ich glaube nicht, dass man damit schnelle Bewegungen gut erfassen kann. Ich könnte mir vorstellen, dass schnelle Bewegungen
gut mit einem Radencoder gemessen werden können, langsame Bewegungen dafür vergleichsweise genauer über diesen Maussensor.
- Unklar ist mir, was die Diode eigentlichen für Wellen ausstrahlt, da man
kein Licht sieht und auch in der Videokamera, die eigentlich Infrarot zeigt,
nichts zu sehen ist. Weiß das jemand?

Grüße

TobiasBlome
13.08.2007, 15:44
@rscheubr
- Wenn man die Maus schnell bewegt, erscheint recht bald der Maximalwert. Ich glaube nicht, dass man damit schnelle Bewegungen gut erfassen kann. Ich könnte mir vorstellen, dass schnelle Bewegungen

könnte es sein, das es daran liegt, dass du das USB-"Protokoll" abfragst und nicht direkt den Sensor?
Höhere Geschwindigkeiten sind vielleicht für den PC nicht nötig...
Und - was ist schon schnell? wenn die Maus schnell bewegt wird hat die ach schon ein paar KM7h drauf auch wenn es nur ein paar cm sind!

Tobias

rscheubr
13.08.2007, 15:54
@TobiasBlome
- ja, ich verwende was das USB-Protokoll liefert und keine direkten Zugriff auf den Sensor
- leider habe ich keine vernünftige Vorrichtung, um die Geschwindigkeit zu messen

TobiasBlome
13.08.2007, 16:01
ich bin mir nicht sicher, aber es gab mal ein Prog namens MouseSpeed oder soo

rscheubr
13.08.2007, 16:29
@TobiasBlome
ich habe "mousometer" heruntergeladen und getestet: damit habe ich
über USB eine Maximalgeschwindigkeit von 2,7 km/h hinbekommen -
möglicherweise kann aber jemand seine Hand mit der Maus schneller bewegen (man sollte daran denken, dass an der Maus ein Kabel ist und damit ja der Bewergungsspielraum etwas eingeschränkt ist).

TobiasBlome
13.08.2007, 16:37
hab´s auch geloaded ;-)

4km/h normales arbeiten
8km/h wenn man´s übertreibt
30 km/h wenn man versucht den Tisch mit der Maus abzuschleifen ;-)

drakon
19.11.2007, 19:00
Hallo!
Hat vielleicht jemand das Datenblat von der Conrad-Mouse? Wie ich hier im Forum gelesen habe, haben GeneralKeys einen PAN 301 Chip. Die Mouse von Conrad hat einen Chip mit der Bezeichnung ACN-1001. Von der Sensorplatine gehen 7 Drähte. Ich kann sagen, dass 2 davon VCC und GND sind und noch 4 von Quadratur-Ausgängen(Pins 11-14) gehen. Es geht noch einen Draht,der von dem Pin 17 geht. Was an dem Pin passiert kann ich leider nicht erkennen. Die Beschaltung scheint mir einem PAN 301 sehr ähnlich, nur sind Pins 18 und 19 mit VCC verbunden und Pin 17 hat bei PAN 301 keine Funktionen.

Für jede Hilfe wäre ich sehr dankbar!

starkeeper
19.11.2007, 19:31
Hallo!
Hat vielleicht jemand das Datenblat von der Conrad-Mouse? Wie ich hier im Forum gelesen habe, haben GeneralKeys einen PAN 301 Chip. Die Mouse von Conrad hat einen Chip mit der Bezeichnung ACN-1001. Von der Sensorplatine gehen 7 Drähte. Ich kann sagen, dass 2 davon VCC und GND sind und noch 4 von Quadratur-Ausgängen(Pins 11-14) gehen. Es geht noch einen Draht,der von dem Pin 17 geht. Was an dem Pin passiert kann ich leider nicht erkennen. Die Beschaltung scheint mir einem PAN 301 sehr ähnlich, nur sind Pins 18 und 19 mit VCC verbunden und Pin 17 hat bei PAN 301 keine Funktionen.

Für jede Hilfe wäre ich sehr dankbar!

Das würde mich auch brennend interessieren! Ausserdem würde ich gerne wissen ob die 1600dpi generalkeys von pearl den PAN301 hat?