diff options
author | jaseg <git@jaseg.de> | 2023-12-30 16:38:02 +0100 |
---|---|---|
committer | jaseg <git@jaseg.de> | 2023-12-30 16:38:02 +0100 |
commit | 458a5fdfc598517b9fbddd02d3e1ae7cc70ceb9d (patch) | |
tree | 0ba3319ddb214bc65dd402de13939cb9ca283574 /blog/8seg | |
parent | 9ee28abd5041ebbbc8acd39ddc84ca37e7255076 (diff) | |
parent | 58d54c5debedca8c91b28026f520b226ac8682f6 (diff) | |
download | blog-deploy.tar.gz blog-deploy.tar.bz2 blog-deploy.zip |
deploy.py auto-commitdeploy
Diffstat (limited to 'blog/8seg')
-rw-r--r-- | blog/8seg/8seg-digit-circuit.png | bin | 0 -> 94441 bytes | |||
-rw-r--r-- | blog/8seg/index.html | 228 |
2 files changed, 228 insertions, 0 deletions
diff --git a/blog/8seg/8seg-digit-circuit.png b/blog/8seg/8seg-digit-circuit.png Binary files differnew file mode 100644 index 0000000..001c896 --- /dev/null +++ b/blog/8seg/8seg-digit-circuit.png diff --git a/blog/8seg/index.html b/blog/8seg/index.html new file mode 100644 index 0000000..05f30bc --- /dev/null +++ b/blog/8seg/index.html @@ -0,0 +1,228 @@ +<!DOCTYPE html> +<html><head> + <meta charset="utf-8"> + <title>8seg | Home</title> + <meta name="description" content=""> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <meta name="mobile-web-app-capable" content="yes"> + <meta name="color-scheme" content="dark light"> + <link rel="stylesheet" href="/style.css"> +</head> +<body><nav> + <div class="internal"> + + <a href="/" title="Home">Home</a> + <a href="/blog/" title="Blog">Blog</a> + <a href="/projects/" title="Projects">Projects</a> + <a href="/about/" title="About">About</a> + </div> + <div class="search"> + <div id="search"></div> + </div> + <div class="external"> + <a href="https://git.jaseg.de/" title="cgit">cgit</a> + <a href="https://github.com/jaseg" title="Github">Github</a> + <a href="https://gitlab.com/neinseg" title="Gitlab">Gitlab</a> + <a href="https://chaos.social/@jaseg" title="Mastodon">Mastodon</a> + </span> +</nav> + + <header> + <h1>8seg</h1> +<ul class="breadcrumbs"> + <li><a href="/">jaseg.de</a></li> + <li><a href="/blog/">Blog</a></li><li><a href="/blog/8seg/">8seg</a></li> +</ul> + <strong>2023-12-26</strong> + </header> + <main data-pagefind-body> + <div class="document" id="seg-technical-overview"> +<h1 class="title">8seg Technical Overview</h1> + +<div class="section" id="prologue"> +<h2>Prologue</h2> +<p>German hacker culture has this intense love for things that light up in colorful ways. Like for many others in this +community, I have always been fascinated by LEDs. One of the first things on my pile of unfinished projects was to build +my own LED matrix and use it to display text. When I started that project, I was still new to electronics. Back then, +commercial LED matrices were limited to red or green color only, and were very expensive, so there was an incentive to +build your own. At the same time, while individual LEDs were'nt expensive anymore, they hadn't started to be cheap yet, +either. On top of the material cost, back then there were no PCB fabs, and especially no PCB assembly houses that a +hobbyist could afford. Ultimately, I ended up never finishing this project because I felt it was more of a feat of +material wealth than of technical prowess.</p> +<p>Over time, LEDs came down in price, and peoople started using them in all sorts of fun things. Around the mid-2010s, +cheap-ish, ready-made tapes and chains of RGB LEDs that included WS2811 or similar digitally controllable driver chips +led to a cambrian explosion in projects involving large amounds of colorful LEDs since suddenly, all you needed was an +arduino and a beefy power supply to individually control an almost unlimited number of these LEDs.</p> +<p>Today, LED technology has advanced even furhter, to a point where now you can buy staggering quantities of the second +generation of these controllable LEDs that provides better color rendering embedded in all sorts of shapes, from tapes +through rings to grids. When I built the first <a class="reference external" href="https://github.com/jaseg/matelight">matelight</a> in 2013, the matelight's 640 individually-controllable LEDs +were <em>a lot</em>. Today, you can buy a roll with several thousand channels for about the price of a nice pizza.</p> +</div> +<div class="section" id="the-idea-behind-8seg"> +<h2>The idea behind 8seg</h2> +<p>Living through this amazing escalation of LED technology, in 2018, I looked at a then-obsolete piece of single-color, +dumb, non-controllable LED tape with a simple question in mind: Taking this unsophisticated artifact of yesterday's +technology, what would be the coolest thing I could build from it? Can I buld something that not only rivals, but +outmatches the modern controllable LED stuff? From that question, I set myself two goals. First, I wanted to keep the +project's use of financial and labor resources reasonable. A lot of art consists of taking a simple idea, and simply +extrapolating its implementation to a ridiculous scale at the expense of the artist's time and wallet. That wasn't the +point I wanted to make. I wanted to make something cool from an obsolete technology, not prove how much patience I had +soldering. My second goal was to create something that is meaningfully controllable. Controllability is much harder with +these dumb LED tapes, but it is possible nontheless, and I wanted to test out how far you could go with it.</p> +<p>After thinking through a number of possibilities, I settled on the basics of the 8seg design I ended up realizing. The +installation would be a banner-style display consisting of a series of characters made from non-controllable LED tape. +The banner can be rigged up in any convenient air space, bending and folding to conform to the space's shape and size. +The key idea behind 8seg is that it makes up for it's lack of control fidelity with sheer size. If nothing else, this +non-controllable LED tape is <em>cheap</em>.</p> +</div> +<div class="section" id="the-design-of-a-single-8seg-character"> +<h2>The design of a single 8seg character</h2> +<p>Each 8seg character consists of 8 <em>segments</em> of LED tape that are inter-connected through small circuit boards, four in +the corners, and one in the center. As it turns out, 8 segments arranged in this shape are enough to display all of the +English language's alphabet as well as numbers in a weird, but readable form.</p> +<p>The electrical design of an 8seg character has one weird trick at its core. To avoid having to run a bunch of wires from +some kind of driver circuit board to each of the eight segments, I thought, why not use the LED tape itself instead for +power and data transmission? Wires are heavy, expensive, and annoying to solder, so if I could find a way to +interconnect the LED tape so that it can all be driven from a driver circuit located at one of the character's +junctions while simultaneously powering that driver circuit, an 8seg character wouldn't need any wires at all anymore.</p> +<p>8seg achieves this feat using a circuit as shown in the diagram below. Interconnections between the LED tape segments +are done with a small circuit board in each of the four corners. The design is rotationally symmetric, and all four of +these boards are identicaly. The top right and bottom left corners simply use the back side of the same circuit board +used in the top left and bottom right corners.</p> +<img alt="8seg-digit-circuit.png" src="8seg-digit-circuit.png" /> +<p>The driver circuit sits at the center of the character and directly connects to the four diagonal segments. The key +thought behind 8seg's driving scheme is that there are two common phases wound through the display in a zig-zag pattern +as shown in red and blue in the schema below. These phases alternate their polarity at a high frequency. Each segment +has its negative pole connected to one of these two phases, and can be turned on by the driver while that phase is low +and the other phase is high. While a phase is high, the LEDs on all segments connected to that phase are reverse-biased, +and thus these segments remain dark.</p> +<p>The positive poles of all segments are connected to the driver circuit in the center through a spiral pattern. Each arm +of the spiral is made up of two segments, one diagonal on the inside, and one horizontal or vertical on the outside. +The two segments on each spiral arm are on different phases, one on each of the two phases. Thus, during a single cycle +of the two phases alternating polarity, first one of the two segments has its polarity the right way around, then the +other. The driver can turn on the active segment by connecting the spiral control line to the positive LED supply +voltage.</p> +<p>Both phases cross at the center where the driver circuit is located, so the driver can power itself from the two phases +using a simple full bridge rectifier.</p> +</div> +<div class="section" id="saving-copper-with-point-of-load-regulation"> +<h2>Saving copper with point of load regulation</h2> +<p>In the beginning, I experimented with the design above, putting 12V AC on the two phases, and letting the driver switch +its derived LED supply using some cheap MOSFETs. This simple design totally works, but it has an important shortcoming.</p> +<p>8seg is designed to be physically <em>very</em> large. This means that not only does it have a large number of LEDs that +together need a lot of current, it also has to transmit all of that current across significant physical distances. The +consequence of this was that in the initial design, I was looking at either needing hundreds of Euros worth of copper +cables, or burning hundreds of Watts of electricity into heat if I were to use thinner cables. In this case, cables act +like resistors. In a resistor, power dissipation rises with the square of the current inside the cable. This is bad for +8seg since it means halving the amount of copper in those wires increases power dissipation in these wires fourfold.</p> +<p>Despite that downside, this square law does come with an upside, too. If we assume we have wires of a particular fixed +diameter, if we can halve the current through those wires, we can quarter the wires' power dissipation. If we want to +deliver the same amount of power to the LEDs as before, to halve wire current, we have to double the voltage, and add +some circuitry on the drivers to convert that increased voltage back down to close to our LED tape's nominal 12V.</p> +<p>Alas, simply doubling the voltage leads to one question: How is it that we can pass double the voltage through our LED +tape to the center control circuit? Isn't the LED tape made for 12V operation only, not 24V? The answer to this +apparent problem is that the center is connected to the AC bus voltage only through the negative side of the LED tapes, +and controls their positive sides to turn them on or off. The AC bus voltage never appears directly across any single of +the eight segments. At the same time, a simple buck converter stepping down our new 24V bus voltage to 12V, and feeding +the segment control transistors with that instead of feeding them straight from the rectified AC bus allows us to feed +the segments with 12V. The only difference between this circuit and the straight 12V variant is that now, during OFF +times, the LED tapes see a negative 24 v across them. To make sure that's not a problem, I tested a number of them with +different LED colors and from different manufacturers, and all of them held up past the 50 V I could easily generate +with my lab power supply.</p> +</div> +<div class="section" id="synchronous-rectification"> +<h2>Synchronous rectification</h2> +<p>I implemented the point-of-load regulation in a new revision of the center circuit, and built a prototype digit. When I +tested this prototype, to my dismay, I noticed some really strange behavior. In my tests, the LED tape did not properly +light up, and when I checked the voltages with my oscilloscope, I noticed that the center circuit's ground was floating +several volts <em>below</em> the AC bus voltage's negative phase. How come?</p> +<p>After some head-scratching, I found that this problem was due to a simple instance of Kirchhoff's current law. Consider +the point where the AC bus voltage's currently negative phase enters the center circuit board. Let's say that we +dissipate 24 Watts in the segments' LEDs. In this case, at 24 Volts, 1 Ampère will flow into the center circuit's +terminal connected to the currently positive phase, and out from the center circuit's terminal connected to the +currently negative phase.</p> +<p>Now consider the current through the LED tape. During one half-cycle of the AC bus, the center circuit can only address +the four segments that have their negative rail connected to the currently negative phase of the AC bus. If one of these +four segments is currently on and dissipating our 24 Watts, that segment will be fed 2 Ampère of current from the center +circuit through its positive rail. My mistake was that I did not consider what happened to the return current here. +The corresponding 2 Ampère return current of course flows back through the segment's negative rail into the center +circuit, and herein lies the issue: That negative rail is where our center circuit's supply current comes from! This +means that according to Kirchhoff's current law, the 1 A flowing out from the center circuit at its input are adding up +with the 2 A flowing into it. The result of this is that in the currently positive phase's connection, we get 1 A +flowing into the center circuit, while in the negative phase connection, we get (-1) + (+2) resulting in another 1 A +flowing into it! The only terminal where current flows <em>out</em> of the center circuit is the positive terminal connected to +the active segment, out of which 2 A of current are flowing.</p> +<p>The big problem with this confusing scenario is that this means the bridge recitifier in our center circuit cannot work, +since its negative-side diodes are reverse biased while any of the segments are on. We can't just add more diodes here, +since that would just short both AC bus rails together. Instead, the solution is to add one rather chonky MOSFET in +parallel with each of the two negative-side diodes of the bridge rectifier that are controlled by the center circuit to +act as a sort of synchronous rectifier. When we turn on one of the segments, we have to turn on the MOSFET on the +currently negative rail to allow the segment's return current to bypass the bridge rectifier's negative-side diode. Fun +fact: If we turn on the wrong MOSFET out of the pair, we short the AC bus, resulting in a very quick end of life for that +poor MOSFET.</p> +</div> +<div class="section" id="power-line-data-communication"> +<h2>Power line data communication</h2> +<p>As we saw above, the driver providing power to a string of digits has to continuously alternate the polarity of its +output voltage to provide one part of the digit circuits' multiplexing. Since we want to provide the control information +to the center circuits through those same two wires, we can choose between a number of viable power line communication +schemes. These schemes usually require a beefy transmitter adding a modulation at a frequency much larger than the +underlying bus frequency, and a filter circuit at each receiver to filter that signal from the much stronger fundamental +AC waveform. In our application, I saw two issues with these classical approaches. First, they require fairly complex +circuitry, especially the beefy transmitter at the driver. Second, they are susceptible to attenuation with either +changing load or over long distances, which could potentially be a problem with the high currents and long(ish) wiring +runs 8seg needs.</p> +<p>Because of these disadvantages, I decided on another approach entirely. Instead of modulating our control signal on top +of the AC power waveform, we modulate our control data <em>into</em> the AC power waveform. To not interfere with the display +and cause outages or flicker, and to avoid having to blank the display during transmissions, we choose a modulating +technique that leaves the proportions of negative and positive half-waves undisturbed. The practical realization of this +is that instead of alternating positive and negative half-waves, we send a positive half wave for each "one" bit, and a +negative half wave for each "zero" bit, effectively creating a phase shift keyed signal with two states with an +180-degree phase shift, with the transmitted bit rate synchronized to twice the underlying carrier frequency.</p> +<p>The remaining question is how one can encode arbitrary binary data into a continuous stream of ones and zeros that is +precisely 50 % ones and 50 % zeros across any time span longer than a few dozen bits. There exists a near-optimal +solution to this question from ethernet over copper twisted pairs. In ethernet, the encoded and modulated signal passes +through an isolation transformer to protect the ethernet transceiver from interference or dangerous voltages coming in +through the ethernet port. For this isolation transformer to work, the modulated ethernet signal must be exactly +balanced to avoid saturating the transformer's core with a DC offset. Ethernet solves this issue by using an encoding +known as <a class="reference external" href="https://en.wikipedia.org/wiki/8b/10b_encoding">8b/10b encoding</a>. 8b/10b encoding is named like that because it specifies a way to produce a 10 bit codeword +from any 8 bit input data word while guaranteeing that the resulting codewords are always precisely balanced when +looking at two or more consecutively.</p> +</div> +<div class="section" id="framing"> +<h2>Framing</h2> +<p>Since 8b/10b encoding maps a space of 256 data words to 1024 code words, there necessarily are a number of unused code +words. While for some of them, leaving them unallocated is beneficial because it improves error tolerance by decreasing +the probability of one code word turning into another undetectably when a single one of its bits is flipped, even +accounting for that it leaves some room for other uses. In 8b/10b, these leftover code words are used for synchronizing +the receiver to the transmitter, and for framing transmissions. Synchronization is necessary for the receiver to know +where a code word stards, and 8b/10b has a handful of special "comma" code words that can be uniquely identified in a +continuous stream of received ones and zeros, because no other combination of 8b/10b code words could produce the same +sequence of ones and zeros of the comma code word anywhere.</p> +<p>The leftover code words that are not commas are useful, too. They can be used, for instance, as filler code words +betwene actual data transmissions, or to act as framing markers denoting things like the end of a protocol message.</p> +<p>The 8seg driver produces its modulation waveform by translating all data to be transmitted into 8b/10b codes, padding +the result with framing markers and filler codes, and copy-pasting together the corresponding AC waveform from a small +set of pre-programmed waveform transitions.</p> +</div> +</div> + </main><footer> + Copyright © 2023 Jan Sebastian Götte + / <a href="/about/">About</a> + / <a href="/imprint/">Imprint</a> +</footer> +<script src="/pagefind/pagefind-ui.js"></script> + <script> + if(navigator.getEnvironmentIntegrity!==undefined)document.querySelector('body').innerHTML=`<h1>Your browser + contains Google DRM</h1>"Web Environment Integrity" is a Google euphemism for a DRM that is designed to + prevent ad-blocking, and which Google has forced into their browsers against widespread public opposition. + In support of an open web, this website does not function with this DRM. Please install a browser such + as <a href="https://www.mozilla.org/en-US/firefox/new/">Firefox</a> that respects your freedom and supports + ad blockers.`; + + window.addEventListener('DOMContentLoaded', (event) => { + new PagefindUI({element: "#search", showSubResults: true}); + }); + </script> + </body> +</html> |