1. Entendendo o Programa Blink

Como revisão rápida, vamos analisar um programa super básico de Arduino, adaptado do exemplo Blink, já incluso na instalação do Arduino IDE. Devido à sua simplicidade, pode ser considerado o "Hello World" do Arduino.

Quando executado, o programa abaixo acende o LED embutido no Arduino por um segundo e depois desliga por um segundo, repetidamente. Além disso, a cada vez que o LED é aceso/apagado, uma mensagem é enviada pela porta Serial padrão, cuja saída pode ser observada no IDE do Arduino.

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize serial communication at 9600 bits per second.
  Serial.begin(9600);
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  Serial.println("LED on");          // print out LED switching on
  delay(1000);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  Serial.println("LED off");         // print out LED switching off
  delay(1000);                       // wait for a second
}

1.1 Executando no Tinkercad

O Tinkercad é uma aplicação Web gratuita de modelagem tridimensional, bastante popular para criação de modelos para impressão 3D. Ele também possui um módulo para modelagem e simulação de circuitos elétricos, incluindo o Arduino como componente. Esse módulo será utilizado nesta disciplina para demonstrar a programação no Arduino. Note que o mesmo código pode ser executado no Arduino IDE (para quem já possui um Arduino).

Após criar uma conta no site https://www.tinkercad.com/, faça o login e clique em criar um novo circuito. Monte o seguinte circuito:

onde o resistor é de 220Ω.

Em seguida, clique no botão "Código" e selecione Texto em vez de Blocos para ter acesso ao código em C++ do seu software embarcado. Copie e cole o código da subseção anterior, abra o "Monitor Serial" e clique em "▶ Iniciar simulação". Se tudo estiver OK, você deve observar o seguinte:

1.2 Observações sobre o programa Blink

O Arduino suporta codificação do software em C++, que engloba a linguagem C. No entanto, partindo apenas dos conhecimentos de C obtidos nesta disciplina (incluindo a primeira apostila), você deve ter estranhado que o código compila corretamente.

A seguir, são listados algumas explicações para o funcionamento correto da aplicação.

a. Onde está o main?

A falta da função int main(void) é provavelmente a diferença mais saliente de programas Arduino. Na realidade, a função main existe, mas está "escondida"; ela é responsável por chamar as funções setup() e loop(). Para entender isso melhor, vamos ver o código fonte do arquivo main.cpp do ArduinoCore-avr, disponível no GitHub em https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/main.cpp.

...
#include <Arduino.h>

// Declared weak in Arduino.h to allow user redefinitions.
int atexit(void (* /*func*/ )()) { return 0; }

// Weak empty variant initialization function.
// May be redefined by variant files.
void initVariant() __attribute__((weak));
void initVariant() { }

void setupUSB() __attribute__((weak));
void setupUSB() { }

int main(void)
{
	init();

	initVariant();

#if defined(USBCON)
	USBDevice.attach();
#endif
	
	setup();
    
	for (;;) {
		loop();
		if (serialEventRun) serialEventRun();
	}
        
	return 0;
}

Como pode ser visto, a função setup é chamada uma vez no início do main e a função loop é chamada dentro de um for infinito.

b. Onde estão declaradas e definidas as funções pinMode, digitalWrite e delay? E as constantes simbólicas LED_BUILTIN, OUTPUT, HIGH e LOW?

Observando mais uma vez o main.cpp, vemos que o único arquivo incluído é o Arduino.h. Assim, é de se suspeitar que as declarações estão contidas nesse arquivo.

Realmente, se consultarmos o código em https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/Arduino.h, podemos achar as declarações destas funções e as definições das constantes, exceto o LED_BUILTIN, cuja definição está no arquivo pins_arduino.h.

Para consultar todas as funções e constantes disponíveis na biblioteca padrão do Arduino, acesse a página https://www.arduino.cc/reference/en/

c. O que exatamente é Serial?

Serial é um objeto em C++, é uma instância da classe HardwareSerial (declarada em HardwareSerial.h). Assim, o Serial possui um estado interno (seus atributos) e pode realizar ações através dos seus métodos definidos.

No Arduino, as bibliotecas são geralmente implementadas desse modo, ou seja, como instâncias de classes. Na seção seguinte, mostraremos como criar nossas próprias bibliotecas de Arduino a partir de componentes definidos no diagrama de componentes.

Bibliografia para este capítulo