Sensorik: Unterschied zwischen den Versionen
(Die Seite wurde neu angelegt: Um die Mögloichkeit zu haben das später eine Spielstrategie zu entwickeln ist es wichtig zu wissen wo und wie die Gegnerfiguren stehen.) |
Keine Bearbeitungszusammenfassung |
||
Zeile 1: | Zeile 1: | ||
== Sensorik der gengnerischen Spielfiguren == |
|||
Um die Mögloichkeit zu haben das später eine Spielstrategie zu entwickeln ist es wichtig zu wissen wo und wie die Gegnerfiguren stehen. |
Um die Mögloichkeit zu haben das später eine Spielstrategie zu entwickeln ist es wichtig zu wissen wo und wie die Gegnerfiguren stehen. |
||
Dieses soll nach Möglichkeit absolut geschen um Kalibrirungen am Anfang zu vermeiden und einen "einfachen" Plug&Play-Betrieb zu realisieren. |
|||
Als Problem gestaltet sich wie auch bei den Antrieben, dass rotatorische und lineare Bewegung gleichzeitig erfasst werden müssen. Daher scheiden einfache Absolut-Dreh-/Winkelgeber aus, da das Gehäuse immer mitgeführt werden müsste. |
|||
Nach ersten Überlegungen über eine gleichzeitige Bewegung in zwei Achsen wurden wir auf das System der guten alten Kugelmaus aufmerksamm. Doch stellte sich leider herraus, das hier keine Absolutwert-Fähigkeit vorliegt. |
|||
Desweiteren sollte die Sensorik den Spieler in keinster Weise behindern geschweigeden die Bewegung der Stangen beinträchtigen. |
|||
<br> |
|||
Zur Messung der Stangeverschiebung bieten sich daher folgende Lösungen an: |
|||
'''Messung mittels Ultraschall:'''<br> |
|||
z.B. Waycon UFA 1002/1003:<br> |
|||
Messbereich: 1000mm<br> |
|||
Genauigkeit: 1,5mm<br> |
|||
Reaktionszeit: 100ms<br> |
|||
allerdings ist die sehr lange Reaktionszeit zu beachten!<br><br> |
|||
'''Messung mittels Triangulationslaser:'''<br> |
|||
z.B. Waycon LAS T-500:<br> |
|||
Messbereich: 100-600mm<br> |
|||
Genauigkeit: 2mm<br> |
|||
Reaktionszeit: 0,9ms<br> |
|||
Zur messung des Drehwinkels gibt es ebenfalls verschiedene Ansätze:<br> |
|||
Auf das Ende einer Spielstange wird eine dünne runde Scheibe montiert auf die durch ein Muster z.B. ein kleiner und ein großer Punkt aufgebracht wird. Dieses Muster kann man dann mittels einer billigen Webcam aufnehmen und von einem Algorhtmus analysieren lassen. Desweiteren kann man in die Scheibe einen Binärcode (z.B. 4 Bit) reinstanßen und die Stellung mit IR-Dioden und Fototransistoren aufnehmen. Dabei ist darauf zu achten, das immer nur eine IR-LED und ein Fototransistor aktiv sind, da es sonst durch die starke streuung des Infrarotlichts zu inkosistenten Daten kommt wenn die Scheibe nahe der IR-LEDs steht.<br> |
|||
<br> |
|||
Hier das kleine Asamblerprogramm für einen Atmel (z.B. Atmega8 mit 4MHz): |
|||
<source lang="asm"> |
|||
.NOLIST ; List-Output unterdrücken |
|||
.INCLUDE <m8def.inc> ; das gibt es für jeden Controllertyp |
|||
.LIST ; List-Output wieder aufdrehen |
|||
.CSEG ; was nun folgt, gehört in den FLASH-Speicher |
|||
.equ TFLAG = 0 |
|||
;------------------------------------------------------ |
|||
; Start Adresse 0000 |
|||
;------------------------------------------------------ |
|||
RESET: |
|||
rjmp INIT ; springen nach "INIT" |
|||
.ORG INT_VECTORS_SIZE ; dadurch haben wir für die Vektoren Platz gelassen |
|||
INIT: |
|||
;------------------------------------------------------ |
|||
; INITIALIZE |
|||
;------------------------------------------------------ |
|||
ldi r24,high(RAMEND) ;Stack Pointer setzen |
|||
out SPH,r24 ; "RAMEND" ist in m8def.inc (s.o.) festgelegt |
|||
ldi r24,low(RAMEND) ; |
|||
out SPL,r24 ; |
|||
;------------------------------------------------------ |
|||
; eigene Initialisierungen |
|||
;------------------------------------------------------ |
|||
;Status LED an Port B 5, Starttaster an Port B 4 |
|||
;Fototransistoren Port B 0-3, IRLED Port C 0-3, LED für Anzeige Port D 0-7 |
|||
;configuration der Datadirection Register der I/O Ports |
|||
clr r16 |
|||
ldi r18, 0b11111111 |
|||
out DDRD, r18 |
|||
ldi r18, 0b00100000 |
|||
out DDRB, r18 |
|||
ldi r18, 0b00011111 |
|||
out PORTB, r18 |
|||
ldi r18, 0b00000000 |
|||
out PORTC, r18 |
|||
clr r18 |
|||
clr r17 |
|||
LOOP1: |
|||
sbis PINB,4 ;überprüft ob der Starttaster einmal gedrückt wurde, wenn nicht wird die nächste Anweisung übersprungen |
|||
rcall LOOP2 |
|||
rcall LOOP1 |
|||
;Ab hier Endlosschleife |
|||
LOOP2: sbi PORTB, PB5 ;Einschalten der Staus-LED |
|||
LOOP3: |
|||
;Anfang für 1. LED |
|||
sbi PORTC, PC0 ;Anschalten der IR-LED |
|||
cbi PORTD, PD0 ;löschen des alten Wertes |
|||
in r17, PINB ;einlesen des neuen Wertes vom Fototransistor in das Register 17 |
|||
sbrc r17,0 ;üerspringt die nächste Anweisung wenn Bit 0 im Register 17 "NULL" ist |
|||
sbi PORTD, PD0 ;setzt das entsprechen Bit im Port D für die Visualisierung der Stellung |
|||
cbi PORTC, PC0 ;Schaltet die IR-LED aus |
|||
;Anfang für 2. LED |
|||
sbi PORTC, PC1 |
|||
cbi PORTD, PD1 |
|||
in r17, PINB |
|||
sbrc r17,1 |
|||
sbi PORTD, PD1 |
|||
cbi PORTC, PC1 |
|||
;Anfang für 3. LED |
|||
sbi PORTC, PC2 |
|||
cbi PORTD, PD2 |
|||
in r17, PINB |
|||
sbrc r17,2 |
|||
sbi PORTD, PD2 |
|||
cbi PORTC, PC2 |
|||
;Anfang für 4. LED |
|||
sbi PORTC, PC3 |
|||
cbi PORTD, PD3 |
|||
in r17, PINB |
|||
sbrc r17,3 |
|||
sbi PORTD, PD3 |
|||
cbi PORTC, PC3 |
|||
rjmp LOOP3 |
|||
</source> |
|||
to be continude |
Version vom 3. August 2008, 16:29 Uhr
Sensorik der gengnerischen Spielfiguren
Um die Mögloichkeit zu haben das später eine Spielstrategie zu entwickeln ist es wichtig zu wissen wo und wie die Gegnerfiguren stehen.
Dieses soll nach Möglichkeit absolut geschen um Kalibrirungen am Anfang zu vermeiden und einen "einfachen" Plug&Play-Betrieb zu realisieren.
Als Problem gestaltet sich wie auch bei den Antrieben, dass rotatorische und lineare Bewegung gleichzeitig erfasst werden müssen. Daher scheiden einfache Absolut-Dreh-/Winkelgeber aus, da das Gehäuse immer mitgeführt werden müsste.
Nach ersten Überlegungen über eine gleichzeitige Bewegung in zwei Achsen wurden wir auf das System der guten alten Kugelmaus aufmerksamm. Doch stellte sich leider herraus, das hier keine Absolutwert-Fähigkeit vorliegt.
Desweiteren sollte die Sensorik den Spieler in keinster Weise behindern geschweigeden die Bewegung der Stangen beinträchtigen.
Zur Messung der Stangeverschiebung bieten sich daher folgende Lösungen an:
Messung mittels Ultraschall:
z.B. Waycon UFA 1002/1003:
Messbereich: 1000mm
Genauigkeit: 1,5mm
Reaktionszeit: 100ms
allerdings ist die sehr lange Reaktionszeit zu beachten!
Messung mittels Triangulationslaser:
z.B. Waycon LAS T-500:
Messbereich: 100-600mm
Genauigkeit: 2mm
Reaktionszeit: 0,9ms
Zur messung des Drehwinkels gibt es ebenfalls verschiedene Ansätze:
Auf das Ende einer Spielstange wird eine dünne runde Scheibe montiert auf die durch ein Muster z.B. ein kleiner und ein großer Punkt aufgebracht wird. Dieses Muster kann man dann mittels einer billigen Webcam aufnehmen und von einem Algorhtmus analysieren lassen. Desweiteren kann man in die Scheibe einen Binärcode (z.B. 4 Bit) reinstanßen und die Stellung mit IR-Dioden und Fototransistoren aufnehmen. Dabei ist darauf zu achten, das immer nur eine IR-LED und ein Fototransistor aktiv sind, da es sonst durch die starke streuung des Infrarotlichts zu inkosistenten Daten kommt wenn die Scheibe nahe der IR-LEDs steht.
Hier das kleine Asamblerprogramm für einen Atmel (z.B. Atmega8 mit 4MHz):
.NOLIST ; List-Output unterdrücken
.INCLUDE <m8def.inc> ; das gibt es für jeden Controllertyp
.LIST ; List-Output wieder aufdrehen
.CSEG ; was nun folgt, gehört in den FLASH-Speicher
.equ TFLAG = 0
;------------------------------------------------------
; Start Adresse 0000
;------------------------------------------------------
RESET:
rjmp INIT ; springen nach "INIT"
.ORG INT_VECTORS_SIZE ; dadurch haben wir für die Vektoren Platz gelassen
INIT:
;------------------------------------------------------
; INITIALIZE
;------------------------------------------------------
ldi r24,high(RAMEND) ;Stack Pointer setzen
out SPH,r24 ; "RAMEND" ist in m8def.inc (s.o.) festgelegt
ldi r24,low(RAMEND) ;
out SPL,r24 ;
;------------------------------------------------------
; eigene Initialisierungen
;------------------------------------------------------
;Status LED an Port B 5, Starttaster an Port B 4
;Fototransistoren Port B 0-3, IRLED Port C 0-3, LED für Anzeige Port D 0-7
;configuration der Datadirection Register der I/O Ports
clr r16
ldi r18, 0b11111111
out DDRD, r18
ldi r18, 0b00100000
out DDRB, r18
ldi r18, 0b00011111
out PORTB, r18
ldi r18, 0b00000000
out PORTC, r18
clr r18
clr r17
LOOP1:
sbis PINB,4 ;überprüft ob der Starttaster einmal gedrückt wurde, wenn nicht wird die nächste Anweisung übersprungen
rcall LOOP2
rcall LOOP1
;Ab hier Endlosschleife
LOOP2: sbi PORTB, PB5 ;Einschalten der Staus-LED
LOOP3:
;Anfang für 1. LED
sbi PORTC, PC0 ;Anschalten der IR-LED
cbi PORTD, PD0 ;löschen des alten Wertes
in r17, PINB ;einlesen des neuen Wertes vom Fototransistor in das Register 17
sbrc r17,0 ;üerspringt die nächste Anweisung wenn Bit 0 im Register 17 "NULL" ist
sbi PORTD, PD0 ;setzt das entsprechen Bit im Port D für die Visualisierung der Stellung
cbi PORTC, PC0 ;Schaltet die IR-LED aus
;Anfang für 2. LED
sbi PORTC, PC1
cbi PORTD, PD1
in r17, PINB
sbrc r17,1
sbi PORTD, PD1
cbi PORTC, PC1
;Anfang für 3. LED
sbi PORTC, PC2
cbi PORTD, PD2
in r17, PINB
sbrc r17,2
sbi PORTD, PD2
cbi PORTC, PC2
;Anfang für 4. LED
sbi PORTC, PC3
cbi PORTD, PD3
in r17, PINB
sbrc r17,3
sbi PORTD, PD3
cbi PORTC, PC3
rjmp LOOP3
to be continude