Thursday, December 8, 2016

9 Simulando saídas analógicas com analogWrite

O controlador Arduino Uno não possui saída analógica, ou seja, uma saída com uma voltagem que pode variar continuamente. No entanto, podemos simular uma usando o comando de controle analogWrite(pin, duty_cycle). O primeiro argumento é o número do pino e o segundo é o chamado "duty cycle", que é a largura de cada pulso da onda quadrada de 490Hz, variando de 0 (0% duty cycle) até 255 (100% duty cycle)

Image result for duty cycle

Como exemplo usaremos este comando para controlar continuamente (aparementemente) a luminosidade de um LED. Usamos o arquivo sketch Fading que está no menu Exemples - > 03.Analog
  Exercícios:

1. Modifique o projeto acima de modo que tenhamos dois LEDs funcioando de modos opostos.

2. Modifique o projeto acima de modo que tenhamos uma fileira de LEDs cujas luminosidades aumentam e diminuem ordenadamente.

Friday, November 4, 2016

8. Programa com while e controle de entrada serial

Leds controlados por comando while e comando de entrada.



int pinLed[10] = {13,12,11,10,9,8,7,6,5,4};
int numLed;
int x;
char digitado; 

  void setup(){
    
  for(x = 0; x<=9; x = x+1){
      pinMode(pinLed[x], OUTPUT);
  }
  Serial.begin(9600);
}
  
  void loop() {
  digitado = ' ';
  numLed = 0;
  while( digitado !='P'){
      digitalWrite(pinLed[numLed], LOW);
      
      numLed = numLed+1;
    if (numLed>9){
        numLed = 0;
    }
    digitalWrite(pinLed[numLed], HIGH);  
    if (Serial.available()){
        digitado = Serial.read();
    }
    delay(400);
  }
delay(3000);
 }


Exercício:

Entenda todos os passos do programa acima. Troque a ordem de acendimento dos leds, invente padrões que alternam o padrão de acendimento dos leds.

Wednesday, November 2, 2016

7. Tipos de variáveis

Esta atividade envolve somente prática com os diferentes tipos de variáveis, utilizando somente a saída serial da placa Uno para o monitor. Assista o vídeo,  simule os exemplos em Autodesk Circuits e finalmente implemente na prática.

Referências adicionais:
1. Operadores booleanos
2. Arduino language reference
3. Tipos de variáveis: (Sparkfun)
  • boolean (8 bit) - simple logical true/false
  • byte (8 bit) - unsigned number from 0-255
  • char (8 bit) - signed number from -128 to 127. The compiler will attempt to interpret this data type as a character in some circumstances, which may yield unexpected results
  • unsigned char (8 bit) - same as ‘byte’; if this is what you’re after, you should use ‘byte’ instead, for reasons of clarity
  • word (16 bit) - unsigned number from 0-65535
  • unsigned int (16 bit)- the same as ‘word’. Use ‘word’ instead for clarity and brevity
  • int (16 bit) - signed number from -32768 to 32767. This is most commonly what you see used for general purpose variables in Arduino example code provided with the IDE
  • unsigned long (32 bit) - unsigned number from 0-4,294,967,295. The most common usage of this is to store the result of the millis() function, which returns the number of milliseconds the current code has been running
  • long (32 bit) - signed number from -2,147,483,648 to 2,147,483,647
  • float (32 bit) - signed number from -3.4028235E38 to 3.4028235E38. Floating point on the Arduino is not native; the compiler has to jump through hoops to make it work. If you can avoid it, you should. 
Um exemplo de código usado na simulação envolvendo diferentes tipos de dados:
int x;
int y;
int z;

boolean A;
boolean B;

void setup(){

Serial.begin(9600);
Serial.println("Eu sou o Arduino");
  
x = 2;
y = 33000;
z =-x+y;

Serial.print("x =");
Serial.print(x);
A = 0;
B = 1;
  
Serial.print("  y =");
Serial.print(y,BIN);
  
Serial.print("  z =");
Serial.println(z, BIN);

Serial.print("A AND B =");
Serial.println(A && B);
  
Serial.print("A OR B =");
Serial.println(A || B);
  
Serial.print("NOT(A OR B) AND B =");
Serial.println(!(A || B) && B);

}

void loop(){
}  


Exercícios

1. Use variáveis booleanas no Arduino para determinar a tabela-verdade para (AB+C)+B+A'C, onde a multiplicação representa o operador AND, a soma representa OR e A' significa NOT(A).

2. Escreva um programa no Arduíno no qual,  dados A, B, C inteiros, ele verifica se a igualdade A^2+B^2=C^2 é satisfeita (ou seja, A,B, C formam uma tripla pitagórica), respondendo com "verdadeiro" ou "falso".

Tuesday, November 1, 2016

6. Laços (loops) com for e while

Assista o vídeo e entenda o funcionamento do comando for.   O código sketch é mostrado abaixo.

int pinLed[10] = {13,12,11,10,9,8,7,6,5,4};
int numLed;
int x;
  void setup(){
  for(x = 0; x<=9; x = x+1){
      pinMode(pinLed[x], OUTPUT);
  }
}
  
  void loop() {
  for(numLed = 0; numLed<=9; numLed = numLed+1){
      digitalWrite(pinLed[numLed], HIGH);
      delay(50);
  }
  for (numLed = 9; numLed>=0; numLed = numLed-1){
      digitalWrite(pinLed[numLed], LOW);
      delay(200);
  }
}

Este é código usando while: 

int pinLed[10] = {13,12,11,10,9,8,7,6,5,4};
int numLed;
int x;
  
  void setup(){

    
  for(x = 0; x<=9; x = x+1){
      pinMode(pinLed[x], OUTPUT);
  }
}
  
  void loop() {
  numLed = 0;
  while( numLed<=9){
      digitalWrite(pinLed[numLed], HIGH);
      delay(50);
      ; numLed = numLed+1;
  }
    numLed = 9;
    while (numLed>=0){
      digitalWrite(pinLed[numLed], LOW);
      delay(200);
      ; numLed = numLed-1;
  }
}

Aqui o correspondente diagrama do circuito desenhado em Tinkercad e a simulação:



Exercícios:

1. Construa a simulação proposta e implemente-a na prática.
2. Modifique o padrão sequencial acima de modo a gerar diferentes padrões de luzes.

Friday, October 28, 2016

5. Semáforo de 4 fases controlado por botão

Nesta atividade será construído um semáforo de 4 fases controlado por botão, utilizando comandos if - else. Assista o vídeo. O correspondente diagrama desenhado tem Tinkercad está mostrado abaixo:



Exercícios

1. Simule este circuito em Tinkercad.
2. Modifique este projeto de modo que tenhamos uma luz verde que pisque antes de fechar.
3. Construa um sistema automático de semáforos de cruzamento,  agora com dois semáforos de pedestres adicionais, um para cada rua, cada um acionado pelo respectivo botão.

Tuesday, October 25, 2016

4. Porta lógica

Assista o vídeo, entenda o funcionamento de uma porta lógica no Arduino e implemente a simulação correspondente, como mostrada abaixo


O circuito simulado em Tinkercad é mostrado abaixo: 



O código para este projeto é dado a seguir:

// the setup routine runs once when you press reset:
void setup() {
  pinMode(10, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(7, INPUT);
}
// the loop routine runs over and over again forever:
void loop() {
  int estado;
  estado = digitalRead(7);
  digitalWrite(10, estado);
  digitalWrite(9, !estado);
}

Quando a chave é acionada o led vermelho se apaga e verde se acende. Notemos que quando a chave está aberta a tensão na porta 7 é zero (o mesmo do terminal terra), de modo que estado = LOW, a porta 10 fica LOW e a 9 fica !LOW = HIGH. Quando a chave fecha a tensão na porta -7 é HIGH.

Uma variação do mesmo projeto, usando o resistor interno do Arduino é mostrada a seguir.



O código é modificado na linha em vermelho:

// the setup routine runs once when you press reset:
void setup() {
  pinMode(10, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(7, INPUT_PULLUP);
}
// the loop routine runs over and over again forever:
void loop() {
  int estado;
  estado = digitalRead(7);
  digitalWrite(10, estado);
  digitalWrite(9, !estado);
}

A finalidade do comando INPUT_PULLUP é  deixar a porta 7 no estado HIGH quando a chave está aberta. Sem este comando haveria uma flutuação de valores. Veja aqui informações adicionais.

Exercícios:

1. Faça  um diagrama de circuito do segundo projeto .
2. Implemente os projetos na prática.
3. Invente alguma variação dos projetos acima envolvendo mais botões e mais leds.

Monday, October 17, 2016

3. Sistema automático de semáforos de cruzamento

Este é o projeto para um sistema automático de semáforos de cruzamento. Abaixo está o arquivo sketch:

//Dois semaforos
int tempo;

void setup() {
  // put your setup code here, to run once:
  pinMode(13, OUTPUT);  
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(8, OUTPUT);

  tempo=5000;
}

void loop() {
  // put your main code here, to run repeatedly:

  digitalWrite(10,HIGH);
  digitalWrite(9,LOW);
  digitalWrite(8,LOW);

  digitalWrite(13,LOW);
  digitalWrite(12,LOW);
  digitalWrite(11,HIGH);  
  delay(tempo);
  
  digitalWrite(10,LOW);
  digitalWrite(9,HIGH);
  digitalWrite(8,LOW);

  digitalWrite(13,LOW);
  digitalWrite(12,LOW);
  digitalWrite(11,HIGH);  
  delay(tempo-3000);

  digitalWrite(10,LOW);
  digitalWrite(9,LOW);
  digitalWrite(8,HIGH);
  
  digitalWrite(13,HIGH);
  digitalWrite(12,LOW);
  digitalWrite(11,LOW);
  delay(tempo);

  digitalWrite(10,LOW);
  digitalWrite(9,LOW);
  digitalWrite(8,HIGH);

  digitalWrite(13,LOW);
  digitalWrite(12,HIGH);
  digitalWrite(11,LOW);  
  delay(tempo-3000);
}


Este é o projeto simulado em Tinkercad:




Esta é a implementação do projeto:

Sunday, October 16, 2016

2. Semáforo

Nesta atividade construiremos um semáforo. Inicialmente é interessante assistir este vídeo, entender como definir variáveis e implementar o projeto sugerido. Uma pequena modificação gerou o projeto de um semáforo usual. Abaixo está o programa que faz a luz verde acender por 5 segundos, a amarela por 2s e a verde por 7s.

//Semaforo
int tempo;

void setup() {
  // put your setup code here, to run once:
  pinMode(10, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(8, OUTPUT);

  tempo=5000;
}

void loop() {
  // put your main code here, to run repeatedly:

  digitalWrite(10,HIGH);
  digitalWrite(9,LOW);
  digitalWrite(8,LOW);
  delay(tempo);

  digitalWrite(10,LOW);
  digitalWrite(9,HIGH);
  digitalWrite(8,LOW);
  delay(tempo-3000);

  digitalWrite(10,LOW);
  digitalWrite(9,LOW);
  digitalWrite(8,HIGH);
  delay(tempo+200);
}

O hardware é mostrado abaixo:



Aqui, um esboço do circuito:


Exercícios:

Em todos os exercícios abaixo construa antes uma simulação em Tinkercad e depois implemente o projeto na prática.

1. Modifique o programa para que o led verde fique aceso por 5s e antes de apagar pisque 3 vezes em 2s.

2. Projete um semáforo que tem um led verde e dois vermelhos. O verde fica aceso por 5s e, depois de apagar os dois vermelhos piscam ao mesmo tempo quatro vezes durante 2s e depois acendem por 6s e piscam novamente três vezes durante 2s antes de apagar.

3. Invente o seu próprio modelo de semáforo.

4. Faça o seu arduíno controlar dois semáforos ao mesmo tempo (usando agora 6 leds). Escolha os tempos adequadamente, como se fossem ser usados num cruzamento.

Saturday, October 15, 2016

1. Introdução: Fazendo o led piscar

A primeira atividade com a placa Arduino Uno consiste em fazer o download da interface, conexão da placa com o computador, composição de um programa que faz um led piscar. É usado aqui um resistor de 100 ohms para reduzir a tensão sobre o led. O terminal longo (+) do led é conectado ao terminal 10 da placa. O terminal curto (-) é conectado, via resistor a um pino terra da placa. Veja este vídeo descritivo.

Aqui está o programa:

void setup() {
  // put your setup code here, to run once:
pinMode(10, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(10, HIGH);
  delay(300);
  digitalWrite(10, LOW);
  delay(1000);
}

Ao contrário do que foi feito no vídeo, usei um breadboard como mostrado abaixo.


Veja como funciona o breadboard na figura abaixo: 


Este é o circuito simulado em Tinkercad: 

Exercícios

1. Modifique os intervalos de tempos nos quais o led fica aceso e apagado. 
2. Desenhe o diagrama do circuito.
3. Registre-se no site do Tinkercad e simule este projeto antes de implementá-lo na prática. 
4. Determine a tensão sobre o led e sobre o resistor, sabendo que o terminal 10 fornece 5V. 
5. Use um multímetro para verificar as diferenças entre medidas e cálculos do item anterior.