Sunday, October 31, 2021

Exercício: Controlando dois LEDs com um Botão

Objetivo: Temos dois LEDs. O primeiro deve acender/apagar com um toque longo (25 ms) do botão e o segundo, independentemente, deve acender/apagar com um toque curto do botão. 

Uma descrição está feita em https://www.instructables.com/Arduino-Dual-Function-Button-Long-PressShort-Press/(com um erro óbvio na ligação dos fios).




Simulação em Tinkercad: https://www.tinkercad.com/things/1pGJPK1KDiN-twoledsonebutton
 
Sketch: 

int LED1 = 12;
int LED2 = 13;
int button = 3;

boolean LED1State = false;
boolean LED2State = false;

long buttonTimer = 0;
long longPressTime = 250;

boolean buttonActive = false;
boolean longPressActive = false;

void setup() {
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(button, INPUT);
}
void loop() {
if (digitalRead(button) == HIGH) {
if (buttonActive == false) {
buttonActive = true;
buttonTimer = millis();
}
if ((millis() - buttonTimer > longPressTime) && (longPressActive == false)) {
longPressActive = true;
LED1State = !LED1State;
digitalWrite(LED1, LED1State);
}
} else {
if (buttonActive == true) {
if (longPressActive == true) {
longPressActive = false;
} else {
LED2State = !LED2State;
digitalWrite(LED2, LED2State);
}
buttonActive = false;
}
}
}

Exercício: Simule e explique o funcionamento deste circuito. Construma uma implementação física.

Saturday, October 30, 2021

Exercício com PWM e analogWrite

 Objetivo: fazer o LED acender e apagar gradualmente

A simulação foi feita em Tinkercad: https://www.tinkercad.com/things/56zfbwPzEDZ-usando-analogwrite/editel


Sktech: 


int ledPin = 9;    // LED connected to digital pin 9

void setup() {

}

void loop() {

  for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 5) {

    analogWrite(ledPin, fadeValue);

    delay(30);

  }

  for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 5) {

    analogWrite(ledPin, fadeValue);

    delay(30);

  }

}











Sunday, January 27, 2019

Portas AND e NAND com transístores


A porta AND pode ser implementada com transístores como mostra a Fig. 1

Fig. 1

Na implementação simulada em Tinkercad, mostrada na Fig. 2, o LED somente acende (ON, estado 1), quando as duas chaves estão fechadas (estado 1). 

Fig. 2

A porta NAND pode ser obtida simplesmente conectando o LED ao coletor do primeiro transistor (à esquerda), como mostrado nas Figs. 3 e 4.

Fig. 3

Fig. 4

Abaixo está a lista de componentes: 



Exercício:

Simule estes circuitos no Tinkercad e depois construa-os fisicamente. 

Saturday, January 26, 2019

Porta NOT com transístor.

Neste exemplo construímos uma porta NOT com uma chave e com um transistor NPN. A porta NOT simplesmente inverte (ou nega) a entrada, como mostrado na Fig. 1.

Fig. 1

1. Implementação com chave mecânica

Construiremos incialmente um circuito simples com chaveamento mecânico. Utilizaremos as convenções mostradas na Fig. 2.

Fig. 2 


O diagrama do circuito a ser montado é mostrado na Fig. 3. Quando a chave está aberta (A = 0), o LED permanece aceso (ON <--> B = 1). Quando a chave é fechada (A = 1) o LED apaga (OFF <--> B = 0).


Fig. 3

Este circuito pode ser simulado em Tinkercad do modo mostrado na Fig. 4

Fig. 4


2. Porta NOT de  chaveamento eletrônico de transistor NPN

Implementaremos o circuito mostrado na Fig. 5. Quando a chave fecha (A = 1) a corrente base-emissor faz com que o transistor conduza corrente entre o coletor e o emissor e o LED apaga (B = 0).  Quando a chave é aberta (A = 0) o transistor bloqueia toda a corrente por ele e ela passa a circular pelo LED que acendo (B = 1).

Fig. 5

A construção de uma simulação do circuito da Fig. 5 em Tinkercad é mostrada na Fig. 6.


Fig. 6

Exercícios

1. Construa sua própria simulação em Tinkercad (sem copiar os diagramas nesta página).

2. Assista este vídeo. Com os conhecimentos adquirido construa um circuito prático calculando os valores das resistências utilizando as características do transistor e do LED (a tensão de oposição depende de sua cor) disponíveis para sua implementação. Faça com que a corrente no LED seja de aproximadamente 10 mA. Simule o circuito supondo um ganho beta = 100 e que a tensão base-emissor (VBE) seja de 0.7 V.  Em seguida construa fisicamente o circuito, faça medições de tensões correntes e determine os valores exatos de beta e VBE.  Meça os valores da corrente e das resistências no circuito real e compare com aqueles usados na simulação. Note que a corrente é medida de modo mais eficiente não diretamente e sim usando a lei de Ohm. 

3. Projete e construa fisicamente, usando os conhecimentos adquiridos nos exercícios acima, uma  simples chave eletrônica que acenda o LED quando a chave é pressionada (também chamado de buffer). Em outra atividade usaremos uma chave eletrônica para acionar uma lâmpada de 220V. 

Links adicionais
  1. Porta lógica NOT com transistor (vídeo: Laboratório de Eletrônica - YouTube)
  2. Transistor bipolar como chave (texto: Fundação Universidade Federal de Rondônia)
  3. Transistores bipolares (texto: UFSC)
  4. Análogo mecânico de um transistor.

Thursday, January 3, 2019

Combinando portas lógicas

Consideremos o seguinte circuito lógico envolvendo portas NAND (William Kleitz, Digital Electronic, A Practical Approach with VHDL, 9th Edition, Prentice Hall, 2011).



Implementemos este circuito no chip TTL  74HC00, mostrado na figura abaixo:

Abaixo mostramos uma implementação em Tinkercad:




Exercícios:

1.  Construa a tabela verdade para este circuito.
2. Implemente o exemplo acima e teste-o.
3. Construa um diagrama para o circuito.
4. Implemente este exemplo fisicamente.
5. Construa o circuito que implementa a porta lógica descrita abaixo. Construa o diagrama, simule e Tinkercad, construa a tabela-verdade e implemente fisicamente usando chips TTL. CIs CMOS são mais frágeis e suscetíveis a eletricidade estática e devem ser usados em uma configuração de circuitos diferente desta, como veremos mais tarde..


Friday, December 28, 2018

Porta lógica NOR


A porta lógica NOR pode ser descrita pela tabela-verdade:



Usando a notação booleana usual,










Faremos um teste com o IC 74HC02, descrito abaixo:

Resultado de imagem para quad nor 74HC02

Faremos um teste das portas lógicas 1Y,  1A e 1B usando o seguinte diagrama, desenhado e simulado em Tinkercad:





Exercício:

1. Use Tinkercad para desenhar e simular o teste da porta lógica.
2. Utilize o IC  74HC02 ou equivalente para construir este circuito físicamente.

Tuesday, February 6, 2018

Medições básicas (1)

Atividades:
Um LED, quando aparece num circuito ativo, apresenta uma tensão o oposta à tensão aplicada. No caso de um LED verde esta tensão é tipicamente de 2 V. Para LEDs vermelhos, amarelos e laranja, típicamente 1.5 V e 3 V para LEDs azuis. A resistência e a tensão no circuito devem ser tais que a corrente no LED não exceda 20 mA. Nesta atividade você deverá determinar esta tensão de oposição experimentalmente. Realize as seguintes atividades:

  1. Desenhe o diagrama correspondente ao circuito mostrado abaixo e explique o que acontece quando a chave é pressionada. 
  2. Simule em Tinkercad o circuito mostrado abaixo. Construa o seu próprio circuito e determine os valores medidos nos multímetros. 
  3. Construa este circuito fisicamente e meça a resitência R, a tensão Vf da fonte, Vr no resistor VL no LED verde e a corrente no circuito.  Verifique se VL+Vr=Vf e discuta as razões para uma possível discrepância.  Compare os resultados medidos com aqueles da simulação. 
  4. Meça VL para ao menos 20 LEDs verdes e calcule a média e a dispersão da tensão no LED. Construa a distribuição t.
  5. Refaça o iten 4 utilizando LEDs vermelhos, brancos, amarelos e azuis.
Nota: Se necessário, use uma bateria de 9 V e use o resistor apropriado para que a corrente no LED seja menor do que 20 mA. 


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:




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.