Escolar Documentos
Profissional Documentos
Cultura Documentos
Instituto de Computação
ICC060 – Sistemas Lógicos (SL) – 2018/2
Prof. Leandro Galvão
OBJETIVOS:
• Avaliar respostas de um sistema computacional, usando a base binária.
• Praticar conversão de números da base decimal para a base binária, e vice-versa.
• Ganhar familiaridade com a placa Arduino e a IDE Arduino.
MATERIAIS:
• 01 placa Arduino Uno
• 08 resistores de 330 Ω
• 08 leds difusos
• 09 fios jumper macho-macho
• 01 protoboard
ATENÇÃO:
• Primeiro, monte os circuitos indicados. DEPOIS, conecte o Arduino à porta USB do compu-
tador.
• Não inverta os terminais do LED ao encaixá-lo na protoboard.
1. Um circuito eletrônico, como o da Figura 1, que você deve montar. Consulte o Apêndice,
no final deste Roteiro, caso você não tenha familiaridade com componentes eletrônicos, como
LEDs, resistores e protoboards.
2. Um sketch ou programa, como o Código 1, que você deve carregar no Arduino. Todos os códi-
gos Arduino utilizados em cada Atividade Prática de Sistemas Lógicos estão disponibilizados
no Colabweb.
1
TAREFA
1. Conecte um LED e um resistor à protoboard, e depois conecte esta ao Arduino, como ilustrado
na Figura 1. Lembre-se: o terminal curto do LED deve ser conectado no sentido do GND
(terra) do Arduino.
4. Abra o Código 1. Você pode usar a versão disponível no Colabweb ou a versão padrão disponí-
vel pelo menu Arquivo -> Exemplos -> Basics -> Blink.
5. Navegue pelo menu Ferramentas -> Porta e verifique se a porta usada pelo Arduino está
corretamente selecionada,
8. Varie o valor da função delay(), nas linhas 10 e 12, e recarregue o programa no Arduino. Por
exemplo, use os valores 2000 e 500. O que acontece?
9. Escreva na Folha de Respostas outros valores de tempo que você usou para o LED permanecer
aceso (HIGH) e permanecer apagado (LOW).
2
9 digitalWrite (13, HIGH); /* liga o LED , jogando tensao ALTA (HIGH) * /
10 delay (1000); /* espera 1 segundo * /
11 digitalWrite (13, LOW); /* desliga o LED , jogando tensao BAIXA (LOW) * /
12 delay (1000); /* espera 1 segundo * /
13 }
• setup: descreve os comandos que devem ser executados durante a inicialização do programa,
apenas uma única vez.
• loop: contém os comandos que devem ser repetidos continuamente, em um laço de duração
infinita.
A palavra-chave void (vazio) indica que as funções setup e loop não retornam nenhum valor à
função que as chamar. A função pinMode(X, <modo>) (linha 4) indica como o pino X do Arduino
será utilizado:
Por fim, a função digitalWrite(X, <tensão>) (linhas 9 e 11) aplica um nível de tensão ao pino
X indicado: tensão alta (high) ou tensão baixa (low). O LED da Figura 1 está conectado com o termi-
nal curto ligado ao GND (terra) e o terminal comprido ligado ao pino 13 do Arduino. Dessa forma,
quando aplicamos uma tensão alta ao pino 13, cria-se uma diferença de potencial, fazendo o LED
acender. Por outro lado, quando aplicamos uma tensão baixa ao pino 13, não há diferença de poten-
cial entre os terminais do LED, que por isso fica apagado.
3
15 digitalWrite(pins[i], HIGH);
16 delay(delayTime);
17 }
18
19 / * Desliga cada led em sequencia * /
20 for (byte i = 0; i < numPins; i++) {
21 digitalWrite(pins[i], LOW);
22 delay(delayTime);
23 }
24 }
Figura 2: Circuito a ser montado para acender e apagar oito LEDs em sequência.
TAREFA
1. Monte o circuito ilustrado na Figura 2. Certifique-se de usar os pinos 5 a 12 do Arduino, pois o
Código 2 faz referência a eles na linha 2.
4
5. Modifique os laços for no interior da função loop(), bem como o valor da variável delayTime
na linha 3, de modo a obter outros padrões de acendimento dos LEDs.
6. Em especial, modifique a função loop() para acender sequencialmente os LEDs conectados aos
pinos 5 a 12 e apagá-los na ordem inversa. Ou seja, o último LED a acender deve ser o primeiro
a apagar. Mostre o resultado ao instrutor.
7. Escreva na Folha de Respostas o código modificado da função loop(). Não escreva código de
outras funções!
ATENÇÃO:
• O tipo byte representa apenas valores não negativos, ou seja, valores entre 0 e 255. Portanto,
o comando byte i = 0 - 1 não atribui o valor −1 à variável i. Ao somarmos um valor
com −1, na verdade estamos ordenando que o Arduino devolva o valor anterior segundo a
sequência de valores possíveis. Assim, o valor anterior a 0 é 255, e não −1. Isso acontece
porque em espaços limitados de memória, a reta numérica funciona de forma circular.
5
Como funciona? Lembre-se que o Arduino é um sistema computacional. Por isso, todas as infor-
mações manipuladas por ele estão representadas em binário. Dessa forma, a variável num já está
armazenada em binário na memória do Arduino. Logo, é redundante e desnecessário converter para
a base binária um valor que já está na própria base binária.
Como imprimir a sequência de bits do valor de entrada? Como mostra a Figura 3, se deslocarmos
o conjunto de dígitos em sete posições para a direita, o MSB do número original será levado para a ex-
tremidade direita. Dessa forma, o valor obtido será o próprio valor do MSB (zero ou um), permitindo
sua impressão com 8 bits. Este procedimento é realizado pela linha 10 do Código 3.
Para imprimir os demais bits, repetimos o mesmo procedimento acima. Antes, porém, é ne-
cessário deslocar o bit de interesse, ou seja, aquele que desejamos imprimir, para a posição mais
significativa. Isso é feito pela linha 11, que, a cada iteração, desloca a sequência de bits de num uma
posição à direita. Note que esse comando altera o valor original de num, que é perdido ao final da
execução do laço for.
TAREFA
1. Na IDE Arduino, abra o Código 3.
4. Qual o valor em binário dos números indicados na Folha de Respostas? Modifique a linha 1
do Código 3 e pinte os quadrados correspondentes aos LEDs que acendem.
6
Código 4: Acende os LEDs correspondentes à representação binária de um número inserido pelo
Monitor Serial.
7
56 for (byte i = 0; i < numBits; i++) {
57 if (v[i] == 1)
58 digitalWrite (pins[i], HIGH);
59 else
60 digitalWrite (pins[i], LOW);
61 }
62 }
TAREFA
1. Na IDE Arduino, abra o Código 4.
3. Qual o valor em binário dos números indicados na Folha de Respostas? Insira os valores no
Monitor Serial; verifique a sequência de acendimento dos LEDs; e pinte os quadrados corres-
pondentes aos LEDs que acendem.
Experimento 5: Overflow
Overflow é uma condição em que um espaço de memória não é suficientemente grande para repre-
sentar um valor [1]. Ou seja, se um espaço de memória tem n bits de tamanho, então ele só pode
representar números naturais contidos no intervalo fechado entre 0 a 2n − 1. Valores maiores ou
iguais a 2n não podem ser representados.
Como analogia, considere um marcador de quilometragem de um carro com apenas três posições.
Se esse carro percorreu 1.234 km, então o marcador registrará 234. Dessa forma, observando apenas
o mostrador, não é possível afirmar se o carro percorreu apenas 234 km, ou 1.234 km, ou 666.234 km.
TAREFA
1. Continue a Atividade anterior, desta vez usando valores maiores ou iguais a 256 (= 28 ).
Referências
[1] Carvalho, L. S. G. Apostila de ICC060 Sistemas Lógicos, 0.6 ed. Universidade Federal do Amazo-
nas, 2017.
[2] Geddes, M. Manual de projetos do Arduino: 25 projetos práticos para começar. Novatec, 2017.
[3] Monk, S. Programação com Arduino: começando com Sketches. Bookman, Porto Alegre, 2013. Série
Tekne.
[4] Platt, C. Eletrônica para Makers: Um manual prático para o novo entusiasta de eletrônica. Novatec,
2016.
8
Apêndice – Componentes eletrônicos
Protoboard
Protoboard, ou matriz de contatos, é uma placa de plástico com furos igualmente espaçados para
encaixar componentes eletrônicos. Ela serve como base para construir protótipos de circuitos eletrô-
nicos. Por dentro da placa, existem condutores que fazem conexões ao longo das fileiras de furos [4].
Em inglês, o nome correto da protoboard é breadboard.
A Figura 4 ilustra um pedaço de uma protoboard. Já a Figura 5 ilustra como os furos da proto-
board estão interconectados internamente, formando trilhas. Componentes encaixados nos furos de
uma mesma trilha estarão interligados.
Figura 5: Interconexão interna dos furos de uma protoboard, formando trilhas horizontais (A e D),
usadas como barramento de alimentação, e trilhas verticais (B e C), usadas como área de trabalho
para encaixe dos componentes desejados.
Como mostra a Figura 5, as trilhas horizontais (A e D) são usadas para fornecer alimentação para
o circuito. Por convenção, a trilha azul deve ser conectada ao polo negativo da fonte de alimentação
(GND), e a trilha vermelha ao polo positivo (Vcc).
Note que a trilha azul do barramento A é independente da trilha azul do barramento D. Ou seja, se
o GND for conectado em A, então ele não será aplicado em D, a não ser que você interconecte essas
trilhas usando um fio jumper. Da mesma forma, as trilhas verticais em B também são independentes
das trilhas verticais em C, ainda que estejam alinhadas.
Fios jumper
Fios jumper servem para conectar furos da protoboard entre si ou a equipamentos externos, como
o Arduino. Por convenção, utilizam-se fios de cor preta (e não os azuis) para conexões ao nível
9
de tensão terra (GND) e fios de cor vermelha para conexões à tensão positiva (Vcc). As outras cores
podem ser usadas livremente. Somente nos filmes de Hollywood a cor dos fios tem algum significado
para desarmar (ou detonar) uma bomba.
LED
LED (light emitting diode, diodo emissor de luz) é um componente eletrônico que emite luz quando
uma corrente elétrica circula por ele. A intensidade da luz é proporcional à corrente que passa por
ele.
Para que uma corrente elétrica circule por um circuito, em especial por um LED, é necessário que
haja uma diferença de tensão entre os terminais. Se os dois terminais de um LED forem conectados
a uma mesma trilha da protoboard, a tensão aplicada entre eles também será a mesma, e por isso
nenhuma corrente elétrica circulará entre os terminais.
O LED deve ser sempre conectado em série com um resistor, cujo papel é limitar a corrente que
circula pelo LED, evitando que ele queime. Na prática, o LED não queima automaticamente pela
falta de um resistor, mas sua vida útil é reduzida.
Resistores
Resistores restringem a quantidade de corrente elétrica que pode fluir através de um circuito, a fim
de evitar sobrecarga nos componentes [2]. Como ilustra a Figura 6, eles se parecem com cilindros
com faixas coloridas e um fio em cada ponta.
O valor nominal do resistor é indicado pelo código de cores. A unidade de medida é ohms, cujo
símbolo é Ω. Na maior parte dos experimentos em Sistemas Lógicos, usaremos resistores de 330 Ω,
indicado pelas faixas laranja (3), laranja (3) e marrom (×101 ).
10