Mudanças entre as edições de "MCO018703 2022 2 AULA03"
Linha 250: | Linha 250: | ||
</center> | </center> | ||
− | ; | + | ;EXEMPLO 2 |
<syntaxhighlight lang=c> | <syntaxhighlight lang=c> |
Edição das 20h24min de 7 de setembro de 2022
Introdução a linguagem C
- OBJETIVOS
O aluno será capaz de:
- Identificar a estrutura de linguagem do Arduino;
- Aprender sobre constantes e variáveis;
- Conhecer as operações lógicas e aritméticas;
- METODOLOGIA
- A aula será expositiva e dialogada, utilizando apresentação de texto base na Internet, onde serão mostrados exemplos executados programas para programação de microcontroladores. Na prática faremos os testes de comunicação serial com o Arduino através da porta USB.
A linguagem C foi criada por Dennis Ritchie, em 1972, no centro de Pesquisas da Bell Laboratories. Sua primeira utilização importante foi a reescrita do Sistema Operacional UNIX, que até então era escrito em assembly. Em meados de 1970 o UNIX saiu do laboratório para ser liberado às universidades. Foi o suficiente para que o sucesso da linguagem atingisse proporções tais que, por volta de 1980, já existiam várias versões de compiladores C oferecidas por diversas empresas, não sendo mais restritas apenas ao ambiente UNIX, como também compatível a outros sistemas operacionais. O C é uma linguagem de propósito geral, sendo adequada à programação estruturada. No entanto é mais utilizada para escrever compiladores, analisadores léxicos, bancos de dados, editores de texto, e sistemas embarcados.
A linguagem C pertence a uma família de linguagens cujas características são: portabilidade, modularidade, compilação separada, recursos de baixo nível, geração de código eficiente, confiabilidade, regularidade, simplicidade e facilidade de uso.
Fonte: [1] - Centro de Computação - UNICAMP
- Histórico Completo
- Características da Linguagem
- O C K&R (uma especificação informal da linguagem) e o ANSI C
- Linguagem imperativa e procedural.
Comentários
Os comentários no programa fonte não têm função nenhuma para o compilador e serve apenas para aumentar a legibilidade e clareza do programa, podem ser inseridos com “//” que valem de onde começam até o fim da linha ou com “/*” e “*/”, sendo considerado comentário tudo entre “/*” e “*/”.
Identificadores
Um identificador é um símbolo definido pelo usuário que pode ser um rótulo (label), uma constante, um tipo, uma variável, um nome de programa ou subprograma (procedimento ou função). Normalmente devem começar com um caractere alfabético e não podem conter espaços em branco, podendo ter no máximo 32 caracteres, não havendo distinção entre maiúsculas e minúsculas.
Endentação
A endentação também não tem nenhuma função para o compilador e serve para tornar a listagem do programa mais claro dando hierarquia e estrutura ao programa.
Constantes
Constantes são valores declarados no início do programa e que não se alteram na execução do programa. Podem ser expressas em qualquer base numérica.
Variáveis
Uma declaração de variável consiste do nome do tipo de dado seguido do nome da variável. Todas as variáveis devem ser declaradas antes de serem usadas. As variáveis devem ser declaradas no início de cada função, procedimento ou início do programa.
Elementos definidos pela linguagem C
- Letras (alfanuméricas) Aa até Zz;
- Dígitos (numéricos) - 0 até 9;
- Operadores;
- Tipos de dados.
Operadores e Símbolos Especiais
Operador | Significado | Exemplo |
---|---|---|
* | multiplicação | a = b * c |
/ | divisão | a = b / c |
% | resto | a = 13 % 3, a = 1 |
+ | adição | a = b + c |
- | subtração | a = b - c |
= | atribuição | a = b |
== | comparação compara dois operandos | if(a == 10) |
< | menor que | a < b |
<= | menor ou igual | a <= b |
> | maior que | a > b |
>= | maior ou igual | a >= b |
!= | diferente de | a=10, Se( a != 3) então verdadeiro |
<< | deslocamento de bit a esquerda | 3 (00000011) << 1 = 6 (00000110) |
>> | deslocamento de bit a direita | 4 (00000100) >> 1 = 2 (00000010) |
& | lógica E bit a bit | 00000011 & 00000110 = 00000010 |
&& | lógica E (AND) | a=2, Se(a>1 && a<3) então verdadeiro |
^ | OU exclusivo bit a bit | 00001100 ^ 00000110 = 00001010 |
| | OU inclusivo bit a bit | 00001101 = 0001101 |
|| |
lógica OU (OR) | a=4, Se( a>3 || a<5) então verdadeiro |
! | lógica Não (NOT) | Se( ! a ) equivalente a Se( a == 0) |
~ | complemento bit a bit | ~00010101 = 11101010 |
" | delimitador de string | "Arduino" |
Tipos de dados
Um Tipo de Dado define o conjunto de valores que uma variável pode assumir e as operações que podem ser feitas sobre ela. Toda variável em um programa deve ser associada a um tipo de dado. Mais abaixo veremos os tipos de dados mais utilizados pelo Arduino.
- Inteiros (int)
- são dados relacionados à números inteiros. Ex: quantidade de vezes que um botão foi pressionado.
- Flutuantes (float)
- são dados relacionados à números reais, ou seja, com casas decimais. Ex: temperatura ambiente.
- Caracteres (char)
- são dados como letras, números e caracteres especiais. Podem ser apenas um ou um conjunto, formando palavras ou mensagens inteiras. Ex: mensagem mostrada em um display.
- Booleanos (bool)
- são dados com apenas duas possibilidades, TRUE ou FALSE. Ex: botão pressionado ou não pressionado.
Exemplos:
int x; float temperatura; char dado = ‘a’; bool R1 = TRUE;
Estrutura da Linguagem do Arduino
A estrutura básica da linguagem de programação do Arduino é bastante simples; ela é formada por dois blocos de funções que carregam outros blocos de funções escritas em linguagem C/C++. O primeiro bloco de funções forma a função setup(); o segundo, a função loop().
- Funções
- Em linguagens de programação são como sub-rotinas ou procedimentos; são pequenos blocos de programas usados para montar o programa principal. Elas são escritas pelo programador para realizar tarefas repetitivas, ou podem ser
importadas prontas para o programa em forma de bibliotecas.
- Declaração da Função
- Toda função deve ser declarada antes de ser chamada atribuindo-lhe um tipo e um nome seguido de parênteses, onde serão colocados os parâmetros de passagem da função. Depois do nome são definidos entre as chaves '{' e '}' os procedimentos que a função vai executar.
- setup()
- Essa é a primeira função a ser chamada quando o programa inicia. E é executada apenas nessa primeira vez. Esta é uma função de preparação: ela dita o comportamento dos pinos do Arduino e inicializa a porta serial.
- loop()
- A função loop( ) é chamada logo a seguir e todas as funções embarcadas nela são repetidamente executadas. Ela fica lendo os pinos de entrada do Arduino e comandando os pinos de saída e a porta serial.
Os Símbolos usados na construção de funções são os seguintes: { } - Dentro das chaves vão os procedimentos (statements) que a função deve executar; ; - O ponto-e-vírgula é usado para marcar o final de um procedimento; // - comentário de uma linha: qualquer caractere depois das duas barras é ignorado pelo programa; /*...*/ - comentário em várias linhas: qualquer texto colocado entre esses símbolos também é ignorado pelo programa.
- EXEMPLO 1
/*
Nesse código a função '''setup( )''' ativa a porta serial em 9600 bits/s
e a função loop( ) fica transmitindo a frase "Hello World!" pela porta
serial a cada 2 segundos.
*/
void setup( )
{
Serial.begin(9600); // inicializa a porta serial
}
void loop( )
{
Serial.println("Hello World!"); // transmite frase
delay(2000);
}
Constantes e Variáveis
- Constantes
- São valores predefinidos que nunca podem ser alterados. Na linguagem C do Arduino são 3 os grupos de constantes; os dois componentes de cada grupo sempre podem ser representados pelos números binários 1 e 0.
- TRUE/FALSE são constantes booleanas que definem estados lógicos. Verdadeiro é qualquer valor que não seja zero. Falso é sempre o valor zero.
- HIGH/LOW essas constantes definem as tensões nos pinos digitais do Arduino. Alto é uma tensão de 5V; baixo o GND(ou 0V).
- INPUT/OUPUT são constantes programadas pela função pinMode( ) para os pinos do Arduino; eles podem ser entradas (de sensores) ou podem ser saídas (de controle).
- Variáveis
- São posições na memória de programa do Arduino marcadas com um nome e o tipo de informação que irão guardar. Essas posições podem estar vazias ou podem receber um valor inicial. Os valores das variáveis podem ser alterados pelo
programa.
- Escopo da Variável é o limite ou abrangência da variável. Uma variável pode ser declarada em qualquer parte do programa. Se for declarada logo no início, antes da função setup( ), ela tem o escopo de Variável Global, e porisso ela pode ser vista e usada por qualquer função no programa. Se declarada dentro de uma função ela tem o escopo de Variável Local, e só pode ser usada por essa função.
- Declaração da Variável como as funções, toda variável deve ser declarada antes de ser chamada. Essa declaração consiste em atribuir previamente um tipo e um nome à variável.
- Tipos de variáveis numéricas completas:
Tipo | Descrição |
---|---|
byte | armazena 8 bits (0-255); |
int | armazena números inteiros de até 16 bits; |
long | armazena números inteiros de até 32 bits; |
float | podem armazenar números fracionários de até 32 bits. |
- EXEMPLO 2
/* Esse programa escrito em C do Arduino aumenta e diminui gradativamente o brilho de um LED
conectado no pino PWM 10 do Arduino. */
int i=0; // declaração da variável global inteira i iniciada com 0
void ledOn( ); // declaração da função criada ledOn do tipo void
void setup( )
{
pinMode(10,OUTPUT); // aqui 2 parâmetros são passados à função pinMode( )
}
void loop( )
{
for (i=0; i <= 255; i++) ledOn( ); // aumenta o brilho do led
for (i=255; i >= 0; i--) ledOn( ); // diminui o brilho do led
}
void ledOn( ) // função que acende o led
{
analogWrite (10, i); // o nº do pino e o valor de i são passados à função analogWrite( )
delay (10);
}
Lógica e Aritmética
- Operações Aritméticas e lógicas
- As 4 operações aritméticas: divisão, multiplicação, adição e subtração, são representadas pelos símbolos: /, *, + e -, respectivamente, separando os operandos. E são 3 os operadores lógicos na linguagem do Arduino que são usados para comparar duas expressões e retornar a constante TRUE/FALSE.
Símbolos compostos são aqueles que combinam os símbolos aritméticos entre si e com o sinal de atribuição:
x++ // x=x+1 x-- // x=x-1 x += y // x=x+y x -= y // x=x-y x *= y // x=x*y x /= y // x=x/y
Operadores de comparação comparam uma variável com uma constante, ou variáveis entre si. São usados para testar se uma condição é verdadeira.
x == y // x é igual a y x != y // x não é igual a y x < y // x é menor que y x > y // x é maior que y x <= y // x é menor ou igual a y x >= y // x é maior ou igual a y
Operadores lógicos são usados para comparar duas expressões, retornam 1 ou 0 (verdadeiro/falso).
&& AND porta lógica 'E' || OR porta lógica 'OU' ! NOT porta lógica 'NÃO'
Funções Matemáticas e de Tempo
- delay(ms)
- Essa função pausa o programa por um período em milissegundos indicado pelo parâmetro entre parênteses.
Exemplo:
delay(1000); // Com esse parâmetro o programa vai pausar durante 1 segundo (1000 ms).
- Nota
- Durante o período em que essa função está ativa qualquer outra função no programa é suspensa. Somente as interrupções de hardware podem parar essa função.
- delayMicroseconds(us)
- Essa função pausa o programa por um período em microssegundos indicado pelo parâmetro entre parênteses.
Exemplo:
delayMicroseconds(1000); // Com esse parâmetro o programa vai pausar durante 1 ms (1000 us).
- Nota
- As mesmas observações acima para a função delay(ms) são válidas aqui.
- millis( )
- Retorna o número de milissegundos desde que o Arduino começou a executar o programa corrente.
Exemplo:
long total = millis( ); // Aqui a variável inteira longa (de 32 bits) ‘total’ vai guardar o tempo em ms desde que o Arduino foi inicializado.
- Nota
- Essa variável vai ser resetada depois de aproximadamente 9 horas.
- random(min,max)
- Gera números pseudo-aleatórios entre os limites min e max especificados como parâmetros.
Exemplo:
int valor = random(100,400); // A variável "valor" vai ser atribuido um número inteiro qualquer entre 100 e 400.
- Nota
- O parâmetro min é opcional e se excluído o limite mínimo é 0. No exemplo variável "valor" poderá ser qualquer número inteiro entre 0 e 400.
- abs(x)
- Retorna o módulo ou valor absoluto do número real passado como parâmetro.
Exemplo:
float valor = abs(-3.14); // A variável "valor" vai ser atribuído o número em ponto flutuante (e sem sinal) 3.14.
- map(valor,min1,max1,min2,max2)
- A função map( ) converte uma faixa de valores para outra faixa. O primeiro parâmetro "valor" é a variável que será convertida; o segundo e o terceiro parâmetros são os valores mínimo e máximo dessa variável; o quarto e o quinto são os novos valores mínimo e máximo da variável "valor".
Exemplo:
int valor = map(analogRead(A0),0,1023,0,255)); // A variável "valor" vai guardar a leitura do nível analógico no pino A0 convertida da faixa de 0-1023 para a faixa 0-255.
- Nota
- Com essa função é possível reverter uma faixa de valores, exemplo: int valor = map(x,1,100,100,1);
Configurando o Arduino no Windows
Como fazer para conectar o Arduino no seu computador com Windows e rodar o seu primeiro programa.
- Você deve seguir os seguintes passos
- Obter uma placa Arduino e um cabo USB
- Fazer o download do ambiente de desenvolvimento do Arduino
- Conectar a placa
- Instalar os drivers
- Executar o aplicativo do Arduino
- Abrir o exemplo "Blink"
- Selecionar a sua placa
- Selecionar a porta serial
- Fazer upload do programa
Obter uma placa Arduino e um cabo USB
Neste exemplo vamos utilzar um Arduino Uno, mas serve também para Arduino Duemilanove, Arduino Mega 2560, Diecimila entre outros. Se você tem alguma outra placa, veja o tutorial correspondente na página do produto.
Você também vai precisar de um cabo USB padrão (conector A para conector B): o tipo de cabo que você conectaria a uma impressora USB, por exemplo. Para o Arduino Nano ou o Alevino com Nanoshield USB, você vai precisar, no entanto, de um cabo com conector A para Mini-B.
Fazer o download do ambiente de desenvolvimento do Arduino
Obtenha a última versão na página de download.
Quando o download terminar, descompacte o arquivo baixado, garantindo que a estrutura das pastas seja mantida.
Dê um duplo clique na pasta para abri-la. Deve haver alguns arquivos e subpastas dentro.
Conectar a placa
O Arduino Uno, Mega, Duemilanove, Arduino Nano e o Alevino com Nanoshield USB obtêm energia automaticamente seja da conexão USB ou de um fonte de alimentação externa. Se você está usando um Arduino Diecimila, é preciso configurar a placa para obter energia da conexão USB. A fonte de energia da placa é selecionada com um jumper, uma pequena peça de plástico que se encaixa em dois dos três pinos que ficam entre os conectores USB e de energia. Verifique que ele está nos dois pinos mais próximos da porta USB.
Conecte o Arduino ao seu computador usando o cabo USB. O LED verde de energia (marcado como PWR) deve acender.
Instalar os drivers
- Instalando drivers para o Arduino Uno ou Arduino Mega 2560 no Windows
- Conecte a sua placa e aguarde até que o Windows inicie o processo de instalação de drivers. Depois de alguns instantes, o processo irá falhar.
- Clique no menu iniciar e vá até o Painel de Controle
- Selecione Sistema e Segurança > Sistema > Gerenciador de Dispositivos.
- Procure na seção "Portas (COM e LPT)". Você deverá encontrar um porta aberta chamada "Arduino UNO (COMxx)".
- Clique com o botão direito na porta "Arduino UNO (COMxx)" e selecione "Atualizar Driver...".
- Depois selecione a opção "Procurar software de driver no computador".
- Finalmente, navegue até a pasta "drivers" dentro do aplicativo do Arduino, na pasta que foi descompactada anteriormente, e selecione o arquivo "arduino.inf".
- A partir daí, o Windows completará a instalação dos drivers.
- Atenção
- Pode haver pequenas diferenças na instalação dependendo da versão do seu Windows.
- Instalando drivers para o Arduino Duemilanove, Nano, Diecimila ou Alevino com Nanoshield USB no Windows
Quando você conectar a placa, o Windows deve iniciar o processo de instalação dos drivers, caso você ainda não tenha usado o computador com um Arduino antes.
- A janela "Adicionar novo hardware" irá aparecer
- Nessa janela, selecione "Não, não agora" e clique em avançar.
- Selecione "Instalar o driver de uma lista ou um lugar especifico (avançado)" e clique em avançar.
- Verifique que "Procurar o melhor driver nesses lugares especifícos" está selecionado; deselecione "Procurar em mídias removiveis"; selecione "Incluir este lugar na procura" e vá até o diretório "drivers" do Arduino, dentro da pasta que você descompactou anteriormente (a versão mais atual dos drivers pode ser encontrada no site da FTDI). Depois, clique em avançar.
- O Windows irá procurar pelo driver e dizer que um "USB Serial Converter" foi encontrado. Clique em finalizar.
- A janela "Adicionar novo hardware" aparecerá novamente. Siga os mesmos passos, selecionando as mesmas opções e o mesmo diretório. Dessa vez, uma "USB Serial Port" será encontrada.
- Você pode verificar que os drivers foram instalados clicando no menu iniciar e depois em Painel de Controle > Sistema e Segurança > Sistema > Gerenciador de Dispositivos. Procure por uma "USB Serial Port" na seção "Portas (COM e LPT)".
Executar o aplicativo do Arduino
Dê um clique duplo no aplicativo do Arduino. Se o software do Arduino abrir no idioma errado, você pode mudá-lo na janela de preferências (File > Preferences ou Arquivo > Preferências) - veja essa página do Arduino para mais detalhes. Daqui por diante vamos assumir que o idioma escolhido é o português do Brasil.
Abrir o exemplo "Blink"
Abra o programa de exemplo "Blink": File > Exemplos > 1.Basics > Blink.
Selecionar a sua placa
Você precisa selecionar a opção do menu Ferramentas > Placa que corresponde ao seu tipo de Arduino.
Para o Alevino com Nanoshield USB, use Arduino Nano w/ ATmega328. Para placas Duemilanove com um ATmega328 (veja o texto no chip da placa), selecione Arduino Duemilanove or Nano w/ ATmega328. Anteriormente, as placas Arduino vinham com um ATmega168; para elas, selecione Arduino Diecimila, Duemilanove, or Nano w/ ATmega168 (detalhes das opções do menu de placas estão disponíveis nessa página do Arduino).
Selecionar a porta serial
Selecione o dispositivo serial correspondente à placa do Arduino no menu Ferramentas > Porta Serial. É provável que ele seja COM3 ou maior (COM1 e COM2 são normalmente reservados para portas seriais nativas, e não por USB). Para descobrir, você pode desconectar o seu Arduino e reabrir o menu; a opção que desaparecer deve ser a da placa do Arduino. Reconecte a placa e selecione a porta serial.
Na imagem acima aparece a porta COM4 como disponível, provalvelmente habilitada pelo software do Arduino. Dependendo das aplicações o seu computador pode ter muitas outras portas COM.
Fazer upload do programa
Agora, simplesmente clique o botão "Carregar" no ambiente de desenvolvimento. Espere alguns segundos - você deve ver os LEDs RX e TX na placa piscando. Se o upload for bem sucedido, a mensagem "Transferência concluída." vai aparecer na barra de status. (Nota: Se você possui um Arduino Mini, NG, ou outra placa não mencionada aqui, você pode ter que pressionar fisicamente o botão de reset na placa imediatamente antes de apertar o botão de upload).
Alguns segundos após o upload terminar, você deve ser o LED do pino 13 na placa começar a piscar. Se isso aconteceu, parabéns! Você conseguiu configurar o Arduino e rodar o seu primeiro programa.
Se você tiver problemas, verifique a página de resolução de problemas do site do Arduino.
Referências
[1] http://ordemnatural.com.br/pdf-files/CartilhadoArduino_ed1.pdf
[2] http://xbot.com.br/externo/OpneMoniot/Programando_Microcontroladores_PIC_Linguagem_C.pdf
[3] https://www.circuitar.com.br/tutoriais/configurando-o-arduino-no-windows/index.html