Tuesday, March 7, 2017

19. Medindo distâncias com som

Para que o sistema seja autônomo, uma bateria de 9V pode ser usada para alimentar o arduíno e um LCD (1602 16x2 Character LCD Display Module HD44780 Controller Blue Arduino) é usado como mostrador. 

Veja as Aulas 19 e 20 deste curso: http://www.toptechboy.com/arduino-lessons/




#include <LiquidCrystal.h> 

// initialize the library with the numbers of the interface pins
LiquidCrystal LCD(7,8,9,10,11,12);
int trigPin=13; //Sensor Trip pin connected to Arduino pin 13
int echoPin=3;  //Sensor Echo pin connected to Arduino pin 11
float pingTime;
float targetDistance;
int speed= 345; //speed of sound at 26C, 1atm, in m/s

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}

void loop() {
  // put your main code here, to run repeatedly: 
  
  digitalWrite(trigPin, LOW); //Set trigger pin low
  delayMicroseconds(2000); //Let signal settle
  digitalWrite(trigPin, HIGH); //Set trigPin high
  delayMicroseconds(10); //Delay in high state
  digitalWrite(trigPin, LOW); //ping has now been sent
  delayMicroseconds(10); //Delay in high state

     pingTime = pulseIn(echoPin, HIGH);  //pingTime is presented in microceconds
  
  targetDistance = speed*pingTime/1000000/2; 

 LCD.setCursor(0,1);  //Set cursor to first column of second row
  LCD.print("                "); //Print blanks to clear the row
  LCD.setCursor(0,1);   //Set Cursor again to first column of second row
  LCD.print(targetDistance); //Print measured distance
  LCD.print(" m");  //Print your units.
  delay(250); //pause to let things settle
}

Monday, March 6, 2017

18. Medindo a distância e velocidade do som com saída no monitor

Usamos o HC-SR04 Ultrasonic Distance Measuring Sensor Module para medir distâncias e imprimi-las no monitor.  Veja a Aula 17 deste curso: http://www.toptechboy.com/arduino-lessons/


int trigPin=13; //Sensor Trip pin connected to Arduino pin 13
int echoPin=11;  //Sensor Echo pin connected to Arduino pin 11
float pingTime;
float targetDistance;
int speed= 345; //sound speed in m/s at 26C at see level
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}
void loop() {
  // put your main code here, to run repeatedly: 
  
  digitalWrite(trigPin, LOW); //Set trigger pin low
  delayMicroseconds(2000); //Let signal settle
  digitalWrite(trigPin, HIGH); //Set trigPin high
  delayMicroseconds(10); //Delay in high state
  digitalWrite(trigPin, LOW); //ping has now been sent
  
  pingTime = pulseIn(echoPin, HIGH);  //pingTime is presented in microceconds

  targetDistance = speed*pingTime/1000000/2; 
  Serial.print("the distance is: ");
  Serial.print(targetDistance);
 Serial.println("    m");
  delay(1000);
}

Para medir a velocidade do som, partimos de uma distância bem determinada (digamos, 20cm) e modificamos o código acima do seguinte modo: 

int trigPin=13; //Sensor Trip pin connected to Arduino pin 13
int echoPin=11;  //Sensor Echo pin connected to Arduino pin 11
float pingTime;
float speedOfSound;
float targetDistance=0.2; //Distance to Target in m
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}
void loop() {
  // put your main code here, to run repeatedly: 
  
  digitalWrite(trigPin, LOW); //Set trigger pin low
  delayMicroseconds(2000); //Let signal settle
  digitalWrite(trigPin, HIGH); //Set trigPin high
  delayMicroseconds(10); //Delay in high state
  digitalWrite(trigPin, LOW); //ping has now been sent
  
  pingTime = pulseIn(echoPin, HIGH);  //pingTime is presented in microceconds

  speedOfSound = (targetDistance*2)/pingTime*1000000; 
  Serial.print("The Speed of Sound is: ");
  Serial.print(speedOfSound);
 Serial.println("    m/s");
  delay(1000);

}

Saturday, March 4, 2017

17. Semáforo (4)

Quando o botão é apertado o estado do pin 5 passa de HIGH (definida com INPUT_PULLUP) para LOW, de modo que o semáforo passa a funcionar. Se o botão é solto o estado se congela.

Baseado em:
Simon Monk, 30 Arduino Projects for the Evil Genius, McGraw-Hill Education TAB; 2nd ed., 2013. 

int redPin = 4;
int yellowPin = 3;
int greenPin = 2;
int buttonPin = 5;

int state = 0;

void setup()                    
{
  pinMode(redPin, OUTPUT);    
  pinMode(yellowPin, OUTPUT);    
  pinMode(greenPin, OUTPUT);     
  pinMode(buttonPin, INPUT_PULLUP); 
}

void loop()                    
{
  if (digitalRead(buttonPin) == LOW)
  {
    if (state == 0)
    {
      setLights(HIGH, LOW, LOW);
      state = 1;
      delay(3000);
    }
    else if (state == 1)
    {
      setLights(HIGH, HIGH, LOW);
      state = 2;
      delay(2000);
    }
    else if (state == 2)
    {
      setLights(LOW, LOW, HIGH);
      state = 3;
      delay(3000);
    }
    else if (state == 3)
    {
      setLights(LOW, HIGH, LOW);
      state = 0;
      delay(2000);
    }
    delay(1000);
  }
}

void setLights(int red, int yellow, int green)
{
  digitalWrite(redPin, red);
  digitalWrite(yellowPin, yellow);
  digitalWrite(greenPin, green);
}  





Exercício: 

1. Simule este circuito em Tinkercad e depois implemente-o físicamente.

Monday, February 6, 2017

16. Entrada analógica analogRead e saída pseudoanalógica com analogWrite

Este experimento ilustra o uso da função analogRead() e
analogWrite() para controlar a intensidade de um led com
um potenciômetro.

Lição do curso:
Coursera: Electrones en Acción: Electrónica y Arduinos para tus propios Inventos 
Pontificia Universidad Católica de Chile

Simulação em Autodesk Circuits

int AnInput = 0;
int ledPin = 11; //Este pin tem PWM
int leitura = 0;
int aux = 0;

void setup() {
 Serial.begin(9600);
 delay(1000);
 pinMode(11,OUTPUT);
 }

void loop() {
 leitura = analogRead(AnInput);
 //Mapeia o valor  ADC entre 0 e 255
 aux = map(leitura, 0, 1023, 0, 255);
 analogWrite(ledPin,aux);
 }





15. analogRead - Potenciômetro

 Este experimento ilustra o  uso da função analogRead() para medir a voltagem de um divisor de tensão.

Lição do curso:
Coursera: Electrones en Acción: Electrónica y Arduinos para tus propios Inventos 
Pontificia Universidad Católica de Chile

Implementação em Autodesk Circuits

int btn1 = 2;
int AnInput = 0;
int leitura = 0;

void setup() {
 Serial.begin(9600);
 delay(1000);
 }

void loop() {
 lectura = analogRead(AnInput);
 if (digitalRead(btn1) == LOW) {
  //Imprime o valor digital
  Serial.println(leitura);
  }
else {
 //Imprime o equivalente en voltagem
 Serial.println(leitura * 0.0049);
 }

delay(1000);
}





Sunday, February 5, 2017

14. ISR

Esta experiência mostra o uso do ISR. Consiste em que ao pressionar o botão, sem importar o momento, o led mudará seu estado: se estiver aceso, se apagará, e vice versa.

Lição do curso:
Coursera: Electrones en Acción: Electrónica y Arduinos para tus propios Inventos 
Pontificia Universidad Católica de Chile

Implementação em Autodesk Circuits

int Btn0 = 2; // Pin ligado a int.0
int Btn1 = 3; // Pin ligado a int.1
int pinLed = 11;

void setup() {
 pinMode(Btn0, INPUT);
 pinMode(Btn1, INPUT);
 pinMode(pinLed, OUTPUT);
 attachInterrupt(0,apaga_led, RISING);
 attachInterrupt(1,acende_led, RISING);
 Serial.begin(9600);
 delay(2000);
}

void loop() {
 delay(2500);
 Serial.print("Passaram ");
 delay(2500);
 Serial.println("5 segundos");
 }

 /* A função de interrupção muda o presente estado do led */

 void apaga_led() {
 digitalWrite(pinLed, 0);
 }

 void acende_led() {
 digitalWrite(pinLed, 1);
 }


13. attachInterrupt

Este código ilustra o uso do comando attachInterrupt.

Lição do curso:
Coursera: Electrones en Acción: Electrónica y Arduinos para tus propios Inventos 
Pontificia Universidad Católica de Chile

Notamos que a simulação não funcionou no Autodesk Circuits. Implemente e teste diretamente este código no seu Arduino Uno. 

//Definimos o pino correspondente ao led

int ledPin = 11;

//Definimos o pino correpondente à interrupção  0

int intPin = 2;

void setup()
{
//Configuramos os pinos como saída
pinMode(2,OUTPUT);
pinMode(ledPin, OUTPUT);
digitalWrite(intPin, HIGH);


//Configuramos a interrupcao 0 para ativar-se quando temos 
//queda de tensão, executando a funcao acende_led

attachInterrupt(0, acende_led,FALLING);
}

void loop()
 {
 digitalWrite(ledPin, LOW);
 delay(300);
 digitalWrite(intPin, LOW);

 /* Neste momento se ativa o alerta e se
 executa a funcao acende_led */

 delay(500);
 }

void acende_led(){
  digitalWrite(ledPin, HIGH);
  digitalWrite(intPin, HIGH);
  }


Sunday, January 22, 2017

12. Acesso a componentes de arrays com botões

Usaremos o mesmo circuito usado no post 11, mas agora não daremos atenção ao led e sim à saída no monitor serial.

Lição do curso:
Coursera: Electrones en Acción: Electrónica y Arduinos para tus propios Inventos 
Pontificia Universidad Católica de Chile

Implementação em Autodesk Circuits



O sketch usado é mostrado abaixo:

*/
// Variables globales
int btn1 = 8;
int btn2 = 7;
int indice = 3; // Iniciacion y asignacion de la variable del indice
int inc; // Iniciacion de la variable de incremento
int dec; // Iniciacion de la variable de decrecimiento
char arreglo[] = {'a','b','c','d','e','f','g','h'}; // Arreglo del alfabeto
void setup() {
pinMode(btn1, INPUT);
pinMode(btn2, INPUT);
Serial.begin(9600);
delay(2000);
}
void loop() {

// Se leen los botones
inc = digitalRead(btn1);
dec = digitalRead(btn2);

indice = indice + inc - dec; // El valor de indice aumenta cuando se presiona
// el boton 1 y disminuye cuando se presiona el boton 2

Serial.print(indice); // Se muestra el valor del indice en la serial para ver como cambia
Serial.print(" -> ");
Serial.println(arreglo[indice]);// Se muestra el elemento del arreglo correspondiente al indice
delay(500); // Un tiempo de espera para facilitar la visualizacion en la serial

}
/*
* Se debe notar que al aumentar el valor del indice, mas alla del numero de
* elementos que contiene el arreglo, en la serial se vera un valor incierto.

*/

11. Frequencia de intermitência controlada por botões

Lição do curso:
Coursera: Electrones en Acción: Electrónica y Arduinos para tus propios Inventos 
Pontificia Universidad Católica de Chile

Simulação em Autodesk Circuits

/*
Esta experiencia pretende mostrar el uso de variables. El tiempo de encendido/apagado del led

se almacena en una variable, la cual puede ser cambiada por las entradas de los botones.

*/

// Variables globales


int btn1 = 8;

int btn2 = 7;
int ledpin = 11;
int tmpo = 500; // Iniciacion y asignacion de la variable del tiempo
int inc; // Iniciacion de la variable de incremento
int dec; // Iniciacion de la variable de decrecimiento

void setup() {

pinMode(ledpin, OUTPUT);
pinMode(btn1, INPUT);
pinMode(btn2, INPUT);
Serial.begin(9600);
delay(2000);
}

void loop() {

inc = digitalRead(btn1); // inc toma el valor del pin btn1
dec = digitalRead(btn2); // dec toma el valor del pin btn2
tmpo = tmpo + 50*inc - 50*dec; // El valor de tmpo se modifica
Serial.println(tmpo); // Se imprime el valor de tmpo
//Encendido y apagado del LED
digitalWrite(ledpin, HIGH);
delay(tmpo);
digitalWrite(ledpin, LOW);
delay(tmpo);
}




Exemplo de implentação:



Exercício: Implemente este circuito de modo diferente do mostrado acima.

Friday, January 20, 2017

10. Botão com controle lógico

Já vimos como um botão pode controlar um led analogicamente (contato elétrico). Aqui veremos que isso pode ser feito logicamente.






















int btn=0;
void setup(){
  pinMode(8,INPUT);
  pinMode(11,OUTPUT);
}
void loop(){
  btn=digitalRead(8);
  digitalWrite(11,btn);

}


Exercício: Implemente este circuito baseado no esquema acima. Inicialmente simule e depois monte o circuito real. Use R1 = 220 ohms e R2 = 10kohms. Uma solução é mostrada a seguir: