mirror of
https://github.com/Hack-a-Day/Vectorscope.git
synced 2024-12-22 22:09:30 +00:00
206 lines
8.0 KiB
HTML
206 lines
8.0 KiB
HTML
<!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>
|