Introdução à Robótica
Introdução:
A melhor forma de aprender e desenvolver o chamado pensamento computacional em princípio, é estar sempre apoiado no cotidiano. Problemas que existem e mesmo os que já tem solução pronta são boas ferramentas neste objetivo. Um semáforo por exemplo, na sua forma mais simples seria apenas sinais luminosos alternando cores em função de tempos pré-determinados visando organizar por exemplo, o movimento de veículos e pedestres. Este mesmo semáforo pode agregar novas características melhorando a sua função de organizar passando a otimizar ou mesmo melhorar as condições de fluxo de veículos e pedestres, por exemplo. O projeto, portanto, passará por vários estágios. O primeiro, um semáforo simples com tempos fixos. Em um segundo estágio iremos considerar a faixa de pedestre, por exemplo, com acionamento para evitar interromper o trânsito sem necessidade. No último estágio faremos um cruzamento com dois semáforos interligados, algo comum no nosso entorno. Como proposta para continuidade do processo passaremos então pela observação de casos reais de cruzamentos buscando possíveis melhorias. Como exemplos, mas não se limitando a eles poderemos responder a algumas perguntas. É possível melhorar o desempenho do sistema alterando o funcionamento com base no horário e mesmo o dia da semana? Com base em questões de segurança é possível liberar a passagem livre no cruzamento em horários determinados? Como isso poderia ser feito de maneira segura?
Primeiro estágio: Semáforo simples
Material necessário:
- Arduino Uno
- 3 resistores de 560Ω*
- 1 LED verde
- 1 LED amarelo
- 1 LED vermelho
- Jumpers
- Protoboard
*- A função do resistor aqui é limitar a corrente que passa pelo LED, se formos calcular considerando que LEDs com essas cores apresentam uma tensão de barreira próxima a 2,1V, uma corrente de 20mA e tensão de 5V nas saídas digitais co Arduino, chegariamos a um valor próximo a 145Ω (150Ω - valor comercial mais próximo para resistores de precisão superior a 5%). Adotamos aqui o valor de 560Ω mas qualquer valor entre 150Ω e 560Ω pode ser usado. Valores mais altos podem levar a um brilho muito baixo
Código:
No nosso primeiro encontro vimos como fazer um LED piscar por um tempo determinado (código exemplo em anexo). Como o objetivo é desenvolver o pensamento computacional não será apresentado aqui o código para um semáforo simples para que vocês implementarem simplesmente copiando. A primeira tarefa será então, com base nos exemplos explicados abaixo, escrever o código. O funcionamento deverá se iniciar com o LED amarelo aceso por 10 segundos, logo depois o vermelho por 20 segundos e finalmente o verde por 15 segundos e assim por diante. Já nesse estágio vocês deveram pensar em uma maneira que facilite a alteração dos tempos de acionamento de cada LED já prevendo por exemplo uma alteração em função de horário e dia de semana, por exemplo. Nos códigos exemplo serão apresentadas mais duas maneiras de fazer o LED piscar utilizando outras instruções/comandos. Vocês escolheram qual caminho utilizar.
Diagrama e montagem:
Lembrando novamente o nosso primeiro encontro os LEDs deveram ser conectados nas portas digitais de uso geral. Vocês deveram apresentar um diagrama indicando onde serão conectados, lembrando sempre do resistor em série para limitar a corrente nos mesmos.
Alguns resistores utilizam um código de cores definidos pela IEC (International Electrotechnical Conmission) 60062. As cores devem ser lidas partir da faixa mais próxima da extremidade do resistor. Dependendo do valor e precisão podem ter de 3 a 6 faixas de cores. No nosso caso, 4 faixas, seriam digito, digito, multiolicador (número de zeros ou potência de 10) e tolerância.
| Cor | Valor | Multiplicador | Tolerância |
|---|---|---|---|
| Preto | 0 | x 1 | |
| Marrom | 1 | x 10 | ±1% |
| Vermelho | 2 | x 100 | ±2% |
| Laranja | 3 | x 1.000 | |
| Amarelo | 4 | x 10.000 | |
| Verde | 5 | x 100.000 | ±0,5% |
| Azul | 6 | x 1.000.000 | ±0,25% |
| Violeta | 7 | x 10.000.000 | ±0,1% |
| Cinza | 8 | ||
| Branco | 9 | ||
| Ouro | x 0,1 | ±5% | |
| Prata | x 0,01 | ±10% |
O resistor de 560Ω teria então as faixas verde, azul, marrom e ouro ou prata.





Código exemplo I:
//definiçes
int vermelho = 10;
void setup() {
// put your setup code here, to run once:
//colocando a porta de uso geral (GPIO - General Purpose Input/Output) na função saída (Output)
pinMode(vermelho, OUTPUT);
}
void loop() {um
// put your main code here, to run repeatedly:
digitalWrite(vermelho, HIGH); //pode ser usado HIGH, true ou 1)
// intervalo de tempo de 6 segundos
delay(6000);
digitalWrite(vermelho, LOW); //pode ser usado LOW, false ou 0) é importantet ao longo do cédigo manter um padrão
// intervalo de tempo de 3 segundosã
delay(3000);
}
Instruções:
int vermelho = 10;
Esta instrução define uma área de memória contendo um valor. Neste caso uma constante do tipo inteiro. Representa o número da GPIO (General Purpose Input/Output) que será usado para energizar o LED.
pinMode(vermelho, OUTPUT);
A função void setup (){} serve para inicializar os recursos do processador que serão utilizados durante a funcionamento. Como descrito acima a variável vermelho guarda o número da GPIO utilizada para alimentar o LED. Poderíamos utilizar diretamente o valor 10 no lugar de vermelho. Entretanto isso poderia se tornar um problema em um código mais longo onde se mostrasse necessário substituir o GPIO utilizado.
digitalWrite(vermelho, HIGH);
Coloca o GPIO no estado alto (HIGH), 3,3V ou 5V dependendo do tipo da placa, ou baixo (LOW), 0V.
delay(6000);
Promove uma pausa no processamento pelo tempo especificado em milissegundos.
Código exemplo II:
//definiçes
int vermelho = 10;
int contador = 0;
void setup() {
// put your setup code here, to run once:
//colocando a porta de uso geral (GPIO - General Purpose Input/Output) na funço saãda (Output)
pinMode(vermelho, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
contador = contador + 1;
if (contador == 1) {
digitalWrite(vermelho, HIGH);
} else if (contador == 7) {
digitalWrite(vermelho, LOW);
} else if (contador == 9) {
contador = 0;
}
delay(1000);
}
O bloco de instrução if … else permite a avaliação de uma ou mais condições e a execução ou não de uma ou mais instruções em função dessas avaliações.
Operadores utilizados nas avaliações:
| Operador: | Siginificado |
|---|---|
| x == y | x é igual a y |
| x != y | x é diferente de y |
| x < y | x é menor do que y |
| x <= y | x é menor ou igual a y |
| x > y | x é maior que y |
| x >= y | x é maior ou igual a y |
Importante: O operador x == y realiza uma comparação entre os valores x e y. Já x = y coloca na variável x o valor de y. Um erro comum em códigos: “if (x = y) {}”
Código exemplo III:
//definiçes
int vermelho = 10;
int contador = 0;
void setup() {
// put your setup code here, to run once:
//colocando a porta de uso geral (GPIO - General Purpose Input/Output) na funço saãda (Output)
pinMode(vermelho, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
contador = contador + 1;
switch (contador) {
case 1:
digitalWrite(vermelho, true);
break;
case 7:
digitalWrite(vermelho, false);
break;
case 9:
contador = 0;
break;
}
delay(1000);
Da mesma forma que o comando if no exemplo anterior, o comando switch .. case permite a avaliação de uma ou mais condições e a execução ou não não de uma ou mais instruções a ´ partir das avaliações. É importante aqui utilizar no o comando break no final de cada case. Se não for utilizado as demais instruções abaixo da primeira condição considerada positiva serão executados. Em projetos futuros veremos como usar essa característica, no momento é importante utilizar esse comando mesmo na última instrução.
Código desafio:
//definiçes
int vermelho = 10;
int contador = 0;
word semaforo = 63;
void setup() {
// put your setup code here, to run once:
//colocando a porta de uso geral (GPIO - General Purpose Input/Output) na funço saãda (Output)
pinMode(vermelho, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
digitalWrite(vermelho, (semaforo & 1));
semaforo = semaforo >> 1;
contador = contador + 1;
if (contador == 9) {
contador = 0;
semaforo = 63;
}
delay(1000);
}
O objetivo do desafio aqui é, não só mostrar que existem inúmeras maneiras de executar uma mesma função, mas demonstrar que é sempre possível buscar novas soluções eventualmente mais eficientes e melhores adaptadas a mudanças e aperfeiçoamentos. A tarefa aqui será explicar o funcionamento do código acima.
Arduíno IDE:
O Arduino é uma plataforma criada originalmente por Massino Banzi e sua equipe no Interaction Design Institute Ivrea na cidade de Irera, Itália. Criada com o objetivo de proporcionar uma alternativa barata, com código aberto, combinando hardware e software, facilitando a prototipagem eletrônica. O nome é uma homenagem a um bar local e revolucionou juntando em uma única placa um microcontrolador com comunicação serial simplificando não só o processo de gravação dos projetos como a depuração dos mesmos. Tem como principais características o baixo custo, hardware aberto, ou seja, os esquemas das placas são disponibilizados. Utiliza uma linguagem de fácil aprendizado, sendo uma versão bem simplificada da linguagem c/c++. Possui um grande volume de documentação e tutoriais disponíveis graças a uma grande comunidade ativa. O desenvolvimento do código é feito normalmente na IDE (Integrated Development Environment – Ambiente de Desenvolvimento Integrado) denominado Arduíno IDE. Entretanto pode ser feito em outros IDEs como o VS Code da Microsoft e o Eclipse por exemplo. Existem também alguns simuladores que permitem testes de códigos sem o uso do hardware. O download do IDE deve ser feito preferencialmente no site oficial do Arduino

A fig 6 mostra a IDE com o código do exemplo I já com a placa “Arduino Uno” selecionada.