Wednesday, January 28, 2026

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 tempo 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.

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.

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:




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.