<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>giroscópio MPU6050 - MCU &amp; FPGA</title>
	<atom:link href="https://mcu.tec.br/tags/giroscopio-mpu6050/feed/" rel="self" type="application/rss+xml" />
	<link>https://mcu.tec.br</link>
	<description>Microcontroladores &#38; FPGA</description>
	<lastBuildDate>Tue, 17 Feb 2026 13:28:22 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>

<image>
	<url>https://mcu.tec.br/wp-content/uploads/2025/02/Robo-para-o-site-MCU.tec_.br-512x512-1-150x150.png</url>
	<title>giroscópio MPU6050 - MCU &amp; FPGA</title>
	<link>https://mcu.tec.br</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>MPU6050 em projetos reais: do “dado cru” ao ângulo (e preparando terreno para o DMP)</title>
		<link>https://mcu.tec.br/sensores/mpu6050-em-projetos-reais-do-dado-cru-ao-angulo-e-preparando-terreno-para-o-dmp/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mpu6050-em-projetos-reais-do-dado-cru-ao-angulo-e-preparando-terreno-para-o-dmp</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Sat, 28 Feb 2026 10:06:45 +0000</pubDate>
				<category><![CDATA[Sensores]]></category>
		<category><![CDATA[aceleração linear IMU]]></category>
		<category><![CDATA[acelerômetro MPU6050]]></category>
		<category><![CDATA[cálculo de inclinação com atan2]]></category>
		<category><![CDATA[calibração giroscópio MPU6050]]></category>
		<category><![CDATA[DMP Motion Processor]]></category>
		<category><![CDATA[FIFO MPU6050]]></category>
		<category><![CDATA[filtro complementar IMU]]></category>
		<category><![CDATA[FreeRTOS MPU6050]]></category>
		<category><![CDATA[giroscópio MPU6050]]></category>
		<category><![CDATA[IMU 6 eixos]]></category>
		<category><![CDATA[integração de movimento com IMU]]></category>
		<category><![CDATA[integração giroscópio C]]></category>
		<category><![CDATA[MPU6050]]></category>
		<category><![CDATA[MPU6050 DMP]]></category>
		<category><![CDATA[orientação 3D microcontrolador]]></category>
		<category><![CDATA[programação MPU6050 em C]]></category>
		<category><![CDATA[quaternion MPU6050]]></category>
		<category><![CDATA[remover gravidade acelerômetro]]></category>
		<category><![CDATA[sensores inerciais embarcados]]></category>
		<category><![CDATA[superloop IMU]]></category>
		<category><![CDATA[yaw pitch roll MPU6050]]></category>
		<category><![CDATA[ZUPT IMU]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=1359</guid>

					<description><![CDATA[<p>Aprenda como usar o MPU6050 de forma profissional em projetos embarcados utilizando giroscópio, acelerômetro e o DMP interno. Este guia técnico explica passo a passo como configurar registradores, converter dados brutos para unidades físicas, calcular inclinação com trigonometria, integrar velocidade angular, aplicar filtro complementar e utilizar quaternions via FIFO do DMP para obter yaw, pitch e roll estáveis. Também demonstra como remover a gravidade para extrair aceleração linear real e integrar movimento com técnicas como ZUPT. Conteúdo completo com exemplos em linguagem C, arquitetura para superloop e FreeRTOS e boas práticas de depuração.</p>
<p>The post <a href="https://mcu.tec.br/sensores/mpu6050-em-projetos-reais-do-dado-cru-ao-angulo-e-preparando-terreno-para-o-dmp/">MPU6050 em projetos reais: do “dado cru” ao ângulo (e preparando terreno para o DMP)</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="root-eb-toc-qidhp wp-block-essential-blocks-table-of-contents"><div class="eb-parent-wrapper eb-parent-eb-toc-qidhp "><div class="eb-toc-container eb-toc-qidhp  eb-toc-is-not-sticky eb-toc-not-collapsible eb-toc-initially-not-collapsed eb-toc-scrollToTop style-1 list-style-none" data-scroll-top="false" data-scroll-top-icon="fas fa-angle-up" data-collapsible="false" data-sticky-hide-mobile="false" data-sticky="false" data-scroll-target="scroll_to_toc" data-copy-link="false" data-editor-type="" data-hide-desktop="false" data-hide-tab="false" data-hide-mobile="false" data-itemcollapsed="false" data-highlight-scroll="false"><div class="eb-toc-header"><h2 class="eb-toc-title">Table of Contents</h2></div><div class="eb-toc-wrapper " data-headers="[{&quot;level&quot;:2,&quot;content&quot;:&quot;Leitura bruta e convers\u00e3o para unidades f\u00edsicas (C, I\u00b2C gen\u00e9rico)&quot;,&quot;text&quot;:&quot;Leitura bruta e convers\u00e3o para unidades f\u00edsicas (C, I\u00b2C gen\u00e9rico)&quot;,&quot;link&quot;:&quot;eb-table-content-0&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;C\u00f3digo (driver m\u00ednimo) \u2014 com callbacks de I\u00b2C&quot;,&quot;text&quot;:&quot;C\u00f3digo (driver m\u00ednimo) \u2014 com callbacks de I\u00b2C&quot;,&quot;link&quot;:&quot;eb-table-content-1&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;O que esse c\u00f3digo est\u00e1 fazendo (de verdade)&quot;,&quot;text&quot;:&quot;O que esse c\u00f3digo est\u00e1 fazendo (de verdade)&quot;,&quot;link&quot;:&quot;eb-table-content-2&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Observa\u00e7\u00e3o importante de bancada (qualidade de m\u00f3dulos no mercado)&quot;,&quot;text&quot;:&quot;Observa\u00e7\u00e3o importante de bancada (qualidade de m\u00f3dulos no mercado)&quot;,&quot;link&quot;:&quot;eb-table-content-3&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Inclina\u00e7\u00e3o por aceler\u00f4metro: pitch e roll com trigonometria (vetor gravidade + atan2)&quot;,&quot;text&quot;:&quot;Inclina\u00e7\u00e3o por aceler\u00f4metro: pitch e roll com trigonometria (vetor gravidade + atan2)&quot;,&quot;link&quot;:&quot;eb-table-content-4&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Modelo geom\u00e9trico (sem inventar \u201cm\u00e1gica\u201d)&quot;,&quot;text&quot;:&quot;Modelo geom\u00e9trico (sem inventar \u201cm\u00e1gica\u201d)&quot;,&quot;link&quot;:&quot;eb-table-content-5&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;C\u00f3digo em C: calcula pitch\/roll a partir dos dados convertidos&quot;,&quot;text&quot;:&quot;C\u00f3digo em C: calcula pitch\/roll a partir dos dados convertidos&quot;,&quot;link&quot;:&quot;eb-table-content-6&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Por que isso funciona (ligando matem\u00e1tica ao \u201cmundo f\u00edsico\u201d)&quot;,&quot;text&quot;:&quot;Por que isso funciona (ligando matem\u00e1tica ao \u201cmundo f\u00edsico\u201d)&quot;,&quot;link&quot;:&quot;eb-table-content-7&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Exemplo de uso (amarrando com a se\u00e7\u00e3o anterior)&quot;,&quot;text&quot;:&quot;Exemplo de uso (amarrando com a se\u00e7\u00e3o anterior)&quot;,&quot;link&quot;:&quot;eb-table-content-8&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Girosc\u00f3pio na pr\u00e1tica: taxa de rota\u00e7\u00e3o, integra\u00e7\u00e3o no tempo e \u00e2ngulo est\u00e1vel com fus\u00e3o (filtro complementar)&quot;,&quot;text&quot;:&quot;Girosc\u00f3pio na pr\u00e1tica: taxa de rota\u00e7\u00e3o, integra\u00e7\u00e3o no tempo e \u00e2ngulo est\u00e1vel com fus\u00e3o (filtro complementar)&quot;,&quot;link&quot;:&quot;eb-table-content-9&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;1) Calibrando o bias do girosc\u00f3pio (do jeito que funciona em bancada)&quot;,&quot;text&quot;:&quot;1) Calibrando o bias do girosc\u00f3pio (do jeito que funciona em bancada)&quot;,&quot;link&quot;:&quot;eb-table-content-10&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2) Integra\u00e7\u00e3o do girosc\u00f3pio para obter \u00e2ngulo (roll\/pitch) e por que deriva&quot;,&quot;text&quot;:&quot;2) Integra\u00e7\u00e3o do girosc\u00f3pio para obter \u00e2ngulo (roll\/pitch) e por que deriva&quot;,&quot;link&quot;:&quot;eb-table-content-11&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3) Filtro complementar: girosc\u00f3pio r\u00e1pido + aceler\u00f4metro est\u00e1vel (pitch\/roll)&quot;,&quot;text&quot;:&quot;3) Filtro complementar: girosc\u00f3pio r\u00e1pido + aceler\u00f4metro est\u00e1vel (pitch\/roll)&quot;,&quot;link&quot;:&quot;eb-table-content-12&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4) Medindo o dt direito (onde muita gente erra)&quot;,&quot;text&quot;:&quot;4) Medindo o dt direito (onde muita gente erra)&quot;,&quot;link&quot;:&quot;4-medindo-o-dt-direito-onde-muita-gente-erra&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Girosc\u00f3pio na pr\u00e1tica: taxa de rota\u00e7\u00e3o, integra\u00e7\u00e3o no tempo e \u00e2ngulo est\u00e1vel com fus\u00e3o (filtro complementar)&quot;,&quot;text&quot;:&quot;Girosc\u00f3pio na pr\u00e1tica: taxa de rota\u00e7\u00e3o, integra\u00e7\u00e3o no tempo e \u00e2ngulo est\u00e1vel com fus\u00e3o (filtro complementar)&quot;,&quot;link&quot;:&quot;eb-table-content-14&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;1) Calibrando o bias do girosc\u00f3pio (do jeito que funciona em bancada)&quot;,&quot;text&quot;:&quot;1) Calibrando o bias do girosc\u00f3pio (do jeito que funciona em bancada)&quot;,&quot;link&quot;:&quot;eb-table-content-15&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2) Integra\u00e7\u00e3o do girosc\u00f3pio para obter \u00e2ngulo (roll\/pitch) e por que deriva&quot;,&quot;text&quot;:&quot;2) Integra\u00e7\u00e3o do girosc\u00f3pio para obter \u00e2ngulo (roll\/pitch) e por que deriva&quot;,&quot;link&quot;:&quot;eb-table-content-16&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3) Filtro complementar: girosc\u00f3pio r\u00e1pido + aceler\u00f4metro est\u00e1vel (pitch\/roll)&quot;,&quot;text&quot;:&quot;3) Filtro complementar: girosc\u00f3pio r\u00e1pido + aceler\u00f4metro est\u00e1vel (pitch\/roll)&quot;,&quot;link&quot;:&quot;eb-table-content-17&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4) Medindo o dt direito (onde muita gente erra)&quot;,&quot;text&quot;:&quot;4) Medindo o dt direito (onde muita gente erra)&quot;,&quot;link&quot;:&quot;4-medindo-o-dt-direito-onde-muita-gente-erra&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Acelera\u00e7\u00e3o \u201cdo objeto\u201d e movimento: separando gravidade da acelera\u00e7\u00e3o linear (e por que integrar vira deriva)&quot;,&quot;text&quot;:&quot;Acelera\u00e7\u00e3o \u201cdo objeto\u201d e movimento: separando gravidade da acelera\u00e7\u00e3o linear (e por que integrar vira deriva)&quot;,&quot;link&quot;:&quot;eb-table-content-19&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Estimando o vetor gravidade no referencial do sensor a partir de roll\/pitch&quot;,&quot;text&quot;:&quot;Estimando o vetor gravidade no referencial do sensor a partir de roll\/pitch&quot;,&quot;link&quot;:&quot;estimando-o-vetor-gravidade-no-referencial-do-sensor-a-partir-de-rollpitch&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;C\u00f3digo em C: gravidade estimada e acelera\u00e7\u00e3o linear (em g e em m\/s\u00b2)&quot;,&quot;text&quot;:&quot;C\u00f3digo em C: gravidade estimada e acelera\u00e7\u00e3o linear (em g e em m\/s\u00b2)&quot;,&quot;link&quot;:&quot;eb-table-content-21&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Movimento: integrar acelera\u00e7\u00e3o linear para velocidade e posi\u00e7\u00e3o (e o \u201celefante na sala\u201d)&quot;,&quot;text&quot;:&quot;Movimento: integrar acelera\u00e7\u00e3o linear para velocidade e posi\u00e7\u00e3o (e o \u201celefante na sala\u201d)&quot;,&quot;link&quot;:&quot;eb-table-content-22&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Exemplo de loop completo (amarrando tudo)&quot;,&quot;text&quot;:&quot;Exemplo de loop completo (amarrando tudo)&quot;,&quot;link&quot;:&quot;exemplo-de-loop-completo-amarrando-tudo&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Usando o DMP interno do MPU6050: FIFO, interrup\u00e7\u00e3o, quaternions e yaw\/pitch\/roll com mais estabilidade&quot;,&quot;text&quot;:&quot;Usando o DMP interno do MPU6050: FIFO, interrup\u00e7\u00e3o, quaternions e yaw\/pitch\/roll com mais estabilidade&quot;,&quot;link&quot;:&quot;eb-table-content-24&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;1) O que o DMP entrega e por que o quaternion \u00e9 melhor que Euler direto&quot;,&quot;text&quot;:&quot;1) O que o DMP entrega e por que o quaternion \u00e9 melhor que Euler direto&quot;,&quot;link&quot;:&quot;eb-table-content-25&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2) Inicializa\u00e7\u00e3o t\u00edpica do DMP (o que precisa acontecer)&quot;,&quot;text&quot;:&quot;2) Inicializa\u00e7\u00e3o t\u00edpica do DMP (o que precisa acontecer)&quot;,&quot;link&quot;:&quot;eb-table-content-26&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3) Leitura do FIFO: como extrair pacote, lidar com overflow e converter para \u00e2ngulos&quot;,&quot;text&quot;:&quot;3) Leitura do FIFO: como extrair pacote, lidar com overflow e converter para \u00e2ngulos&quot;,&quot;link&quot;:&quot;eb-table-content-27&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4) Como isso conversa com \u201cacelera\u00e7\u00e3o do objeto\u201d e movimento&quot;,&quot;text&quot;:&quot;4) Como isso conversa com \u201cacelera\u00e7\u00e3o do objeto\u201d e movimento&quot;,&quot;link&quot;:&quot;eb-table-content-28&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Acelera\u00e7\u00e3o linear usando quaternion do DMP: remo\u00e7\u00e3o de gravidade \u201c3D correta\u201d e movimento (com limites honestos)&quot;,&quot;text&quot;:&quot;Acelera\u00e7\u00e3o linear usando quaternion do DMP: remo\u00e7\u00e3o de gravidade \u201c3D correta\u201d e movimento (com limites honestos)&quot;,&quot;link&quot;:&quot;eb-table-content-29&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;1) Gravidade a partir do quaternion (igual ao que as libs fazem, mas sem esconder o c\u00e1lculo)&quot;,&quot;text&quot;:&quot;1) Gravidade a partir do quaternion (igual ao que as libs fazem, mas sem esconder o c\u00e1lculo)&quot;,&quot;link&quot;:&quot;eb-table-content-30&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2) Integrando para \u201cmovimento\u201d sem se enganar&quot;,&quot;text&quot;:&quot;2) Integrando para \u201cmovimento\u201d sem se enganar&quot;,&quot;link&quot;:&quot;2-integrando-para-movimento-sem-se-enganar&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Boas pr\u00e1ticas para MPU6050 + DMP (o que evita dor de cabe\u00e7a de verdade)&quot;,&quot;text&quot;:&quot;Boas pr\u00e1ticas para MPU6050 + DMP (o que evita dor de cabe\u00e7a de verdade)&quot;,&quot;link&quot;:&quot;eb-table-content-32&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Guia de depura\u00e7\u00e3o e arquitetura de firmware para MPU6050 + DMP (superloop ou FreeRTOS sem perder pacotes)&quot;,&quot;text&quot;:&quot;Guia de depura\u00e7\u00e3o e arquitetura de firmware para MPU6050 + DMP (superloop ou FreeRTOS sem perder pacotes)&quot;,&quot;link&quot;:&quot;eb-table-content-33&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Superloop robusto com INT: ler FIFO apenas quando chegar dado novo&quot;,&quot;text&quot;:&quot;Superloop robusto com INT: ler FIFO apenas quando chegar dado novo&quot;,&quot;link&quot;:&quot;superloop-robusto-com-int-ler-fifo-apenas-quando-chegar-dado-novo&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Em FreeRTOS: ISR d\u00e1 um \u201csinal\u201d, tarefa l\u00ea FIFO e processa&quot;,&quot;text&quot;:&quot;Em FreeRTOS: ISR d\u00e1 um \u201csinal\u201d, tarefa l\u00ea FIFO e processa&quot;,&quot;link&quot;:&quot;eb-table-content-35&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Como identificar r\u00e1pido a causa quando \u201cest\u00e1 ruim\u201d&quot;,&quot;text&quot;:&quot;Como identificar r\u00e1pido a causa quando \u201cest\u00e1 ruim\u201d&quot;,&quot;link&quot;:&quot;eb-table-content-36&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Fechando o ciclo com o que voc\u00ea pediu: por que o DMP melhora \u201cresultados\u201d&quot;,&quot;text&quot;:&quot;Fechando o ciclo com o que voc\u00ea pediu: por que o DMP melhora \u201cresultados\u201d&quot;,&quot;link&quot;:&quot;eb-table-content-37&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Refer\u00eancias&quot;,&quot;text&quot;:&quot;Refer\u00eancias&quot;,&quot;link&quot;:&quot;eb-table-content-38&quot;}]" data-visible="[true,true,true,true,true,true]" data-delete-headers="[{&quot;label&quot;:&quot;Leitura bruta e convers\u00e3o para unidades f\u00edsicas (C, I\u00b2C gen\u00e9rico)&quot;,&quot;value&quot;:&quot;leitura-bruta-e-convers\u00e3o-para-unidades-f\u00edsicas-c-i\u00b2c-gen\u00e9rico&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;C\u00f3digo (driver m\u00ednimo) \u2014 com callbacks de I\u00b2C&quot;,&quot;value&quot;:&quot;c\u00f3digo-driver-m\u00ednimo-com-callbacks-de-i\u00b2c&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;O que esse c\u00f3digo est\u00e1 fazendo (de verdade)&quot;,&quot;value&quot;:&quot;o-que-esse-c\u00f3digo-est\u00e1-fazendo-de-verdade&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Observa\u00e7\u00e3o importante de bancada (qualidade de m\u00f3dulos no mercado)&quot;,&quot;value&quot;:&quot;observa\u00e7\u00e3o-importante-de-bancada-qualidade-de-m\u00f3dulos-no-mercado&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Inclina\u00e7\u00e3o por aceler\u00f4metro: pitch e roll com trigonometria (vetor gravidade + atan2)&quot;,&quot;value&quot;:&quot;inclina\u00e7\u00e3o-por-aceler\u00f4metro-pitch-e-roll-com-trigonometria-vetor-gravidade-atan2&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Modelo geom\u00e9trico (sem inventar \u201cm\u00e1gica\u201d)&quot;,&quot;value&quot;:&quot;modelo-geom\u00e9trico-sem-inventar-m\u00e1gica&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;C\u00f3digo em C: calcula pitch\/roll a partir dos dados convertidos&quot;,&quot;value&quot;:&quot;c\u00f3digo-em-c-calcula-pitchroll-a-partir-dos-dados-convertidos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Por que isso funciona (ligando matem\u00e1tica ao \u201cmundo f\u00edsico\u201d)&quot;,&quot;value&quot;:&quot;por-que-isso-funciona-ligando-matem\u00e1tica-ao-mundo-f\u00edsico&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo de uso (amarrando com a se\u00e7\u00e3o anterior)&quot;,&quot;value&quot;:&quot;exemplo-de-uso-amarrando-com-a-se\u00e7\u00e3o-anterior&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Girosc\u00f3pio na pr\u00e1tica: taxa de rota\u00e7\u00e3o, integra\u00e7\u00e3o no tempo e \u00e2ngulo est\u00e1vel com fus\u00e3o (filtro complementar)&quot;,&quot;value&quot;:&quot;girosc\u00f3pio-na-pr\u00e1tica-taxa-de-rota\u00e7\u00e3o-integra\u00e7\u00e3o-no-tempo-e-\u00e2ngulo-est\u00e1vel-com-fus\u00e3o-filtro-complementar&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1) Calibrando o bias do girosc\u00f3pio (do jeito que funciona em bancada)&quot;,&quot;value&quot;:&quot;1-calibrando-o-bias-do-girosc\u00f3pio-do-jeito-que-funciona-em-bancada&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2) Integra\u00e7\u00e3o do girosc\u00f3pio para obter \u00e2ngulo (roll\/pitch) e por que deriva&quot;,&quot;value&quot;:&quot;2-integra\u00e7\u00e3o-do-girosc\u00f3pio-para-obter-\u00e2ngulo-rollpitch-e-por-que-deriva&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3) Filtro complementar: girosc\u00f3pio r\u00e1pido + aceler\u00f4metro est\u00e1vel (pitch\/roll)&quot;,&quot;value&quot;:&quot;3-filtro-complementar-girosc\u00f3pio-r\u00e1pido-aceler\u00f4metro-est\u00e1vel-pitchroll&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4) Medindo o dt direito (onde muita gente erra)&quot;,&quot;value&quot;:&quot;4-medindo-o-dt-direito-onde-muita-gente-erra&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Girosc\u00f3pio na pr\u00e1tica: taxa de rota\u00e7\u00e3o, integra\u00e7\u00e3o no tempo e \u00e2ngulo est\u00e1vel com fus\u00e3o (filtro complementar)&quot;,&quot;value&quot;:&quot;girosc\u00f3pio-na-pr\u00e1tica-taxa-de-rota\u00e7\u00e3o-integra\u00e7\u00e3o-no-tempo-e-\u00e2ngulo-est\u00e1vel-com-fus\u00e3o-filtro-complementar&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1) Calibrando o bias do girosc\u00f3pio (do jeito que funciona em bancada)&quot;,&quot;value&quot;:&quot;1-calibrando-o-bias-do-girosc\u00f3pio-do-jeito-que-funciona-em-bancada&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2) Integra\u00e7\u00e3o do girosc\u00f3pio para obter \u00e2ngulo (roll\/pitch) e por que deriva&quot;,&quot;value&quot;:&quot;2-integra\u00e7\u00e3o-do-girosc\u00f3pio-para-obter-\u00e2ngulo-rollpitch-e-por-que-deriva&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3) Filtro complementar: girosc\u00f3pio r\u00e1pido + aceler\u00f4metro est\u00e1vel (pitch\/roll)&quot;,&quot;value&quot;:&quot;3-filtro-complementar-girosc\u00f3pio-r\u00e1pido-aceler\u00f4metro-est\u00e1vel-pitchroll&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4) Medindo o dt direito (onde muita gente erra)&quot;,&quot;value&quot;:&quot;4-medindo-o-dt-direito-onde-muita-gente-erra&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Acelera\u00e7\u00e3o \u201cdo objeto\u201d e movimento: separando gravidade da acelera\u00e7\u00e3o linear (e por que integrar vira deriva)&quot;,&quot;value&quot;:&quot;acelera\u00e7\u00e3o-do-objeto-e-movimento-separando-gravidade-da-acelera\u00e7\u00e3o-linear-e-por-que-integrar-vira-deriva&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Estimando o vetor gravidade no referencial do sensor a partir de roll\/pitch&quot;,&quot;value&quot;:&quot;estimando-o-vetor-gravidade-no-referencial-do-sensor-a-partir-de-rollpitch&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;C\u00f3digo em C: gravidade estimada e acelera\u00e7\u00e3o linear (em g e em m\/s\u00b2)&quot;,&quot;value&quot;:&quot;c\u00f3digo-em-c-gravidade-estimada-e-acelera\u00e7\u00e3o-linear-em-g-e-em-ms\u00b2&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Movimento: integrar acelera\u00e7\u00e3o linear para velocidade e posi\u00e7\u00e3o (e o \u201celefante na sala\u201d)&quot;,&quot;value&quot;:&quot;movimento-integrar-acelera\u00e7\u00e3o-linear-para-velocidade-e-posi\u00e7\u00e3o-e-o-elefante-na-sala&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo de loop completo (amarrando tudo)&quot;,&quot;value&quot;:&quot;exemplo-de-loop-completo-amarrando-tudo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Usando o DMP interno do MPU6050: FIFO, interrup\u00e7\u00e3o, quaternions e yaw\/pitch\/roll com mais estabilidade&quot;,&quot;value&quot;:&quot;usando-o-dmp-interno-do-mpu6050-fifo-interrup\u00e7\u00e3o-quaternions-e-yawpitchroll-com-mais-estabilidade&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1) O que o DMP entrega e por que o quaternion \u00e9 melhor que Euler direto&quot;,&quot;value&quot;:&quot;1-o-que-o-dmp-entrega-e-por-que-o-quaternion-\u00e9-melhor-que-euler-direto&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2) Inicializa\u00e7\u00e3o t\u00edpica do DMP (o que precisa acontecer)&quot;,&quot;value&quot;:&quot;2-inicializa\u00e7\u00e3o-t\u00edpica-do-dmp-o-que-precisa-acontecer&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3) Leitura do FIFO: como extrair pacote, lidar com overflow e converter para \u00e2ngulos&quot;,&quot;value&quot;:&quot;3-leitura-do-fifo-como-extrair-pacote-lidar-com-overflow-e-converter-para-\u00e2ngulos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4) Como isso conversa com \u201cacelera\u00e7\u00e3o do objeto\u201d e movimento&quot;,&quot;value&quot;:&quot;4-como-isso-conversa-com-acelera\u00e7\u00e3o-do-objeto-e-movimento&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Acelera\u00e7\u00e3o linear usando quaternion do DMP: remo\u00e7\u00e3o de gravidade \u201c3D correta\u201d e movimento (com limites honestos)&quot;,&quot;value&quot;:&quot;acelera\u00e7\u00e3o-linear-usando-quaternion-do-dmp-remo\u00e7\u00e3o-de-gravidade-3d-correta-e-movimento-com-limites-honestos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1) Gravidade a partir do quaternion (igual ao que as libs fazem, mas sem esconder o c\u00e1lculo)&quot;,&quot;value&quot;:&quot;1-gravidade-a-partir-do-quaternion-igual-ao-que-as-libs-fazem-mas-sem-esconder-o-c\u00e1lculo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2) Integrando para \u201cmovimento\u201d sem se enganar&quot;,&quot;value&quot;:&quot;2-integrando-para-movimento-sem-se-enganar&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Boas pr\u00e1ticas para MPU6050 + DMP (o que evita dor de cabe\u00e7a de verdade)&quot;,&quot;value&quot;:&quot;boas-pr\u00e1ticas-para-mpu6050-dmp-o-que-evita-dor-de-cabe\u00e7a-de-verdade&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Guia de depura\u00e7\u00e3o e arquitetura de firmware para MPU6050 + DMP (superloop ou FreeRTOS sem perder pacotes)&quot;,&quot;value&quot;:&quot;guia-de-depura\u00e7\u00e3o-e-arquitetura-de-firmware-para-mpu6050-dmp-superloop-ou-freertos-sem-perder-pacotes&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Superloop robusto com INT: ler FIFO apenas quando chegar dado novo&quot;,&quot;value&quot;:&quot;superloop-robusto-com-int-ler-fifo-apenas-quando-chegar-dado-novo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Em FreeRTOS: ISR d\u00e1 um \u201csinal\u201d, tarefa l\u00ea FIFO e processa&quot;,&quot;value&quot;:&quot;em-freertos-isr-d\u00e1-um-sinal-tarefa-l\u00ea-fifo-e-processa&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Como identificar r\u00e1pido a causa quando \u201cest\u00e1 ruim\u201d&quot;,&quot;value&quot;:&quot;como-identificar-r\u00e1pido-a-causa-quando-est\u00e1-ruim&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Fechando o ciclo com o que voc\u00ea pediu: por que o DMP melhora \u201cresultados\u201d&quot;,&quot;value&quot;:&quot;fechando-o-ciclo-com-o-que-voc\u00ea-pediu-por-que-o-dmp-melhora-resultados&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Refer\u00eancias&quot;,&quot;value&quot;:&quot;refer\u00eancias&quot;,&quot;isDelete&quot;:false}]" data-smooth="true" data-top-offset=""><div class="eb-toc__list-wrap"><ul class="eb-toc__list"><li><a href="#eb-table-content-0">Leitura bruta e conversão para unidades físicas (C, I²C genérico)</a><ul class="eb-toc__list"><li><a href="#eb-table-content-1">Código (driver mínimo) — com callbacks de I²C</a><li><a href="#eb-table-content-2">O que esse código está fazendo (de verdade)</a><li><a href="#eb-table-content-3">Observação importante de bancada (qualidade de módulos no mercado)</a></li></ul><li><a href="#eb-table-content-4">Inclinação por acelerômetro: pitch e roll com trigonometria (vetor gravidade + atan2)</a><ul class="eb-toc__list"><li><a href="#eb-table-content-5">Modelo geométrico (sem inventar “mágica”)</a><li><a href="#eb-table-content-6">Código em C: calcula pitch/roll a partir dos dados convertidos</a><li><a href="#eb-table-content-7">Por que isso funciona (ligando matemática ao “mundo físico”)</a><li><a href="#eb-table-content-8">Exemplo de uso (amarrando com a seção anterior)</a></li></ul><li><a href="#eb-table-content-9">Giroscópio na prática: taxa de rotação, integração no tempo e ângulo estável com fusão (filtro complementar)</a><ul class="eb-toc__list"><li><a href="#eb-table-content-10">1) Calibrando o bias do giroscópio (do jeito que funciona em bancada)</a><li><a href="#eb-table-content-11">2) Integração do giroscópio para obter ângulo (roll/pitch) e por que deriva</a><li><a href="#eb-table-content-12">3) Filtro complementar: giroscópio rápido + acelerômetro estável (pitch/roll)</a><li><a href="#4-medindo-o-dt-direito-onde-muita-gente-erra">4) Medindo o dt direito (onde muita gente erra)</a></li></ul><li><a href="#eb-table-content-14">Giroscópio na prática: taxa de rotação, integração no tempo e ângulo estável com fusão (filtro complementar)</a><ul class="eb-toc__list"><li><a href="#eb-table-content-15">1) Calibrando o bias do giroscópio (do jeito que funciona em bancada)</a><li><a href="#eb-table-content-16">2) Integração do giroscópio para obter ângulo (roll/pitch) e por que deriva</a><li><a href="#eb-table-content-17">3) Filtro complementar: giroscópio rápido + acelerômetro estável (pitch/roll)</a><li><a href="#4-medindo-o-dt-direito-onde-muita-gente-erra">4) Medindo o dt direito (onde muita gente erra)</a></li></ul><li><a href="#eb-table-content-19">Aceleração “do objeto” e movimento: separando gravidade da aceleração linear (e por que integrar vira deriva)</a><ul class="eb-toc__list"><li><a href="#estimando-o-vetor-gravidade-no-referencial-do-sensor-a-partir-de-rollpitch">Estimando o vetor gravidade no referencial do sensor a partir de roll/pitch</a><li><a href="#eb-table-content-21">Código em C: gravidade estimada e aceleração linear (em g e em m/s²)</a><li><a href="#eb-table-content-22">Movimento: integrar aceleração linear para velocidade e posição (e o “elefante na sala”)</a><li><a href="#exemplo-de-loop-completo-amarrando-tudo">Exemplo de loop completo (amarrando tudo)</a></li></ul><li><a href="#eb-table-content-24">Usando o DMP interno do MPU6050: FIFO, interrupção, quaternions e yaw/pitch/roll com mais estabilidade</a><ul class="eb-toc__list"><li><a href="#eb-table-content-25">1) O que o DMP entrega e por que o quaternion é melhor que Euler direto</a><li><a href="#eb-table-content-26">2) Inicialização típica do DMP (o que precisa acontecer)</a><li><a href="#eb-table-content-27">3) Leitura do FIFO: como extrair pacote, lidar com overflow e converter para ângulos</a><li><a href="#eb-table-content-28">4) Como isso conversa com “aceleração do objeto” e movimento</a></li></ul><li><a href="#eb-table-content-29">Aceleração linear usando quaternion do DMP: remoção de gravidade “3D correta” e movimento (com limites honestos)</a><ul class="eb-toc__list"><li><a href="#eb-table-content-30">1) Gravidade a partir do quaternion (igual ao que as libs fazem, mas sem esconder o cálculo)</a><li><a href="#2-integrando-para-movimento-sem-se-enganar">2) Integrando para “movimento” sem se enganar</a></li></ul><li><a href="#eb-table-content-32">Boas práticas para MPU6050 + DMP (o que evita dor de cabeça de verdade)</a><li><a href="#eb-table-content-33">Guia de depuração e arquitetura de firmware para MPU6050 + DMP (superloop ou FreeRTOS sem perder pacotes)</a><ul class="eb-toc__list"><li><a href="#superloop-robusto-com-int-ler-fifo-apenas-quando-chegar-dado-novo">Superloop robusto com INT: ler FIFO apenas quando chegar dado novo</a><li><a href="#eb-table-content-35">Em FreeRTOS: ISR dá um “sinal”, tarefa lê FIFO e processa</a><li><a href="#eb-table-content-36">Como identificar rápido a causa quando “está ruim”</a><li><a href="#eb-table-content-37">Fechando o ciclo com o que você pediu: por que o DMP melhora “resultados”</a></li></ul><li><a href="#eb-table-content-38">Referências</a></ul></div></div></div></div></div>


<p class="wp-block-paragraph">O MPU6050 é uma IMU (Unidade de Medição Inercial) de 6 eixos que integra acelerômetro (3 eixos) e giroscópio (3 eixos) e expõe tudo via I²C. A forma mais confiável de “começar certo” é dominar primeiro a leitura bruta e as conversões (LSB → unidades físicas), porque isso te dá um baseline para validar qualquer etapa posterior (filtros, fusão, DMP e quaternions). A própria InvenSense/TDK documenta o mapa de registradores e a especificação do dispositivo, que é o que vamos seguir aqui. (<a href="https://invensense.tdk.com/wp-content/uploads/2015/02/MPU-6000-Register-Map1.pdf?utm_source=chatgpt.com">TDK InvenSense</a>)</p>



<p class="wp-block-paragraph">Nesta primeira seção eu vou te entregar um “núcleo” em C: inicialização mínima, leitura de acelerômetro/giroscópio e conversão para <strong>g</strong>, <strong>m/s²</strong> e <strong>°/s</strong>. Na próxima seção, eu sigo para <strong>inclinação por trigonometria</strong> (pitch/roll por acelerômetro), depois <strong>integração do giroscópio</strong> e, em seguida, <strong>DMP + FIFO + quaternions</strong> (onde o ganho é enorme em estabilidade e praticidade).</p>


<div class="wp-block-image">
<figure class="alignright size-full is-resized"><img fetchpriority="high" decoding="async" width="600" height="600" src="https://mcu.tec.br/wp-content/uploads/2026/02/image-43.png" alt="" class="wp-image-1361" style="width:445px;height:auto" srcset="https://mcu.tec.br/wp-content/uploads/2026/02/image-43.png 600w, https://mcu.tec.br/wp-content/uploads/2026/02/image-43-300x300.png 300w, https://mcu.tec.br/wp-content/uploads/2026/02/image-43-150x150.png 150w" sizes="(max-width: 600px) 100vw, 600px" /></figure>
</div>


<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Leitura bruta e conversão para unidades físicas (C, I²C genérico)</h2>



<p class="wp-block-paragraph">A base do MPU6050 é simples: você configura alguns registradores de controle (clock, escalas, taxa de amostragem) e lê 14 bytes contínuos a partir do registrador de aceleração. Esses 14 bytes contêm <strong>AX, AY, AZ, temperatura, GX, GY, GZ</strong>, cada um em <strong>16 bits com sinal</strong> (two’s complement), com byte alto seguido de byte baixo. O endereço do registrador inicial e os registradores de controle usados abaixo estão no “Register Map and Descriptions”. (<a href="https://invensense.tdk.com/wp-content/uploads/2015/02/MPU-6000-Register-Map1.pdf?utm_source=chatgpt.com">TDK InvenSense</a>)</p>



<h3 class="wp-block-heading">Código (driver mínimo) — com callbacks de I²C</h3>



<p class="wp-block-paragraph">O código abaixo não “inventa HAL”. Ele assume que você já tem I²C funcionando e consegue implementar duas funções: <code>i2c_write_reg()</code> e <code>i2c_read_regs()</code>. Isso deixa o exemplo portável para STM32, AVR, ESP32, Linux, etc.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>#include &lt;stdint.h>
#include &lt;stdbool.h>

#ifndef MPU6050_I2C_ADDR
// AD0=0 -> 0x68, AD0=1 -> 0x69 (endereço de 7 bits)
#define MPU6050_I2C_ADDR 0x68
#endif

// Registradores principais (MPU-6000/MPU-6050 Register Map)
#define REG_SMPLRT_DIV    0x19
#define REG_CONFIG        0x1A
#define REG_GYRO_CONFIG   0x1B
#define REG_ACCEL_CONFIG  0x1C
#define REG_INT_ENABLE    0x38
#define REG_ACCEL_XOUT_H  0x3B
#define REG_PWR_MGMT_1    0x6B
#define REG_WHO_AM_I      0x75

// Bits e campos úteis
#define PWR1_SLEEP_BIT    6

// FS_SEL (GYRO_CONFIG&#91;4:3&#93;) e AFS_SEL (ACCEL_CONFIG&#91;4:3&#93;)
typedef enum {
    MPU6050_GYRO_FS_250  = 0, // ±250 °/s
    MPU6050_GYRO_FS_500  = 1, // ±500 °/s
    MPU6050_GYRO_FS_1000 = 2, // ±1000 °/s
    MPU6050_GYRO_FS_2000 = 3  // ±2000 °/s
} mpu6050_gyro_fs_t;

