sábado, 15 de diciembre de 2012

Hugo Cabret

Hugo Cabret.

Categoría: 4. Cine y literatura.

El imagianrio de Hugo Cabret, la película de Martin Scorsese en la que ese cuenta la historia del pequeño Hugo en los intrincados laberintos de la estación de tren de París, dando cuerda al reloj. Alrededor de su historia están las de Josh Méliés, iniciador de los efectos visuales en el cine, y la historia de un autómata que había sido propiedad del padre de Hugo y que necesitaba unas reparaciones para dibujar de nuevo y revelar un secreto importante para la vida de Hugo. La crítica que hace Fernanda Solórzano la pueden ver en http://www.letraslibres.com/revista/artes-y-medios/hugo-de-martin-scorsese, y contiene información bastante interesante al respecto.

Por lo pronto es todo, saludos.





viernes, 30 de noviembre de 2012

Algo sobre la poinsettia

Do you know poinsettia?

Categoría: 2. Ciencia y tecnología.

Había enfocado una vez el tema de los aportes tecnológicos de mesoamérica al resto del mundo en el momento de la conquista europea de estos territorios (http://maordbus.blogspot.mx/2012/11/algo-sobre-la-poinsettia.html). Así se puede hablar de varias especies de plantas que fueron domesticadas como el maíz, jitomate y tabaco. Algunos animales como el pavo o guajolote. Algunos procesos tecnológicos que fueron aprovechados durante la época colonial y aún en nuestros días, como el beneficio de los minerales utilizando sal en lugar de mercurio, lo que permitió la explotación temprana de oro y plata; la nixtamalización del maíz, que permite procesar este alimento a nivel industrial; la fermentación del aguamiel, que permitió el desarrollo de la industria de destilación de alcohol; la fabricación de chicle a partir de la savia del árbol Hevea brasilensis, que es una gran industria en la actualidad; la vulcanización también parece haber sido un proceso conocido en la fabricación de bolas de caucho para el juego de pelota y que en la actualidad se utiliza para la fabricación de neumáticos, una industria de grandes dimensiones hoy en día; el tabaco se utilizaba con fines ceremoniales y medicinales, y en la actualidad se ha fundado una gran industria alrededor de esta especie, además de que se han desarrollado variedades con propiedades sumamente sofisticadas por su aroma, uniformidad de combustión, serosidad, coloración del humo, entre otras, y alrededor de su uso hay todo un lenguaje de comunicación, de gran significación social.




Bueno, pues por estas fechas decembrinas no puede faltar una planta de nochebuena adornando las mesas y otros motivos navideños, no sólo en México sino en muchas partes del mundo. Su nombre científico, Euphorbia pulcherrima, proviene, en el caso del género, como referencia a la familia botánica a la que pertenece, que son las Euphorbiáceas, plantas caracterizadas por sus secreciones de savia lechosa y sus frutos ciatios característicos de las plantas de esta familia botánica, como los higos, los amates y los ficus. Y el nombre de su especie, pulcherrima, que es de origen náhuatl y hace referencia precisamente al aspecto lechoso de su savia, parecido al pulque.
En la página web teleflora (http://www.teleflora.com/poinsettia/flowers-plants/poinsettia-detail.asp) menciona en un pequeño texto varios datos de interés. Por ejemplo, su nombre en inglés, Poinsettia, proviene del primer embajador de Estados Unidos en México Joel Roberts Poinsett, quien era aficionado a la botánica y llevó esta planta a su país en el año 1825. En inglés se le conoce como 'christmas star' y 'christmas flower', esto por la particularidad de la forma de estrella de las hojas, llamadas bracteas, que rodean sus flores y de que florece precisamente en la época navideña en el hemisferio norte. Otros nombres que recibe esta planta son 'mexican flame leaf', 'winter rose', 'noche buena' y en Turquía 'Ataturk's flower', debido a que era planta favorita del fundador de la nación turca moderna Ataturk (Mustafa Kemal Atatürk, 1881-1938). La planta estaba asociada con buenos sentimientos y con la pureza por los aztecas en México, y en la actualidad también se le asocia con pensamientos nobles como el éxito, los buenos deseos y la celebración.




Sus flores se agrupan en inflorescencias cimosas y sus frutos son cápsulas. Su ovario o gineceo es súpero, lo que se aprecia claramente en la imagen que se muestra arriba de estas líneas. Las bracteas que rodean la inflorescencia cambian su coloración en respuesta al fotoperiodo, es decir, a la duración del día de menos de 12 horas. Su fruto es una cápsula o ciatio.

En la página web de CONABIO (http://www.conabio.gob.mx/malezasdemexico/euphorbiaceae/euphorbia-pulcherrima/fichas/ficha.htm) se puede encontrar una serie de nombres que recibe esta planta en distintas lenguas nativas de México, como Cuetlaxóchutl en náhuatl, que significa flor que se marchita. En la actualidad es una de las plantas ornamentales más importantes del mundo. En la página web de la Universidad de Purdue en Indiana, EU (http://www.extension.purdue.edu/extmedia/HO/HO-235-W.pdf) se puede encontrar un pequeño manual para la propagación industrial de la noche buena bajo condiciones de invernadero.


Me había quedado un poco pensativo con lo que comentamos sobre la propiedad intelectual en la producción de nochebuenas. Estaba pensando que una parte importante de la tecnología en la producción actual radica en la obtención de nuevas variedades, con colores novedosos. Eso se obtiene mediante la generación de líneas puras, es decir, poblaciones de plantas obtenidas por autopolinización por tres o más generaciones. De este modo, los pares de genes se hacen homocigóticos (NN para un gene dominante; nn para un gene recesivo); de esta manera se logra obtener poblaciones en las que los genes recesivos, normalmente ocultos, se expresen. Por eso ahora se tiene variedades con las brácteas color amarillo, rosado, rojo intenso, rojo claro, bracteas anchas, bracteas cortas, bracteas enchinadas y más. Después se hacen cruzamientos entre líneas obtenidas de variedades diferentes para obtener las combinaciones más vistosas entre color y forma de las brácteas, por ejemplo.



Bueno, digamos que todo esto es tecnología aplicada y podría considerarse, hasta cierto punto, secreto profesional. Pero existen en realidad pocos empresarios que cultiven nochebuenas que tengan la capacidad financiera, organizativa y cuenten con el personal calificado para hacer estas tareas de modo sistemático y cuidadoso, como se requiere. En todos esos procedimientos financieros, organizativos y prácticos radica la mayoría de los secretos profesionales de esta actividad. Por eso, la propiedad de los derechos de una variedad vegetal es una propiedad intelectual y quien se dedica a propagar comercialmente estas variedades debe pagar una regalía al creador de la misma.

Pero espero no abrumarte con estas ideas. De cualquier manera, existe una cantidad de normatividad al respecto. Y de hecho, el conocer de manera más o menos detallada toda esa normatividad (internacional y nacional) es en sí mismo una parte importante del capital humano de una empresa de mejoramiento genético. Es parte del secreto profesional de una empresa.

Saludos y hasta la próxima.






lunes, 22 de octubre de 2012

Diseño de un pulsador con C++

Diseño de un pulsador utilizando el circuito integrado NE555.

Categoría: 1. Programación y electrónica.

Se desarrolló un programa en C++ que calcula la frecuencia, el tiempo del ciclo o periodo (T, en s), el tiempo en HIGH (t1, en s) y el tiempo en LOW (t2, en s). Genera una tabla que se despliega en la consola de Visual C++ y al mismo tiempo genera un archivo, pulsda06.txt, con un formato separado por tabuladores. Este archivo de texto puede abrirse con el programa Excel, de manera que se pueden manejar sus valores para elaborar diferentes tipos de gráficos.
El diagrama del circuito es el siguiente:



Las ecuaciones de diseño según la hoja de datos para este circuito integrado son las siguientes:
t1 = 0.693*(RA+RB)*C
t2 = 0.693*(RB)*C
T = t1+t2 = 0.693*(RA+2RB)*C
f = 1.44 / (RA+2RB)*C
Output driver duty cycle = t1 / (t2+t1) = RB / (RA+2RB)

El programa se corre con un valor inicial de 2200ohm para Ra y termina con 10Mohm con incrementos de 50000ohm en cada ciclo. Para Rb se toma un valor inicial de 2200ohm y se incrementa en 1000ohm en cada ciclo. Se utilizó un capacitor de 2.2uF.
En el archivo de salida la primera columna corresponde al número de ciclo de cálculo, la segunda columna es el valor de Ra (ohm), la tercera columna es el valor de Rb (ohm), la cuarta columna es el valor de t1 (s), la quinta columna es el valor de t2 (s), la sexta columna es el valor de T (s), la séptima columna es el valor de f (s-1) y la octava columna es el valor del ciclo de trabajo (número fraccionario).
El código del programa es el siguiente:



// PulsadorNE555_04.cpp: define el punto de entrada de la aplicación de consola.
//
// PulsadorNE555_03.cpp: archivo de proyecto principal.
// despliega los valores de #corrida, Ra, Rb, t1, t2, T, freq y dutyCycle separados por punto y coma
// se trata que el archivo de texto pueda ser leido por el programa Excel con columnas
// separadas por tabulador

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>
using namespace std;

int main() {
 float t1;
 float t2;
 float Time;
 float freq;
 float dutyCycle;
 float Ra = 2200;
 float Rb = 2200;
 float c = 0.0000022;
 int caso = 1;
 ofstream out("D:\\pulsda06.txt");
 while (Ra < 10000000)  {
 t1 = 0.693*(Ra + Rb)*c;
 t2 = 0.693*Rb*c;
 Time = t1+t2;
 freq = 1/Time;
 dutyCycle = (Ra + Rb) / (Ra + 2*Rb);

 cout << caso;
 cout << ";\t";
 cout << Ra;
 cout << ";\t";
 cout << Rb;
 cout << ";\t";
 cout << t1;
 cout << ";\t";
 cout << t2;
 cout << ";\t";
 cout << Time;
 cout << ";\t";
 cout << freq;
 cout << ";\t";
 cout << dutyCycle;
 cout << ";\n";
 // escribeArchivo:
 if (!out)  {
  cout << "cannot open file...\n";
  return 1; }
 out << caso;
 out << "\t";
 out << Ra;
 out << "\t";
 out << Rb;
 out << "\t";
 out << t1;
 out << "\t";
 out << t2;
 out << "\t";
 out << Time;
 out << "\t";
 out << freq;
 out << "\t";
 out << dutyCycle;
 out << "\n";
 Ra = Ra + 50000;
 Rb = Rb + 1000;
 caso++;  }
 out.close();
 system("pause");
 return 0; }

Para este ejemplo se registran 200 ciclos de cálculo que quedan guardados en el archivo pulsda06.txt. Este archivo se abrió desde Excel donde se generaron tres gráficos que se muestran a continuación:


 Gráfico 1. Valores de t1 y t2 en función del valor de Ra
 Gráfico 2. Valor de la frecuencia en función de Ra
Gráfico 3. Valor del ciclo de trabajo en función de Ra

Con los datos generados se puede obtener para un ciclo de 1.04s, un ciclo de trabajo de 0.978, con duración de t1 de 1.018s y t2 de 0.022s. Para ello se requiere valores de Ra= 652200ohm y para Rb= 15200ohm. El valor de f será de 0.96 s^-1.

Por lo pronto es todo. Saludos y hasta la próxima.

Referencias bibliográficas:
2010. Texas Instruments. NA555, NE555, SA555, SE555. Data Sheet. USA.
1998. STMicroelectronics NE555, SA555, SE555. Data Sheet. USA.
2004. Applied digital circuits: 555 timer, analog to digital (ADC) and digital to analog (DAC) conversion (DAC). University of California at Berkeley. Physics 111 Laboratory. Basic semiconductor circuits. Lab 11 & 12. USA.
http://www.bgsu.edu/departments/compsci/docs/write.html








jueves, 6 de septiembre de 2012

Manejo de la micro SD del Shield Ethernet

Manejo de la micro SD del Shield Ethernet.

Categoría: 1. Programación y electrónica.

Se desarrolló un programa (C/C++) para tener juntas algunas instrucciones útiles en el manejo de los archivos contenidos en la tarjeta micro SD del Shield Ethernet de Arduino. Con base en algunos programas de ejemplo como dumpFile, cardInfo y readWrite se desarrolló un menú y las acciones leerArchivo, leerMicroSD y borrarArchivo se programaron como funciones. El monitor serial despliega el menú de opciones y el usuario introduce a través del mismo monitor serial la opción que desea que el programa ejecute. Se verificó cada una de las tres opciones del menú por separado, una vez que crrieron correctamente al cargarlas en la tarjeta Arduino se procedió a colocarlas en un programa único una a una, y teniendo cuidado de no sobrepasar el límite de almacenamiento de la tarjeta (32256 bytes). Para terminar, se verificó el programa completo (16598 bytes) y se cargó en la tarjeta electrónica.

El código es el siguiente:

#include <SD.h>
Sd2Card card;
SdVolume volume;
SdFile root;
const int chipSelect = 4;
void setup ()  {
  Serial.begin(9600);
  pinMode(10, OUTPUT);
  Serial.println("enter:\n 1. cardInfo\n 2. leerArchivo\n 3. borrarArchivo\n 0. Salir ");  }
 
void loop()  {
  if (Serial.available() > 0)  {
    char ch = Serial.read();
    if (ch == '1')  {
       cardInfo(); }
    else if (ch == '2')  {
       leerArchivo(); }
    else if (ch == '3')  {
       borrarArchivo();  }
    else if (ch == '4')  {  }
    else if (ch == '0')  {  }  }  }

void cardInfo ()  {
  Serial.print("\ninitializing SD card... ");
  if (!card.init(SPI_HALF_SPEED, chipSelect)) {
    Serial.println("initialization failed. Things to check:");
    Serial.println("* is a card is inserted?");
    Serial.println("* Is your wiring correct?");
    Serial.println("* did you change the chipSelect pin to match your shield or module?");
    return;  }
    else {
   Serial.println("Wiring is correct and a card is present.");  }
  Serial.print("\nCard type: ");
  switch(card.type()) {
    case SD_CARD_TYPE_SD1:
      Serial.println("SD1");
      break;
    case SD_CARD_TYPE_SD2:
      Serial.println("SD2");
      break;
    case SD_CARD_TYPE_SDHC:
      Serial.println("SDHC");
      break;
    default:
      Serial.println("Unknown");  }
  if (!volume.init(card)) {
    Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
    return;  }
  uint32_t volumesize;
  Serial.print("\nVolume type is FAT");
  Serial.println(volume.fatType(), DEC);
  Serial.println();
 
  volumesize = volume.blocksPerCluster();   
  volumesize *= volume.clusterCount();      
  volumesize *= 512;                        
  Serial.print("Volume size (bytes): ");
  Serial.println(volumesize);
  Serial.print("Volume size (Kbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);
  Serial.print("Volume size (Mbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);
 
  Serial.println("\nFiles found on the card (name, date and size in bytes): ");
  root.openRoot(volume);
 
  root.ls(LS_R | LS_DATE | LS_SIZE);  }


void borrarArchivo ()  {
  Serial.print("Initializing SD card...");
  if (!SD.begin(chipSelect))  {
    Serial.println("initialization failed!...");
    return;  }
  Serial.println("initialization done!...");
 
  if (SD.exists("pulsedat.txt"))  {
    Serial.println("pulsedat.txt exists...");  }
  else  {
    Serial.println("pulsedat.txt doesn't exist...");  }
  Serial.println("removing pulsedat.txt...");
  SD.remove("pulsedat.txt");
 
  if (SD.exists("pulsedat.txt"))  {
    Serial.println("pulsedat.txt exists...");  }
  else  {
    Serial.println("pulsedat.txt doesn't exist..");  }  }


void leerArchivo ()  {
  Serial.print("Initializing SD card...");
    if (!SD.begin(chipSelect))  {
      Serial.println("initialization failed!...");
      return;  }
  Serial.println("initialization done!...");
 
  File dataFile = SD.open("pulsedat.txt", FILE_READ);
  if (dataFile)  {
    Serial.println("pulsedat.txt exists...");
    while (dataFile.available())  {
      Serial.write(dataFile.read());  }
      dataFile.close();  }
  else  {
    Serial.println("error opening pulsedat.txt...");  }  }
     
De esta manera, se puede trabajar de manera más amigable con el programa presentado anteriormente como EjercicioPulseDat04 para el registro de pulsaciones generadas por un multivibrador astable construido con un circuito integrado NE555 (o NE556).

Es todo por ahora. Saludos.

La bibliografía contenida en la entrada 'registro de datos a una micro SD' también aplica para esta entrada, y es la siguiente:
Bibliografía.

Stengel, Lester. 2006. El ABC de la electrónica. Steren Electrónica SA de CV. México.
Arduino. Sitio web: http://www.arduino.cc/. Consulta el 31 de julio de 2012.







sábado, 1 de septiembre de 2012

Registro de datos a una micro SD

Registro de un generador de pulsos a un archivo de texto (pulsedat.txt).

Categoría: 1. Programación y electrónica.

El programa generador de pulsos funciona registrando los momentos en que un generador de pulsos, un botón pulsador conectado a una resistencia de 10K o, como en este ejercicio, un circuito electrónico generador de pulsos. Este circuito está basado en un circuito integrado NE555 o NE556.

El circuito astable es como sigue:



El programa EjercicioPulseDat04 lee la salida digital del vibrador astable (pin 3 en el NE555 o pines 5 o 9 del NE556), registra en el monitor serial los tiempos de encendido (HIGH) y de apagado (LOW) utilizando la instrucción millis(); y también registra el número de pulsos acumulado. De esta manera es posible medir el tiempo de duración en HIGH y el tiempo de duración en LOW.
Estos mismos datos se registran en un archivo llamado pulsedat.txt, almacenado en la tarjeta de datos micro SD contenida en el Shield Ethernet de Arduino. Como se sabe, esta tarjeta va acoplada con la tarjeta electrónica Arduino UNO.

Las siguientes imágenes muestran la salida en el monitor serial y la ventana del ambiente Arduino con parte del programa a la vista.





El programa se desarrolló tomando como base el ejemplo 'state change detection' (edge detection) que proorciona el ambiente Arduino para la tarjeta electrónica Arduino UNO. También se utilizó parte del código del ejemplo 'datalogger' para la tarjeta Ethernet Shield.

/*
EjercicioPulseDat04
*/
/*
  State change detection (edge detection)

 Often, you don't need to know the state of a digital input all the time,
 but you just need to know when the input changes from one state to another.
 For example, you want to know when a button goes from OFF to ON.  This is called
 state change detection, or edge detection.

 This example shows how to detect when a button or button changes from off to on
 and on to off.

 The circuit:
 * pushbutton attached to pin 2 from +5V
 * 10K resistor attached to pin 2 from ground
 * LED attached from pin 13 to ground (or use the built-in LED on
   most Arduino boards)

 created  27 Sep 2005
 modified 30 Aug 2011
 by Tom Igoe
This example code is in the public domain.

 http://arduino.cc/en/Tutorial/ButtonStateChange

 */
#include <SD.h>
const int  buttonPin = 2;   
const int ledPin = 13;      
int buttonPushCounter = 0; 
int buttonState = 0;       
int lastButtonState = 0; 
File dataFile;
void setup() {
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
  pinMode(10, OUTPUT);
 
    if (!SD.begin(4))  {
    Serial.println("card failed, or not present...");
    return;  }
  Serial.println("card initialized...");
 
  Serial.println("removing pulsedat.txt...");
  SD.remove("pulsedat.txt");
  if (SD.exists("pulsedat.txt"))  {
    Serial.println("pulsedat.txt exists...");  }
  else  {
    Serial.println("pulsedat.txt doesn't exist...");  }  }

void loop()
{
  buttonState = digitalRead(buttonPin);
  if (buttonState != lastButtonState)
  {
    if (buttonState == HIGH)
    {
      buttonPushCounter++;
      Serial.print("number of button pushes:  ");
      Serial.println(buttonPushCounter);
      Serial.print("time on= ");
      Serial.println(millis());
 
  dataFile = SD.open("pulsedat.txt", FILE_WRITE);
  if (dataFile) 
      {
    Serial.println("writing to pulsedat.txt...");
    dataFile.print("number of button pushes:  ");
    dataFile.println(buttonPushCounter);
    dataFile.print("time on= ");
    dataFile.println(millis());   
    dataFile.close();
    Serial.println("action done..."); 
      }
  else 
      {
    Serial.println("error opening pulsedat.txt"); 
      }   
    }
 
   
    else
      {
      Serial.print("time off= ");
      Serial.println(millis());
     
  dataFile = SD.open("pulsedat.txt", FILE_WRITE);
  if (dataFile) 
        {
    Serial.println("writing to pulsedat.txt...");
    dataFile.print("time off= ");
    dataFile.println(millis());
   
    dataFile.close();
    Serial.println("action done..."); 
        }
  else 
        {
    Serial.println("error opening pulsedat.txt"); 
        }
      }
 
  lastButtonState = buttonState;
  if (buttonPushCounter % 4 == 0)
      {
    digitalWrite(ledPin, HIGH);
      }
  else
      {
   digitalWrite(ledPin, LOW);
      }
  }
}
Este programa con algunas modificaciones puede adaptarse para medir variables de uno o más sensores (temperatura, humedad, presión atmosférica, intensidad lumínica, voltaje, etc) conectados a las entradas analógicas de la tarjeta electrónica.

Por lo pronto es todo. Saludos.

Bibliografía.

Stengel, Lester. 2006. El ABC de la electrónica. Steren Electrónica SA de CV. México.
Arduino. Sitio web: http://www.arduino.cc/. Consulta el 31 de julio de 2012.







domingo, 26 de agosto de 2012

Proyectos de electrónica con Arduino

Programas con Arduino UNO y Ethernet Shield.

Categoría: 1. Programación y electrónica.

En esta entrada se colocaron tres versiones de un ejercicio que emplea tres LEDs enviándoles pulsos de duración pre-establecida. El código del cuarto programa muestra la lectura de un archivo contenido en la tarjeta micro SD de la Ethernet Shield. Por último, el programa cinco borra el archivo contenido en la tarjeta micro SD de la Ethernet Shield.

Los primeros tres programas hacen parpadear tres LEDs colocados en una placa de prototipos (protoboard) con una resistencia de 470 Ohms en el polo positivo del LED conectadas a las salidas digitales 2, 3 y 4 de la Arduino UNO / Ethernet Shield. El polo negativo va conectado a tierra. En el tercer programa se muestra el empleo de una función con atributos para ahorrar en el tamaño del código (C/C++).
Los códigos de los primeros tres programas (con LEDs) son como sigue:

/*
Programa3leds03
Se utiliza la instrucción #define en la declaración de la salida
digital (asignación) en lugar de utilizar int ledPin=13;,
con lo que se ahorra en espacio de memoria
El programa hace parpadear tres LED sucesivamente
con pulsos de 250 milisegundos (con delay de 250 milisegundos)
Tamaño del sketch=1308 bytes de 32256 bytes disponibles
El formato de estos problemas tiene la ventaja de que la
inicializacion de las variables esta definida claramente y no se
modifica, por eso se facilita cambiar el pin que se utiliza
como salida y el cambio del tiempo de duracion del pulso
y la pausa
En este programa se utilizó una funcion para abreviar el codigo
dentro del void loop ()
 */

# define ledPin1 2
# define ledPin2 3
# define ledPin3 4
int delayPeriod = 250;

void setup ()  {
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);  }

void loop ()  {
  digitalWrite(ledPin1, HIGH);
  delay(delayPeriod);
  digitalWrite(ledPin1, LOW);
  digitalWrite(ledPin2, HIGH);
  delay(delayPeriod);
  digitalWrite(ledPin2, LOW);
  digitalWrite(ledPin3, HIGH);
  delay(delayPeriod);
  digitalWrite(ledPin3, LOW);  }

El código para el segundo programa es como sigue: 

  # define ledPin1 2
  # define ledPin2 3
  # define ledPin3 4
  int delayPeriod = 250;

  void setup ()  {
    pinMode(ledPin1, OUTPUT);
    pinMode(ledPin2, OUTPUT);
    pinMode(ledPin3, OUTPUT);  }

  void loop ()  {
    digitalWrite(ledPin1, HIGH);
    digitalWrite(ledPin2, HIGH);
    digitalWrite(ledPin3, HIGH);
    delay(delayPeriod);
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, LOW);
    digitalWrite(ledPin3, LOW);
    delay(delayPeriod);
    digitalWrite(ledPin1, HIGH);
    digitalWrite(ledPin2, LOW);
    digitalWrite(ledPin3, LOW);
    delay(delayPeriod);
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, HIGH);
    digitalWrite(ledPin3, LOW);
    delay(delayPeriod);
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, LOW);
    digitalWrite(ledPin3, HIGH);
    delay(delayPeriod);   
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, LOW);
    digitalWrite(ledPin3, LOW);
    delay(delayPeriod);  }

