Noviembre 2003
APLICACIN CON LOS KITS LEGO Y DRIVERS PARA LOS MOTORES DC DE ESTOS KITS CON LA TARJETA XS95
TARJETA XS95
3. ESQUEMA DE MOTORES En el siguiente diagrama se observa la ubicacin y notacin de los motores que controlan la palanca mecnica.
A: Dos motores que controlan movimiento en Y. B: Dos motores que controlan movimiento en X. C: Un motor que controla movimiento ascendente y descendente D: Un motor que controla movimiento de cierre y apertura de la tenaza.
4. SISTEMA DE CONTROL MEDIANTE EL TECLADO Cuando en el teclado se presiona alguna tecla este enva un dato en forma serial llamado scancode (el makecode cuando se presiona la tecla y el brakecode cuando se deja de presionar). Este dato es una palabra digital de 11 bits distribuida de la siguiente forma: un bit de inicio en bajo, ocho bits de datos (el scancode), un bit de paridad (impar) y un bit de trmino en alto. Estos 11 bits son almacenados en un registro de desplazamiento que almacena constantemente los bits que le llegan desde el teclado. Este registro tambin est controlado por los cantos de bajada reloj del teclado. De esta forma, cuando el contenido del registro sea igual al makecode de alguna tecla predefinida para mover algn motor, se setear algn pin disponible de la tarjeta (en este caso, los pines del led de 7 segmentos de la tarjeta) que estn conectados a las entradas de la tarjeta con los drivers. Despus se esperar el brakecode y all se inhabilitaran los pines anteriormente habilitados. Lo anteriormente descrito es implementado como una mquina de estados.
k1 k2 k0 k7 k8 k9
Estado ko: La mquina recibe los bits de datos seriales y los almacena en un registro desplazamiento, comparando cada ves el contenido (antes de desplazar el registro) con el makecode predefinido para el movimiento de los motores. Si el contenido es igual a un scancode pasa al estado siguiente (k1..k8 dependiendo del scancode reconocido). De lo contrario se mantiene en k0. Estados k1..k8: Todos estos estados son prcticamente iguales, con la diferencia que cada uno habilita las seales para un motor diferente. Durante este estado se da un valor al bus MOTORES de forma que se habiliten solo las dos seales que controlen un motor. Se siguen recibiendo los bits de datos, almacenando, comparando y desplazando. Cuando el registro sea igual al brakecode (se deje de presionar la tecla) se pasa al estado k9, de lo contrario sigue en el mismo estado. Estado k9: Este estado es necesario porque despus del brakecode el teclado vuelve a enviar al makecode, y este debe ser reconocido, ya que de lo contrario si se pasar al estado k0 directamente, se interpretara como si se hubiera presionado la tecla otra ves y se pasara a cualquiera de los estados k1..k8, pero con la diferencia que ahora no se va a recibir nunca el brakecode y el motor quedara habilitado por siempre. Durante este estado se da al bus MOTORES el valor cero (inhabilitando todos los motores), se cuentan 11 ciclos de reloj (correpondientes a los 11 bits del makecode reenviado) y se luego se regresa al estado k0.
SLAVE10..SLAVE0 NODE ISTYPE 'REG'; MASTER10 ..MASTER0 PIN ISTYPE 'REG'; Serial PIN istype 'REG'; Q0, Q1, Q2, Q3 NODE istype 'REG'; S3..S0 NODE istype 'REG'; //Salidas que controlan los motores A0, A1, B0, B1, C0, C1, D0, D1 PIN 21, 23, 19, 17, 18, 14, 15, 24 istype 'REG'; Count = [S3..S0]; MASTER = [MASTER10 ..MASTER0]; SLAVE = [SLAVE10..SLAVE0]; MOTORES = [A0 ,A1,B0,B1,C0,C1,D0,D1]; Q=[Q3,Q2,Q1,Q0];
//W,S,A,D,Q,E,X,Z
k0=0; k1=1; k2=2; k3=3; k4=4; k5=5; k6=6; k7=7; k8=8; k9=9; EQUATIONS MASTER.CLK = !KB_CLK; SLAVE.CLK = KB_CLK; Serial.CLk = !KB_CLK; Q.clk = KB_CLK; Count.clk = !KB_CLK; MOTORES.clk = KB_CLK; state_diagram Q; State k0: Count := Count + 1; MASTER := [KB_DATA,SLAVE10..SLAVE1]; SLAVE := MASTER; Serial := KB_DATA; if (MASTER == ^B11000111010) then k1 if (MASTER == ^B11001000010) then k2 if (MASTER == ^B10000111000) then k3 if (MASTER == ^B10001010100) then k4 if (MASTER == ^B10000101010) then k5 if (MASTER == ^B11001001000) then k6 if (MASTER == ^B11001000100) then k7 if (MASTER == ^B10000110100) then k8
k0 k0 k0 k0 k0 k0 k0 k0
A A B B C C D D
delante ( tecla W - 1D) atrs (tecla C - 1B) delante ( tecla A - 1C) atrs (tecla V - 23) arriba (tecla Q - 15) abajo (tecla E - 24) dentro (tecla X - 22) fuera (tecla Z - 1A)
State k1: MOTORES := 128; Count := 0; Serial := 1; MASTER := [KB_DATA,SLAVE10..SLAVE1]; SLAVE := MASTER; if (MASTER == ^B11111100000) then k9 else k1 State k2: MOTORES := 64; Count := 0; Serial := 1; MASTER := [KB_DATA,SLAVE10..SLAVE1]; SLAVE := MASTER; if (MASTER == ^B11111100000) then k9 else k2
State k3: MOTORES := 32; Count := 0; Serial := 1; MASTER := [KB_DATA,SLAVE10..SLAVE1]; SLAVE := MASTER; if (MASTER == ^B11111100000) then k9 else k3 State k4: MOTORES := 16; Count := 0; Serial := 1; MASTER := [KB_DATA,SLAVE10..SLAVE1]; SLAVE := MASTER; if (MASTER == ^B11111100000) then k9 else k4 State k5: MOTORES := 8; Count := 0; Serial := 1; MASTER := [KB_DATA,SLAVE10..SLAVE1]; SLAVE := MASTER; if (MASTER == ^B11111100000) then k9 else k5 State k6: MOTORES := 4; Count := 0; Serial := 1; MASTER := [KB_DATA,SLAVE10..SLAVE1]; SLAVE := MASTER; if (MASTER == ^B11111100000) then k9 else k6 State k7: MOTORES := 2; Count := 0; Serial := 1; MASTER := [KB_DATA,SLAVE10..SLAVE1]; SLAVE := MASTER; if (MASTER == ^B11111100000) then k9 else k7 State k8: MOTORES := 1; Count := 0; Serial := 1; MASTER := [KB_DATA,SLAVE10..SLAVE1]; SLAVE := MASTER; if (MASTER == ^B11111100000) then k9 else k8 State k9: MOTORES := 0; Count := Count + 1; if(Count == 11) then k0 else k9
END keyboard