You are on page 1of 32

N 0 8 - D IC 2 0 1 2 VisitenuestroKickstarter http://kck.st/TvkdvGpara MagPiimpresas!

Una Revista para Usuarios de Raspberry Pi

Atrapa a Pap Noel utilizando la domtica E n est e


Gana una Raspberry Pi de 512MB E n est e n me r o . . .

The MagPi les desea Fe l i z N a v i d a d

S ku t t er N an p y P i G au g e P ib o w C E S IL P i C ++ Ada M yS Q L P y t h o n P it

h httttp p::///w ww ww w..tth he em ma ag gp pii..c co om m


Raspberry Pi es una marca registrada de The Raspberry Pi Foundation.

Bienvenidos a la octava edicin de la revista The MagPi, Es Navidad! En esta edicin esperamos atraerlos con algunos proyectos festivos para probar despus de atiborrarnos hasta el borde con pudn de Navidad. En la edicin de este mes, presentamos un proyecto de domtica sencillo que le permite controlar luces y aparatos de su casa utilizando el poder de nuestra Pi! Justo a tiempo para atrapar a Pap Noel! Ponemos su proyecto Skutter en marcha con el artculo de Morphy sobre agregar ruedas a la base. Gordon nos ensea cmo iluminar un rbol de Navidad, tenemos ms sobre el uso de Pi para controlar un Arduino y Ben describe cmo controlar servomotores conectados al Pi usando Internet! Si esto no es suficiente tenemos ms de los viejos favoritos, adems de una introduccin a SQL. Como siempre, tenemos grandes regalos que puedes ganar en nuestra revista mensual. The MagPi quiere darles nuevamente las gracias a los proveedores de PC que este mes se han superado ofreciendo hasta un Raspberry Pi de 512 MB en juego! Adems de esto, este mes te tenemos buenas noticias. A partir del 1 de diciembre, en The MagPi, nos emociona poder ofrecer a nuestros lectores la posibilidad de una versin impresa de los ocho nmeros de la revista! Esto es algo que nos piden constantemente nuestros lectores. Los ocho nmeros sern envueltos prolijamente en una carpeta de edicin limitada produciendo un gran regalo para usted o algn ser querido de cualquier edad. Para obtener ms informacin por favor visite (www.kickstarter.com/projects/themagpi/themagpimagazinefromvirtualtoreality) En nombre de todo el equipo, gracias nuevamente por todo su apoyo. Esperamos que tengan una fantstica Navidad y nos vemos en el Nuevo Ao (1 de febrero).

Ash Stone Editor Jefe de The MagPi.

MagPi team
Ash Stone Editor Jefe / Administrador Chris 'tzj' Stagg Redactor / Fotgrafo / Diseador Colin Deady Redactor / Diseador Jason 'Jaseman' Davies Website / Diseador Matt '0the0judge0' Website / Administrador Meltwater Fotgrafo / Diseador / Admin. Aaron Shaw Diseador / Grficos Ian McAlpine Diseador / Grficos Lix Diseador / Grficos Sam Marshall Diseador / Grficos W. H. Bell Diseador

Redactores Invitados
Bodge N Hackitt Redactor Geoff Johnson Redactor Andrea Stagi Redactor Ben Schaefer Redactor Gordon Henderson Redactor Alex Kerr Redactor Luke Guest Redactor Richard Wenner Redactor

Contenidos
04 EL RETORNO DEL SKUTTER Sacar la caja de herramientas para la siguiente apasionante instalacin, por Bodge N Hackitt 08 AUTOMATICE SU CASA ATRAPE A PAP NOEL Navidad de los 70 usando el lenguaje de programacin CESIL, por Gordon Henderson 11 CONCURSO MENSUAL Gane una Raspberry Pi Model B de 512 Mb, por PC Supplies UK 12 CONTROLA TU ARDUINO CON PYTHON Y RASPBERRY PI La potencia de Raspberry y la simplicidad de Arduino utilizando Nanpy, por Andrea Stagi 14 PI GAUGE Controle servomotores a travs de internet, por Ben Schaefer 17 PROMOCIN DE LIBROS GETTING STARTED WITH PYTHON El nuevo libro de Simon Monk's cubre el uso bsico y avanzado de GPIO con ejemplos en Python. 18 ENTREVISTA A PIBOW Una entrevista con los diseadores de la carcasa PiBow, por Chris Stagg 20 ARBOL DE NAVIDAD ACCIONADO POR CESIL Christmas from the 70's using the CESIL programming language, by Gordon Henderson 22 BIENVENIDO A LA CACHE DE C++ Utilizando variables y cadenas STL, por Alex Kerr 24 COMENZANDO ADA La segunda entrega de nuestro tutorial de programacin Ada, por Lucas A. Guest 26 CAMPAMENTO DE BASES DE DATOS Hinque los dientes en el Lenguaje Estructurado de Consulta (SQL), por Richard Wenner 29 LISTA DE EVENTOS DEL MES Encuentros Raspberry y otros eventos de la comunidad 30 EL TALLER DE PYTHON Creacin de mltiples widgets de escritorio, por Colin Deady 32 PREGUNTAS Y COMENTARIOS

Agregando un chasis motorizado


Dificultad: Avanzado. Un puente H de conmutacin simple
En el artculo pasado observamos algunos medios fsicos para aadir motores a un robot y hemos investigado la adaptacin de juguetes electrnicos motorizados como recurso potencial para el chasis de un robot. En este artculo comenzar explicando cmo puedes construir tu propio circuito de control para un motor elctrico de corriente contnua (DC) y escribir un programa bsico para manejarlo. Comenzaremos examinando el motor de corriente contnua estndar que explicamos en el artculo anterior. Para hacer que el motor corra hacia adelante aplicamos una fuente de potencia entre los terminales + y del mismo, y para que corra en reversa, simplemente intercambiamos los terminales de la fuente en posicin inversa. El mdulo de control del motor que vamos a construir necesitar ser un circuito que permita realizar electrnicamente dicha conmutacin en los terminales de la fuente de alimentacin . Esto se puede lograr usando un circuito conocido como puente H.

Parte 2
positivo de la fuente con el positivo del motor mientras que el terminal negativo del motor se conecta a tierra, y el motor corre hacia adelante. Por el contrario, cerrando los interruptores 3 y 4 conectamos la tierra al terminal positivo del motor y el positivo de la fuente al negativo del motor, y ste entonces corre en reversa. Existe una situacin potencialmente peligrosa si los interruptores 1 y 4 o 2 y 3 son cerrados al mismo tiempo. Esto puede provocar un cortocircuito entre la fuente y la tierra que puede ser como mnimo muy problemtico. Debemos cuidar que esta situacin nunca suceda cuando usamos este circuito. En realidad, no podemos usar cuatro interruptores fsicos de encendido / apagado de esta manera ya que tenemos que controlar el circuito usando el GPIO de la Raspberry Pi. Existen soluciones electrnicas para esto. Una posibilidad es utilizar rels electromagnticos para cerrar los interruptores. Sin embargo la Raspberry Pi no es capaz de entregar suficiente potencia desde el GPIO para activar directamente estos rels sin colocar en el medio del camino, al menos un transistor. Esto nos conduce a la segunda posible solucin que consiste simplemente en usar algunos transistores como interruptores.

Transistores como interruptores


El transistor, podra decirse que es la invencin electrnica ms importante jams creada. Su desarrollo es el responsable de todo, desde los reproductores porttiles de msica hasta el procesador utilizado en la Raspberry Pi.

Este diagrama muestra una versin simplificada de dicho circuito. Cerrando los interruptores 1 y 2 conectamos el terminal

Vamos a utilizar transistores NPN. Estos dispositivos poseen tres terminales llamados base, colector y emisor. Conectando una fuente de potencia a travs del colector y el emisor permite que el transistor pueda ser utilizado como interruptor. Sin una conexin en la base, la resistencia interna del transistor es extremadamente alta y el interruptor est apagado. Si aplicamos una corriente en la base del transistor, la resistencia interna se reduce un valor proporcional y una mayor cantidad de corriente puede fluir del colector al emisor. El transistor es capaz de variar su resistencia interna muy rpidamente, decenas de miles de veces por segundo (es sta caracterstica la que permite a los transistores ser usados como amplificadores). La cantidad de corriente necesaria para afectar la resistencia interna del transistor est definida por una proporcin conocida comoganancia de corriente DC y se simboliza h FE. En nuestro caso queremos suministrar una corriente a la base que haga que la resistencia interna sea igual a cero justo como un interruptor cerrado. Esto se denomina estado de saturacin del transistor y existe una ecuacin que nos dice la cantidad de corriente que necesitamos aplicar a la base para que esto suceda,
IB = IC / hFE

la cantidad de corriente que requiere el motor cuando el chasis del robot est rodando por el suelo. Una manera de obtener esta medida con exactitud es hacer que el chasis ruede por el suelo y medir la corriente que est siendo demandada. Aqu est el mtodo que us con mi Big Trak: Conecta el multmetro en serie entre la batera/s o fuente de potencia y uno de los motores en el Big Trak.

donde Ic es la la corriente en el colector e IB es la corriente en la base. Con el fin de averiguar cual es esta corriente, es necesario medir la corriente consumida por el motor. Esto significa que necesitamos hacer un experimento! Para ello necesitars tu chasis motorizado (en mi caso es el Big Trak modificado), una fuente de potencia (algunas bateras) y un multmetro. Si no tienes un multmetro todava, estos son una herramienta esencial para cualquiera que se involucre en electrnica ya que permite tomar un amplio rango de medidas incluyendo voltaje, intensidad de corriente, resistencia, capacitancia y h FE. Los motores de corriente contnua consumen diferente cantidad de corriente bajo diferentes condiciones. Si el motor gira libremente entonces necesitar una cantidad de corriente comparativamente menor. Alternativamente, un motor detenido (un motor que esta un poco impedido de girar) demanda una cantidad de corriente extremadamente alta. Cuanto ms trabajo le pidamos al motor, mayor corriente demandar. En nuestro caso vamos a medir

El segundo motor tambin debe estar conectado a la fuente de potencia y activo, de otra manera tendremos un solo motor tratando de impulsar el Big Trak y por lo tanto la medida resultara inexacta. De todas maneras solo necesitaremos medir la corriente empleada por uno solo de estos motores idnticos. Aade algo de peso al Big Trak para que se aproxime al peso esperado para el robot terminado. En el caso del Skutter esto incluye aadir el brazo del robot. Completa el circuito entre el motor y las bateras, incluyendo los terminales del multmetro en serie, como se ve en la figura. Mientras el Big Trak rueda por el suelo, toma una medida de la corriente que est demandando el motor. Bajo la carga prevista para el Skutter usando este mtodo, uno de los dos motores del Big Trak necesita una corriente de 2.5 amperios. ATENCIN: Cuando se prob con un motor reductor la corriente consumida fue de aproximadamente 20 amperios.

Eligiendo el transistor correcto.


Cada transistor tendr una corriente en el colector; sta corriente es igual a la corriente demandada por los motores. Esto era 2.5 amperios para el Big Trak (pero obviamente ser diferente si ests utilizando otros motores

en tu robot). Ahora necesitamos encontrar algunos transistores que funcionarn como interruptores cuando est pasando esta corriente. Considera una vez ms la ecuacin de saturacin del transistor: I B = I C / h FE Dos de los valores en esta ecuacin ya son conocidos. Tenemos 2.5 A para Ic y sabemos que cualquier pin en el GPIO de la Raspberry Pi es capaz de entregar un mximo de 1 5 mA ( o 0.01 5 amperios). Necesitamos averiguar un valor mnimo para hFE (ganancia de corriente) para estos dos valores y esto puede ser realizado reordenando la ecuacin: h FE = I C / I B Para que un transistor sea capaz de operar como interruptor de un motor de Big Trak usando el GPIO como disparador esto sera: h FE = 2.5 / 0.01 5 Por lo tanto, un transistor con una ganancia de corriente de al menos 1 67 es necesario. Adems, el transistor debe ser capaz de manejar 2.5 amperios. Por perodos muy cortos de tiempo el circuito que diseamos debe ser tambin capaz de manejar tanto como 20 amperios que el motor puede demandar si trabaja forzado. Uno de estos transistores es un BCU81 (RS Components 21 7-81 99) que puede manejar una corriente contnua de 3 amperios y tiene una ganancia de corriente mnima (hFE) de 21 0.

es necesario y este clculo en particular es muy simple. Un valor de resistencias disponible comnmente es, 270 Ohms. Usando este valor en vez de los 275 Ohms antes calculados tiene efectos despreciables sobre la corriente del GPIO, luego por simplicidad es aceptable el uso de dicha resistencia.

Un circuito transistorizado controlador de motores


El transistor BCU81 tiene una ganancia de corriente de 21 0. Esto significa que debemos entregarle solo 1 2 miliamprios desde la GPIO: IB = IC / Hfe 2.5 / 21 0 = 0.01 2 Podemos utilizar una resistencia en serie con la salida del GPIO para limitar la corriente y asegurarnos que solo 1 2 mA llegarn al transistor. Para encontrar el valor de dicha resistencia utilizamos la ley de Ohm: Resistencia = Voltaje / Corriente. El GPIO usa 3.3 voltios (referidos como 3v3) entonces podemos usar estos datos para encontrar el valor que necesitamos para la resistencia: 3.3 / 0.01 2 = 275 Ohms. Por lo general se necesita factorizar una posible cada de tensin en esta ecuacin, pero como el transistor en estado de saturacin no posee cadas de tensin apreciables esto no

Este es entonces un circuito controlador de motor puente H para Raspberry Pi ( hay una advertencia de seguridad que debemos tener sin embargo, toma nota de esto al final del artculo). Hay cuatro diodos agregados que estn orientados en sentido inverso al flujo de corriente. Esto es porque un motor de corriente contnua tambin genera una cantidad de corriente, especialmente cuando es apagado. Esto es conocido como corriente de retroceso y puede ser suficientemente alta para daar el transistor. Teniendo estos diodos con polarizacin inversa permite el escape en forma segura de cualquier retroceso de corriente. Pods usar este circuito si ests usando el mismo modelo de Big Trak, y si ests utilizando un chasis con motores diferentes, adapta los clculos descriptos anteriormente y encuentra las resistencias y transistores adecuados. Un aspecto importante de este circuito es que la tierra de la Raspberry Pi se comparte con la tierra de la fuente de potencia de los motores. Teniendo una tierra comn como esta significa que podemos tener dos dispositivos independientes, que son alimentados con dos fuentes de potencia diferentes, y an as funcionar electrnicamente en forma conjunta. Finalmente podemos ver que para impulsar el motor hacia adelante debemos encender los

pines 1 y 2 del GPIO, mientras que para que el motor funcione en reversa debemos encender los pines 3 y 4 del GPIO. El artculo Control de Entrada en MagPi contiene la informacin necesaria para programar este comportamiento y si ests construyendo el circuito puedes considerar el diseo del programa como desafo para el mes que viene! Si, como yo, ests construyendo un robot diferente que utiliza dos motores, entonces necesitars dos circuitos como este, uno para cada motor. Esto significa que en total vas a estar utilizando hasta ocho pines del GPIO lo cual no deja muchas entradas y salidas libres para el resto del robot.

al lmite de seguridad absoluto de operacin. Con el fin de utilizar cualquier otra salida ser necesario antes configurar todas las salidas del GPIO al puente H en baja para permitir que la corriente sea entregada con seguridad en otra parte. Finalmente, ya que la corriente que puede entregar el GPIO es relativamente baja necesitamos un transistor con un alto valor de ganancia de corriente hFE y que adems pueda tolerar 3 amperios. Este tipo de transistores son opciones poco econmicas!.

Qu sigue ahora?
En el prximo artculo voy a describir una tcnica que permite incrementar notablemente el nmero de pines del GPIO de tu Raspberry Pi utilizando un chip de bajo costo llamado MCP23008 y el bus I2C. Este mtodo resuelve el problema de la limitacin de corriente y permitir a tu robot tener muchas ms entradas y salidas, adems nos permitir usar transistores ms baratos, con valores ms bajos de ganancia de corriente hFE en nuestro circuito.

Advertencia de seguridad.
En cualquier momento en que los dos motores estn funcionando, habr cuatro pines del GPIO entregando cada uno 1 2 miliamperios. Esto suma un total de 48 miliamperios. La corriente mxima que puede entregar todo el cabezal GPIO en cualquier momento es de 51 miliamperios. Controlar directamente el puente H desde los pines del GPIO es una situacin muy cercana

BasicGPIOHBridgeControl.py :
#! /usr/bin/python import time import RPi.GPIO as GPIO

#----------------------------IMPORTANT -----------------------------#IF GPIO 0, 1 is "1" THEN GPIO 2, 3 must be "0" ELSE transistor short circuit ! #-------------------------------------------------------------------GPIO.setup(1, GPIO.setup(2, GPIO.setup(3, GPIO.setup(4, GPIO.OUT) GPIO.OUT) GPIO.OUT) GPIO.OUT)

#Drive motor forwards for 3 seconds GPIO.output(1, True) GPIO.output(2, True) time.sleep(3) #Stop motor GPIO.output(1, False) GPIO.output(2, False) #Drive motor in reverse for 3 seconds GPIO.output(3, True) GPIO.output(4, True) time.sleep(3) #Stop motor GPIO.output(3, False) GPIO.output(4, False)

NOTA: Este programa necesita otro grupo de 4 pines GPIO para controlar un segundo puente H si el robot est usando dos motores.

Artculo por Bodge N Hackitt

Automatiza tu casa con una Raspberry Pi... y atrapa a Pap Noel (Santa) en el acto!
Este artculo trata una forma fcil de construir, barata, y sobre todo, segura, de controlar dispositivos conectados a la red de alimentacin de una casa con una Raspberry Pi. Nada en este proyecto incluye trabajar con voltajes peligrosos. El soldado se limita a unas pocas uniones y el cdigo fuente puede ser descargado desde la parte del software.

tu smartphone para encender la cafetera cuando llegas a tu casa o encender el velador cuando Papa Noel camina sobre un felpudo con sensor de presin en frente de la chimenea en nochebuena?

La historia
Compr unos enchufes a control remoto de http://www.amazon.co.uk (Busca por Status remote control socket).[...] Los prob un par de veces, los dej en el armario y los olvid... pero la Raspberry Pi me inspir a hacer algo til con ellos. Decid usar la Raspberry Pi para reemplazar

Descodificando el control remoto El primer paso fue identificar las seales usadas por los enchufes para

poder imitarlos usando la Raspberry Pi. La comunicacin entre el control remoto y los enchufes est basada en ondas de radio, permitiendo el control sin lnea de visin. Esto permite a los enchufes en varios cuartos ser controlados desde un solo lugar. En la parte trasera los enchufes tienen una etiqueta que dice 433,92 MHz , as que busqu receptor 433MHz en eBay para encontrar un receptor adecuado. Encontr un receptor y transmisor para proyectos con

Arduino por slo 1 ,6 libras (US$1 .99) incluyendo el envo desde China. Tuve que soldar una antena de 1 7 cm hecha de cable en el receptor y transmisor. El largo de la antena representa a 1 /4 de la longitud de onda de 433,92 MHz. Puedes usar una calculadora online como esta http://www.csgnetwork.com/freqwavelengthc alc.html

el control remoto y como es programable, podemos extender sus prestaciones. Que te parece encender y apagar las luces del rbol de navidad a horas determinadas, usar

Para leer el cdigo del control remoto conect el mdulo receptor a un conector de micrfono de PC. Yo us una fuente de alimentacin externa, pero la Raspberry Pi tiene salida de 5V en los GPIO que sirve igual. La salida del mdulo receptor es digital de 5V, que no es adecuada para conectarla directamente a la entrada de micrfono de una PC, as que conect la salida del mdulo, a travs de una resistencia de 1 M Ohm a la entrada de micrfono de mi laptop. Yo arm el circuito en una protoboard, pero t podras usar el conector del otro extremo del cable de una disquetera como menciono en la seccin de Hardware de este mismo artculo.

depende..

Enviando una seal


Para poder hacer algo con los datos capturados conect el transmisor a la Raspberry Pi. El transmisor permanecer conectado a la Raspberry Pi, as que va ser alimentado por el pin +5V de los GPIO. Yo conect el GPIO 7 al pin Data y el GND del transmisor al GND del conector GPIO de la Raspberry Pi. Las seales de 3.3V son suficiente para hacer funcionar el transmisor, esto lo descubr probando. Como Linux es un Sistema Operativo

Audacity (http://audacity.sourceforge.com) es un excelente freeware (Software libre y gratuito) para examinar seales como esta. Una vez satisfecho con el nivel de entrada, empec la grabacin y presion uno de los botones en el control remoto. Al detener la grabacin me fue posible hacer zoom al rea donde se encontraba la seal del control remoto. Esta seal se repeta una y otra vez hasta que el botn era soltado. Los pulsos ms cortos parecan ser de cerca de 0.25ms de duracin y los ms largos hasta el triple. De la forma de onda cre esta cadena binaria. Cada bit representa 0.25ms con 1 = pulso alto y 0 = pulso bajo. Para hacerlo ms legible cada pulso fue separado con un guin. 11111 -000-1 -000-1 -000-1 -000-1 -000-1 -0001 -000-1 -000-1 -0-111 -000-1 -0-111 -000-1 -0001 -0-111 -000-1 -000-1 -0-111 -0-111 -0-111 -0111 -0-111 -000-1 -000-1 -000-1 -0-111111 Esta parte del proyecto es tan solo probar y fijarse. Si llegaste hasta aqu y no puedes encontrar un patrn que se repita cuando aprietas el boton del control remoto, tus enchufes podran no estar usando las simples seales AM de las que este proyecto

multitarea y algn otro proceso puede estar usando la CPU en el momento equivocado, mi programa enva la secuencia de bits 1 0 veces con la expectativa de que la ltima ser transmitida correctamente. Cuando ejecut mi cdigo en la Raspberry Pi por primera vez, captur la seal con Audacity. Pude ver que la forma de la onda era correcta, pero al revs. Obviamente el enchufe no hizo nada. Invert todos los bits en el flujo de salida, y volv a ejecutar el cdigo de test Esta vez el enchufe encendi! Ahora solo queda transcribir los otros botones.

Hardware

El conector y el cable que us para los GPIO es de una vieja disquetera de 3 1 /2. Este cable es ms ancho que el conector de los GPIO, pero se puede conectar desde una punta dejando que parte del cable sobresalga de la placa. Obviamente esto no

ser posible si ests usando tu RasPi en una caja. Solo son necesarios 3 cables del GPIO; +5V, GND y GPIO 7 (CE1 ), el pin I controla la transmisin. Del otro lado de mi cable plano hay una pequea plaqueta. Soldada a esta placa hay un conector para el transmisor hecho a partir de un socket para circuitos integrados.

enciendan y apaguen a horas determinadas debes usar algo llamado cron jobs. Solo escribe: ra podras editar el archivo que controla la programacin de tareas. El formato est descrito en el archivo pero para probar algo, agrega las siguientes lneas al final del archivo: Esto encender el enchufe 1 durante los primeros 1 0 minutos de cada hora. La interfaz no es muy amigable ni de lejos. Una interfaz basada en web sera mucho mejor. Mi interfaz web permite que los 4 canales sean encendidos o apagados, pero no fui tan lejos como para agregar programacin. Primero, instala mini-httpd para que acte como servidor web, Para eso escribe lo siguiente: Puedes descargar los archivos para la interfaz web desde http://www.hoagieshouse.com. En el zip se encuentra el archivo config necesario para el mini-httpd y el directorio var/www, que es donde puse la pgina web y los scripts cgi. No necesitan ninguna modificacin, pero si que sean copiados en la locacin correcta. El archivo HTML usa una primitiva llamada AJAX para ejecutar el script CGI con el canal y el parmetro on/off. Este script saca los parmetros de la consulta y los usa para llamar al programa que enciende y apaga los enchufes.
$ apt-get install mini-httpd 0 * * * * switch 1 on 1 0 * * * * switch 1 off $ crontab e

Software
Como el cdigo en el ejemplo que segu de http://www.elinux.org/Rpi_lowlevel_peripherals accede a la memoria directamente, necesita ser ejecutado como root. Para hacer todo ms fcil desarroll y prob todo como root. Para seguir las instrucciones de aqu en adelante debes hacer lo mismo. Todo se hace desde la lnea de comando. A menos que tu RasPi cargue la interfaz grfica automticamente, quedate en la lnea de comando. Para crear un directorio donde tener el cdigo fuente y el ejecutable mientras lo desarrollamos, tipea lo siguiente: Mi cdigo fuente puede ser descargado de http://hogieshouse.com. Solo sigue el link y guarda el archivo en el directorio que acabas de crear. Usa 2 parmetros, el canal y el estado (ON o OFF). Vas a necesitar editar el cdigo para reemplazar mis cdigos de control remoto con los del tuyo. Para editar el cdigo escribe: Acuerdate de haber quitado las comillas alrededor de los cdigos del cdigo fuente. Cuando hayas cambiado los cdigos sal presionando CTRL+X, responde con Y para salvar los cambios al archivo y acepta el nombre de switch.cpp. Para crear el ejecutable escribe: Prubalo con tus enchufes escribiendo: Si funciona, querrs usarlo como cualquier usuario que no sea root. Para hacer eso escribe el siguiente comando: Para programar que los enchufes se
$ chmod +s switch $ mv switch /usr/bin/ $ ./switch 1 on $ g++ -o switch switch.cpp $ nano switch.cpp $ mkdir gpio $ cd gpio

Conclusin
Ahora que tienes los fundamentos de software para controlar remotamente mltiples enchufes con tu RaspberryPi, te dejo como ejercicio imaginar qu otros activadores podras conectar a los GPIO para encender y apagar dispositivos. Ah, y si atrapas a Papa Noel por favor decile que me gustara un paquete de MagPi impresas para navidad: http://www.kickstarter.com/projects/themagpi/ the-magpi-magazine-from-virtual-to-reality.
Maplin Parts List VY48C - 433MHz TX/RX 9.99 M1 M - 1 M Ohm resistor 0.29 DG41 U - Floppy disk cable 3.99 Article by Geoff Johnson

10

CONCURSO DE DICIEMBRE

MagPi y PC Limited estamos muy orgullosos de anunciar un premio muy especial para el ganador del concurso de este mes.
El premio de este mes ser una nueva Raspberry Pi 51 2Mb Modelo B ms una fuente de alimentacin de 5V 1 A y una caja para Raspberry Pi de la marca PCSL! Los ganadores del segundo y tercer premio tambin recibirn una caja para Raspberry Pi de la marca PCSL cada uno. Para participar en el concurso de este de este mes visita la direccin:

http://www.pcslshop.com/info/magpi Fecha de cierre de solicitudes: 20 de diciembre de 201 2. Se informar a los ganadores en el prximo nmero de la revista y por correo electrnico. Buena suerte!

Para ver la amplia gama de accesorios para Raspberry Pi de la marca PCSL visita http://www.pcslshop.com

Los ganadores del mes pasado!


Los 5 ganadores de la caja de color frambuesa de PCSL son: Dave Heneghan (Chorley, Reino Unido) , Dean Hutchison (Glasgow, Reino Unido) , Dave Carney (Hartlepool, Reino Unido) , Nigel Laudat (Liverpool, Reino Unido) y Peter Locastro (Derby, Reino

Unido) .

Felicitaciones! PCSL le enviar en breve un correo electrnico con los detalles de cmo reclamar todos estos fantsticos premios.

11

Controla tu Arduino con Raspberry Pi y Python


El poder de Raspberry y la simplicidad de Arduino utilizando Python y una simple librera: Nanpy.
Introduccin:
Un Arduino puede comunicarse con una Raspberry Pi mediante una conexin serial a travs de un puerto USB. Esto crea una interface serial virtual que se utiliza de la misma manera que una interfaz normal, leyendo y escribiendo el archivo de dispositivo serial (serial device file). Para comenzar, conecta tu Arduino y escribe:
$dmesg | tail [..]usb 1-1.2: Manufacturer: Arduino[..] [..]cdc_acm 1-1.2:1.0: ttyACM0: USB ACM device[..]

preocuparte por la liberacin de memoria e incluso es posible hacerlo en un contexto multihilo. Nanpy pretende facilitar la vida del programador brindando un instrumento simple, claro y rpido para crear prototipos y scripts interactuando con Arduino con significativo ahorro de tiempo. Para instalar Nanpy lee el archivo README. Necesitas instalar Arduino en tu laptop o Raspberry Pi para construr el firmware.
$sudo apt-get install arduino

El nodo para mi Arduino Uno es /dev/ttyACM0 y el controlador (driver) es cdc_acm. Todos los Arduinos anteriores con un chip FTDI USB-Serial se acceden via /dev/ttyUSB*:
$ls -l /dev/ttyACM* crw-rw---T 1 root dialout 166, 0 Nov 5 00:09 /dev/ttyACM0

Nanpy est actualmente en desarrollo y solo fu testeada en Arduino Uno. Puedes descargar Nanpy desde la pgina de Pypi (http://pypi.python.org/pypi/nanpy) o desde Github (https://github.com/nanpy). Veamos Nanpy en accin intentando encender un LED colocado en el pin 1 3 del Arduino.
from nanpy import Arduino Arduino.pinMode(13, Arduino.OUTPUT) Arduino.digitalWrite(13, Arduino.HIGH)

Bien, ahora debes agregar tu usuario al grupo root para obtener el acceso de lectura/escritura requerido, luego debes reiniciar la sesin para que los cambios tengan efecto.
$sudo usermod -a -G dialout TU_USUARIO

Esto es importante porque Nanpy funciona usando este archivo de dispositivo serial. Nanpy es un proyecto open source publicado bajo la licencia MIT y se compone de una parte servidor (flasheada en tu Arduino, en espera por comandos en un serial) y una librera Python pura. Esta librera te permite comunicarte con tu Arduino conectado via USB usando clases y mtodos muy similares a los usados en el propio framework de Arduino. Detrs de escena, cuando creas y eliminas un objeto o realizas una llamada a un mtodo con Python, Nanpy comunica va USB y solicita al server que realice estas operaciones en el Arduino por t: puedes crear tantas instancias de objetos como quieras sin

Arduino provee todas las funciones principales, delay, analog/digital write y read. No existen funciones de setup ni loop, solo objetos y llamadas a mtodos. De hecho, Nanpy soporta todos los mtodos principales de Arduino LCD, Tone, Stepper y otras libreras. Ahora veremos como usar nuestro display LCD de 1 6x2 conectado a los pines 6,7,8,9,1 0 y 1 1 para escribir un mejor script Hola Mundo.
from nanpy import Lcd lcd = Lcd([7, 8, 9, 10, 11, 12],[16, 2]) lcd.printString("Hola Mundo!")

Advertencia: Raspberry Pi puede no proveer suficiente potencia al Arduino en cuyo caso debers conectar el mismo a una fuente externa.

El mundo exterior.

Ahora te vamos a mostrar como hacer que Arduino se comunique con el mundo exterior

12

usando la Raspberry Pi. Para entenderlo vamos a construir un moderno reloj con medidor de temperatura, una alarma inicializada va Bluetooth (utilizando un dispositivo Android en este caso) y con fecha y hora actualizadas a travs de un servidor NTP (Network Time Protocol)

especificando la posicin (en filas y columnas) en la que quieres que aparezca en el display. Luego movemos el servomotor como un pndulo una vez por segundo. Podemos actualizar la lectura de temperatura en otro hilo. Leyendo el valor de nuestro sensor de temperatura desde el pin analgico 0 y mostrndolo en el display LCD, cerca del tiempo, cada 60 segundos.
temp = ((Arduino.analogRead(0) / 1024.0) * 5.0 - 0.5) * 100 lcd.printString("- %0.1f\xDFC" % temp, 6, 1)

Pods encontrar el proyecto con instrucciones, una aplicacin Android y componentes requeridos aqu: https://github.com /nanpy/eggsamples/tree/master/synclock. Para demostrar como funciona Nanpy en un contexto multihilo, este programa crea un hilo para cada funcionalidad, escribiendo todo en el mismo display LCD. En este artculo se muestra solo la parte interna de cada ciclo while True presente en cada mtodo run, por lo tanto recomiendo que sigas solo con el cdigo fuente. Empecemos con el hilo principal, TimeThread, que toma una lectura de tiempo desde nuestro servidor NTP una vez por segundo y lo almacena en una variable global, milltime:
response = ntplib.NTPClient().request( 'europe.pool.ntp.org', version=3) milltime = int(response.tx_time)

Bien, ahora vamos a ver de qu manera comunicarse con un telfono Android para configurar la alarma del reloj via Bluetooth. He apareado mi dispositivo con la Raspberry Pi antes de comenzar, sigue las siguientes instrucciones para hacerlo: http://wiki.debian. org/BluetoothUser. Recuerda instalar tambin python-bluez. Vamos a utilizar AlarmClock, una clase de hilo seguro (thread safe), para salvar en disco y recuperar de all el valor de alarma del reloj. (ver el cdigo). Luego podemos comenzar nuestra comunicacin Bluetooth en un nuevo hilo, AlarmClockThread.
...Bluetooth init and connection... cli_sock, cli_info = srv_sock.accept() cli_sock.send("%d:%d:%d", ck.getAlarm()) try: while True: data = cli_sock.recv(3) if len(data) == 0: break ck.setAlarm(ord(data[0]), ord(data[1]), ord(data[2])) except IOError: pass

Para mostrar fecha y hora en el display LCD se crea un segundo hilo, ShowTimeThread:
... self.servo = Servo(12) ... dt = datetime.fromtimestamp(milltime) lcd.printString(dt.strftime('%Y/%m/%d'), 0, 0) lcd.printString(dt.strftime('%H:%M'), 0, 1) self.servo.write(90 + (30 * self.c)) self.c *= -1

A cada segundo tenemos nuestra variable global milltime, transformada a formato legible y luego impresa en el display LCD. Como puedes ver, printString puede ser llamada

Nuestra Raspberry Pi acta como un servidor, esperando por una conexin bluetooth: una vez que sta se establece, enva a nuestro dispositivo la alarma de reloj y espera por un nuevo valor para ser almacenado. En el hilo TimeThread comparamos el valor de tiempo actual con el valor de alarma: si estos coinciden, podemos iniciar un nuevo hilo, PlayAlarmThread, que ejecuta una nota Do (C) durante 250 milisegundos, cinco veces, usando una instancia del objeto Tone a travs de un parlante conectado al pin digital 4 del Arduino. Es hora de levantarse!! Comienza a pensar en tu propio proyecto usando Nanpy, por ejemplo tratando de revivir tu viejo auto radiocontrolado: youtu.be/NI4PDfVMdgM

Artculo por Andrea Stagi

13

PiGauge

Este divertido proyecto muestra cmo controlar los servomotores a travs de Internet utilizando un Raspberry Pi.
Resmen
Controlar el hardware que se conecta a la Pi es muy divertido. El control de hardware desde otra ciudad u otro estado que est conectado a la Pi es impresionante. Controlamos cinco servos, cada servo controla la aguja de un indicador que puede mostrar cualquier dato sobre fondos modulares e imprimibles. Usamos PHP para crear una pgina web que es servida por la Pi. PHP invoca al sistema a travs de la lnea de comandos que llama a un programa Python. MIentras tanto, el programa Python controla el movimiento de los servos sobre un bus I2C, devolviendo las posiciones de los servos leyendo los valores de un registro que reside en el controlador de servo. Este, de 1 6 canales, es de Adafruit (http://www.adafruit.com/products/81 5), viene con una buena librera, que se encarga de las operaciones de bajo nivel. Necesita el tutorial para configurarlo inicialmente y descargar la biblioteca. Proporcionamos todo nuestro cdigo, plantillas y on un archivo de ayuda en un repositorio Git. Este proyecto es escalable para controlar hasta 1 6 servos. Utilizamos la nueva distribucin Debian Wheezy para desarrollar el cdigo en una Raspberry Pi modelo B Rev1 . Se puede utilizar una Rev2 modificando la librera.

DIFICULTAD: fcil-media

Lista de Materiales
Aqu hay una lista de los materiales que se necesitan para completar este proyecto:
Item

Lista de Materiales 5

Servo Motor

Cant. Observaciones

Fuente de 4 a 6 volts 1 ServoDriverde16canales 1

Accesorio de Montaje 1

1 80 grados de rotacin aprox. 1 00mA por servo I2C Lo hicimos en casa

Adafruit servo driver hoja de datos:

http://www.adafruit.com/datasheets/PCA9685.pdf

Conexin del Hardware


Por seguridad, apague su Pi y desenchfela antes de realizar cualquier conexin.
$ sudo shutdown -h now

Primero, conecte los servos. La mayora de los servos vienen con conectores de acoplamiento pre-instalados. Enchufe el conector en el controlador de servo, asegrese de que los colores coinciden con la serigrafa. Utilizamos los canales 1 -5. Negro = Tierra Rojo = V+ Amarillo = Seal Pi no puede suministrar suficiente corriente para alimentar los servos. Por lo tanto, se necesita una fuente de alimentacin externa. Se utiliz un Adaptador CA de pared de un viejo cargador de telfono celular de 5 VDC que tena a mano. Utilice los terminales del controlador de servo para las conexiones de V+ y GND.

14

Sponsored by National Technical Systems Albuquerque Engineering Services http://www.nts.com/locations/albuquerque

Por ltimo, conecte la Pi al controlador del servo. Necesitaremos cuatro conexiones del conector GPIO de la Pi al conector del controlador de servo: 3,3 V, GND, SDA y SCL.

Agregue el dispositivo I 2C al kernel. Reinicie el Pi luego agrguese al grupo I 2C:


$ sudo modprobe i2c-dev $ sudo usermod -aG i2c yourusername

Instalar Apache y PHP


$ sudo apt-get install apache2 php5 libapache2-modphp5

Revise todas las conexiones antes de aplicar tensin. Cuidado: Los pines Vcc y V + son adyacentes entre s en el controlador de servo, no los cambies como hicimos nosotros o tendrs un Pi daado! Conecte su alimentador de pared y encienda su Pi. Si ha conectado todo correctamente, no ver ni oler humo.

Para ubicar la IP de su Pi (ej. 1 92.1 68.1 .1 0):


$ ip addr inet: ip.of.your.pi

Navegue a http://ip.of.your.pi y debera ver la pgina "It Works!". Enlace el proyecto PiGauge a la raz de www:
$ cd /var/www $ sudo ln -s /home/pi/PiGauge

Agregue apache al grupo I 2C para que pueda acceder al bus I 2C. A continuacin, reinicie apache:
$ sudo adduser www-data i2c $ sudo /etc/init.d/apache2 restart

Desde su directorio home:

Descargando Software y Herramientas


Aunque no es obligatorio, es una buena idea para mantener su Pi actualizada, empieza con:
$ sudo apt-get update && sudo apt-get upgrade

$ sudo cp ./Adafruit-Raspberry-Pi-PythonCode/Adafruit_PWM_Servo_Driver/Adafruit_I2C.py /usr/local/lib/python2.7/site-packages/ $ sudo cp ./Adafruit-Raspberry-Pi-PythonCode/Adafruit_PWM_Servo_Driver/Adafruit_PWM_Ser vo_Driver.py /usr/local/lib/python2.7/site-packages/

Ya debera estar listo, dirgete http://ip.of.your.pi/PiGauge/ y prubalo!

Guarde los archivos en el directorio home:


$ sudo apt-get install git $ git clone https://github.com/Thebanjodude/PiGauge

Leyendo la posiciones del Servo


En este fragmento de cdigo agregamos dos bytes sin signo desde el bus I 2C para obtener la posicin de un servo.

Descomente todas las lneas de este archivo:


$ sudo nano /etc/modprobe.d/raspi-blacklist.conf

Contina en la siguiente pgina...

15

def print_position(chart_num): chart_pos = (chip.readU8(8 + chart_num * 4) +(chip.readU8(9 + chart_num * 4) << 8)) print chart_pos

En la Tabla 3 de la hoja de datos del PCA9685 se puede ver que las posiciones se guardan en el 4 y 5 registro comenzando desde el registro 1 2 y 1 3. Para obtener la posicin del servo tendr que agregar el contenido de los dos registros juntos. Sin embargo, la suma directa puede dar un resultado equivocado! Por qu? Dos registros de 8 bits estn "pegados" para hacer un registro de 1 6 bits, a eso se denomina concatenacin, significa que el primer registro contiene los bits 0-7 y el segundo los 8-1 5. Para sumarlos correctamente deber mover los bits del segundo registro 8-bits a la izquierda (<< 8). Despus podr sumarlos para obtener un valor de 1 6 bits. Lo bueno de los registros es que la electrnica no les afecta. Es decisin totalmente suya, del programador, el interpretar lo que contienen.

Controladores de servo). Para hacer el software ms intuitivo hemos escalado el nmero de 0 a 1 00 utilizando una funcin de transferencia, luego lo llevamos un paso ms all. Dado que los servos no son exactamente lineales, tomamos algunos puntos de datos, llamados servo_data, y codificamos una regresin lineal (una palabra elegante para la lnea ms aproximada) para compensar la no linealidad de los servos. La funcin de regresin lineal devuelve las variables xfer_m y xfer_b que se utilizan a continuacin.
def transfer(chart_percent): return int(xfer_m * chart_percent + xfer_b) def inverse_transfer(chart_pos): return int(round((chart_pos - xfer_b) / xfer_m))

Prueba del Software


Somos grandes creyentes en la metodologa Agile de desarrollo de software y el progreso incremental. No implementamos el uso de scrums o de seguimiento en este pequeo proyecto, pero hicimos algunas pruebas unitarias livianas, que estn disponibles en el repositorio si usted tiene curiosidad.

Moviendo Servos
Todo el proyecto gira en torno a mover servomotores. Las siguientes lneas de cdigo son, posiblemente, las ms crticas. Definimos una funcin llamada move_servos(). Esta funcin tiene dos argumentos: Qu grfico desea mover y donde desea que se mueva. pwm.setPWM () est en la librera Adafruit.
def move_servos(chart_num, chart_pos): pwm.setPWM(chart_num,0,chart_pos) time.sleep(0.1 )

Agradecimientos
Un agradecimiento especial a Scott Ehlers por su paciencia en ensearme nuevas habilidades UNIX y PHP y a Tanda Headrick por la construccin del indicador mecnico. Un agradecimiento muy especial a National Technical Systems (NTS) por patrocinar el proyecto al darnos un poco de tiempo libre para construir una pantalla de estado del proyecto. Siga los enlaces NTS para ms informacin sobre lo que hacemos cuando no estamos jugando con una Raspberry Pi.

chart_pos es un nmero entre 1 70 y 608, pero puede variar un poco de servo a servo. Estos nmeros se refieren al ancho de pulso (si est interesado bsque ms informacin sobre

Artculo original por Ben Schaefer

Sponsored by National Technical Systems Albuquerque Engineering Services http://www.nts.com/locations/albuquerque

16

Programando la Raspberry Pi: Introduccin a Python


En un nuevo libro de www.raspberrypibook.com, Simon Monk cubre desde lo bsico de Python hasta el uso de GPIO en profundidad.
Al comprar una Raspberry Pi, lo ms probable es que ests interesado en aprender a programar tu nuevo gadget. El libro "Programming the Raspberry Pi: Getting Started with Python" por Simon Monk, gua al lector a travs del proceso de aprendizaje de Python con la Raspberry Pi. Tres captulos del libro estn dedicados exclusivamente a la programacin y uso del conector de GPIO. Diversas tcnicas, herramientas y prototipos de productos se estudian y explican, entre Gertboard, PiFace, Pi Cobbler y la RaspiRobotBoard. Dos de los captulos de hardware son instrucciones pasoapaso para la construccin y programacin de proyectos electromecnicos utilizando el conector GPIO. El primer proyecto es un simple display de 7 segmentos LED que muestra la hora del sistema de la Raspberry Pi. El segundo es un robot ambulante que utiliza el rover kit de bajo costo Magician Chassis, junto con la tarjeta de interfaz RaspiRobotBoard.

El libro es accesible para los recin llegados a la programacin y conduce al lector a travs de los conceptos bsicos de Python, antes de pasar a temas ms complejos, tales como el uso de la biblioteca Pygame y Tkinter, as como la programacin para el conector GPIO. El enfoque es muy prctico. Los conceptos de programacin se desarrollan en los programas de ejemplo, que se basan en principios sencillos igual que cuando se escribe un programa desde cero.

Todo el cdigo fuente del libro est disponible para su descarga en el sitio web del libro. El libro est disponible en las libreras ms importantes a partir de finales de noviembre de 2012 y se pueden encontrar ms detalles en la pgina web del libro (www.raspberrypibook.com).

17

Entrevista a pibow
Los chicos de Pibow nos hablaron sobre el funcionamiento interno de su fbrica, cmo Pibow les afect, qu planes tienen para el futuro y tambin consejos sobre cmo empezar tu propio negocio. Conocer a los chicos de la Pibow fue una experiencia interesante para mi y como estaban muy cerca mo pens que sera lgico visitarlos as como tambin hacer una entrevista, y estoy contento de haberlo hecho. P: A qu le atribuyen el xito de la Pibow y cmo les afect? "Pibow era tan diferente a otras cajas que realmente destac. Obiamente, haber aparecido en RaspberryPi.org fue un gran empuj para nosotros y atrajo mucho del interes inicial hacia Pibow, a partir de ah solo tuvimos que asegurarnos de hacer los envos tan rpido como pudieramos. Fue grandioso enviar grandes lotes de unidades, al da siguiente siempre haba muchos tweets de gente feliz porque su Pibow haba llegado"

P: Cules son sus planes a futuro?; Va haber alguna variacin en los colores como una edicin especial Piwasp (negro y amarillo) o estilo americano (rojo, blanco y azul), va haber cajas con ruedas? "Actualmente estamos enfocados en Picade (http://www.kickstarter.com/projects/pimoroni/ picade-the-arcade-cabinet-kit-for-yourraspberry-p) que presentamos hace dos semanas en Kickstarter. Hay algunas novedades de pibow que llegarn en el futuro cercano, incluyendo nuevos colores!" [Ok, lo de las cajas con ruedas fue un poco trado de los pelos pero por cmo estn progresando, quien sabe!]

Un ejemplo de pieza cortada por laser P: Habran hecho algo diferente?? "Si hubiramos sabido cunto xito bamos a tener habramos comprado una cortadora laser extra mucho antes que hubiera hecho las cosas ms fciles y rpido. Son caras, aunque slo quisimos estar seguros que las bamos a necesitar a largo plazo"

18

Jon y Paul desde Pimoroni

P: Finalmente, qu consejo le daran a otros emprendedores desde su experiencia? "Conoc lo que hacs. Internet est llena de informacin de calidad si buscs por ella. Entonces solo ve por ella y acepta toda la ayuda que puedas de lo que amigos y familiares puedan ofrecer Trabajamos realmente muy duro los ltimos 4 meses para enviar todas las pibows a las personas que las pidieron. Durante ese tiempo hicimos funcionar las mquinas 1 6 horas al da, todos los das, incluyendo los fines de semana. Estbamos preparados para poner nuestras vidas en pausa para asegurarnos que podamos hacer las entregas tan rpido como fuera posible. Los amigos y familia fueron geniales ofreciendo ayuda en el taller y adems proveyeron soporte financiero para que todo funcione. No podemos agradecerles lo suficiente lo que hicieron para ayudar." Son realmente buenas cajas. Esperamos que el Picade tambin entre pronto en produccin.

Artculo original por Chris Stagg

SABIAS QUE?
Paul de Pimoroni es responsable del diseo del logo de Raspberry Pi! La caja PiBow est hecha de acrlico. Ahora Pimoroni tiene 3 cortadoras laser llamadas Bert, Ernie y Cookie Monster! [No falta mucho para que aparezcan Oscar, Big Bird y The Count.]

PiBows esperando a ser enviada

19

CE S I L P i
Aprenda cmo crear un rbol de Navidad de los aos 70 con CESIL y una Raspberry Pi
CESIL Lenguaje de instruccin permanente de Informtica Educativa en Escuelas (Standing for Computer Education in Schools Instructional Language) fue diseado en la dcada de 1970 como un intento de introducir a los jvenes de las escuelas en el mundo de la programacin de computadoras. Al no tener computadoras en las escuelas, los alumnos escriban los programas en papel y los enviaban a su centro de cmputo local. Los resultados podan volver a aparecer en el correo una semana ms tarde! CESIL es un lenguaje ensamblador muy simplificado con una base de aplicacin muy limitada, sin embargo, es fcil de aprender y sirve para escribir programas simples. En s mismo CESIL no es muy emocionante, as que he escrito un intrprete en BASIC, y le aad un rbol de navidad con luces de colores programables! El rbol tiene 4 filas de 8 lmparas. Piense que es como una cuadrcula de 8 de ancho por 4 de alto. Un programa CESIL posee esencialmente tres columnas de texto. La primera columna (que puede estar en blanco) es la etiqueta es un marcador de posicin en el programa al que puede "saltar" desde otras partes del programa. La columna central es el operador que es la instruccin para ejecutar, y la ltima columna es el operando esto es el datos que utilizar la instruccin. Estos datos pueden ser el nombre de una etiqueta, si se trata de una instruccin de salto, puede ser un nmero o puede referirse a un almacn de memoria con nombre, o variable.
Mis

para ajustar el color de la lmpara, as como la capacidad de subrutinas. El programa puede tener hasta 256 lneas y contener un mximo de 256 variables. La mejor manera de explicarlo puede ser mirar en un programa real. Este programa lee un nmero del teclado e imprime una tabla de multiplicar:
# mtable: # Generador de tablas de Multiplicacin line print "Generador de tablas de Multiplicacin" line print "Que tabla?" in store table load 1 store index # Indice de ciclos .... loop: load index out print " VECES " load table out print " = " mul index # la Tabla se multilpica por el acumulador out line load index # Suma 1 al ndice add 1 store index sub 11 # Resta 11 contando desde 1 a 10 jineg loop # Si <0 entonces salta a loop halt

extensiones a la mquina CESIL han incluido dos registros ms (tres en total) para almacenar las ubicaciones de fila y columna de las lmparas y una instruccin de color

Se permiten lneas en blanco y los comentarios comienzan con el smbolo #. La mayor parte del cdigo debera explicarse por s mismo, pero con un solo acumulador, todo tiene que ser transferido hacia y desde la memoria la instruccin 'store table'

20

almacena el acumulador en una variable llamada "table". Las instrucciones CESIL estndar son:
LOAD Transfiere el nmero dentro del acumulador STORE Transfiere el acumulador dentro de la variable indicada JUMP Salta a la etiqueta dada JINEG Salta si el acumulador es negativo JIZERO Salta si el acumulador es cero ADD Suma un valor al acumulador SUB Resta del acumulador MUL Multiplica el acumulator por un valor DIV Divide el acumulador por un valor HALT Fin del programa IN Ingresa un nmero desde el teclado OUT Muestra el acumulador como nmero PRINT Muestra una cadena literal (entre comillas) LINE Muestra una nueva lnea

lmparas. La fila 0 en la parte inferior y la columna 0 a mano izquierda. El siguiente fragmento de programa llena la fila inferior con lmparas rojas:
# Programa de ejemplo para iluminar la fila inferior # con luces ROJAS tree # Crea el rbol! load 0 row # Fila 0 Inferior load 7 # Cuenta de 7 a cero loop: store colcount col load 12 # Rojo colour load colcount sub 1 jineg done # Salta si es negativo jump loop done: wait 1 # Actualiza las luces halt

Extensiones:
JSR Salto a subrutina RET Retorna de subrutina (a la lnea posterior a la ltima instruccin JSR)

Extensiones del rbol de navidad:


TREE Crea un nuevo rbol de navidad ROW Transfiere el acumulado dentro del registro de Fila COL Transfiere el acumulado dentro del registro de Columna COLOUR Establece el color de la lmpara indicada por los registros de Fila y Columna al valor de color del acumulador WAIT Retrasa un nmero dado de centsimas de segundo

Primero descargue el intrprete BASIC de RTB desde https://projects.drogon.net/returntobasic/ A continuacin, puede instalar el intrprete CESIL y las demostraciones, utilizando:
cd git clone git://git.drogon.net/cesil cd cesil rtb load cesil run

Tenga en cuenta que necesita ejecutar una instruccin WAIT para reflejar realmente los cambios de color en las luces. Eso significa que puede configurar un montn de luces a la vez, entonces, cuando se ejecuta un WAIT (incluso una instruccin WAIT 0), todas las luces se cambian al mismo tiempo. Hay 16 colores estndar:
0: Apagado, 1: Azul marino, 2: Verde, 3: Turquesa, 4: Marrn,5: Prpura, 6: Verde Oliva, 7: Plateado, 8: Gris, 9: Azul, 10: Verde Lima,11: Agua, 12: Rojo, 13: Rosa, 14: Amarillo, 15: Blanco

Mi deseo es ver gente que comparte ejemplos, as que por favor publquenlos en foros o envenmelos por correo electrnico (projects@drogon.net) y lo que voy a hacer en enero es echar un vistazo a los que he encontrado y enviar una placa Raspberry Ladder gratis al que crea que es el ms original o inteligente...
Artculo original por Gordon Henderson

Nuestro rbol de Navidad tiene 4 filas de 8

21

Anteriormente estuvimos viendo como comenzar en C++ y escribimos nuestros primeros programas. Hoy vamos a continuar mostrando cmo ejecutar sus programas y conociendo algunos tipos ms de variables.
Compilando y ejecutando programas
Una vez que haya escrito su programa (puede utilizar un editor como nano o geany) gurdelo en un archivo de tipo .cpp, despus abra una nueva ventana de terminal y escriba lo siguiente:
g++ [nombre].cpp -o [nombre_del_programa]

BIENVENIDO AL CACHE DE C++!

Reemplace [nombre] por el nombre del archivo y [nombre_del_programa] por el que quiera usar para llamar a su nuevo programa.

Si recibe un error diciendo que el archivo no fue encontrado (file not found), tiene que utilizar el comando cd para ubicarse en el directorio donde guard el archivo .cpp y despus ejecutar el comando nuevamente. Si obtuvo un error diciendo que no existe g++ (esto no puede pasar en el caso de las nuevas imgenes), escriba sudo apt-get install build-essential para instalar g++. Cuando finaliza la compilacin (en programas grandes puede llevar algn tiempo), simplemente escriba:
./[nombre_del_programa]

donde [nombre_del_programa] es el mismo que utiliz en la compilacin. El programa debe entonces ejecutarse, y cuando finalice debera retornar al terminal como cualquier otro programa de lnea de comando. Ms tipos de variables. Anteriormente habamos visto que exista un tipo de variable llamado int, que nos permita almacenar solamente nmeros enteros. Por supuesto, podemos llegar a necesitar almacenar

22

algo diferente, para eso existen distintos tipos de variables. Como los siguientes: Para crear una variable, simplemente escriba el tipo que usted quiera antes del nombre por el que v a identificarla y a continuacin un punto y coma. Observe el siguiente cdigo:
#include <string> #include <iostream> using namespace std; int main(){ // Crear algunas variables numricas: int numeroEntero = 5; float numeroDecimales = 5.5; // Crear algunas variables de letras: // Observe que utilizaremos apstrofe para delimitar caracteres // y comillas dobles para cadenas de texto. string saludo = Hola; char simbolo = !; // Crear una variable booleana: bool esVerdad = false; // Mostrar juntas las variables declaradas: cout << numeroEntero + numeroDecimales << endl; cout << saludo + simbolo << endl; cout << esVerdad << endl; return 0;

Observe lo que sucede cuando sumamos diferentes tipos de variables. Las numricas funcionan como se esperaba: 5 + 5,5 equivale a 1 0,5, y eso es lo que sale por pantalla. Cuando sumamos letras, los caracteres se aaden a continuacin. Entonces tenemos nuestra cadena de texto hola y le sumamos el smbolo de admiracin, por lo que obtenemos hola!. Esto muestra por qu los tipos de datos son importantes. Si se hubieran declarado los nmeros utilizando un tipo string, habramos juntado el 5,5 al final de 5 y entonces hubiramos obtenido 55,5. Tambin es una buena idea darle nombres representativos a las variables. Los nombres de las variables pueden formarse con letras, nmeros y guin bajo (underscore, _ ) pero no pueden comenzar con un nmero. Existen tambin ciertas palabras que no pueden utilizarse ya que se encuentran reservadas para uso del lenguaje. Tambin observe que obtenemos 0 en lugar de false para la variable esVerdad. Un valor booleano es bsicamente un 0 para false o un 1 para true, tal como los binarios, y as es como el programa lo muestra. Anteriormente hemos utilizado cin para permitir que el usuario proporcione un valor y almacenarlo dentro de una variable. Tratemos de hacer lo mismo en el cdigo anterior. Tambin podemos utilizar el smbolo = para cambiar lo que hay almacenado dentro de una variable en cualquier momento (por eso es que se las llaman variables). El valor de una variable puede ser asignado a otra variable, por ejemplo:
int i = 4; int j = i;

No obstante, esto no puede ser utilizado para asignar el valor en un string:


int i = 4; string s = i;

Sucede que la clase string no tiene funcin miembro para permitir esta asignacin. La asignacin de un nmero en una cadena de texto puede ser lograda mediante un stringstream, pero eso ser analizado en guas posteriores.

23

Primeros pasos en un...

AMPLIO MUNDO

Ada, un lenguaje para todos Por Luke A. Guest

Introduccin
Siguiendo con el nmero 6, vamos a continuar cubriendo los aspectos bsicos del lenguaje Ada.

Tipos numricos (continuacin)


Los tipos enteros pueden ser nmeros negativos, como 10, 55, etc. Los tipos naturales slo aceptan valores a partir de 0 (no hay nmeros negativos) y los tipos positivos slo aceptan valores a partir de 1 (sin valores negativos ni cero). Estos tipos se pueden utilizar juntos en expresiones matemticas, pero debes asegurarte de que no te salgas del rango del tipo de asignado, de lo contrario se producir
1 2 3 4 5 6 7 8 9 10 11 12 with Ada.Text_IO use Ada.Text_IO procedure Decisions is Is_Defective : Boolean := False begin if Is_Defective = True then Put_Line ("Defective") else Put_Line ("Not defective") end if end Decisions

un error. Por ejemplo, si defines dos variables X : Natural := 1 e Y : Integer := 2 luego sustraes Y de X y despus asignas de nuevo en X (por ejemplo, X := X Y), se producir un error ya que el resultado es 1, que est fuera del intervalo permitido para los tipos naturales.

Tipos lgicos (booleanos)


Los tipos lgicos o booleanos tienen dos valores, verdadero y falso, no hay nada ms que puedas asignar a una variable de este tipo.

Decisiones simples
Todos los lenguajes tienen la idea de valores lgicos debido a que todas las condiciones de programacin se basan en la idea de que algo es verdadero o falso.

Listing 1: decisions.adb

Lnea 5: Definimos una variable Boolean: Is_Defective, y le asignamos el valor False. Lnea 7: Probamos a ver si Is_Defective = True. El = significa que lo que est en el lado izquierdo es igual a, o es lo mismo que, lo que est en la derecha. La parte entre el If y el Then se llama expresin. Tambin podramos haber puesto slo If Is_Defective Then para significar lo mismo. Adems, If Is_Defective = False then y If not

Is_Defective then significan lo mismo. Lnea 8: Cualquier cosa entre las palabras clave then y else se ejecuta cuando la condicin es verdadera. Lnea 10: Cualquier cosa entre las palabras clave else y end if se ejecuta cuando la condicin es falsa. Lnea 11: Todas las sentencias if deben terminar con end if, incluso si no hay ningn else.

# 24

Escriba el cdigo en la Lista 1 para ver cmo podemos tomar decisiones en Ada utilizando un tipo Boolean.

Caractersticas Interesantes: Atributos


Muchas entidades de los lenguajes proporcionan atributos que pueden proporcionar informacin para el programador. Puedes acceder a los atributos utilizando el apstrofe ('). En nuestros ejemplos, hemos visto al 'Image (), 'First, los atributos de rango 'First y 'Last de los 3 tipos enteros.

Literales
Ya hemos visto algunos literales, a pesar de que no sabes lo que son. Un literal es cualquier conjunto de datos en el cdigo fuente como el nmero 125 o la cadena "Hola, desde Ada" en el Listado 1, que son literales numricos y de cadena, respectivamente. En Ada, tambin hay caracteres literales, como 'C'. Una cadena se compone de caracteres, por lo que podemos aadir caracteres a cadenas usando el operador &, como lo hicimos en el Listado 2 en la Parte 1, por ejemplo, "Hola " y "G" es lo mismo que "Hola G". Se pueden crear variables de tipo Character al igual que hicimos anteriormente con Integer, Natural y Positive. Para el tipo Boolean como se seal anteriormente, los valores True y False son literales lgicos.

acceso a este rango a travs del atributo 'Range, esto realmente devuelve 'First .. 'Last, donde los dos puntos (diresis) dicen que "este es un rango de valores." Si intentas asignar un valor fuera de este rango a una variable de un tipo determinado, se producir un error y el programa no se ejecutar correctamente. Otro uso de 'First es asignar un valor inicial a una variable. Mirando el Listado 2, el valor inicial para asignar a una variable viene tras del smbolo := despus del nombre del tipo.

Ejercicios:
1.Utilice el atributo Integer'Image para imprimir los valores devueltos por los atributos Integer'First y Integer'Last. 2.Repita el ejercicio 1, pero para los tipos Positive y Natural. 3.Trate de reemplazar los valores iniciales con el atributo 'First.

Ms atributos
Ya hemos hablado sobre el atributo 'Image, pero ahora vamos a hablar de tres atributos ms de los tipos enteros que son muy tiles. Cada tipo entero tiene un rango de valores que puede aceptar, este rango est definido por atributos 'First y 'Last, tambin podemos tener

UN POCO DE HISTORIA
Aos atrs, en la dcada de 1970, el Departamento norteamericano de Defensa (DoD) decidi que quera un lenguaje de programacin que pudiera ser utilizado para todos sus proyectos. Una serie de equipos de todo el mundo presentaron propuestas para un nuevo idioma, cada uno con el nombre de un color: Rojo, Verde, Azul y Amarillo. De los cuales, gan el equipo dirigido por Jean Verde Ichbiah de CII Honeywell Bull en Francia. La primera versin del lenguaje verde se pas a los equipos de programacin dentro del Departamento de Defensa y se les dijo que lo usaran para todos los proyectos posteriores. El lenguaje verde pas a llamarse Ada por la hija de Lord Byron, Augusta Ada (Condesa de Lovelace), quien trabaj junto a Charles Babbage y que es considerada como la primer programadora de ordenadores del mundo debido a su trabajo en su Mquina Analtica. La primera versin del lenguaje Ada se produjo en 1983, llamada Ada 83, la prxima versin apareci en la dcada de 1990, inicialmente llamada Ada9X y ms tarde rebautizado Ada95, la siguiente versin fue Ada 2005 y hay otra revisin lanzado este ao llamado Ada 2012. Todava se est trabajando en el compilador GNAT para soportar a las nuevas caractersticas de Ada 2012, por lo que lamentablemente, algunos de ellos no funcionarn si usted los prueba. Definitivamente podemos utilizar Ada95 y tambin la mayor parte de las caractersticas de ADA 2005 de nuestros programas.

25 25

Al parecer hay un debate muy activo sobre el lenguaje de programacin ms apropiado que podemos estudiar y uno de los ofrecidos menos frecuentemente es el SQL Structured Query Languaje(Lenguajeestructuradodeconsulta)
Es el estndar mundial utilizado para controlar bases de datos y yo sostengo, ms sencillo de aprender que el resto. Esto es lo que se conoce como un lenguaje de alto nivel. Por ejemplo es como utilizar una forma reducida del idioma ingls. El SQL cubre un amplio rango de aplicaciones web -nada menos que de la manipulacin de portales web inteligentes! Cuando comience a jugar comprender el ritmo, y la sintaxis, hablar SQL hasta el punto que casi adivinar los comandos. Repita estos pasos en su propia Pi y le ensear como instalar una plataforma slida con MySQL en la que podr practicar con bases de datos -ms all del alcance de este artculo.

CAMPAMENTO DE BASE DE DATOS


Bases de Datos

Instalando MySQL
Utilizaremos una versin Open Source de SQL llamada MySQL, pero esta no se incluye en la distribucin estndar de Raspbian, por lo tanto necesita ser localizada descargada e instalada en su Pi. Afortunadamente este complejo proceso est controlado por un solo comando que se ejecuta desde la pantalla de texto o en una ventana de terminal:
pr0mpt > apt-get i nstal l mysql -server

Su Pi hace una pausa y comienza la descarga. Puede haber un momento en este proceso donde nada parece suceder pero sea paciente. Eventualmente se le presentar una pantalla azul y se le solicitar que establezca un password para MySQL -dos veces, la segunda para confirmar.
MySQL es una marca registrada de Oracle Corporation y/o sus filiales. Logo utilizado con permiso.

La base de datos ms simple es una lista. La lista se vuelve ms til cuando se vuelve ms extensa, pero probablemente se necesitarn ms columnas por lo que finalizamos teniendo una tabla. Una tabla tiene columnas y filas - en terminologa de bases de datos se las denomina fields (campos) y registros (records). Una gran base de datos puede contener muchas tablas -y as ocurrir. Hay tres funciones bsicas en el mantenimiento de datos en una tabla: add (altas), delete (bajas) y modify (modificaciones). As que en trminos de los datos que almacenemos, podemos agregar un nuevo registro (add), eliminar (delete) un registro viejo o modificar (modify) el contenido de un registro existente - esto es todo! (DML Lenguaje de Manipulacin de Datos). En trminos de cmo mantener esos datos podemos agregar, borrar y modificar tablas y agregar, eliminar y modificar campos -esto es todo! Dominemos estos comandos y estaremos en el camino correcto para el control de bases de datos. (DDL - Lenguaje de Definicin de Datos). Una vez que los datos son almacenados estos son intiles a menos que HAGAMOS algo con ellos, y esto puede resumirse en dos funciones bsicas ordenar (sort) y buscar (search).

26

Datos
Hemos reducido el manejo de las bases de datos a unas pocas funciones, pero antes de continuar con MySQL daremos una ltima mirada a los datos en s mismos. Si necesita completar un formulario, en papel o en un sitio web, puede encontrarse con que los requisitos son poco claros o sus datos no caben en el espacio disponible. Sobre el papel, puede hacer anotaciones al margen o reducir el tamao de su escritura para que entren, pero esto no es posible en un ordenador al estar su informacin ms definida. Lo mismo ocurre con los tipos de datos (data-types). MySQL reconoce slo tres tipos de datos: texto, nmeros y fechas. Para almacenar los datos ms eficientemente se necesita tambin asignar la cantidad correcta de espacio de almacenamiento.

comenzar a cambiar cosas esto le dar ms confianza en nuestra capacidad de poder mirar alrededor. por ejemplo:
pr0mpt > show tabl es i n i nformati on_schema;

Esto muestra la lista de bases de datos en el information_schema. Las columnas en una tabla pueden verse de tres maneras, todas producen el mismo resultado:
pr0mpt > show col umns i n i nformati on_schema. vi ews; pr0mpt > show fi el ds i n i nformati on_schema. vi ews; pr0mpt > descri be i nformati on_schema. vi ews;

Entrando en MySQL
Entre en MySQL utilizando el comando mysql -u root -p . A partir de aqu usted ha abandonado Raspbian y ahora necesita escribir SQL. Aunque SQL es un estndar mundial, existen variaciones locales y MySQL es una versin particularmente amigable. Tienes que decir por favor al final de cada comando de otra forma no suceder nada.

Observe que la forma general del comando describe a la tabla dentro de la base de datos separada por un punto. por ejemplo:
pr0mpt> show fi el ds i n <nombre de l a base de datos>. <nombre de l a tabl a>

Trabaje sobre ello y practique estos ejemplos y pruebe sus propias alternativas para obtener el mximo provecho de este artculo. Una salida tpica es:

Aqu puede ver columnas (llamada campos) y otros detalles que sern explicados en breve.

Viendo los datos


El shortcut (atajo de teclado) para por favor es el punto y coma. Recuerda: si no tiene ; no har nada. Podemos ir ms lejos seleccionando todos los datos en cualquiera de las tablas. El carcter asterisco (*) es conocido como comodn y significa todo, as para seleccionar todo lo de una tabla escriba:
pr0mpt > sel ect * from i nformati on_schema. vi ews;

Inspeccionando las Bases de datos


Para ver las bases de datos existentes simplemente escriba:
pr0mpt > show databases;

Si olvida sus modales ingrese el "por favor" (;) en una lnea separada. Usted puede observar cuatro bases de datos por defecto. Antes de

Contina en la siguiente pgina...

27

Esto puede producir varias salidas - por ejemplo nada, un empty set. Observe tambin el tiempo aqu - El Pi toma cuarenta y un centsimas de segundo para producir esta salida.

Ahora puede decirle al sistema que use su nueva base de datos, entonce escriba:
pr0mpt > use magpi ;

Creando una Tabla


Una base de datos puede contener varias tablas segn hemos visto. Las tablas necesitan configurarse slo una vez, pero se debe especificar el tipo de datos y el tamao de los datos que se espera que contenga. Un comando genrico se observa como esto:
pr0mpt > create tabl e <nombre de l a tabl a> ( <col 1><ti po de datos de col 1>, <col 2><ti po de datos de col 2>, <col 3><ti po de datos de col 3>, ........., );

La otra opcin es representada por:


pr0mpt > sel ect * from i nformati on_schema. CHARACTER_SETS;

Esto produce lo que aparenta ser un lo, y lo es, pero se aprecia algo como esto:

un ejemplo ms utilizable:
pr0mpt > create tabl e tabl a_aves ( i d i nt NOT NULL AUTO_INCREMENT, fi rst_name char(25), town char(30) defaul t " Buenos Ai res" , dob date, bi rds i nt, record ti mestamp defaul t now(), pri mary key (i d) );

Todos los carcteres | + y - corresponden a lneas de borde de una tabla en crudo como esta:
+---------+---------+---------+----------+---------+----------+ | col_1 | col_2 | col_3 | col_4 | col_5 | col_6 | +---------+---------+---------+----------+---------+----------+ | dato | dato | dato | dato | dato | dato | | dato | dato | dato | dato | dato | dato | +---------+---------+---------+----------+---------+----------+

Ahora puede utilizar describe tabla_aves; para desplegar la ahora familiar descripcin:
+------------+-------------+------+-----+-------------------+----------------+ | Fi el d | Type | Nul l | Key | Defaul t | Extra |

+------------+-------------+------+-----+-------------------+----------------+ | id | i nt(11) | NO | PRI | NULL | | | | | | NULL | Buenos Ai res | NULL | NULL | auto_i ncrement | | | | | | | | | |

| fi rst_name | varchar(25) | YES | town | char(30) | date | i nt | ti mestamp | YES | YES | YES | NO

Creando una Base de Datos


Ahora la parte difcil. MySQL puede volverse muy complejo. Vamos a crear una base de datos llamada magpi. Escriba:
pr0mpt > create database magpi ;

| dob | bi rds | record

| CURRENT_TIMESTAMP |

+------------+-------------+------+-----+-------------------+----------------+ 6 rows i n set (0. 01 sec)

Compruebe si la base de datos ha sido creada:


pr0mpt > show databases;

La prxima vez observaremos cmo insertar datos dentro de tablas pre-cargadas y veremos los datos utilizando ordenamiento, bsqueda y expresiones lgicas.

Artculo Original de Richard Wenner


Este artculo se bas en http://pr0mpt.me - un recurso de vdeo gratuito.

28

(Gua de eventos de MagPi)

Quiere estar al da de todos los sucesos sobre Raspberry Pi en su zona?


Entonces, esta nueva seccin de MagPi es para ti! Nuestro objetivo es listar los eventos Raspberry Jam en su rea, proporcionando un calendario RPi para el prximo mes.
Est usted a cargo de organizar un evento Raspberry Pi? Deseas publicitarlo? Envanos un email a: editor@themagpi.com

Raspberry Pi Bloominglabs Meetup


Cundo: El primer martes de cada mes a las 7:00 pm Dnde: Bloomington, Indiana, EE.UU. Las reuniones son el primer martes de cada mes a las 7:00 pm hasta las 9:00 pm, todos son bienvenidos. Ms informacin disponible en http://bloominglabs.org

Manchester Raspberry Jamboree


Cundo: Sbado 09 de marzo 2013 a las 10:00 am Dnde: Sede de la Manchester Central Conference, M2 3GX, UK Se desarrollar desde las 10:00 am hasta las 4:00 pm y hay un nmero limitado de plazas. Entradas y ms informacin disponible en http://raspberryjamboree.eventbrite.com

Norwich Raspberry Pi User & DEV Group


When: Saturday 8th December 2012 @ 12:00pm Where: House Cafe, 52 St. Benedicts Street, Norwich, UK The meeting will run from 12:00pm until 5:00pm. Further information is available at http://norwichrpi.org

CERN Tarte au Framboise


Cundo: Sbado 08 de diciembre 2012 a las 12:00 pm Dnde: House Cafe, 52 St. Benedicts Street, Norwich, UK El encuentro se desarrollar desde las 12:00 pm hasta las 5:00 pm. Ms informacin disponible en http://norwichrpi.org

29

Python puede ejecutar subprocesos que funcionen por separado. Con este enfoque es posible crear cualquier nmero de widgets de escritorio. Vamos a crear dos widgets: un simple lector de noticias RSS y un downloader para La Foto Astronmica del Da.
Ejecuta magpi_widgets.py. Esto iniciar el widget_image.py widgets y widget_rss.py. Un simple CTRL + C en la terminal enviar un comando kill para cada subproceso. Este cdigo requiere algunos mdulos adicionales de Python que se puede instalar desde el terminal: sudo aptget install pythonsetuptools sudo easy_install2.7 pip sudo pip install feedparser # analiza RSS sudo pip install beautifulsoup4 # analiza HTML sudo aptget install pythonimagingtk # proporciona el manejo de imgenes

magpi_widgets.py :
# Widgets de Python usando pygame y subprocesos # Por ColinD 02 de noviembre 2012 import subprocess, os, signal, Tkinter, time # Ejecutar los subprocesos de widget sintase libre de aadir ms aqu! pImg = subprocess.Popen(["python","widget_image.py"],stdin=subprocess.PIPE) pRss = subprocess.Popen(["python","widget_rss.py"],stdin=subprocess.PIPE) # Enviar el ancho de la pantalla a los subprocesos r = Tkinter.Tk() width = r.winfo_screenwidth() pImg.stdin.write(str(width)+"\n") pRss.stdin.write(str(width)+"\n") # Ejecutar hasta los subrocesos subprocesos terminen por CTRLC try: while True: time.sleep(1) except KeyboardInterrupt: os.kill(pImg.pid, signal.SIGKILL) os.kill(pRss.pid, signal.SIGKILL)

widget_image.py :
import urllib, Image, pygame, os, sys, time from bs4 import BeautifulSoup # Leer stdin del proceso padre y calcular la posicin del widget de la pantalla baseXPos = int(sys.stdin.readline()) 200 10 os.environ['SDL_VIDEO_WINDOW_POS'] = str(baseXPos) + "," + str(30) # Mostrar una ventana sin bordes para contener la imagen windowSurface = pygame.display.set_mode((200,200), pygame.NOFRAME) while True: try: soup = BeautifulSoup( urllib.urlopen('http://apod.nasa.gov/apod/astropix.html')) # APOD tiene una etiqueta img para que podamos usar find en lugar de findAll imgTag = soup.find('img') imgUrl = imgTag['src']

PYTHON VERSION: 2.7.3rc2 PYGAME VERSION: 1.9.2a0 O.S.: Debian 7

30

imgName = os.path.basename(imgUrl) #Si la imagen ya existe, entonces no volver a descargar if not os.path.exists(imgName): urllib.urlretrieve("http://apod.nasa.gov/apod/"+imgUrl,imgName) # Descargar, cambiar el tamao y guardar la imagen para el widget imgOriginal = Image.open(imgName) imgResized = imgOriginal.resize((200, 200), Image.NEAREST) imgResized.save(imgName) imgLoad = pygame.image.load(imgName) windowSurface.blit(imgLoad, (0,0)) pygame.display.update() # Si se produce una excepcin omitir la descarga en este bucle except (IOError, TypeError, RuntimeError): print "Error downloading, will try again later" # Dormir durante 8 horas ya que no quiero spam en el servidor! time.sleep(28800) widget_rss.py : import pygame, os, sys, feedparser, time pygame.init() # Leer stdin del proceso padre y calcular la posicin del widget de la pantalla baseXPos = int(sys.stdin.readline()) 300 10 os.environ['SDL_VIDEO_WINDOW_POS'] = str(baseXPos) + "," + str(430) # Crea la ventana de pygame y rellena el fondo con bloques de color screen = pygame.display.set_mode((300,150)) pygame.draw.rect(screen,(80,140,80),(0,0,300,50)) pygame.draw.rect(screen,(80,80,80),(0,50,300,50)) pygame.draw.rect(screen,(160,160,160),(0,100,300,50)) # Define la fuente para la salida del texto RSS font = pygame.font.SysFont('dejavuserif', 10, True) while True: myFeed = feedparser.parse('http://www.raspberrypi.org/feed') # Hace que el ttulo de la ventana sea el nombre del blog pygame.display.set_caption(myFeed['feed']['title']+" RSS") # Obtener los artculos desde el RSS y la salida del texto for i in range(0, 3): layerText = pygame.Surface(screen.get_size()) outputText = (myFeed['items'][i].title, myFeed['items'][i].updated, myFeed['items'][i].link, myFeed['items'][i].description) # clear the surface each loop by filling with transparent pixels layerText.set_colorkey((0,0,0)) layerText.fill((0,0,0)) j=0 for line in outputText: j = layerText.get_rect().y + j + 5 text = font.render(line.rstrip('\n'), 0, (255,255,255)) textpos = text.get_rect() textpos.x = layerText.get_rect().x + 5 textpos.y = textpos.y+j layerText.blit(text, textpos) screen.blit(layerText, (0, 50*i)) pygame.display.flip() j = j +5 # Dormir durante una hora, evitar el spam en el servidor! time.sleep(3600)

Ideas de mejoras
La pantalla de los widgets slo se actualizar cuando busque nuevos contenidos para descargar, provocando la salida en blanco si se arrastra otra ventana en la parte superior. Trata de usar datetime de Python para determinar cundo se deben descargar nuevos contenidos, mientras que por separado actualiza la salida de la pantalla cada segundo.

31

El ao de The MagPi
Me propusieron por primera vez la idea de la revista MAGPI en marzo pasado en los foros de Raspberry Pi despus de leer muchos hilos de aquellos novatos en la programacin que queran aprender, pero no estaban seguros de cmo empezar o si tena suficiente experiencia para manejar el Raspberry Pi. En ese momento, no haba documentacin de cmo utilizar esta pequea computadora inteligente y la mayora de los tutoriales y proyectos se orientaron a aquellos con alguna experiencia en el uso de Linux o que tenan experiencia en programacin. Sent que esto podra alejar a un montn de principiantes del aprendizaje de su programacin o impedir que se enteraran de la gran variedad de proyectos que seran posibles en la Pi con un esfuerzo limitado. Sent que faltaba un eje central en la comunidad Raspberry Pi, para orientar al programador ms experimentado. Algo que les permitiera, adems de los foros, explicar en detalle a los dems cmo replicar sus proyectos, mostrar fotos y videos de casos, y responder a preguntas de la comunidad que ayuden a otros en una situacin similar. Viniendo del sector mdico con experiencia en la publicacin de artculos en revistas, pens que la mejor forma en que la comunidad puede comunicar su experiencia era crear un lugar centralizado donde todo el mundo pudiera acceder y compartir la informacin y los medios en una revista en lnea evaluada por colegas, pareca cubrir todo y cumplir con el espritu educativo de la fundacin. Durante los ltimos 8 meses, tanto la revista The MagPi como el equipo han evolucionado. Ahora somos una sociedad de responsabilidad limitada y trabajamos muy de cerca de la Fundacin Raspberry Pi.

acerca de Raspberry Pi, incluyendo la codificacin, la robtica, domtica, electrnica y tcnicas prcticas por nombrar algunos. Estamos agradecidos por todo el apoyo que nos han dado tanto la Fundacin Raspberry Pi como todos nuestros lectores. Nos hemos visto abrumados por la forma positiva en que fuimos recibidos, con una retroalimentacin constante que lo refleja y algunos grandes artculos sobre la revista incluyendo aquellos de The Wall Street Journal y de la BBC por Rory Cellan-Jones! Hemos crecido en tamao como equipo, con editores y colaboradores de todo el mundo, de todas las edades y de todas las profesiones, desde profesores de medicina, tcnicos a estudiantes. Para reflejar el inters global en la revista The MagPi se ha traducido al francs y al alemn tambin se est trabajando en la traduccin al chino y al espaol. Estamos sper emocionados por nuestros planes para el MAGPI en 201 3, incluyendo nuestro proyecto Kickstarter que da a los lectores la oportunidad de conseguir los ocho nmeros en una carpeta de edicin limitada. Esperamos que sigan apoyndonos en el nuevo Ao. Ash Stone Redactor jefe de The MagPi.

Animamos a los usuarios a enviar sus proyectos y cargarlos en el borrador de la edicin. Los lectores obtienen un primer atisbo de la prxima revista y pueden ofrecer sugerencias para corregir o aclarar lo que est escrito y algunos consejos o trucos que pueden ser beneficiosos.

En la actualidad producimos una revista de 32 pginas mensuales. Nuestro contenido comprende artculos sobre varios temas

The MagPi es una marca comercial de The MagPi Ltd. Raspberry Pi es una marca registrada de la Fundacin Raspberry Pi. La revista The MagPi se produjo en colaboracin por un grupo independiente de propietarios de Raspberry Pi, y no est afiliado de ninguna manera con la Fundacin Raspberry Pi. Est prohibido producir comercialmente esta revista sin la autorizacin impresa de The MagPi Ltd. La impresin para fines no comerciales es acordable bajo la licencia Creative Commons indicada abajo. The MagPi no acepta la propiedad o responsabilidad por el contenido ni las opiniones expresadas en cualquiera de los artculos incluidos en este nmero. Todos los artculos son revisados y probados antes que se cumpla la fecha lmite de lanzamiento, pero algunas fallas pueden permanecer. El lector es responsable de todas las consecuencias, tanto para software y hardware, a raz de la aplicacin de cualquiera de los consejos o cdigo impreso. The MagPi no pretende poseer las licencias de derechos de autor y todo el contenido de los artculos son sometidos a la responsabilidad que recae en el escritor del artculo. Este trabajo est licenciado bajo la licenca Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported. Para ver una copia de esta licencia, visite: http://creativecommons.org/licenses/by-nc-sa/3.0/ Alternativamente, enve una carta a Creative Commons, 444 Castro Street, Suite 900, Mountain

editor@themagpi.com

32

You might also like