A continuación, el código para el tercer programa:

# define ledPin1 2
# define ledPin2 3
# define ledPin3 4

void setup ()  {
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);  }

void loop ()  {
  flash3Led(250, 300);
  flash3Led(100, 300);
  flash3Led(50, 300);
  flash3Led(25, 300);
  flash3Led(15, 300);
  flash3Led(10, 300);
  flash3Led(5, 300);
  digitalWrite(ledPin1, LOW);
  digitalWrite(ledPin2, LOW);
  digitalWrite(ledPin3, LOW);
  delay(2000);  } 

void flash3Led (int delayPeriod, int delayFinal)  {
    digitalWrite(ledPin1, HIGH);
    delay(delayPeriod);
    digitalWrite(ledPin2, HIGH);
    delay(delayPeriod);
    digitalWrite(ledPin3, HIGH);
    delay(delayPeriod);
    digitalWrite(ledPin1, LOW);
    delay(delayPeriod);
    digitalWrite(ledPin2, LOW);
    delay(delayPeriod);
    digitalWrite(ledPin3, LOW);
    delay(delayPeriod);
    delay(3000);  }

El cuarto programa despliega el contenido del archivo pulsedat.txt en el monitor serial. El archivo pulsedat.txt se genera con el programa ‘generador de pulsos’, que les compartiré más adelante.
El código es el siguiente:

/*
LeerArchivo01
El programa lee un archivo de texto de la SD card y lo
despliega en el monitor serial
*/

#include <SD.h>
const int chipSelect = 4;
void setup()  {
  Serial.begin(9600);
  Serial.print("Initializing SD card...");
  if (!SD.begin(chipSelect))  {
    Serial.println("initialization failed!...");
    return;  }
  Serial.println("initialization done!...");
   File dataFile = SD.open("pulsedat.txt", FILE_READ);
  if (dataFile)  {
    Serial.println("pulsedat.txt");
    while (dataFile.available())  {
      Serial.write(dataFile.read());  }
    dataFile.close();  }
  else  {
    Serial.println("error opening pulsedat.txt...");  }  }

void loop ()  {  }

Por último, el programa cinco de esta entrada borra el archivo pulsedat.txt, contenido en la tarjeta micro SD del Ethernet Shield. Si deseas conservar los datos, debes copiar el archivo a otra ubicación antes de borrarlo.
El código es el siguiente:

/*
BorrarArchivo01
El programa lee un archivo de texto de la SD card y lo
despliega en el monitor serial
*/

#include <SD.h>
const int chipSelect = 4;

void setup()  {
  Serial.begin(9600);
  Serial.print("Initializing SD card...");
  if (!SD.begin(chipSelect))  {
    Serial.println("initialization failed!...");
    return;  }
  Serial.println("initialization done!...");
   if (SD.exists("pulsedat.txt"))  {
    Serial.println("pulsedat.txt exists...");  }
  else  {
    Serial.println("pulsedat.txt doesn't exist...");  }
     Serial.println("removing pulsedat.txt...");
     SD.remove("pulsedat.txt");
   if (SD.exists("pulsedat.txt"))  {
    Serial.println("pulsedat.txt exists...");  }
  else  {
    Serial.println("pulsedat.txt doesn't exist..");  }  }

void loop ()  {  }

Los últimos dos ejercicios no requieren de hardware adicional a las tarjetas electrónicas Arduino. Por el momento es todo. Saludos.

Bibliografía.
Arduino. Sitio web: http://www.arduino.cc/. Consulta el 31 de julio de 2012.







sábado, 25 de agosto de 2012

Clichés, Estereotipos

Clichés, estereotipos.

Categoría: 3. Humanidades y comportamiento humano.

Los clichés son acciones, frases, comentarios, lugares, construcciones, bienes, alimentos y todo tipo de cosas que nos fuerzan a confrontar nuestras ideas con la realidad. Estas ideas pueden pertenecer al presente, al pasado o al futuro.


Si soy un individuo que decide hacer ejercicio los fines de semana para mantener una condición física mínima aceptable, es posible, además de lógico, que me encuentre en la pista de carreras junto con corredores experimentados, frente a los cuales me puedo sentir apabullado, sentirme como una caricatura respecto a la capacidad física de estos poderosos deportistas. Esto me puede llevar a replantearme la idea de hacer el ejercicio que estoy proponiéndome, es decir, a que confronte mi idea de hacer ejercicio para mantener la forma física y la salud. Este es un ejemplo de cliché sobre una acción presente.


Cuando decido comprar un automóvil para ir al trabajo y para utilizarlo como medio de transporte durante mis vacaciones, es posible escuchar comentarios de mis amigos y compañeros de trabajo respecto a los altos costos de mantenimiento y del combustible que consume un automóvil. Esto me puede llevar a cuestionarme sobre la conveniencia de tal adquisición, tomando en cuenta mi poder adquisitivo. Este es un ejemplo de un cliché sobre una acción futura.


Si hice un viaje en avión, es posible que a mi regreso, o un tiempo después me vea contando la historia de mi viaje y mientras tanto uno de mis interlocutores me platica que un amigo cercano o un familiar querido hizo un viaje en avión que tuvo un accidente en el que todos sus ocupantes murieron. Esto me puede llevar a pensar en la pena de quienes perdieron a un amigo o familiar en un accidente aéreo, mientras que yo pude vivir para contarlo. Desde luego, viajar en avión no es una actividad de alto riesgo, de manera que ¿Por qué debería sentir pena por haber viajado en avión? Este es un ejemplo de cliché sobre una acción pasada.


Los clichés son más o menos intensos según la sensibilidad de la persona y según la magnitud de la idea por confrontar. En algunas culturas o grupos sociales existen ejercicios que ayudan a sus integrantes a confrontar ideas de magnitud creciente, con la finalidad de fortalecer la sensibilidad de sus integrantes. Reunirse en torno a un sobreviviente de un accidente aéreo o a un sobreviviente de una guerra y escuchar sus experiencias durante estos acontecimientos ayuda a que se fortalezca el espíritu.


El texto de Óscar Domínguez Núñez y Elena María Barcellós Morante (http://civele.org/biblioteca/index.php?option=com_content&view=article&id=28:dominguez-o---la-cronica-periodistica-en-el-aula-de-ele-&catid=18:06aula&directory=2) menciona lo siguiente respecto a clichés y estereotipos:


“Los medios de comunicación y el estereotipo mantienen una estrecha relación desde su desarrollo en el siglo XIX. En esa época se fraguan los conceptos de “cliché” y de “estereotipo”, procedentes, respectivamente, del mundo de la fotografía y de la impresión industrializada. Ambas nociones comparten la función de proporcionar un molde fijo para reproducir una imagen o una página cuantas veces sea necesario.”


“El concepto de estereotipo se aplica a esquemas de pensamiento arraigados y preformalizados que son compartidos por miembros de una misma comunidad social. Entre las funciones que cumplen los estereotipos se destaca el papel que juega como fórmula extraordinariamente efectiva –y también afectiva- de reconocimiento y familiaridad sociocultural. En efecto, los estereotipos proporcionan un marco de seguridad ontológica para los miembros de la comunidad, reforzando la idiosincrasia particular de su identidad al tiempo que resaltan los rasgos de su singularidad entre el magmático flujo informativo de imágenes e informaciones a los que constantemente se hallan expuestos.”
De esta manera, los clichés son herramientas de una sociedad para reproducir su identidad en las generaciones de jóvenes.


Un concepto relacionado es la intelectualización. En Wikipedia se define de la siguiente manera:


“La intelectualización es un mecanismo de defensa, donde el razonamiento se utiliza para bloquear la confrontación con un conflicto inconsciente y su estrés emocional asociado, mediante el «uso excesivo de ideación abstracta para eludir sentimientos difíciles». Implica apartarse a uno mismo, emocionalmente, de un suceso estresante. La intelectualización puede estar acompañada, pero difiere de la racionalización, que es la justificación de la conducta irracional a través de clichés, historias y explicaciones oportunas. En lugar de confrontar los acontecimientos dolorosos, la intelectualización pretende analizarlos de forma indiferente y distante.”


“La intelectualización es uno de los mecanismos de defensa originales de Freud. Él creía que los recuerdos tienen aspectos tanto conscientes como inconscientes, y que la intelectualización permite el análisis consciente de un evento de una manera que no provoque ansiedad.”


“Anna Freud dedicó un capítulo de su libro El Yo y los Mecanismos de Defensa (1937) a la «Intelectualización en la Pubertad», al ver la forma como el «aumento intelectual, científico, y los intereses filosóficos de la época representan los intentos de dominar los impulsos y las emociones implicadas» como algo relativamente normal. A su juicio, sólo «si el proceso de intelectualización sobrepasa todo el campo de la vida mental» podría ser «entonces patológico».”


“Vaillant dividó los mecanismos de defensa en una jerarquía de «defensas inmaduras, defensas neuróticas y defensas maduras... siendo las inmaduras menos saludables que las neuróticas». Él coloca el proceso de intelectualización «que podríamos imaginar como un acto violento, sin los sentimientos violentos que normalmente le acompañan» entre las defensas "neuróticas" «...que suelen ser utilizados por personas de gama media».”


‘Los amigos del cine’ en su Blog (http://losamigosdelcine.blogspot.mx/ 2010/10/de-cliches-y-lugares-comunes-esta-lleno.html) hablan de los clichés como soluciones basadas en algo así como recetas de cocina, de las que no se apartan los directores que tratan el mismo género fílmico. En este Blog se habla de clichés como lugares comunes.


Erich Fromm en ‘El arte de amar’, también menciona que el lenguaje basado en clichés puede llegar a ser molesto y hasta hostil. Esto en referencia al concepto planteado inicialmente, en el que se considera que un cliché es una situación que confronta nuestra forma de pensar o de actuar.
En la realización de este ejercicio comencé por plantearme el concepto de cliché. Al ahondar en su significado llegué a un sinónimo que es el estereotipo. Sin embargo, el ejercicio alcanzó una meta más avanzada que lo planteado inicialmente al llegar al concepto de intelectualización, como un mecanismo de la mente que para eludir la confrontación de las ideas, planeada por los clichés, recurre al análisis de los acontecimientos dolorosos de forma indiferente y distante.

Por ahora es todo. Saludos.




Dado Electrónico

Dado electrónico con Arduino UNO.

Categoría: 1. Programación y electrónica.

En este ejercicio se construye un circuito electrónico con un display de siete segmentos con ánodo común. Las terminales (a, b, c, d, e, f y g) se conectaron a las I/O (2, 3, 4, 5, 6, 7 y 8) respectivamente. En la I/O número 9 se conectó un botón pulsador conectando un extremo al polo positivo (+5V), el otro extremo a una resistencia de 10K conectada a la terminal GND (tierra) de la tarjeta Arduino UNO. Los valores del uno al seis se despliegan simultáneamente en el display LED y en el monitor serial del ambiente Arduino. El monitor serial muestra además el estado de la entrada digital, el botón pulsador. Los números del uno al seis se despliegan 50 veces rápidamente (50 ms HIGH y 15 ms LOW). Durante esta etapa se aprieta el botón pulsador y el número seleccionado queda guardado en la variable optn. Al terminar el despliegue de la serie de números, el display LED muestra el número seleccionado (destellando 15 veces, 250 ms HIGH y 15 ms LOW) cuando se apretó el botón pulsador.

 
Figura 1. Display de LED, botón pulsador y placa Arduino UNO.

En el desarrollo del proyecto se comenzó con una primera versión del programa completo, aunque este no funcionaba correctamente pero sí era compilado. Después se construyó el circuito electrónico y se reinició la escritura del código. Primero haciendo encender y apagar cada uno de los segmentos del display y corrigiendo cualquier error en el hardware. Una vez que el hardware funcionó, se codificaron las funciones para generar los números (uno al seis). A continuación se estableció la comunicación con el monitor serial y la entrada digital a través del botón pulsador. Por último se desarrollaron dos fracciones de código, uno con la instrucción for, para seleccionar el valor a través del botón pulsador asociado a la asignación del valor para la variable optn y otra con la instrucción switch/case, para desplegar el valor seleccionado por la pulsación del botón.
Aunque el código que se presenta adelante es bastante extenso, es posible quitar partes que no intervienen directamente con el funcionamiento del dado. Las funciones para desplegar los números se repiten, cambiando únicamente los valores de la instrucción delay();. Como ejercicio, se puede quitar un juego de estos números colocando como argumentos de las funciones, las duraciones para la instrucción mencionada.

El código desarrollado para el proyecto es el siguiente:

/*
Un display LED de 7 segmentos despliega rápidamente números
del uno al seis. Se detiene cuando se presiona un botón
pulsador, mostrando el valor en forma estática.
Al pulsar nuevamente el botón pulsador vuelve a comenzar el
despliegue de números del uno al seis
Se utiliza la instrucción switch / case
*/

int a=2;
int b=3;
int c=4;
int d=5;
int e=6;
int f=7;
int g=8;
int pulsador=9;

void setup ()  {
  Serial.begin(9600);
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(c, OUTPUT);
  pinMode(d, OUTPUT);
  pinMode(e, OUTPUT);
  pinMode(f, OUTPUT);
  pinMode(g, OUTPUT);
  pinMode(pulsador, INPUT);  }


void loop ()  {
  digitalWrite(a, HIGH);
  delay(250);
  digitalWrite(a, LOW);
  delay(75);

  digitalWrite(b, HIGH);
  delay(250);
  digitalWrite(b, LOW);
  delay(75);

  digitalWrite(c, HIGH);
  delay(250);
  digitalWrite(c, LOW);
  delay(75);

  digitalWrite(d, HIGH);
  delay(250);
  digitalWrite(d, LOW);
  delay(75);

  digitalWrite(e, HIGH);
  delay(250);
  digitalWrite(e, LOW);
  delay(75);

  digitalWrite(f, HIGH);
  delay(250);
  digitalWrite(f, LOW);
  delay(75);

  digitalWrite(g, HIGH);
  delay(250);
  digitalWrite(g, LOW);
  delay(75);

  digitalWrite(a, HIGH);
  delay(200);
  digitalWrite(b, HIGH);
  delay(200);
  digitalWrite(c, HIGH);
  delay(200);
  digitalWrite(d, HIGH);
  delay(200);
  digitalWrite(e, HIGH);
  delay(200);
  digitalWrite(f, HIGH);
  delay(200);
  digitalWrite(g, HIGH);
  delay(200);

  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);

  int optn =0;

for (int i=0; i<50; i++)  {
  Uno();
  int valUno= digitalRead(pulsador);
  Serial.print(" 1 ");
  Serial.println(valUno);
  if (valUno == 1)  {
    optn =1;  }

  Dos();
  int valDos= digitalRead(pulsador);
  Serial.print(" 2 ");
  Serial.println(valDos);
  if (valDos == 1)  {
    optn =2;  }

  Tres();
  int valTres= digitalRead(pulsador);
  Serial.print(" 3 ");
  Serial.println(valTres);
  if (valTres == 1)  {
    optn =3;  }

  Cuatro();
  int valCuatro= digitalRead(pulsador);
  Serial.print(" 4 ");
  Serial.println(valCuatro);
  if (valCuatro == 1)  {
    optn =4;  }

  Cinco();
  int valCinco= digitalRead(pulsador);
  Serial.print(" 5 ");
  Serial.println(valCinco);
  if (valCinco == 1)  {
    optn =5;  }

  Seis();
  int valSeis= digitalRead(pulsador);
  Serial.print(" 6 ");
  Serial.println(valSeis);
  if (valSeis == 1)  {
    optn =6;  }  }

Serial.print("el valor de optn es: ");
Serial.println(optn);

switch (optn)  {
  case 1:  {
    UnoDisplay();
    break;  }
  case 2:  {
    DosDisplay();
    break;  }
  case 3:  {
    TresDisplay();
    break;  }
  case 4:  {
    CuatroDisplay();
    break;  }
  case 5:  {
    CincoDisplay();
    break;  }
  case 6:  {
    SeisDisplay();
    break;  }
  default:
    break;  }  }

void Uno ()  {
  digitalWrite(f, HIGH);
  digitalWrite(e, HIGH);
  delay(50);
  digitalWrite(f, LOW);
  digitalWrite(e, LOW);
  delay(15);  }

void Dos ()  {
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(d, HIGH);
  delay(50);
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(g, LOW);
  digitalWrite(e, LOW);
  digitalWrite(d, LOW);
  delay(15);  }

void Tres ()  {
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  delay(50);
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(g, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  delay(15);  }

void Cuatro ()  {
  digitalWrite(f, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(c, HIGH);
  delay(50);
  digitalWrite(f, LOW);
  digitalWrite(b, LOW);
  digitalWrite(g, LOW);
  digitalWrite(c, LOW);
  delay(15);  }

void Cinco ()  {
  digitalWrite(a, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  delay(50);
  digitalWrite(a, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  delay(15);  }

void Seis ()  {
  digitalWrite(a, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(c, HIGH);
  delay(50);
  digitalWrite(a, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
  digitalWrite(e, LOW);
  digitalWrite(d, LOW);
  digitalWrite(c, LOW);
  delay(15);  }

void UnoDisplay ()  {
  for (int i=0; i<15; i++)  {
  digitalWrite(f, HIGH);
  digitalWrite(e, HIGH);
  delay(250);
  digitalWrite(f, LOW);
  digitalWrite(e, LOW);
  delay(15);  }  }

void DosDisplay ()  {
  for (int i=0; i<15; i++)  {
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(d, HIGH);
  delay(250);
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(g, LOW);
  digitalWrite(e, LOW);
  digitalWrite(d, LOW);
  delay(15);  }  }

void TresDisplay ()  {
  for (int i=0; i<15; i++)  {
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  delay(250);
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(g, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  delay(15);  }  }

void CuatroDisplay ()  {
  for (int i=0; i<15; i++)  {
  digitalWrite(f, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(c, HIGH);
  delay(250);
  digitalWrite(f, LOW);
  digitalWrite(b, LOW);
  digitalWrite(g, LOW);
  digitalWrite(c, LOW);
  delay(15);  }  }

void CincoDisplay ()  {
  for (int i=0; i<15; i++)  {
  digitalWrite(a, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  delay(250);
  digitalWrite(a, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  delay(15);  }  }

void SeisDisplay ()  {
  for (int i=0; i<15; i++)  {
  digitalWrite(a, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(c, HIGH);
  delay(250);
  digitalWrite(a, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
  digitalWrite(e, LOW);
  digitalWrite(d, LOW);
  digitalWrite(c, LOW);
  delay(15);  }  }


Como se comentó al inicio, el desarrollo del proyecto se hizo mediante avances parciales hasta completar las funciones que se habían contemplado en el programa inicial. Con la diferencia de que el formato final funcionó correctamente.
El proyecto y el código correspondiente fueron desarrollados por Miguel Angel Orduña Bustamante en el año 2012. Saludos.