PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Optomechanische Maus



An-Ti
21.07.2011, 10:09
Hallochen,


vor kurzem kam die Idee für einen Roboter und nun stehe ich vor der Frage, wie denn die Weg-/ Streckenmessung funktioniert.
Mein erster Einfall war eine optomechanische Maus, die ja min. 2 Infrarot-Lichtschranken beinhaltet.

Kennt sich jemand damit aus? :confused:
Wie setze ich meine Idee um? :confused:

Dazu muss auch noch erwähnt werden, dass der Robo 2 Antriebsräder (hinten), die separat beschalten werden, und ein Stützrad (vorn) besitzt.
Die Mausmechanik sollte am Stützrad angebracht werden, um die Streckenmessung durchführen zu können. ;)

Bitte helft mit.


Danke! :cool:

021aet04
21.07.2011, 12:20
Es kommt darauf an wie du es machen willst. Es gibt mehrere Möglichkeiten.
1) Die Lichtschranken ausbauen und so wie bei z.B. Asuro verwenden. Jedes Rad bekommt eine Lichtschranke. So kannst du alles errechnen.
2) PS/2 Maus nehmen. Ich lese mich gerade in die Verwendung von einer PS/2 Tastatur ein und habe diese Seiten gefunden.
http://www.marjorie.de/ps2/start.htm
http://de.wikipedia.org/wiki/PS/2-Schnittstelle
Die Seite marjorie.de ist relativ gut aufgebaut und sehr genau beschrieben wie das Protokoll aussieht.
3) USB Maus kannst du auch verwenden. Du müsstest dich aber in die Ansteuerung einlesen. Eventuell musst du die Elektronik bis auf dem Auswertechip ausbauen und eine eigene Elektronik bauen.

MfG Hannes

radbruch
21.07.2011, 12:38
Hallo

Meine PS/2-Programme für Tastatur und Maus (Anschluss jeweils an PC0 und PC1):

// PS/2-Schnittstelle am ATMega32 1.4.2009 mic
// RP6 liest AT-Tastatur am I2C-Port

// http://www.marjorie.de/ps2/ps2_protocol.htm
// http://www.beyondlogic.org/keyboard/keybrd.htm

#include "RP6RobotBaseLib.h"

uint8_t i, scancode;

int main(void)
{
initRobotBase();
DDRC &= ~3; //SDA und SCL sind Eingänge
PORTC &= ~3; // ohne interne PullUps (extern sind 4k7 PullUps angeschlossen)

while(1)
{
i=0;
scancode=0;
while(PINC & 1); // Warten auf Startbit
while(!(PINC & 1)); // Ende Startbit
do
{
while(PINC & 1); // Tastatur bereitet die Daten vor
if(PINC & 2) scancode |= (1<<i); // Bit einlesen
i++;
while(!(PINC & 1)); // gelesen, auf nächstes Bit warten
}while(i<8);

while(PINC & 1); // Warten auf Paritybit
while(!(PINC & 1)); // Ende Paritybit
while(PINC & 1); // Warten auf Stopbit
while(!(PINC & 1)); // Ende Stopbit

writeInteger(scancode, 16);
writeChar('\n');
}
return(0);
}

// PS/2-Schnittstelle am ATMega32 1.4.2009 mic
// RP6 liest PS/2-Maus am I2C-Port

// http://www.marjorie.de/ps2/ps2_protocol.htm
// http://www.beyondlogic.org/keyboard/keybrd.htm
// http://instruct1.cit.cornell.edu/courses/ee476/FinalProjects/s2004/jcc72/index.html

// Hihi: http://www.mikrocontroller.net/topic/130824

#include "RP6RobotBaseLib.h"

#define Clock_Low {DDRC |=1; PORTC &=~1;} // clock low aktiv
#define Data_Low {DDRC |=2; PORTC &=~2;} // data low aktiv
#define Clock_High {DDRC &=~1; PORTC &=~1;} // clock high (Eingang mit PullUp)
#define Data_High {DDRC &=~2; PORTC &=~2;} // data high (Eingang mit PullUp)
#define Data_Out {DDRC |=2; PORTC |=2;} // data high aktiv
#define Clock_In (PINC & 1)
#define Data_In (PINC & 2)

uint8_t i, scancode;

// Send a command to the mouse
// http://instruct1.cit.cornell.edu/courses/ee476/FinalProjects/s2004/jcc72/code.html
void send(uint8_t command)
{

char parity=0;
char mask = 0x01;
parity = (command & 0x01) ^ //Calculate odd parity
((command & 0x02) >> 1) ^ // ich kenne das anders ;)
((command & 0x04) >> 2) ^
((command & 0x08) >> 3) ^
((command & 0x10) >> 4) ^
((command & 0x20) >> 5) ^
((command & 0x40) >> 6) ^
((command & 0x80) >> 7);
Clock_Low; // Pull clock low
//delay_us(120);
sleep(2);
Data_Low; // data low
Clock_High; // Release clock
while(!Clock_In); // wait for clock high
for (i=0; i<8; i++) {

while(Clock_In); // wait for low clock
//PORTD.1 = !(command & mask); // send inverted data bit to data line
if(command & mask) Data_Low else Data_Out
while(!Clock_In); // wait for clock high
mask = mask<<1; // update mask
}

while(Clock_In); // wait for low clock
//PORTD.1 = parity; //send parity bit to data line
if(parity) Data_Low else Data_High
while(!Clock_In); // wait for high
while(Clock_In); // wait for low clock
while(!Clock_In); // wait for clock high

Data_High; //release the data line

while(Data_In); // wait for data go low
while(!Data_In); // wait for data go hi
}
uint8_t read(void)
{
uint8_t i, scancode;
i=0;
scancode=0;
while(Clock_In); // Warten auf Startbit
while(!Clock_In); // Ende Startbit
do
{
while(Clock_In); // Tastatur bereitet die Daten vor
if(Data_In) scancode |= (1<<i); // Bit einlesen
i++;
while(!Clock_In); // gelesen, auf nächstes Bit warten
}while(i<8);

while(Clock_In); // Warten auf Paritybit
while(!Clock_In); // Ende Paritybit
while(Clock_In); // Warten auf Stopbit
while(!Clock_In); // Ende Stopbit
return(scancode);
}

int main(void)
{
initRobotBase();
Clock_High;
Data_High;

writeString_P("\nBitte Maus bewegen!\n\n");
send(0xf4);
mSleep(500);

while(1)
{
writeInteger(read(), 16);
writeChar('\n');
}
return(0);
}Beide Programme laufen auf meinem RP6 (8MHz-Mega32), sollten aber einfach zu portieren sein. Vielleicht hilft euch das beim Einstieg.

Gruß

mic

Richard
21.07.2011, 16:27
Auf den Seiten vom C´t Bot kann man ziemlich gut nachlesen wie die den Mouse Sensor einsetzen, auch programm technisch ist das dort ganz gut beschrieben.

Gruß Richard

021aet04
22.07.2011, 20:06
Danke radbruch für das Bsp. Ich versuche aber den anderen Weg zu wählen (Tastatur Emulator), damit ich mit einer Taste den NAS (Netzwerkfestplatte) herunterfahren kann. Zusätzlich möchte ich wenn ich es brauche im Betrieb eine Tastatur anstecken können. Wenn ich es nicht schaffe bleibt immer noch die Möglichkeit eine USB Tastatur anzustecken.

@Richard
Danke für den Hinweis. Werde ich mir dann, wenn ich es konkret brauche, durchlesen.

MfG Hannes