• Nenhum resultado encontrado

MINICURSO DE ROBÓTICA COM ARDUINO

N/A
N/A
Protected

Academic year: 2021

Share "MINICURSO DE ROBÓTICA COM ARDUINO"

Copied!
47
0
0

Texto

(1)
(2)

Memória

● Memória SRAM(memória de acesso aleatório estático):é onde os sketchs criam e manipulam as variáveis quando estão em execução.

● Memória Flash(espaço do programa): é onde o sketch do Arduino é armazenado.

● Memória EEPROM (Memória Somente de Leitura Programável Apagável Eletricamente): é o espaço de memória que os programadores podem usar para armazenar informações de longo termo.

(3)

RAM x SRAM

● RAM: É um tipo de memória volátil, pois perde dados após o desligamento da energia. Ele

contém dados e processos por um período limitado de tempo, apenas até que a CPU os solicite. As operações de Leitura e Escrita atuam muito rapidamente em uma RAM.

● SRAM: É um tipo de RAM, de atualização constante e construído com transistores. ○ Mais rápido;

○ Ocupa mais espaço físico;

○ Pouca quantidade de memória(2 kbyte no Arduino uno R3); ■ Lembrando que 1 Byte são 8 bits;

(4)

Flash

● Memoria de Programa

○ Armazena o sketch compilado;

● Memória não volátil (a informação persiste mesmo depois que a energia é desligada); ● 32kb de armazenamento, onde .5kb são para o bootload;

(5)

EEPROM

● Memoria para o programador

○ Armazena dados que o programador desejar;

● Memória não volátil (a informação persiste mesmo depois que a energia é desligada); ● 1kb (1024 Bytes) de armazenamento;

● Aproximadamente 100000 escritas;

(6)

EEPROM

● Usado para armazenar dados, exemplo: ○ Configurações;

○ Dados de difícil obtenção; ○ Dados estáticos;

● 100000 escritas, nesse caso, pode ser considerado pouco, tome cuidado!!!! ● Usado também para aumento de memória usando a comunicação I2C;

(7)

● 01 - Arduino; ● 04 - Resistores: ○ 01 - 125kΩ ○ 01 - 100kΩ ○ 02 - 1kΩ ● 02 - Botões; ● 01 - Bateria 9v; ● 01 Sensor de temperatura TMP36;

Circuito 1 EEPROM:

(8)
(9)
(10)

Código:

#include <EEPROM.h> #define AMOSTRAS 12 #define pinoTensao A0 #define pinoTermostato A1 #define botaoGravar 7 #define botaoLer 3 float Temperatura; int temp; float tensao; float VRef=5; float relacao=1.8; Continua...

(11)

Código:

void setup() { Serial.begin(9600); pinMode(botaoGravar, INPUT); pinMode(botaoLer, INPUT); }

float ValorTensao(uint8_t portaAnalogica);

float ValorTemperatura(uint8_t portaAnalogica);

void GravarTemperatura();

void LerTemperatura();

void mostraTensao();

(12)

Código:

void loop() {

tensao = ValorTensao(pinoTensao); mostraTensao();

Temperatura = ValorTemperatura(pinoTermostato); mostraTemperatura();

if(tensao < 1 || digitalRead(botaoGravar) == HIGH){ GravarTemperatura();

}

if(digitalRead(botaoLer) == HIGH){ LerTemperatura(); } delay(500); } Continua...

(13)

Código:

float ValorTensao(uint8_t portaAnalogica) { float total = 0;

for (int i = 0; i<AMOSTRAS; i++) { total += analogRead(portaAnalogica); delay(5);

}

total /= (float)AMOSTRAS;

total = (total* VRef * relacao) / 1024.0; return total;

}

float ValorTemperatura(uint8_t portaAnalogica){ float total = analogRead(portaAnalogica); total *= 5;

total /= 1024; total -= 0.5;

return total *= 100; }

(14)

Código:

void GravarTemperatura(){ temp = Temperatura; byte negativo = B1; Serial.println(tensao); if( temp >= 0 ){ EEPROM.write(0, 0); EEPROM.write(1, temp); } else{ EEPROM.write(0, negativo); EEPROM.write(1, temp*-1); }

Serial.print("Valor Gravado na EEPROM com sucesso..."); }

(15)

Código:

void LerTemperatura(){

Serial.println(tensao); if( EEPROM.read(0) == 0){

Serial.println(EEPROM.read(1), DEC); } else{

Serial.println(EEPROM.read(1) * -1, DEC); }

Serial.print("Valor gravado na EEPROM: "); }

(16)

Código:

void mostraTensao() { Serial.print("Tensao: "); Serial.print(tensao); Serial.println ("V || "); } void mostraTemperatura(){ Serial.print("Temperatura: "); Serial.print(Temperatura); Serial.println ("C"); }

(17)

Interrupções:

attachInterrupt()

● Interrupção:

○ Permite a interrupção do programa atual para dar atenção a um comando, exemplo, na comunicação é usado a interrupção de forma que, quando o microcontrolador recebe um sinal, a prioridade é que ele seja interpretado e armazenado;

○ Funções de interrupções são pequenas; ○ Várias interrupções podem ser dadas;

○ Se duas ou mais interrupções acontecerem ao mesmo tempo, pode estabelecer uma prioridade entre as funções;

○ Uma interrupção começa quando outra termina; ○ cuidado onde for usar o delay();

(18)

Interrupções:

● Interrupção(valores possíveis para interrupção):

○ LOW: acionar a interrupção quando o estado do pino for LOW,

○ CHANGE: acionar a interrupção quando o sempre estado do pino mudar

○ RISING: acionar a interrupção quando o estado do pino for de LOW para HIGH apenas, ○ FALLING: acionar a interrupção quando o estado do pino for de HIGH para LOW apenas.

(19)

● 01 - Arduino; ● 04 - Resistores:

○ 03 - 220Ω ○ 01 - 330Ω ● 01 - Botões;

● 01 - LED RGB Catodo Comum;

(20)
(21)
(22)

Código:

#include <EEPROM.h>

int LED[3] = {9, 10, 11}; // Vermelho, azul, verde;

volatile const byte interruptPin = 3;

volatile int COR[3] = {0,0,0};

int corR, corG, corB;

void LerEEPROM();

void inicializaCores();

(23)

void setup(){ LerEEPROM();

inicializaCores();

for (int i = 0; i < 3; i++) { pinMode(LED[i], OUTPUT); }

pinMode(interruptPin, INPUT_PULLUP);

attachInterrupt(digitalPinToInterrupt(interruptPin), interrupcao, FALLING); Serial.begin(9600);

(24)

void loop(){

if(corR != 255)

while(corR != 255){ corR+=15;

analogWrite(LED[0], corR); delay(1500);

}

else analogWrite(LED[1], 255);

if(corB != 255)

while(corB != 255){ corB+=15;

analogWrite(LED[1], corB); delay(1500);

}

else analogWrite(LED[2], 255); if(corG != 255)

while(corG != 255){ corG+=15;

analogWrite(LED[2], corG); delay(1500);

}

else analogWrite(LED[2], 255);

(25)

corR = 0; corG = 0; corB = 0; analogWrite(LED[0], LOW); analogWrite(LED[1], LOW); analogWrite(LED[2], LOW); }

(26)

void interrupcao() { Serial.print("Valor cores: R:"); Serial.print(corR); Serial.print("|| G: "); Serial.print(corG); Serial.print("|| B: "); Serial.println(corB); EEPROM.write(0,corR); EEPROM.write(1,corB); EEPROM.write(2,corG); } Continua...

(27)

void LerEEPROM(){ if(EEPROM.read(0)!= 0){ COR[0]=EEPROM.read(0); } if(EEPROM.read(1)!= 0){ COR[1]=EEPROM.read(1); } if(EEPROM.read(2)!= 0){ COR[2]=EEPROM.read(2); } }

(28)

void inicializaCores(){ corR = COR[0];

corB = COR[1]; corG = COR[2]; }

(29)

Controle PID

P =

Proporcional = Kp * e(t)

I =

Integral = Ki * Integral(e(t)*dt)

(30)

Controle PID

● Set point (Valor desejado);

● off-set (diferença entre Set point e o valor atual); ● Kp: Ganho proporcional.

● Ki: Ganho integral.

● Kd: Ganho derivativo.

(31)

Controle PID

Controle Proporcional: Trabalha em cima do erro. Faz com que o sistema trabalhe progressivamente para que o sistema chegue no set point, entretanto, o sistema nunca vai chegar nele. Exemplo: deseja-se encher um balde de 10L com água abrindo uma torneira, mas a medida que o tempo passe, vai-se fechando a torneira aos poucos, de forma que depois de x min, a torneira tem uma vazão entre 0<x<1 e o balde não está completamente cheio.

(32)

Controle PID

Controle Integral: usa-se junto com o P. Ele trabalha o tempo de forma que o resultado do valor Proporcional se aproxima mais do setPoint, diminuindo o off-set. Quanto maior o tempo de atraso, mais chances do sistema apresentar erros.

(33)

Controle PID

Controle Derivativo: Normalmente usado com o P+I e alguma vezes com o P. Ele irá trabalhar variações de erros grandes. A função dele é prever o erro num intervalo de tempo maior. o controle é pouco usado, mais normal a se usar é o controles P+I. Seu uso é menos de 5%.

(34)

Controle PID

Cálculo do Kp, Ki, Kd

(35)
(36)

Controle PID

(37)
(38)

Controle PID

(39)

01 - Arduino;

04 - Resistores:

02 - 330Ω

01 - Potenciômetro - 250kΩ;

02 - LED;

Circuito 3 PID:

(40)
(41)

Código:

#define Resfriador 6 #define Aquecedor 3 #define TempPino A0 #define PotenPino A1 float Temperatura = 0; float SetPoint = 0; float PID=0; float PID_p=0; float PID_i=0; float kp = 2; float ki = 0.001;

(42)

Código:

void setup(){ pinMode(Resfriador, OUTPUT); pinMode(Aquecedor, OUTPUT); Serial.begin(9600); } Continua...

(43)

Código:

void loop(){ SetPoint = map(analogRead(PotenPino), 0, 1023, 0, 100); Temperatura = analogRead(TempPino); Temperatura *= 5; Temperatura /= 1024; Temperatura -= 0.5; Temperatura *= 100;

float Erro = SetPoint - Temperatura; if(Erro==0){

analogWrite(Aquecedor, 0); analogWrite(Resfriador, 0); }

(44)

Código:

PID_p = kp * Erro;

PID_i = PID_i + (ki * Erro);

PID = PID_p + PID_i; if(Erro>0){ analogWrite(Aquecedor, PID); analogWrite(Resfriador, 0); } else{ analogWrite(Resfriador, PID*-1); analogWrite(Aquecedor, 0); } Continua...

(45)

Código:

Serial.print("Set Point: "); Serial.print(SetPoint); Serial.print(" || Temperatura: "); Serial.print(Temperatura); Serial.print(" || Erro: "); Serial.print(Erro); Serial.print(" || PID: "); Serial.println(PID); delay(1000); }

(46)

Desafio:

Montar e programar um carro de controle remoto:

https://www.tinkercad.com/things/45OSQFm4nzw

(47)

Obrigado!

erus.ufes.br

@erus.ufes

Referências

Documentos relacionados

[r]

Performances heteronormativas de masculinidades faziam-se presentes na educação de sujeitos masculinos, por meio do discurso proposto pela Educação Física, objetivando a

Influência da suplementação com semente de abóbora e multimistura nos níveis séricos de cálcio e na recuperação de ratos Anais do VIII Seminário de

cionando o ato em saúde com o conhecimento médico e tratamento medicamentoso, de forma que o princípio de regionalização – que significa, de acordo com a Escola Nacional de

Podemos observar, então, que há uma distância intransponível entre os dados empíricos observados pela psicologia moral contemporânea, que aponta para “a falta de caráter”,

A reportagem do Jornal Folha do Progresso não encontro ou ex- prefeito Joviano de Almeida para comentar sobre os fatos narrados acima, no entanto estamos mantendo contato

31 de Outubro 2014 – A Lisboa operária no final do século XIX (1890-1900) em sessão do Curso de Doutoramento em História na Faculdade de Ciências Sociais e Humanas sobre

Realizada no dia 11 de setembro, a Festa do Caderno foi realizada com os alunos dos 1º e 2º anos (estes últimos, como padrinhos), concretizando um momento muito