← Piezo Motor / Articles
§3Article · 3 of 13

Independent Research · 3D-Printed Piezo Stick-Slip Motor

Learning an Oscilloscope From Zero With an Arduino and a Rigol DHO804

Published · Last updated

This project depends on two kinds of invisible things: motion measured in micrometers, and signals that exist for microseconds. §M8 covers the instrument I built to see the first kind. This chapter is about the instrument I bought to see the second, and about learning to actually use it.

The instrument is a Rigol DHO804: 12-bit, 70 MHz, four channels, $449 [project CLAUDE.md §2]. It was the most expensive single instrument purchase of the project, made back in April before I could really justify it, on the theory that a project about waveforms driving motion would go nowhere if I couldn't see either one. That theory turned out to be correct.

01

The knobs win first

I found the first sessions awkward. The signal existed, the probe was on it, and the screen still showed nothing useful, because I hadn't yet internalized the horizontal and vertical scaling and panning knobs. A scope shows a tiny window into a signal, and until steering that window becomes a reflex, the screen mostly shows the wrong part of the waveform.

Steering means three things: how many volts tall one screen division is, how many seconds wide it is, and where the trigger sits in both. The trigger is the scope's instruction for when to start drawing, such as when the signal crosses a chosen voltage on the way up. Setting it well makes a repeating waveform stand still instead of sliding across the screen.

Auto setup will get something onto the screen, and for a while I leaned on it completely. Then I started needing views Auto would never choose, like a slow ramp with a fast edge on the same trace, or a capture long enough to hold the data I actually wanted to export. Learning to set up the view deliberately, so that the capture contains all the data a specific measurement needs, was the real skill.

02

Generate signals instead of reading the manual

The Rigol manual is 400-plus pages (DHO800_UserGuide_EN.pdf, mostly unread). Instead of reading it front to back, I worked with Claude to build a short custom curriculum (DHO804_curriculum.docx) around one idea, which was to use the Arduino Mega as a signal generator, create signals I fully understand because I wrote the code that makes them, and then make the scope show each one properly. The exercise numbers skip Ex44 (it was planned and then dropped).

  • Ex41, PWM sawtooth (Ex41_PWM_Sawtooth/). The Mega generates a miniature version of the project's sawtooth waveform, and making that repeating ramp sit still on screen was my first real practice with triggering, timebase, and vertical scale.
  • Ex42, RC filter (Ex42_RC_Filter/, with its wiring diagram). The same PWM goes through a resistor and capacitor, and the hard-edged digital signal rounds off into exponential curves. It gave me my first analog intuition and was the first time the scope showed me something I hadn't predicted.
  • Ex43, Lissajous figures (Ex43_Lissajous/). Two signals on two channels in XY mode draw their phase relationships as shapes. It was the fun one and the exercise that made two-channel thinking feel normal, which matters later when CH1 and CH2 are on the two leads of a piezo stack (§M2).
  • Ex45, USB-SCPI control (Ex45_USB_SCPI/, holding 01_discover_scope.py, 02_grab_waveform.py, plus a capture from May 3). Python finds the instrument over USB, pulls the waveform, and saves CSV and PNG. This exercise, more than any other, built the project, and the interferometer capture pipeline in §M8 is a direct descendant of these two scripts.
03

The hard part was the chain, not the box

The most confusing part was the chain between the instruments, with the Arduino generating the signal, the probe and ground clip landing on the right pins, the scope displaying it, and USB carrying it from scope to laptop so Python could pull the data off. At first I had no clear model of what flowed where. It made sense once I realized the chain is three hops in one direction (source → scope → script), and the same pattern is now how every measurement in this project works, from calibration sawtooths to interferometer fringes.

04

Results

By mid-June the scope had become a working tool. The Oscilloscope Reading/ folder holds three screenshots of real project signals from a June 17 session, captured with deliberate setups instead of the Auto button. The same instrument went on to do the project's two most consequential jobs: catching that the drive board's "30 V" output was actually 15 (§M7), and digitizing every interferometer fringe the project has recorded (§M8).

05

Advice for beginners

I struggled with the instrument's own language: trigger modes, per-channel controls, and a measurement bar full of symbols (Vpp, Vavg) that meant nothing to me yet. Getting used to that environment took longer than any single exercise did [builder, 2026-08-06].

Four things would have shortened it, in order of how much time they'd have saved. The knobs are the interface, so spend the first hour just steering the window around a boring signal. Auto setup is for orientation, never for measurement. Decide what data the capture must contain before touching the scope, then build the view for it. And SCPI scripting looks like an advanced feature, but it is not. It is available in week one, it takes two short Python scripts, and it turns the scope from a display into a data acquisition device.