Robótica com C — Bloco 1
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.
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.
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.
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 |
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.
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.
#include do ArduinoEm 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.
O Arduino herda todos os tipos do C — int, float, char, long — mas adiciona tipos proprios e uma convencao diferente para constantes:
| 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
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.
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 |
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.
Teste o que voce aprendeu sobre a transicao de C para Arduino: