Home-Built STM

This project is my attempt to build a low-cost scanning tunneling microscope (STM) capable of atomic resolution imaging in air. The piezo scanners typically used in STM typically cost at least hundreds of dollars. Some time ago I came across John Alexander’s simple STM project, in which he used a cheap piezo buzzer element with one of the electrodes cut into quadrants to enable XYZ motion. This type of scanner is less rigid than what is usually used for STM, but I decided to give it a try and see how far I could get with it. Turns out I was able to image highly-oriented pyrolytic graphite (HOPG) with my STM with atomic resolution! The image below shows the hexagonal lattice structure of graphite.

Overview of the technique

STM is a tool capable of imaging surfaces with atomic resolution. In STM, a sharp metallic needle is brought within a few angstroms of the surface of a conductive sample and a small bias voltage is applied across the gap. If the gap is small enough (<1 nm), electrons can cross the gap via quantum tunneling. This “tunneling current” is typically in the pA – nA range, and can be measured with a transimpedance amplifier. The STM tip is mounted on a piezoelectric scanner, which is capable of sub-angstrom motion in all directions. The tunnelling current measured by the transimpedance amplifier is fed into a feedback loop which controls the voltage applied to the Z-axis electrode of the piezo scanner and acts to maintain a constant tunneling current, and therefore a constant tip-sample distance. The X and Y axes of the scanner are used to raster scan the tip across the sample. By measuring the Z-axis voltage as a function of scan position, an image of the sample topography is constructed. If the tip moves closer to the sample surface, the tunneling current increases exponentially. This exponential relationship is what makes STM sensitive enough to resolve individual atoms, even under ambient conditions. If the STM tip is atomically sharp (not as hard to achieve as you might think!) then nearly all of the tunneling current will flow through the single atom on the tip which is closest to the sample surface, resulting in images with atomic resolution.

For more about this project, click one of the links below or in the top menu:


164 thoughts on “Home-Built STM

  1. Hi, Dan!
    Don’t want to bother you with more questions, but you know a lot about SPM and are always so helpful that I’m going to ask one more!
    I still haven’t managed to get a great quality scan of graphite, trying on a gold now, and will try implementing motorized approach too.
    I was looking into your code, and the log table is specific to LTC2326-16. As I’m using LTC2326-18, should I make a change there or somewhere else?
    Best regards,


    • Hi Vítor,
      Yes, the log table has 2^15 entries ranging in value from 0 to 2^15-1. Ideally, you’d replace this with a table containing 2^17 entries from 0 – 2^17-1, but the Teensy 3.1/3.2 doesn’t have enough memory to store this. You could keep the same table and just use the upper 16 bits of the ADC reading as input to the table, but you’d be trowing away the extra 2 bits of precision. To keep the full precision, you could instead try using a CORDIC algorithm to compute the log, see here for example: https://www.quinapalus.com/efunc.html


      • Hi Dan,

        I’m wondering if I might future-proof a little and keep the full 18 bit table by using a Teensy 3.6 and its 256 RAM instead (or is that still not enough)?

        As mentioned below however, one change is the intolerance to 5V logic on its digital pins, but could this be a problem in this circuit? I can’t tell if the pins we’re using are affected.

        On the subject, do you know of any other issues that could come from using a Teensy 3.6 instead?

        Many thanks, huge fan,


      • Hi Marc,

        It looks like the Teensy 3.6 won’t has enough RAM for a full 18-bit table, so I’d go with the CORDIC approach. I think I’m going to switch to that method myself.

        I don’t think you’ll have a problem with 5V inputs on the Teensy 3.6. The CS_DAC signal is connected to the 5V supply but it’s through a 10k pullup, so there should be no issue. I don’t think there’ll be any other issues with Teensy 3.6, but it’s possible you may need to make some changes to the firmware (?). I’m going to experiment with the Teensy 4.

        Let me know if you get it running with Teensy 3.6!



  2. Hello, again Dan. I will have a small question about one of the components. The inductors are written as 600 Ohm which I wasn’t able to understand. We couldn’t see it from the photo of the board as well. Was that supposed to be 600 microhenries? Thanks in advance for your attention


    • Hi, those 600 Ohm inductors are ferrite beads. They have a DC resistance of an Ohm or two, and are used for filtering out power rail high frequency noise (e.g. switching noise from a SMPS). The ‘600 Ohm’ refers to the impedance at a given frequency (usually some 10s or 100s of MHz).


  3. Hi, Dan!

    I’ve made some modifications to my STM based on what you and John told me. Now it has a 3 fine screws support like yours to improve approaching, I’ve put the whole system in a steel box for shielding and used a thinner tungsten tip.

    The sample I’m using are graphite flakes. For these scans I first rub adhesive tape on the copper base, drop some flakes on top and stick and pull a strip of tape later to try to get a flat plane.

    Before, you mentioned stable tunneling. When the led is full-on, usually it means a tip crash to me, so I try to keep its light faint (almost blinking), and the current and error (blue and red) graph lines close, one tracking each other. Not completely sure if that’s how it’s meant to be though.

    I’ve tried acquiring some images and they look promising, but still somewhat noisy. From the images, the system or the sample seem to be tilted (all white then all back image parts), is it because of the approach screws?

    I couldn’t see the haxagonal pattern in the 10nm scan yet, but the last 400nm scans resemble yours. Do you thing there’s really something on these images or is it just noise? Also, how may I get sharper images?
    I’m thinking about trying a power supply with just batteries and linear regulators (like John’s), and maybe a better sample.

    The images of the new setup and scans are here: https://drive.google.com/open?id=1UOvtv2n_vvPTvzLmBif7HyL36xigxgFp


    • Nice job! It looks very compact. Sounds like you’re operating it correctly, though I do see some mains EMI pickup in some of your scans. Were those ones taken without the metal box?

      The sample will always have some tilt to it, and the tilt is almost always larger than the sample roughness. The new software I’m working on will let you flatten the image being displayed.

      I’d recommend using HOPG to try and get atomic resolution. For these scans you’ll need to run a faster scan rate (like 5-10 Hz or so) at low resolution, otherwise vibrations will jumble the image. For sharp images with a larger scan size, use at least 512 x 512 pixels and scan at around 1 Hz. Make sure the P/I gains are well-tuned. If you have problems with tip crashes due to vibrations, you can try increasing the bias voltage and/or lowering the setpoint current, which will move the tip further away from the sample. This makes the image less sharp but it’s better than crashing the tip!



      • Thanks for answering again, Dan!

        I think the EMI pickup in some parts is due to me opening the box to manually adjust the height when the tip crashes or gets too far away.
        I am going to get some HOPG, then. Really looking forward to seeing those hexagons.

        Good luck with the new software and best regards,


  4. Hi Dan,

    Thanks for the write up – the project looks really fun. I was looking into measuring some LDOS for some alloys and was wondering if you could give some rough estimates of how difficult it would be to adapt your project for Tunneling Spectroscopy?


    • Hi Zhao,

      I’m actually working on adding spectroscopy capabilities. I’ve implemented a lock-in amplifier in the Teensy but right now the sample rate is limited to ~10 kHz, though I think this is fine. I’m working on new software as well and will post everything here when it’s finished. If you want to implement it yourself I think firmware and software modifications are all you need to do. You need to implement bias modulation and lock-in detection of the tunneling current signal, then sweep the bias while measuring the lock-in output to get the dI/dV spectra.



  5. Dear Dan, this is very interesting project :). I am watching your schematic diagrams and I would like to ask you of one thing. Where is connected PREAMP+ and PREAMP- ? I suppose that PREAMP+ is output signal from preamplifier and what is PREAMP- I dont understand. Is it ground ore some reference voltage?? Thank you 🙂


    • Hi Tomas,
      PREAMP+ is the output from the preamp and PREAMP- is the preamp’s ground. The ADC measures the difference between these to cancel any noise picked up by the wiring (since I use ribbon cable to connect the preamp and controller board).


  6. Hey Dan,

    Looks like you and John Alexander have inspired a bunch of people to build these things – I’ve found your site extremely helpful. If you don’t mind, I have a couple of questions:
    1. Do you have any tips regarding cutting the disk electrode into quadrants? I’ve tried using a scalpel, but I find that in order to separate the electrode quadrants I end up slicing into the piezo material itself, and I end up with ‘creases’ on the metal side.
    2. As you can see from my photos, I have opted for a 3-screw system similar to your new design. In your opinion, am I ok to stick with the original motor wiring, or will I need to replace it with thinner wires to avoid coupling external vibration?


    Any other observations gratefully received – cheers!


    • Hey Andrew,

      Nice build! Cutting the piezo electrode with a knife is a bit tricky. I did it in a few passes with less force to try an minimize damage to the piezo. The best way would probably be ablation with a pulsed laser, or chemical etching.

      I’d suggest sticking with the original wiring to start. If you find that vibrations are limiting performance, you can always try changing it. I’m using the original wiring.



    • Hi Andrew,
      It has been a long while, I’m glad to see your project, it looks very nice. As far as inspiring people I just showed a cheap simple way to do it. The real credit belongs to Binnig, Rohrer, and Young. On the other hand I was very surprised how that old webpage still gets recognized, last year at ISPM 2018 when a professor from Andong University in South Korea came up and wanted to take a picture with me. He was giving a paper on a STM design for students and referenced my old webpage.
      I found an Exacto knife with an old blade with a broken tip worked best for scraping off the top electrode. I just used a straight edge to keep on the same line. No need to apply much force just lightly go over the same line until there is no more electrical connection between the sections.
      I did try applying a resist on one disk, and etching it. It was a mess. The etchant also seemed to absorb into the PZT layer. The electrode peeled back from the edge of the resist line, as though the etchant seeped under the edge electrode. I guess PZT is much more porous that FR4.


      • I saw your website many years ago when I was in high school (~2006) and it is a huge part of what led me to study Material Sciences. I was really sad to see that you stopped updating the website.


      • Hi Martin,
        I am flattered that I might have inspired your interest in materials science. I think Dan has made one of the best DIY STM websites. I hope he inspires others.


      • Hi John, belated thanks. The broken exacto knife (plus patience and care!) seems to do the job.
        I had a hand-written letter from Gerd Binnig when I wrote to him in 1986(?) after having heard of the STM in high school, courtesy of my physics teacher. I hope I still have it around here somewhere…


  7. Amazing build!

    I am trying to get one working as well, though I am still quite far from getting images. Just to get some experience, I am trying to reinvent the wheel and re-design everything myself.
    I am hoping to use the OPA129(UB) as preamp, but might switch to the LTC6268 later if I attempt phase sensitive detection.
    Originally I was planning to do the signal mixing in software and output the Z+X, Z-X, … directly, but now I am wondering if it would make sense to have a separate 18 or even 20bit DAC just for the Z signal. Maybe it would be possible to get away without sigma-delta in that case. I was looking at the AD5781 (or maybe even AD5791), which is just about in budget for one coordinate.
    Does that sound like a decent idea or is there something I have overlooked?



    • Hi Edgar,
      Thanks! I did the mixing in hardware to save the cost of an extra DAC for the bias. I’m not sure how necessary the delta-sigma modulation is for Z. Without it, the resolution is about 10 pm (for 700 nm Z range) which I’d think would work fine at least for HOPG. The AD5781/AD5791 will of course perform better though, and I think having a dedicated Z-DAC like that is a good idea since the performance requirements in Z are more stringent than X and Y.


  8. Hi Dan!

    I’m building a STM project based on yours, and it’s almost finished. The major component changes I made were using LTC2326-18 instead of LTC2326-16 (which wasn’t available), replacing OPAX227 with TL07X and using a Teensy 3.6 (which runs on 3.3V) for MCU.
    The only thing different in the Arduino code are the pins.

    When I turn on the PC software the board is detected and by turning the micrometer screw the tunnel led goes on. I could only get grey noise in the images, though. First, there was a spaghetti-like noise, which disappeared when I used a battery powered laptop. But then there’s still just noise in the image.

    Some pictures and data of the project and PSU used are here:

    I guess maybe the approach is too coarse, but I don’t know for sure. Do you have any ideas on this?


    • Hi Vítor,

      Nice job! I’ve also been using TL07X op-amps without issues. Your “spaghetti-like” noise is 60 Hz mains pickup. It’s best to shield the STM and preamp with a metal cover to eliminate this and any other noise pickup by the preamp.

      Some of your screenshots show thick bright bands in the tunnel current images, meaning the tip is probably crashed there. They also all show a 10 nm scan size, have you tried increasing it to 1000 nm or so? Starting with a large scan will be much easier, and will make it easier to figure out what’s going wrong. Maybe your sample is pretty flat over 10 nm, and the noise your seeing is from vibrations. A larger scan will show some structure in the sample surface.

      Regarding the approach, it looks like you’re able to get it into stable tunneling with the feedback loop running, so I wouldn’t worry too much about that yet. You’re almost certainly crashing the tip during the approach though. Does the sample rotate when you turn that micrometer screw? It looks like a differential, so I’m guessing you’re using the fine adjustment for the final approach?


      • Thanks for the quick reply! I will try increasing the scan size and see if it helps. The sample does rotate. By the way, the sample is put in there by attaching a piece of tape to the graphite sample, dettaching the tape, then attaching and dettaching it to the copper plate. The handle is from a micrometer (the measuring instrument), so there’s just one kind of adjustment available (the smallest division is 0.01mm).


      • Hi Vitor,
        Just a quick note: For low frequency shielding you are better off with a magnetic shield, as the skin depth for non magnetic shield like copper or aluminum at 50 or 60 Hz is ridiculous something around a cm. I used a big steel electronics enclosure for my STM in graduate school setting the whole microscope inside and closing the lid after approaching the sample.
        You might also have some other grounding issue going on, with the big change when running on a battery powered laptop. Over all nice work Vitor,
        John Alexander

        Liked by 1 person

  9. Till around 1987 all STMs had analog feedback loops for Z servo. My old website “Simple STM Project” uses an analog servo for Z just using potentiometers to adjust the servo gain/time constant. I was not seriously trying for atomic lattice resolution; I was trying to demonstrate how a simple, inexpensive and safe (no high voltage) STM could be made. The circuit is similar to what I used back in 1986 on my first STM (a tube scanner with high voltage amplifier) where it had no problem getting nice graphite lattice resolution. Dan Berar’s mechanical design looks much more rigid than my simple STM design. That should help in immunity to mechanical vibration especially at the small scale. Even commercial AFMs and STMs imaging very flat samples without an acoustic enclosure will show noise when people talk in the same room as the microscope.


  10. Hello!

    I am currently working on a similar project myself, but with an analog feedback loop. I saw that your early prototype used an analog feedback loop. Did you get any usable images with that design? Do you know of other DIY SPM projects which also use this aproach?

    best regards


    • Hi Harald,
      Absolutely, changing the feedback loop to digital had no noticeable effect on the image quality I was getting. The first atomic resolution images I took with HOPG were with the analog feedback loop using just an integrator and a potentiometer to adjust the gain. In fact, it can have particularly low noise because it’s so simple and you don’t have to worry about extra noise and glitch impulses from a DAC, though the main limiting factor seems to be vibration/sound as John Alexander mentioned above (or possibly DAC glitches, I’m still not really sure but I can’t seem to get below ~20 pm or so Z-resolution). Take a look at his simple STM page, he also used an analog feedback loop.


      • Hello!

        late reply here 🙂
        Thank you very much for your response, It gave me a boost of confidence in my project!. A few weeks later, I’m now at the point where I can pull images from the STM! So far they have not been able to capture very much detail, but they do seem to show some surface features!
        There is a lot of room for improvement in my mechanics, so I’ll be working on that next. Doing my approach is pretty much impossible without crashing the tip, and I often get it to resonate so that the tip repeatedly hammers against the sample.

        Your blog has been a great resource and is the reason I started this project, Thank you!


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s