Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

Avisos
Vaciar todo

Código completo control mando Playstation

57 Respuestas
7 Usuarios
0 Reactions
34.6 K Visitas
luison
Respuestas: 495
Topic starter
(@luison)
Reputable Member
Registrado: hace 18 años

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 😀
dsc00287ca2fz0

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.

Responder
56 respuestas
luison
Respuestas: 495
Topic starter
(@luison)
Reputable Member
Registrado: hace 18 años

gracias, pero bueno, me he dado cuenta que lo que hace es: si pongo el ATT a 0, no se enciende, y si pongo el ATT a 1 es como si lo deajra suelto, y se enciende y apaga cuando quiere(simepre que le andes dando al boton), erpo no se mantiene ncendido...ya ire comentando si soluciono o no

Si lo dejas suelto, el pin seguramente oscilará... es mejor dejarlo conectado a 1. En mi mando si lo dejo encendido se queda encendido... tiene buena alimentación?¿?¿ si hay cortes de alimentación se reinicia el mando... yo alimento con una pila recargable de 9 voltios tanto el micro como el mando de play, pero eso sí, el mando de play lo alimento mediante un regulador lineal a 5V sólo para él... Si al mando le conectas sólo Vcc, GND y ATT, si ATT está a 0 se bloquea, si está a 1 funciona normal y mantiene el Led encendido o apagado según aprietes el botón... si ya ni ésto te funciona... me parece raro la verdad ❓

PS: Tampoco alimento el mando para la vibración... que eso es un motor y seguro que poco no consume.

Responder
deirdre
Respuestas: 18
(@deirdre)
Active Member
Registrado: hace 17 años

pos na, no hay manera. Por cierto, que garcia! yo también soy de getxo.....
me fije que dijiste que eras de bilbao, pero se ve que mas cerca que lo que yo pensaba 😀

Responder
luison
Respuestas: 495
Topic starter
(@luison)
Reputable Member
Registrado: hace 18 años

pos na, no hay manera. Por cierto, que garcia! yo también soy de getxo.....
me fije que dijiste que eras de bilbao, pero se ve que mas cerca que lo que yo pensaba 😀

Sip, más concretamente de Algorta.
En cuanto a lo de tu mando... dices que si el Att está abajo se queda bloqueado (como debe ser) pero si está a 1 cambia de digital a analógico sin que tú hagas nada? (osea, que se apaga el led).
No sé, así a primeras no se me ocurre solución alguna, si eso tampoco es problema grave, ya que con la precisión analógica vas que ardes, pero me parece muy raro... vete a saber, igual al no preguntarle al mando (bajar el att a cero) en un tiempo el mando se autoreinicia por seguridad...
Para salir de dudas, crea un programita que suba y baje ATT... si el mando sigue sin guardar estado, pues sigue adelante a ver si aún así llegas a buen puerto 😕

PS: He probado a conectar en mi mando SOLO alimentación, osea Vcc a 5V y tierra, y mantiene perfectamente el estado... pero claro mi mando es "nisu", aunque me parece muy raro que se te reinicie si solo conectas estos dos cables... si sólo con éstos dos cables se te apaga el led (¿porque al revés no te pasa no?) y tienes una alimentación 100% perfecta, entonces diremos que tu mando tiene algún control de autoreinicio si no detecta nada en el resto de sus pines...

Responder
deirdre
Respuestas: 18
(@deirdre)
Active Member
Registrado: hace 17 años

No entiendo nada, con el siguiente Progaram(subiendo y bajando como decías tu), funciona, pero si le quito un solo cero al delay, deja de funcionar. Que ahgo en el rpogarma principal, ponerle ATT a 1 todo el rato?ponrele algo como eso en el main????:
void main(void)
{
while(1){

port_b_pullups(TRUE);

output_high(Clk);
output_low(COMAND);
output_high(ATT);
delay_ms(1000000);
output_low(ATT);
}
}

seguire pa alante a ver que tal va (yo soy de las arenas, no sabia que hubiera gente tan metida en esto por aqui...) 😆

Responder
luison
Respuestas: 495
Topic starter
(@luison)
Reputable Member
Registrado: hace 18 años

Edité mi mensaje anterior.

En cuanto a "gente tan metida en ésto"... la verdad es que no soy para nada experto en casi ninguna materia, simplemente diremos que tuve suerte y me salió lo del mando en tan sólo una mañana... y como no hay mucha gente en éste foro que maneje el mando a éste nivel (o eso parece) pues te contesto yo como puedo 😕

POR EL AMOR DE DIOS!! pero ese delay de cuánto es? 10 seg? es una burrada de delay (creo yo)... prueba lo que puse en P.S. en el mensaje anterior, y si te sigue sin funcionar echaremos la culpa a algún mecanismo interno del mando tuyo... 🙄

Si eso da el siguiente paso que es ver si te contesta con un 41 mientras le mandas 42 (en ascii, tú ya me entiendes).

Responder
Página 8 / 12
Compartir: