Baixe o app para aproveitar ainda mais
Prévia do material em texto
AULA 2 LÓGICA E MICROCONTROLADORES Prof. Charles Way Hun Fung 2 TEMA 1 – ALGORITMO O objetivo de desenvolver uma programação é resolver problemas, e, para isso, devemos reeducar nossa mente para pensarmos de forma sequencial. Um exemplo bem conhecido é uma receita de bolo; nela encontramos ingredientes e o modo de preparo. Podemos entender que os ingredientes são os dados e o procedimento de preparo são as ações que deveram ser feitas. Agora vamos estender este conceito para outras ações do dia a dia, como escovar os dentes. Parece uma tarefa muito simples, mas, começando a pensar de forma sequencial, podemos formar uma lista de atividades: Pegar a escova de dente; Pegar a pasta de dente; Abrir a pasta de dente; Pressionar a pasta de dente; Colocar a pasta na escova de dente; Fechar a pasta de dente; Guardar a pasta de dente; Colocar a escova de dente na boca; Escovar os dentes; Tirar a escova da boca; Enxaguar a boca; Enxaguar a escova de dente; Guardar a escova de dente. Esta sequência de atividades apresenta de forma resumida como é escovar os dentes, e cada instrução foi colocada de forma lógica para resolver o problema estabelecido. A capacidade de reduzir as etapas do programa em partes menores e mais simples é muito importante no desenvolvimento da lógica de programação. A partir de agora entramos no conceito de algoritmo, que, segundo Alves (2014), é a descrição textual de uma solução para determinado problema, podendo ser descrito como uma sequência lógica de etapas ou procedimentos que transformam uma entrada de dados em uma saída válida. Analisando o problema de escovar os dentes, podemos dizer que nossa entrada de dados seria a escova e a pasta de dentes. Depois que foi executado o algoritmo, tivemos uma saída válida, os dentes escovados. 3 Há três formas de se representar um algoritmo (Ascencio, 2002): a. Forma narrativa – Faz uso da linguagem natural (português) para descrever o problema passo a passo. A vantagem é que não é necessário aprender nenhum conceito novo, pois a linguagem natural já é bem conhecida. A desvantagem é que ela abre margem para diversas interpretações, dificultando a resolução do problema. b. Pseudocódigo ou Portugol – Também conhecido como português estruturado, consiste em analisar o problema e escrever, usando regras predefinidas, os passos a serem seguidos para resolver o problema. A vantagem é que os algoritmos implementados podem facilmente ser passados a uma linguagem de programação. Como desvantagem, é preciso conhecer as regras do pseudocódigo para compreendê-lo. c. Fluxograma – Consiste em analisar o problema e utilizar símbolos gráficos predefinidos, como na Figura 1, apresentando a resolução do problema passo a passo por meio do gráfico. A vantagem é que a representação gráfica torna a resposta do sistema mais simples. A desvantagem: é necessário conhecer os símbolos do fluxograma, e o gráfico resultante não traz muita informação além do que está apresentado. Figura 1 – Símbolos usados no fluxograma Fonte: Alves, 2014. 4 Exemplo de algoritmo – Fazer um algoritmo que mostre o resultado da multiplicação de dois números (Alves, 2014). Descrição narrativa 1. Receber os dois números que serão multiplicados; 2. Multiplicar os números; 3. Mostrar o resultado obtido na multiplicação. Figura 2 – Fluxograma do algoritmo exemplo Pseudocódigo (Visualg) algoritmo "Algoritmo Exemplo" var N1,N2,M: Inteiro inicio leia(N1,N2) M <- N1 * N2; escreva("Multiplicação = ",M) fimalgoritmo Este primeiro exemplo mostra como podemos reproduzir um algoritmo. Nos próximos temas, começaremos a entender como funciona a estrutura de um algoritmo e a aplicar este conceito usando linguagens de programação como Scratch e Wiring, muito usadas para escrever os códigos do Arduino. TEMA 2 – SCRATCH Consiste em um ambiente de aprendizagem desenvolvido pelo grupo Lifelong Kindergarden do MIT Media Lab. A linguagem utilizada é chamada de linguagem natural imperativa, apresentada como uma linguagem com blocos de montagem com construções básicas de qualquer linguagem de programação: variáveis, atribuições, condicionais, repetições, funções e comentários. Não precisa de conhecimentos prévios de programação, por isso é ideal para quem está começando. O funcionamento do Scratch se baseia em juntar blocos para criar uma sequência lógica a ser executada pelo computador. As instruções são encaixadas 5 uma a uma, formando cadeias de comandos que executam as etapas do algoritmo. A Figura 3 apresenta um exemplo do uso do Scratch no site de simulação Tinkercad (<www.tinkercad.com>). Figura 3 – Exemplo de Scratch Como podemos ver na Figura 3, a linguagem em blocos é bastante intuitiva – desconsiderando os comentários, pois são apenas explicações colocadas pelo programador. Este código tem apenas quatro instruções que estão nos blocos azuis e laranjas: 1. Acender o led; 2. Esperar um segundo; 3. Apagar o led; 4. Esperar um segundo. Em outras palavras, este código é um pisca led, porque se o led fica aceso um segundo e apagado um segundo, o led piscou. O objetivo deste curso será utilizar a linguagem Scratch no Arduino, fazendo um paralelo com a linguagem Wiring (Linguagem C/C++), que veremos no próximo tema. Para isso, começaremos a entender o seu uso para a programação do Arduino. Para a criação do programa, os comandos são classificados em: Saída: consiste em comandos que definem o funcionamento de leds, pinos, servos-motores, alto-falantes e porta serial, indicando o que aparecerá neste dispositivo, por exemplo, quantos graus um servo-motor irá girar. 6 Entrada: indica que será feita a leitura de um dispositivo analógico ou digital. Para isso é possível definir o mecanismo em que será feita a leitura, que pode ser um sensor de ultrassom, sensor de temperatura, porta serial, ou leitura dos graus de um servo-motor. Notações: comentários que o programador pode colocar no meio do programa; não são considerados como código. Controlar: estruturas de controle, que podem ser usadas para diversas situações que auxiliam o programador a resolver o problema. Entre elas: condicionais, repetição e contagem. Estas estruturas serão abordadas em breve com mais detalhes. Matemática: estruturas lógicas, relacionais e aritméticas que podem ser usadas no código para relacionar dois valores, por exemplo, verificar se um valor é maior que outro. Variáveis: declaração de variáveis que serão usadas para guardar algum valor que será útil na execução do código. TEMA 3 – PROGRAMAÇÃO WIRING Neste tema serão apresentados conceitos básicos da linguagem utilizada para programar o Arduino em seu ambiente de desenvolvimento integrado, que pode ser baixado no site <https://www.arduino.cc/en/Main/Software>. A IDE (ambiente integrado de desenvolvimento) pode ser instalada em sistemas operacionais como Windows ou Linux, e possui uma interface (sketch) como mostra a Figura 4: 7 Figura 4 – IDE do Arduino Na Figura 4 pode-se identificar que este ambiente é dividido em três partes (McRoberts, 2011): barra de ferramentas no topo, área de código ou sketch window no centro e janela de mensagem na base da tela. A barra de ferramentas consiste em um conjunto de botões com os itens: arquivo, editar, sketch, ferramentas, ajuda. Além destes botões, há atalhos em formato de ícones para as principais funcionalidades da ferramenta: Verificar: verifica se o código possui erros antes de enviar para o Arduino; também recebe o nome de compilar. Carregar: possui a mesma funcionalidade do botão verificar, porém, se tudo estiver correto, faz o carregamento na placa do Arduino. Novo: abre uma nova janela da IDE do Arduino, contendo apenas asfunções setup() e loop() vazias. Em outras palavras, é aberto um novo sketch em branco. Abrir: mostra uma lista de sketches que podem ser abertos, todos eles presentes no sketchbook da aplicação. Ainda dá a opção de abrir; neste caso o usuário pode buscar no computador por um sketch presente em algum outro lugar do computador. 8 Salvar: grava o código do atual em arquivo; após, na parte inferior da tela aparece a mensagem “Salvo”. A linguagem de programação adotada é uma versão otimizada da linguagem C/C++ adaptada para o Arduino. No decorrer da disciplina serão apresentados os detalhes desta linguagem, porém, se tiver interesse em se aprofundar no assunto desta linguagem de programação, recomenda-se: Treinamento em linguagem C, de Victorine Viviane Mizrahi: <https://bv4.digitalpages.com.br/?term=linguagem%2520c&searchpage=1&filtro= todos&from=busca&page=_1§ion=0#/legacy/2781>. Este software possui diversos exemplos que podem ser acessados pela barra de ferramentas em: Arquivo Exemplos. O código, apresentado na Figura 4, possui duas estruturas bem definidas: as funções setup() e loop(). Estes campos são obrigatórios em todos os programas para o Arduino. A função setup() é executada apenas uma vez no código, por isso, é usada para executar as configurações iniciais do programa ou qualquer comando que se deseje executar apenas uma vez. São comandos que serão executados assim que a placa inicializar (Oliveira, 2017). A função loop() é executada repetidamente durante o funcionamento da placa, e todos os comandos colocados nesta função serão executados repetidamente. Nesta função é colocado o núcleo do código do programa, tendo a noção que estes comandos se repetirão com uma periodicidade. O funcionamento do código é o seguinte: a placa do Arduino inicia; executa primeiramente a função setup(), executando configurações iniciais e comandos apenas uma vez. Em seguida, é executada a função loop(), que se repete até o dispositivo ser desligado, ou reiniciado. Neste caso, a função setup() será executada novamente e em seguida voltará para a função loop(). TEMA 4 – VARIÁVEL Quando elaboramos um programa, é necessário guardar alguns dados. Como exemplo, temos o algoritmo que fazia uma multiplicação: 9 Figura 5 – Fluxograma do algoritmo da multiplicação Para realizar esta operação de multiplicação, como mostrado na Figura 5, temos de obter o valor N1 e N2, para que em seguida seja realizada a operação de multiplicação. N1 e N2 podem possuir qualquer valor, mas, dependendo deste, o resultado da multiplicação pode mudar. Segundo Forbellone (2005), a definição de variável é um dado que pode ser alterado em algum instante no decorrer do tempo. Por isso, podemos dizer que N1 e N2 são variáveis, pois podem receber qualquer valor no decorrer do programa. O processo de criação de variáveis é chamado de declaração de variáveis, e a seguir serão abordadas as formas de criação de variável usando Scratch e Wiring. No Scratch (tinkercad), para criar uma variável, deve-se entrar em código, e será mostrado o menu, como na Figura 6: Figura 6 – Criar variável no Scratch (Tinkercad) Neste menu, deve-se clicar em “Criar variável”. Aparecerá uma tela, na qual poderá definir o nome da variável: Figura 7 – Definindo o nome da variável 10 O nome de variáveis, segundo Alves (2014), é chamado de identificador, mas não se limita apenas às variáveis, mas diversas outras estruturas do algoritmo que podem ser nomeadas: constantes, funções, estrutura de dados, etc. Assim que a variável for criada, podem ser usados os blocos de definir valor e alterar valor, como mostrado ne Figura 8: Figura 8 – Ações que podem ser feitas com variáveis As variáveis têm usos diversos na programação, desde armazenar valores para realizar uma operação até controlar a quantidade de vezes que serão realizadas medidas de um sensor. Na linguagem Wiring, a declaração de variável não é tão simples. Primeiramente deve-se saber qual o tipo de dado que a variável irá armazenar, por exemplo: número inteiro, que não tem casas decimais. Ou irá armazenar um caractere, que pode ser qualquer caractere representado pela tabela ASCII. Estes tipos de variáveis devem ser pensados muito bem antes de seu uso, pois cada tipo é mais indicado para certas situações. Veja a seguir todos os tipos suportados pelo Arduino (<https://www.arduino.cc/reference/pt/>): Tabela 1 – Tipos de dados no Arduino Tipo Descrição char Caractere da tabela ASCII double Números reais com grande precisão float Números reais com baixa precisão int Número inteiro long Número inteiro com maior capacidade short Número inteiro de menor capacidade String Sequência de caracteres vetor Conjunto de variáveis void Indica não retorno em funções word Número sem sinal de 16 bits 11 Os tipos mais comuns usados em projetos são: char, int, float e String. A declaração de variáveis normalmente ocorre antes da função setup(): Figura 9 – Declaração de variável na linguagem Wiring Na Figura 9, a variável teste foi declarada na linha 1. O formato para fazer esta declaração é: <Tipo da variável> <nome da variável> = <valor inicial>; Primeiro deve-se escrever qual o tipo da variável, em seguida o nome que deve ser atribuído a ela. Em seguida, é opcional o operador de atribuição igual (=) e um valor inicial, sendo finalizado com um ponto e vírgula. A seguir alguns exemplos de declarações de variáveis: int x; float numero = 10; String nome = “José”; char letra; Perceba que nos exemplos apresentados alguns receberam valor inicial e outros não receberam, isso porque atribuir um valor inicial não é obrigatório. Outro fato é que na linguagem C, de onde a linguagem Wiring surgiu, um caractere é representado por uma letra entre aspas simples: ‘A’, ‘c’, ‘1’. São respectivamente os caracteres A maiúsculo, c minúsculo e o caractere do número um. As palavras e frases são atribuídas às variáveis tipo String, e o formato deste tipo de dado é entre aspas duplas: “teste”, “ola mundo”. 12 TEMA 5 – EXEMPLO Para ilustrar o uso de algoritmos com a programação em Scratch e fazendo um paralelo com a linguagem Wiring, acompanhe o problema a seguir: Figura 10 – Exemplo de aplicação do Arduino O problema apresentado na Figura 10, indica que um botão está conectado ao pino digital 2 do Arduino. Quando o botão for pressionado o led L, irá acender na placa. Caso contrário ficará apagado. Antes de continuarmos, vamos entender como o botão funciona, veja que no circuito o lado esquerdo do botão está conectado ao pino 2, também conectado a um resistor e ao GND (terra). Este circuito indica que o pino 2 do Arduino está ligado ao terra, em outras palavras em nível lógico zero ou LOW. Quando o botão for pressionado, o pino 2 do Arduino é ligado diretamente a 5V, ou nível lógico alto ou HIGH. Agora devemos desenvolver um algoritmo para fazer esta aplicação funcionar adequadamente. Para resolver este problema vamos apresentar a forma narrativa do algoritmo em tópicos, em seguida o fluxograma, para então mostrar a solução usando as linguagens Scratch e Wiring. a. Forma narrativa: 1. Definir o pino 2 como entrada. 2. Definir o pino 13 como saída. 3. Fazer uma leitura do pino 2 e colocar o resultado em buttonState. 4. Verificar se buttonState está em HIGH. 5. Se sim, acender o led no pino 13, deixando-o em HIGH. 6. Se não, apagar o led no pino 13, deixando-o em LOW. 7. Esperar 10 ms. 8. Repetir todos os passos a partir do passo 3. 13 Figura 11 – Fluxograma da resolução do exercício Perceba que criamos uma variável para receber as leituras digitais do pino 2, chamada buttonState, leitura que será realizada a cada 10 ms. Dependendo do valor da leitura, o led irá acender ou apagar. b. Programaem Scratch Figura 12 – Resolução em linguagem Scratch 14 c. Programa em Wiring Figura 13 – Resolução em linguagem Wiring Apresentando todas as quatro formas de resolução, podemos perceber que as linguagens de programação são diretas e, em poucas linhas, apresentam muitos detalhes. Em breve abordaremos as diversas características das linguagens, sempre fazendo um paralelo entre a linguagem Scratch e Wiring. 15 REFERÊNCIAS ALVES, W. P. Linguagem e lógica de programação. 1. ed. São Paulo: Érica, 2014. ASCENCIO, A. F. G. Fundamentos da programação de computadores. 1. ed. São Paulo: Prentice Hall, 2002. FORBELLONE, A. L. V. Lógica de programação: a construção de algoritmos e estrutura de dados. 3. ed. São Paulo: Prentice Hall, 2005. MCROBERTS, M. Arduino básico. 1. ed. São Paulo: Novatec, 2011. OLIVEIRA, C. L. V. Arduino descomplicado: aprenda com projetos de eletrônica e programação. 1. ed. São Paulo: Érica, 2017.
Compartilhar