Introdução à Programação de Arduino - Volume 1
Ampliando o horizonte
Ao longo de nossa jornada até aqui mencionei, em um ou outro momento, termos e conceitos que agora devemos clarificar um pouco. Não nos aprofundaremos muito porque, a rigor e nessa fase inicial de seu estudo, não há necessidade e talvez nem seja conveniente. Falarei um pouco sobre eles para evitar que lhe fique uma sensação de estar perdendo algo e, também, lhe fornecer algum subsídio caso queira buscar aprofundamento em outras fontes de consulta, o que lhe estimulo a fazer mesmo.
Além disso, ao final desse volume você encontra um glossário contendo uma relação de termos técnicos que aparecem ao longo do texto e que podem ocasionar alguma dúvida. Consulte se precisar.
Linguagem de programação
Bem lá no início da computação, a programação era feita ajustando-se várias chaves de duas posições em determinadas combinações. Depois surgiu a programação diretamente em linguagem da máquina, sequências de zeros e uns. O passo seguinte foi a criação de mnemônicos para as instruções em linguagem de máquina e esse tipo de linguagem, usada até hoje, ficou conhecida como Assembly, classificada com linguagem de baixo nível porque se comunica diretamente como o hardware. Mas por ser uma forma de programar muito desgastante e sujeita a erros, prejudicando em muito a produtividade, o Assembly evoluiu para linguagens mais amigáveis, chamadas linguagens de alto nível. Para nosso conforto e produtividade, são muitas as linguagens de programação disponíveis atualmente.
Uma linguagem de programação é um conjunto de estruturas e palavras especiais, denominadas palavras reservadas, e que podem ser usadas para que se componha conjuntos de instruções que serão executadas pelo dispositivo para o qual se programa, que pode ser um computador, um celular, um microcontrolador, um CLP etc. Entre as linguagens mais proeminentes para a programação em geral estão C, C++, Java, Python, entre tantas outras. Para microcontroladores são comumente usadas C e suas derivadas e Assembly.
Compilador
Esse é um termo que pode ser intrigante para quem nunca programou. Compilar, no contexto da programação, é converter código que foi escrito em uma linguagem de programação qualquer para código que pode ser executado em uma máquina, também referido como binário executável.
Um mesmo programa pode ser escrito em muitas linguagens mas, para ficarmos no âmbito da programação de microcontroladores, duas linguagens são comumente usadas, o Assembly e o C, como já dissemos. Note que nenhuma das duas é usada pelo Arduino, que usa um tipo de C++. Mas nada lhe impediria de programar para um Atmega, sem fazer uso do ambiente do Arduino, diretamente em Assembly. Claro que você precisaria conhecer a linguagem. De outra forma, poderia também programar em C. Veja, então, que é possível programar para o mesmo dispositivo em diversas linguagens mas que essa comodidade só existe porque, ao final do processo, existe um compilador, um programa que traduz, ou dizendo de forma mais técnica, compila o código escrito numa dada linguagem para a linguagem de máquina específica do microcontrolador em questão. O microcontrolador não entende C ou Assembly ou qualquer outra linguagem, entende apenas linguagem de máquina, sequências de zeros e uns e é papel do compilador converter o programa escrito em uma dada linguagem para a linguagem de máquina.
Do que foi dito, fica claro que para cada tipo de microcontrolador existe um compilador dedicado. Da mesma forma, um compilador que compila C para um determinado microcontrolador, pode não ser capaz de compilar outra linguagem. Por fim, o processo de compilar é complexo, envolvendo o link de bibliotecas, alocações de memória etc. Assunto para um livro inteiro.
Bibliotecas ou Librarys
Mesmo fazendo o uso de uma linguagem sofisticada para escrever um programa, há uma série de tarefas que serão tediosas e complicadas de se programar, tarefas em geral rotineiras e repetitivas. Um exemplo comum é termos de fazer com que nosso programa envie dados para o sistema de I/O, quando precisa se comunicar com o mundo externo ao microcontrolador. Ou quando precisamos acionar um temporizador interno ao microcontrolador. Via de regra, realizar esses tipos de tarefas envolve um bocado de código e de conhecimento do hardware envolvido. Pensando nisso, programadores preparam rotinas especialmente elaboradas para realizar essas tarefas repetitivas e muito úteis, permitindo que façamos uso de tais funcionalidades de forma muito simplificada. Essas rotinas aparecem na forma de funções e são colocadas na biblioteca padrão que, em geral, é instalada junto com o ambiente de desenvolvimento. A integração entre essas funções e a linguagem é tão intensa que é comum confundirmos a linguagem com a biblioteca de funções. Tenha em mente, contudo, que as funções que usamos, provenientes da biblioteca, não são, rigorosamente falando, parte de linguagem. Em nosso primeiro exemplo tivemos oportunidade de lidar com algumas funções da biblioteca padrão do Arduino, como digitalWrite() , setup() e loop(). Gaças ao uso delas foi fácil lidar com o programa e fácil entender quem faz o que. Além disso, graças a elas os programas tornan-se muito mais curtos do que seriam sem o uso da tais bibliotecas. Haverá programas nos quais teremos que solicitar, no início do programa, a inclusão de bibliotecas que não estão disponíveis por padrão para o sistema. E você poderá, no futuro, até criar suas próprias funções e disponibilizá-las na biblioteca, contribuindo para a comunidade de programadores.
Bootloader
Outro termo hermético. Mas não é difícil entender do que se trata e para que serve. Como eu já disse, os compiladores geram código binário executável, que precisa ser colocado na memória de programa do microcontrolador. Bem, o compilador está rodando em seu computador e o código binário gerado está armazenado em seu disco rígido, ou em qualquer outra mídia. Para que se possa realizar a transferência desse binário entre seu computador e a memória do microcontrolador pode-se usar um circuito eletrônico especialmente desenhado para isso, denominado gravador de programas. Esse gravador terá de ser compatível como microcontrolador em questão e deverá ser controlado por um software dedicado, instalado no computador hospedeiro. Nesse caso, não há necessidade de Bootloader, o gravador se encarrega da operação, bastando que você coloque o chip do microcontrolador no soquete do gravador e execute o programa de gravação no seu computador. Mas existe uma outra opção, usada pelo Arduino, que possibilita essa transferência bastando que haja um sistema de comunicação entre o seu computador e o microcontrolador e um programa que já está instalado na memória do próprio microcontrolador e que gerencia essa transferência. No nosso caso, esse sistema de comunicação usa a porta usb e se vale de um chip na placa do Arduino dedicado a isso. E o programa gerenciador da transferência é denominado Bootloader. É ele que torna possível à placa do Arduino transferir nossos sketches para a memória de programa do Atmega328P. Sem um Bootloader, seria necessário o uso de um gravador de programas compatível com os microcontroladores da Atmega©. Portanto, graças ao Bootloader, instalado pelo fabricante na memória do Atmega328P no momento da montagem do Arduino, não precisamos de um gravador externo, ficando a tarefa a cargo do próprio Arduino. Isso torna o processo de programar e testar muito mais ágil e menos sujeito a erros e falhas.
Depuração
Depuração é o processo de testar e, eventualmente, corrigir erros, também conhecidos como bugs, nos programas. Os erros podem ser, de modo geral, de dois tipos: lógicos ou de sintaxe. Os de sintaxe são provenientes de digitação incorreta, troca de letras, coisas assim e são acusados pelo prórpio compilador, sendo por isso de fácil solução. Já os de lógica, esses são mais complicados porque o compilador não tem meios de saber que você cometeu um erro lógico. Por exemplo, se você deseja que o led pisque a uma frequência de 10 Hz mas, por descuido, codificou para para 100 Hz ou numa tomada de decisão inverteu as instruções, isso são erros lógicos e somente você mesmo pode percebê-los. Esse tipo de erro é mais difícil de detectar, sobretudo se o código for longo. Nesse momento, os comentários ao programa podem ser decisivos porque é comum que se passem semanas, até meses, ao longo da preparação de um programa. Não espere que vá se lembrar do motivo pelo qual codificou determinado trecho dessa ou daquela maneira, 45 dias depois de tê-lo feito. Comente tudo e os dividendos virão quando precisar ler seu próprio código em busca de erros lógicos. Sem mencionar que outras pessoas podem precisar ler seu programa e é boa prática comentar o código, facilitando a vida dos outros programadores e a sua mesma. Comente, sempre.
OceanofPDF.com