Coração em um osciloscópio
No modo XY, o osciloscópio deixa de mostrar o sinal ao longo do tempo: um canal controla a posição horizontal do traço e o outro, a vertical. Se gerarmos as duas tensões certas, dá para desenhar qualquer coisa na tela. Aqui vou mostrar como desenhar um coração usando um ESP32.
Material
- Um ESP32 com DAC (como o DevKit V1);
- Um osciloscópio de dois canais com modo XY;
- Duas pontas de prova.
Ligações
- GPIO25 → CH1 (eixo X);
- GPIO26 → CH2 (eixo Y);
- GND do ESP32 → garra de terra das pontas.
Código
Utilizando o Arduino IDE:
#include <Arduino.h>
constexpr uint8_t PIN_X = 25;
constexpr uint8_t PIN_Y = 26;
struct Point { uint8_t x, y; };
constexpr int N = 100;
Point shape[N];
void drawLine(int x0, int y0, int x1, int y1) {
int steps = max(abs(x1 - x0), abs(y1 - y0)) / 2 + 1;
for (int i = 0; i <= steps; i++) {
dacWrite(PIN_X, x0 + (x1 - x0) * i / steps);
dacWrite(PIN_Y, y0 + (y1 - y0) * i / steps);
}
}
void setup() {
for (int i = 0; i < N; i++) {
float t = 2 * PI * i / N;
float s = sinf(t);
float x = 16 * s * s * s;
float y = 13 * cosf(t) - 5 * cosf(2 * t) - 2 * cosf(3 * t) - cosf(4 * t);
shape[i].x = lroundf(128 + 5.5f * x);
shape[i].y = lroundf(128 + 5.5f * (y + 2.5f));
}
}
void loop() {
for (int i = 0; i < N; i++) {
const Point &a = shape[i];
const Point &b = shape[(i + 1) % N];
drawLine(a.x, a.y, b.x, b.y);
}
}O coração vem de uma equação paramétrica conhecida, com t indo de 0 a 2\pi:
\begin{aligned} x(t) &= 16\operatorname{sen}^3(t) \\ y(t) &= 13\cos(t) - 5\cos(2t) - 2\cos(3t) - \cos(4t) \end{aligned}
No setup(), calculo 100 pontos dessa curva e os ajusto para a faixa do DAC, que é de 8 bits (0 a 255, ou 0 a ~3,3 V). No loop(), o drawLine() liga cada ponto ao próximo com valores intermediários, para o traço sair contínuo em vez de pontilhado. Como isso se repete muitas vezes por segundo, a figura parece parada na tela.
Configurando o osciloscópio
- Ative o modo XY;
- Use acoplamento DC nos dois canais;
- Os sinais ficam entre ~0,5 V e ~2,8 V, então 500 mV/div funciona bem;
- Ajuste o offset dos canais (por volta de −1,6 V) para centralizar o desenho.
Resultado


ESP32:

Ajustes
- Para mudar o tamanho, altere o
5.5fnosetup(); - Para um contorno mais suave, aumente o
N. Se a imagem começar a piscar, diminua; - Se o coração aparecer deitado ou de cabeça para baixo, verifique se os canais não estão trocados.