User Tag List

Página 4 de 5 PrimerPrimer 12345 ÚltimoÚltimo
Resultados 46 al 60 de 74

Tema: RaspberryPi Jukebox

  1. #46

    Fecha de ingreso
    Nov 2005
    Ubicación
    Excartagenero
    Mensajes
    23,611
    Mencionado
    276 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    5,978
    Agradecer Thanks Received 
    5,792
    Thanked in
    Agradecido 3,773 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    1
    Cita Iniciado por DarkDijkstra Ver mensaje
    Claro, el fin de semana cuando haya terminado más o menos todo y esté "estable" os lo paso (aunque ya os aviso que es un programa "mu tonto" que simplemente detecta cosas del GPIO y hace llamadas al sistema con Popen para ejecutar mpg321 y reproducir música, alsamixer para modificar el volumen, etc)
    Para probar y ver qué hacer para mi está genial

  2. #47

    Fecha de ingreso
    Jul 2006
    Ubicación
    Madriz
    Mensajes
    1,297
    Mencionado
    28 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    176
    Agradecer Thanks Received 
    322
    Thanked in
    Agradecido 172 veces en [ARG:2 UNDEFINED] posts
    Al final no voy a tener tiempo de meter motores ni leches (voy que me mato si está más o menos terminado para mañana), así que más le vale que le guste el regalo tal cual al cumpleañero ; )

    Aviso, el script contiene algo de código "sucio" y no sé si será muy claro, pero por si a alguien le sirve, ahí va
    Spoiler: Ver
    Código:
    #!/usr/bin/env python
    # -*- coding: utf8 -*-
    
    import RPi.GPIO as GPIO
    import MFRC522
    import signal
    import subprocess
    
    def end_read(signal,frame):
        GPIO.cleanup()
        exit()
    
    class Button():
        id = 0
        runner = None
        param = None
        already_pressed = False
    
        def __init__(self, id, runner, param):
            GPIO.setup(id, GPIO.IN, GPIO.PUD_UP)
            self.id = id
            self.runner = runner
            self.param = param
    
        def check(self):
            if GPIO.input(self.id) == GPIO.LOW:
                if not self.already_pressed:
                    self.runner(self.param)
                    self.already_pressed = True
                else:
                    self.already_pressed = False
    
    def volume(up):
        amixer = ["amixer", "-c", "1", "set", "PCM", ""]
        amixer[5] = up and "10%+" or "10%-"
        subprocess.Popen(amixer)
    
    def change_song(next):
        global song
        global pid
        global mpg321
        global tag
    
        if tag == "" or (next and song == lengths[tag]) or (not next and song == 1):
            return
    
        song += (next and 1 or -1)
        if pid != None:
            pid.terminate()
            pid = None
        mpg321[6] = "/root/lp/%s/%s.mp3" % (tag, str(song))
        print mpg321
        pid = subprocess.Popen(mpg321)
    
    pid = None
    song = 1
    
    mpg321 = ["/usr/bin/mpg321", "-q", "-o", "alsa", "-a", "hw:1", ""]
    
    tags = {188: "bach1", 225: "bach2", 250: "love", 251: "rock"}
    lengths = {"bach1": 9, "bach2": 9, "love": 4, "rock": 7}
    
    tag = ""
    noTag = False
    
    signal.signal(signal.SIGINT, end_read)
    
    MIFAREReader = MFRC522.MFRC522()
    buttons = [Button(35, volume, True), Button(36, volume, False), Button(37, change_song, False), Button(38, change_song, True)]
    
    while True:
        for button in buttons:
            button.check()
    
        if pid and pid.poll() == 0:
            pid = None
            change_song(True)
    
        (status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)
        if TagType == 0:
            if noTag:
                if pid != None:
                    pid.terminate()
                    pid = None
                    tag = ""
            else:
                noTag = True
        else:
            noTag = False
    
        if status == MIFAREReader.MI_OK:
            (status,uid) = MIFAREReader.MFRC522_Anticoll()
            if status == MIFAREReader.MI_OK:
                if tag != tags[uid[2]]:
                    song = 1
                    tag = tags[uid[2]]
                    mpg321[6] = "/root/lp/%s/%s.mp3" % (tag, str(song))
                    pid = subprocess.Popen(mpg321)

  3. #48

    Fecha de ingreso
    Nov 2005
    Ubicación
    Excartagenero
    Mensajes
    23,611
    Mencionado
    276 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    5,978
    Agradecer Thanks Received 
    5,792
    Thanked in
    Agradecido 3,773 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    1
    Como no sé nada de Python, para mi todo ese código es sucio gracias!

  4. #49

    Fecha de ingreso
    Jul 2006
    Ubicación
    Madriz
    Mensajes
    1,297
    Mencionado
    28 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    176
    Agradecer Thanks Received 
    322
    Thanked in
    Agradecido 172 veces en [ARG:2 UNDEFINED] posts
    Le he puesto algunos comentarios para poder ver "por donde van los tiros"

    Spoiler: Ver
    Código:
    #!/usr/bin/env python
    # -*- coding: utf8 -*-
    
    # Incluimos los paquetes necesarios, GPIO para el control del cableado, MFRC522 es un script a parte que controla el lector de tarjetas NFC,
    # signal lo usaremos para una salida "ordenada" del programa y subprocess para poder llamar a programas de linux
    import RPi.GPIO as GPIO
    import MFRC522
    import signal
    import subprocess
    
    # Esto no es estrictamente necesario, pero si cerramos la aplicación (pulsando Ctrl+C), queremos "limpiar" el estado del cableado
    def end_read(signal,frame):
        GPIO.cleanup()
        exit()
    
    # Esta clase es para facilitar el uso del "5 way switch" que uso, así es más fácil definir un "botón", especificando que pin del GPIO
    # de la raspi usará, y a qué función habrá que llamar cuando sea pulsado
    class Button():
        id = 0
        runner = None
        param = None
        already_pressed = False
    
        # Aquí el constructor del botón, le pasamos (además de "self" que es obligatorio en python):
        # un "id" que representa al número del pin en el GPIO de la raspi
        # un "runner" es decir, la función a la que llamaremos si se detecta que el botón está pulsado
        # un parámetro para dicha función (esto está así porque las funciones que yo he definido tienen un parámetro)
        def __init__(self, id, runner, param):
            # Especificamos que el pin es de "input" y que lo hemos conectado a GND en el cableado
            # (por lo tanto, se "activará en LOW")
            GPIO.setup(id, GPIO.IN, GPIO.PUD_UP)
            self.id = id
            self.runner = runner
            self.param = param
    
        def check(self):
            # Verificamos si el pin específico está en LOW y si no se había activado justo antes
            # (el típico mecanismo para que si mantenemos la pulsación no lo detecte, solo nos interesa la primera hasta soltarlo)
            if GPIO.input(self.id) == GPIO.LOW:
                if not self.already_pressed:
                    # Aquí es donde llamamos a la función que le especificamos
                    self.runner(self.param)
                    self.already_pressed = True
                else:
                    self.already_pressed = False
    
    # Una función muy simple, hace una llamada asíncrona al sistema para ejecutar un comando de linux que suba o baje el volumen
    # (según el parámetro que le pasamos ("up") sea True o False
    # Lo que hace es ejecutar el comando "amixer -c 1 set PCM 10%+" por ejemplo para subir el volumen
    # En mi caso hace falta el parámetro "-c 1" porque estoy usando una tarjeta de sonido USB (la integrada en una raspi "no-zero"
    # sería -c 0 (la "por defecto") en cuyo caso no haría falta ese parámetro
    def volume(up):
        amixer = ["amixer", "-c", "1", "set", "PCM", ""]
        amixer[5] = up and "10%+" or "10%-"
        subprocess.Popen(amixer)
    
    # Aquí cambiamos la canción actual de reproducción hacia delante o hacia atrás (en función del parámetro "next" sea True o False)
    def change_song(next):
        global song
        global pid
        global mpg321
        global tag
    
        # Si se llama a esta función sin que hayamos seleccionado un disco, o si ya estamos en la primera o última canción, a lo mejor
        # no hay que hacer nada, así que salimos
        if tag == "" or (next and song == lengths[tag]) or (not next and song == 1):
            return
    
        # Incrementamos o decrementamos nuestro contador de canciones, según el parámetro de entrada
        song += (next and 1 or -1)
        # Si estaba sonando alguna canción, matamos el proceso (es decir, terminamos la reproducción)
        if pid != None:
            pid.terminate()
            pid = None
        # Formamos nuestro string para la llamada al sistema, con dos parámetros, el primero es el nombre del disco y el segundo la canción
        # (dentro de cada carpeta de los discos, las canciones son 1.mp3, 2.mp3...)
        mpg321[6] = "/root/lp/%s/%s.mp3" % (tag, str(song))
        print mpg321
        pid = subprocess.Popen(mpg321)
    
    # Aquí almacenaremos información sobre la llamada al sistema que hace que se ejecute mpg321 (el reproductor de música que usamos)
    pid = None
    # El número de canción que está sonando (o va a sonar)
    song = 1
    
    # La cadena con los parámetros para llamar al reproductor de música externo
    # Al igual que con el control de volumen, tenemos que especificar que use la segunda tarjeta de sonido (porque uso una pinchada al USB)
    # lo especificamos con "-a hw:1"
    mpg321 = ["/usr/bin/mpg321", "-q", "-o", "alsa", "-a", "hw:1", ""]
    
    # Cuando leo una pegatina NFC, cojo parte de su tag, y para las pegatinas que tengo, sus tags son 188, 225, 250 y 251
    # Cada uno de esos tags se corresponde con un directorio donde están las canciones
    # Como nota curiosa, esto es para un regalo y sus discos favoritos son "El concierto de Brandenburgo" de Bach, "A love supreme" de 
    # John Coltrane y "In rock" de Deep Purple
    tags = {188: "bach1", 225: "bach2", 250: "love", 251: "rock"}
    # Aquí indicamos cuantas canciones tiene cada directorio / disco
    lengths = {"bach1": 9, "bach2": 9, "love": 4, "rock": 7}
    
    # El disco seleccionado actualmente
    tag = ""
    # Mecanismo para evitar falsos negativos al leer tags. El lector, cuando tiene un tag apoyado, a veces dice que no hay nada, 
    # y en seguida vuelve a decir que hay un tag. Usamos esta variable para evitar que el programa piense que el usuario ha 
    # retirado el tag realmente
    noTag = False
    ´
    # Hasta aquí definición de funciones, clases y variables, ahora empieza el "main"
    
    # Decimos al sistema que si pulsamos Ctrl+C, llame a la función end_read para hacer un apagado ordenado
    signal.signal(signal.SIGINT, end_read)
    
    # Activamos el lector NFC
    MIFAREReader = MFRC522.MFRC522()
    # Creamos una lista de botones (podríamos crear una variable para cada uno, pero así es más cómodo)
    # Le pasamos tres parámetros a cada uno: El pin en el que "escucha", la función a la que llamar si se activa, y el parámetro 
    # a pasarle a esa función
    # Los cuatro botones serían: "subir volumen, bajar volumen, canción previa, canción siguiente"
    buttons = [Button(35, volume, True), Button(36, volume, False), Button(37, change_song, False), Button(38, change_song, True)]
    
    # El programa está en un bucle infinito.
    # Sería buena idea meter como primera linea del bucle un "time.sleep(1)" o algo así para que no esté a tope comiendo CPU, aunque
    # si la raspberry sólo va a hacer eso, la carga de CPU es muy baja
    while True:
        # Aquí chequeamos cada uno de los botones, recorriendo la lista de los mismos
        # No hay que especificar llamar a ninguna funcion ni nada aquí, porque cada uno ya sabe lo que tiene que hacer
        for button in buttons:
            button.check()
    
        # Si habíamos hecho alguna llamada a linux (mpg321 para reproducir musica), pero ésta ya ha terminado, significa que la canción
        # terminó sola (porque si la cortamos nosotros, habríamos puesto la variable "pid" a None) y entonces tenemos que pasar a la siguiente
        if pid and pid.poll() == 0:
            pid = None
            change_song(True)
    
        # Leemos un tag NFC
        (status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)
        # Si el tipo leído es 0, es porque no hay tag, o puede ser un "falso negativo"
        if TagType == 0:
            # Aqui verificamos si en la iteración anterior dio también TagType == 0, por lo tanto no es un falso negativo, y realmente no hay tag
            if noTag:
                # Así que si estaba sonando una canción, la paramos
                if pid != None:
                    pid.terminate()
                    pid = None
                    tag = ""
            else:
                noTag = True
        else:
            noTag = False
    
        # Si hemos leído una tarjeta correcta
        if status == MIFAREReader.MI_OK:
            # Intentamos obtener su UID (para ver que tag es, el valor que nos interesa estará dentro de la variable uid, en concreto
            # estará en uid[2]) Recuerda esos numeritos de arriba: 188, 225...
            (status,uid) = MIFAREReader.MFRC522_Anticoll()
            if status == MIFAREReader.MI_OK:
                # Si el tag que acabamos de leer es diferente del tag actual, significa que hemos puesto otro disco y habrá que cambiar
                # de canción, pero si fuese el mismo, significa que el tag sigue encima, por lo que no habría que hacer nada
                if tag != tags[uid[2]]:
                    song = 1
                    tag = tags[uid[2]]
                    mpg321[6] = "/root/lp/%s/%s.mp3" % (tag, str(song))
                    pid = subprocess.Popen(mpg321)

  5. #50

    Fecha de ingreso
    Jul 2006
    Ubicación
    Madriz
    Mensajes
    1,297
    Mencionado
    28 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    176
    Agradecer Thanks Received 
    322
    Thanked in
    Agradecido 172 veces en [ARG:2 UNDEFINED] posts
    Bueno, así se queda, porque no hay tiempo para nada más... XD
    (miento, queda rematar un poco el altavoz con la trompa / cables cuando se termine de secar la masilla)

    Al final ha sido muy muy duro meter todo en la caja, colocar el "mini-joystick" en un lado de la caja, y sobre todo el tema del altavoz: como no hay sitio para altavoces con batería ni nada parecido, nos ha costado encontrar uno autoamplificado que entrase en la trompa y que diese un sonido "decente" (en el video no se escucha demasiado bien, pero en realidad es más que suficiente para poner en un salón)

    Iba a poner un billete de 5 euros al lado de los discos o algo para la escala, pero he pensado que como aquí, arcade lo que más, sería más apropiado un joystick



    Nombre:  DSCF1863.jpg
Visitas: 223
Tamaño: 86.4 KB

    Nombre:  DSCF1865.jpg
Visitas: 224
Tamaño: 105.7 KB

    Nombre:  DSCF1866.jpg
Visitas: 413
Tamaño: 87.5 KB

  6. Los siguientes 6 usuarios agradecen a DarkDijkstra este post:

    Dullyboy (08/10/2016), fbustamante (08/10/2016), josepzin (08/10/2016), Nuria (10/10/2016), TRaFuGa (08/10/2016), Trenz (09/10/2016)

  7. #51

    Fecha de ingreso
    Nov 2005
    Ubicación
    Excartagenero
    Mensajes
    23,611
    Mencionado
    276 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    5,978
    Agradecer Thanks Received 
    5,792
    Thanked in
    Agradecido 3,773 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    1
    Se lo ve bastante apretujado pero como regalo quedó genial.

    Ese código Pyhton necesita instalar algo más para funcionar?

  8. #52

    Fecha de ingreso
    Jan 2012
    Mensajes
    560
    Mencionado
    7 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    63
    Agradecer Thanks Received 
    225
    Thanked in
    Agradecido 133 veces en [ARG:2 UNDEFINED] posts
    Ahora que veo esto, Josepzin, ¿no volviste a intentarlo con el MPD, Raspbian Lite...? XD Cuando hice la prueba con la Raspi que me dejaron (ya no la tengo) hice un pequeño script bash con la funcionalidad que querías. No te lo pasé entonces porque estaba esperando a que tuvieras el MPD funcionando... Mejor te lo pongo, no vaya a ser que me olvide definitivamente XD. Así tienes otra opción e igual te animas a seguir con ello.

    Spoiler: Ver
    Código:
    #!/bin/bash
    
    # Inicializa GPIOs. Los siguientes, por defecto, son activos a nivel alto.
    # Conetar los botones al PIN 1 (3.3 V)
    echo 17 > /sys/class/gpio/export   # PIN 11, Play/Pause
    echo 22 > /sys/class/gpio/export   # PIN 15, Siguiente
    echo 23 > /sys/class/gpio/export   # PIN 16, Anterior
    echo 27 > /sys/class/gpio/export   # PIN 13, Apagar
    sleep 0.5
    echo in > /sys/class/gpio/gpio17/direction
    echo in > /sys/class/gpio/gpio22/direction
    echo in > /sys/class/gpio/gpio23/direction
    echo in > /sys/class/gpio/gpio27/direction
    
    # Ajustar al gusto...
    TCONS=0.005   # 5 ms, periodo de consulta de los GPIO
    TPULS=0.2     # 200 ms, duración mínima de la pulsación 
    
    # Incializar mpd. Si el número de ficheros en el directorio
    # y en la playlist no coincide, rehace la playlist
    mpc repeat on
    mpc update --wait
    if [ $(mpc ls | wc -l) -ne $(mpc playlist | wc -l) ]; then
       mpc clear
       mpc ls | mpc add
    fi
    mpc toggle
    
    # Bucle de consulta de los GPIO
    while true; do
       for i in 17 22 23 27; do
          if [ $(cat /sys/class/gpio/gpio$i/value) -eq 1 ]; then
             case "$i" in
                17)
                   mpc toggle
                   echo PLAY/PAUSE
                   ;;
                22)
                   mpc next
                   echo SIGUIENTE
                   ;;
                23)
                   mpc prev
                   echo ANTERIOR
                   ;;
                27)
                   echo SALIR, APAGAR
                   break 2
                   ;;
             esac
             sleep $TPULS
             break
          fi
       done
       sleep $TCONS
    done
    
    # Libera GPIOs
    echo 17 > /sys/class/gpio/unexport
    echo 22 > /sys/class/gpio/unexport
    echo 23 > /sys/class/gpio/unexport
    echo 27 > /sys/class/gpio/unexport
    
    # Detiene reproducción y apaga
    mpc pause
    shutdown -h now


    Lo guardas en un fichero, por ejemplo: '/root/reproductor_musica.sh'; Le das permisos de ejecución: 'chmod +x /root/reproductor_musica.sh', y para que arranque automáticamente lo llamas desde '/etc/rc.local' (editas ese fichero y en la línea anterior a la que pone 'exit 0' escribes '/root/reproductor_musica.sh &').
    Última edición por Trenz; 09/10/2016 a las 13:35

  9. #53

    Fecha de ingreso
    Nov 2005
    Ubicación
    Excartagenero
    Mensajes
    23,611
    Mencionado
    276 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    5,978
    Agradecer Thanks Received 
    5,792
    Thanked in
    Agradecido 3,773 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    1
    Muchísimas gracias, en serio.

    No probé más nada del tema, demasiado curro y líos.

    Un día de estos que tenga ánimos para liarme con esto lo intento de nuevo!

  10. #54

    Fecha de ingreso
    Jan 2012
    Mensajes
    560
    Mencionado
    7 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    63
    Agradecer Thanks Received 
    225
    Thanked in
    Agradecido 133 veces en [ARG:2 UNDEFINED] posts
    Ánimo entonces...

  11. #55

    Fecha de ingreso
    Jul 2006
    Ubicación
    Madriz
    Mensajes
    1,297
    Mencionado
    28 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    176
    Agradecer Thanks Received 
    322
    Thanked in
    Agradecido 172 veces en [ARG:2 UNDEFINED] posts
    Cita Iniciado por josepzin Ver mensaje
    Se lo ve bastante apretujado pero como regalo quedó genial.

    Ese código Pyhton necesita instalar algo más para funcionar?
    En mi caso en concreto hay varios puntos a tener en cuenta... : S
    De hecho como al final he metido el lector de NFC por ejemplo, hay que usar una versión "antigua" de raspbian o no funciona, ya que con el nuevo kernel cambian los módulos de acceso serie y el lector no detecta tarjetas.

    Luego además hace falta la biblioteca MFRC522, y todo el rollo del pinaje, etc

    Cuando tenga un rato (y ganas) haré un mini-tutorial de cómo lo monté, con la lista de piezas específicas, qué tags NFC compré... y tal por si alguien quiere hacer algo parecido, pero si no se usa un lector nfc o cosas así, igual mi ejemplo no es el más adecuado ni de lejos...

  12. #56

    Fecha de ingreso
    Jan 2006
    Ubicación
    Madrid
    Mensajes
    2,184
    Mencionado
    4 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    72
    Agradecer Thanks Received 
    83
    Thanked in
    Agradecido 54 veces en [ARG:2 UNDEFINED] posts
    Añado al hilo mi proyecto de Jukebox que terminé justo a tiempo para el cumpleaños de mi hermana

    La idea original era imprimir la carcasa con filamento de madera pero no fue posible, aun no le he cogido el truco y se me atascaba, asi que al final está hecho en PLA dorado.
    Nombre:  IMG_20161011_084355.jpg
Visitas: 363
Tamaño: 92.6 KB
    bonus de mis piernas serranas XDDD
    Nombre:  IMG_20161011_113618.jpg
Visitas: 148
Tamaño: 136.9 KB

    Nombre:  IMG_20161011_201302.jpg
Visitas: 147
Tamaño: 125.8 KB

    Nombre:  IMG_20161011_201511.jpg
Visitas: 146
Tamaño: 144.7 KB

    Nombre:  IMG_20161015_113738.jpg
Visitas: 147
Tamaño: 105.5 KB

    Nombre:  IMG_20161015_113744.jpg
Visitas: 151
Tamaño: 116.0 KB

    Nombre:  IMG_20161015_113731.jpg
Visitas: 201
Tamaño: 106.7 KB

    dentro lleva una bateria externa de movil que no aparece en las fotos que se recarga por el cable usb que sale.

    El aparato funciona metiendo las "fichas" que salen devueltas por el lateral.

    después de hacerlo ha habido cosas que han quedado un poco cutres (usar tarjetas nfc en vez de los llaveros que tenia, poner un puerto usb en vex del cable colgando...) y mejoraría, pero como el regalo gustó cumplió su cometido

    en cuestion de scriting use la libreria MFRC522 para leer las etiquetas y un shell script guarrindongo para controlar el mpc
    Última edición por danihm_moz; 20/10/2016 a las 11:21
    la distancia mas corta que une dos puntos cualesquiera siempre es 0.

  13. Los siguientes 4 usuarios agradecen a danihm_moz este post:

    DarkDijkstra (20/10/2016), JoJo_ReloadeD (20/10/2016), josepzin (20/10/2016), swapd0 (20/10/2016)

  14. #57

    Fecha de ingreso
    Jul 2006
    Ubicación
    Madriz
    Mensajes
    1,297
    Mencionado
    28 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    176
    Agradecer Thanks Received 
    322
    Thanked in
    Agradecido 172 veces en [ARG:2 UNDEFINED] posts
    Que gran idea lo de usar tags NFC como "botones" para las distintas acciones... se me empiezan a ocurrir un montón de nuevas tonterías posibilidades con una raspi y un lector XD

  15. #58

    Fecha de ingreso
    Nov 2005
    Ubicación
    Excartagenero
    Mensajes
    23,611
    Mencionado
    276 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    5,978
    Agradecer Thanks Received 
    5,792
    Thanked in
    Agradecido 3,773 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    1
    Me estaba preguntando que era esa cosas con circulos y cómo se controlaba esto!!! :O

  16. #59

    Fecha de ingreso
    Jan 2006
    Ubicación
    Madrid
    Mensajes
    2,184
    Mencionado
    4 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    72
    Agradecer Thanks Received 
    83
    Thanked in
    Agradecido 54 veces en [ARG:2 UNDEFINED] posts
    son estos llaveros recortados malamente

    Nombre:  tag4.jpg
Visitas: 277
Tamaño: 69.2 KB
    la distancia mas corta que une dos puntos cualesquiera siempre es 0.

  17. #60

    Fecha de ingreso
    Nov 2005
    Ubicación
    Excartagenero
    Mensajes
    23,611
    Mencionado
    276 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    5,978
    Agradecer Thanks Received 
    5,792
    Thanked in
    Agradecido 3,773 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    1
    Coñio... lo que se ve en esta foto :P


Página 4 de 5 PrimerPrimer 12345 ÚltimoÚltimo

Permisos de publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •