Ojos sepultos

14 septiembre, 2016 Deja un comentario

alhambra

Como un ave blanca que vuela y se aleja sin rumbo fijo en un cielo oscuro y tormentoso, el brillo de sus ojos avellana se va perdiendo hasta casi extinguirse. Bruno deduce que son los ojos más expresivos que ha visto, a pesar de que morían. En su fatigoso oficio, de comarca en comarca, se había encontrado con tantas y tan diversas miradas, mas ninguna como aquella. En la cavidad oscura no hay más que esa vida agotándose junto a él, que también agoniza, sepultos a medias por las noveles construcciones castellanas, convertidas en manojo de escombros. Recuerda que nunca vio los ojos moribundos de su hijo Felipe, intuye que debieron ser semejantes, las pupilas dilatadas esperando en vano percibir el brillo de los astros tras el crepúsculo. Tose, siente la boca llena de tierra y astillas de madera, pierde el conocimiento una vez más. Cuando regresa puede ver los destellos tempraneros de la luna llena colarse entre las vigas caídas y las rocas caóticas iluminando el rostro de Zoraya, ausente ya de vitalidad. Intenta gritar, empero, lo deslumbra la pálida luz del astro, incapaz además de percibir los movimientos de las rocas más arriba: Una voz que se le antoja conocida le llama, alguien intenta su rescate. Pero ya es tarde, en su último instante de lucidez contempla el parpadeo lejano e indiferente de Marte, visible entre un boquete, para seguido petrificarse por siempre en el yeso de sus recuerdos..

**

Zoraya deseaba olvidar el recuerdo de los días gloriosos, cuyas sombras deformaban el arabesque de los viejos muros, memorias impuestas que dada su juventud ella no vivió. Sus padres, fieles a las tradiciones de sus ancestros Omeyas, le exigían una sumisión y un compromiso casi extintos en el devenir de los acontecimientos actuales. Deseaba escapar de esas costumbres heredadas y de los recintos que juzgaba condenados: le asombraban las callejuelas llenas de vida y mercaderes de todas partes, la falsa sensación de prosperidad. A pesar de su edad, notaba en el diario barullo las últimas pulsaciones del corazón Nazarí. Inexperta en aventuras, se enrolaría en la siguiente caravana, lejos de la ciudad pomposa, y en contravía de la situación general: El arribo constante y cada vez mayor de inmigrantes llegados del reino castellano, empujados por voluntad propia o por capricho de la regencia. El pequeño reino se hacía cada vez más extraño, sus ruidos interminables, sus diálogos plenos de idiomas y acentos insoportables. Tomaría rumbo al interior,  pensaba mezclarse con las gentes sencillas de los reinos del norte, ingenua como era en su apreciación de lo desconocido. Los puertos no eran opción, aunque estaban apenas a unos días al paso, languidecían eclipsados por el creciente poderío de la flota portuguesa. Escogió la fecha de luna llena, de modo que la pálida luz le ayudará a andar por las algabas ya cerrada la noche. Por última vez lee la inscripción en árabe que su padre mandó tallar en la más elevada torre del alcázar familiar:

“Granada es el Damasco de Al-Andalus, pasto de los ojos, elevación de las almas. Tiene una alcazaba inexpugnable, de altos muros y edificios espléndidos”[1]

Lo imaginó escrito en caracteres latinos mientras se decía a si misma que su castellano era suficientemente bueno para no pasar por mora, empero, sus mechones bermejos le hacían inconfundiblemente nazarí…

 **

Felipe nació en una tienda a la vera de alguno de los polvorientos caminos que recorren la yerma extensión de Castilla. Un alma inquieta dentro de un cuerpo que no se comportaba mejor: Siempre saltando, corriendo y gritando, expresión de una vitalidad brillante e ingenua, la mayor alegría que un comerciante errabundo como Bruno podría desear. Su madre le había abandonado en este mundo al poco tiempo de nacer, de modo que donde andaba el padre estaba el hijo. Estando en Aragón, año de 1428, en días de compraventa de cueros malolientes, fue el hijo quien tomó el turno de abandonar al mercader: La atestada y retorcida callejuela de Gerona donde comerciaban se empezó a zarandear al compás de un indescriptible rugir de la tierra. Un sismo corto, pero violento, tiró los puestos por el suelo y saturó a las gentes de pánico, multiplicándose el caos. Felipe, asustado, se distanció del padre metiéndose en el espacio entre un carro abandonado y un murete de adobe que al poco se vino abajo arrebatando la vitalidad del zagal. Bruno le buscó entre los vivos, pues no supo de él hasta que le hallaron bajo los escombros. Su corazón, desolado por la pérdida, se consumió en el vacío y en una perenne tristeza. A partir de entonces sus días se debatieron entre su errático oficio y el inútil esfuerzo del olvido…

 **

Zoraya se escurrió sobre las alfombras hasta alcanzar el amplio zaguán, las largas sombras de los alminares a la hora de la oración ocultaron su fuga. Vadeó por las callejuelas alcanzando la salida de la ciudad. Sobre la colina contraria descansaba la primera de las muchas parcelas de la familia, ya podía sentir el aire de la libertad. Bruno bajaba de La Alhambra con la mirada ausente, tres años habían pasado desde la pérdida de su hijo Felipe. Observaba las formas caprichosas del adoquín mientras empujaba el jumento desnudo de su carga de telas, sólo deseaba encontrar la siguiente fonda donde terminar beodo, lánguido solaz de su pesar. De reojo pudo percibir que algo se movía pegado a una pared de reciente construcción: burda técnica castellana en comparación con la refinada estética mudéjar. Por un instante intuyó un infortunio, se detuvo. A su lado apareció una muchacha delgada y fina, de modos cortesanos y estampa mora, sus ojos avellana brillaban plenos con la luz del ocaso. Ella preguntó si era mercader, él asintió con la cabeza, la sonrisa de la mujer iluminó por un instante el corazón vacío de Bruno. La mora explicó su deseo de abandonar ese lugar, él interpretó aquellos argumentos como el capricho de una  doncella casi infante y se negó a su petición de llevarle consigo.

Apenas anduvieron unos pasos cuando un rugir familiar para el mercader, desconocido para Zoraya, se acompasó con el vibrar de la tierra. El jumento huyó despavorido hacia los extramuros mientras la mujer, presa de pánico, fue incapaz de moverse. Bruno ya había vivido el horror de un terremoto así, llevaba tatuadas las cicatrices de sus consecuencias en el alma, y mirando la precariedad de la construcción adyacente, tomó del brazo a la mora, mas cuando se disponía a alejarla, la estructura se colapsó sobre ellos.

La muchacha escucha la voz con claridad: Es la de un niño que grita el nombre de su padre con angustia desgarradora.  A pesar de mantener los ojos bien abiertos no puede divisar más que formas indefinibles en la oscuridad. Recuerda a sus propios padres, su compañía, consejos y caprichos; los ama a pesar de todo. Comprende ahora que este intento absurdo de fuga ha sido un error. Una luz débil aparece al abrirse un claro en la sepultura, puede ver los ojos vacíos y tristes del infante, se le antojan los más expresivos que pudiera recordar. Ella pregunta si todo está bien, el niño le dice que pronto lo estará pues se encontrará con su padre, también le dice que no piense más en el alcázar familiar, pues por fin ha alcanzado la esperada libertad…

Septiembre 12 de 2016.

[1] Fragmento de “El Damasco de Al-Andalus” de Al-Saquundi, poeta granadino del siglo XIII.

Categorías:Cuento Etiquetas: , , ,

Acuerdo de Paz, bramido de hato

9 septiembre, 2016 Deja un comentario

paloma2

Luego del fragor del combate, agotados, los dos cuerpos armados cesaron sus ataques. Descubrieron en medio del silencio, quebrado en asíncronos momentos por los quejidos de los moribundos, que todo aquel esfuerzo, como en tantas otras luchas en el pasado, simplemente no solucionaría los motivos fundamentales del conflicto.

Rodeados de cráteres de bombas y muertos los líderes de aquellos ejércitos enfrentados hace tanto se acercan, se examinan detenidamente con la mirada, en sus ojos aun brilla el odio acumulado en años y años de asesinatos de conocidos y desconocidos, de familiares, de amigos.

Aun se siente el temor de las armas, de la amenaza de muerte; ese lenguaje pervertido que se ha hecho universal por décadas entre los pliegues interminables de las montañas plenas de verdor que conforman la geometría compleja de esta tierra tropical, a la vez que helada y nebulosa, pletórica de riqueza animal y vegetal. Lugares donde los hombres, ignorantes de su fortuna, se dedican a matarse como opción de vida, pues esa es la única ley que se conoce allende el poder precario del raquítico estado, de la triste democracia, que late cancerosa sólo donde los genes egoístas han hecho metástasis.

Las frases son lentas y adustas: Son tantas las deudas y los horrores.

Los líderes perciben el dolor sórdidamente. Después de todo, para un comandante los muertos son sólo cifras, recursos usados en pro del propósito fundamental: la supresión y el sometimiento de un injurioso enemigo.

Sangre y sufrimiento humano injustificado han brotado por tantos años que ya nadie tiene memoria del principio, pues los primeros tiros los dieron los ahora abuelos, pasados casi todos a lápida por los proyectiles o la decrepitud. Los hijos y los nietos, plenos aún del vigor de sus cuerpos, se han envenenado con la venganza, desean destrozar y ser destrozados para recuperar en algo el insípido honor de los parientes exterminados. La mayoría, sin embargo, huye de tales ignominias, arrinconándose en urbes abyectas donde son anulados con desdeño. Todos esperan justicia para tantas atrocidades cometidas de parte y parte con sistemática perversión, un ejemplo más para poner en los anaqueles de la historia que demuestra la capacidad inmensa del ser humano para deshumanizarse, para hacer del par algo más bajo que un animal, reducirlo a la categoría de batracio, de estiércol, y disponer de él como si fuese material de desecho o de reuso.

Se vanaglorian las mentes dirigentes pensado que las masacres son en realidad un gran favor, un alivio de los males, la erradicación de una plaga, fuere donde fuere, y llámese como se llame. Empero la misma muerte se cansa un día de buscar los cadáveres y de tratar de cuantificar los desaparecidos, mientras el problema fundamental sigue irresoluto tras miles de muertos y heridos. Las fuerzas en armas son incapaces de anularse.

¿Para qué seguir en aquel baladí inútil?

¿Para enriquecer a los traficantes de armas?

¿Para enriquecer a los fabricantes de armas?

¿Para facilitar la tierra a los que poseen ejércitos privados para defenderla?

Los enemigos dialogan en una charla entrecortada, confusa: el mismo lenguaje ha sido alterado, modificado tantas veces para justificar la degradación que las palabras ya no tienen significado. Es necesario rehacer los términos, ponerlos en claridad. Aun así, las interpretaciones bullen en ambigüedad.

Un grupúsculo de entes que no han entrado en combate, que no han masacrado ni asesinado, empujan con fervor a los que ultiman los crímenes; son los dedos invisibles que oprimen el gatillo de los rifles, que encienden las mechas de las bombonas de gas.  Instigan cómodamente sentados en sus escritorios, o en el solar de sus haciendas, o mientras pregonan frente a los micrófonos abiertos al oído popular. Otros invierten y buscan su lucro con afán, ya que la muerte y el sufrimiento humano son tanto o más redituables que alimentar y mantener la salubridad de los pueblos.

Aun peores que aquellos, existe una masa informe e innumerable a la que ésta o aquella otra guerra les sabe a nada. Permeados en sus cajas de vidrio y concreto, indolentes a la realidad allende sus pantallas y enajenaciones brillantes, balbucean monosílabos burdos según sea el fluir de las voces llevadas por el viento, salidas casi siempre de los entes fanáticos antes mencionados. Individuos que aunados en un colectivo mutan en borregos, capaces de destrozarse entre ellos a grito y puñal, convencidos de que la patria no pasa de ser una camiseta de colores.

Los combatientes también se miran, ora con desprecio, ora con temor, siempre con desconfianza. Aunque nacidos de madres diferentes todos comparten la misma cuna: Hogares humildes con pocas oportunidades para soslayar las pesadillas que arrecian en los campos, educación precaria o ausente, dejado el intelecto a los vaivenes del monte y la selva. Niños arrebatados de las ternuras de la infancia para sembrar y multiplicar el miedo, para pregonar los sórdidos estruendos de su majestad la guerra, de su santidad la muerte. ¿Se abrirá la puerta a una nueva vida para estos, que de otro modo serán las vísceras sanguinolentas en los informes militares y los noticieros?

Al final de la conversación se llega a un acuerdo, una mole de palabras pesada y viscosa se pega a un papel que los ilustrados firman con agrado. Lluvia de flashes, largas arengas de noticiarios, tires y aflojes de los que conformes van, de los que resignados quedan, de los que furibundos no se resignan y desean continuar la mutilación y la barbarie.

Los compromisos y las reparaciones no son perfectos, como no es perfecta la angustia que se vive al ser tiroteado en medio de una tierra de nadie. Sólo la muerte es perfecta, pues tras ella no hay vuelta al conflicto. Empero, es la naturaleza del hombre no querer morir. Aunque imperfecta, la vida de esos que de otro modo serían sangre y carne inerte, merece ser vivida…

 ¡Oh permeada e innumerable masa!

La historia abre los cercados para que dejes de ser sólo bórrego rebaño, para que en un lúcido instante de urna alimentes esta democracia que tanto ha languidecido en inanición, para que calles el tronar de los fusiles y al fin se disipe el hedor de la pólvora mezclada con sangre, ese que nunca sientes,  aunque tengas el mejor sonido surround conectado al plasma en la sala de tu casa.

Te han puesto la decisión a la manera que te gusta, rebajada al estado del intelecto colectivo, un simple monosílabo, un bramido de hato, capaz de timonear los años venideros de este intento de nación.

Muge ahora, has sentir tu posición, no dejes que pase la hora sin siquiera haber ojeado el ruedo de la mole del acuerdo, pero sobre todo deja de ser rebaño, que la democracia mustia de esta patria, que para ti es sólo camiseta y fiesta de ocasión, es antigua y resistente, y si la alimentas ella te devolverá con lucidez ese favor, porque eres parte de ella, porque eres ella…

Septiembre 9 de 2016.

Categorías:Ensayo Etiquetas: , , , ,

Idolatría.

5 septiembre, 2016 Deja un comentario

Templo Artemis

Largo es el camino hacia tu santuario,
hacia la cella que en penumbras esconde tu presencia divina.
Avanzo el inclemente recorrido sometido a las vejaciones de los elementos,
así como al silencio y el desprecio, al abandono y la soledad de mi propio paso.
Al fin diviso en el horizonte las altas torres que custodian tu ciudad,
se encuentran al otro extremo de un valle fértil y pleno de vitalidad.

Camino sobre losas pulidas con gran esmero,
adoquinan la ruta de los que se acercan a ti a dejar sus ofrendas.
Toscos paganos que en procesión permanente van buscando favores,
deseando paliar las penurias de sus días terrenales con tu ayuda invisible.
Mencionan entre cantos y oraciones tus títulos y nombres,
fuente de los credos, falsos o ciertos, de las supersticiones.

Al fin ingreso a la ciudad amurallada,
los blancos edificios hieren los ojos con la luz plena del medio día.
La muchedumbre no repara en mi presencia embebida en las pequeñeces de sus quehaceres,
anclada la mirada al suelo por el peso de sus fútiles menesteres arqueando sus espaldas.
Sin tropiezo subo la escalinata de tu templo majestuoso envuelto en altas columnas de mármol,
bosque de piedra donde juegas a aparecer y esconderte, el hogar que se ha hecho para ti.

Adentro fluye un aire fresco saturado en esencias,
separando tu hogar y tu presencia del banal bullicio del mundo.
Aun sin verte todavía percibo tu candor y la fuerza de tu energía,
detenida estas en la penumbra de tu cella mientras camino a tus pies.
Toco el perfecto mármol con las yemas de mis dedos percibiendo su helada vitalidad,
ídolo de roca que palpita en su belleza evocando tu cuerpo celestial.

Los sacerdotes custodios miran con desdén a los penitentes,
mientras se empecinan en cobrar los diezmos mis ojos se clavan en tus ojos de diosa.
Me deleito de las formas perfectas de tu estatua criselefantina,
hilos dorados se revuelven en tu cabello, envolviendo tu cabeza en un aura angelical.
Hago en sus lugares las libaciones y pronuncio en siseos los cantos rituales,
con cada verso empiezo en verdad a anhelar tu presencia de carne y hueso.

Recito finalmente mi propia petición,
No es mi deseo el poder ni la riqueza de este mundo imperfecto y banal:

Deseo contemplarte más allá del oro, el ébano y el marfil.
Deseo sentir la tibieza de tu piel, el vigor de tus formas.
Deseo el contacto húmedo y poderoso de tus labios.
Deseo consumirme en el fuego que llevas dentro, y ser no más que tus cenizas.
Deseo estrecharme a ti y perderme tras las pupilas de tus ojos.
Deseo que esta carne infeliz y mortal toque por un instante el goce de lo divino.
Deseo sentir el elixir de la vida eterna aunque me envenene.
Deseo explorarte cada rincón, recorrer cada poro de tu cuerpo buscando recoger tu esencia,
y al final morir satisfecho de haberte encontrado,
de haber idolatrado a mi diosa como ningún pagano puede…

Tras la oblaciones regreso al calor asfixiante de la ciudad,
sin prisa pero inexorable me consumo de nuevo en su bullicio.
Regreso a mis eriales tras el valle y las montañas,
desandando los pasos de mi procesión final.
Espero desde entonces de que sean cumplidos mis imposibles deseos,
hasta el último de mis días veneraré tu estampa y mis recuerdos de ti.

Al final, lo se, luego de incontables años o de incontables vidas,
te encontraré un buen día, y mi deseo será cumplido según fue dado en plegarias:

Quizá los eones sepultaron los sufrimientos de mis pasos.
Quizá los pilares de tu cella y tu santuario se derrumbaron ruinosos.
Quizá ya nadie recuerde tu blanca ciudad ni sus altas torres.
Quizá se hayan removido del todo los adoquines de tu camino de procesión.
Quizá no quede nada del elixir divino ni de los aromas de esencias.

Sin embargo, contados los tiempos, descubriré en el fondo de tus pupilas,
a esa deidad celeste con la que quise fundirme en los tiempos en que fui un devoto pagano,
y sin saberlo tu, ni yo, al fin pasarás de ser sólo perfecto bronce, ébano y marfil,
a ser el cuerpo que me atrapa, al fuego que me consume.
Devolverás en el placer y la tibieza de tu piel los favores de mis libaciones,
esas que en siglos perdidos hice con toda fidelidad en el centro de tu santuario…

Categorías:Cuento, Poesía libre Etiquetas: , , , ,

Asedio.

1 septiembre, 2016 Deja un comentario

http://clanguerrerodarak.webnode.es/nuestras-maquinas-de-asedio/

Tantos conquistadores han llegado a las tierras que se suponen sagradas,
hombres adictos al placer del saqueo y la gloria efímera,
buscando afanosos las loas que se dan a los que regresan cargados de tesoros,
a los que exhiben las cabezas sin vida de sus enemigos de turno.

En el devenir de los tiempos ahora es tu labor defender la ciudadela,
tras sus muros escondes lo más valioso: los significados de tu ser.
Ya desde las tempranas épocas cuando juveniles eran la villa y tu piel,
degenerados saqueadores fueron denudando tus invaluables tesoros.

Tas cada bárbaro un horrible rastro de caos y dolor han mellado tu propósito,
empero te han dejado vivir, te han dejado seguir y con cada ultraje aprendes,
con cada nuevo conquistador mejoran las estratagemas de la defensa:
Levantas empalizadas, construyes atalayas con que otear desde lejos a la infamia.

Con los años haces escuela en el escape y la defensa, ahora incluso azuzas al enemigo,
lo llamas a las puertas, te burlas de él usando trampas sutiles y sofisticadas.
Ingresar a tu ciudad fortificada se hace un imposible y también una leyenda,
y con la fama de las historias que cruzan los reinos nuevos invasores te reclaman.

Guerreros gallardos y estúpidos, sujetos perversos, también valientes y afeminados,
todos se resignan al rastrojo que les dejas en los campos preparados para el sitio singular.
Tu excelente defensa sólo tiene sentido si un rival rodea las murallas,
pero incluso los mejores, aburridos de fracasar, ya no desean si quiera pelear.

Te hundes entonces en el vacío: tus tesoros se conservan con santa devoción,
más nadie puede gozar de ellos, admirar su poder y belleza,
enriquecer el empobrecido espíritu con las evocaciones que expresan,
elevar tu propia dicha por encima de las grotescas formas de las almenas y los torreones.

Heme aquí que vengo como un saqueador más, llegado de ignotas tierras,
escéptico de las habladurías mis huestes cargan contra ti sus mejores máquinas:
Elaboradas catapultas, trabuquetes y balistas de ciclópeas proporciones,
arietes en filas interminables prestos a derribar tus puertas.

Y como todos los guerreros idiotas de antes, mis esfuerzos fallan:
El fuego griego que escupen las ingeniosas máquinas tras las troneras
barre sin piedad con mis ingenios, con mis esfuerzos: El aire se llena de calor y gemidos,
y gozas tras los muros de tu victoria, satisfecha te encuentras en aquel placer pueril.

Te deleita el goce de ver caer a quienes sólo atinan a alcanzar tu altos muros,
que mientras hierven por fuera queman a los incautos en tu poderoso fuego,
Clavas tus innumerables flechas desde las aspilleras sesudamente dispuestas,
me consumes en el éxtasis que te causa ser tan superior en la batalla.

Aun no estoy derrotado, he vivido otros asedios y rodeado otras murallas,
he perforado las puertas y tomado las atalayas, saqueado los palacios y las casas.
Un arma a la vez nueva y antigua blando en los flancos de las entradas:
Un cañón cuyas en cuyas balas impresos están mis conjuros y palabras.

Truenan los disparos llenando tu alrededor de humo y confusión,
caen algunas puertas, se perforan las almenas, se escuchan otros gemidos.
Ahora es mi turno de gozar en el placer de esta contienda, de someterte a mi fuerza
de hacerte vibrar emparejando las fuerzas de esta intensa dinámica.

Cada bala penetra tu ciudadela, destroza las callejuelas y las tiendas,
las gentes corren en un pavor desconocido desde las nóveles épocas de aldea y tersa piel.
Mis palabras quedan impresas en los adobes y adoquines, deforman los muros,
tras el humo destellan tus tesoros relucientes, esquivos a la codicia de tantos.

Convencido de la victoria lanzo a los guerreros de a pie para tomarte al fin
para hacerme con los rescoldos ardientes de tu ciudadela fortificada,
mas al poco descubro cuan buena eres en esta lucha, que aun en el borde de la rendición,
nuevas vallas y otros muros escondes, recompones tu estrategia.

Al poco truenan las poderosas explosiones de tus propios cañones,
tus frases y conjuros mezclados con las balas dispersan lo poco que de mi queda.
Comprendo ahora que no hay vuelta, que no podré huir como los anteriores invasores,
que conquistaré tus tesoros sólo para mi o moriré en tu suelo en heroico esfuerzo…

Septiembre 1 de 2016.

Conjunción en Luna llena.

20 agosto, 2016 Deja un comentario

Conjunción Marte-Saturno en Escorpión

Esta noche fría, Saturno y Marte se balancean sobre los brazos del escorpión.
con su ojo de Antares el picudo animal les observa parpadeante,
incapaz en su distancia inconmensurable de poder hacerles ningún mal.
La Luna asciende desde el horizonte envuelta en fina neblina,
ilumina con su vieja cara adolescente a La Tierra, que reposa en la penumbra,
cansada ya de los caprichos que trae la luz solar.

Sonríe Selene menguando ligeramente su blanca y redonda tez
mientras contempla la veleta brillante que forman los astros ecplíticos.
En vano trata de encontrar el destino que marcan en la negrura del infinito,
intuye que existe en aquella geometría particular y vistosa un indicio, un significado.
Apela en su esperanza a los augurios de la antigua astrología,
los conoce de memoria luego de escuchar por eones las predicciones de los brujos y adivinos:

Marte, el ungido en sangre guerrera, atrapado en la pinza del escorpión;
oscuro oráculo de muerte, de derrota en batalla.
Saturno escapando ágil por el costado mientras el aguijón penetra la armadura,
señor de la ciega y la cosecha, indicando en su huida abundante vendimia,
buscando ayuda en el sagaz Sagitario, guardián del corazón galáctico.
La misma Luna derramándose en la noche desde el ánfora del aguador,
anunciando que su altruismo de fémina se esparcirá en la humanidad,
mitigando el dolor de la pérdida acaecida en el desigual conflicto.

Luego de construidas sus cuartetas pinta en la bruma fría un halo donde clavar esas saetas.
Recuerda que después de tantos desaciertos de charlatanes y falsos adivinos,
esa es la única manera de acertar en plena forma en el augurio,
de develar sin titubeos el significado de los versos ambiguos,
de sentir que no ha perdido un ciclo de su tiempo en un baladí.

Evoca entonces a los nuevos adivinos, maestros de las cifras,
esos que cambiaron los signos de los dioses por ecuaciones algebraicas.
Magia poderosa capaz de predecir en dónde y cuándo se hallarán en conjunción,
el señor de las mil batallas y el decorado portador de la hoz,
frente a las pinzas poderosas del mortal escorpión.

Nada dicen los cálculos sobre el significado de aquel encuentro,
de lo que implica aquel triángulo brillante de astros que raya el cielo,
únicamente indican con la más detallada de las precisiones,
cuántos giros ha de dar a la mancillada Tierra para volverse a encontrar
con su blanca tez derramando pálida luz blanca desde el ánfora del aguador,
mientras mira celosa aquel triángulo brillante
que le roba el protagonismo en la noche de luna llena.

Desencantada encuentra como conclusión,
que no le ayudan los viejos y confusos augurios
ni las perfectas posiciones que dan los números
para hallar el sentido de aquella formación singular.
No le queda más remedio que esconderse tímida sobre un nimbo perdido,
y disfrutar contemplando la belleza de aquel curioso momento orbital,
dejando por una noche su protagonismo de luna llena
a una estrella gigante roja, y a un par de planetas
que pintan una hermosa flecha hacia lo infinito
apuntando a ninguna parte en esta noche glacial.

Agosto 19 de 2016.

Categorías:Cuento Etiquetas: , , ,

Macro en Word para ajustar las líneas de un texto copiado desde un documento PDF

30 octubre, 2013 2 comentarios

El propósito del siguiente post es mostrar el uso de una macro en word, en la misma se implementó el uso de un formulario (UserForm) sobre el cual se elaboró una barra de progreso utilizando etiquetas de texto (Label).  El resultado se puede ver en el siguiente video:

Habitualmente las macros, que son pequeños segmentos de código en Visual Basic para aplicaciones (VBA), son muy utilizadas en Excel dada la potencia y versatilidad que ofrecen para el manejo de las hojas de cálculo y la automatización de procesos dentro de las mismas. Microsoft Oficce Permite el uso de macros en cualquiera de los programas del paquete, sin embargo en Word no es muy común utilizarlas y se limitan casi siempre al ajuste de los textos a plantillas predeterminadas, tarea que se puede hacer fácilmente a través de los menús del programa.

Como una muestra de lo que es posible hacer a través de macros en Word se ha escrito un pequeño programa el cuál es capaz de ajustar las líneas de un texto que hemos copiado desde un documento PDF o algún otro tipo de documento que tenga un formato propio para las líneas de texto y que al momento de copiar en Word mantienen los retornos de línea del documento original y no se ajustan a los de la plantilla actual de Word.

La Macro “Ajustar_Lineas” llama al formulario de usuario UserForm3 que al iniciar (evento UserForm_Activate) modifica algunos parámetros de los objetos del form y llama seguidamente a la función “ajuste_lineas” la cual es como sigue:

'** ===================================================================
'**     Función     : ajuste_lineas
'**     Descripción : Ajusta las líneas del texto del dodumento.
'**     Parámetros  : Ninguno
'**     Retorna     : Nada
'** ===================================================================
Function ajuste_lineas()
    Dim myRange As Range
    Dim r As Range
    Dim nc As String
    UserForm3.Caption = "Ajuste de líneas de texto"
    UserForm3.Labelsubproceso.Caption = "Identificando espacio de fin de línea"
    Selection.WholeStory
    Set r = ActiveDocument.Range(Start:=0, End:=Selection.End)
    palabras = Split(r.Text, Chr(13))
    Application.ScreenUpdating = False   ' Desactivar actualización de pantalla (acelera el proceso)
    j = UBound(palabras)
    x = 0
    Do While x < j
        If palabras(x) <> "" Then
            ultch = Mid(palabras(x), Len(palabras(x)), 1)
            prich = Mid(palabras(x + 1), 1, 1)
            If ultch = "." Then
                 palabras(x) = palabras(x) & Chr(13) & Chr(13)
            ElseIf prich <> " " Then
                palabras(x) = palabras(x) & " "
            End If
        End If
        Actualizar_Barra_Progeso x / (j - 1)
        x = x + 1
    Loop
    Selection.WholeStory
    Selection.Delete Unit:=wdCharacter, Count:=1
    UserForm3.Labelsubproceso.Caption = "Reescribiendo el Texto"
    x = 0
    Do While x < j
        Selection.InsertAfter (palabras(x))
        Actualizar_Barra_Progeso x / (j - 1)
        x = x + 1
    Loop
    Application.ScreenUpdating = True   ' Activar actualización de pantalla
End Function

Esta función selecciona todo el texto del documento, captura el texto a través de un objeto Range y lo pasa a un array de cadenas de caracteres correspondientes a cada línea dentro del texto mediante la función Split. lo siguiente es comparar cada uno de los finales de las líneas de texto y determinar si finalizan con un punto, si es así se interpreta que es el final de un párrafo y se coloca dentro del texto la separación correspondiente. En caso de tener un fin de línea sin punto se interpreta que el texto debe continuar en la siguiente línea y de este modo el salto de línea se reemplaza por un espacio. Terminada esta comparación se selecciona todo el texto y se elimina, seguidamente se escribe un nuevo texto utilizando la secuencia del array “Palabras” Mientras se suceden los dos bucles que contiene esta función se va actualizando el valor de entrada de la función Actualizar_Barra_Progeso la cual modifica a su vez la propiedad Width del objeto LabelProgress que es el que nos simula una barra de progreso.

'** ===================================================================
'**     Función     : Actualizar_Barra_Progeso
'**     Descripción : Actualiza el indicador en la barra de progreso
'**     Parámetros  : valor de progreso (de 0 a 1)
'**     Retorna     : Nada
'** ===================================================================
Function Actualizar_Barra_Progeso(Porcentaje As Single)
    With UserForm3
        kk = Format(Porcentaje, "0 %")                         ' Ajustar número de porcentaje sin decimales
        If kk <> .AcFrameProgress.Caption Then                 ' Si el número es diferente del anterior modifique la barra de progreso
            .Label_porcentaje.Caption = kk                     ' Modifica el Label de porcentaje a su nuevo valor
            .LabelProgress.Width = Porcentaje * (.AcFrameProgress.Width - 3) ' modifica el ancho del control Label (barra).
            DoEvents                                           ' DoEvents permite que el formulario se actualice.
        End If
    End With
End Function

Finalmente, el documento Word con la macro ejemplo que se ha desarrollado se encuentra disponible pulsando aquí.

Categorías:Informática Etiquetas: , ,

Puerto Serie En Processing

5 abril, 2013 5 comentarios

Visualización de entrada de datos por puerto RS232 mediante Processing

Visualización de entrada de datos por puerto RS232 mediante Processing.

 El propósito de este post es mostrar un sencillo, pero funcional ejemplo de manejo de puerto serie para capturar datos incluyendo una visualización básica y almacenamiento de los mismos mediante una aplicación desarrollada en Processing. Inicialmente es necesario introducir brevemente al manejo de este lenguaje, si ya lo conocen entonces pueden saltar hasta la explicación del código desarrollado.

¿Qué es Processing?

Processing es un lenguaje de programación de código abierto basado en Java cuyo entorno está pensado para personas que desean elaborar imágenes, animaciones e interacciones. Es utilizado por estudiantes, artistas, diseñadores, investigadores y aficionados para el aprendizaje, creación de prototipos y producción. Está enfocado a enseñar fundamentos de programación en un contexto visual y para servir como una libreta de apuntes de software a la vez que una herramienta de producción profesional, siendo sus mayores virtudes una rápida curva de aprendizaje, tamaño ligero y gran flexibilidad. Processing es un software de descarga gratuita y se encuentra disponible para GNU/Linux, Mac OS X y Windows.

Existe gran cantidad de material introductorio disponible en la web. De estas opciones una guía básica, pero bastante completa y en español, la he encontrado aquí. Si por lo pronto sólo se desea una breve introducción esta presentación resulta conveniente.

Utilidad en electrónica y microcontroladores.

Dada la sencillez del lenguaje y el enorme potencial que supone tener a disposición las bibliotecas de clases de Java, este entorno se ha vuelto atractivo para usarlo en áreas diferentes al diseño gráfico (para el que se concibió originalmente), incluyendo la electrónica. La plataforma de hardware de open source Arduino, que permite de manera sencilla crear prototipos de proyectos electrónicos, utiliza un lenguaje de programación que posee un entorno de desarrollo muy semejante al de Processing, por lo cual quienes han programado en el Wiring de Arduino  se acoplan facilmente al IDE de Processing.

Normalmente los proyectos académicos y los desarrollos de sistemas embebidos de pequeño alcance se centran principalmente en el hardware y la programación de bajo nivel propia del mismo a fin de garantizar robustez en el funcionamiento del instrumento, dando menor importancia o delegando a programadores de sistemas las utilidades de presentación a nivel de usuario (en la U casi siempre por afán😉 ) que hoy por hoy revisten una enorme importancia dada la gran cantidad de dispositivos electrónicos de uso cotidiano y su alta capacidad de interacción (PC, Portátiles, Smartphones, etc). De hecho existe una versión de Processing para elaborar aplicaciones para Android, con lo cual con unas pocas funciones es posible lograr una aplicación, quizá no demasiado compleja, pero funcional, que interactúe con nuestro hardware desarrollado.

Manejo del puerto serial.

La mayor parte de micontroladores poseen un puerto serial asincrónico, por lo que es el elemento de comunicación de uso más común en estos dispositivos, consecuentemente, elaborar programa de manejo de puerto serie en processing no es un tema nuevo. De hecho, me he basado en gran parte en un post del Club de Informática, robótica y Electrónica a partir del cual he escrito un programa orientado a mostrar gráficamente los datos recibidos y efectuar el almacenamiento de los mismos. No me detendré en la explicación de las funciones de manejo de la comunicación RS232 (que se encuentra en el link), en cambio he descrito en detalle la estructura de datos de la comunicación que incluye la posibilidad de configurar la tasa de muestreo del microcontrolador desde la aplicación en el PC, esto mediante sencillas tramas de datos para la interacción entre el microcontrolador y el programa.  La idea es poder usar cualquier microcontrolador o dispositivo de comunicación por puerto serie que capture una secuencia de datos (mediciones) y las visualice y almacene ya que la mayor parte de la literatura y los códigos disponibles están pensados para trabajar con Arduino.

 Ejemplo Desarrollado.

Visor de captura

Visor de captura

El puerto RS232 es comparativamente lento con respecto a otras interfaces de comunicación, por lo que se pretende capturar datos con periodos de tiempo mayores a 1 ms. Se quiere igualmente hacer una visualización básica de los datos de entrada con el draw de processing al tiempo que se almacenan los datos obtenidos en un archivo plano separados por punto y coma (CSV), para ser llevados posteriormente a MATLAB, Excel o algún otro programa que nos permita hacer gráficas y análisis de los datos de forma más elaborada.

                         Programa del microcontrolador.

Se ha trabajado con un microcontrolador Freescale QE128 configurando el puerto serie a usar en 19200 bits/s entregando una trama de datos con dos variables de medida provenientes de dos ADC con resolución de 12 bits. Habitualmente cuando se envían datos por un puerto COM de un micro a un PC se visualizan en programas como Hyper Terminal, los cuales interpretan los bytes como caracteres ASCII por lo que para una correcta visualización de los datos numéricos se requiere convertir los datos binarios que entregan los ADC en cadenas de caracteres que puedan interpretarse fácilmente. Esto tiene el inconveniente de aumentar las operaciones del microcontrolador así como alargar las tramas de datos y con ello el tiempo que el dispositivo tarda en el procesamiento y envío de datos, lo que se refleja en un aumento del periodo mínimo en el cual es capaz de efectuar el muestreo. Por este motivo, el envío de datos del ejemplo se efectúa en formato binario haciendo más corto el tiempo de envío de tramas para tratar de evitar la saturación del buffer de entrada del PC y mejorar el periodo de muestreo. Para obtener los datos de entrada para la prueba se aprovechará el acelerómetro de tres ejes MMA7260Q que trae incluida la primera versión de la tarjeta DEMOQE (que es la tengo a la mano) tomando mediciones de los ejes Y y Z.

void EVALUACION(void){
   int ktem;
   byte bkl,index,k;
   byte envio=0;
   byte tempomuestra=0;
   ktr_ciclo=0,ktr_pantalla=0,ktr_dataok=0,ktr_convert==0; //Variables de control a cero
   traza[numtrama][0]=0;
   //configuración inicial
   while(ktr_pantalla==0){
      if(ktr_dataok==1){
        input_ClrVal();
        COM_RecvChar(&amp;captura);                             // Capturo caracter proveniente de la planta
        ktr_dataok=0;
        if((captura=='-')) {
          index=0;
          while (captura!='+'){
            while(ktr_dataok!=1){}
            ktr_dataok=0;
            COM_RecvChar(&amp;captura);
            comando[index]= captura;
            index++;
          }
          comando[index-1]= '\0';
          ktem=atol(comando);
          (void)FMUESTREO_SetPeriodMS((word)ktem);
          ktr_pantalla=1;
        }
        input_SetVal();
      }
   }
   // Bucle principal
Bucle while de inicio del microcontrolador

Luego de las configuraciones de inicio, la función EVALUACION permanece en un bucle while hasta que se recibe una trama de datos de configuración desde el PC, la estructura de la trama que debe entrar es: “-1000+” donde – y + representan inicio y fin de trama y el número es el periodo de muestreo en milisegundos, para el ejemplo se configuraría el timer que controla la lectura de datos de los ADC para que genere un evento cada segundo. Posterior a esto la función ingresa en un bucle for en el cual espera a que se cumpla el evento de medición, efectúa la muestra y la envía por el puerto serie. Para este microcontrolador el ADC soporta resoluciones de hasta 12 bits (pudiendo configurarse también en 8 o 10 bits) caso en el cual almacena el resultado en 2 bytes colocando la medida en los bits más significativos (de izquierda a derecha) de modo que se aprovecha la estructura TWREG para efectuar un corrimiento de 4 bits a la derecha dejando el nibble de ceros a la izquierda y separar el dato en cada byte: el menos significativo se coloca en la trama a enviar tal cual mientras del más significativo sólo se toman los 4 bits con información y se juntan con los 4 bits más significativos del segundo ADC para formar un único byte que se agrega en la trama, de modo que la trama de envío queda de la siguiente manera:

(Número de secuencia)(byte LSB ADC1)(byte LSB ADC2)(byte nibble LS ADC1 + nibble LS ADC2)

   // Bucle principal
   for(;;){
      // recepción de datos de PC
      if(ktr_dataok==1){
        ktr_dataok=0;
        COM_RecvChar(&amp;captura);                      // Capturo caracter proveniente de la planta
        input_ClrVal();                              // inidico el inicio de proceso de conversión
        if(captura=='*'){                            // Bucle de medición (según la petición del PC)
          PWR_ClrVal();
        }
        if(captura=='P'){                            // Bucle de medición (según la petición del PC)
          PWR_SetVal();
          ktr_pantalla=0;
        }
      //lectura ADC,armando y envío de trama
      if((ktr_ciclo==1)&amp;&amp;(ktr_pantalla==1)){
         ktr_ciclo=0;                             // Si llego al tope de mediciones disparo variable de control del bucle
         PWR_ClrVal();
         TEST_ClrVal();
         (void)ENTRADA_Start();                   // Inicia la conversión ADC
         while(ktr_convert==0){}                  // Bucle de espera de fin de conversión
         ktr_convert=0;                           // Seteo bit de control de fin de conversión
         TEST_ClrVal();
         index=1;
         for(bkl=0;bkl&lt;NUMADC;bkl++){
            ADC_result[bkl].w=(unsigned short)((int)ADC_result[bkl].w&gt;&gt;4);
            traza[numtrama][index]=ADC_result[bkl].b.low;
            index++;
         }
         traza[numtrama][3]=(char)((int)(ADC_result[0].b.high&lt;&lt;4) | (int)ADC_result[1].b.high);
         traza[numtrama][0]=(byte)controlenv;
         tempomuestra++;
         numtrama++;
         if(numtrama&gt;=TESTERMAX){
            numtrama=0;
         }
Captura y ajuste de datos de ADC

Número de secuencia es un valor de 0 a 255 que se incrementa con cada trama y puede servir para sincronizar la entrada de datos así como para detectar eventuales pérididas de tramas. Como ejemplo tomemos la entrada hexadecimal: F1EE5A05, F1 correspondería al número de secuencia 241, EE indica que el byte menos significativo del ADC1 es 238, 5A indica que el byte menos significativo del ADC2 es 90 y 05 indica que el nibble más significativo del ADC1 es 0 y el del ADC2 es 5. Con esta información se pueden recuperar los valores originales de los dos ADC siendo estos para el ADC1=256*0+238=238 y para el ADC2=256*5+90=1370.

Durante el bucle for, el microcontrolador aun mantiene la lectura de entrada del puerto serie, de modo que si recibe una nueva trama de configuración de periodo de muestreo, este cambiará efectivamente al nuevo periodo. Sin embargo, es conveniente detener primeramente el envío de datos, por lo que al recibir el comando “P” el micro dejará de enviar los datos de las lecturas del ADC por el puerto serie.

// envío de trama
TEST_SetVal();
PWR_ClrVal();
index=0;
while(index&lt;4){
   while(k==0){
      bkl=COM_SendChar(traza[envio][index]);
      if(bkl!=ERR_TXFULL)k=1;
   }
   k=0;
   index++;
}
PWR_SetVal();
controlenv++;
envio++;
if(envio&gt;=TESTERMAX){
   envio=0;
}
Envío de Trama de datos

                        

  -Programa del PC en Processing.

Inicialmente se importa la librería de manejo de puerto serie y se definen las variables globales del programa.

import processing.serial.*;          // Carga la librería para el manejo de puerto serial
String portname = &quot;COM1&quot;;            // Puerto al que está conectado el microcontrolador
Serial puerto;                       // Objeto de puerto
PFont font;                          // Objeto de tipo de fuente
PrintWriter fichero;                 // Objeto de Archivo (Fichero)
char[] datosc=new char[13];          // Array de almacen de trama recibida en el puerto serie
int[] datos2=new int[17];            // Array de datos ajustados para guardar en archivo
int[][] pantalla=new int[700][2];    // Array para la visualización de datos en pantalla (ORIGINALES)
int[][] pantalla1=new int[700][2];   // Array para la visualización de datos en pantalla (MODIFICADOS A LA ESCALA)
int[] rgbbutton1={155, 245, 170};
// variables globales
int muestras;                        // Indica la ubicación donde se almacenará la muestra actual en el array pantalla1
int velmuestras= 5;                  // Indica el periodo de muestreo en ms
char inByte;                         // Almacena el byte recibido del puerto serie
int m;                               // Almacena el tiempo actual del programa
int index=0;                         // Index del array de datos de entrada del puerto
String tipocaptura=&quot;Iniciar Captura&quot;;// Mensaje de button1
boolean ktr_traza=false;             // Control de Inicio-fin de trama del puerto
boolean ktr_captura=false;           // Control de captura de datos del puerto
boolean ktr_incio=false;             // Control del inicio de captura de datos

// Constantes globales
int largew=660;                      // Largo de la ventana de la gráfica
int button1x=275;                    // Posición x del botón de inicio-fin
int button1y=309;                    // Posición y del botón de inicio-fin
int button1width=150;                 // Ancho del botón de inicio-fin
int button1high=27;                  // Alto del botón de inicio-fin

En la función setup() que se ejecuta una única vez al inicio del programa se especifican las dimensiones del diálogo de la aplicación, se carga el tipo de fuente para el texto, se crea el archivo con nombre “Datos_año_mes_día_hora_minuto_segundo.txt” donde se almacenarán los datos (quedará ubicado en la misma carpeta de la aplicación o el stech), se configura e inicia el puerto serie y se ordena el envío de datos al microcontrolador.

void setup() {
  println(Serial.list());
  println(&quot;limpiando matriz&quot;);
  for (int i = 0; i &lt;largew ; i = i+1) {          // inicializa las matrices de visualización de datos
    for (int j = 0; j &lt;2 ; j = j+1) {
      pantalla[i][j]=280;
      pantalla1[i][j]=280;
    }
  }
  println(&quot;OK&quot;);
  println(&quot;Configurando diálogo&quot;);
  size(700, 350);                                // Especifica las dimensiones del diálogo de la aplicación (define with y heigh)
  smooth();                                      // Activa el suavizado de imagen (activado por defecto)
  font = loadFont(&quot;Verdana-16.vlw&quot;);             // Carga el tipo de Fuente
  textFont(font);                                // Establece el tipo de fuente
  frameRate (60);                                // Establece el número de ejecuciones de draw() por segundo

  println(rgbbutton1);
  println(&quot;OK&quot;);
  println(&quot;Inicializando Variables&quot;);
  muestras=0;
  index=0;                                       // Crea fichero donde se almacenarán los datos
  fichero = createWriter(&quot;Datos_&quot; + str(year())+ &quot;_&quot; + str(month())+ &quot;_&quot; + str(day()) + &quot;_&quot; + str(hour()) + str(minute()) + str(second()) + &quot;.txt&quot;);
  println(&quot;Abriendo Puerto Serie...&quot;);
  puerto = new Serial(this, portname, 19200);    // El último valor es el BaudRate
  puerto.write(&quot;P&quot;);                             // Ordena parada de envío de datos al micro
  puerto.clear();                                // Limpia buffer del puerto
  println(puerto);
  println(&quot;OK&quot;);
  puerto.write(&quot;-&quot; + str(velmuestras) + &quot;+&quot;);    // Ajusto periodo de muestreo del microcontrolador
  puerto.write('*');                             // Ordeno reinicio de toma de muestras al microcontrolador
  puerto.buffer(1);                              // El buffer generará el evento SerialEvent al recibir un caracter
  println(&quot;OK&quot;);
  println(&quot;Ordenando datos al microcontrolador&quot;);
  ktr_incio=true;
}

La función draw(), que se ejecuta automáticamente si está establecida la función frameRate(), refresca los datos del diálogo redibujando el cuadro donde se visualizan los datos y llamando a la función grafiko() que se encarga de colocar los datos del array pantalla1 dentro de dicho cuadro.

void draw() {
  int w;
  background(204);                                                   // Redibuja el diálogo
  stroke(64, 64, 64);                                                // Establece el color utilizado para dibujar líneas y bordes alrededor de las formas
  fill(63, 102, 150);                                                // Establece el color de relleno del comando siguiente
  rect(15, 20, 670, 280);                                            // Ventana de visualización de la gráfica
  stroke(49, 65, 111);
  for (int k = 0; k &lt;=4 ; k++) {
    w=24+64*k;
    line(20, w, 680, w);                                             // Líneas de división horizontales de la gráfica
  }
  line(19, 24, 19, 280);
  line(680, 24, 680, 280);
  fill(rgbbutton1[0],rgbbutton1[1],rgbbutton1[2]);                   // Establece el color de relleno del comando siguiente
  rect(button1x, button1y, button1width, button1high);               // Dibuja un rectángulo de button1
  fill(0);                                                           // Establece el color de relleno del comando siguiente
  text(&quot;Datos Actuales: &quot; + datos2[1] + &quot;,&quot; + datos2[2], 22, 330);   // Escribe los datos obtenidos en el diálogo
  text(tipocaptura,button1x+10,button1y+20);                         // Escribe mensaje de Button1
  grafiko();                                                         // Actualiza la gráfica
  //puerto.write('*');
}

La función serialEvent() se ejecuta cada vez que se recibe en el buffer de entrada la cantidad de caracteres establecida en puerto.buffer(); en ella se efectúa el armado de la trama. Al completarse efectúa dos cálculos, uno tendiente a recuperar las mediciones del ADC1 y ADC2 que se almacenan en el archivo “Datos_…” y otro que modifica los datos del array pantalla1 para efectuar la visualización.  Al final envía por el puerto serie un carácter asterisco (“*”) para indicar el fin del proceso, esto para poder verificar externamente que se está completando el proceso de recepción.

void serialEvent(Serial puerto_serie) {
  if ((puerto_serie == puerto)&amp;&amp;(ktr_incio)) {
    inByte=puerto.readChar();
    if ((ktr_traza==false)) {
      index=0;
      ktr_traza=true;
    }
    if (ktr_traza==true) {
      datosc[index]=inByte;
      index++;
    }
    if (index&gt;=4) {
      ktr_traza=false;
      if (ktr_captura) {
        datos2[0]=datosc[0];// número de muestra.
        datos2[1]=datosc[1]+(datosc[3]&gt;&gt;4)*256;
        datos2[2]=datosc[2]+(datosc[3]&amp;15)*256;
        // Datos originales
        pantalla[muestras][0]=datos2[1];
        pantalla[muestras][1]=datos2[2];
        // Datos modificados para la visualización
        pantalla1[muestras][0]=280-int(datos2[1]&gt;&gt;4);
        pantalla1[muestras][1]=280-int(datos2[2]&gt;&gt;4);
        muestras=muestras+1;
        if (muestras&gt;=largew)muestras=0;
      }
      puerto.clear();
      fichero.println(datos2[0] + &quot;;&quot; + datos2[1] + &quot;;&quot; + datos2[2]);
      fichero.flush();
      //println(&quot;Trama Actual: &quot; +int(datosc[0]) + &quot;,&quot; + int(datosc[1]) + &quot;,&quot; +  int(datosc[2]) + &quot;,&quot; + int(datosc[3]) + &quot;.&quot; + &quot;   datos: &quot; +  int(datos2[1]) + &quot;,&quot; + int(datos2[2])+ &quot;.&quot;+ &quot;   tiempo: &quot; +  int(millis()-m)+ &quot;.&quot;);
      puerto.write('*');  // * indica que se recibió una trama correctamente y solicita la siguiente
      m = millis();
    }
 }
}

La función mousePressed() se ejecuta cada vez que se pulsa alguno de  los botones del ratón, si se orpime el botón derecho en el intervalo del botón de parada-inicio del diálogo, processing modificará el valor de la variable de control ktr_captura, de modo que si está en TRUE la aplicación captura y grafica los datos y si está en FALSE, los ignora y detiene dibujo y el almacenamiento.

void mousePressed() {
  println(&quot;mouseX: &quot;+mouseX +&quot; mouseY: &quot;+mouseY);
  if (mouseButton == LEFT) {                                                                                  // Eventos de click derecho
    if (mouseX&gt;=button1x&amp;&amp;mouseX&lt;=(button1x+button1width)&amp;&amp;mouseY&gt;=button1y&amp;&amp;mouseY&lt;=(button1y+button1high)) { // Evento del botón1 &quot;Conectar-Desconectar&quot;
      if (ktr_captura){
        ktr_captura=false;
        tipocaptura=&quot;Iniciar Captura&quot;;
        rgbbutton1[0]=155;rgbbutton1[1]=245;rgbbutton1[2]=170;
      }
      else {
        ktr_captura=true;
        tipocaptura=&quot;Detener Captura&quot;;
        rgbbutton1[0]=250;rgbbutton1[1]=255;rgbbutton1[2]=125;
      }
    }
  }
}

Finalmente dejo un sencillo video de la aplicación en operación para observar el resultado así como los códigos escritos.

Descargar programa en CodeWarrior para el microcontrolador.

Descargar programa en Processing para la captura de datos.

A partir de estas líneas de código es posible realizar aplicaciones más sofisticadas, como poder seleccionar el puerto de entrada, la velocidad de trasmisión de datos del microcontrolador o modificar el gráfico de visualización alterando a nuestro gusto las escalas de amplitud y periodo y colocando dichas escalas en la ventana. Espero que este post y este material sean de utilidad para proyectos de mayor alcance. Saludos y no olviden referenciarme.