workshop arduino

Upload: samuel-biasi

Post on 14-Jul-2015

328 views

Category:

Documents


1 download

TRANSCRIPT

Workshop de Arduino

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

Caractersticas

16kB de memria Flash 1kB de RAM 16MHz (Apple II: 1MHz) 13 portas de I/O digital 6 portas de entrada analgica RS232, PWM, I2C, SPI(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

Ambiente de DesenvolvimentoCompilao de cdigo Para a tarefa corrente Novo Sketch Abrir Sketch Guardar Sketch Enviar cdigo para o Arduino Monitor de porta srie Criar nova Tab

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

Monitorizao1 - Velocidade da porta srie 2, 3 - Envio de mensagens para o Arduino. 4 - Consola de output

4

1

2

3

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

Exemplo 1

int ledPin = 13; int count = 0; void setup() { pinMode(ledPin, OUTPUT); Serial.begin(38400); } void loop() { count = 0; while(Serial.available() > 0) { Serial.read(); digitalWrite(ledPin, HIGH); delay(250); digitalWrite(ledPin, LOW); delay(250); count++; } if(count) Serial.println(count); delay(100); }(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

Arduino API Inspirada na linguagem Processing Abstraes simples do hardware Reutilizao de cdigo (Wiring, AVR, ...) Escrita em C/C++(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

Estrutura de um programa Header Variveis globais Setup Loop

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

Tipos de dados bsicos boolean, char, byte int, unsigned int long, unsigned long oat, double string, array

O Arduino um microcontrolador de 8 bits!!! O GCC transforma alguns dos tipos de dados em cdigo RISC do ATMEGA168

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

Arduino APIConstantes utilizadas e modo de denioHIGH | LOW

INPUT | OUTPUT

true | false

Notao decimal123 | 123U | 123L | 123UL

Notao octal0137

Notao hexadecimal0x9F(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

HIGHEm modo INPUT um pino HIGH quando lido com a funo digitalRead tem um valor TRUE quando a tenso no pino igual ou superior a 3V Em modo OUTPUT um pino HIGH apresenta uma tenso de sada de 5V (source) at 50mA

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

LOWEm modo INPUT um pino LOW quando lido com a funo digitalRead tem um valor FALSE quando a tenso no pino igual ou inferior a 2V Em modo OUTPUT um pino LOW colocado a 0V. Desta forma ele pode absorver (sink) at 40mA de corrente.

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

ExtrasPROGMEMIndica ao compilador que deve guardar os dados de uma varivel na memria ash em vez de utilizar a memria RAM. Especicado em: dataType varName[] PROGMEM = {d0, ..., dn};

Ex:char message[] = Hello World; // 12 bytes em RAM char message[] PROGMEM = Hello World; // 12 bytes em FLASH

Desvantagens: Os dados guardados na memria FLASH devem ser lidos com utilizao de uma API especca (pgm_read_word, pgm_read_word_near, ...)

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

Registos especiais IExistem trs portas especiais no Arduino, que permitem a leitura simultnea de vrias entradas digitais, aumentando a ecincia das operaes de I/O. PORTB (pinos 8 a 13) PORTC (pinos de input analgico) PORTD (pinos 0 a 7) Cada porta dispem dos seguintes registos: DDRD - Data Direction Register (para a porta D) PORTD - O registo da porta D PIND - Registo de input dos pinos da porta D (read-only)(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

Registos especiais IIExemplo de leitura da PORTAD (pinos 0 a 7) // pinos 2 a 7 para output, pinos 0 e 1 inalterados DDRD = DDRD | B11111100; // coloca os pinos 3, 5 e 7 a HIGH PORTD = B10101000; // l os pinos 2 a 7 byte data = PIND & B11111100; A utilizao destas portas torna o cdigo mais difcil de depurar.

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

HAL

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

Abstraes de Hardware I Digital I/O Analog I/O Advanced I/O Temporizadores Comunicao srie(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

Digital I/OpinMode(pin, mode)Dene os modos dos pinos 0 a 13, sendo que o pino 0 e o pino 1 esto geralmente reservados para a porta srie (RX/TX). Os pinos de entrada analgicos (0 a 5) tambm podem ser utilizados como pinos de entrada digital (14 a 19)

digitalWrite(pin, value) digitalRead(pin)

Escreve o valor TRUE ou FALSE no pino.

L o valor de um pino (TRUE ou FALSE). Se o pino no estiver ligado a leitura poder oscilar.

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

Analog I/OanalogRead(pin)L um valor analgico (0 a 5V) nos pinos 0 a 5. A resoluo do ADC de 10bits, permitindo mapear tenses de entrada em valores inteiros at 1023 com uma resoluo de 4.9mV por valor. O tempo de converso e leitura de 100uS (10ks amostras por segundo)

analogWrite(pin)

Escreve um valor analgico (PWM) com uma frequncia de 490Hz. Esta funo s est disponvel nos pinos 3, 5, 6, 9, 10 e 11

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

PWM vs Sinal Analgico

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

Sinal PWMoutput = (on_time / off_time) * max_voltage

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

Caractersticas do sinal PWMLarguro do impulso numa gama de valores mnimo e mximo Perodo do impulso = 1 / impulsos por segundo Tenso do impulso em valores bem denidos ex: 0 a 5V

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

Aplicaes do sinal PWM IInterface de dados para sensores ou circuitos externos. O valor a enviar proporcional ao perodo do impulso.

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

Aplicaes do sinal PWM II

Frequencia PWM de 50Hz Impulsos desde 1 a 2 milisegundo1 milisec = posio a 0 2 milisec = posio a 180

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

Aplicaes do sinal PWM III

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

Advanced I/OshiftOut(dataPin, clockPin, bitOrder, value)Envia um conjunto de 8 bits um a um pela ordem indicada (MSBFIRST, LSBFIRST). Quando o bit escrito, o pino do clock activado dando indicao de que o valor j est disponvel. Este modo de comunicao conhecido por SPI (Synchronous Protocol Interface). Os dois dispositivos esto sempre sincronizados e comunicam perto do limite de velocidade mxima.

unsigned long pulseIn(pin, value) unsigned long pulseIn(pin, value, timeout)

L um valor PWM de um pino de I/O digital. A leitura do impulso digital sincronizada no valor indicado (HIGH ou LOW) sendo medido o tempo decorrido at que o valor de entrada mude de estado. Retorna valores de leitura veis para impulso entre 10uS e 3 minutos.

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

shiftOut(dPin, cPin, order, value)

Temporizadoresunsigned long millis() delay(ms)Nmero de millisegundos decorridos desde o incio de execuo do programa. Esta funo gasta ciclos de relgio at ter decorrido o tempo indicado em milisegundos. Quando se utiliza um valor inteiro superior a 32726 deve-se utilizar o prexo UL.

delayMicroseconds(us)

Esta funo gasta ciclos de relgio at ter decorrido o tempo indicado em microsegundos. A actual implementao desta funo garante resultados at um valor de 16383 uS.

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

Comunicao Srie

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

Comunicao Srie ISerial.begin(speed)Congura a porta srie (pinos 0 e 1) para comunicar com a velocidade indicada.

int Serial.available() int Serial.read() Serial.ush()

Nmero de bytes (caracteres) disponveis na porta srie.

L um byte da porta srie.

Limpa os dados da porta srie, isto : qualquer chamada a Serial.available() ou Serial.read() retornam os dados mais recentes depois da ltima chamada a esta funo.

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

Comunicao Srie IISerial.print(b)Envia pela porta srie qualquer tipo de valor inteiro em formato ASCII

Serial.print(b, fmt)

Envia pela porta srie qualquer tipo de valor inteiro em formato ASCII de acordo com um dos seguintes formatos: DEC, HEX, OCT, BIN, BYTE

Serial.print(str)

Envia pela porta srie uma string ASCII.

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

Comunicao Srie IIISerial.println()Envia pela porta srie os caracteres ASCII 13 \r e ASCII 10 \n

Serial.println(b) Serial.println(b, fmt) Serial.println(str)

Ver famlia de funes Serial.print(). Estas funes colocam os dados na porta srie juntamente com os caracteres ASCII 13 e 10

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

Abstraes de Hardware II Interrupts Interrupts externos

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

Interruptsinterrupts()Activa o modo de interrupt depois deste ter sido desactivo pela funo noInterrupts(). Os interrupts permitem a execuo de tarefas em background. Por omisso, o Arduino executa sempre com este modo activo.

noInterrupts()

Desactiva o modo de interrupts. Algumas funes podem produzir resultados inesperados se este modo estiver desactivo, em especial funes de tempo e comunicao de dados com o exterior. Contudo, em seces crticas de cdigo conveniente desligar os interrupts.

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

Interrupts ExternosattachInterrupt(interrupt, function, mode)Activa um interrupt externo (0, 1 nos pinos 2, 3) e associa a funo indicada ao interrupt. A funo ser executada quando o modo indicado for detectado na porta correspondente. Os modos de activao so: LOW, CHANGE, RISING, FALLING Qualquer varivel modicada pela funo associada deve ser declarada como volatil

detachInterrupt(interrupt)Desliga um interrupt externo.

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

Bibliotecas Bsicas Math Trigonometria Nmeros aleatrios(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

Mathabs(x) min(x, y) max(x, y) constrain(x, a, b)Restringe um nmero x gama de valores [a, b] para todos os tipos de dados.

map(value, fromLow, fromHigh, toLow, toHigh)Mapeia um valor da gama [fromLow, fromHigh] para a gama [toLow, toHigh].

pow(base, exponent)Calcula a potncia da base. Esta funo permite a utilizao de fraes, teis para gerar mapeamentos exponenciais de valores ou curvas (ex: curva de comportamento de um sensor)

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

Output (V)

Hystersis width

Output L

L

H 30 35 40

(Non detection) 45 50 55 60 65 70 75 80

0 5 10 15 20 25 Output switching point distance L=243cm

Exemplo da funo POWDistance to reflective object L (cm) GP2D12

Fig.5 Analog Output Voltage vs. Surface Illuminance of Reflective Object3.0 2.8 Analog output voltage VO (V) 2.4 2.0 1.6 1.2 0.8 0.4 0 0 2000 4000 6000 8000 10000 12000 14000 Surface illuminance of reflective object (lx) L=10cmReflective object Kodak Co., Ltd. gray cards R-27 (reflective ratio : 90%) illuminance meter Light source equivalent to sun light GP2D12

Fig.6 Analog Output Voltage vs.Distance to Reflective Object GP2D123.0 2.8 2.4 2.0 1.6 1.2 Gray 0.8 0.4 Draft White Gray Reflectivity 90% 18%

L=30cm Curva de comportamento do sensor Sharp GP2D12 L=60cm

Analog output voltage VO (V)

White 0 0 10 20 30 40 50 60 70 80 Distance to reflective object L (cm)

Fig.7 Analog Output Voltage vs.Ambient Temperature3.0 2.8 L=10cm 2.4 GP2D12

Fig.8 Analog Output Voltage vs.Detection (C) 2008, Filipe Valpereiro, Distance http://www.inmotion.pt3.0 2.8 2.4 GP2D12Kodak Co., Ltd. gray cards R-27 (reflective ratio : 90%) L(Distance to reflective object) X(Detectiondistance)

TrigonometriaAs seguintes funes esto disponveis: sin(angle) cos(angle) tan(angle)

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

Nmeros aleatriosrandomSeed(seed) long random(max) long random(min, max) A funo random utiliza o seu valor de seed se este no for espececado.

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

Bibliotecas avanadas I EEPROM interna, 512 bytes SoftwareSerial Wire(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

EEPROM internaO Arduino tem 512 bytes de memria permanente (EEPROM) interna (ATMEGA168) com capacidade para 100000 ciclos de escrita. byte EEPROM.read(address) EEPROM.write(address, value)Leitura/escrita da EEPROM. Gama de endereos de 0 a 511.

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

SoftwareSerialO Arduino tem suporte nativo para comunicao e dados atravs da porta srie (pinos 0 e 1), sendo que pode receber at 64 bytes na UART. Esta biblioteca implementa uma porta srie por software com as seguintes limitaes:

Velocidade at 9600 BAUD A funo Serial.available() no est disponvel Serial.read() s retorna depois de receber dados S recebe dados durante a execuo da funo Serial.read()

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

Barramento I2CDesenvolvido pela Philips em 1992 permite a conexo de 112 dispositivos num barramento de duas linhas digitais at alguns metros de extenso. Suporta as seguintes velocidades de transferncia de dados:

low-speed (10kbits/s) standard mode (100kbits/s) fast mode (400kbits/s) fast mode plus (1Mbit/s) high speed mode (3.4 Mbits/s)

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

Diagrama temporal I2C

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

WireA biblioteca Wire permite a comunicao com dispositivos I2C ou TWI. No Arduino as linhas SDA (Serial Data Line) e SDL (Serial Data Clock) esto disponveis nos pinos 4 e 5 (geralmente congurados como entradas analgicas)

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

Wire API Ibegin() begin(address)Liga o Arduino ao barramento I2C como master ou slave, indicando o endereo.

requestFrom(address, quantity)

Envia um pedido de dados a um dispositivo. O barramento ir devolver n bytes que passam a estar disponveis para leitura com as funes Wire.available() e Wire.receive()

beginTransmission(address)

Inicia a transmisso de dados para o dispositivo indicado. Os pedidos de envio seguintes via send() sero guardados numa queue e enviados quando executada a funo endTransmission()

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

Wire API IIendTransmission()Envia os dado da queue para o dispositivo indicado anteriormente.

send(value) send(string) send(data, quantity)

Envia dados ao de um dispositivo slave em resposta a um pedido do master ou guarda dados na queue para envio posterior (de master para slave) durante o intervalo entre uma chamada a beginTransmission() e endTransmission()

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

Wire API IIIbyte available()Retorna o nmero de bytes disponveis para leitura: funo receive() Esta funo deve ser chamada num dispositivo master depois da chamada funo requestFrom() ou dentro da funo onReceive() no cado de dispositivos slave

byte receive()

L um byte de dados de um master/slave

onReceive(handler)

Regista uma funo que chamada quando um dispositivo slave recebe uma transmisso de dados de um master.

onRequest(handler)

Regista uma funo que chamada quando um dispositivo master pede uma transmisso de dados um slave.

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

Bibliotecas avanadas II Metro MsTimer2 Firmata SimpleMessageSystem(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

Eventos peridicos Surgem sempre que temos mais que umatarefa recorrentes

Podem ser modelados com tabelas de

periodicidade ou com a biblioteca Metro

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

Eventos peridicos possvel programar um Arduino para pulsar dois LEDS com perodos diferentes? E para trs? e para N? Uma soluo: Metro led_1 = Metro(100); Metro led_2 = Metro(250); if(led_1.check() == 1) digitalWrite(LED1, HIGH); ...

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

MetroEsta biblioteca facilita a implementao de eventos. Metro(ms) check()Constri um objecto metro com um perodo de ms milisegundos. Verica o estado do perodo de tempo. Devolve 1 se j passou o intervalo denido ou 0 caso contrrio.

interval(ms)

Altera o valor actual do perdo do evento a associado.

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

MsTimer2Esta biblioteca facilita a utilizao do Timer2 com uma resoluo de 1milisegundo MsTimer2::set(ms, task) MsTimer::start()Inicializa o Timer2. Permite a execuo da tarefa indicada com um perodo mnimo de ms milisegundos.

MsTimer::stop()Termina o Timer2.

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

FirmataEsta biblioteca permite a implementao de rmwares simples, expondo o hardware do Arduino atravs de comandos enviados pela porta srie. O protocolo de transmisso de dados controlado pela biblioteca, permitindo que todo o trabalho necessrio se concentre na lgica de controlo.

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

SimpleMessageSystemEsta biblioteca permite a troca de mensagens de e para o Arduino. possvel com esta biblioteca controlar directamente os valores de cada uma das portas digitais bem como ler valores analgicos.

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

SPI InterfaceManipulao directa do barramento SPI por registos SPCR SPSRSPI Control Register, utilizado para congurar o barramento SPI

SPI Status Register, utilizado pelo ATMEGA para indicar o estado de uma comunicao.

SPDR

SPI Data Register, utilizado para enviar dados pelo barramento SPI.

Ligao de um dispositivo SPISLCK Serial clock MOSI Master Output Slave Input MISO Master Input, Slave Output SS Slave Select

Diagrama Temporal, SPI

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt

Alguns Links teishttp://arduino.cc/en/Tutorial/HomePage http://arduino.cc/en/Reference/HomePage http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus http://en.wikipedia.org/wiki/I2c Alguns manuais em PDF e exemplos http://todbot.com/blog/bionicarduino/

(C) 2008, Filipe Valpereiro, http://www.inmotion.pt