typedef enum {
    MPU6050_ACCEL_FS_2G  = 0, // ±2 g
    MPU6050_ACCEL_FS_4G  = 1, // ±4 g
    MPU6050_ACCEL_FS_8G  = 2, // ±8 g
    MPU6050_ACCEL_FS_16G = 3  // ±16 g
} mpu6050_accel_fs_t;

typedef struct {
    mpu6050_gyro_fs_t  gyro_fs;
    mpu6050_accel_fs_t accel_fs;

    // fatores de escala (LSB por unidade)
    float accel_lsb_per_g;
    float gyro_lsb_per_dps;
} mpu6050_cfg_t;

typedef struct {
    int16_t ax, ay, az;
    int16_t gx, gy, gz;
    int16_t temp_raw;
} mpu6050_raw_t;

typedef struct {
    // aceleração
    float ax_g, ay_g, az_g;        // em g
    float ax_ms2, ay_ms2, az_ms2;  // em m/s²
    // rotação
    float gx_dps, gy_dps, gz_dps;  // em °/s
} mpu6050_si_t;

// Você implementa essas duas funções na sua plataforma:
extern bool i2c_write_reg(uint8_t addr7, uint8_t reg, uint8_t value);
extern bool i2c_read_regs(uint8_t addr7, uint8_t start_reg, uint8_t *buf, uint16_t len);

static float accel_lsb_per_g_from_fs(mpu6050_accel_fs_t fs) {
    // Do datasheet/register map: sensibilidade depende do AFS_SEL. :contentReference&#91;oaicite:2&#93;{index=2}
    switch (fs) {
        case MPU6050_ACCEL_FS_2G:  return 16384.0f;
        case MPU6050_ACCEL_FS_4G:  return 8192.0f;
        case MPU6050_ACCEL_FS_8G:  return 4096.0f;
        case MPU6050_ACCEL_FS_16G: return 2048.0f;
        default: return 16384.0f;
    }
}

static float gyro_lsb_per_dps_from_fs(mpu6050_gyro_fs_t fs) {
    // Do datasheet/register map: sensibilidade depende do FS_SEL. :contentReference&#91;oaicite:3&#93;{index=3}
    switch (fs) {
        case MPU6050_GYRO_FS_250:  return 131.0f;
        case MPU6050_GYRO_FS_500:  return 65.5f;
        case MPU6050_GYRO_FS_1000: return 32.8f;
        case MPU6050_GYRO_FS_2000: return 16.4f;
        default: return 131.0f;
    }
}

bool mpu6050_init(const mpu6050_cfg_t *cfg) {
    // 1) Acorda o chip e seleciona clock interno padrão (PWR_MGMT_1).
    // Escrever 0 em PWR_MGMT_1 limpa SLEEP e deixa o clock interno ativo. :contentReference&#91;oaicite:4&#93;{index=4}
    if (!i2c_write_reg(MPU6050_I2C_ADDR, REG_PWR_MGMT_1, 0x00)) return false;

    // 2) Configura escalas de acel/gyro nos campos &#91;4:3&#93;
    // ACCEL_CONFIG: AFS_SEL em bits 4:3
    uint8_t accel_cfg = ((uint8_t)cfg->accel_fs &amp; 0x03u) &lt;&lt; 3;
    if (!i2c_write_reg(MPU6050_I2C_ADDR, REG_ACCEL_CONFIG, accel_cfg)) return false;

    // GYRO_CONFIG: FS_SEL em bits 4:3
    uint8_t gyro_cfg = ((uint8_t)cfg->gyro_fs &amp; 0x03u) &lt;&lt; 3;
    if (!i2c_write_reg(MPU6050_I2C_ADDR, REG_GYRO_CONFIG, gyro_cfg)) return false;

    // 3) (Opcional, mas recomendado) filtro digital passa-baixa (DLPF) e taxa de amostragem
    // CONFIG: DLPF_CFG em bits &#91;2:0&#93;. Ex.: 3 => um corte típico para reduzir ruído (ver tabela no register map). :contentReference&#91;oaicite:5&#93;{index=5}
    if (!i2c_write_reg(MPU6050_I2C_ADDR, REG_CONFIG, 0x03)) return false;

    // SMPLRT_DIV define taxa efetiva: sample_rate = gyro_output_rate / (1 + SMPLRT_DIV).
    // gyro_output_rate é 8 kHz quando DLPF_CFG=0, senão 1 kHz (ver register map). :contentReference&#91;oaicite:6&#93;{index=6}
    if (!i2c_write_reg(MPU6050_I2C_ADDR, REG_SMPLRT_DIV, 0x04)) return false; // exemplo

    // 4) Interrupções ficam para depois (no DMP a gente usa bastante INT + FIFO).
    if (!i2c_write_reg(MPU6050_I2C_ADDR, REG_INT_ENABLE, 0x00)) return false;

    return true;
}

bool mpu6050_read_raw(mpu6050_raw_t *out) {
    uint8_t buf&#91;14&#93;;
    if (!i2c_read_regs(MPU6050_I2C_ADDR, REG_ACCEL_XOUT_H, buf, 14)) return false;

    // Cada eixo é big-endian: High, Low
    out->ax = (int16_t)((buf&#91;0&#93; &lt;&lt; 8) | buf&#91;1&#93;);
    out->ay = (int16_t)((buf&#91;2&#93; &lt;&lt; 8) | buf&#91;3&#93;);
    out->az = (int16_t)((buf&#91;4&#93; &lt;&lt; 8) | buf&#91;5&#93;);
    out->temp_raw = (int16_t)((buf&#91;6&#93; &lt;&lt; 8) | buf&#91;7&#93;);
    out->gx = (int16_t)((buf&#91;8&#93;  &lt;&lt; 8) | buf&#91;9&#93;);
    out->gy = (int16_t)((buf&#91;10&#93; &lt;&lt; 8) | buf&#91;11&#93;);
    out->gz = (int16_t)((buf&#91;12&#93; &lt;&lt; 8) | buf&#91;13&#93;);

    return true;
}

void mpu6050_convert_to_si(const mpu6050_cfg_t *cfg, const mpu6050_raw_t *raw, mpu6050_si_t *out) {
    const float lsb_per_g   = accel_lsb_per_g_from_fs(cfg->accel_fs);
    const float lsb_per_dps = gyro_lsb_per_dps_from_fs(cfg->gyro_fs);

    // aceleração em g
    out->ax_g = (float)raw->ax / lsb_per_g;
    out->ay_g = (float)raw->ay / lsb_per_g;
    out->az_g = (float)raw->az / lsb_per_g;

    // g -> m/s² (g padrão ~ 9.80665)
    const float g0 = 9.80665f;
    out->ax_ms2 = out->ax_g * g0;
    out->ay_ms2 = out->ay_g * g0;
    out->az_ms2 = out->az_g * g0;

    // giro em °/s
    out->gx_dps = (float)raw->gx / lsb_per_dps;
    out->gy_dps = (float)raw->gy / lsb_per_dps;
    out->gz_dps = (float)raw->gz / lsb_per_dps;
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">include</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">stdint</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">h</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">include</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">stdbool</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">h</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">ifndef</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MPU6050_I2C_ADDR</span></span>
<span class="line"><span style="color: #616E88">// AD0=0 -&gt; 0x68, AD0=1 -&gt; 0x69 (endereço de 7 bits)</span></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">define</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MPU6050_I2C_ADDR</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0x68</span></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">endif</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88">// Registradores principais (MPU-6000/MPU-6050 Register Map)</span></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">define</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">REG_SMPLRT_DIV</span><span style="color: #D8DEE9FF">    </span><span style="color: #B48EAD">0x19</span></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">define</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">REG_CONFIG</span><span style="color: #D8DEE9FF">        </span><span style="color: #B48EAD">0x1A</span></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">define</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">REG_GYRO_CONFIG</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">0x1B</span></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">define</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">REG_ACCEL_CONFIG</span><span style="color: #D8DEE9FF">  </span><span style="color: #B48EAD">0x1C</span></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">define</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">REG_INT_ENABLE</span><span style="color: #D8DEE9FF">    </span><span style="color: #B48EAD">0x38</span></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">define</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">REG_ACCEL_XOUT_H</span><span style="color: #D8DEE9FF">  </span><span style="color: #B48EAD">0x3B</span></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">define</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">REG_PWR_MGMT_1</span><span style="color: #D8DEE9FF">    </span><span style="color: #B48EAD">0x6B</span></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">define</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">REG_WHO_AM_I</span><span style="color: #D8DEE9FF">      </span><span style="color: #B48EAD">0x75</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88">// Bits e campos úteis</span></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">define</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">PWR1_SLEEP_BIT</span><span style="color: #D8DEE9FF">    </span><span style="color: #B48EAD">6</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88">// FS_SEL (GYRO_CONFIG&#91;4:3&#93;) e AFS_SEL (ACCEL_CONFIG&#91;4:3&#93;)</span></span>
<span class="line"><span style="color: #D8DEE9">typedef</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">enum</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">MPU6050_GYRO_FS_250</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">// ±250 °/s</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">MPU6050_GYRO_FS_500</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">// ±500 °/s</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">MPU6050_GYRO_FS_1000</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">2</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">// ±1000 °/s</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">MPU6050_GYRO_FS_2000</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">3</span><span style="color: #D8DEE9FF">  </span><span style="color: #616E88">// ±2000 °/s</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">mpu6050_gyro_fs_t</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">typedef</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">enum</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">MPU6050_ACCEL_FS_2G</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">// ±2 g</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">MPU6050_ACCEL_FS_4G</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">// ±4 g</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">MPU6050_ACCEL_FS_8G</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">2</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">// ±8 g</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">MPU6050_ACCEL_FS_16G</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">3</span><span style="color: #D8DEE9FF">  </span><span style="color: #616E88">// ±16 g</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">mpu6050_accel_fs_t</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">typedef</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">struct</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">mpu6050_gyro_fs_t</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">gyro_fs</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">mpu6050_accel_fs_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">accel_fs</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// fatores de escala (LSB por unidade)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">accel_lsb_per_g</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">gyro_lsb_per_dps</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">mpu6050_cfg_t</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">typedef</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">struct</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">int16_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ax</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ay</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">az</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">int16_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">gx</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">gy</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">gz</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">int16_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">temp_raw</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">mpu6050_raw_t</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">typedef</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">struct</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// aceleração</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ax_g</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ay_g</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">az_g</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF">        </span><span style="color: #616E88">// em g</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ax_ms2</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ay_ms2</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">az_ms2</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF">  </span><span style="color: #616E88">// em m/s²</span></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// rotação</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">gx_dps</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">gy_dps</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">gz_dps</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF">  </span><span style="color: #616E88">// em °/s</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">mpu6050_si_t</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88">// Você implementa essas duas funções na sua plataforma:</span></span>
<span class="line"><span style="color: #D8DEE9">extern</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">bool</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">i2c_write_reg</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">uint8_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">addr7</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">uint8_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">reg</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">uint8_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">value</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9">extern</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">bool</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">i2c_read_regs</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">uint8_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">addr7</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">uint8_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">start_reg</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">uint8_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">buf</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">uint16_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">len</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">static</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">accel_lsb_per_g_from_fs</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">mpu6050_accel_fs_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">fs</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// Do datasheet/register map: sensibilidade depende do AFS_SEL. :contentReference&#91;oaicite:2&#93;{index=2}</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">switch</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">fs</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">case</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MPU6050_ACCEL_FS_2G</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> 16384</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">0</span><span style="color: #D8DEE9">f</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">case</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MPU6050_ACCEL_FS_4G</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> 8192</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">0</span><span style="color: #D8DEE9">f</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">case</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MPU6050_ACCEL_FS_8G</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> 4096</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">0</span><span style="color: #D8DEE9">f</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">case</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MPU6050_ACCEL_FS_16G</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> 2048</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">0</span><span style="color: #D8DEE9">f</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">default</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> 16384</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">0</span><span style="color: #D8DEE9">f</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">static</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">gyro_lsb_per_dps_from_fs</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">mpu6050_gyro_fs_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">fs</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// Do datasheet/register map: sensibilidade depende do FS_SEL. :contentReference&#91;oaicite:3&#93;{index=3}</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">switch</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">fs</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">case</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MPU6050_GYRO_FS_250</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> 131</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">0</span><span style="color: #D8DEE9">f</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">case</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MPU6050_GYRO_FS_500</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> 65</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">5</span><span style="color: #D8DEE9">f</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">case</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MPU6050_GYRO_FS_1000</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> 32</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">8</span><span style="color: #D8DEE9">f</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">case</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MPU6050_GYRO_FS_2000</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> 16</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">4</span><span style="color: #D8DEE9">f</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">default</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> 131</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">0</span><span style="color: #D8DEE9">f</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">bool</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">mpu6050_init</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">mpu6050_cfg_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">cfg</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// 1) Acorda o chip e seleciona clock interno padrão (PWR_MGMT_1).</span></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// Escrever 0 em PWR_MGMT_1 limpa SLEEP e deixa o clock interno ativo. :contentReference&#91;oaicite:4&#93;{index=4}</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #81A1C1">!</span><span style="color: #88C0D0">i2c_write_reg</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">MPU6050_I2C_ADDR</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">REG_PWR_MGMT_1</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0x00</span><span style="color: #D8DEE9FF">)) </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">false;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// 2) Configura escalas de acel/gyro nos campos &#91;4:3&#93;</span></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// ACCEL_CONFIG: AFS_SEL em bits 4:3</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">uint8_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">accel_cfg</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> ((</span><span style="color: #D8DEE9">uint8_t</span><span style="color: #D8DEE9FF">)</span><span style="color: #D8DEE9">cfg</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">accel_fs</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9FF"> 0</span><span style="color: #D8DEE9">x03u</span><span style="color: #D8DEE9FF">) </span><span style="color: #81A1C1">&lt;&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">3</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #81A1C1">!</span><span style="color: #88C0D0">i2c_write_reg</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">MPU6050_I2C_ADDR</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">REG_ACCEL_CONFIG</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">accel_cfg</span><span style="color: #D8DEE9FF">)) </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">false;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// GYRO_CONFIG: FS_SEL em bits 4:3</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">uint8_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">gyro_cfg</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> ((</span><span style="color: #D8DEE9">uint8_t</span><span style="color: #D8DEE9FF">)</span><span style="color: #D8DEE9">cfg</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">gyro_fs</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9FF"> 0</span><span style="color: #D8DEE9">x03u</span><span style="color: #D8DEE9FF">) </span><span style="color: #81A1C1">&lt;&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">3</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #81A1C1">!</span><span style="color: #88C0D0">i2c_write_reg</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">MPU6050_I2C_ADDR</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">REG_GYRO_CONFIG</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">gyro_cfg</span><span style="color: #D8DEE9FF">)) </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">false;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// 3) (Opcional, mas recomendado) filtro digital passa-baixa (DLPF) e taxa de amostragem</span></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// CONFIG: DLPF_CFG em bits &#91;2:0&#93;. Ex.: 3 =&gt; um corte típico para reduzir ruído (ver tabela no register map). :contentReference&#91;oaicite:5&#93;{index=5}</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #81A1C1">!</span><span style="color: #88C0D0">i2c_write_reg</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">MPU6050_I2C_ADDR</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">REG_CONFIG</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0x03</span><span style="color: #D8DEE9FF">)) </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">false;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// SMPLRT_DIV define taxa efetiva: sample_rate = gyro_output_rate / (1 + SMPLRT_DIV).</span></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// gyro_output_rate é 8 kHz quando DLPF_CFG=0, senão 1 kHz (ver register map). :contentReference&#91;oaicite:6&#93;{index=6}</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #81A1C1">!</span><span style="color: #88C0D0">i2c_write_reg</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">MPU6050_I2C_ADDR</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">REG_SMPLRT_DIV</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0x04</span><span style="color: #D8DEE9FF">)) </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">false;</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">// exemplo</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// 4) Interrupções ficam para depois (no DMP a gente usa bastante INT + FIFO).</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #81A1C1">!</span><span style="color: #88C0D0">i2c_write_reg</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">MPU6050_I2C_ADDR</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">REG_INT_ENABLE</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0x00</span><span style="color: #D8DEE9FF">)) </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">false;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">true;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">bool</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">mpu6050_read_raw</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">mpu6050_raw_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">out</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">uint8_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">buf</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #B48EAD">14</span><span style="color: #D8DEE9FF">&#93;</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #81A1C1">!</span><span style="color: #88C0D0">i2c_read_regs</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">MPU6050_I2C_ADDR</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">REG_ACCEL_XOUT_H</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">buf</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">14</span><span style="color: #D8DEE9FF">)) </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">false;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// Cada eixo é big-endian: High, Low</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">out</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">ax</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">int16_t</span><span style="color: #D8DEE9FF">)((</span><span style="color: #D8DEE9">buf</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #81A1C1">&lt;&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">8</span><span style="color: #D8DEE9FF">) </span><span style="color: #81A1C1">|</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">buf</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">&#93;)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">out</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">ay</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">int16_t</span><span style="color: #D8DEE9FF">)((</span><span style="color: #D8DEE9">buf</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #B48EAD">2</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #81A1C1">&lt;&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">8</span><span style="color: #D8DEE9FF">) </span><span style="color: #81A1C1">|</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">buf</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #B48EAD">3</span><span style="color: #D8DEE9FF">&#93;)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">out</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">az</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">int16_t</span><span style="color: #D8DEE9FF">)((</span><span style="color: #D8DEE9">buf</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #B48EAD">4</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #81A1C1">&lt;&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">8</span><span style="color: #D8DEE9FF">) </span><span style="color: #81A1C1">|</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">buf</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #B48EAD">5</span><span style="color: #D8DEE9FF">&#93;)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">out</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">temp_raw</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">int16_t</span><span style="color: #D8DEE9FF">)((</span><span style="color: #D8DEE9">buf</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #B48EAD">6</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #81A1C1">&lt;&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">8</span><span style="color: #D8DEE9FF">) </span><span style="color: #81A1C1">|</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">buf</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #B48EAD">7</span><span style="color: #D8DEE9FF">&#93;)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">out</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">gx</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">int16_t</span><span style="color: #D8DEE9FF">)((</span><span style="color: #D8DEE9">buf</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #B48EAD">8</span><span style="color: #D8DEE9FF">&#93;  </span><span style="color: #81A1C1">&lt;&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">8</span><span style="color: #D8DEE9FF">) </span><span style="color: #81A1C1">|</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">buf</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #B48EAD">9</span><span style="color: #D8DEE9FF">&#93;)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">out</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">gy</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">int16_t</span><span style="color: #D8DEE9FF">)((</span><span style="color: #D8DEE9">buf</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #B48EAD">10</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #81A1C1">&lt;&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">8</span><span style="color: #D8DEE9FF">) </span><span style="color: #81A1C1">|</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">buf</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #B48EAD">11</span><span style="color: #D8DEE9FF">&#93;)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">out</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">gz</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">int16_t</span><span style="color: #D8DEE9FF">)((</span><span style="color: #D8DEE9">buf</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #B48EAD">12</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #81A1C1">&lt;&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">8</span><span style="color: #D8DEE9FF">) </span><span style="color: #81A1C1">|</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">buf</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #B48EAD">13</span><span style="color: #D8DEE9FF">&#93;)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">true;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">mpu6050_convert_to_si</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">mpu6050_cfg_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">cfg</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">mpu6050_raw_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">raw</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">mpu6050_si_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">out</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> lsb_per_g   </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">accel_lsb_per_g_from_fs</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">cfg</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">accel_fs</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> lsb_per_dps </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">gyro_lsb_per_dps_from_fs</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">cfg</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">gyro_fs</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// aceleração em g</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">out</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">ax_g</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF">)</span><span style="color: #D8DEE9">raw</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">ax</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">lsb_per_g</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">out</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">ay_g</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF">)</span><span style="color: #D8DEE9">raw</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">ay</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">lsb_per_g</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">out</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">az_g</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF">)</span><span style="color: #D8DEE9">raw</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">az</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">lsb_per_g</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// g -&gt; m/s² (g padrão ~ 9.80665)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> g0 </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> 9</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">80665</span><span style="color: #D8DEE9">f</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">out</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">ax_ms2</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">out</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">ax_g</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">g0</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">out</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">ay_ms2</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">out</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">ay_g</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">g0</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">out</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">az_ms2</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">out</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">az_g</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">g0</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// giro em °/s</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">out</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">gx_dps</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF">)</span><span style="color: #D8DEE9">raw</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">gx</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">lsb_per_dps</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">out</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">gy_dps</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF">)</span><span style="color: #D8DEE9">raw</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">gy</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">lsb_per_dps</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">out</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">gz_dps</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF">)</span><span style="color: #D8DEE9">raw</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">gz</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">lsb_per_dps</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading">O que esse código está fazendo (de verdade)</h3>



<p class="wp-block-paragraph">A inicialização começa acordando o sensor em <code>PWR_MGMT_1</code>. Se o bit <strong>SLEEP</strong> estiver ativo, o MPU não mede nada; então zerar esse registrador é o jeito mais direto de sair do modo sleep. O mapa de registradores descreve esse registrador e os campos de escala do acelerômetro e giroscópio que usamos em seguida. (<a href="https://invensense.tdk.com/wp-content/uploads/2015/02/MPU-6000-Register-Map1.pdf?utm_source=chatgpt.com">TDK InvenSense</a>)</p>



<p class="wp-block-paragraph">Logo depois, nós configuramos os ranges. Isso é crucial porque a conversão de “número cru” para unidade física depende diretamente disso. Quando você seleciona, por exemplo, <strong>±2 g</strong>, o datasheet/regmap define o fator típico <strong>16384 LSB/g</strong>; se trocar para <strong>±8 g</strong>, vira <strong>4096 LSB/g</strong>. O mesmo vale para o giroscópio: em <strong>±250 °/s</strong> é comum usar <strong>131 LSB/(°/s)</strong>, e em <strong>±2000 °/s</strong> cai para <strong>16.4 LSB/(°/s)</strong>. Essas relações são as que tornam a conversão objetiva e auditável. (<a href="https://invensense.tdk.com/wp-content/uploads/2015/02/MPU-6000-Register-Map1.pdf?utm_source=chatgpt.com">TDK InvenSense</a>)</p>



<p class="wp-block-paragraph">A leitura em <code>ACCEL_XOUT_H</code> pega um “bloco coeso” de 14 bytes, o que reduz risco de você ler um eixo “antes” e outro “depois” de uma atualização interna. Esse detalhe parece pequeno, mas evita inconsistências sutis quando você começa a amostrar rápido. A ordem dos registradores nesse bloco (accel, temp, gyro) também está definida no register map. (<a href="https://invensense.tdk.com/wp-content/uploads/2015/02/MPU-6000-Register-Map1.pdf?utm_source=chatgpt.com">TDK InvenSense</a>)</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" width="860" height="445" src="https://mcu.tec.br/wp-content/uploads/2026/02/image-45.png" alt="" class="wp-image-1363" srcset="https://mcu.tec.br/wp-content/uploads/2026/02/image-45.png 860w, https://mcu.tec.br/wp-content/uploads/2026/02/image-45-300x155.png 300w, https://mcu.tec.br/wp-content/uploads/2026/02/image-45-768x397.png 768w" sizes="(max-width: 860px) 100vw, 860px" /></figure>
</div>


<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Observação importante de bancada (qualidade de módulos no mercado)</h3>



<p class="wp-block-paragraph">Existe muita placa “MPU6050” no mercado com variação de qualidade (inclusive peças suspeitas/fora de especificação), o que aparece na prática como offsets absurdos, ruído fora do padrão ou instabilidade. Se seu baseline “cru” já estiver muito estranho, vale desconfiar do módulo antes de culpar o algoritmo. (<a href="https://forum.arduino.cc/t/my-mpu-6050-is-not-connecting/871276?utm_source=chatgpt.com">Arduino Forum</a>)</p><p>The post <a href="https://mcu.tec.br/sensores/mpu6050-em-projetos-reais-do-dado-cru-ao-angulo-e-preparando-terreno-para-o-dmp/">MPU6050 em projetos reais: do “dado cru” ao ângulo (e preparando terreno para o DMP)</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1359</post-id>	</item>
	</channel>
</rss>
