Firmware
Agora que seu ambiente está pronto, é hora de colocar a mão no código do drone.
Aqui, você vai aprender a baixar, configurar e compilar o firmware que roda dentro do Crazyflie — deixando tudo pronto para testar seu próprio código no drone real.
Visual Studio Code
Vamos utilizar o Visual Studio Code como IDE (Ambiente de Desenvolvimento Integrado).
- Baixe o Visual Studio Code em seu site oficial e instale-o.
Clonando
Antes de começar a programar, precisamos trazer o código do firmware para sua máquina. Vamos fazer isso em duas etapas: primeiro, você cria uma cópia (um fork) do repositório, e depois clona essa cópia para o seu computador.
Fork
- Crie um fork do repositório que contém o firmware para a sua conta do GitHub.
Clone
-
Abra o Visual Studio Code
-
Clique em
Clone Git Repository... -
Coloque o endereço do repositório forkado para sua conta do GitHub:
https://github.com/username/quadcontrol-firmware.gitAtenção
Você deve substituir
usernamepelo seu nome de usuário do GitHub -
Pressione
Entere selecione o local onde você quer salvar esse repositório. -
Quando ele terminar de clonar e perguntar se você gostaria de abrir o repositório clonado, clique em
Open. -
Abra uma janela do terminal clicando em
Terminal>New Terminal(ou usando o atalhoCrtl+Shift+').Atenção
Caso esteja utilizando Windows, ele abre por padrão um terminal do PowerShell, mas você deve alternar para um terminal do WSL (Ubuntu):

-
Inicialize todos os submódulos1 pelo terminal:
git submodule update --init --recursive
Organização
O firmware é composto por 2 pastas e 2 arquivos:

Vamos entender cada um deles:
crazyflie-firmware- Pasta que contém o firmware do Crazyflie, o qual utilizaremos como submódulosrc- Pasta que contém os programas que vamos desenvolver ao longo do cursoKbuild- Arquivo que define o programa que será compiladoradio.config- Arquivo que define o canal de rádio utilizado para se comunicar com o Crazyflie
A pasta src possui uma subpasta examples com 2 exemplos de programas: led_blink.c e hello_world.c. Abra esses arquivos para ver alguns exemplos de programa bem simples:
#include "FreeRTOS.h" // FreeRTOS core definitions (needed for task handling and timing)
#include "task.h" // FreeRTOS task functions (e.g., vTaskDelay)
#include "led.h" // LED functions (e.g., ledSet)
// Main application loop
void appMain(void *param)
{
// Infinite loop (runs continuously while the quadcopter is powered on)
while (true)
{
// Turn on left green led
ledSet(LED_GREEN_L, true);
// Wait for 100 milliseconds (2 Hz loop)
vTaskDelay(pdMS_TO_TICKS(500));
// Turn off left green led
ledSet(LED_GREEN_L, false);
// Wait for 100 milliseconds (2 Hz loop)
vTaskDelay(pdMS_TO_TICKS(500));
}
}
#include "FreeRTOS.h" // FreeRTOS core definitions (needed for task handling and timing)
#include "task.h" // FreeRTOS task functions (e.g., vTaskDelay)
#include "debug.h" // Debug printing functions (e.g., DEBUG_PRINT)
// Main application loop
void appMain(void *param)
{
// Infinite loop (runs continuously while the quadcopter is powered on)
while (true)
{
// Print message to console
DEBUG_PRINT("Hello world!\n");
// Wait for 100 milliseconds (2 Hz loop)
vTaskDelay(pdMS_TO_TICKS(500));
}
}
Definimos qual o programa que vamos compilar através do arquivo Kbuild:
obj-y += src/examples/led_blink.o
Conforme formos desenvolvendo novos programas, não podemos esquecer de atualizar o arquivo Kbuild com o nome do programa que queremos compilar.
Atenção
Note que a extensão do arquivo aqui é .o e não .c. O importante é o nome do programa estar igual.
Configurando
Agora que você já tem o código na sua máquina, vamos ajustar algumas configurações importantes: o canal de rádio que será usado para comunicação e a plataforma de hardware do drone. Esses ajustes garantem que tudo esteja alinhado com o seu Crazyflie antes de compilar o código.
Radio
-
Abra o arquivo
radio.config -
Altere o canal do rádio conforme a numeração do seu Crazyflie.
radio.configRADIO_CHANNEL=1
Submódulo
-
Navegue até a página
crazyflie-firmware/src/modules/srce abra o arquivostabilizer.c. -
Comente as linhas 223-226, 326 e 356, conforme abaixo2:
stabilizer.c 221 222 223 224 225 226 227
static void setMotorRatios(const motors_thrust_pwm_t* motorPwm) { // motorsSetRatio(MOTOR_M1, motorPwm->motors.m1); // motorsSetRatio(MOTOR_M2, motorPwm->motors.m2); // motorsSetRatio(MOTOR_M3, motorPwm->motors.m3); // motorsSetRatio(MOTOR_M4, motorPwm->motors.m4); }stabilizer.c 326//stateEstimator(&state, stabilizerStep);stabilizer.c 355 356 357
} else { // motorsStop(); }
Plataforma
- Configure o firmware para a plataforma do Crazyflie 2.1 Brushless rodando o seguinte código no terminal:
make cf21bl_defconfig
Compilando
Com o código ajustado, é hora de transformar ele em algo que o drone entenda. Vamos compilar o firmware e enviá-lo para o Crazyflie. Esse processo será repetido sempre que você quiser testar uma nova versão do seu programa.
Build
- Compile o firmware:
make
Flash
-
Programe o firmware no Crazyflie:
make cloadAtenção
- O Crazyflie 2.1 Brushless precisa estar ligado
- O Crazyradio PA precisa estar conectado na porta USB
Testando
Tudo pronto! Agora vamos conectar no drone com o Crazyflie Client e verificar se ele está rodando o seu código corretamente. Se tudo estiver certo, você verá as mensagens aparecendo no console — e o seu drone estará oficialmente sob seu controle.
- Abra o Crazyflie Client
cfclient -
Clique no botão
Scan -
Selecione o Crazyflie correspondente
-
Clique no botão
Connect -
Verifique se o quadricoptero está respondendo (tensão da bateria, estado dos sensores, etc.)
-
Clique em
View>Toolboxes>Console -
Verifique se aparecem as mensagens do seu código ("Hello world!")
Caso não apareça, muito provavelmente é por que você está rodando o programa led_blink.c e não hello_world.c. Modifique seu arquivo Kbuild para o programa correto e, em seguida, compile e envie o programa para o quadricoptero.
-
Submódulos do Git são como "repositórios dentro de repositórios". Esse comando garante que você tenha o código do firmware oficial (
crazyflie-firmware) que está referenciado como submódulo. ↩ -
Fazemos isso para contornar o algoritmo proprietário do controlador do Crazyflie (ele vai continuar rodando em segundo plano, mas vamos ignorar seus comandos para podermos usar os nossos). ↩