Lineas alimentacin y linea de datos

Jun 27, 2006 10 Replies

Hola gente!



estoy intentando controlar el movimiento de 3 discos (tipo vinilo pero m=E1s tochos). tengo un control en cada disco para los 3 motores con sensor hall que hagan girar los discos. (usar=E9 un ATmega48). _ _ _ (_) (_) (_) !!! !!! !!!



el problema que tengo es que necesito que cuando uno de los 3 gire, haga que automaticamente los otros 2 queden sin poder accionarlos. vamos, que solo gire un motor cada vez. tengo 3 contactos para cada disco, 2 para alimentacion (24V y 0V) y el otro me interesar=EDa que fuera de "informacion". es decir, conectar de alguna manera los 3 discos a traves de ese contacto para que un disco sepa cuando otro de ellos se est=E1 moviendo y as=ED no hacer caso a las instrucciones que le lleguen de su micro y no se mueva.



ya, ya se que me he podido explicar fatal, pero no se de que otra manera decirlo, jejeje. c=F3mo puedo conectar los 3 discos para que se "comuniquen" entre ellos? lo que pretendo es que al activar 2 a la vez, el primero que consiga moverse es el qe gana y el otro queda sin activarse....as=ED mas o menos...



si alguien me ha entendido algo y me puede echar una ayudita... quiero saber c=F3mo aplicarlo fisicamente,



ALioLi escribió:

Lo más simple que se me ocurre es que el disco que esté girando, de tensión al tercer cable, y que cada disco, en caso de ver tensión ignore sus señales de marcha.

La única comprobación a hacer en cada "plato" es que no sea él mismo quien le manda tensión, para que no se autodesconecte.

Saludos.

si, esa era m=E1s o menos la idea. antes de que se ponga uno a girar, mira primero si hay tension en el tercer cable y solo se pone a girar si comprueba que no la hay. ahora bien, como configurar el pin del micro q se encargue de ello? salida o entrada? asi a simple vista no lo veo realizable....algo m=E1s se me escapa. no puedo configurar el pin para que lea si hay un 1 o un 0 y a la vez que ese mismo pin escriba un 1 o 0 en la linea... ya me he cargado micros con esa novatada como para seguir haciendolo...

al accionar 2 a la vez, tambi=E9n tendr=EDa problema. solo uno puede girar. comprueban los dos que no hay tension y los dos comienzan a girar.... quiz=E1 se podr=EDa hacer que cuando se ponen a girar, antes de escribir un 1 o un 0 en la linea vuelvan a comprobar si esta ya tiene un 1 o un 0, as=ED el primero que consiga llegar ganaria.

leer linea -----( 0? )----> mover motor --> leer linea ----( 0? )--->

escribir 1 ! ! ! ( 1? ) ! ( 1? ) ! ! motor parado parar motor y volver al ppio

ahora bien, sigo con el problema de como usar un solo pin para eso.....

Francisco Gay=E1 schrieb:

le

ore

O yo no lo he entendido bien, o estás armando un lío para nada. Si lo he entendido bien, es el micro el que acciona esos motores ¿no?. Si es así, el programa del micro es el que debería estar hecho de forma que sólo active uno de los motores cada vez.

En cualquier caso, si tu duda es cómo saber si hay tensión o no en uno de 3 terminales, sólo con un port del micro, la cosa es relativamente simple, con un OR a diodos. Por ejemplo, si lo que quieres detectar es cuando hay tensión en al menos un terminal, sería algo así: D1 Term.1 -----|>|----+------+------- MICRO | | D2 | R Term.2 -----|>|----+ R R1 | R D3 | | Term.3 -----|>|----+ | 0V

--

Saludos de Jose Manuel Garcia snipped-for-privacy@terra.es http://213.97.130.124

"ALioLi" escribió en el mensaje news: snipped-for-privacy@b68g2000cwa.googlegroups.com...

si, esa era más o menos la idea. antes de que se ponga uno a girar, mira primero si hay tension en el tercer cable y solo se pone a girar si comprueba que no la hay. ahora bien, como configurar el pin del micro q se encargue de ello? salida o entrada? asi a simple vista no lo veo realizable....algo más se me escapa. no puedo configurar el pin para que lea si hay un 1 o un 0 y a la vez que ese mismo pin escriba un 1 o 0 en la linea... ya me he cargado micros con esa novatada como para seguir haciendolo...

al accionar 2 a la vez, también tendría problema. solo uno puede girar. comprueban los dos que no hay tension y los dos comienzan a girar.... quizá se podría hacer que cuando se ponen a girar, antes de escribir un 1 o un 0 en la linea vuelvan a comprobar si esta ya tiene un 1 o un 0, así el primero que consiga llegar ganaria.

leer linea -----( 0? )----> mover motor --> leer linea ----( 0? )--->

escribir 1 ! ! ! ( 1? ) ! ( 1? ) ! ! motor parado parar motor y volver al ppio

ahora bien, sigo con el problema de como usar un solo pin para eso.....

Francisco Gayá schrieb:

pues has entendido bien, aunque hay lio de todas maneras. Hay lio porque cada plato lleva su micro, y no puede haber ninguna conexion f=EDsica entre cada par plato/micro que no sea a traves de esa linea de datos,la cual s=ED puede ser comun para los 3. asi que con s=F3lo esa linea de info se tienen que "comunicar" los 3 micros. bueno, solo para saber cuando tienen que mover el plato o no.

Pepitof schrieb:

he

=ED, el

tive

o de 3

, con

e le

z,

gnore

smo

Puedes utilizar esa línea como flag, si un motor se está moviendo, que ponga la línea en alto, y antes de iniciar el movimiento, que compruebe el estado de la línea... pero esto te puede dar problemas de colisiones, tendrías que optimizar el código que va desde "Verificar la línea" hasta "Ocupar la línea", y aún así seguirían existiendo posibilidades de que un micro consulte la línea mientras otro se está preparando para ocuparla.... Otra solución es implementar un protocolo de comunicaciones en esa línea, tipo I2C o SPI... pones a un micro (¿El del centro?) como maestro y a los otros dos como esclavos... que el maestro esté continuamente consultando a los esclavos su estado y decidiendo quien ha de moverse.... también puedes poner un cuarto micro como maestro y tomar decisiones-> Implementar una cola, asignar preferencias de movimientos, etc, etc... jeje la cosa se complica... a ver si salen soluciones más sencillas Saludos

Pues utiliza esa linea de datos, para comunicar los micros, por I2C o CAN.

O lo que se llama exclusion mutua, y las cuales es probable que sufra, y mas en una aplicacion como esta, ejecucion paralela de instrucciones, grado 3 encima puf... hay algoritmos para evitar esto, pero no son aplicables en este caso (necesitamos dos lineas minimo), lo mejor en el fondo creo que seria montar algo con un protocolo de un hilo.

La solucion mas facil, si se pudiera implementar, seria, que cuando la linea que queda para comunicacion se "suba", resetear los otros dos chips (tal cual...), si se pudiera hacer esto, ya que su unica funcion es controlar el giro y cuando no van a girar son inutiles, se podria evitar que entren en la region critica (comenzar a girar los discos), pero seria algo a nivel fisico (el reseteo), asi, aunque se diera el caso de que los 3 micros comprueban a la vez la flag, el que mas rapido la levante (esto a nivel fisico que pase al a vez es.. improbable del todo) evitara el reseteo y el resto saldran de la region critica forzados por este.

Fleming escribió:

Hay una técnica muy simple para 'coger' el control de la linea detectando colisiones, es la que emplea el bus can, en tu caso lo puedes hacer más simple (y más lento), con uns pocas instrucciones en cada micro.

Pongamos que la linea a esta a 1, forzada con una resitencia a nivel alto, y cada micro es capaz de ponerla a 0 con una salida de colector abierto o con un transistor, y además cada micro puede leer su estado (si es necesario usas dos pins del micro)

Cada micro coge el control de la linea poniendola a cero. Antes de coger el control el micro debe comprobar que la linea ha estado a 1 durante un tiempo (largo) determinado. Si la linea está a 1 durante este tiempo (largo) es que esta libre.

Solo queda resolver las colisiones (si dos micros lo intentan a la vez): Para coger el control de la linea, cada micro fuerza un nivel bajo durante un tiempo (T), la vuelve a nivel alto, y comprueba que (leyendo la linea) la linea efectivamente ha estado a nivel bajo durante este tiempo T y que ha vuelto a nivel alto. Si cada micro tiene asignado distinto tiempo T en el caso de una colision el micro que tenga un T más corto se dará cuenta de colision, puede abortar e intentarlo más tarde, y eso además equivale a que el del T las largo tenga prioridad en caso de colision.

El bus can no lo hace exactamente así, sino que escribe un valor binario en la linea, y lo lee a la vez, si lee lo mismo que escribe es que no ha habido colision. En caso contrario ha habido colision y lo vuelve a intentar pasado un tiempo.

Este es un buen sistema cuando hay poco tráfico, la probabilidad de colisiones es baja, pero si hay colision se detecta, así que tambien es seguro en ese aspecto.

gracias NoloPongo! me parece una muy buena solucion...ahora a romperme el coco para programarlo todo y que salga bien. Bueno, al menos la idea la he pillado, de ah=ED a implantarlo tengo curro....

Nolo Pongo schrieb:

rio

ALioLi escribió:

¿Obligatoriamente tienes que usar un sólo pin?

.......................... . Pin de salida >---|>|--+-.----Tercer cable | . Pin de entrada

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required