summaryrefslogtreecommitdiff
path: root/blog
diff options
context:
space:
mode:
Diffstat (limited to 'blog')
-rw-r--r--blog/8seg/index.html12
-rw-r--r--blog/hsm-basics/index.html12
-rw-r--r--blog/ihsm-worlds-first-diy-hsm/index.html12
-rw-r--r--blog/index.html10
-rw-r--r--blog/kicad-mesh-plugin/index.html44
-rw-r--r--blog/led-characterization/index.html38
-rw-r--r--blog/multichannel-led-driver/index.html40
-rw-r--r--blog/private-contact-discovery/index.html12
-rw-r--r--blog/serial-protocols/index.html12
-rw-r--r--blog/telekom-gpon-sfp/index.html22
-rw-r--r--blog/thors-hammer/index.html18
-rw-r--r--blog/wifi-led-driver/index.html18
12 files changed, 173 insertions, 77 deletions
diff --git a/blog/8seg/index.html b/blog/8seg/index.html
index 05f6fd0..05f30bc 100644
--- a/blog/8seg/index.html
+++ b/blog/8seg/index.html
@@ -16,6 +16,9 @@
<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>
@@ -32,7 +35,7 @@
</ul>
<strong>2023-12-26</strong>
</header>
- <main>
+ <main data-pagefind-body>
<div class="document" id="seg-technical-overview">
<h1 class="title">8seg Technical Overview</h1>
@@ -208,13 +211,18 @@ set of pre-programmed waveform transitions.</p>
/ <a href="/about/">About</a>
/ <a href="/imprint/">Imprint</a>
</footer>
-<script>
+<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>
diff --git a/blog/hsm-basics/index.html b/blog/hsm-basics/index.html
index 0c9a062..738fa5d 100644
--- a/blog/hsm-basics/index.html
+++ b/blog/hsm-basics/index.html
@@ -16,6 +16,9 @@
<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>
@@ -32,7 +35,7 @@
</ul>
<strong>2019-05-17</strong>
</header>
- <main>
+ <main data-pagefind-body>
<div class="document">
@@ -228,13 +231,18 @@ while not providing better sensitivity.</p>
/ <a href="/about/">About</a>
/ <a href="/imprint/">Imprint</a>
</footer>
-<script>
+<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>
diff --git a/blog/ihsm-worlds-first-diy-hsm/index.html b/blog/ihsm-worlds-first-diy-hsm/index.html
index 67a3732..b155b5e 100644
--- a/blog/ihsm-worlds-first-diy-hsm/index.html
+++ b/blog/ihsm-worlds-first-diy-hsm/index.html
@@ -16,6 +16,9 @@
<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>
@@ -32,7 +35,7 @@
</ul>
<strong>2021-11-23</strong>
</header>
- <main>
+ <main data-pagefind-body>
<div class="document" id="world-s-first-diy-hsm">
<h1 class="title">World's First DIY HSM</h1>
@@ -69,13 +72,18 @@ focusing our effort on the next iteration of the design instead. Stay tuned for
/ <a href="/about/">About</a>
/ <a href="/imprint/">Imprint</a>
</footer>
-<script>
+<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>
diff --git a/blog/index.html b/blog/index.html
index d8947b2..d20527a 100644
--- a/blog/index.html
+++ b/blog/index.html
@@ -16,6 +16,9 @@
<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>
@@ -135,13 +138,18 @@ Your browser does not support the HTML5 video tag. A demonstration of the comple
/ <a href="/about/">About</a>
/ <a href="/imprint/">Imprint</a>
</footer>
-<script>
+<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>
diff --git a/blog/kicad-mesh-plugin/index.html b/blog/kicad-mesh-plugin/index.html
index 4c0315d..def76ef 100644
--- a/blog/kicad-mesh-plugin/index.html
+++ b/blog/kicad-mesh-plugin/index.html
@@ -16,6 +16,9 @@
<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>
@@ -32,12 +35,12 @@
</ul>
<strong>2020-08-18</strong>
</header>
- <main>
+ <main data-pagefind-body>
<div class="document">
-<figure>
-<img src="images/anim.webp" style="max-width: 20em">
+<figure data-pagefind-ignore>
+ <img src="images/anim.webp" style="max-width: 20em">
</figure><div class="section" id="tamper-detection-meshes">
<h2>Tamper Detection Meshes</h2>
<p>Cryptography is at the foundation of our modern, networked world. From email to card payment infrastructure in brick and
@@ -61,7 +64,7 @@ One of the core cryptographic components in financial applications are smartcard
most countries nowadays. These smartcards contain a small, specialized cryptographic microcontroller that is designed to
be hard to tamper with. Though one of the design goals of the system is to reduce the amount of sensitive information
stored on the card, things such as copying of a card can only be hindered by making the chip hard to read out.</p>
-<figure>
+<figure data-pagefind-ignore>
<img src="images/modern_art.svg" style="max-width: 20em">
</figure><p>With smartcards being the means of choice on one side of the counter in electronic payments, on the other side of the
counter a different technology prevails. Attacks on payment terminals are bound to have much more dire consequences than
@@ -105,14 +108,14 @@ into grid cells that are fully inside the set boundaries. All cells outside or g
this step.</p>
<p>I decided to implement this auto-router in a KiCAD plugin. Though KiCADs plugin API is not the best, it was just about
usable for this task.</p>
-<figure>
+<figure data-pagefind-ignore>
<img src="images/kicad-mesh-outline.png" alt="KiCAD showing an irregular board shape with rounded corners and
indents. In the middle of the board there is a footprint for a 4-pin surface-mount pin header.">
<figcaption>The process starts out with the mesh shape being defined inside KiCAD. The mesh's outline is drawn
onto one of the graphical "Eco" layers. A footprint is placed to serve as a placeholder for the mesh's
connections to the outside world. This footprint is later used as the starting point for the mesh generation
algorithm.</figcaption>
-</figure><figure>
+</figure><figure data-pagefind-ignore>
<img src="images/grid-vis-plain.svg" alt="A vizualization of the grid fitting process. Over the mesh's irregular
outline a grid is drawn. In this picture, all grid cells that are fully inside the grid are shown. Grid cells
that overlap the mesh border are highlighted. Grid cells outside of the mesh border are not drawn.">
@@ -128,7 +131,7 @@ algorithm it yields more or less organized-looking results. Below are five examp
levels of randomness with the cells colored according to their distance from the tree root. 0% randomness means that the
algorithm is going to try cells in forward direction first on every step, and only then try out left and right. 100%
means that on every step, the algorithm is choosing a new direction at random.</p>
-<div class="subfigure">
+<div class="subfigure" data-pagefind-ignore>
<figure>
<img src="images/cells-0.svg" alt="a completely organized looking grid with spiral patterns all over.">
<figcaption>0%</figcaption>
@@ -155,34 +158,34 @@ it. The core observation here is that there is only 16 possible ways a cell can
each of which it can either be connected to or not, which results in 2^4 options. If you consider rotations and
mirroring, this works out to rotations or mirrored versions of only six base tiles: The empty tile, a tile with all four
sides connected, a straight through, a 90 degree bend, and a &quot;T&quot;-junction—see the illustration below.</p>
-<figure>
+<figure data-pagefind-ignore>
<img src="images/maze_tiles_plain.svg" style="max-width: 20em">
<figcaption>
There are six possible tile types in our connectivity graph inside its square tiling. This graphic illustrates
all sixteen rotations of these with how they would look in a two-conductor mesh.
</figcaption>
</figure><p>After tiling the grid according to the key above, we get the result below.</p>
-<figure>
+<figure data-pagefind-ignore>
<img src="images/tiles-25-small.svg">
<figcaption>
An auto-routed mesh with traces colored according to tile types.
</figcaption>
-</figure><figure>
+</figure><figure data-pagefind-ignore>
<img src="images/traces-25-small.svg">
<figcaption>
The same mesh, but with traces all black.
</figcaption>
</figure><p>Putting it all together got me the KiCAD plugin you can see in the screenshot below.</p>
-<figure>
+<figure data-pagefind-ignore>
<img src="images/kicad-mesh-settings2.png">
<figcaption>
The plugin settings window open.
</figcaption>
-</figure><figure>
-<img src="images/kicad-mesh-result-large.png">
-<figcaption>
- After runing the plugin, the generated mesh looks like this in pcbnew.
-</figcaption>
+</figure><figure data-pagefind-ignore>
+ <img src="images/kicad-mesh-result-large.png">
+ <figcaption>
+ After runing the plugin, the generated mesh looks like this in pcbnew.
+ </figcaption>
</figure><p>I am fairly happy with the result, but getting there was a medium pain. Especially KiCAD's plugin API is still very
unfinieshed. It is hard to use, most parts are completely undocumented and if you use anything but its most basic parts
things tend to break. One particular pain point for me was that after generating the mesh, the traces have been added to
@@ -194,7 +197,7 @@ making a copy of the board file first and treating mesh generation as a non-reve
.. raw:: html
- <figure>
+ <figure data-pagefind-ignore>
<img src="images/grid-vis-plain.svg" alt="">
<figcaption></figcaption>
</figure> -->
@@ -205,13 +208,18 @@ making a copy of the board file first and treating mesh generation as a non-reve
/ <a href="/about/">About</a>
/ <a href="/imprint/">Imprint</a>
</footer>
-<script>
+<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>
diff --git a/blog/led-characterization/index.html b/blog/led-characterization/index.html
index 294b090..4c0f8fc 100644
--- a/blog/led-characterization/index.html
+++ b/blog/led-characterization/index.html
@@ -16,6 +16,9 @@
<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>
@@ -32,7 +35,7 @@
</ul>
<strong>2018-05-02</strong>
</header>
- <main>
+ <main data-pagefind-body>
<div class="document">
@@ -47,7 +50,7 @@ perception and LED peculiarities.</p>
interesting, with up to two RGB or RGBW (red-green-blue-white) LED tapes. For ambient lighting high color resolution was
really important so you could dim it down a lot without flickering. I ended up using the same driver stage I used in the
<a class="reference external" href="http://jaseg.de/blog/multichannel-led-driver/">multichannel LED driver</a> project for its great color resolution and low hardware requirements.</p>
-<figure>
+<figure data-pagefind-ignore>
<img src="images/rgb_cube.svg" alt="An illustration of the RGB color cube.">
<figcaption>An illustration of the RGB color cube.
<a href="https://commons.wikimedia.org/wiki/File:RGB_color_cube.svg">Picture</a> by
@@ -68,7 +71,7 @@ color. <a class="reference external" href="https://en.wikipedia.org/wiki/HSL_and
<em>perceptual</em> color spaces such as <a class="reference external" href="https://en.wikipedia.org/wiki/CIE_1931_color_space">XYZ (CIE 1931)</a> and <a class="reference external" href="https://en.wikipedia.org/wiki/Lab_color_space">CIE Lab/LCh</a> were born, further improving this alignment. In
this mathematical model, mapping a color from one color space into another color space is just a coordinate
transformation.</p>
-<figure>
+<figure data-pagefind-ignore>
<img src="images/hsv_cylinder.png" alt="An illustration of the HSV color space as a cylinder.">
<figcaption>An illustration of the HSV color space as a cylinder.
<a href="https://commons.wikimedia.org/wiki/File:HSV_color_solid_cylinder.png">Picture</a> by
@@ -83,7 +86,7 @@ XYZ. The fat white curve is a projection of the <em>monochromatic spectral locus
XYZ for pure visible wavelengths.</p>
<p>As you can see, sRGB is <em>much</em> smaller than XYZ or even the part within the monochromatic locus that we can perceive. In
particular in the blues and greens we loose <em>a lot</em> of colors to sRGB.</p>
-<figure>
+<figure data-pagefind-ignore>
<video controls loop>
<source src="video/sRGB.mkv" type="video/h264">
<source src="video/sRGB.webm" type="video/webm">
@@ -108,7 +111,7 @@ In practice, the blue channel of my RGB tape to me <em>looks</em> much brighter
may be of a slightly different hue compared to the reference red used in <a class="reference external" href="https://en.wikipedia.org/wiki/SRGB">sRGB</a> which would also skew the RGB color
space.</li>
</ul>
-<div class="subfigure">
+<div class="subfigure" data-pagefind-ignore>
<figure>
<img src="images/driver_ringing_strong.jpg" alt="Strong ringing on the LED voltage waveform edge at about
100% overshoot during about 70% of the cycle time.">
@@ -160,7 +163,7 @@ specific to the semiconductor used and is quite precise. White LEDs are in fact
and re-emits a broader spectrum of more yellow-ish wavelengths instead. The final LED spectrum is a superposition of
both spectra, with some of the original blue light leaking through the phosphor mixing with the broadband yellow
spectrum of the phosphor.</p>
-<div class="subfigure">
+<div class="subfigure" data-pagefind-ignore>
<figure>
<img src="images/spectrograph_step1_parts.jpg">
<figcaption>The ingredients. The cup of coffee and Madoka Magica DVD set are essential to the eventual
@@ -188,7 +191,7 @@ spectrum of the phosphor.</p>
flaw: I wanted to acquire quantitative measurements of brightness across the spectrum. Since I don't have a precise
technical datasheet specifying the spectral response of any of my cameras I can't compare the absolute brightness of
different colors on their pictures. Some other sensor was needed.</p>
-<figure>
+<figure data-pagefind-ignore>
<img src="images/daylight_spectrum_dvd.jpg">
<figcaption>The daylight spectrum as seen using a DVD as a grating.
<a href="https://commons.wikimedia.org/wiki/File:SpectresSolaires-DVD.jpg">Picture</a> by
@@ -219,7 +222,7 @@ rejection and a regular non-inverting amplifier using another op-amp from the sa
transimpedance amplifier output. I put all the passives setting amplifier response (the gain-setting resistors and the
filter resistor and capacitors) on a small removable adapter so I could easily change them if necessary. I put a small
trimpot on the virtual ground both amplifers use as a reference so I could trim that if necessary.</p>
-<figure>
+<figure data-pagefind-ignore>
<img src="images/preamp_schematic.jpg" alt="A drawing of the photodiode preamplifier's schematic">
<figcaption>The photodiode preamplifier schematic. Schematic drawn with an unlicensed copy of
DaveCAD.</figcaption>
@@ -232,7 +235,7 @@ SMD-to-DIP adapter.</p>
<p>Flying-wire construction is just fine for this low-frequency circuit. In a high-speed photodiode preamp, the
transimpedance amplifier circuit would be highly sensitive to stray capacitance, but we're not aiming at high speed
here.</p>
-<div class="subfigure">
+<div class="subfigure" data-pagefind-ignore>
<figure>
<img src="images/preamp_front.jpg">
<figcaption>The front side of the preamplifier board.</figcaption>
@@ -258,7 +261,7 @@ this wire does not put too much strain on it.</p>
the linear stage in front of the spectrometer viewing window. A line on the screen paper points to the photodiode die in
parallel to the linear stage allowing precise alignment.</p>
<p>The whole unit with photodiode preamplifier, linear stage, photodiode and stepper motor driver finally looks like this:</p>
-<figure>
+<figure data-pagefind-ignore>
<img src="images/electronics_whole.jpg" alt="The complete electronics setup of the spectrograph. In the back
there is the DVD drive stepper stage. In front of it, mounted on a piece of wood are a small USB-to-12V
switching-regulator module to power the stepper motor in the top left, below on the bottom left is the
@@ -295,7 +298,7 @@ notebook is capable of live-updating a graph with the in-progress spectrum's dat
check for when I made some mistake easy to spot in the resulting data.</p>
<p>After one color channel is captured, the LED tape has to be manually set to the next color and the next measurement can
begin.</p>
-<figure>
+<figure data-pagefind-ignore>
<img src="images/raw_plot_cheap_rgb.svg" alt="A plot with three wide peaks, two large peaks on both sides and
one smaller one in the middle. The middle one overlaps the two on the sides. The large ones are about 2.5V in
amplitude. Overall, the plot is about 300 stepper steps wide with each peak being around 130 steps wide.">
@@ -324,7 +327,7 @@ estimate of the three colors' peaks' locations and widths.</p>
<p>The photodiode's response is strongly wavelength-dependent. In particular in the blue band, the photodiode's sensitivity
gets very poor down to about 20% at the edge to ultraviolet. This effect is strong enough to move the apparent location
of the blue peak towards red.</p>
-<figure>
+<figure data-pagefind-ignore>
<img src="images/photodiode_sensitivity.svg" alt="A plot of photodiode sensitivity against wavelength relative
to peak sensitivity at 820nm. The sensitivity rises from 20% at 380nm approximately linearly to 80% at 620nm,
then the rise rolls off.">
@@ -338,7 +341,7 @@ using this coarse measurement. Then all three channel peaks are measured in the
estimate is produced by a least-squares fit of a linear function. This fine estimate is then used for a second
sensitivity correction of all original measurements and the scale is changed from stepper motor step count to
wavelength in nanometers.</p>
-<figure>
+<figure data-pagefind-ignore>
<img src="images/processed_plot_cheap_rgb.svg" alt="A plot with three wide peaks, all three of different
heights. The leftmost peak is highest at 6nA, the middle peak lowest at 1.6nA and the rightmost peak in between
at 4nA. The middle one overlaps the two on the sides. Overall, the plot spans about 300nm on its x axis with
@@ -365,7 +368,7 @@ space (colorful) as well as sRGB (white) for comparison plotted within CIE 1931
both so for this illustration the LED color space has been scaled to fit. These figures were made with blender and a few
lines of python. The blender project file including all settings and the python script to generate the color space
models can be found in the <a class="reference external" href="https://github.com/jaseg/led_drv">project repo</a>.</p>
-<figure>
+<figure data-pagefind-ignore>
<video controls loop>
<source src="video/led_within_srgb_scale=1.0.mkv" type="video/h264">
<source src="video/led_within_srgb_scale=1.0.webm" type="video/webm">
@@ -419,13 +422,18 @@ can view the Jupyter notebook most of the analysis above <a class="reference ext
/ <a href="/about/">About</a>
/ <a href="/imprint/">Imprint</a>
</footer>
-<script>
+<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>
diff --git a/blog/multichannel-led-driver/index.html b/blog/multichannel-led-driver/index.html
index 22fa408..9f5682f 100644
--- a/blog/multichannel-led-driver/index.html
+++ b/blog/multichannel-led-driver/index.html
@@ -16,6 +16,9 @@
<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>
@@ -32,7 +35,7 @@
</ul>
<strong>2018-05-02</strong>
</header>
- <main>
+ <main data-pagefind-body>
<div class="document">
@@ -64,7 +67,7 @@ and it looks like it's off to your eye. If you turn it off right at the end, it'
super bright to your eye. Now, if you turn it off halfway into the cycle, it's on half the time and it will look to your
eye as half as bright as before. This means that you can control the LED's brightness with only a digital signal and
good timing.</p>
-<figure>
+<figure data-pagefind-ignore>
<img src="images/pwm_schema.jpg" alt="A visualization of PWM at different duty cycles.">
<figcaption>Waveforms of two PWM cycles at different duty cycles.</figcaption>
</figure><p>PWM works great if you have a dedicated PWM output on your microcontroller. It's extremely simple in both hardware and
@@ -104,7 +107,7 @@ channel's duty cycle into chunks the size of these bit periods. The amazingly el
can guess from the name these bit periods are weighted in powers of two. Say the shortest bit period lasts 1
microsecond. Then the second-shortest bit period is 2 microseconds and the third is 4, the fifth 8, the sixth 16 and so
on.</p>
-<figure>
+<figure data-pagefind-ignore>
<img src="images/bcm_schema.jpg" alt="A visualization of BCM at different duty cycles.">
<figcaption>Waveforms of a single 4-bit BCM cycle at different duty cycles. This BCM can produce 16 different
levels.</figcaption>
@@ -139,7 +142,7 @@ drive a couple of amps into the LED tape from the weak outputs of the shift regi
<em>reset</em> inputs. We set the timer to PWM mode so we can generate pulses with precise timing. At the beginning of each
bit period, a pulse will strobe the data for this bit period that we shifted in previously. At the end of the bit
period, one pulse will reset the shift register and one will strobe the freshly-reset zeros into the outputs.</p>
-<figure>
+<figure data-pagefind-ignore>
<img src="images/olsndot_output_schematic.jpg" alt="From left to right, we see the STM32, one of the shift
registers, and the LEDs and MOSFETs. The LED tape is driven to ground by the MOSFETs, which are in turn directly
driven from the shift register outputs. The shift register is wired up to the STM32 with its clock and data
@@ -176,7 +179,7 @@ values. It turned out that our extremely simple LED driving circuit consisting o
driving a MOSFET, which in turn directly drives the LED tape was maybe a little bit too simple. After some measurements
it turned out that we were looking at about 6Vpp of ringing on the driver's output voltage. The picture below is the
voltrage we saw on our oscilloscope on the LED tape.</p>
-<figure>
+<figure data-pagefind-ignore>
<img src="images/driver_ringing_strong.jpg" alt="Strong ringing on the LED voltage waveform edge at about
100% overshoot during about 70% of the cycle time.">
<figcaption>Bad ringing on the LED output voltage caused by wiring inductance. Note that the effect on the
@@ -185,7 +188,7 @@ voltrage we saw on our oscilloscope on the LED tape.</p>
<h4>Dynamic switching behavior: Cause and Effect</h4>
<p>A bit of <a class="reference external" href="http://www.analog.com/en/design-center/design-tools-and-calculators/ltspice-simulator.html">LTSpice</a> action later we found that the inductance of the few metres of cable leading to the LED tape is the
likely culprit. The figure below is the schematic used for the simulations.</p>
-<figure>
+<figure data-pagefind-ignore>
<img src="images/driver_output_ltspice_schematic.jpg" alt="The LTSpice schematic of one output of the driver,
taking into account the shift register's output ESR and the wiring ESL.">
<figcaption>The schematic of the simulation in LTSpice</figcaption>
@@ -193,7 +196,7 @@ likely culprit. The figure below is the schematic used for the simulations.</p>
in full. Combined with the cable inductance, this works out to a considerable lag of the rising edge of the LED
current, and bad ringing on its falling edge. Below is the voltage on the LED output from an LTSpice simulation of our
driver.</p>
-<figure>
+<figure data-pagefind-ignore>
<img src="images/overshoot_sim_r0.svg" alt="The result of the LTSpice simulation of our driver output. The LED
current shows similar ringing to what we measured using the oscilloscope. Interestingly, the gate voltage shows
strong ringing, too.">
@@ -206,14 +209,14 @@ capacitance. The result of this is that the LED current passing the wire's ESL r
series inductance gets excited slightly less, and the overshoot decreases. Below is a picture of the waveform with the
damping resistor in place and a picture of our measurement for comparison. The resistor values don't agree perfectly
since the estimated ESL and stray capacitance of the wiring is probably way off.</p>
-<figure>
+<figure data-pagefind-ignore>
<img src="images/driver_ringing_weak.jpg" alt="Weak ringing on the LED voltage waveform edge at about 30%
overshoot during about 20% of the cycle time.">
<figcaption>Adding a resistor in front of the MOSFET gate to slow the transition damped the ringing somewhat,
but ultimately it cannot be eliminated entirely. Note how you can actually see the miller plateau on the
trailing edge of this signal.
</figcaption>
-</figure><figure>
+</figure><figure data-pagefind-ignore>
<img src="images/overshoot_sim_r100.svg" alt="The result of the LTSpice simulation of our driver output with an
extra 100 Ohms between shift register output and MOSFET gate. Similar to the oscilloscope measurement the
ringing is much reduced in its amplitude.">
@@ -224,13 +227,13 @@ shift register's output at very small duty cycles (1µs or less). This is caused
plateau</a>. For illustration, below is a graph of both the excitation waveform (the boxy line) and the resulting LED
current (the other ones) both without damping (top) and with 220Ω damping (bottom). As you can see the effective duty
cycle of the LED current is not at all equal to the 50% duty cycle of the excitation square wave.</p>
-<figure>
+<figure data-pagefind-ignore>
<img src="images/asymmetric_iled.svg" alt="The result of an LTSpice simulation of the LED duty cycle without and
with damping. Dampening widens the LED current waveform from 50% duty cycle with sharp edges to about 80% duty
cycle with soft edges.">
<figcaption>Simulated LED duty cycle with and without damping. The damping resistance used in this simulation
was 220Ω.</figcaption>
-</figure><figure>
+</figure><figure data-pagefind-ignore>
<img src="images/asymmetric_vgate.svg" alt="The gate voltages in the spice simulation above. The undamped
response shows sharp edges with the miller plateau being a barely noticeable step, but with strong ringing on
the trailing edge. The damped response shows RC-like slow-edges, but has wide miller plateaus on both edges
@@ -261,7 +264,7 @@ calibration, the LED driver is set to enable each single BCM period in turn, i.e
shielding against both stray light and electromagnetic interference and a photodiode looking at the LED tape. We used
the venerable <a class="reference external" href="http://www.vishay.com/docs/81521/bpw34.pdf">BPW34</a> photodiode in our setup as I had a bunch leftover from another project and because they are quite
sensitive owing to their physically large die area.</p>
-<figure>
+<figure data-pagefind-ignore>
<img src="images/linearization_setup.jpg" alt="The led measurement setup consists of several PCBs and a
breadboard linked with a bunch of wires and a big tin can to shield the LEDs and the photodiode. A large sub-D
connector is put into the top of the tin can as a feed-through for the LED tape's control signals and the
@@ -283,7 +286,7 @@ ADC chips I had in my parts bin.</p>
measurement at each step. Later on, these measurements can be plotted to visualize the resulting slope's linearity, and
we can even do a simulation of the resulting brightness for all possible control values by just adding the measured
photocurrents for a certain BCM setpoint just as our retinas would do.</p>
-<figure>
+<figure data-pagefind-ignore>
<img src="images/driver_linearity_raw.svg" alt="">
<figcaption>
A plot of the measured brightness of our LED tape for each BCM period. The brightness values are normalized
@@ -298,7 +301,7 @@ photocurrents for a certain BCM setpoint just as our retinas would do.</p>
</figure><p>While it would be possible to fully automate the optimization of BCM driver lookup tables, we needed only one and in the
end I just sat down and manually tweaked the ideal values we initially calculated until I liked the result. You can see
the resulting brightness curve below.</p>
-<div class="subfigure">
+<div class="subfigure" data-pagefind-ignore>
<figure>
<img src="images/uncorrected_brightness_sim.svg" alt="">
<figcaption>
@@ -344,7 +347,7 @@ and control their outputs.</p>
</div>
<div class="section" id="conclusion">
<h3>Conclusion</h3>
-<div class="subfigure">
+<div class="subfigure" data-pagefind-ignore>
<figure>
<a href="images/olsndot_schematic.png">
<img src="images/olsndot_schematic.png" alt="A picture of the LED driver schematic">
@@ -372,13 +375,18 @@ analyze the brightness measurement data <a class="reference external" href="http
/ <a href="/about/">About</a>
/ <a href="/imprint/">Imprint</a>
</footer>
-<script>
+<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>
diff --git a/blog/private-contact-discovery/index.html b/blog/private-contact-discovery/index.html
index cbb3814..f815f6c 100644
--- a/blog/private-contact-discovery/index.html
+++ b/blog/private-contact-discovery/index.html
@@ -16,6 +16,9 @@
<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>
@@ -32,7 +35,7 @@
</ul>
<strong>2019-06-22</strong>
</header>
- <main>
+ <main data-pagefind-body>
<div class="document" id="private-contact-discovery">
<h1 class="title">Private Contact Discovery</h1>
@@ -68,13 +71,18 @@ accountability issues by simply not producing as much sensitive data in the firs
/ <a href="/about/">About</a>
/ <a href="/imprint/">Imprint</a>
</footer>
-<script>
+<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>
diff --git a/blog/serial-protocols/index.html b/blog/serial-protocols/index.html
index c5e2fd0..a0cbccc 100644
--- a/blog/serial-protocols/index.html
+++ b/blog/serial-protocols/index.html
@@ -16,6 +16,9 @@
<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>
@@ -32,7 +35,7 @@
</ul>
<strong>2018-05-19</strong>
</header>
- <main>
+ <main data-pagefind-body>
<div class="document">
@@ -239,13 +242,18 @@ want to set a large framebuffer in pieces, do it in a <a class="reference extern
/ <a href="/about/">About</a>
/ <a href="/imprint/">Imprint</a>
</footer>
-<script>
+<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>
diff --git a/blog/telekom-gpon-sfp/index.html b/blog/telekom-gpon-sfp/index.html
index e077a44..b01d35e 100644
--- a/blog/telekom-gpon-sfp/index.html
+++ b/blog/telekom-gpon-sfp/index.html
@@ -16,6 +16,9 @@
<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>
@@ -32,7 +35,7 @@
</ul>
<strong>2022-02-21</strong>
</header>
- <main>
+ <main data-pagefind-body>
<div class="document">
@@ -116,7 +119,7 @@ this, configure the eth5 interface (which is the SFP port) to use the static IP
<figure style="width: 20em">
<a href="images/edgerouter_sfp_config.png">
<img src="images/edgerouter_sfp_config.png" alt="The EdgeRouter's graphical configuration interface showing IP
- address 10.10.1.2/24 being configured for interface eth5, which is the SFP interface.">
+ address 10.10.1.2/24 being configured for interface eth5, which is the SFP interface." data-pagefind-ignore>
</a>
<figcaption>SFP interface configuration to access the SFP ONU from a laptop connected to the EdgeRouter's LAN
port</figcaption>
@@ -129,7 +132,7 @@ protocol, with destination address <tt class="docutils literal">10.10.1.0/24</tt
<a href="images/edgerouter_snat_config.png">
<img src="images/edgerouter_snat_config.png" alt="The EdgeRouter's graphical configuration interface showing a
source NAT being configured for interface eth5 for TCP protocol connections to destination address 10.10.1.1
- using masquerading.">
+ using masquerading." data-pagefind-ignore>
</a>
<figcaption>Source NAT configuration to access the SFP ONU from LAN. eth5, masquerading on, TCP, destination
10.10.1.1 (the SFP ONU's IP).</figcaption>
@@ -146,7 +149,7 @@ default login credentials for the device are admin/1234.</p>
<a href="images/sfp_onu_web_if.png">
<img src="images/sfp_onu_web_if.png" alt="The SFP ONU configuration web interface is a basic-looking website with
a big Zyxel logo on it. It has menu options named status, setup and management. It shows a system overview
- page that lists the device's uptime and software version.">
+ page that lists the device's uptime and software version." data-pagefind-ignore>
</a>
<figcaption>The SFP ONU's web interface.</figcaption>
</figure></div>
@@ -161,7 +164,7 @@ on this page.</p>
<a href="images/sfp_onu_ploam_pw_config.png">
<img src="images/sfp_onu_ploam_pw_config.png" alt="The SFP ONU configuration web interface shows its SLID
configuration page. A text field labelled SLID asks the user to enter a value of at most ten characters. As
- an example, abcdefg123 is listed.">
+ an example, abcdefg123 is listed." data-pagefind-ignore>
</a>
<figcaption>The SFP ONU's config interface to set SLID/PLOAM PW/ONT-Installationskennung.</figcaption>
</figure><p>Press &quot;Save Config&quot; on the top right of the web page, then select &quot;Reset ONU&quot; and click &quot;Apply&quot; under the &quot;Reset ONU&quot;
@@ -170,7 +173,7 @@ link on the left. Make sure to not select the factory reset option instead.</p>
<a href="images/sfp_onu_reset.png">
<img src="images/sfp_onu_reset.png" alt="The SFP ONU configuration web interface shows its reset ONU page. There
are two options labelled Reset ONU and Reset to factory default settings. The reset ONU option is
- selected.">
+ selected." data-pagefind-ignore>
</a>
<figcaption>Rebooting the SFP ONU.</figcaption>
</figure><p>With the ONU configured, after the reset the &quot;GPON Information&quot; page from the left menu under &quot;Status&quot; from the top menu
@@ -214,13 +217,18 @@ collected <a class="reference external" href="https://github.com/xvzf/zyxel-gpon
/ <a href="/about/">About</a>
/ <a href="/imprint/">Imprint</a>
</footer>
-<script>
+<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>
diff --git a/blog/thors-hammer/index.html b/blog/thors-hammer/index.html
index d012aad..2bbea5e 100644
--- a/blog/thors-hammer/index.html
+++ b/blog/thors-hammer/index.html
@@ -16,6 +16,9 @@
<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>
@@ -32,14 +35,14 @@
</ul>
<strong>2018-05-03</strong>
</header>
- <main>
+ <main data-pagefind-body>
<div class="document">
<p>In case you were having an inferiority complex because your friends' IBM Model M keyboards are so much louder than the
shitty rubber dome freebie you got with your pc... Here's the solution: Thor's Hammer, a simple typing cadence enhancer
for <a class="reference external" href="https://en.wikipedia.org/wiki/PS/2_port">PS/2</a> keyboards.</p>
-<figure>
+<figure data-pagefind-ignore>
<video controls loop>
<source src="video/thors_hammer.mov" type="video/h264">
<source src="video/thors_hammer.webm" type="video/webm">
@@ -56,13 +59,13 @@ want to send data. In case of a keyboard that's the case when a key is pressed o
LED state, otherwise the clock line is silent. We ignore the LED activity for now as it's generally coupled to key
presses. By just triggering an NE555 configured as astable flipflop we can stretch each train of clock pulses to a
pulse a few tens of milliseconds long that is enough to actuate the solenoid.</p>
-<figure>
+<figure data-pagefind-ignore>
<img src="images/thors_hammer_schematic.jpg" alt="The schematic of the PS2 driver">
<figcaption>The schematic of the driver stretching the PS/2 clock pulses to drive the solenoid.</figcaption>
</figure><p>Since PS/2 sends each key press and key release separately this circuit will pulse twice per keystroke. It would be
possible to ignore one of them but I figure the added noise just adds to the experience.</p>
<p>Built on a breadboard, the circuit looks like this.</p>
-<figure>
+<figure data-pagefind-ignore>
<img src="images/thors_hammer_breadboard.jpg" alt="The circuit built on a breadboard">
<figcaption>The completed circuit built up on a breadboard and attached to a keyboard.</figcaption>
</figure><p>Since my solenoid did not have a tensioning spring I used a rubber band and some vinyl tape to make an adjustable
@@ -76,13 +79,18 @@ board as shims between the plunger and the case to limit the plunger's travel in
/ <a href="/about/">About</a>
/ <a href="/imprint/">Imprint</a>
</footer>
-<script>
+<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>
diff --git a/blog/wifi-led-driver/index.html b/blog/wifi-led-driver/index.html
index 7df1f28..ed5667b 100644
--- a/blog/wifi-led-driver/index.html
+++ b/blog/wifi-led-driver/index.html
@@ -16,6 +16,9 @@
<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>
@@ -32,14 +35,14 @@
</ul>
<strong>2018-05-02</strong>
</header>
- <main>
+ <main data-pagefind-body>
<div class="document">
<div class="section" id="project-motivation">
<h2>Project motivation</h2>
<!-- FIXME finished project picture with LED tape -->
-<figure>
+<figure data-pagefind-ignore>
<img src="images/board_in_case.small.jpg">
<figcaption>The completed driver board installed in the 3D-printed case. This device can now be connected to
12V and two segments of LED tape that can then be controlled trough Wifi. The ESP8266 module goes on the pin
@@ -67,7 +70,7 @@ a small <a class="reference external" href="https://en.wikipedia.org/wiki/Surfac
currents their <a class="reference external" href="http://m.littelfuse.com/~/media/electronics/datasheets/resettable_ptcs/littelfuse_ptc_16r_datasheet.pdf.pdf">trip times get long enough that they become unlikely to trip in time to save anything</a>, so plain old non-resettable fuses would be the way to go there.</p>
<!-- FIXME finished board photos -->
<!-- FIXME board with test tape picture -->
-<div class="subfigure">
+<div class="subfigure" data-pagefind-ignore>
<figure>
<img src="images/schematic.png">
<figcaption>
@@ -87,7 +90,7 @@ currents their <a class="reference external" href="http://m.littelfuse.com/~/med
<a href="resource/schematic_and_pcb.pdf">Download PDF</a>
</figcaption>
</figure>
-</div><figure>
+</div><figure data-pagefind-ignore>
<img src="images/boards.small.jpg">
<figcaption>The completed PCBs of this project (front) and the `multichannel LED driver`_ project the driver
circuitry was derived from (back).
@@ -134,13 +137,18 @@ violence.</p>
/ <a href="/about/">About</a>
/ <a href="/imprint/">Imprint</a>
</footer>
-<script>
+<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>