Buscar

Inteligência Artificial e Robótica - Aula3

Prévia do material em texto

AULA 3 
 
 
 
 
 
 
 
 
 
 INTELIGÊNCIA ARTIFICIAL E 
ROBÓTICA 
 
 
 
 
 
 
 
 
 
 
 
Prof. Luciano Frontino de Medeiros 
 
 
 
 
 
 
2 
TEMA 1 – PROGRAMAÇÃO EM SCRATCH 
Após o estudo dos agentes, propriedades dos ambientes e dos aspectos 
relacionados com a resolução de problemas, estudaremos agora a 
implementação dos programas que devem ser executados, por um agente ou 
robô, na execução de alguma tarefa. Vimos que a função do agente é uma 
descrição abstrata das tarefas que ele precisa fazer. Para a implementação da 
função, deve-se então programar o agente/robô. 
Isso é possível por meio de linguagens de programação. Uma linguagem 
de programação permite que se codifique as atividades passo a passo, conforme 
regras bem definidas e por meio de uma simbologia própria. Ao longo da história 
da computação, as linguagens foram evoluindo a partir de descrições bastante 
ligadas à arquitetura e ao funcionamento dos computadores, para construtos mais 
elaborados e próximos da linguagem humana. Existem hoje em dia diversas 
linguagens de programação, tais linguagem C, Java, C++, Python, dentre várias 
outras. 
Para escrever um programa de computador, precisamos utilizar uma 
linguagem de computador, um conjunto de palavras predefinidas que 
são combinadas em um programa de acordo com regras 
preestabelecidas (sintaxe). Ao longo dos anos, as linguagens de 
computador evoluíram da linguagem de máquina para linguagens de alto 
nível. (Forouzan; Mosharraf, 2011, p. 215) 
Desde a criação das primeiras linguagens, a característica chave era a de 
que os comandos a serem dados a um computador deveriam seguir uma estrutura 
textual, adequada às capacidades dos computadores antes do advento das 
Inferfaces Gráficas de Usuário (GUI – Graphical User Interface). A partir da 
década de 1980, com a criação de sistemas operacionais adaptados com GUI, a 
execução de programas começa a ser feita a partir de janelas e ícones que 
representam os programas, ao invés de linhas de comando com prompts, para a 
entrada de comandos de texto. 
Dessa forma, surgiram linguagens de programação que permitiam lidar de 
forma visual e não textual com os comandos a serem executados em um 
programa. A preocupação de Papert com a criação da linguagem Logo já foi uma 
ação nesta direção, no sentido de proporcionar às crianças uma linguagem mais 
lúdica e intuitiva e, dessa forma, permitir que elas também desenvolvessem 
programas de computador, essencial para uma postura construtivista e 
construcionista (Papert, 2008). 
 
 
3 
Como uma extensão da ideia original da linguagem Logo, a linguagem 
Scratch faz parte desse rol de linguagens de programação visuais. Desenvolvida 
em 2007 pelo Media Lab, liderado por Mitchel Resnick, os alunos podem usar o 
Scratch para programar estórias, animações e jogos interativos (Resnick et al., 
2009). Durante esse processo, eles aprendem a pensar de forma criativa, a 
raciocinar sistematicamente e a trabalhar colaborativamente (Figura 1). A 
linguagem Scratch hoje herda e dá continuidade aos ideais construcionistas de 
Papert, com o uso da linguagem Logo. 
Figura 1 – Tela do Software de Programação Scratch 
 
Fonte: MIT, 2019. 
A linguagem Scratch é um bom recurso para quem está começando a 
programar, pois não exige conhecimento prévio de linguagens de programação. 
A plataforma foi desenvolvida para auxiliar crianças de 8 anos ou mais a aprender 
conceitos matemáticos e computacionais (Maloney; Resnick; Rusk, 2010). 
Portanto, o Scratch, além da herança construcionista, transcende Logo, sendo 
mais manipulável e permitindo interações sociais para dar maior significação às 
atividades. 
Na Robótica Educacional, o Scratch e outras linguagens que seguem essa 
mesma filosofia são cada vez mais populares, permitindo a iniciação das crianças 
 
 
4 
de forma mais lúdica na programação. O software Scracth pode ser baixado do 
site do MIT diretamente (<http://scratch.mit.edu>). Outras plataformas também 
estão incorporando a linguagem à sua estrutura de programação. Um exemplo é 
o Tinkercad, da Autodesk (<http:///www.tinkercad.com>), que permite a simulação 
de programas na plataforma Arduino a partir de programas construídos no modelo 
do Scratch. 
A linguagem Scratch permite que se construa um programa de forma 
interativa, por meio da justaposição de blocos em sequência. Cada bloco é um 
comando que deve ser executado na sequência, desde o primeiro bloco no topo 
até o último bloco. Por exemplo, na Figura 2 está um programa para somar dois 
valores. O primeiro bloco indica o começo da execução e depois três variáveis são 
criadas e “ocultas”: as duas variáveis que receberão os valores a serem somados 
e a variável que armazenará o resultado. A seguir, pede-se uma entrada para o 
usuário da primeira variável (v1), que logo depois modifica internamente para o 
novo valor, repetindo-se o processo para a segunda variável (v2). O 
processamento do cálculo muda o valor da variável “soma” para v1+v2, sendo 
esse resultado apresentado ao usuário após um período de dois segundos. 
Note que cada tipo de bloco (entrada de dados, processamento, saída de 
dados), tem uma cor específica, e certos blocos são criados a partir de 
combinação entre eles. Dessa forma, o Scratch permite a criação de algoritmos 
de forma visual, sendo a leitura bastante intuitiva, facilitando o aprendizado dos 
alunos. Essa mesma forma de programação pode ser utilizada para a Robótica, 
para a implementação de programas para a execução da função do agente 
robótico: 
Informalmente, um algoritmo é qualquer procedimento computacional 
bem definido que toma algum valor ou conjunto de valores como entrada 
e produz algum valor ou conjunto de valores como saída. Portanto, um 
algoritmo é uma sequência de passos que transforma a entrada na 
saída. (Cormen et al., 2002, p. 3) 
 
 
 
5 
Figura 2 – Scratch 
 
O Scratch divide os blocos a serem utilizados na programação em tipos: 
• Movimento: blocos para execução de alguma ação; 
• Aparência: apresentação ou comunicação com o usuário; 
• Som: gerenciamento de sons; 
• Caneta: blocos para a escrita na interface do Scratch; 
• Controle: controle do fluxo de execução dos demais blocos; 
• Sensores: leitura de dados provenientes de diversas fontes (mouse, teclas, 
temporizador, sensores, etc.); 
• Operadores: blocos para processamento matemático e lógico de dados; 
• Variáveis: blocos para lidar com valores de variáveis. 
Um software baseado no Scratch, que facilita a programação com a 
plataforma Arduino, é o S4A (<http://s4a.cat/>), também desenvolvido pelo 
Lifelong Kindergarten Group do MIT Media Lab. Por meio do S4A, é possível 
construir o programa em Scratch e depois carregá-lo em uma placa Arduino 
conectada a sensores e atuadores, sem necessidade de reescrever o programa 
em linguagem C, próprio da programação em plataforma Arduino (Figura 3). 
 
 
 
6 
Figura 3 – Execução do programa para acender e apagar o led embutido do 
Arduino Uno no S4A 
 
TEMA 2 – PROGRAMAÇÃO EM ROBÓTICA 
Um programa para a operação de algum agente ou robô deve ter algumas 
características peculiares. Para começar, o programa de um robô nunca deverá 
terminar, pelo menos enquanto houver energia elétrica alimentando o sistema. Ou 
seja, o programa é uma forma de fazer com que um robô fique “vivo” ou 
“consciente”. Para um ser vivo, isto faz parte da própria natureza da vida. A todo 
momento percebemos o que acontece no mundo à nossa volta, pensamos sobre 
ele e depois tomamos algumas ações. Nossa consciência nos permite definir 
quem somos e o que fazemos; de certa forma, fazemos isso sem interrupção (ou 
pelo menos, até ficarmos inconscientes). 
Para simularmos a “consciência” em um robô, ele deverá executar aquilo 
que foi mencionado anteriormente com relação ao comportamento de um agente: 
deverá perceber o ambiente ao seu redor, tomar decisões e depoisexecutar 
alguma ação nesse ambiente. Isto nos dá uma perspectiva bastante behaviorista 
ou comportamental de uma IA ou robô: ele deverá dar alguma resposta a 
estímulos provenientes do ambiente. Assim, um robô estará sempre executando 
algum algoritmo, de forma contínua e ininterrupta. Podemos dizer que o robô deve 
estar em loop infinito, percebendo o ambiente por sensores, processando os 
 
 
7 
dados obtidos e agindo por meio de atuadores específicos (Figura 4). No caso do 
S4A, existe uma estrutura de controle denominada “sempre”, que encerra os 
outros blocos internamente; após a execução do último bloco interno, ele volta ao 
primeiro, ininterruptamente. No Tinkercad, ele assume automaticamente essa 
premissa, dispensando uma estrutura externa. 
Figura 4 – Representação da “consciência” de um robô, com a execução em loop 
infinito 
 
Figura 5 – Exemplo de um programa escrito em S4A para acender/apagar o led 
embutido no Arduino, com o S4A (a) e com o Tinkercad (b) 
 
Um robô precisa ser dotado de sensores que permitam a ele perceber o 
que acontece no ambiente. De forma geral, nos projetos de robótica, sempre há 
algum tipo de sensoriamento; é necessário conhecer as características de 
funcionamento de um sensor em particular, sua faixa de operação e as formas de 
conexão, para que possa ser utilizado no programa adequadamente. Quando se 
utiliza uma plataforma para robótica, tal como o Arduino, há diversos sensores 
que já estão “encapsulados”, ou seja, montados de uma forma que facilitam que 
o usuário final os utilize em algum projeto. Esses dispositivos são chamados de 
shields (McRoberts, 2011). 
 
 
8 
Um sensor pode monitorar sinais digitais ou analógicos. Um sinal digital é 
composto somente de dois valores possíveis (geralmente 0 ou 1, ou “ligado” e 
“desligado”), como por exemplo sensor infravermelho. Já um sensor analógico 
pode monitorar uma gama de valores dentro de uma faixa específica, tal como um 
sensor ultrassom ou sensor de luz LDR. 
Por exemplo, na Figura 6 há um sensor bastante comum em projetos de 
robótica: o sensor de ultrassom HC-SR04. Funciona como uma espécie de radar: 
um dos componentes é um emissor (alto-falante) na faixa de ondas sonoras de 
ultrassom (imperceptíveis ao ouvido humano) e o outro é um receptor (microfone). 
O sensor de ultrassom pode ser programado para detectar a presença de um 
objeto à frente, sendo útil para evitar que robôs esbarrem em algum objeto ou 
parede. 
Figura 6 – Sensor de ultrassom 
 
Crédito: Pozdeyev Vitaly/Shutterstock. 
Esse sensor tem quatro pinos para conectar com o Arduino: dois são 
referentes à alimentação de energia (Vcc, o positivo, e GND, o negativo da 
bateria). Já os outros dois pinos são “Trig” (do inglês trigger, “disparo”), 
responsável por enviar o sinal de ultrassom, e “Echo”, que fornece o sinal de 
retorno. 
Em Scratch e S4A, é necessário criar uma variável que receberá o valor 
lido pelo sensor em uma porta analógica. O bloco laranja de mudança do valor de 
variável deve ser combinado com o bloco de valor do sensor. Assim, pega-se o 
bloco “valor de sensor”, com a porta de leitura analógica do Arduino respectiva; o 
valor da distância será colocado diretamente na variável: 
 
 
 
9 
Outro sensor bastante utilizado é o sensor de infravermelho (TCRT5000), 
conforme mostrado na figura 7. De forma similar ao sensor de ultrassom, o sensor 
infravermelho possui um LED que emite a luz infravermelha e um fotorreceptor 
que recebe o sinal. Este sensor é bastante utilizado para a movimentação de 
robôs seguidores de linha. Uma linha demarcada possui cor diferente que muda 
o valor a ser lido pelo sensor infravermelho, permitindo que o robô possa fazer a 
mudança do movimento. 
Figura 7 – Sensor infravermelho 
 
Crédito: Nowwy Jirawat/Shutterstock. 
Caso seja necessário distinguir variações de luminosidade, pode-se utilizar 
um sensor LDR (do inglês Light Dependent Resistor, resistor dependente de luz). 
Esse tipo de sensor varia de acordo com a intensidade de luminosidade que incide 
sobre ele (Figura 8). Como o LDR será conectado a uma entrada analógica do 
Arduino, no Scratch podem ser utilizados os blocos de comandos da mesma forma 
que o sensor de ultrassom. 
 
 
 
10 
Figura 8 – Sensor LDR – Resistor Dependente de Luz 
 
Crédito: Awe Inspiring Images/Shutterstock. 
Os atuadores serão os componentes responsáveis pela parte da ação de 
um robô. Geralmente são conectados às portas de saída de um 
microprocessador, que pode também lidar com sinal digital ou analógico. Os 
atuadores mais comuns utilizados em robótica educacional são os LEDs, o 
servomotor e o motor DC. LED vem do inglês Light Emitter Diode – diodo emissor 
de luz, sendo encontrados em várias cores e são largamente utilizados em 
projetos educacionais como indicadores visuais (Figura 9). 
Figura 9 – LEDs de diferentes cores 
 
Crédito: VladimirZhupanenko/Shutterstock. 
Outro atuador bastante utilizado é o servomotor (Figura 10). Um servomotor 
é útil quando se necessita de alterações angulares, como no caso da 
movimentação de um braço robótico, que pode ter um servomotor para cada 
articulação de movimento do braço (Figura 11). Geralmente são dimensionados 
 
 
11 
para a faixa de 0 a 180 graus. No S4A e Tinkercad, pode-se encontrar blocos 
específicos para variar o ângulo: 
 
Figura 10 – Servomotor 
 
Crédito: Kittapasp/Shutterstock. 
Figura 11 – Exemplo de um braço robótico com 5 servomotores 
 
Crédito: Iryna Imago/Shutterstock. 
Os motores DC (do inglês Direct Current – corrente contínua) são motores 
elétricos utilizados para fazer a movimentação de carros robóticos (Figura 12). 
Esse tipo de motor pode ser controlado com relação à sua velocidade e direção 
do movimento. Um motor DC tende a consumir muita corrente, sendo necessário 
utilizar um shield controlador denominado de driver de corrente ou ponte H, que 
permite a movimentação de mais de um motor (geralmente dois motores, mas 
pode ser mais), fornecendo uma alimentação própria para os motores, separada 
da alimentação do microprocessador. Um dos shields mais utilizados é o L298N. 
 
 
12 
Figura 12 – Exemplo de um motor DC 
 
Crédito: Pixel Enforcer/Shutterstock. 
Para acionar um motor DC a partir do S4A, há comandos específicos para 
acionamento de motor. As conexões para controle do motor deverão ser 
colocadas nas portas 4, 7 ou 8. Entretanto, é possível ligar um controlador de 
motor L298N, por exemplo, utilizando outros blocos para saída digital e analógica. 
Figura 13 – Carro robótico com dois motores DC, ligados a um controlador de 
motor L298N (sheld entre as rodas, na parte de baixo) 
 
Crédito: AlesiaKan/Shutterstock. 
 
https://www.shutterstock.com/pt/g/kananenka+alesia
 
 
13 
TEMA 3 – ESTRUTURAS DE CONTROLE CONDICIONAIS 
As estruturas condicionais são um tipo de estrutura de controle muito 
importante em programação, pois permitem que um programa possa executar 
conjuntos de blocos diferentes conforme o resultado de uma condição lógica. As 
estruturas de controle condicional mais comuns são chamadas também de 
comandos IF-THEN (SE-ENTÃO) ou IF-THEN-ELSE (SE-ENTÃO-SENÃO) 
(Forouzan; Mosharraf, 2011, p. 231). A representação mais comum dessa 
estrutura de controle é adotada na forma de um fluxograma, conforme mostrado 
na Figura 14. 
Figura 14 – Estrutura de controle condicional 
 
Na linguagem Scratch e S4A, podemos encontrar essas duas formas: 
 
Pode-se ilustrar o uso de estruturas condicionais com um exemplo. No caso 
de interpretar o sinal de um sensor ultrassom em um robô com dois motores para 
evitar que se choque com objetos à frente ou mesmo em uma parede, o programa 
da Figura 15 faz a leitura do valor a partir da entrada analógica ao qual está ligado 
o sensor de ultrassom e compara; caso seja menor que 10, inverte a direção dos 
motores (para fazer com que o carro robô gire sobre si mesmo), senão continua14 
com os motores se movimentando à frente. Note o bloco da estrutura condicional 
SE-ENTÃO-SENÃO. 
Figura 15 – Programa para monitorar a distância por meio de um sensor ultrassom 
e alterar a direção dos motores 
 
TEMA 4 – ESTRUTURAS DE CONTROLE DE REPETIÇÃO 
As estruturas de controle de repetição são necessárias quando um conjunto 
de blocos precisa ser repetido uma certa quantidade de vezes, ou quando atenda 
a uma determinada condição. No S4A, podemos utilizar os seguintes blocos: 
 
Por exemplo, na Figura 16 temos o programa para fazer a movimentação do 
ângulo de um servomotor, começando em zero e aumentando de 10 em 10 graus, 
até chegar em 180 graus. O bloco “repita até” tem uma condição lógica; é feito o 
teste da variável x, e se a mesma tem valor menor do que 180 graus. Caso seja 
igual ou maior, o programa sai do laço “repita até” e recomeça novamente com o 
bloco que define o valor zero para a variável x. 
 
 
15 
Figura 16 – Programa para alterar o ângulo de um servomotor de 10 em 10 graus 
 
TEMA 5 – FUNÇÕES 
Quando um programa fica muito extenso, é possível dividi-lo em partes de 
maneira que um conjunto de comandos possa ser chamado a partir de um 
programa principal. Esse é o conceito de função dentro da programação. A divisão 
em funções permite que o programa seja de mais fácil compreensão. No Scratch 
ou S4A não é possível fazer chamadas de função de forma direta, como é possível 
de se fazer em outras linguagens, como a C ou Java. Porém, podem ser utilizados 
os blocos de comandos “anuncie... para todos” (que é colocado para chamar a 
função dentro do programa) e “quando eu ouvir...”. (que é a parte que será 
executada): 
 
Voltando ao exemplo do programa do carro robô que monitora a distância 
à frente com o sensor de ultrassom: a parte interna referente à movimentação dos 
motores pode ser alterada para chamar especificamente uma função que seja 
“girar”, quando o robô precisa girar sobre si mesmo, e outra função que seja 
“frente”, para que possa seguir em frente. Na Figura 17 temos o programa 
adaptado, com duas funções para executar cada uma das tarefas em questão. 
 
 
 
16 
Figura 17 – Programa do sensor de ultrassom adaptado, contendo duas funções, 
“Girar” e “Frente”, que são chamadas dentro do bloco principal 
 
Para finalizar, o conteúdo visto nesta aula mostra como a linguagem 
baseada em Scratch pode ser utilizada para a movimentação de um robô, a partir 
de uma série de comandos e exemplos. A programação para obter 
comportamentos mais complexos pode ser feita a partir do conhecimento de mais 
comandos que fazem parte da programação Scratch. Ainda assim, é importante 
notar que essa linguagem facilita muito a programação por parte de quem está 
aprendendo, e que recursos mais avançados poderão exigir o conhecimento de 
linguagens textuais, tais como a linguagem C. 
 
 
 
 
17 
REFERÊNCIAS 
CORMEN, T. et al. Algoritmos: teoria e prática. Rio de Janeiro: Campus, 2002. 
FOROUZAN, B.; MOSHARRAF, F. Fundamentos da ciência da computação. 
São Paulo: Cengage Learning, 2011. 
MALONEY, J.; RESNICK, M.; RUSK, N. The Scratch programming language and 
environment. ACM Transactions on Computing Education, v. 10, n. 4, p. 1–15, 
2010. 
MIT MEDIA LAB. Lifelong Kindergarten Group. Disponível em: 
<http://scratch.mit.edu>. Acesso em: 19 fev. 2019. 
McROBERTS, M. Arduino básico. São Paulo: Novatec, 2011. 
PAPERT, S. A máquina das crianças: repensando a escola na era da 
informática. Porto Alegre: Artmed, 2008. 
RESNICK, M. et al. Scratch: Programming for All. Communications of the ACM, 
v. 52, p. 60-67, 2009.

Continue navegando