Você está na página 1de 6

Simular portas lgicas

Existe muitas vezes a necessidade de simular condies com o arduino de modo a obter uma sada em funo de
vrias entradas.
As portas lgicas externas podem executar essas funes mas, na maior parte dos casos, o arduino pode simular e
atuar em funo das necessidades
Pretende-se que, em funo das entradas Pinos (2,3) se obtenha uma sada no Pino (6)
Aqui fica um sexemplo da porta AND

int pinOut = 6;
int pinA = 2;
int pinB = 3;
void setup()
{
pinMode(pinOut, OUTPUT);
pinMode(pinA, INPUT);
pinMode(pinB, INPUT);
}
void loop()
{
boolean pinAState = digitalRead(pinA);
boolean pinBState = digitalRead(pinB);
boolean pinOutState;
// a prxima linha define a condio lgica neste caso "and"
pinOutState =pinAState & pinBState;
digitalWrite(pinOut, pinOutState);
}

porta "AND"
pinOutState =pinAState & pinBState;

A B Out
0
0
1
1

0
1
0
1

0
0
0
1

porta "NAND"
pinOutState = !(pinAState & pinBState);

A B Out
0
0
1
1

0
1
0
1

1
1
1
0

porta "NOR"
pinOutState = !(pinAState | pinBState);

A B Out
0
0

0
1

1
0

A B Out
1
1

0
1

0
0

porta "OR"
pinOutState = pinAState | pinBState;

A B Out
0
0
1
1

0
1
0
1

0
1
1
1

porta "NOT"
pinOutState = !pinAState;

A Q
0
1

1
0

porta "XOR"
pinOutState = pinAState ^ pinBState;

A B Q
0
0
1
1

0
1
0
1

0
1
1
0

Sequenciador de leds

ARDUINO UNO
R= 220
Led = 1,7V 15mA
Mas pretende-se vrios leds que permitam uma sequncia, neste caso, vamos definir e dar nome a cada um deles.
Definir cada um dos pinos como sada e criar o ciclo como entendermos.
No circuito, se apenas for construdo para gerador uma sequncia com um nico led aceso, pode ser usada um nico
resistor ligado massa (-), no entanto, se pretendermos alterar a "programao" para que simultneamente fiquem
acesos diversos leds, a sua luminosidade e parmetros de funcionamento ficam fora dos valores normais danificando o
circuito mais tarde ou mais cedo.
Podem ser usados mais leds em srie ou nas restantes sadas do arduino, muito importante no utilizar leds em
paralelo sem resistor na mesma sada

int
int
int
int
int

led = 6;
leda = 2;
ledb = 3;
ledc = 4;
ledd = 5;

void setup() {
pinMode(led, OUTPUT);
pinMode(leda, OUTPUT);
pinMode(ledb, OUTPUT);
pinMode(ledc, OUTPUT);
pinMode(ledd, OUTPUT);
}
void loop() {

// o led fica aceso durante o tempo de delay e apaga


digitalWrite(leda, HIGH);
delay(100);
digitalWrite(leda, LOW);
digitalWrite(ledb, HIGH);
delay(100);
digitalWrite(ledb, LOW);
digitalWrite(ledc, HIGH);
delay(100);
digitalWrite(ledc, LOW);
digitalWrite(ledd, HIGH);
delay(100);
digitalWrite(ledd, LOW);
digitalWrite(led, HIGH);
delay(100);
digitalWrite(led, LOW);
digitalWrite(ledd, HIGH);
delay(100);
digitalWrite(ledd, LOW);
digitalWrite(ledc, HIGH);
delay(100);
digitalWrite(ledc, LOW);
digitalWrite(ledb, HIGH);
delay(100);
digitalWrite(ledb, LOW);
digitalWrite(leda, HIGH);
delay(100);
digitalWrite(leda, LOW);
}
Se o objetivo apenas usar uma sequncia o cdigo pode ser melhorado

void setup()
pinMode(2,
pinMode(3,
pinMode(4,
pinMode(5,
pinMode(6,

{
OUTPUT);
OUTPUT);
OUTPUT);
OUTPUT);
OUTPUT);

}
void loop()
{
int x,status;
// delay define o tempo em que o led est aceso em milisegundos
// um ciclo no sentido de 2 a 6
for (x=2; x<=6; x++)
{
digitalWrite(x, HIGH);
delay(100);
digitalWrite(x, LOW);
}
// um ciclo no sentido de 6 a 2
// pode ser anulado se pretendermos apenas um sentido

for (x=6; x>=2; x--)


{
digitalWrite(x, HIGH);
delay(100);
digitalWrite(x, LOW);
}
}

Variar a velocidade da sequncia

O arduino pode ler a tenso na entrada analgica(A0 por exemplo), se variarmos essa tenso e definirmos o delay para
o valor da leitura, a velocidade da sequncia varia. Para isso, basta colocarmos um potencimetro entre +5V e o GND,
o pino intermdio ir ligar entrada A0.
No entanto, quando o valor muito baixo, o delay ser muito baixo ficando todos os leds a piscar a uma velocidade
muito elevada no se percebendo a sequncia. Se o objetivo ter apenas a sequncia, pode ser inserida uma
resistncia (R1) que, quanto maior o valor, menor ser a velocidade.
Vamos alterar o loop para que o delay varie em funo da leitura da entrada analgica.
void loop()
{
int sensorValue = analogRead(A0);
// como o valor elevado 0-1023
// evita-se velocidades lentas
// .12 deve ser ajustado
float voltage = sensorValue * .12;
int x,status;
for (x=2; x<=6; x++)
{
digitalWrite(x, HIGH);
delay(voltage);

digitalWrite(x, LOW);
}
for (x=6; x>=2; x--)
{
digitalWrite(x, HIGH);
delay(voltage);
digitalWrite(x, LOW);
}
}