<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="generator" content="pandoc"> <title></title> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, minimal-ui"> <link rel="stylesheet" href="reveal.js/css/reveal.css"> <style type="text/css">code{white-space: pre;}</style> <link rel="stylesheet" href="reveal.js/css/theme/black.css" id="theme"> <!-- Printing and PDF exports --> <script> var link = document.createElement( 'link' ); link.rel = 'stylesheet'; link.type = 'text/css'; link.href = window.location.search.match( /print-pdf/gi ) ? 'reveal.js/css/print/pdf.css' : 'reveal.js/css/print/paper.css'; document.getElementsByTagName( 'head' )[0].appendChild( link ); </script> <!--[if lt IE 9]> <script src="reveal.js/lib/js/html5shiv.js"></script> <![endif]--> </head> <body> <div class="reveal"> <div class="slides"> <section><section id="supercon-2023-the-vectorscope-badge" class="titleslide slide level1"><h1>Supercon 2023: The Vectorscope Badge</h1></section></section> <section><section id="overview" class="titleslide slide level1"><h1>Overview</h1></section><section id="the-badge" class="slide level2"> <h2>The Badge</h2> <ul> <li class="fragment"><p>What is It?</p></li> <li class="fragment"><p>How Does it Work?</p></li> <li class="fragment"><p>Can I Hack It?</p></li> </ul> </section><section id="inspiration-analog" class="slide level2"> <h2>Inspiration: Analog</h2> <figure> <img src="images/tek_515A.jpg" height="500" /> </figure> </section><section id="one-badge-two-parts" class="slide level2"> <h2>One Badge, Two Parts</h2> <ul> <li class="fragment"><p>Vectorscope: 30 kHz “scope”</p></li> <li class="fragment"><p>Signal Generator: Driven by code</p></li> <li class="fragment"><p>X/Y outputs, X/Y inputs (0 V - 3 V)</p></li> </ul> </section><section id="vectorscope" class="slide level2"> <h2>Vectorscope</h2> <ul> <li class="fragment"><p>Fake phosphor display</p></li> <li class="fragment"><p>“No User-Serviceable Parts Inside”</p></li> <li class="fragment"><p>AK4619 Codec chip (<code>codec.py</code>)</p></li> <li class="fragment"><p>ADC in, 16 frames of 1024 samples (16-bit X/Y)</p></li> <li class="fragment"><p>Insane DMA/PIO Machine (<code>pixel_pusher.py</code>)</p></li> <li class="fragment"><p>Twelve lines of user-space code (<code>vectorscope.phosphor()</code>)</p></li> </ul> </section><section id="signal-generator" class="slide level2"> <h2>Signal Generator</h2> <ul> <li class="fragment"><p>DAC out</p></li> <li class="fragment"><p>Limitations: 30 kHz, ringy filter, one CPU core</p></li> <li class="fragment"><p>X/Y buffers, 256 points @ 16 bits, interleaved and pushed out</p></li> <li class="fragment"><p>This is your playground (<code>waveform.py</code>)</p></li> </ul> </section><section id="signal-generator-api" class="slide level2"> <h2>Signal Generator “API”</h2> <ul> <li class="fragment"><p><code>v.wave.point(x,y)</code></p></li> <li class="fragment"><p><code>v.wave.packX(list)</code>, <code>v.wave.packY(list)</code></p></li> <li class="fragment"><p><code>v.wave.outBuffer_ready</code>:</p></li> <li class="fragment"><p>write False, wait till True</p></li> </ul> </section><section id="operating-system" class="slide level2"> <h2>Operating System</h2> <ul> <li class="fragment"><p>Vectoros!</p></li> <li class="fragment"><p>Runs menu system</p></li> <li class="fragment"><p>Buttons and LEDs</p></li> <li class="fragment"><p>Uses <code>asyncio</code>: define functions <code>async</code> and be sure to yield</p></li> <li class="fragment"><p>Lets you map your code to <code>A/B/C/D.py</code></p></li> </ul> </section><section id="micropython" class="slide level2"> <h2>Micropython</h2> <ul> <li class="fragment"><p>Why Micropython?</p></li> <li class="fragment"><p>Interactive REPL to control vectorscope is awesome</p></li> <li class="fragment"><p>Two cores: one just for you</p></li> <li class="fragment"><p>Filesystem</p></li> <li class="fragment"><p>Secret trick: Hold down the [User] Button on boot</p></li> </ul> </section><section id="creature-comforts" class="slide level2"> <h2>Creature Comforts</h2> <ul> <li class="fragment"><p>Thonny IDE: configure to use badge, done</p></li> <li class="fragment"><p>mpremote: for the CLI aficionado</p></li> <li class="fragment"><p><code>mp run file.py</code>, <code>mp cp *.py :</code>, <code>mp mount .</code></p></li> <li class="fragment"><p><code>picotool save -a your_image.uf2</code></p></li> <li class="fragment"><p>VS Code stubs</p></li> </ul> </section><section id="many-ways-to-play" class="slide level2"> <h2>Many Ways to Play</h2> <ul> <li class="fragment"><p>Use <code>vectorscope.wave</code>, funny graphics and/or sounds</p></li> <li class="fragment"><p>Go analog!</p></li> <li class="fragment"><p>Tweak vectorscope</p></li> <li class="fragment"><p>Don’t use vectorscope: GC9A01_mpy library compiled in</p></li> <li class="fragment"><p>Blow Micropython away and start from scratch (but: codec, screen, keys)</p></li> </ul> </section></section> <section><section id="under-the-hood" class="titleslide slide level1"><h1>Under the Hood</h1></section><section id="credits" class="slide level2"> <h2>Credits</h2> <ul> <li class="fragment"><p>Hackaday Team: Elliot and Al and Tom</p></li> <li class="fragment"><p>Voja Antonic</p></li> <li class="fragment"><p>Design Lab: Giovanni, Majenta, Bruce, Keno, and Team</p></li> </ul> </section><section id="tales-of-woe" class="slide level2"> <h2>Tales of Woe</h2> <figure> <img src="images/image2.png" height="500" /> </figure> </section><section id="powers-of-ten" class="slide level2"> <h2>Powers of Ten</h2> <figure> <img src="images/badger01.png" height="500" /> </figure> </section><section id="ms" class="slide level2"> <h2>10 ms</h2> <figure> <img src="images/badger06.png" height="500" /> </figure> </section><section id="ms-1" class="slide level2"> <h2>1 ms</h2> <figure> <img src="images/badger07.png" height="500" /> </figure> </section><section id="us" class="slide level2"> <h2>100 us</h2> <figure> <img src="images/badger08.png" height="500" /> </figure> </section><section id="us-1" class="slide level2"> <h2>10 us</h2> <figure> <img src="images/badger09.png" height="500" /> </figure> </section><section id="us-2" class="slide level2"> <h2>1 us</h2> <figure> <img src="images/badger10.png" height="500" /> </figure> </section><section id="ns" class="slide level2"> <h2>100 ns</h2> <figure> <img src="images/badger11.png" height="500" /> </figure> </section><section id="ns-1" class="slide level2"> <h2>10 ns</h2> <figure> <img src="images/badger12.png" height="500" /> </figure> </section><section id="ns-2" class="slide level2"> <h2>1 ns</h2> <figure> <img src="images/badger13.png" height="500" /> </figure> </section><section id="the-dmapio-machine" class="slide level2"> <h2>The DMA/PIO Machine</h2> <ul> <li class="fragment"><p>DMA reads from one location to another</p></li> <li class="fragment"><p>DMA and memory is Turing complete</p></li> <li class="fragment"><p>DMA counter</p></li> </ul> </section><section id="pixel-pusher" class="slide level2"> <h2>Pixel Pusher</h2> <figure> <img src="images/overview.png" height="500" /> </figure> </section></section> <section><section id="badgers" class="titleslide slide level1"><h1>Badgers!</h1></section></section> </div> </div> <script src="reveal.js/lib/js/head.min.js"></script> <script src="reveal.js/js/reveal.js"></script> <script> // Full list of configuration options available at: // https://github.com/hakimel/reveal.js#configuration Reveal.initialize({ // Optional reveal.js plugins dependencies: [ { src: 'reveal.js/lib/js/classList.js', condition: function() { return !document.body.classList; } }, { src: 'reveal.js/plugin/zoom-js/zoom.js', async: true }, { src: 'reveal.js/plugin/notes/notes.js', async: true } ] }); </script> </body> </html>