I present a "BEST OF CLASS", "Full-Featured" DIY-USB OSCILLOSCOPE which is "Truly DIY".

My aim is to provide a cheap Digital-Storage-Oscilloscope for Students, Budding Engineers and the Hobbyist.

This USB-Oscilloscope could be part of the laboratory equipment in educational establishments.

Build this DIY-Oscilloscope for just $15


Today 21 Nov 2014, my Instructable crossed 100000 Views!

At this Milestone I am happy to share all the source files (C, .Net & Python) at:


I wish to acknowledge the inputs from the following designs which have led to this optimized solution:

DPScope SE - the simplest real oscilloscope/logic analyzer on the planet, by womai, http://www.instructables.com/id/DPScope-SE-the-si...

DPScope - Build Your Own USB/PC-Based Oscilloscope,by womai

LCS-1M - A Full-Featured, Low-Cost Hobby Oscilloscope,by womai


Universal Analog Hardware Testbench, by me

Analog Experiments Anywhere,by me

Two-Channel PC Based Oscilloscope USB, by Gaurav Chaudhary

Responding to comments and suggestions from many members :

I am sharing the micro-controller fuse .Hex file for the dsPIC30F2020.

The Host PC software has been written in both 'Visual Basic.Net' and open source 'Python' providing a cross-platform GUI based solution for both Windows and Linux platforms.

Step 1: Specifications

No of Channels Two
Analog bandwidth (Large Signal), 0.30/0.30/0.70 MHz ,For Gain 1/2/5
Analog bandwidth (Small Signal), 12/6/7 MHz ,For Gain 1/2/5
Input impedance 1 Meg Ohm
Input connection  3 mm Audio Jack
Vertical Scale 
+12.5V to -12.5V , Gain 1
+6.25V to - 6.25V, Gain 2
+2.50V to -2.50V,  Gain 5
 -12.5V to +7.50V ,  Gain 1
 -6.25V to +13.75V, Gain 2
-2.50V to +17.50V,  Gain 5
Sampling Rate  
1 Mbps to 20  Mbps ,1 uses/sample to 0.05usec/sample ,ETS  Mode (repetitive signals)
10bps to 500 kbps, 100ms/sample to 2uses/sample , Normal Mode
Ch1 / Ch2 / Auto

Trigger Polarity
Rising / Falling edge

