37
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

CodePi

Embed Size (px)

DESCRIPTION

CodePi tutorial.

Citation preview

Page 1: CodePi

Apregraven a programar amb la CodePiUnitat didagravectica creada per a intruduir la programacioacute a lrsquoaula a partir del micro-ordinador Raspberry Pi i drsquouns tutorials que ens permetran gestionar petits circuits electrogravenics de manera amena i entenedora

Gabriel Esteban GulloacutenRamon Fernaacutendez MirMartiacute Serra Vivancos

Iacutendex

1 Quegrave es la Raspberry Pi

2 Per a quegrave la farem servir

3 Quegrave necessitarem per a muntar-la

4 Apregraven a muntar la caixa de la CodePi

5 Afegim un sistema operatiu a la CodePi

6 Primer inici i configuracioacute de la CodePi

7 Pragravectiques

8 Vols saber-ne meacutes

9 Glos

3

4

5

6

9

13

16

32

34

3

1 Quegrave eacutes la Raspberry PiLa RaspberryPi eacutes una placa computadora de baix cost feta a partir de components per a teleacutemogravebils eacutes a dir un petit ordinador amb les mateixes prestacions drsquoun smartphone de gama mitjana i amb sistema operatiu de base Linux

La Raspberry Pi va neacuteixer a Anglaterra el 2009 com un projecte amb lrsquoobjectiu de crear un ordinador de molt baix cost (30$) per a popularitzar la programacioacute entre els joves

Des del seu llanccedilament la fundacioacute Raspber-ryPi ha venut meacutes drsquoun milioacute de copies de la seva petita placa i srsquoha convertit en un dels siacutembols meacutes representatius de lrsquoelectrogravenica actual La comunitat drsquoaficionats a lrsquoelectrograveni-ca i la programacioacute ha acollit molt beacute a aquest producte i es poden trobar infinitats de tuto-rials projectes i drsquoaltres curiositats a la xarxa

4

2 Per a quegrave la utilitzaremUtilitzarem la RaspberryPi per a crear un ordi-nador amb el qual aprendrem electrogravenica i pro-gramacioacute A traveacutes de petits programes amb llenguatge C podrem gestionar els ports de la GPIO que encendran i apagaran LEDs lle-giran els estats drsquointerruptors i LDRs etc

Tot aixograve ho farem drsquouna manera fagravecil i entretin-guda a partir de diferents tutorials ordenats de menor a major dificultat comenccedilant per prin-cipis bagravesics de lrsquoelectrogravenica i la programacioacute fins a fer programes complexos per gestion-ar diferents LEDs segons diferents variables

Ara beacute abans de comenccedilar amb lrsquoelectrogravenica pu-rament hem de muntar la caixa que ens serviragrave per transportar la Raspberry Pi el teclat el ratoliacute la protoboard els components electrogravenics etc

5

3 Quegrave necessitarem per a muntar-laAquests soacuten els materials que necessitarem per muntar la CodePi Per una banda tenim les fus-tes i drsquoaltres eines que ens serviran per construir la caixa per transportar la CodePi

MaterialbullFusta de 320x320x6 (6 recomanat perograve pot ser meacutes gruixut)bullClaus bullFrontisses

EinesbullMartellbullLlima bullSerra per a fusta (manual o elegravectrica)bullCargol de banc

Per altra banda tambeacute necessitarem tots els components electrogravenics eines per portar a terme els tutorials i com no la Raspberry Pi Aixograve eacutes tot el que necesitarem

bullRaspberry Pi model BbullTargeta SDHC de com a miacutenim 4GB Classe 4 bullTeclatbullRatoliacute convencionalbullProtoboardbullCables electrogravenicsbullLEDsbullResistegravencies 180 i 10K ohmsbullPolsadors

3euro1euro1euro

33euro7euro5euro5euro4euro3euro1euro1euro1euro

Preu total 61euro

6

4 Apregraven a muntar la caixa de la CodePi

Abans de comenccedilar a tallar la fusta prepararem el seguumlent esquema en el nostre tauloacute de fusta A la part del centre deixarem un espai de 6 mm per poder clavar beacute una costat sobre un costat per acabar tenint una caixa de 160mm x 160mm

Amb un regle i un llapis marquem les liacutenies per on tallarem el tauloacute seguint lrsquoesquema anterior

A continuacioacute tallar el tauloacute amb una serra elegravec-trica En cas de no tenir-ne srsquohauragrave de posar la fullola en un cargol de banc i tallar-la amb una ser-ra manual

No passa res si la fusta no queda del tot ben tal-lada ja que despreacutes podrem retocar les imperfec-cions llimant-les i meacutes endavant posant massilla

7

Atencioacute Eacutes altament recomanable utilitzar guants i ulleres protectores durant tot el proceacutes de manip-ulacioacute de la fusta

Els guants ens protegiran de possibles talls ras-cades o drsquoaltres 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 Eacutes recomanable posar dues fustes entre la boca del cargol i el tauloacute per impedir que aquesta es pugui malmetre a causa de la pressioacute

Llimar les fustes verticalment ja que drsquoaquesta manera es treballa sobre meacutes superfiacutecie Reco-manem utilitzar una llima amb fulla molt rugosa per poder realitzar el treball meacutes ragravepidament Llimar tambeacute les dues peces que faran de tapa i contra tapa

Per millorar les llimadures utilitzar una llima amb la fulla meacutes fina o un paper de vidre

8

Un cop les fustes estiguin ben llimades utilitzar els claus per collar les parets Cal prestar atencioacute en la posicioacute dels claus ja que la fusta eacutes molt prima i es poden torccedilar Aquest hauria de ser el resultat final

Seguint el mateix proceacutes clavar la fullola que faragrave de tapa inferior Cal vigilar a on es posen els claus ja que pot ser que es toquin amb els que hem po-sat anteriorment

Agafar les frontisses i clavar-les amb dos claus pe-tits a la fullola que faragrave de tapa superior Despreacutes clavar els dos forats restants a una de les parets aquesta faragrave de part posterior de la CodePi

Recomanacioacute Si volem que la fusta ens duri du-rant meacutes temps eacutes recomanable envernissar la caixa amb un verniacutes per a fustes

9

Per descarregar Raspbian el sistema operatiu que utilitza la CodePi haurem drsquoobrir una nova fi-nestra del navegador i anar a la web de Raspberry Pi httpwwwraspberrypiorg

Eacutes recomanable fer aquest proceacutes al mateix ordi-nador en el que es procediragrave a instalmiddotlar Raspbian a la targeta SD

Recorda que aquest ordinador ha de tenir lector de targetes o un adaptador USB connectatDespreacutes haurem drsquoanar a lrsquoapartat de descagraverreg-ues on trobarem tots els enllaccedilos que necessitem per descarregar el sistema operatiu de la Rasp-berry Pi

5 Afegim un sistema ope- ratiu a la CodePi

51 Descarregar Raspbian

Lrsquouacuteltim pas per descarregar Raspbian eacutes clicar sobre lrsquoenllaccedil on posa Direct Download Es reco-mana realitzar aquest proceacutes en un lloc amb una connexioacute estable i ragravepida ja que srsquoha de descar-regar molta informacioacute

Despreacutes de clicar aquest enllaccedil sersquons obriragrave una nova finestra i automagraveticament Raspbian comenccedilaragrave a descarregar-se La descagraverrega pot trigar entre 5 i 15 minuts depenent de la teva con-nexioacute a internet Ja podem tancar aquesta finestra i continuar cap al pas seguumlent

10

52 Instalmiddotlar RaspbianUna vegada que ja tenim descarregada lrsquouacuteltima versioacute de Raspbian segons el sistema opera-tiu des del que vulguem instalmiddotlar-lo haurem de seguir uns passos diferents per completar la in-stalmiddotlacioacute

Windows

Per instalmiddotlar Raspbian amb Windows haurem de descarregar i instalmiddotlar Win32DiskImager Abans de continuar amb la instalmiddotlacioacute haurem de de-scomprimir el fitxer que ens hem descarregat Per descomprimir-lo utilitzarem un compressor drsquoarxius com (7zip) Clicant amb el botoacute dret so-bre aquest arxiu i clicarem on posa descomprimir aquiacute o buscarem el nom del nostre descompres-sor i despreacutes buscarem aquesta opcioacute

Ara introduirem la targeta de memograveria que vul-guem utilitzar a lrsquoentrada per targetes del nostre ordinador o a lrsquoadaptador corresponent

A continuacioacute iniciarem el programa i clicarem sobre el logo de la carpeta i escollirem el lloc on hem descomprimit el contingut del zip buscarem lrsquoar-xiu amb extensioacute img i acceptarem el diagraveleg Meacutes tard escollirem en quin dispositiu volem in-stalmiddotlar el sistema operatiu aquest eacutes un punt on hem drsquoestar segurs drsquoon estem instalmiddotlant aquests arxius ja que si lrsquoestigueacutessim instalmiddotlant en una destinacioacute diferent podriacuteem perdre totes les dades de lrsquoordinador Per saber a quin dispositiu hem drsquoinstalmiddotlar Raspbian obrirem ldquoEl Meu Ordinadorrdquo i buscarem la targeta de memograveria ens fixarem en quina lletra hi ha al final del nom aquesta seragrave la mateixa que haurem de posar al programaQuan ja haguem inserit aquests dos paragravemetres al programa clicarem sobre el botoacute de Write i es comenccedilara a instalmiddotlar el sistema operatiu

11

Linux

Per instalmiddotlar Raspbian des drsquoun sistema operatiu Linux utilitzarem lrsquoordre 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 homeusu-ari)

Un cop tenim descomprimit el contingut del zip obrirem una sessioacute al terminal i escriurem

cd ~

df -h

umount devsdd1

sudo dd bs=4M if=~2013-02-09-wheezy-raspbianimg of=devsdd

Anirem a la carpeta on hem descomprimit el zip (la de lrsquousuari eacutes per defecte o ~)

Buscarem la targeta sd i el seu nom a la seguumlent llista ens haurem drsquoapuntar el que posi a la prime-ra columna com devsdd (sense el numero) Assegureu-vos que aquest eacutes el dispositiu on vo-leu instalmiddotlar el Raspbian

Abans drsquoinstalmiddotlar Raspbian haurem de des-muntar les particions corresponents a la targeta SD utilitzant lrsquoordre umount en el cas de tenir meacutes drsquouna particioacute haurem drsquoexecutar aquesta ordre meacutes drsquouna vegada

Ara executarem lrsquoordre dd amb permisos drsquoadmi- nistrador al modificador ldquoif=rdquo posarem la carpeta on hem descomprimit el zip (la de lrsquousuari eacutes per defecte o ~) amb el nom del arxiu img descom-primit i al modificador ldquoof=rdquo escriurem el que hem copiat abans amb lrsquoanterior ordre

12

Mac OS X

Per instalmiddotlar Raspbian a Mac OS X tambeacute utilitza-rem lrsquoordre dd pero el funcionament per buscar en quin disc volem instalmiddotlar raspbian eacutes diferent Recomanem extreure el contingut del zip a la car-peta Usersusuari

Comenccedilarem buscant la targeta on volem instalmiddotlar raspbian executant la seguumlent ordre i copiarem el disk4 (sense agafar la particioacute)

Desmuntarem el disk en quumlestioacute

Ara executarem lrsquoordre dd amb permisos drsquoadmi- nistrador al modificador ldquoif=rdquo posarem la carpeta on hem descomprimit el zip (la de lrsquousuari eacutes per defecte o ~) amb el nom de lrsquoarxiu img descom-primit i al modificador ldquoof=rdquo escriurem el que hem copiat abans amb lrsquoanterior ordre

diskutil list

diskutil unmountDisk devdisk4

sudo dd bs=1m if=~2013-02-09-wheezy-raspbianimg of=devsdb

13

6 Primer inici i configuracioacute de la CodePiAra ja estem preparats per posar la targeta SD a la Raspberry Pi i connectar tots els cables per comenccedilar a programar A continuacioacute hem de se-guir uns passos que nomeacutes podrem fer durant la primera arrencada del sistema i que ens perme-tran iniciar lrsquoescriptori automagraveticament posar la CodePi en catalagrave i configurar la disposicioacute del te-clat entre drsquoaltres coses

Quan iniciem per primera vegada la Raspberry Pi amb el sistema operatiu Raspbian ens apareixeragrave la seguumlent pantalla on ens mourem utilitzant les fletxes i la tecla intro

La primera cosa que seleccionarem seragrave ldquoboot_behaviorrdquo que ens permetragrave inciar lrsquoescriptori quan el sistema iniciiuml

Ens mourem amb el teclat (dreta - esquerre) per fer que estigui seleccionat ldquoyesrdquo clicarem enter

14

Ara a continuacioacute ens mourem fins a ldquoexpand_rootfsrdquo que ens permetragrave expandir el tamany de la particioacute arrel de la Raspberry Pi al tamany magravex-im de la targeta SD eacutes a dir si tenim una targeta de 4 Gb si no fessim aquesta opcioacute estariacuteem util-itzant uacutenicament 2 Gb de capacitat

Acceptarem el seguumlent diagraveleg i passarem a con-figurar els idiomes

Buscarem ldquochange_localerdquo per canviar els idio-mes i la disposicioacute del teclat al catalagrave

De la seguumlent llista seleccionarem mitjanccedilant lrsquoes-pai del teclat totes les codificacions que comencin per ldquoCA_Per baixar a buscar-les utilitzarem les fletxes (amunt-avall) i per acabar clicarem la del costat dret i enter

15

Seleccionarem ldquochange_timezonerdquo per canviar la zona horagraveria de la Raspberry Pi i els temes rela-cionats amb aquesta

A continuacioacute seleccionarem el nostre continent

I per uacuteltim buscarem una ciutat que estigui a la mateixa zona horagraveria que nosaltres i la seleccio-nariacuteem tambeacute amb enter

64 Descarregar i executar ScriptPer descarregar lrsquoscript hem donar permisos i ex-ecutar-lo aixiacute que escriurem les seguumlents ordres en el terminal que podeu trobar a lrsquoescriptori

cd tmpmkdir CodePicd CodePiwget httpwwwtomorrowdevcomcodepiwiringPi-installshchmod +x wiringPi-installshwiringPi-installsh

Ja hem acabat de descarregar el programari que ens permetragrave programar amb la CodePi

16

7 PragravectiquesRecomanacioacute mirar aquests tutorials introduc-toris al llenguatge C httpthenewbostonorglistphpcat=14

Aquiacute teniu un quadre que us serviragrave lrsquoequivalegravencia entre els pins del GPIO i els que haurem de posar en el codi

Ja queda menys perquegrave puguis comenccedilar a pro-gramar perograve abans de fer-ho hauragraves de saber com compilar un programa Probablement ara et preguntaragraves quegrave eacutes compilar doncs compilar eacutes el proceacutes que fa un programa per traduir el codi que nosaltres hem escrit a codi binari amb la fi-nalitat de que el nostre ordinador pugui entendre cada ordre

Per compilar un codi escrit en C farem servir el compilador cc Abans drsquoutilitzar aquest programa haurem drsquoindicar a on hem guardat la nostra pragravec-tica amb lrsquoordre cdcc

-o practica

-Wall

-Iusrlocalinclude

-Lusrlocallib

practicac

-lwiringPi

Primer de tot posarem lrsquoordre al terminal

Utilitzarem el modificador -o per establir quin seragrave el nom del programa de sortida per exemple ldquopragravecticardquo

Amb aquest modificador indicarem que volem que ens doni tota la informacioacute dels errors de sintaxis del fitxer

Amb aquest indicarem on es troben els fitxers de la llibreria a incloure dintre del nostre fitxer

Utilitzant aquest altre modificador establim el di-rectori on ha de buscar els fitxers de la llibreria

Ara indicarem el nom del fitxer on es troba el nos-tre codi sempre acabant amb la terminacioacute c per exemple ldquopragravecticacrdquo

Amb aquest modificador posem la llibreria wiring-Pi a la llista de llibreries que han de ser afegides

17

Al final introduirem tot seguit al terminal una ordre similar a la seguumlent

cc -o practica -Wall -Iusrlocalinclude -Lusrlocallib practicac -lwiringPi

A part de saber compilar abans de comenccedilar a programar i a fer els nostres circuits haurem de saber quins soacuten els pins on haurem de connectar als cables a la Raspberry Pi aquest pins els iden-tificarem utilitzant nuacutemeros

La seguumlent taula ens permet saber lrsquoequivalegravencia entre els nuacutemeros de la GPIO els nuacutemeros de wiringPi la llibreria que interpretaragrave el nostre codi i la posicioacute dels pins

18

Des que la variable i eacutes igual a 1 fins i mentre que aquesta sigui igual o meacutes petita que10 executa el codi

Mentre que la variable D sigui igual a 5 el codi entre claus es llegiragrave infinites vegades

Si la variable X no eacutes meacutes petita que 7 fes una altra cosa

Si la variable X eacutes meacutes petita que 7 fes alguna cosa

70 Iniciacioacute al llenguatge CAbans de comenccedilar a programar cal tenir en compte els conceptes de condicional i de cicle

Els condicionals ldquoif - elserdquo nomeacutes executen el codi a continuacioacute si la condicioacute que li fiquem entre paregraventesis eacutes certa Ho podriacuteem comparar amb el que seria una oracioacute condicional No eacutes obligatori perograve podem afegir la partiacutecula ldquoelserdquo que eacutes lrsquoequivalent a la paraula ldquosi nordquo En el cas a continuacioacute com que el condicional no es compleix srsquoexecutaria lrsquoelse

if (X lt 7) Fes alguna cosa else Fes una altra cosa

Els bucles ldquoforrdquo soacuten rutines que serveixen per ex-ecutar un codi un determinat nuacutemero de vegades Teacute tres parts separades per punt i coma entrada condicioacute i increment A la entrada li donem un va-lor a una variable A la condicioacute determinem que la rutina srsquoexecuti nomeacutes si eacutes compleix la condicioacute utilitzant la variable drsquoentrada Finalment en el in-crement fixem un nou valor a la variable aquesta part srsquoexecutaragrave a cada cicle En llenguatge C si no afegim cap dels tres paragravemetres el bucle seragrave infinit

for (int i = 1 i lt= 10 i++) Fes alguna cosa

La sentegravencia ldquowhilerdquo defineix que un codi srsquoexe-cutaragrave infinitament mentre que la condicioacute que es defineix sigui certa

while (D==5) Fes alguna cosa

19

71 Bloc 1 (Bagravesic)711 Hola moacuten

En aquesta pragravectica escriurem un text a la consograve-la el conegut ldquoHello Worldrdquo

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void) printf(ldquohola moacutenrdquo)

if (wiringPiSetup() == -1) exit (1)

return 0

712 Encendre un LED

Hem drsquoimportar aquestes llibreries per tal que la RaspberryPi entengui el codi

Aquesta eacutes la funcioacute principal (main) i srsquoexecutaragrave tot el que fiquem aquiacute dins

Amb la funcioacute printf() el que aconseguim eacutes que es mostri al terminal el text que hi posem entre comentes

Aquestes liacutenies de codi soacuten simplement compro-vacions per assegurar-nos que tot funciona cor-rectament Soacuten negligibles perograve eacutes recomanable posar-les Les afegirem a totes les pragravectiques

Connectarem la pota llarga (agravenode) del LED al pin 5v de la GPIO i lrsquoaltre pota (cagravetode) a una resistegraven-cia de 180Ω Aquesta distincioacute entre potes es deu a que els LEDs estan polaritzats mireu el glossa-ri per saber-ne meacutes Tot seguit connecteu lrsquoaltra pota de la resistegravencia al pin GROUND

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void)

20

Comprovacionsif (wiringPiSetup() == -1) exit (1)

int pin = 1

printf(ldquoEncenem el pin 18rdquo)

pinMode(pin OUTPUT)

digitalWrite(pin 1)

return 0

713 Encendre i apagar un LED cada dos segons 10 vegades

El que podeu veure aquiacute eacutes el que srsquoanomena un comentari del codi Tot allograve que escrivim despreacutes de ldquordquo el compilador no ho llegiragrave i per tant nomeacutes serveix per donar indicacions al programador

Declarem la variable pin que com eacutes un nombre enter escriurem int

Fem un printf() tal i com hem apregraves a la pragravectica anterior Escrivim el 18 ja que la numeracioacute de la llibreria wiringPi canvia respecte a la sortida real (mirar el cuadre de la pagravegina 17)

Amb la funcioacute pinMode() declarem que el pin nuacutemero 1 en aquest cas sigui un pin de sortida de corrent (OUTPUT)

Una vegada li hem dit que eacutes de sortida li hem de dir si el volem encegraves ldquo1rdquo o apagat ldquo0rdquo amb la funcioacute digitalWrite()

Utilitzarem el muntatge la de pragravectica anterior amb la diferegravencia que en comptes de connectar lrsquoagravenode del LED al pin de 5v el connectarem al pin 18 de la Raspberry Pi Drsquoaquesta manera podrem gestionar el pas de lrsquoelectricitat a traveacutes drsquoun petit programa que crearem a continuacioacute

21

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void) int pin = 1

if (wiringPiSetup() == -1) exit (1)

pinMode(pin OUTPUT)

for (int i=1ilt=10i++)

printf(ldquoLED Onnrdquo) digitalWrite(pin 1)

delay(2000)

printf(ldquoLED Offnrdquo) digitalWrite(pin 0)

delay(2000)

return 0

Utilitzem un bicle ldquoforrdquo per executar el codi 10 vegades

Encenem el LED

Fem un delay() de 2000 milmiddotlisegons (2 segons) que ens serveix per aturar el programa i per tant mantenir el LED encegraves durant aquest temps

Apaguem el LED

El mantenim apagat 2 segons

Lrsquoexpressioacute n serveix per canviar de liacutenia

Proposta Ara que ja saps els conceptes bagravesics de la CodePi intenta fer lrsquoequivalent al codi Morse per demanar ajuda SOS middot middot middot ndash ndash ndash middot middot middot (on cada punt significa LED encegraves durant 14 de segon i cada ralla LED encegraves durant mig segon) Juga amb el valor de la funcioacute delay() per fer que el LED estigui encegraves durant meacutes o menys temps

22

72 Bloc 2 (Mitjagrave)721 Encendre un LED apretant un botoacute

Utilitzar el muntatge del LED que hem fet servir a la pragravectica anterior A meacutes a meacutes hem drsquoafegir 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 aniragrave a parar al pin 23 una resistegravencia de 10KΩ al GROUND per forccedilar lrsquoestat LOW quan el polsador no estagrave apretat

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt int main (void) int pin_LED = 1 int pin_boto = 4 printf (ldquoEncenent un LED apretant un botoacutenrdquo) 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

Declarem el LED com un pin de sortidaI el botoacute com un pin drsquoentrada

Si no fiquem variables al for aquest srsquoexecutaragrave sempre

Amb la funcioacute digitalRead() detectem si passa cor-rent pel pin 8 eacutes a dir si el botoacute ha estat apretat Si eacutes aixiacute fem que srsquoencengui el LED

Si no fem que srsquoapagui

23

722 Encendre un LED apretant tots els puladors

Utilitzar el muntatge de la pragravectica anterior i afegir dos polsadors meacutes amb el mateix proceacutes connec-tats als ports 24 i 25 de la Raspberry Pi

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int main (void) int pin_LED = 1

int pin_boto_A = 4 int pin_boto_B = 5 int 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 ampamp digitalRead(pin_boto_B) == HIGH ampamp digitalRead(pin_boto_C) == HIGH) digitalWrite(pin_LED 1)

Declarem el LED i els tres botons que tal i com posa a lrsquoesquema corresponen als pins 23 24 i 25 de la GPIO

Si els tres polsadors estan premuts passa corrent pels tres i per tant srsquoenceacuten el LED

En aquest cas utilitzem HIGH i LOW en lloc de 1 i 0 respectivament HIGH significa que hi ha elec-tricitat i LOW que no hi ha

24

No apretats while (digitalRead(pin_boto_A) == LOW ampamp digitalRead(pin_boto_B) == LOW ampamp digitalRead(pin_boto_C) == LOW) digitalWrite(pin_LED 0)

Si no apagarsquol

723 Semagravefor amb polsador

En aquesta pragravectica crearem un semagravefor de via-nants i de cotxes Com alguns semagravefors aquests teacute un botoacute amb el qual els vianants demanen que es posi verd aixiacute que el dels cotxes es posa ver-mell

Connectarem dos LEDs (vermell i verd) als pins 18 i 23 de la Raspberry Pi amb una resistegravencia de 180Ω Tambeacute connectarem tres LEDs meacutes (verd vermell i taronja) de la mateixa manera en els ports 17 21 i 22 de la GPIO

A diferegravencia de les altres pragravectiques amb polsa-dors en aquesta el connectarem al port SDA0 i al GROUND ja que nomeacutes ens interessa detectar quan es prem

25

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

define VERMELL 0define GROC1define VERD 2define VERMELL_HOME3define VERD_HOME4

define BOTO 8

void setup (void) int i

if (geteuid () = 0) exit (0)

if (wiringPiSetup () == -1) exit (1)

fflush(stdout) for (i = 0 i lt 5 ++i) pinMode (i OUTPUT) digitalWrite (i 0) digitalWrite(VERD1)digitalWrite(VERMELL_HOME1) pinMode (BOTO INPUT)

printf (ldquoSetup fetnrdquo)

int main (void) setup () for () esperaBoto () aturaTransit () camina () tempsEspera () iniciaTransit ()

Amb lrsquoexpressioacute define li diem a la magravequina que cada cop que escrivim VERMELL en realitat es-tem posant el nombre 0 i el mateix amb les altres paraules

Fem un setup amb tota la configuracioacute necessagraveria

fflush() eacutes una funcioacute complexa que serveix per quumlestions de tractament de memograveria del sistema per evitar errors

Executem totes les funcions una darrera lrsquoaltra de manera indefinida

26

Esperant a que lrsquousuari premi el botoacute per comenccedilar

Fem que el semagravefor dels cotxes canviiuml de verd a vermell passant pel groc

Fem que el semagravefor dels vianants es posi verd

Temps intermig des que srsquoacaba de caminar fins que el trafic comenccedila

void esperaBoto (void) printf (ldquoEsperant el botoacute ldquo)fflush(stdout) while (digitalRead (BOTO) == HIGH) delay (100) printf (ldquoEsoerenrdquo)

void aturaTransit()printf(ldquoAturanteltraficldquo)fflush(stdout)digitalWrite(VERD0) digitalWrite (GROC 1) delay (2000) digitalWrite (GROC 0) digitalWrite(VERMELL1) delay (2000) printf (ldquoAturatsnrdquo)

void camina ()printf(ldquoCaminaldquo)fflush(stdout)

digitalWrite(VERMELL_HOME0)digitalWrite(VERD_HOME1) delay (10000) digitalWrite(VERMELL0) digitalWrite (GROC 1)

printf (ldquoJa han caminatnrdquo)

void tempsEspera () int i

printf (ldquoTemps drsquoespera ldquo) fflush(stdout)

for (i = 0 i lt 8 ++i)

27

delay (500) digitalWrite(VERD_HOME0) digitalWrite (GROC 0) delay (500) digitalWrite(VERD_HOME1) digitalWrite (GROC 1)

void iniciaTransit ()printf(ldquoInicianttraficldquo)fflush(stdout)

digitalWrite(VERD_HOME0)digitalWrite(VERMELL_HOME1) delay (500) digitalWrite (GROC 0) digitalWrite(VERD1)

Deixem via lliure pels vehicles i posem el semagrave-for vermell pels vianants

Proposta Utilitzant el que has apregraves en aquest bloc crear un projecte amb uns quants LEDs en fila que srsquoactivin ascendentment quan apretes un botoacute

28

73 Bloc 3 (Alt)731 Sistema portes logravegiques I

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int AND (int a int b) return a ampamp b

int OR (int a int b) return a || b

int NEGADA (int a) return a

int f(int a int b) return OR(AND(NE-GADA(a)b)AND(aNEGADA(b))) f(a b) = arsquob + abrsquo

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5

int apretat_A = 0 int apretat_B = 0

pinMode(pin_LED_S OUTPUT) pinMode(pin_boto_A INPUT) pinMode(pin_boto_B INPUT)

Crearem una funcioacute per a cada porta logravegica de tal manera que sigui meacutes fagravecil poder-ho aplicar despreacutes

Aquesta seragrave la foacutermula que compliragrave la taula de la veritat en aquest cas eacutes f(a b) = arsquob +abrsquo

Creem dos booleans (variables que poden ser 0 o 1) que ens indicaran si el botoacute ha estat premut o no

Declarem els pins drsquoentrada i de sortida com a totes les pragravectiques anteriors

El seguumlent projecte fa la mateixa funcioacute que acon-seguiriacuteem amb xips de portes logravegiques perograve fent els cagravelculs a partir de la RaspberryPi En aquest cas compleix la taula de la veritat drsquoun OR ex-clusive eacutes a dir nomeacutes srsquoencendragrave el LED quan premem un dels dos botons mai srsquoencendragrave 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 srsquoutilitzin en el codi

29

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) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins estan premuts

Comprovem quins no estan premuts

I apliquem la foacutermula amb els valors drsquoentrada cor-responents Si la foacutermula eacutes igual a 1 srsquoencendragrave el LED si no no srsquoencendragrave

732 Sistema portes logravegiques II

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

Partim de la mateixa base que la pragravectica ante-rior perograve en aquesta incloem una tercera variable drsquoentrada Aixiacute que hem drsquoafegir un nou botoacute en el pin del GPIO que srsquoescau

30

Seguim el patroacute de les foacutermules emprades a la pragravectica anterior

En aquest cas tenim tres variables drsquoentrada perograve la mecagravenica eacutes la mateixa Es pot jugar amb la foacutermula i anar provant diferents combinacions

Necessitem tres variables ja que hi ha tres botons

Declaracions

Comprovem quins estan premuts

int AND (int a int b) return a ampamp b

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 + arsquob

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5 int pin_boto_C = 6

int apretat_A = 0 int apretat_B = 0 int apretat_C = 0

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

31

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

Mostra resultat if (f(apretat_A apretat_B apretat_C) == 1) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins no estan premuts

Com al circuit anterior apliquem la foacutermula i si aquesta doacutena 1 encenem el LED

Proposta Ara que ja has apregraves els conceptes meacutes fonamentals de la CodePi inventarsquot un circuit amb el nivell de dificultat que consideris No et quedis amb el que se trsquoha ensenyat aquiacute sinoacute que cerca meacutes megravetodes que puguis utilitzar La creativitat eacutes bagravesica per a tot bon enginyer i amb aquesta pragravectica volem que demostris de quegrave ets capaccedil

32

8 Vols saber-ne meacutes El moacuten de la programacioacute i lrsquoelectrogravenica eacutes infinit La comunitat geek (= interessada) en aquests te-mes eacutes una de les meacutes servicials i altruista de tota la xarxa aixiacute que es poden trobar una quantitat inacabable de tutorials i pagravegines web especialitza-des en el que vulguem saber

81 Programari lliureEl programari lliure eacutes la base de la informagravetica ac-tual i encara juga un gran paper en algunes agraverees com els servidors web o els mogravebils amb sistema operatiu Android Aquiacute teniu un conjunt de pagravegines on podeu aprofundir sobre aquest apassionant moacuten de la llibertat digital

httpcawikipediaorgwikiRichard_Matthew_Stallmanhttpwwwfsforghttpwwwgnuorghttpwwwlinuxorghttpwwwunixorghttpwwwubuntucom

82 Raspberry PiSi desitges saber meacutes sobre el projecte sense agravenim de lucre Raspberry Pi i seguir fent projectes amb ella visita les pagines que trobaragraves a con-tinuacioacute Aquestes et donaran idees de quegrave fer amb aquest petit perograve fascinant ordinador

httplearnadafruitcomcategorylearn-raspber-ry-pihttpwwwraspberrypiorgwwwraspberrypiorghttpdangerousprototypescom20130202rasp-berry-pi-supercomputerhttpreviewscnetcoukdesktops25-fun-things-to-do-with-a-raspberry-pi-50009851httplearnadafruitcompi-thermal-printer

33

83 Electrogravenica Si lrsquoelectrogravenica bagravesica que has apregraves durant els tutorials de la CodePi trsquoha fet veure que aquest eacutes el moacuten que a tu trsquoagrada no paris A continu-acioacute et deixem pagravegines web on trobaragraves les bases de lrsquoelectrogravenica meacutes complexa i tambeacute molts nous circuits per muntar i seguir descobrint aquest moacuten que avui en dia fa que tots els aparells endollats a al corrent puguin funcionar

httpwwwinstructablescomidBeginners-Elec-tronics-ProjectshttpwwwinstructablescomidElectronic-Proj-ects-For-Beginnershttpwwwcircuitstodaycomsimple-electron-ics-projects-and-circuitshttpswwwsparkfuncomtutorialshttplearnadafruitcom

84 ProgramacioacuteDiuen que per ser un bon programador srsquohan de tenir unes habilitats que no tothom teacute disciplina ordre logravegica creativitat capacitat per resoldre qualsevol problema i per sobre de tot persistegravencia i passioacute Si creus que tens aquestes qualitats do-na-li una oportunitat a la programacioacute A continu-acioacute et deixem un recull de les pagravegines web que creiem que meacutes et poden ajudar a introduir-te una mica meacutes en la programacioacute web i la drsquoapli-cacions per a mogravebils

httpwwwcodeorghttpscratchmiteduhttpwwwcodecademycom

34

9 GlossariC (llenguatge de programacioacute) Des de la seva creacioacute lrsquoany 1972 srsquoha consolidat com un dels llenguatges de programacioacute meacutes utilitzats per fer aplicacions de software Eacutes considerat un dels meacutes bagravesics i meacutes comuns per introduir-se a la pro-gramacioacute Les grans companyies han utilitzat el C com a base per crear altres llenguatges com lrsquoObjective-C (utilitzat per fer les aplicacions per dispositius drsquoApple) o el C (creat per Microsoft i utilitzat entre altres coses per fer programes in-formagravetics per Windows)

Condensador Component electrogravenic classificat dins del grup dels passius i que per tant no emet cap senyal El podriacuteem definir com un acumula-dor drsquoelectrons que els deixa anar quan arriba a la seva capacitat magravexima Hi ha condensadors de dos tipus els electroliacutetics i els normals En les pragravec-tiques utilitzarem electroliacutetics i com que aquests tenen polaritat eacutes important tenir en compte quina eacutes la pota positiva i quina eacutes la negativa a lrsquohora de connectar-lo

Diacuteode Component electrogravenic passiu Teacute polaritat i seria lrsquoequivalent a una vagravelvula antiretorn lrsquoelec-tricitat nomeacutes pot anar en un sentit

Electrogravenica Disciplina que estudia els com-ponents electrogravenics que funcionen amb un flux drsquoelectrons (corrent continua)

Funcioacute Fragment de codi que conte un seguit drsquoaccions i que hi pots accedir cridant la funcioacute en comptes de repetint el codi Podriacuteem comparar-ho amb una funcioacute matemagravetica en la que tenim vari-ables drsquoentrada que tractant-les a la funcioacute ob-tenim una informacioacute de sortida

GPIO Soacuten les sigles de ldquoGeneral Purpose InputOutputrdquo Si mirem la Raspberry Pi soacuten els pins de sortida on hi connectem els cables amb els que programem la placa electrogravenica Lrsquoavantatge drsquoaquest tipus de connector respecte altres eacutes que es pot gestionar mitjanccedilant programacioacute i aixograve eacutes precisament el que explicarem en aquest manual

35

HDMI Soacuten les sigles de ldquoHigh-Definition Multime-dia Interfacerdquo Serveix per enviar viacutedeo i agraveudio a una pantalla Nosaltres lrsquoutilitzarem per connectar la RaspberryPi a una pantalla

LED Acrogravenim de ldquoLight Emitting Dioderdquo Eacutes un tipus de diacuteode el qual teacute una pelmiddotliacutecula de fogravesfor entre els dos connectors que fa que quan passi el corrent generi llum Com qualsevol altre diacuteode eacutes important tenir en compte la polaritat

RAM Acrogravenim de ldquoRandom Access Memoryrdquo Eacutes la part de lrsquoordinador encarregada drsquoemmagatze-mar els arxius temporals

RCA El connector RCA consisteix en diferents cables amb la punta de diferent color que serveix-en per transmetre agraveudio i viacutedeo

ROM De lrsquoanglegraves ldquoRead Only Memoryrdquo eacutes la uni-tat de memograveria on es guarda el sistema operatiu

Resistegravencia Eacutes un component electrogravenic que teacute com a funcioacute reduir el flux drsquoelectrons afi de controlar la seva potegravencia Eacutes molt comuacute a lrsquoelectrogravenica ja que eacutes molt necessari per assegu-rar-nos del correcte funcionament drsquoelements com el LED que sense una resistegravencia que limiteacutes el corrent podrien cremar-se

Placa base Eacutes la part de lrsquoordinador que conteacute elements com la RAM la ROM o el microproces-sador La placa base de lrsquoordinador que constru-irem amb aquest manual seria la progravepia Raspber-ry Pi

Protoboard Tambeacute coneguda com a Bread-board srsquoutilitza per crear circuits electrogravenics sense necessitat de soldar Per saber com funcio-na i com estan relacionats els diferents contactes consulteu aquesta webhttprduinostarcomdocumentaciongeneralpro-toboard-que-es-y-como-funciona

36

Terminal Eacutes el programa emprat per enviar ordres directes a lrsquoordinador i rebre respostes drsquoaquest Nosaltres lrsquoutilitzarem per instalmiddotlar els programes necessaris per programar les plaques electrograveniques i altres arxius necessaris

Variable Valor que canvia segons les operacions que es facin amb aquest al programa informagravetic Com ja sabeu hi ha variables independents (pe el temps) i dependents (pe si estagrave o no encegraves un LED que dependragrave drsquoaltres variables)

37

  • httpwwwfsforg
Page 2: CodePi

Iacutendex

1 Quegrave es la Raspberry Pi

2 Per a quegrave la farem servir

3 Quegrave necessitarem per a muntar-la

4 Apregraven a muntar la caixa de la CodePi

5 Afegim un sistema operatiu a la CodePi

6 Primer inici i configuracioacute de la CodePi

7 Pragravectiques

8 Vols saber-ne meacutes

9 Glos

3

4

5

6

9

13

16

32

34

3

1 Quegrave eacutes la Raspberry PiLa RaspberryPi eacutes una placa computadora de baix cost feta a partir de components per a teleacutemogravebils eacutes a dir un petit ordinador amb les mateixes prestacions drsquoun smartphone de gama mitjana i amb sistema operatiu de base Linux

La Raspberry Pi va neacuteixer a Anglaterra el 2009 com un projecte amb lrsquoobjectiu de crear un ordinador de molt baix cost (30$) per a popularitzar la programacioacute entre els joves

Des del seu llanccedilament la fundacioacute Raspber-ryPi ha venut meacutes drsquoun milioacute de copies de la seva petita placa i srsquoha convertit en un dels siacutembols meacutes representatius de lrsquoelectrogravenica actual La comunitat drsquoaficionats a lrsquoelectrograveni-ca i la programacioacute ha acollit molt beacute a aquest producte i es poden trobar infinitats de tuto-rials projectes i drsquoaltres curiositats a la xarxa

4

2 Per a quegrave la utilitzaremUtilitzarem la RaspberryPi per a crear un ordi-nador amb el qual aprendrem electrogravenica i pro-gramacioacute A traveacutes de petits programes amb llenguatge C podrem gestionar els ports de la GPIO que encendran i apagaran LEDs lle-giran els estats drsquointerruptors i LDRs etc

Tot aixograve ho farem drsquouna manera fagravecil i entretin-guda a partir de diferents tutorials ordenats de menor a major dificultat comenccedilant per prin-cipis bagravesics de lrsquoelectrogravenica i la programacioacute fins a fer programes complexos per gestion-ar diferents LEDs segons diferents variables

Ara beacute abans de comenccedilar amb lrsquoelectrogravenica pu-rament hem de muntar la caixa que ens serviragrave per transportar la Raspberry Pi el teclat el ratoliacute la protoboard els components electrogravenics etc

5

3 Quegrave necessitarem per a muntar-laAquests soacuten els materials que necessitarem per muntar la CodePi Per una banda tenim les fus-tes i drsquoaltres eines que ens serviran per construir la caixa per transportar la CodePi

MaterialbullFusta de 320x320x6 (6 recomanat perograve pot ser meacutes gruixut)bullClaus bullFrontisses

EinesbullMartellbullLlima bullSerra per a fusta (manual o elegravectrica)bullCargol de banc

Per altra banda tambeacute necessitarem tots els components electrogravenics eines per portar a terme els tutorials i com no la Raspberry Pi Aixograve eacutes tot el que necesitarem

bullRaspberry Pi model BbullTargeta SDHC de com a miacutenim 4GB Classe 4 bullTeclatbullRatoliacute convencionalbullProtoboardbullCables electrogravenicsbullLEDsbullResistegravencies 180 i 10K ohmsbullPolsadors

3euro1euro1euro

33euro7euro5euro5euro4euro3euro1euro1euro1euro

Preu total 61euro

6

4 Apregraven a muntar la caixa de la CodePi

Abans de comenccedilar a tallar la fusta prepararem el seguumlent esquema en el nostre tauloacute de fusta A la part del centre deixarem un espai de 6 mm per poder clavar beacute una costat sobre un costat per acabar tenint una caixa de 160mm x 160mm

Amb un regle i un llapis marquem les liacutenies per on tallarem el tauloacute seguint lrsquoesquema anterior

A continuacioacute tallar el tauloacute amb una serra elegravec-trica En cas de no tenir-ne srsquohauragrave de posar la fullola en un cargol de banc i tallar-la amb una ser-ra manual

No passa res si la fusta no queda del tot ben tal-lada ja que despreacutes podrem retocar les imperfec-cions llimant-les i meacutes endavant posant massilla

7

Atencioacute Eacutes altament recomanable utilitzar guants i ulleres protectores durant tot el proceacutes de manip-ulacioacute de la fusta

Els guants ens protegiran de possibles talls ras-cades o drsquoaltres 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 Eacutes recomanable posar dues fustes entre la boca del cargol i el tauloacute per impedir que aquesta es pugui malmetre a causa de la pressioacute

Llimar les fustes verticalment ja que drsquoaquesta manera es treballa sobre meacutes superfiacutecie Reco-manem utilitzar una llima amb fulla molt rugosa per poder realitzar el treball meacutes ragravepidament Llimar tambeacute les dues peces que faran de tapa i contra tapa

Per millorar les llimadures utilitzar una llima amb la fulla meacutes fina o un paper de vidre

8

Un cop les fustes estiguin ben llimades utilitzar els claus per collar les parets Cal prestar atencioacute en la posicioacute dels claus ja que la fusta eacutes molt prima i es poden torccedilar Aquest hauria de ser el resultat final

Seguint el mateix proceacutes clavar la fullola que faragrave de tapa inferior Cal vigilar a on es posen els claus ja que pot ser que es toquin amb els que hem po-sat anteriorment

Agafar les frontisses i clavar-les amb dos claus pe-tits a la fullola que faragrave de tapa superior Despreacutes clavar els dos forats restants a una de les parets aquesta faragrave de part posterior de la CodePi

Recomanacioacute Si volem que la fusta ens duri du-rant meacutes temps eacutes recomanable envernissar la caixa amb un verniacutes per a fustes

9

Per descarregar Raspbian el sistema operatiu que utilitza la CodePi haurem drsquoobrir una nova fi-nestra del navegador i anar a la web de Raspberry Pi httpwwwraspberrypiorg

Eacutes recomanable fer aquest proceacutes al mateix ordi-nador en el que es procediragrave a instalmiddotlar Raspbian a la targeta SD

Recorda que aquest ordinador ha de tenir lector de targetes o un adaptador USB connectatDespreacutes haurem drsquoanar a lrsquoapartat de descagraverreg-ues on trobarem tots els enllaccedilos que necessitem per descarregar el sistema operatiu de la Rasp-berry Pi

5 Afegim un sistema ope- ratiu a la CodePi

51 Descarregar Raspbian

Lrsquouacuteltim pas per descarregar Raspbian eacutes clicar sobre lrsquoenllaccedil on posa Direct Download Es reco-mana realitzar aquest proceacutes en un lloc amb una connexioacute estable i ragravepida ja que srsquoha de descar-regar molta informacioacute

Despreacutes de clicar aquest enllaccedil sersquons obriragrave una nova finestra i automagraveticament Raspbian comenccedilaragrave a descarregar-se La descagraverrega pot trigar entre 5 i 15 minuts depenent de la teva con-nexioacute a internet Ja podem tancar aquesta finestra i continuar cap al pas seguumlent

10

52 Instalmiddotlar RaspbianUna vegada que ja tenim descarregada lrsquouacuteltima versioacute de Raspbian segons el sistema opera-tiu des del que vulguem instalmiddotlar-lo haurem de seguir uns passos diferents per completar la in-stalmiddotlacioacute

Windows

Per instalmiddotlar Raspbian amb Windows haurem de descarregar i instalmiddotlar Win32DiskImager Abans de continuar amb la instalmiddotlacioacute haurem de de-scomprimir el fitxer que ens hem descarregat Per descomprimir-lo utilitzarem un compressor drsquoarxius com (7zip) Clicant amb el botoacute dret so-bre aquest arxiu i clicarem on posa descomprimir aquiacute o buscarem el nom del nostre descompres-sor i despreacutes buscarem aquesta opcioacute

Ara introduirem la targeta de memograveria que vul-guem utilitzar a lrsquoentrada per targetes del nostre ordinador o a lrsquoadaptador corresponent

A continuacioacute iniciarem el programa i clicarem sobre el logo de la carpeta i escollirem el lloc on hem descomprimit el contingut del zip buscarem lrsquoar-xiu amb extensioacute img i acceptarem el diagraveleg Meacutes tard escollirem en quin dispositiu volem in-stalmiddotlar el sistema operatiu aquest eacutes un punt on hem drsquoestar segurs drsquoon estem instalmiddotlant aquests arxius ja que si lrsquoestigueacutessim instalmiddotlant en una destinacioacute diferent podriacuteem perdre totes les dades de lrsquoordinador Per saber a quin dispositiu hem drsquoinstalmiddotlar Raspbian obrirem ldquoEl Meu Ordinadorrdquo i buscarem la targeta de memograveria ens fixarem en quina lletra hi ha al final del nom aquesta seragrave la mateixa que haurem de posar al programaQuan ja haguem inserit aquests dos paragravemetres al programa clicarem sobre el botoacute de Write i es comenccedilara a instalmiddotlar el sistema operatiu

11

Linux

Per instalmiddotlar Raspbian des drsquoun sistema operatiu Linux utilitzarem lrsquoordre 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 homeusu-ari)

Un cop tenim descomprimit el contingut del zip obrirem una sessioacute al terminal i escriurem

cd ~

df -h

umount devsdd1

sudo dd bs=4M if=~2013-02-09-wheezy-raspbianimg of=devsdd

Anirem a la carpeta on hem descomprimit el zip (la de lrsquousuari eacutes per defecte o ~)

Buscarem la targeta sd i el seu nom a la seguumlent llista ens haurem drsquoapuntar el que posi a la prime-ra columna com devsdd (sense el numero) Assegureu-vos que aquest eacutes el dispositiu on vo-leu instalmiddotlar el Raspbian

Abans drsquoinstalmiddotlar Raspbian haurem de des-muntar les particions corresponents a la targeta SD utilitzant lrsquoordre umount en el cas de tenir meacutes drsquouna particioacute haurem drsquoexecutar aquesta ordre meacutes drsquouna vegada

Ara executarem lrsquoordre dd amb permisos drsquoadmi- nistrador al modificador ldquoif=rdquo posarem la carpeta on hem descomprimit el zip (la de lrsquousuari eacutes per defecte o ~) amb el nom del arxiu img descom-primit i al modificador ldquoof=rdquo escriurem el que hem copiat abans amb lrsquoanterior ordre

12

Mac OS X

Per instalmiddotlar Raspbian a Mac OS X tambeacute utilitza-rem lrsquoordre dd pero el funcionament per buscar en quin disc volem instalmiddotlar raspbian eacutes diferent Recomanem extreure el contingut del zip a la car-peta Usersusuari

Comenccedilarem buscant la targeta on volem instalmiddotlar raspbian executant la seguumlent ordre i copiarem el disk4 (sense agafar la particioacute)

Desmuntarem el disk en quumlestioacute

Ara executarem lrsquoordre dd amb permisos drsquoadmi- nistrador al modificador ldquoif=rdquo posarem la carpeta on hem descomprimit el zip (la de lrsquousuari eacutes per defecte o ~) amb el nom de lrsquoarxiu img descom-primit i al modificador ldquoof=rdquo escriurem el que hem copiat abans amb lrsquoanterior ordre

diskutil list

diskutil unmountDisk devdisk4

sudo dd bs=1m if=~2013-02-09-wheezy-raspbianimg of=devsdb

13

6 Primer inici i configuracioacute de la CodePiAra ja estem preparats per posar la targeta SD a la Raspberry Pi i connectar tots els cables per comenccedilar a programar A continuacioacute hem de se-guir uns passos que nomeacutes podrem fer durant la primera arrencada del sistema i que ens perme-tran iniciar lrsquoescriptori automagraveticament posar la CodePi en catalagrave i configurar la disposicioacute del te-clat entre drsquoaltres coses

Quan iniciem per primera vegada la Raspberry Pi amb el sistema operatiu Raspbian ens apareixeragrave la seguumlent pantalla on ens mourem utilitzant les fletxes i la tecla intro

La primera cosa que seleccionarem seragrave ldquoboot_behaviorrdquo que ens permetragrave inciar lrsquoescriptori quan el sistema iniciiuml

Ens mourem amb el teclat (dreta - esquerre) per fer que estigui seleccionat ldquoyesrdquo clicarem enter

14

Ara a continuacioacute ens mourem fins a ldquoexpand_rootfsrdquo que ens permetragrave expandir el tamany de la particioacute arrel de la Raspberry Pi al tamany magravex-im de la targeta SD eacutes a dir si tenim una targeta de 4 Gb si no fessim aquesta opcioacute estariacuteem util-itzant uacutenicament 2 Gb de capacitat

Acceptarem el seguumlent diagraveleg i passarem a con-figurar els idiomes

Buscarem ldquochange_localerdquo per canviar els idio-mes i la disposicioacute del teclat al catalagrave

De la seguumlent llista seleccionarem mitjanccedilant lrsquoes-pai del teclat totes les codificacions que comencin per ldquoCA_Per baixar a buscar-les utilitzarem les fletxes (amunt-avall) i per acabar clicarem la del costat dret i enter

15

Seleccionarem ldquochange_timezonerdquo per canviar la zona horagraveria de la Raspberry Pi i els temes rela-cionats amb aquesta

A continuacioacute seleccionarem el nostre continent

I per uacuteltim buscarem una ciutat que estigui a la mateixa zona horagraveria que nosaltres i la seleccio-nariacuteem tambeacute amb enter

64 Descarregar i executar ScriptPer descarregar lrsquoscript hem donar permisos i ex-ecutar-lo aixiacute que escriurem les seguumlents ordres en el terminal que podeu trobar a lrsquoescriptori

cd tmpmkdir CodePicd CodePiwget httpwwwtomorrowdevcomcodepiwiringPi-installshchmod +x wiringPi-installshwiringPi-installsh

Ja hem acabat de descarregar el programari que ens permetragrave programar amb la CodePi

16

7 PragravectiquesRecomanacioacute mirar aquests tutorials introduc-toris al llenguatge C httpthenewbostonorglistphpcat=14

Aquiacute teniu un quadre que us serviragrave lrsquoequivalegravencia entre els pins del GPIO i els que haurem de posar en el codi

Ja queda menys perquegrave puguis comenccedilar a pro-gramar perograve abans de fer-ho hauragraves de saber com compilar un programa Probablement ara et preguntaragraves quegrave eacutes compilar doncs compilar eacutes el proceacutes que fa un programa per traduir el codi que nosaltres hem escrit a codi binari amb la fi-nalitat de que el nostre ordinador pugui entendre cada ordre

Per compilar un codi escrit en C farem servir el compilador cc Abans drsquoutilitzar aquest programa haurem drsquoindicar a on hem guardat la nostra pragravec-tica amb lrsquoordre cdcc

-o practica

-Wall

-Iusrlocalinclude

-Lusrlocallib

practicac

-lwiringPi

Primer de tot posarem lrsquoordre al terminal

Utilitzarem el modificador -o per establir quin seragrave el nom del programa de sortida per exemple ldquopragravecticardquo

Amb aquest modificador indicarem que volem que ens doni tota la informacioacute dels errors de sintaxis del fitxer

Amb aquest indicarem on es troben els fitxers de la llibreria a incloure dintre del nostre fitxer

Utilitzant aquest altre modificador establim el di-rectori on ha de buscar els fitxers de la llibreria

Ara indicarem el nom del fitxer on es troba el nos-tre codi sempre acabant amb la terminacioacute c per exemple ldquopragravecticacrdquo

Amb aquest modificador posem la llibreria wiring-Pi a la llista de llibreries que han de ser afegides

17

Al final introduirem tot seguit al terminal una ordre similar a la seguumlent

cc -o practica -Wall -Iusrlocalinclude -Lusrlocallib practicac -lwiringPi

A part de saber compilar abans de comenccedilar a programar i a fer els nostres circuits haurem de saber quins soacuten els pins on haurem de connectar als cables a la Raspberry Pi aquest pins els iden-tificarem utilitzant nuacutemeros

La seguumlent taula ens permet saber lrsquoequivalegravencia entre els nuacutemeros de la GPIO els nuacutemeros de wiringPi la llibreria que interpretaragrave el nostre codi i la posicioacute dels pins

18

Des que la variable i eacutes igual a 1 fins i mentre que aquesta sigui igual o meacutes petita que10 executa el codi

Mentre que la variable D sigui igual a 5 el codi entre claus es llegiragrave infinites vegades

Si la variable X no eacutes meacutes petita que 7 fes una altra cosa

Si la variable X eacutes meacutes petita que 7 fes alguna cosa

70 Iniciacioacute al llenguatge CAbans de comenccedilar a programar cal tenir en compte els conceptes de condicional i de cicle

Els condicionals ldquoif - elserdquo nomeacutes executen el codi a continuacioacute si la condicioacute que li fiquem entre paregraventesis eacutes certa Ho podriacuteem comparar amb el que seria una oracioacute condicional No eacutes obligatori perograve podem afegir la partiacutecula ldquoelserdquo que eacutes lrsquoequivalent a la paraula ldquosi nordquo En el cas a continuacioacute com que el condicional no es compleix srsquoexecutaria lrsquoelse

if (X lt 7) Fes alguna cosa else Fes una altra cosa

Els bucles ldquoforrdquo soacuten rutines que serveixen per ex-ecutar un codi un determinat nuacutemero de vegades Teacute tres parts separades per punt i coma entrada condicioacute i increment A la entrada li donem un va-lor a una variable A la condicioacute determinem que la rutina srsquoexecuti nomeacutes si eacutes compleix la condicioacute utilitzant la variable drsquoentrada Finalment en el in-crement fixem un nou valor a la variable aquesta part srsquoexecutaragrave a cada cicle En llenguatge C si no afegim cap dels tres paragravemetres el bucle seragrave infinit

for (int i = 1 i lt= 10 i++) Fes alguna cosa

La sentegravencia ldquowhilerdquo defineix que un codi srsquoexe-cutaragrave infinitament mentre que la condicioacute que es defineix sigui certa

while (D==5) Fes alguna cosa

19

71 Bloc 1 (Bagravesic)711 Hola moacuten

En aquesta pragravectica escriurem un text a la consograve-la el conegut ldquoHello Worldrdquo

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void) printf(ldquohola moacutenrdquo)

if (wiringPiSetup() == -1) exit (1)

return 0

712 Encendre un LED

Hem drsquoimportar aquestes llibreries per tal que la RaspberryPi entengui el codi

Aquesta eacutes la funcioacute principal (main) i srsquoexecutaragrave tot el que fiquem aquiacute dins

Amb la funcioacute printf() el que aconseguim eacutes que es mostri al terminal el text que hi posem entre comentes

Aquestes liacutenies de codi soacuten simplement compro-vacions per assegurar-nos que tot funciona cor-rectament Soacuten negligibles perograve eacutes recomanable posar-les Les afegirem a totes les pragravectiques

Connectarem la pota llarga (agravenode) del LED al pin 5v de la GPIO i lrsquoaltre pota (cagravetode) a una resistegraven-cia de 180Ω Aquesta distincioacute entre potes es deu a que els LEDs estan polaritzats mireu el glossa-ri per saber-ne meacutes Tot seguit connecteu lrsquoaltra pota de la resistegravencia al pin GROUND

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void)

20

Comprovacionsif (wiringPiSetup() == -1) exit (1)

int pin = 1

printf(ldquoEncenem el pin 18rdquo)

pinMode(pin OUTPUT)

digitalWrite(pin 1)

return 0

713 Encendre i apagar un LED cada dos segons 10 vegades

El que podeu veure aquiacute eacutes el que srsquoanomena un comentari del codi Tot allograve que escrivim despreacutes de ldquordquo el compilador no ho llegiragrave i per tant nomeacutes serveix per donar indicacions al programador

Declarem la variable pin que com eacutes un nombre enter escriurem int

Fem un printf() tal i com hem apregraves a la pragravectica anterior Escrivim el 18 ja que la numeracioacute de la llibreria wiringPi canvia respecte a la sortida real (mirar el cuadre de la pagravegina 17)

Amb la funcioacute pinMode() declarem que el pin nuacutemero 1 en aquest cas sigui un pin de sortida de corrent (OUTPUT)

Una vegada li hem dit que eacutes de sortida li hem de dir si el volem encegraves ldquo1rdquo o apagat ldquo0rdquo amb la funcioacute digitalWrite()

Utilitzarem el muntatge la de pragravectica anterior amb la diferegravencia que en comptes de connectar lrsquoagravenode del LED al pin de 5v el connectarem al pin 18 de la Raspberry Pi Drsquoaquesta manera podrem gestionar el pas de lrsquoelectricitat a traveacutes drsquoun petit programa que crearem a continuacioacute

21

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void) int pin = 1

if (wiringPiSetup() == -1) exit (1)

pinMode(pin OUTPUT)

for (int i=1ilt=10i++)

printf(ldquoLED Onnrdquo) digitalWrite(pin 1)

delay(2000)

printf(ldquoLED Offnrdquo) digitalWrite(pin 0)

delay(2000)

return 0

Utilitzem un bicle ldquoforrdquo per executar el codi 10 vegades

Encenem el LED

Fem un delay() de 2000 milmiddotlisegons (2 segons) que ens serveix per aturar el programa i per tant mantenir el LED encegraves durant aquest temps

Apaguem el LED

El mantenim apagat 2 segons

Lrsquoexpressioacute n serveix per canviar de liacutenia

Proposta Ara que ja saps els conceptes bagravesics de la CodePi intenta fer lrsquoequivalent al codi Morse per demanar ajuda SOS middot middot middot ndash ndash ndash middot middot middot (on cada punt significa LED encegraves durant 14 de segon i cada ralla LED encegraves durant mig segon) Juga amb el valor de la funcioacute delay() per fer que el LED estigui encegraves durant meacutes o menys temps

22

72 Bloc 2 (Mitjagrave)721 Encendre un LED apretant un botoacute

Utilitzar el muntatge del LED que hem fet servir a la pragravectica anterior A meacutes a meacutes hem drsquoafegir 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 aniragrave a parar al pin 23 una resistegravencia de 10KΩ al GROUND per forccedilar lrsquoestat LOW quan el polsador no estagrave apretat

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt int main (void) int pin_LED = 1 int pin_boto = 4 printf (ldquoEncenent un LED apretant un botoacutenrdquo) 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

Declarem el LED com un pin de sortidaI el botoacute com un pin drsquoentrada

Si no fiquem variables al for aquest srsquoexecutaragrave sempre

Amb la funcioacute digitalRead() detectem si passa cor-rent pel pin 8 eacutes a dir si el botoacute ha estat apretat Si eacutes aixiacute fem que srsquoencengui el LED

Si no fem que srsquoapagui

23

722 Encendre un LED apretant tots els puladors

Utilitzar el muntatge de la pragravectica anterior i afegir dos polsadors meacutes amb el mateix proceacutes connec-tats als ports 24 i 25 de la Raspberry Pi

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int main (void) int pin_LED = 1

int pin_boto_A = 4 int pin_boto_B = 5 int 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 ampamp digitalRead(pin_boto_B) == HIGH ampamp digitalRead(pin_boto_C) == HIGH) digitalWrite(pin_LED 1)

Declarem el LED i els tres botons que tal i com posa a lrsquoesquema corresponen als pins 23 24 i 25 de la GPIO

Si els tres polsadors estan premuts passa corrent pels tres i per tant srsquoenceacuten el LED

En aquest cas utilitzem HIGH i LOW en lloc de 1 i 0 respectivament HIGH significa que hi ha elec-tricitat i LOW que no hi ha

24

No apretats while (digitalRead(pin_boto_A) == LOW ampamp digitalRead(pin_boto_B) == LOW ampamp digitalRead(pin_boto_C) == LOW) digitalWrite(pin_LED 0)

Si no apagarsquol

723 Semagravefor amb polsador

En aquesta pragravectica crearem un semagravefor de via-nants i de cotxes Com alguns semagravefors aquests teacute un botoacute amb el qual els vianants demanen que es posi verd aixiacute que el dels cotxes es posa ver-mell

Connectarem dos LEDs (vermell i verd) als pins 18 i 23 de la Raspberry Pi amb una resistegravencia de 180Ω Tambeacute connectarem tres LEDs meacutes (verd vermell i taronja) de la mateixa manera en els ports 17 21 i 22 de la GPIO

A diferegravencia de les altres pragravectiques amb polsa-dors en aquesta el connectarem al port SDA0 i al GROUND ja que nomeacutes ens interessa detectar quan es prem

25

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

define VERMELL 0define GROC1define VERD 2define VERMELL_HOME3define VERD_HOME4

define BOTO 8

void setup (void) int i

if (geteuid () = 0) exit (0)

if (wiringPiSetup () == -1) exit (1)

fflush(stdout) for (i = 0 i lt 5 ++i) pinMode (i OUTPUT) digitalWrite (i 0) digitalWrite(VERD1)digitalWrite(VERMELL_HOME1) pinMode (BOTO INPUT)

printf (ldquoSetup fetnrdquo)

int main (void) setup () for () esperaBoto () aturaTransit () camina () tempsEspera () iniciaTransit ()

Amb lrsquoexpressioacute define li diem a la magravequina que cada cop que escrivim VERMELL en realitat es-tem posant el nombre 0 i el mateix amb les altres paraules

Fem un setup amb tota la configuracioacute necessagraveria

fflush() eacutes una funcioacute complexa que serveix per quumlestions de tractament de memograveria del sistema per evitar errors

Executem totes les funcions una darrera lrsquoaltra de manera indefinida

26

Esperant a que lrsquousuari premi el botoacute per comenccedilar

Fem que el semagravefor dels cotxes canviiuml de verd a vermell passant pel groc

Fem que el semagravefor dels vianants es posi verd

Temps intermig des que srsquoacaba de caminar fins que el trafic comenccedila

void esperaBoto (void) printf (ldquoEsperant el botoacute ldquo)fflush(stdout) while (digitalRead (BOTO) == HIGH) delay (100) printf (ldquoEsoerenrdquo)

void aturaTransit()printf(ldquoAturanteltraficldquo)fflush(stdout)digitalWrite(VERD0) digitalWrite (GROC 1) delay (2000) digitalWrite (GROC 0) digitalWrite(VERMELL1) delay (2000) printf (ldquoAturatsnrdquo)

void camina ()printf(ldquoCaminaldquo)fflush(stdout)

digitalWrite(VERMELL_HOME0)digitalWrite(VERD_HOME1) delay (10000) digitalWrite(VERMELL0) digitalWrite (GROC 1)

printf (ldquoJa han caminatnrdquo)

void tempsEspera () int i

printf (ldquoTemps drsquoespera ldquo) fflush(stdout)

for (i = 0 i lt 8 ++i)

27

delay (500) digitalWrite(VERD_HOME0) digitalWrite (GROC 0) delay (500) digitalWrite(VERD_HOME1) digitalWrite (GROC 1)

void iniciaTransit ()printf(ldquoInicianttraficldquo)fflush(stdout)

digitalWrite(VERD_HOME0)digitalWrite(VERMELL_HOME1) delay (500) digitalWrite (GROC 0) digitalWrite(VERD1)

Deixem via lliure pels vehicles i posem el semagrave-for vermell pels vianants

Proposta Utilitzant el que has apregraves en aquest bloc crear un projecte amb uns quants LEDs en fila que srsquoactivin ascendentment quan apretes un botoacute

28

73 Bloc 3 (Alt)731 Sistema portes logravegiques I

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int AND (int a int b) return a ampamp b

int OR (int a int b) return a || b

int NEGADA (int a) return a

int f(int a int b) return OR(AND(NE-GADA(a)b)AND(aNEGADA(b))) f(a b) = arsquob + abrsquo

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5

int apretat_A = 0 int apretat_B = 0

pinMode(pin_LED_S OUTPUT) pinMode(pin_boto_A INPUT) pinMode(pin_boto_B INPUT)

Crearem una funcioacute per a cada porta logravegica de tal manera que sigui meacutes fagravecil poder-ho aplicar despreacutes

Aquesta seragrave la foacutermula que compliragrave la taula de la veritat en aquest cas eacutes f(a b) = arsquob +abrsquo

Creem dos booleans (variables que poden ser 0 o 1) que ens indicaran si el botoacute ha estat premut o no

Declarem els pins drsquoentrada i de sortida com a totes les pragravectiques anteriors

El seguumlent projecte fa la mateixa funcioacute que acon-seguiriacuteem amb xips de portes logravegiques perograve fent els cagravelculs a partir de la RaspberryPi En aquest cas compleix la taula de la veritat drsquoun OR ex-clusive eacutes a dir nomeacutes srsquoencendragrave el LED quan premem un dels dos botons mai srsquoencendragrave 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 srsquoutilitzin en el codi

29

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) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins estan premuts

Comprovem quins no estan premuts

I apliquem la foacutermula amb els valors drsquoentrada cor-responents Si la foacutermula eacutes igual a 1 srsquoencendragrave el LED si no no srsquoencendragrave

732 Sistema portes logravegiques II

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

Partim de la mateixa base que la pragravectica ante-rior perograve en aquesta incloem una tercera variable drsquoentrada Aixiacute que hem drsquoafegir un nou botoacute en el pin del GPIO que srsquoescau

30

Seguim el patroacute de les foacutermules emprades a la pragravectica anterior

En aquest cas tenim tres variables drsquoentrada perograve la mecagravenica eacutes la mateixa Es pot jugar amb la foacutermula i anar provant diferents combinacions

Necessitem tres variables ja que hi ha tres botons

Declaracions

Comprovem quins estan premuts

int AND (int a int b) return a ampamp b

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 + arsquob

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5 int pin_boto_C = 6

int apretat_A = 0 int apretat_B = 0 int apretat_C = 0

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

31

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

Mostra resultat if (f(apretat_A apretat_B apretat_C) == 1) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins no estan premuts

Com al circuit anterior apliquem la foacutermula i si aquesta doacutena 1 encenem el LED

Proposta Ara que ja has apregraves els conceptes meacutes fonamentals de la CodePi inventarsquot un circuit amb el nivell de dificultat que consideris No et quedis amb el que se trsquoha ensenyat aquiacute sinoacute que cerca meacutes megravetodes que puguis utilitzar La creativitat eacutes bagravesica per a tot bon enginyer i amb aquesta pragravectica volem que demostris de quegrave ets capaccedil

32

8 Vols saber-ne meacutes El moacuten de la programacioacute i lrsquoelectrogravenica eacutes infinit La comunitat geek (= interessada) en aquests te-mes eacutes una de les meacutes servicials i altruista de tota la xarxa aixiacute que es poden trobar una quantitat inacabable de tutorials i pagravegines web especialitza-des en el que vulguem saber

81 Programari lliureEl programari lliure eacutes la base de la informagravetica ac-tual i encara juga un gran paper en algunes agraverees com els servidors web o els mogravebils amb sistema operatiu Android Aquiacute teniu un conjunt de pagravegines on podeu aprofundir sobre aquest apassionant moacuten de la llibertat digital

httpcawikipediaorgwikiRichard_Matthew_Stallmanhttpwwwfsforghttpwwwgnuorghttpwwwlinuxorghttpwwwunixorghttpwwwubuntucom

82 Raspberry PiSi desitges saber meacutes sobre el projecte sense agravenim de lucre Raspberry Pi i seguir fent projectes amb ella visita les pagines que trobaragraves a con-tinuacioacute Aquestes et donaran idees de quegrave fer amb aquest petit perograve fascinant ordinador

httplearnadafruitcomcategorylearn-raspber-ry-pihttpwwwraspberrypiorgwwwraspberrypiorghttpdangerousprototypescom20130202rasp-berry-pi-supercomputerhttpreviewscnetcoukdesktops25-fun-things-to-do-with-a-raspberry-pi-50009851httplearnadafruitcompi-thermal-printer

33

83 Electrogravenica Si lrsquoelectrogravenica bagravesica que has apregraves durant els tutorials de la CodePi trsquoha fet veure que aquest eacutes el moacuten que a tu trsquoagrada no paris A continu-acioacute et deixem pagravegines web on trobaragraves les bases de lrsquoelectrogravenica meacutes complexa i tambeacute molts nous circuits per muntar i seguir descobrint aquest moacuten que avui en dia fa que tots els aparells endollats a al corrent puguin funcionar

httpwwwinstructablescomidBeginners-Elec-tronics-ProjectshttpwwwinstructablescomidElectronic-Proj-ects-For-Beginnershttpwwwcircuitstodaycomsimple-electron-ics-projects-and-circuitshttpswwwsparkfuncomtutorialshttplearnadafruitcom

84 ProgramacioacuteDiuen que per ser un bon programador srsquohan de tenir unes habilitats que no tothom teacute disciplina ordre logravegica creativitat capacitat per resoldre qualsevol problema i per sobre de tot persistegravencia i passioacute Si creus que tens aquestes qualitats do-na-li una oportunitat a la programacioacute A continu-acioacute et deixem un recull de les pagravegines web que creiem que meacutes et poden ajudar a introduir-te una mica meacutes en la programacioacute web i la drsquoapli-cacions per a mogravebils

httpwwwcodeorghttpscratchmiteduhttpwwwcodecademycom

34

9 GlossariC (llenguatge de programacioacute) Des de la seva creacioacute lrsquoany 1972 srsquoha consolidat com un dels llenguatges de programacioacute meacutes utilitzats per fer aplicacions de software Eacutes considerat un dels meacutes bagravesics i meacutes comuns per introduir-se a la pro-gramacioacute Les grans companyies han utilitzat el C com a base per crear altres llenguatges com lrsquoObjective-C (utilitzat per fer les aplicacions per dispositius drsquoApple) o el C (creat per Microsoft i utilitzat entre altres coses per fer programes in-formagravetics per Windows)

Condensador Component electrogravenic classificat dins del grup dels passius i que per tant no emet cap senyal El podriacuteem definir com un acumula-dor drsquoelectrons que els deixa anar quan arriba a la seva capacitat magravexima Hi ha condensadors de dos tipus els electroliacutetics i els normals En les pragravec-tiques utilitzarem electroliacutetics i com que aquests tenen polaritat eacutes important tenir en compte quina eacutes la pota positiva i quina eacutes la negativa a lrsquohora de connectar-lo

Diacuteode Component electrogravenic passiu Teacute polaritat i seria lrsquoequivalent a una vagravelvula antiretorn lrsquoelec-tricitat nomeacutes pot anar en un sentit

Electrogravenica Disciplina que estudia els com-ponents electrogravenics que funcionen amb un flux drsquoelectrons (corrent continua)

Funcioacute Fragment de codi que conte un seguit drsquoaccions i que hi pots accedir cridant la funcioacute en comptes de repetint el codi Podriacuteem comparar-ho amb una funcioacute matemagravetica en la que tenim vari-ables drsquoentrada que tractant-les a la funcioacute ob-tenim una informacioacute de sortida

GPIO Soacuten les sigles de ldquoGeneral Purpose InputOutputrdquo Si mirem la Raspberry Pi soacuten els pins de sortida on hi connectem els cables amb els que programem la placa electrogravenica Lrsquoavantatge drsquoaquest tipus de connector respecte altres eacutes que es pot gestionar mitjanccedilant programacioacute i aixograve eacutes precisament el que explicarem en aquest manual

35

HDMI Soacuten les sigles de ldquoHigh-Definition Multime-dia Interfacerdquo Serveix per enviar viacutedeo i agraveudio a una pantalla Nosaltres lrsquoutilitzarem per connectar la RaspberryPi a una pantalla

LED Acrogravenim de ldquoLight Emitting Dioderdquo Eacutes un tipus de diacuteode el qual teacute una pelmiddotliacutecula de fogravesfor entre els dos connectors que fa que quan passi el corrent generi llum Com qualsevol altre diacuteode eacutes important tenir en compte la polaritat

RAM Acrogravenim de ldquoRandom Access Memoryrdquo Eacutes la part de lrsquoordinador encarregada drsquoemmagatze-mar els arxius temporals

RCA El connector RCA consisteix en diferents cables amb la punta de diferent color que serveix-en per transmetre agraveudio i viacutedeo

ROM De lrsquoanglegraves ldquoRead Only Memoryrdquo eacutes la uni-tat de memograveria on es guarda el sistema operatiu

Resistegravencia Eacutes un component electrogravenic que teacute com a funcioacute reduir el flux drsquoelectrons afi de controlar la seva potegravencia Eacutes molt comuacute a lrsquoelectrogravenica ja que eacutes molt necessari per assegu-rar-nos del correcte funcionament drsquoelements com el LED que sense una resistegravencia que limiteacutes el corrent podrien cremar-se

Placa base Eacutes la part de lrsquoordinador que conteacute elements com la RAM la ROM o el microproces-sador La placa base de lrsquoordinador que constru-irem amb aquest manual seria la progravepia Raspber-ry Pi

Protoboard Tambeacute coneguda com a Bread-board srsquoutilitza per crear circuits electrogravenics sense necessitat de soldar Per saber com funcio-na i com estan relacionats els diferents contactes consulteu aquesta webhttprduinostarcomdocumentaciongeneralpro-toboard-que-es-y-como-funciona

36

Terminal Eacutes el programa emprat per enviar ordres directes a lrsquoordinador i rebre respostes drsquoaquest Nosaltres lrsquoutilitzarem per instalmiddotlar els programes necessaris per programar les plaques electrograveniques i altres arxius necessaris

Variable Valor que canvia segons les operacions que es facin amb aquest al programa informagravetic Com ja sabeu hi ha variables independents (pe el temps) i dependents (pe si estagrave o no encegraves un LED que dependragrave drsquoaltres variables)

37

  • httpwwwfsforg
Page 3: CodePi

3

1 Quegrave eacutes la Raspberry PiLa RaspberryPi eacutes una placa computadora de baix cost feta a partir de components per a teleacutemogravebils eacutes a dir un petit ordinador amb les mateixes prestacions drsquoun smartphone de gama mitjana i amb sistema operatiu de base Linux

La Raspberry Pi va neacuteixer a Anglaterra el 2009 com un projecte amb lrsquoobjectiu de crear un ordinador de molt baix cost (30$) per a popularitzar la programacioacute entre els joves

Des del seu llanccedilament la fundacioacute Raspber-ryPi ha venut meacutes drsquoun milioacute de copies de la seva petita placa i srsquoha convertit en un dels siacutembols meacutes representatius de lrsquoelectrogravenica actual La comunitat drsquoaficionats a lrsquoelectrograveni-ca i la programacioacute ha acollit molt beacute a aquest producte i es poden trobar infinitats de tuto-rials projectes i drsquoaltres curiositats a la xarxa

4

2 Per a quegrave la utilitzaremUtilitzarem la RaspberryPi per a crear un ordi-nador amb el qual aprendrem electrogravenica i pro-gramacioacute A traveacutes de petits programes amb llenguatge C podrem gestionar els ports de la GPIO que encendran i apagaran LEDs lle-giran els estats drsquointerruptors i LDRs etc

Tot aixograve ho farem drsquouna manera fagravecil i entretin-guda a partir de diferents tutorials ordenats de menor a major dificultat comenccedilant per prin-cipis bagravesics de lrsquoelectrogravenica i la programacioacute fins a fer programes complexos per gestion-ar diferents LEDs segons diferents variables

Ara beacute abans de comenccedilar amb lrsquoelectrogravenica pu-rament hem de muntar la caixa que ens serviragrave per transportar la Raspberry Pi el teclat el ratoliacute la protoboard els components electrogravenics etc

5

3 Quegrave necessitarem per a muntar-laAquests soacuten els materials que necessitarem per muntar la CodePi Per una banda tenim les fus-tes i drsquoaltres eines que ens serviran per construir la caixa per transportar la CodePi

MaterialbullFusta de 320x320x6 (6 recomanat perograve pot ser meacutes gruixut)bullClaus bullFrontisses

EinesbullMartellbullLlima bullSerra per a fusta (manual o elegravectrica)bullCargol de banc

Per altra banda tambeacute necessitarem tots els components electrogravenics eines per portar a terme els tutorials i com no la Raspberry Pi Aixograve eacutes tot el que necesitarem

bullRaspberry Pi model BbullTargeta SDHC de com a miacutenim 4GB Classe 4 bullTeclatbullRatoliacute convencionalbullProtoboardbullCables electrogravenicsbullLEDsbullResistegravencies 180 i 10K ohmsbullPolsadors

3euro1euro1euro

33euro7euro5euro5euro4euro3euro1euro1euro1euro

Preu total 61euro

6

4 Apregraven a muntar la caixa de la CodePi

Abans de comenccedilar a tallar la fusta prepararem el seguumlent esquema en el nostre tauloacute de fusta A la part del centre deixarem un espai de 6 mm per poder clavar beacute una costat sobre un costat per acabar tenint una caixa de 160mm x 160mm

Amb un regle i un llapis marquem les liacutenies per on tallarem el tauloacute seguint lrsquoesquema anterior

A continuacioacute tallar el tauloacute amb una serra elegravec-trica En cas de no tenir-ne srsquohauragrave de posar la fullola en un cargol de banc i tallar-la amb una ser-ra manual

No passa res si la fusta no queda del tot ben tal-lada ja que despreacutes podrem retocar les imperfec-cions llimant-les i meacutes endavant posant massilla

7

Atencioacute Eacutes altament recomanable utilitzar guants i ulleres protectores durant tot el proceacutes de manip-ulacioacute de la fusta

Els guants ens protegiran de possibles talls ras-cades o drsquoaltres 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 Eacutes recomanable posar dues fustes entre la boca del cargol i el tauloacute per impedir que aquesta es pugui malmetre a causa de la pressioacute

Llimar les fustes verticalment ja que drsquoaquesta manera es treballa sobre meacutes superfiacutecie Reco-manem utilitzar una llima amb fulla molt rugosa per poder realitzar el treball meacutes ragravepidament Llimar tambeacute les dues peces que faran de tapa i contra tapa

Per millorar les llimadures utilitzar una llima amb la fulla meacutes fina o un paper de vidre

8

Un cop les fustes estiguin ben llimades utilitzar els claus per collar les parets Cal prestar atencioacute en la posicioacute dels claus ja que la fusta eacutes molt prima i es poden torccedilar Aquest hauria de ser el resultat final

Seguint el mateix proceacutes clavar la fullola que faragrave de tapa inferior Cal vigilar a on es posen els claus ja que pot ser que es toquin amb els que hem po-sat anteriorment

Agafar les frontisses i clavar-les amb dos claus pe-tits a la fullola que faragrave de tapa superior Despreacutes clavar els dos forats restants a una de les parets aquesta faragrave de part posterior de la CodePi

Recomanacioacute Si volem que la fusta ens duri du-rant meacutes temps eacutes recomanable envernissar la caixa amb un verniacutes per a fustes

9

Per descarregar Raspbian el sistema operatiu que utilitza la CodePi haurem drsquoobrir una nova fi-nestra del navegador i anar a la web de Raspberry Pi httpwwwraspberrypiorg

Eacutes recomanable fer aquest proceacutes al mateix ordi-nador en el que es procediragrave a instalmiddotlar Raspbian a la targeta SD

Recorda que aquest ordinador ha de tenir lector de targetes o un adaptador USB connectatDespreacutes haurem drsquoanar a lrsquoapartat de descagraverreg-ues on trobarem tots els enllaccedilos que necessitem per descarregar el sistema operatiu de la Rasp-berry Pi

5 Afegim un sistema ope- ratiu a la CodePi

51 Descarregar Raspbian

Lrsquouacuteltim pas per descarregar Raspbian eacutes clicar sobre lrsquoenllaccedil on posa Direct Download Es reco-mana realitzar aquest proceacutes en un lloc amb una connexioacute estable i ragravepida ja que srsquoha de descar-regar molta informacioacute

Despreacutes de clicar aquest enllaccedil sersquons obriragrave una nova finestra i automagraveticament Raspbian comenccedilaragrave a descarregar-se La descagraverrega pot trigar entre 5 i 15 minuts depenent de la teva con-nexioacute a internet Ja podem tancar aquesta finestra i continuar cap al pas seguumlent

10

52 Instalmiddotlar RaspbianUna vegada que ja tenim descarregada lrsquouacuteltima versioacute de Raspbian segons el sistema opera-tiu des del que vulguem instalmiddotlar-lo haurem de seguir uns passos diferents per completar la in-stalmiddotlacioacute

Windows

Per instalmiddotlar Raspbian amb Windows haurem de descarregar i instalmiddotlar Win32DiskImager Abans de continuar amb la instalmiddotlacioacute haurem de de-scomprimir el fitxer que ens hem descarregat Per descomprimir-lo utilitzarem un compressor drsquoarxius com (7zip) Clicant amb el botoacute dret so-bre aquest arxiu i clicarem on posa descomprimir aquiacute o buscarem el nom del nostre descompres-sor i despreacutes buscarem aquesta opcioacute

Ara introduirem la targeta de memograveria que vul-guem utilitzar a lrsquoentrada per targetes del nostre ordinador o a lrsquoadaptador corresponent

A continuacioacute iniciarem el programa i clicarem sobre el logo de la carpeta i escollirem el lloc on hem descomprimit el contingut del zip buscarem lrsquoar-xiu amb extensioacute img i acceptarem el diagraveleg Meacutes tard escollirem en quin dispositiu volem in-stalmiddotlar el sistema operatiu aquest eacutes un punt on hem drsquoestar segurs drsquoon estem instalmiddotlant aquests arxius ja que si lrsquoestigueacutessim instalmiddotlant en una destinacioacute diferent podriacuteem perdre totes les dades de lrsquoordinador Per saber a quin dispositiu hem drsquoinstalmiddotlar Raspbian obrirem ldquoEl Meu Ordinadorrdquo i buscarem la targeta de memograveria ens fixarem en quina lletra hi ha al final del nom aquesta seragrave la mateixa que haurem de posar al programaQuan ja haguem inserit aquests dos paragravemetres al programa clicarem sobre el botoacute de Write i es comenccedilara a instalmiddotlar el sistema operatiu

11

Linux

Per instalmiddotlar Raspbian des drsquoun sistema operatiu Linux utilitzarem lrsquoordre 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 homeusu-ari)

Un cop tenim descomprimit el contingut del zip obrirem una sessioacute al terminal i escriurem

cd ~

df -h

umount devsdd1

sudo dd bs=4M if=~2013-02-09-wheezy-raspbianimg of=devsdd

Anirem a la carpeta on hem descomprimit el zip (la de lrsquousuari eacutes per defecte o ~)

Buscarem la targeta sd i el seu nom a la seguumlent llista ens haurem drsquoapuntar el que posi a la prime-ra columna com devsdd (sense el numero) Assegureu-vos que aquest eacutes el dispositiu on vo-leu instalmiddotlar el Raspbian

Abans drsquoinstalmiddotlar Raspbian haurem de des-muntar les particions corresponents a la targeta SD utilitzant lrsquoordre umount en el cas de tenir meacutes drsquouna particioacute haurem drsquoexecutar aquesta ordre meacutes drsquouna vegada

Ara executarem lrsquoordre dd amb permisos drsquoadmi- nistrador al modificador ldquoif=rdquo posarem la carpeta on hem descomprimit el zip (la de lrsquousuari eacutes per defecte o ~) amb el nom del arxiu img descom-primit i al modificador ldquoof=rdquo escriurem el que hem copiat abans amb lrsquoanterior ordre

12

Mac OS X

Per instalmiddotlar Raspbian a Mac OS X tambeacute utilitza-rem lrsquoordre dd pero el funcionament per buscar en quin disc volem instalmiddotlar raspbian eacutes diferent Recomanem extreure el contingut del zip a la car-peta Usersusuari

Comenccedilarem buscant la targeta on volem instalmiddotlar raspbian executant la seguumlent ordre i copiarem el disk4 (sense agafar la particioacute)

Desmuntarem el disk en quumlestioacute

Ara executarem lrsquoordre dd amb permisos drsquoadmi- nistrador al modificador ldquoif=rdquo posarem la carpeta on hem descomprimit el zip (la de lrsquousuari eacutes per defecte o ~) amb el nom de lrsquoarxiu img descom-primit i al modificador ldquoof=rdquo escriurem el que hem copiat abans amb lrsquoanterior ordre

diskutil list

diskutil unmountDisk devdisk4

sudo dd bs=1m if=~2013-02-09-wheezy-raspbianimg of=devsdb

13

6 Primer inici i configuracioacute de la CodePiAra ja estem preparats per posar la targeta SD a la Raspberry Pi i connectar tots els cables per comenccedilar a programar A continuacioacute hem de se-guir uns passos que nomeacutes podrem fer durant la primera arrencada del sistema i que ens perme-tran iniciar lrsquoescriptori automagraveticament posar la CodePi en catalagrave i configurar la disposicioacute del te-clat entre drsquoaltres coses

Quan iniciem per primera vegada la Raspberry Pi amb el sistema operatiu Raspbian ens apareixeragrave la seguumlent pantalla on ens mourem utilitzant les fletxes i la tecla intro

La primera cosa que seleccionarem seragrave ldquoboot_behaviorrdquo que ens permetragrave inciar lrsquoescriptori quan el sistema iniciiuml

Ens mourem amb el teclat (dreta - esquerre) per fer que estigui seleccionat ldquoyesrdquo clicarem enter

14

Ara a continuacioacute ens mourem fins a ldquoexpand_rootfsrdquo que ens permetragrave expandir el tamany de la particioacute arrel de la Raspberry Pi al tamany magravex-im de la targeta SD eacutes a dir si tenim una targeta de 4 Gb si no fessim aquesta opcioacute estariacuteem util-itzant uacutenicament 2 Gb de capacitat

Acceptarem el seguumlent diagraveleg i passarem a con-figurar els idiomes

Buscarem ldquochange_localerdquo per canviar els idio-mes i la disposicioacute del teclat al catalagrave

De la seguumlent llista seleccionarem mitjanccedilant lrsquoes-pai del teclat totes les codificacions que comencin per ldquoCA_Per baixar a buscar-les utilitzarem les fletxes (amunt-avall) i per acabar clicarem la del costat dret i enter

15

Seleccionarem ldquochange_timezonerdquo per canviar la zona horagraveria de la Raspberry Pi i els temes rela-cionats amb aquesta

A continuacioacute seleccionarem el nostre continent

I per uacuteltim buscarem una ciutat que estigui a la mateixa zona horagraveria que nosaltres i la seleccio-nariacuteem tambeacute amb enter

64 Descarregar i executar ScriptPer descarregar lrsquoscript hem donar permisos i ex-ecutar-lo aixiacute que escriurem les seguumlents ordres en el terminal que podeu trobar a lrsquoescriptori

cd tmpmkdir CodePicd CodePiwget httpwwwtomorrowdevcomcodepiwiringPi-installshchmod +x wiringPi-installshwiringPi-installsh

Ja hem acabat de descarregar el programari que ens permetragrave programar amb la CodePi

16

7 PragravectiquesRecomanacioacute mirar aquests tutorials introduc-toris al llenguatge C httpthenewbostonorglistphpcat=14

Aquiacute teniu un quadre que us serviragrave lrsquoequivalegravencia entre els pins del GPIO i els que haurem de posar en el codi

Ja queda menys perquegrave puguis comenccedilar a pro-gramar perograve abans de fer-ho hauragraves de saber com compilar un programa Probablement ara et preguntaragraves quegrave eacutes compilar doncs compilar eacutes el proceacutes que fa un programa per traduir el codi que nosaltres hem escrit a codi binari amb la fi-nalitat de que el nostre ordinador pugui entendre cada ordre

Per compilar un codi escrit en C farem servir el compilador cc Abans drsquoutilitzar aquest programa haurem drsquoindicar a on hem guardat la nostra pragravec-tica amb lrsquoordre cdcc

-o practica

-Wall

-Iusrlocalinclude

-Lusrlocallib

practicac

-lwiringPi

Primer de tot posarem lrsquoordre al terminal

Utilitzarem el modificador -o per establir quin seragrave el nom del programa de sortida per exemple ldquopragravecticardquo

Amb aquest modificador indicarem que volem que ens doni tota la informacioacute dels errors de sintaxis del fitxer

Amb aquest indicarem on es troben els fitxers de la llibreria a incloure dintre del nostre fitxer

Utilitzant aquest altre modificador establim el di-rectori on ha de buscar els fitxers de la llibreria

Ara indicarem el nom del fitxer on es troba el nos-tre codi sempre acabant amb la terminacioacute c per exemple ldquopragravecticacrdquo

Amb aquest modificador posem la llibreria wiring-Pi a la llista de llibreries que han de ser afegides

17

Al final introduirem tot seguit al terminal una ordre similar a la seguumlent

cc -o practica -Wall -Iusrlocalinclude -Lusrlocallib practicac -lwiringPi

A part de saber compilar abans de comenccedilar a programar i a fer els nostres circuits haurem de saber quins soacuten els pins on haurem de connectar als cables a la Raspberry Pi aquest pins els iden-tificarem utilitzant nuacutemeros

La seguumlent taula ens permet saber lrsquoequivalegravencia entre els nuacutemeros de la GPIO els nuacutemeros de wiringPi la llibreria que interpretaragrave el nostre codi i la posicioacute dels pins

18

Des que la variable i eacutes igual a 1 fins i mentre que aquesta sigui igual o meacutes petita que10 executa el codi

Mentre que la variable D sigui igual a 5 el codi entre claus es llegiragrave infinites vegades

Si la variable X no eacutes meacutes petita que 7 fes una altra cosa

Si la variable X eacutes meacutes petita que 7 fes alguna cosa

70 Iniciacioacute al llenguatge CAbans de comenccedilar a programar cal tenir en compte els conceptes de condicional i de cicle

Els condicionals ldquoif - elserdquo nomeacutes executen el codi a continuacioacute si la condicioacute que li fiquem entre paregraventesis eacutes certa Ho podriacuteem comparar amb el que seria una oracioacute condicional No eacutes obligatori perograve podem afegir la partiacutecula ldquoelserdquo que eacutes lrsquoequivalent a la paraula ldquosi nordquo En el cas a continuacioacute com que el condicional no es compleix srsquoexecutaria lrsquoelse

if (X lt 7) Fes alguna cosa else Fes una altra cosa

Els bucles ldquoforrdquo soacuten rutines que serveixen per ex-ecutar un codi un determinat nuacutemero de vegades Teacute tres parts separades per punt i coma entrada condicioacute i increment A la entrada li donem un va-lor a una variable A la condicioacute determinem que la rutina srsquoexecuti nomeacutes si eacutes compleix la condicioacute utilitzant la variable drsquoentrada Finalment en el in-crement fixem un nou valor a la variable aquesta part srsquoexecutaragrave a cada cicle En llenguatge C si no afegim cap dels tres paragravemetres el bucle seragrave infinit

for (int i = 1 i lt= 10 i++) Fes alguna cosa

La sentegravencia ldquowhilerdquo defineix que un codi srsquoexe-cutaragrave infinitament mentre que la condicioacute que es defineix sigui certa

while (D==5) Fes alguna cosa

19

71 Bloc 1 (Bagravesic)711 Hola moacuten

En aquesta pragravectica escriurem un text a la consograve-la el conegut ldquoHello Worldrdquo

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void) printf(ldquohola moacutenrdquo)

if (wiringPiSetup() == -1) exit (1)

return 0

712 Encendre un LED

Hem drsquoimportar aquestes llibreries per tal que la RaspberryPi entengui el codi

Aquesta eacutes la funcioacute principal (main) i srsquoexecutaragrave tot el que fiquem aquiacute dins

Amb la funcioacute printf() el que aconseguim eacutes que es mostri al terminal el text que hi posem entre comentes

Aquestes liacutenies de codi soacuten simplement compro-vacions per assegurar-nos que tot funciona cor-rectament Soacuten negligibles perograve eacutes recomanable posar-les Les afegirem a totes les pragravectiques

Connectarem la pota llarga (agravenode) del LED al pin 5v de la GPIO i lrsquoaltre pota (cagravetode) a una resistegraven-cia de 180Ω Aquesta distincioacute entre potes es deu a que els LEDs estan polaritzats mireu el glossa-ri per saber-ne meacutes Tot seguit connecteu lrsquoaltra pota de la resistegravencia al pin GROUND

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void)

20

Comprovacionsif (wiringPiSetup() == -1) exit (1)

int pin = 1

printf(ldquoEncenem el pin 18rdquo)

pinMode(pin OUTPUT)

digitalWrite(pin 1)

return 0

713 Encendre i apagar un LED cada dos segons 10 vegades

El que podeu veure aquiacute eacutes el que srsquoanomena un comentari del codi Tot allograve que escrivim despreacutes de ldquordquo el compilador no ho llegiragrave i per tant nomeacutes serveix per donar indicacions al programador

Declarem la variable pin que com eacutes un nombre enter escriurem int

Fem un printf() tal i com hem apregraves a la pragravectica anterior Escrivim el 18 ja que la numeracioacute de la llibreria wiringPi canvia respecte a la sortida real (mirar el cuadre de la pagravegina 17)

Amb la funcioacute pinMode() declarem que el pin nuacutemero 1 en aquest cas sigui un pin de sortida de corrent (OUTPUT)

Una vegada li hem dit que eacutes de sortida li hem de dir si el volem encegraves ldquo1rdquo o apagat ldquo0rdquo amb la funcioacute digitalWrite()

Utilitzarem el muntatge la de pragravectica anterior amb la diferegravencia que en comptes de connectar lrsquoagravenode del LED al pin de 5v el connectarem al pin 18 de la Raspberry Pi Drsquoaquesta manera podrem gestionar el pas de lrsquoelectricitat a traveacutes drsquoun petit programa que crearem a continuacioacute

21

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void) int pin = 1

if (wiringPiSetup() == -1) exit (1)

pinMode(pin OUTPUT)

for (int i=1ilt=10i++)

printf(ldquoLED Onnrdquo) digitalWrite(pin 1)

delay(2000)

printf(ldquoLED Offnrdquo) digitalWrite(pin 0)

delay(2000)

return 0

Utilitzem un bicle ldquoforrdquo per executar el codi 10 vegades

Encenem el LED

Fem un delay() de 2000 milmiddotlisegons (2 segons) que ens serveix per aturar el programa i per tant mantenir el LED encegraves durant aquest temps

Apaguem el LED

El mantenim apagat 2 segons

Lrsquoexpressioacute n serveix per canviar de liacutenia

Proposta Ara que ja saps els conceptes bagravesics de la CodePi intenta fer lrsquoequivalent al codi Morse per demanar ajuda SOS middot middot middot ndash ndash ndash middot middot middot (on cada punt significa LED encegraves durant 14 de segon i cada ralla LED encegraves durant mig segon) Juga amb el valor de la funcioacute delay() per fer que el LED estigui encegraves durant meacutes o menys temps

22

72 Bloc 2 (Mitjagrave)721 Encendre un LED apretant un botoacute

Utilitzar el muntatge del LED que hem fet servir a la pragravectica anterior A meacutes a meacutes hem drsquoafegir 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 aniragrave a parar al pin 23 una resistegravencia de 10KΩ al GROUND per forccedilar lrsquoestat LOW quan el polsador no estagrave apretat

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt int main (void) int pin_LED = 1 int pin_boto = 4 printf (ldquoEncenent un LED apretant un botoacutenrdquo) 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

Declarem el LED com un pin de sortidaI el botoacute com un pin drsquoentrada

Si no fiquem variables al for aquest srsquoexecutaragrave sempre

Amb la funcioacute digitalRead() detectem si passa cor-rent pel pin 8 eacutes a dir si el botoacute ha estat apretat Si eacutes aixiacute fem que srsquoencengui el LED

Si no fem que srsquoapagui

23

722 Encendre un LED apretant tots els puladors

Utilitzar el muntatge de la pragravectica anterior i afegir dos polsadors meacutes amb el mateix proceacutes connec-tats als ports 24 i 25 de la Raspberry Pi

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int main (void) int pin_LED = 1

int pin_boto_A = 4 int pin_boto_B = 5 int 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 ampamp digitalRead(pin_boto_B) == HIGH ampamp digitalRead(pin_boto_C) == HIGH) digitalWrite(pin_LED 1)

Declarem el LED i els tres botons que tal i com posa a lrsquoesquema corresponen als pins 23 24 i 25 de la GPIO

Si els tres polsadors estan premuts passa corrent pels tres i per tant srsquoenceacuten el LED

En aquest cas utilitzem HIGH i LOW en lloc de 1 i 0 respectivament HIGH significa que hi ha elec-tricitat i LOW que no hi ha

24

No apretats while (digitalRead(pin_boto_A) == LOW ampamp digitalRead(pin_boto_B) == LOW ampamp digitalRead(pin_boto_C) == LOW) digitalWrite(pin_LED 0)

Si no apagarsquol

723 Semagravefor amb polsador

En aquesta pragravectica crearem un semagravefor de via-nants i de cotxes Com alguns semagravefors aquests teacute un botoacute amb el qual els vianants demanen que es posi verd aixiacute que el dels cotxes es posa ver-mell

Connectarem dos LEDs (vermell i verd) als pins 18 i 23 de la Raspberry Pi amb una resistegravencia de 180Ω Tambeacute connectarem tres LEDs meacutes (verd vermell i taronja) de la mateixa manera en els ports 17 21 i 22 de la GPIO

A diferegravencia de les altres pragravectiques amb polsa-dors en aquesta el connectarem al port SDA0 i al GROUND ja que nomeacutes ens interessa detectar quan es prem

25

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

define VERMELL 0define GROC1define VERD 2define VERMELL_HOME3define VERD_HOME4

define BOTO 8

void setup (void) int i

if (geteuid () = 0) exit (0)

if (wiringPiSetup () == -1) exit (1)

fflush(stdout) for (i = 0 i lt 5 ++i) pinMode (i OUTPUT) digitalWrite (i 0) digitalWrite(VERD1)digitalWrite(VERMELL_HOME1) pinMode (BOTO INPUT)

printf (ldquoSetup fetnrdquo)

int main (void) setup () for () esperaBoto () aturaTransit () camina () tempsEspera () iniciaTransit ()

Amb lrsquoexpressioacute define li diem a la magravequina que cada cop que escrivim VERMELL en realitat es-tem posant el nombre 0 i el mateix amb les altres paraules

Fem un setup amb tota la configuracioacute necessagraveria

fflush() eacutes una funcioacute complexa que serveix per quumlestions de tractament de memograveria del sistema per evitar errors

Executem totes les funcions una darrera lrsquoaltra de manera indefinida

26

Esperant a que lrsquousuari premi el botoacute per comenccedilar

Fem que el semagravefor dels cotxes canviiuml de verd a vermell passant pel groc

Fem que el semagravefor dels vianants es posi verd

Temps intermig des que srsquoacaba de caminar fins que el trafic comenccedila

void esperaBoto (void) printf (ldquoEsperant el botoacute ldquo)fflush(stdout) while (digitalRead (BOTO) == HIGH) delay (100) printf (ldquoEsoerenrdquo)

void aturaTransit()printf(ldquoAturanteltraficldquo)fflush(stdout)digitalWrite(VERD0) digitalWrite (GROC 1) delay (2000) digitalWrite (GROC 0) digitalWrite(VERMELL1) delay (2000) printf (ldquoAturatsnrdquo)

void camina ()printf(ldquoCaminaldquo)fflush(stdout)

digitalWrite(VERMELL_HOME0)digitalWrite(VERD_HOME1) delay (10000) digitalWrite(VERMELL0) digitalWrite (GROC 1)

printf (ldquoJa han caminatnrdquo)

void tempsEspera () int i

printf (ldquoTemps drsquoespera ldquo) fflush(stdout)

for (i = 0 i lt 8 ++i)

27

delay (500) digitalWrite(VERD_HOME0) digitalWrite (GROC 0) delay (500) digitalWrite(VERD_HOME1) digitalWrite (GROC 1)

void iniciaTransit ()printf(ldquoInicianttraficldquo)fflush(stdout)

digitalWrite(VERD_HOME0)digitalWrite(VERMELL_HOME1) delay (500) digitalWrite (GROC 0) digitalWrite(VERD1)

Deixem via lliure pels vehicles i posem el semagrave-for vermell pels vianants

Proposta Utilitzant el que has apregraves en aquest bloc crear un projecte amb uns quants LEDs en fila que srsquoactivin ascendentment quan apretes un botoacute

28

73 Bloc 3 (Alt)731 Sistema portes logravegiques I

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int AND (int a int b) return a ampamp b

int OR (int a int b) return a || b

int NEGADA (int a) return a

int f(int a int b) return OR(AND(NE-GADA(a)b)AND(aNEGADA(b))) f(a b) = arsquob + abrsquo

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5

int apretat_A = 0 int apretat_B = 0

pinMode(pin_LED_S OUTPUT) pinMode(pin_boto_A INPUT) pinMode(pin_boto_B INPUT)

Crearem una funcioacute per a cada porta logravegica de tal manera que sigui meacutes fagravecil poder-ho aplicar despreacutes

Aquesta seragrave la foacutermula que compliragrave la taula de la veritat en aquest cas eacutes f(a b) = arsquob +abrsquo

Creem dos booleans (variables que poden ser 0 o 1) que ens indicaran si el botoacute ha estat premut o no

Declarem els pins drsquoentrada i de sortida com a totes les pragravectiques anteriors

El seguumlent projecte fa la mateixa funcioacute que acon-seguiriacuteem amb xips de portes logravegiques perograve fent els cagravelculs a partir de la RaspberryPi En aquest cas compleix la taula de la veritat drsquoun OR ex-clusive eacutes a dir nomeacutes srsquoencendragrave el LED quan premem un dels dos botons mai srsquoencendragrave 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 srsquoutilitzin en el codi

29

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) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins estan premuts

Comprovem quins no estan premuts

I apliquem la foacutermula amb els valors drsquoentrada cor-responents Si la foacutermula eacutes igual a 1 srsquoencendragrave el LED si no no srsquoencendragrave

732 Sistema portes logravegiques II

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

Partim de la mateixa base que la pragravectica ante-rior perograve en aquesta incloem una tercera variable drsquoentrada Aixiacute que hem drsquoafegir un nou botoacute en el pin del GPIO que srsquoescau

30

Seguim el patroacute de les foacutermules emprades a la pragravectica anterior

En aquest cas tenim tres variables drsquoentrada perograve la mecagravenica eacutes la mateixa Es pot jugar amb la foacutermula i anar provant diferents combinacions

Necessitem tres variables ja que hi ha tres botons

Declaracions

Comprovem quins estan premuts

int AND (int a int b) return a ampamp b

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 + arsquob

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5 int pin_boto_C = 6

int apretat_A = 0 int apretat_B = 0 int apretat_C = 0

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

31

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

Mostra resultat if (f(apretat_A apretat_B apretat_C) == 1) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins no estan premuts

Com al circuit anterior apliquem la foacutermula i si aquesta doacutena 1 encenem el LED

Proposta Ara que ja has apregraves els conceptes meacutes fonamentals de la CodePi inventarsquot un circuit amb el nivell de dificultat que consideris No et quedis amb el que se trsquoha ensenyat aquiacute sinoacute que cerca meacutes megravetodes que puguis utilitzar La creativitat eacutes bagravesica per a tot bon enginyer i amb aquesta pragravectica volem que demostris de quegrave ets capaccedil

32

8 Vols saber-ne meacutes El moacuten de la programacioacute i lrsquoelectrogravenica eacutes infinit La comunitat geek (= interessada) en aquests te-mes eacutes una de les meacutes servicials i altruista de tota la xarxa aixiacute que es poden trobar una quantitat inacabable de tutorials i pagravegines web especialitza-des en el que vulguem saber

81 Programari lliureEl programari lliure eacutes la base de la informagravetica ac-tual i encara juga un gran paper en algunes agraverees com els servidors web o els mogravebils amb sistema operatiu Android Aquiacute teniu un conjunt de pagravegines on podeu aprofundir sobre aquest apassionant moacuten de la llibertat digital

httpcawikipediaorgwikiRichard_Matthew_Stallmanhttpwwwfsforghttpwwwgnuorghttpwwwlinuxorghttpwwwunixorghttpwwwubuntucom

82 Raspberry PiSi desitges saber meacutes sobre el projecte sense agravenim de lucre Raspberry Pi i seguir fent projectes amb ella visita les pagines que trobaragraves a con-tinuacioacute Aquestes et donaran idees de quegrave fer amb aquest petit perograve fascinant ordinador

httplearnadafruitcomcategorylearn-raspber-ry-pihttpwwwraspberrypiorgwwwraspberrypiorghttpdangerousprototypescom20130202rasp-berry-pi-supercomputerhttpreviewscnetcoukdesktops25-fun-things-to-do-with-a-raspberry-pi-50009851httplearnadafruitcompi-thermal-printer

33

83 Electrogravenica Si lrsquoelectrogravenica bagravesica que has apregraves durant els tutorials de la CodePi trsquoha fet veure que aquest eacutes el moacuten que a tu trsquoagrada no paris A continu-acioacute et deixem pagravegines web on trobaragraves les bases de lrsquoelectrogravenica meacutes complexa i tambeacute molts nous circuits per muntar i seguir descobrint aquest moacuten que avui en dia fa que tots els aparells endollats a al corrent puguin funcionar

httpwwwinstructablescomidBeginners-Elec-tronics-ProjectshttpwwwinstructablescomidElectronic-Proj-ects-For-Beginnershttpwwwcircuitstodaycomsimple-electron-ics-projects-and-circuitshttpswwwsparkfuncomtutorialshttplearnadafruitcom

84 ProgramacioacuteDiuen que per ser un bon programador srsquohan de tenir unes habilitats que no tothom teacute disciplina ordre logravegica creativitat capacitat per resoldre qualsevol problema i per sobre de tot persistegravencia i passioacute Si creus que tens aquestes qualitats do-na-li una oportunitat a la programacioacute A continu-acioacute et deixem un recull de les pagravegines web que creiem que meacutes et poden ajudar a introduir-te una mica meacutes en la programacioacute web i la drsquoapli-cacions per a mogravebils

httpwwwcodeorghttpscratchmiteduhttpwwwcodecademycom

34

9 GlossariC (llenguatge de programacioacute) Des de la seva creacioacute lrsquoany 1972 srsquoha consolidat com un dels llenguatges de programacioacute meacutes utilitzats per fer aplicacions de software Eacutes considerat un dels meacutes bagravesics i meacutes comuns per introduir-se a la pro-gramacioacute Les grans companyies han utilitzat el C com a base per crear altres llenguatges com lrsquoObjective-C (utilitzat per fer les aplicacions per dispositius drsquoApple) o el C (creat per Microsoft i utilitzat entre altres coses per fer programes in-formagravetics per Windows)

Condensador Component electrogravenic classificat dins del grup dels passius i que per tant no emet cap senyal El podriacuteem definir com un acumula-dor drsquoelectrons que els deixa anar quan arriba a la seva capacitat magravexima Hi ha condensadors de dos tipus els electroliacutetics i els normals En les pragravec-tiques utilitzarem electroliacutetics i com que aquests tenen polaritat eacutes important tenir en compte quina eacutes la pota positiva i quina eacutes la negativa a lrsquohora de connectar-lo

Diacuteode Component electrogravenic passiu Teacute polaritat i seria lrsquoequivalent a una vagravelvula antiretorn lrsquoelec-tricitat nomeacutes pot anar en un sentit

Electrogravenica Disciplina que estudia els com-ponents electrogravenics que funcionen amb un flux drsquoelectrons (corrent continua)

Funcioacute Fragment de codi que conte un seguit drsquoaccions i que hi pots accedir cridant la funcioacute en comptes de repetint el codi Podriacuteem comparar-ho amb una funcioacute matemagravetica en la que tenim vari-ables drsquoentrada que tractant-les a la funcioacute ob-tenim una informacioacute de sortida

GPIO Soacuten les sigles de ldquoGeneral Purpose InputOutputrdquo Si mirem la Raspberry Pi soacuten els pins de sortida on hi connectem els cables amb els que programem la placa electrogravenica Lrsquoavantatge drsquoaquest tipus de connector respecte altres eacutes que es pot gestionar mitjanccedilant programacioacute i aixograve eacutes precisament el que explicarem en aquest manual

35

HDMI Soacuten les sigles de ldquoHigh-Definition Multime-dia Interfacerdquo Serveix per enviar viacutedeo i agraveudio a una pantalla Nosaltres lrsquoutilitzarem per connectar la RaspberryPi a una pantalla

LED Acrogravenim de ldquoLight Emitting Dioderdquo Eacutes un tipus de diacuteode el qual teacute una pelmiddotliacutecula de fogravesfor entre els dos connectors que fa que quan passi el corrent generi llum Com qualsevol altre diacuteode eacutes important tenir en compte la polaritat

RAM Acrogravenim de ldquoRandom Access Memoryrdquo Eacutes la part de lrsquoordinador encarregada drsquoemmagatze-mar els arxius temporals

RCA El connector RCA consisteix en diferents cables amb la punta de diferent color que serveix-en per transmetre agraveudio i viacutedeo

ROM De lrsquoanglegraves ldquoRead Only Memoryrdquo eacutes la uni-tat de memograveria on es guarda el sistema operatiu

Resistegravencia Eacutes un component electrogravenic que teacute com a funcioacute reduir el flux drsquoelectrons afi de controlar la seva potegravencia Eacutes molt comuacute a lrsquoelectrogravenica ja que eacutes molt necessari per assegu-rar-nos del correcte funcionament drsquoelements com el LED que sense una resistegravencia que limiteacutes el corrent podrien cremar-se

Placa base Eacutes la part de lrsquoordinador que conteacute elements com la RAM la ROM o el microproces-sador La placa base de lrsquoordinador que constru-irem amb aquest manual seria la progravepia Raspber-ry Pi

Protoboard Tambeacute coneguda com a Bread-board srsquoutilitza per crear circuits electrogravenics sense necessitat de soldar Per saber com funcio-na i com estan relacionats els diferents contactes consulteu aquesta webhttprduinostarcomdocumentaciongeneralpro-toboard-que-es-y-como-funciona

36

Terminal Eacutes el programa emprat per enviar ordres directes a lrsquoordinador i rebre respostes drsquoaquest Nosaltres lrsquoutilitzarem per instalmiddotlar els programes necessaris per programar les plaques electrograveniques i altres arxius necessaris

Variable Valor que canvia segons les operacions que es facin amb aquest al programa informagravetic Com ja sabeu hi ha variables independents (pe el temps) i dependents (pe si estagrave o no encegraves un LED que dependragrave drsquoaltres variables)

37

  • httpwwwfsforg
Page 4: CodePi

4

2 Per a quegrave la utilitzaremUtilitzarem la RaspberryPi per a crear un ordi-nador amb el qual aprendrem electrogravenica i pro-gramacioacute A traveacutes de petits programes amb llenguatge C podrem gestionar els ports de la GPIO que encendran i apagaran LEDs lle-giran els estats drsquointerruptors i LDRs etc

Tot aixograve ho farem drsquouna manera fagravecil i entretin-guda a partir de diferents tutorials ordenats de menor a major dificultat comenccedilant per prin-cipis bagravesics de lrsquoelectrogravenica i la programacioacute fins a fer programes complexos per gestion-ar diferents LEDs segons diferents variables

Ara beacute abans de comenccedilar amb lrsquoelectrogravenica pu-rament hem de muntar la caixa que ens serviragrave per transportar la Raspberry Pi el teclat el ratoliacute la protoboard els components electrogravenics etc

5

3 Quegrave necessitarem per a muntar-laAquests soacuten els materials que necessitarem per muntar la CodePi Per una banda tenim les fus-tes i drsquoaltres eines que ens serviran per construir la caixa per transportar la CodePi

MaterialbullFusta de 320x320x6 (6 recomanat perograve pot ser meacutes gruixut)bullClaus bullFrontisses

EinesbullMartellbullLlima bullSerra per a fusta (manual o elegravectrica)bullCargol de banc

Per altra banda tambeacute necessitarem tots els components electrogravenics eines per portar a terme els tutorials i com no la Raspberry Pi Aixograve eacutes tot el que necesitarem

bullRaspberry Pi model BbullTargeta SDHC de com a miacutenim 4GB Classe 4 bullTeclatbullRatoliacute convencionalbullProtoboardbullCables electrogravenicsbullLEDsbullResistegravencies 180 i 10K ohmsbullPolsadors

3euro1euro1euro

33euro7euro5euro5euro4euro3euro1euro1euro1euro

Preu total 61euro

6

4 Apregraven a muntar la caixa de la CodePi

Abans de comenccedilar a tallar la fusta prepararem el seguumlent esquema en el nostre tauloacute de fusta A la part del centre deixarem un espai de 6 mm per poder clavar beacute una costat sobre un costat per acabar tenint una caixa de 160mm x 160mm

Amb un regle i un llapis marquem les liacutenies per on tallarem el tauloacute seguint lrsquoesquema anterior

A continuacioacute tallar el tauloacute amb una serra elegravec-trica En cas de no tenir-ne srsquohauragrave de posar la fullola en un cargol de banc i tallar-la amb una ser-ra manual

No passa res si la fusta no queda del tot ben tal-lada ja que despreacutes podrem retocar les imperfec-cions llimant-les i meacutes endavant posant massilla

7

Atencioacute Eacutes altament recomanable utilitzar guants i ulleres protectores durant tot el proceacutes de manip-ulacioacute de la fusta

Els guants ens protegiran de possibles talls ras-cades o drsquoaltres 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 Eacutes recomanable posar dues fustes entre la boca del cargol i el tauloacute per impedir que aquesta es pugui malmetre a causa de la pressioacute

Llimar les fustes verticalment ja que drsquoaquesta manera es treballa sobre meacutes superfiacutecie Reco-manem utilitzar una llima amb fulla molt rugosa per poder realitzar el treball meacutes ragravepidament Llimar tambeacute les dues peces que faran de tapa i contra tapa

Per millorar les llimadures utilitzar una llima amb la fulla meacutes fina o un paper de vidre

8

Un cop les fustes estiguin ben llimades utilitzar els claus per collar les parets Cal prestar atencioacute en la posicioacute dels claus ja que la fusta eacutes molt prima i es poden torccedilar Aquest hauria de ser el resultat final

Seguint el mateix proceacutes clavar la fullola que faragrave de tapa inferior Cal vigilar a on es posen els claus ja que pot ser que es toquin amb els que hem po-sat anteriorment

Agafar les frontisses i clavar-les amb dos claus pe-tits a la fullola que faragrave de tapa superior Despreacutes clavar els dos forats restants a una de les parets aquesta faragrave de part posterior de la CodePi

Recomanacioacute Si volem que la fusta ens duri du-rant meacutes temps eacutes recomanable envernissar la caixa amb un verniacutes per a fustes

9

Per descarregar Raspbian el sistema operatiu que utilitza la CodePi haurem drsquoobrir una nova fi-nestra del navegador i anar a la web de Raspberry Pi httpwwwraspberrypiorg

Eacutes recomanable fer aquest proceacutes al mateix ordi-nador en el que es procediragrave a instalmiddotlar Raspbian a la targeta SD

Recorda que aquest ordinador ha de tenir lector de targetes o un adaptador USB connectatDespreacutes haurem drsquoanar a lrsquoapartat de descagraverreg-ues on trobarem tots els enllaccedilos que necessitem per descarregar el sistema operatiu de la Rasp-berry Pi

5 Afegim un sistema ope- ratiu a la CodePi

51 Descarregar Raspbian

Lrsquouacuteltim pas per descarregar Raspbian eacutes clicar sobre lrsquoenllaccedil on posa Direct Download Es reco-mana realitzar aquest proceacutes en un lloc amb una connexioacute estable i ragravepida ja que srsquoha de descar-regar molta informacioacute

Despreacutes de clicar aquest enllaccedil sersquons obriragrave una nova finestra i automagraveticament Raspbian comenccedilaragrave a descarregar-se La descagraverrega pot trigar entre 5 i 15 minuts depenent de la teva con-nexioacute a internet Ja podem tancar aquesta finestra i continuar cap al pas seguumlent

10

52 Instalmiddotlar RaspbianUna vegada que ja tenim descarregada lrsquouacuteltima versioacute de Raspbian segons el sistema opera-tiu des del que vulguem instalmiddotlar-lo haurem de seguir uns passos diferents per completar la in-stalmiddotlacioacute

Windows

Per instalmiddotlar Raspbian amb Windows haurem de descarregar i instalmiddotlar Win32DiskImager Abans de continuar amb la instalmiddotlacioacute haurem de de-scomprimir el fitxer que ens hem descarregat Per descomprimir-lo utilitzarem un compressor drsquoarxius com (7zip) Clicant amb el botoacute dret so-bre aquest arxiu i clicarem on posa descomprimir aquiacute o buscarem el nom del nostre descompres-sor i despreacutes buscarem aquesta opcioacute

Ara introduirem la targeta de memograveria que vul-guem utilitzar a lrsquoentrada per targetes del nostre ordinador o a lrsquoadaptador corresponent

A continuacioacute iniciarem el programa i clicarem sobre el logo de la carpeta i escollirem el lloc on hem descomprimit el contingut del zip buscarem lrsquoar-xiu amb extensioacute img i acceptarem el diagraveleg Meacutes tard escollirem en quin dispositiu volem in-stalmiddotlar el sistema operatiu aquest eacutes un punt on hem drsquoestar segurs drsquoon estem instalmiddotlant aquests arxius ja que si lrsquoestigueacutessim instalmiddotlant en una destinacioacute diferent podriacuteem perdre totes les dades de lrsquoordinador Per saber a quin dispositiu hem drsquoinstalmiddotlar Raspbian obrirem ldquoEl Meu Ordinadorrdquo i buscarem la targeta de memograveria ens fixarem en quina lletra hi ha al final del nom aquesta seragrave la mateixa que haurem de posar al programaQuan ja haguem inserit aquests dos paragravemetres al programa clicarem sobre el botoacute de Write i es comenccedilara a instalmiddotlar el sistema operatiu

11

Linux

Per instalmiddotlar Raspbian des drsquoun sistema operatiu Linux utilitzarem lrsquoordre 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 homeusu-ari)

Un cop tenim descomprimit el contingut del zip obrirem una sessioacute al terminal i escriurem

cd ~

df -h

umount devsdd1

sudo dd bs=4M if=~2013-02-09-wheezy-raspbianimg of=devsdd

Anirem a la carpeta on hem descomprimit el zip (la de lrsquousuari eacutes per defecte o ~)

Buscarem la targeta sd i el seu nom a la seguumlent llista ens haurem drsquoapuntar el que posi a la prime-ra columna com devsdd (sense el numero) Assegureu-vos que aquest eacutes el dispositiu on vo-leu instalmiddotlar el Raspbian

Abans drsquoinstalmiddotlar Raspbian haurem de des-muntar les particions corresponents a la targeta SD utilitzant lrsquoordre umount en el cas de tenir meacutes drsquouna particioacute haurem drsquoexecutar aquesta ordre meacutes drsquouna vegada

Ara executarem lrsquoordre dd amb permisos drsquoadmi- nistrador al modificador ldquoif=rdquo posarem la carpeta on hem descomprimit el zip (la de lrsquousuari eacutes per defecte o ~) amb el nom del arxiu img descom-primit i al modificador ldquoof=rdquo escriurem el que hem copiat abans amb lrsquoanterior ordre

12

Mac OS X

Per instalmiddotlar Raspbian a Mac OS X tambeacute utilitza-rem lrsquoordre dd pero el funcionament per buscar en quin disc volem instalmiddotlar raspbian eacutes diferent Recomanem extreure el contingut del zip a la car-peta Usersusuari

Comenccedilarem buscant la targeta on volem instalmiddotlar raspbian executant la seguumlent ordre i copiarem el disk4 (sense agafar la particioacute)

Desmuntarem el disk en quumlestioacute

Ara executarem lrsquoordre dd amb permisos drsquoadmi- nistrador al modificador ldquoif=rdquo posarem la carpeta on hem descomprimit el zip (la de lrsquousuari eacutes per defecte o ~) amb el nom de lrsquoarxiu img descom-primit i al modificador ldquoof=rdquo escriurem el que hem copiat abans amb lrsquoanterior ordre

diskutil list

diskutil unmountDisk devdisk4

sudo dd bs=1m if=~2013-02-09-wheezy-raspbianimg of=devsdb

13

6 Primer inici i configuracioacute de la CodePiAra ja estem preparats per posar la targeta SD a la Raspberry Pi i connectar tots els cables per comenccedilar a programar A continuacioacute hem de se-guir uns passos que nomeacutes podrem fer durant la primera arrencada del sistema i que ens perme-tran iniciar lrsquoescriptori automagraveticament posar la CodePi en catalagrave i configurar la disposicioacute del te-clat entre drsquoaltres coses

Quan iniciem per primera vegada la Raspberry Pi amb el sistema operatiu Raspbian ens apareixeragrave la seguumlent pantalla on ens mourem utilitzant les fletxes i la tecla intro

La primera cosa que seleccionarem seragrave ldquoboot_behaviorrdquo que ens permetragrave inciar lrsquoescriptori quan el sistema iniciiuml

Ens mourem amb el teclat (dreta - esquerre) per fer que estigui seleccionat ldquoyesrdquo clicarem enter

14

Ara a continuacioacute ens mourem fins a ldquoexpand_rootfsrdquo que ens permetragrave expandir el tamany de la particioacute arrel de la Raspberry Pi al tamany magravex-im de la targeta SD eacutes a dir si tenim una targeta de 4 Gb si no fessim aquesta opcioacute estariacuteem util-itzant uacutenicament 2 Gb de capacitat

Acceptarem el seguumlent diagraveleg i passarem a con-figurar els idiomes

Buscarem ldquochange_localerdquo per canviar els idio-mes i la disposicioacute del teclat al catalagrave

De la seguumlent llista seleccionarem mitjanccedilant lrsquoes-pai del teclat totes les codificacions que comencin per ldquoCA_Per baixar a buscar-les utilitzarem les fletxes (amunt-avall) i per acabar clicarem la del costat dret i enter

15

Seleccionarem ldquochange_timezonerdquo per canviar la zona horagraveria de la Raspberry Pi i els temes rela-cionats amb aquesta

A continuacioacute seleccionarem el nostre continent

I per uacuteltim buscarem una ciutat que estigui a la mateixa zona horagraveria que nosaltres i la seleccio-nariacuteem tambeacute amb enter

64 Descarregar i executar ScriptPer descarregar lrsquoscript hem donar permisos i ex-ecutar-lo aixiacute que escriurem les seguumlents ordres en el terminal que podeu trobar a lrsquoescriptori

cd tmpmkdir CodePicd CodePiwget httpwwwtomorrowdevcomcodepiwiringPi-installshchmod +x wiringPi-installshwiringPi-installsh

Ja hem acabat de descarregar el programari que ens permetragrave programar amb la CodePi

16

7 PragravectiquesRecomanacioacute mirar aquests tutorials introduc-toris al llenguatge C httpthenewbostonorglistphpcat=14

Aquiacute teniu un quadre que us serviragrave lrsquoequivalegravencia entre els pins del GPIO i els que haurem de posar en el codi

Ja queda menys perquegrave puguis comenccedilar a pro-gramar perograve abans de fer-ho hauragraves de saber com compilar un programa Probablement ara et preguntaragraves quegrave eacutes compilar doncs compilar eacutes el proceacutes que fa un programa per traduir el codi que nosaltres hem escrit a codi binari amb la fi-nalitat de que el nostre ordinador pugui entendre cada ordre

Per compilar un codi escrit en C farem servir el compilador cc Abans drsquoutilitzar aquest programa haurem drsquoindicar a on hem guardat la nostra pragravec-tica amb lrsquoordre cdcc

-o practica

-Wall

-Iusrlocalinclude

-Lusrlocallib

practicac

-lwiringPi

Primer de tot posarem lrsquoordre al terminal

Utilitzarem el modificador -o per establir quin seragrave el nom del programa de sortida per exemple ldquopragravecticardquo

Amb aquest modificador indicarem que volem que ens doni tota la informacioacute dels errors de sintaxis del fitxer

Amb aquest indicarem on es troben els fitxers de la llibreria a incloure dintre del nostre fitxer

Utilitzant aquest altre modificador establim el di-rectori on ha de buscar els fitxers de la llibreria

Ara indicarem el nom del fitxer on es troba el nos-tre codi sempre acabant amb la terminacioacute c per exemple ldquopragravecticacrdquo

Amb aquest modificador posem la llibreria wiring-Pi a la llista de llibreries que han de ser afegides

17

Al final introduirem tot seguit al terminal una ordre similar a la seguumlent

cc -o practica -Wall -Iusrlocalinclude -Lusrlocallib practicac -lwiringPi

A part de saber compilar abans de comenccedilar a programar i a fer els nostres circuits haurem de saber quins soacuten els pins on haurem de connectar als cables a la Raspberry Pi aquest pins els iden-tificarem utilitzant nuacutemeros

La seguumlent taula ens permet saber lrsquoequivalegravencia entre els nuacutemeros de la GPIO els nuacutemeros de wiringPi la llibreria que interpretaragrave el nostre codi i la posicioacute dels pins

18

Des que la variable i eacutes igual a 1 fins i mentre que aquesta sigui igual o meacutes petita que10 executa el codi

Mentre que la variable D sigui igual a 5 el codi entre claus es llegiragrave infinites vegades

Si la variable X no eacutes meacutes petita que 7 fes una altra cosa

Si la variable X eacutes meacutes petita que 7 fes alguna cosa

70 Iniciacioacute al llenguatge CAbans de comenccedilar a programar cal tenir en compte els conceptes de condicional i de cicle

Els condicionals ldquoif - elserdquo nomeacutes executen el codi a continuacioacute si la condicioacute que li fiquem entre paregraventesis eacutes certa Ho podriacuteem comparar amb el que seria una oracioacute condicional No eacutes obligatori perograve podem afegir la partiacutecula ldquoelserdquo que eacutes lrsquoequivalent a la paraula ldquosi nordquo En el cas a continuacioacute com que el condicional no es compleix srsquoexecutaria lrsquoelse

if (X lt 7) Fes alguna cosa else Fes una altra cosa

Els bucles ldquoforrdquo soacuten rutines que serveixen per ex-ecutar un codi un determinat nuacutemero de vegades Teacute tres parts separades per punt i coma entrada condicioacute i increment A la entrada li donem un va-lor a una variable A la condicioacute determinem que la rutina srsquoexecuti nomeacutes si eacutes compleix la condicioacute utilitzant la variable drsquoentrada Finalment en el in-crement fixem un nou valor a la variable aquesta part srsquoexecutaragrave a cada cicle En llenguatge C si no afegim cap dels tres paragravemetres el bucle seragrave infinit

for (int i = 1 i lt= 10 i++) Fes alguna cosa

La sentegravencia ldquowhilerdquo defineix que un codi srsquoexe-cutaragrave infinitament mentre que la condicioacute que es defineix sigui certa

while (D==5) Fes alguna cosa

19

71 Bloc 1 (Bagravesic)711 Hola moacuten

En aquesta pragravectica escriurem un text a la consograve-la el conegut ldquoHello Worldrdquo

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void) printf(ldquohola moacutenrdquo)

if (wiringPiSetup() == -1) exit (1)

return 0

712 Encendre un LED

Hem drsquoimportar aquestes llibreries per tal que la RaspberryPi entengui el codi

Aquesta eacutes la funcioacute principal (main) i srsquoexecutaragrave tot el que fiquem aquiacute dins

Amb la funcioacute printf() el que aconseguim eacutes que es mostri al terminal el text que hi posem entre comentes

Aquestes liacutenies de codi soacuten simplement compro-vacions per assegurar-nos que tot funciona cor-rectament Soacuten negligibles perograve eacutes recomanable posar-les Les afegirem a totes les pragravectiques

Connectarem la pota llarga (agravenode) del LED al pin 5v de la GPIO i lrsquoaltre pota (cagravetode) a una resistegraven-cia de 180Ω Aquesta distincioacute entre potes es deu a que els LEDs estan polaritzats mireu el glossa-ri per saber-ne meacutes Tot seguit connecteu lrsquoaltra pota de la resistegravencia al pin GROUND

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void)

20

Comprovacionsif (wiringPiSetup() == -1) exit (1)

int pin = 1

printf(ldquoEncenem el pin 18rdquo)

pinMode(pin OUTPUT)

digitalWrite(pin 1)

return 0

713 Encendre i apagar un LED cada dos segons 10 vegades

El que podeu veure aquiacute eacutes el que srsquoanomena un comentari del codi Tot allograve que escrivim despreacutes de ldquordquo el compilador no ho llegiragrave i per tant nomeacutes serveix per donar indicacions al programador

Declarem la variable pin que com eacutes un nombre enter escriurem int

Fem un printf() tal i com hem apregraves a la pragravectica anterior Escrivim el 18 ja que la numeracioacute de la llibreria wiringPi canvia respecte a la sortida real (mirar el cuadre de la pagravegina 17)

Amb la funcioacute pinMode() declarem que el pin nuacutemero 1 en aquest cas sigui un pin de sortida de corrent (OUTPUT)

Una vegada li hem dit que eacutes de sortida li hem de dir si el volem encegraves ldquo1rdquo o apagat ldquo0rdquo amb la funcioacute digitalWrite()

Utilitzarem el muntatge la de pragravectica anterior amb la diferegravencia que en comptes de connectar lrsquoagravenode del LED al pin de 5v el connectarem al pin 18 de la Raspberry Pi Drsquoaquesta manera podrem gestionar el pas de lrsquoelectricitat a traveacutes drsquoun petit programa que crearem a continuacioacute

21

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void) int pin = 1

if (wiringPiSetup() == -1) exit (1)

pinMode(pin OUTPUT)

for (int i=1ilt=10i++)

printf(ldquoLED Onnrdquo) digitalWrite(pin 1)

delay(2000)

printf(ldquoLED Offnrdquo) digitalWrite(pin 0)

delay(2000)

return 0

Utilitzem un bicle ldquoforrdquo per executar el codi 10 vegades

Encenem el LED

Fem un delay() de 2000 milmiddotlisegons (2 segons) que ens serveix per aturar el programa i per tant mantenir el LED encegraves durant aquest temps

Apaguem el LED

El mantenim apagat 2 segons

Lrsquoexpressioacute n serveix per canviar de liacutenia

Proposta Ara que ja saps els conceptes bagravesics de la CodePi intenta fer lrsquoequivalent al codi Morse per demanar ajuda SOS middot middot middot ndash ndash ndash middot middot middot (on cada punt significa LED encegraves durant 14 de segon i cada ralla LED encegraves durant mig segon) Juga amb el valor de la funcioacute delay() per fer que el LED estigui encegraves durant meacutes o menys temps

22

72 Bloc 2 (Mitjagrave)721 Encendre un LED apretant un botoacute

Utilitzar el muntatge del LED que hem fet servir a la pragravectica anterior A meacutes a meacutes hem drsquoafegir 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 aniragrave a parar al pin 23 una resistegravencia de 10KΩ al GROUND per forccedilar lrsquoestat LOW quan el polsador no estagrave apretat

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt int main (void) int pin_LED = 1 int pin_boto = 4 printf (ldquoEncenent un LED apretant un botoacutenrdquo) 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

Declarem el LED com un pin de sortidaI el botoacute com un pin drsquoentrada

Si no fiquem variables al for aquest srsquoexecutaragrave sempre

Amb la funcioacute digitalRead() detectem si passa cor-rent pel pin 8 eacutes a dir si el botoacute ha estat apretat Si eacutes aixiacute fem que srsquoencengui el LED

Si no fem que srsquoapagui

23

722 Encendre un LED apretant tots els puladors

Utilitzar el muntatge de la pragravectica anterior i afegir dos polsadors meacutes amb el mateix proceacutes connec-tats als ports 24 i 25 de la Raspberry Pi

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int main (void) int pin_LED = 1

int pin_boto_A = 4 int pin_boto_B = 5 int 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 ampamp digitalRead(pin_boto_B) == HIGH ampamp digitalRead(pin_boto_C) == HIGH) digitalWrite(pin_LED 1)

Declarem el LED i els tres botons que tal i com posa a lrsquoesquema corresponen als pins 23 24 i 25 de la GPIO

Si els tres polsadors estan premuts passa corrent pels tres i per tant srsquoenceacuten el LED

En aquest cas utilitzem HIGH i LOW en lloc de 1 i 0 respectivament HIGH significa que hi ha elec-tricitat i LOW que no hi ha

24

No apretats while (digitalRead(pin_boto_A) == LOW ampamp digitalRead(pin_boto_B) == LOW ampamp digitalRead(pin_boto_C) == LOW) digitalWrite(pin_LED 0)

Si no apagarsquol

723 Semagravefor amb polsador

En aquesta pragravectica crearem un semagravefor de via-nants i de cotxes Com alguns semagravefors aquests teacute un botoacute amb el qual els vianants demanen que es posi verd aixiacute que el dels cotxes es posa ver-mell

Connectarem dos LEDs (vermell i verd) als pins 18 i 23 de la Raspberry Pi amb una resistegravencia de 180Ω Tambeacute connectarem tres LEDs meacutes (verd vermell i taronja) de la mateixa manera en els ports 17 21 i 22 de la GPIO

A diferegravencia de les altres pragravectiques amb polsa-dors en aquesta el connectarem al port SDA0 i al GROUND ja que nomeacutes ens interessa detectar quan es prem

25

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

define VERMELL 0define GROC1define VERD 2define VERMELL_HOME3define VERD_HOME4

define BOTO 8

void setup (void) int i

if (geteuid () = 0) exit (0)

if (wiringPiSetup () == -1) exit (1)

fflush(stdout) for (i = 0 i lt 5 ++i) pinMode (i OUTPUT) digitalWrite (i 0) digitalWrite(VERD1)digitalWrite(VERMELL_HOME1) pinMode (BOTO INPUT)

printf (ldquoSetup fetnrdquo)

int main (void) setup () for () esperaBoto () aturaTransit () camina () tempsEspera () iniciaTransit ()

Amb lrsquoexpressioacute define li diem a la magravequina que cada cop que escrivim VERMELL en realitat es-tem posant el nombre 0 i el mateix amb les altres paraules

Fem un setup amb tota la configuracioacute necessagraveria

fflush() eacutes una funcioacute complexa que serveix per quumlestions de tractament de memograveria del sistema per evitar errors

Executem totes les funcions una darrera lrsquoaltra de manera indefinida

26

Esperant a que lrsquousuari premi el botoacute per comenccedilar

Fem que el semagravefor dels cotxes canviiuml de verd a vermell passant pel groc

Fem que el semagravefor dels vianants es posi verd

Temps intermig des que srsquoacaba de caminar fins que el trafic comenccedila

void esperaBoto (void) printf (ldquoEsperant el botoacute ldquo)fflush(stdout) while (digitalRead (BOTO) == HIGH) delay (100) printf (ldquoEsoerenrdquo)

void aturaTransit()printf(ldquoAturanteltraficldquo)fflush(stdout)digitalWrite(VERD0) digitalWrite (GROC 1) delay (2000) digitalWrite (GROC 0) digitalWrite(VERMELL1) delay (2000) printf (ldquoAturatsnrdquo)

void camina ()printf(ldquoCaminaldquo)fflush(stdout)

digitalWrite(VERMELL_HOME0)digitalWrite(VERD_HOME1) delay (10000) digitalWrite(VERMELL0) digitalWrite (GROC 1)

printf (ldquoJa han caminatnrdquo)

void tempsEspera () int i

printf (ldquoTemps drsquoespera ldquo) fflush(stdout)

for (i = 0 i lt 8 ++i)

27

delay (500) digitalWrite(VERD_HOME0) digitalWrite (GROC 0) delay (500) digitalWrite(VERD_HOME1) digitalWrite (GROC 1)

void iniciaTransit ()printf(ldquoInicianttraficldquo)fflush(stdout)

digitalWrite(VERD_HOME0)digitalWrite(VERMELL_HOME1) delay (500) digitalWrite (GROC 0) digitalWrite(VERD1)

Deixem via lliure pels vehicles i posem el semagrave-for vermell pels vianants

Proposta Utilitzant el que has apregraves en aquest bloc crear un projecte amb uns quants LEDs en fila que srsquoactivin ascendentment quan apretes un botoacute

28

73 Bloc 3 (Alt)731 Sistema portes logravegiques I

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int AND (int a int b) return a ampamp b

int OR (int a int b) return a || b

int NEGADA (int a) return a

int f(int a int b) return OR(AND(NE-GADA(a)b)AND(aNEGADA(b))) f(a b) = arsquob + abrsquo

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5

int apretat_A = 0 int apretat_B = 0

pinMode(pin_LED_S OUTPUT) pinMode(pin_boto_A INPUT) pinMode(pin_boto_B INPUT)

Crearem una funcioacute per a cada porta logravegica de tal manera que sigui meacutes fagravecil poder-ho aplicar despreacutes

Aquesta seragrave la foacutermula que compliragrave la taula de la veritat en aquest cas eacutes f(a b) = arsquob +abrsquo

Creem dos booleans (variables que poden ser 0 o 1) que ens indicaran si el botoacute ha estat premut o no

Declarem els pins drsquoentrada i de sortida com a totes les pragravectiques anteriors

El seguumlent projecte fa la mateixa funcioacute que acon-seguiriacuteem amb xips de portes logravegiques perograve fent els cagravelculs a partir de la RaspberryPi En aquest cas compleix la taula de la veritat drsquoun OR ex-clusive eacutes a dir nomeacutes srsquoencendragrave el LED quan premem un dels dos botons mai srsquoencendragrave 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 srsquoutilitzin en el codi

29

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) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins estan premuts

Comprovem quins no estan premuts

I apliquem la foacutermula amb els valors drsquoentrada cor-responents Si la foacutermula eacutes igual a 1 srsquoencendragrave el LED si no no srsquoencendragrave

732 Sistema portes logravegiques II

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

Partim de la mateixa base que la pragravectica ante-rior perograve en aquesta incloem una tercera variable drsquoentrada Aixiacute que hem drsquoafegir un nou botoacute en el pin del GPIO que srsquoescau

30

Seguim el patroacute de les foacutermules emprades a la pragravectica anterior

En aquest cas tenim tres variables drsquoentrada perograve la mecagravenica eacutes la mateixa Es pot jugar amb la foacutermula i anar provant diferents combinacions

Necessitem tres variables ja que hi ha tres botons

Declaracions

Comprovem quins estan premuts

int AND (int a int b) return a ampamp b

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 + arsquob

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5 int pin_boto_C = 6

int apretat_A = 0 int apretat_B = 0 int apretat_C = 0

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

31

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

Mostra resultat if (f(apretat_A apretat_B apretat_C) == 1) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins no estan premuts

Com al circuit anterior apliquem la foacutermula i si aquesta doacutena 1 encenem el LED

Proposta Ara que ja has apregraves els conceptes meacutes fonamentals de la CodePi inventarsquot un circuit amb el nivell de dificultat que consideris No et quedis amb el que se trsquoha ensenyat aquiacute sinoacute que cerca meacutes megravetodes que puguis utilitzar La creativitat eacutes bagravesica per a tot bon enginyer i amb aquesta pragravectica volem que demostris de quegrave ets capaccedil

32

8 Vols saber-ne meacutes El moacuten de la programacioacute i lrsquoelectrogravenica eacutes infinit La comunitat geek (= interessada) en aquests te-mes eacutes una de les meacutes servicials i altruista de tota la xarxa aixiacute que es poden trobar una quantitat inacabable de tutorials i pagravegines web especialitza-des en el que vulguem saber

81 Programari lliureEl programari lliure eacutes la base de la informagravetica ac-tual i encara juga un gran paper en algunes agraverees com els servidors web o els mogravebils amb sistema operatiu Android Aquiacute teniu un conjunt de pagravegines on podeu aprofundir sobre aquest apassionant moacuten de la llibertat digital

httpcawikipediaorgwikiRichard_Matthew_Stallmanhttpwwwfsforghttpwwwgnuorghttpwwwlinuxorghttpwwwunixorghttpwwwubuntucom

82 Raspberry PiSi desitges saber meacutes sobre el projecte sense agravenim de lucre Raspberry Pi i seguir fent projectes amb ella visita les pagines que trobaragraves a con-tinuacioacute Aquestes et donaran idees de quegrave fer amb aquest petit perograve fascinant ordinador

httplearnadafruitcomcategorylearn-raspber-ry-pihttpwwwraspberrypiorgwwwraspberrypiorghttpdangerousprototypescom20130202rasp-berry-pi-supercomputerhttpreviewscnetcoukdesktops25-fun-things-to-do-with-a-raspberry-pi-50009851httplearnadafruitcompi-thermal-printer

33

83 Electrogravenica Si lrsquoelectrogravenica bagravesica que has apregraves durant els tutorials de la CodePi trsquoha fet veure que aquest eacutes el moacuten que a tu trsquoagrada no paris A continu-acioacute et deixem pagravegines web on trobaragraves les bases de lrsquoelectrogravenica meacutes complexa i tambeacute molts nous circuits per muntar i seguir descobrint aquest moacuten que avui en dia fa que tots els aparells endollats a al corrent puguin funcionar

httpwwwinstructablescomidBeginners-Elec-tronics-ProjectshttpwwwinstructablescomidElectronic-Proj-ects-For-Beginnershttpwwwcircuitstodaycomsimple-electron-ics-projects-and-circuitshttpswwwsparkfuncomtutorialshttplearnadafruitcom

84 ProgramacioacuteDiuen que per ser un bon programador srsquohan de tenir unes habilitats que no tothom teacute disciplina ordre logravegica creativitat capacitat per resoldre qualsevol problema i per sobre de tot persistegravencia i passioacute Si creus que tens aquestes qualitats do-na-li una oportunitat a la programacioacute A continu-acioacute et deixem un recull de les pagravegines web que creiem que meacutes et poden ajudar a introduir-te una mica meacutes en la programacioacute web i la drsquoapli-cacions per a mogravebils

httpwwwcodeorghttpscratchmiteduhttpwwwcodecademycom

34

9 GlossariC (llenguatge de programacioacute) Des de la seva creacioacute lrsquoany 1972 srsquoha consolidat com un dels llenguatges de programacioacute meacutes utilitzats per fer aplicacions de software Eacutes considerat un dels meacutes bagravesics i meacutes comuns per introduir-se a la pro-gramacioacute Les grans companyies han utilitzat el C com a base per crear altres llenguatges com lrsquoObjective-C (utilitzat per fer les aplicacions per dispositius drsquoApple) o el C (creat per Microsoft i utilitzat entre altres coses per fer programes in-formagravetics per Windows)

Condensador Component electrogravenic classificat dins del grup dels passius i que per tant no emet cap senyal El podriacuteem definir com un acumula-dor drsquoelectrons que els deixa anar quan arriba a la seva capacitat magravexima Hi ha condensadors de dos tipus els electroliacutetics i els normals En les pragravec-tiques utilitzarem electroliacutetics i com que aquests tenen polaritat eacutes important tenir en compte quina eacutes la pota positiva i quina eacutes la negativa a lrsquohora de connectar-lo

Diacuteode Component electrogravenic passiu Teacute polaritat i seria lrsquoequivalent a una vagravelvula antiretorn lrsquoelec-tricitat nomeacutes pot anar en un sentit

Electrogravenica Disciplina que estudia els com-ponents electrogravenics que funcionen amb un flux drsquoelectrons (corrent continua)

Funcioacute Fragment de codi que conte un seguit drsquoaccions i que hi pots accedir cridant la funcioacute en comptes de repetint el codi Podriacuteem comparar-ho amb una funcioacute matemagravetica en la que tenim vari-ables drsquoentrada que tractant-les a la funcioacute ob-tenim una informacioacute de sortida

GPIO Soacuten les sigles de ldquoGeneral Purpose InputOutputrdquo Si mirem la Raspberry Pi soacuten els pins de sortida on hi connectem els cables amb els que programem la placa electrogravenica Lrsquoavantatge drsquoaquest tipus de connector respecte altres eacutes que es pot gestionar mitjanccedilant programacioacute i aixograve eacutes precisament el que explicarem en aquest manual

35

HDMI Soacuten les sigles de ldquoHigh-Definition Multime-dia Interfacerdquo Serveix per enviar viacutedeo i agraveudio a una pantalla Nosaltres lrsquoutilitzarem per connectar la RaspberryPi a una pantalla

LED Acrogravenim de ldquoLight Emitting Dioderdquo Eacutes un tipus de diacuteode el qual teacute una pelmiddotliacutecula de fogravesfor entre els dos connectors que fa que quan passi el corrent generi llum Com qualsevol altre diacuteode eacutes important tenir en compte la polaritat

RAM Acrogravenim de ldquoRandom Access Memoryrdquo Eacutes la part de lrsquoordinador encarregada drsquoemmagatze-mar els arxius temporals

RCA El connector RCA consisteix en diferents cables amb la punta de diferent color que serveix-en per transmetre agraveudio i viacutedeo

ROM De lrsquoanglegraves ldquoRead Only Memoryrdquo eacutes la uni-tat de memograveria on es guarda el sistema operatiu

Resistegravencia Eacutes un component electrogravenic que teacute com a funcioacute reduir el flux drsquoelectrons afi de controlar la seva potegravencia Eacutes molt comuacute a lrsquoelectrogravenica ja que eacutes molt necessari per assegu-rar-nos del correcte funcionament drsquoelements com el LED que sense una resistegravencia que limiteacutes el corrent podrien cremar-se

Placa base Eacutes la part de lrsquoordinador que conteacute elements com la RAM la ROM o el microproces-sador La placa base de lrsquoordinador que constru-irem amb aquest manual seria la progravepia Raspber-ry Pi

Protoboard Tambeacute coneguda com a Bread-board srsquoutilitza per crear circuits electrogravenics sense necessitat de soldar Per saber com funcio-na i com estan relacionats els diferents contactes consulteu aquesta webhttprduinostarcomdocumentaciongeneralpro-toboard-que-es-y-como-funciona

36

Terminal Eacutes el programa emprat per enviar ordres directes a lrsquoordinador i rebre respostes drsquoaquest Nosaltres lrsquoutilitzarem per instalmiddotlar els programes necessaris per programar les plaques electrograveniques i altres arxius necessaris

Variable Valor que canvia segons les operacions que es facin amb aquest al programa informagravetic Com ja sabeu hi ha variables independents (pe el temps) i dependents (pe si estagrave o no encegraves un LED que dependragrave drsquoaltres variables)

37

  • httpwwwfsforg
Page 5: CodePi

5

3 Quegrave necessitarem per a muntar-laAquests soacuten els materials que necessitarem per muntar la CodePi Per una banda tenim les fus-tes i drsquoaltres eines que ens serviran per construir la caixa per transportar la CodePi

MaterialbullFusta de 320x320x6 (6 recomanat perograve pot ser meacutes gruixut)bullClaus bullFrontisses

EinesbullMartellbullLlima bullSerra per a fusta (manual o elegravectrica)bullCargol de banc

Per altra banda tambeacute necessitarem tots els components electrogravenics eines per portar a terme els tutorials i com no la Raspberry Pi Aixograve eacutes tot el que necesitarem

bullRaspberry Pi model BbullTargeta SDHC de com a miacutenim 4GB Classe 4 bullTeclatbullRatoliacute convencionalbullProtoboardbullCables electrogravenicsbullLEDsbullResistegravencies 180 i 10K ohmsbullPolsadors

3euro1euro1euro

33euro7euro5euro5euro4euro3euro1euro1euro1euro

Preu total 61euro

6

4 Apregraven a muntar la caixa de la CodePi

Abans de comenccedilar a tallar la fusta prepararem el seguumlent esquema en el nostre tauloacute de fusta A la part del centre deixarem un espai de 6 mm per poder clavar beacute una costat sobre un costat per acabar tenint una caixa de 160mm x 160mm

Amb un regle i un llapis marquem les liacutenies per on tallarem el tauloacute seguint lrsquoesquema anterior

A continuacioacute tallar el tauloacute amb una serra elegravec-trica En cas de no tenir-ne srsquohauragrave de posar la fullola en un cargol de banc i tallar-la amb una ser-ra manual

No passa res si la fusta no queda del tot ben tal-lada ja que despreacutes podrem retocar les imperfec-cions llimant-les i meacutes endavant posant massilla

7

Atencioacute Eacutes altament recomanable utilitzar guants i ulleres protectores durant tot el proceacutes de manip-ulacioacute de la fusta

Els guants ens protegiran de possibles talls ras-cades o drsquoaltres 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 Eacutes recomanable posar dues fustes entre la boca del cargol i el tauloacute per impedir que aquesta es pugui malmetre a causa de la pressioacute

Llimar les fustes verticalment ja que drsquoaquesta manera es treballa sobre meacutes superfiacutecie Reco-manem utilitzar una llima amb fulla molt rugosa per poder realitzar el treball meacutes ragravepidament Llimar tambeacute les dues peces que faran de tapa i contra tapa

Per millorar les llimadures utilitzar una llima amb la fulla meacutes fina o un paper de vidre

8

Un cop les fustes estiguin ben llimades utilitzar els claus per collar les parets Cal prestar atencioacute en la posicioacute dels claus ja que la fusta eacutes molt prima i es poden torccedilar Aquest hauria de ser el resultat final

Seguint el mateix proceacutes clavar la fullola que faragrave de tapa inferior Cal vigilar a on es posen els claus ja que pot ser que es toquin amb els que hem po-sat anteriorment

Agafar les frontisses i clavar-les amb dos claus pe-tits a la fullola que faragrave de tapa superior Despreacutes clavar els dos forats restants a una de les parets aquesta faragrave de part posterior de la CodePi

Recomanacioacute Si volem que la fusta ens duri du-rant meacutes temps eacutes recomanable envernissar la caixa amb un verniacutes per a fustes

9

Per descarregar Raspbian el sistema operatiu que utilitza la CodePi haurem drsquoobrir una nova fi-nestra del navegador i anar a la web de Raspberry Pi httpwwwraspberrypiorg

Eacutes recomanable fer aquest proceacutes al mateix ordi-nador en el que es procediragrave a instalmiddotlar Raspbian a la targeta SD

Recorda que aquest ordinador ha de tenir lector de targetes o un adaptador USB connectatDespreacutes haurem drsquoanar a lrsquoapartat de descagraverreg-ues on trobarem tots els enllaccedilos que necessitem per descarregar el sistema operatiu de la Rasp-berry Pi

5 Afegim un sistema ope- ratiu a la CodePi

51 Descarregar Raspbian

Lrsquouacuteltim pas per descarregar Raspbian eacutes clicar sobre lrsquoenllaccedil on posa Direct Download Es reco-mana realitzar aquest proceacutes en un lloc amb una connexioacute estable i ragravepida ja que srsquoha de descar-regar molta informacioacute

Despreacutes de clicar aquest enllaccedil sersquons obriragrave una nova finestra i automagraveticament Raspbian comenccedilaragrave a descarregar-se La descagraverrega pot trigar entre 5 i 15 minuts depenent de la teva con-nexioacute a internet Ja podem tancar aquesta finestra i continuar cap al pas seguumlent

10

52 Instalmiddotlar RaspbianUna vegada que ja tenim descarregada lrsquouacuteltima versioacute de Raspbian segons el sistema opera-tiu des del que vulguem instalmiddotlar-lo haurem de seguir uns passos diferents per completar la in-stalmiddotlacioacute

Windows

Per instalmiddotlar Raspbian amb Windows haurem de descarregar i instalmiddotlar Win32DiskImager Abans de continuar amb la instalmiddotlacioacute haurem de de-scomprimir el fitxer que ens hem descarregat Per descomprimir-lo utilitzarem un compressor drsquoarxius com (7zip) Clicant amb el botoacute dret so-bre aquest arxiu i clicarem on posa descomprimir aquiacute o buscarem el nom del nostre descompres-sor i despreacutes buscarem aquesta opcioacute

Ara introduirem la targeta de memograveria que vul-guem utilitzar a lrsquoentrada per targetes del nostre ordinador o a lrsquoadaptador corresponent

A continuacioacute iniciarem el programa i clicarem sobre el logo de la carpeta i escollirem el lloc on hem descomprimit el contingut del zip buscarem lrsquoar-xiu amb extensioacute img i acceptarem el diagraveleg Meacutes tard escollirem en quin dispositiu volem in-stalmiddotlar el sistema operatiu aquest eacutes un punt on hem drsquoestar segurs drsquoon estem instalmiddotlant aquests arxius ja que si lrsquoestigueacutessim instalmiddotlant en una destinacioacute diferent podriacuteem perdre totes les dades de lrsquoordinador Per saber a quin dispositiu hem drsquoinstalmiddotlar Raspbian obrirem ldquoEl Meu Ordinadorrdquo i buscarem la targeta de memograveria ens fixarem en quina lletra hi ha al final del nom aquesta seragrave la mateixa que haurem de posar al programaQuan ja haguem inserit aquests dos paragravemetres al programa clicarem sobre el botoacute de Write i es comenccedilara a instalmiddotlar el sistema operatiu

11

Linux

Per instalmiddotlar Raspbian des drsquoun sistema operatiu Linux utilitzarem lrsquoordre 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 homeusu-ari)

Un cop tenim descomprimit el contingut del zip obrirem una sessioacute al terminal i escriurem

cd ~

df -h

umount devsdd1

sudo dd bs=4M if=~2013-02-09-wheezy-raspbianimg of=devsdd

Anirem a la carpeta on hem descomprimit el zip (la de lrsquousuari eacutes per defecte o ~)

Buscarem la targeta sd i el seu nom a la seguumlent llista ens haurem drsquoapuntar el que posi a la prime-ra columna com devsdd (sense el numero) Assegureu-vos que aquest eacutes el dispositiu on vo-leu instalmiddotlar el Raspbian

Abans drsquoinstalmiddotlar Raspbian haurem de des-muntar les particions corresponents a la targeta SD utilitzant lrsquoordre umount en el cas de tenir meacutes drsquouna particioacute haurem drsquoexecutar aquesta ordre meacutes drsquouna vegada

Ara executarem lrsquoordre dd amb permisos drsquoadmi- nistrador al modificador ldquoif=rdquo posarem la carpeta on hem descomprimit el zip (la de lrsquousuari eacutes per defecte o ~) amb el nom del arxiu img descom-primit i al modificador ldquoof=rdquo escriurem el que hem copiat abans amb lrsquoanterior ordre

12

Mac OS X

Per instalmiddotlar Raspbian a Mac OS X tambeacute utilitza-rem lrsquoordre dd pero el funcionament per buscar en quin disc volem instalmiddotlar raspbian eacutes diferent Recomanem extreure el contingut del zip a la car-peta Usersusuari

Comenccedilarem buscant la targeta on volem instalmiddotlar raspbian executant la seguumlent ordre i copiarem el disk4 (sense agafar la particioacute)

Desmuntarem el disk en quumlestioacute

Ara executarem lrsquoordre dd amb permisos drsquoadmi- nistrador al modificador ldquoif=rdquo posarem la carpeta on hem descomprimit el zip (la de lrsquousuari eacutes per defecte o ~) amb el nom de lrsquoarxiu img descom-primit i al modificador ldquoof=rdquo escriurem el que hem copiat abans amb lrsquoanterior ordre

diskutil list

diskutil unmountDisk devdisk4

sudo dd bs=1m if=~2013-02-09-wheezy-raspbianimg of=devsdb

13

6 Primer inici i configuracioacute de la CodePiAra ja estem preparats per posar la targeta SD a la Raspberry Pi i connectar tots els cables per comenccedilar a programar A continuacioacute hem de se-guir uns passos que nomeacutes podrem fer durant la primera arrencada del sistema i que ens perme-tran iniciar lrsquoescriptori automagraveticament posar la CodePi en catalagrave i configurar la disposicioacute del te-clat entre drsquoaltres coses

Quan iniciem per primera vegada la Raspberry Pi amb el sistema operatiu Raspbian ens apareixeragrave la seguumlent pantalla on ens mourem utilitzant les fletxes i la tecla intro

La primera cosa que seleccionarem seragrave ldquoboot_behaviorrdquo que ens permetragrave inciar lrsquoescriptori quan el sistema iniciiuml

Ens mourem amb el teclat (dreta - esquerre) per fer que estigui seleccionat ldquoyesrdquo clicarem enter

14

Ara a continuacioacute ens mourem fins a ldquoexpand_rootfsrdquo que ens permetragrave expandir el tamany de la particioacute arrel de la Raspberry Pi al tamany magravex-im de la targeta SD eacutes a dir si tenim una targeta de 4 Gb si no fessim aquesta opcioacute estariacuteem util-itzant uacutenicament 2 Gb de capacitat

Acceptarem el seguumlent diagraveleg i passarem a con-figurar els idiomes

Buscarem ldquochange_localerdquo per canviar els idio-mes i la disposicioacute del teclat al catalagrave

De la seguumlent llista seleccionarem mitjanccedilant lrsquoes-pai del teclat totes les codificacions que comencin per ldquoCA_Per baixar a buscar-les utilitzarem les fletxes (amunt-avall) i per acabar clicarem la del costat dret i enter

15

Seleccionarem ldquochange_timezonerdquo per canviar la zona horagraveria de la Raspberry Pi i els temes rela-cionats amb aquesta

A continuacioacute seleccionarem el nostre continent

I per uacuteltim buscarem una ciutat que estigui a la mateixa zona horagraveria que nosaltres i la seleccio-nariacuteem tambeacute amb enter

64 Descarregar i executar ScriptPer descarregar lrsquoscript hem donar permisos i ex-ecutar-lo aixiacute que escriurem les seguumlents ordres en el terminal que podeu trobar a lrsquoescriptori

cd tmpmkdir CodePicd CodePiwget httpwwwtomorrowdevcomcodepiwiringPi-installshchmod +x wiringPi-installshwiringPi-installsh

Ja hem acabat de descarregar el programari que ens permetragrave programar amb la CodePi

16

7 PragravectiquesRecomanacioacute mirar aquests tutorials introduc-toris al llenguatge C httpthenewbostonorglistphpcat=14

Aquiacute teniu un quadre que us serviragrave lrsquoequivalegravencia entre els pins del GPIO i els que haurem de posar en el codi

Ja queda menys perquegrave puguis comenccedilar a pro-gramar perograve abans de fer-ho hauragraves de saber com compilar un programa Probablement ara et preguntaragraves quegrave eacutes compilar doncs compilar eacutes el proceacutes que fa un programa per traduir el codi que nosaltres hem escrit a codi binari amb la fi-nalitat de que el nostre ordinador pugui entendre cada ordre

Per compilar un codi escrit en C farem servir el compilador cc Abans drsquoutilitzar aquest programa haurem drsquoindicar a on hem guardat la nostra pragravec-tica amb lrsquoordre cdcc

-o practica

-Wall

-Iusrlocalinclude

-Lusrlocallib

practicac

-lwiringPi

Primer de tot posarem lrsquoordre al terminal

Utilitzarem el modificador -o per establir quin seragrave el nom del programa de sortida per exemple ldquopragravecticardquo

Amb aquest modificador indicarem que volem que ens doni tota la informacioacute dels errors de sintaxis del fitxer

Amb aquest indicarem on es troben els fitxers de la llibreria a incloure dintre del nostre fitxer

Utilitzant aquest altre modificador establim el di-rectori on ha de buscar els fitxers de la llibreria

Ara indicarem el nom del fitxer on es troba el nos-tre codi sempre acabant amb la terminacioacute c per exemple ldquopragravecticacrdquo

Amb aquest modificador posem la llibreria wiring-Pi a la llista de llibreries que han de ser afegides

17

Al final introduirem tot seguit al terminal una ordre similar a la seguumlent

cc -o practica -Wall -Iusrlocalinclude -Lusrlocallib practicac -lwiringPi

A part de saber compilar abans de comenccedilar a programar i a fer els nostres circuits haurem de saber quins soacuten els pins on haurem de connectar als cables a la Raspberry Pi aquest pins els iden-tificarem utilitzant nuacutemeros

La seguumlent taula ens permet saber lrsquoequivalegravencia entre els nuacutemeros de la GPIO els nuacutemeros de wiringPi la llibreria que interpretaragrave el nostre codi i la posicioacute dels pins

18

Des que la variable i eacutes igual a 1 fins i mentre que aquesta sigui igual o meacutes petita que10 executa el codi

Mentre que la variable D sigui igual a 5 el codi entre claus es llegiragrave infinites vegades

Si la variable X no eacutes meacutes petita que 7 fes una altra cosa

Si la variable X eacutes meacutes petita que 7 fes alguna cosa

70 Iniciacioacute al llenguatge CAbans de comenccedilar a programar cal tenir en compte els conceptes de condicional i de cicle

Els condicionals ldquoif - elserdquo nomeacutes executen el codi a continuacioacute si la condicioacute que li fiquem entre paregraventesis eacutes certa Ho podriacuteem comparar amb el que seria una oracioacute condicional No eacutes obligatori perograve podem afegir la partiacutecula ldquoelserdquo que eacutes lrsquoequivalent a la paraula ldquosi nordquo En el cas a continuacioacute com que el condicional no es compleix srsquoexecutaria lrsquoelse

if (X lt 7) Fes alguna cosa else Fes una altra cosa

Els bucles ldquoforrdquo soacuten rutines que serveixen per ex-ecutar un codi un determinat nuacutemero de vegades Teacute tres parts separades per punt i coma entrada condicioacute i increment A la entrada li donem un va-lor a una variable A la condicioacute determinem que la rutina srsquoexecuti nomeacutes si eacutes compleix la condicioacute utilitzant la variable drsquoentrada Finalment en el in-crement fixem un nou valor a la variable aquesta part srsquoexecutaragrave a cada cicle En llenguatge C si no afegim cap dels tres paragravemetres el bucle seragrave infinit

for (int i = 1 i lt= 10 i++) Fes alguna cosa

La sentegravencia ldquowhilerdquo defineix que un codi srsquoexe-cutaragrave infinitament mentre que la condicioacute que es defineix sigui certa

while (D==5) Fes alguna cosa

19

71 Bloc 1 (Bagravesic)711 Hola moacuten

En aquesta pragravectica escriurem un text a la consograve-la el conegut ldquoHello Worldrdquo

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void) printf(ldquohola moacutenrdquo)

if (wiringPiSetup() == -1) exit (1)

return 0

712 Encendre un LED

Hem drsquoimportar aquestes llibreries per tal que la RaspberryPi entengui el codi

Aquesta eacutes la funcioacute principal (main) i srsquoexecutaragrave tot el que fiquem aquiacute dins

Amb la funcioacute printf() el que aconseguim eacutes que es mostri al terminal el text que hi posem entre comentes

Aquestes liacutenies de codi soacuten simplement compro-vacions per assegurar-nos que tot funciona cor-rectament Soacuten negligibles perograve eacutes recomanable posar-les Les afegirem a totes les pragravectiques

Connectarem la pota llarga (agravenode) del LED al pin 5v de la GPIO i lrsquoaltre pota (cagravetode) a una resistegraven-cia de 180Ω Aquesta distincioacute entre potes es deu a que els LEDs estan polaritzats mireu el glossa-ri per saber-ne meacutes Tot seguit connecteu lrsquoaltra pota de la resistegravencia al pin GROUND

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void)

20

Comprovacionsif (wiringPiSetup() == -1) exit (1)

int pin = 1

printf(ldquoEncenem el pin 18rdquo)

pinMode(pin OUTPUT)

digitalWrite(pin 1)

return 0

713 Encendre i apagar un LED cada dos segons 10 vegades

El que podeu veure aquiacute eacutes el que srsquoanomena un comentari del codi Tot allograve que escrivim despreacutes de ldquordquo el compilador no ho llegiragrave i per tant nomeacutes serveix per donar indicacions al programador

Declarem la variable pin que com eacutes un nombre enter escriurem int

Fem un printf() tal i com hem apregraves a la pragravectica anterior Escrivim el 18 ja que la numeracioacute de la llibreria wiringPi canvia respecte a la sortida real (mirar el cuadre de la pagravegina 17)

Amb la funcioacute pinMode() declarem que el pin nuacutemero 1 en aquest cas sigui un pin de sortida de corrent (OUTPUT)

Una vegada li hem dit que eacutes de sortida li hem de dir si el volem encegraves ldquo1rdquo o apagat ldquo0rdquo amb la funcioacute digitalWrite()

Utilitzarem el muntatge la de pragravectica anterior amb la diferegravencia que en comptes de connectar lrsquoagravenode del LED al pin de 5v el connectarem al pin 18 de la Raspberry Pi Drsquoaquesta manera podrem gestionar el pas de lrsquoelectricitat a traveacutes drsquoun petit programa que crearem a continuacioacute

21

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void) int pin = 1

if (wiringPiSetup() == -1) exit (1)

pinMode(pin OUTPUT)

for (int i=1ilt=10i++)

printf(ldquoLED Onnrdquo) digitalWrite(pin 1)

delay(2000)

printf(ldquoLED Offnrdquo) digitalWrite(pin 0)

delay(2000)

return 0

Utilitzem un bicle ldquoforrdquo per executar el codi 10 vegades

Encenem el LED

Fem un delay() de 2000 milmiddotlisegons (2 segons) que ens serveix per aturar el programa i per tant mantenir el LED encegraves durant aquest temps

Apaguem el LED

El mantenim apagat 2 segons

Lrsquoexpressioacute n serveix per canviar de liacutenia

Proposta Ara que ja saps els conceptes bagravesics de la CodePi intenta fer lrsquoequivalent al codi Morse per demanar ajuda SOS middot middot middot ndash ndash ndash middot middot middot (on cada punt significa LED encegraves durant 14 de segon i cada ralla LED encegraves durant mig segon) Juga amb el valor de la funcioacute delay() per fer que el LED estigui encegraves durant meacutes o menys temps

22

72 Bloc 2 (Mitjagrave)721 Encendre un LED apretant un botoacute

Utilitzar el muntatge del LED que hem fet servir a la pragravectica anterior A meacutes a meacutes hem drsquoafegir 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 aniragrave a parar al pin 23 una resistegravencia de 10KΩ al GROUND per forccedilar lrsquoestat LOW quan el polsador no estagrave apretat

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt int main (void) int pin_LED = 1 int pin_boto = 4 printf (ldquoEncenent un LED apretant un botoacutenrdquo) 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

Declarem el LED com un pin de sortidaI el botoacute com un pin drsquoentrada

Si no fiquem variables al for aquest srsquoexecutaragrave sempre

Amb la funcioacute digitalRead() detectem si passa cor-rent pel pin 8 eacutes a dir si el botoacute ha estat apretat Si eacutes aixiacute fem que srsquoencengui el LED

Si no fem que srsquoapagui

23

722 Encendre un LED apretant tots els puladors

Utilitzar el muntatge de la pragravectica anterior i afegir dos polsadors meacutes amb el mateix proceacutes connec-tats als ports 24 i 25 de la Raspberry Pi

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int main (void) int pin_LED = 1

int pin_boto_A = 4 int pin_boto_B = 5 int 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 ampamp digitalRead(pin_boto_B) == HIGH ampamp digitalRead(pin_boto_C) == HIGH) digitalWrite(pin_LED 1)

Declarem el LED i els tres botons que tal i com posa a lrsquoesquema corresponen als pins 23 24 i 25 de la GPIO

Si els tres polsadors estan premuts passa corrent pels tres i per tant srsquoenceacuten el LED

En aquest cas utilitzem HIGH i LOW en lloc de 1 i 0 respectivament HIGH significa que hi ha elec-tricitat i LOW que no hi ha

24

No apretats while (digitalRead(pin_boto_A) == LOW ampamp digitalRead(pin_boto_B) == LOW ampamp digitalRead(pin_boto_C) == LOW) digitalWrite(pin_LED 0)

Si no apagarsquol

723 Semagravefor amb polsador

En aquesta pragravectica crearem un semagravefor de via-nants i de cotxes Com alguns semagravefors aquests teacute un botoacute amb el qual els vianants demanen que es posi verd aixiacute que el dels cotxes es posa ver-mell

Connectarem dos LEDs (vermell i verd) als pins 18 i 23 de la Raspberry Pi amb una resistegravencia de 180Ω Tambeacute connectarem tres LEDs meacutes (verd vermell i taronja) de la mateixa manera en els ports 17 21 i 22 de la GPIO

A diferegravencia de les altres pragravectiques amb polsa-dors en aquesta el connectarem al port SDA0 i al GROUND ja que nomeacutes ens interessa detectar quan es prem

25

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

define VERMELL 0define GROC1define VERD 2define VERMELL_HOME3define VERD_HOME4

define BOTO 8

void setup (void) int i

if (geteuid () = 0) exit (0)

if (wiringPiSetup () == -1) exit (1)

fflush(stdout) for (i = 0 i lt 5 ++i) pinMode (i OUTPUT) digitalWrite (i 0) digitalWrite(VERD1)digitalWrite(VERMELL_HOME1) pinMode (BOTO INPUT)

printf (ldquoSetup fetnrdquo)

int main (void) setup () for () esperaBoto () aturaTransit () camina () tempsEspera () iniciaTransit ()

Amb lrsquoexpressioacute define li diem a la magravequina que cada cop que escrivim VERMELL en realitat es-tem posant el nombre 0 i el mateix amb les altres paraules

Fem un setup amb tota la configuracioacute necessagraveria

fflush() eacutes una funcioacute complexa que serveix per quumlestions de tractament de memograveria del sistema per evitar errors

Executem totes les funcions una darrera lrsquoaltra de manera indefinida

26

Esperant a que lrsquousuari premi el botoacute per comenccedilar

Fem que el semagravefor dels cotxes canviiuml de verd a vermell passant pel groc

Fem que el semagravefor dels vianants es posi verd

Temps intermig des que srsquoacaba de caminar fins que el trafic comenccedila

void esperaBoto (void) printf (ldquoEsperant el botoacute ldquo)fflush(stdout) while (digitalRead (BOTO) == HIGH) delay (100) printf (ldquoEsoerenrdquo)

void aturaTransit()printf(ldquoAturanteltraficldquo)fflush(stdout)digitalWrite(VERD0) digitalWrite (GROC 1) delay (2000) digitalWrite (GROC 0) digitalWrite(VERMELL1) delay (2000) printf (ldquoAturatsnrdquo)

void camina ()printf(ldquoCaminaldquo)fflush(stdout)

digitalWrite(VERMELL_HOME0)digitalWrite(VERD_HOME1) delay (10000) digitalWrite(VERMELL0) digitalWrite (GROC 1)

printf (ldquoJa han caminatnrdquo)

void tempsEspera () int i

printf (ldquoTemps drsquoespera ldquo) fflush(stdout)

for (i = 0 i lt 8 ++i)

27

delay (500) digitalWrite(VERD_HOME0) digitalWrite (GROC 0) delay (500) digitalWrite(VERD_HOME1) digitalWrite (GROC 1)

void iniciaTransit ()printf(ldquoInicianttraficldquo)fflush(stdout)

digitalWrite(VERD_HOME0)digitalWrite(VERMELL_HOME1) delay (500) digitalWrite (GROC 0) digitalWrite(VERD1)

Deixem via lliure pels vehicles i posem el semagrave-for vermell pels vianants

Proposta Utilitzant el que has apregraves en aquest bloc crear un projecte amb uns quants LEDs en fila que srsquoactivin ascendentment quan apretes un botoacute

28

73 Bloc 3 (Alt)731 Sistema portes logravegiques I

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int AND (int a int b) return a ampamp b

int OR (int a int b) return a || b

int NEGADA (int a) return a

int f(int a int b) return OR(AND(NE-GADA(a)b)AND(aNEGADA(b))) f(a b) = arsquob + abrsquo

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5

int apretat_A = 0 int apretat_B = 0

pinMode(pin_LED_S OUTPUT) pinMode(pin_boto_A INPUT) pinMode(pin_boto_B INPUT)

Crearem una funcioacute per a cada porta logravegica de tal manera que sigui meacutes fagravecil poder-ho aplicar despreacutes

Aquesta seragrave la foacutermula que compliragrave la taula de la veritat en aquest cas eacutes f(a b) = arsquob +abrsquo

Creem dos booleans (variables que poden ser 0 o 1) que ens indicaran si el botoacute ha estat premut o no

Declarem els pins drsquoentrada i de sortida com a totes les pragravectiques anteriors

El seguumlent projecte fa la mateixa funcioacute que acon-seguiriacuteem amb xips de portes logravegiques perograve fent els cagravelculs a partir de la RaspberryPi En aquest cas compleix la taula de la veritat drsquoun OR ex-clusive eacutes a dir nomeacutes srsquoencendragrave el LED quan premem un dels dos botons mai srsquoencendragrave 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 srsquoutilitzin en el codi

29

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) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins estan premuts

Comprovem quins no estan premuts

I apliquem la foacutermula amb els valors drsquoentrada cor-responents Si la foacutermula eacutes igual a 1 srsquoencendragrave el LED si no no srsquoencendragrave

732 Sistema portes logravegiques II

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

Partim de la mateixa base que la pragravectica ante-rior perograve en aquesta incloem una tercera variable drsquoentrada Aixiacute que hem drsquoafegir un nou botoacute en el pin del GPIO que srsquoescau

30

Seguim el patroacute de les foacutermules emprades a la pragravectica anterior

En aquest cas tenim tres variables drsquoentrada perograve la mecagravenica eacutes la mateixa Es pot jugar amb la foacutermula i anar provant diferents combinacions

Necessitem tres variables ja que hi ha tres botons

Declaracions

Comprovem quins estan premuts

int AND (int a int b) return a ampamp b

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 + arsquob

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5 int pin_boto_C = 6

int apretat_A = 0 int apretat_B = 0 int apretat_C = 0

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

31

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

Mostra resultat if (f(apretat_A apretat_B apretat_C) == 1) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins no estan premuts

Com al circuit anterior apliquem la foacutermula i si aquesta doacutena 1 encenem el LED

Proposta Ara que ja has apregraves els conceptes meacutes fonamentals de la CodePi inventarsquot un circuit amb el nivell de dificultat que consideris No et quedis amb el que se trsquoha ensenyat aquiacute sinoacute que cerca meacutes megravetodes que puguis utilitzar La creativitat eacutes bagravesica per a tot bon enginyer i amb aquesta pragravectica volem que demostris de quegrave ets capaccedil

32

8 Vols saber-ne meacutes El moacuten de la programacioacute i lrsquoelectrogravenica eacutes infinit La comunitat geek (= interessada) en aquests te-mes eacutes una de les meacutes servicials i altruista de tota la xarxa aixiacute que es poden trobar una quantitat inacabable de tutorials i pagravegines web especialitza-des en el que vulguem saber

81 Programari lliureEl programari lliure eacutes la base de la informagravetica ac-tual i encara juga un gran paper en algunes agraverees com els servidors web o els mogravebils amb sistema operatiu Android Aquiacute teniu un conjunt de pagravegines on podeu aprofundir sobre aquest apassionant moacuten de la llibertat digital

httpcawikipediaorgwikiRichard_Matthew_Stallmanhttpwwwfsforghttpwwwgnuorghttpwwwlinuxorghttpwwwunixorghttpwwwubuntucom

82 Raspberry PiSi desitges saber meacutes sobre el projecte sense agravenim de lucre Raspberry Pi i seguir fent projectes amb ella visita les pagines que trobaragraves a con-tinuacioacute Aquestes et donaran idees de quegrave fer amb aquest petit perograve fascinant ordinador

httplearnadafruitcomcategorylearn-raspber-ry-pihttpwwwraspberrypiorgwwwraspberrypiorghttpdangerousprototypescom20130202rasp-berry-pi-supercomputerhttpreviewscnetcoukdesktops25-fun-things-to-do-with-a-raspberry-pi-50009851httplearnadafruitcompi-thermal-printer

33

83 Electrogravenica Si lrsquoelectrogravenica bagravesica que has apregraves durant els tutorials de la CodePi trsquoha fet veure que aquest eacutes el moacuten que a tu trsquoagrada no paris A continu-acioacute et deixem pagravegines web on trobaragraves les bases de lrsquoelectrogravenica meacutes complexa i tambeacute molts nous circuits per muntar i seguir descobrint aquest moacuten que avui en dia fa que tots els aparells endollats a al corrent puguin funcionar

httpwwwinstructablescomidBeginners-Elec-tronics-ProjectshttpwwwinstructablescomidElectronic-Proj-ects-For-Beginnershttpwwwcircuitstodaycomsimple-electron-ics-projects-and-circuitshttpswwwsparkfuncomtutorialshttplearnadafruitcom

84 ProgramacioacuteDiuen que per ser un bon programador srsquohan de tenir unes habilitats que no tothom teacute disciplina ordre logravegica creativitat capacitat per resoldre qualsevol problema i per sobre de tot persistegravencia i passioacute Si creus que tens aquestes qualitats do-na-li una oportunitat a la programacioacute A continu-acioacute et deixem un recull de les pagravegines web que creiem que meacutes et poden ajudar a introduir-te una mica meacutes en la programacioacute web i la drsquoapli-cacions per a mogravebils

httpwwwcodeorghttpscratchmiteduhttpwwwcodecademycom

34

9 GlossariC (llenguatge de programacioacute) Des de la seva creacioacute lrsquoany 1972 srsquoha consolidat com un dels llenguatges de programacioacute meacutes utilitzats per fer aplicacions de software Eacutes considerat un dels meacutes bagravesics i meacutes comuns per introduir-se a la pro-gramacioacute Les grans companyies han utilitzat el C com a base per crear altres llenguatges com lrsquoObjective-C (utilitzat per fer les aplicacions per dispositius drsquoApple) o el C (creat per Microsoft i utilitzat entre altres coses per fer programes in-formagravetics per Windows)

Condensador Component electrogravenic classificat dins del grup dels passius i que per tant no emet cap senyal El podriacuteem definir com un acumula-dor drsquoelectrons que els deixa anar quan arriba a la seva capacitat magravexima Hi ha condensadors de dos tipus els electroliacutetics i els normals En les pragravec-tiques utilitzarem electroliacutetics i com que aquests tenen polaritat eacutes important tenir en compte quina eacutes la pota positiva i quina eacutes la negativa a lrsquohora de connectar-lo

Diacuteode Component electrogravenic passiu Teacute polaritat i seria lrsquoequivalent a una vagravelvula antiretorn lrsquoelec-tricitat nomeacutes pot anar en un sentit

Electrogravenica Disciplina que estudia els com-ponents electrogravenics que funcionen amb un flux drsquoelectrons (corrent continua)

Funcioacute Fragment de codi que conte un seguit drsquoaccions i que hi pots accedir cridant la funcioacute en comptes de repetint el codi Podriacuteem comparar-ho amb una funcioacute matemagravetica en la que tenim vari-ables drsquoentrada que tractant-les a la funcioacute ob-tenim una informacioacute de sortida

GPIO Soacuten les sigles de ldquoGeneral Purpose InputOutputrdquo Si mirem la Raspberry Pi soacuten els pins de sortida on hi connectem els cables amb els que programem la placa electrogravenica Lrsquoavantatge drsquoaquest tipus de connector respecte altres eacutes que es pot gestionar mitjanccedilant programacioacute i aixograve eacutes precisament el que explicarem en aquest manual

35

HDMI Soacuten les sigles de ldquoHigh-Definition Multime-dia Interfacerdquo Serveix per enviar viacutedeo i agraveudio a una pantalla Nosaltres lrsquoutilitzarem per connectar la RaspberryPi a una pantalla

LED Acrogravenim de ldquoLight Emitting Dioderdquo Eacutes un tipus de diacuteode el qual teacute una pelmiddotliacutecula de fogravesfor entre els dos connectors que fa que quan passi el corrent generi llum Com qualsevol altre diacuteode eacutes important tenir en compte la polaritat

RAM Acrogravenim de ldquoRandom Access Memoryrdquo Eacutes la part de lrsquoordinador encarregada drsquoemmagatze-mar els arxius temporals

RCA El connector RCA consisteix en diferents cables amb la punta de diferent color que serveix-en per transmetre agraveudio i viacutedeo

ROM De lrsquoanglegraves ldquoRead Only Memoryrdquo eacutes la uni-tat de memograveria on es guarda el sistema operatiu

Resistegravencia Eacutes un component electrogravenic que teacute com a funcioacute reduir el flux drsquoelectrons afi de controlar la seva potegravencia Eacutes molt comuacute a lrsquoelectrogravenica ja que eacutes molt necessari per assegu-rar-nos del correcte funcionament drsquoelements com el LED que sense una resistegravencia que limiteacutes el corrent podrien cremar-se

Placa base Eacutes la part de lrsquoordinador que conteacute elements com la RAM la ROM o el microproces-sador La placa base de lrsquoordinador que constru-irem amb aquest manual seria la progravepia Raspber-ry Pi

Protoboard Tambeacute coneguda com a Bread-board srsquoutilitza per crear circuits electrogravenics sense necessitat de soldar Per saber com funcio-na i com estan relacionats els diferents contactes consulteu aquesta webhttprduinostarcomdocumentaciongeneralpro-toboard-que-es-y-como-funciona

36

Terminal Eacutes el programa emprat per enviar ordres directes a lrsquoordinador i rebre respostes drsquoaquest Nosaltres lrsquoutilitzarem per instalmiddotlar els programes necessaris per programar les plaques electrograveniques i altres arxius necessaris

Variable Valor que canvia segons les operacions que es facin amb aquest al programa informagravetic Com ja sabeu hi ha variables independents (pe el temps) i dependents (pe si estagrave o no encegraves un LED que dependragrave drsquoaltres variables)

37

  • httpwwwfsforg
Page 6: CodePi

6

4 Apregraven a muntar la caixa de la CodePi

Abans de comenccedilar a tallar la fusta prepararem el seguumlent esquema en el nostre tauloacute de fusta A la part del centre deixarem un espai de 6 mm per poder clavar beacute una costat sobre un costat per acabar tenint una caixa de 160mm x 160mm

Amb un regle i un llapis marquem les liacutenies per on tallarem el tauloacute seguint lrsquoesquema anterior

A continuacioacute tallar el tauloacute amb una serra elegravec-trica En cas de no tenir-ne srsquohauragrave de posar la fullola en un cargol de banc i tallar-la amb una ser-ra manual

No passa res si la fusta no queda del tot ben tal-lada ja que despreacutes podrem retocar les imperfec-cions llimant-les i meacutes endavant posant massilla

7

Atencioacute Eacutes altament recomanable utilitzar guants i ulleres protectores durant tot el proceacutes de manip-ulacioacute de la fusta

Els guants ens protegiran de possibles talls ras-cades o drsquoaltres 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 Eacutes recomanable posar dues fustes entre la boca del cargol i el tauloacute per impedir que aquesta es pugui malmetre a causa de la pressioacute

Llimar les fustes verticalment ja que drsquoaquesta manera es treballa sobre meacutes superfiacutecie Reco-manem utilitzar una llima amb fulla molt rugosa per poder realitzar el treball meacutes ragravepidament Llimar tambeacute les dues peces que faran de tapa i contra tapa

Per millorar les llimadures utilitzar una llima amb la fulla meacutes fina o un paper de vidre

8

Un cop les fustes estiguin ben llimades utilitzar els claus per collar les parets Cal prestar atencioacute en la posicioacute dels claus ja que la fusta eacutes molt prima i es poden torccedilar Aquest hauria de ser el resultat final

Seguint el mateix proceacutes clavar la fullola que faragrave de tapa inferior Cal vigilar a on es posen els claus ja que pot ser que es toquin amb els que hem po-sat anteriorment

Agafar les frontisses i clavar-les amb dos claus pe-tits a la fullola que faragrave de tapa superior Despreacutes clavar els dos forats restants a una de les parets aquesta faragrave de part posterior de la CodePi

Recomanacioacute Si volem que la fusta ens duri du-rant meacutes temps eacutes recomanable envernissar la caixa amb un verniacutes per a fustes

9

Per descarregar Raspbian el sistema operatiu que utilitza la CodePi haurem drsquoobrir una nova fi-nestra del navegador i anar a la web de Raspberry Pi httpwwwraspberrypiorg

Eacutes recomanable fer aquest proceacutes al mateix ordi-nador en el que es procediragrave a instalmiddotlar Raspbian a la targeta SD

Recorda que aquest ordinador ha de tenir lector de targetes o un adaptador USB connectatDespreacutes haurem drsquoanar a lrsquoapartat de descagraverreg-ues on trobarem tots els enllaccedilos que necessitem per descarregar el sistema operatiu de la Rasp-berry Pi

5 Afegim un sistema ope- ratiu a la CodePi

51 Descarregar Raspbian

Lrsquouacuteltim pas per descarregar Raspbian eacutes clicar sobre lrsquoenllaccedil on posa Direct Download Es reco-mana realitzar aquest proceacutes en un lloc amb una connexioacute estable i ragravepida ja que srsquoha de descar-regar molta informacioacute

Despreacutes de clicar aquest enllaccedil sersquons obriragrave una nova finestra i automagraveticament Raspbian comenccedilaragrave a descarregar-se La descagraverrega pot trigar entre 5 i 15 minuts depenent de la teva con-nexioacute a internet Ja podem tancar aquesta finestra i continuar cap al pas seguumlent

10

52 Instalmiddotlar RaspbianUna vegada que ja tenim descarregada lrsquouacuteltima versioacute de Raspbian segons el sistema opera-tiu des del que vulguem instalmiddotlar-lo haurem de seguir uns passos diferents per completar la in-stalmiddotlacioacute

Windows

Per instalmiddotlar Raspbian amb Windows haurem de descarregar i instalmiddotlar Win32DiskImager Abans de continuar amb la instalmiddotlacioacute haurem de de-scomprimir el fitxer que ens hem descarregat Per descomprimir-lo utilitzarem un compressor drsquoarxius com (7zip) Clicant amb el botoacute dret so-bre aquest arxiu i clicarem on posa descomprimir aquiacute o buscarem el nom del nostre descompres-sor i despreacutes buscarem aquesta opcioacute

Ara introduirem la targeta de memograveria que vul-guem utilitzar a lrsquoentrada per targetes del nostre ordinador o a lrsquoadaptador corresponent

A continuacioacute iniciarem el programa i clicarem sobre el logo de la carpeta i escollirem el lloc on hem descomprimit el contingut del zip buscarem lrsquoar-xiu amb extensioacute img i acceptarem el diagraveleg Meacutes tard escollirem en quin dispositiu volem in-stalmiddotlar el sistema operatiu aquest eacutes un punt on hem drsquoestar segurs drsquoon estem instalmiddotlant aquests arxius ja que si lrsquoestigueacutessim instalmiddotlant en una destinacioacute diferent podriacuteem perdre totes les dades de lrsquoordinador Per saber a quin dispositiu hem drsquoinstalmiddotlar Raspbian obrirem ldquoEl Meu Ordinadorrdquo i buscarem la targeta de memograveria ens fixarem en quina lletra hi ha al final del nom aquesta seragrave la mateixa que haurem de posar al programaQuan ja haguem inserit aquests dos paragravemetres al programa clicarem sobre el botoacute de Write i es comenccedilara a instalmiddotlar el sistema operatiu

11

Linux

Per instalmiddotlar Raspbian des drsquoun sistema operatiu Linux utilitzarem lrsquoordre 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 homeusu-ari)

Un cop tenim descomprimit el contingut del zip obrirem una sessioacute al terminal i escriurem

cd ~

df -h

umount devsdd1

sudo dd bs=4M if=~2013-02-09-wheezy-raspbianimg of=devsdd

Anirem a la carpeta on hem descomprimit el zip (la de lrsquousuari eacutes per defecte o ~)

Buscarem la targeta sd i el seu nom a la seguumlent llista ens haurem drsquoapuntar el que posi a la prime-ra columna com devsdd (sense el numero) Assegureu-vos que aquest eacutes el dispositiu on vo-leu instalmiddotlar el Raspbian

Abans drsquoinstalmiddotlar Raspbian haurem de des-muntar les particions corresponents a la targeta SD utilitzant lrsquoordre umount en el cas de tenir meacutes drsquouna particioacute haurem drsquoexecutar aquesta ordre meacutes drsquouna vegada

Ara executarem lrsquoordre dd amb permisos drsquoadmi- nistrador al modificador ldquoif=rdquo posarem la carpeta on hem descomprimit el zip (la de lrsquousuari eacutes per defecte o ~) amb el nom del arxiu img descom-primit i al modificador ldquoof=rdquo escriurem el que hem copiat abans amb lrsquoanterior ordre

12

Mac OS X

Per instalmiddotlar Raspbian a Mac OS X tambeacute utilitza-rem lrsquoordre dd pero el funcionament per buscar en quin disc volem instalmiddotlar raspbian eacutes diferent Recomanem extreure el contingut del zip a la car-peta Usersusuari

Comenccedilarem buscant la targeta on volem instalmiddotlar raspbian executant la seguumlent ordre i copiarem el disk4 (sense agafar la particioacute)

Desmuntarem el disk en quumlestioacute

Ara executarem lrsquoordre dd amb permisos drsquoadmi- nistrador al modificador ldquoif=rdquo posarem la carpeta on hem descomprimit el zip (la de lrsquousuari eacutes per defecte o ~) amb el nom de lrsquoarxiu img descom-primit i al modificador ldquoof=rdquo escriurem el que hem copiat abans amb lrsquoanterior ordre

diskutil list

diskutil unmountDisk devdisk4

sudo dd bs=1m if=~2013-02-09-wheezy-raspbianimg of=devsdb

13

6 Primer inici i configuracioacute de la CodePiAra ja estem preparats per posar la targeta SD a la Raspberry Pi i connectar tots els cables per comenccedilar a programar A continuacioacute hem de se-guir uns passos que nomeacutes podrem fer durant la primera arrencada del sistema i que ens perme-tran iniciar lrsquoescriptori automagraveticament posar la CodePi en catalagrave i configurar la disposicioacute del te-clat entre drsquoaltres coses

Quan iniciem per primera vegada la Raspberry Pi amb el sistema operatiu Raspbian ens apareixeragrave la seguumlent pantalla on ens mourem utilitzant les fletxes i la tecla intro

La primera cosa que seleccionarem seragrave ldquoboot_behaviorrdquo que ens permetragrave inciar lrsquoescriptori quan el sistema iniciiuml

Ens mourem amb el teclat (dreta - esquerre) per fer que estigui seleccionat ldquoyesrdquo clicarem enter

14

Ara a continuacioacute ens mourem fins a ldquoexpand_rootfsrdquo que ens permetragrave expandir el tamany de la particioacute arrel de la Raspberry Pi al tamany magravex-im de la targeta SD eacutes a dir si tenim una targeta de 4 Gb si no fessim aquesta opcioacute estariacuteem util-itzant uacutenicament 2 Gb de capacitat

Acceptarem el seguumlent diagraveleg i passarem a con-figurar els idiomes

Buscarem ldquochange_localerdquo per canviar els idio-mes i la disposicioacute del teclat al catalagrave

De la seguumlent llista seleccionarem mitjanccedilant lrsquoes-pai del teclat totes les codificacions que comencin per ldquoCA_Per baixar a buscar-les utilitzarem les fletxes (amunt-avall) i per acabar clicarem la del costat dret i enter

15

Seleccionarem ldquochange_timezonerdquo per canviar la zona horagraveria de la Raspberry Pi i els temes rela-cionats amb aquesta

A continuacioacute seleccionarem el nostre continent

I per uacuteltim buscarem una ciutat que estigui a la mateixa zona horagraveria que nosaltres i la seleccio-nariacuteem tambeacute amb enter

64 Descarregar i executar ScriptPer descarregar lrsquoscript hem donar permisos i ex-ecutar-lo aixiacute que escriurem les seguumlents ordres en el terminal que podeu trobar a lrsquoescriptori

cd tmpmkdir CodePicd CodePiwget httpwwwtomorrowdevcomcodepiwiringPi-installshchmod +x wiringPi-installshwiringPi-installsh

Ja hem acabat de descarregar el programari que ens permetragrave programar amb la CodePi

16

7 PragravectiquesRecomanacioacute mirar aquests tutorials introduc-toris al llenguatge C httpthenewbostonorglistphpcat=14

Aquiacute teniu un quadre que us serviragrave lrsquoequivalegravencia entre els pins del GPIO i els que haurem de posar en el codi

Ja queda menys perquegrave puguis comenccedilar a pro-gramar perograve abans de fer-ho hauragraves de saber com compilar un programa Probablement ara et preguntaragraves quegrave eacutes compilar doncs compilar eacutes el proceacutes que fa un programa per traduir el codi que nosaltres hem escrit a codi binari amb la fi-nalitat de que el nostre ordinador pugui entendre cada ordre

Per compilar un codi escrit en C farem servir el compilador cc Abans drsquoutilitzar aquest programa haurem drsquoindicar a on hem guardat la nostra pragravec-tica amb lrsquoordre cdcc

-o practica

-Wall

-Iusrlocalinclude

-Lusrlocallib

practicac

-lwiringPi

Primer de tot posarem lrsquoordre al terminal

Utilitzarem el modificador -o per establir quin seragrave el nom del programa de sortida per exemple ldquopragravecticardquo

Amb aquest modificador indicarem que volem que ens doni tota la informacioacute dels errors de sintaxis del fitxer

Amb aquest indicarem on es troben els fitxers de la llibreria a incloure dintre del nostre fitxer

Utilitzant aquest altre modificador establim el di-rectori on ha de buscar els fitxers de la llibreria

Ara indicarem el nom del fitxer on es troba el nos-tre codi sempre acabant amb la terminacioacute c per exemple ldquopragravecticacrdquo

Amb aquest modificador posem la llibreria wiring-Pi a la llista de llibreries que han de ser afegides

17

Al final introduirem tot seguit al terminal una ordre similar a la seguumlent

cc -o practica -Wall -Iusrlocalinclude -Lusrlocallib practicac -lwiringPi

A part de saber compilar abans de comenccedilar a programar i a fer els nostres circuits haurem de saber quins soacuten els pins on haurem de connectar als cables a la Raspberry Pi aquest pins els iden-tificarem utilitzant nuacutemeros

La seguumlent taula ens permet saber lrsquoequivalegravencia entre els nuacutemeros de la GPIO els nuacutemeros de wiringPi la llibreria que interpretaragrave el nostre codi i la posicioacute dels pins

18

Des que la variable i eacutes igual a 1 fins i mentre que aquesta sigui igual o meacutes petita que10 executa el codi

Mentre que la variable D sigui igual a 5 el codi entre claus es llegiragrave infinites vegades

Si la variable X no eacutes meacutes petita que 7 fes una altra cosa

Si la variable X eacutes meacutes petita que 7 fes alguna cosa

70 Iniciacioacute al llenguatge CAbans de comenccedilar a programar cal tenir en compte els conceptes de condicional i de cicle

Els condicionals ldquoif - elserdquo nomeacutes executen el codi a continuacioacute si la condicioacute que li fiquem entre paregraventesis eacutes certa Ho podriacuteem comparar amb el que seria una oracioacute condicional No eacutes obligatori perograve podem afegir la partiacutecula ldquoelserdquo que eacutes lrsquoequivalent a la paraula ldquosi nordquo En el cas a continuacioacute com que el condicional no es compleix srsquoexecutaria lrsquoelse

if (X lt 7) Fes alguna cosa else Fes una altra cosa

Els bucles ldquoforrdquo soacuten rutines que serveixen per ex-ecutar un codi un determinat nuacutemero de vegades Teacute tres parts separades per punt i coma entrada condicioacute i increment A la entrada li donem un va-lor a una variable A la condicioacute determinem que la rutina srsquoexecuti nomeacutes si eacutes compleix la condicioacute utilitzant la variable drsquoentrada Finalment en el in-crement fixem un nou valor a la variable aquesta part srsquoexecutaragrave a cada cicle En llenguatge C si no afegim cap dels tres paragravemetres el bucle seragrave infinit

for (int i = 1 i lt= 10 i++) Fes alguna cosa

La sentegravencia ldquowhilerdquo defineix que un codi srsquoexe-cutaragrave infinitament mentre que la condicioacute que es defineix sigui certa

while (D==5) Fes alguna cosa

19

71 Bloc 1 (Bagravesic)711 Hola moacuten

En aquesta pragravectica escriurem un text a la consograve-la el conegut ldquoHello Worldrdquo

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void) printf(ldquohola moacutenrdquo)

if (wiringPiSetup() == -1) exit (1)

return 0

712 Encendre un LED

Hem drsquoimportar aquestes llibreries per tal que la RaspberryPi entengui el codi

Aquesta eacutes la funcioacute principal (main) i srsquoexecutaragrave tot el que fiquem aquiacute dins

Amb la funcioacute printf() el que aconseguim eacutes que es mostri al terminal el text que hi posem entre comentes

Aquestes liacutenies de codi soacuten simplement compro-vacions per assegurar-nos que tot funciona cor-rectament Soacuten negligibles perograve eacutes recomanable posar-les Les afegirem a totes les pragravectiques

Connectarem la pota llarga (agravenode) del LED al pin 5v de la GPIO i lrsquoaltre pota (cagravetode) a una resistegraven-cia de 180Ω Aquesta distincioacute entre potes es deu a que els LEDs estan polaritzats mireu el glossa-ri per saber-ne meacutes Tot seguit connecteu lrsquoaltra pota de la resistegravencia al pin GROUND

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void)

20

Comprovacionsif (wiringPiSetup() == -1) exit (1)

int pin = 1

printf(ldquoEncenem el pin 18rdquo)

pinMode(pin OUTPUT)

digitalWrite(pin 1)

return 0

713 Encendre i apagar un LED cada dos segons 10 vegades

El que podeu veure aquiacute eacutes el que srsquoanomena un comentari del codi Tot allograve que escrivim despreacutes de ldquordquo el compilador no ho llegiragrave i per tant nomeacutes serveix per donar indicacions al programador

Declarem la variable pin que com eacutes un nombre enter escriurem int

Fem un printf() tal i com hem apregraves a la pragravectica anterior Escrivim el 18 ja que la numeracioacute de la llibreria wiringPi canvia respecte a la sortida real (mirar el cuadre de la pagravegina 17)

Amb la funcioacute pinMode() declarem que el pin nuacutemero 1 en aquest cas sigui un pin de sortida de corrent (OUTPUT)

Una vegada li hem dit que eacutes de sortida li hem de dir si el volem encegraves ldquo1rdquo o apagat ldquo0rdquo amb la funcioacute digitalWrite()

Utilitzarem el muntatge la de pragravectica anterior amb la diferegravencia que en comptes de connectar lrsquoagravenode del LED al pin de 5v el connectarem al pin 18 de la Raspberry Pi Drsquoaquesta manera podrem gestionar el pas de lrsquoelectricitat a traveacutes drsquoun petit programa que crearem a continuacioacute

21

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void) int pin = 1

if (wiringPiSetup() == -1) exit (1)

pinMode(pin OUTPUT)

for (int i=1ilt=10i++)

printf(ldquoLED Onnrdquo) digitalWrite(pin 1)

delay(2000)

printf(ldquoLED Offnrdquo) digitalWrite(pin 0)

delay(2000)

return 0

Utilitzem un bicle ldquoforrdquo per executar el codi 10 vegades

Encenem el LED

Fem un delay() de 2000 milmiddotlisegons (2 segons) que ens serveix per aturar el programa i per tant mantenir el LED encegraves durant aquest temps

Apaguem el LED

El mantenim apagat 2 segons

Lrsquoexpressioacute n serveix per canviar de liacutenia

Proposta Ara que ja saps els conceptes bagravesics de la CodePi intenta fer lrsquoequivalent al codi Morse per demanar ajuda SOS middot middot middot ndash ndash ndash middot middot middot (on cada punt significa LED encegraves durant 14 de segon i cada ralla LED encegraves durant mig segon) Juga amb el valor de la funcioacute delay() per fer que el LED estigui encegraves durant meacutes o menys temps

22

72 Bloc 2 (Mitjagrave)721 Encendre un LED apretant un botoacute

Utilitzar el muntatge del LED que hem fet servir a la pragravectica anterior A meacutes a meacutes hem drsquoafegir 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 aniragrave a parar al pin 23 una resistegravencia de 10KΩ al GROUND per forccedilar lrsquoestat LOW quan el polsador no estagrave apretat

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt int main (void) int pin_LED = 1 int pin_boto = 4 printf (ldquoEncenent un LED apretant un botoacutenrdquo) 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

Declarem el LED com un pin de sortidaI el botoacute com un pin drsquoentrada

Si no fiquem variables al for aquest srsquoexecutaragrave sempre

Amb la funcioacute digitalRead() detectem si passa cor-rent pel pin 8 eacutes a dir si el botoacute ha estat apretat Si eacutes aixiacute fem que srsquoencengui el LED

Si no fem que srsquoapagui

23

722 Encendre un LED apretant tots els puladors

Utilitzar el muntatge de la pragravectica anterior i afegir dos polsadors meacutes amb el mateix proceacutes connec-tats als ports 24 i 25 de la Raspberry Pi

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int main (void) int pin_LED = 1

int pin_boto_A = 4 int pin_boto_B = 5 int 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 ampamp digitalRead(pin_boto_B) == HIGH ampamp digitalRead(pin_boto_C) == HIGH) digitalWrite(pin_LED 1)

Declarem el LED i els tres botons que tal i com posa a lrsquoesquema corresponen als pins 23 24 i 25 de la GPIO

Si els tres polsadors estan premuts passa corrent pels tres i per tant srsquoenceacuten el LED

En aquest cas utilitzem HIGH i LOW en lloc de 1 i 0 respectivament HIGH significa que hi ha elec-tricitat i LOW que no hi ha

24

No apretats while (digitalRead(pin_boto_A) == LOW ampamp digitalRead(pin_boto_B) == LOW ampamp digitalRead(pin_boto_C) == LOW) digitalWrite(pin_LED 0)

Si no apagarsquol

723 Semagravefor amb polsador

En aquesta pragravectica crearem un semagravefor de via-nants i de cotxes Com alguns semagravefors aquests teacute un botoacute amb el qual els vianants demanen que es posi verd aixiacute que el dels cotxes es posa ver-mell

Connectarem dos LEDs (vermell i verd) als pins 18 i 23 de la Raspberry Pi amb una resistegravencia de 180Ω Tambeacute connectarem tres LEDs meacutes (verd vermell i taronja) de la mateixa manera en els ports 17 21 i 22 de la GPIO

A diferegravencia de les altres pragravectiques amb polsa-dors en aquesta el connectarem al port SDA0 i al GROUND ja que nomeacutes ens interessa detectar quan es prem

25

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

define VERMELL 0define GROC1define VERD 2define VERMELL_HOME3define VERD_HOME4

define BOTO 8

void setup (void) int i

if (geteuid () = 0) exit (0)

if (wiringPiSetup () == -1) exit (1)

fflush(stdout) for (i = 0 i lt 5 ++i) pinMode (i OUTPUT) digitalWrite (i 0) digitalWrite(VERD1)digitalWrite(VERMELL_HOME1) pinMode (BOTO INPUT)

printf (ldquoSetup fetnrdquo)

int main (void) setup () for () esperaBoto () aturaTransit () camina () tempsEspera () iniciaTransit ()

Amb lrsquoexpressioacute define li diem a la magravequina que cada cop que escrivim VERMELL en realitat es-tem posant el nombre 0 i el mateix amb les altres paraules

Fem un setup amb tota la configuracioacute necessagraveria

fflush() eacutes una funcioacute complexa que serveix per quumlestions de tractament de memograveria del sistema per evitar errors

Executem totes les funcions una darrera lrsquoaltra de manera indefinida

26

Esperant a que lrsquousuari premi el botoacute per comenccedilar

Fem que el semagravefor dels cotxes canviiuml de verd a vermell passant pel groc

Fem que el semagravefor dels vianants es posi verd

Temps intermig des que srsquoacaba de caminar fins que el trafic comenccedila

void esperaBoto (void) printf (ldquoEsperant el botoacute ldquo)fflush(stdout) while (digitalRead (BOTO) == HIGH) delay (100) printf (ldquoEsoerenrdquo)

void aturaTransit()printf(ldquoAturanteltraficldquo)fflush(stdout)digitalWrite(VERD0) digitalWrite (GROC 1) delay (2000) digitalWrite (GROC 0) digitalWrite(VERMELL1) delay (2000) printf (ldquoAturatsnrdquo)

void camina ()printf(ldquoCaminaldquo)fflush(stdout)

digitalWrite(VERMELL_HOME0)digitalWrite(VERD_HOME1) delay (10000) digitalWrite(VERMELL0) digitalWrite (GROC 1)

printf (ldquoJa han caminatnrdquo)

void tempsEspera () int i

printf (ldquoTemps drsquoespera ldquo) fflush(stdout)

for (i = 0 i lt 8 ++i)

27

delay (500) digitalWrite(VERD_HOME0) digitalWrite (GROC 0) delay (500) digitalWrite(VERD_HOME1) digitalWrite (GROC 1)

void iniciaTransit ()printf(ldquoInicianttraficldquo)fflush(stdout)

digitalWrite(VERD_HOME0)digitalWrite(VERMELL_HOME1) delay (500) digitalWrite (GROC 0) digitalWrite(VERD1)

Deixem via lliure pels vehicles i posem el semagrave-for vermell pels vianants

Proposta Utilitzant el que has apregraves en aquest bloc crear un projecte amb uns quants LEDs en fila que srsquoactivin ascendentment quan apretes un botoacute

28

73 Bloc 3 (Alt)731 Sistema portes logravegiques I

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int AND (int a int b) return a ampamp b

int OR (int a int b) return a || b

int NEGADA (int a) return a

int f(int a int b) return OR(AND(NE-GADA(a)b)AND(aNEGADA(b))) f(a b) = arsquob + abrsquo

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5

int apretat_A = 0 int apretat_B = 0

pinMode(pin_LED_S OUTPUT) pinMode(pin_boto_A INPUT) pinMode(pin_boto_B INPUT)

Crearem una funcioacute per a cada porta logravegica de tal manera que sigui meacutes fagravecil poder-ho aplicar despreacutes

Aquesta seragrave la foacutermula que compliragrave la taula de la veritat en aquest cas eacutes f(a b) = arsquob +abrsquo

Creem dos booleans (variables que poden ser 0 o 1) que ens indicaran si el botoacute ha estat premut o no

Declarem els pins drsquoentrada i de sortida com a totes les pragravectiques anteriors

El seguumlent projecte fa la mateixa funcioacute que acon-seguiriacuteem amb xips de portes logravegiques perograve fent els cagravelculs a partir de la RaspberryPi En aquest cas compleix la taula de la veritat drsquoun OR ex-clusive eacutes a dir nomeacutes srsquoencendragrave el LED quan premem un dels dos botons mai srsquoencendragrave 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 srsquoutilitzin en el codi

29

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) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins estan premuts

Comprovem quins no estan premuts

I apliquem la foacutermula amb els valors drsquoentrada cor-responents Si la foacutermula eacutes igual a 1 srsquoencendragrave el LED si no no srsquoencendragrave

732 Sistema portes logravegiques II

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

Partim de la mateixa base que la pragravectica ante-rior perograve en aquesta incloem una tercera variable drsquoentrada Aixiacute que hem drsquoafegir un nou botoacute en el pin del GPIO que srsquoescau

30

Seguim el patroacute de les foacutermules emprades a la pragravectica anterior

En aquest cas tenim tres variables drsquoentrada perograve la mecagravenica eacutes la mateixa Es pot jugar amb la foacutermula i anar provant diferents combinacions

Necessitem tres variables ja que hi ha tres botons

Declaracions

Comprovem quins estan premuts

int AND (int a int b) return a ampamp b

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 + arsquob

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5 int pin_boto_C = 6

int apretat_A = 0 int apretat_B = 0 int apretat_C = 0

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

31

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

Mostra resultat if (f(apretat_A apretat_B apretat_C) == 1) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins no estan premuts

Com al circuit anterior apliquem la foacutermula i si aquesta doacutena 1 encenem el LED

Proposta Ara que ja has apregraves els conceptes meacutes fonamentals de la CodePi inventarsquot un circuit amb el nivell de dificultat que consideris No et quedis amb el que se trsquoha ensenyat aquiacute sinoacute que cerca meacutes megravetodes que puguis utilitzar La creativitat eacutes bagravesica per a tot bon enginyer i amb aquesta pragravectica volem que demostris de quegrave ets capaccedil

32

8 Vols saber-ne meacutes El moacuten de la programacioacute i lrsquoelectrogravenica eacutes infinit La comunitat geek (= interessada) en aquests te-mes eacutes una de les meacutes servicials i altruista de tota la xarxa aixiacute que es poden trobar una quantitat inacabable de tutorials i pagravegines web especialitza-des en el que vulguem saber

81 Programari lliureEl programari lliure eacutes la base de la informagravetica ac-tual i encara juga un gran paper en algunes agraverees com els servidors web o els mogravebils amb sistema operatiu Android Aquiacute teniu un conjunt de pagravegines on podeu aprofundir sobre aquest apassionant moacuten de la llibertat digital

httpcawikipediaorgwikiRichard_Matthew_Stallmanhttpwwwfsforghttpwwwgnuorghttpwwwlinuxorghttpwwwunixorghttpwwwubuntucom

82 Raspberry PiSi desitges saber meacutes sobre el projecte sense agravenim de lucre Raspberry Pi i seguir fent projectes amb ella visita les pagines que trobaragraves a con-tinuacioacute Aquestes et donaran idees de quegrave fer amb aquest petit perograve fascinant ordinador

httplearnadafruitcomcategorylearn-raspber-ry-pihttpwwwraspberrypiorgwwwraspberrypiorghttpdangerousprototypescom20130202rasp-berry-pi-supercomputerhttpreviewscnetcoukdesktops25-fun-things-to-do-with-a-raspberry-pi-50009851httplearnadafruitcompi-thermal-printer

33

83 Electrogravenica Si lrsquoelectrogravenica bagravesica que has apregraves durant els tutorials de la CodePi trsquoha fet veure que aquest eacutes el moacuten que a tu trsquoagrada no paris A continu-acioacute et deixem pagravegines web on trobaragraves les bases de lrsquoelectrogravenica meacutes complexa i tambeacute molts nous circuits per muntar i seguir descobrint aquest moacuten que avui en dia fa que tots els aparells endollats a al corrent puguin funcionar

httpwwwinstructablescomidBeginners-Elec-tronics-ProjectshttpwwwinstructablescomidElectronic-Proj-ects-For-Beginnershttpwwwcircuitstodaycomsimple-electron-ics-projects-and-circuitshttpswwwsparkfuncomtutorialshttplearnadafruitcom

84 ProgramacioacuteDiuen que per ser un bon programador srsquohan de tenir unes habilitats que no tothom teacute disciplina ordre logravegica creativitat capacitat per resoldre qualsevol problema i per sobre de tot persistegravencia i passioacute Si creus que tens aquestes qualitats do-na-li una oportunitat a la programacioacute A continu-acioacute et deixem un recull de les pagravegines web que creiem que meacutes et poden ajudar a introduir-te una mica meacutes en la programacioacute web i la drsquoapli-cacions per a mogravebils

httpwwwcodeorghttpscratchmiteduhttpwwwcodecademycom

34

9 GlossariC (llenguatge de programacioacute) Des de la seva creacioacute lrsquoany 1972 srsquoha consolidat com un dels llenguatges de programacioacute meacutes utilitzats per fer aplicacions de software Eacutes considerat un dels meacutes bagravesics i meacutes comuns per introduir-se a la pro-gramacioacute Les grans companyies han utilitzat el C com a base per crear altres llenguatges com lrsquoObjective-C (utilitzat per fer les aplicacions per dispositius drsquoApple) o el C (creat per Microsoft i utilitzat entre altres coses per fer programes in-formagravetics per Windows)

Condensador Component electrogravenic classificat dins del grup dels passius i que per tant no emet cap senyal El podriacuteem definir com un acumula-dor drsquoelectrons que els deixa anar quan arriba a la seva capacitat magravexima Hi ha condensadors de dos tipus els electroliacutetics i els normals En les pragravec-tiques utilitzarem electroliacutetics i com que aquests tenen polaritat eacutes important tenir en compte quina eacutes la pota positiva i quina eacutes la negativa a lrsquohora de connectar-lo

Diacuteode Component electrogravenic passiu Teacute polaritat i seria lrsquoequivalent a una vagravelvula antiretorn lrsquoelec-tricitat nomeacutes pot anar en un sentit

Electrogravenica Disciplina que estudia els com-ponents electrogravenics que funcionen amb un flux drsquoelectrons (corrent continua)

Funcioacute Fragment de codi que conte un seguit drsquoaccions i que hi pots accedir cridant la funcioacute en comptes de repetint el codi Podriacuteem comparar-ho amb una funcioacute matemagravetica en la que tenim vari-ables drsquoentrada que tractant-les a la funcioacute ob-tenim una informacioacute de sortida

GPIO Soacuten les sigles de ldquoGeneral Purpose InputOutputrdquo Si mirem la Raspberry Pi soacuten els pins de sortida on hi connectem els cables amb els que programem la placa electrogravenica Lrsquoavantatge drsquoaquest tipus de connector respecte altres eacutes que es pot gestionar mitjanccedilant programacioacute i aixograve eacutes precisament el que explicarem en aquest manual

35

HDMI Soacuten les sigles de ldquoHigh-Definition Multime-dia Interfacerdquo Serveix per enviar viacutedeo i agraveudio a una pantalla Nosaltres lrsquoutilitzarem per connectar la RaspberryPi a una pantalla

LED Acrogravenim de ldquoLight Emitting Dioderdquo Eacutes un tipus de diacuteode el qual teacute una pelmiddotliacutecula de fogravesfor entre els dos connectors que fa que quan passi el corrent generi llum Com qualsevol altre diacuteode eacutes important tenir en compte la polaritat

RAM Acrogravenim de ldquoRandom Access Memoryrdquo Eacutes la part de lrsquoordinador encarregada drsquoemmagatze-mar els arxius temporals

RCA El connector RCA consisteix en diferents cables amb la punta de diferent color que serveix-en per transmetre agraveudio i viacutedeo

ROM De lrsquoanglegraves ldquoRead Only Memoryrdquo eacutes la uni-tat de memograveria on es guarda el sistema operatiu

Resistegravencia Eacutes un component electrogravenic que teacute com a funcioacute reduir el flux drsquoelectrons afi de controlar la seva potegravencia Eacutes molt comuacute a lrsquoelectrogravenica ja que eacutes molt necessari per assegu-rar-nos del correcte funcionament drsquoelements com el LED que sense una resistegravencia que limiteacutes el corrent podrien cremar-se

Placa base Eacutes la part de lrsquoordinador que conteacute elements com la RAM la ROM o el microproces-sador La placa base de lrsquoordinador que constru-irem amb aquest manual seria la progravepia Raspber-ry Pi

Protoboard Tambeacute coneguda com a Bread-board srsquoutilitza per crear circuits electrogravenics sense necessitat de soldar Per saber com funcio-na i com estan relacionats els diferents contactes consulteu aquesta webhttprduinostarcomdocumentaciongeneralpro-toboard-que-es-y-como-funciona

36

Terminal Eacutes el programa emprat per enviar ordres directes a lrsquoordinador i rebre respostes drsquoaquest Nosaltres lrsquoutilitzarem per instalmiddotlar els programes necessaris per programar les plaques electrograveniques i altres arxius necessaris

Variable Valor que canvia segons les operacions que es facin amb aquest al programa informagravetic Com ja sabeu hi ha variables independents (pe el temps) i dependents (pe si estagrave o no encegraves un LED que dependragrave drsquoaltres variables)

37

  • httpwwwfsforg
Page 7: CodePi

7

Atencioacute Eacutes altament recomanable utilitzar guants i ulleres protectores durant tot el proceacutes de manip-ulacioacute de la fusta

Els guants ens protegiran de possibles talls ras-cades o drsquoaltres 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 Eacutes recomanable posar dues fustes entre la boca del cargol i el tauloacute per impedir que aquesta es pugui malmetre a causa de la pressioacute

Llimar les fustes verticalment ja que drsquoaquesta manera es treballa sobre meacutes superfiacutecie Reco-manem utilitzar una llima amb fulla molt rugosa per poder realitzar el treball meacutes ragravepidament Llimar tambeacute les dues peces que faran de tapa i contra tapa

Per millorar les llimadures utilitzar una llima amb la fulla meacutes fina o un paper de vidre

8

Un cop les fustes estiguin ben llimades utilitzar els claus per collar les parets Cal prestar atencioacute en la posicioacute dels claus ja que la fusta eacutes molt prima i es poden torccedilar Aquest hauria de ser el resultat final

Seguint el mateix proceacutes clavar la fullola que faragrave de tapa inferior Cal vigilar a on es posen els claus ja que pot ser que es toquin amb els que hem po-sat anteriorment

Agafar les frontisses i clavar-les amb dos claus pe-tits a la fullola que faragrave de tapa superior Despreacutes clavar els dos forats restants a una de les parets aquesta faragrave de part posterior de la CodePi

Recomanacioacute Si volem que la fusta ens duri du-rant meacutes temps eacutes recomanable envernissar la caixa amb un verniacutes per a fustes

9

Per descarregar Raspbian el sistema operatiu que utilitza la CodePi haurem drsquoobrir una nova fi-nestra del navegador i anar a la web de Raspberry Pi httpwwwraspberrypiorg

Eacutes recomanable fer aquest proceacutes al mateix ordi-nador en el que es procediragrave a instalmiddotlar Raspbian a la targeta SD

Recorda que aquest ordinador ha de tenir lector de targetes o un adaptador USB connectatDespreacutes haurem drsquoanar a lrsquoapartat de descagraverreg-ues on trobarem tots els enllaccedilos que necessitem per descarregar el sistema operatiu de la Rasp-berry Pi

5 Afegim un sistema ope- ratiu a la CodePi

51 Descarregar Raspbian

Lrsquouacuteltim pas per descarregar Raspbian eacutes clicar sobre lrsquoenllaccedil on posa Direct Download Es reco-mana realitzar aquest proceacutes en un lloc amb una connexioacute estable i ragravepida ja que srsquoha de descar-regar molta informacioacute

Despreacutes de clicar aquest enllaccedil sersquons obriragrave una nova finestra i automagraveticament Raspbian comenccedilaragrave a descarregar-se La descagraverrega pot trigar entre 5 i 15 minuts depenent de la teva con-nexioacute a internet Ja podem tancar aquesta finestra i continuar cap al pas seguumlent

10

52 Instalmiddotlar RaspbianUna vegada que ja tenim descarregada lrsquouacuteltima versioacute de Raspbian segons el sistema opera-tiu des del que vulguem instalmiddotlar-lo haurem de seguir uns passos diferents per completar la in-stalmiddotlacioacute

Windows

Per instalmiddotlar Raspbian amb Windows haurem de descarregar i instalmiddotlar Win32DiskImager Abans de continuar amb la instalmiddotlacioacute haurem de de-scomprimir el fitxer que ens hem descarregat Per descomprimir-lo utilitzarem un compressor drsquoarxius com (7zip) Clicant amb el botoacute dret so-bre aquest arxiu i clicarem on posa descomprimir aquiacute o buscarem el nom del nostre descompres-sor i despreacutes buscarem aquesta opcioacute

Ara introduirem la targeta de memograveria que vul-guem utilitzar a lrsquoentrada per targetes del nostre ordinador o a lrsquoadaptador corresponent

A continuacioacute iniciarem el programa i clicarem sobre el logo de la carpeta i escollirem el lloc on hem descomprimit el contingut del zip buscarem lrsquoar-xiu amb extensioacute img i acceptarem el diagraveleg Meacutes tard escollirem en quin dispositiu volem in-stalmiddotlar el sistema operatiu aquest eacutes un punt on hem drsquoestar segurs drsquoon estem instalmiddotlant aquests arxius ja que si lrsquoestigueacutessim instalmiddotlant en una destinacioacute diferent podriacuteem perdre totes les dades de lrsquoordinador Per saber a quin dispositiu hem drsquoinstalmiddotlar Raspbian obrirem ldquoEl Meu Ordinadorrdquo i buscarem la targeta de memograveria ens fixarem en quina lletra hi ha al final del nom aquesta seragrave la mateixa que haurem de posar al programaQuan ja haguem inserit aquests dos paragravemetres al programa clicarem sobre el botoacute de Write i es comenccedilara a instalmiddotlar el sistema operatiu

11

Linux

Per instalmiddotlar Raspbian des drsquoun sistema operatiu Linux utilitzarem lrsquoordre 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 homeusu-ari)

Un cop tenim descomprimit el contingut del zip obrirem una sessioacute al terminal i escriurem

cd ~

df -h

umount devsdd1

sudo dd bs=4M if=~2013-02-09-wheezy-raspbianimg of=devsdd

Anirem a la carpeta on hem descomprimit el zip (la de lrsquousuari eacutes per defecte o ~)

Buscarem la targeta sd i el seu nom a la seguumlent llista ens haurem drsquoapuntar el que posi a la prime-ra columna com devsdd (sense el numero) Assegureu-vos que aquest eacutes el dispositiu on vo-leu instalmiddotlar el Raspbian

Abans drsquoinstalmiddotlar Raspbian haurem de des-muntar les particions corresponents a la targeta SD utilitzant lrsquoordre umount en el cas de tenir meacutes drsquouna particioacute haurem drsquoexecutar aquesta ordre meacutes drsquouna vegada

Ara executarem lrsquoordre dd amb permisos drsquoadmi- nistrador al modificador ldquoif=rdquo posarem la carpeta on hem descomprimit el zip (la de lrsquousuari eacutes per defecte o ~) amb el nom del arxiu img descom-primit i al modificador ldquoof=rdquo escriurem el que hem copiat abans amb lrsquoanterior ordre

12

Mac OS X

Per instalmiddotlar Raspbian a Mac OS X tambeacute utilitza-rem lrsquoordre dd pero el funcionament per buscar en quin disc volem instalmiddotlar raspbian eacutes diferent Recomanem extreure el contingut del zip a la car-peta Usersusuari

Comenccedilarem buscant la targeta on volem instalmiddotlar raspbian executant la seguumlent ordre i copiarem el disk4 (sense agafar la particioacute)

Desmuntarem el disk en quumlestioacute

Ara executarem lrsquoordre dd amb permisos drsquoadmi- nistrador al modificador ldquoif=rdquo posarem la carpeta on hem descomprimit el zip (la de lrsquousuari eacutes per defecte o ~) amb el nom de lrsquoarxiu img descom-primit i al modificador ldquoof=rdquo escriurem el que hem copiat abans amb lrsquoanterior ordre

diskutil list

diskutil unmountDisk devdisk4

sudo dd bs=1m if=~2013-02-09-wheezy-raspbianimg of=devsdb

13

6 Primer inici i configuracioacute de la CodePiAra ja estem preparats per posar la targeta SD a la Raspberry Pi i connectar tots els cables per comenccedilar a programar A continuacioacute hem de se-guir uns passos que nomeacutes podrem fer durant la primera arrencada del sistema i que ens perme-tran iniciar lrsquoescriptori automagraveticament posar la CodePi en catalagrave i configurar la disposicioacute del te-clat entre drsquoaltres coses

Quan iniciem per primera vegada la Raspberry Pi amb el sistema operatiu Raspbian ens apareixeragrave la seguumlent pantalla on ens mourem utilitzant les fletxes i la tecla intro

La primera cosa que seleccionarem seragrave ldquoboot_behaviorrdquo que ens permetragrave inciar lrsquoescriptori quan el sistema iniciiuml

Ens mourem amb el teclat (dreta - esquerre) per fer que estigui seleccionat ldquoyesrdquo clicarem enter

14

Ara a continuacioacute ens mourem fins a ldquoexpand_rootfsrdquo que ens permetragrave expandir el tamany de la particioacute arrel de la Raspberry Pi al tamany magravex-im de la targeta SD eacutes a dir si tenim una targeta de 4 Gb si no fessim aquesta opcioacute estariacuteem util-itzant uacutenicament 2 Gb de capacitat

Acceptarem el seguumlent diagraveleg i passarem a con-figurar els idiomes

Buscarem ldquochange_localerdquo per canviar els idio-mes i la disposicioacute del teclat al catalagrave

De la seguumlent llista seleccionarem mitjanccedilant lrsquoes-pai del teclat totes les codificacions que comencin per ldquoCA_Per baixar a buscar-les utilitzarem les fletxes (amunt-avall) i per acabar clicarem la del costat dret i enter

15

Seleccionarem ldquochange_timezonerdquo per canviar la zona horagraveria de la Raspberry Pi i els temes rela-cionats amb aquesta

A continuacioacute seleccionarem el nostre continent

I per uacuteltim buscarem una ciutat que estigui a la mateixa zona horagraveria que nosaltres i la seleccio-nariacuteem tambeacute amb enter

64 Descarregar i executar ScriptPer descarregar lrsquoscript hem donar permisos i ex-ecutar-lo aixiacute que escriurem les seguumlents ordres en el terminal que podeu trobar a lrsquoescriptori

cd tmpmkdir CodePicd CodePiwget httpwwwtomorrowdevcomcodepiwiringPi-installshchmod +x wiringPi-installshwiringPi-installsh

Ja hem acabat de descarregar el programari que ens permetragrave programar amb la CodePi

16

7 PragravectiquesRecomanacioacute mirar aquests tutorials introduc-toris al llenguatge C httpthenewbostonorglistphpcat=14

Aquiacute teniu un quadre que us serviragrave lrsquoequivalegravencia entre els pins del GPIO i els que haurem de posar en el codi

Ja queda menys perquegrave puguis comenccedilar a pro-gramar perograve abans de fer-ho hauragraves de saber com compilar un programa Probablement ara et preguntaragraves quegrave eacutes compilar doncs compilar eacutes el proceacutes que fa un programa per traduir el codi que nosaltres hem escrit a codi binari amb la fi-nalitat de que el nostre ordinador pugui entendre cada ordre

Per compilar un codi escrit en C farem servir el compilador cc Abans drsquoutilitzar aquest programa haurem drsquoindicar a on hem guardat la nostra pragravec-tica amb lrsquoordre cdcc

-o practica

-Wall

-Iusrlocalinclude

-Lusrlocallib

practicac

-lwiringPi

Primer de tot posarem lrsquoordre al terminal

Utilitzarem el modificador -o per establir quin seragrave el nom del programa de sortida per exemple ldquopragravecticardquo

Amb aquest modificador indicarem que volem que ens doni tota la informacioacute dels errors de sintaxis del fitxer

Amb aquest indicarem on es troben els fitxers de la llibreria a incloure dintre del nostre fitxer

Utilitzant aquest altre modificador establim el di-rectori on ha de buscar els fitxers de la llibreria

Ara indicarem el nom del fitxer on es troba el nos-tre codi sempre acabant amb la terminacioacute c per exemple ldquopragravecticacrdquo

Amb aquest modificador posem la llibreria wiring-Pi a la llista de llibreries que han de ser afegides

17

Al final introduirem tot seguit al terminal una ordre similar a la seguumlent

cc -o practica -Wall -Iusrlocalinclude -Lusrlocallib practicac -lwiringPi

A part de saber compilar abans de comenccedilar a programar i a fer els nostres circuits haurem de saber quins soacuten els pins on haurem de connectar als cables a la Raspberry Pi aquest pins els iden-tificarem utilitzant nuacutemeros

La seguumlent taula ens permet saber lrsquoequivalegravencia entre els nuacutemeros de la GPIO els nuacutemeros de wiringPi la llibreria que interpretaragrave el nostre codi i la posicioacute dels pins

18

Des que la variable i eacutes igual a 1 fins i mentre que aquesta sigui igual o meacutes petita que10 executa el codi

Mentre que la variable D sigui igual a 5 el codi entre claus es llegiragrave infinites vegades

Si la variable X no eacutes meacutes petita que 7 fes una altra cosa

Si la variable X eacutes meacutes petita que 7 fes alguna cosa

70 Iniciacioacute al llenguatge CAbans de comenccedilar a programar cal tenir en compte els conceptes de condicional i de cicle

Els condicionals ldquoif - elserdquo nomeacutes executen el codi a continuacioacute si la condicioacute que li fiquem entre paregraventesis eacutes certa Ho podriacuteem comparar amb el que seria una oracioacute condicional No eacutes obligatori perograve podem afegir la partiacutecula ldquoelserdquo que eacutes lrsquoequivalent a la paraula ldquosi nordquo En el cas a continuacioacute com que el condicional no es compleix srsquoexecutaria lrsquoelse

if (X lt 7) Fes alguna cosa else Fes una altra cosa

Els bucles ldquoforrdquo soacuten rutines que serveixen per ex-ecutar un codi un determinat nuacutemero de vegades Teacute tres parts separades per punt i coma entrada condicioacute i increment A la entrada li donem un va-lor a una variable A la condicioacute determinem que la rutina srsquoexecuti nomeacutes si eacutes compleix la condicioacute utilitzant la variable drsquoentrada Finalment en el in-crement fixem un nou valor a la variable aquesta part srsquoexecutaragrave a cada cicle En llenguatge C si no afegim cap dels tres paragravemetres el bucle seragrave infinit

for (int i = 1 i lt= 10 i++) Fes alguna cosa

La sentegravencia ldquowhilerdquo defineix que un codi srsquoexe-cutaragrave infinitament mentre que la condicioacute que es defineix sigui certa

while (D==5) Fes alguna cosa

19

71 Bloc 1 (Bagravesic)711 Hola moacuten

En aquesta pragravectica escriurem un text a la consograve-la el conegut ldquoHello Worldrdquo

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void) printf(ldquohola moacutenrdquo)

if (wiringPiSetup() == -1) exit (1)

return 0

712 Encendre un LED

Hem drsquoimportar aquestes llibreries per tal que la RaspberryPi entengui el codi

Aquesta eacutes la funcioacute principal (main) i srsquoexecutaragrave tot el que fiquem aquiacute dins

Amb la funcioacute printf() el que aconseguim eacutes que es mostri al terminal el text que hi posem entre comentes

Aquestes liacutenies de codi soacuten simplement compro-vacions per assegurar-nos que tot funciona cor-rectament Soacuten negligibles perograve eacutes recomanable posar-les Les afegirem a totes les pragravectiques

Connectarem la pota llarga (agravenode) del LED al pin 5v de la GPIO i lrsquoaltre pota (cagravetode) a una resistegraven-cia de 180Ω Aquesta distincioacute entre potes es deu a que els LEDs estan polaritzats mireu el glossa-ri per saber-ne meacutes Tot seguit connecteu lrsquoaltra pota de la resistegravencia al pin GROUND

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void)

20

Comprovacionsif (wiringPiSetup() == -1) exit (1)

int pin = 1

printf(ldquoEncenem el pin 18rdquo)

pinMode(pin OUTPUT)

digitalWrite(pin 1)

return 0

713 Encendre i apagar un LED cada dos segons 10 vegades

El que podeu veure aquiacute eacutes el que srsquoanomena un comentari del codi Tot allograve que escrivim despreacutes de ldquordquo el compilador no ho llegiragrave i per tant nomeacutes serveix per donar indicacions al programador

Declarem la variable pin que com eacutes un nombre enter escriurem int

Fem un printf() tal i com hem apregraves a la pragravectica anterior Escrivim el 18 ja que la numeracioacute de la llibreria wiringPi canvia respecte a la sortida real (mirar el cuadre de la pagravegina 17)

Amb la funcioacute pinMode() declarem que el pin nuacutemero 1 en aquest cas sigui un pin de sortida de corrent (OUTPUT)

Una vegada li hem dit que eacutes de sortida li hem de dir si el volem encegraves ldquo1rdquo o apagat ldquo0rdquo amb la funcioacute digitalWrite()

Utilitzarem el muntatge la de pragravectica anterior amb la diferegravencia que en comptes de connectar lrsquoagravenode del LED al pin de 5v el connectarem al pin 18 de la Raspberry Pi Drsquoaquesta manera podrem gestionar el pas de lrsquoelectricitat a traveacutes drsquoun petit programa que crearem a continuacioacute

21

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void) int pin = 1

if (wiringPiSetup() == -1) exit (1)

pinMode(pin OUTPUT)

for (int i=1ilt=10i++)

printf(ldquoLED Onnrdquo) digitalWrite(pin 1)

delay(2000)

printf(ldquoLED Offnrdquo) digitalWrite(pin 0)

delay(2000)

return 0

Utilitzem un bicle ldquoforrdquo per executar el codi 10 vegades

Encenem el LED

Fem un delay() de 2000 milmiddotlisegons (2 segons) que ens serveix per aturar el programa i per tant mantenir el LED encegraves durant aquest temps

Apaguem el LED

El mantenim apagat 2 segons

Lrsquoexpressioacute n serveix per canviar de liacutenia

Proposta Ara que ja saps els conceptes bagravesics de la CodePi intenta fer lrsquoequivalent al codi Morse per demanar ajuda SOS middot middot middot ndash ndash ndash middot middot middot (on cada punt significa LED encegraves durant 14 de segon i cada ralla LED encegraves durant mig segon) Juga amb el valor de la funcioacute delay() per fer que el LED estigui encegraves durant meacutes o menys temps

22

72 Bloc 2 (Mitjagrave)721 Encendre un LED apretant un botoacute

Utilitzar el muntatge del LED que hem fet servir a la pragravectica anterior A meacutes a meacutes hem drsquoafegir 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 aniragrave a parar al pin 23 una resistegravencia de 10KΩ al GROUND per forccedilar lrsquoestat LOW quan el polsador no estagrave apretat

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt int main (void) int pin_LED = 1 int pin_boto = 4 printf (ldquoEncenent un LED apretant un botoacutenrdquo) 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

Declarem el LED com un pin de sortidaI el botoacute com un pin drsquoentrada

Si no fiquem variables al for aquest srsquoexecutaragrave sempre

Amb la funcioacute digitalRead() detectem si passa cor-rent pel pin 8 eacutes a dir si el botoacute ha estat apretat Si eacutes aixiacute fem que srsquoencengui el LED

Si no fem que srsquoapagui

23

722 Encendre un LED apretant tots els puladors

Utilitzar el muntatge de la pragravectica anterior i afegir dos polsadors meacutes amb el mateix proceacutes connec-tats als ports 24 i 25 de la Raspberry Pi

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int main (void) int pin_LED = 1

int pin_boto_A = 4 int pin_boto_B = 5 int 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 ampamp digitalRead(pin_boto_B) == HIGH ampamp digitalRead(pin_boto_C) == HIGH) digitalWrite(pin_LED 1)

Declarem el LED i els tres botons que tal i com posa a lrsquoesquema corresponen als pins 23 24 i 25 de la GPIO

Si els tres polsadors estan premuts passa corrent pels tres i per tant srsquoenceacuten el LED

En aquest cas utilitzem HIGH i LOW en lloc de 1 i 0 respectivament HIGH significa que hi ha elec-tricitat i LOW que no hi ha

24

No apretats while (digitalRead(pin_boto_A) == LOW ampamp digitalRead(pin_boto_B) == LOW ampamp digitalRead(pin_boto_C) == LOW) digitalWrite(pin_LED 0)

Si no apagarsquol

723 Semagravefor amb polsador

En aquesta pragravectica crearem un semagravefor de via-nants i de cotxes Com alguns semagravefors aquests teacute un botoacute amb el qual els vianants demanen que es posi verd aixiacute que el dels cotxes es posa ver-mell

Connectarem dos LEDs (vermell i verd) als pins 18 i 23 de la Raspberry Pi amb una resistegravencia de 180Ω Tambeacute connectarem tres LEDs meacutes (verd vermell i taronja) de la mateixa manera en els ports 17 21 i 22 de la GPIO

A diferegravencia de les altres pragravectiques amb polsa-dors en aquesta el connectarem al port SDA0 i al GROUND ja que nomeacutes ens interessa detectar quan es prem

25

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

define VERMELL 0define GROC1define VERD 2define VERMELL_HOME3define VERD_HOME4

define BOTO 8

void setup (void) int i

if (geteuid () = 0) exit (0)

if (wiringPiSetup () == -1) exit (1)

fflush(stdout) for (i = 0 i lt 5 ++i) pinMode (i OUTPUT) digitalWrite (i 0) digitalWrite(VERD1)digitalWrite(VERMELL_HOME1) pinMode (BOTO INPUT)

printf (ldquoSetup fetnrdquo)

int main (void) setup () for () esperaBoto () aturaTransit () camina () tempsEspera () iniciaTransit ()

Amb lrsquoexpressioacute define li diem a la magravequina que cada cop que escrivim VERMELL en realitat es-tem posant el nombre 0 i el mateix amb les altres paraules

Fem un setup amb tota la configuracioacute necessagraveria

fflush() eacutes una funcioacute complexa que serveix per quumlestions de tractament de memograveria del sistema per evitar errors

Executem totes les funcions una darrera lrsquoaltra de manera indefinida

26

Esperant a que lrsquousuari premi el botoacute per comenccedilar

Fem que el semagravefor dels cotxes canviiuml de verd a vermell passant pel groc

Fem que el semagravefor dels vianants es posi verd

Temps intermig des que srsquoacaba de caminar fins que el trafic comenccedila

void esperaBoto (void) printf (ldquoEsperant el botoacute ldquo)fflush(stdout) while (digitalRead (BOTO) == HIGH) delay (100) printf (ldquoEsoerenrdquo)

void aturaTransit()printf(ldquoAturanteltraficldquo)fflush(stdout)digitalWrite(VERD0) digitalWrite (GROC 1) delay (2000) digitalWrite (GROC 0) digitalWrite(VERMELL1) delay (2000) printf (ldquoAturatsnrdquo)

void camina ()printf(ldquoCaminaldquo)fflush(stdout)

digitalWrite(VERMELL_HOME0)digitalWrite(VERD_HOME1) delay (10000) digitalWrite(VERMELL0) digitalWrite (GROC 1)

printf (ldquoJa han caminatnrdquo)

void tempsEspera () int i

printf (ldquoTemps drsquoespera ldquo) fflush(stdout)

for (i = 0 i lt 8 ++i)

27

delay (500) digitalWrite(VERD_HOME0) digitalWrite (GROC 0) delay (500) digitalWrite(VERD_HOME1) digitalWrite (GROC 1)

void iniciaTransit ()printf(ldquoInicianttraficldquo)fflush(stdout)

digitalWrite(VERD_HOME0)digitalWrite(VERMELL_HOME1) delay (500) digitalWrite (GROC 0) digitalWrite(VERD1)

Deixem via lliure pels vehicles i posem el semagrave-for vermell pels vianants

Proposta Utilitzant el que has apregraves en aquest bloc crear un projecte amb uns quants LEDs en fila que srsquoactivin ascendentment quan apretes un botoacute

28

73 Bloc 3 (Alt)731 Sistema portes logravegiques I

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int AND (int a int b) return a ampamp b

int OR (int a int b) return a || b

int NEGADA (int a) return a

int f(int a int b) return OR(AND(NE-GADA(a)b)AND(aNEGADA(b))) f(a b) = arsquob + abrsquo

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5

int apretat_A = 0 int apretat_B = 0

pinMode(pin_LED_S OUTPUT) pinMode(pin_boto_A INPUT) pinMode(pin_boto_B INPUT)

Crearem una funcioacute per a cada porta logravegica de tal manera que sigui meacutes fagravecil poder-ho aplicar despreacutes

Aquesta seragrave la foacutermula que compliragrave la taula de la veritat en aquest cas eacutes f(a b) = arsquob +abrsquo

Creem dos booleans (variables que poden ser 0 o 1) que ens indicaran si el botoacute ha estat premut o no

Declarem els pins drsquoentrada i de sortida com a totes les pragravectiques anteriors

El seguumlent projecte fa la mateixa funcioacute que acon-seguiriacuteem amb xips de portes logravegiques perograve fent els cagravelculs a partir de la RaspberryPi En aquest cas compleix la taula de la veritat drsquoun OR ex-clusive eacutes a dir nomeacutes srsquoencendragrave el LED quan premem un dels dos botons mai srsquoencendragrave 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 srsquoutilitzin en el codi

29

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) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins estan premuts

Comprovem quins no estan premuts

I apliquem la foacutermula amb els valors drsquoentrada cor-responents Si la foacutermula eacutes igual a 1 srsquoencendragrave el LED si no no srsquoencendragrave

732 Sistema portes logravegiques II

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

Partim de la mateixa base que la pragravectica ante-rior perograve en aquesta incloem una tercera variable drsquoentrada Aixiacute que hem drsquoafegir un nou botoacute en el pin del GPIO que srsquoescau

30

Seguim el patroacute de les foacutermules emprades a la pragravectica anterior

En aquest cas tenim tres variables drsquoentrada perograve la mecagravenica eacutes la mateixa Es pot jugar amb la foacutermula i anar provant diferents combinacions

Necessitem tres variables ja que hi ha tres botons

Declaracions

Comprovem quins estan premuts

int AND (int a int b) return a ampamp b

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 + arsquob

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5 int pin_boto_C = 6

int apretat_A = 0 int apretat_B = 0 int apretat_C = 0

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

31

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

Mostra resultat if (f(apretat_A apretat_B apretat_C) == 1) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins no estan premuts

Com al circuit anterior apliquem la foacutermula i si aquesta doacutena 1 encenem el LED

Proposta Ara que ja has apregraves els conceptes meacutes fonamentals de la CodePi inventarsquot un circuit amb el nivell de dificultat que consideris No et quedis amb el que se trsquoha ensenyat aquiacute sinoacute que cerca meacutes megravetodes que puguis utilitzar La creativitat eacutes bagravesica per a tot bon enginyer i amb aquesta pragravectica volem que demostris de quegrave ets capaccedil

32

8 Vols saber-ne meacutes El moacuten de la programacioacute i lrsquoelectrogravenica eacutes infinit La comunitat geek (= interessada) en aquests te-mes eacutes una de les meacutes servicials i altruista de tota la xarxa aixiacute que es poden trobar una quantitat inacabable de tutorials i pagravegines web especialitza-des en el que vulguem saber

81 Programari lliureEl programari lliure eacutes la base de la informagravetica ac-tual i encara juga un gran paper en algunes agraverees com els servidors web o els mogravebils amb sistema operatiu Android Aquiacute teniu un conjunt de pagravegines on podeu aprofundir sobre aquest apassionant moacuten de la llibertat digital

httpcawikipediaorgwikiRichard_Matthew_Stallmanhttpwwwfsforghttpwwwgnuorghttpwwwlinuxorghttpwwwunixorghttpwwwubuntucom

82 Raspberry PiSi desitges saber meacutes sobre el projecte sense agravenim de lucre Raspberry Pi i seguir fent projectes amb ella visita les pagines que trobaragraves a con-tinuacioacute Aquestes et donaran idees de quegrave fer amb aquest petit perograve fascinant ordinador

httplearnadafruitcomcategorylearn-raspber-ry-pihttpwwwraspberrypiorgwwwraspberrypiorghttpdangerousprototypescom20130202rasp-berry-pi-supercomputerhttpreviewscnetcoukdesktops25-fun-things-to-do-with-a-raspberry-pi-50009851httplearnadafruitcompi-thermal-printer

33

83 Electrogravenica Si lrsquoelectrogravenica bagravesica que has apregraves durant els tutorials de la CodePi trsquoha fet veure que aquest eacutes el moacuten que a tu trsquoagrada no paris A continu-acioacute et deixem pagravegines web on trobaragraves les bases de lrsquoelectrogravenica meacutes complexa i tambeacute molts nous circuits per muntar i seguir descobrint aquest moacuten que avui en dia fa que tots els aparells endollats a al corrent puguin funcionar

httpwwwinstructablescomidBeginners-Elec-tronics-ProjectshttpwwwinstructablescomidElectronic-Proj-ects-For-Beginnershttpwwwcircuitstodaycomsimple-electron-ics-projects-and-circuitshttpswwwsparkfuncomtutorialshttplearnadafruitcom

84 ProgramacioacuteDiuen que per ser un bon programador srsquohan de tenir unes habilitats que no tothom teacute disciplina ordre logravegica creativitat capacitat per resoldre qualsevol problema i per sobre de tot persistegravencia i passioacute Si creus que tens aquestes qualitats do-na-li una oportunitat a la programacioacute A continu-acioacute et deixem un recull de les pagravegines web que creiem que meacutes et poden ajudar a introduir-te una mica meacutes en la programacioacute web i la drsquoapli-cacions per a mogravebils

httpwwwcodeorghttpscratchmiteduhttpwwwcodecademycom

34

9 GlossariC (llenguatge de programacioacute) Des de la seva creacioacute lrsquoany 1972 srsquoha consolidat com un dels llenguatges de programacioacute meacutes utilitzats per fer aplicacions de software Eacutes considerat un dels meacutes bagravesics i meacutes comuns per introduir-se a la pro-gramacioacute Les grans companyies han utilitzat el C com a base per crear altres llenguatges com lrsquoObjective-C (utilitzat per fer les aplicacions per dispositius drsquoApple) o el C (creat per Microsoft i utilitzat entre altres coses per fer programes in-formagravetics per Windows)

Condensador Component electrogravenic classificat dins del grup dels passius i que per tant no emet cap senyal El podriacuteem definir com un acumula-dor drsquoelectrons que els deixa anar quan arriba a la seva capacitat magravexima Hi ha condensadors de dos tipus els electroliacutetics i els normals En les pragravec-tiques utilitzarem electroliacutetics i com que aquests tenen polaritat eacutes important tenir en compte quina eacutes la pota positiva i quina eacutes la negativa a lrsquohora de connectar-lo

Diacuteode Component electrogravenic passiu Teacute polaritat i seria lrsquoequivalent a una vagravelvula antiretorn lrsquoelec-tricitat nomeacutes pot anar en un sentit

Electrogravenica Disciplina que estudia els com-ponents electrogravenics que funcionen amb un flux drsquoelectrons (corrent continua)

Funcioacute Fragment de codi que conte un seguit drsquoaccions i que hi pots accedir cridant la funcioacute en comptes de repetint el codi Podriacuteem comparar-ho amb una funcioacute matemagravetica en la que tenim vari-ables drsquoentrada que tractant-les a la funcioacute ob-tenim una informacioacute de sortida

GPIO Soacuten les sigles de ldquoGeneral Purpose InputOutputrdquo Si mirem la Raspberry Pi soacuten els pins de sortida on hi connectem els cables amb els que programem la placa electrogravenica Lrsquoavantatge drsquoaquest tipus de connector respecte altres eacutes que es pot gestionar mitjanccedilant programacioacute i aixograve eacutes precisament el que explicarem en aquest manual

35

HDMI Soacuten les sigles de ldquoHigh-Definition Multime-dia Interfacerdquo Serveix per enviar viacutedeo i agraveudio a una pantalla Nosaltres lrsquoutilitzarem per connectar la RaspberryPi a una pantalla

LED Acrogravenim de ldquoLight Emitting Dioderdquo Eacutes un tipus de diacuteode el qual teacute una pelmiddotliacutecula de fogravesfor entre els dos connectors que fa que quan passi el corrent generi llum Com qualsevol altre diacuteode eacutes important tenir en compte la polaritat

RAM Acrogravenim de ldquoRandom Access Memoryrdquo Eacutes la part de lrsquoordinador encarregada drsquoemmagatze-mar els arxius temporals

RCA El connector RCA consisteix en diferents cables amb la punta de diferent color que serveix-en per transmetre agraveudio i viacutedeo

ROM De lrsquoanglegraves ldquoRead Only Memoryrdquo eacutes la uni-tat de memograveria on es guarda el sistema operatiu

Resistegravencia Eacutes un component electrogravenic que teacute com a funcioacute reduir el flux drsquoelectrons afi de controlar la seva potegravencia Eacutes molt comuacute a lrsquoelectrogravenica ja que eacutes molt necessari per assegu-rar-nos del correcte funcionament drsquoelements com el LED que sense una resistegravencia que limiteacutes el corrent podrien cremar-se

Placa base Eacutes la part de lrsquoordinador que conteacute elements com la RAM la ROM o el microproces-sador La placa base de lrsquoordinador que constru-irem amb aquest manual seria la progravepia Raspber-ry Pi

Protoboard Tambeacute coneguda com a Bread-board srsquoutilitza per crear circuits electrogravenics sense necessitat de soldar Per saber com funcio-na i com estan relacionats els diferents contactes consulteu aquesta webhttprduinostarcomdocumentaciongeneralpro-toboard-que-es-y-como-funciona

36

Terminal Eacutes el programa emprat per enviar ordres directes a lrsquoordinador i rebre respostes drsquoaquest Nosaltres lrsquoutilitzarem per instalmiddotlar els programes necessaris per programar les plaques electrograveniques i altres arxius necessaris

Variable Valor que canvia segons les operacions que es facin amb aquest al programa informagravetic Com ja sabeu hi ha variables independents (pe el temps) i dependents (pe si estagrave o no encegraves un LED que dependragrave drsquoaltres variables)

37

  • httpwwwfsforg
Page 8: CodePi

8

Un cop les fustes estiguin ben llimades utilitzar els claus per collar les parets Cal prestar atencioacute en la posicioacute dels claus ja que la fusta eacutes molt prima i es poden torccedilar Aquest hauria de ser el resultat final

Seguint el mateix proceacutes clavar la fullola que faragrave de tapa inferior Cal vigilar a on es posen els claus ja que pot ser que es toquin amb els que hem po-sat anteriorment

Agafar les frontisses i clavar-les amb dos claus pe-tits a la fullola que faragrave de tapa superior Despreacutes clavar els dos forats restants a una de les parets aquesta faragrave de part posterior de la CodePi

Recomanacioacute Si volem que la fusta ens duri du-rant meacutes temps eacutes recomanable envernissar la caixa amb un verniacutes per a fustes

9

Per descarregar Raspbian el sistema operatiu que utilitza la CodePi haurem drsquoobrir una nova fi-nestra del navegador i anar a la web de Raspberry Pi httpwwwraspberrypiorg

Eacutes recomanable fer aquest proceacutes al mateix ordi-nador en el que es procediragrave a instalmiddotlar Raspbian a la targeta SD

Recorda que aquest ordinador ha de tenir lector de targetes o un adaptador USB connectatDespreacutes haurem drsquoanar a lrsquoapartat de descagraverreg-ues on trobarem tots els enllaccedilos que necessitem per descarregar el sistema operatiu de la Rasp-berry Pi

5 Afegim un sistema ope- ratiu a la CodePi

51 Descarregar Raspbian

Lrsquouacuteltim pas per descarregar Raspbian eacutes clicar sobre lrsquoenllaccedil on posa Direct Download Es reco-mana realitzar aquest proceacutes en un lloc amb una connexioacute estable i ragravepida ja que srsquoha de descar-regar molta informacioacute

Despreacutes de clicar aquest enllaccedil sersquons obriragrave una nova finestra i automagraveticament Raspbian comenccedilaragrave a descarregar-se La descagraverrega pot trigar entre 5 i 15 minuts depenent de la teva con-nexioacute a internet Ja podem tancar aquesta finestra i continuar cap al pas seguumlent

10

52 Instalmiddotlar RaspbianUna vegada que ja tenim descarregada lrsquouacuteltima versioacute de Raspbian segons el sistema opera-tiu des del que vulguem instalmiddotlar-lo haurem de seguir uns passos diferents per completar la in-stalmiddotlacioacute

Windows

Per instalmiddotlar Raspbian amb Windows haurem de descarregar i instalmiddotlar Win32DiskImager Abans de continuar amb la instalmiddotlacioacute haurem de de-scomprimir el fitxer que ens hem descarregat Per descomprimir-lo utilitzarem un compressor drsquoarxius com (7zip) Clicant amb el botoacute dret so-bre aquest arxiu i clicarem on posa descomprimir aquiacute o buscarem el nom del nostre descompres-sor i despreacutes buscarem aquesta opcioacute

Ara introduirem la targeta de memograveria que vul-guem utilitzar a lrsquoentrada per targetes del nostre ordinador o a lrsquoadaptador corresponent

A continuacioacute iniciarem el programa i clicarem sobre el logo de la carpeta i escollirem el lloc on hem descomprimit el contingut del zip buscarem lrsquoar-xiu amb extensioacute img i acceptarem el diagraveleg Meacutes tard escollirem en quin dispositiu volem in-stalmiddotlar el sistema operatiu aquest eacutes un punt on hem drsquoestar segurs drsquoon estem instalmiddotlant aquests arxius ja que si lrsquoestigueacutessim instalmiddotlant en una destinacioacute diferent podriacuteem perdre totes les dades de lrsquoordinador Per saber a quin dispositiu hem drsquoinstalmiddotlar Raspbian obrirem ldquoEl Meu Ordinadorrdquo i buscarem la targeta de memograveria ens fixarem en quina lletra hi ha al final del nom aquesta seragrave la mateixa que haurem de posar al programaQuan ja haguem inserit aquests dos paragravemetres al programa clicarem sobre el botoacute de Write i es comenccedilara a instalmiddotlar el sistema operatiu

11

Linux

Per instalmiddotlar Raspbian des drsquoun sistema operatiu Linux utilitzarem lrsquoordre 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 homeusu-ari)

Un cop tenim descomprimit el contingut del zip obrirem una sessioacute al terminal i escriurem

cd ~

df -h

umount devsdd1

sudo dd bs=4M if=~2013-02-09-wheezy-raspbianimg of=devsdd

Anirem a la carpeta on hem descomprimit el zip (la de lrsquousuari eacutes per defecte o ~)

Buscarem la targeta sd i el seu nom a la seguumlent llista ens haurem drsquoapuntar el que posi a la prime-ra columna com devsdd (sense el numero) Assegureu-vos que aquest eacutes el dispositiu on vo-leu instalmiddotlar el Raspbian

Abans drsquoinstalmiddotlar Raspbian haurem de des-muntar les particions corresponents a la targeta SD utilitzant lrsquoordre umount en el cas de tenir meacutes drsquouna particioacute haurem drsquoexecutar aquesta ordre meacutes drsquouna vegada

Ara executarem lrsquoordre dd amb permisos drsquoadmi- nistrador al modificador ldquoif=rdquo posarem la carpeta on hem descomprimit el zip (la de lrsquousuari eacutes per defecte o ~) amb el nom del arxiu img descom-primit i al modificador ldquoof=rdquo escriurem el que hem copiat abans amb lrsquoanterior ordre

12

Mac OS X

Per instalmiddotlar Raspbian a Mac OS X tambeacute utilitza-rem lrsquoordre dd pero el funcionament per buscar en quin disc volem instalmiddotlar raspbian eacutes diferent Recomanem extreure el contingut del zip a la car-peta Usersusuari

Comenccedilarem buscant la targeta on volem instalmiddotlar raspbian executant la seguumlent ordre i copiarem el disk4 (sense agafar la particioacute)

Desmuntarem el disk en quumlestioacute

Ara executarem lrsquoordre dd amb permisos drsquoadmi- nistrador al modificador ldquoif=rdquo posarem la carpeta on hem descomprimit el zip (la de lrsquousuari eacutes per defecte o ~) amb el nom de lrsquoarxiu img descom-primit i al modificador ldquoof=rdquo escriurem el que hem copiat abans amb lrsquoanterior ordre

diskutil list

diskutil unmountDisk devdisk4

sudo dd bs=1m if=~2013-02-09-wheezy-raspbianimg of=devsdb

13

6 Primer inici i configuracioacute de la CodePiAra ja estem preparats per posar la targeta SD a la Raspberry Pi i connectar tots els cables per comenccedilar a programar A continuacioacute hem de se-guir uns passos que nomeacutes podrem fer durant la primera arrencada del sistema i que ens perme-tran iniciar lrsquoescriptori automagraveticament posar la CodePi en catalagrave i configurar la disposicioacute del te-clat entre drsquoaltres coses

Quan iniciem per primera vegada la Raspberry Pi amb el sistema operatiu Raspbian ens apareixeragrave la seguumlent pantalla on ens mourem utilitzant les fletxes i la tecla intro

La primera cosa que seleccionarem seragrave ldquoboot_behaviorrdquo que ens permetragrave inciar lrsquoescriptori quan el sistema iniciiuml

Ens mourem amb el teclat (dreta - esquerre) per fer que estigui seleccionat ldquoyesrdquo clicarem enter

14

Ara a continuacioacute ens mourem fins a ldquoexpand_rootfsrdquo que ens permetragrave expandir el tamany de la particioacute arrel de la Raspberry Pi al tamany magravex-im de la targeta SD eacutes a dir si tenim una targeta de 4 Gb si no fessim aquesta opcioacute estariacuteem util-itzant uacutenicament 2 Gb de capacitat

Acceptarem el seguumlent diagraveleg i passarem a con-figurar els idiomes

Buscarem ldquochange_localerdquo per canviar els idio-mes i la disposicioacute del teclat al catalagrave

De la seguumlent llista seleccionarem mitjanccedilant lrsquoes-pai del teclat totes les codificacions que comencin per ldquoCA_Per baixar a buscar-les utilitzarem les fletxes (amunt-avall) i per acabar clicarem la del costat dret i enter

15

Seleccionarem ldquochange_timezonerdquo per canviar la zona horagraveria de la Raspberry Pi i els temes rela-cionats amb aquesta

A continuacioacute seleccionarem el nostre continent

I per uacuteltim buscarem una ciutat que estigui a la mateixa zona horagraveria que nosaltres i la seleccio-nariacuteem tambeacute amb enter

64 Descarregar i executar ScriptPer descarregar lrsquoscript hem donar permisos i ex-ecutar-lo aixiacute que escriurem les seguumlents ordres en el terminal que podeu trobar a lrsquoescriptori

cd tmpmkdir CodePicd CodePiwget httpwwwtomorrowdevcomcodepiwiringPi-installshchmod +x wiringPi-installshwiringPi-installsh

Ja hem acabat de descarregar el programari que ens permetragrave programar amb la CodePi

16

7 PragravectiquesRecomanacioacute mirar aquests tutorials introduc-toris al llenguatge C httpthenewbostonorglistphpcat=14

Aquiacute teniu un quadre que us serviragrave lrsquoequivalegravencia entre els pins del GPIO i els que haurem de posar en el codi

Ja queda menys perquegrave puguis comenccedilar a pro-gramar perograve abans de fer-ho hauragraves de saber com compilar un programa Probablement ara et preguntaragraves quegrave eacutes compilar doncs compilar eacutes el proceacutes que fa un programa per traduir el codi que nosaltres hem escrit a codi binari amb la fi-nalitat de que el nostre ordinador pugui entendre cada ordre

Per compilar un codi escrit en C farem servir el compilador cc Abans drsquoutilitzar aquest programa haurem drsquoindicar a on hem guardat la nostra pragravec-tica amb lrsquoordre cdcc

-o practica

-Wall

-Iusrlocalinclude

-Lusrlocallib

practicac

-lwiringPi

Primer de tot posarem lrsquoordre al terminal

Utilitzarem el modificador -o per establir quin seragrave el nom del programa de sortida per exemple ldquopragravecticardquo

Amb aquest modificador indicarem que volem que ens doni tota la informacioacute dels errors de sintaxis del fitxer

Amb aquest indicarem on es troben els fitxers de la llibreria a incloure dintre del nostre fitxer

Utilitzant aquest altre modificador establim el di-rectori on ha de buscar els fitxers de la llibreria

Ara indicarem el nom del fitxer on es troba el nos-tre codi sempre acabant amb la terminacioacute c per exemple ldquopragravecticacrdquo

Amb aquest modificador posem la llibreria wiring-Pi a la llista de llibreries que han de ser afegides

17

Al final introduirem tot seguit al terminal una ordre similar a la seguumlent

cc -o practica -Wall -Iusrlocalinclude -Lusrlocallib practicac -lwiringPi

A part de saber compilar abans de comenccedilar a programar i a fer els nostres circuits haurem de saber quins soacuten els pins on haurem de connectar als cables a la Raspberry Pi aquest pins els iden-tificarem utilitzant nuacutemeros

La seguumlent taula ens permet saber lrsquoequivalegravencia entre els nuacutemeros de la GPIO els nuacutemeros de wiringPi la llibreria que interpretaragrave el nostre codi i la posicioacute dels pins

18

Des que la variable i eacutes igual a 1 fins i mentre que aquesta sigui igual o meacutes petita que10 executa el codi

Mentre que la variable D sigui igual a 5 el codi entre claus es llegiragrave infinites vegades

Si la variable X no eacutes meacutes petita que 7 fes una altra cosa

Si la variable X eacutes meacutes petita que 7 fes alguna cosa

70 Iniciacioacute al llenguatge CAbans de comenccedilar a programar cal tenir en compte els conceptes de condicional i de cicle

Els condicionals ldquoif - elserdquo nomeacutes executen el codi a continuacioacute si la condicioacute que li fiquem entre paregraventesis eacutes certa Ho podriacuteem comparar amb el que seria una oracioacute condicional No eacutes obligatori perograve podem afegir la partiacutecula ldquoelserdquo que eacutes lrsquoequivalent a la paraula ldquosi nordquo En el cas a continuacioacute com que el condicional no es compleix srsquoexecutaria lrsquoelse

if (X lt 7) Fes alguna cosa else Fes una altra cosa

Els bucles ldquoforrdquo soacuten rutines que serveixen per ex-ecutar un codi un determinat nuacutemero de vegades Teacute tres parts separades per punt i coma entrada condicioacute i increment A la entrada li donem un va-lor a una variable A la condicioacute determinem que la rutina srsquoexecuti nomeacutes si eacutes compleix la condicioacute utilitzant la variable drsquoentrada Finalment en el in-crement fixem un nou valor a la variable aquesta part srsquoexecutaragrave a cada cicle En llenguatge C si no afegim cap dels tres paragravemetres el bucle seragrave infinit

for (int i = 1 i lt= 10 i++) Fes alguna cosa

La sentegravencia ldquowhilerdquo defineix que un codi srsquoexe-cutaragrave infinitament mentre que la condicioacute que es defineix sigui certa

while (D==5) Fes alguna cosa

19

71 Bloc 1 (Bagravesic)711 Hola moacuten

En aquesta pragravectica escriurem un text a la consograve-la el conegut ldquoHello Worldrdquo

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void) printf(ldquohola moacutenrdquo)

if (wiringPiSetup() == -1) exit (1)

return 0

712 Encendre un LED

Hem drsquoimportar aquestes llibreries per tal que la RaspberryPi entengui el codi

Aquesta eacutes la funcioacute principal (main) i srsquoexecutaragrave tot el que fiquem aquiacute dins

Amb la funcioacute printf() el que aconseguim eacutes que es mostri al terminal el text que hi posem entre comentes

Aquestes liacutenies de codi soacuten simplement compro-vacions per assegurar-nos que tot funciona cor-rectament Soacuten negligibles perograve eacutes recomanable posar-les Les afegirem a totes les pragravectiques

Connectarem la pota llarga (agravenode) del LED al pin 5v de la GPIO i lrsquoaltre pota (cagravetode) a una resistegraven-cia de 180Ω Aquesta distincioacute entre potes es deu a que els LEDs estan polaritzats mireu el glossa-ri per saber-ne meacutes Tot seguit connecteu lrsquoaltra pota de la resistegravencia al pin GROUND

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void)

20

Comprovacionsif (wiringPiSetup() == -1) exit (1)

int pin = 1

printf(ldquoEncenem el pin 18rdquo)

pinMode(pin OUTPUT)

digitalWrite(pin 1)

return 0

713 Encendre i apagar un LED cada dos segons 10 vegades

El que podeu veure aquiacute eacutes el que srsquoanomena un comentari del codi Tot allograve que escrivim despreacutes de ldquordquo el compilador no ho llegiragrave i per tant nomeacutes serveix per donar indicacions al programador

Declarem la variable pin que com eacutes un nombre enter escriurem int

Fem un printf() tal i com hem apregraves a la pragravectica anterior Escrivim el 18 ja que la numeracioacute de la llibreria wiringPi canvia respecte a la sortida real (mirar el cuadre de la pagravegina 17)

Amb la funcioacute pinMode() declarem que el pin nuacutemero 1 en aquest cas sigui un pin de sortida de corrent (OUTPUT)

Una vegada li hem dit que eacutes de sortida li hem de dir si el volem encegraves ldquo1rdquo o apagat ldquo0rdquo amb la funcioacute digitalWrite()

Utilitzarem el muntatge la de pragravectica anterior amb la diferegravencia que en comptes de connectar lrsquoagravenode del LED al pin de 5v el connectarem al pin 18 de la Raspberry Pi Drsquoaquesta manera podrem gestionar el pas de lrsquoelectricitat a traveacutes drsquoun petit programa que crearem a continuacioacute

21

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void) int pin = 1

if (wiringPiSetup() == -1) exit (1)

pinMode(pin OUTPUT)

for (int i=1ilt=10i++)

printf(ldquoLED Onnrdquo) digitalWrite(pin 1)

delay(2000)

printf(ldquoLED Offnrdquo) digitalWrite(pin 0)

delay(2000)

return 0

Utilitzem un bicle ldquoforrdquo per executar el codi 10 vegades

Encenem el LED

Fem un delay() de 2000 milmiddotlisegons (2 segons) que ens serveix per aturar el programa i per tant mantenir el LED encegraves durant aquest temps

Apaguem el LED

El mantenim apagat 2 segons

Lrsquoexpressioacute n serveix per canviar de liacutenia

Proposta Ara que ja saps els conceptes bagravesics de la CodePi intenta fer lrsquoequivalent al codi Morse per demanar ajuda SOS middot middot middot ndash ndash ndash middot middot middot (on cada punt significa LED encegraves durant 14 de segon i cada ralla LED encegraves durant mig segon) Juga amb el valor de la funcioacute delay() per fer que el LED estigui encegraves durant meacutes o menys temps

22

72 Bloc 2 (Mitjagrave)721 Encendre un LED apretant un botoacute

Utilitzar el muntatge del LED que hem fet servir a la pragravectica anterior A meacutes a meacutes hem drsquoafegir 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 aniragrave a parar al pin 23 una resistegravencia de 10KΩ al GROUND per forccedilar lrsquoestat LOW quan el polsador no estagrave apretat

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt int main (void) int pin_LED = 1 int pin_boto = 4 printf (ldquoEncenent un LED apretant un botoacutenrdquo) 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

Declarem el LED com un pin de sortidaI el botoacute com un pin drsquoentrada

Si no fiquem variables al for aquest srsquoexecutaragrave sempre

Amb la funcioacute digitalRead() detectem si passa cor-rent pel pin 8 eacutes a dir si el botoacute ha estat apretat Si eacutes aixiacute fem que srsquoencengui el LED

Si no fem que srsquoapagui

23

722 Encendre un LED apretant tots els puladors

Utilitzar el muntatge de la pragravectica anterior i afegir dos polsadors meacutes amb el mateix proceacutes connec-tats als ports 24 i 25 de la Raspberry Pi

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int main (void) int pin_LED = 1

int pin_boto_A = 4 int pin_boto_B = 5 int 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 ampamp digitalRead(pin_boto_B) == HIGH ampamp digitalRead(pin_boto_C) == HIGH) digitalWrite(pin_LED 1)

Declarem el LED i els tres botons que tal i com posa a lrsquoesquema corresponen als pins 23 24 i 25 de la GPIO

Si els tres polsadors estan premuts passa corrent pels tres i per tant srsquoenceacuten el LED

En aquest cas utilitzem HIGH i LOW en lloc de 1 i 0 respectivament HIGH significa que hi ha elec-tricitat i LOW que no hi ha

24

No apretats while (digitalRead(pin_boto_A) == LOW ampamp digitalRead(pin_boto_B) == LOW ampamp digitalRead(pin_boto_C) == LOW) digitalWrite(pin_LED 0)

Si no apagarsquol

723 Semagravefor amb polsador

En aquesta pragravectica crearem un semagravefor de via-nants i de cotxes Com alguns semagravefors aquests teacute un botoacute amb el qual els vianants demanen que es posi verd aixiacute que el dels cotxes es posa ver-mell

Connectarem dos LEDs (vermell i verd) als pins 18 i 23 de la Raspberry Pi amb una resistegravencia de 180Ω Tambeacute connectarem tres LEDs meacutes (verd vermell i taronja) de la mateixa manera en els ports 17 21 i 22 de la GPIO

A diferegravencia de les altres pragravectiques amb polsa-dors en aquesta el connectarem al port SDA0 i al GROUND ja que nomeacutes ens interessa detectar quan es prem

25

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

define VERMELL 0define GROC1define VERD 2define VERMELL_HOME3define VERD_HOME4

define BOTO 8

void setup (void) int i

if (geteuid () = 0) exit (0)

if (wiringPiSetup () == -1) exit (1)

fflush(stdout) for (i = 0 i lt 5 ++i) pinMode (i OUTPUT) digitalWrite (i 0) digitalWrite(VERD1)digitalWrite(VERMELL_HOME1) pinMode (BOTO INPUT)

printf (ldquoSetup fetnrdquo)

int main (void) setup () for () esperaBoto () aturaTransit () camina () tempsEspera () iniciaTransit ()

Amb lrsquoexpressioacute define li diem a la magravequina que cada cop que escrivim VERMELL en realitat es-tem posant el nombre 0 i el mateix amb les altres paraules

Fem un setup amb tota la configuracioacute necessagraveria

fflush() eacutes una funcioacute complexa que serveix per quumlestions de tractament de memograveria del sistema per evitar errors

Executem totes les funcions una darrera lrsquoaltra de manera indefinida

26

Esperant a que lrsquousuari premi el botoacute per comenccedilar

Fem que el semagravefor dels cotxes canviiuml de verd a vermell passant pel groc

Fem que el semagravefor dels vianants es posi verd

Temps intermig des que srsquoacaba de caminar fins que el trafic comenccedila

void esperaBoto (void) printf (ldquoEsperant el botoacute ldquo)fflush(stdout) while (digitalRead (BOTO) == HIGH) delay (100) printf (ldquoEsoerenrdquo)

void aturaTransit()printf(ldquoAturanteltraficldquo)fflush(stdout)digitalWrite(VERD0) digitalWrite (GROC 1) delay (2000) digitalWrite (GROC 0) digitalWrite(VERMELL1) delay (2000) printf (ldquoAturatsnrdquo)

void camina ()printf(ldquoCaminaldquo)fflush(stdout)

digitalWrite(VERMELL_HOME0)digitalWrite(VERD_HOME1) delay (10000) digitalWrite(VERMELL0) digitalWrite (GROC 1)

printf (ldquoJa han caminatnrdquo)

void tempsEspera () int i

printf (ldquoTemps drsquoespera ldquo) fflush(stdout)

for (i = 0 i lt 8 ++i)

27

delay (500) digitalWrite(VERD_HOME0) digitalWrite (GROC 0) delay (500) digitalWrite(VERD_HOME1) digitalWrite (GROC 1)

void iniciaTransit ()printf(ldquoInicianttraficldquo)fflush(stdout)

digitalWrite(VERD_HOME0)digitalWrite(VERMELL_HOME1) delay (500) digitalWrite (GROC 0) digitalWrite(VERD1)

Deixem via lliure pels vehicles i posem el semagrave-for vermell pels vianants

Proposta Utilitzant el que has apregraves en aquest bloc crear un projecte amb uns quants LEDs en fila que srsquoactivin ascendentment quan apretes un botoacute

28

73 Bloc 3 (Alt)731 Sistema portes logravegiques I

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int AND (int a int b) return a ampamp b

int OR (int a int b) return a || b

int NEGADA (int a) return a

int f(int a int b) return OR(AND(NE-GADA(a)b)AND(aNEGADA(b))) f(a b) = arsquob + abrsquo

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5

int apretat_A = 0 int apretat_B = 0

pinMode(pin_LED_S OUTPUT) pinMode(pin_boto_A INPUT) pinMode(pin_boto_B INPUT)

Crearem una funcioacute per a cada porta logravegica de tal manera que sigui meacutes fagravecil poder-ho aplicar despreacutes

Aquesta seragrave la foacutermula que compliragrave la taula de la veritat en aquest cas eacutes f(a b) = arsquob +abrsquo

Creem dos booleans (variables que poden ser 0 o 1) que ens indicaran si el botoacute ha estat premut o no

Declarem els pins drsquoentrada i de sortida com a totes les pragravectiques anteriors

El seguumlent projecte fa la mateixa funcioacute que acon-seguiriacuteem amb xips de portes logravegiques perograve fent els cagravelculs a partir de la RaspberryPi En aquest cas compleix la taula de la veritat drsquoun OR ex-clusive eacutes a dir nomeacutes srsquoencendragrave el LED quan premem un dels dos botons mai srsquoencendragrave 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 srsquoutilitzin en el codi

29

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) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins estan premuts

Comprovem quins no estan premuts

I apliquem la foacutermula amb els valors drsquoentrada cor-responents Si la foacutermula eacutes igual a 1 srsquoencendragrave el LED si no no srsquoencendragrave

732 Sistema portes logravegiques II

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

Partim de la mateixa base que la pragravectica ante-rior perograve en aquesta incloem una tercera variable drsquoentrada Aixiacute que hem drsquoafegir un nou botoacute en el pin del GPIO que srsquoescau

30

Seguim el patroacute de les foacutermules emprades a la pragravectica anterior

En aquest cas tenim tres variables drsquoentrada perograve la mecagravenica eacutes la mateixa Es pot jugar amb la foacutermula i anar provant diferents combinacions

Necessitem tres variables ja que hi ha tres botons

Declaracions

Comprovem quins estan premuts

int AND (int a int b) return a ampamp b

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 + arsquob

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5 int pin_boto_C = 6

int apretat_A = 0 int apretat_B = 0 int apretat_C = 0

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

31

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

Mostra resultat if (f(apretat_A apretat_B apretat_C) == 1) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins no estan premuts

Com al circuit anterior apliquem la foacutermula i si aquesta doacutena 1 encenem el LED

Proposta Ara que ja has apregraves els conceptes meacutes fonamentals de la CodePi inventarsquot un circuit amb el nivell de dificultat que consideris No et quedis amb el que se trsquoha ensenyat aquiacute sinoacute que cerca meacutes megravetodes que puguis utilitzar La creativitat eacutes bagravesica per a tot bon enginyer i amb aquesta pragravectica volem que demostris de quegrave ets capaccedil

32

8 Vols saber-ne meacutes El moacuten de la programacioacute i lrsquoelectrogravenica eacutes infinit La comunitat geek (= interessada) en aquests te-mes eacutes una de les meacutes servicials i altruista de tota la xarxa aixiacute que es poden trobar una quantitat inacabable de tutorials i pagravegines web especialitza-des en el que vulguem saber

81 Programari lliureEl programari lliure eacutes la base de la informagravetica ac-tual i encara juga un gran paper en algunes agraverees com els servidors web o els mogravebils amb sistema operatiu Android Aquiacute teniu un conjunt de pagravegines on podeu aprofundir sobre aquest apassionant moacuten de la llibertat digital

httpcawikipediaorgwikiRichard_Matthew_Stallmanhttpwwwfsforghttpwwwgnuorghttpwwwlinuxorghttpwwwunixorghttpwwwubuntucom

82 Raspberry PiSi desitges saber meacutes sobre el projecte sense agravenim de lucre Raspberry Pi i seguir fent projectes amb ella visita les pagines que trobaragraves a con-tinuacioacute Aquestes et donaran idees de quegrave fer amb aquest petit perograve fascinant ordinador

httplearnadafruitcomcategorylearn-raspber-ry-pihttpwwwraspberrypiorgwwwraspberrypiorghttpdangerousprototypescom20130202rasp-berry-pi-supercomputerhttpreviewscnetcoukdesktops25-fun-things-to-do-with-a-raspberry-pi-50009851httplearnadafruitcompi-thermal-printer

33

83 Electrogravenica Si lrsquoelectrogravenica bagravesica que has apregraves durant els tutorials de la CodePi trsquoha fet veure que aquest eacutes el moacuten que a tu trsquoagrada no paris A continu-acioacute et deixem pagravegines web on trobaragraves les bases de lrsquoelectrogravenica meacutes complexa i tambeacute molts nous circuits per muntar i seguir descobrint aquest moacuten que avui en dia fa que tots els aparells endollats a al corrent puguin funcionar

httpwwwinstructablescomidBeginners-Elec-tronics-ProjectshttpwwwinstructablescomidElectronic-Proj-ects-For-Beginnershttpwwwcircuitstodaycomsimple-electron-ics-projects-and-circuitshttpswwwsparkfuncomtutorialshttplearnadafruitcom

84 ProgramacioacuteDiuen que per ser un bon programador srsquohan de tenir unes habilitats que no tothom teacute disciplina ordre logravegica creativitat capacitat per resoldre qualsevol problema i per sobre de tot persistegravencia i passioacute Si creus que tens aquestes qualitats do-na-li una oportunitat a la programacioacute A continu-acioacute et deixem un recull de les pagravegines web que creiem que meacutes et poden ajudar a introduir-te una mica meacutes en la programacioacute web i la drsquoapli-cacions per a mogravebils

httpwwwcodeorghttpscratchmiteduhttpwwwcodecademycom

34

9 GlossariC (llenguatge de programacioacute) Des de la seva creacioacute lrsquoany 1972 srsquoha consolidat com un dels llenguatges de programacioacute meacutes utilitzats per fer aplicacions de software Eacutes considerat un dels meacutes bagravesics i meacutes comuns per introduir-se a la pro-gramacioacute Les grans companyies han utilitzat el C com a base per crear altres llenguatges com lrsquoObjective-C (utilitzat per fer les aplicacions per dispositius drsquoApple) o el C (creat per Microsoft i utilitzat entre altres coses per fer programes in-formagravetics per Windows)

Condensador Component electrogravenic classificat dins del grup dels passius i que per tant no emet cap senyal El podriacuteem definir com un acumula-dor drsquoelectrons que els deixa anar quan arriba a la seva capacitat magravexima Hi ha condensadors de dos tipus els electroliacutetics i els normals En les pragravec-tiques utilitzarem electroliacutetics i com que aquests tenen polaritat eacutes important tenir en compte quina eacutes la pota positiva i quina eacutes la negativa a lrsquohora de connectar-lo

Diacuteode Component electrogravenic passiu Teacute polaritat i seria lrsquoequivalent a una vagravelvula antiretorn lrsquoelec-tricitat nomeacutes pot anar en un sentit

Electrogravenica Disciplina que estudia els com-ponents electrogravenics que funcionen amb un flux drsquoelectrons (corrent continua)

Funcioacute Fragment de codi que conte un seguit drsquoaccions i que hi pots accedir cridant la funcioacute en comptes de repetint el codi Podriacuteem comparar-ho amb una funcioacute matemagravetica en la que tenim vari-ables drsquoentrada que tractant-les a la funcioacute ob-tenim una informacioacute de sortida

GPIO Soacuten les sigles de ldquoGeneral Purpose InputOutputrdquo Si mirem la Raspberry Pi soacuten els pins de sortida on hi connectem els cables amb els que programem la placa electrogravenica Lrsquoavantatge drsquoaquest tipus de connector respecte altres eacutes que es pot gestionar mitjanccedilant programacioacute i aixograve eacutes precisament el que explicarem en aquest manual

35

HDMI Soacuten les sigles de ldquoHigh-Definition Multime-dia Interfacerdquo Serveix per enviar viacutedeo i agraveudio a una pantalla Nosaltres lrsquoutilitzarem per connectar la RaspberryPi a una pantalla

LED Acrogravenim de ldquoLight Emitting Dioderdquo Eacutes un tipus de diacuteode el qual teacute una pelmiddotliacutecula de fogravesfor entre els dos connectors que fa que quan passi el corrent generi llum Com qualsevol altre diacuteode eacutes important tenir en compte la polaritat

RAM Acrogravenim de ldquoRandom Access Memoryrdquo Eacutes la part de lrsquoordinador encarregada drsquoemmagatze-mar els arxius temporals

RCA El connector RCA consisteix en diferents cables amb la punta de diferent color que serveix-en per transmetre agraveudio i viacutedeo

ROM De lrsquoanglegraves ldquoRead Only Memoryrdquo eacutes la uni-tat de memograveria on es guarda el sistema operatiu

Resistegravencia Eacutes un component electrogravenic que teacute com a funcioacute reduir el flux drsquoelectrons afi de controlar la seva potegravencia Eacutes molt comuacute a lrsquoelectrogravenica ja que eacutes molt necessari per assegu-rar-nos del correcte funcionament drsquoelements com el LED que sense una resistegravencia que limiteacutes el corrent podrien cremar-se

Placa base Eacutes la part de lrsquoordinador que conteacute elements com la RAM la ROM o el microproces-sador La placa base de lrsquoordinador que constru-irem amb aquest manual seria la progravepia Raspber-ry Pi

Protoboard Tambeacute coneguda com a Bread-board srsquoutilitza per crear circuits electrogravenics sense necessitat de soldar Per saber com funcio-na i com estan relacionats els diferents contactes consulteu aquesta webhttprduinostarcomdocumentaciongeneralpro-toboard-que-es-y-como-funciona

36

Terminal Eacutes el programa emprat per enviar ordres directes a lrsquoordinador i rebre respostes drsquoaquest Nosaltres lrsquoutilitzarem per instalmiddotlar els programes necessaris per programar les plaques electrograveniques i altres arxius necessaris

Variable Valor que canvia segons les operacions que es facin amb aquest al programa informagravetic Com ja sabeu hi ha variables independents (pe el temps) i dependents (pe si estagrave o no encegraves un LED que dependragrave drsquoaltres variables)

37

  • httpwwwfsforg
Page 9: CodePi

9

Per descarregar Raspbian el sistema operatiu que utilitza la CodePi haurem drsquoobrir una nova fi-nestra del navegador i anar a la web de Raspberry Pi httpwwwraspberrypiorg

Eacutes recomanable fer aquest proceacutes al mateix ordi-nador en el que es procediragrave a instalmiddotlar Raspbian a la targeta SD

Recorda que aquest ordinador ha de tenir lector de targetes o un adaptador USB connectatDespreacutes haurem drsquoanar a lrsquoapartat de descagraverreg-ues on trobarem tots els enllaccedilos que necessitem per descarregar el sistema operatiu de la Rasp-berry Pi

5 Afegim un sistema ope- ratiu a la CodePi

51 Descarregar Raspbian

Lrsquouacuteltim pas per descarregar Raspbian eacutes clicar sobre lrsquoenllaccedil on posa Direct Download Es reco-mana realitzar aquest proceacutes en un lloc amb una connexioacute estable i ragravepida ja que srsquoha de descar-regar molta informacioacute

Despreacutes de clicar aquest enllaccedil sersquons obriragrave una nova finestra i automagraveticament Raspbian comenccedilaragrave a descarregar-se La descagraverrega pot trigar entre 5 i 15 minuts depenent de la teva con-nexioacute a internet Ja podem tancar aquesta finestra i continuar cap al pas seguumlent

10

52 Instalmiddotlar RaspbianUna vegada que ja tenim descarregada lrsquouacuteltima versioacute de Raspbian segons el sistema opera-tiu des del que vulguem instalmiddotlar-lo haurem de seguir uns passos diferents per completar la in-stalmiddotlacioacute

Windows

Per instalmiddotlar Raspbian amb Windows haurem de descarregar i instalmiddotlar Win32DiskImager Abans de continuar amb la instalmiddotlacioacute haurem de de-scomprimir el fitxer que ens hem descarregat Per descomprimir-lo utilitzarem un compressor drsquoarxius com (7zip) Clicant amb el botoacute dret so-bre aquest arxiu i clicarem on posa descomprimir aquiacute o buscarem el nom del nostre descompres-sor i despreacutes buscarem aquesta opcioacute

Ara introduirem la targeta de memograveria que vul-guem utilitzar a lrsquoentrada per targetes del nostre ordinador o a lrsquoadaptador corresponent

A continuacioacute iniciarem el programa i clicarem sobre el logo de la carpeta i escollirem el lloc on hem descomprimit el contingut del zip buscarem lrsquoar-xiu amb extensioacute img i acceptarem el diagraveleg Meacutes tard escollirem en quin dispositiu volem in-stalmiddotlar el sistema operatiu aquest eacutes un punt on hem drsquoestar segurs drsquoon estem instalmiddotlant aquests arxius ja que si lrsquoestigueacutessim instalmiddotlant en una destinacioacute diferent podriacuteem perdre totes les dades de lrsquoordinador Per saber a quin dispositiu hem drsquoinstalmiddotlar Raspbian obrirem ldquoEl Meu Ordinadorrdquo i buscarem la targeta de memograveria ens fixarem en quina lletra hi ha al final del nom aquesta seragrave la mateixa que haurem de posar al programaQuan ja haguem inserit aquests dos paragravemetres al programa clicarem sobre el botoacute de Write i es comenccedilara a instalmiddotlar el sistema operatiu

11

Linux

Per instalmiddotlar Raspbian des drsquoun sistema operatiu Linux utilitzarem lrsquoordre 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 homeusu-ari)

Un cop tenim descomprimit el contingut del zip obrirem una sessioacute al terminal i escriurem

cd ~

df -h

umount devsdd1

sudo dd bs=4M if=~2013-02-09-wheezy-raspbianimg of=devsdd

Anirem a la carpeta on hem descomprimit el zip (la de lrsquousuari eacutes per defecte o ~)

Buscarem la targeta sd i el seu nom a la seguumlent llista ens haurem drsquoapuntar el que posi a la prime-ra columna com devsdd (sense el numero) Assegureu-vos que aquest eacutes el dispositiu on vo-leu instalmiddotlar el Raspbian

Abans drsquoinstalmiddotlar Raspbian haurem de des-muntar les particions corresponents a la targeta SD utilitzant lrsquoordre umount en el cas de tenir meacutes drsquouna particioacute haurem drsquoexecutar aquesta ordre meacutes drsquouna vegada

Ara executarem lrsquoordre dd amb permisos drsquoadmi- nistrador al modificador ldquoif=rdquo posarem la carpeta on hem descomprimit el zip (la de lrsquousuari eacutes per defecte o ~) amb el nom del arxiu img descom-primit i al modificador ldquoof=rdquo escriurem el que hem copiat abans amb lrsquoanterior ordre

12

Mac OS X

Per instalmiddotlar Raspbian a Mac OS X tambeacute utilitza-rem lrsquoordre dd pero el funcionament per buscar en quin disc volem instalmiddotlar raspbian eacutes diferent Recomanem extreure el contingut del zip a la car-peta Usersusuari

Comenccedilarem buscant la targeta on volem instalmiddotlar raspbian executant la seguumlent ordre i copiarem el disk4 (sense agafar la particioacute)

Desmuntarem el disk en quumlestioacute

Ara executarem lrsquoordre dd amb permisos drsquoadmi- nistrador al modificador ldquoif=rdquo posarem la carpeta on hem descomprimit el zip (la de lrsquousuari eacutes per defecte o ~) amb el nom de lrsquoarxiu img descom-primit i al modificador ldquoof=rdquo escriurem el que hem copiat abans amb lrsquoanterior ordre

diskutil list

diskutil unmountDisk devdisk4

sudo dd bs=1m if=~2013-02-09-wheezy-raspbianimg of=devsdb

13

6 Primer inici i configuracioacute de la CodePiAra ja estem preparats per posar la targeta SD a la Raspberry Pi i connectar tots els cables per comenccedilar a programar A continuacioacute hem de se-guir uns passos que nomeacutes podrem fer durant la primera arrencada del sistema i que ens perme-tran iniciar lrsquoescriptori automagraveticament posar la CodePi en catalagrave i configurar la disposicioacute del te-clat entre drsquoaltres coses

Quan iniciem per primera vegada la Raspberry Pi amb el sistema operatiu Raspbian ens apareixeragrave la seguumlent pantalla on ens mourem utilitzant les fletxes i la tecla intro

La primera cosa que seleccionarem seragrave ldquoboot_behaviorrdquo que ens permetragrave inciar lrsquoescriptori quan el sistema iniciiuml

Ens mourem amb el teclat (dreta - esquerre) per fer que estigui seleccionat ldquoyesrdquo clicarem enter

14

Ara a continuacioacute ens mourem fins a ldquoexpand_rootfsrdquo que ens permetragrave expandir el tamany de la particioacute arrel de la Raspberry Pi al tamany magravex-im de la targeta SD eacutes a dir si tenim una targeta de 4 Gb si no fessim aquesta opcioacute estariacuteem util-itzant uacutenicament 2 Gb de capacitat

Acceptarem el seguumlent diagraveleg i passarem a con-figurar els idiomes

Buscarem ldquochange_localerdquo per canviar els idio-mes i la disposicioacute del teclat al catalagrave

De la seguumlent llista seleccionarem mitjanccedilant lrsquoes-pai del teclat totes les codificacions que comencin per ldquoCA_Per baixar a buscar-les utilitzarem les fletxes (amunt-avall) i per acabar clicarem la del costat dret i enter

15

Seleccionarem ldquochange_timezonerdquo per canviar la zona horagraveria de la Raspberry Pi i els temes rela-cionats amb aquesta

A continuacioacute seleccionarem el nostre continent

I per uacuteltim buscarem una ciutat que estigui a la mateixa zona horagraveria que nosaltres i la seleccio-nariacuteem tambeacute amb enter

64 Descarregar i executar ScriptPer descarregar lrsquoscript hem donar permisos i ex-ecutar-lo aixiacute que escriurem les seguumlents ordres en el terminal que podeu trobar a lrsquoescriptori

cd tmpmkdir CodePicd CodePiwget httpwwwtomorrowdevcomcodepiwiringPi-installshchmod +x wiringPi-installshwiringPi-installsh

Ja hem acabat de descarregar el programari que ens permetragrave programar amb la CodePi

16

7 PragravectiquesRecomanacioacute mirar aquests tutorials introduc-toris al llenguatge C httpthenewbostonorglistphpcat=14

Aquiacute teniu un quadre que us serviragrave lrsquoequivalegravencia entre els pins del GPIO i els que haurem de posar en el codi

Ja queda menys perquegrave puguis comenccedilar a pro-gramar perograve abans de fer-ho hauragraves de saber com compilar un programa Probablement ara et preguntaragraves quegrave eacutes compilar doncs compilar eacutes el proceacutes que fa un programa per traduir el codi que nosaltres hem escrit a codi binari amb la fi-nalitat de que el nostre ordinador pugui entendre cada ordre

Per compilar un codi escrit en C farem servir el compilador cc Abans drsquoutilitzar aquest programa haurem drsquoindicar a on hem guardat la nostra pragravec-tica amb lrsquoordre cdcc

-o practica

-Wall

-Iusrlocalinclude

-Lusrlocallib

practicac

-lwiringPi

Primer de tot posarem lrsquoordre al terminal

Utilitzarem el modificador -o per establir quin seragrave el nom del programa de sortida per exemple ldquopragravecticardquo

Amb aquest modificador indicarem que volem que ens doni tota la informacioacute dels errors de sintaxis del fitxer

Amb aquest indicarem on es troben els fitxers de la llibreria a incloure dintre del nostre fitxer

Utilitzant aquest altre modificador establim el di-rectori on ha de buscar els fitxers de la llibreria

Ara indicarem el nom del fitxer on es troba el nos-tre codi sempre acabant amb la terminacioacute c per exemple ldquopragravecticacrdquo

Amb aquest modificador posem la llibreria wiring-Pi a la llista de llibreries que han de ser afegides

17

Al final introduirem tot seguit al terminal una ordre similar a la seguumlent

cc -o practica -Wall -Iusrlocalinclude -Lusrlocallib practicac -lwiringPi

A part de saber compilar abans de comenccedilar a programar i a fer els nostres circuits haurem de saber quins soacuten els pins on haurem de connectar als cables a la Raspberry Pi aquest pins els iden-tificarem utilitzant nuacutemeros

La seguumlent taula ens permet saber lrsquoequivalegravencia entre els nuacutemeros de la GPIO els nuacutemeros de wiringPi la llibreria que interpretaragrave el nostre codi i la posicioacute dels pins

18

Des que la variable i eacutes igual a 1 fins i mentre que aquesta sigui igual o meacutes petita que10 executa el codi

Mentre que la variable D sigui igual a 5 el codi entre claus es llegiragrave infinites vegades

Si la variable X no eacutes meacutes petita que 7 fes una altra cosa

Si la variable X eacutes meacutes petita que 7 fes alguna cosa

70 Iniciacioacute al llenguatge CAbans de comenccedilar a programar cal tenir en compte els conceptes de condicional i de cicle

Els condicionals ldquoif - elserdquo nomeacutes executen el codi a continuacioacute si la condicioacute que li fiquem entre paregraventesis eacutes certa Ho podriacuteem comparar amb el que seria una oracioacute condicional No eacutes obligatori perograve podem afegir la partiacutecula ldquoelserdquo que eacutes lrsquoequivalent a la paraula ldquosi nordquo En el cas a continuacioacute com que el condicional no es compleix srsquoexecutaria lrsquoelse

if (X lt 7) Fes alguna cosa else Fes una altra cosa

Els bucles ldquoforrdquo soacuten rutines que serveixen per ex-ecutar un codi un determinat nuacutemero de vegades Teacute tres parts separades per punt i coma entrada condicioacute i increment A la entrada li donem un va-lor a una variable A la condicioacute determinem que la rutina srsquoexecuti nomeacutes si eacutes compleix la condicioacute utilitzant la variable drsquoentrada Finalment en el in-crement fixem un nou valor a la variable aquesta part srsquoexecutaragrave a cada cicle En llenguatge C si no afegim cap dels tres paragravemetres el bucle seragrave infinit

for (int i = 1 i lt= 10 i++) Fes alguna cosa

La sentegravencia ldquowhilerdquo defineix que un codi srsquoexe-cutaragrave infinitament mentre que la condicioacute que es defineix sigui certa

while (D==5) Fes alguna cosa

19

71 Bloc 1 (Bagravesic)711 Hola moacuten

En aquesta pragravectica escriurem un text a la consograve-la el conegut ldquoHello Worldrdquo

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void) printf(ldquohola moacutenrdquo)

if (wiringPiSetup() == -1) exit (1)

return 0

712 Encendre un LED

Hem drsquoimportar aquestes llibreries per tal que la RaspberryPi entengui el codi

Aquesta eacutes la funcioacute principal (main) i srsquoexecutaragrave tot el que fiquem aquiacute dins

Amb la funcioacute printf() el que aconseguim eacutes que es mostri al terminal el text que hi posem entre comentes

Aquestes liacutenies de codi soacuten simplement compro-vacions per assegurar-nos que tot funciona cor-rectament Soacuten negligibles perograve eacutes recomanable posar-les Les afegirem a totes les pragravectiques

Connectarem la pota llarga (agravenode) del LED al pin 5v de la GPIO i lrsquoaltre pota (cagravetode) a una resistegraven-cia de 180Ω Aquesta distincioacute entre potes es deu a que els LEDs estan polaritzats mireu el glossa-ri per saber-ne meacutes Tot seguit connecteu lrsquoaltra pota de la resistegravencia al pin GROUND

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void)

20

Comprovacionsif (wiringPiSetup() == -1) exit (1)

int pin = 1

printf(ldquoEncenem el pin 18rdquo)

pinMode(pin OUTPUT)

digitalWrite(pin 1)

return 0

713 Encendre i apagar un LED cada dos segons 10 vegades

El que podeu veure aquiacute eacutes el que srsquoanomena un comentari del codi Tot allograve que escrivim despreacutes de ldquordquo el compilador no ho llegiragrave i per tant nomeacutes serveix per donar indicacions al programador

Declarem la variable pin que com eacutes un nombre enter escriurem int

Fem un printf() tal i com hem apregraves a la pragravectica anterior Escrivim el 18 ja que la numeracioacute de la llibreria wiringPi canvia respecte a la sortida real (mirar el cuadre de la pagravegina 17)

Amb la funcioacute pinMode() declarem que el pin nuacutemero 1 en aquest cas sigui un pin de sortida de corrent (OUTPUT)

Una vegada li hem dit que eacutes de sortida li hem de dir si el volem encegraves ldquo1rdquo o apagat ldquo0rdquo amb la funcioacute digitalWrite()

Utilitzarem el muntatge la de pragravectica anterior amb la diferegravencia que en comptes de connectar lrsquoagravenode del LED al pin de 5v el connectarem al pin 18 de la Raspberry Pi Drsquoaquesta manera podrem gestionar el pas de lrsquoelectricitat a traveacutes drsquoun petit programa que crearem a continuacioacute

21

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void) int pin = 1

if (wiringPiSetup() == -1) exit (1)

pinMode(pin OUTPUT)

for (int i=1ilt=10i++)

printf(ldquoLED Onnrdquo) digitalWrite(pin 1)

delay(2000)

printf(ldquoLED Offnrdquo) digitalWrite(pin 0)

delay(2000)

return 0

Utilitzem un bicle ldquoforrdquo per executar el codi 10 vegades

Encenem el LED

Fem un delay() de 2000 milmiddotlisegons (2 segons) que ens serveix per aturar el programa i per tant mantenir el LED encegraves durant aquest temps

Apaguem el LED

El mantenim apagat 2 segons

Lrsquoexpressioacute n serveix per canviar de liacutenia

Proposta Ara que ja saps els conceptes bagravesics de la CodePi intenta fer lrsquoequivalent al codi Morse per demanar ajuda SOS middot middot middot ndash ndash ndash middot middot middot (on cada punt significa LED encegraves durant 14 de segon i cada ralla LED encegraves durant mig segon) Juga amb el valor de la funcioacute delay() per fer que el LED estigui encegraves durant meacutes o menys temps

22

72 Bloc 2 (Mitjagrave)721 Encendre un LED apretant un botoacute

Utilitzar el muntatge del LED que hem fet servir a la pragravectica anterior A meacutes a meacutes hem drsquoafegir 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 aniragrave a parar al pin 23 una resistegravencia de 10KΩ al GROUND per forccedilar lrsquoestat LOW quan el polsador no estagrave apretat

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt int main (void) int pin_LED = 1 int pin_boto = 4 printf (ldquoEncenent un LED apretant un botoacutenrdquo) 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

Declarem el LED com un pin de sortidaI el botoacute com un pin drsquoentrada

Si no fiquem variables al for aquest srsquoexecutaragrave sempre

Amb la funcioacute digitalRead() detectem si passa cor-rent pel pin 8 eacutes a dir si el botoacute ha estat apretat Si eacutes aixiacute fem que srsquoencengui el LED

Si no fem que srsquoapagui

23

722 Encendre un LED apretant tots els puladors

Utilitzar el muntatge de la pragravectica anterior i afegir dos polsadors meacutes amb el mateix proceacutes connec-tats als ports 24 i 25 de la Raspberry Pi

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int main (void) int pin_LED = 1

int pin_boto_A = 4 int pin_boto_B = 5 int 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 ampamp digitalRead(pin_boto_B) == HIGH ampamp digitalRead(pin_boto_C) == HIGH) digitalWrite(pin_LED 1)

Declarem el LED i els tres botons que tal i com posa a lrsquoesquema corresponen als pins 23 24 i 25 de la GPIO

Si els tres polsadors estan premuts passa corrent pels tres i per tant srsquoenceacuten el LED

En aquest cas utilitzem HIGH i LOW en lloc de 1 i 0 respectivament HIGH significa que hi ha elec-tricitat i LOW que no hi ha

24

No apretats while (digitalRead(pin_boto_A) == LOW ampamp digitalRead(pin_boto_B) == LOW ampamp digitalRead(pin_boto_C) == LOW) digitalWrite(pin_LED 0)

Si no apagarsquol

723 Semagravefor amb polsador

En aquesta pragravectica crearem un semagravefor de via-nants i de cotxes Com alguns semagravefors aquests teacute un botoacute amb el qual els vianants demanen que es posi verd aixiacute que el dels cotxes es posa ver-mell

Connectarem dos LEDs (vermell i verd) als pins 18 i 23 de la Raspberry Pi amb una resistegravencia de 180Ω Tambeacute connectarem tres LEDs meacutes (verd vermell i taronja) de la mateixa manera en els ports 17 21 i 22 de la GPIO

A diferegravencia de les altres pragravectiques amb polsa-dors en aquesta el connectarem al port SDA0 i al GROUND ja que nomeacutes ens interessa detectar quan es prem

25

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

define VERMELL 0define GROC1define VERD 2define VERMELL_HOME3define VERD_HOME4

define BOTO 8

void setup (void) int i

if (geteuid () = 0) exit (0)

if (wiringPiSetup () == -1) exit (1)

fflush(stdout) for (i = 0 i lt 5 ++i) pinMode (i OUTPUT) digitalWrite (i 0) digitalWrite(VERD1)digitalWrite(VERMELL_HOME1) pinMode (BOTO INPUT)

printf (ldquoSetup fetnrdquo)

int main (void) setup () for () esperaBoto () aturaTransit () camina () tempsEspera () iniciaTransit ()

Amb lrsquoexpressioacute define li diem a la magravequina que cada cop que escrivim VERMELL en realitat es-tem posant el nombre 0 i el mateix amb les altres paraules

Fem un setup amb tota la configuracioacute necessagraveria

fflush() eacutes una funcioacute complexa que serveix per quumlestions de tractament de memograveria del sistema per evitar errors

Executem totes les funcions una darrera lrsquoaltra de manera indefinida

26

Esperant a que lrsquousuari premi el botoacute per comenccedilar

Fem que el semagravefor dels cotxes canviiuml de verd a vermell passant pel groc

Fem que el semagravefor dels vianants es posi verd

Temps intermig des que srsquoacaba de caminar fins que el trafic comenccedila

void esperaBoto (void) printf (ldquoEsperant el botoacute ldquo)fflush(stdout) while (digitalRead (BOTO) == HIGH) delay (100) printf (ldquoEsoerenrdquo)

void aturaTransit()printf(ldquoAturanteltraficldquo)fflush(stdout)digitalWrite(VERD0) digitalWrite (GROC 1) delay (2000) digitalWrite (GROC 0) digitalWrite(VERMELL1) delay (2000) printf (ldquoAturatsnrdquo)

void camina ()printf(ldquoCaminaldquo)fflush(stdout)

digitalWrite(VERMELL_HOME0)digitalWrite(VERD_HOME1) delay (10000) digitalWrite(VERMELL0) digitalWrite (GROC 1)

printf (ldquoJa han caminatnrdquo)

void tempsEspera () int i

printf (ldquoTemps drsquoespera ldquo) fflush(stdout)

for (i = 0 i lt 8 ++i)

27

delay (500) digitalWrite(VERD_HOME0) digitalWrite (GROC 0) delay (500) digitalWrite(VERD_HOME1) digitalWrite (GROC 1)

void iniciaTransit ()printf(ldquoInicianttraficldquo)fflush(stdout)

digitalWrite(VERD_HOME0)digitalWrite(VERMELL_HOME1) delay (500) digitalWrite (GROC 0) digitalWrite(VERD1)

Deixem via lliure pels vehicles i posem el semagrave-for vermell pels vianants

Proposta Utilitzant el que has apregraves en aquest bloc crear un projecte amb uns quants LEDs en fila que srsquoactivin ascendentment quan apretes un botoacute

28

73 Bloc 3 (Alt)731 Sistema portes logravegiques I

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int AND (int a int b) return a ampamp b

int OR (int a int b) return a || b

int NEGADA (int a) return a

int f(int a int b) return OR(AND(NE-GADA(a)b)AND(aNEGADA(b))) f(a b) = arsquob + abrsquo

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5

int apretat_A = 0 int apretat_B = 0

pinMode(pin_LED_S OUTPUT) pinMode(pin_boto_A INPUT) pinMode(pin_boto_B INPUT)

Crearem una funcioacute per a cada porta logravegica de tal manera que sigui meacutes fagravecil poder-ho aplicar despreacutes

Aquesta seragrave la foacutermula que compliragrave la taula de la veritat en aquest cas eacutes f(a b) = arsquob +abrsquo

Creem dos booleans (variables que poden ser 0 o 1) que ens indicaran si el botoacute ha estat premut o no

Declarem els pins drsquoentrada i de sortida com a totes les pragravectiques anteriors

El seguumlent projecte fa la mateixa funcioacute que acon-seguiriacuteem amb xips de portes logravegiques perograve fent els cagravelculs a partir de la RaspberryPi En aquest cas compleix la taula de la veritat drsquoun OR ex-clusive eacutes a dir nomeacutes srsquoencendragrave el LED quan premem un dels dos botons mai srsquoencendragrave 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 srsquoutilitzin en el codi

29

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) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins estan premuts

Comprovem quins no estan premuts

I apliquem la foacutermula amb els valors drsquoentrada cor-responents Si la foacutermula eacutes igual a 1 srsquoencendragrave el LED si no no srsquoencendragrave

732 Sistema portes logravegiques II

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

Partim de la mateixa base que la pragravectica ante-rior perograve en aquesta incloem una tercera variable drsquoentrada Aixiacute que hem drsquoafegir un nou botoacute en el pin del GPIO que srsquoescau

30

Seguim el patroacute de les foacutermules emprades a la pragravectica anterior

En aquest cas tenim tres variables drsquoentrada perograve la mecagravenica eacutes la mateixa Es pot jugar amb la foacutermula i anar provant diferents combinacions

Necessitem tres variables ja que hi ha tres botons

Declaracions

Comprovem quins estan premuts

int AND (int a int b) return a ampamp b

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 + arsquob

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5 int pin_boto_C = 6

int apretat_A = 0 int apretat_B = 0 int apretat_C = 0

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

31

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

Mostra resultat if (f(apretat_A apretat_B apretat_C) == 1) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins no estan premuts

Com al circuit anterior apliquem la foacutermula i si aquesta doacutena 1 encenem el LED

Proposta Ara que ja has apregraves els conceptes meacutes fonamentals de la CodePi inventarsquot un circuit amb el nivell de dificultat que consideris No et quedis amb el que se trsquoha ensenyat aquiacute sinoacute que cerca meacutes megravetodes que puguis utilitzar La creativitat eacutes bagravesica per a tot bon enginyer i amb aquesta pragravectica volem que demostris de quegrave ets capaccedil

32

8 Vols saber-ne meacutes El moacuten de la programacioacute i lrsquoelectrogravenica eacutes infinit La comunitat geek (= interessada) en aquests te-mes eacutes una de les meacutes servicials i altruista de tota la xarxa aixiacute que es poden trobar una quantitat inacabable de tutorials i pagravegines web especialitza-des en el que vulguem saber

81 Programari lliureEl programari lliure eacutes la base de la informagravetica ac-tual i encara juga un gran paper en algunes agraverees com els servidors web o els mogravebils amb sistema operatiu Android Aquiacute teniu un conjunt de pagravegines on podeu aprofundir sobre aquest apassionant moacuten de la llibertat digital

httpcawikipediaorgwikiRichard_Matthew_Stallmanhttpwwwfsforghttpwwwgnuorghttpwwwlinuxorghttpwwwunixorghttpwwwubuntucom

82 Raspberry PiSi desitges saber meacutes sobre el projecte sense agravenim de lucre Raspberry Pi i seguir fent projectes amb ella visita les pagines que trobaragraves a con-tinuacioacute Aquestes et donaran idees de quegrave fer amb aquest petit perograve fascinant ordinador

httplearnadafruitcomcategorylearn-raspber-ry-pihttpwwwraspberrypiorgwwwraspberrypiorghttpdangerousprototypescom20130202rasp-berry-pi-supercomputerhttpreviewscnetcoukdesktops25-fun-things-to-do-with-a-raspberry-pi-50009851httplearnadafruitcompi-thermal-printer

33

83 Electrogravenica Si lrsquoelectrogravenica bagravesica que has apregraves durant els tutorials de la CodePi trsquoha fet veure que aquest eacutes el moacuten que a tu trsquoagrada no paris A continu-acioacute et deixem pagravegines web on trobaragraves les bases de lrsquoelectrogravenica meacutes complexa i tambeacute molts nous circuits per muntar i seguir descobrint aquest moacuten que avui en dia fa que tots els aparells endollats a al corrent puguin funcionar

httpwwwinstructablescomidBeginners-Elec-tronics-ProjectshttpwwwinstructablescomidElectronic-Proj-ects-For-Beginnershttpwwwcircuitstodaycomsimple-electron-ics-projects-and-circuitshttpswwwsparkfuncomtutorialshttplearnadafruitcom

84 ProgramacioacuteDiuen que per ser un bon programador srsquohan de tenir unes habilitats que no tothom teacute disciplina ordre logravegica creativitat capacitat per resoldre qualsevol problema i per sobre de tot persistegravencia i passioacute Si creus que tens aquestes qualitats do-na-li una oportunitat a la programacioacute A continu-acioacute et deixem un recull de les pagravegines web que creiem que meacutes et poden ajudar a introduir-te una mica meacutes en la programacioacute web i la drsquoapli-cacions per a mogravebils

httpwwwcodeorghttpscratchmiteduhttpwwwcodecademycom

34

9 GlossariC (llenguatge de programacioacute) Des de la seva creacioacute lrsquoany 1972 srsquoha consolidat com un dels llenguatges de programacioacute meacutes utilitzats per fer aplicacions de software Eacutes considerat un dels meacutes bagravesics i meacutes comuns per introduir-se a la pro-gramacioacute Les grans companyies han utilitzat el C com a base per crear altres llenguatges com lrsquoObjective-C (utilitzat per fer les aplicacions per dispositius drsquoApple) o el C (creat per Microsoft i utilitzat entre altres coses per fer programes in-formagravetics per Windows)

Condensador Component electrogravenic classificat dins del grup dels passius i que per tant no emet cap senyal El podriacuteem definir com un acumula-dor drsquoelectrons que els deixa anar quan arriba a la seva capacitat magravexima Hi ha condensadors de dos tipus els electroliacutetics i els normals En les pragravec-tiques utilitzarem electroliacutetics i com que aquests tenen polaritat eacutes important tenir en compte quina eacutes la pota positiva i quina eacutes la negativa a lrsquohora de connectar-lo

Diacuteode Component electrogravenic passiu Teacute polaritat i seria lrsquoequivalent a una vagravelvula antiretorn lrsquoelec-tricitat nomeacutes pot anar en un sentit

Electrogravenica Disciplina que estudia els com-ponents electrogravenics que funcionen amb un flux drsquoelectrons (corrent continua)

Funcioacute Fragment de codi que conte un seguit drsquoaccions i que hi pots accedir cridant la funcioacute en comptes de repetint el codi Podriacuteem comparar-ho amb una funcioacute matemagravetica en la que tenim vari-ables drsquoentrada que tractant-les a la funcioacute ob-tenim una informacioacute de sortida

GPIO Soacuten les sigles de ldquoGeneral Purpose InputOutputrdquo Si mirem la Raspberry Pi soacuten els pins de sortida on hi connectem els cables amb els que programem la placa electrogravenica Lrsquoavantatge drsquoaquest tipus de connector respecte altres eacutes que es pot gestionar mitjanccedilant programacioacute i aixograve eacutes precisament el que explicarem en aquest manual

35

HDMI Soacuten les sigles de ldquoHigh-Definition Multime-dia Interfacerdquo Serveix per enviar viacutedeo i agraveudio a una pantalla Nosaltres lrsquoutilitzarem per connectar la RaspberryPi a una pantalla

LED Acrogravenim de ldquoLight Emitting Dioderdquo Eacutes un tipus de diacuteode el qual teacute una pelmiddotliacutecula de fogravesfor entre els dos connectors que fa que quan passi el corrent generi llum Com qualsevol altre diacuteode eacutes important tenir en compte la polaritat

RAM Acrogravenim de ldquoRandom Access Memoryrdquo Eacutes la part de lrsquoordinador encarregada drsquoemmagatze-mar els arxius temporals

RCA El connector RCA consisteix en diferents cables amb la punta de diferent color que serveix-en per transmetre agraveudio i viacutedeo

ROM De lrsquoanglegraves ldquoRead Only Memoryrdquo eacutes la uni-tat de memograveria on es guarda el sistema operatiu

Resistegravencia Eacutes un component electrogravenic que teacute com a funcioacute reduir el flux drsquoelectrons afi de controlar la seva potegravencia Eacutes molt comuacute a lrsquoelectrogravenica ja que eacutes molt necessari per assegu-rar-nos del correcte funcionament drsquoelements com el LED que sense una resistegravencia que limiteacutes el corrent podrien cremar-se

Placa base Eacutes la part de lrsquoordinador que conteacute elements com la RAM la ROM o el microproces-sador La placa base de lrsquoordinador que constru-irem amb aquest manual seria la progravepia Raspber-ry Pi

Protoboard Tambeacute coneguda com a Bread-board srsquoutilitza per crear circuits electrogravenics sense necessitat de soldar Per saber com funcio-na i com estan relacionats els diferents contactes consulteu aquesta webhttprduinostarcomdocumentaciongeneralpro-toboard-que-es-y-como-funciona

36

Terminal Eacutes el programa emprat per enviar ordres directes a lrsquoordinador i rebre respostes drsquoaquest Nosaltres lrsquoutilitzarem per instalmiddotlar els programes necessaris per programar les plaques electrograveniques i altres arxius necessaris

Variable Valor que canvia segons les operacions que es facin amb aquest al programa informagravetic Com ja sabeu hi ha variables independents (pe el temps) i dependents (pe si estagrave o no encegraves un LED que dependragrave drsquoaltres variables)

37

  • httpwwwfsforg
Page 10: CodePi

10

52 Instalmiddotlar RaspbianUna vegada que ja tenim descarregada lrsquouacuteltima versioacute de Raspbian segons el sistema opera-tiu des del que vulguem instalmiddotlar-lo haurem de seguir uns passos diferents per completar la in-stalmiddotlacioacute

Windows

Per instalmiddotlar Raspbian amb Windows haurem de descarregar i instalmiddotlar Win32DiskImager Abans de continuar amb la instalmiddotlacioacute haurem de de-scomprimir el fitxer que ens hem descarregat Per descomprimir-lo utilitzarem un compressor drsquoarxius com (7zip) Clicant amb el botoacute dret so-bre aquest arxiu i clicarem on posa descomprimir aquiacute o buscarem el nom del nostre descompres-sor i despreacutes buscarem aquesta opcioacute

Ara introduirem la targeta de memograveria que vul-guem utilitzar a lrsquoentrada per targetes del nostre ordinador o a lrsquoadaptador corresponent

A continuacioacute iniciarem el programa i clicarem sobre el logo de la carpeta i escollirem el lloc on hem descomprimit el contingut del zip buscarem lrsquoar-xiu amb extensioacute img i acceptarem el diagraveleg Meacutes tard escollirem en quin dispositiu volem in-stalmiddotlar el sistema operatiu aquest eacutes un punt on hem drsquoestar segurs drsquoon estem instalmiddotlant aquests arxius ja que si lrsquoestigueacutessim instalmiddotlant en una destinacioacute diferent podriacuteem perdre totes les dades de lrsquoordinador Per saber a quin dispositiu hem drsquoinstalmiddotlar Raspbian obrirem ldquoEl Meu Ordinadorrdquo i buscarem la targeta de memograveria ens fixarem en quina lletra hi ha al final del nom aquesta seragrave la mateixa que haurem de posar al programaQuan ja haguem inserit aquests dos paragravemetres al programa clicarem sobre el botoacute de Write i es comenccedilara a instalmiddotlar el sistema operatiu

11

Linux

Per instalmiddotlar Raspbian des drsquoun sistema operatiu Linux utilitzarem lrsquoordre 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 homeusu-ari)

Un cop tenim descomprimit el contingut del zip obrirem una sessioacute al terminal i escriurem

cd ~

df -h

umount devsdd1

sudo dd bs=4M if=~2013-02-09-wheezy-raspbianimg of=devsdd

Anirem a la carpeta on hem descomprimit el zip (la de lrsquousuari eacutes per defecte o ~)

Buscarem la targeta sd i el seu nom a la seguumlent llista ens haurem drsquoapuntar el que posi a la prime-ra columna com devsdd (sense el numero) Assegureu-vos que aquest eacutes el dispositiu on vo-leu instalmiddotlar el Raspbian

Abans drsquoinstalmiddotlar Raspbian haurem de des-muntar les particions corresponents a la targeta SD utilitzant lrsquoordre umount en el cas de tenir meacutes drsquouna particioacute haurem drsquoexecutar aquesta ordre meacutes drsquouna vegada

Ara executarem lrsquoordre dd amb permisos drsquoadmi- nistrador al modificador ldquoif=rdquo posarem la carpeta on hem descomprimit el zip (la de lrsquousuari eacutes per defecte o ~) amb el nom del arxiu img descom-primit i al modificador ldquoof=rdquo escriurem el que hem copiat abans amb lrsquoanterior ordre

12

Mac OS X

Per instalmiddotlar Raspbian a Mac OS X tambeacute utilitza-rem lrsquoordre dd pero el funcionament per buscar en quin disc volem instalmiddotlar raspbian eacutes diferent Recomanem extreure el contingut del zip a la car-peta Usersusuari

Comenccedilarem buscant la targeta on volem instalmiddotlar raspbian executant la seguumlent ordre i copiarem el disk4 (sense agafar la particioacute)

Desmuntarem el disk en quumlestioacute

Ara executarem lrsquoordre dd amb permisos drsquoadmi- nistrador al modificador ldquoif=rdquo posarem la carpeta on hem descomprimit el zip (la de lrsquousuari eacutes per defecte o ~) amb el nom de lrsquoarxiu img descom-primit i al modificador ldquoof=rdquo escriurem el que hem copiat abans amb lrsquoanterior ordre

diskutil list

diskutil unmountDisk devdisk4

sudo dd bs=1m if=~2013-02-09-wheezy-raspbianimg of=devsdb

13

6 Primer inici i configuracioacute de la CodePiAra ja estem preparats per posar la targeta SD a la Raspberry Pi i connectar tots els cables per comenccedilar a programar A continuacioacute hem de se-guir uns passos que nomeacutes podrem fer durant la primera arrencada del sistema i que ens perme-tran iniciar lrsquoescriptori automagraveticament posar la CodePi en catalagrave i configurar la disposicioacute del te-clat entre drsquoaltres coses

Quan iniciem per primera vegada la Raspberry Pi amb el sistema operatiu Raspbian ens apareixeragrave la seguumlent pantalla on ens mourem utilitzant les fletxes i la tecla intro

La primera cosa que seleccionarem seragrave ldquoboot_behaviorrdquo que ens permetragrave inciar lrsquoescriptori quan el sistema iniciiuml

Ens mourem amb el teclat (dreta - esquerre) per fer que estigui seleccionat ldquoyesrdquo clicarem enter

14

Ara a continuacioacute ens mourem fins a ldquoexpand_rootfsrdquo que ens permetragrave expandir el tamany de la particioacute arrel de la Raspberry Pi al tamany magravex-im de la targeta SD eacutes a dir si tenim una targeta de 4 Gb si no fessim aquesta opcioacute estariacuteem util-itzant uacutenicament 2 Gb de capacitat

Acceptarem el seguumlent diagraveleg i passarem a con-figurar els idiomes

Buscarem ldquochange_localerdquo per canviar els idio-mes i la disposicioacute del teclat al catalagrave

De la seguumlent llista seleccionarem mitjanccedilant lrsquoes-pai del teclat totes les codificacions que comencin per ldquoCA_Per baixar a buscar-les utilitzarem les fletxes (amunt-avall) i per acabar clicarem la del costat dret i enter

15

Seleccionarem ldquochange_timezonerdquo per canviar la zona horagraveria de la Raspberry Pi i els temes rela-cionats amb aquesta

A continuacioacute seleccionarem el nostre continent

I per uacuteltim buscarem una ciutat que estigui a la mateixa zona horagraveria que nosaltres i la seleccio-nariacuteem tambeacute amb enter

64 Descarregar i executar ScriptPer descarregar lrsquoscript hem donar permisos i ex-ecutar-lo aixiacute que escriurem les seguumlents ordres en el terminal que podeu trobar a lrsquoescriptori

cd tmpmkdir CodePicd CodePiwget httpwwwtomorrowdevcomcodepiwiringPi-installshchmod +x wiringPi-installshwiringPi-installsh

Ja hem acabat de descarregar el programari que ens permetragrave programar amb la CodePi

16

7 PragravectiquesRecomanacioacute mirar aquests tutorials introduc-toris al llenguatge C httpthenewbostonorglistphpcat=14

Aquiacute teniu un quadre que us serviragrave lrsquoequivalegravencia entre els pins del GPIO i els que haurem de posar en el codi

Ja queda menys perquegrave puguis comenccedilar a pro-gramar perograve abans de fer-ho hauragraves de saber com compilar un programa Probablement ara et preguntaragraves quegrave eacutes compilar doncs compilar eacutes el proceacutes que fa un programa per traduir el codi que nosaltres hem escrit a codi binari amb la fi-nalitat de que el nostre ordinador pugui entendre cada ordre

Per compilar un codi escrit en C farem servir el compilador cc Abans drsquoutilitzar aquest programa haurem drsquoindicar a on hem guardat la nostra pragravec-tica amb lrsquoordre cdcc

-o practica

-Wall

-Iusrlocalinclude

-Lusrlocallib

practicac

-lwiringPi

Primer de tot posarem lrsquoordre al terminal

Utilitzarem el modificador -o per establir quin seragrave el nom del programa de sortida per exemple ldquopragravecticardquo

Amb aquest modificador indicarem que volem que ens doni tota la informacioacute dels errors de sintaxis del fitxer

Amb aquest indicarem on es troben els fitxers de la llibreria a incloure dintre del nostre fitxer

Utilitzant aquest altre modificador establim el di-rectori on ha de buscar els fitxers de la llibreria

Ara indicarem el nom del fitxer on es troba el nos-tre codi sempre acabant amb la terminacioacute c per exemple ldquopragravecticacrdquo

Amb aquest modificador posem la llibreria wiring-Pi a la llista de llibreries que han de ser afegides

17

Al final introduirem tot seguit al terminal una ordre similar a la seguumlent

cc -o practica -Wall -Iusrlocalinclude -Lusrlocallib practicac -lwiringPi

A part de saber compilar abans de comenccedilar a programar i a fer els nostres circuits haurem de saber quins soacuten els pins on haurem de connectar als cables a la Raspberry Pi aquest pins els iden-tificarem utilitzant nuacutemeros

La seguumlent taula ens permet saber lrsquoequivalegravencia entre els nuacutemeros de la GPIO els nuacutemeros de wiringPi la llibreria que interpretaragrave el nostre codi i la posicioacute dels pins

18

Des que la variable i eacutes igual a 1 fins i mentre que aquesta sigui igual o meacutes petita que10 executa el codi

Mentre que la variable D sigui igual a 5 el codi entre claus es llegiragrave infinites vegades

Si la variable X no eacutes meacutes petita que 7 fes una altra cosa

Si la variable X eacutes meacutes petita que 7 fes alguna cosa

70 Iniciacioacute al llenguatge CAbans de comenccedilar a programar cal tenir en compte els conceptes de condicional i de cicle

Els condicionals ldquoif - elserdquo nomeacutes executen el codi a continuacioacute si la condicioacute que li fiquem entre paregraventesis eacutes certa Ho podriacuteem comparar amb el que seria una oracioacute condicional No eacutes obligatori perograve podem afegir la partiacutecula ldquoelserdquo que eacutes lrsquoequivalent a la paraula ldquosi nordquo En el cas a continuacioacute com que el condicional no es compleix srsquoexecutaria lrsquoelse

if (X lt 7) Fes alguna cosa else Fes una altra cosa

Els bucles ldquoforrdquo soacuten rutines que serveixen per ex-ecutar un codi un determinat nuacutemero de vegades Teacute tres parts separades per punt i coma entrada condicioacute i increment A la entrada li donem un va-lor a una variable A la condicioacute determinem que la rutina srsquoexecuti nomeacutes si eacutes compleix la condicioacute utilitzant la variable drsquoentrada Finalment en el in-crement fixem un nou valor a la variable aquesta part srsquoexecutaragrave a cada cicle En llenguatge C si no afegim cap dels tres paragravemetres el bucle seragrave infinit

for (int i = 1 i lt= 10 i++) Fes alguna cosa

La sentegravencia ldquowhilerdquo defineix que un codi srsquoexe-cutaragrave infinitament mentre que la condicioacute que es defineix sigui certa

while (D==5) Fes alguna cosa

19

71 Bloc 1 (Bagravesic)711 Hola moacuten

En aquesta pragravectica escriurem un text a la consograve-la el conegut ldquoHello Worldrdquo

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void) printf(ldquohola moacutenrdquo)

if (wiringPiSetup() == -1) exit (1)

return 0

712 Encendre un LED

Hem drsquoimportar aquestes llibreries per tal que la RaspberryPi entengui el codi

Aquesta eacutes la funcioacute principal (main) i srsquoexecutaragrave tot el que fiquem aquiacute dins

Amb la funcioacute printf() el que aconseguim eacutes que es mostri al terminal el text que hi posem entre comentes

Aquestes liacutenies de codi soacuten simplement compro-vacions per assegurar-nos que tot funciona cor-rectament Soacuten negligibles perograve eacutes recomanable posar-les Les afegirem a totes les pragravectiques

Connectarem la pota llarga (agravenode) del LED al pin 5v de la GPIO i lrsquoaltre pota (cagravetode) a una resistegraven-cia de 180Ω Aquesta distincioacute entre potes es deu a que els LEDs estan polaritzats mireu el glossa-ri per saber-ne meacutes Tot seguit connecteu lrsquoaltra pota de la resistegravencia al pin GROUND

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void)

20

Comprovacionsif (wiringPiSetup() == -1) exit (1)

int pin = 1

printf(ldquoEncenem el pin 18rdquo)

pinMode(pin OUTPUT)

digitalWrite(pin 1)

return 0

713 Encendre i apagar un LED cada dos segons 10 vegades

El que podeu veure aquiacute eacutes el que srsquoanomena un comentari del codi Tot allograve que escrivim despreacutes de ldquordquo el compilador no ho llegiragrave i per tant nomeacutes serveix per donar indicacions al programador

Declarem la variable pin que com eacutes un nombre enter escriurem int

Fem un printf() tal i com hem apregraves a la pragravectica anterior Escrivim el 18 ja que la numeracioacute de la llibreria wiringPi canvia respecte a la sortida real (mirar el cuadre de la pagravegina 17)

Amb la funcioacute pinMode() declarem que el pin nuacutemero 1 en aquest cas sigui un pin de sortida de corrent (OUTPUT)

Una vegada li hem dit que eacutes de sortida li hem de dir si el volem encegraves ldquo1rdquo o apagat ldquo0rdquo amb la funcioacute digitalWrite()

Utilitzarem el muntatge la de pragravectica anterior amb la diferegravencia que en comptes de connectar lrsquoagravenode del LED al pin de 5v el connectarem al pin 18 de la Raspberry Pi Drsquoaquesta manera podrem gestionar el pas de lrsquoelectricitat a traveacutes drsquoun petit programa que crearem a continuacioacute

21

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void) int pin = 1

if (wiringPiSetup() == -1) exit (1)

pinMode(pin OUTPUT)

for (int i=1ilt=10i++)

printf(ldquoLED Onnrdquo) digitalWrite(pin 1)

delay(2000)

printf(ldquoLED Offnrdquo) digitalWrite(pin 0)

delay(2000)

return 0

Utilitzem un bicle ldquoforrdquo per executar el codi 10 vegades

Encenem el LED

Fem un delay() de 2000 milmiddotlisegons (2 segons) que ens serveix per aturar el programa i per tant mantenir el LED encegraves durant aquest temps

Apaguem el LED

El mantenim apagat 2 segons

Lrsquoexpressioacute n serveix per canviar de liacutenia

Proposta Ara que ja saps els conceptes bagravesics de la CodePi intenta fer lrsquoequivalent al codi Morse per demanar ajuda SOS middot middot middot ndash ndash ndash middot middot middot (on cada punt significa LED encegraves durant 14 de segon i cada ralla LED encegraves durant mig segon) Juga amb el valor de la funcioacute delay() per fer que el LED estigui encegraves durant meacutes o menys temps

22

72 Bloc 2 (Mitjagrave)721 Encendre un LED apretant un botoacute

Utilitzar el muntatge del LED que hem fet servir a la pragravectica anterior A meacutes a meacutes hem drsquoafegir 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 aniragrave a parar al pin 23 una resistegravencia de 10KΩ al GROUND per forccedilar lrsquoestat LOW quan el polsador no estagrave apretat

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt int main (void) int pin_LED = 1 int pin_boto = 4 printf (ldquoEncenent un LED apretant un botoacutenrdquo) 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

Declarem el LED com un pin de sortidaI el botoacute com un pin drsquoentrada

Si no fiquem variables al for aquest srsquoexecutaragrave sempre

Amb la funcioacute digitalRead() detectem si passa cor-rent pel pin 8 eacutes a dir si el botoacute ha estat apretat Si eacutes aixiacute fem que srsquoencengui el LED

Si no fem que srsquoapagui

23

722 Encendre un LED apretant tots els puladors

Utilitzar el muntatge de la pragravectica anterior i afegir dos polsadors meacutes amb el mateix proceacutes connec-tats als ports 24 i 25 de la Raspberry Pi

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int main (void) int pin_LED = 1

int pin_boto_A = 4 int pin_boto_B = 5 int 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 ampamp digitalRead(pin_boto_B) == HIGH ampamp digitalRead(pin_boto_C) == HIGH) digitalWrite(pin_LED 1)

Declarem el LED i els tres botons que tal i com posa a lrsquoesquema corresponen als pins 23 24 i 25 de la GPIO

Si els tres polsadors estan premuts passa corrent pels tres i per tant srsquoenceacuten el LED

En aquest cas utilitzem HIGH i LOW en lloc de 1 i 0 respectivament HIGH significa que hi ha elec-tricitat i LOW que no hi ha

24

No apretats while (digitalRead(pin_boto_A) == LOW ampamp digitalRead(pin_boto_B) == LOW ampamp digitalRead(pin_boto_C) == LOW) digitalWrite(pin_LED 0)

Si no apagarsquol

723 Semagravefor amb polsador

En aquesta pragravectica crearem un semagravefor de via-nants i de cotxes Com alguns semagravefors aquests teacute un botoacute amb el qual els vianants demanen que es posi verd aixiacute que el dels cotxes es posa ver-mell

Connectarem dos LEDs (vermell i verd) als pins 18 i 23 de la Raspberry Pi amb una resistegravencia de 180Ω Tambeacute connectarem tres LEDs meacutes (verd vermell i taronja) de la mateixa manera en els ports 17 21 i 22 de la GPIO

A diferegravencia de les altres pragravectiques amb polsa-dors en aquesta el connectarem al port SDA0 i al GROUND ja que nomeacutes ens interessa detectar quan es prem

25

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

define VERMELL 0define GROC1define VERD 2define VERMELL_HOME3define VERD_HOME4

define BOTO 8

void setup (void) int i

if (geteuid () = 0) exit (0)

if (wiringPiSetup () == -1) exit (1)

fflush(stdout) for (i = 0 i lt 5 ++i) pinMode (i OUTPUT) digitalWrite (i 0) digitalWrite(VERD1)digitalWrite(VERMELL_HOME1) pinMode (BOTO INPUT)

printf (ldquoSetup fetnrdquo)

int main (void) setup () for () esperaBoto () aturaTransit () camina () tempsEspera () iniciaTransit ()

Amb lrsquoexpressioacute define li diem a la magravequina que cada cop que escrivim VERMELL en realitat es-tem posant el nombre 0 i el mateix amb les altres paraules

Fem un setup amb tota la configuracioacute necessagraveria

fflush() eacutes una funcioacute complexa que serveix per quumlestions de tractament de memograveria del sistema per evitar errors

Executem totes les funcions una darrera lrsquoaltra de manera indefinida

26

Esperant a que lrsquousuari premi el botoacute per comenccedilar

Fem que el semagravefor dels cotxes canviiuml de verd a vermell passant pel groc

Fem que el semagravefor dels vianants es posi verd

Temps intermig des que srsquoacaba de caminar fins que el trafic comenccedila

void esperaBoto (void) printf (ldquoEsperant el botoacute ldquo)fflush(stdout) while (digitalRead (BOTO) == HIGH) delay (100) printf (ldquoEsoerenrdquo)

void aturaTransit()printf(ldquoAturanteltraficldquo)fflush(stdout)digitalWrite(VERD0) digitalWrite (GROC 1) delay (2000) digitalWrite (GROC 0) digitalWrite(VERMELL1) delay (2000) printf (ldquoAturatsnrdquo)

void camina ()printf(ldquoCaminaldquo)fflush(stdout)

digitalWrite(VERMELL_HOME0)digitalWrite(VERD_HOME1) delay (10000) digitalWrite(VERMELL0) digitalWrite (GROC 1)

printf (ldquoJa han caminatnrdquo)

void tempsEspera () int i

printf (ldquoTemps drsquoespera ldquo) fflush(stdout)

for (i = 0 i lt 8 ++i)

27

delay (500) digitalWrite(VERD_HOME0) digitalWrite (GROC 0) delay (500) digitalWrite(VERD_HOME1) digitalWrite (GROC 1)

void iniciaTransit ()printf(ldquoInicianttraficldquo)fflush(stdout)

digitalWrite(VERD_HOME0)digitalWrite(VERMELL_HOME1) delay (500) digitalWrite (GROC 0) digitalWrite(VERD1)

Deixem via lliure pels vehicles i posem el semagrave-for vermell pels vianants

Proposta Utilitzant el que has apregraves en aquest bloc crear un projecte amb uns quants LEDs en fila que srsquoactivin ascendentment quan apretes un botoacute

28

73 Bloc 3 (Alt)731 Sistema portes logravegiques I

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int AND (int a int b) return a ampamp b

int OR (int a int b) return a || b

int NEGADA (int a) return a

int f(int a int b) return OR(AND(NE-GADA(a)b)AND(aNEGADA(b))) f(a b) = arsquob + abrsquo

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5

int apretat_A = 0 int apretat_B = 0

pinMode(pin_LED_S OUTPUT) pinMode(pin_boto_A INPUT) pinMode(pin_boto_B INPUT)

Crearem una funcioacute per a cada porta logravegica de tal manera que sigui meacutes fagravecil poder-ho aplicar despreacutes

Aquesta seragrave la foacutermula que compliragrave la taula de la veritat en aquest cas eacutes f(a b) = arsquob +abrsquo

Creem dos booleans (variables que poden ser 0 o 1) que ens indicaran si el botoacute ha estat premut o no

Declarem els pins drsquoentrada i de sortida com a totes les pragravectiques anteriors

El seguumlent projecte fa la mateixa funcioacute que acon-seguiriacuteem amb xips de portes logravegiques perograve fent els cagravelculs a partir de la RaspberryPi En aquest cas compleix la taula de la veritat drsquoun OR ex-clusive eacutes a dir nomeacutes srsquoencendragrave el LED quan premem un dels dos botons mai srsquoencendragrave 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 srsquoutilitzin en el codi

29

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) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins estan premuts

Comprovem quins no estan premuts

I apliquem la foacutermula amb els valors drsquoentrada cor-responents Si la foacutermula eacutes igual a 1 srsquoencendragrave el LED si no no srsquoencendragrave

732 Sistema portes logravegiques II

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

Partim de la mateixa base que la pragravectica ante-rior perograve en aquesta incloem una tercera variable drsquoentrada Aixiacute que hem drsquoafegir un nou botoacute en el pin del GPIO que srsquoescau

30

Seguim el patroacute de les foacutermules emprades a la pragravectica anterior

En aquest cas tenim tres variables drsquoentrada perograve la mecagravenica eacutes la mateixa Es pot jugar amb la foacutermula i anar provant diferents combinacions

Necessitem tres variables ja que hi ha tres botons

Declaracions

Comprovem quins estan premuts

int AND (int a int b) return a ampamp b

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 + arsquob

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5 int pin_boto_C = 6

int apretat_A = 0 int apretat_B = 0 int apretat_C = 0

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

31

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

Mostra resultat if (f(apretat_A apretat_B apretat_C) == 1) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins no estan premuts

Com al circuit anterior apliquem la foacutermula i si aquesta doacutena 1 encenem el LED

Proposta Ara que ja has apregraves els conceptes meacutes fonamentals de la CodePi inventarsquot un circuit amb el nivell de dificultat que consideris No et quedis amb el que se trsquoha ensenyat aquiacute sinoacute que cerca meacutes megravetodes que puguis utilitzar La creativitat eacutes bagravesica per a tot bon enginyer i amb aquesta pragravectica volem que demostris de quegrave ets capaccedil

32

8 Vols saber-ne meacutes El moacuten de la programacioacute i lrsquoelectrogravenica eacutes infinit La comunitat geek (= interessada) en aquests te-mes eacutes una de les meacutes servicials i altruista de tota la xarxa aixiacute que es poden trobar una quantitat inacabable de tutorials i pagravegines web especialitza-des en el que vulguem saber

81 Programari lliureEl programari lliure eacutes la base de la informagravetica ac-tual i encara juga un gran paper en algunes agraverees com els servidors web o els mogravebils amb sistema operatiu Android Aquiacute teniu un conjunt de pagravegines on podeu aprofundir sobre aquest apassionant moacuten de la llibertat digital

httpcawikipediaorgwikiRichard_Matthew_Stallmanhttpwwwfsforghttpwwwgnuorghttpwwwlinuxorghttpwwwunixorghttpwwwubuntucom

82 Raspberry PiSi desitges saber meacutes sobre el projecte sense agravenim de lucre Raspberry Pi i seguir fent projectes amb ella visita les pagines que trobaragraves a con-tinuacioacute Aquestes et donaran idees de quegrave fer amb aquest petit perograve fascinant ordinador

httplearnadafruitcomcategorylearn-raspber-ry-pihttpwwwraspberrypiorgwwwraspberrypiorghttpdangerousprototypescom20130202rasp-berry-pi-supercomputerhttpreviewscnetcoukdesktops25-fun-things-to-do-with-a-raspberry-pi-50009851httplearnadafruitcompi-thermal-printer

33

83 Electrogravenica Si lrsquoelectrogravenica bagravesica que has apregraves durant els tutorials de la CodePi trsquoha fet veure que aquest eacutes el moacuten que a tu trsquoagrada no paris A continu-acioacute et deixem pagravegines web on trobaragraves les bases de lrsquoelectrogravenica meacutes complexa i tambeacute molts nous circuits per muntar i seguir descobrint aquest moacuten que avui en dia fa que tots els aparells endollats a al corrent puguin funcionar

httpwwwinstructablescomidBeginners-Elec-tronics-ProjectshttpwwwinstructablescomidElectronic-Proj-ects-For-Beginnershttpwwwcircuitstodaycomsimple-electron-ics-projects-and-circuitshttpswwwsparkfuncomtutorialshttplearnadafruitcom

84 ProgramacioacuteDiuen que per ser un bon programador srsquohan de tenir unes habilitats que no tothom teacute disciplina ordre logravegica creativitat capacitat per resoldre qualsevol problema i per sobre de tot persistegravencia i passioacute Si creus que tens aquestes qualitats do-na-li una oportunitat a la programacioacute A continu-acioacute et deixem un recull de les pagravegines web que creiem que meacutes et poden ajudar a introduir-te una mica meacutes en la programacioacute web i la drsquoapli-cacions per a mogravebils

httpwwwcodeorghttpscratchmiteduhttpwwwcodecademycom

34

9 GlossariC (llenguatge de programacioacute) Des de la seva creacioacute lrsquoany 1972 srsquoha consolidat com un dels llenguatges de programacioacute meacutes utilitzats per fer aplicacions de software Eacutes considerat un dels meacutes bagravesics i meacutes comuns per introduir-se a la pro-gramacioacute Les grans companyies han utilitzat el C com a base per crear altres llenguatges com lrsquoObjective-C (utilitzat per fer les aplicacions per dispositius drsquoApple) o el C (creat per Microsoft i utilitzat entre altres coses per fer programes in-formagravetics per Windows)

Condensador Component electrogravenic classificat dins del grup dels passius i que per tant no emet cap senyal El podriacuteem definir com un acumula-dor drsquoelectrons que els deixa anar quan arriba a la seva capacitat magravexima Hi ha condensadors de dos tipus els electroliacutetics i els normals En les pragravec-tiques utilitzarem electroliacutetics i com que aquests tenen polaritat eacutes important tenir en compte quina eacutes la pota positiva i quina eacutes la negativa a lrsquohora de connectar-lo

Diacuteode Component electrogravenic passiu Teacute polaritat i seria lrsquoequivalent a una vagravelvula antiretorn lrsquoelec-tricitat nomeacutes pot anar en un sentit

Electrogravenica Disciplina que estudia els com-ponents electrogravenics que funcionen amb un flux drsquoelectrons (corrent continua)

Funcioacute Fragment de codi que conte un seguit drsquoaccions i que hi pots accedir cridant la funcioacute en comptes de repetint el codi Podriacuteem comparar-ho amb una funcioacute matemagravetica en la que tenim vari-ables drsquoentrada que tractant-les a la funcioacute ob-tenim una informacioacute de sortida

GPIO Soacuten les sigles de ldquoGeneral Purpose InputOutputrdquo Si mirem la Raspberry Pi soacuten els pins de sortida on hi connectem els cables amb els que programem la placa electrogravenica Lrsquoavantatge drsquoaquest tipus de connector respecte altres eacutes que es pot gestionar mitjanccedilant programacioacute i aixograve eacutes precisament el que explicarem en aquest manual

35

HDMI Soacuten les sigles de ldquoHigh-Definition Multime-dia Interfacerdquo Serveix per enviar viacutedeo i agraveudio a una pantalla Nosaltres lrsquoutilitzarem per connectar la RaspberryPi a una pantalla

LED Acrogravenim de ldquoLight Emitting Dioderdquo Eacutes un tipus de diacuteode el qual teacute una pelmiddotliacutecula de fogravesfor entre els dos connectors que fa que quan passi el corrent generi llum Com qualsevol altre diacuteode eacutes important tenir en compte la polaritat

RAM Acrogravenim de ldquoRandom Access Memoryrdquo Eacutes la part de lrsquoordinador encarregada drsquoemmagatze-mar els arxius temporals

RCA El connector RCA consisteix en diferents cables amb la punta de diferent color que serveix-en per transmetre agraveudio i viacutedeo

ROM De lrsquoanglegraves ldquoRead Only Memoryrdquo eacutes la uni-tat de memograveria on es guarda el sistema operatiu

Resistegravencia Eacutes un component electrogravenic que teacute com a funcioacute reduir el flux drsquoelectrons afi de controlar la seva potegravencia Eacutes molt comuacute a lrsquoelectrogravenica ja que eacutes molt necessari per assegu-rar-nos del correcte funcionament drsquoelements com el LED que sense una resistegravencia que limiteacutes el corrent podrien cremar-se

Placa base Eacutes la part de lrsquoordinador que conteacute elements com la RAM la ROM o el microproces-sador La placa base de lrsquoordinador que constru-irem amb aquest manual seria la progravepia Raspber-ry Pi

Protoboard Tambeacute coneguda com a Bread-board srsquoutilitza per crear circuits electrogravenics sense necessitat de soldar Per saber com funcio-na i com estan relacionats els diferents contactes consulteu aquesta webhttprduinostarcomdocumentaciongeneralpro-toboard-que-es-y-como-funciona

36

Terminal Eacutes el programa emprat per enviar ordres directes a lrsquoordinador i rebre respostes drsquoaquest Nosaltres lrsquoutilitzarem per instalmiddotlar els programes necessaris per programar les plaques electrograveniques i altres arxius necessaris

Variable Valor que canvia segons les operacions que es facin amb aquest al programa informagravetic Com ja sabeu hi ha variables independents (pe el temps) i dependents (pe si estagrave o no encegraves un LED que dependragrave drsquoaltres variables)

37

  • httpwwwfsforg
Page 11: CodePi

11

Linux

Per instalmiddotlar Raspbian des drsquoun sistema operatiu Linux utilitzarem lrsquoordre 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 homeusu-ari)

Un cop tenim descomprimit el contingut del zip obrirem una sessioacute al terminal i escriurem

cd ~

df -h

umount devsdd1

sudo dd bs=4M if=~2013-02-09-wheezy-raspbianimg of=devsdd

Anirem a la carpeta on hem descomprimit el zip (la de lrsquousuari eacutes per defecte o ~)

Buscarem la targeta sd i el seu nom a la seguumlent llista ens haurem drsquoapuntar el que posi a la prime-ra columna com devsdd (sense el numero) Assegureu-vos que aquest eacutes el dispositiu on vo-leu instalmiddotlar el Raspbian

Abans drsquoinstalmiddotlar Raspbian haurem de des-muntar les particions corresponents a la targeta SD utilitzant lrsquoordre umount en el cas de tenir meacutes drsquouna particioacute haurem drsquoexecutar aquesta ordre meacutes drsquouna vegada

Ara executarem lrsquoordre dd amb permisos drsquoadmi- nistrador al modificador ldquoif=rdquo posarem la carpeta on hem descomprimit el zip (la de lrsquousuari eacutes per defecte o ~) amb el nom del arxiu img descom-primit i al modificador ldquoof=rdquo escriurem el que hem copiat abans amb lrsquoanterior ordre

12

Mac OS X

Per instalmiddotlar Raspbian a Mac OS X tambeacute utilitza-rem lrsquoordre dd pero el funcionament per buscar en quin disc volem instalmiddotlar raspbian eacutes diferent Recomanem extreure el contingut del zip a la car-peta Usersusuari

Comenccedilarem buscant la targeta on volem instalmiddotlar raspbian executant la seguumlent ordre i copiarem el disk4 (sense agafar la particioacute)

Desmuntarem el disk en quumlestioacute

Ara executarem lrsquoordre dd amb permisos drsquoadmi- nistrador al modificador ldquoif=rdquo posarem la carpeta on hem descomprimit el zip (la de lrsquousuari eacutes per defecte o ~) amb el nom de lrsquoarxiu img descom-primit i al modificador ldquoof=rdquo escriurem el que hem copiat abans amb lrsquoanterior ordre

diskutil list

diskutil unmountDisk devdisk4

sudo dd bs=1m if=~2013-02-09-wheezy-raspbianimg of=devsdb

13

6 Primer inici i configuracioacute de la CodePiAra ja estem preparats per posar la targeta SD a la Raspberry Pi i connectar tots els cables per comenccedilar a programar A continuacioacute hem de se-guir uns passos que nomeacutes podrem fer durant la primera arrencada del sistema i que ens perme-tran iniciar lrsquoescriptori automagraveticament posar la CodePi en catalagrave i configurar la disposicioacute del te-clat entre drsquoaltres coses

Quan iniciem per primera vegada la Raspberry Pi amb el sistema operatiu Raspbian ens apareixeragrave la seguumlent pantalla on ens mourem utilitzant les fletxes i la tecla intro

La primera cosa que seleccionarem seragrave ldquoboot_behaviorrdquo que ens permetragrave inciar lrsquoescriptori quan el sistema iniciiuml

Ens mourem amb el teclat (dreta - esquerre) per fer que estigui seleccionat ldquoyesrdquo clicarem enter

14

Ara a continuacioacute ens mourem fins a ldquoexpand_rootfsrdquo que ens permetragrave expandir el tamany de la particioacute arrel de la Raspberry Pi al tamany magravex-im de la targeta SD eacutes a dir si tenim una targeta de 4 Gb si no fessim aquesta opcioacute estariacuteem util-itzant uacutenicament 2 Gb de capacitat

Acceptarem el seguumlent diagraveleg i passarem a con-figurar els idiomes

Buscarem ldquochange_localerdquo per canviar els idio-mes i la disposicioacute del teclat al catalagrave

De la seguumlent llista seleccionarem mitjanccedilant lrsquoes-pai del teclat totes les codificacions que comencin per ldquoCA_Per baixar a buscar-les utilitzarem les fletxes (amunt-avall) i per acabar clicarem la del costat dret i enter

15

Seleccionarem ldquochange_timezonerdquo per canviar la zona horagraveria de la Raspberry Pi i els temes rela-cionats amb aquesta

A continuacioacute seleccionarem el nostre continent

I per uacuteltim buscarem una ciutat que estigui a la mateixa zona horagraveria que nosaltres i la seleccio-nariacuteem tambeacute amb enter

64 Descarregar i executar ScriptPer descarregar lrsquoscript hem donar permisos i ex-ecutar-lo aixiacute que escriurem les seguumlents ordres en el terminal que podeu trobar a lrsquoescriptori

cd tmpmkdir CodePicd CodePiwget httpwwwtomorrowdevcomcodepiwiringPi-installshchmod +x wiringPi-installshwiringPi-installsh

Ja hem acabat de descarregar el programari que ens permetragrave programar amb la CodePi

16

7 PragravectiquesRecomanacioacute mirar aquests tutorials introduc-toris al llenguatge C httpthenewbostonorglistphpcat=14

Aquiacute teniu un quadre que us serviragrave lrsquoequivalegravencia entre els pins del GPIO i els que haurem de posar en el codi

Ja queda menys perquegrave puguis comenccedilar a pro-gramar perograve abans de fer-ho hauragraves de saber com compilar un programa Probablement ara et preguntaragraves quegrave eacutes compilar doncs compilar eacutes el proceacutes que fa un programa per traduir el codi que nosaltres hem escrit a codi binari amb la fi-nalitat de que el nostre ordinador pugui entendre cada ordre

Per compilar un codi escrit en C farem servir el compilador cc Abans drsquoutilitzar aquest programa haurem drsquoindicar a on hem guardat la nostra pragravec-tica amb lrsquoordre cdcc

-o practica

-Wall

-Iusrlocalinclude

-Lusrlocallib

practicac

-lwiringPi

Primer de tot posarem lrsquoordre al terminal

Utilitzarem el modificador -o per establir quin seragrave el nom del programa de sortida per exemple ldquopragravecticardquo

Amb aquest modificador indicarem que volem que ens doni tota la informacioacute dels errors de sintaxis del fitxer

Amb aquest indicarem on es troben els fitxers de la llibreria a incloure dintre del nostre fitxer

Utilitzant aquest altre modificador establim el di-rectori on ha de buscar els fitxers de la llibreria

Ara indicarem el nom del fitxer on es troba el nos-tre codi sempre acabant amb la terminacioacute c per exemple ldquopragravecticacrdquo

Amb aquest modificador posem la llibreria wiring-Pi a la llista de llibreries que han de ser afegides

17

Al final introduirem tot seguit al terminal una ordre similar a la seguumlent

cc -o practica -Wall -Iusrlocalinclude -Lusrlocallib practicac -lwiringPi

A part de saber compilar abans de comenccedilar a programar i a fer els nostres circuits haurem de saber quins soacuten els pins on haurem de connectar als cables a la Raspberry Pi aquest pins els iden-tificarem utilitzant nuacutemeros

La seguumlent taula ens permet saber lrsquoequivalegravencia entre els nuacutemeros de la GPIO els nuacutemeros de wiringPi la llibreria que interpretaragrave el nostre codi i la posicioacute dels pins

18

Des que la variable i eacutes igual a 1 fins i mentre que aquesta sigui igual o meacutes petita que10 executa el codi

Mentre que la variable D sigui igual a 5 el codi entre claus es llegiragrave infinites vegades

Si la variable X no eacutes meacutes petita que 7 fes una altra cosa

Si la variable X eacutes meacutes petita que 7 fes alguna cosa

70 Iniciacioacute al llenguatge CAbans de comenccedilar a programar cal tenir en compte els conceptes de condicional i de cicle

Els condicionals ldquoif - elserdquo nomeacutes executen el codi a continuacioacute si la condicioacute que li fiquem entre paregraventesis eacutes certa Ho podriacuteem comparar amb el que seria una oracioacute condicional No eacutes obligatori perograve podem afegir la partiacutecula ldquoelserdquo que eacutes lrsquoequivalent a la paraula ldquosi nordquo En el cas a continuacioacute com que el condicional no es compleix srsquoexecutaria lrsquoelse

if (X lt 7) Fes alguna cosa else Fes una altra cosa

Els bucles ldquoforrdquo soacuten rutines que serveixen per ex-ecutar un codi un determinat nuacutemero de vegades Teacute tres parts separades per punt i coma entrada condicioacute i increment A la entrada li donem un va-lor a una variable A la condicioacute determinem que la rutina srsquoexecuti nomeacutes si eacutes compleix la condicioacute utilitzant la variable drsquoentrada Finalment en el in-crement fixem un nou valor a la variable aquesta part srsquoexecutaragrave a cada cicle En llenguatge C si no afegim cap dels tres paragravemetres el bucle seragrave infinit

for (int i = 1 i lt= 10 i++) Fes alguna cosa

La sentegravencia ldquowhilerdquo defineix que un codi srsquoexe-cutaragrave infinitament mentre que la condicioacute que es defineix sigui certa

while (D==5) Fes alguna cosa

19

71 Bloc 1 (Bagravesic)711 Hola moacuten

En aquesta pragravectica escriurem un text a la consograve-la el conegut ldquoHello Worldrdquo

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void) printf(ldquohola moacutenrdquo)

if (wiringPiSetup() == -1) exit (1)

return 0

712 Encendre un LED

Hem drsquoimportar aquestes llibreries per tal que la RaspberryPi entengui el codi

Aquesta eacutes la funcioacute principal (main) i srsquoexecutaragrave tot el que fiquem aquiacute dins

Amb la funcioacute printf() el que aconseguim eacutes que es mostri al terminal el text que hi posem entre comentes

Aquestes liacutenies de codi soacuten simplement compro-vacions per assegurar-nos que tot funciona cor-rectament Soacuten negligibles perograve eacutes recomanable posar-les Les afegirem a totes les pragravectiques

Connectarem la pota llarga (agravenode) del LED al pin 5v de la GPIO i lrsquoaltre pota (cagravetode) a una resistegraven-cia de 180Ω Aquesta distincioacute entre potes es deu a que els LEDs estan polaritzats mireu el glossa-ri per saber-ne meacutes Tot seguit connecteu lrsquoaltra pota de la resistegravencia al pin GROUND

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void)

20

Comprovacionsif (wiringPiSetup() == -1) exit (1)

int pin = 1

printf(ldquoEncenem el pin 18rdquo)

pinMode(pin OUTPUT)

digitalWrite(pin 1)

return 0

713 Encendre i apagar un LED cada dos segons 10 vegades

El que podeu veure aquiacute eacutes el que srsquoanomena un comentari del codi Tot allograve que escrivim despreacutes de ldquordquo el compilador no ho llegiragrave i per tant nomeacutes serveix per donar indicacions al programador

Declarem la variable pin que com eacutes un nombre enter escriurem int

Fem un printf() tal i com hem apregraves a la pragravectica anterior Escrivim el 18 ja que la numeracioacute de la llibreria wiringPi canvia respecte a la sortida real (mirar el cuadre de la pagravegina 17)

Amb la funcioacute pinMode() declarem que el pin nuacutemero 1 en aquest cas sigui un pin de sortida de corrent (OUTPUT)

Una vegada li hem dit que eacutes de sortida li hem de dir si el volem encegraves ldquo1rdquo o apagat ldquo0rdquo amb la funcioacute digitalWrite()

Utilitzarem el muntatge la de pragravectica anterior amb la diferegravencia que en comptes de connectar lrsquoagravenode del LED al pin de 5v el connectarem al pin 18 de la Raspberry Pi Drsquoaquesta manera podrem gestionar el pas de lrsquoelectricitat a traveacutes drsquoun petit programa que crearem a continuacioacute

21

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void) int pin = 1

if (wiringPiSetup() == -1) exit (1)

pinMode(pin OUTPUT)

for (int i=1ilt=10i++)

printf(ldquoLED Onnrdquo) digitalWrite(pin 1)

delay(2000)

printf(ldquoLED Offnrdquo) digitalWrite(pin 0)

delay(2000)

return 0

Utilitzem un bicle ldquoforrdquo per executar el codi 10 vegades

Encenem el LED

Fem un delay() de 2000 milmiddotlisegons (2 segons) que ens serveix per aturar el programa i per tant mantenir el LED encegraves durant aquest temps

Apaguem el LED

El mantenim apagat 2 segons

Lrsquoexpressioacute n serveix per canviar de liacutenia

Proposta Ara que ja saps els conceptes bagravesics de la CodePi intenta fer lrsquoequivalent al codi Morse per demanar ajuda SOS middot middot middot ndash ndash ndash middot middot middot (on cada punt significa LED encegraves durant 14 de segon i cada ralla LED encegraves durant mig segon) Juga amb el valor de la funcioacute delay() per fer que el LED estigui encegraves durant meacutes o menys temps

22

72 Bloc 2 (Mitjagrave)721 Encendre un LED apretant un botoacute

Utilitzar el muntatge del LED que hem fet servir a la pragravectica anterior A meacutes a meacutes hem drsquoafegir 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 aniragrave a parar al pin 23 una resistegravencia de 10KΩ al GROUND per forccedilar lrsquoestat LOW quan el polsador no estagrave apretat

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt int main (void) int pin_LED = 1 int pin_boto = 4 printf (ldquoEncenent un LED apretant un botoacutenrdquo) 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

Declarem el LED com un pin de sortidaI el botoacute com un pin drsquoentrada

Si no fiquem variables al for aquest srsquoexecutaragrave sempre

Amb la funcioacute digitalRead() detectem si passa cor-rent pel pin 8 eacutes a dir si el botoacute ha estat apretat Si eacutes aixiacute fem que srsquoencengui el LED

Si no fem que srsquoapagui

23

722 Encendre un LED apretant tots els puladors

Utilitzar el muntatge de la pragravectica anterior i afegir dos polsadors meacutes amb el mateix proceacutes connec-tats als ports 24 i 25 de la Raspberry Pi

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int main (void) int pin_LED = 1

int pin_boto_A = 4 int pin_boto_B = 5 int 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 ampamp digitalRead(pin_boto_B) == HIGH ampamp digitalRead(pin_boto_C) == HIGH) digitalWrite(pin_LED 1)

Declarem el LED i els tres botons que tal i com posa a lrsquoesquema corresponen als pins 23 24 i 25 de la GPIO

Si els tres polsadors estan premuts passa corrent pels tres i per tant srsquoenceacuten el LED

En aquest cas utilitzem HIGH i LOW en lloc de 1 i 0 respectivament HIGH significa que hi ha elec-tricitat i LOW que no hi ha

24

No apretats while (digitalRead(pin_boto_A) == LOW ampamp digitalRead(pin_boto_B) == LOW ampamp digitalRead(pin_boto_C) == LOW) digitalWrite(pin_LED 0)

Si no apagarsquol

723 Semagravefor amb polsador

En aquesta pragravectica crearem un semagravefor de via-nants i de cotxes Com alguns semagravefors aquests teacute un botoacute amb el qual els vianants demanen que es posi verd aixiacute que el dels cotxes es posa ver-mell

Connectarem dos LEDs (vermell i verd) als pins 18 i 23 de la Raspberry Pi amb una resistegravencia de 180Ω Tambeacute connectarem tres LEDs meacutes (verd vermell i taronja) de la mateixa manera en els ports 17 21 i 22 de la GPIO

A diferegravencia de les altres pragravectiques amb polsa-dors en aquesta el connectarem al port SDA0 i al GROUND ja que nomeacutes ens interessa detectar quan es prem

25

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

define VERMELL 0define GROC1define VERD 2define VERMELL_HOME3define VERD_HOME4

define BOTO 8

void setup (void) int i

if (geteuid () = 0) exit (0)

if (wiringPiSetup () == -1) exit (1)

fflush(stdout) for (i = 0 i lt 5 ++i) pinMode (i OUTPUT) digitalWrite (i 0) digitalWrite(VERD1)digitalWrite(VERMELL_HOME1) pinMode (BOTO INPUT)

printf (ldquoSetup fetnrdquo)

int main (void) setup () for () esperaBoto () aturaTransit () camina () tempsEspera () iniciaTransit ()

Amb lrsquoexpressioacute define li diem a la magravequina que cada cop que escrivim VERMELL en realitat es-tem posant el nombre 0 i el mateix amb les altres paraules

Fem un setup amb tota la configuracioacute necessagraveria

fflush() eacutes una funcioacute complexa que serveix per quumlestions de tractament de memograveria del sistema per evitar errors

Executem totes les funcions una darrera lrsquoaltra de manera indefinida

26

Esperant a que lrsquousuari premi el botoacute per comenccedilar

Fem que el semagravefor dels cotxes canviiuml de verd a vermell passant pel groc

Fem que el semagravefor dels vianants es posi verd

Temps intermig des que srsquoacaba de caminar fins que el trafic comenccedila

void esperaBoto (void) printf (ldquoEsperant el botoacute ldquo)fflush(stdout) while (digitalRead (BOTO) == HIGH) delay (100) printf (ldquoEsoerenrdquo)

void aturaTransit()printf(ldquoAturanteltraficldquo)fflush(stdout)digitalWrite(VERD0) digitalWrite (GROC 1) delay (2000) digitalWrite (GROC 0) digitalWrite(VERMELL1) delay (2000) printf (ldquoAturatsnrdquo)

void camina ()printf(ldquoCaminaldquo)fflush(stdout)

digitalWrite(VERMELL_HOME0)digitalWrite(VERD_HOME1) delay (10000) digitalWrite(VERMELL0) digitalWrite (GROC 1)

printf (ldquoJa han caminatnrdquo)

void tempsEspera () int i

printf (ldquoTemps drsquoespera ldquo) fflush(stdout)

for (i = 0 i lt 8 ++i)

27

delay (500) digitalWrite(VERD_HOME0) digitalWrite (GROC 0) delay (500) digitalWrite(VERD_HOME1) digitalWrite (GROC 1)

void iniciaTransit ()printf(ldquoInicianttraficldquo)fflush(stdout)

digitalWrite(VERD_HOME0)digitalWrite(VERMELL_HOME1) delay (500) digitalWrite (GROC 0) digitalWrite(VERD1)

Deixem via lliure pels vehicles i posem el semagrave-for vermell pels vianants

Proposta Utilitzant el que has apregraves en aquest bloc crear un projecte amb uns quants LEDs en fila que srsquoactivin ascendentment quan apretes un botoacute

28

73 Bloc 3 (Alt)731 Sistema portes logravegiques I

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int AND (int a int b) return a ampamp b

int OR (int a int b) return a || b

int NEGADA (int a) return a

int f(int a int b) return OR(AND(NE-GADA(a)b)AND(aNEGADA(b))) f(a b) = arsquob + abrsquo

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5

int apretat_A = 0 int apretat_B = 0

pinMode(pin_LED_S OUTPUT) pinMode(pin_boto_A INPUT) pinMode(pin_boto_B INPUT)

Crearem una funcioacute per a cada porta logravegica de tal manera que sigui meacutes fagravecil poder-ho aplicar despreacutes

Aquesta seragrave la foacutermula que compliragrave la taula de la veritat en aquest cas eacutes f(a b) = arsquob +abrsquo

Creem dos booleans (variables que poden ser 0 o 1) que ens indicaran si el botoacute ha estat premut o no

Declarem els pins drsquoentrada i de sortida com a totes les pragravectiques anteriors

El seguumlent projecte fa la mateixa funcioacute que acon-seguiriacuteem amb xips de portes logravegiques perograve fent els cagravelculs a partir de la RaspberryPi En aquest cas compleix la taula de la veritat drsquoun OR ex-clusive eacutes a dir nomeacutes srsquoencendragrave el LED quan premem un dels dos botons mai srsquoencendragrave 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 srsquoutilitzin en el codi

29

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) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins estan premuts

Comprovem quins no estan premuts

I apliquem la foacutermula amb els valors drsquoentrada cor-responents Si la foacutermula eacutes igual a 1 srsquoencendragrave el LED si no no srsquoencendragrave

732 Sistema portes logravegiques II

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

Partim de la mateixa base que la pragravectica ante-rior perograve en aquesta incloem una tercera variable drsquoentrada Aixiacute que hem drsquoafegir un nou botoacute en el pin del GPIO que srsquoescau

30

Seguim el patroacute de les foacutermules emprades a la pragravectica anterior

En aquest cas tenim tres variables drsquoentrada perograve la mecagravenica eacutes la mateixa Es pot jugar amb la foacutermula i anar provant diferents combinacions

Necessitem tres variables ja que hi ha tres botons

Declaracions

Comprovem quins estan premuts

int AND (int a int b) return a ampamp b

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 + arsquob

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5 int pin_boto_C = 6

int apretat_A = 0 int apretat_B = 0 int apretat_C = 0

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

31

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

Mostra resultat if (f(apretat_A apretat_B apretat_C) == 1) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins no estan premuts

Com al circuit anterior apliquem la foacutermula i si aquesta doacutena 1 encenem el LED

Proposta Ara que ja has apregraves els conceptes meacutes fonamentals de la CodePi inventarsquot un circuit amb el nivell de dificultat que consideris No et quedis amb el que se trsquoha ensenyat aquiacute sinoacute que cerca meacutes megravetodes que puguis utilitzar La creativitat eacutes bagravesica per a tot bon enginyer i amb aquesta pragravectica volem que demostris de quegrave ets capaccedil

32

8 Vols saber-ne meacutes El moacuten de la programacioacute i lrsquoelectrogravenica eacutes infinit La comunitat geek (= interessada) en aquests te-mes eacutes una de les meacutes servicials i altruista de tota la xarxa aixiacute que es poden trobar una quantitat inacabable de tutorials i pagravegines web especialitza-des en el que vulguem saber

81 Programari lliureEl programari lliure eacutes la base de la informagravetica ac-tual i encara juga un gran paper en algunes agraverees com els servidors web o els mogravebils amb sistema operatiu Android Aquiacute teniu un conjunt de pagravegines on podeu aprofundir sobre aquest apassionant moacuten de la llibertat digital

httpcawikipediaorgwikiRichard_Matthew_Stallmanhttpwwwfsforghttpwwwgnuorghttpwwwlinuxorghttpwwwunixorghttpwwwubuntucom

82 Raspberry PiSi desitges saber meacutes sobre el projecte sense agravenim de lucre Raspberry Pi i seguir fent projectes amb ella visita les pagines que trobaragraves a con-tinuacioacute Aquestes et donaran idees de quegrave fer amb aquest petit perograve fascinant ordinador

httplearnadafruitcomcategorylearn-raspber-ry-pihttpwwwraspberrypiorgwwwraspberrypiorghttpdangerousprototypescom20130202rasp-berry-pi-supercomputerhttpreviewscnetcoukdesktops25-fun-things-to-do-with-a-raspberry-pi-50009851httplearnadafruitcompi-thermal-printer

33

83 Electrogravenica Si lrsquoelectrogravenica bagravesica que has apregraves durant els tutorials de la CodePi trsquoha fet veure que aquest eacutes el moacuten que a tu trsquoagrada no paris A continu-acioacute et deixem pagravegines web on trobaragraves les bases de lrsquoelectrogravenica meacutes complexa i tambeacute molts nous circuits per muntar i seguir descobrint aquest moacuten que avui en dia fa que tots els aparells endollats a al corrent puguin funcionar

httpwwwinstructablescomidBeginners-Elec-tronics-ProjectshttpwwwinstructablescomidElectronic-Proj-ects-For-Beginnershttpwwwcircuitstodaycomsimple-electron-ics-projects-and-circuitshttpswwwsparkfuncomtutorialshttplearnadafruitcom

84 ProgramacioacuteDiuen que per ser un bon programador srsquohan de tenir unes habilitats que no tothom teacute disciplina ordre logravegica creativitat capacitat per resoldre qualsevol problema i per sobre de tot persistegravencia i passioacute Si creus que tens aquestes qualitats do-na-li una oportunitat a la programacioacute A continu-acioacute et deixem un recull de les pagravegines web que creiem que meacutes et poden ajudar a introduir-te una mica meacutes en la programacioacute web i la drsquoapli-cacions per a mogravebils

httpwwwcodeorghttpscratchmiteduhttpwwwcodecademycom

34

9 GlossariC (llenguatge de programacioacute) Des de la seva creacioacute lrsquoany 1972 srsquoha consolidat com un dels llenguatges de programacioacute meacutes utilitzats per fer aplicacions de software Eacutes considerat un dels meacutes bagravesics i meacutes comuns per introduir-se a la pro-gramacioacute Les grans companyies han utilitzat el C com a base per crear altres llenguatges com lrsquoObjective-C (utilitzat per fer les aplicacions per dispositius drsquoApple) o el C (creat per Microsoft i utilitzat entre altres coses per fer programes in-formagravetics per Windows)

Condensador Component electrogravenic classificat dins del grup dels passius i que per tant no emet cap senyal El podriacuteem definir com un acumula-dor drsquoelectrons que els deixa anar quan arriba a la seva capacitat magravexima Hi ha condensadors de dos tipus els electroliacutetics i els normals En les pragravec-tiques utilitzarem electroliacutetics i com que aquests tenen polaritat eacutes important tenir en compte quina eacutes la pota positiva i quina eacutes la negativa a lrsquohora de connectar-lo

Diacuteode Component electrogravenic passiu Teacute polaritat i seria lrsquoequivalent a una vagravelvula antiretorn lrsquoelec-tricitat nomeacutes pot anar en un sentit

Electrogravenica Disciplina que estudia els com-ponents electrogravenics que funcionen amb un flux drsquoelectrons (corrent continua)

Funcioacute Fragment de codi que conte un seguit drsquoaccions i que hi pots accedir cridant la funcioacute en comptes de repetint el codi Podriacuteem comparar-ho amb una funcioacute matemagravetica en la que tenim vari-ables drsquoentrada que tractant-les a la funcioacute ob-tenim una informacioacute de sortida

GPIO Soacuten les sigles de ldquoGeneral Purpose InputOutputrdquo Si mirem la Raspberry Pi soacuten els pins de sortida on hi connectem els cables amb els que programem la placa electrogravenica Lrsquoavantatge drsquoaquest tipus de connector respecte altres eacutes que es pot gestionar mitjanccedilant programacioacute i aixograve eacutes precisament el que explicarem en aquest manual

35

HDMI Soacuten les sigles de ldquoHigh-Definition Multime-dia Interfacerdquo Serveix per enviar viacutedeo i agraveudio a una pantalla Nosaltres lrsquoutilitzarem per connectar la RaspberryPi a una pantalla

LED Acrogravenim de ldquoLight Emitting Dioderdquo Eacutes un tipus de diacuteode el qual teacute una pelmiddotliacutecula de fogravesfor entre els dos connectors que fa que quan passi el corrent generi llum Com qualsevol altre diacuteode eacutes important tenir en compte la polaritat

RAM Acrogravenim de ldquoRandom Access Memoryrdquo Eacutes la part de lrsquoordinador encarregada drsquoemmagatze-mar els arxius temporals

RCA El connector RCA consisteix en diferents cables amb la punta de diferent color que serveix-en per transmetre agraveudio i viacutedeo

ROM De lrsquoanglegraves ldquoRead Only Memoryrdquo eacutes la uni-tat de memograveria on es guarda el sistema operatiu

Resistegravencia Eacutes un component electrogravenic que teacute com a funcioacute reduir el flux drsquoelectrons afi de controlar la seva potegravencia Eacutes molt comuacute a lrsquoelectrogravenica ja que eacutes molt necessari per assegu-rar-nos del correcte funcionament drsquoelements com el LED que sense una resistegravencia que limiteacutes el corrent podrien cremar-se

Placa base Eacutes la part de lrsquoordinador que conteacute elements com la RAM la ROM o el microproces-sador La placa base de lrsquoordinador que constru-irem amb aquest manual seria la progravepia Raspber-ry Pi

Protoboard Tambeacute coneguda com a Bread-board srsquoutilitza per crear circuits electrogravenics sense necessitat de soldar Per saber com funcio-na i com estan relacionats els diferents contactes consulteu aquesta webhttprduinostarcomdocumentaciongeneralpro-toboard-que-es-y-como-funciona

36

Terminal Eacutes el programa emprat per enviar ordres directes a lrsquoordinador i rebre respostes drsquoaquest Nosaltres lrsquoutilitzarem per instalmiddotlar els programes necessaris per programar les plaques electrograveniques i altres arxius necessaris

Variable Valor que canvia segons les operacions que es facin amb aquest al programa informagravetic Com ja sabeu hi ha variables independents (pe el temps) i dependents (pe si estagrave o no encegraves un LED que dependragrave drsquoaltres variables)

37

  • httpwwwfsforg
Page 12: CodePi

12

Mac OS X

Per instalmiddotlar Raspbian a Mac OS X tambeacute utilitza-rem lrsquoordre dd pero el funcionament per buscar en quin disc volem instalmiddotlar raspbian eacutes diferent Recomanem extreure el contingut del zip a la car-peta Usersusuari

Comenccedilarem buscant la targeta on volem instalmiddotlar raspbian executant la seguumlent ordre i copiarem el disk4 (sense agafar la particioacute)

Desmuntarem el disk en quumlestioacute

Ara executarem lrsquoordre dd amb permisos drsquoadmi- nistrador al modificador ldquoif=rdquo posarem la carpeta on hem descomprimit el zip (la de lrsquousuari eacutes per defecte o ~) amb el nom de lrsquoarxiu img descom-primit i al modificador ldquoof=rdquo escriurem el que hem copiat abans amb lrsquoanterior ordre

diskutil list

diskutil unmountDisk devdisk4

sudo dd bs=1m if=~2013-02-09-wheezy-raspbianimg of=devsdb

13

6 Primer inici i configuracioacute de la CodePiAra ja estem preparats per posar la targeta SD a la Raspberry Pi i connectar tots els cables per comenccedilar a programar A continuacioacute hem de se-guir uns passos que nomeacutes podrem fer durant la primera arrencada del sistema i que ens perme-tran iniciar lrsquoescriptori automagraveticament posar la CodePi en catalagrave i configurar la disposicioacute del te-clat entre drsquoaltres coses

Quan iniciem per primera vegada la Raspberry Pi amb el sistema operatiu Raspbian ens apareixeragrave la seguumlent pantalla on ens mourem utilitzant les fletxes i la tecla intro

La primera cosa que seleccionarem seragrave ldquoboot_behaviorrdquo que ens permetragrave inciar lrsquoescriptori quan el sistema iniciiuml

Ens mourem amb el teclat (dreta - esquerre) per fer que estigui seleccionat ldquoyesrdquo clicarem enter

14

Ara a continuacioacute ens mourem fins a ldquoexpand_rootfsrdquo que ens permetragrave expandir el tamany de la particioacute arrel de la Raspberry Pi al tamany magravex-im de la targeta SD eacutes a dir si tenim una targeta de 4 Gb si no fessim aquesta opcioacute estariacuteem util-itzant uacutenicament 2 Gb de capacitat

Acceptarem el seguumlent diagraveleg i passarem a con-figurar els idiomes

Buscarem ldquochange_localerdquo per canviar els idio-mes i la disposicioacute del teclat al catalagrave

De la seguumlent llista seleccionarem mitjanccedilant lrsquoes-pai del teclat totes les codificacions que comencin per ldquoCA_Per baixar a buscar-les utilitzarem les fletxes (amunt-avall) i per acabar clicarem la del costat dret i enter

15

Seleccionarem ldquochange_timezonerdquo per canviar la zona horagraveria de la Raspberry Pi i els temes rela-cionats amb aquesta

A continuacioacute seleccionarem el nostre continent

I per uacuteltim buscarem una ciutat que estigui a la mateixa zona horagraveria que nosaltres i la seleccio-nariacuteem tambeacute amb enter

64 Descarregar i executar ScriptPer descarregar lrsquoscript hem donar permisos i ex-ecutar-lo aixiacute que escriurem les seguumlents ordres en el terminal que podeu trobar a lrsquoescriptori

cd tmpmkdir CodePicd CodePiwget httpwwwtomorrowdevcomcodepiwiringPi-installshchmod +x wiringPi-installshwiringPi-installsh

Ja hem acabat de descarregar el programari que ens permetragrave programar amb la CodePi

16

7 PragravectiquesRecomanacioacute mirar aquests tutorials introduc-toris al llenguatge C httpthenewbostonorglistphpcat=14

Aquiacute teniu un quadre que us serviragrave lrsquoequivalegravencia entre els pins del GPIO i els que haurem de posar en el codi

Ja queda menys perquegrave puguis comenccedilar a pro-gramar perograve abans de fer-ho hauragraves de saber com compilar un programa Probablement ara et preguntaragraves quegrave eacutes compilar doncs compilar eacutes el proceacutes que fa un programa per traduir el codi que nosaltres hem escrit a codi binari amb la fi-nalitat de que el nostre ordinador pugui entendre cada ordre

Per compilar un codi escrit en C farem servir el compilador cc Abans drsquoutilitzar aquest programa haurem drsquoindicar a on hem guardat la nostra pragravec-tica amb lrsquoordre cdcc

-o practica

-Wall

-Iusrlocalinclude

-Lusrlocallib

practicac

-lwiringPi

Primer de tot posarem lrsquoordre al terminal

Utilitzarem el modificador -o per establir quin seragrave el nom del programa de sortida per exemple ldquopragravecticardquo

Amb aquest modificador indicarem que volem que ens doni tota la informacioacute dels errors de sintaxis del fitxer

Amb aquest indicarem on es troben els fitxers de la llibreria a incloure dintre del nostre fitxer

Utilitzant aquest altre modificador establim el di-rectori on ha de buscar els fitxers de la llibreria

Ara indicarem el nom del fitxer on es troba el nos-tre codi sempre acabant amb la terminacioacute c per exemple ldquopragravecticacrdquo

Amb aquest modificador posem la llibreria wiring-Pi a la llista de llibreries que han de ser afegides

17

Al final introduirem tot seguit al terminal una ordre similar a la seguumlent

cc -o practica -Wall -Iusrlocalinclude -Lusrlocallib practicac -lwiringPi

A part de saber compilar abans de comenccedilar a programar i a fer els nostres circuits haurem de saber quins soacuten els pins on haurem de connectar als cables a la Raspberry Pi aquest pins els iden-tificarem utilitzant nuacutemeros

La seguumlent taula ens permet saber lrsquoequivalegravencia entre els nuacutemeros de la GPIO els nuacutemeros de wiringPi la llibreria que interpretaragrave el nostre codi i la posicioacute dels pins

18

Des que la variable i eacutes igual a 1 fins i mentre que aquesta sigui igual o meacutes petita que10 executa el codi

Mentre que la variable D sigui igual a 5 el codi entre claus es llegiragrave infinites vegades

Si la variable X no eacutes meacutes petita que 7 fes una altra cosa

Si la variable X eacutes meacutes petita que 7 fes alguna cosa

70 Iniciacioacute al llenguatge CAbans de comenccedilar a programar cal tenir en compte els conceptes de condicional i de cicle

Els condicionals ldquoif - elserdquo nomeacutes executen el codi a continuacioacute si la condicioacute que li fiquem entre paregraventesis eacutes certa Ho podriacuteem comparar amb el que seria una oracioacute condicional No eacutes obligatori perograve podem afegir la partiacutecula ldquoelserdquo que eacutes lrsquoequivalent a la paraula ldquosi nordquo En el cas a continuacioacute com que el condicional no es compleix srsquoexecutaria lrsquoelse

if (X lt 7) Fes alguna cosa else Fes una altra cosa

Els bucles ldquoforrdquo soacuten rutines que serveixen per ex-ecutar un codi un determinat nuacutemero de vegades Teacute tres parts separades per punt i coma entrada condicioacute i increment A la entrada li donem un va-lor a una variable A la condicioacute determinem que la rutina srsquoexecuti nomeacutes si eacutes compleix la condicioacute utilitzant la variable drsquoentrada Finalment en el in-crement fixem un nou valor a la variable aquesta part srsquoexecutaragrave a cada cicle En llenguatge C si no afegim cap dels tres paragravemetres el bucle seragrave infinit

for (int i = 1 i lt= 10 i++) Fes alguna cosa

La sentegravencia ldquowhilerdquo defineix que un codi srsquoexe-cutaragrave infinitament mentre que la condicioacute que es defineix sigui certa

while (D==5) Fes alguna cosa

19

71 Bloc 1 (Bagravesic)711 Hola moacuten

En aquesta pragravectica escriurem un text a la consograve-la el conegut ldquoHello Worldrdquo

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void) printf(ldquohola moacutenrdquo)

if (wiringPiSetup() == -1) exit (1)

return 0

712 Encendre un LED

Hem drsquoimportar aquestes llibreries per tal que la RaspberryPi entengui el codi

Aquesta eacutes la funcioacute principal (main) i srsquoexecutaragrave tot el que fiquem aquiacute dins

Amb la funcioacute printf() el que aconseguim eacutes que es mostri al terminal el text que hi posem entre comentes

Aquestes liacutenies de codi soacuten simplement compro-vacions per assegurar-nos que tot funciona cor-rectament Soacuten negligibles perograve eacutes recomanable posar-les Les afegirem a totes les pragravectiques

Connectarem la pota llarga (agravenode) del LED al pin 5v de la GPIO i lrsquoaltre pota (cagravetode) a una resistegraven-cia de 180Ω Aquesta distincioacute entre potes es deu a que els LEDs estan polaritzats mireu el glossa-ri per saber-ne meacutes Tot seguit connecteu lrsquoaltra pota de la resistegravencia al pin GROUND

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void)

20

Comprovacionsif (wiringPiSetup() == -1) exit (1)

int pin = 1

printf(ldquoEncenem el pin 18rdquo)

pinMode(pin OUTPUT)

digitalWrite(pin 1)

return 0

713 Encendre i apagar un LED cada dos segons 10 vegades

El que podeu veure aquiacute eacutes el que srsquoanomena un comentari del codi Tot allograve que escrivim despreacutes de ldquordquo el compilador no ho llegiragrave i per tant nomeacutes serveix per donar indicacions al programador

Declarem la variable pin que com eacutes un nombre enter escriurem int

Fem un printf() tal i com hem apregraves a la pragravectica anterior Escrivim el 18 ja que la numeracioacute de la llibreria wiringPi canvia respecte a la sortida real (mirar el cuadre de la pagravegina 17)

Amb la funcioacute pinMode() declarem que el pin nuacutemero 1 en aquest cas sigui un pin de sortida de corrent (OUTPUT)

Una vegada li hem dit que eacutes de sortida li hem de dir si el volem encegraves ldquo1rdquo o apagat ldquo0rdquo amb la funcioacute digitalWrite()

Utilitzarem el muntatge la de pragravectica anterior amb la diferegravencia que en comptes de connectar lrsquoagravenode del LED al pin de 5v el connectarem al pin 18 de la Raspberry Pi Drsquoaquesta manera podrem gestionar el pas de lrsquoelectricitat a traveacutes drsquoun petit programa que crearem a continuacioacute

21

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void) int pin = 1

if (wiringPiSetup() == -1) exit (1)

pinMode(pin OUTPUT)

for (int i=1ilt=10i++)

printf(ldquoLED Onnrdquo) digitalWrite(pin 1)

delay(2000)

printf(ldquoLED Offnrdquo) digitalWrite(pin 0)

delay(2000)

return 0

Utilitzem un bicle ldquoforrdquo per executar el codi 10 vegades

Encenem el LED

Fem un delay() de 2000 milmiddotlisegons (2 segons) que ens serveix per aturar el programa i per tant mantenir el LED encegraves durant aquest temps

Apaguem el LED

El mantenim apagat 2 segons

Lrsquoexpressioacute n serveix per canviar de liacutenia

Proposta Ara que ja saps els conceptes bagravesics de la CodePi intenta fer lrsquoequivalent al codi Morse per demanar ajuda SOS middot middot middot ndash ndash ndash middot middot middot (on cada punt significa LED encegraves durant 14 de segon i cada ralla LED encegraves durant mig segon) Juga amb el valor de la funcioacute delay() per fer que el LED estigui encegraves durant meacutes o menys temps

22

72 Bloc 2 (Mitjagrave)721 Encendre un LED apretant un botoacute

Utilitzar el muntatge del LED que hem fet servir a la pragravectica anterior A meacutes a meacutes hem drsquoafegir 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 aniragrave a parar al pin 23 una resistegravencia de 10KΩ al GROUND per forccedilar lrsquoestat LOW quan el polsador no estagrave apretat

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt int main (void) int pin_LED = 1 int pin_boto = 4 printf (ldquoEncenent un LED apretant un botoacutenrdquo) 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

Declarem el LED com un pin de sortidaI el botoacute com un pin drsquoentrada

Si no fiquem variables al for aquest srsquoexecutaragrave sempre

Amb la funcioacute digitalRead() detectem si passa cor-rent pel pin 8 eacutes a dir si el botoacute ha estat apretat Si eacutes aixiacute fem que srsquoencengui el LED

Si no fem que srsquoapagui

23

722 Encendre un LED apretant tots els puladors

Utilitzar el muntatge de la pragravectica anterior i afegir dos polsadors meacutes amb el mateix proceacutes connec-tats als ports 24 i 25 de la Raspberry Pi

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int main (void) int pin_LED = 1

int pin_boto_A = 4 int pin_boto_B = 5 int 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 ampamp digitalRead(pin_boto_B) == HIGH ampamp digitalRead(pin_boto_C) == HIGH) digitalWrite(pin_LED 1)

Declarem el LED i els tres botons que tal i com posa a lrsquoesquema corresponen als pins 23 24 i 25 de la GPIO

Si els tres polsadors estan premuts passa corrent pels tres i per tant srsquoenceacuten el LED

En aquest cas utilitzem HIGH i LOW en lloc de 1 i 0 respectivament HIGH significa que hi ha elec-tricitat i LOW que no hi ha

24

No apretats while (digitalRead(pin_boto_A) == LOW ampamp digitalRead(pin_boto_B) == LOW ampamp digitalRead(pin_boto_C) == LOW) digitalWrite(pin_LED 0)

Si no apagarsquol

723 Semagravefor amb polsador

En aquesta pragravectica crearem un semagravefor de via-nants i de cotxes Com alguns semagravefors aquests teacute un botoacute amb el qual els vianants demanen que es posi verd aixiacute que el dels cotxes es posa ver-mell

Connectarem dos LEDs (vermell i verd) als pins 18 i 23 de la Raspberry Pi amb una resistegravencia de 180Ω Tambeacute connectarem tres LEDs meacutes (verd vermell i taronja) de la mateixa manera en els ports 17 21 i 22 de la GPIO

A diferegravencia de les altres pragravectiques amb polsa-dors en aquesta el connectarem al port SDA0 i al GROUND ja que nomeacutes ens interessa detectar quan es prem

25

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

define VERMELL 0define GROC1define VERD 2define VERMELL_HOME3define VERD_HOME4

define BOTO 8

void setup (void) int i

if (geteuid () = 0) exit (0)

if (wiringPiSetup () == -1) exit (1)

fflush(stdout) for (i = 0 i lt 5 ++i) pinMode (i OUTPUT) digitalWrite (i 0) digitalWrite(VERD1)digitalWrite(VERMELL_HOME1) pinMode (BOTO INPUT)

printf (ldquoSetup fetnrdquo)

int main (void) setup () for () esperaBoto () aturaTransit () camina () tempsEspera () iniciaTransit ()

Amb lrsquoexpressioacute define li diem a la magravequina que cada cop que escrivim VERMELL en realitat es-tem posant el nombre 0 i el mateix amb les altres paraules

Fem un setup amb tota la configuracioacute necessagraveria

fflush() eacutes una funcioacute complexa que serveix per quumlestions de tractament de memograveria del sistema per evitar errors

Executem totes les funcions una darrera lrsquoaltra de manera indefinida

26

Esperant a que lrsquousuari premi el botoacute per comenccedilar

Fem que el semagravefor dels cotxes canviiuml de verd a vermell passant pel groc

Fem que el semagravefor dels vianants es posi verd

Temps intermig des que srsquoacaba de caminar fins que el trafic comenccedila

void esperaBoto (void) printf (ldquoEsperant el botoacute ldquo)fflush(stdout) while (digitalRead (BOTO) == HIGH) delay (100) printf (ldquoEsoerenrdquo)

void aturaTransit()printf(ldquoAturanteltraficldquo)fflush(stdout)digitalWrite(VERD0) digitalWrite (GROC 1) delay (2000) digitalWrite (GROC 0) digitalWrite(VERMELL1) delay (2000) printf (ldquoAturatsnrdquo)

void camina ()printf(ldquoCaminaldquo)fflush(stdout)

digitalWrite(VERMELL_HOME0)digitalWrite(VERD_HOME1) delay (10000) digitalWrite(VERMELL0) digitalWrite (GROC 1)

printf (ldquoJa han caminatnrdquo)

void tempsEspera () int i

printf (ldquoTemps drsquoespera ldquo) fflush(stdout)

for (i = 0 i lt 8 ++i)

27

delay (500) digitalWrite(VERD_HOME0) digitalWrite (GROC 0) delay (500) digitalWrite(VERD_HOME1) digitalWrite (GROC 1)

void iniciaTransit ()printf(ldquoInicianttraficldquo)fflush(stdout)

digitalWrite(VERD_HOME0)digitalWrite(VERMELL_HOME1) delay (500) digitalWrite (GROC 0) digitalWrite(VERD1)

Deixem via lliure pels vehicles i posem el semagrave-for vermell pels vianants

Proposta Utilitzant el que has apregraves en aquest bloc crear un projecte amb uns quants LEDs en fila que srsquoactivin ascendentment quan apretes un botoacute

28

73 Bloc 3 (Alt)731 Sistema portes logravegiques I

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int AND (int a int b) return a ampamp b

int OR (int a int b) return a || b

int NEGADA (int a) return a

int f(int a int b) return OR(AND(NE-GADA(a)b)AND(aNEGADA(b))) f(a b) = arsquob + abrsquo

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5

int apretat_A = 0 int apretat_B = 0

pinMode(pin_LED_S OUTPUT) pinMode(pin_boto_A INPUT) pinMode(pin_boto_B INPUT)

Crearem una funcioacute per a cada porta logravegica de tal manera que sigui meacutes fagravecil poder-ho aplicar despreacutes

Aquesta seragrave la foacutermula que compliragrave la taula de la veritat en aquest cas eacutes f(a b) = arsquob +abrsquo

Creem dos booleans (variables que poden ser 0 o 1) que ens indicaran si el botoacute ha estat premut o no

Declarem els pins drsquoentrada i de sortida com a totes les pragravectiques anteriors

El seguumlent projecte fa la mateixa funcioacute que acon-seguiriacuteem amb xips de portes logravegiques perograve fent els cagravelculs a partir de la RaspberryPi En aquest cas compleix la taula de la veritat drsquoun OR ex-clusive eacutes a dir nomeacutes srsquoencendragrave el LED quan premem un dels dos botons mai srsquoencendragrave 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 srsquoutilitzin en el codi

29

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) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins estan premuts

Comprovem quins no estan premuts

I apliquem la foacutermula amb els valors drsquoentrada cor-responents Si la foacutermula eacutes igual a 1 srsquoencendragrave el LED si no no srsquoencendragrave

732 Sistema portes logravegiques II

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

Partim de la mateixa base que la pragravectica ante-rior perograve en aquesta incloem una tercera variable drsquoentrada Aixiacute que hem drsquoafegir un nou botoacute en el pin del GPIO que srsquoescau

30

Seguim el patroacute de les foacutermules emprades a la pragravectica anterior

En aquest cas tenim tres variables drsquoentrada perograve la mecagravenica eacutes la mateixa Es pot jugar amb la foacutermula i anar provant diferents combinacions

Necessitem tres variables ja que hi ha tres botons

Declaracions

Comprovem quins estan premuts

int AND (int a int b) return a ampamp b

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 + arsquob

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5 int pin_boto_C = 6

int apretat_A = 0 int apretat_B = 0 int apretat_C = 0

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

31

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

Mostra resultat if (f(apretat_A apretat_B apretat_C) == 1) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins no estan premuts

Com al circuit anterior apliquem la foacutermula i si aquesta doacutena 1 encenem el LED

Proposta Ara que ja has apregraves els conceptes meacutes fonamentals de la CodePi inventarsquot un circuit amb el nivell de dificultat que consideris No et quedis amb el que se trsquoha ensenyat aquiacute sinoacute que cerca meacutes megravetodes que puguis utilitzar La creativitat eacutes bagravesica per a tot bon enginyer i amb aquesta pragravectica volem que demostris de quegrave ets capaccedil

32

8 Vols saber-ne meacutes El moacuten de la programacioacute i lrsquoelectrogravenica eacutes infinit La comunitat geek (= interessada) en aquests te-mes eacutes una de les meacutes servicials i altruista de tota la xarxa aixiacute que es poden trobar una quantitat inacabable de tutorials i pagravegines web especialitza-des en el que vulguem saber

81 Programari lliureEl programari lliure eacutes la base de la informagravetica ac-tual i encara juga un gran paper en algunes agraverees com els servidors web o els mogravebils amb sistema operatiu Android Aquiacute teniu un conjunt de pagravegines on podeu aprofundir sobre aquest apassionant moacuten de la llibertat digital

httpcawikipediaorgwikiRichard_Matthew_Stallmanhttpwwwfsforghttpwwwgnuorghttpwwwlinuxorghttpwwwunixorghttpwwwubuntucom

82 Raspberry PiSi desitges saber meacutes sobre el projecte sense agravenim de lucre Raspberry Pi i seguir fent projectes amb ella visita les pagines que trobaragraves a con-tinuacioacute Aquestes et donaran idees de quegrave fer amb aquest petit perograve fascinant ordinador

httplearnadafruitcomcategorylearn-raspber-ry-pihttpwwwraspberrypiorgwwwraspberrypiorghttpdangerousprototypescom20130202rasp-berry-pi-supercomputerhttpreviewscnetcoukdesktops25-fun-things-to-do-with-a-raspberry-pi-50009851httplearnadafruitcompi-thermal-printer

33

83 Electrogravenica Si lrsquoelectrogravenica bagravesica que has apregraves durant els tutorials de la CodePi trsquoha fet veure que aquest eacutes el moacuten que a tu trsquoagrada no paris A continu-acioacute et deixem pagravegines web on trobaragraves les bases de lrsquoelectrogravenica meacutes complexa i tambeacute molts nous circuits per muntar i seguir descobrint aquest moacuten que avui en dia fa que tots els aparells endollats a al corrent puguin funcionar

httpwwwinstructablescomidBeginners-Elec-tronics-ProjectshttpwwwinstructablescomidElectronic-Proj-ects-For-Beginnershttpwwwcircuitstodaycomsimple-electron-ics-projects-and-circuitshttpswwwsparkfuncomtutorialshttplearnadafruitcom

84 ProgramacioacuteDiuen que per ser un bon programador srsquohan de tenir unes habilitats que no tothom teacute disciplina ordre logravegica creativitat capacitat per resoldre qualsevol problema i per sobre de tot persistegravencia i passioacute Si creus que tens aquestes qualitats do-na-li una oportunitat a la programacioacute A continu-acioacute et deixem un recull de les pagravegines web que creiem que meacutes et poden ajudar a introduir-te una mica meacutes en la programacioacute web i la drsquoapli-cacions per a mogravebils

httpwwwcodeorghttpscratchmiteduhttpwwwcodecademycom

34

9 GlossariC (llenguatge de programacioacute) Des de la seva creacioacute lrsquoany 1972 srsquoha consolidat com un dels llenguatges de programacioacute meacutes utilitzats per fer aplicacions de software Eacutes considerat un dels meacutes bagravesics i meacutes comuns per introduir-se a la pro-gramacioacute Les grans companyies han utilitzat el C com a base per crear altres llenguatges com lrsquoObjective-C (utilitzat per fer les aplicacions per dispositius drsquoApple) o el C (creat per Microsoft i utilitzat entre altres coses per fer programes in-formagravetics per Windows)

Condensador Component electrogravenic classificat dins del grup dels passius i que per tant no emet cap senyal El podriacuteem definir com un acumula-dor drsquoelectrons que els deixa anar quan arriba a la seva capacitat magravexima Hi ha condensadors de dos tipus els electroliacutetics i els normals En les pragravec-tiques utilitzarem electroliacutetics i com que aquests tenen polaritat eacutes important tenir en compte quina eacutes la pota positiva i quina eacutes la negativa a lrsquohora de connectar-lo

Diacuteode Component electrogravenic passiu Teacute polaritat i seria lrsquoequivalent a una vagravelvula antiretorn lrsquoelec-tricitat nomeacutes pot anar en un sentit

Electrogravenica Disciplina que estudia els com-ponents electrogravenics que funcionen amb un flux drsquoelectrons (corrent continua)

Funcioacute Fragment de codi que conte un seguit drsquoaccions i que hi pots accedir cridant la funcioacute en comptes de repetint el codi Podriacuteem comparar-ho amb una funcioacute matemagravetica en la que tenim vari-ables drsquoentrada que tractant-les a la funcioacute ob-tenim una informacioacute de sortida

GPIO Soacuten les sigles de ldquoGeneral Purpose InputOutputrdquo Si mirem la Raspberry Pi soacuten els pins de sortida on hi connectem els cables amb els que programem la placa electrogravenica Lrsquoavantatge drsquoaquest tipus de connector respecte altres eacutes que es pot gestionar mitjanccedilant programacioacute i aixograve eacutes precisament el que explicarem en aquest manual

35

HDMI Soacuten les sigles de ldquoHigh-Definition Multime-dia Interfacerdquo Serveix per enviar viacutedeo i agraveudio a una pantalla Nosaltres lrsquoutilitzarem per connectar la RaspberryPi a una pantalla

LED Acrogravenim de ldquoLight Emitting Dioderdquo Eacutes un tipus de diacuteode el qual teacute una pelmiddotliacutecula de fogravesfor entre els dos connectors que fa que quan passi el corrent generi llum Com qualsevol altre diacuteode eacutes important tenir en compte la polaritat

RAM Acrogravenim de ldquoRandom Access Memoryrdquo Eacutes la part de lrsquoordinador encarregada drsquoemmagatze-mar els arxius temporals

RCA El connector RCA consisteix en diferents cables amb la punta de diferent color que serveix-en per transmetre agraveudio i viacutedeo

ROM De lrsquoanglegraves ldquoRead Only Memoryrdquo eacutes la uni-tat de memograveria on es guarda el sistema operatiu

Resistegravencia Eacutes un component electrogravenic que teacute com a funcioacute reduir el flux drsquoelectrons afi de controlar la seva potegravencia Eacutes molt comuacute a lrsquoelectrogravenica ja que eacutes molt necessari per assegu-rar-nos del correcte funcionament drsquoelements com el LED que sense una resistegravencia que limiteacutes el corrent podrien cremar-se

Placa base Eacutes la part de lrsquoordinador que conteacute elements com la RAM la ROM o el microproces-sador La placa base de lrsquoordinador que constru-irem amb aquest manual seria la progravepia Raspber-ry Pi

Protoboard Tambeacute coneguda com a Bread-board srsquoutilitza per crear circuits electrogravenics sense necessitat de soldar Per saber com funcio-na i com estan relacionats els diferents contactes consulteu aquesta webhttprduinostarcomdocumentaciongeneralpro-toboard-que-es-y-como-funciona

36

Terminal Eacutes el programa emprat per enviar ordres directes a lrsquoordinador i rebre respostes drsquoaquest Nosaltres lrsquoutilitzarem per instalmiddotlar els programes necessaris per programar les plaques electrograveniques i altres arxius necessaris

Variable Valor que canvia segons les operacions que es facin amb aquest al programa informagravetic Com ja sabeu hi ha variables independents (pe el temps) i dependents (pe si estagrave o no encegraves un LED que dependragrave drsquoaltres variables)

37

  • httpwwwfsforg
Page 13: CodePi

13

6 Primer inici i configuracioacute de la CodePiAra ja estem preparats per posar la targeta SD a la Raspberry Pi i connectar tots els cables per comenccedilar a programar A continuacioacute hem de se-guir uns passos que nomeacutes podrem fer durant la primera arrencada del sistema i que ens perme-tran iniciar lrsquoescriptori automagraveticament posar la CodePi en catalagrave i configurar la disposicioacute del te-clat entre drsquoaltres coses

Quan iniciem per primera vegada la Raspberry Pi amb el sistema operatiu Raspbian ens apareixeragrave la seguumlent pantalla on ens mourem utilitzant les fletxes i la tecla intro

La primera cosa que seleccionarem seragrave ldquoboot_behaviorrdquo que ens permetragrave inciar lrsquoescriptori quan el sistema iniciiuml

Ens mourem amb el teclat (dreta - esquerre) per fer que estigui seleccionat ldquoyesrdquo clicarem enter

14

Ara a continuacioacute ens mourem fins a ldquoexpand_rootfsrdquo que ens permetragrave expandir el tamany de la particioacute arrel de la Raspberry Pi al tamany magravex-im de la targeta SD eacutes a dir si tenim una targeta de 4 Gb si no fessim aquesta opcioacute estariacuteem util-itzant uacutenicament 2 Gb de capacitat

Acceptarem el seguumlent diagraveleg i passarem a con-figurar els idiomes

Buscarem ldquochange_localerdquo per canviar els idio-mes i la disposicioacute del teclat al catalagrave

De la seguumlent llista seleccionarem mitjanccedilant lrsquoes-pai del teclat totes les codificacions que comencin per ldquoCA_Per baixar a buscar-les utilitzarem les fletxes (amunt-avall) i per acabar clicarem la del costat dret i enter

15

Seleccionarem ldquochange_timezonerdquo per canviar la zona horagraveria de la Raspberry Pi i els temes rela-cionats amb aquesta

A continuacioacute seleccionarem el nostre continent

I per uacuteltim buscarem una ciutat que estigui a la mateixa zona horagraveria que nosaltres i la seleccio-nariacuteem tambeacute amb enter

64 Descarregar i executar ScriptPer descarregar lrsquoscript hem donar permisos i ex-ecutar-lo aixiacute que escriurem les seguumlents ordres en el terminal que podeu trobar a lrsquoescriptori

cd tmpmkdir CodePicd CodePiwget httpwwwtomorrowdevcomcodepiwiringPi-installshchmod +x wiringPi-installshwiringPi-installsh

Ja hem acabat de descarregar el programari que ens permetragrave programar amb la CodePi

16

7 PragravectiquesRecomanacioacute mirar aquests tutorials introduc-toris al llenguatge C httpthenewbostonorglistphpcat=14

Aquiacute teniu un quadre que us serviragrave lrsquoequivalegravencia entre els pins del GPIO i els que haurem de posar en el codi

Ja queda menys perquegrave puguis comenccedilar a pro-gramar perograve abans de fer-ho hauragraves de saber com compilar un programa Probablement ara et preguntaragraves quegrave eacutes compilar doncs compilar eacutes el proceacutes que fa un programa per traduir el codi que nosaltres hem escrit a codi binari amb la fi-nalitat de que el nostre ordinador pugui entendre cada ordre

Per compilar un codi escrit en C farem servir el compilador cc Abans drsquoutilitzar aquest programa haurem drsquoindicar a on hem guardat la nostra pragravec-tica amb lrsquoordre cdcc

-o practica

-Wall

-Iusrlocalinclude

-Lusrlocallib

practicac

-lwiringPi

Primer de tot posarem lrsquoordre al terminal

Utilitzarem el modificador -o per establir quin seragrave el nom del programa de sortida per exemple ldquopragravecticardquo

Amb aquest modificador indicarem que volem que ens doni tota la informacioacute dels errors de sintaxis del fitxer

Amb aquest indicarem on es troben els fitxers de la llibreria a incloure dintre del nostre fitxer

Utilitzant aquest altre modificador establim el di-rectori on ha de buscar els fitxers de la llibreria

Ara indicarem el nom del fitxer on es troba el nos-tre codi sempre acabant amb la terminacioacute c per exemple ldquopragravecticacrdquo

Amb aquest modificador posem la llibreria wiring-Pi a la llista de llibreries que han de ser afegides

17

Al final introduirem tot seguit al terminal una ordre similar a la seguumlent

cc -o practica -Wall -Iusrlocalinclude -Lusrlocallib practicac -lwiringPi

A part de saber compilar abans de comenccedilar a programar i a fer els nostres circuits haurem de saber quins soacuten els pins on haurem de connectar als cables a la Raspberry Pi aquest pins els iden-tificarem utilitzant nuacutemeros

La seguumlent taula ens permet saber lrsquoequivalegravencia entre els nuacutemeros de la GPIO els nuacutemeros de wiringPi la llibreria que interpretaragrave el nostre codi i la posicioacute dels pins

18

Des que la variable i eacutes igual a 1 fins i mentre que aquesta sigui igual o meacutes petita que10 executa el codi

Mentre que la variable D sigui igual a 5 el codi entre claus es llegiragrave infinites vegades

Si la variable X no eacutes meacutes petita que 7 fes una altra cosa

Si la variable X eacutes meacutes petita que 7 fes alguna cosa

70 Iniciacioacute al llenguatge CAbans de comenccedilar a programar cal tenir en compte els conceptes de condicional i de cicle

Els condicionals ldquoif - elserdquo nomeacutes executen el codi a continuacioacute si la condicioacute que li fiquem entre paregraventesis eacutes certa Ho podriacuteem comparar amb el que seria una oracioacute condicional No eacutes obligatori perograve podem afegir la partiacutecula ldquoelserdquo que eacutes lrsquoequivalent a la paraula ldquosi nordquo En el cas a continuacioacute com que el condicional no es compleix srsquoexecutaria lrsquoelse

if (X lt 7) Fes alguna cosa else Fes una altra cosa

Els bucles ldquoforrdquo soacuten rutines que serveixen per ex-ecutar un codi un determinat nuacutemero de vegades Teacute tres parts separades per punt i coma entrada condicioacute i increment A la entrada li donem un va-lor a una variable A la condicioacute determinem que la rutina srsquoexecuti nomeacutes si eacutes compleix la condicioacute utilitzant la variable drsquoentrada Finalment en el in-crement fixem un nou valor a la variable aquesta part srsquoexecutaragrave a cada cicle En llenguatge C si no afegim cap dels tres paragravemetres el bucle seragrave infinit

for (int i = 1 i lt= 10 i++) Fes alguna cosa

La sentegravencia ldquowhilerdquo defineix que un codi srsquoexe-cutaragrave infinitament mentre que la condicioacute que es defineix sigui certa

while (D==5) Fes alguna cosa

19

71 Bloc 1 (Bagravesic)711 Hola moacuten

En aquesta pragravectica escriurem un text a la consograve-la el conegut ldquoHello Worldrdquo

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void) printf(ldquohola moacutenrdquo)

if (wiringPiSetup() == -1) exit (1)

return 0

712 Encendre un LED

Hem drsquoimportar aquestes llibreries per tal que la RaspberryPi entengui el codi

Aquesta eacutes la funcioacute principal (main) i srsquoexecutaragrave tot el que fiquem aquiacute dins

Amb la funcioacute printf() el que aconseguim eacutes que es mostri al terminal el text que hi posem entre comentes

Aquestes liacutenies de codi soacuten simplement compro-vacions per assegurar-nos que tot funciona cor-rectament Soacuten negligibles perograve eacutes recomanable posar-les Les afegirem a totes les pragravectiques

Connectarem la pota llarga (agravenode) del LED al pin 5v de la GPIO i lrsquoaltre pota (cagravetode) a una resistegraven-cia de 180Ω Aquesta distincioacute entre potes es deu a que els LEDs estan polaritzats mireu el glossa-ri per saber-ne meacutes Tot seguit connecteu lrsquoaltra pota de la resistegravencia al pin GROUND

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void)

20

Comprovacionsif (wiringPiSetup() == -1) exit (1)

int pin = 1

printf(ldquoEncenem el pin 18rdquo)

pinMode(pin OUTPUT)

digitalWrite(pin 1)

return 0

713 Encendre i apagar un LED cada dos segons 10 vegades

El que podeu veure aquiacute eacutes el que srsquoanomena un comentari del codi Tot allograve que escrivim despreacutes de ldquordquo el compilador no ho llegiragrave i per tant nomeacutes serveix per donar indicacions al programador

Declarem la variable pin que com eacutes un nombre enter escriurem int

Fem un printf() tal i com hem apregraves a la pragravectica anterior Escrivim el 18 ja que la numeracioacute de la llibreria wiringPi canvia respecte a la sortida real (mirar el cuadre de la pagravegina 17)

Amb la funcioacute pinMode() declarem que el pin nuacutemero 1 en aquest cas sigui un pin de sortida de corrent (OUTPUT)

Una vegada li hem dit que eacutes de sortida li hem de dir si el volem encegraves ldquo1rdquo o apagat ldquo0rdquo amb la funcioacute digitalWrite()

Utilitzarem el muntatge la de pragravectica anterior amb la diferegravencia que en comptes de connectar lrsquoagravenode del LED al pin de 5v el connectarem al pin 18 de la Raspberry Pi Drsquoaquesta manera podrem gestionar el pas de lrsquoelectricitat a traveacutes drsquoun petit programa que crearem a continuacioacute

21

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void) int pin = 1

if (wiringPiSetup() == -1) exit (1)

pinMode(pin OUTPUT)

for (int i=1ilt=10i++)

printf(ldquoLED Onnrdquo) digitalWrite(pin 1)

delay(2000)

printf(ldquoLED Offnrdquo) digitalWrite(pin 0)

delay(2000)

return 0

Utilitzem un bicle ldquoforrdquo per executar el codi 10 vegades

Encenem el LED

Fem un delay() de 2000 milmiddotlisegons (2 segons) que ens serveix per aturar el programa i per tant mantenir el LED encegraves durant aquest temps

Apaguem el LED

El mantenim apagat 2 segons

Lrsquoexpressioacute n serveix per canviar de liacutenia

Proposta Ara que ja saps els conceptes bagravesics de la CodePi intenta fer lrsquoequivalent al codi Morse per demanar ajuda SOS middot middot middot ndash ndash ndash middot middot middot (on cada punt significa LED encegraves durant 14 de segon i cada ralla LED encegraves durant mig segon) Juga amb el valor de la funcioacute delay() per fer que el LED estigui encegraves durant meacutes o menys temps

22

72 Bloc 2 (Mitjagrave)721 Encendre un LED apretant un botoacute

Utilitzar el muntatge del LED que hem fet servir a la pragravectica anterior A meacutes a meacutes hem drsquoafegir 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 aniragrave a parar al pin 23 una resistegravencia de 10KΩ al GROUND per forccedilar lrsquoestat LOW quan el polsador no estagrave apretat

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt int main (void) int pin_LED = 1 int pin_boto = 4 printf (ldquoEncenent un LED apretant un botoacutenrdquo) 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

Declarem el LED com un pin de sortidaI el botoacute com un pin drsquoentrada

Si no fiquem variables al for aquest srsquoexecutaragrave sempre

Amb la funcioacute digitalRead() detectem si passa cor-rent pel pin 8 eacutes a dir si el botoacute ha estat apretat Si eacutes aixiacute fem que srsquoencengui el LED

Si no fem que srsquoapagui

23

722 Encendre un LED apretant tots els puladors

Utilitzar el muntatge de la pragravectica anterior i afegir dos polsadors meacutes amb el mateix proceacutes connec-tats als ports 24 i 25 de la Raspberry Pi

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int main (void) int pin_LED = 1

int pin_boto_A = 4 int pin_boto_B = 5 int 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 ampamp digitalRead(pin_boto_B) == HIGH ampamp digitalRead(pin_boto_C) == HIGH) digitalWrite(pin_LED 1)

Declarem el LED i els tres botons que tal i com posa a lrsquoesquema corresponen als pins 23 24 i 25 de la GPIO

Si els tres polsadors estan premuts passa corrent pels tres i per tant srsquoenceacuten el LED

En aquest cas utilitzem HIGH i LOW en lloc de 1 i 0 respectivament HIGH significa que hi ha elec-tricitat i LOW que no hi ha

24

No apretats while (digitalRead(pin_boto_A) == LOW ampamp digitalRead(pin_boto_B) == LOW ampamp digitalRead(pin_boto_C) == LOW) digitalWrite(pin_LED 0)

Si no apagarsquol

723 Semagravefor amb polsador

En aquesta pragravectica crearem un semagravefor de via-nants i de cotxes Com alguns semagravefors aquests teacute un botoacute amb el qual els vianants demanen que es posi verd aixiacute que el dels cotxes es posa ver-mell

Connectarem dos LEDs (vermell i verd) als pins 18 i 23 de la Raspberry Pi amb una resistegravencia de 180Ω Tambeacute connectarem tres LEDs meacutes (verd vermell i taronja) de la mateixa manera en els ports 17 21 i 22 de la GPIO

A diferegravencia de les altres pragravectiques amb polsa-dors en aquesta el connectarem al port SDA0 i al GROUND ja que nomeacutes ens interessa detectar quan es prem

25

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

define VERMELL 0define GROC1define VERD 2define VERMELL_HOME3define VERD_HOME4

define BOTO 8

void setup (void) int i

if (geteuid () = 0) exit (0)

if (wiringPiSetup () == -1) exit (1)

fflush(stdout) for (i = 0 i lt 5 ++i) pinMode (i OUTPUT) digitalWrite (i 0) digitalWrite(VERD1)digitalWrite(VERMELL_HOME1) pinMode (BOTO INPUT)

printf (ldquoSetup fetnrdquo)

int main (void) setup () for () esperaBoto () aturaTransit () camina () tempsEspera () iniciaTransit ()

Amb lrsquoexpressioacute define li diem a la magravequina que cada cop que escrivim VERMELL en realitat es-tem posant el nombre 0 i el mateix amb les altres paraules

Fem un setup amb tota la configuracioacute necessagraveria

fflush() eacutes una funcioacute complexa que serveix per quumlestions de tractament de memograveria del sistema per evitar errors

Executem totes les funcions una darrera lrsquoaltra de manera indefinida

26

Esperant a que lrsquousuari premi el botoacute per comenccedilar

Fem que el semagravefor dels cotxes canviiuml de verd a vermell passant pel groc

Fem que el semagravefor dels vianants es posi verd

Temps intermig des que srsquoacaba de caminar fins que el trafic comenccedila

void esperaBoto (void) printf (ldquoEsperant el botoacute ldquo)fflush(stdout) while (digitalRead (BOTO) == HIGH) delay (100) printf (ldquoEsoerenrdquo)

void aturaTransit()printf(ldquoAturanteltraficldquo)fflush(stdout)digitalWrite(VERD0) digitalWrite (GROC 1) delay (2000) digitalWrite (GROC 0) digitalWrite(VERMELL1) delay (2000) printf (ldquoAturatsnrdquo)

void camina ()printf(ldquoCaminaldquo)fflush(stdout)

digitalWrite(VERMELL_HOME0)digitalWrite(VERD_HOME1) delay (10000) digitalWrite(VERMELL0) digitalWrite (GROC 1)

printf (ldquoJa han caminatnrdquo)

void tempsEspera () int i

printf (ldquoTemps drsquoespera ldquo) fflush(stdout)

for (i = 0 i lt 8 ++i)

27

delay (500) digitalWrite(VERD_HOME0) digitalWrite (GROC 0) delay (500) digitalWrite(VERD_HOME1) digitalWrite (GROC 1)

void iniciaTransit ()printf(ldquoInicianttraficldquo)fflush(stdout)

digitalWrite(VERD_HOME0)digitalWrite(VERMELL_HOME1) delay (500) digitalWrite (GROC 0) digitalWrite(VERD1)

Deixem via lliure pels vehicles i posem el semagrave-for vermell pels vianants

Proposta Utilitzant el que has apregraves en aquest bloc crear un projecte amb uns quants LEDs en fila que srsquoactivin ascendentment quan apretes un botoacute

28

73 Bloc 3 (Alt)731 Sistema portes logravegiques I

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int AND (int a int b) return a ampamp b

int OR (int a int b) return a || b

int NEGADA (int a) return a

int f(int a int b) return OR(AND(NE-GADA(a)b)AND(aNEGADA(b))) f(a b) = arsquob + abrsquo

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5

int apretat_A = 0 int apretat_B = 0

pinMode(pin_LED_S OUTPUT) pinMode(pin_boto_A INPUT) pinMode(pin_boto_B INPUT)

Crearem una funcioacute per a cada porta logravegica de tal manera que sigui meacutes fagravecil poder-ho aplicar despreacutes

Aquesta seragrave la foacutermula que compliragrave la taula de la veritat en aquest cas eacutes f(a b) = arsquob +abrsquo

Creem dos booleans (variables que poden ser 0 o 1) que ens indicaran si el botoacute ha estat premut o no

Declarem els pins drsquoentrada i de sortida com a totes les pragravectiques anteriors

El seguumlent projecte fa la mateixa funcioacute que acon-seguiriacuteem amb xips de portes logravegiques perograve fent els cagravelculs a partir de la RaspberryPi En aquest cas compleix la taula de la veritat drsquoun OR ex-clusive eacutes a dir nomeacutes srsquoencendragrave el LED quan premem un dels dos botons mai srsquoencendragrave 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 srsquoutilitzin en el codi

29

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) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins estan premuts

Comprovem quins no estan premuts

I apliquem la foacutermula amb els valors drsquoentrada cor-responents Si la foacutermula eacutes igual a 1 srsquoencendragrave el LED si no no srsquoencendragrave

732 Sistema portes logravegiques II

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

Partim de la mateixa base que la pragravectica ante-rior perograve en aquesta incloem una tercera variable drsquoentrada Aixiacute que hem drsquoafegir un nou botoacute en el pin del GPIO que srsquoescau

30

Seguim el patroacute de les foacutermules emprades a la pragravectica anterior

En aquest cas tenim tres variables drsquoentrada perograve la mecagravenica eacutes la mateixa Es pot jugar amb la foacutermula i anar provant diferents combinacions

Necessitem tres variables ja que hi ha tres botons

Declaracions

Comprovem quins estan premuts

int AND (int a int b) return a ampamp b

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 + arsquob

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5 int pin_boto_C = 6

int apretat_A = 0 int apretat_B = 0 int apretat_C = 0

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

31

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

Mostra resultat if (f(apretat_A apretat_B apretat_C) == 1) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins no estan premuts

Com al circuit anterior apliquem la foacutermula i si aquesta doacutena 1 encenem el LED

Proposta Ara que ja has apregraves els conceptes meacutes fonamentals de la CodePi inventarsquot un circuit amb el nivell de dificultat que consideris No et quedis amb el que se trsquoha ensenyat aquiacute sinoacute que cerca meacutes megravetodes que puguis utilitzar La creativitat eacutes bagravesica per a tot bon enginyer i amb aquesta pragravectica volem que demostris de quegrave ets capaccedil

32

8 Vols saber-ne meacutes El moacuten de la programacioacute i lrsquoelectrogravenica eacutes infinit La comunitat geek (= interessada) en aquests te-mes eacutes una de les meacutes servicials i altruista de tota la xarxa aixiacute que es poden trobar una quantitat inacabable de tutorials i pagravegines web especialitza-des en el que vulguem saber

81 Programari lliureEl programari lliure eacutes la base de la informagravetica ac-tual i encara juga un gran paper en algunes agraverees com els servidors web o els mogravebils amb sistema operatiu Android Aquiacute teniu un conjunt de pagravegines on podeu aprofundir sobre aquest apassionant moacuten de la llibertat digital

httpcawikipediaorgwikiRichard_Matthew_Stallmanhttpwwwfsforghttpwwwgnuorghttpwwwlinuxorghttpwwwunixorghttpwwwubuntucom

82 Raspberry PiSi desitges saber meacutes sobre el projecte sense agravenim de lucre Raspberry Pi i seguir fent projectes amb ella visita les pagines que trobaragraves a con-tinuacioacute Aquestes et donaran idees de quegrave fer amb aquest petit perograve fascinant ordinador

httplearnadafruitcomcategorylearn-raspber-ry-pihttpwwwraspberrypiorgwwwraspberrypiorghttpdangerousprototypescom20130202rasp-berry-pi-supercomputerhttpreviewscnetcoukdesktops25-fun-things-to-do-with-a-raspberry-pi-50009851httplearnadafruitcompi-thermal-printer

33

83 Electrogravenica Si lrsquoelectrogravenica bagravesica que has apregraves durant els tutorials de la CodePi trsquoha fet veure que aquest eacutes el moacuten que a tu trsquoagrada no paris A continu-acioacute et deixem pagravegines web on trobaragraves les bases de lrsquoelectrogravenica meacutes complexa i tambeacute molts nous circuits per muntar i seguir descobrint aquest moacuten que avui en dia fa que tots els aparells endollats a al corrent puguin funcionar

httpwwwinstructablescomidBeginners-Elec-tronics-ProjectshttpwwwinstructablescomidElectronic-Proj-ects-For-Beginnershttpwwwcircuitstodaycomsimple-electron-ics-projects-and-circuitshttpswwwsparkfuncomtutorialshttplearnadafruitcom

84 ProgramacioacuteDiuen que per ser un bon programador srsquohan de tenir unes habilitats que no tothom teacute disciplina ordre logravegica creativitat capacitat per resoldre qualsevol problema i per sobre de tot persistegravencia i passioacute Si creus que tens aquestes qualitats do-na-li una oportunitat a la programacioacute A continu-acioacute et deixem un recull de les pagravegines web que creiem que meacutes et poden ajudar a introduir-te una mica meacutes en la programacioacute web i la drsquoapli-cacions per a mogravebils

httpwwwcodeorghttpscratchmiteduhttpwwwcodecademycom

34

9 GlossariC (llenguatge de programacioacute) Des de la seva creacioacute lrsquoany 1972 srsquoha consolidat com un dels llenguatges de programacioacute meacutes utilitzats per fer aplicacions de software Eacutes considerat un dels meacutes bagravesics i meacutes comuns per introduir-se a la pro-gramacioacute Les grans companyies han utilitzat el C com a base per crear altres llenguatges com lrsquoObjective-C (utilitzat per fer les aplicacions per dispositius drsquoApple) o el C (creat per Microsoft i utilitzat entre altres coses per fer programes in-formagravetics per Windows)

Condensador Component electrogravenic classificat dins del grup dels passius i que per tant no emet cap senyal El podriacuteem definir com un acumula-dor drsquoelectrons que els deixa anar quan arriba a la seva capacitat magravexima Hi ha condensadors de dos tipus els electroliacutetics i els normals En les pragravec-tiques utilitzarem electroliacutetics i com que aquests tenen polaritat eacutes important tenir en compte quina eacutes la pota positiva i quina eacutes la negativa a lrsquohora de connectar-lo

Diacuteode Component electrogravenic passiu Teacute polaritat i seria lrsquoequivalent a una vagravelvula antiretorn lrsquoelec-tricitat nomeacutes pot anar en un sentit

Electrogravenica Disciplina que estudia els com-ponents electrogravenics que funcionen amb un flux drsquoelectrons (corrent continua)

Funcioacute Fragment de codi que conte un seguit drsquoaccions i que hi pots accedir cridant la funcioacute en comptes de repetint el codi Podriacuteem comparar-ho amb una funcioacute matemagravetica en la que tenim vari-ables drsquoentrada que tractant-les a la funcioacute ob-tenim una informacioacute de sortida

GPIO Soacuten les sigles de ldquoGeneral Purpose InputOutputrdquo Si mirem la Raspberry Pi soacuten els pins de sortida on hi connectem els cables amb els que programem la placa electrogravenica Lrsquoavantatge drsquoaquest tipus de connector respecte altres eacutes que es pot gestionar mitjanccedilant programacioacute i aixograve eacutes precisament el que explicarem en aquest manual

35

HDMI Soacuten les sigles de ldquoHigh-Definition Multime-dia Interfacerdquo Serveix per enviar viacutedeo i agraveudio a una pantalla Nosaltres lrsquoutilitzarem per connectar la RaspberryPi a una pantalla

LED Acrogravenim de ldquoLight Emitting Dioderdquo Eacutes un tipus de diacuteode el qual teacute una pelmiddotliacutecula de fogravesfor entre els dos connectors que fa que quan passi el corrent generi llum Com qualsevol altre diacuteode eacutes important tenir en compte la polaritat

RAM Acrogravenim de ldquoRandom Access Memoryrdquo Eacutes la part de lrsquoordinador encarregada drsquoemmagatze-mar els arxius temporals

RCA El connector RCA consisteix en diferents cables amb la punta de diferent color que serveix-en per transmetre agraveudio i viacutedeo

ROM De lrsquoanglegraves ldquoRead Only Memoryrdquo eacutes la uni-tat de memograveria on es guarda el sistema operatiu

Resistegravencia Eacutes un component electrogravenic que teacute com a funcioacute reduir el flux drsquoelectrons afi de controlar la seva potegravencia Eacutes molt comuacute a lrsquoelectrogravenica ja que eacutes molt necessari per assegu-rar-nos del correcte funcionament drsquoelements com el LED que sense una resistegravencia que limiteacutes el corrent podrien cremar-se

Placa base Eacutes la part de lrsquoordinador que conteacute elements com la RAM la ROM o el microproces-sador La placa base de lrsquoordinador que constru-irem amb aquest manual seria la progravepia Raspber-ry Pi

Protoboard Tambeacute coneguda com a Bread-board srsquoutilitza per crear circuits electrogravenics sense necessitat de soldar Per saber com funcio-na i com estan relacionats els diferents contactes consulteu aquesta webhttprduinostarcomdocumentaciongeneralpro-toboard-que-es-y-como-funciona

36

Terminal Eacutes el programa emprat per enviar ordres directes a lrsquoordinador i rebre respostes drsquoaquest Nosaltres lrsquoutilitzarem per instalmiddotlar els programes necessaris per programar les plaques electrograveniques i altres arxius necessaris

Variable Valor que canvia segons les operacions que es facin amb aquest al programa informagravetic Com ja sabeu hi ha variables independents (pe el temps) i dependents (pe si estagrave o no encegraves un LED que dependragrave drsquoaltres variables)

37

  • httpwwwfsforg
Page 14: CodePi

14

Ara a continuacioacute ens mourem fins a ldquoexpand_rootfsrdquo que ens permetragrave expandir el tamany de la particioacute arrel de la Raspberry Pi al tamany magravex-im de la targeta SD eacutes a dir si tenim una targeta de 4 Gb si no fessim aquesta opcioacute estariacuteem util-itzant uacutenicament 2 Gb de capacitat

Acceptarem el seguumlent diagraveleg i passarem a con-figurar els idiomes

Buscarem ldquochange_localerdquo per canviar els idio-mes i la disposicioacute del teclat al catalagrave

De la seguumlent llista seleccionarem mitjanccedilant lrsquoes-pai del teclat totes les codificacions que comencin per ldquoCA_Per baixar a buscar-les utilitzarem les fletxes (amunt-avall) i per acabar clicarem la del costat dret i enter

15

Seleccionarem ldquochange_timezonerdquo per canviar la zona horagraveria de la Raspberry Pi i els temes rela-cionats amb aquesta

A continuacioacute seleccionarem el nostre continent

I per uacuteltim buscarem una ciutat que estigui a la mateixa zona horagraveria que nosaltres i la seleccio-nariacuteem tambeacute amb enter

64 Descarregar i executar ScriptPer descarregar lrsquoscript hem donar permisos i ex-ecutar-lo aixiacute que escriurem les seguumlents ordres en el terminal que podeu trobar a lrsquoescriptori

cd tmpmkdir CodePicd CodePiwget httpwwwtomorrowdevcomcodepiwiringPi-installshchmod +x wiringPi-installshwiringPi-installsh

Ja hem acabat de descarregar el programari que ens permetragrave programar amb la CodePi

16

7 PragravectiquesRecomanacioacute mirar aquests tutorials introduc-toris al llenguatge C httpthenewbostonorglistphpcat=14

Aquiacute teniu un quadre que us serviragrave lrsquoequivalegravencia entre els pins del GPIO i els que haurem de posar en el codi

Ja queda menys perquegrave puguis comenccedilar a pro-gramar perograve abans de fer-ho hauragraves de saber com compilar un programa Probablement ara et preguntaragraves quegrave eacutes compilar doncs compilar eacutes el proceacutes que fa un programa per traduir el codi que nosaltres hem escrit a codi binari amb la fi-nalitat de que el nostre ordinador pugui entendre cada ordre

Per compilar un codi escrit en C farem servir el compilador cc Abans drsquoutilitzar aquest programa haurem drsquoindicar a on hem guardat la nostra pragravec-tica amb lrsquoordre cdcc

-o practica

-Wall

-Iusrlocalinclude

-Lusrlocallib

practicac

-lwiringPi

Primer de tot posarem lrsquoordre al terminal

Utilitzarem el modificador -o per establir quin seragrave el nom del programa de sortida per exemple ldquopragravecticardquo

Amb aquest modificador indicarem que volem que ens doni tota la informacioacute dels errors de sintaxis del fitxer

Amb aquest indicarem on es troben els fitxers de la llibreria a incloure dintre del nostre fitxer

Utilitzant aquest altre modificador establim el di-rectori on ha de buscar els fitxers de la llibreria

Ara indicarem el nom del fitxer on es troba el nos-tre codi sempre acabant amb la terminacioacute c per exemple ldquopragravecticacrdquo

Amb aquest modificador posem la llibreria wiring-Pi a la llista de llibreries que han de ser afegides

17

Al final introduirem tot seguit al terminal una ordre similar a la seguumlent

cc -o practica -Wall -Iusrlocalinclude -Lusrlocallib practicac -lwiringPi

A part de saber compilar abans de comenccedilar a programar i a fer els nostres circuits haurem de saber quins soacuten els pins on haurem de connectar als cables a la Raspberry Pi aquest pins els iden-tificarem utilitzant nuacutemeros

La seguumlent taula ens permet saber lrsquoequivalegravencia entre els nuacutemeros de la GPIO els nuacutemeros de wiringPi la llibreria que interpretaragrave el nostre codi i la posicioacute dels pins

18

Des que la variable i eacutes igual a 1 fins i mentre que aquesta sigui igual o meacutes petita que10 executa el codi

Mentre que la variable D sigui igual a 5 el codi entre claus es llegiragrave infinites vegades

Si la variable X no eacutes meacutes petita que 7 fes una altra cosa

Si la variable X eacutes meacutes petita que 7 fes alguna cosa

70 Iniciacioacute al llenguatge CAbans de comenccedilar a programar cal tenir en compte els conceptes de condicional i de cicle

Els condicionals ldquoif - elserdquo nomeacutes executen el codi a continuacioacute si la condicioacute que li fiquem entre paregraventesis eacutes certa Ho podriacuteem comparar amb el que seria una oracioacute condicional No eacutes obligatori perograve podem afegir la partiacutecula ldquoelserdquo que eacutes lrsquoequivalent a la paraula ldquosi nordquo En el cas a continuacioacute com que el condicional no es compleix srsquoexecutaria lrsquoelse

if (X lt 7) Fes alguna cosa else Fes una altra cosa

Els bucles ldquoforrdquo soacuten rutines que serveixen per ex-ecutar un codi un determinat nuacutemero de vegades Teacute tres parts separades per punt i coma entrada condicioacute i increment A la entrada li donem un va-lor a una variable A la condicioacute determinem que la rutina srsquoexecuti nomeacutes si eacutes compleix la condicioacute utilitzant la variable drsquoentrada Finalment en el in-crement fixem un nou valor a la variable aquesta part srsquoexecutaragrave a cada cicle En llenguatge C si no afegim cap dels tres paragravemetres el bucle seragrave infinit

for (int i = 1 i lt= 10 i++) Fes alguna cosa

La sentegravencia ldquowhilerdquo defineix que un codi srsquoexe-cutaragrave infinitament mentre que la condicioacute que es defineix sigui certa

while (D==5) Fes alguna cosa

19

71 Bloc 1 (Bagravesic)711 Hola moacuten

En aquesta pragravectica escriurem un text a la consograve-la el conegut ldquoHello Worldrdquo

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void) printf(ldquohola moacutenrdquo)

if (wiringPiSetup() == -1) exit (1)

return 0

712 Encendre un LED

Hem drsquoimportar aquestes llibreries per tal que la RaspberryPi entengui el codi

Aquesta eacutes la funcioacute principal (main) i srsquoexecutaragrave tot el que fiquem aquiacute dins

Amb la funcioacute printf() el que aconseguim eacutes que es mostri al terminal el text que hi posem entre comentes

Aquestes liacutenies de codi soacuten simplement compro-vacions per assegurar-nos que tot funciona cor-rectament Soacuten negligibles perograve eacutes recomanable posar-les Les afegirem a totes les pragravectiques

Connectarem la pota llarga (agravenode) del LED al pin 5v de la GPIO i lrsquoaltre pota (cagravetode) a una resistegraven-cia de 180Ω Aquesta distincioacute entre potes es deu a que els LEDs estan polaritzats mireu el glossa-ri per saber-ne meacutes Tot seguit connecteu lrsquoaltra pota de la resistegravencia al pin GROUND

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void)

20

Comprovacionsif (wiringPiSetup() == -1) exit (1)

int pin = 1

printf(ldquoEncenem el pin 18rdquo)

pinMode(pin OUTPUT)

digitalWrite(pin 1)

return 0

713 Encendre i apagar un LED cada dos segons 10 vegades

El que podeu veure aquiacute eacutes el que srsquoanomena un comentari del codi Tot allograve que escrivim despreacutes de ldquordquo el compilador no ho llegiragrave i per tant nomeacutes serveix per donar indicacions al programador

Declarem la variable pin que com eacutes un nombre enter escriurem int

Fem un printf() tal i com hem apregraves a la pragravectica anterior Escrivim el 18 ja que la numeracioacute de la llibreria wiringPi canvia respecte a la sortida real (mirar el cuadre de la pagravegina 17)

Amb la funcioacute pinMode() declarem que el pin nuacutemero 1 en aquest cas sigui un pin de sortida de corrent (OUTPUT)

Una vegada li hem dit que eacutes de sortida li hem de dir si el volem encegraves ldquo1rdquo o apagat ldquo0rdquo amb la funcioacute digitalWrite()

Utilitzarem el muntatge la de pragravectica anterior amb la diferegravencia que en comptes de connectar lrsquoagravenode del LED al pin de 5v el connectarem al pin 18 de la Raspberry Pi Drsquoaquesta manera podrem gestionar el pas de lrsquoelectricitat a traveacutes drsquoun petit programa que crearem a continuacioacute

21

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void) int pin = 1

if (wiringPiSetup() == -1) exit (1)

pinMode(pin OUTPUT)

for (int i=1ilt=10i++)

printf(ldquoLED Onnrdquo) digitalWrite(pin 1)

delay(2000)

printf(ldquoLED Offnrdquo) digitalWrite(pin 0)

delay(2000)

return 0

Utilitzem un bicle ldquoforrdquo per executar el codi 10 vegades

Encenem el LED

Fem un delay() de 2000 milmiddotlisegons (2 segons) que ens serveix per aturar el programa i per tant mantenir el LED encegraves durant aquest temps

Apaguem el LED

El mantenim apagat 2 segons

Lrsquoexpressioacute n serveix per canviar de liacutenia

Proposta Ara que ja saps els conceptes bagravesics de la CodePi intenta fer lrsquoequivalent al codi Morse per demanar ajuda SOS middot middot middot ndash ndash ndash middot middot middot (on cada punt significa LED encegraves durant 14 de segon i cada ralla LED encegraves durant mig segon) Juga amb el valor de la funcioacute delay() per fer que el LED estigui encegraves durant meacutes o menys temps

22

72 Bloc 2 (Mitjagrave)721 Encendre un LED apretant un botoacute

Utilitzar el muntatge del LED que hem fet servir a la pragravectica anterior A meacutes a meacutes hem drsquoafegir 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 aniragrave a parar al pin 23 una resistegravencia de 10KΩ al GROUND per forccedilar lrsquoestat LOW quan el polsador no estagrave apretat

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt int main (void) int pin_LED = 1 int pin_boto = 4 printf (ldquoEncenent un LED apretant un botoacutenrdquo) 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

Declarem el LED com un pin de sortidaI el botoacute com un pin drsquoentrada

Si no fiquem variables al for aquest srsquoexecutaragrave sempre

Amb la funcioacute digitalRead() detectem si passa cor-rent pel pin 8 eacutes a dir si el botoacute ha estat apretat Si eacutes aixiacute fem que srsquoencengui el LED

Si no fem que srsquoapagui

23

722 Encendre un LED apretant tots els puladors

Utilitzar el muntatge de la pragravectica anterior i afegir dos polsadors meacutes amb el mateix proceacutes connec-tats als ports 24 i 25 de la Raspberry Pi

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int main (void) int pin_LED = 1

int pin_boto_A = 4 int pin_boto_B = 5 int 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 ampamp digitalRead(pin_boto_B) == HIGH ampamp digitalRead(pin_boto_C) == HIGH) digitalWrite(pin_LED 1)

Declarem el LED i els tres botons que tal i com posa a lrsquoesquema corresponen als pins 23 24 i 25 de la GPIO

Si els tres polsadors estan premuts passa corrent pels tres i per tant srsquoenceacuten el LED

En aquest cas utilitzem HIGH i LOW en lloc de 1 i 0 respectivament HIGH significa que hi ha elec-tricitat i LOW que no hi ha

24

No apretats while (digitalRead(pin_boto_A) == LOW ampamp digitalRead(pin_boto_B) == LOW ampamp digitalRead(pin_boto_C) == LOW) digitalWrite(pin_LED 0)

Si no apagarsquol

723 Semagravefor amb polsador

En aquesta pragravectica crearem un semagravefor de via-nants i de cotxes Com alguns semagravefors aquests teacute un botoacute amb el qual els vianants demanen que es posi verd aixiacute que el dels cotxes es posa ver-mell

Connectarem dos LEDs (vermell i verd) als pins 18 i 23 de la Raspberry Pi amb una resistegravencia de 180Ω Tambeacute connectarem tres LEDs meacutes (verd vermell i taronja) de la mateixa manera en els ports 17 21 i 22 de la GPIO

A diferegravencia de les altres pragravectiques amb polsa-dors en aquesta el connectarem al port SDA0 i al GROUND ja que nomeacutes ens interessa detectar quan es prem

25

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

define VERMELL 0define GROC1define VERD 2define VERMELL_HOME3define VERD_HOME4

define BOTO 8

void setup (void) int i

if (geteuid () = 0) exit (0)

if (wiringPiSetup () == -1) exit (1)

fflush(stdout) for (i = 0 i lt 5 ++i) pinMode (i OUTPUT) digitalWrite (i 0) digitalWrite(VERD1)digitalWrite(VERMELL_HOME1) pinMode (BOTO INPUT)

printf (ldquoSetup fetnrdquo)

int main (void) setup () for () esperaBoto () aturaTransit () camina () tempsEspera () iniciaTransit ()

Amb lrsquoexpressioacute define li diem a la magravequina que cada cop que escrivim VERMELL en realitat es-tem posant el nombre 0 i el mateix amb les altres paraules

Fem un setup amb tota la configuracioacute necessagraveria

fflush() eacutes una funcioacute complexa que serveix per quumlestions de tractament de memograveria del sistema per evitar errors

Executem totes les funcions una darrera lrsquoaltra de manera indefinida

26

Esperant a que lrsquousuari premi el botoacute per comenccedilar

Fem que el semagravefor dels cotxes canviiuml de verd a vermell passant pel groc

Fem que el semagravefor dels vianants es posi verd

Temps intermig des que srsquoacaba de caminar fins que el trafic comenccedila

void esperaBoto (void) printf (ldquoEsperant el botoacute ldquo)fflush(stdout) while (digitalRead (BOTO) == HIGH) delay (100) printf (ldquoEsoerenrdquo)

void aturaTransit()printf(ldquoAturanteltraficldquo)fflush(stdout)digitalWrite(VERD0) digitalWrite (GROC 1) delay (2000) digitalWrite (GROC 0) digitalWrite(VERMELL1) delay (2000) printf (ldquoAturatsnrdquo)

void camina ()printf(ldquoCaminaldquo)fflush(stdout)

digitalWrite(VERMELL_HOME0)digitalWrite(VERD_HOME1) delay (10000) digitalWrite(VERMELL0) digitalWrite (GROC 1)

printf (ldquoJa han caminatnrdquo)

void tempsEspera () int i

printf (ldquoTemps drsquoespera ldquo) fflush(stdout)

for (i = 0 i lt 8 ++i)

27

delay (500) digitalWrite(VERD_HOME0) digitalWrite (GROC 0) delay (500) digitalWrite(VERD_HOME1) digitalWrite (GROC 1)

void iniciaTransit ()printf(ldquoInicianttraficldquo)fflush(stdout)

digitalWrite(VERD_HOME0)digitalWrite(VERMELL_HOME1) delay (500) digitalWrite (GROC 0) digitalWrite(VERD1)

Deixem via lliure pels vehicles i posem el semagrave-for vermell pels vianants

Proposta Utilitzant el que has apregraves en aquest bloc crear un projecte amb uns quants LEDs en fila que srsquoactivin ascendentment quan apretes un botoacute

28

73 Bloc 3 (Alt)731 Sistema portes logravegiques I

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int AND (int a int b) return a ampamp b

int OR (int a int b) return a || b

int NEGADA (int a) return a

int f(int a int b) return OR(AND(NE-GADA(a)b)AND(aNEGADA(b))) f(a b) = arsquob + abrsquo

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5

int apretat_A = 0 int apretat_B = 0

pinMode(pin_LED_S OUTPUT) pinMode(pin_boto_A INPUT) pinMode(pin_boto_B INPUT)

Crearem una funcioacute per a cada porta logravegica de tal manera que sigui meacutes fagravecil poder-ho aplicar despreacutes

Aquesta seragrave la foacutermula que compliragrave la taula de la veritat en aquest cas eacutes f(a b) = arsquob +abrsquo

Creem dos booleans (variables que poden ser 0 o 1) que ens indicaran si el botoacute ha estat premut o no

Declarem els pins drsquoentrada i de sortida com a totes les pragravectiques anteriors

El seguumlent projecte fa la mateixa funcioacute que acon-seguiriacuteem amb xips de portes logravegiques perograve fent els cagravelculs a partir de la RaspberryPi En aquest cas compleix la taula de la veritat drsquoun OR ex-clusive eacutes a dir nomeacutes srsquoencendragrave el LED quan premem un dels dos botons mai srsquoencendragrave 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 srsquoutilitzin en el codi

29

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) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins estan premuts

Comprovem quins no estan premuts

I apliquem la foacutermula amb els valors drsquoentrada cor-responents Si la foacutermula eacutes igual a 1 srsquoencendragrave el LED si no no srsquoencendragrave

732 Sistema portes logravegiques II

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

Partim de la mateixa base que la pragravectica ante-rior perograve en aquesta incloem una tercera variable drsquoentrada Aixiacute que hem drsquoafegir un nou botoacute en el pin del GPIO que srsquoescau

30

Seguim el patroacute de les foacutermules emprades a la pragravectica anterior

En aquest cas tenim tres variables drsquoentrada perograve la mecagravenica eacutes la mateixa Es pot jugar amb la foacutermula i anar provant diferents combinacions

Necessitem tres variables ja que hi ha tres botons

Declaracions

Comprovem quins estan premuts

int AND (int a int b) return a ampamp b

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 + arsquob

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5 int pin_boto_C = 6

int apretat_A = 0 int apretat_B = 0 int apretat_C = 0

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

31

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

Mostra resultat if (f(apretat_A apretat_B apretat_C) == 1) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins no estan premuts

Com al circuit anterior apliquem la foacutermula i si aquesta doacutena 1 encenem el LED

Proposta Ara que ja has apregraves els conceptes meacutes fonamentals de la CodePi inventarsquot un circuit amb el nivell de dificultat que consideris No et quedis amb el que se trsquoha ensenyat aquiacute sinoacute que cerca meacutes megravetodes que puguis utilitzar La creativitat eacutes bagravesica per a tot bon enginyer i amb aquesta pragravectica volem que demostris de quegrave ets capaccedil

32

8 Vols saber-ne meacutes El moacuten de la programacioacute i lrsquoelectrogravenica eacutes infinit La comunitat geek (= interessada) en aquests te-mes eacutes una de les meacutes servicials i altruista de tota la xarxa aixiacute que es poden trobar una quantitat inacabable de tutorials i pagravegines web especialitza-des en el que vulguem saber

81 Programari lliureEl programari lliure eacutes la base de la informagravetica ac-tual i encara juga un gran paper en algunes agraverees com els servidors web o els mogravebils amb sistema operatiu Android Aquiacute teniu un conjunt de pagravegines on podeu aprofundir sobre aquest apassionant moacuten de la llibertat digital

httpcawikipediaorgwikiRichard_Matthew_Stallmanhttpwwwfsforghttpwwwgnuorghttpwwwlinuxorghttpwwwunixorghttpwwwubuntucom

82 Raspberry PiSi desitges saber meacutes sobre el projecte sense agravenim de lucre Raspberry Pi i seguir fent projectes amb ella visita les pagines que trobaragraves a con-tinuacioacute Aquestes et donaran idees de quegrave fer amb aquest petit perograve fascinant ordinador

httplearnadafruitcomcategorylearn-raspber-ry-pihttpwwwraspberrypiorgwwwraspberrypiorghttpdangerousprototypescom20130202rasp-berry-pi-supercomputerhttpreviewscnetcoukdesktops25-fun-things-to-do-with-a-raspberry-pi-50009851httplearnadafruitcompi-thermal-printer

33

83 Electrogravenica Si lrsquoelectrogravenica bagravesica que has apregraves durant els tutorials de la CodePi trsquoha fet veure que aquest eacutes el moacuten que a tu trsquoagrada no paris A continu-acioacute et deixem pagravegines web on trobaragraves les bases de lrsquoelectrogravenica meacutes complexa i tambeacute molts nous circuits per muntar i seguir descobrint aquest moacuten que avui en dia fa que tots els aparells endollats a al corrent puguin funcionar

httpwwwinstructablescomidBeginners-Elec-tronics-ProjectshttpwwwinstructablescomidElectronic-Proj-ects-For-Beginnershttpwwwcircuitstodaycomsimple-electron-ics-projects-and-circuitshttpswwwsparkfuncomtutorialshttplearnadafruitcom

84 ProgramacioacuteDiuen que per ser un bon programador srsquohan de tenir unes habilitats que no tothom teacute disciplina ordre logravegica creativitat capacitat per resoldre qualsevol problema i per sobre de tot persistegravencia i passioacute Si creus que tens aquestes qualitats do-na-li una oportunitat a la programacioacute A continu-acioacute et deixem un recull de les pagravegines web que creiem que meacutes et poden ajudar a introduir-te una mica meacutes en la programacioacute web i la drsquoapli-cacions per a mogravebils

httpwwwcodeorghttpscratchmiteduhttpwwwcodecademycom

34

9 GlossariC (llenguatge de programacioacute) Des de la seva creacioacute lrsquoany 1972 srsquoha consolidat com un dels llenguatges de programacioacute meacutes utilitzats per fer aplicacions de software Eacutes considerat un dels meacutes bagravesics i meacutes comuns per introduir-se a la pro-gramacioacute Les grans companyies han utilitzat el C com a base per crear altres llenguatges com lrsquoObjective-C (utilitzat per fer les aplicacions per dispositius drsquoApple) o el C (creat per Microsoft i utilitzat entre altres coses per fer programes in-formagravetics per Windows)

Condensador Component electrogravenic classificat dins del grup dels passius i que per tant no emet cap senyal El podriacuteem definir com un acumula-dor drsquoelectrons que els deixa anar quan arriba a la seva capacitat magravexima Hi ha condensadors de dos tipus els electroliacutetics i els normals En les pragravec-tiques utilitzarem electroliacutetics i com que aquests tenen polaritat eacutes important tenir en compte quina eacutes la pota positiva i quina eacutes la negativa a lrsquohora de connectar-lo

Diacuteode Component electrogravenic passiu Teacute polaritat i seria lrsquoequivalent a una vagravelvula antiretorn lrsquoelec-tricitat nomeacutes pot anar en un sentit

Electrogravenica Disciplina que estudia els com-ponents electrogravenics que funcionen amb un flux drsquoelectrons (corrent continua)

Funcioacute Fragment de codi que conte un seguit drsquoaccions i que hi pots accedir cridant la funcioacute en comptes de repetint el codi Podriacuteem comparar-ho amb una funcioacute matemagravetica en la que tenim vari-ables drsquoentrada que tractant-les a la funcioacute ob-tenim una informacioacute de sortida

GPIO Soacuten les sigles de ldquoGeneral Purpose InputOutputrdquo Si mirem la Raspberry Pi soacuten els pins de sortida on hi connectem els cables amb els que programem la placa electrogravenica Lrsquoavantatge drsquoaquest tipus de connector respecte altres eacutes que es pot gestionar mitjanccedilant programacioacute i aixograve eacutes precisament el que explicarem en aquest manual

35

HDMI Soacuten les sigles de ldquoHigh-Definition Multime-dia Interfacerdquo Serveix per enviar viacutedeo i agraveudio a una pantalla Nosaltres lrsquoutilitzarem per connectar la RaspberryPi a una pantalla

LED Acrogravenim de ldquoLight Emitting Dioderdquo Eacutes un tipus de diacuteode el qual teacute una pelmiddotliacutecula de fogravesfor entre els dos connectors que fa que quan passi el corrent generi llum Com qualsevol altre diacuteode eacutes important tenir en compte la polaritat

RAM Acrogravenim de ldquoRandom Access Memoryrdquo Eacutes la part de lrsquoordinador encarregada drsquoemmagatze-mar els arxius temporals

RCA El connector RCA consisteix en diferents cables amb la punta de diferent color que serveix-en per transmetre agraveudio i viacutedeo

ROM De lrsquoanglegraves ldquoRead Only Memoryrdquo eacutes la uni-tat de memograveria on es guarda el sistema operatiu

Resistegravencia Eacutes un component electrogravenic que teacute com a funcioacute reduir el flux drsquoelectrons afi de controlar la seva potegravencia Eacutes molt comuacute a lrsquoelectrogravenica ja que eacutes molt necessari per assegu-rar-nos del correcte funcionament drsquoelements com el LED que sense una resistegravencia que limiteacutes el corrent podrien cremar-se

Placa base Eacutes la part de lrsquoordinador que conteacute elements com la RAM la ROM o el microproces-sador La placa base de lrsquoordinador que constru-irem amb aquest manual seria la progravepia Raspber-ry Pi

Protoboard Tambeacute coneguda com a Bread-board srsquoutilitza per crear circuits electrogravenics sense necessitat de soldar Per saber com funcio-na i com estan relacionats els diferents contactes consulteu aquesta webhttprduinostarcomdocumentaciongeneralpro-toboard-que-es-y-como-funciona

36

Terminal Eacutes el programa emprat per enviar ordres directes a lrsquoordinador i rebre respostes drsquoaquest Nosaltres lrsquoutilitzarem per instalmiddotlar els programes necessaris per programar les plaques electrograveniques i altres arxius necessaris

Variable Valor que canvia segons les operacions que es facin amb aquest al programa informagravetic Com ja sabeu hi ha variables independents (pe el temps) i dependents (pe si estagrave o no encegraves un LED que dependragrave drsquoaltres variables)

37

  • httpwwwfsforg
Page 15: CodePi

15

Seleccionarem ldquochange_timezonerdquo per canviar la zona horagraveria de la Raspberry Pi i els temes rela-cionats amb aquesta

A continuacioacute seleccionarem el nostre continent

I per uacuteltim buscarem una ciutat que estigui a la mateixa zona horagraveria que nosaltres i la seleccio-nariacuteem tambeacute amb enter

64 Descarregar i executar ScriptPer descarregar lrsquoscript hem donar permisos i ex-ecutar-lo aixiacute que escriurem les seguumlents ordres en el terminal que podeu trobar a lrsquoescriptori

cd tmpmkdir CodePicd CodePiwget httpwwwtomorrowdevcomcodepiwiringPi-installshchmod +x wiringPi-installshwiringPi-installsh

Ja hem acabat de descarregar el programari que ens permetragrave programar amb la CodePi

16

7 PragravectiquesRecomanacioacute mirar aquests tutorials introduc-toris al llenguatge C httpthenewbostonorglistphpcat=14

Aquiacute teniu un quadre que us serviragrave lrsquoequivalegravencia entre els pins del GPIO i els que haurem de posar en el codi

Ja queda menys perquegrave puguis comenccedilar a pro-gramar perograve abans de fer-ho hauragraves de saber com compilar un programa Probablement ara et preguntaragraves quegrave eacutes compilar doncs compilar eacutes el proceacutes que fa un programa per traduir el codi que nosaltres hem escrit a codi binari amb la fi-nalitat de que el nostre ordinador pugui entendre cada ordre

Per compilar un codi escrit en C farem servir el compilador cc Abans drsquoutilitzar aquest programa haurem drsquoindicar a on hem guardat la nostra pragravec-tica amb lrsquoordre cdcc

-o practica

-Wall

-Iusrlocalinclude

-Lusrlocallib

practicac

-lwiringPi

Primer de tot posarem lrsquoordre al terminal

Utilitzarem el modificador -o per establir quin seragrave el nom del programa de sortida per exemple ldquopragravecticardquo

Amb aquest modificador indicarem que volem que ens doni tota la informacioacute dels errors de sintaxis del fitxer

Amb aquest indicarem on es troben els fitxers de la llibreria a incloure dintre del nostre fitxer

Utilitzant aquest altre modificador establim el di-rectori on ha de buscar els fitxers de la llibreria

Ara indicarem el nom del fitxer on es troba el nos-tre codi sempre acabant amb la terminacioacute c per exemple ldquopragravecticacrdquo

Amb aquest modificador posem la llibreria wiring-Pi a la llista de llibreries que han de ser afegides

17

Al final introduirem tot seguit al terminal una ordre similar a la seguumlent

cc -o practica -Wall -Iusrlocalinclude -Lusrlocallib practicac -lwiringPi

A part de saber compilar abans de comenccedilar a programar i a fer els nostres circuits haurem de saber quins soacuten els pins on haurem de connectar als cables a la Raspberry Pi aquest pins els iden-tificarem utilitzant nuacutemeros

La seguumlent taula ens permet saber lrsquoequivalegravencia entre els nuacutemeros de la GPIO els nuacutemeros de wiringPi la llibreria que interpretaragrave el nostre codi i la posicioacute dels pins

18

Des que la variable i eacutes igual a 1 fins i mentre que aquesta sigui igual o meacutes petita que10 executa el codi

Mentre que la variable D sigui igual a 5 el codi entre claus es llegiragrave infinites vegades

Si la variable X no eacutes meacutes petita que 7 fes una altra cosa

Si la variable X eacutes meacutes petita que 7 fes alguna cosa

70 Iniciacioacute al llenguatge CAbans de comenccedilar a programar cal tenir en compte els conceptes de condicional i de cicle

Els condicionals ldquoif - elserdquo nomeacutes executen el codi a continuacioacute si la condicioacute que li fiquem entre paregraventesis eacutes certa Ho podriacuteem comparar amb el que seria una oracioacute condicional No eacutes obligatori perograve podem afegir la partiacutecula ldquoelserdquo que eacutes lrsquoequivalent a la paraula ldquosi nordquo En el cas a continuacioacute com que el condicional no es compleix srsquoexecutaria lrsquoelse

if (X lt 7) Fes alguna cosa else Fes una altra cosa

Els bucles ldquoforrdquo soacuten rutines que serveixen per ex-ecutar un codi un determinat nuacutemero de vegades Teacute tres parts separades per punt i coma entrada condicioacute i increment A la entrada li donem un va-lor a una variable A la condicioacute determinem que la rutina srsquoexecuti nomeacutes si eacutes compleix la condicioacute utilitzant la variable drsquoentrada Finalment en el in-crement fixem un nou valor a la variable aquesta part srsquoexecutaragrave a cada cicle En llenguatge C si no afegim cap dels tres paragravemetres el bucle seragrave infinit

for (int i = 1 i lt= 10 i++) Fes alguna cosa

La sentegravencia ldquowhilerdquo defineix que un codi srsquoexe-cutaragrave infinitament mentre que la condicioacute que es defineix sigui certa

while (D==5) Fes alguna cosa

19

71 Bloc 1 (Bagravesic)711 Hola moacuten

En aquesta pragravectica escriurem un text a la consograve-la el conegut ldquoHello Worldrdquo

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void) printf(ldquohola moacutenrdquo)

if (wiringPiSetup() == -1) exit (1)

return 0

712 Encendre un LED

Hem drsquoimportar aquestes llibreries per tal que la RaspberryPi entengui el codi

Aquesta eacutes la funcioacute principal (main) i srsquoexecutaragrave tot el que fiquem aquiacute dins

Amb la funcioacute printf() el que aconseguim eacutes que es mostri al terminal el text que hi posem entre comentes

Aquestes liacutenies de codi soacuten simplement compro-vacions per assegurar-nos que tot funciona cor-rectament Soacuten negligibles perograve eacutes recomanable posar-les Les afegirem a totes les pragravectiques

Connectarem la pota llarga (agravenode) del LED al pin 5v de la GPIO i lrsquoaltre pota (cagravetode) a una resistegraven-cia de 180Ω Aquesta distincioacute entre potes es deu a que els LEDs estan polaritzats mireu el glossa-ri per saber-ne meacutes Tot seguit connecteu lrsquoaltra pota de la resistegravencia al pin GROUND

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void)

20

Comprovacionsif (wiringPiSetup() == -1) exit (1)

int pin = 1

printf(ldquoEncenem el pin 18rdquo)

pinMode(pin OUTPUT)

digitalWrite(pin 1)

return 0

713 Encendre i apagar un LED cada dos segons 10 vegades

El que podeu veure aquiacute eacutes el que srsquoanomena un comentari del codi Tot allograve que escrivim despreacutes de ldquordquo el compilador no ho llegiragrave i per tant nomeacutes serveix per donar indicacions al programador

Declarem la variable pin que com eacutes un nombre enter escriurem int

Fem un printf() tal i com hem apregraves a la pragravectica anterior Escrivim el 18 ja que la numeracioacute de la llibreria wiringPi canvia respecte a la sortida real (mirar el cuadre de la pagravegina 17)

Amb la funcioacute pinMode() declarem que el pin nuacutemero 1 en aquest cas sigui un pin de sortida de corrent (OUTPUT)

Una vegada li hem dit que eacutes de sortida li hem de dir si el volem encegraves ldquo1rdquo o apagat ldquo0rdquo amb la funcioacute digitalWrite()

Utilitzarem el muntatge la de pragravectica anterior amb la diferegravencia que en comptes de connectar lrsquoagravenode del LED al pin de 5v el connectarem al pin 18 de la Raspberry Pi Drsquoaquesta manera podrem gestionar el pas de lrsquoelectricitat a traveacutes drsquoun petit programa que crearem a continuacioacute

21

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void) int pin = 1

if (wiringPiSetup() == -1) exit (1)

pinMode(pin OUTPUT)

for (int i=1ilt=10i++)

printf(ldquoLED Onnrdquo) digitalWrite(pin 1)

delay(2000)

printf(ldquoLED Offnrdquo) digitalWrite(pin 0)

delay(2000)

return 0

Utilitzem un bicle ldquoforrdquo per executar el codi 10 vegades

Encenem el LED

Fem un delay() de 2000 milmiddotlisegons (2 segons) que ens serveix per aturar el programa i per tant mantenir el LED encegraves durant aquest temps

Apaguem el LED

El mantenim apagat 2 segons

Lrsquoexpressioacute n serveix per canviar de liacutenia

Proposta Ara que ja saps els conceptes bagravesics de la CodePi intenta fer lrsquoequivalent al codi Morse per demanar ajuda SOS middot middot middot ndash ndash ndash middot middot middot (on cada punt significa LED encegraves durant 14 de segon i cada ralla LED encegraves durant mig segon) Juga amb el valor de la funcioacute delay() per fer que el LED estigui encegraves durant meacutes o menys temps

22

72 Bloc 2 (Mitjagrave)721 Encendre un LED apretant un botoacute

Utilitzar el muntatge del LED que hem fet servir a la pragravectica anterior A meacutes a meacutes hem drsquoafegir 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 aniragrave a parar al pin 23 una resistegravencia de 10KΩ al GROUND per forccedilar lrsquoestat LOW quan el polsador no estagrave apretat

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt int main (void) int pin_LED = 1 int pin_boto = 4 printf (ldquoEncenent un LED apretant un botoacutenrdquo) 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

Declarem el LED com un pin de sortidaI el botoacute com un pin drsquoentrada

Si no fiquem variables al for aquest srsquoexecutaragrave sempre

Amb la funcioacute digitalRead() detectem si passa cor-rent pel pin 8 eacutes a dir si el botoacute ha estat apretat Si eacutes aixiacute fem que srsquoencengui el LED

Si no fem que srsquoapagui

23

722 Encendre un LED apretant tots els puladors

Utilitzar el muntatge de la pragravectica anterior i afegir dos polsadors meacutes amb el mateix proceacutes connec-tats als ports 24 i 25 de la Raspberry Pi

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int main (void) int pin_LED = 1

int pin_boto_A = 4 int pin_boto_B = 5 int 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 ampamp digitalRead(pin_boto_B) == HIGH ampamp digitalRead(pin_boto_C) == HIGH) digitalWrite(pin_LED 1)

Declarem el LED i els tres botons que tal i com posa a lrsquoesquema corresponen als pins 23 24 i 25 de la GPIO

Si els tres polsadors estan premuts passa corrent pels tres i per tant srsquoenceacuten el LED

En aquest cas utilitzem HIGH i LOW en lloc de 1 i 0 respectivament HIGH significa que hi ha elec-tricitat i LOW que no hi ha

24

No apretats while (digitalRead(pin_boto_A) == LOW ampamp digitalRead(pin_boto_B) == LOW ampamp digitalRead(pin_boto_C) == LOW) digitalWrite(pin_LED 0)

Si no apagarsquol

723 Semagravefor amb polsador

En aquesta pragravectica crearem un semagravefor de via-nants i de cotxes Com alguns semagravefors aquests teacute un botoacute amb el qual els vianants demanen que es posi verd aixiacute que el dels cotxes es posa ver-mell

Connectarem dos LEDs (vermell i verd) als pins 18 i 23 de la Raspberry Pi amb una resistegravencia de 180Ω Tambeacute connectarem tres LEDs meacutes (verd vermell i taronja) de la mateixa manera en els ports 17 21 i 22 de la GPIO

A diferegravencia de les altres pragravectiques amb polsa-dors en aquesta el connectarem al port SDA0 i al GROUND ja que nomeacutes ens interessa detectar quan es prem

25

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

define VERMELL 0define GROC1define VERD 2define VERMELL_HOME3define VERD_HOME4

define BOTO 8

void setup (void) int i

if (geteuid () = 0) exit (0)

if (wiringPiSetup () == -1) exit (1)

fflush(stdout) for (i = 0 i lt 5 ++i) pinMode (i OUTPUT) digitalWrite (i 0) digitalWrite(VERD1)digitalWrite(VERMELL_HOME1) pinMode (BOTO INPUT)

printf (ldquoSetup fetnrdquo)

int main (void) setup () for () esperaBoto () aturaTransit () camina () tempsEspera () iniciaTransit ()

Amb lrsquoexpressioacute define li diem a la magravequina que cada cop que escrivim VERMELL en realitat es-tem posant el nombre 0 i el mateix amb les altres paraules

Fem un setup amb tota la configuracioacute necessagraveria

fflush() eacutes una funcioacute complexa que serveix per quumlestions de tractament de memograveria del sistema per evitar errors

Executem totes les funcions una darrera lrsquoaltra de manera indefinida

26

Esperant a que lrsquousuari premi el botoacute per comenccedilar

Fem que el semagravefor dels cotxes canviiuml de verd a vermell passant pel groc

Fem que el semagravefor dels vianants es posi verd

Temps intermig des que srsquoacaba de caminar fins que el trafic comenccedila

void esperaBoto (void) printf (ldquoEsperant el botoacute ldquo)fflush(stdout) while (digitalRead (BOTO) == HIGH) delay (100) printf (ldquoEsoerenrdquo)

void aturaTransit()printf(ldquoAturanteltraficldquo)fflush(stdout)digitalWrite(VERD0) digitalWrite (GROC 1) delay (2000) digitalWrite (GROC 0) digitalWrite(VERMELL1) delay (2000) printf (ldquoAturatsnrdquo)

void camina ()printf(ldquoCaminaldquo)fflush(stdout)

digitalWrite(VERMELL_HOME0)digitalWrite(VERD_HOME1) delay (10000) digitalWrite(VERMELL0) digitalWrite (GROC 1)

printf (ldquoJa han caminatnrdquo)

void tempsEspera () int i

printf (ldquoTemps drsquoespera ldquo) fflush(stdout)

for (i = 0 i lt 8 ++i)

27

delay (500) digitalWrite(VERD_HOME0) digitalWrite (GROC 0) delay (500) digitalWrite(VERD_HOME1) digitalWrite (GROC 1)

void iniciaTransit ()printf(ldquoInicianttraficldquo)fflush(stdout)

digitalWrite(VERD_HOME0)digitalWrite(VERMELL_HOME1) delay (500) digitalWrite (GROC 0) digitalWrite(VERD1)

Deixem via lliure pels vehicles i posem el semagrave-for vermell pels vianants

Proposta Utilitzant el que has apregraves en aquest bloc crear un projecte amb uns quants LEDs en fila que srsquoactivin ascendentment quan apretes un botoacute

28

73 Bloc 3 (Alt)731 Sistema portes logravegiques I

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int AND (int a int b) return a ampamp b

int OR (int a int b) return a || b

int NEGADA (int a) return a

int f(int a int b) return OR(AND(NE-GADA(a)b)AND(aNEGADA(b))) f(a b) = arsquob + abrsquo

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5

int apretat_A = 0 int apretat_B = 0

pinMode(pin_LED_S OUTPUT) pinMode(pin_boto_A INPUT) pinMode(pin_boto_B INPUT)

Crearem una funcioacute per a cada porta logravegica de tal manera que sigui meacutes fagravecil poder-ho aplicar despreacutes

Aquesta seragrave la foacutermula que compliragrave la taula de la veritat en aquest cas eacutes f(a b) = arsquob +abrsquo

Creem dos booleans (variables que poden ser 0 o 1) que ens indicaran si el botoacute ha estat premut o no

Declarem els pins drsquoentrada i de sortida com a totes les pragravectiques anteriors

El seguumlent projecte fa la mateixa funcioacute que acon-seguiriacuteem amb xips de portes logravegiques perograve fent els cagravelculs a partir de la RaspberryPi En aquest cas compleix la taula de la veritat drsquoun OR ex-clusive eacutes a dir nomeacutes srsquoencendragrave el LED quan premem un dels dos botons mai srsquoencendragrave 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 srsquoutilitzin en el codi

29

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) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins estan premuts

Comprovem quins no estan premuts

I apliquem la foacutermula amb els valors drsquoentrada cor-responents Si la foacutermula eacutes igual a 1 srsquoencendragrave el LED si no no srsquoencendragrave

732 Sistema portes logravegiques II

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

Partim de la mateixa base que la pragravectica ante-rior perograve en aquesta incloem una tercera variable drsquoentrada Aixiacute que hem drsquoafegir un nou botoacute en el pin del GPIO que srsquoescau

30

Seguim el patroacute de les foacutermules emprades a la pragravectica anterior

En aquest cas tenim tres variables drsquoentrada perograve la mecagravenica eacutes la mateixa Es pot jugar amb la foacutermula i anar provant diferents combinacions

Necessitem tres variables ja que hi ha tres botons

Declaracions

Comprovem quins estan premuts

int AND (int a int b) return a ampamp b

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 + arsquob

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5 int pin_boto_C = 6

int apretat_A = 0 int apretat_B = 0 int apretat_C = 0

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

31

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

Mostra resultat if (f(apretat_A apretat_B apretat_C) == 1) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins no estan premuts

Com al circuit anterior apliquem la foacutermula i si aquesta doacutena 1 encenem el LED

Proposta Ara que ja has apregraves els conceptes meacutes fonamentals de la CodePi inventarsquot un circuit amb el nivell de dificultat que consideris No et quedis amb el que se trsquoha ensenyat aquiacute sinoacute que cerca meacutes megravetodes que puguis utilitzar La creativitat eacutes bagravesica per a tot bon enginyer i amb aquesta pragravectica volem que demostris de quegrave ets capaccedil

32

8 Vols saber-ne meacutes El moacuten de la programacioacute i lrsquoelectrogravenica eacutes infinit La comunitat geek (= interessada) en aquests te-mes eacutes una de les meacutes servicials i altruista de tota la xarxa aixiacute que es poden trobar una quantitat inacabable de tutorials i pagravegines web especialitza-des en el que vulguem saber

81 Programari lliureEl programari lliure eacutes la base de la informagravetica ac-tual i encara juga un gran paper en algunes agraverees com els servidors web o els mogravebils amb sistema operatiu Android Aquiacute teniu un conjunt de pagravegines on podeu aprofundir sobre aquest apassionant moacuten de la llibertat digital

httpcawikipediaorgwikiRichard_Matthew_Stallmanhttpwwwfsforghttpwwwgnuorghttpwwwlinuxorghttpwwwunixorghttpwwwubuntucom

82 Raspberry PiSi desitges saber meacutes sobre el projecte sense agravenim de lucre Raspberry Pi i seguir fent projectes amb ella visita les pagines que trobaragraves a con-tinuacioacute Aquestes et donaran idees de quegrave fer amb aquest petit perograve fascinant ordinador

httplearnadafruitcomcategorylearn-raspber-ry-pihttpwwwraspberrypiorgwwwraspberrypiorghttpdangerousprototypescom20130202rasp-berry-pi-supercomputerhttpreviewscnetcoukdesktops25-fun-things-to-do-with-a-raspberry-pi-50009851httplearnadafruitcompi-thermal-printer

33

83 Electrogravenica Si lrsquoelectrogravenica bagravesica que has apregraves durant els tutorials de la CodePi trsquoha fet veure que aquest eacutes el moacuten que a tu trsquoagrada no paris A continu-acioacute et deixem pagravegines web on trobaragraves les bases de lrsquoelectrogravenica meacutes complexa i tambeacute molts nous circuits per muntar i seguir descobrint aquest moacuten que avui en dia fa que tots els aparells endollats a al corrent puguin funcionar

httpwwwinstructablescomidBeginners-Elec-tronics-ProjectshttpwwwinstructablescomidElectronic-Proj-ects-For-Beginnershttpwwwcircuitstodaycomsimple-electron-ics-projects-and-circuitshttpswwwsparkfuncomtutorialshttplearnadafruitcom

84 ProgramacioacuteDiuen que per ser un bon programador srsquohan de tenir unes habilitats que no tothom teacute disciplina ordre logravegica creativitat capacitat per resoldre qualsevol problema i per sobre de tot persistegravencia i passioacute Si creus que tens aquestes qualitats do-na-li una oportunitat a la programacioacute A continu-acioacute et deixem un recull de les pagravegines web que creiem que meacutes et poden ajudar a introduir-te una mica meacutes en la programacioacute web i la drsquoapli-cacions per a mogravebils

httpwwwcodeorghttpscratchmiteduhttpwwwcodecademycom

34

9 GlossariC (llenguatge de programacioacute) Des de la seva creacioacute lrsquoany 1972 srsquoha consolidat com un dels llenguatges de programacioacute meacutes utilitzats per fer aplicacions de software Eacutes considerat un dels meacutes bagravesics i meacutes comuns per introduir-se a la pro-gramacioacute Les grans companyies han utilitzat el C com a base per crear altres llenguatges com lrsquoObjective-C (utilitzat per fer les aplicacions per dispositius drsquoApple) o el C (creat per Microsoft i utilitzat entre altres coses per fer programes in-formagravetics per Windows)

Condensador Component electrogravenic classificat dins del grup dels passius i que per tant no emet cap senyal El podriacuteem definir com un acumula-dor drsquoelectrons que els deixa anar quan arriba a la seva capacitat magravexima Hi ha condensadors de dos tipus els electroliacutetics i els normals En les pragravec-tiques utilitzarem electroliacutetics i com que aquests tenen polaritat eacutes important tenir en compte quina eacutes la pota positiva i quina eacutes la negativa a lrsquohora de connectar-lo

Diacuteode Component electrogravenic passiu Teacute polaritat i seria lrsquoequivalent a una vagravelvula antiretorn lrsquoelec-tricitat nomeacutes pot anar en un sentit

Electrogravenica Disciplina que estudia els com-ponents electrogravenics que funcionen amb un flux drsquoelectrons (corrent continua)

Funcioacute Fragment de codi que conte un seguit drsquoaccions i que hi pots accedir cridant la funcioacute en comptes de repetint el codi Podriacuteem comparar-ho amb una funcioacute matemagravetica en la que tenim vari-ables drsquoentrada que tractant-les a la funcioacute ob-tenim una informacioacute de sortida

GPIO Soacuten les sigles de ldquoGeneral Purpose InputOutputrdquo Si mirem la Raspberry Pi soacuten els pins de sortida on hi connectem els cables amb els que programem la placa electrogravenica Lrsquoavantatge drsquoaquest tipus de connector respecte altres eacutes que es pot gestionar mitjanccedilant programacioacute i aixograve eacutes precisament el que explicarem en aquest manual

35

HDMI Soacuten les sigles de ldquoHigh-Definition Multime-dia Interfacerdquo Serveix per enviar viacutedeo i agraveudio a una pantalla Nosaltres lrsquoutilitzarem per connectar la RaspberryPi a una pantalla

LED Acrogravenim de ldquoLight Emitting Dioderdquo Eacutes un tipus de diacuteode el qual teacute una pelmiddotliacutecula de fogravesfor entre els dos connectors que fa que quan passi el corrent generi llum Com qualsevol altre diacuteode eacutes important tenir en compte la polaritat

RAM Acrogravenim de ldquoRandom Access Memoryrdquo Eacutes la part de lrsquoordinador encarregada drsquoemmagatze-mar els arxius temporals

RCA El connector RCA consisteix en diferents cables amb la punta de diferent color que serveix-en per transmetre agraveudio i viacutedeo

ROM De lrsquoanglegraves ldquoRead Only Memoryrdquo eacutes la uni-tat de memograveria on es guarda el sistema operatiu

Resistegravencia Eacutes un component electrogravenic que teacute com a funcioacute reduir el flux drsquoelectrons afi de controlar la seva potegravencia Eacutes molt comuacute a lrsquoelectrogravenica ja que eacutes molt necessari per assegu-rar-nos del correcte funcionament drsquoelements com el LED que sense una resistegravencia que limiteacutes el corrent podrien cremar-se

Placa base Eacutes la part de lrsquoordinador que conteacute elements com la RAM la ROM o el microproces-sador La placa base de lrsquoordinador que constru-irem amb aquest manual seria la progravepia Raspber-ry Pi

Protoboard Tambeacute coneguda com a Bread-board srsquoutilitza per crear circuits electrogravenics sense necessitat de soldar Per saber com funcio-na i com estan relacionats els diferents contactes consulteu aquesta webhttprduinostarcomdocumentaciongeneralpro-toboard-que-es-y-como-funciona

36

Terminal Eacutes el programa emprat per enviar ordres directes a lrsquoordinador i rebre respostes drsquoaquest Nosaltres lrsquoutilitzarem per instalmiddotlar els programes necessaris per programar les plaques electrograveniques i altres arxius necessaris

Variable Valor que canvia segons les operacions que es facin amb aquest al programa informagravetic Com ja sabeu hi ha variables independents (pe el temps) i dependents (pe si estagrave o no encegraves un LED que dependragrave drsquoaltres variables)

37

  • httpwwwfsforg
Page 16: CodePi

16

7 PragravectiquesRecomanacioacute mirar aquests tutorials introduc-toris al llenguatge C httpthenewbostonorglistphpcat=14

Aquiacute teniu un quadre que us serviragrave lrsquoequivalegravencia entre els pins del GPIO i els que haurem de posar en el codi

Ja queda menys perquegrave puguis comenccedilar a pro-gramar perograve abans de fer-ho hauragraves de saber com compilar un programa Probablement ara et preguntaragraves quegrave eacutes compilar doncs compilar eacutes el proceacutes que fa un programa per traduir el codi que nosaltres hem escrit a codi binari amb la fi-nalitat de que el nostre ordinador pugui entendre cada ordre

Per compilar un codi escrit en C farem servir el compilador cc Abans drsquoutilitzar aquest programa haurem drsquoindicar a on hem guardat la nostra pragravec-tica amb lrsquoordre cdcc

-o practica

-Wall

-Iusrlocalinclude

-Lusrlocallib

practicac

-lwiringPi

Primer de tot posarem lrsquoordre al terminal

Utilitzarem el modificador -o per establir quin seragrave el nom del programa de sortida per exemple ldquopragravecticardquo

Amb aquest modificador indicarem que volem que ens doni tota la informacioacute dels errors de sintaxis del fitxer

Amb aquest indicarem on es troben els fitxers de la llibreria a incloure dintre del nostre fitxer

Utilitzant aquest altre modificador establim el di-rectori on ha de buscar els fitxers de la llibreria

Ara indicarem el nom del fitxer on es troba el nos-tre codi sempre acabant amb la terminacioacute c per exemple ldquopragravecticacrdquo

Amb aquest modificador posem la llibreria wiring-Pi a la llista de llibreries que han de ser afegides

17

Al final introduirem tot seguit al terminal una ordre similar a la seguumlent

cc -o practica -Wall -Iusrlocalinclude -Lusrlocallib practicac -lwiringPi

A part de saber compilar abans de comenccedilar a programar i a fer els nostres circuits haurem de saber quins soacuten els pins on haurem de connectar als cables a la Raspberry Pi aquest pins els iden-tificarem utilitzant nuacutemeros

La seguumlent taula ens permet saber lrsquoequivalegravencia entre els nuacutemeros de la GPIO els nuacutemeros de wiringPi la llibreria que interpretaragrave el nostre codi i la posicioacute dels pins

18

Des que la variable i eacutes igual a 1 fins i mentre que aquesta sigui igual o meacutes petita que10 executa el codi

Mentre que la variable D sigui igual a 5 el codi entre claus es llegiragrave infinites vegades

Si la variable X no eacutes meacutes petita que 7 fes una altra cosa

Si la variable X eacutes meacutes petita que 7 fes alguna cosa

70 Iniciacioacute al llenguatge CAbans de comenccedilar a programar cal tenir en compte els conceptes de condicional i de cicle

Els condicionals ldquoif - elserdquo nomeacutes executen el codi a continuacioacute si la condicioacute que li fiquem entre paregraventesis eacutes certa Ho podriacuteem comparar amb el que seria una oracioacute condicional No eacutes obligatori perograve podem afegir la partiacutecula ldquoelserdquo que eacutes lrsquoequivalent a la paraula ldquosi nordquo En el cas a continuacioacute com que el condicional no es compleix srsquoexecutaria lrsquoelse

if (X lt 7) Fes alguna cosa else Fes una altra cosa

Els bucles ldquoforrdquo soacuten rutines que serveixen per ex-ecutar un codi un determinat nuacutemero de vegades Teacute tres parts separades per punt i coma entrada condicioacute i increment A la entrada li donem un va-lor a una variable A la condicioacute determinem que la rutina srsquoexecuti nomeacutes si eacutes compleix la condicioacute utilitzant la variable drsquoentrada Finalment en el in-crement fixem un nou valor a la variable aquesta part srsquoexecutaragrave a cada cicle En llenguatge C si no afegim cap dels tres paragravemetres el bucle seragrave infinit

for (int i = 1 i lt= 10 i++) Fes alguna cosa

La sentegravencia ldquowhilerdquo defineix que un codi srsquoexe-cutaragrave infinitament mentre que la condicioacute que es defineix sigui certa

while (D==5) Fes alguna cosa

19

71 Bloc 1 (Bagravesic)711 Hola moacuten

En aquesta pragravectica escriurem un text a la consograve-la el conegut ldquoHello Worldrdquo

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void) printf(ldquohola moacutenrdquo)

if (wiringPiSetup() == -1) exit (1)

return 0

712 Encendre un LED

Hem drsquoimportar aquestes llibreries per tal que la RaspberryPi entengui el codi

Aquesta eacutes la funcioacute principal (main) i srsquoexecutaragrave tot el que fiquem aquiacute dins

Amb la funcioacute printf() el que aconseguim eacutes que es mostri al terminal el text que hi posem entre comentes

Aquestes liacutenies de codi soacuten simplement compro-vacions per assegurar-nos que tot funciona cor-rectament Soacuten negligibles perograve eacutes recomanable posar-les Les afegirem a totes les pragravectiques

Connectarem la pota llarga (agravenode) del LED al pin 5v de la GPIO i lrsquoaltre pota (cagravetode) a una resistegraven-cia de 180Ω Aquesta distincioacute entre potes es deu a que els LEDs estan polaritzats mireu el glossa-ri per saber-ne meacutes Tot seguit connecteu lrsquoaltra pota de la resistegravencia al pin GROUND

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void)

20

Comprovacionsif (wiringPiSetup() == -1) exit (1)

int pin = 1

printf(ldquoEncenem el pin 18rdquo)

pinMode(pin OUTPUT)

digitalWrite(pin 1)

return 0

713 Encendre i apagar un LED cada dos segons 10 vegades

El que podeu veure aquiacute eacutes el que srsquoanomena un comentari del codi Tot allograve que escrivim despreacutes de ldquordquo el compilador no ho llegiragrave i per tant nomeacutes serveix per donar indicacions al programador

Declarem la variable pin que com eacutes un nombre enter escriurem int

Fem un printf() tal i com hem apregraves a la pragravectica anterior Escrivim el 18 ja que la numeracioacute de la llibreria wiringPi canvia respecte a la sortida real (mirar el cuadre de la pagravegina 17)

Amb la funcioacute pinMode() declarem que el pin nuacutemero 1 en aquest cas sigui un pin de sortida de corrent (OUTPUT)

Una vegada li hem dit que eacutes de sortida li hem de dir si el volem encegraves ldquo1rdquo o apagat ldquo0rdquo amb la funcioacute digitalWrite()

Utilitzarem el muntatge la de pragravectica anterior amb la diferegravencia que en comptes de connectar lrsquoagravenode del LED al pin de 5v el connectarem al pin 18 de la Raspberry Pi Drsquoaquesta manera podrem gestionar el pas de lrsquoelectricitat a traveacutes drsquoun petit programa que crearem a continuacioacute

21

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void) int pin = 1

if (wiringPiSetup() == -1) exit (1)

pinMode(pin OUTPUT)

for (int i=1ilt=10i++)

printf(ldquoLED Onnrdquo) digitalWrite(pin 1)

delay(2000)

printf(ldquoLED Offnrdquo) digitalWrite(pin 0)

delay(2000)

return 0

Utilitzem un bicle ldquoforrdquo per executar el codi 10 vegades

Encenem el LED

Fem un delay() de 2000 milmiddotlisegons (2 segons) que ens serveix per aturar el programa i per tant mantenir el LED encegraves durant aquest temps

Apaguem el LED

El mantenim apagat 2 segons

Lrsquoexpressioacute n serveix per canviar de liacutenia

Proposta Ara que ja saps els conceptes bagravesics de la CodePi intenta fer lrsquoequivalent al codi Morse per demanar ajuda SOS middot middot middot ndash ndash ndash middot middot middot (on cada punt significa LED encegraves durant 14 de segon i cada ralla LED encegraves durant mig segon) Juga amb el valor de la funcioacute delay() per fer que el LED estigui encegraves durant meacutes o menys temps

22

72 Bloc 2 (Mitjagrave)721 Encendre un LED apretant un botoacute

Utilitzar el muntatge del LED que hem fet servir a la pragravectica anterior A meacutes a meacutes hem drsquoafegir 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 aniragrave a parar al pin 23 una resistegravencia de 10KΩ al GROUND per forccedilar lrsquoestat LOW quan el polsador no estagrave apretat

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt int main (void) int pin_LED = 1 int pin_boto = 4 printf (ldquoEncenent un LED apretant un botoacutenrdquo) 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

Declarem el LED com un pin de sortidaI el botoacute com un pin drsquoentrada

Si no fiquem variables al for aquest srsquoexecutaragrave sempre

Amb la funcioacute digitalRead() detectem si passa cor-rent pel pin 8 eacutes a dir si el botoacute ha estat apretat Si eacutes aixiacute fem que srsquoencengui el LED

Si no fem que srsquoapagui

23

722 Encendre un LED apretant tots els puladors

Utilitzar el muntatge de la pragravectica anterior i afegir dos polsadors meacutes amb el mateix proceacutes connec-tats als ports 24 i 25 de la Raspberry Pi

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int main (void) int pin_LED = 1

int pin_boto_A = 4 int pin_boto_B = 5 int 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 ampamp digitalRead(pin_boto_B) == HIGH ampamp digitalRead(pin_boto_C) == HIGH) digitalWrite(pin_LED 1)

Declarem el LED i els tres botons que tal i com posa a lrsquoesquema corresponen als pins 23 24 i 25 de la GPIO

Si els tres polsadors estan premuts passa corrent pels tres i per tant srsquoenceacuten el LED

En aquest cas utilitzem HIGH i LOW en lloc de 1 i 0 respectivament HIGH significa que hi ha elec-tricitat i LOW que no hi ha

24

No apretats while (digitalRead(pin_boto_A) == LOW ampamp digitalRead(pin_boto_B) == LOW ampamp digitalRead(pin_boto_C) == LOW) digitalWrite(pin_LED 0)

Si no apagarsquol

723 Semagravefor amb polsador

En aquesta pragravectica crearem un semagravefor de via-nants i de cotxes Com alguns semagravefors aquests teacute un botoacute amb el qual els vianants demanen que es posi verd aixiacute que el dels cotxes es posa ver-mell

Connectarem dos LEDs (vermell i verd) als pins 18 i 23 de la Raspberry Pi amb una resistegravencia de 180Ω Tambeacute connectarem tres LEDs meacutes (verd vermell i taronja) de la mateixa manera en els ports 17 21 i 22 de la GPIO

A diferegravencia de les altres pragravectiques amb polsa-dors en aquesta el connectarem al port SDA0 i al GROUND ja que nomeacutes ens interessa detectar quan es prem

25

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

define VERMELL 0define GROC1define VERD 2define VERMELL_HOME3define VERD_HOME4

define BOTO 8

void setup (void) int i

if (geteuid () = 0) exit (0)

if (wiringPiSetup () == -1) exit (1)

fflush(stdout) for (i = 0 i lt 5 ++i) pinMode (i OUTPUT) digitalWrite (i 0) digitalWrite(VERD1)digitalWrite(VERMELL_HOME1) pinMode (BOTO INPUT)

printf (ldquoSetup fetnrdquo)

int main (void) setup () for () esperaBoto () aturaTransit () camina () tempsEspera () iniciaTransit ()

Amb lrsquoexpressioacute define li diem a la magravequina que cada cop que escrivim VERMELL en realitat es-tem posant el nombre 0 i el mateix amb les altres paraules

Fem un setup amb tota la configuracioacute necessagraveria

fflush() eacutes una funcioacute complexa que serveix per quumlestions de tractament de memograveria del sistema per evitar errors

Executem totes les funcions una darrera lrsquoaltra de manera indefinida

26

Esperant a que lrsquousuari premi el botoacute per comenccedilar

Fem que el semagravefor dels cotxes canviiuml de verd a vermell passant pel groc

Fem que el semagravefor dels vianants es posi verd

Temps intermig des que srsquoacaba de caminar fins que el trafic comenccedila

void esperaBoto (void) printf (ldquoEsperant el botoacute ldquo)fflush(stdout) while (digitalRead (BOTO) == HIGH) delay (100) printf (ldquoEsoerenrdquo)

void aturaTransit()printf(ldquoAturanteltraficldquo)fflush(stdout)digitalWrite(VERD0) digitalWrite (GROC 1) delay (2000) digitalWrite (GROC 0) digitalWrite(VERMELL1) delay (2000) printf (ldquoAturatsnrdquo)

void camina ()printf(ldquoCaminaldquo)fflush(stdout)

digitalWrite(VERMELL_HOME0)digitalWrite(VERD_HOME1) delay (10000) digitalWrite(VERMELL0) digitalWrite (GROC 1)

printf (ldquoJa han caminatnrdquo)

void tempsEspera () int i

printf (ldquoTemps drsquoespera ldquo) fflush(stdout)

for (i = 0 i lt 8 ++i)

27

delay (500) digitalWrite(VERD_HOME0) digitalWrite (GROC 0) delay (500) digitalWrite(VERD_HOME1) digitalWrite (GROC 1)

void iniciaTransit ()printf(ldquoInicianttraficldquo)fflush(stdout)

digitalWrite(VERD_HOME0)digitalWrite(VERMELL_HOME1) delay (500) digitalWrite (GROC 0) digitalWrite(VERD1)

Deixem via lliure pels vehicles i posem el semagrave-for vermell pels vianants

Proposta Utilitzant el que has apregraves en aquest bloc crear un projecte amb uns quants LEDs en fila que srsquoactivin ascendentment quan apretes un botoacute

28

73 Bloc 3 (Alt)731 Sistema portes logravegiques I

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int AND (int a int b) return a ampamp b

int OR (int a int b) return a || b

int NEGADA (int a) return a

int f(int a int b) return OR(AND(NE-GADA(a)b)AND(aNEGADA(b))) f(a b) = arsquob + abrsquo

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5

int apretat_A = 0 int apretat_B = 0

pinMode(pin_LED_S OUTPUT) pinMode(pin_boto_A INPUT) pinMode(pin_boto_B INPUT)

Crearem una funcioacute per a cada porta logravegica de tal manera que sigui meacutes fagravecil poder-ho aplicar despreacutes

Aquesta seragrave la foacutermula que compliragrave la taula de la veritat en aquest cas eacutes f(a b) = arsquob +abrsquo

Creem dos booleans (variables que poden ser 0 o 1) que ens indicaran si el botoacute ha estat premut o no

Declarem els pins drsquoentrada i de sortida com a totes les pragravectiques anteriors

El seguumlent projecte fa la mateixa funcioacute que acon-seguiriacuteem amb xips de portes logravegiques perograve fent els cagravelculs a partir de la RaspberryPi En aquest cas compleix la taula de la veritat drsquoun OR ex-clusive eacutes a dir nomeacutes srsquoencendragrave el LED quan premem un dels dos botons mai srsquoencendragrave 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 srsquoutilitzin en el codi

29

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) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins estan premuts

Comprovem quins no estan premuts

I apliquem la foacutermula amb els valors drsquoentrada cor-responents Si la foacutermula eacutes igual a 1 srsquoencendragrave el LED si no no srsquoencendragrave

732 Sistema portes logravegiques II

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

Partim de la mateixa base que la pragravectica ante-rior perograve en aquesta incloem una tercera variable drsquoentrada Aixiacute que hem drsquoafegir un nou botoacute en el pin del GPIO que srsquoescau

30

Seguim el patroacute de les foacutermules emprades a la pragravectica anterior

En aquest cas tenim tres variables drsquoentrada perograve la mecagravenica eacutes la mateixa Es pot jugar amb la foacutermula i anar provant diferents combinacions

Necessitem tres variables ja que hi ha tres botons

Declaracions

Comprovem quins estan premuts

int AND (int a int b) return a ampamp b

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 + arsquob

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5 int pin_boto_C = 6

int apretat_A = 0 int apretat_B = 0 int apretat_C = 0

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

31

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

Mostra resultat if (f(apretat_A apretat_B apretat_C) == 1) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins no estan premuts

Com al circuit anterior apliquem la foacutermula i si aquesta doacutena 1 encenem el LED

Proposta Ara que ja has apregraves els conceptes meacutes fonamentals de la CodePi inventarsquot un circuit amb el nivell de dificultat que consideris No et quedis amb el que se trsquoha ensenyat aquiacute sinoacute que cerca meacutes megravetodes que puguis utilitzar La creativitat eacutes bagravesica per a tot bon enginyer i amb aquesta pragravectica volem que demostris de quegrave ets capaccedil

32

8 Vols saber-ne meacutes El moacuten de la programacioacute i lrsquoelectrogravenica eacutes infinit La comunitat geek (= interessada) en aquests te-mes eacutes una de les meacutes servicials i altruista de tota la xarxa aixiacute que es poden trobar una quantitat inacabable de tutorials i pagravegines web especialitza-des en el que vulguem saber

81 Programari lliureEl programari lliure eacutes la base de la informagravetica ac-tual i encara juga un gran paper en algunes agraverees com els servidors web o els mogravebils amb sistema operatiu Android Aquiacute teniu un conjunt de pagravegines on podeu aprofundir sobre aquest apassionant moacuten de la llibertat digital

httpcawikipediaorgwikiRichard_Matthew_Stallmanhttpwwwfsforghttpwwwgnuorghttpwwwlinuxorghttpwwwunixorghttpwwwubuntucom

82 Raspberry PiSi desitges saber meacutes sobre el projecte sense agravenim de lucre Raspberry Pi i seguir fent projectes amb ella visita les pagines que trobaragraves a con-tinuacioacute Aquestes et donaran idees de quegrave fer amb aquest petit perograve fascinant ordinador

httplearnadafruitcomcategorylearn-raspber-ry-pihttpwwwraspberrypiorgwwwraspberrypiorghttpdangerousprototypescom20130202rasp-berry-pi-supercomputerhttpreviewscnetcoukdesktops25-fun-things-to-do-with-a-raspberry-pi-50009851httplearnadafruitcompi-thermal-printer

33

83 Electrogravenica Si lrsquoelectrogravenica bagravesica que has apregraves durant els tutorials de la CodePi trsquoha fet veure que aquest eacutes el moacuten que a tu trsquoagrada no paris A continu-acioacute et deixem pagravegines web on trobaragraves les bases de lrsquoelectrogravenica meacutes complexa i tambeacute molts nous circuits per muntar i seguir descobrint aquest moacuten que avui en dia fa que tots els aparells endollats a al corrent puguin funcionar

httpwwwinstructablescomidBeginners-Elec-tronics-ProjectshttpwwwinstructablescomidElectronic-Proj-ects-For-Beginnershttpwwwcircuitstodaycomsimple-electron-ics-projects-and-circuitshttpswwwsparkfuncomtutorialshttplearnadafruitcom

84 ProgramacioacuteDiuen que per ser un bon programador srsquohan de tenir unes habilitats que no tothom teacute disciplina ordre logravegica creativitat capacitat per resoldre qualsevol problema i per sobre de tot persistegravencia i passioacute Si creus que tens aquestes qualitats do-na-li una oportunitat a la programacioacute A continu-acioacute et deixem un recull de les pagravegines web que creiem que meacutes et poden ajudar a introduir-te una mica meacutes en la programacioacute web i la drsquoapli-cacions per a mogravebils

httpwwwcodeorghttpscratchmiteduhttpwwwcodecademycom

34

9 GlossariC (llenguatge de programacioacute) Des de la seva creacioacute lrsquoany 1972 srsquoha consolidat com un dels llenguatges de programacioacute meacutes utilitzats per fer aplicacions de software Eacutes considerat un dels meacutes bagravesics i meacutes comuns per introduir-se a la pro-gramacioacute Les grans companyies han utilitzat el C com a base per crear altres llenguatges com lrsquoObjective-C (utilitzat per fer les aplicacions per dispositius drsquoApple) o el C (creat per Microsoft i utilitzat entre altres coses per fer programes in-formagravetics per Windows)

Condensador Component electrogravenic classificat dins del grup dels passius i que per tant no emet cap senyal El podriacuteem definir com un acumula-dor drsquoelectrons que els deixa anar quan arriba a la seva capacitat magravexima Hi ha condensadors de dos tipus els electroliacutetics i els normals En les pragravec-tiques utilitzarem electroliacutetics i com que aquests tenen polaritat eacutes important tenir en compte quina eacutes la pota positiva i quina eacutes la negativa a lrsquohora de connectar-lo

Diacuteode Component electrogravenic passiu Teacute polaritat i seria lrsquoequivalent a una vagravelvula antiretorn lrsquoelec-tricitat nomeacutes pot anar en un sentit

Electrogravenica Disciplina que estudia els com-ponents electrogravenics que funcionen amb un flux drsquoelectrons (corrent continua)

Funcioacute Fragment de codi que conte un seguit drsquoaccions i que hi pots accedir cridant la funcioacute en comptes de repetint el codi Podriacuteem comparar-ho amb una funcioacute matemagravetica en la que tenim vari-ables drsquoentrada que tractant-les a la funcioacute ob-tenim una informacioacute de sortida

GPIO Soacuten les sigles de ldquoGeneral Purpose InputOutputrdquo Si mirem la Raspberry Pi soacuten els pins de sortida on hi connectem els cables amb els que programem la placa electrogravenica Lrsquoavantatge drsquoaquest tipus de connector respecte altres eacutes que es pot gestionar mitjanccedilant programacioacute i aixograve eacutes precisament el que explicarem en aquest manual

35

HDMI Soacuten les sigles de ldquoHigh-Definition Multime-dia Interfacerdquo Serveix per enviar viacutedeo i agraveudio a una pantalla Nosaltres lrsquoutilitzarem per connectar la RaspberryPi a una pantalla

LED Acrogravenim de ldquoLight Emitting Dioderdquo Eacutes un tipus de diacuteode el qual teacute una pelmiddotliacutecula de fogravesfor entre els dos connectors que fa que quan passi el corrent generi llum Com qualsevol altre diacuteode eacutes important tenir en compte la polaritat

RAM Acrogravenim de ldquoRandom Access Memoryrdquo Eacutes la part de lrsquoordinador encarregada drsquoemmagatze-mar els arxius temporals

RCA El connector RCA consisteix en diferents cables amb la punta de diferent color que serveix-en per transmetre agraveudio i viacutedeo

ROM De lrsquoanglegraves ldquoRead Only Memoryrdquo eacutes la uni-tat de memograveria on es guarda el sistema operatiu

Resistegravencia Eacutes un component electrogravenic que teacute com a funcioacute reduir el flux drsquoelectrons afi de controlar la seva potegravencia Eacutes molt comuacute a lrsquoelectrogravenica ja que eacutes molt necessari per assegu-rar-nos del correcte funcionament drsquoelements com el LED que sense una resistegravencia que limiteacutes el corrent podrien cremar-se

Placa base Eacutes la part de lrsquoordinador que conteacute elements com la RAM la ROM o el microproces-sador La placa base de lrsquoordinador que constru-irem amb aquest manual seria la progravepia Raspber-ry Pi

Protoboard Tambeacute coneguda com a Bread-board srsquoutilitza per crear circuits electrogravenics sense necessitat de soldar Per saber com funcio-na i com estan relacionats els diferents contactes consulteu aquesta webhttprduinostarcomdocumentaciongeneralpro-toboard-que-es-y-como-funciona

36

Terminal Eacutes el programa emprat per enviar ordres directes a lrsquoordinador i rebre respostes drsquoaquest Nosaltres lrsquoutilitzarem per instalmiddotlar els programes necessaris per programar les plaques electrograveniques i altres arxius necessaris

Variable Valor que canvia segons les operacions que es facin amb aquest al programa informagravetic Com ja sabeu hi ha variables independents (pe el temps) i dependents (pe si estagrave o no encegraves un LED que dependragrave drsquoaltres variables)

37

  • httpwwwfsforg
Page 17: CodePi

17

Al final introduirem tot seguit al terminal una ordre similar a la seguumlent

cc -o practica -Wall -Iusrlocalinclude -Lusrlocallib practicac -lwiringPi

A part de saber compilar abans de comenccedilar a programar i a fer els nostres circuits haurem de saber quins soacuten els pins on haurem de connectar als cables a la Raspberry Pi aquest pins els iden-tificarem utilitzant nuacutemeros

La seguumlent taula ens permet saber lrsquoequivalegravencia entre els nuacutemeros de la GPIO els nuacutemeros de wiringPi la llibreria que interpretaragrave el nostre codi i la posicioacute dels pins

18

Des que la variable i eacutes igual a 1 fins i mentre que aquesta sigui igual o meacutes petita que10 executa el codi

Mentre que la variable D sigui igual a 5 el codi entre claus es llegiragrave infinites vegades

Si la variable X no eacutes meacutes petita que 7 fes una altra cosa

Si la variable X eacutes meacutes petita que 7 fes alguna cosa

70 Iniciacioacute al llenguatge CAbans de comenccedilar a programar cal tenir en compte els conceptes de condicional i de cicle

Els condicionals ldquoif - elserdquo nomeacutes executen el codi a continuacioacute si la condicioacute que li fiquem entre paregraventesis eacutes certa Ho podriacuteem comparar amb el que seria una oracioacute condicional No eacutes obligatori perograve podem afegir la partiacutecula ldquoelserdquo que eacutes lrsquoequivalent a la paraula ldquosi nordquo En el cas a continuacioacute com que el condicional no es compleix srsquoexecutaria lrsquoelse

if (X lt 7) Fes alguna cosa else Fes una altra cosa

Els bucles ldquoforrdquo soacuten rutines que serveixen per ex-ecutar un codi un determinat nuacutemero de vegades Teacute tres parts separades per punt i coma entrada condicioacute i increment A la entrada li donem un va-lor a una variable A la condicioacute determinem que la rutina srsquoexecuti nomeacutes si eacutes compleix la condicioacute utilitzant la variable drsquoentrada Finalment en el in-crement fixem un nou valor a la variable aquesta part srsquoexecutaragrave a cada cicle En llenguatge C si no afegim cap dels tres paragravemetres el bucle seragrave infinit

for (int i = 1 i lt= 10 i++) Fes alguna cosa

La sentegravencia ldquowhilerdquo defineix que un codi srsquoexe-cutaragrave infinitament mentre que la condicioacute que es defineix sigui certa

while (D==5) Fes alguna cosa

19

71 Bloc 1 (Bagravesic)711 Hola moacuten

En aquesta pragravectica escriurem un text a la consograve-la el conegut ldquoHello Worldrdquo

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void) printf(ldquohola moacutenrdquo)

if (wiringPiSetup() == -1) exit (1)

return 0

712 Encendre un LED

Hem drsquoimportar aquestes llibreries per tal que la RaspberryPi entengui el codi

Aquesta eacutes la funcioacute principal (main) i srsquoexecutaragrave tot el que fiquem aquiacute dins

Amb la funcioacute printf() el que aconseguim eacutes que es mostri al terminal el text que hi posem entre comentes

Aquestes liacutenies de codi soacuten simplement compro-vacions per assegurar-nos que tot funciona cor-rectament Soacuten negligibles perograve eacutes recomanable posar-les Les afegirem a totes les pragravectiques

Connectarem la pota llarga (agravenode) del LED al pin 5v de la GPIO i lrsquoaltre pota (cagravetode) a una resistegraven-cia de 180Ω Aquesta distincioacute entre potes es deu a que els LEDs estan polaritzats mireu el glossa-ri per saber-ne meacutes Tot seguit connecteu lrsquoaltra pota de la resistegravencia al pin GROUND

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void)

20

Comprovacionsif (wiringPiSetup() == -1) exit (1)

int pin = 1

printf(ldquoEncenem el pin 18rdquo)

pinMode(pin OUTPUT)

digitalWrite(pin 1)

return 0

713 Encendre i apagar un LED cada dos segons 10 vegades

El que podeu veure aquiacute eacutes el que srsquoanomena un comentari del codi Tot allograve que escrivim despreacutes de ldquordquo el compilador no ho llegiragrave i per tant nomeacutes serveix per donar indicacions al programador

Declarem la variable pin que com eacutes un nombre enter escriurem int

Fem un printf() tal i com hem apregraves a la pragravectica anterior Escrivim el 18 ja que la numeracioacute de la llibreria wiringPi canvia respecte a la sortida real (mirar el cuadre de la pagravegina 17)

Amb la funcioacute pinMode() declarem que el pin nuacutemero 1 en aquest cas sigui un pin de sortida de corrent (OUTPUT)

Una vegada li hem dit que eacutes de sortida li hem de dir si el volem encegraves ldquo1rdquo o apagat ldquo0rdquo amb la funcioacute digitalWrite()

Utilitzarem el muntatge la de pragravectica anterior amb la diferegravencia que en comptes de connectar lrsquoagravenode del LED al pin de 5v el connectarem al pin 18 de la Raspberry Pi Drsquoaquesta manera podrem gestionar el pas de lrsquoelectricitat a traveacutes drsquoun petit programa que crearem a continuacioacute

21

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void) int pin = 1

if (wiringPiSetup() == -1) exit (1)

pinMode(pin OUTPUT)

for (int i=1ilt=10i++)

printf(ldquoLED Onnrdquo) digitalWrite(pin 1)

delay(2000)

printf(ldquoLED Offnrdquo) digitalWrite(pin 0)

delay(2000)

return 0

Utilitzem un bicle ldquoforrdquo per executar el codi 10 vegades

Encenem el LED

Fem un delay() de 2000 milmiddotlisegons (2 segons) que ens serveix per aturar el programa i per tant mantenir el LED encegraves durant aquest temps

Apaguem el LED

El mantenim apagat 2 segons

Lrsquoexpressioacute n serveix per canviar de liacutenia

Proposta Ara que ja saps els conceptes bagravesics de la CodePi intenta fer lrsquoequivalent al codi Morse per demanar ajuda SOS middot middot middot ndash ndash ndash middot middot middot (on cada punt significa LED encegraves durant 14 de segon i cada ralla LED encegraves durant mig segon) Juga amb el valor de la funcioacute delay() per fer que el LED estigui encegraves durant meacutes o menys temps

22

72 Bloc 2 (Mitjagrave)721 Encendre un LED apretant un botoacute

Utilitzar el muntatge del LED que hem fet servir a la pragravectica anterior A meacutes a meacutes hem drsquoafegir 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 aniragrave a parar al pin 23 una resistegravencia de 10KΩ al GROUND per forccedilar lrsquoestat LOW quan el polsador no estagrave apretat

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt int main (void) int pin_LED = 1 int pin_boto = 4 printf (ldquoEncenent un LED apretant un botoacutenrdquo) 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

Declarem el LED com un pin de sortidaI el botoacute com un pin drsquoentrada

Si no fiquem variables al for aquest srsquoexecutaragrave sempre

Amb la funcioacute digitalRead() detectem si passa cor-rent pel pin 8 eacutes a dir si el botoacute ha estat apretat Si eacutes aixiacute fem que srsquoencengui el LED

Si no fem que srsquoapagui

23

722 Encendre un LED apretant tots els puladors

Utilitzar el muntatge de la pragravectica anterior i afegir dos polsadors meacutes amb el mateix proceacutes connec-tats als ports 24 i 25 de la Raspberry Pi

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int main (void) int pin_LED = 1

int pin_boto_A = 4 int pin_boto_B = 5 int 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 ampamp digitalRead(pin_boto_B) == HIGH ampamp digitalRead(pin_boto_C) == HIGH) digitalWrite(pin_LED 1)

Declarem el LED i els tres botons que tal i com posa a lrsquoesquema corresponen als pins 23 24 i 25 de la GPIO

Si els tres polsadors estan premuts passa corrent pels tres i per tant srsquoenceacuten el LED

En aquest cas utilitzem HIGH i LOW en lloc de 1 i 0 respectivament HIGH significa que hi ha elec-tricitat i LOW que no hi ha

24

No apretats while (digitalRead(pin_boto_A) == LOW ampamp digitalRead(pin_boto_B) == LOW ampamp digitalRead(pin_boto_C) == LOW) digitalWrite(pin_LED 0)

Si no apagarsquol

723 Semagravefor amb polsador

En aquesta pragravectica crearem un semagravefor de via-nants i de cotxes Com alguns semagravefors aquests teacute un botoacute amb el qual els vianants demanen que es posi verd aixiacute que el dels cotxes es posa ver-mell

Connectarem dos LEDs (vermell i verd) als pins 18 i 23 de la Raspberry Pi amb una resistegravencia de 180Ω Tambeacute connectarem tres LEDs meacutes (verd vermell i taronja) de la mateixa manera en els ports 17 21 i 22 de la GPIO

A diferegravencia de les altres pragravectiques amb polsa-dors en aquesta el connectarem al port SDA0 i al GROUND ja que nomeacutes ens interessa detectar quan es prem

25

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

define VERMELL 0define GROC1define VERD 2define VERMELL_HOME3define VERD_HOME4

define BOTO 8

void setup (void) int i

if (geteuid () = 0) exit (0)

if (wiringPiSetup () == -1) exit (1)

fflush(stdout) for (i = 0 i lt 5 ++i) pinMode (i OUTPUT) digitalWrite (i 0) digitalWrite(VERD1)digitalWrite(VERMELL_HOME1) pinMode (BOTO INPUT)

printf (ldquoSetup fetnrdquo)

int main (void) setup () for () esperaBoto () aturaTransit () camina () tempsEspera () iniciaTransit ()

Amb lrsquoexpressioacute define li diem a la magravequina que cada cop que escrivim VERMELL en realitat es-tem posant el nombre 0 i el mateix amb les altres paraules

Fem un setup amb tota la configuracioacute necessagraveria

fflush() eacutes una funcioacute complexa que serveix per quumlestions de tractament de memograveria del sistema per evitar errors

Executem totes les funcions una darrera lrsquoaltra de manera indefinida

26

Esperant a que lrsquousuari premi el botoacute per comenccedilar

Fem que el semagravefor dels cotxes canviiuml de verd a vermell passant pel groc

Fem que el semagravefor dels vianants es posi verd

Temps intermig des que srsquoacaba de caminar fins que el trafic comenccedila

void esperaBoto (void) printf (ldquoEsperant el botoacute ldquo)fflush(stdout) while (digitalRead (BOTO) == HIGH) delay (100) printf (ldquoEsoerenrdquo)

void aturaTransit()printf(ldquoAturanteltraficldquo)fflush(stdout)digitalWrite(VERD0) digitalWrite (GROC 1) delay (2000) digitalWrite (GROC 0) digitalWrite(VERMELL1) delay (2000) printf (ldquoAturatsnrdquo)

void camina ()printf(ldquoCaminaldquo)fflush(stdout)

digitalWrite(VERMELL_HOME0)digitalWrite(VERD_HOME1) delay (10000) digitalWrite(VERMELL0) digitalWrite (GROC 1)

printf (ldquoJa han caminatnrdquo)

void tempsEspera () int i

printf (ldquoTemps drsquoespera ldquo) fflush(stdout)

for (i = 0 i lt 8 ++i)

27

delay (500) digitalWrite(VERD_HOME0) digitalWrite (GROC 0) delay (500) digitalWrite(VERD_HOME1) digitalWrite (GROC 1)

void iniciaTransit ()printf(ldquoInicianttraficldquo)fflush(stdout)

digitalWrite(VERD_HOME0)digitalWrite(VERMELL_HOME1) delay (500) digitalWrite (GROC 0) digitalWrite(VERD1)

Deixem via lliure pels vehicles i posem el semagrave-for vermell pels vianants

Proposta Utilitzant el que has apregraves en aquest bloc crear un projecte amb uns quants LEDs en fila que srsquoactivin ascendentment quan apretes un botoacute

28

73 Bloc 3 (Alt)731 Sistema portes logravegiques I

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int AND (int a int b) return a ampamp b

int OR (int a int b) return a || b

int NEGADA (int a) return a

int f(int a int b) return OR(AND(NE-GADA(a)b)AND(aNEGADA(b))) f(a b) = arsquob + abrsquo

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5

int apretat_A = 0 int apretat_B = 0

pinMode(pin_LED_S OUTPUT) pinMode(pin_boto_A INPUT) pinMode(pin_boto_B INPUT)

Crearem una funcioacute per a cada porta logravegica de tal manera que sigui meacutes fagravecil poder-ho aplicar despreacutes

Aquesta seragrave la foacutermula que compliragrave la taula de la veritat en aquest cas eacutes f(a b) = arsquob +abrsquo

Creem dos booleans (variables que poden ser 0 o 1) que ens indicaran si el botoacute ha estat premut o no

Declarem els pins drsquoentrada i de sortida com a totes les pragravectiques anteriors

El seguumlent projecte fa la mateixa funcioacute que acon-seguiriacuteem amb xips de portes logravegiques perograve fent els cagravelculs a partir de la RaspberryPi En aquest cas compleix la taula de la veritat drsquoun OR ex-clusive eacutes a dir nomeacutes srsquoencendragrave el LED quan premem un dels dos botons mai srsquoencendragrave 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 srsquoutilitzin en el codi

29

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) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins estan premuts

Comprovem quins no estan premuts

I apliquem la foacutermula amb els valors drsquoentrada cor-responents Si la foacutermula eacutes igual a 1 srsquoencendragrave el LED si no no srsquoencendragrave

732 Sistema portes logravegiques II

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

Partim de la mateixa base que la pragravectica ante-rior perograve en aquesta incloem una tercera variable drsquoentrada Aixiacute que hem drsquoafegir un nou botoacute en el pin del GPIO que srsquoescau

30

Seguim el patroacute de les foacutermules emprades a la pragravectica anterior

En aquest cas tenim tres variables drsquoentrada perograve la mecagravenica eacutes la mateixa Es pot jugar amb la foacutermula i anar provant diferents combinacions

Necessitem tres variables ja que hi ha tres botons

Declaracions

Comprovem quins estan premuts

int AND (int a int b) return a ampamp b

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 + arsquob

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5 int pin_boto_C = 6

int apretat_A = 0 int apretat_B = 0 int apretat_C = 0

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

31

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

Mostra resultat if (f(apretat_A apretat_B apretat_C) == 1) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins no estan premuts

Com al circuit anterior apliquem la foacutermula i si aquesta doacutena 1 encenem el LED

Proposta Ara que ja has apregraves els conceptes meacutes fonamentals de la CodePi inventarsquot un circuit amb el nivell de dificultat que consideris No et quedis amb el que se trsquoha ensenyat aquiacute sinoacute que cerca meacutes megravetodes que puguis utilitzar La creativitat eacutes bagravesica per a tot bon enginyer i amb aquesta pragravectica volem que demostris de quegrave ets capaccedil

32

8 Vols saber-ne meacutes El moacuten de la programacioacute i lrsquoelectrogravenica eacutes infinit La comunitat geek (= interessada) en aquests te-mes eacutes una de les meacutes servicials i altruista de tota la xarxa aixiacute que es poden trobar una quantitat inacabable de tutorials i pagravegines web especialitza-des en el que vulguem saber

81 Programari lliureEl programari lliure eacutes la base de la informagravetica ac-tual i encara juga un gran paper en algunes agraverees com els servidors web o els mogravebils amb sistema operatiu Android Aquiacute teniu un conjunt de pagravegines on podeu aprofundir sobre aquest apassionant moacuten de la llibertat digital

httpcawikipediaorgwikiRichard_Matthew_Stallmanhttpwwwfsforghttpwwwgnuorghttpwwwlinuxorghttpwwwunixorghttpwwwubuntucom

82 Raspberry PiSi desitges saber meacutes sobre el projecte sense agravenim de lucre Raspberry Pi i seguir fent projectes amb ella visita les pagines que trobaragraves a con-tinuacioacute Aquestes et donaran idees de quegrave fer amb aquest petit perograve fascinant ordinador

httplearnadafruitcomcategorylearn-raspber-ry-pihttpwwwraspberrypiorgwwwraspberrypiorghttpdangerousprototypescom20130202rasp-berry-pi-supercomputerhttpreviewscnetcoukdesktops25-fun-things-to-do-with-a-raspberry-pi-50009851httplearnadafruitcompi-thermal-printer

33

83 Electrogravenica Si lrsquoelectrogravenica bagravesica que has apregraves durant els tutorials de la CodePi trsquoha fet veure que aquest eacutes el moacuten que a tu trsquoagrada no paris A continu-acioacute et deixem pagravegines web on trobaragraves les bases de lrsquoelectrogravenica meacutes complexa i tambeacute molts nous circuits per muntar i seguir descobrint aquest moacuten que avui en dia fa que tots els aparells endollats a al corrent puguin funcionar

httpwwwinstructablescomidBeginners-Elec-tronics-ProjectshttpwwwinstructablescomidElectronic-Proj-ects-For-Beginnershttpwwwcircuitstodaycomsimple-electron-ics-projects-and-circuitshttpswwwsparkfuncomtutorialshttplearnadafruitcom

84 ProgramacioacuteDiuen que per ser un bon programador srsquohan de tenir unes habilitats que no tothom teacute disciplina ordre logravegica creativitat capacitat per resoldre qualsevol problema i per sobre de tot persistegravencia i passioacute Si creus que tens aquestes qualitats do-na-li una oportunitat a la programacioacute A continu-acioacute et deixem un recull de les pagravegines web que creiem que meacutes et poden ajudar a introduir-te una mica meacutes en la programacioacute web i la drsquoapli-cacions per a mogravebils

httpwwwcodeorghttpscratchmiteduhttpwwwcodecademycom

34

9 GlossariC (llenguatge de programacioacute) Des de la seva creacioacute lrsquoany 1972 srsquoha consolidat com un dels llenguatges de programacioacute meacutes utilitzats per fer aplicacions de software Eacutes considerat un dels meacutes bagravesics i meacutes comuns per introduir-se a la pro-gramacioacute Les grans companyies han utilitzat el C com a base per crear altres llenguatges com lrsquoObjective-C (utilitzat per fer les aplicacions per dispositius drsquoApple) o el C (creat per Microsoft i utilitzat entre altres coses per fer programes in-formagravetics per Windows)

Condensador Component electrogravenic classificat dins del grup dels passius i que per tant no emet cap senyal El podriacuteem definir com un acumula-dor drsquoelectrons que els deixa anar quan arriba a la seva capacitat magravexima Hi ha condensadors de dos tipus els electroliacutetics i els normals En les pragravec-tiques utilitzarem electroliacutetics i com que aquests tenen polaritat eacutes important tenir en compte quina eacutes la pota positiva i quina eacutes la negativa a lrsquohora de connectar-lo

Diacuteode Component electrogravenic passiu Teacute polaritat i seria lrsquoequivalent a una vagravelvula antiretorn lrsquoelec-tricitat nomeacutes pot anar en un sentit

Electrogravenica Disciplina que estudia els com-ponents electrogravenics que funcionen amb un flux drsquoelectrons (corrent continua)

Funcioacute Fragment de codi que conte un seguit drsquoaccions i que hi pots accedir cridant la funcioacute en comptes de repetint el codi Podriacuteem comparar-ho amb una funcioacute matemagravetica en la que tenim vari-ables drsquoentrada que tractant-les a la funcioacute ob-tenim una informacioacute de sortida

GPIO Soacuten les sigles de ldquoGeneral Purpose InputOutputrdquo Si mirem la Raspberry Pi soacuten els pins de sortida on hi connectem els cables amb els que programem la placa electrogravenica Lrsquoavantatge drsquoaquest tipus de connector respecte altres eacutes que es pot gestionar mitjanccedilant programacioacute i aixograve eacutes precisament el que explicarem en aquest manual

35

HDMI Soacuten les sigles de ldquoHigh-Definition Multime-dia Interfacerdquo Serveix per enviar viacutedeo i agraveudio a una pantalla Nosaltres lrsquoutilitzarem per connectar la RaspberryPi a una pantalla

LED Acrogravenim de ldquoLight Emitting Dioderdquo Eacutes un tipus de diacuteode el qual teacute una pelmiddotliacutecula de fogravesfor entre els dos connectors que fa que quan passi el corrent generi llum Com qualsevol altre diacuteode eacutes important tenir en compte la polaritat

RAM Acrogravenim de ldquoRandom Access Memoryrdquo Eacutes la part de lrsquoordinador encarregada drsquoemmagatze-mar els arxius temporals

RCA El connector RCA consisteix en diferents cables amb la punta de diferent color que serveix-en per transmetre agraveudio i viacutedeo

ROM De lrsquoanglegraves ldquoRead Only Memoryrdquo eacutes la uni-tat de memograveria on es guarda el sistema operatiu

Resistegravencia Eacutes un component electrogravenic que teacute com a funcioacute reduir el flux drsquoelectrons afi de controlar la seva potegravencia Eacutes molt comuacute a lrsquoelectrogravenica ja que eacutes molt necessari per assegu-rar-nos del correcte funcionament drsquoelements com el LED que sense una resistegravencia que limiteacutes el corrent podrien cremar-se

Placa base Eacutes la part de lrsquoordinador que conteacute elements com la RAM la ROM o el microproces-sador La placa base de lrsquoordinador que constru-irem amb aquest manual seria la progravepia Raspber-ry Pi

Protoboard Tambeacute coneguda com a Bread-board srsquoutilitza per crear circuits electrogravenics sense necessitat de soldar Per saber com funcio-na i com estan relacionats els diferents contactes consulteu aquesta webhttprduinostarcomdocumentaciongeneralpro-toboard-que-es-y-como-funciona

36

Terminal Eacutes el programa emprat per enviar ordres directes a lrsquoordinador i rebre respostes drsquoaquest Nosaltres lrsquoutilitzarem per instalmiddotlar els programes necessaris per programar les plaques electrograveniques i altres arxius necessaris

Variable Valor que canvia segons les operacions que es facin amb aquest al programa informagravetic Com ja sabeu hi ha variables independents (pe el temps) i dependents (pe si estagrave o no encegraves un LED que dependragrave drsquoaltres variables)

37

  • httpwwwfsforg
Page 18: CodePi

18

Des que la variable i eacutes igual a 1 fins i mentre que aquesta sigui igual o meacutes petita que10 executa el codi

Mentre que la variable D sigui igual a 5 el codi entre claus es llegiragrave infinites vegades

Si la variable X no eacutes meacutes petita que 7 fes una altra cosa

Si la variable X eacutes meacutes petita que 7 fes alguna cosa

70 Iniciacioacute al llenguatge CAbans de comenccedilar a programar cal tenir en compte els conceptes de condicional i de cicle

Els condicionals ldquoif - elserdquo nomeacutes executen el codi a continuacioacute si la condicioacute que li fiquem entre paregraventesis eacutes certa Ho podriacuteem comparar amb el que seria una oracioacute condicional No eacutes obligatori perograve podem afegir la partiacutecula ldquoelserdquo que eacutes lrsquoequivalent a la paraula ldquosi nordquo En el cas a continuacioacute com que el condicional no es compleix srsquoexecutaria lrsquoelse

if (X lt 7) Fes alguna cosa else Fes una altra cosa

Els bucles ldquoforrdquo soacuten rutines que serveixen per ex-ecutar un codi un determinat nuacutemero de vegades Teacute tres parts separades per punt i coma entrada condicioacute i increment A la entrada li donem un va-lor a una variable A la condicioacute determinem que la rutina srsquoexecuti nomeacutes si eacutes compleix la condicioacute utilitzant la variable drsquoentrada Finalment en el in-crement fixem un nou valor a la variable aquesta part srsquoexecutaragrave a cada cicle En llenguatge C si no afegim cap dels tres paragravemetres el bucle seragrave infinit

for (int i = 1 i lt= 10 i++) Fes alguna cosa

La sentegravencia ldquowhilerdquo defineix que un codi srsquoexe-cutaragrave infinitament mentre que la condicioacute que es defineix sigui certa

while (D==5) Fes alguna cosa

19

71 Bloc 1 (Bagravesic)711 Hola moacuten

En aquesta pragravectica escriurem un text a la consograve-la el conegut ldquoHello Worldrdquo

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void) printf(ldquohola moacutenrdquo)

if (wiringPiSetup() == -1) exit (1)

return 0

712 Encendre un LED

Hem drsquoimportar aquestes llibreries per tal que la RaspberryPi entengui el codi

Aquesta eacutes la funcioacute principal (main) i srsquoexecutaragrave tot el que fiquem aquiacute dins

Amb la funcioacute printf() el que aconseguim eacutes que es mostri al terminal el text que hi posem entre comentes

Aquestes liacutenies de codi soacuten simplement compro-vacions per assegurar-nos que tot funciona cor-rectament Soacuten negligibles perograve eacutes recomanable posar-les Les afegirem a totes les pragravectiques

Connectarem la pota llarga (agravenode) del LED al pin 5v de la GPIO i lrsquoaltre pota (cagravetode) a una resistegraven-cia de 180Ω Aquesta distincioacute entre potes es deu a que els LEDs estan polaritzats mireu el glossa-ri per saber-ne meacutes Tot seguit connecteu lrsquoaltra pota de la resistegravencia al pin GROUND

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void)

20

Comprovacionsif (wiringPiSetup() == -1) exit (1)

int pin = 1

printf(ldquoEncenem el pin 18rdquo)

pinMode(pin OUTPUT)

digitalWrite(pin 1)

return 0

713 Encendre i apagar un LED cada dos segons 10 vegades

El que podeu veure aquiacute eacutes el que srsquoanomena un comentari del codi Tot allograve que escrivim despreacutes de ldquordquo el compilador no ho llegiragrave i per tant nomeacutes serveix per donar indicacions al programador

Declarem la variable pin que com eacutes un nombre enter escriurem int

Fem un printf() tal i com hem apregraves a la pragravectica anterior Escrivim el 18 ja que la numeracioacute de la llibreria wiringPi canvia respecte a la sortida real (mirar el cuadre de la pagravegina 17)

Amb la funcioacute pinMode() declarem que el pin nuacutemero 1 en aquest cas sigui un pin de sortida de corrent (OUTPUT)

Una vegada li hem dit que eacutes de sortida li hem de dir si el volem encegraves ldquo1rdquo o apagat ldquo0rdquo amb la funcioacute digitalWrite()

Utilitzarem el muntatge la de pragravectica anterior amb la diferegravencia que en comptes de connectar lrsquoagravenode del LED al pin de 5v el connectarem al pin 18 de la Raspberry Pi Drsquoaquesta manera podrem gestionar el pas de lrsquoelectricitat a traveacutes drsquoun petit programa que crearem a continuacioacute

21

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void) int pin = 1

if (wiringPiSetup() == -1) exit (1)

pinMode(pin OUTPUT)

for (int i=1ilt=10i++)

printf(ldquoLED Onnrdquo) digitalWrite(pin 1)

delay(2000)

printf(ldquoLED Offnrdquo) digitalWrite(pin 0)

delay(2000)

return 0

Utilitzem un bicle ldquoforrdquo per executar el codi 10 vegades

Encenem el LED

Fem un delay() de 2000 milmiddotlisegons (2 segons) que ens serveix per aturar el programa i per tant mantenir el LED encegraves durant aquest temps

Apaguem el LED

El mantenim apagat 2 segons

Lrsquoexpressioacute n serveix per canviar de liacutenia

Proposta Ara que ja saps els conceptes bagravesics de la CodePi intenta fer lrsquoequivalent al codi Morse per demanar ajuda SOS middot middot middot ndash ndash ndash middot middot middot (on cada punt significa LED encegraves durant 14 de segon i cada ralla LED encegraves durant mig segon) Juga amb el valor de la funcioacute delay() per fer que el LED estigui encegraves durant meacutes o menys temps

22

72 Bloc 2 (Mitjagrave)721 Encendre un LED apretant un botoacute

Utilitzar el muntatge del LED que hem fet servir a la pragravectica anterior A meacutes a meacutes hem drsquoafegir 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 aniragrave a parar al pin 23 una resistegravencia de 10KΩ al GROUND per forccedilar lrsquoestat LOW quan el polsador no estagrave apretat

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt int main (void) int pin_LED = 1 int pin_boto = 4 printf (ldquoEncenent un LED apretant un botoacutenrdquo) 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

Declarem el LED com un pin de sortidaI el botoacute com un pin drsquoentrada

Si no fiquem variables al for aquest srsquoexecutaragrave sempre

Amb la funcioacute digitalRead() detectem si passa cor-rent pel pin 8 eacutes a dir si el botoacute ha estat apretat Si eacutes aixiacute fem que srsquoencengui el LED

Si no fem que srsquoapagui

23

722 Encendre un LED apretant tots els puladors

Utilitzar el muntatge de la pragravectica anterior i afegir dos polsadors meacutes amb el mateix proceacutes connec-tats als ports 24 i 25 de la Raspberry Pi

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int main (void) int pin_LED = 1

int pin_boto_A = 4 int pin_boto_B = 5 int 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 ampamp digitalRead(pin_boto_B) == HIGH ampamp digitalRead(pin_boto_C) == HIGH) digitalWrite(pin_LED 1)

Declarem el LED i els tres botons que tal i com posa a lrsquoesquema corresponen als pins 23 24 i 25 de la GPIO

Si els tres polsadors estan premuts passa corrent pels tres i per tant srsquoenceacuten el LED

En aquest cas utilitzem HIGH i LOW en lloc de 1 i 0 respectivament HIGH significa que hi ha elec-tricitat i LOW que no hi ha

24

No apretats while (digitalRead(pin_boto_A) == LOW ampamp digitalRead(pin_boto_B) == LOW ampamp digitalRead(pin_boto_C) == LOW) digitalWrite(pin_LED 0)

Si no apagarsquol

723 Semagravefor amb polsador

En aquesta pragravectica crearem un semagravefor de via-nants i de cotxes Com alguns semagravefors aquests teacute un botoacute amb el qual els vianants demanen que es posi verd aixiacute que el dels cotxes es posa ver-mell

Connectarem dos LEDs (vermell i verd) als pins 18 i 23 de la Raspberry Pi amb una resistegravencia de 180Ω Tambeacute connectarem tres LEDs meacutes (verd vermell i taronja) de la mateixa manera en els ports 17 21 i 22 de la GPIO

A diferegravencia de les altres pragravectiques amb polsa-dors en aquesta el connectarem al port SDA0 i al GROUND ja que nomeacutes ens interessa detectar quan es prem

25

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

define VERMELL 0define GROC1define VERD 2define VERMELL_HOME3define VERD_HOME4

define BOTO 8

void setup (void) int i

if (geteuid () = 0) exit (0)

if (wiringPiSetup () == -1) exit (1)

fflush(stdout) for (i = 0 i lt 5 ++i) pinMode (i OUTPUT) digitalWrite (i 0) digitalWrite(VERD1)digitalWrite(VERMELL_HOME1) pinMode (BOTO INPUT)

printf (ldquoSetup fetnrdquo)

int main (void) setup () for () esperaBoto () aturaTransit () camina () tempsEspera () iniciaTransit ()

Amb lrsquoexpressioacute define li diem a la magravequina que cada cop que escrivim VERMELL en realitat es-tem posant el nombre 0 i el mateix amb les altres paraules

Fem un setup amb tota la configuracioacute necessagraveria

fflush() eacutes una funcioacute complexa que serveix per quumlestions de tractament de memograveria del sistema per evitar errors

Executem totes les funcions una darrera lrsquoaltra de manera indefinida

26

Esperant a que lrsquousuari premi el botoacute per comenccedilar

Fem que el semagravefor dels cotxes canviiuml de verd a vermell passant pel groc

Fem que el semagravefor dels vianants es posi verd

Temps intermig des que srsquoacaba de caminar fins que el trafic comenccedila

void esperaBoto (void) printf (ldquoEsperant el botoacute ldquo)fflush(stdout) while (digitalRead (BOTO) == HIGH) delay (100) printf (ldquoEsoerenrdquo)

void aturaTransit()printf(ldquoAturanteltraficldquo)fflush(stdout)digitalWrite(VERD0) digitalWrite (GROC 1) delay (2000) digitalWrite (GROC 0) digitalWrite(VERMELL1) delay (2000) printf (ldquoAturatsnrdquo)

void camina ()printf(ldquoCaminaldquo)fflush(stdout)

digitalWrite(VERMELL_HOME0)digitalWrite(VERD_HOME1) delay (10000) digitalWrite(VERMELL0) digitalWrite (GROC 1)

printf (ldquoJa han caminatnrdquo)

void tempsEspera () int i

printf (ldquoTemps drsquoespera ldquo) fflush(stdout)

for (i = 0 i lt 8 ++i)

27

delay (500) digitalWrite(VERD_HOME0) digitalWrite (GROC 0) delay (500) digitalWrite(VERD_HOME1) digitalWrite (GROC 1)

void iniciaTransit ()printf(ldquoInicianttraficldquo)fflush(stdout)

digitalWrite(VERD_HOME0)digitalWrite(VERMELL_HOME1) delay (500) digitalWrite (GROC 0) digitalWrite(VERD1)

Deixem via lliure pels vehicles i posem el semagrave-for vermell pels vianants

Proposta Utilitzant el que has apregraves en aquest bloc crear un projecte amb uns quants LEDs en fila que srsquoactivin ascendentment quan apretes un botoacute

28

73 Bloc 3 (Alt)731 Sistema portes logravegiques I

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int AND (int a int b) return a ampamp b

int OR (int a int b) return a || b

int NEGADA (int a) return a

int f(int a int b) return OR(AND(NE-GADA(a)b)AND(aNEGADA(b))) f(a b) = arsquob + abrsquo

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5

int apretat_A = 0 int apretat_B = 0

pinMode(pin_LED_S OUTPUT) pinMode(pin_boto_A INPUT) pinMode(pin_boto_B INPUT)

Crearem una funcioacute per a cada porta logravegica de tal manera que sigui meacutes fagravecil poder-ho aplicar despreacutes

Aquesta seragrave la foacutermula que compliragrave la taula de la veritat en aquest cas eacutes f(a b) = arsquob +abrsquo

Creem dos booleans (variables que poden ser 0 o 1) que ens indicaran si el botoacute ha estat premut o no

Declarem els pins drsquoentrada i de sortida com a totes les pragravectiques anteriors

El seguumlent projecte fa la mateixa funcioacute que acon-seguiriacuteem amb xips de portes logravegiques perograve fent els cagravelculs a partir de la RaspberryPi En aquest cas compleix la taula de la veritat drsquoun OR ex-clusive eacutes a dir nomeacutes srsquoencendragrave el LED quan premem un dels dos botons mai srsquoencendragrave 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 srsquoutilitzin en el codi

29

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) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins estan premuts

Comprovem quins no estan premuts

I apliquem la foacutermula amb els valors drsquoentrada cor-responents Si la foacutermula eacutes igual a 1 srsquoencendragrave el LED si no no srsquoencendragrave

732 Sistema portes logravegiques II

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

Partim de la mateixa base que la pragravectica ante-rior perograve en aquesta incloem una tercera variable drsquoentrada Aixiacute que hem drsquoafegir un nou botoacute en el pin del GPIO que srsquoescau

30

Seguim el patroacute de les foacutermules emprades a la pragravectica anterior

En aquest cas tenim tres variables drsquoentrada perograve la mecagravenica eacutes la mateixa Es pot jugar amb la foacutermula i anar provant diferents combinacions

Necessitem tres variables ja que hi ha tres botons

Declaracions

Comprovem quins estan premuts

int AND (int a int b) return a ampamp b

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 + arsquob

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5 int pin_boto_C = 6

int apretat_A = 0 int apretat_B = 0 int apretat_C = 0

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

31

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

Mostra resultat if (f(apretat_A apretat_B apretat_C) == 1) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins no estan premuts

Com al circuit anterior apliquem la foacutermula i si aquesta doacutena 1 encenem el LED

Proposta Ara que ja has apregraves els conceptes meacutes fonamentals de la CodePi inventarsquot un circuit amb el nivell de dificultat que consideris No et quedis amb el que se trsquoha ensenyat aquiacute sinoacute que cerca meacutes megravetodes que puguis utilitzar La creativitat eacutes bagravesica per a tot bon enginyer i amb aquesta pragravectica volem que demostris de quegrave ets capaccedil

32

8 Vols saber-ne meacutes El moacuten de la programacioacute i lrsquoelectrogravenica eacutes infinit La comunitat geek (= interessada) en aquests te-mes eacutes una de les meacutes servicials i altruista de tota la xarxa aixiacute que es poden trobar una quantitat inacabable de tutorials i pagravegines web especialitza-des en el que vulguem saber

81 Programari lliureEl programari lliure eacutes la base de la informagravetica ac-tual i encara juga un gran paper en algunes agraverees com els servidors web o els mogravebils amb sistema operatiu Android Aquiacute teniu un conjunt de pagravegines on podeu aprofundir sobre aquest apassionant moacuten de la llibertat digital

httpcawikipediaorgwikiRichard_Matthew_Stallmanhttpwwwfsforghttpwwwgnuorghttpwwwlinuxorghttpwwwunixorghttpwwwubuntucom

82 Raspberry PiSi desitges saber meacutes sobre el projecte sense agravenim de lucre Raspberry Pi i seguir fent projectes amb ella visita les pagines que trobaragraves a con-tinuacioacute Aquestes et donaran idees de quegrave fer amb aquest petit perograve fascinant ordinador

httplearnadafruitcomcategorylearn-raspber-ry-pihttpwwwraspberrypiorgwwwraspberrypiorghttpdangerousprototypescom20130202rasp-berry-pi-supercomputerhttpreviewscnetcoukdesktops25-fun-things-to-do-with-a-raspberry-pi-50009851httplearnadafruitcompi-thermal-printer

33

83 Electrogravenica Si lrsquoelectrogravenica bagravesica que has apregraves durant els tutorials de la CodePi trsquoha fet veure que aquest eacutes el moacuten que a tu trsquoagrada no paris A continu-acioacute et deixem pagravegines web on trobaragraves les bases de lrsquoelectrogravenica meacutes complexa i tambeacute molts nous circuits per muntar i seguir descobrint aquest moacuten que avui en dia fa que tots els aparells endollats a al corrent puguin funcionar

httpwwwinstructablescomidBeginners-Elec-tronics-ProjectshttpwwwinstructablescomidElectronic-Proj-ects-For-Beginnershttpwwwcircuitstodaycomsimple-electron-ics-projects-and-circuitshttpswwwsparkfuncomtutorialshttplearnadafruitcom

84 ProgramacioacuteDiuen que per ser un bon programador srsquohan de tenir unes habilitats que no tothom teacute disciplina ordre logravegica creativitat capacitat per resoldre qualsevol problema i per sobre de tot persistegravencia i passioacute Si creus que tens aquestes qualitats do-na-li una oportunitat a la programacioacute A continu-acioacute et deixem un recull de les pagravegines web que creiem que meacutes et poden ajudar a introduir-te una mica meacutes en la programacioacute web i la drsquoapli-cacions per a mogravebils

httpwwwcodeorghttpscratchmiteduhttpwwwcodecademycom

34

9 GlossariC (llenguatge de programacioacute) Des de la seva creacioacute lrsquoany 1972 srsquoha consolidat com un dels llenguatges de programacioacute meacutes utilitzats per fer aplicacions de software Eacutes considerat un dels meacutes bagravesics i meacutes comuns per introduir-se a la pro-gramacioacute Les grans companyies han utilitzat el C com a base per crear altres llenguatges com lrsquoObjective-C (utilitzat per fer les aplicacions per dispositius drsquoApple) o el C (creat per Microsoft i utilitzat entre altres coses per fer programes in-formagravetics per Windows)

Condensador Component electrogravenic classificat dins del grup dels passius i que per tant no emet cap senyal El podriacuteem definir com un acumula-dor drsquoelectrons que els deixa anar quan arriba a la seva capacitat magravexima Hi ha condensadors de dos tipus els electroliacutetics i els normals En les pragravec-tiques utilitzarem electroliacutetics i com que aquests tenen polaritat eacutes important tenir en compte quina eacutes la pota positiva i quina eacutes la negativa a lrsquohora de connectar-lo

Diacuteode Component electrogravenic passiu Teacute polaritat i seria lrsquoequivalent a una vagravelvula antiretorn lrsquoelec-tricitat nomeacutes pot anar en un sentit

Electrogravenica Disciplina que estudia els com-ponents electrogravenics que funcionen amb un flux drsquoelectrons (corrent continua)

Funcioacute Fragment de codi que conte un seguit drsquoaccions i que hi pots accedir cridant la funcioacute en comptes de repetint el codi Podriacuteem comparar-ho amb una funcioacute matemagravetica en la que tenim vari-ables drsquoentrada que tractant-les a la funcioacute ob-tenim una informacioacute de sortida

GPIO Soacuten les sigles de ldquoGeneral Purpose InputOutputrdquo Si mirem la Raspberry Pi soacuten els pins de sortida on hi connectem els cables amb els que programem la placa electrogravenica Lrsquoavantatge drsquoaquest tipus de connector respecte altres eacutes que es pot gestionar mitjanccedilant programacioacute i aixograve eacutes precisament el que explicarem en aquest manual

35

HDMI Soacuten les sigles de ldquoHigh-Definition Multime-dia Interfacerdquo Serveix per enviar viacutedeo i agraveudio a una pantalla Nosaltres lrsquoutilitzarem per connectar la RaspberryPi a una pantalla

LED Acrogravenim de ldquoLight Emitting Dioderdquo Eacutes un tipus de diacuteode el qual teacute una pelmiddotliacutecula de fogravesfor entre els dos connectors que fa que quan passi el corrent generi llum Com qualsevol altre diacuteode eacutes important tenir en compte la polaritat

RAM Acrogravenim de ldquoRandom Access Memoryrdquo Eacutes la part de lrsquoordinador encarregada drsquoemmagatze-mar els arxius temporals

RCA El connector RCA consisteix en diferents cables amb la punta de diferent color que serveix-en per transmetre agraveudio i viacutedeo

ROM De lrsquoanglegraves ldquoRead Only Memoryrdquo eacutes la uni-tat de memograveria on es guarda el sistema operatiu

Resistegravencia Eacutes un component electrogravenic que teacute com a funcioacute reduir el flux drsquoelectrons afi de controlar la seva potegravencia Eacutes molt comuacute a lrsquoelectrogravenica ja que eacutes molt necessari per assegu-rar-nos del correcte funcionament drsquoelements com el LED que sense una resistegravencia que limiteacutes el corrent podrien cremar-se

Placa base Eacutes la part de lrsquoordinador que conteacute elements com la RAM la ROM o el microproces-sador La placa base de lrsquoordinador que constru-irem amb aquest manual seria la progravepia Raspber-ry Pi

Protoboard Tambeacute coneguda com a Bread-board srsquoutilitza per crear circuits electrogravenics sense necessitat de soldar Per saber com funcio-na i com estan relacionats els diferents contactes consulteu aquesta webhttprduinostarcomdocumentaciongeneralpro-toboard-que-es-y-como-funciona

36

Terminal Eacutes el programa emprat per enviar ordres directes a lrsquoordinador i rebre respostes drsquoaquest Nosaltres lrsquoutilitzarem per instalmiddotlar els programes necessaris per programar les plaques electrograveniques i altres arxius necessaris

Variable Valor que canvia segons les operacions que es facin amb aquest al programa informagravetic Com ja sabeu hi ha variables independents (pe el temps) i dependents (pe si estagrave o no encegraves un LED que dependragrave drsquoaltres variables)

37

  • httpwwwfsforg
Page 19: CodePi

19

71 Bloc 1 (Bagravesic)711 Hola moacuten

En aquesta pragravectica escriurem un text a la consograve-la el conegut ldquoHello Worldrdquo

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void) printf(ldquohola moacutenrdquo)

if (wiringPiSetup() == -1) exit (1)

return 0

712 Encendre un LED

Hem drsquoimportar aquestes llibreries per tal que la RaspberryPi entengui el codi

Aquesta eacutes la funcioacute principal (main) i srsquoexecutaragrave tot el que fiquem aquiacute dins

Amb la funcioacute printf() el que aconseguim eacutes que es mostri al terminal el text que hi posem entre comentes

Aquestes liacutenies de codi soacuten simplement compro-vacions per assegurar-nos que tot funciona cor-rectament Soacuten negligibles perograve eacutes recomanable posar-les Les afegirem a totes les pragravectiques

Connectarem la pota llarga (agravenode) del LED al pin 5v de la GPIO i lrsquoaltre pota (cagravetode) a una resistegraven-cia de 180Ω Aquesta distincioacute entre potes es deu a que els LEDs estan polaritzats mireu el glossa-ri per saber-ne meacutes Tot seguit connecteu lrsquoaltra pota de la resistegravencia al pin GROUND

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void)

20

Comprovacionsif (wiringPiSetup() == -1) exit (1)

int pin = 1

printf(ldquoEncenem el pin 18rdquo)

pinMode(pin OUTPUT)

digitalWrite(pin 1)

return 0

713 Encendre i apagar un LED cada dos segons 10 vegades

El que podeu veure aquiacute eacutes el que srsquoanomena un comentari del codi Tot allograve que escrivim despreacutes de ldquordquo el compilador no ho llegiragrave i per tant nomeacutes serveix per donar indicacions al programador

Declarem la variable pin que com eacutes un nombre enter escriurem int

Fem un printf() tal i com hem apregraves a la pragravectica anterior Escrivim el 18 ja que la numeracioacute de la llibreria wiringPi canvia respecte a la sortida real (mirar el cuadre de la pagravegina 17)

Amb la funcioacute pinMode() declarem que el pin nuacutemero 1 en aquest cas sigui un pin de sortida de corrent (OUTPUT)

Una vegada li hem dit que eacutes de sortida li hem de dir si el volem encegraves ldquo1rdquo o apagat ldquo0rdquo amb la funcioacute digitalWrite()

Utilitzarem el muntatge la de pragravectica anterior amb la diferegravencia que en comptes de connectar lrsquoagravenode del LED al pin de 5v el connectarem al pin 18 de la Raspberry Pi Drsquoaquesta manera podrem gestionar el pas de lrsquoelectricitat a traveacutes drsquoun petit programa que crearem a continuacioacute

21

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void) int pin = 1

if (wiringPiSetup() == -1) exit (1)

pinMode(pin OUTPUT)

for (int i=1ilt=10i++)

printf(ldquoLED Onnrdquo) digitalWrite(pin 1)

delay(2000)

printf(ldquoLED Offnrdquo) digitalWrite(pin 0)

delay(2000)

return 0

Utilitzem un bicle ldquoforrdquo per executar el codi 10 vegades

Encenem el LED

Fem un delay() de 2000 milmiddotlisegons (2 segons) que ens serveix per aturar el programa i per tant mantenir el LED encegraves durant aquest temps

Apaguem el LED

El mantenim apagat 2 segons

Lrsquoexpressioacute n serveix per canviar de liacutenia

Proposta Ara que ja saps els conceptes bagravesics de la CodePi intenta fer lrsquoequivalent al codi Morse per demanar ajuda SOS middot middot middot ndash ndash ndash middot middot middot (on cada punt significa LED encegraves durant 14 de segon i cada ralla LED encegraves durant mig segon) Juga amb el valor de la funcioacute delay() per fer que el LED estigui encegraves durant meacutes o menys temps

22

72 Bloc 2 (Mitjagrave)721 Encendre un LED apretant un botoacute

Utilitzar el muntatge del LED que hem fet servir a la pragravectica anterior A meacutes a meacutes hem drsquoafegir 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 aniragrave a parar al pin 23 una resistegravencia de 10KΩ al GROUND per forccedilar lrsquoestat LOW quan el polsador no estagrave apretat

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt int main (void) int pin_LED = 1 int pin_boto = 4 printf (ldquoEncenent un LED apretant un botoacutenrdquo) 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

Declarem el LED com un pin de sortidaI el botoacute com un pin drsquoentrada

Si no fiquem variables al for aquest srsquoexecutaragrave sempre

Amb la funcioacute digitalRead() detectem si passa cor-rent pel pin 8 eacutes a dir si el botoacute ha estat apretat Si eacutes aixiacute fem que srsquoencengui el LED

Si no fem que srsquoapagui

23

722 Encendre un LED apretant tots els puladors

Utilitzar el muntatge de la pragravectica anterior i afegir dos polsadors meacutes amb el mateix proceacutes connec-tats als ports 24 i 25 de la Raspberry Pi

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int main (void) int pin_LED = 1

int pin_boto_A = 4 int pin_boto_B = 5 int 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 ampamp digitalRead(pin_boto_B) == HIGH ampamp digitalRead(pin_boto_C) == HIGH) digitalWrite(pin_LED 1)

Declarem el LED i els tres botons que tal i com posa a lrsquoesquema corresponen als pins 23 24 i 25 de la GPIO

Si els tres polsadors estan premuts passa corrent pels tres i per tant srsquoenceacuten el LED

En aquest cas utilitzem HIGH i LOW en lloc de 1 i 0 respectivament HIGH significa que hi ha elec-tricitat i LOW que no hi ha

24

No apretats while (digitalRead(pin_boto_A) == LOW ampamp digitalRead(pin_boto_B) == LOW ampamp digitalRead(pin_boto_C) == LOW) digitalWrite(pin_LED 0)

Si no apagarsquol

723 Semagravefor amb polsador

En aquesta pragravectica crearem un semagravefor de via-nants i de cotxes Com alguns semagravefors aquests teacute un botoacute amb el qual els vianants demanen que es posi verd aixiacute que el dels cotxes es posa ver-mell

Connectarem dos LEDs (vermell i verd) als pins 18 i 23 de la Raspberry Pi amb una resistegravencia de 180Ω Tambeacute connectarem tres LEDs meacutes (verd vermell i taronja) de la mateixa manera en els ports 17 21 i 22 de la GPIO

A diferegravencia de les altres pragravectiques amb polsa-dors en aquesta el connectarem al port SDA0 i al GROUND ja que nomeacutes ens interessa detectar quan es prem

25

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

define VERMELL 0define GROC1define VERD 2define VERMELL_HOME3define VERD_HOME4

define BOTO 8

void setup (void) int i

if (geteuid () = 0) exit (0)

if (wiringPiSetup () == -1) exit (1)

fflush(stdout) for (i = 0 i lt 5 ++i) pinMode (i OUTPUT) digitalWrite (i 0) digitalWrite(VERD1)digitalWrite(VERMELL_HOME1) pinMode (BOTO INPUT)

printf (ldquoSetup fetnrdquo)

int main (void) setup () for () esperaBoto () aturaTransit () camina () tempsEspera () iniciaTransit ()

Amb lrsquoexpressioacute define li diem a la magravequina que cada cop que escrivim VERMELL en realitat es-tem posant el nombre 0 i el mateix amb les altres paraules

Fem un setup amb tota la configuracioacute necessagraveria

fflush() eacutes una funcioacute complexa que serveix per quumlestions de tractament de memograveria del sistema per evitar errors

Executem totes les funcions una darrera lrsquoaltra de manera indefinida

26

Esperant a que lrsquousuari premi el botoacute per comenccedilar

Fem que el semagravefor dels cotxes canviiuml de verd a vermell passant pel groc

Fem que el semagravefor dels vianants es posi verd

Temps intermig des que srsquoacaba de caminar fins que el trafic comenccedila

void esperaBoto (void) printf (ldquoEsperant el botoacute ldquo)fflush(stdout) while (digitalRead (BOTO) == HIGH) delay (100) printf (ldquoEsoerenrdquo)

void aturaTransit()printf(ldquoAturanteltraficldquo)fflush(stdout)digitalWrite(VERD0) digitalWrite (GROC 1) delay (2000) digitalWrite (GROC 0) digitalWrite(VERMELL1) delay (2000) printf (ldquoAturatsnrdquo)

void camina ()printf(ldquoCaminaldquo)fflush(stdout)

digitalWrite(VERMELL_HOME0)digitalWrite(VERD_HOME1) delay (10000) digitalWrite(VERMELL0) digitalWrite (GROC 1)

printf (ldquoJa han caminatnrdquo)

void tempsEspera () int i

printf (ldquoTemps drsquoespera ldquo) fflush(stdout)

for (i = 0 i lt 8 ++i)

27

delay (500) digitalWrite(VERD_HOME0) digitalWrite (GROC 0) delay (500) digitalWrite(VERD_HOME1) digitalWrite (GROC 1)

void iniciaTransit ()printf(ldquoInicianttraficldquo)fflush(stdout)

digitalWrite(VERD_HOME0)digitalWrite(VERMELL_HOME1) delay (500) digitalWrite (GROC 0) digitalWrite(VERD1)

Deixem via lliure pels vehicles i posem el semagrave-for vermell pels vianants

Proposta Utilitzant el que has apregraves en aquest bloc crear un projecte amb uns quants LEDs en fila que srsquoactivin ascendentment quan apretes un botoacute

28

73 Bloc 3 (Alt)731 Sistema portes logravegiques I

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int AND (int a int b) return a ampamp b

int OR (int a int b) return a || b

int NEGADA (int a) return a

int f(int a int b) return OR(AND(NE-GADA(a)b)AND(aNEGADA(b))) f(a b) = arsquob + abrsquo

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5

int apretat_A = 0 int apretat_B = 0

pinMode(pin_LED_S OUTPUT) pinMode(pin_boto_A INPUT) pinMode(pin_boto_B INPUT)

Crearem una funcioacute per a cada porta logravegica de tal manera que sigui meacutes fagravecil poder-ho aplicar despreacutes

Aquesta seragrave la foacutermula que compliragrave la taula de la veritat en aquest cas eacutes f(a b) = arsquob +abrsquo

Creem dos booleans (variables que poden ser 0 o 1) que ens indicaran si el botoacute ha estat premut o no

Declarem els pins drsquoentrada i de sortida com a totes les pragravectiques anteriors

El seguumlent projecte fa la mateixa funcioacute que acon-seguiriacuteem amb xips de portes logravegiques perograve fent els cagravelculs a partir de la RaspberryPi En aquest cas compleix la taula de la veritat drsquoun OR ex-clusive eacutes a dir nomeacutes srsquoencendragrave el LED quan premem un dels dos botons mai srsquoencendragrave 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 srsquoutilitzin en el codi

29

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) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins estan premuts

Comprovem quins no estan premuts

I apliquem la foacutermula amb els valors drsquoentrada cor-responents Si la foacutermula eacutes igual a 1 srsquoencendragrave el LED si no no srsquoencendragrave

732 Sistema portes logravegiques II

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

Partim de la mateixa base que la pragravectica ante-rior perograve en aquesta incloem una tercera variable drsquoentrada Aixiacute que hem drsquoafegir un nou botoacute en el pin del GPIO que srsquoescau

30

Seguim el patroacute de les foacutermules emprades a la pragravectica anterior

En aquest cas tenim tres variables drsquoentrada perograve la mecagravenica eacutes la mateixa Es pot jugar amb la foacutermula i anar provant diferents combinacions

Necessitem tres variables ja que hi ha tres botons

Declaracions

Comprovem quins estan premuts

int AND (int a int b) return a ampamp b

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 + arsquob

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5 int pin_boto_C = 6

int apretat_A = 0 int apretat_B = 0 int apretat_C = 0

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

31

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

Mostra resultat if (f(apretat_A apretat_B apretat_C) == 1) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins no estan premuts

Com al circuit anterior apliquem la foacutermula i si aquesta doacutena 1 encenem el LED

Proposta Ara que ja has apregraves els conceptes meacutes fonamentals de la CodePi inventarsquot un circuit amb el nivell de dificultat que consideris No et quedis amb el que se trsquoha ensenyat aquiacute sinoacute que cerca meacutes megravetodes que puguis utilitzar La creativitat eacutes bagravesica per a tot bon enginyer i amb aquesta pragravectica volem que demostris de quegrave ets capaccedil

32

8 Vols saber-ne meacutes El moacuten de la programacioacute i lrsquoelectrogravenica eacutes infinit La comunitat geek (= interessada) en aquests te-mes eacutes una de les meacutes servicials i altruista de tota la xarxa aixiacute que es poden trobar una quantitat inacabable de tutorials i pagravegines web especialitza-des en el que vulguem saber

81 Programari lliureEl programari lliure eacutes la base de la informagravetica ac-tual i encara juga un gran paper en algunes agraverees com els servidors web o els mogravebils amb sistema operatiu Android Aquiacute teniu un conjunt de pagravegines on podeu aprofundir sobre aquest apassionant moacuten de la llibertat digital

httpcawikipediaorgwikiRichard_Matthew_Stallmanhttpwwwfsforghttpwwwgnuorghttpwwwlinuxorghttpwwwunixorghttpwwwubuntucom

82 Raspberry PiSi desitges saber meacutes sobre el projecte sense agravenim de lucre Raspberry Pi i seguir fent projectes amb ella visita les pagines que trobaragraves a con-tinuacioacute Aquestes et donaran idees de quegrave fer amb aquest petit perograve fascinant ordinador

httplearnadafruitcomcategorylearn-raspber-ry-pihttpwwwraspberrypiorgwwwraspberrypiorghttpdangerousprototypescom20130202rasp-berry-pi-supercomputerhttpreviewscnetcoukdesktops25-fun-things-to-do-with-a-raspberry-pi-50009851httplearnadafruitcompi-thermal-printer

33

83 Electrogravenica Si lrsquoelectrogravenica bagravesica que has apregraves durant els tutorials de la CodePi trsquoha fet veure que aquest eacutes el moacuten que a tu trsquoagrada no paris A continu-acioacute et deixem pagravegines web on trobaragraves les bases de lrsquoelectrogravenica meacutes complexa i tambeacute molts nous circuits per muntar i seguir descobrint aquest moacuten que avui en dia fa que tots els aparells endollats a al corrent puguin funcionar

httpwwwinstructablescomidBeginners-Elec-tronics-ProjectshttpwwwinstructablescomidElectronic-Proj-ects-For-Beginnershttpwwwcircuitstodaycomsimple-electron-ics-projects-and-circuitshttpswwwsparkfuncomtutorialshttplearnadafruitcom

84 ProgramacioacuteDiuen que per ser un bon programador srsquohan de tenir unes habilitats que no tothom teacute disciplina ordre logravegica creativitat capacitat per resoldre qualsevol problema i per sobre de tot persistegravencia i passioacute Si creus que tens aquestes qualitats do-na-li una oportunitat a la programacioacute A continu-acioacute et deixem un recull de les pagravegines web que creiem que meacutes et poden ajudar a introduir-te una mica meacutes en la programacioacute web i la drsquoapli-cacions per a mogravebils

httpwwwcodeorghttpscratchmiteduhttpwwwcodecademycom

34

9 GlossariC (llenguatge de programacioacute) Des de la seva creacioacute lrsquoany 1972 srsquoha consolidat com un dels llenguatges de programacioacute meacutes utilitzats per fer aplicacions de software Eacutes considerat un dels meacutes bagravesics i meacutes comuns per introduir-se a la pro-gramacioacute Les grans companyies han utilitzat el C com a base per crear altres llenguatges com lrsquoObjective-C (utilitzat per fer les aplicacions per dispositius drsquoApple) o el C (creat per Microsoft i utilitzat entre altres coses per fer programes in-formagravetics per Windows)

Condensador Component electrogravenic classificat dins del grup dels passius i que per tant no emet cap senyal El podriacuteem definir com un acumula-dor drsquoelectrons que els deixa anar quan arriba a la seva capacitat magravexima Hi ha condensadors de dos tipus els electroliacutetics i els normals En les pragravec-tiques utilitzarem electroliacutetics i com que aquests tenen polaritat eacutes important tenir en compte quina eacutes la pota positiva i quina eacutes la negativa a lrsquohora de connectar-lo

Diacuteode Component electrogravenic passiu Teacute polaritat i seria lrsquoequivalent a una vagravelvula antiretorn lrsquoelec-tricitat nomeacutes pot anar en un sentit

Electrogravenica Disciplina que estudia els com-ponents electrogravenics que funcionen amb un flux drsquoelectrons (corrent continua)

Funcioacute Fragment de codi que conte un seguit drsquoaccions i que hi pots accedir cridant la funcioacute en comptes de repetint el codi Podriacuteem comparar-ho amb una funcioacute matemagravetica en la que tenim vari-ables drsquoentrada que tractant-les a la funcioacute ob-tenim una informacioacute de sortida

GPIO Soacuten les sigles de ldquoGeneral Purpose InputOutputrdquo Si mirem la Raspberry Pi soacuten els pins de sortida on hi connectem els cables amb els que programem la placa electrogravenica Lrsquoavantatge drsquoaquest tipus de connector respecte altres eacutes que es pot gestionar mitjanccedilant programacioacute i aixograve eacutes precisament el que explicarem en aquest manual

35

HDMI Soacuten les sigles de ldquoHigh-Definition Multime-dia Interfacerdquo Serveix per enviar viacutedeo i agraveudio a una pantalla Nosaltres lrsquoutilitzarem per connectar la RaspberryPi a una pantalla

LED Acrogravenim de ldquoLight Emitting Dioderdquo Eacutes un tipus de diacuteode el qual teacute una pelmiddotliacutecula de fogravesfor entre els dos connectors que fa que quan passi el corrent generi llum Com qualsevol altre diacuteode eacutes important tenir en compte la polaritat

RAM Acrogravenim de ldquoRandom Access Memoryrdquo Eacutes la part de lrsquoordinador encarregada drsquoemmagatze-mar els arxius temporals

RCA El connector RCA consisteix en diferents cables amb la punta de diferent color que serveix-en per transmetre agraveudio i viacutedeo

ROM De lrsquoanglegraves ldquoRead Only Memoryrdquo eacutes la uni-tat de memograveria on es guarda el sistema operatiu

Resistegravencia Eacutes un component electrogravenic que teacute com a funcioacute reduir el flux drsquoelectrons afi de controlar la seva potegravencia Eacutes molt comuacute a lrsquoelectrogravenica ja que eacutes molt necessari per assegu-rar-nos del correcte funcionament drsquoelements com el LED que sense una resistegravencia que limiteacutes el corrent podrien cremar-se

Placa base Eacutes la part de lrsquoordinador que conteacute elements com la RAM la ROM o el microproces-sador La placa base de lrsquoordinador que constru-irem amb aquest manual seria la progravepia Raspber-ry Pi

Protoboard Tambeacute coneguda com a Bread-board srsquoutilitza per crear circuits electrogravenics sense necessitat de soldar Per saber com funcio-na i com estan relacionats els diferents contactes consulteu aquesta webhttprduinostarcomdocumentaciongeneralpro-toboard-que-es-y-como-funciona

36

Terminal Eacutes el programa emprat per enviar ordres directes a lrsquoordinador i rebre respostes drsquoaquest Nosaltres lrsquoutilitzarem per instalmiddotlar els programes necessaris per programar les plaques electrograveniques i altres arxius necessaris

Variable Valor que canvia segons les operacions que es facin amb aquest al programa informagravetic Com ja sabeu hi ha variables independents (pe el temps) i dependents (pe si estagrave o no encegraves un LED que dependragrave drsquoaltres variables)

37

  • httpwwwfsforg
Page 20: CodePi

20

Comprovacionsif (wiringPiSetup() == -1) exit (1)

int pin = 1

printf(ldquoEncenem el pin 18rdquo)

pinMode(pin OUTPUT)

digitalWrite(pin 1)

return 0

713 Encendre i apagar un LED cada dos segons 10 vegades

El que podeu veure aquiacute eacutes el que srsquoanomena un comentari del codi Tot allograve que escrivim despreacutes de ldquordquo el compilador no ho llegiragrave i per tant nomeacutes serveix per donar indicacions al programador

Declarem la variable pin que com eacutes un nombre enter escriurem int

Fem un printf() tal i com hem apregraves a la pragravectica anterior Escrivim el 18 ja que la numeracioacute de la llibreria wiringPi canvia respecte a la sortida real (mirar el cuadre de la pagravegina 17)

Amb la funcioacute pinMode() declarem que el pin nuacutemero 1 en aquest cas sigui un pin de sortida de corrent (OUTPUT)

Una vegada li hem dit que eacutes de sortida li hem de dir si el volem encegraves ldquo1rdquo o apagat ldquo0rdquo amb la funcioacute digitalWrite()

Utilitzarem el muntatge la de pragravectica anterior amb la diferegravencia que en comptes de connectar lrsquoagravenode del LED al pin de 5v el connectarem al pin 18 de la Raspberry Pi Drsquoaquesta manera podrem gestionar el pas de lrsquoelectricitat a traveacutes drsquoun petit programa que crearem a continuacioacute

21

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void) int pin = 1

if (wiringPiSetup() == -1) exit (1)

pinMode(pin OUTPUT)

for (int i=1ilt=10i++)

printf(ldquoLED Onnrdquo) digitalWrite(pin 1)

delay(2000)

printf(ldquoLED Offnrdquo) digitalWrite(pin 0)

delay(2000)

return 0

Utilitzem un bicle ldquoforrdquo per executar el codi 10 vegades

Encenem el LED

Fem un delay() de 2000 milmiddotlisegons (2 segons) que ens serveix per aturar el programa i per tant mantenir el LED encegraves durant aquest temps

Apaguem el LED

El mantenim apagat 2 segons

Lrsquoexpressioacute n serveix per canviar de liacutenia

Proposta Ara que ja saps els conceptes bagravesics de la CodePi intenta fer lrsquoequivalent al codi Morse per demanar ajuda SOS middot middot middot ndash ndash ndash middot middot middot (on cada punt significa LED encegraves durant 14 de segon i cada ralla LED encegraves durant mig segon) Juga amb el valor de la funcioacute delay() per fer que el LED estigui encegraves durant meacutes o menys temps

22

72 Bloc 2 (Mitjagrave)721 Encendre un LED apretant un botoacute

Utilitzar el muntatge del LED que hem fet servir a la pragravectica anterior A meacutes a meacutes hem drsquoafegir 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 aniragrave a parar al pin 23 una resistegravencia de 10KΩ al GROUND per forccedilar lrsquoestat LOW quan el polsador no estagrave apretat

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt int main (void) int pin_LED = 1 int pin_boto = 4 printf (ldquoEncenent un LED apretant un botoacutenrdquo) 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

Declarem el LED com un pin de sortidaI el botoacute com un pin drsquoentrada

Si no fiquem variables al for aquest srsquoexecutaragrave sempre

Amb la funcioacute digitalRead() detectem si passa cor-rent pel pin 8 eacutes a dir si el botoacute ha estat apretat Si eacutes aixiacute fem que srsquoencengui el LED

Si no fem que srsquoapagui

23

722 Encendre un LED apretant tots els puladors

Utilitzar el muntatge de la pragravectica anterior i afegir dos polsadors meacutes amb el mateix proceacutes connec-tats als ports 24 i 25 de la Raspberry Pi

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int main (void) int pin_LED = 1

int pin_boto_A = 4 int pin_boto_B = 5 int 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 ampamp digitalRead(pin_boto_B) == HIGH ampamp digitalRead(pin_boto_C) == HIGH) digitalWrite(pin_LED 1)

Declarem el LED i els tres botons que tal i com posa a lrsquoesquema corresponen als pins 23 24 i 25 de la GPIO

Si els tres polsadors estan premuts passa corrent pels tres i per tant srsquoenceacuten el LED

En aquest cas utilitzem HIGH i LOW en lloc de 1 i 0 respectivament HIGH significa que hi ha elec-tricitat i LOW que no hi ha

24

No apretats while (digitalRead(pin_boto_A) == LOW ampamp digitalRead(pin_boto_B) == LOW ampamp digitalRead(pin_boto_C) == LOW) digitalWrite(pin_LED 0)

Si no apagarsquol

723 Semagravefor amb polsador

En aquesta pragravectica crearem un semagravefor de via-nants i de cotxes Com alguns semagravefors aquests teacute un botoacute amb el qual els vianants demanen que es posi verd aixiacute que el dels cotxes es posa ver-mell

Connectarem dos LEDs (vermell i verd) als pins 18 i 23 de la Raspberry Pi amb una resistegravencia de 180Ω Tambeacute connectarem tres LEDs meacutes (verd vermell i taronja) de la mateixa manera en els ports 17 21 i 22 de la GPIO

A diferegravencia de les altres pragravectiques amb polsa-dors en aquesta el connectarem al port SDA0 i al GROUND ja que nomeacutes ens interessa detectar quan es prem

25

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

define VERMELL 0define GROC1define VERD 2define VERMELL_HOME3define VERD_HOME4

define BOTO 8

void setup (void) int i

if (geteuid () = 0) exit (0)

if (wiringPiSetup () == -1) exit (1)

fflush(stdout) for (i = 0 i lt 5 ++i) pinMode (i OUTPUT) digitalWrite (i 0) digitalWrite(VERD1)digitalWrite(VERMELL_HOME1) pinMode (BOTO INPUT)

printf (ldquoSetup fetnrdquo)

int main (void) setup () for () esperaBoto () aturaTransit () camina () tempsEspera () iniciaTransit ()

Amb lrsquoexpressioacute define li diem a la magravequina que cada cop que escrivim VERMELL en realitat es-tem posant el nombre 0 i el mateix amb les altres paraules

Fem un setup amb tota la configuracioacute necessagraveria

fflush() eacutes una funcioacute complexa que serveix per quumlestions de tractament de memograveria del sistema per evitar errors

Executem totes les funcions una darrera lrsquoaltra de manera indefinida

26

Esperant a que lrsquousuari premi el botoacute per comenccedilar

Fem que el semagravefor dels cotxes canviiuml de verd a vermell passant pel groc

Fem que el semagravefor dels vianants es posi verd

Temps intermig des que srsquoacaba de caminar fins que el trafic comenccedila

void esperaBoto (void) printf (ldquoEsperant el botoacute ldquo)fflush(stdout) while (digitalRead (BOTO) == HIGH) delay (100) printf (ldquoEsoerenrdquo)

void aturaTransit()printf(ldquoAturanteltraficldquo)fflush(stdout)digitalWrite(VERD0) digitalWrite (GROC 1) delay (2000) digitalWrite (GROC 0) digitalWrite(VERMELL1) delay (2000) printf (ldquoAturatsnrdquo)

void camina ()printf(ldquoCaminaldquo)fflush(stdout)

digitalWrite(VERMELL_HOME0)digitalWrite(VERD_HOME1) delay (10000) digitalWrite(VERMELL0) digitalWrite (GROC 1)

printf (ldquoJa han caminatnrdquo)

void tempsEspera () int i

printf (ldquoTemps drsquoespera ldquo) fflush(stdout)

for (i = 0 i lt 8 ++i)

27

delay (500) digitalWrite(VERD_HOME0) digitalWrite (GROC 0) delay (500) digitalWrite(VERD_HOME1) digitalWrite (GROC 1)

void iniciaTransit ()printf(ldquoInicianttraficldquo)fflush(stdout)

digitalWrite(VERD_HOME0)digitalWrite(VERMELL_HOME1) delay (500) digitalWrite (GROC 0) digitalWrite(VERD1)

Deixem via lliure pels vehicles i posem el semagrave-for vermell pels vianants

Proposta Utilitzant el que has apregraves en aquest bloc crear un projecte amb uns quants LEDs en fila que srsquoactivin ascendentment quan apretes un botoacute

28

73 Bloc 3 (Alt)731 Sistema portes logravegiques I

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int AND (int a int b) return a ampamp b

int OR (int a int b) return a || b

int NEGADA (int a) return a

int f(int a int b) return OR(AND(NE-GADA(a)b)AND(aNEGADA(b))) f(a b) = arsquob + abrsquo

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5

int apretat_A = 0 int apretat_B = 0

pinMode(pin_LED_S OUTPUT) pinMode(pin_boto_A INPUT) pinMode(pin_boto_B INPUT)

Crearem una funcioacute per a cada porta logravegica de tal manera que sigui meacutes fagravecil poder-ho aplicar despreacutes

Aquesta seragrave la foacutermula que compliragrave la taula de la veritat en aquest cas eacutes f(a b) = arsquob +abrsquo

Creem dos booleans (variables que poden ser 0 o 1) que ens indicaran si el botoacute ha estat premut o no

Declarem els pins drsquoentrada i de sortida com a totes les pragravectiques anteriors

El seguumlent projecte fa la mateixa funcioacute que acon-seguiriacuteem amb xips de portes logravegiques perograve fent els cagravelculs a partir de la RaspberryPi En aquest cas compleix la taula de la veritat drsquoun OR ex-clusive eacutes a dir nomeacutes srsquoencendragrave el LED quan premem un dels dos botons mai srsquoencendragrave 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 srsquoutilitzin en el codi

29

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) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins estan premuts

Comprovem quins no estan premuts

I apliquem la foacutermula amb els valors drsquoentrada cor-responents Si la foacutermula eacutes igual a 1 srsquoencendragrave el LED si no no srsquoencendragrave

732 Sistema portes logravegiques II

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

Partim de la mateixa base que la pragravectica ante-rior perograve en aquesta incloem una tercera variable drsquoentrada Aixiacute que hem drsquoafegir un nou botoacute en el pin del GPIO que srsquoescau

30

Seguim el patroacute de les foacutermules emprades a la pragravectica anterior

En aquest cas tenim tres variables drsquoentrada perograve la mecagravenica eacutes la mateixa Es pot jugar amb la foacutermula i anar provant diferents combinacions

Necessitem tres variables ja que hi ha tres botons

Declaracions

Comprovem quins estan premuts

int AND (int a int b) return a ampamp b

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 + arsquob

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5 int pin_boto_C = 6

int apretat_A = 0 int apretat_B = 0 int apretat_C = 0

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

31

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

Mostra resultat if (f(apretat_A apretat_B apretat_C) == 1) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins no estan premuts

Com al circuit anterior apliquem la foacutermula i si aquesta doacutena 1 encenem el LED

Proposta Ara que ja has apregraves els conceptes meacutes fonamentals de la CodePi inventarsquot un circuit amb el nivell de dificultat que consideris No et quedis amb el que se trsquoha ensenyat aquiacute sinoacute que cerca meacutes megravetodes que puguis utilitzar La creativitat eacutes bagravesica per a tot bon enginyer i amb aquesta pragravectica volem que demostris de quegrave ets capaccedil

32

8 Vols saber-ne meacutes El moacuten de la programacioacute i lrsquoelectrogravenica eacutes infinit La comunitat geek (= interessada) en aquests te-mes eacutes una de les meacutes servicials i altruista de tota la xarxa aixiacute que es poden trobar una quantitat inacabable de tutorials i pagravegines web especialitza-des en el que vulguem saber

81 Programari lliureEl programari lliure eacutes la base de la informagravetica ac-tual i encara juga un gran paper en algunes agraverees com els servidors web o els mogravebils amb sistema operatiu Android Aquiacute teniu un conjunt de pagravegines on podeu aprofundir sobre aquest apassionant moacuten de la llibertat digital

httpcawikipediaorgwikiRichard_Matthew_Stallmanhttpwwwfsforghttpwwwgnuorghttpwwwlinuxorghttpwwwunixorghttpwwwubuntucom

82 Raspberry PiSi desitges saber meacutes sobre el projecte sense agravenim de lucre Raspberry Pi i seguir fent projectes amb ella visita les pagines que trobaragraves a con-tinuacioacute Aquestes et donaran idees de quegrave fer amb aquest petit perograve fascinant ordinador

httplearnadafruitcomcategorylearn-raspber-ry-pihttpwwwraspberrypiorgwwwraspberrypiorghttpdangerousprototypescom20130202rasp-berry-pi-supercomputerhttpreviewscnetcoukdesktops25-fun-things-to-do-with-a-raspberry-pi-50009851httplearnadafruitcompi-thermal-printer

33

83 Electrogravenica Si lrsquoelectrogravenica bagravesica que has apregraves durant els tutorials de la CodePi trsquoha fet veure que aquest eacutes el moacuten que a tu trsquoagrada no paris A continu-acioacute et deixem pagravegines web on trobaragraves les bases de lrsquoelectrogravenica meacutes complexa i tambeacute molts nous circuits per muntar i seguir descobrint aquest moacuten que avui en dia fa que tots els aparells endollats a al corrent puguin funcionar

httpwwwinstructablescomidBeginners-Elec-tronics-ProjectshttpwwwinstructablescomidElectronic-Proj-ects-For-Beginnershttpwwwcircuitstodaycomsimple-electron-ics-projects-and-circuitshttpswwwsparkfuncomtutorialshttplearnadafruitcom

84 ProgramacioacuteDiuen que per ser un bon programador srsquohan de tenir unes habilitats que no tothom teacute disciplina ordre logravegica creativitat capacitat per resoldre qualsevol problema i per sobre de tot persistegravencia i passioacute Si creus que tens aquestes qualitats do-na-li una oportunitat a la programacioacute A continu-acioacute et deixem un recull de les pagravegines web que creiem que meacutes et poden ajudar a introduir-te una mica meacutes en la programacioacute web i la drsquoapli-cacions per a mogravebils

httpwwwcodeorghttpscratchmiteduhttpwwwcodecademycom

34

9 GlossariC (llenguatge de programacioacute) Des de la seva creacioacute lrsquoany 1972 srsquoha consolidat com un dels llenguatges de programacioacute meacutes utilitzats per fer aplicacions de software Eacutes considerat un dels meacutes bagravesics i meacutes comuns per introduir-se a la pro-gramacioacute Les grans companyies han utilitzat el C com a base per crear altres llenguatges com lrsquoObjective-C (utilitzat per fer les aplicacions per dispositius drsquoApple) o el C (creat per Microsoft i utilitzat entre altres coses per fer programes in-formagravetics per Windows)

Condensador Component electrogravenic classificat dins del grup dels passius i que per tant no emet cap senyal El podriacuteem definir com un acumula-dor drsquoelectrons que els deixa anar quan arriba a la seva capacitat magravexima Hi ha condensadors de dos tipus els electroliacutetics i els normals En les pragravec-tiques utilitzarem electroliacutetics i com que aquests tenen polaritat eacutes important tenir en compte quina eacutes la pota positiva i quina eacutes la negativa a lrsquohora de connectar-lo

Diacuteode Component electrogravenic passiu Teacute polaritat i seria lrsquoequivalent a una vagravelvula antiretorn lrsquoelec-tricitat nomeacutes pot anar en un sentit

Electrogravenica Disciplina que estudia els com-ponents electrogravenics que funcionen amb un flux drsquoelectrons (corrent continua)

Funcioacute Fragment de codi que conte un seguit drsquoaccions i que hi pots accedir cridant la funcioacute en comptes de repetint el codi Podriacuteem comparar-ho amb una funcioacute matemagravetica en la que tenim vari-ables drsquoentrada que tractant-les a la funcioacute ob-tenim una informacioacute de sortida

GPIO Soacuten les sigles de ldquoGeneral Purpose InputOutputrdquo Si mirem la Raspberry Pi soacuten els pins de sortida on hi connectem els cables amb els que programem la placa electrogravenica Lrsquoavantatge drsquoaquest tipus de connector respecte altres eacutes que es pot gestionar mitjanccedilant programacioacute i aixograve eacutes precisament el que explicarem en aquest manual

35

HDMI Soacuten les sigles de ldquoHigh-Definition Multime-dia Interfacerdquo Serveix per enviar viacutedeo i agraveudio a una pantalla Nosaltres lrsquoutilitzarem per connectar la RaspberryPi a una pantalla

LED Acrogravenim de ldquoLight Emitting Dioderdquo Eacutes un tipus de diacuteode el qual teacute una pelmiddotliacutecula de fogravesfor entre els dos connectors que fa que quan passi el corrent generi llum Com qualsevol altre diacuteode eacutes important tenir en compte la polaritat

RAM Acrogravenim de ldquoRandom Access Memoryrdquo Eacutes la part de lrsquoordinador encarregada drsquoemmagatze-mar els arxius temporals

RCA El connector RCA consisteix en diferents cables amb la punta de diferent color que serveix-en per transmetre agraveudio i viacutedeo

ROM De lrsquoanglegraves ldquoRead Only Memoryrdquo eacutes la uni-tat de memograveria on es guarda el sistema operatiu

Resistegravencia Eacutes un component electrogravenic que teacute com a funcioacute reduir el flux drsquoelectrons afi de controlar la seva potegravencia Eacutes molt comuacute a lrsquoelectrogravenica ja que eacutes molt necessari per assegu-rar-nos del correcte funcionament drsquoelements com el LED que sense una resistegravencia que limiteacutes el corrent podrien cremar-se

Placa base Eacutes la part de lrsquoordinador que conteacute elements com la RAM la ROM o el microproces-sador La placa base de lrsquoordinador que constru-irem amb aquest manual seria la progravepia Raspber-ry Pi

Protoboard Tambeacute coneguda com a Bread-board srsquoutilitza per crear circuits electrogravenics sense necessitat de soldar Per saber com funcio-na i com estan relacionats els diferents contactes consulteu aquesta webhttprduinostarcomdocumentaciongeneralpro-toboard-que-es-y-como-funciona

36

Terminal Eacutes el programa emprat per enviar ordres directes a lrsquoordinador i rebre respostes drsquoaquest Nosaltres lrsquoutilitzarem per instalmiddotlar els programes necessaris per programar les plaques electrograveniques i altres arxius necessaris

Variable Valor que canvia segons les operacions que es facin amb aquest al programa informagravetic Com ja sabeu hi ha variables independents (pe el temps) i dependents (pe si estagrave o no encegraves un LED que dependragrave drsquoaltres variables)

37

  • httpwwwfsforg
Page 21: CodePi

21

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt

int main (void) int pin = 1

if (wiringPiSetup() == -1) exit (1)

pinMode(pin OUTPUT)

for (int i=1ilt=10i++)

printf(ldquoLED Onnrdquo) digitalWrite(pin 1)

delay(2000)

printf(ldquoLED Offnrdquo) digitalWrite(pin 0)

delay(2000)

return 0

Utilitzem un bicle ldquoforrdquo per executar el codi 10 vegades

Encenem el LED

Fem un delay() de 2000 milmiddotlisegons (2 segons) que ens serveix per aturar el programa i per tant mantenir el LED encegraves durant aquest temps

Apaguem el LED

El mantenim apagat 2 segons

Lrsquoexpressioacute n serveix per canviar de liacutenia

Proposta Ara que ja saps els conceptes bagravesics de la CodePi intenta fer lrsquoequivalent al codi Morse per demanar ajuda SOS middot middot middot ndash ndash ndash middot middot middot (on cada punt significa LED encegraves durant 14 de segon i cada ralla LED encegraves durant mig segon) Juga amb el valor de la funcioacute delay() per fer que el LED estigui encegraves durant meacutes o menys temps

22

72 Bloc 2 (Mitjagrave)721 Encendre un LED apretant un botoacute

Utilitzar el muntatge del LED que hem fet servir a la pragravectica anterior A meacutes a meacutes hem drsquoafegir 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 aniragrave a parar al pin 23 una resistegravencia de 10KΩ al GROUND per forccedilar lrsquoestat LOW quan el polsador no estagrave apretat

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt int main (void) int pin_LED = 1 int pin_boto = 4 printf (ldquoEncenent un LED apretant un botoacutenrdquo) 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

Declarem el LED com un pin de sortidaI el botoacute com un pin drsquoentrada

Si no fiquem variables al for aquest srsquoexecutaragrave sempre

Amb la funcioacute digitalRead() detectem si passa cor-rent pel pin 8 eacutes a dir si el botoacute ha estat apretat Si eacutes aixiacute fem que srsquoencengui el LED

Si no fem que srsquoapagui

23

722 Encendre un LED apretant tots els puladors

Utilitzar el muntatge de la pragravectica anterior i afegir dos polsadors meacutes amb el mateix proceacutes connec-tats als ports 24 i 25 de la Raspberry Pi

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int main (void) int pin_LED = 1

int pin_boto_A = 4 int pin_boto_B = 5 int 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 ampamp digitalRead(pin_boto_B) == HIGH ampamp digitalRead(pin_boto_C) == HIGH) digitalWrite(pin_LED 1)

Declarem el LED i els tres botons que tal i com posa a lrsquoesquema corresponen als pins 23 24 i 25 de la GPIO

Si els tres polsadors estan premuts passa corrent pels tres i per tant srsquoenceacuten el LED

En aquest cas utilitzem HIGH i LOW en lloc de 1 i 0 respectivament HIGH significa que hi ha elec-tricitat i LOW que no hi ha

24

No apretats while (digitalRead(pin_boto_A) == LOW ampamp digitalRead(pin_boto_B) == LOW ampamp digitalRead(pin_boto_C) == LOW) digitalWrite(pin_LED 0)

Si no apagarsquol

723 Semagravefor amb polsador

En aquesta pragravectica crearem un semagravefor de via-nants i de cotxes Com alguns semagravefors aquests teacute un botoacute amb el qual els vianants demanen que es posi verd aixiacute que el dels cotxes es posa ver-mell

Connectarem dos LEDs (vermell i verd) als pins 18 i 23 de la Raspberry Pi amb una resistegravencia de 180Ω Tambeacute connectarem tres LEDs meacutes (verd vermell i taronja) de la mateixa manera en els ports 17 21 i 22 de la GPIO

A diferegravencia de les altres pragravectiques amb polsa-dors en aquesta el connectarem al port SDA0 i al GROUND ja que nomeacutes ens interessa detectar quan es prem

25

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

define VERMELL 0define GROC1define VERD 2define VERMELL_HOME3define VERD_HOME4

define BOTO 8

void setup (void) int i

if (geteuid () = 0) exit (0)

if (wiringPiSetup () == -1) exit (1)

fflush(stdout) for (i = 0 i lt 5 ++i) pinMode (i OUTPUT) digitalWrite (i 0) digitalWrite(VERD1)digitalWrite(VERMELL_HOME1) pinMode (BOTO INPUT)

printf (ldquoSetup fetnrdquo)

int main (void) setup () for () esperaBoto () aturaTransit () camina () tempsEspera () iniciaTransit ()

Amb lrsquoexpressioacute define li diem a la magravequina que cada cop que escrivim VERMELL en realitat es-tem posant el nombre 0 i el mateix amb les altres paraules

Fem un setup amb tota la configuracioacute necessagraveria

fflush() eacutes una funcioacute complexa que serveix per quumlestions de tractament de memograveria del sistema per evitar errors

Executem totes les funcions una darrera lrsquoaltra de manera indefinida

26

Esperant a que lrsquousuari premi el botoacute per comenccedilar

Fem que el semagravefor dels cotxes canviiuml de verd a vermell passant pel groc

Fem que el semagravefor dels vianants es posi verd

Temps intermig des que srsquoacaba de caminar fins que el trafic comenccedila

void esperaBoto (void) printf (ldquoEsperant el botoacute ldquo)fflush(stdout) while (digitalRead (BOTO) == HIGH) delay (100) printf (ldquoEsoerenrdquo)

void aturaTransit()printf(ldquoAturanteltraficldquo)fflush(stdout)digitalWrite(VERD0) digitalWrite (GROC 1) delay (2000) digitalWrite (GROC 0) digitalWrite(VERMELL1) delay (2000) printf (ldquoAturatsnrdquo)

void camina ()printf(ldquoCaminaldquo)fflush(stdout)

digitalWrite(VERMELL_HOME0)digitalWrite(VERD_HOME1) delay (10000) digitalWrite(VERMELL0) digitalWrite (GROC 1)

printf (ldquoJa han caminatnrdquo)

void tempsEspera () int i

printf (ldquoTemps drsquoespera ldquo) fflush(stdout)

for (i = 0 i lt 8 ++i)

27

delay (500) digitalWrite(VERD_HOME0) digitalWrite (GROC 0) delay (500) digitalWrite(VERD_HOME1) digitalWrite (GROC 1)

void iniciaTransit ()printf(ldquoInicianttraficldquo)fflush(stdout)

digitalWrite(VERD_HOME0)digitalWrite(VERMELL_HOME1) delay (500) digitalWrite (GROC 0) digitalWrite(VERD1)

Deixem via lliure pels vehicles i posem el semagrave-for vermell pels vianants

Proposta Utilitzant el que has apregraves en aquest bloc crear un projecte amb uns quants LEDs en fila que srsquoactivin ascendentment quan apretes un botoacute

28

73 Bloc 3 (Alt)731 Sistema portes logravegiques I

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int AND (int a int b) return a ampamp b

int OR (int a int b) return a || b

int NEGADA (int a) return a

int f(int a int b) return OR(AND(NE-GADA(a)b)AND(aNEGADA(b))) f(a b) = arsquob + abrsquo

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5

int apretat_A = 0 int apretat_B = 0

pinMode(pin_LED_S OUTPUT) pinMode(pin_boto_A INPUT) pinMode(pin_boto_B INPUT)

Crearem una funcioacute per a cada porta logravegica de tal manera que sigui meacutes fagravecil poder-ho aplicar despreacutes

Aquesta seragrave la foacutermula que compliragrave la taula de la veritat en aquest cas eacutes f(a b) = arsquob +abrsquo

Creem dos booleans (variables que poden ser 0 o 1) que ens indicaran si el botoacute ha estat premut o no

Declarem els pins drsquoentrada i de sortida com a totes les pragravectiques anteriors

El seguumlent projecte fa la mateixa funcioacute que acon-seguiriacuteem amb xips de portes logravegiques perograve fent els cagravelculs a partir de la RaspberryPi En aquest cas compleix la taula de la veritat drsquoun OR ex-clusive eacutes a dir nomeacutes srsquoencendragrave el LED quan premem un dels dos botons mai srsquoencendragrave 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 srsquoutilitzin en el codi

29

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) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins estan premuts

Comprovem quins no estan premuts

I apliquem la foacutermula amb els valors drsquoentrada cor-responents Si la foacutermula eacutes igual a 1 srsquoencendragrave el LED si no no srsquoencendragrave

732 Sistema portes logravegiques II

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

Partim de la mateixa base que la pragravectica ante-rior perograve en aquesta incloem una tercera variable drsquoentrada Aixiacute que hem drsquoafegir un nou botoacute en el pin del GPIO que srsquoescau

30

Seguim el patroacute de les foacutermules emprades a la pragravectica anterior

En aquest cas tenim tres variables drsquoentrada perograve la mecagravenica eacutes la mateixa Es pot jugar amb la foacutermula i anar provant diferents combinacions

Necessitem tres variables ja que hi ha tres botons

Declaracions

Comprovem quins estan premuts

int AND (int a int b) return a ampamp b

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 + arsquob

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5 int pin_boto_C = 6

int apretat_A = 0 int apretat_B = 0 int apretat_C = 0

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

31

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

Mostra resultat if (f(apretat_A apretat_B apretat_C) == 1) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins no estan premuts

Com al circuit anterior apliquem la foacutermula i si aquesta doacutena 1 encenem el LED

Proposta Ara que ja has apregraves els conceptes meacutes fonamentals de la CodePi inventarsquot un circuit amb el nivell de dificultat que consideris No et quedis amb el que se trsquoha ensenyat aquiacute sinoacute que cerca meacutes megravetodes que puguis utilitzar La creativitat eacutes bagravesica per a tot bon enginyer i amb aquesta pragravectica volem que demostris de quegrave ets capaccedil

32

8 Vols saber-ne meacutes El moacuten de la programacioacute i lrsquoelectrogravenica eacutes infinit La comunitat geek (= interessada) en aquests te-mes eacutes una de les meacutes servicials i altruista de tota la xarxa aixiacute que es poden trobar una quantitat inacabable de tutorials i pagravegines web especialitza-des en el que vulguem saber

81 Programari lliureEl programari lliure eacutes la base de la informagravetica ac-tual i encara juga un gran paper en algunes agraverees com els servidors web o els mogravebils amb sistema operatiu Android Aquiacute teniu un conjunt de pagravegines on podeu aprofundir sobre aquest apassionant moacuten de la llibertat digital

httpcawikipediaorgwikiRichard_Matthew_Stallmanhttpwwwfsforghttpwwwgnuorghttpwwwlinuxorghttpwwwunixorghttpwwwubuntucom

82 Raspberry PiSi desitges saber meacutes sobre el projecte sense agravenim de lucre Raspberry Pi i seguir fent projectes amb ella visita les pagines que trobaragraves a con-tinuacioacute Aquestes et donaran idees de quegrave fer amb aquest petit perograve fascinant ordinador

httplearnadafruitcomcategorylearn-raspber-ry-pihttpwwwraspberrypiorgwwwraspberrypiorghttpdangerousprototypescom20130202rasp-berry-pi-supercomputerhttpreviewscnetcoukdesktops25-fun-things-to-do-with-a-raspberry-pi-50009851httplearnadafruitcompi-thermal-printer

33

83 Electrogravenica Si lrsquoelectrogravenica bagravesica que has apregraves durant els tutorials de la CodePi trsquoha fet veure que aquest eacutes el moacuten que a tu trsquoagrada no paris A continu-acioacute et deixem pagravegines web on trobaragraves les bases de lrsquoelectrogravenica meacutes complexa i tambeacute molts nous circuits per muntar i seguir descobrint aquest moacuten que avui en dia fa que tots els aparells endollats a al corrent puguin funcionar

httpwwwinstructablescomidBeginners-Elec-tronics-ProjectshttpwwwinstructablescomidElectronic-Proj-ects-For-Beginnershttpwwwcircuitstodaycomsimple-electron-ics-projects-and-circuitshttpswwwsparkfuncomtutorialshttplearnadafruitcom

84 ProgramacioacuteDiuen que per ser un bon programador srsquohan de tenir unes habilitats que no tothom teacute disciplina ordre logravegica creativitat capacitat per resoldre qualsevol problema i per sobre de tot persistegravencia i passioacute Si creus que tens aquestes qualitats do-na-li una oportunitat a la programacioacute A continu-acioacute et deixem un recull de les pagravegines web que creiem que meacutes et poden ajudar a introduir-te una mica meacutes en la programacioacute web i la drsquoapli-cacions per a mogravebils

httpwwwcodeorghttpscratchmiteduhttpwwwcodecademycom

34

9 GlossariC (llenguatge de programacioacute) Des de la seva creacioacute lrsquoany 1972 srsquoha consolidat com un dels llenguatges de programacioacute meacutes utilitzats per fer aplicacions de software Eacutes considerat un dels meacutes bagravesics i meacutes comuns per introduir-se a la pro-gramacioacute Les grans companyies han utilitzat el C com a base per crear altres llenguatges com lrsquoObjective-C (utilitzat per fer les aplicacions per dispositius drsquoApple) o el C (creat per Microsoft i utilitzat entre altres coses per fer programes in-formagravetics per Windows)

Condensador Component electrogravenic classificat dins del grup dels passius i que per tant no emet cap senyal El podriacuteem definir com un acumula-dor drsquoelectrons que els deixa anar quan arriba a la seva capacitat magravexima Hi ha condensadors de dos tipus els electroliacutetics i els normals En les pragravec-tiques utilitzarem electroliacutetics i com que aquests tenen polaritat eacutes important tenir en compte quina eacutes la pota positiva i quina eacutes la negativa a lrsquohora de connectar-lo

Diacuteode Component electrogravenic passiu Teacute polaritat i seria lrsquoequivalent a una vagravelvula antiretorn lrsquoelec-tricitat nomeacutes pot anar en un sentit

Electrogravenica Disciplina que estudia els com-ponents electrogravenics que funcionen amb un flux drsquoelectrons (corrent continua)

Funcioacute Fragment de codi que conte un seguit drsquoaccions i que hi pots accedir cridant la funcioacute en comptes de repetint el codi Podriacuteem comparar-ho amb una funcioacute matemagravetica en la que tenim vari-ables drsquoentrada que tractant-les a la funcioacute ob-tenim una informacioacute de sortida

GPIO Soacuten les sigles de ldquoGeneral Purpose InputOutputrdquo Si mirem la Raspberry Pi soacuten els pins de sortida on hi connectem els cables amb els que programem la placa electrogravenica Lrsquoavantatge drsquoaquest tipus de connector respecte altres eacutes que es pot gestionar mitjanccedilant programacioacute i aixograve eacutes precisament el que explicarem en aquest manual

35

HDMI Soacuten les sigles de ldquoHigh-Definition Multime-dia Interfacerdquo Serveix per enviar viacutedeo i agraveudio a una pantalla Nosaltres lrsquoutilitzarem per connectar la RaspberryPi a una pantalla

LED Acrogravenim de ldquoLight Emitting Dioderdquo Eacutes un tipus de diacuteode el qual teacute una pelmiddotliacutecula de fogravesfor entre els dos connectors que fa que quan passi el corrent generi llum Com qualsevol altre diacuteode eacutes important tenir en compte la polaritat

RAM Acrogravenim de ldquoRandom Access Memoryrdquo Eacutes la part de lrsquoordinador encarregada drsquoemmagatze-mar els arxius temporals

RCA El connector RCA consisteix en diferents cables amb la punta de diferent color que serveix-en per transmetre agraveudio i viacutedeo

ROM De lrsquoanglegraves ldquoRead Only Memoryrdquo eacutes la uni-tat de memograveria on es guarda el sistema operatiu

Resistegravencia Eacutes un component electrogravenic que teacute com a funcioacute reduir el flux drsquoelectrons afi de controlar la seva potegravencia Eacutes molt comuacute a lrsquoelectrogravenica ja que eacutes molt necessari per assegu-rar-nos del correcte funcionament drsquoelements com el LED que sense una resistegravencia que limiteacutes el corrent podrien cremar-se

Placa base Eacutes la part de lrsquoordinador que conteacute elements com la RAM la ROM o el microproces-sador La placa base de lrsquoordinador que constru-irem amb aquest manual seria la progravepia Raspber-ry Pi

Protoboard Tambeacute coneguda com a Bread-board srsquoutilitza per crear circuits electrogravenics sense necessitat de soldar Per saber com funcio-na i com estan relacionats els diferents contactes consulteu aquesta webhttprduinostarcomdocumentaciongeneralpro-toboard-que-es-y-como-funciona

36

Terminal Eacutes el programa emprat per enviar ordres directes a lrsquoordinador i rebre respostes drsquoaquest Nosaltres lrsquoutilitzarem per instalmiddotlar els programes necessaris per programar les plaques electrograveniques i altres arxius necessaris

Variable Valor que canvia segons les operacions que es facin amb aquest al programa informagravetic Com ja sabeu hi ha variables independents (pe el temps) i dependents (pe si estagrave o no encegraves un LED que dependragrave drsquoaltres variables)

37

  • httpwwwfsforg
Page 22: CodePi

22

72 Bloc 2 (Mitjagrave)721 Encendre un LED apretant un botoacute

Utilitzar el muntatge del LED que hem fet servir a la pragravectica anterior A meacutes a meacutes hem drsquoafegir 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 aniragrave a parar al pin 23 una resistegravencia de 10KΩ al GROUND per forccedilar lrsquoestat LOW quan el polsador no estagrave apretat

include ltwiringPihgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltstdiohgt int main (void) int pin_LED = 1 int pin_boto = 4 printf (ldquoEncenent un LED apretant un botoacutenrdquo) 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

Declarem el LED com un pin de sortidaI el botoacute com un pin drsquoentrada

Si no fiquem variables al for aquest srsquoexecutaragrave sempre

Amb la funcioacute digitalRead() detectem si passa cor-rent pel pin 8 eacutes a dir si el botoacute ha estat apretat Si eacutes aixiacute fem que srsquoencengui el LED

Si no fem que srsquoapagui

23

722 Encendre un LED apretant tots els puladors

Utilitzar el muntatge de la pragravectica anterior i afegir dos polsadors meacutes amb el mateix proceacutes connec-tats als ports 24 i 25 de la Raspberry Pi

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int main (void) int pin_LED = 1

int pin_boto_A = 4 int pin_boto_B = 5 int 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 ampamp digitalRead(pin_boto_B) == HIGH ampamp digitalRead(pin_boto_C) == HIGH) digitalWrite(pin_LED 1)

Declarem el LED i els tres botons que tal i com posa a lrsquoesquema corresponen als pins 23 24 i 25 de la GPIO

Si els tres polsadors estan premuts passa corrent pels tres i per tant srsquoenceacuten el LED

En aquest cas utilitzem HIGH i LOW en lloc de 1 i 0 respectivament HIGH significa que hi ha elec-tricitat i LOW que no hi ha

24

No apretats while (digitalRead(pin_boto_A) == LOW ampamp digitalRead(pin_boto_B) == LOW ampamp digitalRead(pin_boto_C) == LOW) digitalWrite(pin_LED 0)

Si no apagarsquol

723 Semagravefor amb polsador

En aquesta pragravectica crearem un semagravefor de via-nants i de cotxes Com alguns semagravefors aquests teacute un botoacute amb el qual els vianants demanen que es posi verd aixiacute que el dels cotxes es posa ver-mell

Connectarem dos LEDs (vermell i verd) als pins 18 i 23 de la Raspberry Pi amb una resistegravencia de 180Ω Tambeacute connectarem tres LEDs meacutes (verd vermell i taronja) de la mateixa manera en els ports 17 21 i 22 de la GPIO

A diferegravencia de les altres pragravectiques amb polsa-dors en aquesta el connectarem al port SDA0 i al GROUND ja que nomeacutes ens interessa detectar quan es prem

25

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

define VERMELL 0define GROC1define VERD 2define VERMELL_HOME3define VERD_HOME4

define BOTO 8

void setup (void) int i

if (geteuid () = 0) exit (0)

if (wiringPiSetup () == -1) exit (1)

fflush(stdout) for (i = 0 i lt 5 ++i) pinMode (i OUTPUT) digitalWrite (i 0) digitalWrite(VERD1)digitalWrite(VERMELL_HOME1) pinMode (BOTO INPUT)

printf (ldquoSetup fetnrdquo)

int main (void) setup () for () esperaBoto () aturaTransit () camina () tempsEspera () iniciaTransit ()

Amb lrsquoexpressioacute define li diem a la magravequina que cada cop que escrivim VERMELL en realitat es-tem posant el nombre 0 i el mateix amb les altres paraules

Fem un setup amb tota la configuracioacute necessagraveria

fflush() eacutes una funcioacute complexa que serveix per quumlestions de tractament de memograveria del sistema per evitar errors

Executem totes les funcions una darrera lrsquoaltra de manera indefinida

26

Esperant a que lrsquousuari premi el botoacute per comenccedilar

Fem que el semagravefor dels cotxes canviiuml de verd a vermell passant pel groc

Fem que el semagravefor dels vianants es posi verd

Temps intermig des que srsquoacaba de caminar fins que el trafic comenccedila

void esperaBoto (void) printf (ldquoEsperant el botoacute ldquo)fflush(stdout) while (digitalRead (BOTO) == HIGH) delay (100) printf (ldquoEsoerenrdquo)

void aturaTransit()printf(ldquoAturanteltraficldquo)fflush(stdout)digitalWrite(VERD0) digitalWrite (GROC 1) delay (2000) digitalWrite (GROC 0) digitalWrite(VERMELL1) delay (2000) printf (ldquoAturatsnrdquo)

void camina ()printf(ldquoCaminaldquo)fflush(stdout)

digitalWrite(VERMELL_HOME0)digitalWrite(VERD_HOME1) delay (10000) digitalWrite(VERMELL0) digitalWrite (GROC 1)

printf (ldquoJa han caminatnrdquo)

void tempsEspera () int i

printf (ldquoTemps drsquoespera ldquo) fflush(stdout)

for (i = 0 i lt 8 ++i)

27

delay (500) digitalWrite(VERD_HOME0) digitalWrite (GROC 0) delay (500) digitalWrite(VERD_HOME1) digitalWrite (GROC 1)

void iniciaTransit ()printf(ldquoInicianttraficldquo)fflush(stdout)

digitalWrite(VERD_HOME0)digitalWrite(VERMELL_HOME1) delay (500) digitalWrite (GROC 0) digitalWrite(VERD1)

Deixem via lliure pels vehicles i posem el semagrave-for vermell pels vianants

Proposta Utilitzant el que has apregraves en aquest bloc crear un projecte amb uns quants LEDs en fila que srsquoactivin ascendentment quan apretes un botoacute

28

73 Bloc 3 (Alt)731 Sistema portes logravegiques I

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int AND (int a int b) return a ampamp b

int OR (int a int b) return a || b

int NEGADA (int a) return a

int f(int a int b) return OR(AND(NE-GADA(a)b)AND(aNEGADA(b))) f(a b) = arsquob + abrsquo

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5

int apretat_A = 0 int apretat_B = 0

pinMode(pin_LED_S OUTPUT) pinMode(pin_boto_A INPUT) pinMode(pin_boto_B INPUT)

Crearem una funcioacute per a cada porta logravegica de tal manera que sigui meacutes fagravecil poder-ho aplicar despreacutes

Aquesta seragrave la foacutermula que compliragrave la taula de la veritat en aquest cas eacutes f(a b) = arsquob +abrsquo

Creem dos booleans (variables que poden ser 0 o 1) que ens indicaran si el botoacute ha estat premut o no

Declarem els pins drsquoentrada i de sortida com a totes les pragravectiques anteriors

El seguumlent projecte fa la mateixa funcioacute que acon-seguiriacuteem amb xips de portes logravegiques perograve fent els cagravelculs a partir de la RaspberryPi En aquest cas compleix la taula de la veritat drsquoun OR ex-clusive eacutes a dir nomeacutes srsquoencendragrave el LED quan premem un dels dos botons mai srsquoencendragrave 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 srsquoutilitzin en el codi

29

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) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins estan premuts

Comprovem quins no estan premuts

I apliquem la foacutermula amb els valors drsquoentrada cor-responents Si la foacutermula eacutes igual a 1 srsquoencendragrave el LED si no no srsquoencendragrave

732 Sistema portes logravegiques II

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

Partim de la mateixa base que la pragravectica ante-rior perograve en aquesta incloem una tercera variable drsquoentrada Aixiacute que hem drsquoafegir un nou botoacute en el pin del GPIO que srsquoescau

30

Seguim el patroacute de les foacutermules emprades a la pragravectica anterior

En aquest cas tenim tres variables drsquoentrada perograve la mecagravenica eacutes la mateixa Es pot jugar amb la foacutermula i anar provant diferents combinacions

Necessitem tres variables ja que hi ha tres botons

Declaracions

Comprovem quins estan premuts

int AND (int a int b) return a ampamp b

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 + arsquob

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5 int pin_boto_C = 6

int apretat_A = 0 int apretat_B = 0 int apretat_C = 0

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

31

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

Mostra resultat if (f(apretat_A apretat_B apretat_C) == 1) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins no estan premuts

Com al circuit anterior apliquem la foacutermula i si aquesta doacutena 1 encenem el LED

Proposta Ara que ja has apregraves els conceptes meacutes fonamentals de la CodePi inventarsquot un circuit amb el nivell de dificultat que consideris No et quedis amb el que se trsquoha ensenyat aquiacute sinoacute que cerca meacutes megravetodes que puguis utilitzar La creativitat eacutes bagravesica per a tot bon enginyer i amb aquesta pragravectica volem que demostris de quegrave ets capaccedil

32

8 Vols saber-ne meacutes El moacuten de la programacioacute i lrsquoelectrogravenica eacutes infinit La comunitat geek (= interessada) en aquests te-mes eacutes una de les meacutes servicials i altruista de tota la xarxa aixiacute que es poden trobar una quantitat inacabable de tutorials i pagravegines web especialitza-des en el que vulguem saber

81 Programari lliureEl programari lliure eacutes la base de la informagravetica ac-tual i encara juga un gran paper en algunes agraverees com els servidors web o els mogravebils amb sistema operatiu Android Aquiacute teniu un conjunt de pagravegines on podeu aprofundir sobre aquest apassionant moacuten de la llibertat digital

httpcawikipediaorgwikiRichard_Matthew_Stallmanhttpwwwfsforghttpwwwgnuorghttpwwwlinuxorghttpwwwunixorghttpwwwubuntucom

82 Raspberry PiSi desitges saber meacutes sobre el projecte sense agravenim de lucre Raspberry Pi i seguir fent projectes amb ella visita les pagines que trobaragraves a con-tinuacioacute Aquestes et donaran idees de quegrave fer amb aquest petit perograve fascinant ordinador

httplearnadafruitcomcategorylearn-raspber-ry-pihttpwwwraspberrypiorgwwwraspberrypiorghttpdangerousprototypescom20130202rasp-berry-pi-supercomputerhttpreviewscnetcoukdesktops25-fun-things-to-do-with-a-raspberry-pi-50009851httplearnadafruitcompi-thermal-printer

33

83 Electrogravenica Si lrsquoelectrogravenica bagravesica que has apregraves durant els tutorials de la CodePi trsquoha fet veure que aquest eacutes el moacuten que a tu trsquoagrada no paris A continu-acioacute et deixem pagravegines web on trobaragraves les bases de lrsquoelectrogravenica meacutes complexa i tambeacute molts nous circuits per muntar i seguir descobrint aquest moacuten que avui en dia fa que tots els aparells endollats a al corrent puguin funcionar

httpwwwinstructablescomidBeginners-Elec-tronics-ProjectshttpwwwinstructablescomidElectronic-Proj-ects-For-Beginnershttpwwwcircuitstodaycomsimple-electron-ics-projects-and-circuitshttpswwwsparkfuncomtutorialshttplearnadafruitcom

84 ProgramacioacuteDiuen que per ser un bon programador srsquohan de tenir unes habilitats que no tothom teacute disciplina ordre logravegica creativitat capacitat per resoldre qualsevol problema i per sobre de tot persistegravencia i passioacute Si creus que tens aquestes qualitats do-na-li una oportunitat a la programacioacute A continu-acioacute et deixem un recull de les pagravegines web que creiem que meacutes et poden ajudar a introduir-te una mica meacutes en la programacioacute web i la drsquoapli-cacions per a mogravebils

httpwwwcodeorghttpscratchmiteduhttpwwwcodecademycom

34

9 GlossariC (llenguatge de programacioacute) Des de la seva creacioacute lrsquoany 1972 srsquoha consolidat com un dels llenguatges de programacioacute meacutes utilitzats per fer aplicacions de software Eacutes considerat un dels meacutes bagravesics i meacutes comuns per introduir-se a la pro-gramacioacute Les grans companyies han utilitzat el C com a base per crear altres llenguatges com lrsquoObjective-C (utilitzat per fer les aplicacions per dispositius drsquoApple) o el C (creat per Microsoft i utilitzat entre altres coses per fer programes in-formagravetics per Windows)

Condensador Component electrogravenic classificat dins del grup dels passius i que per tant no emet cap senyal El podriacuteem definir com un acumula-dor drsquoelectrons que els deixa anar quan arriba a la seva capacitat magravexima Hi ha condensadors de dos tipus els electroliacutetics i els normals En les pragravec-tiques utilitzarem electroliacutetics i com que aquests tenen polaritat eacutes important tenir en compte quina eacutes la pota positiva i quina eacutes la negativa a lrsquohora de connectar-lo

Diacuteode Component electrogravenic passiu Teacute polaritat i seria lrsquoequivalent a una vagravelvula antiretorn lrsquoelec-tricitat nomeacutes pot anar en un sentit

Electrogravenica Disciplina que estudia els com-ponents electrogravenics que funcionen amb un flux drsquoelectrons (corrent continua)

Funcioacute Fragment de codi que conte un seguit drsquoaccions i que hi pots accedir cridant la funcioacute en comptes de repetint el codi Podriacuteem comparar-ho amb una funcioacute matemagravetica en la que tenim vari-ables drsquoentrada que tractant-les a la funcioacute ob-tenim una informacioacute de sortida

GPIO Soacuten les sigles de ldquoGeneral Purpose InputOutputrdquo Si mirem la Raspberry Pi soacuten els pins de sortida on hi connectem els cables amb els que programem la placa electrogravenica Lrsquoavantatge drsquoaquest tipus de connector respecte altres eacutes que es pot gestionar mitjanccedilant programacioacute i aixograve eacutes precisament el que explicarem en aquest manual

35

HDMI Soacuten les sigles de ldquoHigh-Definition Multime-dia Interfacerdquo Serveix per enviar viacutedeo i agraveudio a una pantalla Nosaltres lrsquoutilitzarem per connectar la RaspberryPi a una pantalla

LED Acrogravenim de ldquoLight Emitting Dioderdquo Eacutes un tipus de diacuteode el qual teacute una pelmiddotliacutecula de fogravesfor entre els dos connectors que fa que quan passi el corrent generi llum Com qualsevol altre diacuteode eacutes important tenir en compte la polaritat

RAM Acrogravenim de ldquoRandom Access Memoryrdquo Eacutes la part de lrsquoordinador encarregada drsquoemmagatze-mar els arxius temporals

RCA El connector RCA consisteix en diferents cables amb la punta de diferent color que serveix-en per transmetre agraveudio i viacutedeo

ROM De lrsquoanglegraves ldquoRead Only Memoryrdquo eacutes la uni-tat de memograveria on es guarda el sistema operatiu

Resistegravencia Eacutes un component electrogravenic que teacute com a funcioacute reduir el flux drsquoelectrons afi de controlar la seva potegravencia Eacutes molt comuacute a lrsquoelectrogravenica ja que eacutes molt necessari per assegu-rar-nos del correcte funcionament drsquoelements com el LED que sense una resistegravencia que limiteacutes el corrent podrien cremar-se

Placa base Eacutes la part de lrsquoordinador que conteacute elements com la RAM la ROM o el microproces-sador La placa base de lrsquoordinador que constru-irem amb aquest manual seria la progravepia Raspber-ry Pi

Protoboard Tambeacute coneguda com a Bread-board srsquoutilitza per crear circuits electrogravenics sense necessitat de soldar Per saber com funcio-na i com estan relacionats els diferents contactes consulteu aquesta webhttprduinostarcomdocumentaciongeneralpro-toboard-que-es-y-como-funciona

36

Terminal Eacutes el programa emprat per enviar ordres directes a lrsquoordinador i rebre respostes drsquoaquest Nosaltres lrsquoutilitzarem per instalmiddotlar els programes necessaris per programar les plaques electrograveniques i altres arxius necessaris

Variable Valor que canvia segons les operacions que es facin amb aquest al programa informagravetic Com ja sabeu hi ha variables independents (pe el temps) i dependents (pe si estagrave o no encegraves un LED que dependragrave drsquoaltres variables)

37

  • httpwwwfsforg
Page 23: CodePi

23

722 Encendre un LED apretant tots els puladors

Utilitzar el muntatge de la pragravectica anterior i afegir dos polsadors meacutes amb el mateix proceacutes connec-tats als ports 24 i 25 de la Raspberry Pi

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int main (void) int pin_LED = 1

int pin_boto_A = 4 int pin_boto_B = 5 int 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 ampamp digitalRead(pin_boto_B) == HIGH ampamp digitalRead(pin_boto_C) == HIGH) digitalWrite(pin_LED 1)

Declarem el LED i els tres botons que tal i com posa a lrsquoesquema corresponen als pins 23 24 i 25 de la GPIO

Si els tres polsadors estan premuts passa corrent pels tres i per tant srsquoenceacuten el LED

En aquest cas utilitzem HIGH i LOW en lloc de 1 i 0 respectivament HIGH significa que hi ha elec-tricitat i LOW que no hi ha

24

No apretats while (digitalRead(pin_boto_A) == LOW ampamp digitalRead(pin_boto_B) == LOW ampamp digitalRead(pin_boto_C) == LOW) digitalWrite(pin_LED 0)

Si no apagarsquol

723 Semagravefor amb polsador

En aquesta pragravectica crearem un semagravefor de via-nants i de cotxes Com alguns semagravefors aquests teacute un botoacute amb el qual els vianants demanen que es posi verd aixiacute que el dels cotxes es posa ver-mell

Connectarem dos LEDs (vermell i verd) als pins 18 i 23 de la Raspberry Pi amb una resistegravencia de 180Ω Tambeacute connectarem tres LEDs meacutes (verd vermell i taronja) de la mateixa manera en els ports 17 21 i 22 de la GPIO

A diferegravencia de les altres pragravectiques amb polsa-dors en aquesta el connectarem al port SDA0 i al GROUND ja que nomeacutes ens interessa detectar quan es prem

25

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

define VERMELL 0define GROC1define VERD 2define VERMELL_HOME3define VERD_HOME4

define BOTO 8

void setup (void) int i

if (geteuid () = 0) exit (0)

if (wiringPiSetup () == -1) exit (1)

fflush(stdout) for (i = 0 i lt 5 ++i) pinMode (i OUTPUT) digitalWrite (i 0) digitalWrite(VERD1)digitalWrite(VERMELL_HOME1) pinMode (BOTO INPUT)

printf (ldquoSetup fetnrdquo)

int main (void) setup () for () esperaBoto () aturaTransit () camina () tempsEspera () iniciaTransit ()

Amb lrsquoexpressioacute define li diem a la magravequina que cada cop que escrivim VERMELL en realitat es-tem posant el nombre 0 i el mateix amb les altres paraules

Fem un setup amb tota la configuracioacute necessagraveria

fflush() eacutes una funcioacute complexa que serveix per quumlestions de tractament de memograveria del sistema per evitar errors

Executem totes les funcions una darrera lrsquoaltra de manera indefinida

26

Esperant a que lrsquousuari premi el botoacute per comenccedilar

Fem que el semagravefor dels cotxes canviiuml de verd a vermell passant pel groc

Fem que el semagravefor dels vianants es posi verd

Temps intermig des que srsquoacaba de caminar fins que el trafic comenccedila

void esperaBoto (void) printf (ldquoEsperant el botoacute ldquo)fflush(stdout) while (digitalRead (BOTO) == HIGH) delay (100) printf (ldquoEsoerenrdquo)

void aturaTransit()printf(ldquoAturanteltraficldquo)fflush(stdout)digitalWrite(VERD0) digitalWrite (GROC 1) delay (2000) digitalWrite (GROC 0) digitalWrite(VERMELL1) delay (2000) printf (ldquoAturatsnrdquo)

void camina ()printf(ldquoCaminaldquo)fflush(stdout)

digitalWrite(VERMELL_HOME0)digitalWrite(VERD_HOME1) delay (10000) digitalWrite(VERMELL0) digitalWrite (GROC 1)

printf (ldquoJa han caminatnrdquo)

void tempsEspera () int i

printf (ldquoTemps drsquoespera ldquo) fflush(stdout)

for (i = 0 i lt 8 ++i)

27

delay (500) digitalWrite(VERD_HOME0) digitalWrite (GROC 0) delay (500) digitalWrite(VERD_HOME1) digitalWrite (GROC 1)

void iniciaTransit ()printf(ldquoInicianttraficldquo)fflush(stdout)

digitalWrite(VERD_HOME0)digitalWrite(VERMELL_HOME1) delay (500) digitalWrite (GROC 0) digitalWrite(VERD1)

Deixem via lliure pels vehicles i posem el semagrave-for vermell pels vianants

Proposta Utilitzant el que has apregraves en aquest bloc crear un projecte amb uns quants LEDs en fila que srsquoactivin ascendentment quan apretes un botoacute

28

73 Bloc 3 (Alt)731 Sistema portes logravegiques I

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int AND (int a int b) return a ampamp b

int OR (int a int b) return a || b

int NEGADA (int a) return a

int f(int a int b) return OR(AND(NE-GADA(a)b)AND(aNEGADA(b))) f(a b) = arsquob + abrsquo

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5

int apretat_A = 0 int apretat_B = 0

pinMode(pin_LED_S OUTPUT) pinMode(pin_boto_A INPUT) pinMode(pin_boto_B INPUT)

Crearem una funcioacute per a cada porta logravegica de tal manera que sigui meacutes fagravecil poder-ho aplicar despreacutes

Aquesta seragrave la foacutermula que compliragrave la taula de la veritat en aquest cas eacutes f(a b) = arsquob +abrsquo

Creem dos booleans (variables que poden ser 0 o 1) que ens indicaran si el botoacute ha estat premut o no

Declarem els pins drsquoentrada i de sortida com a totes les pragravectiques anteriors

El seguumlent projecte fa la mateixa funcioacute que acon-seguiriacuteem amb xips de portes logravegiques perograve fent els cagravelculs a partir de la RaspberryPi En aquest cas compleix la taula de la veritat drsquoun OR ex-clusive eacutes a dir nomeacutes srsquoencendragrave el LED quan premem un dels dos botons mai srsquoencendragrave 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 srsquoutilitzin en el codi

29

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) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins estan premuts

Comprovem quins no estan premuts

I apliquem la foacutermula amb els valors drsquoentrada cor-responents Si la foacutermula eacutes igual a 1 srsquoencendragrave el LED si no no srsquoencendragrave

732 Sistema portes logravegiques II

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

Partim de la mateixa base que la pragravectica ante-rior perograve en aquesta incloem una tercera variable drsquoentrada Aixiacute que hem drsquoafegir un nou botoacute en el pin del GPIO que srsquoescau

30

Seguim el patroacute de les foacutermules emprades a la pragravectica anterior

En aquest cas tenim tres variables drsquoentrada perograve la mecagravenica eacutes la mateixa Es pot jugar amb la foacutermula i anar provant diferents combinacions

Necessitem tres variables ja que hi ha tres botons

Declaracions

Comprovem quins estan premuts

int AND (int a int b) return a ampamp b

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 + arsquob

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5 int pin_boto_C = 6

int apretat_A = 0 int apretat_B = 0 int apretat_C = 0

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

31

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

Mostra resultat if (f(apretat_A apretat_B apretat_C) == 1) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins no estan premuts

Com al circuit anterior apliquem la foacutermula i si aquesta doacutena 1 encenem el LED

Proposta Ara que ja has apregraves els conceptes meacutes fonamentals de la CodePi inventarsquot un circuit amb el nivell de dificultat que consideris No et quedis amb el que se trsquoha ensenyat aquiacute sinoacute que cerca meacutes megravetodes que puguis utilitzar La creativitat eacutes bagravesica per a tot bon enginyer i amb aquesta pragravectica volem que demostris de quegrave ets capaccedil

32

8 Vols saber-ne meacutes El moacuten de la programacioacute i lrsquoelectrogravenica eacutes infinit La comunitat geek (= interessada) en aquests te-mes eacutes una de les meacutes servicials i altruista de tota la xarxa aixiacute que es poden trobar una quantitat inacabable de tutorials i pagravegines web especialitza-des en el que vulguem saber

81 Programari lliureEl programari lliure eacutes la base de la informagravetica ac-tual i encara juga un gran paper en algunes agraverees com els servidors web o els mogravebils amb sistema operatiu Android Aquiacute teniu un conjunt de pagravegines on podeu aprofundir sobre aquest apassionant moacuten de la llibertat digital

httpcawikipediaorgwikiRichard_Matthew_Stallmanhttpwwwfsforghttpwwwgnuorghttpwwwlinuxorghttpwwwunixorghttpwwwubuntucom

82 Raspberry PiSi desitges saber meacutes sobre el projecte sense agravenim de lucre Raspberry Pi i seguir fent projectes amb ella visita les pagines que trobaragraves a con-tinuacioacute Aquestes et donaran idees de quegrave fer amb aquest petit perograve fascinant ordinador

httplearnadafruitcomcategorylearn-raspber-ry-pihttpwwwraspberrypiorgwwwraspberrypiorghttpdangerousprototypescom20130202rasp-berry-pi-supercomputerhttpreviewscnetcoukdesktops25-fun-things-to-do-with-a-raspberry-pi-50009851httplearnadafruitcompi-thermal-printer

33

83 Electrogravenica Si lrsquoelectrogravenica bagravesica que has apregraves durant els tutorials de la CodePi trsquoha fet veure que aquest eacutes el moacuten que a tu trsquoagrada no paris A continu-acioacute et deixem pagravegines web on trobaragraves les bases de lrsquoelectrogravenica meacutes complexa i tambeacute molts nous circuits per muntar i seguir descobrint aquest moacuten que avui en dia fa que tots els aparells endollats a al corrent puguin funcionar

httpwwwinstructablescomidBeginners-Elec-tronics-ProjectshttpwwwinstructablescomidElectronic-Proj-ects-For-Beginnershttpwwwcircuitstodaycomsimple-electron-ics-projects-and-circuitshttpswwwsparkfuncomtutorialshttplearnadafruitcom

84 ProgramacioacuteDiuen que per ser un bon programador srsquohan de tenir unes habilitats que no tothom teacute disciplina ordre logravegica creativitat capacitat per resoldre qualsevol problema i per sobre de tot persistegravencia i passioacute Si creus que tens aquestes qualitats do-na-li una oportunitat a la programacioacute A continu-acioacute et deixem un recull de les pagravegines web que creiem que meacutes et poden ajudar a introduir-te una mica meacutes en la programacioacute web i la drsquoapli-cacions per a mogravebils

httpwwwcodeorghttpscratchmiteduhttpwwwcodecademycom

34

9 GlossariC (llenguatge de programacioacute) Des de la seva creacioacute lrsquoany 1972 srsquoha consolidat com un dels llenguatges de programacioacute meacutes utilitzats per fer aplicacions de software Eacutes considerat un dels meacutes bagravesics i meacutes comuns per introduir-se a la pro-gramacioacute Les grans companyies han utilitzat el C com a base per crear altres llenguatges com lrsquoObjective-C (utilitzat per fer les aplicacions per dispositius drsquoApple) o el C (creat per Microsoft i utilitzat entre altres coses per fer programes in-formagravetics per Windows)

Condensador Component electrogravenic classificat dins del grup dels passius i que per tant no emet cap senyal El podriacuteem definir com un acumula-dor drsquoelectrons que els deixa anar quan arriba a la seva capacitat magravexima Hi ha condensadors de dos tipus els electroliacutetics i els normals En les pragravec-tiques utilitzarem electroliacutetics i com que aquests tenen polaritat eacutes important tenir en compte quina eacutes la pota positiva i quina eacutes la negativa a lrsquohora de connectar-lo

Diacuteode Component electrogravenic passiu Teacute polaritat i seria lrsquoequivalent a una vagravelvula antiretorn lrsquoelec-tricitat nomeacutes pot anar en un sentit

Electrogravenica Disciplina que estudia els com-ponents electrogravenics que funcionen amb un flux drsquoelectrons (corrent continua)

Funcioacute Fragment de codi que conte un seguit drsquoaccions i que hi pots accedir cridant la funcioacute en comptes de repetint el codi Podriacuteem comparar-ho amb una funcioacute matemagravetica en la que tenim vari-ables drsquoentrada que tractant-les a la funcioacute ob-tenim una informacioacute de sortida

GPIO Soacuten les sigles de ldquoGeneral Purpose InputOutputrdquo Si mirem la Raspberry Pi soacuten els pins de sortida on hi connectem els cables amb els que programem la placa electrogravenica Lrsquoavantatge drsquoaquest tipus de connector respecte altres eacutes que es pot gestionar mitjanccedilant programacioacute i aixograve eacutes precisament el que explicarem en aquest manual

35

HDMI Soacuten les sigles de ldquoHigh-Definition Multime-dia Interfacerdquo Serveix per enviar viacutedeo i agraveudio a una pantalla Nosaltres lrsquoutilitzarem per connectar la RaspberryPi a una pantalla

LED Acrogravenim de ldquoLight Emitting Dioderdquo Eacutes un tipus de diacuteode el qual teacute una pelmiddotliacutecula de fogravesfor entre els dos connectors que fa que quan passi el corrent generi llum Com qualsevol altre diacuteode eacutes important tenir en compte la polaritat

RAM Acrogravenim de ldquoRandom Access Memoryrdquo Eacutes la part de lrsquoordinador encarregada drsquoemmagatze-mar els arxius temporals

RCA El connector RCA consisteix en diferents cables amb la punta de diferent color que serveix-en per transmetre agraveudio i viacutedeo

ROM De lrsquoanglegraves ldquoRead Only Memoryrdquo eacutes la uni-tat de memograveria on es guarda el sistema operatiu

Resistegravencia Eacutes un component electrogravenic que teacute com a funcioacute reduir el flux drsquoelectrons afi de controlar la seva potegravencia Eacutes molt comuacute a lrsquoelectrogravenica ja que eacutes molt necessari per assegu-rar-nos del correcte funcionament drsquoelements com el LED que sense una resistegravencia que limiteacutes el corrent podrien cremar-se

Placa base Eacutes la part de lrsquoordinador que conteacute elements com la RAM la ROM o el microproces-sador La placa base de lrsquoordinador que constru-irem amb aquest manual seria la progravepia Raspber-ry Pi

Protoboard Tambeacute coneguda com a Bread-board srsquoutilitza per crear circuits electrogravenics sense necessitat de soldar Per saber com funcio-na i com estan relacionats els diferents contactes consulteu aquesta webhttprduinostarcomdocumentaciongeneralpro-toboard-que-es-y-como-funciona

36

Terminal Eacutes el programa emprat per enviar ordres directes a lrsquoordinador i rebre respostes drsquoaquest Nosaltres lrsquoutilitzarem per instalmiddotlar els programes necessaris per programar les plaques electrograveniques i altres arxius necessaris

Variable Valor que canvia segons les operacions que es facin amb aquest al programa informagravetic Com ja sabeu hi ha variables independents (pe el temps) i dependents (pe si estagrave o no encegraves un LED que dependragrave drsquoaltres variables)

37

  • httpwwwfsforg
Page 24: CodePi

24

No apretats while (digitalRead(pin_boto_A) == LOW ampamp digitalRead(pin_boto_B) == LOW ampamp digitalRead(pin_boto_C) == LOW) digitalWrite(pin_LED 0)

Si no apagarsquol

723 Semagravefor amb polsador

En aquesta pragravectica crearem un semagravefor de via-nants i de cotxes Com alguns semagravefors aquests teacute un botoacute amb el qual els vianants demanen que es posi verd aixiacute que el dels cotxes es posa ver-mell

Connectarem dos LEDs (vermell i verd) als pins 18 i 23 de la Raspberry Pi amb una resistegravencia de 180Ω Tambeacute connectarem tres LEDs meacutes (verd vermell i taronja) de la mateixa manera en els ports 17 21 i 22 de la GPIO

A diferegravencia de les altres pragravectiques amb polsa-dors en aquesta el connectarem al port SDA0 i al GROUND ja que nomeacutes ens interessa detectar quan es prem

25

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

define VERMELL 0define GROC1define VERD 2define VERMELL_HOME3define VERD_HOME4

define BOTO 8

void setup (void) int i

if (geteuid () = 0) exit (0)

if (wiringPiSetup () == -1) exit (1)

fflush(stdout) for (i = 0 i lt 5 ++i) pinMode (i OUTPUT) digitalWrite (i 0) digitalWrite(VERD1)digitalWrite(VERMELL_HOME1) pinMode (BOTO INPUT)

printf (ldquoSetup fetnrdquo)

int main (void) setup () for () esperaBoto () aturaTransit () camina () tempsEspera () iniciaTransit ()

Amb lrsquoexpressioacute define li diem a la magravequina que cada cop que escrivim VERMELL en realitat es-tem posant el nombre 0 i el mateix amb les altres paraules

Fem un setup amb tota la configuracioacute necessagraveria

fflush() eacutes una funcioacute complexa que serveix per quumlestions de tractament de memograveria del sistema per evitar errors

Executem totes les funcions una darrera lrsquoaltra de manera indefinida

26

Esperant a que lrsquousuari premi el botoacute per comenccedilar

Fem que el semagravefor dels cotxes canviiuml de verd a vermell passant pel groc

Fem que el semagravefor dels vianants es posi verd

Temps intermig des que srsquoacaba de caminar fins que el trafic comenccedila

void esperaBoto (void) printf (ldquoEsperant el botoacute ldquo)fflush(stdout) while (digitalRead (BOTO) == HIGH) delay (100) printf (ldquoEsoerenrdquo)

void aturaTransit()printf(ldquoAturanteltraficldquo)fflush(stdout)digitalWrite(VERD0) digitalWrite (GROC 1) delay (2000) digitalWrite (GROC 0) digitalWrite(VERMELL1) delay (2000) printf (ldquoAturatsnrdquo)

void camina ()printf(ldquoCaminaldquo)fflush(stdout)

digitalWrite(VERMELL_HOME0)digitalWrite(VERD_HOME1) delay (10000) digitalWrite(VERMELL0) digitalWrite (GROC 1)

printf (ldquoJa han caminatnrdquo)

void tempsEspera () int i

printf (ldquoTemps drsquoespera ldquo) fflush(stdout)

for (i = 0 i lt 8 ++i)

27

delay (500) digitalWrite(VERD_HOME0) digitalWrite (GROC 0) delay (500) digitalWrite(VERD_HOME1) digitalWrite (GROC 1)

void iniciaTransit ()printf(ldquoInicianttraficldquo)fflush(stdout)

digitalWrite(VERD_HOME0)digitalWrite(VERMELL_HOME1) delay (500) digitalWrite (GROC 0) digitalWrite(VERD1)

Deixem via lliure pels vehicles i posem el semagrave-for vermell pels vianants

Proposta Utilitzant el que has apregraves en aquest bloc crear un projecte amb uns quants LEDs en fila que srsquoactivin ascendentment quan apretes un botoacute

28

73 Bloc 3 (Alt)731 Sistema portes logravegiques I

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int AND (int a int b) return a ampamp b

int OR (int a int b) return a || b

int NEGADA (int a) return a

int f(int a int b) return OR(AND(NE-GADA(a)b)AND(aNEGADA(b))) f(a b) = arsquob + abrsquo

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5

int apretat_A = 0 int apretat_B = 0

pinMode(pin_LED_S OUTPUT) pinMode(pin_boto_A INPUT) pinMode(pin_boto_B INPUT)

Crearem una funcioacute per a cada porta logravegica de tal manera que sigui meacutes fagravecil poder-ho aplicar despreacutes

Aquesta seragrave la foacutermula que compliragrave la taula de la veritat en aquest cas eacutes f(a b) = arsquob +abrsquo

Creem dos booleans (variables que poden ser 0 o 1) que ens indicaran si el botoacute ha estat premut o no

Declarem els pins drsquoentrada i de sortida com a totes les pragravectiques anteriors

El seguumlent projecte fa la mateixa funcioacute que acon-seguiriacuteem amb xips de portes logravegiques perograve fent els cagravelculs a partir de la RaspberryPi En aquest cas compleix la taula de la veritat drsquoun OR ex-clusive eacutes a dir nomeacutes srsquoencendragrave el LED quan premem un dels dos botons mai srsquoencendragrave 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 srsquoutilitzin en el codi

29

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) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins estan premuts

Comprovem quins no estan premuts

I apliquem la foacutermula amb els valors drsquoentrada cor-responents Si la foacutermula eacutes igual a 1 srsquoencendragrave el LED si no no srsquoencendragrave

732 Sistema portes logravegiques II

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

Partim de la mateixa base que la pragravectica ante-rior perograve en aquesta incloem una tercera variable drsquoentrada Aixiacute que hem drsquoafegir un nou botoacute en el pin del GPIO que srsquoescau

30

Seguim el patroacute de les foacutermules emprades a la pragravectica anterior

En aquest cas tenim tres variables drsquoentrada perograve la mecagravenica eacutes la mateixa Es pot jugar amb la foacutermula i anar provant diferents combinacions

Necessitem tres variables ja que hi ha tres botons

Declaracions

Comprovem quins estan premuts

int AND (int a int b) return a ampamp b

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 + arsquob

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5 int pin_boto_C = 6

int apretat_A = 0 int apretat_B = 0 int apretat_C = 0

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

31

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

Mostra resultat if (f(apretat_A apretat_B apretat_C) == 1) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins no estan premuts

Com al circuit anterior apliquem la foacutermula i si aquesta doacutena 1 encenem el LED

Proposta Ara que ja has apregraves els conceptes meacutes fonamentals de la CodePi inventarsquot un circuit amb el nivell de dificultat que consideris No et quedis amb el que se trsquoha ensenyat aquiacute sinoacute que cerca meacutes megravetodes que puguis utilitzar La creativitat eacutes bagravesica per a tot bon enginyer i amb aquesta pragravectica volem que demostris de quegrave ets capaccedil

32

8 Vols saber-ne meacutes El moacuten de la programacioacute i lrsquoelectrogravenica eacutes infinit La comunitat geek (= interessada) en aquests te-mes eacutes una de les meacutes servicials i altruista de tota la xarxa aixiacute que es poden trobar una quantitat inacabable de tutorials i pagravegines web especialitza-des en el que vulguem saber

81 Programari lliureEl programari lliure eacutes la base de la informagravetica ac-tual i encara juga un gran paper en algunes agraverees com els servidors web o els mogravebils amb sistema operatiu Android Aquiacute teniu un conjunt de pagravegines on podeu aprofundir sobre aquest apassionant moacuten de la llibertat digital

httpcawikipediaorgwikiRichard_Matthew_Stallmanhttpwwwfsforghttpwwwgnuorghttpwwwlinuxorghttpwwwunixorghttpwwwubuntucom

82 Raspberry PiSi desitges saber meacutes sobre el projecte sense agravenim de lucre Raspberry Pi i seguir fent projectes amb ella visita les pagines que trobaragraves a con-tinuacioacute Aquestes et donaran idees de quegrave fer amb aquest petit perograve fascinant ordinador

httplearnadafruitcomcategorylearn-raspber-ry-pihttpwwwraspberrypiorgwwwraspberrypiorghttpdangerousprototypescom20130202rasp-berry-pi-supercomputerhttpreviewscnetcoukdesktops25-fun-things-to-do-with-a-raspberry-pi-50009851httplearnadafruitcompi-thermal-printer

33

83 Electrogravenica Si lrsquoelectrogravenica bagravesica que has apregraves durant els tutorials de la CodePi trsquoha fet veure que aquest eacutes el moacuten que a tu trsquoagrada no paris A continu-acioacute et deixem pagravegines web on trobaragraves les bases de lrsquoelectrogravenica meacutes complexa i tambeacute molts nous circuits per muntar i seguir descobrint aquest moacuten que avui en dia fa que tots els aparells endollats a al corrent puguin funcionar

httpwwwinstructablescomidBeginners-Elec-tronics-ProjectshttpwwwinstructablescomidElectronic-Proj-ects-For-Beginnershttpwwwcircuitstodaycomsimple-electron-ics-projects-and-circuitshttpswwwsparkfuncomtutorialshttplearnadafruitcom

84 ProgramacioacuteDiuen que per ser un bon programador srsquohan de tenir unes habilitats que no tothom teacute disciplina ordre logravegica creativitat capacitat per resoldre qualsevol problema i per sobre de tot persistegravencia i passioacute Si creus que tens aquestes qualitats do-na-li una oportunitat a la programacioacute A continu-acioacute et deixem un recull de les pagravegines web que creiem que meacutes et poden ajudar a introduir-te una mica meacutes en la programacioacute web i la drsquoapli-cacions per a mogravebils

httpwwwcodeorghttpscratchmiteduhttpwwwcodecademycom

34

9 GlossariC (llenguatge de programacioacute) Des de la seva creacioacute lrsquoany 1972 srsquoha consolidat com un dels llenguatges de programacioacute meacutes utilitzats per fer aplicacions de software Eacutes considerat un dels meacutes bagravesics i meacutes comuns per introduir-se a la pro-gramacioacute Les grans companyies han utilitzat el C com a base per crear altres llenguatges com lrsquoObjective-C (utilitzat per fer les aplicacions per dispositius drsquoApple) o el C (creat per Microsoft i utilitzat entre altres coses per fer programes in-formagravetics per Windows)

Condensador Component electrogravenic classificat dins del grup dels passius i que per tant no emet cap senyal El podriacuteem definir com un acumula-dor drsquoelectrons que els deixa anar quan arriba a la seva capacitat magravexima Hi ha condensadors de dos tipus els electroliacutetics i els normals En les pragravec-tiques utilitzarem electroliacutetics i com que aquests tenen polaritat eacutes important tenir en compte quina eacutes la pota positiva i quina eacutes la negativa a lrsquohora de connectar-lo

Diacuteode Component electrogravenic passiu Teacute polaritat i seria lrsquoequivalent a una vagravelvula antiretorn lrsquoelec-tricitat nomeacutes pot anar en un sentit

Electrogravenica Disciplina que estudia els com-ponents electrogravenics que funcionen amb un flux drsquoelectrons (corrent continua)

Funcioacute Fragment de codi que conte un seguit drsquoaccions i que hi pots accedir cridant la funcioacute en comptes de repetint el codi Podriacuteem comparar-ho amb una funcioacute matemagravetica en la que tenim vari-ables drsquoentrada que tractant-les a la funcioacute ob-tenim una informacioacute de sortida

GPIO Soacuten les sigles de ldquoGeneral Purpose InputOutputrdquo Si mirem la Raspberry Pi soacuten els pins de sortida on hi connectem els cables amb els que programem la placa electrogravenica Lrsquoavantatge drsquoaquest tipus de connector respecte altres eacutes que es pot gestionar mitjanccedilant programacioacute i aixograve eacutes precisament el que explicarem en aquest manual

35

HDMI Soacuten les sigles de ldquoHigh-Definition Multime-dia Interfacerdquo Serveix per enviar viacutedeo i agraveudio a una pantalla Nosaltres lrsquoutilitzarem per connectar la RaspberryPi a una pantalla

LED Acrogravenim de ldquoLight Emitting Dioderdquo Eacutes un tipus de diacuteode el qual teacute una pelmiddotliacutecula de fogravesfor entre els dos connectors que fa que quan passi el corrent generi llum Com qualsevol altre diacuteode eacutes important tenir en compte la polaritat

RAM Acrogravenim de ldquoRandom Access Memoryrdquo Eacutes la part de lrsquoordinador encarregada drsquoemmagatze-mar els arxius temporals

RCA El connector RCA consisteix en diferents cables amb la punta de diferent color que serveix-en per transmetre agraveudio i viacutedeo

ROM De lrsquoanglegraves ldquoRead Only Memoryrdquo eacutes la uni-tat de memograveria on es guarda el sistema operatiu

Resistegravencia Eacutes un component electrogravenic que teacute com a funcioacute reduir el flux drsquoelectrons afi de controlar la seva potegravencia Eacutes molt comuacute a lrsquoelectrogravenica ja que eacutes molt necessari per assegu-rar-nos del correcte funcionament drsquoelements com el LED que sense una resistegravencia que limiteacutes el corrent podrien cremar-se

Placa base Eacutes la part de lrsquoordinador que conteacute elements com la RAM la ROM o el microproces-sador La placa base de lrsquoordinador que constru-irem amb aquest manual seria la progravepia Raspber-ry Pi

Protoboard Tambeacute coneguda com a Bread-board srsquoutilitza per crear circuits electrogravenics sense necessitat de soldar Per saber com funcio-na i com estan relacionats els diferents contactes consulteu aquesta webhttprduinostarcomdocumentaciongeneralpro-toboard-que-es-y-como-funciona

36

Terminal Eacutes el programa emprat per enviar ordres directes a lrsquoordinador i rebre respostes drsquoaquest Nosaltres lrsquoutilitzarem per instalmiddotlar els programes necessaris per programar les plaques electrograveniques i altres arxius necessaris

Variable Valor que canvia segons les operacions que es facin amb aquest al programa informagravetic Com ja sabeu hi ha variables independents (pe el temps) i dependents (pe si estagrave o no encegraves un LED que dependragrave drsquoaltres variables)

37

  • httpwwwfsforg
Page 25: CodePi

25

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

define VERMELL 0define GROC1define VERD 2define VERMELL_HOME3define VERD_HOME4

define BOTO 8

void setup (void) int i

if (geteuid () = 0) exit (0)

if (wiringPiSetup () == -1) exit (1)

fflush(stdout) for (i = 0 i lt 5 ++i) pinMode (i OUTPUT) digitalWrite (i 0) digitalWrite(VERD1)digitalWrite(VERMELL_HOME1) pinMode (BOTO INPUT)

printf (ldquoSetup fetnrdquo)

int main (void) setup () for () esperaBoto () aturaTransit () camina () tempsEspera () iniciaTransit ()

Amb lrsquoexpressioacute define li diem a la magravequina que cada cop que escrivim VERMELL en realitat es-tem posant el nombre 0 i el mateix amb les altres paraules

Fem un setup amb tota la configuracioacute necessagraveria

fflush() eacutes una funcioacute complexa que serveix per quumlestions de tractament de memograveria del sistema per evitar errors

Executem totes les funcions una darrera lrsquoaltra de manera indefinida

26

Esperant a que lrsquousuari premi el botoacute per comenccedilar

Fem que el semagravefor dels cotxes canviiuml de verd a vermell passant pel groc

Fem que el semagravefor dels vianants es posi verd

Temps intermig des que srsquoacaba de caminar fins que el trafic comenccedila

void esperaBoto (void) printf (ldquoEsperant el botoacute ldquo)fflush(stdout) while (digitalRead (BOTO) == HIGH) delay (100) printf (ldquoEsoerenrdquo)

void aturaTransit()printf(ldquoAturanteltraficldquo)fflush(stdout)digitalWrite(VERD0) digitalWrite (GROC 1) delay (2000) digitalWrite (GROC 0) digitalWrite(VERMELL1) delay (2000) printf (ldquoAturatsnrdquo)

void camina ()printf(ldquoCaminaldquo)fflush(stdout)

digitalWrite(VERMELL_HOME0)digitalWrite(VERD_HOME1) delay (10000) digitalWrite(VERMELL0) digitalWrite (GROC 1)

printf (ldquoJa han caminatnrdquo)

void tempsEspera () int i

printf (ldquoTemps drsquoespera ldquo) fflush(stdout)

for (i = 0 i lt 8 ++i)

27

delay (500) digitalWrite(VERD_HOME0) digitalWrite (GROC 0) delay (500) digitalWrite(VERD_HOME1) digitalWrite (GROC 1)

void iniciaTransit ()printf(ldquoInicianttraficldquo)fflush(stdout)

digitalWrite(VERD_HOME0)digitalWrite(VERMELL_HOME1) delay (500) digitalWrite (GROC 0) digitalWrite(VERD1)

Deixem via lliure pels vehicles i posem el semagrave-for vermell pels vianants

Proposta Utilitzant el que has apregraves en aquest bloc crear un projecte amb uns quants LEDs en fila que srsquoactivin ascendentment quan apretes un botoacute

28

73 Bloc 3 (Alt)731 Sistema portes logravegiques I

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int AND (int a int b) return a ampamp b

int OR (int a int b) return a || b

int NEGADA (int a) return a

int f(int a int b) return OR(AND(NE-GADA(a)b)AND(aNEGADA(b))) f(a b) = arsquob + abrsquo

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5

int apretat_A = 0 int apretat_B = 0

pinMode(pin_LED_S OUTPUT) pinMode(pin_boto_A INPUT) pinMode(pin_boto_B INPUT)

Crearem una funcioacute per a cada porta logravegica de tal manera que sigui meacutes fagravecil poder-ho aplicar despreacutes

Aquesta seragrave la foacutermula que compliragrave la taula de la veritat en aquest cas eacutes f(a b) = arsquob +abrsquo

Creem dos booleans (variables que poden ser 0 o 1) que ens indicaran si el botoacute ha estat premut o no

Declarem els pins drsquoentrada i de sortida com a totes les pragravectiques anteriors

El seguumlent projecte fa la mateixa funcioacute que acon-seguiriacuteem amb xips de portes logravegiques perograve fent els cagravelculs a partir de la RaspberryPi En aquest cas compleix la taula de la veritat drsquoun OR ex-clusive eacutes a dir nomeacutes srsquoencendragrave el LED quan premem un dels dos botons mai srsquoencendragrave 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 srsquoutilitzin en el codi

29

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) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins estan premuts

Comprovem quins no estan premuts

I apliquem la foacutermula amb els valors drsquoentrada cor-responents Si la foacutermula eacutes igual a 1 srsquoencendragrave el LED si no no srsquoencendragrave

732 Sistema portes logravegiques II

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

Partim de la mateixa base que la pragravectica ante-rior perograve en aquesta incloem una tercera variable drsquoentrada Aixiacute que hem drsquoafegir un nou botoacute en el pin del GPIO que srsquoescau

30

Seguim el patroacute de les foacutermules emprades a la pragravectica anterior

En aquest cas tenim tres variables drsquoentrada perograve la mecagravenica eacutes la mateixa Es pot jugar amb la foacutermula i anar provant diferents combinacions

Necessitem tres variables ja que hi ha tres botons

Declaracions

Comprovem quins estan premuts

int AND (int a int b) return a ampamp b

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 + arsquob

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5 int pin_boto_C = 6

int apretat_A = 0 int apretat_B = 0 int apretat_C = 0

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

31

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

Mostra resultat if (f(apretat_A apretat_B apretat_C) == 1) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins no estan premuts

Com al circuit anterior apliquem la foacutermula i si aquesta doacutena 1 encenem el LED

Proposta Ara que ja has apregraves els conceptes meacutes fonamentals de la CodePi inventarsquot un circuit amb el nivell de dificultat que consideris No et quedis amb el que se trsquoha ensenyat aquiacute sinoacute que cerca meacutes megravetodes que puguis utilitzar La creativitat eacutes bagravesica per a tot bon enginyer i amb aquesta pragravectica volem que demostris de quegrave ets capaccedil

32

8 Vols saber-ne meacutes El moacuten de la programacioacute i lrsquoelectrogravenica eacutes infinit La comunitat geek (= interessada) en aquests te-mes eacutes una de les meacutes servicials i altruista de tota la xarxa aixiacute que es poden trobar una quantitat inacabable de tutorials i pagravegines web especialitza-des en el que vulguem saber

81 Programari lliureEl programari lliure eacutes la base de la informagravetica ac-tual i encara juga un gran paper en algunes agraverees com els servidors web o els mogravebils amb sistema operatiu Android Aquiacute teniu un conjunt de pagravegines on podeu aprofundir sobre aquest apassionant moacuten de la llibertat digital

httpcawikipediaorgwikiRichard_Matthew_Stallmanhttpwwwfsforghttpwwwgnuorghttpwwwlinuxorghttpwwwunixorghttpwwwubuntucom

82 Raspberry PiSi desitges saber meacutes sobre el projecte sense agravenim de lucre Raspberry Pi i seguir fent projectes amb ella visita les pagines que trobaragraves a con-tinuacioacute Aquestes et donaran idees de quegrave fer amb aquest petit perograve fascinant ordinador

httplearnadafruitcomcategorylearn-raspber-ry-pihttpwwwraspberrypiorgwwwraspberrypiorghttpdangerousprototypescom20130202rasp-berry-pi-supercomputerhttpreviewscnetcoukdesktops25-fun-things-to-do-with-a-raspberry-pi-50009851httplearnadafruitcompi-thermal-printer

33

83 Electrogravenica Si lrsquoelectrogravenica bagravesica que has apregraves durant els tutorials de la CodePi trsquoha fet veure que aquest eacutes el moacuten que a tu trsquoagrada no paris A continu-acioacute et deixem pagravegines web on trobaragraves les bases de lrsquoelectrogravenica meacutes complexa i tambeacute molts nous circuits per muntar i seguir descobrint aquest moacuten que avui en dia fa que tots els aparells endollats a al corrent puguin funcionar

httpwwwinstructablescomidBeginners-Elec-tronics-ProjectshttpwwwinstructablescomidElectronic-Proj-ects-For-Beginnershttpwwwcircuitstodaycomsimple-electron-ics-projects-and-circuitshttpswwwsparkfuncomtutorialshttplearnadafruitcom

84 ProgramacioacuteDiuen que per ser un bon programador srsquohan de tenir unes habilitats que no tothom teacute disciplina ordre logravegica creativitat capacitat per resoldre qualsevol problema i per sobre de tot persistegravencia i passioacute Si creus que tens aquestes qualitats do-na-li una oportunitat a la programacioacute A continu-acioacute et deixem un recull de les pagravegines web que creiem que meacutes et poden ajudar a introduir-te una mica meacutes en la programacioacute web i la drsquoapli-cacions per a mogravebils

httpwwwcodeorghttpscratchmiteduhttpwwwcodecademycom

34

9 GlossariC (llenguatge de programacioacute) Des de la seva creacioacute lrsquoany 1972 srsquoha consolidat com un dels llenguatges de programacioacute meacutes utilitzats per fer aplicacions de software Eacutes considerat un dels meacutes bagravesics i meacutes comuns per introduir-se a la pro-gramacioacute Les grans companyies han utilitzat el C com a base per crear altres llenguatges com lrsquoObjective-C (utilitzat per fer les aplicacions per dispositius drsquoApple) o el C (creat per Microsoft i utilitzat entre altres coses per fer programes in-formagravetics per Windows)

Condensador Component electrogravenic classificat dins del grup dels passius i que per tant no emet cap senyal El podriacuteem definir com un acumula-dor drsquoelectrons que els deixa anar quan arriba a la seva capacitat magravexima Hi ha condensadors de dos tipus els electroliacutetics i els normals En les pragravec-tiques utilitzarem electroliacutetics i com que aquests tenen polaritat eacutes important tenir en compte quina eacutes la pota positiva i quina eacutes la negativa a lrsquohora de connectar-lo

Diacuteode Component electrogravenic passiu Teacute polaritat i seria lrsquoequivalent a una vagravelvula antiretorn lrsquoelec-tricitat nomeacutes pot anar en un sentit

Electrogravenica Disciplina que estudia els com-ponents electrogravenics que funcionen amb un flux drsquoelectrons (corrent continua)

Funcioacute Fragment de codi que conte un seguit drsquoaccions i que hi pots accedir cridant la funcioacute en comptes de repetint el codi Podriacuteem comparar-ho amb una funcioacute matemagravetica en la que tenim vari-ables drsquoentrada que tractant-les a la funcioacute ob-tenim una informacioacute de sortida

GPIO Soacuten les sigles de ldquoGeneral Purpose InputOutputrdquo Si mirem la Raspberry Pi soacuten els pins de sortida on hi connectem els cables amb els que programem la placa electrogravenica Lrsquoavantatge drsquoaquest tipus de connector respecte altres eacutes que es pot gestionar mitjanccedilant programacioacute i aixograve eacutes precisament el que explicarem en aquest manual

35

HDMI Soacuten les sigles de ldquoHigh-Definition Multime-dia Interfacerdquo Serveix per enviar viacutedeo i agraveudio a una pantalla Nosaltres lrsquoutilitzarem per connectar la RaspberryPi a una pantalla

LED Acrogravenim de ldquoLight Emitting Dioderdquo Eacutes un tipus de diacuteode el qual teacute una pelmiddotliacutecula de fogravesfor entre els dos connectors que fa que quan passi el corrent generi llum Com qualsevol altre diacuteode eacutes important tenir en compte la polaritat

RAM Acrogravenim de ldquoRandom Access Memoryrdquo Eacutes la part de lrsquoordinador encarregada drsquoemmagatze-mar els arxius temporals

RCA El connector RCA consisteix en diferents cables amb la punta de diferent color que serveix-en per transmetre agraveudio i viacutedeo

ROM De lrsquoanglegraves ldquoRead Only Memoryrdquo eacutes la uni-tat de memograveria on es guarda el sistema operatiu

Resistegravencia Eacutes un component electrogravenic que teacute com a funcioacute reduir el flux drsquoelectrons afi de controlar la seva potegravencia Eacutes molt comuacute a lrsquoelectrogravenica ja que eacutes molt necessari per assegu-rar-nos del correcte funcionament drsquoelements com el LED que sense una resistegravencia que limiteacutes el corrent podrien cremar-se

Placa base Eacutes la part de lrsquoordinador que conteacute elements com la RAM la ROM o el microproces-sador La placa base de lrsquoordinador que constru-irem amb aquest manual seria la progravepia Raspber-ry Pi

Protoboard Tambeacute coneguda com a Bread-board srsquoutilitza per crear circuits electrogravenics sense necessitat de soldar Per saber com funcio-na i com estan relacionats els diferents contactes consulteu aquesta webhttprduinostarcomdocumentaciongeneralpro-toboard-que-es-y-como-funciona

36

Terminal Eacutes el programa emprat per enviar ordres directes a lrsquoordinador i rebre respostes drsquoaquest Nosaltres lrsquoutilitzarem per instalmiddotlar els programes necessaris per programar les plaques electrograveniques i altres arxius necessaris

Variable Valor que canvia segons les operacions que es facin amb aquest al programa informagravetic Com ja sabeu hi ha variables independents (pe el temps) i dependents (pe si estagrave o no encegraves un LED que dependragrave drsquoaltres variables)

37

  • httpwwwfsforg
Page 26: CodePi

26

Esperant a que lrsquousuari premi el botoacute per comenccedilar

Fem que el semagravefor dels cotxes canviiuml de verd a vermell passant pel groc

Fem que el semagravefor dels vianants es posi verd

Temps intermig des que srsquoacaba de caminar fins que el trafic comenccedila

void esperaBoto (void) printf (ldquoEsperant el botoacute ldquo)fflush(stdout) while (digitalRead (BOTO) == HIGH) delay (100) printf (ldquoEsoerenrdquo)

void aturaTransit()printf(ldquoAturanteltraficldquo)fflush(stdout)digitalWrite(VERD0) digitalWrite (GROC 1) delay (2000) digitalWrite (GROC 0) digitalWrite(VERMELL1) delay (2000) printf (ldquoAturatsnrdquo)

void camina ()printf(ldquoCaminaldquo)fflush(stdout)

digitalWrite(VERMELL_HOME0)digitalWrite(VERD_HOME1) delay (10000) digitalWrite(VERMELL0) digitalWrite (GROC 1)

printf (ldquoJa han caminatnrdquo)

void tempsEspera () int i

printf (ldquoTemps drsquoespera ldquo) fflush(stdout)

for (i = 0 i lt 8 ++i)

27

delay (500) digitalWrite(VERD_HOME0) digitalWrite (GROC 0) delay (500) digitalWrite(VERD_HOME1) digitalWrite (GROC 1)

void iniciaTransit ()printf(ldquoInicianttraficldquo)fflush(stdout)

digitalWrite(VERD_HOME0)digitalWrite(VERMELL_HOME1) delay (500) digitalWrite (GROC 0) digitalWrite(VERD1)

Deixem via lliure pels vehicles i posem el semagrave-for vermell pels vianants

Proposta Utilitzant el que has apregraves en aquest bloc crear un projecte amb uns quants LEDs en fila que srsquoactivin ascendentment quan apretes un botoacute

28

73 Bloc 3 (Alt)731 Sistema portes logravegiques I

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int AND (int a int b) return a ampamp b

int OR (int a int b) return a || b

int NEGADA (int a) return a

int f(int a int b) return OR(AND(NE-GADA(a)b)AND(aNEGADA(b))) f(a b) = arsquob + abrsquo

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5

int apretat_A = 0 int apretat_B = 0

pinMode(pin_LED_S OUTPUT) pinMode(pin_boto_A INPUT) pinMode(pin_boto_B INPUT)

Crearem una funcioacute per a cada porta logravegica de tal manera que sigui meacutes fagravecil poder-ho aplicar despreacutes

Aquesta seragrave la foacutermula que compliragrave la taula de la veritat en aquest cas eacutes f(a b) = arsquob +abrsquo

Creem dos booleans (variables que poden ser 0 o 1) que ens indicaran si el botoacute ha estat premut o no

Declarem els pins drsquoentrada i de sortida com a totes les pragravectiques anteriors

El seguumlent projecte fa la mateixa funcioacute que acon-seguiriacuteem amb xips de portes logravegiques perograve fent els cagravelculs a partir de la RaspberryPi En aquest cas compleix la taula de la veritat drsquoun OR ex-clusive eacutes a dir nomeacutes srsquoencendragrave el LED quan premem un dels dos botons mai srsquoencendragrave 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 srsquoutilitzin en el codi

29

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) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins estan premuts

Comprovem quins no estan premuts

I apliquem la foacutermula amb els valors drsquoentrada cor-responents Si la foacutermula eacutes igual a 1 srsquoencendragrave el LED si no no srsquoencendragrave

732 Sistema portes logravegiques II

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

Partim de la mateixa base que la pragravectica ante-rior perograve en aquesta incloem una tercera variable drsquoentrada Aixiacute que hem drsquoafegir un nou botoacute en el pin del GPIO que srsquoescau

30

Seguim el patroacute de les foacutermules emprades a la pragravectica anterior

En aquest cas tenim tres variables drsquoentrada perograve la mecagravenica eacutes la mateixa Es pot jugar amb la foacutermula i anar provant diferents combinacions

Necessitem tres variables ja que hi ha tres botons

Declaracions

Comprovem quins estan premuts

int AND (int a int b) return a ampamp b

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 + arsquob

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5 int pin_boto_C = 6

int apretat_A = 0 int apretat_B = 0 int apretat_C = 0

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

31

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

Mostra resultat if (f(apretat_A apretat_B apretat_C) == 1) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins no estan premuts

Com al circuit anterior apliquem la foacutermula i si aquesta doacutena 1 encenem el LED

Proposta Ara que ja has apregraves els conceptes meacutes fonamentals de la CodePi inventarsquot un circuit amb el nivell de dificultat que consideris No et quedis amb el que se trsquoha ensenyat aquiacute sinoacute que cerca meacutes megravetodes que puguis utilitzar La creativitat eacutes bagravesica per a tot bon enginyer i amb aquesta pragravectica volem que demostris de quegrave ets capaccedil

32

8 Vols saber-ne meacutes El moacuten de la programacioacute i lrsquoelectrogravenica eacutes infinit La comunitat geek (= interessada) en aquests te-mes eacutes una de les meacutes servicials i altruista de tota la xarxa aixiacute que es poden trobar una quantitat inacabable de tutorials i pagravegines web especialitza-des en el que vulguem saber

81 Programari lliureEl programari lliure eacutes la base de la informagravetica ac-tual i encara juga un gran paper en algunes agraverees com els servidors web o els mogravebils amb sistema operatiu Android Aquiacute teniu un conjunt de pagravegines on podeu aprofundir sobre aquest apassionant moacuten de la llibertat digital

httpcawikipediaorgwikiRichard_Matthew_Stallmanhttpwwwfsforghttpwwwgnuorghttpwwwlinuxorghttpwwwunixorghttpwwwubuntucom

82 Raspberry PiSi desitges saber meacutes sobre el projecte sense agravenim de lucre Raspberry Pi i seguir fent projectes amb ella visita les pagines que trobaragraves a con-tinuacioacute Aquestes et donaran idees de quegrave fer amb aquest petit perograve fascinant ordinador

httplearnadafruitcomcategorylearn-raspber-ry-pihttpwwwraspberrypiorgwwwraspberrypiorghttpdangerousprototypescom20130202rasp-berry-pi-supercomputerhttpreviewscnetcoukdesktops25-fun-things-to-do-with-a-raspberry-pi-50009851httplearnadafruitcompi-thermal-printer

33

83 Electrogravenica Si lrsquoelectrogravenica bagravesica que has apregraves durant els tutorials de la CodePi trsquoha fet veure que aquest eacutes el moacuten que a tu trsquoagrada no paris A continu-acioacute et deixem pagravegines web on trobaragraves les bases de lrsquoelectrogravenica meacutes complexa i tambeacute molts nous circuits per muntar i seguir descobrint aquest moacuten que avui en dia fa que tots els aparells endollats a al corrent puguin funcionar

httpwwwinstructablescomidBeginners-Elec-tronics-ProjectshttpwwwinstructablescomidElectronic-Proj-ects-For-Beginnershttpwwwcircuitstodaycomsimple-electron-ics-projects-and-circuitshttpswwwsparkfuncomtutorialshttplearnadafruitcom

84 ProgramacioacuteDiuen que per ser un bon programador srsquohan de tenir unes habilitats que no tothom teacute disciplina ordre logravegica creativitat capacitat per resoldre qualsevol problema i per sobre de tot persistegravencia i passioacute Si creus que tens aquestes qualitats do-na-li una oportunitat a la programacioacute A continu-acioacute et deixem un recull de les pagravegines web que creiem que meacutes et poden ajudar a introduir-te una mica meacutes en la programacioacute web i la drsquoapli-cacions per a mogravebils

httpwwwcodeorghttpscratchmiteduhttpwwwcodecademycom

34

9 GlossariC (llenguatge de programacioacute) Des de la seva creacioacute lrsquoany 1972 srsquoha consolidat com un dels llenguatges de programacioacute meacutes utilitzats per fer aplicacions de software Eacutes considerat un dels meacutes bagravesics i meacutes comuns per introduir-se a la pro-gramacioacute Les grans companyies han utilitzat el C com a base per crear altres llenguatges com lrsquoObjective-C (utilitzat per fer les aplicacions per dispositius drsquoApple) o el C (creat per Microsoft i utilitzat entre altres coses per fer programes in-formagravetics per Windows)

Condensador Component electrogravenic classificat dins del grup dels passius i que per tant no emet cap senyal El podriacuteem definir com un acumula-dor drsquoelectrons que els deixa anar quan arriba a la seva capacitat magravexima Hi ha condensadors de dos tipus els electroliacutetics i els normals En les pragravec-tiques utilitzarem electroliacutetics i com que aquests tenen polaritat eacutes important tenir en compte quina eacutes la pota positiva i quina eacutes la negativa a lrsquohora de connectar-lo

Diacuteode Component electrogravenic passiu Teacute polaritat i seria lrsquoequivalent a una vagravelvula antiretorn lrsquoelec-tricitat nomeacutes pot anar en un sentit

Electrogravenica Disciplina que estudia els com-ponents electrogravenics que funcionen amb un flux drsquoelectrons (corrent continua)

Funcioacute Fragment de codi que conte un seguit drsquoaccions i que hi pots accedir cridant la funcioacute en comptes de repetint el codi Podriacuteem comparar-ho amb una funcioacute matemagravetica en la que tenim vari-ables drsquoentrada que tractant-les a la funcioacute ob-tenim una informacioacute de sortida

GPIO Soacuten les sigles de ldquoGeneral Purpose InputOutputrdquo Si mirem la Raspberry Pi soacuten els pins de sortida on hi connectem els cables amb els que programem la placa electrogravenica Lrsquoavantatge drsquoaquest tipus de connector respecte altres eacutes que es pot gestionar mitjanccedilant programacioacute i aixograve eacutes precisament el que explicarem en aquest manual

35

HDMI Soacuten les sigles de ldquoHigh-Definition Multime-dia Interfacerdquo Serveix per enviar viacutedeo i agraveudio a una pantalla Nosaltres lrsquoutilitzarem per connectar la RaspberryPi a una pantalla

LED Acrogravenim de ldquoLight Emitting Dioderdquo Eacutes un tipus de diacuteode el qual teacute una pelmiddotliacutecula de fogravesfor entre els dos connectors que fa que quan passi el corrent generi llum Com qualsevol altre diacuteode eacutes important tenir en compte la polaritat

RAM Acrogravenim de ldquoRandom Access Memoryrdquo Eacutes la part de lrsquoordinador encarregada drsquoemmagatze-mar els arxius temporals

RCA El connector RCA consisteix en diferents cables amb la punta de diferent color que serveix-en per transmetre agraveudio i viacutedeo

ROM De lrsquoanglegraves ldquoRead Only Memoryrdquo eacutes la uni-tat de memograveria on es guarda el sistema operatiu

Resistegravencia Eacutes un component electrogravenic que teacute com a funcioacute reduir el flux drsquoelectrons afi de controlar la seva potegravencia Eacutes molt comuacute a lrsquoelectrogravenica ja que eacutes molt necessari per assegu-rar-nos del correcte funcionament drsquoelements com el LED que sense una resistegravencia que limiteacutes el corrent podrien cremar-se

Placa base Eacutes la part de lrsquoordinador que conteacute elements com la RAM la ROM o el microproces-sador La placa base de lrsquoordinador que constru-irem amb aquest manual seria la progravepia Raspber-ry Pi

Protoboard Tambeacute coneguda com a Bread-board srsquoutilitza per crear circuits electrogravenics sense necessitat de soldar Per saber com funcio-na i com estan relacionats els diferents contactes consulteu aquesta webhttprduinostarcomdocumentaciongeneralpro-toboard-que-es-y-como-funciona

36

Terminal Eacutes el programa emprat per enviar ordres directes a lrsquoordinador i rebre respostes drsquoaquest Nosaltres lrsquoutilitzarem per instalmiddotlar els programes necessaris per programar les plaques electrograveniques i altres arxius necessaris

Variable Valor que canvia segons les operacions que es facin amb aquest al programa informagravetic Com ja sabeu hi ha variables independents (pe el temps) i dependents (pe si estagrave o no encegraves un LED que dependragrave drsquoaltres variables)

37

  • httpwwwfsforg
Page 27: CodePi

27

delay (500) digitalWrite(VERD_HOME0) digitalWrite (GROC 0) delay (500) digitalWrite(VERD_HOME1) digitalWrite (GROC 1)

void iniciaTransit ()printf(ldquoInicianttraficldquo)fflush(stdout)

digitalWrite(VERD_HOME0)digitalWrite(VERMELL_HOME1) delay (500) digitalWrite (GROC 0) digitalWrite(VERD1)

Deixem via lliure pels vehicles i posem el semagrave-for vermell pels vianants

Proposta Utilitzant el que has apregraves en aquest bloc crear un projecte amb uns quants LEDs en fila que srsquoactivin ascendentment quan apretes un botoacute

28

73 Bloc 3 (Alt)731 Sistema portes logravegiques I

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int AND (int a int b) return a ampamp b

int OR (int a int b) return a || b

int NEGADA (int a) return a

int f(int a int b) return OR(AND(NE-GADA(a)b)AND(aNEGADA(b))) f(a b) = arsquob + abrsquo

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5

int apretat_A = 0 int apretat_B = 0

pinMode(pin_LED_S OUTPUT) pinMode(pin_boto_A INPUT) pinMode(pin_boto_B INPUT)

Crearem una funcioacute per a cada porta logravegica de tal manera que sigui meacutes fagravecil poder-ho aplicar despreacutes

Aquesta seragrave la foacutermula que compliragrave la taula de la veritat en aquest cas eacutes f(a b) = arsquob +abrsquo

Creem dos booleans (variables que poden ser 0 o 1) que ens indicaran si el botoacute ha estat premut o no

Declarem els pins drsquoentrada i de sortida com a totes les pragravectiques anteriors

El seguumlent projecte fa la mateixa funcioacute que acon-seguiriacuteem amb xips de portes logravegiques perograve fent els cagravelculs a partir de la RaspberryPi En aquest cas compleix la taula de la veritat drsquoun OR ex-clusive eacutes a dir nomeacutes srsquoencendragrave el LED quan premem un dels dos botons mai srsquoencendragrave 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 srsquoutilitzin en el codi

29

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) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins estan premuts

Comprovem quins no estan premuts

I apliquem la foacutermula amb els valors drsquoentrada cor-responents Si la foacutermula eacutes igual a 1 srsquoencendragrave el LED si no no srsquoencendragrave

732 Sistema portes logravegiques II

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

Partim de la mateixa base que la pragravectica ante-rior perograve en aquesta incloem una tercera variable drsquoentrada Aixiacute que hem drsquoafegir un nou botoacute en el pin del GPIO que srsquoescau

30

Seguim el patroacute de les foacutermules emprades a la pragravectica anterior

En aquest cas tenim tres variables drsquoentrada perograve la mecagravenica eacutes la mateixa Es pot jugar amb la foacutermula i anar provant diferents combinacions

Necessitem tres variables ja que hi ha tres botons

Declaracions

Comprovem quins estan premuts

int AND (int a int b) return a ampamp b

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 + arsquob

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5 int pin_boto_C = 6

int apretat_A = 0 int apretat_B = 0 int apretat_C = 0

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

31

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

Mostra resultat if (f(apretat_A apretat_B apretat_C) == 1) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins no estan premuts

Com al circuit anterior apliquem la foacutermula i si aquesta doacutena 1 encenem el LED

Proposta Ara que ja has apregraves els conceptes meacutes fonamentals de la CodePi inventarsquot un circuit amb el nivell de dificultat que consideris No et quedis amb el que se trsquoha ensenyat aquiacute sinoacute que cerca meacutes megravetodes que puguis utilitzar La creativitat eacutes bagravesica per a tot bon enginyer i amb aquesta pragravectica volem que demostris de quegrave ets capaccedil

32

8 Vols saber-ne meacutes El moacuten de la programacioacute i lrsquoelectrogravenica eacutes infinit La comunitat geek (= interessada) en aquests te-mes eacutes una de les meacutes servicials i altruista de tota la xarxa aixiacute que es poden trobar una quantitat inacabable de tutorials i pagravegines web especialitza-des en el que vulguem saber

81 Programari lliureEl programari lliure eacutes la base de la informagravetica ac-tual i encara juga un gran paper en algunes agraverees com els servidors web o els mogravebils amb sistema operatiu Android Aquiacute teniu un conjunt de pagravegines on podeu aprofundir sobre aquest apassionant moacuten de la llibertat digital

httpcawikipediaorgwikiRichard_Matthew_Stallmanhttpwwwfsforghttpwwwgnuorghttpwwwlinuxorghttpwwwunixorghttpwwwubuntucom

82 Raspberry PiSi desitges saber meacutes sobre el projecte sense agravenim de lucre Raspberry Pi i seguir fent projectes amb ella visita les pagines que trobaragraves a con-tinuacioacute Aquestes et donaran idees de quegrave fer amb aquest petit perograve fascinant ordinador

httplearnadafruitcomcategorylearn-raspber-ry-pihttpwwwraspberrypiorgwwwraspberrypiorghttpdangerousprototypescom20130202rasp-berry-pi-supercomputerhttpreviewscnetcoukdesktops25-fun-things-to-do-with-a-raspberry-pi-50009851httplearnadafruitcompi-thermal-printer

33

83 Electrogravenica Si lrsquoelectrogravenica bagravesica que has apregraves durant els tutorials de la CodePi trsquoha fet veure que aquest eacutes el moacuten que a tu trsquoagrada no paris A continu-acioacute et deixem pagravegines web on trobaragraves les bases de lrsquoelectrogravenica meacutes complexa i tambeacute molts nous circuits per muntar i seguir descobrint aquest moacuten que avui en dia fa que tots els aparells endollats a al corrent puguin funcionar

httpwwwinstructablescomidBeginners-Elec-tronics-ProjectshttpwwwinstructablescomidElectronic-Proj-ects-For-Beginnershttpwwwcircuitstodaycomsimple-electron-ics-projects-and-circuitshttpswwwsparkfuncomtutorialshttplearnadafruitcom

84 ProgramacioacuteDiuen que per ser un bon programador srsquohan de tenir unes habilitats que no tothom teacute disciplina ordre logravegica creativitat capacitat per resoldre qualsevol problema i per sobre de tot persistegravencia i passioacute Si creus que tens aquestes qualitats do-na-li una oportunitat a la programacioacute A continu-acioacute et deixem un recull de les pagravegines web que creiem que meacutes et poden ajudar a introduir-te una mica meacutes en la programacioacute web i la drsquoapli-cacions per a mogravebils

httpwwwcodeorghttpscratchmiteduhttpwwwcodecademycom

34

9 GlossariC (llenguatge de programacioacute) Des de la seva creacioacute lrsquoany 1972 srsquoha consolidat com un dels llenguatges de programacioacute meacutes utilitzats per fer aplicacions de software Eacutes considerat un dels meacutes bagravesics i meacutes comuns per introduir-se a la pro-gramacioacute Les grans companyies han utilitzat el C com a base per crear altres llenguatges com lrsquoObjective-C (utilitzat per fer les aplicacions per dispositius drsquoApple) o el C (creat per Microsoft i utilitzat entre altres coses per fer programes in-formagravetics per Windows)

Condensador Component electrogravenic classificat dins del grup dels passius i que per tant no emet cap senyal El podriacuteem definir com un acumula-dor drsquoelectrons que els deixa anar quan arriba a la seva capacitat magravexima Hi ha condensadors de dos tipus els electroliacutetics i els normals En les pragravec-tiques utilitzarem electroliacutetics i com que aquests tenen polaritat eacutes important tenir en compte quina eacutes la pota positiva i quina eacutes la negativa a lrsquohora de connectar-lo

Diacuteode Component electrogravenic passiu Teacute polaritat i seria lrsquoequivalent a una vagravelvula antiretorn lrsquoelec-tricitat nomeacutes pot anar en un sentit

Electrogravenica Disciplina que estudia els com-ponents electrogravenics que funcionen amb un flux drsquoelectrons (corrent continua)

Funcioacute Fragment de codi que conte un seguit drsquoaccions i que hi pots accedir cridant la funcioacute en comptes de repetint el codi Podriacuteem comparar-ho amb una funcioacute matemagravetica en la que tenim vari-ables drsquoentrada que tractant-les a la funcioacute ob-tenim una informacioacute de sortida

GPIO Soacuten les sigles de ldquoGeneral Purpose InputOutputrdquo Si mirem la Raspberry Pi soacuten els pins de sortida on hi connectem els cables amb els que programem la placa electrogravenica Lrsquoavantatge drsquoaquest tipus de connector respecte altres eacutes que es pot gestionar mitjanccedilant programacioacute i aixograve eacutes precisament el que explicarem en aquest manual

35

HDMI Soacuten les sigles de ldquoHigh-Definition Multime-dia Interfacerdquo Serveix per enviar viacutedeo i agraveudio a una pantalla Nosaltres lrsquoutilitzarem per connectar la RaspberryPi a una pantalla

LED Acrogravenim de ldquoLight Emitting Dioderdquo Eacutes un tipus de diacuteode el qual teacute una pelmiddotliacutecula de fogravesfor entre els dos connectors que fa que quan passi el corrent generi llum Com qualsevol altre diacuteode eacutes important tenir en compte la polaritat

RAM Acrogravenim de ldquoRandom Access Memoryrdquo Eacutes la part de lrsquoordinador encarregada drsquoemmagatze-mar els arxius temporals

RCA El connector RCA consisteix en diferents cables amb la punta de diferent color que serveix-en per transmetre agraveudio i viacutedeo

ROM De lrsquoanglegraves ldquoRead Only Memoryrdquo eacutes la uni-tat de memograveria on es guarda el sistema operatiu

Resistegravencia Eacutes un component electrogravenic que teacute com a funcioacute reduir el flux drsquoelectrons afi de controlar la seva potegravencia Eacutes molt comuacute a lrsquoelectrogravenica ja que eacutes molt necessari per assegu-rar-nos del correcte funcionament drsquoelements com el LED que sense una resistegravencia que limiteacutes el corrent podrien cremar-se

Placa base Eacutes la part de lrsquoordinador que conteacute elements com la RAM la ROM o el microproces-sador La placa base de lrsquoordinador que constru-irem amb aquest manual seria la progravepia Raspber-ry Pi

Protoboard Tambeacute coneguda com a Bread-board srsquoutilitza per crear circuits electrogravenics sense necessitat de soldar Per saber com funcio-na i com estan relacionats els diferents contactes consulteu aquesta webhttprduinostarcomdocumentaciongeneralpro-toboard-que-es-y-como-funciona

36

Terminal Eacutes el programa emprat per enviar ordres directes a lrsquoordinador i rebre respostes drsquoaquest Nosaltres lrsquoutilitzarem per instalmiddotlar els programes necessaris per programar les plaques electrograveniques i altres arxius necessaris

Variable Valor que canvia segons les operacions que es facin amb aquest al programa informagravetic Com ja sabeu hi ha variables independents (pe el temps) i dependents (pe si estagrave o no encegraves un LED que dependragrave drsquoaltres variables)

37

  • httpwwwfsforg
Page 28: CodePi

28

73 Bloc 3 (Alt)731 Sistema portes logravegiques I

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

int AND (int a int b) return a ampamp b

int OR (int a int b) return a || b

int NEGADA (int a) return a

int f(int a int b) return OR(AND(NE-GADA(a)b)AND(aNEGADA(b))) f(a b) = arsquob + abrsquo

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5

int apretat_A = 0 int apretat_B = 0

pinMode(pin_LED_S OUTPUT) pinMode(pin_boto_A INPUT) pinMode(pin_boto_B INPUT)

Crearem una funcioacute per a cada porta logravegica de tal manera que sigui meacutes fagravecil poder-ho aplicar despreacutes

Aquesta seragrave la foacutermula que compliragrave la taula de la veritat en aquest cas eacutes f(a b) = arsquob +abrsquo

Creem dos booleans (variables que poden ser 0 o 1) que ens indicaran si el botoacute ha estat premut o no

Declarem els pins drsquoentrada i de sortida com a totes les pragravectiques anteriors

El seguumlent projecte fa la mateixa funcioacute que acon-seguiriacuteem amb xips de portes logravegiques perograve fent els cagravelculs a partir de la RaspberryPi En aquest cas compleix la taula de la veritat drsquoun OR ex-clusive eacutes a dir nomeacutes srsquoencendragrave el LED quan premem un dels dos botons mai srsquoencendragrave 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 srsquoutilitzin en el codi

29

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) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins estan premuts

Comprovem quins no estan premuts

I apliquem la foacutermula amb els valors drsquoentrada cor-responents Si la foacutermula eacutes igual a 1 srsquoencendragrave el LED si no no srsquoencendragrave

732 Sistema portes logravegiques II

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

Partim de la mateixa base que la pragravectica ante-rior perograve en aquesta incloem una tercera variable drsquoentrada Aixiacute que hem drsquoafegir un nou botoacute en el pin del GPIO que srsquoescau

30

Seguim el patroacute de les foacutermules emprades a la pragravectica anterior

En aquest cas tenim tres variables drsquoentrada perograve la mecagravenica eacutes la mateixa Es pot jugar amb la foacutermula i anar provant diferents combinacions

Necessitem tres variables ja que hi ha tres botons

Declaracions

Comprovem quins estan premuts

int AND (int a int b) return a ampamp b

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 + arsquob

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5 int pin_boto_C = 6

int apretat_A = 0 int apretat_B = 0 int apretat_C = 0

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

31

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

Mostra resultat if (f(apretat_A apretat_B apretat_C) == 1) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins no estan premuts

Com al circuit anterior apliquem la foacutermula i si aquesta doacutena 1 encenem el LED

Proposta Ara que ja has apregraves els conceptes meacutes fonamentals de la CodePi inventarsquot un circuit amb el nivell de dificultat que consideris No et quedis amb el que se trsquoha ensenyat aquiacute sinoacute que cerca meacutes megravetodes que puguis utilitzar La creativitat eacutes bagravesica per a tot bon enginyer i amb aquesta pragravectica volem que demostris de quegrave ets capaccedil

32

8 Vols saber-ne meacutes El moacuten de la programacioacute i lrsquoelectrogravenica eacutes infinit La comunitat geek (= interessada) en aquests te-mes eacutes una de les meacutes servicials i altruista de tota la xarxa aixiacute que es poden trobar una quantitat inacabable de tutorials i pagravegines web especialitza-des en el que vulguem saber

81 Programari lliureEl programari lliure eacutes la base de la informagravetica ac-tual i encara juga un gran paper en algunes agraverees com els servidors web o els mogravebils amb sistema operatiu Android Aquiacute teniu un conjunt de pagravegines on podeu aprofundir sobre aquest apassionant moacuten de la llibertat digital

httpcawikipediaorgwikiRichard_Matthew_Stallmanhttpwwwfsforghttpwwwgnuorghttpwwwlinuxorghttpwwwunixorghttpwwwubuntucom

82 Raspberry PiSi desitges saber meacutes sobre el projecte sense agravenim de lucre Raspberry Pi i seguir fent projectes amb ella visita les pagines que trobaragraves a con-tinuacioacute Aquestes et donaran idees de quegrave fer amb aquest petit perograve fascinant ordinador

httplearnadafruitcomcategorylearn-raspber-ry-pihttpwwwraspberrypiorgwwwraspberrypiorghttpdangerousprototypescom20130202rasp-berry-pi-supercomputerhttpreviewscnetcoukdesktops25-fun-things-to-do-with-a-raspberry-pi-50009851httplearnadafruitcompi-thermal-printer

33

83 Electrogravenica Si lrsquoelectrogravenica bagravesica que has apregraves durant els tutorials de la CodePi trsquoha fet veure que aquest eacutes el moacuten que a tu trsquoagrada no paris A continu-acioacute et deixem pagravegines web on trobaragraves les bases de lrsquoelectrogravenica meacutes complexa i tambeacute molts nous circuits per muntar i seguir descobrint aquest moacuten que avui en dia fa que tots els aparells endollats a al corrent puguin funcionar

httpwwwinstructablescomidBeginners-Elec-tronics-ProjectshttpwwwinstructablescomidElectronic-Proj-ects-For-Beginnershttpwwwcircuitstodaycomsimple-electron-ics-projects-and-circuitshttpswwwsparkfuncomtutorialshttplearnadafruitcom

84 ProgramacioacuteDiuen que per ser un bon programador srsquohan de tenir unes habilitats que no tothom teacute disciplina ordre logravegica creativitat capacitat per resoldre qualsevol problema i per sobre de tot persistegravencia i passioacute Si creus que tens aquestes qualitats do-na-li una oportunitat a la programacioacute A continu-acioacute et deixem un recull de les pagravegines web que creiem que meacutes et poden ajudar a introduir-te una mica meacutes en la programacioacute web i la drsquoapli-cacions per a mogravebils

httpwwwcodeorghttpscratchmiteduhttpwwwcodecademycom

34

9 GlossariC (llenguatge de programacioacute) Des de la seva creacioacute lrsquoany 1972 srsquoha consolidat com un dels llenguatges de programacioacute meacutes utilitzats per fer aplicacions de software Eacutes considerat un dels meacutes bagravesics i meacutes comuns per introduir-se a la pro-gramacioacute Les grans companyies han utilitzat el C com a base per crear altres llenguatges com lrsquoObjective-C (utilitzat per fer les aplicacions per dispositius drsquoApple) o el C (creat per Microsoft i utilitzat entre altres coses per fer programes in-formagravetics per Windows)

Condensador Component electrogravenic classificat dins del grup dels passius i que per tant no emet cap senyal El podriacuteem definir com un acumula-dor drsquoelectrons que els deixa anar quan arriba a la seva capacitat magravexima Hi ha condensadors de dos tipus els electroliacutetics i els normals En les pragravec-tiques utilitzarem electroliacutetics i com que aquests tenen polaritat eacutes important tenir en compte quina eacutes la pota positiva i quina eacutes la negativa a lrsquohora de connectar-lo

Diacuteode Component electrogravenic passiu Teacute polaritat i seria lrsquoequivalent a una vagravelvula antiretorn lrsquoelec-tricitat nomeacutes pot anar en un sentit

Electrogravenica Disciplina que estudia els com-ponents electrogravenics que funcionen amb un flux drsquoelectrons (corrent continua)

Funcioacute Fragment de codi que conte un seguit drsquoaccions i que hi pots accedir cridant la funcioacute en comptes de repetint el codi Podriacuteem comparar-ho amb una funcioacute matemagravetica en la que tenim vari-ables drsquoentrada que tractant-les a la funcioacute ob-tenim una informacioacute de sortida

GPIO Soacuten les sigles de ldquoGeneral Purpose InputOutputrdquo Si mirem la Raspberry Pi soacuten els pins de sortida on hi connectem els cables amb els que programem la placa electrogravenica Lrsquoavantatge drsquoaquest tipus de connector respecte altres eacutes que es pot gestionar mitjanccedilant programacioacute i aixograve eacutes precisament el que explicarem en aquest manual

35

HDMI Soacuten les sigles de ldquoHigh-Definition Multime-dia Interfacerdquo Serveix per enviar viacutedeo i agraveudio a una pantalla Nosaltres lrsquoutilitzarem per connectar la RaspberryPi a una pantalla

LED Acrogravenim de ldquoLight Emitting Dioderdquo Eacutes un tipus de diacuteode el qual teacute una pelmiddotliacutecula de fogravesfor entre els dos connectors que fa que quan passi el corrent generi llum Com qualsevol altre diacuteode eacutes important tenir en compte la polaritat

RAM Acrogravenim de ldquoRandom Access Memoryrdquo Eacutes la part de lrsquoordinador encarregada drsquoemmagatze-mar els arxius temporals

RCA El connector RCA consisteix en diferents cables amb la punta de diferent color que serveix-en per transmetre agraveudio i viacutedeo

ROM De lrsquoanglegraves ldquoRead Only Memoryrdquo eacutes la uni-tat de memograveria on es guarda el sistema operatiu

Resistegravencia Eacutes un component electrogravenic que teacute com a funcioacute reduir el flux drsquoelectrons afi de controlar la seva potegravencia Eacutes molt comuacute a lrsquoelectrogravenica ja que eacutes molt necessari per assegu-rar-nos del correcte funcionament drsquoelements com el LED que sense una resistegravencia que limiteacutes el corrent podrien cremar-se

Placa base Eacutes la part de lrsquoordinador que conteacute elements com la RAM la ROM o el microproces-sador La placa base de lrsquoordinador que constru-irem amb aquest manual seria la progravepia Raspber-ry Pi

Protoboard Tambeacute coneguda com a Bread-board srsquoutilitza per crear circuits electrogravenics sense necessitat de soldar Per saber com funcio-na i com estan relacionats els diferents contactes consulteu aquesta webhttprduinostarcomdocumentaciongeneralpro-toboard-que-es-y-como-funciona

36

Terminal Eacutes el programa emprat per enviar ordres directes a lrsquoordinador i rebre respostes drsquoaquest Nosaltres lrsquoutilitzarem per instalmiddotlar els programes necessaris per programar les plaques electrograveniques i altres arxius necessaris

Variable Valor que canvia segons les operacions que es facin amb aquest al programa informagravetic Com ja sabeu hi ha variables independents (pe el temps) i dependents (pe si estagrave o no encegraves un LED que dependragrave drsquoaltres variables)

37

  • httpwwwfsforg
Page 29: CodePi

29

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) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins estan premuts

Comprovem quins no estan premuts

I apliquem la foacutermula amb els valors drsquoentrada cor-responents Si la foacutermula eacutes igual a 1 srsquoencendragrave el LED si no no srsquoencendragrave

732 Sistema portes logravegiques II

include ltstdiohgtinclude ltstdlibhgtinclude ltunistdhgtinclude ltwiringPihgt

Partim de la mateixa base que la pragravectica ante-rior perograve en aquesta incloem una tercera variable drsquoentrada Aixiacute que hem drsquoafegir un nou botoacute en el pin del GPIO que srsquoescau

30

Seguim el patroacute de les foacutermules emprades a la pragravectica anterior

En aquest cas tenim tres variables drsquoentrada perograve la mecagravenica eacutes la mateixa Es pot jugar amb la foacutermula i anar provant diferents combinacions

Necessitem tres variables ja que hi ha tres botons

Declaracions

Comprovem quins estan premuts

int AND (int a int b) return a ampamp b

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 + arsquob

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5 int pin_boto_C = 6

int apretat_A = 0 int apretat_B = 0 int apretat_C = 0

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

31

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

Mostra resultat if (f(apretat_A apretat_B apretat_C) == 1) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins no estan premuts

Com al circuit anterior apliquem la foacutermula i si aquesta doacutena 1 encenem el LED

Proposta Ara que ja has apregraves els conceptes meacutes fonamentals de la CodePi inventarsquot un circuit amb el nivell de dificultat que consideris No et quedis amb el que se trsquoha ensenyat aquiacute sinoacute que cerca meacutes megravetodes que puguis utilitzar La creativitat eacutes bagravesica per a tot bon enginyer i amb aquesta pragravectica volem que demostris de quegrave ets capaccedil

32

8 Vols saber-ne meacutes El moacuten de la programacioacute i lrsquoelectrogravenica eacutes infinit La comunitat geek (= interessada) en aquests te-mes eacutes una de les meacutes servicials i altruista de tota la xarxa aixiacute que es poden trobar una quantitat inacabable de tutorials i pagravegines web especialitza-des en el que vulguem saber

81 Programari lliureEl programari lliure eacutes la base de la informagravetica ac-tual i encara juga un gran paper en algunes agraverees com els servidors web o els mogravebils amb sistema operatiu Android Aquiacute teniu un conjunt de pagravegines on podeu aprofundir sobre aquest apassionant moacuten de la llibertat digital

httpcawikipediaorgwikiRichard_Matthew_Stallmanhttpwwwfsforghttpwwwgnuorghttpwwwlinuxorghttpwwwunixorghttpwwwubuntucom

82 Raspberry PiSi desitges saber meacutes sobre el projecte sense agravenim de lucre Raspberry Pi i seguir fent projectes amb ella visita les pagines que trobaragraves a con-tinuacioacute Aquestes et donaran idees de quegrave fer amb aquest petit perograve fascinant ordinador

httplearnadafruitcomcategorylearn-raspber-ry-pihttpwwwraspberrypiorgwwwraspberrypiorghttpdangerousprototypescom20130202rasp-berry-pi-supercomputerhttpreviewscnetcoukdesktops25-fun-things-to-do-with-a-raspberry-pi-50009851httplearnadafruitcompi-thermal-printer

33

83 Electrogravenica Si lrsquoelectrogravenica bagravesica que has apregraves durant els tutorials de la CodePi trsquoha fet veure que aquest eacutes el moacuten que a tu trsquoagrada no paris A continu-acioacute et deixem pagravegines web on trobaragraves les bases de lrsquoelectrogravenica meacutes complexa i tambeacute molts nous circuits per muntar i seguir descobrint aquest moacuten que avui en dia fa que tots els aparells endollats a al corrent puguin funcionar

httpwwwinstructablescomidBeginners-Elec-tronics-ProjectshttpwwwinstructablescomidElectronic-Proj-ects-For-Beginnershttpwwwcircuitstodaycomsimple-electron-ics-projects-and-circuitshttpswwwsparkfuncomtutorialshttplearnadafruitcom

84 ProgramacioacuteDiuen que per ser un bon programador srsquohan de tenir unes habilitats que no tothom teacute disciplina ordre logravegica creativitat capacitat per resoldre qualsevol problema i per sobre de tot persistegravencia i passioacute Si creus que tens aquestes qualitats do-na-li una oportunitat a la programacioacute A continu-acioacute et deixem un recull de les pagravegines web que creiem que meacutes et poden ajudar a introduir-te una mica meacutes en la programacioacute web i la drsquoapli-cacions per a mogravebils

httpwwwcodeorghttpscratchmiteduhttpwwwcodecademycom

34

9 GlossariC (llenguatge de programacioacute) Des de la seva creacioacute lrsquoany 1972 srsquoha consolidat com un dels llenguatges de programacioacute meacutes utilitzats per fer aplicacions de software Eacutes considerat un dels meacutes bagravesics i meacutes comuns per introduir-se a la pro-gramacioacute Les grans companyies han utilitzat el C com a base per crear altres llenguatges com lrsquoObjective-C (utilitzat per fer les aplicacions per dispositius drsquoApple) o el C (creat per Microsoft i utilitzat entre altres coses per fer programes in-formagravetics per Windows)

Condensador Component electrogravenic classificat dins del grup dels passius i que per tant no emet cap senyal El podriacuteem definir com un acumula-dor drsquoelectrons que els deixa anar quan arriba a la seva capacitat magravexima Hi ha condensadors de dos tipus els electroliacutetics i els normals En les pragravec-tiques utilitzarem electroliacutetics i com que aquests tenen polaritat eacutes important tenir en compte quina eacutes la pota positiva i quina eacutes la negativa a lrsquohora de connectar-lo

Diacuteode Component electrogravenic passiu Teacute polaritat i seria lrsquoequivalent a una vagravelvula antiretorn lrsquoelec-tricitat nomeacutes pot anar en un sentit

Electrogravenica Disciplina que estudia els com-ponents electrogravenics que funcionen amb un flux drsquoelectrons (corrent continua)

Funcioacute Fragment de codi que conte un seguit drsquoaccions i que hi pots accedir cridant la funcioacute en comptes de repetint el codi Podriacuteem comparar-ho amb una funcioacute matemagravetica en la que tenim vari-ables drsquoentrada que tractant-les a la funcioacute ob-tenim una informacioacute de sortida

GPIO Soacuten les sigles de ldquoGeneral Purpose InputOutputrdquo Si mirem la Raspberry Pi soacuten els pins de sortida on hi connectem els cables amb els que programem la placa electrogravenica Lrsquoavantatge drsquoaquest tipus de connector respecte altres eacutes que es pot gestionar mitjanccedilant programacioacute i aixograve eacutes precisament el que explicarem en aquest manual

35

HDMI Soacuten les sigles de ldquoHigh-Definition Multime-dia Interfacerdquo Serveix per enviar viacutedeo i agraveudio a una pantalla Nosaltres lrsquoutilitzarem per connectar la RaspberryPi a una pantalla

LED Acrogravenim de ldquoLight Emitting Dioderdquo Eacutes un tipus de diacuteode el qual teacute una pelmiddotliacutecula de fogravesfor entre els dos connectors que fa que quan passi el corrent generi llum Com qualsevol altre diacuteode eacutes important tenir en compte la polaritat

RAM Acrogravenim de ldquoRandom Access Memoryrdquo Eacutes la part de lrsquoordinador encarregada drsquoemmagatze-mar els arxius temporals

RCA El connector RCA consisteix en diferents cables amb la punta de diferent color que serveix-en per transmetre agraveudio i viacutedeo

ROM De lrsquoanglegraves ldquoRead Only Memoryrdquo eacutes la uni-tat de memograveria on es guarda el sistema operatiu

Resistegravencia Eacutes un component electrogravenic que teacute com a funcioacute reduir el flux drsquoelectrons afi de controlar la seva potegravencia Eacutes molt comuacute a lrsquoelectrogravenica ja que eacutes molt necessari per assegu-rar-nos del correcte funcionament drsquoelements com el LED que sense una resistegravencia que limiteacutes el corrent podrien cremar-se

Placa base Eacutes la part de lrsquoordinador que conteacute elements com la RAM la ROM o el microproces-sador La placa base de lrsquoordinador que constru-irem amb aquest manual seria la progravepia Raspber-ry Pi

Protoboard Tambeacute coneguda com a Bread-board srsquoutilitza per crear circuits electrogravenics sense necessitat de soldar Per saber com funcio-na i com estan relacionats els diferents contactes consulteu aquesta webhttprduinostarcomdocumentaciongeneralpro-toboard-que-es-y-como-funciona

36

Terminal Eacutes el programa emprat per enviar ordres directes a lrsquoordinador i rebre respostes drsquoaquest Nosaltres lrsquoutilitzarem per instalmiddotlar els programes necessaris per programar les plaques electrograveniques i altres arxius necessaris

Variable Valor que canvia segons les operacions que es facin amb aquest al programa informagravetic Com ja sabeu hi ha variables independents (pe el temps) i dependents (pe si estagrave o no encegraves un LED que dependragrave drsquoaltres variables)

37

  • httpwwwfsforg
Page 30: CodePi

30

Seguim el patroacute de les foacutermules emprades a la pragravectica anterior

En aquest cas tenim tres variables drsquoentrada perograve la mecagravenica eacutes la mateixa Es pot jugar amb la foacutermula i anar provant diferents combinacions

Necessitem tres variables ja que hi ha tres botons

Declaracions

Comprovem quins estan premuts

int AND (int a int b) return a ampamp b

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 + arsquob

int main (void) int pin_LED_S = 1

int pin_boto_A = 4 int pin_boto_B = 5 int pin_boto_C = 6

int apretat_A = 0 int apretat_B = 0 int apretat_C = 0

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

31

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

Mostra resultat if (f(apretat_A apretat_B apretat_C) == 1) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins no estan premuts

Com al circuit anterior apliquem la foacutermula i si aquesta doacutena 1 encenem el LED

Proposta Ara que ja has apregraves els conceptes meacutes fonamentals de la CodePi inventarsquot un circuit amb el nivell de dificultat que consideris No et quedis amb el que se trsquoha ensenyat aquiacute sinoacute que cerca meacutes megravetodes que puguis utilitzar La creativitat eacutes bagravesica per a tot bon enginyer i amb aquesta pragravectica volem que demostris de quegrave ets capaccedil

32

8 Vols saber-ne meacutes El moacuten de la programacioacute i lrsquoelectrogravenica eacutes infinit La comunitat geek (= interessada) en aquests te-mes eacutes una de les meacutes servicials i altruista de tota la xarxa aixiacute que es poden trobar una quantitat inacabable de tutorials i pagravegines web especialitza-des en el que vulguem saber

81 Programari lliureEl programari lliure eacutes la base de la informagravetica ac-tual i encara juga un gran paper en algunes agraverees com els servidors web o els mogravebils amb sistema operatiu Android Aquiacute teniu un conjunt de pagravegines on podeu aprofundir sobre aquest apassionant moacuten de la llibertat digital

httpcawikipediaorgwikiRichard_Matthew_Stallmanhttpwwwfsforghttpwwwgnuorghttpwwwlinuxorghttpwwwunixorghttpwwwubuntucom

82 Raspberry PiSi desitges saber meacutes sobre el projecte sense agravenim de lucre Raspberry Pi i seguir fent projectes amb ella visita les pagines que trobaragraves a con-tinuacioacute Aquestes et donaran idees de quegrave fer amb aquest petit perograve fascinant ordinador

httplearnadafruitcomcategorylearn-raspber-ry-pihttpwwwraspberrypiorgwwwraspberrypiorghttpdangerousprototypescom20130202rasp-berry-pi-supercomputerhttpreviewscnetcoukdesktops25-fun-things-to-do-with-a-raspberry-pi-50009851httplearnadafruitcompi-thermal-printer

33

83 Electrogravenica Si lrsquoelectrogravenica bagravesica que has apregraves durant els tutorials de la CodePi trsquoha fet veure que aquest eacutes el moacuten que a tu trsquoagrada no paris A continu-acioacute et deixem pagravegines web on trobaragraves les bases de lrsquoelectrogravenica meacutes complexa i tambeacute molts nous circuits per muntar i seguir descobrint aquest moacuten que avui en dia fa que tots els aparells endollats a al corrent puguin funcionar

httpwwwinstructablescomidBeginners-Elec-tronics-ProjectshttpwwwinstructablescomidElectronic-Proj-ects-For-Beginnershttpwwwcircuitstodaycomsimple-electron-ics-projects-and-circuitshttpswwwsparkfuncomtutorialshttplearnadafruitcom

84 ProgramacioacuteDiuen que per ser un bon programador srsquohan de tenir unes habilitats que no tothom teacute disciplina ordre logravegica creativitat capacitat per resoldre qualsevol problema i per sobre de tot persistegravencia i passioacute Si creus que tens aquestes qualitats do-na-li una oportunitat a la programacioacute A continu-acioacute et deixem un recull de les pagravegines web que creiem que meacutes et poden ajudar a introduir-te una mica meacutes en la programacioacute web i la drsquoapli-cacions per a mogravebils

httpwwwcodeorghttpscratchmiteduhttpwwwcodecademycom

34

9 GlossariC (llenguatge de programacioacute) Des de la seva creacioacute lrsquoany 1972 srsquoha consolidat com un dels llenguatges de programacioacute meacutes utilitzats per fer aplicacions de software Eacutes considerat un dels meacutes bagravesics i meacutes comuns per introduir-se a la pro-gramacioacute Les grans companyies han utilitzat el C com a base per crear altres llenguatges com lrsquoObjective-C (utilitzat per fer les aplicacions per dispositius drsquoApple) o el C (creat per Microsoft i utilitzat entre altres coses per fer programes in-formagravetics per Windows)

Condensador Component electrogravenic classificat dins del grup dels passius i que per tant no emet cap senyal El podriacuteem definir com un acumula-dor drsquoelectrons que els deixa anar quan arriba a la seva capacitat magravexima Hi ha condensadors de dos tipus els electroliacutetics i els normals En les pragravec-tiques utilitzarem electroliacutetics i com que aquests tenen polaritat eacutes important tenir en compte quina eacutes la pota positiva i quina eacutes la negativa a lrsquohora de connectar-lo

Diacuteode Component electrogravenic passiu Teacute polaritat i seria lrsquoequivalent a una vagravelvula antiretorn lrsquoelec-tricitat nomeacutes pot anar en un sentit

Electrogravenica Disciplina que estudia els com-ponents electrogravenics que funcionen amb un flux drsquoelectrons (corrent continua)

Funcioacute Fragment de codi que conte un seguit drsquoaccions i que hi pots accedir cridant la funcioacute en comptes de repetint el codi Podriacuteem comparar-ho amb una funcioacute matemagravetica en la que tenim vari-ables drsquoentrada que tractant-les a la funcioacute ob-tenim una informacioacute de sortida

GPIO Soacuten les sigles de ldquoGeneral Purpose InputOutputrdquo Si mirem la Raspberry Pi soacuten els pins de sortida on hi connectem els cables amb els que programem la placa electrogravenica Lrsquoavantatge drsquoaquest tipus de connector respecte altres eacutes que es pot gestionar mitjanccedilant programacioacute i aixograve eacutes precisament el que explicarem en aquest manual

35

HDMI Soacuten les sigles de ldquoHigh-Definition Multime-dia Interfacerdquo Serveix per enviar viacutedeo i agraveudio a una pantalla Nosaltres lrsquoutilitzarem per connectar la RaspberryPi a una pantalla

LED Acrogravenim de ldquoLight Emitting Dioderdquo Eacutes un tipus de diacuteode el qual teacute una pelmiddotliacutecula de fogravesfor entre els dos connectors que fa que quan passi el corrent generi llum Com qualsevol altre diacuteode eacutes important tenir en compte la polaritat

RAM Acrogravenim de ldquoRandom Access Memoryrdquo Eacutes la part de lrsquoordinador encarregada drsquoemmagatze-mar els arxius temporals

RCA El connector RCA consisteix en diferents cables amb la punta de diferent color que serveix-en per transmetre agraveudio i viacutedeo

ROM De lrsquoanglegraves ldquoRead Only Memoryrdquo eacutes la uni-tat de memograveria on es guarda el sistema operatiu

Resistegravencia Eacutes un component electrogravenic que teacute com a funcioacute reduir el flux drsquoelectrons afi de controlar la seva potegravencia Eacutes molt comuacute a lrsquoelectrogravenica ja que eacutes molt necessari per assegu-rar-nos del correcte funcionament drsquoelements com el LED que sense una resistegravencia que limiteacutes el corrent podrien cremar-se

Placa base Eacutes la part de lrsquoordinador que conteacute elements com la RAM la ROM o el microproces-sador La placa base de lrsquoordinador que constru-irem amb aquest manual seria la progravepia Raspber-ry Pi

Protoboard Tambeacute coneguda com a Bread-board srsquoutilitza per crear circuits electrogravenics sense necessitat de soldar Per saber com funcio-na i com estan relacionats els diferents contactes consulteu aquesta webhttprduinostarcomdocumentaciongeneralpro-toboard-que-es-y-como-funciona

36

Terminal Eacutes el programa emprat per enviar ordres directes a lrsquoordinador i rebre respostes drsquoaquest Nosaltres lrsquoutilitzarem per instalmiddotlar els programes necessaris per programar les plaques electrograveniques i altres arxius necessaris

Variable Valor que canvia segons les operacions que es facin amb aquest al programa informagravetic Com ja sabeu hi ha variables independents (pe el temps) i dependents (pe si estagrave o no encegraves un LED que dependragrave drsquoaltres variables)

37

  • httpwwwfsforg
Page 31: CodePi

31

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

Mostra resultat if (f(apretat_A apretat_B apretat_C) == 1) digitalWrite(pin_LED_S HIGH) else digitalWrite(pin_LED_S LOW)

Comprovem quins no estan premuts

Com al circuit anterior apliquem la foacutermula i si aquesta doacutena 1 encenem el LED

Proposta Ara que ja has apregraves els conceptes meacutes fonamentals de la CodePi inventarsquot un circuit amb el nivell de dificultat que consideris No et quedis amb el que se trsquoha ensenyat aquiacute sinoacute que cerca meacutes megravetodes que puguis utilitzar La creativitat eacutes bagravesica per a tot bon enginyer i amb aquesta pragravectica volem que demostris de quegrave ets capaccedil

32

8 Vols saber-ne meacutes El moacuten de la programacioacute i lrsquoelectrogravenica eacutes infinit La comunitat geek (= interessada) en aquests te-mes eacutes una de les meacutes servicials i altruista de tota la xarxa aixiacute que es poden trobar una quantitat inacabable de tutorials i pagravegines web especialitza-des en el que vulguem saber

81 Programari lliureEl programari lliure eacutes la base de la informagravetica ac-tual i encara juga un gran paper en algunes agraverees com els servidors web o els mogravebils amb sistema operatiu Android Aquiacute teniu un conjunt de pagravegines on podeu aprofundir sobre aquest apassionant moacuten de la llibertat digital

httpcawikipediaorgwikiRichard_Matthew_Stallmanhttpwwwfsforghttpwwwgnuorghttpwwwlinuxorghttpwwwunixorghttpwwwubuntucom

82 Raspberry PiSi desitges saber meacutes sobre el projecte sense agravenim de lucre Raspberry Pi i seguir fent projectes amb ella visita les pagines que trobaragraves a con-tinuacioacute Aquestes et donaran idees de quegrave fer amb aquest petit perograve fascinant ordinador

httplearnadafruitcomcategorylearn-raspber-ry-pihttpwwwraspberrypiorgwwwraspberrypiorghttpdangerousprototypescom20130202rasp-berry-pi-supercomputerhttpreviewscnetcoukdesktops25-fun-things-to-do-with-a-raspberry-pi-50009851httplearnadafruitcompi-thermal-printer

33

83 Electrogravenica Si lrsquoelectrogravenica bagravesica que has apregraves durant els tutorials de la CodePi trsquoha fet veure que aquest eacutes el moacuten que a tu trsquoagrada no paris A continu-acioacute et deixem pagravegines web on trobaragraves les bases de lrsquoelectrogravenica meacutes complexa i tambeacute molts nous circuits per muntar i seguir descobrint aquest moacuten que avui en dia fa que tots els aparells endollats a al corrent puguin funcionar

httpwwwinstructablescomidBeginners-Elec-tronics-ProjectshttpwwwinstructablescomidElectronic-Proj-ects-For-Beginnershttpwwwcircuitstodaycomsimple-electron-ics-projects-and-circuitshttpswwwsparkfuncomtutorialshttplearnadafruitcom

84 ProgramacioacuteDiuen que per ser un bon programador srsquohan de tenir unes habilitats que no tothom teacute disciplina ordre logravegica creativitat capacitat per resoldre qualsevol problema i per sobre de tot persistegravencia i passioacute Si creus que tens aquestes qualitats do-na-li una oportunitat a la programacioacute A continu-acioacute et deixem un recull de les pagravegines web que creiem que meacutes et poden ajudar a introduir-te una mica meacutes en la programacioacute web i la drsquoapli-cacions per a mogravebils

httpwwwcodeorghttpscratchmiteduhttpwwwcodecademycom

34

9 GlossariC (llenguatge de programacioacute) Des de la seva creacioacute lrsquoany 1972 srsquoha consolidat com un dels llenguatges de programacioacute meacutes utilitzats per fer aplicacions de software Eacutes considerat un dels meacutes bagravesics i meacutes comuns per introduir-se a la pro-gramacioacute Les grans companyies han utilitzat el C com a base per crear altres llenguatges com lrsquoObjective-C (utilitzat per fer les aplicacions per dispositius drsquoApple) o el C (creat per Microsoft i utilitzat entre altres coses per fer programes in-formagravetics per Windows)

Condensador Component electrogravenic classificat dins del grup dels passius i que per tant no emet cap senyal El podriacuteem definir com un acumula-dor drsquoelectrons que els deixa anar quan arriba a la seva capacitat magravexima Hi ha condensadors de dos tipus els electroliacutetics i els normals En les pragravec-tiques utilitzarem electroliacutetics i com que aquests tenen polaritat eacutes important tenir en compte quina eacutes la pota positiva i quina eacutes la negativa a lrsquohora de connectar-lo

Diacuteode Component electrogravenic passiu Teacute polaritat i seria lrsquoequivalent a una vagravelvula antiretorn lrsquoelec-tricitat nomeacutes pot anar en un sentit

Electrogravenica Disciplina que estudia els com-ponents electrogravenics que funcionen amb un flux drsquoelectrons (corrent continua)

Funcioacute Fragment de codi que conte un seguit drsquoaccions i que hi pots accedir cridant la funcioacute en comptes de repetint el codi Podriacuteem comparar-ho amb una funcioacute matemagravetica en la que tenim vari-ables drsquoentrada que tractant-les a la funcioacute ob-tenim una informacioacute de sortida

GPIO Soacuten les sigles de ldquoGeneral Purpose InputOutputrdquo Si mirem la Raspberry Pi soacuten els pins de sortida on hi connectem els cables amb els que programem la placa electrogravenica Lrsquoavantatge drsquoaquest tipus de connector respecte altres eacutes que es pot gestionar mitjanccedilant programacioacute i aixograve eacutes precisament el que explicarem en aquest manual

35

HDMI Soacuten les sigles de ldquoHigh-Definition Multime-dia Interfacerdquo Serveix per enviar viacutedeo i agraveudio a una pantalla Nosaltres lrsquoutilitzarem per connectar la RaspberryPi a una pantalla

LED Acrogravenim de ldquoLight Emitting Dioderdquo Eacutes un tipus de diacuteode el qual teacute una pelmiddotliacutecula de fogravesfor entre els dos connectors que fa que quan passi el corrent generi llum Com qualsevol altre diacuteode eacutes important tenir en compte la polaritat

RAM Acrogravenim de ldquoRandom Access Memoryrdquo Eacutes la part de lrsquoordinador encarregada drsquoemmagatze-mar els arxius temporals

RCA El connector RCA consisteix en diferents cables amb la punta de diferent color que serveix-en per transmetre agraveudio i viacutedeo

ROM De lrsquoanglegraves ldquoRead Only Memoryrdquo eacutes la uni-tat de memograveria on es guarda el sistema operatiu

Resistegravencia Eacutes un component electrogravenic que teacute com a funcioacute reduir el flux drsquoelectrons afi de controlar la seva potegravencia Eacutes molt comuacute a lrsquoelectrogravenica ja que eacutes molt necessari per assegu-rar-nos del correcte funcionament drsquoelements com el LED que sense una resistegravencia que limiteacutes el corrent podrien cremar-se

Placa base Eacutes la part de lrsquoordinador que conteacute elements com la RAM la ROM o el microproces-sador La placa base de lrsquoordinador que constru-irem amb aquest manual seria la progravepia Raspber-ry Pi

Protoboard Tambeacute coneguda com a Bread-board srsquoutilitza per crear circuits electrogravenics sense necessitat de soldar Per saber com funcio-na i com estan relacionats els diferents contactes consulteu aquesta webhttprduinostarcomdocumentaciongeneralpro-toboard-que-es-y-como-funciona

36

Terminal Eacutes el programa emprat per enviar ordres directes a lrsquoordinador i rebre respostes drsquoaquest Nosaltres lrsquoutilitzarem per instalmiddotlar els programes necessaris per programar les plaques electrograveniques i altres arxius necessaris

Variable Valor que canvia segons les operacions que es facin amb aquest al programa informagravetic Com ja sabeu hi ha variables independents (pe el temps) i dependents (pe si estagrave o no encegraves un LED que dependragrave drsquoaltres variables)

37

  • httpwwwfsforg
Page 32: CodePi

32

8 Vols saber-ne meacutes El moacuten de la programacioacute i lrsquoelectrogravenica eacutes infinit La comunitat geek (= interessada) en aquests te-mes eacutes una de les meacutes servicials i altruista de tota la xarxa aixiacute que es poden trobar una quantitat inacabable de tutorials i pagravegines web especialitza-des en el que vulguem saber

81 Programari lliureEl programari lliure eacutes la base de la informagravetica ac-tual i encara juga un gran paper en algunes agraverees com els servidors web o els mogravebils amb sistema operatiu Android Aquiacute teniu un conjunt de pagravegines on podeu aprofundir sobre aquest apassionant moacuten de la llibertat digital

httpcawikipediaorgwikiRichard_Matthew_Stallmanhttpwwwfsforghttpwwwgnuorghttpwwwlinuxorghttpwwwunixorghttpwwwubuntucom

82 Raspberry PiSi desitges saber meacutes sobre el projecte sense agravenim de lucre Raspberry Pi i seguir fent projectes amb ella visita les pagines que trobaragraves a con-tinuacioacute Aquestes et donaran idees de quegrave fer amb aquest petit perograve fascinant ordinador

httplearnadafruitcomcategorylearn-raspber-ry-pihttpwwwraspberrypiorgwwwraspberrypiorghttpdangerousprototypescom20130202rasp-berry-pi-supercomputerhttpreviewscnetcoukdesktops25-fun-things-to-do-with-a-raspberry-pi-50009851httplearnadafruitcompi-thermal-printer

33

83 Electrogravenica Si lrsquoelectrogravenica bagravesica que has apregraves durant els tutorials de la CodePi trsquoha fet veure que aquest eacutes el moacuten que a tu trsquoagrada no paris A continu-acioacute et deixem pagravegines web on trobaragraves les bases de lrsquoelectrogravenica meacutes complexa i tambeacute molts nous circuits per muntar i seguir descobrint aquest moacuten que avui en dia fa que tots els aparells endollats a al corrent puguin funcionar

httpwwwinstructablescomidBeginners-Elec-tronics-ProjectshttpwwwinstructablescomidElectronic-Proj-ects-For-Beginnershttpwwwcircuitstodaycomsimple-electron-ics-projects-and-circuitshttpswwwsparkfuncomtutorialshttplearnadafruitcom

84 ProgramacioacuteDiuen que per ser un bon programador srsquohan de tenir unes habilitats que no tothom teacute disciplina ordre logravegica creativitat capacitat per resoldre qualsevol problema i per sobre de tot persistegravencia i passioacute Si creus que tens aquestes qualitats do-na-li una oportunitat a la programacioacute A continu-acioacute et deixem un recull de les pagravegines web que creiem que meacutes et poden ajudar a introduir-te una mica meacutes en la programacioacute web i la drsquoapli-cacions per a mogravebils

httpwwwcodeorghttpscratchmiteduhttpwwwcodecademycom

34

9 GlossariC (llenguatge de programacioacute) Des de la seva creacioacute lrsquoany 1972 srsquoha consolidat com un dels llenguatges de programacioacute meacutes utilitzats per fer aplicacions de software Eacutes considerat un dels meacutes bagravesics i meacutes comuns per introduir-se a la pro-gramacioacute Les grans companyies han utilitzat el C com a base per crear altres llenguatges com lrsquoObjective-C (utilitzat per fer les aplicacions per dispositius drsquoApple) o el C (creat per Microsoft i utilitzat entre altres coses per fer programes in-formagravetics per Windows)

Condensador Component electrogravenic classificat dins del grup dels passius i que per tant no emet cap senyal El podriacuteem definir com un acumula-dor drsquoelectrons que els deixa anar quan arriba a la seva capacitat magravexima Hi ha condensadors de dos tipus els electroliacutetics i els normals En les pragravec-tiques utilitzarem electroliacutetics i com que aquests tenen polaritat eacutes important tenir en compte quina eacutes la pota positiva i quina eacutes la negativa a lrsquohora de connectar-lo

Diacuteode Component electrogravenic passiu Teacute polaritat i seria lrsquoequivalent a una vagravelvula antiretorn lrsquoelec-tricitat nomeacutes pot anar en un sentit

Electrogravenica Disciplina que estudia els com-ponents electrogravenics que funcionen amb un flux drsquoelectrons (corrent continua)

Funcioacute Fragment de codi que conte un seguit drsquoaccions i que hi pots accedir cridant la funcioacute en comptes de repetint el codi Podriacuteem comparar-ho amb una funcioacute matemagravetica en la que tenim vari-ables drsquoentrada que tractant-les a la funcioacute ob-tenim una informacioacute de sortida

GPIO Soacuten les sigles de ldquoGeneral Purpose InputOutputrdquo Si mirem la Raspberry Pi soacuten els pins de sortida on hi connectem els cables amb els que programem la placa electrogravenica Lrsquoavantatge drsquoaquest tipus de connector respecte altres eacutes que es pot gestionar mitjanccedilant programacioacute i aixograve eacutes precisament el que explicarem en aquest manual

35

HDMI Soacuten les sigles de ldquoHigh-Definition Multime-dia Interfacerdquo Serveix per enviar viacutedeo i agraveudio a una pantalla Nosaltres lrsquoutilitzarem per connectar la RaspberryPi a una pantalla

LED Acrogravenim de ldquoLight Emitting Dioderdquo Eacutes un tipus de diacuteode el qual teacute una pelmiddotliacutecula de fogravesfor entre els dos connectors que fa que quan passi el corrent generi llum Com qualsevol altre diacuteode eacutes important tenir en compte la polaritat

RAM Acrogravenim de ldquoRandom Access Memoryrdquo Eacutes la part de lrsquoordinador encarregada drsquoemmagatze-mar els arxius temporals

RCA El connector RCA consisteix en diferents cables amb la punta de diferent color que serveix-en per transmetre agraveudio i viacutedeo

ROM De lrsquoanglegraves ldquoRead Only Memoryrdquo eacutes la uni-tat de memograveria on es guarda el sistema operatiu

Resistegravencia Eacutes un component electrogravenic que teacute com a funcioacute reduir el flux drsquoelectrons afi de controlar la seva potegravencia Eacutes molt comuacute a lrsquoelectrogravenica ja que eacutes molt necessari per assegu-rar-nos del correcte funcionament drsquoelements com el LED que sense una resistegravencia que limiteacutes el corrent podrien cremar-se

Placa base Eacutes la part de lrsquoordinador que conteacute elements com la RAM la ROM o el microproces-sador La placa base de lrsquoordinador que constru-irem amb aquest manual seria la progravepia Raspber-ry Pi

Protoboard Tambeacute coneguda com a Bread-board srsquoutilitza per crear circuits electrogravenics sense necessitat de soldar Per saber com funcio-na i com estan relacionats els diferents contactes consulteu aquesta webhttprduinostarcomdocumentaciongeneralpro-toboard-que-es-y-como-funciona

36

Terminal Eacutes el programa emprat per enviar ordres directes a lrsquoordinador i rebre respostes drsquoaquest Nosaltres lrsquoutilitzarem per instalmiddotlar els programes necessaris per programar les plaques electrograveniques i altres arxius necessaris

Variable Valor que canvia segons les operacions que es facin amb aquest al programa informagravetic Com ja sabeu hi ha variables independents (pe el temps) i dependents (pe si estagrave o no encegraves un LED que dependragrave drsquoaltres variables)

37

  • httpwwwfsforg
Page 33: CodePi

33

83 Electrogravenica Si lrsquoelectrogravenica bagravesica que has apregraves durant els tutorials de la CodePi trsquoha fet veure que aquest eacutes el moacuten que a tu trsquoagrada no paris A continu-acioacute et deixem pagravegines web on trobaragraves les bases de lrsquoelectrogravenica meacutes complexa i tambeacute molts nous circuits per muntar i seguir descobrint aquest moacuten que avui en dia fa que tots els aparells endollats a al corrent puguin funcionar

httpwwwinstructablescomidBeginners-Elec-tronics-ProjectshttpwwwinstructablescomidElectronic-Proj-ects-For-Beginnershttpwwwcircuitstodaycomsimple-electron-ics-projects-and-circuitshttpswwwsparkfuncomtutorialshttplearnadafruitcom

84 ProgramacioacuteDiuen que per ser un bon programador srsquohan de tenir unes habilitats que no tothom teacute disciplina ordre logravegica creativitat capacitat per resoldre qualsevol problema i per sobre de tot persistegravencia i passioacute Si creus que tens aquestes qualitats do-na-li una oportunitat a la programacioacute A continu-acioacute et deixem un recull de les pagravegines web que creiem que meacutes et poden ajudar a introduir-te una mica meacutes en la programacioacute web i la drsquoapli-cacions per a mogravebils

httpwwwcodeorghttpscratchmiteduhttpwwwcodecademycom

34

9 GlossariC (llenguatge de programacioacute) Des de la seva creacioacute lrsquoany 1972 srsquoha consolidat com un dels llenguatges de programacioacute meacutes utilitzats per fer aplicacions de software Eacutes considerat un dels meacutes bagravesics i meacutes comuns per introduir-se a la pro-gramacioacute Les grans companyies han utilitzat el C com a base per crear altres llenguatges com lrsquoObjective-C (utilitzat per fer les aplicacions per dispositius drsquoApple) o el C (creat per Microsoft i utilitzat entre altres coses per fer programes in-formagravetics per Windows)

Condensador Component electrogravenic classificat dins del grup dels passius i que per tant no emet cap senyal El podriacuteem definir com un acumula-dor drsquoelectrons que els deixa anar quan arriba a la seva capacitat magravexima Hi ha condensadors de dos tipus els electroliacutetics i els normals En les pragravec-tiques utilitzarem electroliacutetics i com que aquests tenen polaritat eacutes important tenir en compte quina eacutes la pota positiva i quina eacutes la negativa a lrsquohora de connectar-lo

Diacuteode Component electrogravenic passiu Teacute polaritat i seria lrsquoequivalent a una vagravelvula antiretorn lrsquoelec-tricitat nomeacutes pot anar en un sentit

Electrogravenica Disciplina que estudia els com-ponents electrogravenics que funcionen amb un flux drsquoelectrons (corrent continua)

Funcioacute Fragment de codi que conte un seguit drsquoaccions i que hi pots accedir cridant la funcioacute en comptes de repetint el codi Podriacuteem comparar-ho amb una funcioacute matemagravetica en la que tenim vari-ables drsquoentrada que tractant-les a la funcioacute ob-tenim una informacioacute de sortida

GPIO Soacuten les sigles de ldquoGeneral Purpose InputOutputrdquo Si mirem la Raspberry Pi soacuten els pins de sortida on hi connectem els cables amb els que programem la placa electrogravenica Lrsquoavantatge drsquoaquest tipus de connector respecte altres eacutes que es pot gestionar mitjanccedilant programacioacute i aixograve eacutes precisament el que explicarem en aquest manual

35

HDMI Soacuten les sigles de ldquoHigh-Definition Multime-dia Interfacerdquo Serveix per enviar viacutedeo i agraveudio a una pantalla Nosaltres lrsquoutilitzarem per connectar la RaspberryPi a una pantalla

LED Acrogravenim de ldquoLight Emitting Dioderdquo Eacutes un tipus de diacuteode el qual teacute una pelmiddotliacutecula de fogravesfor entre els dos connectors que fa que quan passi el corrent generi llum Com qualsevol altre diacuteode eacutes important tenir en compte la polaritat

RAM Acrogravenim de ldquoRandom Access Memoryrdquo Eacutes la part de lrsquoordinador encarregada drsquoemmagatze-mar els arxius temporals

RCA El connector RCA consisteix en diferents cables amb la punta de diferent color que serveix-en per transmetre agraveudio i viacutedeo

ROM De lrsquoanglegraves ldquoRead Only Memoryrdquo eacutes la uni-tat de memograveria on es guarda el sistema operatiu

Resistegravencia Eacutes un component electrogravenic que teacute com a funcioacute reduir el flux drsquoelectrons afi de controlar la seva potegravencia Eacutes molt comuacute a lrsquoelectrogravenica ja que eacutes molt necessari per assegu-rar-nos del correcte funcionament drsquoelements com el LED que sense una resistegravencia que limiteacutes el corrent podrien cremar-se

Placa base Eacutes la part de lrsquoordinador que conteacute elements com la RAM la ROM o el microproces-sador La placa base de lrsquoordinador que constru-irem amb aquest manual seria la progravepia Raspber-ry Pi

Protoboard Tambeacute coneguda com a Bread-board srsquoutilitza per crear circuits electrogravenics sense necessitat de soldar Per saber com funcio-na i com estan relacionats els diferents contactes consulteu aquesta webhttprduinostarcomdocumentaciongeneralpro-toboard-que-es-y-como-funciona

36

Terminal Eacutes el programa emprat per enviar ordres directes a lrsquoordinador i rebre respostes drsquoaquest Nosaltres lrsquoutilitzarem per instalmiddotlar els programes necessaris per programar les plaques electrograveniques i altres arxius necessaris

Variable Valor que canvia segons les operacions que es facin amb aquest al programa informagravetic Com ja sabeu hi ha variables independents (pe el temps) i dependents (pe si estagrave o no encegraves un LED que dependragrave drsquoaltres variables)

37

  • httpwwwfsforg
Page 34: CodePi

34

9 GlossariC (llenguatge de programacioacute) Des de la seva creacioacute lrsquoany 1972 srsquoha consolidat com un dels llenguatges de programacioacute meacutes utilitzats per fer aplicacions de software Eacutes considerat un dels meacutes bagravesics i meacutes comuns per introduir-se a la pro-gramacioacute Les grans companyies han utilitzat el C com a base per crear altres llenguatges com lrsquoObjective-C (utilitzat per fer les aplicacions per dispositius drsquoApple) o el C (creat per Microsoft i utilitzat entre altres coses per fer programes in-formagravetics per Windows)

Condensador Component electrogravenic classificat dins del grup dels passius i que per tant no emet cap senyal El podriacuteem definir com un acumula-dor drsquoelectrons que els deixa anar quan arriba a la seva capacitat magravexima Hi ha condensadors de dos tipus els electroliacutetics i els normals En les pragravec-tiques utilitzarem electroliacutetics i com que aquests tenen polaritat eacutes important tenir en compte quina eacutes la pota positiva i quina eacutes la negativa a lrsquohora de connectar-lo

Diacuteode Component electrogravenic passiu Teacute polaritat i seria lrsquoequivalent a una vagravelvula antiretorn lrsquoelec-tricitat nomeacutes pot anar en un sentit

Electrogravenica Disciplina que estudia els com-ponents electrogravenics que funcionen amb un flux drsquoelectrons (corrent continua)

Funcioacute Fragment de codi que conte un seguit drsquoaccions i que hi pots accedir cridant la funcioacute en comptes de repetint el codi Podriacuteem comparar-ho amb una funcioacute matemagravetica en la que tenim vari-ables drsquoentrada que tractant-les a la funcioacute ob-tenim una informacioacute de sortida

GPIO Soacuten les sigles de ldquoGeneral Purpose InputOutputrdquo Si mirem la Raspberry Pi soacuten els pins de sortida on hi connectem els cables amb els que programem la placa electrogravenica Lrsquoavantatge drsquoaquest tipus de connector respecte altres eacutes que es pot gestionar mitjanccedilant programacioacute i aixograve eacutes precisament el que explicarem en aquest manual

35

HDMI Soacuten les sigles de ldquoHigh-Definition Multime-dia Interfacerdquo Serveix per enviar viacutedeo i agraveudio a una pantalla Nosaltres lrsquoutilitzarem per connectar la RaspberryPi a una pantalla

LED Acrogravenim de ldquoLight Emitting Dioderdquo Eacutes un tipus de diacuteode el qual teacute una pelmiddotliacutecula de fogravesfor entre els dos connectors que fa que quan passi el corrent generi llum Com qualsevol altre diacuteode eacutes important tenir en compte la polaritat

RAM Acrogravenim de ldquoRandom Access Memoryrdquo Eacutes la part de lrsquoordinador encarregada drsquoemmagatze-mar els arxius temporals

RCA El connector RCA consisteix en diferents cables amb la punta de diferent color que serveix-en per transmetre agraveudio i viacutedeo

ROM De lrsquoanglegraves ldquoRead Only Memoryrdquo eacutes la uni-tat de memograveria on es guarda el sistema operatiu

Resistegravencia Eacutes un component electrogravenic que teacute com a funcioacute reduir el flux drsquoelectrons afi de controlar la seva potegravencia Eacutes molt comuacute a lrsquoelectrogravenica ja que eacutes molt necessari per assegu-rar-nos del correcte funcionament drsquoelements com el LED que sense una resistegravencia que limiteacutes el corrent podrien cremar-se

Placa base Eacutes la part de lrsquoordinador que conteacute elements com la RAM la ROM o el microproces-sador La placa base de lrsquoordinador que constru-irem amb aquest manual seria la progravepia Raspber-ry Pi

Protoboard Tambeacute coneguda com a Bread-board srsquoutilitza per crear circuits electrogravenics sense necessitat de soldar Per saber com funcio-na i com estan relacionats els diferents contactes consulteu aquesta webhttprduinostarcomdocumentaciongeneralpro-toboard-que-es-y-como-funciona

36

Terminal Eacutes el programa emprat per enviar ordres directes a lrsquoordinador i rebre respostes drsquoaquest Nosaltres lrsquoutilitzarem per instalmiddotlar els programes necessaris per programar les plaques electrograveniques i altres arxius necessaris

Variable Valor que canvia segons les operacions que es facin amb aquest al programa informagravetic Com ja sabeu hi ha variables independents (pe el temps) i dependents (pe si estagrave o no encegraves un LED que dependragrave drsquoaltres variables)

37

  • httpwwwfsforg
Page 35: CodePi

35

HDMI Soacuten les sigles de ldquoHigh-Definition Multime-dia Interfacerdquo Serveix per enviar viacutedeo i agraveudio a una pantalla Nosaltres lrsquoutilitzarem per connectar la RaspberryPi a una pantalla

LED Acrogravenim de ldquoLight Emitting Dioderdquo Eacutes un tipus de diacuteode el qual teacute una pelmiddotliacutecula de fogravesfor entre els dos connectors que fa que quan passi el corrent generi llum Com qualsevol altre diacuteode eacutes important tenir en compte la polaritat

RAM Acrogravenim de ldquoRandom Access Memoryrdquo Eacutes la part de lrsquoordinador encarregada drsquoemmagatze-mar els arxius temporals

RCA El connector RCA consisteix en diferents cables amb la punta de diferent color que serveix-en per transmetre agraveudio i viacutedeo

ROM De lrsquoanglegraves ldquoRead Only Memoryrdquo eacutes la uni-tat de memograveria on es guarda el sistema operatiu

Resistegravencia Eacutes un component electrogravenic que teacute com a funcioacute reduir el flux drsquoelectrons afi de controlar la seva potegravencia Eacutes molt comuacute a lrsquoelectrogravenica ja que eacutes molt necessari per assegu-rar-nos del correcte funcionament drsquoelements com el LED que sense una resistegravencia que limiteacutes el corrent podrien cremar-se

Placa base Eacutes la part de lrsquoordinador que conteacute elements com la RAM la ROM o el microproces-sador La placa base de lrsquoordinador que constru-irem amb aquest manual seria la progravepia Raspber-ry Pi

Protoboard Tambeacute coneguda com a Bread-board srsquoutilitza per crear circuits electrogravenics sense necessitat de soldar Per saber com funcio-na i com estan relacionats els diferents contactes consulteu aquesta webhttprduinostarcomdocumentaciongeneralpro-toboard-que-es-y-como-funciona

36

Terminal Eacutes el programa emprat per enviar ordres directes a lrsquoordinador i rebre respostes drsquoaquest Nosaltres lrsquoutilitzarem per instalmiddotlar els programes necessaris per programar les plaques electrograveniques i altres arxius necessaris

Variable Valor que canvia segons les operacions que es facin amb aquest al programa informagravetic Com ja sabeu hi ha variables independents (pe el temps) i dependents (pe si estagrave o no encegraves un LED que dependragrave drsquoaltres variables)

37

  • httpwwwfsforg
Page 36: CodePi

36

Terminal Eacutes el programa emprat per enviar ordres directes a lrsquoordinador i rebre respostes drsquoaquest Nosaltres lrsquoutilitzarem per instalmiddotlar els programes necessaris per programar les plaques electrograveniques i altres arxius necessaris

Variable Valor que canvia segons les operacions que es facin amb aquest al programa informagravetic Com ja sabeu hi ha variables independents (pe el temps) i dependents (pe si estagrave o no encegraves un LED que dependragrave drsquoaltres variables)

37

  • httpwwwfsforg
Page 37: CodePi

37

  • httpwwwfsforg