Diferencia entre revisiones de «Arduino»
Línea 467: | Línea 467: | ||
} | } | ||
</nowiki> | </nowiki> | ||
La biblioteca està basada en aquest article: www.arduino.cc/playground/Code/PCD8544 Anem a analitzar el codi: | |||
Fotos: [http://www.flickr.com/photos/eljose/11176282663/] [http://www.flickr.com/photos/eljose/11176096105/] | Fotos: [http://www.flickr.com/photos/eljose/11176282663/] [http://www.flickr.com/photos/eljose/11176096105/] |
Revisión del 10:37 3 dic 2013
Arduino és una placa de circuit imprès simple basada en microcontrolador de codi obert provinent de la plataforma de codi obert Wiring amb l'objectiu de fer més simple i accessible el disseny de circuits electrònics amb microcontroladors.
El maquinari consisteix en dissenys simples de maquinari lliure amb processadors Atmel AVR en una placa amb pins E/S. L'entorn de desenvolupament implementa el llenguatge Processing de Wiring, molt semblant a C++. Arduino es pot utilitzar per desenvolupar objectes interactius autònoms o pot ser connectat a programari de l'ordinador (p. ex. Macromedia Flash, Processing, Max/MSP, Pure Data). Les plaques es poden muntar a mà o adquirir-se i els IDE de font oberta es poden descarregar de franc.
Arquitectura
Els microcontroladors com els que impulsen els Arduinos estan dissenyats per a aplicacions embegudes. A diferència de les computadores de propòsit general, un processador encastat normalment té una tasca ben definida que ha de realitzar de manera fiable i eficaç (i a un cost mínim). El disseny de microcontroladors tendeix a ser bastant espartà. Es renuncia als luxes d'emmagatzematge en memòria cau de diverses capes i dels sistemes de memòria virtual basats en disc, per exemple.
El model de Harvard resulta ser una bona elecció per a aplicacions embegudes i el Atmega 328 empleats en l' Arduino UNO utilitza una arquitectura Harvard relativament pura. Els programes s'emmagatzemen a la memòria Flash i les dades s'emmagatzemen a la memòria SRAM.
La major diferència entre aquests microcontroladors i el seu ordinador de propòsit general és la gran quantitat de memòria disponible . L'Arduino UNO té només 32K bytes de memòria Flash i 2K bytes de SRAM. Això és més de 100 mil vegades menys memòria física que un PC de gamma baixa. I això sense comptar el disc!
El treball en aquest ambient minimalista, ha d'utilitzar els seus recursos de manera intel ligent.
Memòria
Dins d'Arduino trobem 3 tipus de memòria:
- Flash
- SRAM
- EEPROM
La memòria flash s'utilitza per emmagatzemar la imatge del programa i les dades inicialitzats. Podeu executar el codi del programa de flash, però no pot modificar les dades en la memòria flash del seu codi d'execució. Per modificar les dades, primer s'han de copiar en la SRAM
La memòria flash és la mateixa tecnologia utilitzada per al pendrives i targetes SD. És no volàtil, pel que el seu programa encara hi serà quan el sistema estiga apagat.
La memòria flash té una vida finita de prop de 100.000 cicles d'escriptura. Així que si carregues 10 programes per dia, tots els dies durant els propers 27 anys, és possible trencar-la. No obstant, si es puguera escriure durant l'execució, pot ser aquests cicles serien insuficients.
SRAM o memòria estàtica d'accés aleatori, es pot llegir i escriure des del programa en execució. La memòria SRAM s'utilitza per a diversos fins per un programa en execució:
- Dades estàtics - Es tracta d'un bloc d'espai reservat en SRAM per a totes les variables globals i estàtiques del seu programa. Per a les variables amb els valors inicials, el sistema d'execució copia el valor inicial del flash quan s'inicia el programa.
- Heap - El Heap és per als elements de dades assignats dinàmicament. La pila creix a partir de la part superior de l'àrea de dades estàtica.
- Stack - La pila és per a les variables locals i ha de mantenir un registre de les interrupcions i trucades a funcions. La pila creix des de la part superior de la memòria cap avall, cap al heap. Cada interrupció, crida a la funció i/o assignació de variable local, fa que la pila creixi.
Quant l'Stack i el Heap col·lisionen pot sorgir un problema greu.
EEPROM és una altra forma de memòria no volàtil que pot ser llegit o escrit del seu programa d'execució. Només es pot llegir byte a byte, pel que pot ser una mica difícil d'usar. També és més lenta que la SRAM i té una vida finita de prop de 100.000 cicles d'escriptura (es pot llegir tantes vegades com vulgui).
Si bé no pot prendre el lloc de SRAM, hi ha moments en que pot ser molt útil.
Mesurar la memòria lliure
La memòria lliure flash és fàcil, el propi compilador ens diu la que ocupa el programa.
Per un altra banda, saber la EEPROM que tenim lliure és tasca i responsabilitat del programador, ja que pot tenir control total sobre ella. Miren les funcions per a escriure o llegir de la memòria EEPROM:
Saber la memòria SRAM utilitzada és més complicat perquè és dinàmica. Es pot calcular la distància del Stack i el Heap amb aquesta funció:
No obstant, el Heap pot estar fragmentat i aquesta mesura no és fiable.
Coses que consumeixen Molta SRAM:
Targetes SD | Encara que les targetes són memòria, els seus buffers ocupen sobre 512Bytes |
Pixels de colors | Si volem emmagatzemar el color, necessitem 3bytes per pixel (Un arduino UNO pot suportar sobre 500pixels si el programa és curt) |
Displays RBG | La mateixa raó que els píxels. Per exemple: la resolució 32x32 necessita 1600bytes. |
Displays Monocroms | Sols necessita 1bit. Per tant, pot tindre molta més resolució. El de 128x64 ocupa 512 bytes. |
Optimitzar l'ús de Memòria
Per optimitzar la memòria Flash, es pot:
- Esborrar codi no útil com: Biblioteques que no s'utilitzen, Funcions que no serveixen per a res, variables o codi que mai es pot executar.
- Consolidar codi repetit en funcions.
Per optimitzar la memòria SRAM:
- Esborrar variables no utilitzades.
- Evitar les Strings o fer-les més curtes. Cada lletra ocupa 1Byte, i sols tenim 1024!. Existeix una funció F() que manté les strings en memòria Flash.
Serial.println("Sram sram sram sram. Lovely sram! Wonderful sram! Sram sra-a-a-a-a-am sram sra-a-a-a-a-am sram. Lovely sram! Lovely sram! Lovely sram! Lovely sram! Lovely sram! Sram sram sram sram!");
Serial.println(F("Sram sram sram sram. Lovely sram! Wonderful sram! Sram sra-a-a-a-a-am sram sra-a-a-a-a-am sram. Lovely sram! Lovely sram! Lovely sram! Lovely sram! Lovely sram! Sram sram sram sram!"));
La segona opció ocupa 180 bytes menys.
- Guardar les dades estàtiques en PROGMEM
- Reduir la mida de les variables. De veritat necessites un int per a guardar un valor de 0 a 255? Pots utilitzar un byte.
PWM
Modulació de Ample de Pols (PWM) és una tècnica per controlar la potència. També l'utilitzem per controlar la brillantor de cadascun dels LEDs.
Aproximadament cada 1/500 d'un segon, la sortida PWM produirà un pols. La longitud d'aquest pols és controlada per la funció de 'analogWrite'. Així 'analogWrite(0)' no produirà cap pols en absolut i 'analogWrite (255)' va a produir un pols que dura tot el cicle fins al següent impuls, de manera que la sortida és en realitat tot el temps.
Si s'especifica un valor en el analogWrite que està entre 0 i 255 i després anem a produir un pols. Si el pols de sortida és només d'alta el 5% del temps, llavors només rebrà el 5% de la potència màxima.No podem veure el LED encès i apagat a aquesta velocitat, per a nosaltres només es veu com la brillantor està canviant .
Projectes
Kit de 10 segments LED
Anem a jugar i fer algunes combinacions en una tira de 10 LEDS. En realitat es pot fer en 10 leds normals, però queda més vistós.
Aquest és l'esquema:
Podem carregar aquest programa:
Comptador
Per a fer aquest comptador utlitzem un Display BCD i un xip cd4511be
Si tenim en compte que el xip decodificador té aquestes entrades:
i el display aquestes:
Les connexions quedaran:
Arduino | cd4511be |
---|---|
2 | A |
3 | B |
4 | C |
5 | D |
5v | Vdd, LT, BL |
GND | VSS, LE |
Les connexions del xip 4511 aniràn a les lletres segons l'esquema.
Primera versió del programa:
Solució amb un for:
LCD Nokia 5110
Per a fer aquest projecte he utilitzat la biblioteca que han fet per a aquest post: http://electronicavm.wordpress.com/2012/02/13/nokia-lcd-3310-arduino/
Per a fer aquest projecte, necessitem un LCD per a nokia 3110/5110. (Datasheet: https://www.sparkfun.com/datasheets/LCD/Monochrome/Nokia5110.pdf )
Aquest és el meu esquema (Recorda que pot no ser igual en la teua placa)
Observa que la meua llum, (7) Té entrada de GND, no de 3V.
Aquest és el codi de l'exemple:
#include <NokiaLCD.h> NokiaLCD NokiaLCD(3,4,5,6,7); // (SCK, MOSI, DC, RST, CS) void setup() { NokiaLCD.init(); // Init screen. NokiaLCD.clear(); // Clear screen. } void loop() { NokiaLCD.setCursor(1,1); NokiaLCD.print("Hello World!"); }
La biblioteca està basada en aquest article: www.arduino.cc/playground/Code/PCD8544 Anem a analitzar el codi:
Enllaços
- http://learn.adafruit.com/category/learn-arduino http://learn.adafruit.com/all-about-leds?view=all http://learn.adafruit.com/memories-of-an-arduino?view=all
- http://www.sentex.ca/~mec1995/tutorial/7seg/7seg.html
- http://www.ti.com/lit/ds/symlink/cd4511b.pdf
- http://www.hacktronics.com/Tutorials/arduino-and-7-segment-led.html
- http://es.wikipedia.org/wiki/Leyes_de_Kirchhoff