Baixe o app para aproveitar ainda mais
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.
Compartilhar