Aula 41a — De C para Arduino: a transição

Robótica com C — Bloco 1

▶ Assista antes de começar: Desmistificando o Arduino

Este vídeo apresenta o Arduino de forma visual e prática. Assista primeiro — o conteúdo escrito a seguir aprofunda e complementa o que você vai ver aqui.

Dica de uso: use a barra de progresso para revisitar trechos específicos. Após assistir, continue a leitura — as seções seguintes expandem os conceitos do vídeo com exemplos de código e comparações diretas com o C que você já conhece.

Por que estudar Arduino depois de C?

Você chegou até aqui sabendo declarar structs, alocar memória com malloc, montar listas encadeadas e persistir dados em arquivos. A maioria dos cursos de Arduino começa do zero com "o que é uma variável". Você não precisa disso.

O que muda agora é o destino do código: em vez de rodar num computador e imprimir no terminal, seu programa vai rodar num microcontrolador e controlar o mundo físico — acender LEDs, mover motores, ler sensores, detectar movimento.

A grande revelação: Arduino é C++ com alguns nomes diferentes. O chip do Arduino Uno (ATmega328P) executa código compilado pelo avr-gcc — uma versão do GCC que você já conhece. A IDE do Arduino simplesmente esconde o processo de compilação e oferece uma biblioteca de funções prontas para acessar o hardware. Tudo que você aprendeu — ponteiros, structs, funções, arrays, loops — funciona dentro de um sketch Arduino sem nenhuma mudança.

O que é Arduino e onde instalar

Arduino é uma plataforma de hardware + software open-source criada em 2005 na Itália para facilitar a prototipagem eletrônica. Ela tem quatro partes que você precisa conhecer:

Parte O que é Analogia com o que você já conhece
Placa Arduino Microcontrolador com pinos de I/O, porta USB e regulador de tensão Seu PC — sem tela, sem teclado, com pinos elétricos expostos
Arduino IDE Ambiente onde você escreve, compila e envia o código para a placa O GCC + terminal que você usava para compilar programas em C
Sketch Nome do programa Arduino — arquivo .ino Seu arquivo .c
Biblioteca Conjunto de funções prontas para controlar um componente (servo, LCD, sensor) #include <stdio.h>, #include <string.h> etc.

Instalacao da IDE: Baixe a versao nativa (gratuita) para Windows, Linux ou macOS em arduino.cc/en/software. Se quiser testar algo rapidamente sem instalar nada, o editor online create.arduino.cc/editor funciona no navegador — mas para o curso use sempre a versao instalada, pois ela permite trabalhar com o hardware fisico e com o Wokwi integrado.

Os diferentes tipos de Arduino — qual usar?

A família Arduino tem dezenas de modelos. Cada um foi projetado para um contexto específico. Conhecer as diferenças evita comprar o modelo errado ou se surpreender com limitações no meio do projeto:

Modelo Chip Flash / RAM Pinos digitais / analógicos Tamanho Melhor para
Uno R3 ATmega328P 32 KB / 2 KB 14 / 6 69 × 53 mm Aprendizado, prototipagem, projetos de bancada
Nano ATmega328P 32 KB / 2 KB 14 / 8 45 × 18 mm Projetos compactos, robótica, encaixe em protoboard
Mega 2560 ATmega2560 256 KB / 8 KB 54 / 16 102 × 53 mm Projetos grandes com muitos sensores e atuadores
Mini ATmega328P 32 KB / 2 KB 14 / 8 30 × 18 mm Projetos miniaturizados — sem USB nativo, precisa de adaptador
Leonardo ATmega32u4 32 KB / 2,5 KB 20 / 12 69 × 53 mm Emular teclado/mouse via USB (HID)
Due AT91SAM3X8E (ARM) 512 KB / 96 KB 54 / 12 102 × 53 mm Processamento intensivo — opera a 3,3V (cuidado com shields de 5V)
Nano 33 IoT SAMD21 (ARM) + NINA-W102 256 KB / 32 KB 14 / 8 45 × 18 mm IoT com Wi-Fi e Bluetooth integrados no tamanho do Nano
Uno WiFi R2 ATmega4809 + ESP32 48 KB / 6 KB 14 / 6 69 × 53 mm Projetos conectados com Wi-Fi — formato familiar do Uno

Arduino Nano — o que muda na prática

O Nano usa o mesmo chip ATmega328P do Uno e roda o mesmo código sem nenhuma modificação. As diferenças são físicas e de conveniência:

Aspecto Arduino Uno Arduino Nano
Tamanho 69 × 53 mm 45 × 18 mm — cabe direto na protoboard
Pinos analógicos 6 (A0–A5) 8 (A0–A7)
Conector USB USB-B (quadrado) Mini-USB ou Micro-USB (depende da versão)
Alimentação externa Conector P4 (jack barrel) Apenas via pino VIN ou USB
Compatibilidade de código Idêntica Idêntica — mesmo chip, mesmo compilador
Preço (mercado BR) R$ 40–80 R$ 20–40 (clones CH340)
Melhor para robótica Prototipagem inicial, bancada Instalação final no robô — menor e mais leve

Nano com chip CH340 (clone chinês): a maioria dos Nanos vendidos no Brasil usa o chip USB CH340 em vez do FTDI original. O código funciona igualmente, mas você precisa instalar o driver CH340 no Windows antes de o computador reconhecer a placa. No Linux e macOS recentes o driver já vem incluído. Procure por "CH340 driver" no site do fabricante se a porta COM não aparecer na IDE.

Resposta direta à pergunta do curso: este curso usa o Arduino Uno como referência — todos os exemplos de pinos, código e esquemas são testados no Uno. Porém, como Uno e Nano usam o mesmo chip ATmega328P, qualquer sketch deste curso funciona no Nano sem nenhuma modificação. Se você tiver um Nano em mãos, use à vontade. A única atenção é com os pinos físicos — o Nano tem layout diferente, então consulte o pinout do Nano ao montar o circuito. O Wokwi tem o Arduino Nano disponível se quiser simular nele.

A estrutura de um sketch: setup() e loop()

Todo sketch Arduino tem exatamente duas funcoes obrigatorias. Se voce trabalhou com main() em C, vai reconhecer o padrao imediatamente:

// Sketch Arduino minimo — equivalente ao main() em C

void setup() {
    // Executada UMA VEZ quando a placa liga ou é resetada
    // Aqui: configurar pinos, inicializar bibliotecas, abrir Serial
}

void loop() {
    // Executada REPETIDAMENTE para sempre, enquanto houver energia
    // Aqui: lógica principal do programa
}
C puro Arduino Equivalência
int main() {
    /* inicialização */

    while (1) {
        /* lógica */
    }
    return 0;
}
void setup() {
    /* inicialização */
}

void loop() {
    /* lógica */
}
São equivalentes. O Arduino divide o main() em duas funções nomeadas para separar claramente inicialização e laço principal.

Por baixo dos panos: A IDE gera automaticamente um main() que chama setup() uma vez e depois chama loop() dentro de um while(1). Voce nao ve esse codigo, mas ele existe. O compilador usado e o avr-gcc — uma versao do GCC para chips AVR.

Bibliotecas: o #include do Arduino

Em C voce ja usava #include <stdio.h> para ter acesso ao printf() e #include <string.h> para funcoes de string. No Arduino o mecanismo e identico — mas as bibliotecas dao acesso a componentes de hardware especificos como displays LCD, sensores I2C, servos e modulos de comunicacao.

// Exemplos de bibliotecas comuns — mesma sintaxe #include do C

#include <Servo.h>             // controle de servomotores
#include <Wire.h>              // comunicação I2C (sensores, displays)
#include <LiquidCrystal_I2C.h> // display LCD via I2C
#include <DHT.h>               // sensor de temperatura DHT11/DHT22
C puro Arduino O que fornece
#include <stdio.h> Serial (automatico — sempre disponivel) Entrada e saida de texto
#include <math.h> #include <math.h> (identico) sqrt(), sin(), pow() etc.
#include <string.h> #include <string.h> (identico) strlen(), strcmp(), strcpy() etc.
— #include <Servo.h> Controle de servomotores: servo.attach(pino), servo.write(angulo)
— #include <Wire.h> Comunicacao I2C — protocolo padrao para sensores e displays

Como instalar uma biblioteca: Na IDE Arduino, va em Sketch → Incluir Biblioteca → Gerenciar Bibliotecas. Busque pelo nome (ex: "Servo", "DHT") e clique em Instalar. A partir dai, o #include funciona exatamente como em C.

As bibliotecas mais usadas neste curso ja vem instaladas com a IDE: Servo.h para servomotores e Wire.h para comunicacao I2C. Voce nao precisa instalar nada extra para as primeiras aulas.

Tipos e constantes especificos do Arduino

O Arduino herda todos os tipos do C — int, float, char, long — mas adiciona tipos proprios e uma convencao diferente para constantes:

Tipos adicionais do Arduino

Tipo Arduino Equivalente em C Tamanho Uso tipico
byte unsigned char 1 byte (0–255) Valores pequenos sem sinal: brilho PWM, enderecos I2C
word unsigned int 2 bytes (0–65535) Contadores sem sinal
boolean bool (C99) 1 byte Flags e estados logicos
String — (nao existe em C puro) Variavel (heap) Textos — ver aviso abaixo

String com S maiusculo — use com cautela: O Arduino oferece a classe String que funciona como strings de Java — concatenacao com +, metodo .length(), comparacao com ==. Parece conveniente, mas ela usa alocacao dinamica de heap, o que pode fragmentar a memoria do Uno (apenas 2 KB de RAM) em projetos longos. Para debug e testes esta otima. Para codigo de producao num robo, prefira arrays de char + funcoes da string.h — exatamente o que voce ja sabe de C.

// String (classe Arduino) — prática, mas use com cautela em projetos grandes
String mensagem = "Sensor: ";
String completa = mensagem + 42;     // "Sensor: 42"
Serial.println(completa);
Serial.println(completa.length());   // 10

// char[] (C puro) — preferível em código de produção
char buf[20];
snprintf(buf, sizeof(buf), "Sensor: %d", 42);
Serial.println(buf);

const int vs #define — qual usar no Arduino?

Em C voce aprendeu a usar #define para constantes. No Arduino, a convencao da comunidade e preferir const int:

