Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Bueno, hace casi dos días que empecé a programar en Basic, así que seguramente el código se pueda depurar bastante:
Creo que para controlar cualquier tipo de robot lo más indicado es un mando de play (por su sencillez de protocolo y por todos los botones que trae).
Hace dos días programé por primera vez en Basic y conseguí con todo éxito controlar servos mediante el SC32.
Ayer, como me aburría me fuí a comprar un mando de play guarripeich, después de una hora de cola para el cajero (de reloj) pagué mis 9,90 por el mando que es transparente (así es más "geek").
Una vez en casa me leí unos pequeños tutoriales de protocolo del mando de play (que están en éste mismo foro). Conecté el mando usando unas pequeñas piezas de plástico MUY comunes... no sé describirlos, pero es la hembra de las piezas metálicas que se usan para conectar cosas fácilmente en una placa... venga, subo foto que ni yo me entero 😀
Como iva diciendo la hembra de esas piezas se puede conectar "fácilmente" al mando, tan sólo apretar un poco (soy de Bilbao así que puede que sea un mucho 😉 ) y queda fijado bastante fuerte, luego tirando se pueden volver a quitar y así no rompemos el mando, sin comprar cable alargador ni nada 🙂 El mando lo alimenté con la propia fuente que trae mi estupendo-fantástico Basicx-24 y tampoco utilicé resistencia alguna. No conecté el cable de 9V ya que es para la vibración que no uso, y tampoco el cable ACK... jejej como veréis en el código hay trapicheo para solventar éste "problema".
En resumidas cuentas conecto directamente ATT, DATA, COMAND, CLK, VCC yGND.
Bueno, sin más dilación os pongo el código.
' pin 10 --> DATA
' pin 7 --> Clk
' pin 8 --> COMAND
' pin 9 --> ATT
Public Ibuff(1 To 10) As Byte
Public Obuff(1 To 60) As Byte
public DATA1(1 To 8) As Byte
public DATA2(1 To 8) As Byte
public DATA3(1 To 8) As Byte
public COMAND(1 To 8) As Byte
Public Sub Main()
Call PutPin(10, bxInputPullup) '' Configura el pin DATA como entradas en modo pull-up, con lo que me ahorro poner resistencias
Call PutPin(7,1) ' Dejo el reloj arriba
Call PutPin(9,1) ' Dejo la atención arriba NOTA: mientras está activa (abajo) el mando se bloquea
Call OpenQueue(Ibuff, 10)
Call OpenQueue(Obuff, 60)
Call OpenCom(1, 19200, Ibuff, Obuff)
Call Lee_mando()
End Sub
Public Sub Serial () ' Envía chorrazo enorme de datos, MUY poco eficiente, pero para verlo nosotros "bonito" en la pantalla está bien, si quieres usar un radio modem, por Dios COMPRIME! No puedes perder casi el 25% de la RAM en ésto. O sí 😉
Call PutQueuestr(Obuff, CStr(DATA1(1))&CStr(DATA1(2))&CStr(DATA1(3))&CStr(DATA1(4))&CStr(DATA1(5))&CStr(DATA1(6))
&CStr(DATA1(7))&CStr(DATA1(8))&Chr(13)&"Botones1:"&CStr(DATA2(1))&CStr(DATA2(2))
&CStr(DATA2(3))&CStr(DATA2(4))&CStr(DATA2(5))&CStr(DATA2(6))&CStr(DATA2(7))&CStr(DATA2(8))
&Chr(13)&"Botones2:"&CStr(DATA3(1))&CStr(DATA3(2))&CStr(DATA3(3))&CStr(DATA3(4))
&CStr(DATA3(5))&CStr(DATA3(6))&CStr(DATA3(7))&CStr(DATA3(8))&Chr(13)&Chr(10))
End Sub
Public Sub COM01()
COMAND(1)=1
COMAND(2)=0
COMAND(3)=0
COMAND(4)=0
COMAND(5)=0
COMAND(6)=0
COMAND(7)=0
COMAND(8)=0
End Sub
Public Sub COM42()
COMAND(1)=0
COMAND(2)=1
COMAND(3)=0
COMAND(4)=0
COMAND(5)=0
COMAND(6)=0
COMAND(7)=1
COMAND(8)=0
End Sub
Public Sub Lee_mando ()
Dim i As Byte
Dim r As String*8
do
Call PutPin(26,0) ' Enciende la luz verde... Más que nada para ver cuanto tardamos en leer el mando... 😉
Delay(3.0) ' Este será el tiempo cada cuanto leeremos el mando, lo ideal sería dejarlo en 0.1, pero para verlo por pantalla mejor así
Call PutPin(26,1)
Call PutPin(9,0) ' Llamada de atención
Call COM01() ' Comando de inicio
For i=1 To 8
Call PutPin(7,0) ' Bajo el reloj
If (COMAND(i)=0) Then ' Según COMAND se va introduciendo unos y ceros...
Call PutPin(8,0)
else
Call PutPin(8,1)
end if
Call PutPin(7,1) ' Subo el reloj
Next
Sleep(2) ' No detecto el ACK y así no uso interrupciones y me ahorro cableado :D.
Call COM42() ' Por contra, espero 4ms para asegurarme que el mando se ha enterado (se podría rebajar o incluso quitar) [Trapicheo 1]
For i=1 To 8
Call PutPin(7,0)
If (COMAND(i)=0) Then
Call PutPin(8,0)
else
Call PutPin(8,1)
end if
Call PutPin(7,1)
DATA1(i)=GetPin(10) ' Recojo el bit puesto por el mando
Next
r=CStr(DATA1(1))&CStr(DATA1(2))&CStr(DATA1(3))&CStr(DATA1(4))&CStr(DATA1(5))&CStr(DATA1(6))&CStr(DATA1(7))&CStr(DATA1(8))
If (r<>"10000010") then ' Miro si está en modo analógico o digital
goto Fin ' Sólo recogemos en un modo, ya que no necesitamos más precisión, si se usan los "Joysticks" el de la izquierda se
end if ' traducirá como las ocho direcciones del Pad y el de la derecha como el [],X,/,0 (lo hace el mando)
' No introduzco esperas (por lo del ACK) ya que hemos enredado un poco con operaciones y no hace falta...
For i=1 To 8
Call PutPin(7,0)
Call PutPin(7,1)
Sleep(1) ' Me aseguro con 2ms que el mando ha introducido ya bit (se podría eliminar)
DATA2(i)=GetPin(10)
Next
r=CStr(DATA2(1))&CStr(DATA2(2))&CStr(DATA2(3))&CStr(DATA2(4))&CStr(DATA2(5))&CStr(DATA2(6))&CStr(DATA2(7))&CStr(DATA2(8))
If (r<>"01011010") then ' Me aseguro de que todo vaya correctamente
goto Fin
end if
For i=1 To 8
Call PutPin(7,0)
Call PutPin(7,1)
DATA2(i)=GetPin(10)
Next
Sleep(2)
For i=1 To 8
Call PutPin(7,0)
Sleep(1) ' Ocurre un pequeño error si leo como antes, ya que el mando quita el bit nada más ver subir el reloj
DATA3(i)=GetPin(10) ' sólo en el último dato que se coja... no me voy a complicar y simplemente leo antes 😀 [Trapicheo 2]
Call PutPin(7,1) ' la espera de 2ms es para asegurarme que está el bit introducido
Next
call Serial()
Fin:
Call PutPin(9,1)
loop
End Sub
PS: Si éste código debería de ir en "proyectos" o en cualquier otra sección más generalista lo siento.
Hola! me interesa mucho este hilo, puesto que tengo un robot controlado por radiofrecuencia desde el ordenador y me gustaría cambiar el ordenador por un mando. He visto que mucha genete usa el de la PS2, pero no se si será fácil de conectar. He estado leyendo el código...pero no me aclaro mucho, porque programa en c y no en basic. Lo que más me interesaría es tener que complicarme lo menos posible. Mis módulos de RF están configurados para comunicarse a 9600Bd, esto es compatible con el mando de la PS2?
Y otra cosa que tampoco tengo clara es si comprarme el mando inalámbrico o con cable, no se si será más fácil sustituir un módulo de RF por otro o conecatr el módulo de RF al cable habiendo cortado éste. Me podéis ayudar por favor?ando un poco illada de tiempo, más que nada por tener que comprarlo, asi que si me podeis contestar..., GRACIAS GRACIAS GRACIAS, esto me está trayendo nos quebraderos de cabeza...por cierto, el amndo psa2 comunica serie no?vamos, que es conecatrlo a tx y rx, no?
Hola! me interesa mucho este hilo, puesto que tengo un robot controlado por radiofrecuencia desde el ordenador y me gustaría cambiar el ordenador por un mando. He visto que mucha genete usa el de la PS2, pero no se si será fácil de conectar. He estado leyendo el código...pero no me aclaro mucho, porque programa en c y no en basic. Lo que más me interesaría es tener que complicarme lo menos posible. Mis módulos de RF están configurados para comunicarse a 9600Bd, esto es compatible con el mando de la PS2?
Y otra cosa que tampoco tengo clara es si comprarme el mando inalámbrico o con cable, no se si será más fácil sustituir un módulo de RF por otro o conecatr el módulo de RF al cable habiendo cortado éste. Me podéis ayudar por favor?ando un poco illada de tiempo, más que nada por tener que comprarlo, asi que si me podeis contestar..., GRACIAS GRACIAS GRACIAS, esto me está trayendo nos quebraderos de cabeza...por cierto, el amndo psa2 comunica serie no?vamos, que es conecatrlo a tx y rx, no?
El código que pongo es en basic, así que te será más fácil entenderlo (por lo que comentas). Da igual (hasta cierto punto) la velocidad a la que vayan tus módulos RF, ya que entre el mando de play y el módulo RF tienes que poner un microcontrolador, que será el que se encargue de preguntar al mando de play, recibir la respuesta y luego por último mandarla por RF de manera sencilla o completa (como tú veas) para que te entienda la otra parte.
En cuanto al mando, sí comunica de forma serie, pero no abras un puerto serie en tu micro que así no va 😉 . Ah! y yo cogería el mando de play con cable, que siempre te resultará más económico y fácil trabajar con él.
PS: En el código pongo qué cables hay que conectar del mando (en el encabezado)
Hola! ante todo muchas gracias por responder. Este tema me tiene un poco agobiada. La verdad es que trataba de no usar otro micro, pero me parece que no habrá mas remedio. Yo trabajo con PICs, sabéis cula podría ser adecuado?
Y por lo que me parece, entonces tendré que programarlo también, no?
Lo que no he entendido es lo de que no habrá el puerto serie, yo hasta ahora lo único que hice fueron dos líneas de programa donde defínia la patilla rx y la tx y la velocidad de Bd, y luego conectar los módulos de RF y a funcionar!!!!
Agradecería mas consejitos, me compraré el mando de play con cable
GRACIAS
Veamos, para el módulo RF sí, eso hazlo como siempre, pero para "hablar" con el mando de play, no se hace así.
Me imagino que prácticamente cualquier PIC te valdrá, con tal de que tenga los 3-4 pines de entrada-salida para comunicarse con el mando.
Realmente te veo MUY perdida, así que te resumiré a grandes rasgos cómo es el protocolo del mando.
El mando va a "su bola" hasta que le levantas un flag de atención (en el código pongo cual es). Una vez levantado el flag, "memoriza" los botones pulsados y se queda bloqueado, como "hablar" con él no te llevará mucho tiempo no pasa nada. Le mandas al principio una secuencia de bits específica y standar, el te contestará, si te gusta la respuesta, entonces le pides que te mande los botones que hay pulsados... y ya está. A todo ésto, tú pones el reloj para hablar con el mando de play, así que en cada bit que mandes deberás bajarlo y subirlo... En el código se ve cómo se hace exactamente.
Evidentemente tendrás que programar "algo" para que ejecute éstos sencillos pasos, no te costará nada, así que suerte.
MUCHAS MUCHAS GRACIAS. Mañana mismo voy a comprarme el mando de la play2 y empiezo a trastear, jeje. Solo tengo esta semana y la que viene para conseguirlo a ver si puedo...nunca he hecho algo así, asi que a ver, porque es lo último que me falta. Creo que usaré un PIC16F874(no se si A o no). Muchas gracias por todo, seguire posteando aqui las dudas que me vayan surgiendo. Miraré mejor el código, porque la verdad, la primera vez que lo lei no me enteré de mucho....
Gracias de nuevo