Professional Documents
Culture Documents
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
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).
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
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.
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.
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.
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.
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..
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
Unido) .
Felicitaciones! PCSL le enviar en breve un correo electrnico con los detalles de cmo reclamar todos estos fantsticos premios.
11
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
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
Accesorio de Montaje 1
http://www.adafruit.com/datasheets/PCA9685.pdf
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
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.
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.
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
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))
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
16
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
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.
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.]
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)
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
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]
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;
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
AMPLIO MUNDO
Introduccin
Siguiendo con el nmero 6, vamos a continuar cubriendo los aspectos bsicos del lenguaje Ada.
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.
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.
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.
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.
Si olvida sus modales ingrese el "por favor" (;) en una lnea separada. Usted puede observar cuatro bases de datos por defecto. Antes de
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 ;
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
| CURRENT_TIMESTAMP |
La prxima vez observaremos cmo insertar datos dentro de tablas pre-cargadas y veremos los datos utilizando ordenamiento, bsqueda y expresiones lgicas.
28
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']
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