Aspecto #define PINO_LED 9 const int PINO_LED = 9;
Tipo Sem tipo — substituicao textual pelo pre-processador Tipada — o compilador verifica erros de tipo
Visivel no depurador Nao — ja foi substituida antes da compilacao Sim — aparece com seu nome no depurador
Escopo Global — vale em todo o arquivo Respeita o escopo onde foi declarada
Ocupa RAM? Nao Nao — o compilador otimiza para constante
Uso recomendado Guardas de inclusao (#ifndef), macros complexas Constantes numericas — pinos, limites, thresholds
// Estilo recomendado no Arduino para constantes de pino e tempo:
const int PINO_LED   = 9;
const int PINO_BOTAO = 7;
const int TEMPO_ON   = 1000;

// #define ainda é válido e comum em código Arduino legado:
#define PINO_LED 9  // funciona, mas sem verificação de tipo

Arduino e C++ — uma nota sobre Orientacao a Objetos

Ao contrario do que estudamos ate aqui (C puro), o Arduino e tecnicamente C++. Na pratica, tudo que voce aprendeu em C funciona — mas o C++ adiciona um recurso importante que voce ja usa sem perceber: classes e objetos.

Quando voce escreve Serial.begin(9600) ou, mais a frente, servo.write(90), voce esta chamando um metodo de um objeto. Serial e um objeto da classe HardwareSerial. servo sera um objeto da classe Servo.

// Você já usa objetos agora — Serial é uma instância de HardwareSerial:
Serial.begin(9600);      // método begin() do objeto Serial
Serial.println("Ola");  // método println() do objeto Serial

// Nas aulas de servo você vai criar seus próprios objetos:
#include <Servo.h>
Servo motoPata;          // cria um objeto da classe Servo
motoPata.attach(9);      // associa ao pino 9
motoPata.write(90);      // posiciona no ângulo 90°

Struct vs Classe: Uma classe em C++ e essencialmente uma struct com funcoes embutidas (metodos) e controle de acesso. Voce ja praticou o conceito de encapsular dados + funcoes com structs e ponteiros — classe e o proximo passo natural. Para este curso, voce nao precisa criar classes, apenas usar as que as bibliotecas fornecem.

Tudo do C continua funcionando: break, continue, return, operadores aritmeticos, logicos e relacionais, arrays, ponteiros, structs, typedef — tudo identico ao que voce aprendeu nas aulas 1–40. C++ e um superconjunto de C, nao uma linguagem diferente.

C vs Arduino — mapa completo das diferencas

A tabela abaixo consolida tudo que voce vai encontrar de diferente nas proximas aulas. Nada aqui e uma ruptura — e sempre uma adaptacao do que voce ja sabe:

Conceito C puro Arduino Observacao
Saida de texto printf() Serial.print() / Serial.println() Saida vai para o Monitor Serial da IDE
Pino digital — escrever Manipulacao de registradores digitalWrite(pino, HIGH/LOW) HIGH = 5V, LOW = 0V
Pino digital — ler Manipulacao de registradores digitalRead(pino) Retorna HIGH ou LOW
Leitura analogica Requer driver de SO analogRead(A0) Retorna 0–1023 (10 bits)
Saida com gradacao (PWM) Requer timer + registradores analogWrite(pino, 0–255) Apenas pinos com ~ (3,5,6,9,10,11)
Pausa / espera sleep(), loops vazios delay(ms) / millis() delay(1000) = 1 segundo
Configurar pino Registradores DDR pinMode(pino, OUTPUT/INPUT) Sempre no setup()
Constantes #define MAX 50 const int MAX = 50; (preferido) #define ainda funciona — const tem verificacao de tipo
Strings char[] + string.h char[] (C) ou String (classe C++) Prefira char[] em projetos com restricao de memoria
Tamanho de int 4 bytes no PC moderno 2 bytes no Uno — faixa: -32768 a 32767 Use long para numeros maiores
Structs, ponteiros, arrays ✅ ✅ — identicos Tudo que voce aprendeu funciona aqui
break / continue / return ✅ ✅ — identicos Sem nenhuma diferenca
for, while, if/else, switch ✅ ✅ — identicos Sem nenhuma diferenca
Componentes de hardware Nao existe Objetos das bibliotecas: Servo, Wire, LCD… Voce usa, nao precisa criar

Primeiro sketch: boas praticas desde o inicio

O "Hello, World!" do Arduino e o Blink — LED piscando. O pino 13 do Uno ja tem um LED soldado na placa. Veja como escrever esse sketch com as praticas que este curso vai adotar:

/*
 * Blink com boas práticas
 * LED_BUILTIN = pino 13 (LED da própria placa)
 */

// const int é preferível a #define para pinos no Arduino
const int PINO_LED  = LED_BUILTIN;  // LED_BUILTIN = 13 no Uno
const int TEMPO_ON  = 1000;
const int TEMPO_OFF =  500;         // pisca assimétrico

int contadorPiscadas = 0;

void setup() {
    pinMode(PINO_LED, OUTPUT);
    Serial.begin(9600);              // abre Monitor Serial para debug
    Serial.println("Blink iniciado!");
}

void loop() {
    digitalWrite(PINO_LED, HIGH);
    contadorPiscadas++;
    Serial.print("Piscada #");
    Serial.println(contadorPiscadas);
    delay(TEMPO_ON);

    digitalWrite(PINO_LED, LOW);
    delay(TEMPO_OFF);
}

Blink iniciado!

Piscada #1

Piscada #2

Piscada #3

...

Tres praticas que este curso vai seguir sempre: (1) usar const int em vez de numeros magicos para pinos, (2) abrir Serial.begin(9600) no setup() para depurar com Serial.println() — o equivalente ao printf() do C, e (3) usar LED_BUILTIN em vez do numero 13, pois o valor pode variar entre modelos de placa.

Quiz — Aula 41a

Teste o que voce aprendeu sobre a transicao de C para Arduino:

1. Qual e a funcao do Arduino equivalente ao laco while(1) do C?

2. Qual e a principal vantagem de usar const int PINO = 9 em vez de #define PINO 9 no Arduino?

3. Para que serve #include <Servo.h> num sketch Arduino?

4. Por que o tipo String (maiusculo) deve ser usado com cautela no Arduino Uno?

5. No Arduino Uno, quantos bytes ocupa o tipo int?

6. Quando voce escreve servo.write(90) num sketch, o que esta acontecendo em termos de C++?

7. Qual compilador o Arduino usa internamente para transformar o sketch em codigo de maquina?

8. Qual das afirmacoes sobre C e C++ no contexto do Arduino e correta?