Trigger Range
+12.5V to -12.5V, Gain 1
+6.25V to - 6.25V, Gain 2
+2.50V to -2.50V,  Gain 5
Display Modes
Ch1 + Ch2  vs. time 200 Samples each
Ch1 vs. time 200 Samples
Ch2 vs. time 200 Samples
XY Ch1 + Ch2 vs. time 200 Samples each
DFT Ch1 400 Samples
DFT Ch2  400 Samples
Capture Modes 
Single / Repeat / Store
Save Modes
Data to CSV Fig to multiple formats
PC Software
VB.Net 2.0  / Python 2.6/2.7 Virtual Com Port 115200 bps
Power Supply
USB +5V , 150 mA
<p>sir i have a doubt, why use a PGA when you can simply multiply the values acquired via the sampling process by any number in the gui itself? is it not like a zoom in and zoom out effect?</p>
Hi maxwell_30! Depending on the resolution of the ADC one can consider multiplication &amp; offset addition in the GUI. If we work with 18-24 bit ADCs this could be feasible. However, at 8 bit where we have 256 levels multiplication X2 would reduce this to 128 levels &amp; X4 to just 64 levels. The quatization noise would be unacceptable. 8 bit is probably the minimum we should have for the ADC. The PGA implements the gain change in the analog domain so that the ADC always operates at 8 bit.
<p>oh yes!! i get it now :) Sir i just want to confirm one more thing, if the i/p at the channel of PGA is 5 V and the gain selected is 2, then the output will be 5 V only and not 10 V as the opamp is working on a dc voltage of 5V so that is the maximum output it can provide, right? I just want to ensure that i wont damage my microcontroller..</p>
<p>You are correct, with 5V as the supply voltage for the PGA the output can be a maximum of 5V which is within the ADC range of the microcontroller.</p>
<p>and sir how exactly is Vref compensating for ADC scale-factor change with variation in VDD? I am unable to understand that :/</p>
<p>VDD the USB 5V is used as the ADC Vref. The software assumes a ADC Vref of 5V and should ideally measure the 3.3V ref as 3.3V. Usually the USB 5V is less than 5V and the ADC would read the 3.3V as a higher value. This difference can be used to compensate the scale factor.</p>
<p>okay..so basically you are finding out the voltage actually being supplied to the circuit by doing reverse conversion of the digital value you get when you convert 3.3 V (i.e. we know on passing an analog voltage x through an ADC we get the digital value y=x*(Vref/1024) and x is 3.3 v here and y we get from the conversion and from these 2 we find out vref ) and then using that value for all the other conversions of ch1 and 2 while finiding analog values to be sketched in the gui again, right?</p><p>And if i understood the above thing correctly, I have another doubt...why convert the vref on both the channels 2 &amp; 3 when simply converting it on any one can do the job?</p>
<p>I found a minor hardware bug where the first ADC conversion is sometimes incorrect. To overcome this and also to reduce any noise the 2 reference channels are read twice and averaged.</p>
<p>Sir, i am finally done writing the code for a matlab based gui, and now i am trying to test the entire circuit on a<strong> breadboard</strong>. But i am facing a serious issue, because of which i am unable to proceed. As soon as i try to power the breadboard circuit via the 5 V of the FT232 breakout board, the voltage drops to 3.6 V (which i am guessing is because of the loading effect). As a result, the microcontroller dosen't power up and i receive no response on the GUI. </p><p>Can u please suggest me something to deal with this? Did u not face any such issue while testing the circuit on a breadboard or is it that i should test the circuit directly on a pcb or am i going wrong somewhere in my procedure to test a circuit with so many wires on a breadboad?</p>
<p>Check the cable from the USB port to the FT232 breakout it should be as short as possible or of higher wire gauge. Next there may be a resistor which is dropping the voltage within the module. Keep all the 5V and return wires short and thick</p>
Okay. Thank u :)
<p>Hi all, I recently completed this nifty Scope project and am very satisfied with the outcome.</p><p>With the blessing of Mr Ajoy Raman, I would like to share two &quot;mods&quot; or changes I made, with the hope that others may benefit.</p><p>1. For the FTDI 232 USB , I used a commercial FTDI break-out board. These are nifty little units and very inexpensive on the net..&pound;3.00 or so. (E-bay, Sparkfun etc)</p><p>I have included a stock photo, showing the connections. For our application we only need four pins, +5v, 0V (Gnd), RX and TX. </p><p>It is now very easy to incorporate this little board as a &quot;component&quot; on your PCB layout. (JPG is attached of my PCB layout, from which you can see the general idea.) This then solves the difficulty of soldering directly on a SM chip.</p><p>(Please note here that the photos of my actual board do NOT match the PCB layout 100%...I made changes to the layout afterwards -- once I saw where I could improve the layout. Never happy are we?)</p><p>2. The second &quot;change&quot; I made was to use MCP6S21, instead of MCP6S22 as used by Ajoy....The xxx6S21 is a single channel version, and the xxx6S22 a dual channel version.</p><p>The reason for this is simply because of difficulty I had in sourcing the dual channel in<em> DIP package</em>. The single channel in DIP package I found readily available. No other reason.</p><p><em>BUT please take note:</em> When using MCP6S21 (single channel), that Pin 3 on this chip is a V ref input, and for our application needs to be tied to GND. On my PCB layout you will observe pin 3 and 4 joined together to GND respectively.</p><p>(On the MCP6S22, Pin 3, is isolated and not connected to anything).</p><p>Don't forget the heatsink..On my PCB layout I have allowed for two mounting holes on the ends of the PIC, offset a little bit toward the MCP's. This allows the heatsink to &quot;pull down&quot; on the MCP's <em>a little</em>, so that the heatsink don't rock on the PIC....</p><p>I tested the working of my unit on a simple 555 astable, adjustable over a wide range by trimpot. Brilliant results..</p><p>Finally I built the whole unit into a plastic case, job done.</p><p>Hope this is of some insight to others..</p><p>Jan</p><p> </p><p> </p><p> </p>
<p>Thank You JanRose for this extremely simple implementation of the USB Scope!</p>
<p>Hi Ajoy,</p><p>I just started your project. First I designed a stripboard version for pcb. </p>
<p>Hello Nardu, The stripboard scheme is something new for me. Is there a design software for this? Could help with further prototyping. I have updated the card firmware and windows software: https://sites.google.com/site/ramanajoy/home/my-zip-rar-files/Scope2.rar?attredirects=0&amp;d=1 Regards, Ajoy</p>
<p>Hello Ajoy,<br>1. For stripboard design, personal I prefer Lochmaster :<br>http://www.abacom-online.de/uk/html/lochmaster.html<br>2. Any time, no problem. There are some limitation with SMD components,<br>but we try.</p>
<p>Dear Raman, </p><p>As per your requirement you can download the Stripboard design software from the following address.</p><p><a href="http://veecad.com/downloads.html" rel="nofollow">http://veecad.com/downloads.html</a></p><p>Regards, Vikas</p>
Hello Ajoy, I have nearly all of the parts I need for this project except the electrolytic capacitors which I will buy tomorrow. My question is about programming the dsPIC chip. I see you mention you use a PICKit but even the clones available are expensive in comparison to the project itself (at least they are in the UK). I notice from the dsPIC datasheet, it has an ICSP (In Circuit Serial Programming) option but I can't find details of how to use it. It simply needs power to the chip then uses the MCLR pin to clear the flash memory (I think) then the PGC (program clock) and PGD (program data) pins. I assume I would provide a steady square wave clock to PGC and toggle PGD between 1 &amp; 0 to send the program in serial form. Do you know anything further to clarify this? Is it possible to program the dsPIC with your software in this way? Many thanks. Brian
Hi Brian,<br><br>The dsPic needs a dedicated programmer. The external programmers use the ICSP interface. Check around for any technical schools hobbyists in your area for assistance in programming the chip.<br><br>I have updated the card firmware and windows software:<br>https://sites.google.com/site/ramanajoy/home/my-zip-rar-files/Scope2.rar?attredirects=0&amp;d=1<br>Regards, Ajoy
<p>Hi Ajoy,<br><br>I was hoping I could develop a programmer using an ESP8266 module I have. I can easily programme the ESP's GPIO pins to switch for PGD, PGC and MCLR although it works at 3.3V so I'd need a few extra components to switch for 5V. The ESP module came with a daughterboard with a CH340G USB/UART chip so I can talk to it from my Linux PC using ESPlorer in order to program it. I also intended using the daughterboard in place of the FT232R section of your circuit. I just need to work out timing and serial data format for PDC / PGC of the PIC. I think I've found some useful web pages which may help - I think I can make it work. Thanks for the link to the updated firmware and software.<br><br>Regards, Brian</p>
<p>If this works it would benefit several others who would then be able to manage without a dedicated programmer. Wish you all success in your efforts!</p>
<p>Hi Ajoy, I have found a document called &quot;dsPIC30F SMPS Flash Programming Specification&quot; (link http://ww1.microchip.com/downloads/en/DeviceDoc/70284C.pdf ). It seems to explain ICSP programming in detail as well as explaining the HEX file format and how to read the file to then write it to the dsPIC flash memory. A lot to read but it looks encouraging for my ESP8266 based programmer idea. Regards, Brian</p>
<p>Dear Ajoy, </p><p>Came across your fascinating project and am in the process of having a go.</p><p>When it comes to the FT232 USB to UART circuit, I would like to bring to your and the readers attention that you can buy on e-bay a small circuit board , &quot;FTDI 232&quot;, </p><p>used for programming the Arduino Nano. I have one of these boards, and can verify that it conforms 100% to your circuit.</p><p><a href="http://www.ebay.co.uk/itm/131730908119?_trksid=p2055119.m1438.l2649&ssPageName=STRK%3AMEBIDX%3AIT" rel="nofollow">http://www.ebay.co.uk/itm/131730908119?_trksid=p2055119.m1438.l2649&amp;ssPageName=STRK%3AMEBIDX%3AIT</a></p><p>Now what makes this board very useful is that it is mounted on a pcb with easy to wire pins. It then also comes with a USB Mini socket, ready mounted.</p><p>I hope this is of help to others.</p><p>Jan</p>
Dear JanRose,<br><br>Thanks for your suggestion!<br>A hobbyist sent me this picture of the USB Scope built as you have suggested. By using a USB-TTL (5V Levels) small circuit board and fabricating the main board using non smd components using the PCB design from HeartygFx. Also the PCB was fabricated as a single side version with a few jumpers. This method would be the easiest for fabrication and soldering ease.
<p>sir how are u getting the analog B.W. to be 0.3 MHz? According to me, as the maximum tx rate supported by uart is 115200 bps and adc used it a 10 bit adc, so each sample requires 10 bits. Thus, the actual tx rate will be 115200/10=11.5 ksps. Now by nyquist criteria the max freq that we can sample with this sampling rate will be around 11.5/2=5.75 Khz only :/ </p>
<p>There are two bit/sampling rates we need to look at. 200 samples of CH1 &amp; Ch2 analog data are sampled at rates up to 1 mega-sample-per-sec using the normal modes. These 200+200 data samples are then then transferred to the PC using the USB-Serial converter at 115200 bps. </p>
<p>oh okay! thanks for the quick reply sir :)</p>
<p>I made another version with the TMSF28027 which is also a good chip to use. It has the advantage of not needing a dedicated programmer and can be programmed using a freeware using the serial port. Also we can go to 2Mbps simultaneous sampling.</p><p>Check out: <a href="http://e2e.ti.com/group/launchyourdesign/m/c2000microcontrollerprojects/665559">http://e2e.ti.com/group/launchyourdesign/m/c2000mi...</a></p><p>and <a href="http://ajoyraman.in/My_USB_Student_Scope.html">http://ajoyraman.in/My_USB_Student_Scope.html</a></p>
<p>Hello, good job!</p><p>Can you recommend another micro controller that I can use instead of dsPIC30F2020?</p>
In &quot;Step 9: Circuit Diagrams 3: Processor Circuit&quot; there is a 16MHz crystal between pins 9 &amp; 10 along with some 22pf capacitors. Is the frequency of the crystal important as I don't have one of that frequency. Can I vary it perhaps with different capacitor values?
The oscilloscope timebase has been calculated with the 16 Mhz crystal (higher values are not permitted) and if you use a lower value they will get changed. Suggest you use what you have without changing the 22pf capacitors till you get the correct crystal. 12 Mhz should work temporarily.
<p>Thank you for your quick reply. I've managed to find a source of 16MHz crystals at reasonable price - I have a few already but none suitable so I think I'll stick to your original specification.</p>
<p>Sir why havent you used MATLAB to make the GUI ?</p>
I used VS2013 and Python which are available free and building the scope GUI was easy. Why don't you try using Matlab? I can help!
<p>oh great!! I'll go ahead with matlab then. thanks a lot :)</p>
<p>Hi, I've added your project to the <em style="">&quot;</em><em style="">Make Your Own Oscilloscope!</em><em style="">&quot;</em> Collection</p><p>This is the link If you are interested:</p><p><a href="http://www.instructables.com/id/Make-Your-Own-Oscilloscope/">http://www.instructables.com/id/Make-Your-Own-Osci...</a></p>
<p>Thanks, that's good!</p>
<p>This looks really chill! Could I use it with a TV?</p>
Not likely! You need a windows computer with a spare usb port. Single computer dongles are now available which convert a TV to a computer but I have no experience of these. If someone can work out a scheme it would be wonderful.
<p>Excellent, well-written article; a great engineering project. However, for most hobbyist I might suggest Gabotronics, who markets pre-made USB oscilloscopes, some for under $100 USD.</p>
Great! :D
<p>Impressive work! Big thumbs up!</p>
<p>Hi,</p><p>I understand that your performed FFT on the Aj_Scope2 app itself. Do you mind to share the fft code? Thank you</p>
<p>The code is based on:</p><table><tbody><tr><td>'THE DISCRETE FOURIER TRANSFORM</td></tr><tr><td> 'copyright &copy; 1997-1999 by California Technical Publishing</td></tr><tr><td> 'published with permission from Steven W Smith, <a href="http://www.dspguide.com"> www.dspguide.com</a></td></tr></tbody></table><p>Search for the code I used within the vb file:</p><p><a href="https://github.com/ajoyraman/USB_Matchbox_Scope/blob/master/VB.Net2-Code/Aj_Scope/Aj_Scope2.vb">https://github.com/ajoyraman/USB_Matchbox_Scope/bl...</a></p>
<p>Hi, </p><p>I am working on adding ICSP to the circuit. I am also working on a reconfigured circuit board for a case that I have on hand. Do you have any concerns if I place my modified schematics and KiCad files on github? </p><p>I am working on</p>
<p>Go ahead! the ICSP will definately be useful for programming the chip. I am sure many DIY enthusiasts will benefit. Please provide the github link and mark as 'I made it!'.</p>
<p>It is a simple addition. Just a pin header, and a diode to protect the Vcc from the programming voltage. As soon as I have a working prototype I will post a link. Thanks again!</p>
<p>FYI for Linux users. I was able to get the windows software to run on Wine very easily. This might be a better option than installing all of the mentioned packages here.</p>
<p>Thanks, I will try this. </p>
<p>I haven't built this yet, but I plan on building one or maybe something like it that is AVR based. It would be nice to use for my audio projects at home. I am a field service technician and it would be great to analyze a customers control signal with a laptop as well when needed. </p>

About This Instructable




Bio: I am a retired Electronic Systems Engineer now pursuing my hobbies full time. I share what I do especially with the world wide student community.
More by ajoyraman:10 Resistor Arduino Waveform GeneratorPencil Box Triple Output Power SupplyLong Range Ultrasonic Distance Sensor
Add instructable to: