Aprèn a programar amb la CodePi
Unitat didàctica creada per a intruduir la programació a l’aula a partir del micro-ordinador Raspberry Pi i d’uns tutorials que ens permetran gestionar petits circuits electrònics de manera amena i entenedora.
Gabriel Esteban Gullón Ramon Fernández Mir Martí Serra Vivancos
Índex 1. Què es la Raspberry Pi?
3
2. Per a què la farem servir?
4
3. Què necessitarem per a muntar-la?
5
4. Aprèn a muntar la caixa de la CodePi
6
5. Afegim un sistema operatiu a la CodePi
9
6. Primer inici i configuració de la CodePi
13
7. Pràctiques
16
8. Vols saber-ne més?
32
9. Glos
34
1. Què és la Raspberry Pi? La RaspberryPi és una placa computadora de baix cost feta a partir de components per a telémòbils, és a dir, un petit ordinador amb les mateixes prestacions d’un smartphone de gama mitjana i amb sistema operatiu de base Linux. La Raspberry Pi va néixer a Anglaterra el 2009, com un projecte amb l’objectiu de crear un ordinador de molt baix cost (30$) per a popularitzar la programació entre els joves. Des del seu llançament, la fundació RaspberryPi ha venut més d’un milió de copies de la seva petita placa, i s’ha convertit en un dels símbols més representatius de l’electrònica actual. La comunitat d’aficionats a l’electrònica i la programació ha acollit molt bé a aquest producte, i es poden trobar infinitats de tutorials, projectes i d’altres curiositats a la xarxa.
3
2. Per a què la utilitzarem? Utilitzarem la RaspberryPi per a crear un ordinador amb el qual aprendrem electrònica i programació. A través de petits programes amb llenguatge C, podrem gestionar els ports de la GPIO que encendran i apagaran LEDs, llegiran els estats d’interruptors i LDRs, etc. Tot això ho farem d’una manera fàcil i entretinguda, a partir de diferents tutorials ordenats de menor a major dificultat, començant per principis bàsics de l’electrònica i la programació, fins a fer programes complexos per gestionar diferents LEDs segons diferents variables. Ara bé, abans de començar amb l’electrònica purament, hem de muntar la caixa que ens servirà per transportar la Raspberry Pi, el teclat, el ratolí, la protoboard, els components electrònics, etc.
4
3. Què necessitarem per a muntar-la? Aquests són els materials que necessitarem per muntar la CodePi. Per una banda tenim les fustes i d’altres eines que ens serviran per construir la caixa per transportar la CodePi.
Material
•Fusta de 320x320x6 (6 recomanat, però pot ser més gruixut) •Claus •Frontisses
3€ 1€ 1€
Eines
•Martell •Llima •Serra per a fusta (manual o elèctrica) •Cargol de banc
Per altra banda també necessitarem tots els components electrònics, eines per portar a terme els tutorials i, com no, la Raspberry Pi. Això és tot el que necesitarem: •Raspberry Pi model B •Targeta SDHC de com a mínim 4GB Classe 4 •Teclat •Ratolí convencional •Protoboard •Cables electrònics •LEDs •Resistències 180 i 10K ohms •Polsadors
33€ 7€ 5€ 5€ 4€ 3€ 1€ 1€ 1€
Preu total: 61€
5
4. Aprèn a muntar la caixa de la CodePi
Abans de començar a tallar la fusta prepararem el següent esquema en el nostre tauló de fusta. A la part del centre deixarem un espai de 6 mm per poder clavar bé una costat sobre un costat per acabar tenint una caixa de 160mm x 160mm.
Amb un regle i un llapis marquem les línies per on tallarem el tauló seguint l’esquema anterior.
A continuació, tallar el tauló amb una serra elèctrica. En cas de no tenir-ne, s’haurà de posar la fullola en un cargol de banc i tallar-la amb una serra manual. No passa res si la fusta no queda del tot ben tallada, ja que després podrem retocar les imperfeccions llimant-les i més endavant, posant massilla.
6
Atenció! És altament recomanable utilitzar guants i ulleres protectores durant tot el procés de manipulació de la fusta. Els guants ens protegiran de possibles talls, rascades o d’altres lesions a les mans. Les ulleres impediran que petites estelles de la fusta amb que estiguem treballant vagin a parar als ulls.
Agrupar les quatre parts que faran de parets de la caixa en un cargol de banc. Cal assegurar-se que per la part inferior les fustes estan igualades. És recomanable posar dues fustes entre la boca del cargol i el tauló, per impedir que aquesta es pugui malmetre a causa de la pressió.
Llimar les fustes verticalment, ja que d’aquesta manera es treballa sobre més superfície. Recomanem utilitzar una llima amb fulla molt rugosa, per poder realitzar el treball més ràpidament. Llimar també les dues peces que faran de tapa i contra tapa. Per millorar les llimadures, utilitzar una llima amb la fulla més fina o un paper de vidre.
7
Un cop les fustes estiguin ben llimades, utilitzar els claus per collar les parets. Cal prestar atenció en la posició dels claus, ja que la fusta és molt prima i es poden torçar. Aquest hauria de ser el resultat final:
Seguint el mateix procés, clavar la fullola que farà de tapa inferior. Cal vigilar a on es posen els claus, ja que pot ser que es toquin amb els que hem posat anteriorment.
Agafar les frontisses i clavar-les amb dos claus petits a la fullola que farà de tapa superior. Després, clavar els dos forats restants a una de les parets, aquesta farà de part posterior de la CodePi.
Recomanació: Si volem que la fusta ens duri durant més temps, és recomanable envernissar la caixa amb un vernís per a fustes.
8
5. Afegim un sistema operatiu a la CodePi 5.1 Descarregar Raspbian Per descarregar Raspbian, el sistema operatiu que utilitza la CodePi, haurem d’obrir una nova finestra del navegador i anar a la web de Raspberry Pi http://www.raspberrypi.org/ . És recomanable fer aquest procés al mateix ordinador en el que es procedirà a instal·lar Raspbian a la targeta SD. Recorda que aquest ordinador ha de tenir lector de targetes o un adaptador USB connectat! Després haurem d’anar a l’apartat de descàrregues, on trobarem tots els enllaços que necessitem per descarregar el sistema operatiu de la Raspberry Pi.
L’últim pas per descarregar Raspbian és clicar sobre l’enllaç on posa Direct Download. Es recomana realitzar aquest procés en un lloc amb una connexió estable i ràpida, ja que s’ha de descarregar molta informació. Després de clicar aquest enllaç se’ns obrirà una nova finestra i automàticament Raspbian començarà a descarregar-se. La descàrrega pot trigar entre 5 i 15 minuts depenent de la teva connexió a internet. Ja podem tancar aquesta finestra i continuar cap al pas següent. 9
5.2. Instal·lar Raspbian Una vegada que ja tenim descarregada l’última versió de Raspbian, segons el sistema operatiu des del que vulguem instal·lar-lo, haurem de seguir uns passos diferents per completar la instal·lació. Windows Per instal·lar Raspbian amb Windows haurem de descarregar i instal·lar Win32DiskImager. Abans de continuar amb la instal·lació, haurem de descomprimir el fitxer que ens hem descarregat. Per descomprimir-lo, utilitzarem un compressor d’arxius com (7zip). Clicant amb el botó dret sobre aquest arxiu i clicarem on posa descomprimir aquí, o buscarem el nom del nostre descompressor i després buscarem aquesta opció. Ara introduirem la targeta de memòria que vulguem utilitzar a l’entrada per targetes del nostre ordinador o a l’adaptador corresponent. A continuació iniciarem el programa i clicarem sobre el logo de la carpeta i escollirem el lloc on hem descomprimit el contingut del .zip, buscarem l’ar-xiu amb extensió .img i acceptarem el diàleg. Més tard escollirem en quin dispositiu volem instal·lar el sistema operatiu, aquest és un punt on hem d’estar segurs d’on estem instal·lant aquests arxius, ja que si l’estiguéssim instal·lant en una destinació diferent podríem perdre totes les dades de l’ordinador. Per saber a quin dispositiu hem d’instal·lar Raspbian obrirem “El Meu Ordinador” i buscarem la targeta de memòria, ens fixarem en quina lletra hi ha al final del nom, aquesta serà la mateixa que haurem de posar al programa. Quan ja haguem inserit aquests dos paràmetres al programa, clicarem sobre el botó de Write i es començara a instal·lar el sistema operatiu.
10
Linux Per instal·lar Raspbian des d’un sistema operatiu Linux utilitzarem l’ordre dd al terminal. Abans de fer servir aquest ordre haurem de descomprimir el contingut del .zip a la carpeta que vulguem (es recomana utilitzar la carpeta personal /home/usuari). Un cop tenim descomprimit el contingut del .zip obrirem una sessió al terminal i escriurem:
cd ~/
Anirem a la carpeta on hem descomprimit el .zip (la de l’usuari és per defecte o ~/)
df -h
Buscarem la targeta sd i el seu nom a la següent llista ens haurem d’apuntar el que posi a la primera columna com /dev/sdd (sense el numero) Assegureu-vos que aquest és el dispositiu on voleu instal·lar el Raspbian.
umount /dev/sdd1
Abans d’instal·lar Raspbian, haurem de desmuntar les particions corresponents a la targeta SD utilitzant l’ordre umount, en el cas de tenir més d’una partició, haurem d’executar aquesta ordre més d’una vegada.
sudo dd bs=4M if=~/2013-02-09wheezy-raspbian.img of=/dev/sdd
Ara executarem l’ordre dd amb permisos d’administrador, al modificador “if=/” posarem la carpeta on hem descomprimit el .zip (la de l’usuari és per defecte o ~/) amb el nom del arxiu .img descomprimit i al modificador “of=/” escriurem el que hem copiat abans amb l’anterior ordre.
11
Mac OS X Per instal·lar Raspbian a Mac OS X també utilitzarem l’ordre dd, pero el funcionament per buscar en quin disc volem instal·lar raspbian és diferent. Recomanem extreure el contingut del .zip a la carpeta /Users/usuari. diskutil list
diskutil unmountDisk /dev/disk4
sudo dd bs=1m if=~/2013-02-09wheezy-raspbian.img of=/dev/sdb
12
Començarem buscant la targeta on volem instal·lar raspbian executant la següent ordre i copiarem el disk4 (sense agafar la partició). Desmuntarem el disk en qüestió. Ara executarem l’ordre dd amb permisos d’administrador, al modificador “if=/” posarem la carpeta on hem descomprimit el .zip (la de l’usuari és per defecte o ~/) amb el nom de l’arxiu .img descomprimit i al modificador “of=/” escriurem el que hem copiat abans amb l’anterior ordre.
6. Primer inici i configuració de la CodePi Ara ja estem preparats per posar la targeta SD a la Raspberry Pi i connectar tots els cables per començar a programar. A continuació hem de seguir uns passos que només podrem fer durant la primera arrencada del sistema i que ens permetran iniciar l’escriptori automàticament, posar la CodePi en català i configurar la disposició del teclat, entre d’altres coses. Quan iniciem per primera vegada la Raspberry Pi amb el sistema operatiu Raspbian ens apareixerà la següent pantalla, on ens mourem utilitzant les fletxes i la tecla intro.
La primera cosa que seleccionarem serà “boot_ behavior”, que ens permetrà inciar l’escriptori quan el sistema iniciï.
Ens mourem amb el teclat (dreta - esquerre) per fer que estigui seleccionat “yes” clicarem enter.
13
Ara, a continuació ens mourem fins a “expand_ rootfs” que ens permetrà expandir el tamany de la partició arrel de la Raspberry Pi al tamany màxim de la targeta SD, és a dir, si tenim una targeta de 4 Gb, si no fessim aquesta opció estaríem utilitzant únicament 2 Gb de capacitat.
Acceptarem el següent diàleg i passarem a configurar els idiomes.
Buscarem “change_locale” per canviar els idiomes i la disposició del teclat al català.
De la següent llista seleccionarem mitjançant l’espai del teclat totes les codificacions que comencin per “CA_. Per baixar a buscar-les utilitzarem les fletxes (amunt-avall) i per acabar clicarem la del costat dret i enter.
14
Seleccionarem “change_timezone” per canviar la zona horària de la Raspberry Pi i els temes relacionats amb aquesta.
A continuació seleccionarem el nostre continent.
I per últim buscarem una ciutat que estigui a la mateixa zona horària que nosaltres i la seleccionaríem també amb enter.
6.4. Descarregar i executar Script Per descarregar l’script, hem donar permisos i executar-lo, així que escriurem les següents ordres en el terminal que podeu trobar a l’escriptori. cd tmp mkdir CodePi cd CodePi wget http://www.tomorrowdev.com/ codepi/wiringPi-install.sh chmod +x wiringPi-install.sh ./wiringPi-install.sh
Ja hem acabat de descarregar el programari que ens permetrà programar amb la CodePi! 15
7. Pràctiques Recomanació: mirar aquests tutorials introductoris al llenguatge C http://thenewboston.org/list. php?cat=14 Aquí teniu un quadre que us servirà l’equivalència entre els pins del GPIO i els que haurem de posar en el codi Ja queda menys perquè puguis començar a programar, però abans de fer-ho hauràs de saber com compilar un programa. Probablement, ara et preguntaràs, què és compilar?, doncs compilar és el procés que fa un programa per traduir el codi que nosaltres hem escrit a codi binari, amb la finalitat de que el nostre ordinador pugui entendre cada ordre. Per compilar un codi escrit en C farem servir el compilador cc. Abans d’utilitzar aquest programa, haurem d’indicar a on hem guardat la nostra pràctica amb l’ordre cd. cc -o practica
16
Primer de tot posarem l’ordre al terminal Utilitzarem el modificador -o per establir quin serà el nom del programa de sortida, per exemple “pràctica”.
-Wall
Amb aquest modificador indicarem que volem que ens doni tota la informació dels errors de sintaxis del fitxer
-I/usr/local/include
Amb aquest, indicarem on es troben els fitxers de la llibreria a incloure dintre del nostre fitxer
-L/usr/local/lib
Utilitzant aquest altre modificador, establim el directori on ha de buscar els fitxers de la llibreria
practica.c
Ara indicarem el nom del fitxer on es troba el nostre codi, sempre acabant amb la terminació *.c, per exemple “pràctica.c”.
-lwiringPi
Amb aquest modificador posem la llibreria wiringPi a la llista de llibreries que han de ser afegides.
Al final introduirem tot seguit al terminal una ordre similar a la següent: cc -o practica -Wall -I/usr/local/ include -L/usr/local/lib practica.c -lwiringPi A part de saber compilar, abans de començar a programar i a fer els nostres circuits haurem de saber quins són els pins on haurem de connectar als cables a la Raspberry Pi, aquest pins els identificarem utilitzant números. La següent taula ens permet saber l’equivalència entre els números de la GPIO, els números de wiringPi, la llibreria que interpretarà el nostre codi, i la posició dels pins.
17
7.0. Iniciació al llenguatge C Abans de començar a programar cal tenir en compte els conceptes de condicional i de cicle. Els condicionals “if - else” només executen el codi a continuació si la condició que li fiquem entre parèntesis és certa. Ho podríem comparar amb el que seria una oració condicional. No és obligatori, però podem afegir la partícula “else” que és l’equivalent a la paraula “si no”. En el cas a continuació, com que el condicional no es compleix, s’executaria l’else. if (X < 7) { // Fes alguna cosa } else { // Fes una altra cosa }
Si la variable X és més petita que 7, fes alguna cosa. Si la variable X no és més petita que 7, fes una altra cosa.
Els bucles “for” són rutines que serveixen per executar un codi un determinat número de vegades. Té tres parts separades per punt i coma: entrada, condició i increment. A la entrada li donem un valor a una variable. A la condició determinem que la rutina s’executi només si és compleix la condició, utilitzant la variable d’entrada. Finalment, en el increment, fixem un nou valor a la variable, aquesta part s’executarà a cada cicle. En llenguatge C, si no afegim cap dels tres paràmetres, el bucle serà infinit. for (int i = 1; i <= 10; i++) { // Fes alguna cosa }
Des que la variable i és igual a 1 fins i mentre que aquesta sigui igual o més petita que10, executa el codi.
La sentència “while” defineix que un codi s’executarà infinitament mentre que la condició que es defineix sigui certa. while (D==5) { // Fes alguna cosa }
18
Mentre que la variable D sigui igual a 5, el codi entre claus es llegirà infinites vegades.
7.1. Bloc 1 (Bàsic) 7.1.1. Hola món
En aquesta pràctica escriurem un text a la consòla, el conegut: “Hello World”. #include #include #include #include
<wiringPi.h> <stdlib.h> <unistd.h> <stdio.h>
int main (void) { printf(“hola, món”); if (wiringPiSetup() == -1) exit (1); return 0;
}
Hem d’importar aquestes llibreries per tal que la RaspberryPi entengui el codi. Aquesta és la funció principal (main) i s’executarà tot el que fiquem aquí dins. Amb la funció printf() el que aconseguim és que es mostri al terminal el text que hi posem entre comentes Aquestes línies de codi són simplement comprovacions per assegurar-nos que tot funciona correctament. Són negligibles però és recomanable posar-les. Les afegirem a totes les pràctiques.
7.1.2. Encendre un LED Connectarem la pota llarga (ànode) del LED al pin 5v de la GPIO i l’altre pota (càtode) a una resistència de 180Ω. Aquesta distinció entre potes es deu a que els LEDs estan polaritzats, mireu el glossari per saber-ne més. Tot seguit connecteu l’altra pota de la resistència al pin GROUND.
#include #include #include #include
<wiringPi.h> <stdlib.h> <unistd.h> <stdio.h>
int main (void) {
19
// Comprovacions if (wiringPiSetup() == -1) exit (1); int pin = 1; printf(“Encenem el pin 18”);
pinMode(pin, OUTPUT);
digitalWrite(pin, 1); return 0; }
7.1.3. Encendre i apagar un LED cada dos segons 10 vegades
20
El que podeu veure aquí és el que s’anomena un comentari del codi. Tot allò que escrivim després de “//”, el compilador no ho llegirà i, per tant, només serveix per donar indicacions al programador.
Declarem la variable pin que com és un nombre enter escriurem int. Fem un printf(), tal i com hem après a la pràctica anterior. Escrivim el 18, ja que la numeració de la llibreria wiringPi canvia respecte a la sortida real. (mirar el cuadre de la pàgina 17) Amb la funció pinMode() declarem que el pin número 1, en aquest cas, sigui un pin de sortida de corrent (OUTPUT). Una vegada li hem dit que és de sortida, li hem de dir si el volem encès “1” o apagat “0” amb la funció digitalWrite().
Utilitzarem el muntatge la de pràctica anterior amb la diferència que, en comptes de connectar l’ànode del LED al pin de 5v, el connectarem al pin 18 de la Raspberry Pi. D’aquesta manera, podrem gestionar el pas de l’electricitat a través d’un petit programa que crearem a continuació.
#include #include #include #include
<wiringPi.h> <stdlib.h> <unistd.h> <stdio.h>
int main (void) { int pin = 1; if (wiringPiSetup() == -1) exit (1); pinMode(pin, OUTPUT); for (int i=1;i<=10;i++)
{
printf(“LED On\n”); digitalWrite(pin, 1); delay(2000); printf(“LED Off\n”); digitalWrite(pin, 0);
}
delay(2000);
return 0;
Utilitzem un bicle “for” per executar el codi 10 vegades. Encenem el LED. Fem un delay() de 2000 mil·lisegons (2 segons) que ens serveix per aturar el programa i, per tant mantenir el LED encès durant aquest temps. Apaguem el LED. El mantenim apagat 2 segons. L’expressió \n serveix per canviar de línia.
}
Proposta! Ara que ja saps els conceptes bàsics de la CodePi, intenta fer
l’equivalent al codi Morse per demanar ajuda: SOS · · · – – – · · · (on cada punt significa LED encès durant 1/4 de segon i cada ralla LED encès durant mig segon). Juga amb el valor de la funció delay() per fer que el LED estigui encès durant més o menys temps.
21
7.2. Bloc 2 (Mitjà)
7.2.1. Encendre un LED apretant un botó Utilitzar el muntatge del LED que hem fet servir a la pràctica anterior. A més a més, hem d’afegir un polsador. Connectarem la pota superior esquerra del polsador al pin de 5v i la inferior esquerra al pin 23 de la GPIO. Connectem a la pota que anirà a parar al pin 23 una resistència de 10KΩ al GROUND per forçar l’estat LOW quan el polsador no està apretat.
#include #include #include #include
<wiringPi.h> <stdlib.h> <unistd.h> <stdio.h>
int main (void) { int pin_LED = 1; int pin_boto = 4; printf (“Encenent un LED apretant un botó.\n”) ; if (wiringPiSetup() == -1) exit (1); pinMode(pin_LED, OUTPUT); pinMode(pin_boto, INPUT); for (;;){ while (digitalRead (pin_boto) == 1) { digitalWrite(pin_LED, 1); } else
{
}
digitalWrite(pin_LED, 0);
} return 0 ;
22
}
Declarem el LED com un pin de sortida. I el botó com un pin d’entrada. Si no fiquem variables al for, aquest s’executarà sempre. Amb la funció digitalRead() detectem si passa corrent pel pin 8, és a dir, si el botó ha estat apretat. Si és així, fem que s’encengui el LED. Si no, fem que s’apagui.
7.2.2. Encendre un LED apretant tots els puladors Utilitzar el muntatge de la pràctica anterior i afegir dos polsadors més amb el mateix procés connectats als ports 24 i 25 de la Raspberry Pi.
#include #include #include #include
<stdio.h> <stdlib.h> <unistd.h> <wiringPi.h>
int main (void) { int pin_LED int int int
= 1;
pin_boto_A = 4; pin_boto_B = 5; pin_boto_C = 6;
if (wiringPiSetup() == -1) exit (1); pinMode(pin_LED, OUTPUT); pinMode(pin_boto_A, INPUT); pinMode(pin_boto_B, INPUT); pinMode(pin_boto_C, INPUT); for (;;) { // Apretats while (digitalRead(pin_boto_A) == HIGH && digitalRead(pin_boto_B) == HIGH && digitalRead(pin_boto_C) == HIGH) { digitalWrite(pin_LED, 1); }
Declarem el LED i els tres botons que, tal i com posa a l’esquema, corresponen als pins 23, 24 i 25 de la GPIO.
Si els tres polsadors estan premuts, passa corrent pels tres i, per tant, s’encén el LED. En aquest cas utilitzem HIGH i LOW en lloc de 1 i 0 respectivament. HIGH significa que hi ha electricitat i LOW que no hi ha.
23
// No apretats while (digitalRead(pin_boto_A) == LOW && digitalRead(pin_boto_B) == LOW && digitalRead(pin_boto_C) == LOW) { digitalWrite(pin_LED, 0); } }
Si no, apaga’l.
}
7.2.3. Semàfor amb polsador En aquesta pràctica crearem un semàfor de vianants i de cotxes. Com alguns semàfors, aquests té un botó amb el qual els vianants demanen que es posi verd, així que el dels cotxes es posa vermell. Connectarem dos LEDs (vermell i verd) als pins 18 i 23 de la Raspberry Pi amb una resistència de 180Ω. També connectarem tres LEDs més (verd, vermell i taronja) de la mateixa manera en els ports 17, 21 i 22 de la GPIO. A diferència de les altres pràctiques amb polsadors, en aquesta el connectarem al port SDA0 i al GROUND ja que només ens interessa detectar quan es prem.
24
#include #include #include #include
<stdio.h> <stdlib.h> <unistd.h> <wiringPi.h>
#define #define #define #define #define
VERMELL 0 GROC 1 VERD 2 VERMELL_HOME 3 VERD_HOME 4
#define
BOTO
8
void setup (void) { int i ; if (geteuid () != 0) { exit (0) ; }
Amb l’expressió #define, li diem a la màquina que cada cop que escrivim VERMELL, en realitat estem posant el nombre 0 i el mateix amb les altres paraules.
Fem un setup amb tota la configuració necessària.
if (wiringPiSetup () == -1) exit (1) ; fflush (stdout) ; for (i = 0 ; i < 5 ; ++i) { pinMode (i, OUTPUT) ; digitalWrite (i, 0) ; } digitalWrite (VERD, 1) ; digitalWrite (VERMELL_HOME, 1) ; pinMode (BOTO, INPUT) ; }
fflush() és una funció complexa que serveix per qüestions de tractament de memòria del sistema per evitar errors.
printf (“Setup fet\n”) ;
int main (void) { setup () ; for (;;) { esperaBoto () ; aturaTransit () ; camina () ; tempsEspera () ; iniciaTransit () ; } }
Executem totes les funcions una darrera l’altra de manera indefinida.
25
void esperaBoto (void) { printf (“Esperant el botó ... “); fflush (stdout); while (digitalRead (BOTO) == HIGH) delay (100) ; printf (“Esoere\n”) ; }
Esperant a que l’usuari premi el botó per començar.
void aturaTransit() { printf (“Aturant el trafic ... “) ; fflush (stdout) ; digitalWrite (VERD, 0) ; digitalWrite (GROC, 1) ; delay (2000) ; digitalWrite (GROC, 0) ; digitalWrite (VERMELL, 1) ; delay (2000) ; printf (“Aturats\n”) ; }
Fem que el semàfor dels cotxes canviï de verd a vermell passant pel groc.
void camina () { printf (“Camina ... “) ; fflush (stdout) ;
Fem que el semàfor dels vianants es posi verd.
digitalWrite (VERMELL_HOME, 0) ; digitalWrite (VERD_HOME, 1) ; delay (10000) ; digitalWrite (VERMELL, 0) ; digitalWrite (GROC, 1) ; }
printf (“Ja han caminat\n”) ;
void tempsEspera () { int i ; printf (“Temps d’espera ... “) ; fflush (stdout) ; for (i = 0 ; i < 8 ; ++i) { 26
Temps intermig des que s’acaba de caminar fins que el trafic comença.
delay (500) ; digitalWrite (VERD_HOME, 0) ; digitalWrite (GROC, 0) ; delay (500) ; digitalWrite (VERD_HOME, 1) ; digitalWrite (GROC, 1) ; } } void iniciaTransit () { printf (“Iniciant trafic ... “) ; fflush (stdout) ;
Deixem via lliure pels vehicles i posem el semàfor vermell pels vianants.
digitalWrite (VERD_HOME, 0) ; digitalWrite (VERMELL_HOME, 1) ; delay (500) ; digitalWrite (GROC, 0) ; digitalWrite (VERD, 1) ; }
Proposta!
Utilitzant el que has après en aquest bloc, crear un projecte amb uns quants LEDs en fila que s’activin ascendentment quan apretes un botó.
27
7.3. Bloc 3 (Alt)
7.3.1. Sistema portes lògiques I #include #include #include #include
<stdio.h> <stdlib.h> <unistd.h> <wiringPi.h>
int AND (int a, int b) { return a && b; } int OR (int a, int b) { return a || b; }
El següent projecte fa la mateixa funció que aconseguiríem amb xips de portes lògiques però fent els càlculs a partir de la RaspberryPi. En aquest cas, compleix la taula de la veritat d’un OR exclusive, és a dir, només s’encendrà el LED quan premem un dels dos botons, mai s’encendrà si premem els dos o no en premem cap. Hem de crear un circuit amb dos botons i un LED, connectats als ports del GPIO que s’utilitzin en el codi. Crearem una funció per a cada porta lògica de tal manera que sigui més fàcil poder-ho aplicar després.
int NEGADA (int a) { return !a; } int f(int a, int b) { return OR(AND(NEGADA(a),b),AND(a,NEGADA(b))); // f(a, b) = a’b + ab’ } int main (void) { int pin_LED_S int int
= 1;
pin_boto_A = 4; pin_boto_B = 5;
int apretat_A int apretat_B
= 0; = 0;
pinMode(pin_LED_S, OUTPUT); pinMode(pin_boto_A, INPUT); pinMode(pin_boto_B, INPUT);
28
Aquesta serà la fórmula que complirà la taula de la veritat, en aquest cas és f(a, b) = a’b +ab’.
Creem dos booleans (variables que poden ser 0 o 1) que ens indicaran si el botó ha estat premut o no.
Declarem els pins d’entrada i de sortida com a totes les pràctiques anteriors.
for (;;) { // Apretat while (digitalRead(pin_boto_A) == LOW) { apretat_A = 1; } while (digitalRead(pin_boto_B) == LOW) { apretat_B = 1; } // No apretat while (digitalRead(pin_boto_A) == LOW) { apretat_A = 0; } while (digitalRead(pin_boto_B) == LOW) { apretat_B = 0; } // Mostra resultat if (f(apretat_A, apretat_B) ==
1)
}
Comprovem quins estan premuts.
Comprovem quins no estan premuts.
I apliquem la fórmula amb els valors d’entrada corresponents. Si la fórmula és igual a 1, s’encendrà el LED, si no, no s’encendrà.
{
}
digitalWrite(pin_LED_S, HIGH); } else { digitalWrite(pin_LED_S, LOW); }
7.3.2. Sistema portes lògiques II #include #include #include #include
<stdio.h> <stdlib.h> <unistd.h> <wiringPi.h>
Partim de la mateixa base que la pràctica anterior però en aquesta incloem una tercera variable d’entrada. Així que hem d’afegir un nou botó en el pin del GPIO que s’escau.
29
int AND (int a, int b) { return a && b; }
Seguim el patró de les fórmules emprades a la pràctica anterior.
int OR (int a, int b) { return a || b; } int NEGADA (int a) { return !a; } int f(int a, int b, int c) { return OR(c, AND(NEGADA(a),b)); // f(a, b, c) = c + a’b } int main (void) { int pin_LED_S int int int
= 1;
pin_boto_A = 4; pin_boto_B = 5; pin_boto_C = 6;
int apretat_A int apretat_B int apretat_C
En aquest cas tenim tres variables d’entrada, però la mecànica és la mateixa. Es pot jugar amb la fórmula i anar provant diferents combinacions
= 0; = 0; = 0;
Necessitem tres variables ja que hi ha tres botons.
Declaracions.
pinMode(pin_LED_S, OUTPUT); pinMode(pin_boto_A, INPUT); pinMode(pin_boto_B, INPUT); pinMode(pin_boto_C, INPUT); for (;;) { // Apretat while (digitalRead(pin_boto_A) == HIGH) { apretat_A = 1; } 30
Comprovem quins estan premuts.
while (digitalRead(pin_boto_B) == HIGH) { apretat_B = 1; } while (digitalRead(pin_boto_B) == HIGH) { apretat_C = 1; } // No apretat while (digitalRead(pin_boto_A) == LOW) { apretat_A = 0; } while (digitalRead(pin_boto_B) == LOW) { apretat_B = 0; } while (digitalRead(pin_boto_C) == LOW) { apretat_C = 0; }
Comprovem quins no estan premuts.
Com al circuit anterior, apliquem la fórmula i si aquesta dóna 1, encenem el LED.
// Mostra resultat if (f(apretat_A, apretat_B, apretat_C) == 1) { digitalWrite(pin_LED_S, HIGH); } else { digitalWrite(pin_LED_S, LOW); } } }
Proposta! Ara que ja has après els conceptes més fonamentals de la CodePi,
inventa’t un circuit amb el nivell de dificultat que consideris. No et quedis amb el que se t’ha ensenyat aquí sinó que cerca més mètodes que puguis utilitzar. La creativitat és bàsica per a tot bon enginyer i, amb aquesta pràctica volem que demostris de què ets capaç. 31
8. Vols saber-ne més? El món de la programació i l’electrònica és infinit. La comunitat geek (= interessada) en aquests temes és una de les més servicials i altruista de tota la xarxa, així que es poden trobar una quantitat inacabable de tutorials i pàgines web especialitzades en el que vulguem saber.
8.1. Programari lliure El programari lliure és la base de la informàtica actual, i encara juga un gran paper en algunes àrees com els servidors web o els mòbils amb sistema operatiu Android. Aquí teniu un conjunt de pàgines on podeu aprofundir sobre aquest apassionant món de la llibertat digital. http://ca.wikipedia.org/wiki/Richard_Matthew_ Stallman http://www.fsf.org/ http://www.gnu.org/ http://www.linux.org/ http://www.unix.org/ http://www.ubuntu.com/
8.2. Raspberry Pi Si desitges saber més sobre el projecte sense ànim de lucre Raspberry Pi i seguir fent projectes amb ella, visita les pagines que trobaràs a continuació. Aquestes et donaran idees de què fer amb aquest petit però fascinant ordinador. http://learn.adafruit.com/category/learn-raspberry-pi http://www.raspberrypi.org/ www.raspberrypi.org http://dangerousprototypes.com/2013/02/02/raspberry-pi-supercomputer/ http://reviews.cnet.co.uk/desktops/25-fun-thingsto-do-with-a-raspberry-pi-50009851/ http://learn.adafruit.com/pi-thermal-printer
32
8.3. Electrònica Si l’electrònica bàsica que has après durant els tutorials de la CodePi t’ha fet veure que aquest és el món que a tu t’agrada, no paris. A continuació et deixem pàgines web on trobaràs les bases de l’electrònica més complexa i també molts nous circuits per muntar i seguir descobrint aquest món que, avui en dia, fa que tots els aparells endollats a al corrent puguin funcionar. http://www.instructables.com/id/Beginners-Electronics-Projects/ http://www.instructables.com/id/Electronic-Projects-For-Beginners/ http://www.circuitstoday.com/simple-electronics-projects-and-circuits https://www.sparkfun.com/tutorials http://learn.adafruit.com/
8.4. Programació Diuen que per ser un bon programador s’han de tenir unes habilitats que no tothom té: disciplina, ordre, lògica, creativitat, capacitat per resoldre qualsevol problema i per sobre de tot persistència i passió. Si creus que tens aquestes qualitats, dona-li una oportunitat a la programació. A continuació et deixem un recull de les pàgines web que creiem que més et poden ajudar a introduir-te, una mica més, en la programació web i la d’aplicacions per a mòbils. http://www.code.org/ http://scratch.mit.edu/ http://www.codecademy.com/
33
9. Glossari C (llenguatge de programació): Des de la
seva creació l’any 1972 s’ha consolidat com un dels llenguatges de programació més utilitzats per fer aplicacions de software. És considerat un dels més bàsics i més comuns per introduir-se a la programació. Les grans companyies han utilitzat el C com a base per crear altres llenguatges com l’Objective-C (utilitzat per fer les aplicacions per dispositius d’Apple) o el C# (creat per Microsoft i utilitzat, entre altres coses, per fer programes informàtics per Windows).
Condensador: Component electrònic classificat
dins del grup dels passius i que, per tant, no emet cap senyal. El podríem definir com un acumulador d’electrons que els deixa anar quan arriba a la seva capacitat màxima. Hi ha condensadors de dos tipus: els electrolítics i els normals. En les pràctiques utilitzarem electrolítics i com que aquests tenen polaritat és important tenir en compte quina és la pota positiva i quina és la negativa a l’hora de connectar-lo.
Díode: Component electrònic passiu. Té polaritat
i seria l’equivalent a una vàlvula antiretorn, l’electricitat només pot anar en un sentit.
Electrònica: Disciplina que estudia els components electrònics que funcionen amb un flux d’electrons (corrent continua).
Funció: Fragment de codi que conte un seguit
d’accions i que hi pots accedir cridant la funció en comptes de repetint el codi. Podríem comparar-ho amb una funció matemàtica en la que tenim variables d’entrada que, tractant-les a la funció, obtenim una informació de sortida.
GPIO: Són les sigles de “General Purpose Input/
Output”. Si mirem la Raspberry Pi, són els pins de sortida on hi connectem els cables amb els que programem la placa electrònica. L’avantatge d’aquest tipus de connector respecte altres és que es pot gestionar mitjançant programació i això és precisament el que explicarem en aquest manual. 34
HDMI: Són les sigles de “High-Definition Multimedia Interface”. Serveix per enviar vídeo i àudio a una pantalla. Nosaltres l’utilitzarem per connectar la RaspberryPi a una pantalla.
LED: Acrònim de “Light Emitting Diode”. És un
tipus de díode el qual té una pel·lícula de fòsfor entre els dos connectors que fa que quan passi el corrent, generi llum. Com qualsevol altre díode, és important tenir en compte la polaritat.
RAM: Acrònim de “Random Access Memory”. És
la part de l’ordinador encarregada d’emmagatzemar els arxius temporals.
RCA: El connector RCA consisteix en diferents
cables amb la punta de diferent color que serveixen per transmetre àudio i vídeo.
ROM: De l’anglès “Read Only Memory”, és la unitat de memòria on es guarda el sistema operatiu.
Resistència: És un component electrònic que té
com a funció reduir el flux d’electrons, a fi de controlar la seva potència. És molt comú a l’electrònica ja que és molt necessari per assegurar-nos del correcte funcionament d’elements com el LED que, sense una resistència que limités el corrent, podrien cremar-se.
Placa base: És la part de l’ordinador que conté
elements com la RAM, la ROM o el microprocessador. La placa base de l’ordinador que construirem amb aquest manual seria la pròpia Raspberry Pi.
Protoboard: També coneguda com a Bread-
board, s’utilitza per crear circuits electrònics sense necessitat de soldar. Per saber com funciona i com estan relacionats els diferents contactes, consulteu aquesta web: http://rduinostar.com/documentacion/general/protoboard-que-es-y-como-funciona/
35
Terminal: És el programa emprat per enviar
ordres directes a l’ordinador i rebre respostes d’aquest. Nosaltres l’utilitzarem per instal·lar els programes necessaris per programar les plaques electròniques i altres arxius necessaris.
Variable: Valor que canvia segons les operacions
que es facin amb aquest al programa informàtic. Com ja sabeu, hi ha variables independents (p.e. el temps) i dependents (p.e. si està o no encès un LED, que dependrà d’altres variables).
36
37