Aprendiendo a programar

Saberse las funciones y/o comandos de un lenguaje no es saber programar, es saber utilizar un lenguaje. Es como saberse el diccionario de inglés y no saber decir una frase, nos falta lo más importante, la gramática.
En este post intentaré explicar de forma sencilla como programar (no sólo en Arduino, el método vale para todos los lenguajes… o casi).

Básicamente, la programación consiste en dar una serie de pasos al ordenador para que éste los ejecute, de ahí la frase «El ordenador hace lo que le dices que haga y, en ocasiones, lo que quieres que haga».

¿Como le doy los pasos? Bueno, a los pasos, los informáticos nos gusta llamarlos algoritmos 🙂
Los algoritmos, funciones, procedimientos… todo esto nos suena a matemáticas, es cierto, la programación tiene un 90% de componente matemática… pero un 10% de componente artístico, que viene a ser el sello personal de cada programador.

Vamos a poner un ejemplo de algoritmo;

Ingredientes
3 cebollas
aceite
1 pizca de sal
receta
Ponemos el aceite a calentar en una sartén.
Cortamos las cebollas.
Si el aceite está caliente añadimos la cebolla 
añadimos sal y lo dejamos cocinar a fuego lento durante 5 minutos.

No, no se me ha ido la olla, es una receta, sí 🙂 a las recetas, las podemos llamar perfectamente «algoritmos» ya que un algoritmos es, ni más ni menos, una serie de instrucciones.

¿Te parece una comparación estúpida? Vamos a ver…
En programación, se usan variables que tienen un tipo definido, en nuestro caso, las variables son Cebollas, aceite y sal.
¿Qué tipo definido tienen cada una?¿Qué tienen que ver las cebollas con las matemáticas?
Vamos por partes, las variables en programación son ni más ni menos que un lugar en la memoria de un ordenador. Son variables porque en cualquier momento, puedes «variar» su valor, aunque no su tipo (tipo entero, tipo real… ). En nuestro caso, usamos 3 variables que definiríamos así:

int cebollas =  3; //usaremos 3 cebollas enteras, no me valen medias cebollas
float aceite = 0,25; //no podemos usar un aceite, tomamos la cantidad basándonos en el S.I. y usaremos 1/4 de litro (0,25l)
float sal; //¿cuanta sal necesitaremos?¿cuanto es una pizca? A veces este valor no podemos saber su cantidad exacta, por lo que se averiguará dentro del programa.

Tenemos definidos los componentes que vamos a usar, pero… ¿como los hemos de usar? Aquí entra en juego la recet… eeeh… el algoritmo:

receta:
Ponemos el aceite a calentar en una sartén.
Cortamos las cebollas.
Si el aceite está caliente, añadimos la cebolla, añadimos sal y lo dejamos cocinar a fuego lento durante 5 minutos.

Esto es muy abstracto, hay que definir mejor las cosas, tengamos en cuenta lo dicho de los computadores, yo le voy a decir lo que tiene que hacer, no lo que quiero que haga. Así pues, habrá que aproximar los dos extremos lo más posible.

Concretemos más la receta:

Ponemos el aceite a calentar en una sartén. //a veces, hay instrucciones que no hace falta definirlas más

Cortamos las cebollas. //¿Cuanto?¿un corte a cada cebolla? mejor así
-Cortamos las cebollas en pedacitos pequeños.

Si el aceite está caliente, añadimos la cebolla, añadimos sal y lo dejamos cocinar a fuego lento durante 5 minutos.
//¿Y si el aceite no está todavía caliente?
-Esperamos a que el aceite esté caliente. //ok, ¿y ahora?
echamos la cebolla y añadimos sal
//¿cuanta sal?¿medio kilo?¿Y luego quien se come la cebolla?
Echamos la cebolla y lo probamos.
mientras no está al punto de sal, echamos una cucharadita de sal y probamos
//las máquinas son estúpidas, ¿y si echamos la sal en el centro y probamos su sabor en el borde?
Echamos la cebolla y lo probamos.
-mientras no está al punto de sal, echamos una cucharadita de sal, removemos la cebolla y probamos. //mejor así, ¿no crees?
-Lo dejamos cocinar a fuego lento durante 5 minutos //podríamos complicarlo más, pero lo dejamos aquí

Ahora vamos con un problema de programación y dejamos estar de cocina, que si no, nos entrará hambre 🙂

Queremos hacer un termómetro que, según la temperatura, varíe el ángulo de un brazo movido por un servo.
Disponemos de:
1 sensor de temperatura LM335
1 servo
1 arduino

Estos elementos, para el programa no son importantes. Bueno, sí pero no, el servo y el sensor hacen su papel en este caso, pero si no metemos un algoritmo que los controle, tenemos trastos caros que no usamos para nada.

Vamos a suponer que está todo cableado y calibrado, y pasamos directamente al programa, este es el montaje del termómetro:

//este programa está basado en el ejemplo Knob del IDE Arduino
//vamos a verlo como si fuera la receta:
//ingredientes:
#include  "Servo.h" //librerias que vamos a utilizar

Servo miServo; //aquí definimos una variablede un objeto (de momento no liemos más el asunto, digamos que es un tipo de variable con propiedades), en este caso es un servo
int temperatura; //es tipo int porque la vamos a leer a través del conversor A/D
int sensor = 0; //conectaremos el sensor LM335 al pin analogico 0

void setup() //esto equivaldría a poner el aceite a calentar, necesitamos definir ciertas cosas
{
miServo.attach(9); //vamos a conectar el servo al pin 9 del arduino
}

void loop() //receta:
{
temperatura = analogRead(sensor); //hacemos la lectura del valor del sensor
temperature = map(val, 0, 1023, 0, 179); cambiamos el valor del conversor a grados para el servo
miServo.write(temperatura); //le decimos al servo cuanto tiene que girar (para indicar la temperatura
delay(15); //esperamos un poco para volver a empezar (desde el loop)
}

Consejos para programar:
-Empieza poco a poco, no quieras hacer un robot dominador del mundo sin saber utilizar un servo, por ejemplo.
-No uses nombres aleatorios para las variables, si al sensor lo llamas s1 y al servo s2, imagina juntar 6 sensores y 6 servos, un jaleo, mejor usar nombres descriptivos, como no puedes poner nombres separados con espacios, usa mayúsculas en las palabras (miservo, sensorTemperatura).
-No tengas miedo a preguntar en foros, pero no pretendas que e resuelvan todo, la idea es tuya, así que hazla tu.
-Busca ejemplos parecidos y reutiliza código, a veces quieres hacer algo complejo y otros lo han resuelto de forma sencilla.
-Comenta el código como si lo tuviera que leer tu hermanito/hijo de 6 años, dentro de unos meses, al volver a leer el código, lo agradecerás.

En este tutorial no pretendo enseñar a hacer un termómetro, sino a ayudar a pensar en cómo crear el programa que lo controle.
No pretendo ser una ayuda a informáticos y/o electrónicos, esos ya saben programar y, de hecho, me dirán que este tuto es una basura porque me dejo muchas cosas. Considero que para alguien que no tiene conocimientos de programación, como una introducción a ella es más que suficiente.
También te dejo a tí, si estás interesado en ello, que busques información en www.arduino.cc sobre las funciones, comandos y objetos que implementa Arduino.

Este tutorial lleva una dedicatoria especial, a Gloria Martinez Vidal (Glo), profesora de la UJI y una gran amiga, fallecida en 2009. He tomado el ejemplo de pochar cebollas de una de sus clases como introducción.
También he de agradecer a Pablo, chico que conocí en la OSHWCon 2011 que fue el que me preguntó cómo programar (no es electrónico ni informático, o sea, de programar 0) y le estuve explicando con este mismo ejemplo. Gracias a ello, me he decidido a sacar este tutorial.

18 comentarios en «Aprendiendo a programar»

  1. Mejor Explicado No Pudo Estar’, ‘Saludo !!!

    Gracias Pepe..

    Ahora entiendo la esencia de aprender a programar.

    Lo que tu dices de los foros es cierto, sin embargo hay personas que no te saben orientar o te dicen las cosas de tal forma que te cortan las alas. 🙁 😳
    sobre todo cuando somos personas que no tenemos estudios de electrónica ni de programación.

    Nuevamente Mil Gracias.

  2. Muchas gracias, me alegro que os haya servido de introducción, ya veis que no entro en detalles técnicos, sino solo me pongo a explicar (muy por encima) como crear unos pasos a seguir.

  3. Cuanto más sencillo se haga mejor, mas comprensible para todos.
    La gente que no tiene conocimientos de programación ve el código como algo misterioso e incomprensible y muchos se desaniman nada más empezar por que creen que no serán capaces de aprender.
    Pochar cebollas es fácil, cualquiera puede hacerlo, lo mismo que programar.

    Gracias Pepe.

  4. hola me parece estupendo ,la explicacion que as dado ,yo soy un negadopara esto de la programacion ,pero me encanta y espero de aqui algunos meses poder hacer mis codigos que lo mio me va a costar

    tambien estoy de acuedo con gatoloco 65

  5. hola no se si aqui me respondereis a esto el caso que yo leo y leo pero no termino de entender
    supongamos que no tengo conocimiento de c++ y quiero a prender a programar
    por donde tengo que empezar y como
    para iniciarme
    salu2

  6. Bueno, tazma, para empezar a programar, se necesita saber un poco de todo, tienes que saberte qué instrucciones (comandos) tiene un lenguaje, esa parte es fija, todos los lenguajes tienen sus palabras reservadas.

    Yo lo que he intentado explicar es cómo transmitirle al ordenador lo que quieres que haga. Recuerda esto, el ordenador hace lo que tu le dices que haga y, en ocasiones, lo que quieres que haga

    El no tener conocimiento de un lenguaje de programación no es impedimento, el no saber programar sí. Esa es la esencia de este artículo, por la cual he explicado una leve introducción a la programación. Si quieres aprender a programar, lo siento, no hay una fórmula mágica, es como escribir un libro, tienes una historia que contar (el programa) para que alguien la reproduzca (el ordenador, o en el caso de un libro, tu imaginación).

    Poco a poco iré poniendo pequeños programitas explicados, la intención es continuar con estos tutoriales, te invito a ser mi «alumno», si te sirven de algo, ambos iremos avanzando 🙂

  7. hola gracias por el comentario
    y acepto la invitacion de ser tu alumno con mucho gusto
    a la espera de mas tutoriales
    gracias

  8. A, proposito de empezar a saber programar ¿admites un segundo alumno? gracias de antemano, he empezado por el ejemplo «blink» y tengo serios problemas con el ejemplo. asi que si hay ayuda me vendra de perlas. Un saludo

    1. ¡Claro que sí! dime, ¿qué problemas tienes?
      Este es el blink;

      void setup() {
      pinMode(13, OUTPUT); //defines el pin 13 como salida (para encender el led de la placa)
      }

      void loop() { //esto significa que se va a repetir siempre
      digitalWrite(13, HIGH); //escribimos un high (valor alto) en el pin 13
      delay(1000); //esperamos 1000 milisegundos (1 segundo)
      digitalWrite(13, LOW); //escribimos un low (valor bajo) en el pin 13
      delay(1000); //esperamos otros 1000 milisegundos (1 segundo)
      }

  9. Muchas gracias¡¡¡ tu aporte me ha dado ese empujón necesario ya no me hace ver el codigo como un galimatias.

Responder a PepeChorva Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *