<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title>AustinBlanco.com</title>
<link>https://austinblanco.com/</link>
<atom:link href="https://austinblanco.com/feed.xml" rel="self" type="application/rss+xml"/>
<description>Imaging · Microscopy &amp; More. Notes from Austin Blanco since 2007.</description>
<language>en</language>
<lastBuildDate>Fri, 16 Oct 2026 20:16:22 +0000</lastBuildDate>
<item><title>Starlyte Nebula Driver FAQ</title><link>https://austinblanco.com/posts/starlyte-nebula-driver-faq.html</link><guid isPermaLink="true">https://austinblanco.com/posts/starlyte-nebula-driver-faq.html</guid><pubDate>Tue, 21 Jul 2026 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><category>Imaging</category><category>Nebula</category><category>Programming</category><description>TL:DR Live Debugging Get a Full list of Supported Drivers Testing a Specific Driver File Testing Host and Sub Devices Live Debugging Due to the open…</description><content:encoded><![CDATA[<h2 id="tl-dr">TL:DR</h2>

<h3 id="live-debugging"><a href="#debug">Live Debugging</a></h3>

<p class="wp-block-paragraph"><a href="#listdrivers">Get a Full list of Supported Drivers</a></p>

<p class="wp-block-paragraph"><a href="#testdriver">Testing a Specific Driver File</a></p>

<p class="wp-block-paragraph"><a href="#hostdevices">Testing Host and Sub Devices</a></p>

<h2 id="debug">Live Debugging</h2>

<p class="wp-block-paragraph">Due to the open nature of our driver system, it’s relatively straightforward to write a new driver file for almost any imaginable device in Nebula. However, driver development can be a pain, so I though I’d share some debugging tricks. </p>

<p class="wp-block-paragraph">For all commands, we will navigate to the command line using windows Command prompt or powershell. Here I show command prompt syntax. Nebula is commonly installed under program files. So in the windows start bar type “cmd” and press enter. This should open the command prompt. The commands below navigate to the install location. </p>

<pre class="wp-block-code"><code>cd\

c:\&gt;cd "Program Files"

c:\Program Files&gt;cd Nebula

c:\Program Files\Nebula&gt;</code></pre>

<p class="wp-block-paragraph">First, is the use of logging to the command line. When Nebula is launched from the command line, a series of optional switches can be used to report logged output. By opening this alongside the app, it’s very fast to figure out what or where something is going wrong. To see log output, use –printlog. </p>

<pre class="wp-block-code"><code>c:\Program Files\Nebula&gt;Nebula.exe --printlog</code></pre>

<p class="wp-block-paragraph">This launches the app, but shows a live log output on the console at the same time. </p>

<h2 id="listdrivers">Get a full list of Supported Drivers</h2>

<p class="wp-block-paragraph">This command will return a complete list of drivers found in the Nebula supported list. To print this list, use:</p>

<pre class="wp-block-code"><code>c:\Program Files\Nebula&gt;Nebula.exe --listdrivers</code></pre>

<p class="wp-block-paragraph">Here is  live example of that command and the expected result. A list of drivers is shown, press enter to close the listing. </p>

<figure class="wp-block-image size-full"><video muted loop playsinline preload="none" controls poster="https://austinblanco.com/assets/posts/listdrivers-poster-1024.webp" width="1280" height="715" data-inview="" aria-label="Image from “Starlyte Nebula Driver FAQ”"><source src="https://austinblanco.com/assets/posts/listdrivers.mp4" type="video/mp4"></video></figure>

<h2 id="testdriver">Testing a specific Driver File</h2>

<p class="wp-block-paragraph">Next, let’s load up one of these drivers in the test utility. Now, this is where things get cool! The test utility can load a host device driver, inspect it’s shown devices, attempt to connect them, and even test every sub-device! </p>

<p class="wp-block-paragraph">So, let’s assume we have a new camera driver we want to work on. The camera should do things like snap an image, show various properties etc. In my example I use a real UVC (web) camera, and inspect the driver. The driver actually pulls the real camera info and even snaps a test image. The goal of this function is twofold, first to validate a given driver, and second to validate the device itself. </p>

<p class="wp-block-paragraph">For this command we will use –testdriver *drivername* and optionally –port *portname*, for example, COM5 </p>

<pre class="wp-block-code"><code>c:\Program Files\Nebula&gt;Nebula.exe --testdriver --driver UVC_Camera</code></pre>

<p class="wp-block-paragraph">Here we can watch the expected output in real time. Note a new window is spawned to show us the results for these tests. </p>

<figure class="wp-block-image size-full"><video muted loop playsinline preload="none" controls poster="https://austinblanco.com/assets/posts/test-driver-UVC_Camera-poster-1024.webp" width="1280" height="715" data-inview="" aria-label="Image from “Starlyte Nebula Driver FAQ”"><source src="https://austinblanco.com/assets/posts/test-driver-UVC_Camera.mp4" type="video/mp4"></video></figure>

<h2 id="hostdevices">Testing Host and Sub Devices</h2>

<p class="wp-block-paragraph">Let’s say we have a controller, for example, an ASI or Marzhauser box, which has a Z motor attached. In Nebula, the controller can be thought of as the Host (the resident controlling brain), and the device can be considered an appendage attached to the host. So all drivers must have a Host, but a Host may only have one device. In this example, we use a demo Focus device. First the host is loaded and analyzed, and then, you ca select to test any device provided by that host. I choose option # 1 (focus) and the test runs, even showing my driver has a small error I missed! </p>

<figure class="wp-block-image size-full"><video muted loop playsinline preload="none" controls poster="https://austinblanco.com/assets/posts/test_demo_focus-poster-1024.webp" width="1280" height="715" data-inview="" aria-label="Image from “Starlyte Nebula Driver FAQ”"><source src="https://austinblanco.com/assets/posts/test_demo_focus.mp4" type="video/mp4"></video></figure>

<p class="wp-block-paragraph">Obviously, if you have a driver which isn’t behaving, please <a href="https://starlyteimaging.com/contact/">contact us</a> – yet I hope these options provide a first-line of interface for power users, so simple things can be corrected and analyzed quickly! </p>

<p class="wp-block-paragraph">-Austin</p>]]></content:encoded></item>
<item><title>Understanding TTL control, Blanking &amp; Device Streaming, and why it matters for your research.</title><link>https://austinblanco.com/posts/understanding-ttl-control-blanking-device-streaming-and-why-it-matters-for-your-research.html</link><guid isPermaLink="true">https://austinblanco.com/posts/understanding-ttl-control-blanking-device-streaming-and-why-it-matters-for-your-research.html</guid><pubDate>Thu, 16 Jul 2026 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><category>Imaging</category><category>Laser</category><category>Nebula</category><category>Optics</category><category>Triggerscope</category><description>While this is an old subject in terms of technology, I find that every few years I end up describing it to a new group.</description><content:encoded><![CDATA[<p class="wp-block-paragraph">While this is an old subject in terms of technology, I find that every few years I end up describing it to a new group. Surprisingly to me, every time people seem to appreciate the information, and I think it’s just not covered often in broader imaging trainings. So today I’m writing about a favorite subject of mine – TTL control. To do this I’ll be referencing some fun technology – namely:</p>

<ul class="wp-block-list">
<li>The newly announced <a href="https://www.excelitas.com/product/x-cite-tetrem-4-channel-led-illumination-system?creative=&amp;keyword=&amp;matchtype=&amp;network=x&amp;device=c&amp;gad_source=1&amp;gad_campaignid=22845102957&amp;gbraid=0AAAAADeC6WhX78246q__iX0kpuzB8Dw_z&amp;gclid=CjwKCAjwvNfSBhBiEiwAyaGMCa8u93JsiHkwD8b_9zh2UTCn_6b7te60PBRtL_IwrxYbuyaBeegJTBoCqfIQAvD_BwE">Excelitas Tetrem LED Light source</a></li>

<li> Our <a href="https://starlyteimaging.com/">Starlyte Nebula software</a> (Now supporting the Tetrem)</li>

<li>The <a href="https://advancedresearch-consulting.com/product/triggerscope-mini/">Triggerscope Mini</a></li>

<li>The <a href="https://www.excelitas.com/product-category/pcoedge-cooled-scmos-cameras">PCO Edge Camera</a></li>
</ul>

<h2 id="tl-dr">TL:DR</h2>

<nav class="toc" aria-label="Table of contents">
  <ul>
    <li><a href="#tp">The Problem</a></li>
    <li><a href="#ttl1">TTL Control -&gt; Old + Fast = Awesome</a></li>
    <li><a href="#blank">TTL Blanking – A partial Solution</a></li>
    <li><a href="#tgs">Using the Triggerscope for State Control of Devices</a></li>
    <li><a href="#streaming">Streaming for the Win</a></li>

  </ul>
</nav>

<h2 id="tp">The Problem</h2>

<p class="wp-block-paragraph">For illustration of the device control, I’ve captured a few real example frames from my oscilloscope, but also added some simulated oscilloscope examples that I hope will better depict the work behind the scenes for these devices.</p>

<p class="wp-block-paragraph">I think it’s most important to frame this in a question,</p>

<blockquote class="wp-block-quote is-style-default is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">When my software controls devices, how fast do they respond? </p>
</blockquote>

<p class="wp-block-paragraph">Assume we click a shutter button in any software. This can be for a laser, an LED, even an old mechanical shutter. In every case a bunch of things must happen for the end device to actually change it’s state. For that state (let’s say, “OFF” to change to “ON”, </p>

<ul class="wp-block-list">
<li>the software must accept the command </li>

<li>and issue control signals to the device connection. </li>

<li>That connection talks to the device controller (normally, a microcontroller)</li>

<li>The microcontroller reads the command and does what it’s told</li>

<li>The state changes. </li>
</ul>

<p class="wp-block-paragraph">Now, along the way, each device has a communication bus, and each bus has a traffic control system to insure multiple communications don’t conflict. As a result, the timing from the start of the button click to the end is variable – sometimes, up to 20 milliseconds! </p>

<p class="wp-block-paragraph">Now, because the software is typically programmed to “confirm” each thing it does, it doesn’t just shout orders into the dark. Instead, the software waits for a confirmation, or acknowledgment, of the command being received, and oftentimes it will confirm the new state is active. </p>

<p class="wp-block-paragraph">Consider this means a new set of jobs which must be completed. </p>

<ul class="wp-block-list">
<li>The device controller changes state</li>

<li>The device controller then replies, or reports state</li>

<li>The communication connection on the PC receives the reply</li>

<li>The software reads the reply, and confirms it’s correct</li>

<li>The software continues to the next job.</li>
</ul>

<p class="wp-block-paragraph">And so again, we can see a stack-up of not only delay, but a <em>variable amount of delay.</em></p>

<p class="wp-block-paragraph">If we visualize this in a graphic example like the one below, we can see the software code is sent to an LED microcontroller, the command is processed, and the led illuminates. However, we can also see there is a lot of room for improvement! </p>

<div class="abx-led-demo" role="img" aria-label="Animation: PC sends serial commands to an LED Controller, which toggles an LED. An oscilloscope traces the GPIO signal.">
  <style>
    .abx-led-demo{
      --bg:#1B1B1B; --panel:#252525; --line:#3a3a3a;
      --ink:#F0F0F0; --dim:#9a9a9a; --accent:#7BDBD1; --hot:#E88BB8;
      --scope-bg:#0F0F10; --scope-grid:#2a2a2a; --scope-trace:#7BDBD1;
      --wire:#4a4a4a; --wire-hot:#E6C458;
      font-family: Manrope, ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Arial, sans-serif;
      color:var(--ink); background:var(--bg);
      border:1px solid var(--line); border-radius:14px;
      padding:18px 18px 14px; max-width:1100px; margin:18px auto;
      box-shadow: 0 10px 40px rgba(0,0,0,.25);
    }
    .abx-led-demo *{box-sizing:border-box}
    .abx-led-demo h3{
      margin:0 0 4px; font-size:15px; font-weight:600; letter-spacing:.02em; color:var(--ink);
    }
    .abx-led-demo .abx-sub{
      margin:0 0 12px; font-size:12px; color:var(--dim);
    }
    .abx-led-demo .abx-stage{position:relative; width:100%}
    .abx-led-demo svg.abx-diagram{width:100%; height:auto; display:block}
    .abx-led-demo .abx-scope-wrap{
      margin-top:10px; background:var(--panel);
      border:1px solid var(--line); border-radius:10px;
      padding:10px 12px;
    }
    .abx-led-demo .abx-scope-head{
      display:flex; justify-content:space-between; align-items:center;
      font-size:11px; color:var(--dim); margin-bottom:6px;
      font-family: "Fira Code", ui-monospace, "SF Mono", Menlo, Consolas, monospace;
      letter-spacing:.05em;
    }
    .abx-led-demo .abx-scope-head .abx-chip{
      display:inline-block; padding:2px 8px; border-radius:999px;
      background:#262626; color:var(--accent); border:1px solid #3a3a3a;
      font-size:10px;
    }
    .abx-led-demo canvas.abx-scope{
      width:100%; height:170px; display:block; border-radius:6px;
      background:var(--scope-bg);
    }
    .abx-led-demo .abx-footer{
      display:flex; flex-wrap:wrap; gap:14px;
      margin-top:10px; font-size:11px; color:var(--dim);
      font-family: "Fira Code", ui-monospace, "SF Mono", Menlo, Consolas, monospace;
    }
    .abx-led-demo .abx-footer .abx-dot{
      display:inline-block; width:8px; height:8px; border-radius:50%;
      vertical-align:middle; margin-right:6px;
    }
  </style>

  <h3>LED Control via Software (PC → LED Controller → GPIO)</h3>
  <p class="abx-sub">A host PC issues serial commands. The LED Controller parses each command and drives a GPIO pin. The oscilloscope captures the resulting digital waveform on PA5.</p>

  <div class="abx-stage">
    <svg class="abx-diagram" viewbox="0 0 1000 260" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
      <defs>
        <lineargradient id="abx-pc-grad" x1="0" x2="0" y1="0" y2="1">
          <stop offset="0" stop-color="#262626"></stop>
          <stop offset="1" stop-color="#1c1c1c"></stop>
        </lineargradient>
        <lineargradient id="abx-mcu-grad" x1="0" x2="0" y1="0" y2="1">
          <stop offset="0" stop-color="#262626"></stop>
          <stop offset="1" stop-color="#181818"></stop>
        </lineargradient>
        <radialgradient id="abx-led-glow" cx="50%" cy="50%" r="50%">
          <stop offset="0" stop-color="#E6C458" stop-opacity="1"></stop>
          <stop offset="0.45" stop-color="#D1A840" stop-opacity=".6"></stop>
          <stop offset="1" stop-color="#D1A840" stop-opacity="0"></stop>
        </radialgradient>
      </defs>

      <!-- PC -->
      <g transform="translate(20,40)">
        <rect x="0" y="0" width="240" height="150" rx="10" fill="url(#abx-pc-grad)" stroke="#3a3a3a"></rect>
        <rect x="10" y="10" width="220" height="105" rx="6" fill="#0F0F10" stroke="#3a3a3a"></rect>
        <g font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace" font-size="11" fill="#7BDBD1">
          <text x="20" y="32">$ serial /dev/ttyUSB0 115200</text>
          <text x="20" y="50" fill="#F0F0F0">&gt; <tspan fill="#E6C458">led_on()</tspan></text>
          <text x="20" y="68" fill="#9a9a9a">ack: OK</text>
          <text x="20" y="86" fill="#F0F0F0">&gt; <tspan fill="#E6C458">led_off()</tspan></text>
          <text x="20" y="104" fill="#9a9a9a">ack: OK<tspan fill="#7BDBD1"> _</tspan></text>
        </g>
        <circle cx="225" cy="138" r="3" fill="#7BDBD1"></circle>
        <text x="14" y="142" font-size="10" fill="#9a9a9a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">HOST PC</text>
      </g>

      <!-- Serial wire (PC -> Controller) -->
      <g>
        <path d="M260,115 L390,115" stroke="var(--wire)" stroke-width="3" fill="none"></path>
        <text x="290" y="105" font-size="10" fill="#9a9a9a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">UART · TX</text>
        <circle r="4" fill="#E6C458">
          <animatemotion dur="3s" repeatcount="indefinite" keypoints="0;0;1;1" keytimes="0;0.10;0.30;1" calcmode="linear" path="M260,115 L390,115"></animatemotion>
          <animate attributename="opacity" values="0;1;1;0;0" keytimes="0;0.10;0.30;0.31;1" dur="3s" repeatcount="indefinite"></animate>
        </circle>
        <circle r="4" fill="#E6C458">
          <animatemotion dur="3s" begin="0.08s" repeatcount="indefinite" keypoints="0;0;1;1" keytimes="0;0.10;0.30;1" calcmode="linear" path="M260,115 L390,115"></animatemotion>
          <animate attributename="opacity" values="0;1;1;0;0" keytimes="0;0.10;0.30;0.31;1" dur="3s" begin="0.08s" repeatcount="indefinite"></animate>
        </circle>
        <circle r="4" fill="#E6C458">
          <animatemotion dur="3s" begin="1.5s" repeatcount="indefinite" keypoints="0;0;1;1" keytimes="0;0.10;0.30;1" calcmode="linear" path="M260,115 L390,115"></animatemotion>
          <animate attributename="opacity" values="0;1;1;0;0" keytimes="0;0.10;0.30;0.31;1" dur="3s" begin="1.5s" repeatcount="indefinite"></animate>
        </circle>
      </g>

      <!-- LED Controller -->
      <g transform="translate(390,55)">
        <rect x="0" y="0" width="200" height="140" rx="8" fill="url(#abx-mcu-grad)" stroke="#3a3a3a"></rect>
        <g fill="#9a9a9a">
          <rect x="-6" y="20" width="6" height="4"></rect><rect x="-6" y="38" width="6" height="4"></rect>
          <rect x="-6" y="56" width="6" height="4"></rect><rect x="-6" y="74" width="6" height="4"></rect>
          <rect x="-6" y="92" width="6" height="4"></rect><rect x="-6" y="110" width="6" height="4"></rect>
          <rect x="200" y="20" width="6" height="4"></rect><rect x="200" y="38" width="6" height="4"></rect>
          <rect x="200" y="56" width="6" height="4"></rect><rect x="200" y="74" width="6" height="4"></rect>
          <rect x="200" y="92" width="6" height="4"></rect><rect x="200" y="110" width="6" height="4"></rect>
        </g>
        <rect x="20" y="20" width="160" height="100" rx="4" fill="#1e1e1e" stroke="#3a3a3a"></rect>
        <text x="100" y="48" text-anchor="middle" font-size="12" fill="#F0F0F0" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">LED Controller</text>
        <text x="100" y="64" text-anchor="middle" font-size="10" fill="#9a9a9a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">UART → parser</text>
        <text x="100" y="80" text-anchor="middle" font-size="10" fill="#9a9a9a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">GPIO_WritePin()</text>
        <circle cx="160" cy="105" r="4" fill="#7BDBD1">
          <animate attributename="opacity" values="0.2;1;0.2" dur="0.4s" repeatcount="indefinite"></animate>
        </circle>
        <text x="20" y="138" font-size="10" fill="#9a9a9a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">LED Controller</text>
      </g>

      <!-- GPIO wire (Controller -> LED) -->
      <g>
        <path d="M590,125 L760,125" stroke="var(--wire)" stroke-width="3" fill="none"></path>
        <text x="620" y="115" font-size="10" fill="#9a9a9a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">GPIO · PA5</text>
        <rect x="590" y="121" width="170" height="8" rx="2" fill="#3a3a3a">
          <animate attributename="fill" values="#3a3a3a;#3a3a3a;#E6C458;#E6C458;#3a3a3a;#3a3a3a" keytimes="0;0.30;0.32;0.62;0.64;1" dur="3s" repeatcount="indefinite"></animate>
        </rect>
      </g>

      <!-- LED -->
      <g transform="translate(760,55)">
        <circle cx="60" cy="70" r="60" fill="url(#abx-led-glow)" opacity="0">
          <animate attributename="opacity" values="0;0;1;1;0;0" keytimes="0;0.30;0.32;0.62;0.64;1" dur="3s" repeatcount="indefinite"></animate>
        </circle>
        <ellipse cx="60" cy="70" rx="28" ry="34" fill="#181510" stroke="#3a3a3a" stroke-width="2"></ellipse>
        <ellipse cx="60" cy="70" rx="22" ry="28" fill="#20201c">
          <animate attributename="fill" values="#20201c;#20201c;#E6C458;#E6C458;#20201c;#20201c" keytimes="0;0.30;0.32;0.62;0.64;1" dur="3s" repeatcount="indefinite"></animate>
        </ellipse>
        <ellipse cx="52" cy="58" rx="6" ry="10" fill="#fff" opacity="0.18"></ellipse>
        <line x1="50" y1="100" x2="50" y2="120" stroke="#9a9a9a" stroke-width="2"></line>
        <line x1="70" y1="100" x2="70" y2="120" stroke="#9a9a9a" stroke-width="2"></line>
        <rect x="38" y="120" width="44" height="12" rx="2" fill="#8a6b28" stroke="#3a2c14"></rect>
        <line x1="22" y1="126" x2="38" y2="126" stroke="#9a9a9a" stroke-width="2"></line>
        <line x1="82" y1="126" x2="98" y2="126" stroke="#9a9a9a" stroke-width="2"></line>
        <text x="60" y="155" text-anchor="middle" font-size="10" fill="#9a9a9a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">LED + 330Ω</text>
      </g>

      <text x="325" y="135" font-size="9" fill="#7a7a7a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">115200 8N1</text>
      <text x="660" y="145" font-size="9" fill="#7a7a7a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">3.3 V digital</text>
    </svg>
  </div>

  <div class="abx-scope-wrap" aria-hidden="true">
    <div class="abx-scope-head">
      <span>OSCILLOSCOPE · CH1 — GPIO PA5</span>
      <span><span class="abx-chip">RUN</span>   1V / div  ·  500 ms / div</span>
    </div>
    <canvas class="abx-scope" width="1200" height="340"></canvas>
  </div>

  <div class="abx-footer">
    <span><span class="abx-dot" style="background:#E6C458"></span>UART data (PC → LED Controller)</span>
    <span><span class="abx-dot" style="background:#E6C458"></span>GPIO line HIGH</span>
    <span><span class="abx-dot" style="background:#7BDBD1"></span>Scope trace (CH1)</span>
  </div>

  <script>
  (function(){
    var root = document.currentScript && document.currentScript.parentNode;
    if(!root) return;
    var canvas = root.querySelector('canvas.abx-scope');
    if(!canvas) return;
    var ctx = canvas.getContext('2d');

    function resize(){
      var rect = canvas.getBoundingClientRect();
      var dpr = window.devicePixelRatio || 1;
      canvas.width  = Math.max(400, Math.floor(rect.width  * dpr));
      canvas.height = Math.max(150, Math.floor(rect.height * dpr));
    }
    resize();
    window.addEventListener('resize', resize, {passive:true});

    function gpioAt(tNorm){
      var t = ((tNorm % 1) + 1) % 1;
      if(t < 0.30) return 0;
      if(t < 0.32) return (t - 0.30) / 0.02;
      if(t < 0.62) return 1;
      if(t < 0.64) return 1 - (t - 0.62) / 0.02;
      return 0;
    }

    var CYCLE_MS = 3000;
    var WINDOW_MS = 6000;
    var start = performance.now();

    function draw(now){
      var w = canvas.width, h = canvas.height;
      ctx.fillStyle = '#0F0F10';
      ctx.fillRect(0,0,w,h);

      ctx.strokeStyle = '#2a2a2a';
      ctx.lineWidth = 1;
      var divX = 8, divY = 6;
      ctx.beginPath();
      for(var i=1;i<divX;i++){
        var x = Math.round(i*w/divX) + 0.5;
        ctx.moveTo(x,0); ctx.lineTo(x,h);
      }
      for(var j=1;j<divY;j++){
        var y = Math.round(j*h/divY) + 0.5;
        ctx.moveTo(0,y); ctx.lineTo(w,y);
      }
      ctx.stroke();

      ctx.strokeStyle = '#3a3a3a';
      ctx.beginPath();
      var cy = Math.round(h*0.78)+0.5;
      ctx.moveTo(0,cy); ctx.lineTo(w,cy);
      ctx.stroke();

      ctx.fillStyle = '#6a6a6a';
      ctx.font = (12 * (window.devicePixelRatio||1)) + 'px ui-monospace, Menlo, Consolas, monospace';
      ctx.textBaseline = 'middle';
      ctx.fillText('3.3V', 6, Math.round(h*0.18));
      ctx.fillText('0V',   6, Math.round(h*0.78));

      var elapsed = now - start;
      var samples = Math.min(w, 1200);
      ctx.lineWidth = 2 * (window.devicePixelRatio||1);
      ctx.strokeStyle = '#7BDBD1';
      ctx.shadowBlur = 8;
      ctx.shadowColor = 'rgba(123,219,209,0.55)';
      ctx.beginPath();
      var hiY = Math.round(h*0.18);
      var loY = Math.round(h*0.78);
      for(var s=0; s<=samples; s++){
        var px = (s/samples) * w;
        var tAbs = elapsed - (1 - s/samples) * WINDOW_MS;
        var v = gpioAt(tAbs / CYCLE_MS);
        var py = loY + (hiY - loY) * v;
        if(s===0) ctx.moveTo(px, py); else ctx.lineTo(px, py);
      }
      ctx.stroke();
      ctx.shadowBlur = 0;

      ctx.strokeStyle = 'rgba(255,215,107,0.55)';
      ctx.lineWidth = 1;
      ctx.beginPath();
      ctx.moveTo(w-0.5, 0); ctx.lineTo(w-0.5, h);
      ctx.stroke();

      requestAnimationFrame(draw);
    }
    requestAnimationFrame(draw);
  })();
  </script>
</div>

<p class="wp-block-paragraph">Another way to look at this control is what happens with a typical complex instrument. Below is a video where I control 3 devices. The PCO Camera, a Zaber filter turret, and the Tetrem. Notice how long it takes just to get 3 time points for 2 channels. The exposure is short, that's not the issue - the issue here is of course, the devices need to move, but also <strong>each device must receive + process + move + report</strong> positions, and this takes a long time. </p>

<figure class="wp-block-image size-full is-resized"><video muted loop playsinline preload="none" controls poster="https://austinblanco.com/assets/posts/slow-filter-capture-poster-1024.webp" width="1280" height="720" data-inview="" aria-label="Image from “Understanding TTL control, Blanking &amp; Device Streaming, and why it matters for your research.”"><source src="https://austinblanco.com/assets/posts/slow-filter-capture.mp4" type="video/mp4"></video></figure>

<h2 id="ttl1">TTL Control -&gt; Old + Fast = Awesome</h2>

<p class="wp-block-paragraph">So what is TTL? Basically, nothing more than an on/off switch! Just like a light switch allows an electrical signal to feed a light, TTL uses a voltage to send a signal to another device. You can find a thorough history on this communication method here if interested. </p>

<p class="wp-block-paragraph">What we care about is that we have an on/off control system. Because it's nothing more than a voltage, no crazy translations need to happen for things to immediately react. If a TTL control line is on, or "High", then the device should be doing whatever ON is. Many devices have this input, but few people even know about it! For example, most Focus controllers, XY Stages, Peristaltic Pumps, Perfusion systems, and many other devices like lasers, shutters, and actuators accept a TTL input for control.</p>

<p class="wp-block-paragraph">TTL Logic typically comes in 2 flavors. Older systems will use 5V for "on" and 0V for "off". The device being controlled might use thresholds or a midpoint. Some devices, assuming you give them at least 2.5V, will go active. Others want at least 4V or 4.5V before they enable. Newer devices often use 3.3v control. This is the same concept as 5V, just with lower voltages. One word of caution here - before connecting things up, it's good to confirm the logic of your devices. Generally, the amount of power these use is quite low, and signal inputs won't break things - but in the case of an exposed microcontroller pin, you can definitely <a href="https://electronics.stackexchange.com/questions/625787/effect-of-5v-on-3-3v-gpio">cook a 3.3v input with a 5V </a>line! </p>

<h2 id="blank">TTL Blanking - A partial Solution</h2>

<p class="wp-block-paragraph">So what can be done about this overhead? First, we can consider that the only time we really need the illumination on, is when the camera is truly collecting data. One way to do this is to use the I/O control cables found on most scientific cameras. In my case I routed the expose signal from the edge camera into the Tetrem on a single channel, and then, told the tetrem in my software to use "TTL Control". With these changes, the LED source now waits for a TTL input to go high, before it enables it's emission. </p>

<p class="wp-block-paragraph">So now, let's assume that when the camera is exposing, we can enable the LED line. The software can act as a logical "AND" if needed, but the line won't enable unless there is real collection of light by the camera. You can see an example of this below. </p>

<!-- ============================================================
  Latency: PC-commanded vs. TTL-triggered LED control
  Self-contained inline HTML — drop into WordPress Custom HTML block
============================================================ -->
<div class="abx-lat-demo" role="img" aria-label="Animation comparing software-driven and TTL-driven LED control latency.">
  <style>
    .abx-lat-demo{
      --bg:#1B1B1B; --panel:#252525; --line:#3a3a3a;
      --ink:#F0F0F0; --dim:#9a9a9a;
      --accent:#7BDBD1; --warm:#E6C458; --hot:#E88BB8;
      --scope-bg:#0F0F10; --scope-grid:#2a2a2a;
      --trace-trig:#E6C458;   /* yellow */
      --trace-ttl:#7BDBD1;    /* cyan   - immediate */
      --trace-sw:#B994FF;     /* purple  - delayed  */
      --wire:#4a4a4a;
      font-family: Manrope, ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Arial, sans-serif;
      color:var(--ink); background:var(--bg);
      border:1px solid var(--line); border-radius:14px;
      padding:18px 18px 14px; max-width:1100px; margin:18px auto;
      box-shadow: 0 10px 40px rgba(0,0,0,.25);
    }
    .abx-lat-demo *{box-sizing:border-box}
    .abx-lat-demo h3{
      margin:0 0 4px; font-size:15px; font-weight:600; letter-spacing:.02em; color:var(--ink);
    }
    .abx-lat-demo .abx-sub{
      margin:0 0 12px; font-size:12px; color:var(--dim);
    }
    .abx-lat-demo svg.abx-diagram{width:100%; height:auto; display:block}
    .abx-lat-demo .abx-scope-wrap{
      margin-top:10px; background:var(--panel);
      border:1px solid var(--line); border-radius:10px;
      padding:10px 12px;
    }
    .abx-lat-demo .abx-scope-head{
      display:flex; justify-content:space-between; align-items:center; flex-wrap:wrap; gap:6px;
      font-size:11px; color:var(--dim); margin-bottom:6px;
      font-family: "Fira Code", ui-monospace, "SF Mono", Menlo, Consolas, monospace;
      letter-spacing:.05em;
    }
    .abx-lat-demo .abx-scope-head .abx-chip{
      display:inline-block; padding:2px 8px; border-radius:999px;
      background:#262626; color:var(--accent); border:1px solid #3a3a3a;
      font-size:10px;
    }
    .abx-lat-demo canvas.abx-scope{
      width:100%; height:240px; display:block; border-radius:6px;
      background:var(--scope-bg);
    }
    .abx-lat-demo .abx-footer{
      display:flex; flex-wrap:wrap; gap:14px;
      margin-top:10px; font-size:11px; color:var(--dim);
      font-family: "Fira Code", ui-monospace, "SF Mono", Menlo, Consolas, monospace;
    }
    .abx-lat-demo .abx-footer .abx-dot{
      display:inline-block; width:8px; height:8px; border-radius:50%;
      vertical-align:middle; margin-right:6px;
    }
  </style>

  <h3>Software-Commanded vs. TTL-Triggered LED Control</h3>
  <p class="abx-sub">A single event fires two paths simultaneously: the PC issues a serial command (software path), while a TTL line drives the controller directly (hardware path). The oscilloscope shows the resulting latency gap.</p>

  <svg class="abx-diagram" viewbox="0 0 1000 340" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
    <defs>
      <lineargradient id="abx2-pc-grad" x1="0" x2="0" y1="0" y2="1">
        <stop offset="0" stop-color="#262626"></stop>
        <stop offset="1" stop-color="#1c1c1c"></stop>
      </lineargradient>
      <lineargradient id="abx2-mcu-grad" x1="0" x2="0" y1="0" y2="1">
        <stop offset="0" stop-color="#262626"></stop>
        <stop offset="1" stop-color="#181818"></stop>
      </lineargradient>
      <lineargradient id="abx2-trig-grad" x1="0" x2="0" y1="0" y2="1">
        <stop offset="0" stop-color="#2a2620"></stop>
        <stop offset="1" stop-color="#181510"></stop>
      </lineargradient>
      <radialgradient id="abx2-led-glow-A" cx="50%" cy="50%" r="50%">
        <stop offset="0" stop-color="#B994FF" stop-opacity="1"></stop>
        <stop offset="0.45" stop-color="#8869c9" stop-opacity=".55"></stop>
        <stop offset="1" stop-color="#8869c9" stop-opacity="0"></stop>
      </radialgradient>
      <radialgradient id="abx2-led-glow-B" cx="50%" cy="50%" r="50%">
        <stop offset="0" stop-color="#7BDBD1" stop-opacity="1"></stop>
        <stop offset="0.45" stop-color="#3a9a91" stop-opacity=".55"></stop>
        <stop offset="1" stop-color="#3a9a91" stop-opacity="0"></stop>
      </radialgradient>
    </defs>

    <!-- ============== PC (top-left) ============== -->
    <g transform="translate(20,20)">
      <rect x="0" y="0" width="200" height="120" rx="10" fill="url(#abx2-pc-grad)" stroke="#3a3a3a"></rect>
      <rect x="10" y="10" width="180" height="85" rx="6" fill="#0F0F10" stroke="#3a3a3a"></rect>
      <g font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace" font-size="10" fill="#7BDBD1">
        <text x="18" y="28">$ event_handler</text>
        <text x="18" y="44" fill="#F0F0F0">on_trig: <tspan fill="#E6C458">send("led_on")</tspan></text>
        <text x="18" y="60" fill="#9a9a9a">→ serial.write()</text>
        <text x="18" y="76" fill="#9a9a9a">→ flush()</text>
        <!-- blinking "busy" cursor during latency window -->
        <text x="18" y="92" fill="#7BDBD1">ready<tspan id="abx2-cursor" fill="#7BDBD1"> _</tspan></text>
      </g>
      <text x="14" y="112" font-size="10" fill="#9a9a9a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">HOST PC</text>
      <!-- "busy" indicator dot, brightens during processing -->
      <circle cx="186" cy="110" r="4" fill="#7BDBD1">
        <animate attributename="opacity" values="0.25;0.25;1;1;0.25;0.25" keytimes="0;0.15;0.16;0.25;0.26;1" dur="4s" repeatcount="indefinite"></animate>
      </circle>
    </g>

    <!-- ============== Trigger event source (bottom-left) ============== -->
    <g transform="translate(20,210)">
      <rect x="0" y="0" width="200" height="110" rx="10" fill="url(#abx2-trig-grad)" stroke="#3a3a3a"></rect>
      <!-- button face -->
      <circle cx="50" cy="55" r="28" fill="#181510" stroke="#3a2c14" stroke-width="2"></circle>
      <circle cx="50" cy="55" r="20" fill="#20201c">
        <animate attributename="fill" values="#20201c;#20201c;#E6C458;#E6C458;#20201c;#20201c" keytimes="0;0.15;0.155;0.55;0.555;1" dur="4s" repeatcount="indefinite"></animate>
      </circle>
      <!-- press indicator ring -->
      <circle cx="50" cy="55" r="32" fill="none" stroke="#E6C458" stroke-width="2" opacity="0">
        <animate attributename="opacity" values="0;0;0.9;0;0" keytimes="0;0.15;0.155;0.20;1" dur="4s" repeatcount="indefinite"></animate>
        <animate attributename="r" values="32;32;38;48;48" keytimes="0;0.15;0.155;0.20;1" dur="4s" repeatcount="indefinite"></animate>
      </circle>
      <text x="95" y="45" font-size="11" fill="#F0F0F0" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">EVENT</text>
      <text x="95" y="60" font-size="10" fill="#9a9a9a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">e.g. sensor /</text>
      <text x="95" y="73" font-size="10" fill="#9a9a9a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">button / pulse</text>
      <text x="14" y="100" font-size="10" fill="#9a9a9a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">TRIGGER SOURCE</text>
    </g>

    <!-- ============== Trigger → PC notify line (dashed, slow) ============== -->
    <g>
      <path d="M120,210 L120,140" stroke="#7a7a7a" stroke-width="2" stroke-dasharray="4,3" fill="none"></path>
      <text x="128" y="180" font-size="10" fill="#9a9a9a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">notify</text>
    </g>

    <!-- ============== PC → Controller (UART, software path) ============== -->
    <g>
      <path d="M220,80 L350,100" stroke="var(--wire)" stroke-width="3" fill="none"></path>
      <text x="240" y="72" font-size="10" fill="#9a9a9a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">UART · 115200 · ~32 ms</text>
      <!-- UART packets - only visible during the latency window (0.15-0.25) -->
      <circle r="4" fill="#E6C458" opacity="0">
        <animate attributename="opacity" values="0;0;1;1;0;0" keytimes="0;0.16;0.17;0.24;0.25;1" dur="4s" repeatcount="indefinite"></animate>
        <animatemotion dur="4s" repeatcount="indefinite" keypoints="0;0;0;1;1;1" keytimes="0;0.16;0.17;0.24;0.25;1" calcmode="linear" path="M220,80 L350,100"></animatemotion>
      </circle>
      <circle r="4" fill="#E6C458" opacity="0">
        <animate attributename="opacity" values="0;0;1;1;0;0" keytimes="0;0.18;0.19;0.24;0.25;1" dur="4s" repeatcount="indefinite"></animate>
        <animatemotion dur="4s" repeatcount="indefinite" keypoints="0;0;0;1;1;1" keytimes="0;0.18;0.19;0.24;0.25;1" calcmode="linear" path="M220,80 L350,100"></animatemotion>
      </circle>
    </g>

    <!-- ============== Trigger → Controller (TTL direct, hardware path) ============== -->
    <g>
      <path d="M220,250 L350,235" stroke="var(--wire)" stroke-width="3" fill="none"></path>
      <text x="240" y="270" font-size="10" fill="#9a9a9a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">TTL · direct · ~1 µs</text>
      <!-- TTL line color flashes to indicate active high -->
      <rect x="220" y="246" width="130" height="6" rx="2" fill="#4a4a4a" transform="rotate(-6.6 220 249)">
        <animate attributename="fill" values="#4a4a4a;#4a4a4a;#7BDBD1;#7BDBD1;#4a4a4a;#4a4a4a" keytimes="0;0.15;0.155;0.555;0.556;1" dur="4s" repeatcount="indefinite"></animate>
      </rect>
    </g>

    <!-- ============== LED Controller (center, tall) ============== -->
    <g transform="translate(350,50)">
      <rect x="0" y="0" width="280" height="240" rx="10" fill="url(#abx2-mcu-grad)" stroke="#3a3a3a"></rect>
      <!-- pins -->
      <g fill="#9a9a9a">
        <rect x="-6" y="40" width="6" height="4"></rect><rect x="-6" y="100" width="6" height="4"></rect>
        <rect x="-6" y="160" width="6" height="4"></rect><rect x="-6" y="200" width="6" height="4"></rect>
        <rect x="280" y="40" width="6" height="4"></rect><rect x="280" y="100" width="6" height="4"></rect>
        <rect x="280" y="160" width="6" height="4"></rect><rect x="280" y="200" width="6" height="4"></rect>
      </g>
      <!-- title -->
      <text x="140" y="24" text-anchor="middle" font-size="13" fill="#F0F0F0" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">LED Controller</text>
      <line x1="20" y1="32" x2="260" y2="32" stroke="#3a3a3a"></line>

      <!-- Software path block (top half) -->
      <g transform="translate(20,42)">
        <rect x="0" y="0" width="240" height="74" rx="6" fill="#1e1e1e" stroke="#3a3a3a"></rect>
        <text x="10" y="16" font-size="10" fill="#B994FF" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">SOFTWARE PATH</text>
        <text x="10" y="34" font-size="10" fill="#9a9a9a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">UART RX → parse → exec</text>
        <text x="10" y="50" font-size="10" fill="#9a9a9a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">→ GPIO_WritePin(PA5)</text>
        <!-- processing indicator: brightens during 0.17 - 0.25 -->
        <rect x="160" y="42" width="70" height="10" rx="2" fill="#3a3a3a"></rect>
        <rect x="160" y="42" width="70" height="10" rx="2" fill="#B994FF" opacity="0">
          <animate attributename="opacity" values="0;0;0.8;0.8;0;0" keytimes="0;0.17;0.18;0.24;0.25;1" dur="4s" repeatcount="indefinite"></animate>
        </rect>
        <text x="10" y="66" font-size="9" fill="#7a7a7a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">parse + dispatch</text>
      </g>

      <!-- Hardware path block (bottom half) -->
      <g transform="translate(20,134)">
        <rect x="0" y="0" width="240" height="74" rx="6" fill="#1e1e1e" stroke="#3a3a3a"></rect>
        <text x="10" y="16" font-size="10" fill="#7BDBD1" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">HARDWARE PATH</text>
        <text x="10" y="34" font-size="10" fill="#9a9a9a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">TTL input → buffer →</text>
        <text x="10" y="50" font-size="10" fill="#9a9a9a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">→ GPIO_OUT (PA6)</text>
        <!-- "instant" passthrough — flashes with the TTL line -->
        <rect x="160" y="42" width="70" height="10" rx="2" fill="#3a3a3a"></rect>
        <rect x="160" y="42" width="70" height="10" rx="2" fill="#7BDBD1" opacity="0">
          <animate attributename="opacity" values="0;0;0.85;0.85;0;0" keytimes="0;0.15;0.155;0.555;0.556;1" dur="4s" repeatcount="indefinite"></animate>
        </rect>
        <text x="10" y="66" font-size="9" fill="#7a7a7a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">direct passthrough</text>
      </g>

      <text x="20" y="226" font-size="9" fill="#7a7a7a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">Single MCU · two control inputs</text>
    </g>

    <!-- ============== Output wires from Controller to LEDs ============== -->
    <g>
      <path d="M630,100 L700,120" stroke="var(--wire)" stroke-width="3" fill="none"></path>
      <text x="640" y="92" font-size="10" fill="#9a9a9a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">GPIO PA5</text>
      <rect x="630" y="105" width="70" height="6" rx="2" fill="#3a3a3a" transform="rotate(15.9 630 108)">
        <animate attributename="fill" values="#3a3a3a;#3a3a3a;#B994FF;#B994FF;#3a3a3a;#3a3a3a" keytimes="0;0.25;0.255;0.65;0.655;1" dur="4s" repeatcount="indefinite"></animate>
      </rect>
    </g>
    <g>
      <path d="M630,235 L700,250" stroke="var(--wire)" stroke-width="3" fill="none"></path>
      <text x="640" y="276" font-size="10" fill="#9a9a9a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">GPIO PA6</text>
      <rect x="630" y="240" width="70" height="6" rx="2" fill="#3a3a3a" transform="rotate(12 630 243)">
        <animate attributename="fill" values="#3a3a3a;#3a3a3a;#7BDBD1;#7BDBD1;#3a3a3a;#3a3a3a" keytimes="0;0.155;0.16;0.555;0.556;1" dur="4s" repeatcount="indefinite"></animate>
      </rect>
    </g>

    <!-- ============== LED A (software path) — top right ============== -->
    <g transform="translate(710,55)">
      <circle cx="55" cy="65" r="55" fill="url(#abx2-led-glow-A)" opacity="0">
        <animate attributename="opacity" values="0;0;1;1;0;0" keytimes="0;0.25;0.255;0.65;0.655;1" dur="4s" repeatcount="indefinite"></animate>
      </circle>
      <ellipse cx="55" cy="65" rx="26" ry="32" fill="#141414" stroke="#3a3a3a" stroke-width="2"></ellipse>
      <ellipse cx="55" cy="65" rx="20" ry="26" fill="#1e1e1e">
        <animate attributename="fill" values="#1e1e1e;#1e1e1e;#B994FF;#B994FF;#1e1e1e;#1e1e1e" keytimes="0;0.25;0.255;0.65;0.655;1" dur="4s" repeatcount="indefinite"></animate>
      </ellipse>
      <ellipse cx="48" cy="55" rx="5" ry="9" fill="#fff" opacity="0.18"></ellipse>
      <line x1="46" y1="93" x2="46" y2="110" stroke="#9a9a9a" stroke-width="2"></line>
      <line x1="64" y1="93" x2="64" y2="110" stroke="#9a9a9a" stroke-width="2"></line>
      <text x="55" y="130" text-anchor="middle" font-size="11" fill="#B994FF" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">LED A</text>
      <text x="55" y="144" text-anchor="middle" font-size="9" fill="#9a9a9a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">software</text>
    </g>

    <!-- ============== LED B (hardware path) — bottom right ============== -->
    <g transform="translate(710,190)">
      <circle cx="55" cy="65" r="55" fill="url(#abx2-led-glow-B)" opacity="0">
        <animate attributename="opacity" values="0;0;1;1;0;0" keytimes="0;0.155;0.16;0.555;0.556;1" dur="4s" repeatcount="indefinite"></animate>
      </circle>
      <ellipse cx="55" cy="65" rx="26" ry="32" fill="#161616" stroke="#3a3a3a" stroke-width="2"></ellipse>
      <ellipse cx="55" cy="65" rx="20" ry="26" fill="#161616">
        <animate attributename="fill" values="#161616;#161616;#7BDBD1;#7BDBD1;#161616;#161616" keytimes="0;0.155;0.16;0.555;0.556;1" dur="4s" repeatcount="indefinite"></animate>
      </ellipse>
      <ellipse cx="48" cy="55" rx="5" ry="9" fill="#fff" opacity="0.18"></ellipse>
      <line x1="46" y1="93" x2="46" y2="110" stroke="#9a9a9a" stroke-width="2"></line>
      <line x1="64" y1="93" x2="64" y2="110" stroke="#9a9a9a" stroke-width="2"></line>
      <text x="55" y="130" text-anchor="middle" font-size="11" fill="#7BDBD1" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">LED B</text>
      <text x="55" y="144" text-anchor="middle" font-size="9" fill="#9a9a9a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">hardware</text>
    </g>
  </svg>

  <div class="abx-scope-wrap" aria-hidden="true">
    <div class="abx-scope-head">
      <span>OSCILLOSCOPE · 3-CH · ALIGNED TIMEBASE</span>
      <span><span class="abx-chip">RUN</span>   1V / div  ·  10 ms / div</span>
    </div>
    <canvas class="abx-scope" width="1200" height="480"></canvas>
  </div>

  <div class="abx-footer">
    <span><span class="abx-dot" style="background:#E6C458"></span>CH1 — Trigger event</span>
    <span><span class="abx-dot" style="background:#7BDBD1"></span>CH2 — TTL → GPIO PA6 (hardware path)</span>
    <span><span class="abx-dot" style="background:#B994FF"></span>CH3 — UART cmd → GPIO PA5 (software path)</span>
    <span>Δt<sub>SW</sub> ≈ 32 ms  ·  Δt<sub>TTL</sub> ≈ 1 µs</span>
  </div>

  <script>
  (function(){
    var root = document.currentScript && document.currentScript.parentNode;
    if(!root) return;
    var canvas = root.querySelector('canvas.abx-scope');
    if(!canvas) return;
    var ctx = canvas.getContext('2d');

    function resize(){
      var rect = canvas.getBoundingClientRect();
      var dpr = window.devicePixelRatio || 1;
      canvas.width  = Math.max(400, Math.floor(rect.width * dpr));
      canvas.height = Math.max(180, Math.floor(rect.height * dpr));
    }
    resize();
    window.addEventListener('resize', resize, {passive:true});

    // ---- Cycle = 4s. Normalized 0-1 timing must match the SVG keyTimes. ----
    // Trigger HIGH:   0.150 → 0.550
    // TTL output:     0.155 → 0.555  (essentially immediate)
    // SW output:      0.250 → 0.650  (delayed)
    function pulse(t, on, off){
      t = ((t % 1) + 1) % 1;
      // 1ms-ish rise/fall on screen for clean square corners
      var R = 0.004;
      if(t < on)               return 0;
      if(t < on + R)           return (t - on) / R;
      if(t < off)              return 1;
      if(t < off + R)          return 1 - (t - off) / R;
      return 0;
    }
    function trigAt(t){ return pulse(t, 0.150, 0.550); }
    function ttlAt (t){ return pulse(t, 0.155, 0.555); }
    function swAt  (t){ return pulse(t, 0.250, 0.650); }

    var CYCLE_MS  = 4000;
    var WINDOW_MS = 4000; // one full cycle visible
    var start = performance.now();

    // Pixel positions for each channel inside the scope canvas
    function laneRect(canvasH, idx){
      // 3 lanes evenly split, with padding
      var pad = 18 * (window.devicePixelRatio||1);
      var h   = (canvasH - pad*2) / 3;
      var top = pad + h*idx;
      return { top: top, bot: top + h - 4, mid: top + h/2 };
    }

    function draw(now){
      var w = canvas.width, h = canvas.height;
      var DPR = window.devicePixelRatio || 1;

      ctx.fillStyle = '#0F0F10';
      ctx.fillRect(0,0,w,h);

      // grid
      ctx.strokeStyle = '#2a2a2a';
      ctx.lineWidth = 1;
      ctx.beginPath();
      for(var i=1;i<10;i++){
        var x = Math.round(i*w/10) + 0.5;
        ctx.moveTo(x,0); ctx.lineTo(x,h);
      }
      for(var j=1;j<9;j++){
        var y = Math.round(j*h/9) + 0.5;
        ctx.moveTo(0,y); ctx.lineTo(w,y);
      }
      ctx.stroke();

      // Lane dividers
      ctx.strokeStyle = '#2a2a2a';
      ctx.beginPath();
      for(var k=1;k<3;k++){
        var ly = Math.round(k*h/3) + 0.5;
        ctx.moveTo(0,ly); ctx.lineTo(w,ly);
      }
      ctx.stroke();

      var elapsed = now - start;
      var samples = Math.min(w, 1400);

      var fns   = [trigAt, ttlAt, swAt];
      var clrs  = ['#E6C458','#7BDBD1','#B994FF'];
      var names = ['CH1  TRIGGER','CH2  TTL → GPIO PA6','CH3  UART → GPIO PA5'];

      ctx.font = (12 * DPR) + 'px ui-monospace, Menlo, Consolas, monospace';
      ctx.textBaseline = 'middle';

      for(var ch=0; ch<3; ch++){
        var lane = laneRect(h, ch);
        var hi = lane.top + 12*DPR;
        var lo = lane.bot - 6*DPR;

        // baseline + label
        ctx.fillStyle = '#6a6a6a';
        ctx.fillText(names[ch], 10*DPR, lane.top + 12*DPR);
        ctx.fillStyle = '#4a4a4a';
        ctx.fillText('0V', 10*DPR, lo - 4*DPR);

        // 0V line
        ctx.strokeStyle = '#3a3a3a';
        ctx.lineWidth = 1;
        ctx.beginPath();
        ctx.moveTo(0, lo+0.5); ctx.lineTo(w, lo+0.5);
        ctx.stroke();

        // trace
        ctx.lineWidth = 2 * DPR;
        ctx.strokeStyle = clrs[ch];
        ctx.shadowBlur = 8;
        ctx.shadowColor = clrs[ch] + 'cc';
        ctx.beginPath();
        for(var s=0; s<=samples; s++){
          var px = (s/samples) * w;
          var tAbs = elapsed - (1 - s/samples) * WINDOW_MS;
          var v = fns[ch](tAbs / CYCLE_MS);
          var py = lo + (hi - lo) * v;
          if(s===0) ctx.moveTo(px, py); else ctx.lineTo(px, py);
        }
        ctx.stroke();
        ctx.shadowBlur = 0;
      }

      // Δt annotation between CH1 rising edge and CH3 rising edge
      // Find their x positions in the current window
      var tNow = (elapsed % CYCLE_MS) / CYCLE_MS;
      function edgeX(edgeT){
        // edgeT in normalized cycle. Window covers tNow - 1 to tNow.
        // Most recent occurrence of edgeT in the window:
        var diff = tNow - edgeT;
        if(diff < 0) diff += 1;
        if(diff > 1) return -1;
        return w - diff * w;
      }
      var x1 = edgeX(0.150); // trigger rise
      var x3 = edgeX(0.250); // sw rise
      if(x1 > 0 && x3 > 0 && x3 > x1){
        var yA = laneRect(h, 0).top + 12*DPR;
        var yC = laneRect(h, 2).top + 12*DPR;
        // dotted verticals
        ctx.setLineDash([4*DPR, 4*DPR]);
        ctx.strokeStyle = 'rgba(255,255,255,0.35)';
        ctx.lineWidth = 1;
        ctx.beginPath();
        ctx.moveTo(x1+0.5, yA); ctx.lineTo(x1+0.5, h);
        ctx.moveTo(x3+0.5, yC); ctx.lineTo(x3+0.5, h);
        ctx.stroke();
        ctx.setLineDash([]);

        // bracket + label across the bottom
        var yLab = h - 18*DPR;
        ctx.strokeStyle = '#E6C458';
        ctx.lineWidth = 1.5*DPR;
        ctx.beginPath();
        ctx.moveTo(x1, yLab); ctx.lineTo(x3, yLab);
        ctx.moveTo(x1, yLab - 5*DPR); ctx.lineTo(x1, yLab + 5*DPR);
        ctx.moveTo(x3, yLab - 5*DPR); ctx.lineTo(x3, yLab + 5*DPR);
        ctx.stroke();

        ctx.fillStyle = '#E6C458';
        ctx.font = 'bold ' + (12*DPR) + 'px ui-monospace, Menlo, Consolas, monospace';
        ctx.textAlign = 'center';
        ctx.textBaseline = 'bottom';
        ctx.fillText('Δt ≈ 32 ms', (x1+x3)/2, yLab - 6*DPR);
        ctx.textAlign = 'start';
        ctx.textBaseline = 'middle';
      }

      // right-edge sweep marker
      ctx.strokeStyle = 'rgba(255,215,107,0.45)';
      ctx.lineWidth = 1;
      ctx.beginPath();
      ctx.moveTo(w-0.5, 0); ctx.lineTo(w-0.5, h);
      ctx.stroke();

      requestAnimationFrame(draw);
    }
    requestAnimationFrame(draw);
  })();
  </script>
</div>

<p class="wp-block-paragraph">For the example, the yellow line is the camera output, or trigger output, the teal line is the LED B brightness result, and the purple line is the software-only reaction. In this example, we can see the delay (latency) of the response, yet in most software, the purple line will illuminate <em>before</em> the camera exposure. What this means for research is your cells are being exposed to excitation energy, and you aren't even collecting that light onto a sensor! So, we are in effect just cooking cells for fun. NOT GOOD! </p>

<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="640" height="480" src="https://austinblanco.com/assets/posts/INS_00-1-640.webp" alt="Oscilloscope reading TTL from PCO camera" class="wp-image-3414" srcset="https://austinblanco.com/assets/posts/INS_00-1-480.webp 480w, https://austinblanco.com/assets/posts/INS_00-1-640.webp 640w" sizes="(max-width: 767px) calc(100vw - 32px), 640px"><figcaption class="wp-element-caption">Oscilloscope reading TTL from PCO camera</figcaption></figure>

<h2 id="tgs">Using the Triggerscope for State Control of Devices</h2>

<p class="wp-block-paragraph">This is great for a single LED, but how can we control more than 1 channel? For this, we would use a logic controller like the Triggerscope Mini! With the mini, the camera expose line is routed to it's TRIG input, and up to 4 output channels are connected to it's TTL control pins. </p>

<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="480" height="640" src="https://austinblanco.com/assets/posts/INS_00-4-480.webp" alt="Triggerscope Mini with Tetrem Controller for intensity" class="wp-image-3411"><figcaption class="wp-element-caption">Triggerscope Mini with Tetrem Controller for intensity</figcaption></figure>

<p class="wp-block-paragraph">With this done, we can assign an active line using the triggerscope. This provides fast easy state switching, and can even be done over multiple devices. Doing this will mean, for this example, we won't be moving our filter cube device. Instead, we would use a multi-band dichroic. However we can switch the LED excitation, and that's how we will gain some speed here. </p>

<figure class="wp-block-image size-full"><video muted loop playsinline preload="none" controls poster="https://austinblanco.com/assets/posts/2-channel-10-time-no-stream-poster-1024.webp" width="1280" height="720" data-inview="" aria-label="Image from “Understanding TTL control, Blanking &amp; Device Streaming, and why it matters for your research.”"><source src="https://austinblanco.com/assets/posts/2-channel-10-time-no-stream.mp4" type="video/mp4"></video></figure>

<p class="wp-block-paragraph">In the example above, we see a high speed switch. This is simply by telling the Triggerscope Mini to change channels, instead of the LED. But - there is <em>still more to do to improve our speed!</em></p>

<h2 id="streaming">Streaming for the Win</h2>

<p class="wp-block-paragraph">The above example uses the triggerscope via USB, and while we only have 1 device, we are still using a "set + capture + set + capture" type of sequence. What if we just told the camera, "run as FAST as you can." Then, we used the output signal from the camera to count frames, and we told the triggerscope, "every other frame, switch from LED 1 to LED 2, then back to 1". <strong>THIS</strong> is the power of "Streaming", or also called "Sequencing". With this capability, we pre-load stuff to do into the triggerscope. Then, we arm the triggerscope. With that done, our triggerscope is sitting, locked into a state, simply waiting to receive camera frame TTL inputs. Below is a graphical depiction of this technique. </p>

<p class="wp-block-paragraph">Now, we tell the camera, "Give us 2 channels * 10 frames = 20 pictures, and do so as fast as possible". In effect, "give us video of 20 frames". </p>

<p class="wp-block-paragraph">In this method, there is zero control overhead. The camera free-runs, the triggerscope switches, and the LED reacts. Below is a video example of this, note also there is a small in-view live feed from a web camera (for all these video samples), and you can see that, indeed, streaming is crazy fast! For the below example, we've tied the camera "transfer" line into the triggerscope. This way, the triggerscope recieves a brief pulse before capture occurs. We enable on the "low" side of the signal, and illuminate. You can see for the CMOS style readout on the left of the example, once readout is done, the channel switches. </p>

<!-- ============================================================
  Trigger Switch — Camera → Triggerscope → LED Controller (LED1/LED2)
  Camera frame-complete pulse drives a Triggerscope (ARC) which
  alternates TTL1 / TTL2 outputs to the LED Controller, sequencing
  illumination per frame.
  Self-contained inline HTML — drop into a WordPress Custom HTML block.
============================================================ -->
<div class="abx-tsw-demo" role="img" aria-label="Animation: a camera&#x27;s frame-complete pulse drives a Triggerscope, which alternates TTL outputs to switch between LED1 and LED2 each frame.">
  <style>
    .abx-tsw-demo{
      --bg:#1B1B1B; --panel:#252525; --line:#3a3a3a;
      --ink:#F0F0F0; --dim:#9a9a9a;
      --accent:#7BDBD1; --warm:#E6C458; --hot:#E88BB8;
      --scope-bg:#0F0F10; --scope-grid:#2a2a2a;
      --trace-cam:#E6C458;   /* camera frame-complete */
      --trace-ttl1:#7BDBD1;  /* TTL1 / LED1 */
      --trace-ttl2:#E88BB8;  /* TTL2 / LED2 */
      --wire:#4a4a4a;
      font-family: Manrope, ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Arial, sans-serif;
      color:var(--ink); background:var(--bg);
      border:1px solid var(--line); border-radius:14px;
      padding:18px 18px 14px; max-width:1100px; margin:18px auto;
      box-shadow: 0 10px 40px rgba(0,0,0,.25);
    }
    .abx-tsw-demo *{box-sizing:border-box}
    .abx-tsw-demo h3{margin:0 0 4px; font-size:15px; font-weight:600; letter-spacing:.02em; color:var(--ink);}
    .abx-tsw-demo .abx-sub{margin:0 0 12px; font-size:12px; color:var(--dim);}
    .abx-tsw-demo svg.abx-diagram{width:100%; height:auto; display:block}
    .abx-tsw-demo .abx-scope-wrap{margin-top:10px; background:var(--panel); border:1px solid var(--line); border-radius:10px; padding:10px 12px;}
    .abx-tsw-demo .abx-scope-head{display:flex; justify-content:space-between; align-items:center; flex-wrap:wrap; gap:6px; font-size:11px; color:var(--dim); margin-bottom:6px; font-family: "Fira Code", ui-monospace, "SF Mono", Menlo, Consolas, monospace; letter-spacing:.05em;}
    .abx-tsw-demo .abx-scope-head .abx-chip{display:inline-block; padding:2px 8px; border-radius:999px; background:#262626; color:var(--accent); border:1px solid #3a3a3a; font-size:10px;}
    .abx-tsw-demo canvas.abx-scope{width:100%; height:230px; display:block; border-radius:6px; background:var(--scope-bg);}
    .abx-tsw-demo .abx-footer{display:flex; flex-wrap:wrap; gap:14px; margin-top:10px; font-size:11px; color:var(--dim); font-family: "Fira Code", ui-monospace, "SF Mono", Menlo, Consolas, monospace;}
    .abx-tsw-demo .abx-footer .abx-dot{display:inline-block; width:8px; height:8px; border-radius:50%; vertical-align:middle; margin-right:6px;}
  </style>

  <h3>Trigger Switch — Camera-Driven LED Sequencing via Triggerscope</h3>
  <p class="abx-sub">Each time the camera completes a frame, it emits a TTL pulse. The Triggerscope (Advanced Research Consulting) uses that pulse to advance its state machine and re-route its outputs — alternating TTL1 and TTL2 to the LED Controller so LED1 and LED2 illuminate consecutive frames.</p>

  <svg class="abx-diagram" viewbox="0 0 1000 320" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
    <defs>
      <lineargradient id="abxT-cam-grad" x1="0" x2="0" y1="0" y2="1">
        <stop offset="0" stop-color="#262626"></stop><stop offset="1" stop-color="#1c1c1c"></stop>
      </lineargradient>
      <lineargradient id="abxT-ts-grad" x1="0" x2="0" y1="0" y2="1">
        <stop offset="0" stop-color="#262626"></stop><stop offset="1" stop-color="#181818"></stop>
      </lineargradient>
      <lineargradient id="abxT-ledc-grad" x1="0" x2="0" y1="0" y2="1">
        <stop offset="0" stop-color="#262626"></stop><stop offset="1" stop-color="#181818"></stop>
      </lineargradient>
      <radialgradient id="abxT-led1-glow" cx="50%" cy="50%" r="50%">
        <stop offset="0" stop-color="#7BDBD1" stop-opacity="1"></stop>
        <stop offset="0.45" stop-color="#3a9a91" stop-opacity=".55"></stop>
        <stop offset="1" stop-color="#3a9a91" stop-opacity="0"></stop>
      </radialgradient>
      <radialgradient id="abxT-led2-glow" cx="50%" cy="50%" r="50%">
        <stop offset="0" stop-color="#E88BB8" stop-opacity="1"></stop>
        <stop offset="0.45" stop-color="#a0567a" stop-opacity=".55"></stop>
        <stop offset="1" stop-color="#a0567a" stop-opacity="0"></stop>
      </radialgradient>
      <lineargradient id="abxT-sensor-fill" x1="0" x2="1" y1="0" y2="0">
        <stop offset="0" stop-color="#7BDBD1" stop-opacity="0.55"></stop>
        <stop offset="1" stop-color="#7BDBD1" stop-opacity="0"></stop>
      </lineargradient>
    </defs>

    <!-- =============== Camera (left) =============== -->
    <g transform="translate(20,40)">
      <rect x="0" y="0" width="240" height="200" rx="10" fill="url(#abxT-cam-grad)" stroke="#3a3a3a"></rect>
      <!-- camera body label -->
      <text x="120" y="22" text-anchor="middle" font-size="12" fill="#F0F0F0" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">Camera (sCMOS)</text>
      <line x1="14" y1="30" x2="226" y2="30" stroke="#3a3a3a"></line>

      <!-- sensor / readout viewport -->
      <rect x="20" y="42" width="148" height="100" rx="4" fill="#0F0F10" stroke="#3a3a3a"></rect>
      <text x="94" y="58" text-anchor="middle" font-size="9" fill="#7a7a7a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">SENSOR · 2048×2048</text>
      <!-- moving readout bar (frame 1 acquisition, then resets) -->
      <rect x="20" y="62" width="0" height="78" fill="url(#abxT-sensor-fill)">
        <animate attributename="width" values="0;148;148;0;0;148;148;0" keytimes="0;0.45;0.47;0.471;0.50;0.95;0.97;1" dur="4s" repeatcount="indefinite"></animate>
      </rect>
      <!-- a couple sample image hints -->
      <g stroke="#3a3a3a" stroke-width="1" fill="none" opacity="0.5">
        <circle cx="60" cy="90" r="10"></circle><circle cx="100" cy="105" r="6"></circle>
        <circle cx="130" cy="85" r="8"></circle><circle cx="80" cy="125" r="4"></circle>
      </g>

      <!-- frame counter -->
      <g transform="translate(20,152)">
        <rect x="0" y="0" width="148" height="28" rx="4" fill="#1e1e1e" stroke="#3a3a3a"></rect>
        <text x="8" y="18" font-size="10" fill="#9a9a9a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">FRAME</text>
        <!-- frame # 1 (visible during frame 1 window) -->
        <text x="80" y="18" font-size="11" fill="#7BDBD1" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace" opacity="1">
          <animate attributename="opacity" values="1;1;0;0;1;1" keytimes="0;0.47;0.471;0.97;0.971;1" dur="4s" repeatcount="indefinite"></animate>
          N
        </text>
        <!-- frame # 2 -->
        <text x="80" y="18" font-size="11" fill="#E88BB8" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace" opacity="0">
          <animate attributename="opacity" values="0;0;1;1;0;0" keytimes="0;0.47;0.471;0.97;0.971;1" dur="4s" repeatcount="indefinite"></animate>
          N+1
        </text>
        <text x="115" y="18" font-size="10" fill="#9a9a9a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">· 30 Hz</text>
      </g>

      <!-- lens cylinder on right side -->
      <g transform="translate(170,42)">
        <rect x="0" y="40" width="50" height="40" rx="4" fill="#1e1e1e" stroke="#3a3a3a"></rect>
        <circle cx="40" cy="60" r="14" fill="#0F0F10" stroke="#3a3a3a"></circle>
        <circle cx="40" cy="60" r="8" fill="#1e1e1e"></circle>
        <circle cx="38" cy="58" r="3" fill="#7BDBD1" opacity="0.6"></circle>
      </g>

      <!-- TRIG OUT port -->
      <g transform="translate(20,186)">
        <rect x="0" y="0" width="200" height="14" rx="3" fill="#1e1e1e" stroke="#3a3a3a"></rect>
        <circle cx="14" cy="7" r="3.5" fill="#20201c">
          <animate attributename="fill" values="#20201c;#20201c;#E6C458;#E6C458;#20201c;#20201c;#E6C458;#E6C458;#20201c" keytimes="0;0.45;0.455;0.47;0.475;0.95;0.955;0.97;1" dur="4s" repeatcount="indefinite"></animate>
        </circle>
        <text x="24" y="10" font-size="9" fill="#9a9a9a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">TRIG OUT · frame complete</text>
      </g>
    </g>

    <!-- =============== Camera → Triggerscope wire =============== -->
    <g>
      <path d="M260,233 L370,150" stroke="var(--wire)" stroke-width="3" fill="none"></path>
      <text x="262" y="248" font-size="9" fill="#7a7a7a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">TTL pulse</text>
      <!-- traveling pulse — fires at frame-complete moments -->
      <circle r="4" fill="#E6C458" opacity="0">
        <animate attributename="opacity" values="0;0;1;1;0;0" keytimes="0;0.45;0.455;0.47;0.475;1" dur="4s" repeatcount="indefinite"></animate>
        <animatemotion dur="4s" repeatcount="indefinite" keypoints="0;0;0;1;1;1" keytimes="0;0.45;0.455;0.47;0.475;1" calcmode="linear" path="M260,233 L370,150"></animatemotion>
      </circle>
      <circle r="4" fill="#E6C458" opacity="0">
        <animate attributename="opacity" values="0;0;1;1;0;0" keytimes="0;0.95;0.955;0.97;0.975;1" dur="4s" repeatcount="indefinite"></animate>
        <animatemotion dur="4s" repeatcount="indefinite" keypoints="0;0;0;1;1;1" keytimes="0;0.95;0.955;0.97;0.975;1" calcmode="linear" path="M260,233 L370,150"></animatemotion>
      </circle>
    </g>

    <!-- =============== Triggerscope (center) =============== -->
    <g transform="translate(370,40)">
      <rect x="0" y="0" width="260" height="200" rx="10" fill="url(#abxT-ts-grad)" stroke="#3a3a3a"></rect>
      <!-- branding -->
      <text x="130" y="22" text-anchor="middle" font-size="13" fill="#F0F0F0" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">Triggerscope</text>
      <text x="130" y="36" text-anchor="middle" font-size="9" fill="#9a9a9a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">Advanced Research Consulting</text>
      <line x1="14" y1="42" x2="246" y2="42" stroke="#3a3a3a"></line>

      <!-- CAM IN port (left) -->
      <g transform="translate(0,108)">
        <rect x="0" y="0" width="6" height="6" fill="#9a9a9a"></rect>
        <text x="10" y="-2" font-size="9" fill="#9a9a9a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">CAM IN</text>
      </g>

      <!-- state machine display -->
      <g transform="translate(20,54)">
        <rect x="0" y="0" width="220" height="58" rx="6" fill="#02060f" stroke="#3a3a3a"></rect>
        <text x="10" y="16" font-size="9" fill="#7a7a7a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">SEQUENCE STATE</text>
        <!-- state 1 -->
        <g opacity="1">
          <animate attributename="opacity" values="1;1;0;0;1;1" keytimes="0;0.47;0.471;0.97;0.971;1" dur="4s" repeatcount="indefinite"></animate>
          <text x="40" y="46" font-size="26" fill="#7BDBD1" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace" font-weight="bold">STATE 1</text>
          <text x="135" y="46" font-size="11" fill="#9a9a9a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">→ TTL1 active</text>
        </g>
        <!-- state 2 -->
        <g opacity="0">
          <animate attributename="opacity" values="0;0;1;1;0;0" keytimes="0;0.47;0.471;0.97;0.971;1" dur="4s" repeatcount="indefinite"></animate>
          <text x="40" y="46" font-size="26" fill="#E88BB8" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace" font-weight="bold">STATE 2</text>
          <text x="135" y="46" font-size="11" fill="#9a9a9a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">→ TTL2 active</text>
        </g>
      </g>

      <!-- routing matrix illustration -->
      <g transform="translate(20,120)">
        <rect x="0" y="0" width="220" height="56" rx="4" fill="#1e1e1e" stroke="#3a3a3a"></rect>
        <text x="8" y="14" font-size="9" fill="#7a7a7a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">ROUTE: CAM IN → {TTL1, TTL2} alternating</text>
        <!-- TTL1 row -->
        <text x="8" y="32" font-size="10" fill="#9a9a9a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">TTL1</text>
        <rect x="40" y="24" width="170" height="10" rx="2" fill="#3a3a3a"></rect>
        <rect x="40" y="24" width="170" height="10" rx="2" fill="#7BDBD1" opacity="0.85">
          <animate attributename="opacity" values="0.85;0.85;0;0;0.85;0.85" keytimes="0;0.47;0.471;0.97;0.971;1" dur="4s" repeatcount="indefinite"></animate>
        </rect>
        <!-- TTL2 row -->
        <text x="8" y="50" font-size="10" fill="#9a9a9a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">TTL2</text>
        <rect x="40" y="42" width="170" height="10" rx="2" fill="#3a3a3a"></rect>
        <rect x="40" y="42" width="170" height="10" rx="2" fill="#E88BB8" opacity="0">
          <animate attributename="opacity" values="0;0;0.85;0.85;0;0" keytimes="0;0.47;0.471;0.97;0.971;1" dur="4s" repeatcount="indefinite"></animate>
        </rect>
      </g>

      <!-- TTL OUT ports on right edge -->
      <g transform="translate(254,68)">
        <rect x="0" y="0" width="6" height="6" fill="#9a9a9a"></rect>
        <text x="-58" y="-2" font-size="9" fill="#7BDBD1" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">TTL OUT 1</text>
      </g>
      <g transform="translate(254,170)">
        <rect x="0" y="0" width="6" height="6" fill="#9a9a9a"></rect>
        <text x="-58" y="-2" font-size="9" fill="#E88BB8" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">TTL OUT 2</text>
      </g>

      <text x="14" y="194" font-size="9" fill="#7a7a7a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">Hardware sequencer · sub-µs latency</text>
    </g>

    <!-- =============== Triggerscope → LED Controller wires =============== -->
    <g>
      <!-- TTL1 line -->
      <path d="M630,74 L740,90" stroke="var(--wire)" stroke-width="3" fill="none"></path>
      <rect x="630" y="78" width="110" height="6" rx="2" fill="#3a3a3a" transform="rotate(8.3 630 81)">
        <animate attributename="fill" values="#7BDBD1;#7BDBD1;#3a3a3a;#3a3a3a;#7BDBD1;#7BDBD1" keytimes="0;0.47;0.471;0.97;0.971;1" dur="4s" repeatcount="indefinite"></animate>
      </rect>
      <!-- TTL2 line -->
      <path d="M630,176 L740,170" stroke="var(--wire)" stroke-width="3" fill="none"></path>
      <rect x="630" y="171" width="110" height="6" rx="2" fill="#3a3a3a" transform="rotate(-3.1 630 174)">
        <animate attributename="fill" values="#3a3a3a;#3a3a3a;#E88BB8;#E88BB8;#3a3a3a;#3a3a3a" keytimes="0;0.47;0.471;0.97;0.971;1" dur="4s" repeatcount="indefinite"></animate>
      </rect>
    </g>

    <!-- =============== LED Controller (right of Triggerscope) =============== -->
    <g transform="translate(740,40)">
      <rect x="0" y="0" width="160" height="200" rx="10" fill="url(#abxT-ledc-grad)" stroke="#3a3a3a"></rect>
      <text x="80" y="22" text-anchor="middle" font-size="12" fill="#F0F0F0" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">LED Controller</text>
      <text x="80" y="36" text-anchor="middle" font-size="9" fill="#7BDBD1" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">MODE · TTL routing</text>
      <line x1="14" y1="42" x2="146" y2="42" stroke="#3a3a3a"></line>

      <!-- TTL inputs labels -->
      <g transform="translate(-6,46)">
        <rect x="0" y="0" width="6" height="6" fill="#9a9a9a"></rect>
        <text x="12" y="-2" font-size="9" fill="#7BDBD1" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">IN1</text>
      </g>
      <g transform="translate(-6,128)">
        <rect x="0" y="0" width="6" height="6" fill="#9a9a9a"></rect>
        <text x="12" y="-2" font-size="9" fill="#E88BB8" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">IN2</text>
      </g>

      <!-- channel 1 block -->
      <g transform="translate(20,54)">
        <rect x="0" y="0" width="120" height="58" rx="4" fill="#1e1e1e" stroke="#3a3a3a"></rect>
        <text x="60" y="16" text-anchor="middle" font-size="10" fill="#7BDBD1" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">CH1 → LED1</text>
        <rect x="10" y="24" width="100" height="10" rx="2" fill="#3a3a3a"></rect>
        <rect x="10" y="24" width="100" height="10" rx="2" fill="#7BDBD1" opacity="0.85">
          <animate attributename="opacity" values="0.85;0.85;0;0;0.85;0.85" keytimes="0;0.47;0.471;0.97;0.971;1" dur="4s" repeatcount="indefinite"></animate>
        </rect>
        <text x="10" y="48" font-size="9" fill="#7a7a7a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">GPIO PA5 mirror</text>
      </g>

      <!-- channel 2 block -->
      <g transform="translate(20,134)">
        <rect x="0" y="0" width="120" height="58" rx="4" fill="#1e1e1e" stroke="#3a3a3a"></rect>
        <text x="60" y="16" text-anchor="middle" font-size="10" fill="#E88BB8" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">CH2 → LED2</text>
        <rect x="10" y="24" width="100" height="10" rx="2" fill="#3a3a3a"></rect>
        <rect x="10" y="24" width="100" height="10" rx="2" fill="#E88BB8" opacity="0">
          <animate attributename="opacity" values="0;0;0.85;0.85;0;0" keytimes="0;0.47;0.471;0.97;0.971;1" dur="4s" repeatcount="indefinite"></animate>
        </rect>
        <text x="10" y="48" font-size="9" fill="#7a7a7a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">GPIO PA6 mirror</text>
      </g>
    </g>

    <!-- =============== LED outputs (right edge, two LEDs) =============== -->
    <!-- LED1 (top-right of controller area) -->
    <g transform="translate(910,55)">
      <circle cx="0" cy="40" r="40" fill="url(#abxT-led1-glow)" opacity="0">
        <animate attributename="opacity" values="1;1;0;0;1;1" keytimes="0;0.47;0.471;0.97;0.971;1" dur="4s" repeatcount="indefinite"></animate>
      </circle>
      <ellipse cx="0" cy="40" rx="18" ry="22" fill="#161616" stroke="#3a3a3a" stroke-width="2"></ellipse>
      <ellipse cx="0" cy="40" rx="13" ry="17" fill="#161616">
        <animate attributename="fill" values="#7BDBD1;#7BDBD1;#161616;#161616;#7BDBD1;#7BDBD1" keytimes="0;0.47;0.471;0.97;0.971;1" dur="4s" repeatcount="indefinite"></animate>
      </ellipse>
      <ellipse cx="-4" cy="33" rx="3" ry="6" fill="#fff" opacity="0.2"></ellipse>
      <line x1="-7" y1="60" x2="-7" y2="72" stroke="#9a9a9a" stroke-width="2"></line>
      <line x1="7" y1="60" x2="7" y2="72" stroke="#9a9a9a" stroke-width="2"></line>
      <text x="0" y="90" text-anchor="middle" font-size="10" fill="#7BDBD1" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">LED 1</text>
    </g>
    <!-- LED2 (bottom-right) -->
    <g transform="translate(910,195)">
      <circle cx="0" cy="40" r="40" fill="url(#abxT-led2-glow)" opacity="0">
        <animate attributename="opacity" values="0;0;1;1;0;0" keytimes="0;0.47;0.471;0.97;0.971;1" dur="4s" repeatcount="indefinite"></animate>
      </circle>
      <ellipse cx="0" cy="40" rx="18" ry="22" fill="#141414" stroke="#3a3a3a" stroke-width="2"></ellipse>
      <ellipse cx="0" cy="40" rx="13" ry="17" fill="#1e1e1e">
        <animate attributename="fill" values="#1e1e1e;#1e1e1e;#E88BB8;#E88BB8;#1e1e1e;#1e1e1e" keytimes="0;0.47;0.471;0.97;0.971;1" dur="4s" repeatcount="indefinite"></animate>
      </ellipse>
      <ellipse cx="-4" cy="33" rx="3" ry="6" fill="#fff" opacity="0.2"></ellipse>
      <line x1="-7" y1="60" x2="-7" y2="72" stroke="#9a9a9a" stroke-width="2"></line>
      <line x1="7" y1="60" x2="7" y2="72" stroke="#9a9a9a" stroke-width="2"></line>
      <text x="0" y="90" text-anchor="middle" font-size="10" fill="#E88BB8" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">LED 2</text>
    </g>

    <!-- flow note across bottom -->
    <text x="20" y="295" font-size="10" fill="#7a7a7a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">
      Flow: Camera frame-complete → Triggerscope CAM IN → (state++) → TTL OUT {1|2} → LED Controller IN → LED {1|2}
    </text>
    <text x="20" y="310" font-size="10" fill="#7a7a7a" font-family="&#x27;Fira Code&#x27;, ui-monospace, Menlo, Consolas, monospace">
      Use case: hardware-sequenced multi-channel fluorescence imaging — no software in the loop, every frame is locked to the camera.
    </text>
  </svg>

  <div class="abx-scope-wrap" aria-hidden="true">
    <div class="abx-scope-head">
      <span>OSCILLOSCOPE · 3-CH · CAMERA-SYNCHRONIZED</span>
      <span><span class="abx-chip">RUN</span>   1V / div  ·  ~16 ms / div</span>
    </div>
    <canvas class="abx-scope" width="1200" height="460"></canvas>
  </div>

  <div class="abx-footer">
    <span><span class="abx-dot" style="background:#E6C458"></span>CH1 — Camera frame-complete (TRIG)</span>
    <span><span class="abx-dot" style="background:#7BDBD1"></span>CH2 — Triggerscope TTL1 → LED1</span>
    <span><span class="abx-dot" style="background:#E88BB8"></span>CH3 — Triggerscope TTL2 → LED2</span>
    <span>Each TRIG pulse toggles the active output</span>
  </div>

  <script>
  (function(){
    var root = document.currentScript && document.currentScript.parentNode;
    if(!root) return;
    var canvas = root.querySelector('canvas.abx-scope');
    if(!canvas) return;
    var ctx = canvas.getContext('2d');

    function resize(){
      var rect = canvas.getBoundingClientRect();
      var dpr = window.devicePixelRatio || 1;
      canvas.width  = Math.max(400, Math.floor(rect.width  * dpr));
      canvas.height = Math.max(180, Math.floor(rect.height * dpr));
    }
    resize();
    window.addEventListener('resize', resize, {passive:true});

    // ---- Cycle = 4s, matches the SVG keyTimes ----
    // Camera frame-complete pulses at t = 0.45-0.47 and 0.95-0.97
    // TTL1 HIGH: 0.00-0.47 and 0.97-1.00 (wraps)
    // TTL2 HIGH: 0.47-0.97
    function camAt(t){
      t = ((t % 1) + 1) % 1;
      var R = 0.003;
      function pulse(t, on, off){
        if(t < on) return 0;
        if(t < on + R) return (t-on)/R;
        if(t < off) return 1;
        if(t < off + R) return 1 - (t-off)/R;
        return 0;
      }
      return Math.max(pulse(t, 0.450, 0.467), pulse(t, 0.950, 0.967));
    }
    function ttl1At(t){
      t = ((t % 1) + 1) % 1;
      var R = 0.004;
      // HIGH from 0 to 0.47, LOW from 0.47 to 0.97, HIGH from 0.97 to 1
      if(t < 0.466) return 1;
      if(t < 0.466 + R) return 1 - (t - 0.466)/R;
      if(t < 0.966) return 0;
      if(t < 0.966 + R) return (t - 0.966)/R;
      return 1;
    }
    function ttl2At(t){
      t = ((t % 1) + 1) % 1;
      var R = 0.004;
      if(t < 0.466) return 0;
      if(t < 0.466 + R) return (t - 0.466)/R;
      if(t < 0.966) return 1;
      if(t < 0.966 + R) return 1 - (t - 0.966)/R;
      return 0;
    }

    var CYCLE_MS = 4000;
    var WINDOW_MS = 4000;
    var start = performance.now();

    function laneRect(canvasH, idx){
      var pad = 16 * (window.devicePixelRatio||1);
      var h = (canvasH - pad*2) / 3;
      var top = pad + h*idx;
      return { top: top, bot: top + h - 4 };
    }

    function draw(now){
      var w = canvas.width, h = canvas.height;
      var DPR = window.devicePixelRatio || 1;

      ctx.fillStyle = '#0F0F10';
      ctx.fillRect(0,0,w,h);

      // grid
      ctx.strokeStyle = '#2a2a2a'; ctx.lineWidth = 1;
      ctx.beginPath();
      for(var i=1;i<10;i++){ var x = Math.round(i*w/10)+0.5; ctx.moveTo(x,0); ctx.lineTo(x,h); }
      for(var j=1;j<9;j++){ var y = Math.round(j*h/9)+0.5; ctx.moveTo(0,y); ctx.lineTo(w,y); }
      ctx.stroke();

      // lane dividers
      ctx.strokeStyle = '#2a2a2a';
      ctx.beginPath();
      for(var k=1;k<3;k++){ var ly = Math.round(k*h/3)+0.5; ctx.moveTo(0,ly); ctx.lineTo(w,ly); }
      ctx.stroke();

      var elapsed = now - start;
      var samples = Math.min(w, 1400);

      var fns   = [camAt, ttl1At, ttl2At];
      var clrs  = ['#E6C458','#7BDBD1','#E88BB8'];
      var names = ['CH1  CAMERA TRIG','CH2  TTL1 → LED1','CH3  TTL2 → LED2'];

      ctx.font = (12*DPR) + 'px ui-monospace, Menlo, Consolas, monospace';
      ctx.textBaseline = 'middle';

      for(var ch=0; ch<3; ch++){
        var lane = laneRect(h, ch);
        var hi = lane.top + 12*DPR;
        var lo = lane.bot - 6*DPR;

        ctx.fillStyle = '#6a6a6a';
        ctx.fillText(names[ch], 10*DPR, lane.top + 12*DPR);
        ctx.fillStyle = '#4a4a4a';
        ctx.fillText('0V', 10*DPR, lo - 4*DPR);

        ctx.strokeStyle = '#3a3a3a'; ctx.lineWidth = 1;
        ctx.beginPath(); ctx.moveTo(0, lo+0.5); ctx.lineTo(w, lo+0.5); ctx.stroke();

        ctx.lineWidth = 2*DPR;
        ctx.strokeStyle = clrs[ch];
        ctx.shadowBlur = 8;
        ctx.shadowColor = clrs[ch] + 'cc';
        ctx.beginPath();
        for(var s=0; s<=samples; s++){
          var px = (s/samples) * w;
          var tAbs = elapsed - (1 - s/samples) * WINDOW_MS;
          var v = fns[ch](tAbs / CYCLE_MS);
          var py = lo + (hi - lo) * v;
          if(s===0) ctx.moveTo(px, py); else ctx.lineTo(px, py);
        }
        ctx.stroke();
        ctx.shadowBlur = 0;
      }

      // Annotate trig edges with vertical guide lines crossing all lanes
      var tNow = (elapsed % CYCLE_MS) / CYCLE_MS;
      function edgeX(edgeT){
        var diff = tNow - edgeT;
        if(diff < 0) diff += 1;
        if(diff > 1) return -1;
        return w - diff * w;
      }
      ctx.setLineDash([4*DPR, 4*DPR]);
      ctx.strokeStyle = 'rgba(255,215,107,0.30)';
      ctx.lineWidth = 1;
      [0.455, 0.955].forEach(function(et){
        var x = edgeX(et);
        if(x>0){ ctx.beginPath(); ctx.moveTo(x+0.5, 0); ctx.lineTo(x+0.5, h); ctx.stroke(); }
      });
      ctx.setLineDash([]);

      // right-edge sweep marker
      ctx.strokeStyle = 'rgba(255,215,107,0.45)';
      ctx.beginPath(); ctx.moveTo(w-0.5, 0); ctx.lineTo(w-0.5, h); ctx.stroke();

      requestAnimationFrame(draw);
    }
    requestAnimationFrame(draw);
  })();
  </script>
</div>

<p class="wp-block-paragraph">So what does the above look like in real life? Check out this example below! Note that I select in my "lambda" control box the "Stream" checkbox. Then once start capture is pressed, the triggerscope is armed, the camera is readied, and we snag 20 images in &lt; 300ms! </p>

<p class="wp-block-paragraph">Of course, we can extend this using the 5V DAC control line on the triggerscope for capture of Z as well as channel, and if using the more capable triggerscope 4B, we can control even more devices. </p>

<figure class="wp-block-image size-full"><video muted loop playsinline preload="none" controls poster="https://austinblanco.com/assets/posts/10-time-point-2-channel-stream-poster-1024.webp" width="1280" height="720" data-inview="" aria-label="Image from “Understanding TTL control, Blanking &amp; Device Streaming, and why it matters for your research.”"><source src="https://austinblanco.com/assets/posts/10-time-point-2-channel-stream.mp4" type="video/mp4"></video></figure>

<p class="wp-block-paragraph">I hope this article has helped explain not only why I make devices such as the triggerscope, but also how it's important to use software that provides complete control for your light sources and other devices, as well as the ability to do things like this. My sincere thanks to Excelitas for lending me the Edge camera and Tetrem LED, both of which have worked flawlessly on my system. Nebula has drivers for both products fully integrated for streaming control if you have interest in using it. </p>

<p class="wp-block-paragraph">-Austin</p>]]></content:encoded></item>
<item><title>Starlyte Nebula Now Supports Opto Gmbh Microsocpes</title><link>https://austinblanco.com/posts/starlyte-nebula-now-supports-opto-gmbh-microsocpes.html</link><guid isPermaLink="true">https://austinblanco.com/posts/starlyte-nebula-now-supports-opto-gmbh-microsocpes.html</guid><pubDate>Wed, 15 Apr 2026 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><category>Camera</category><category>Device automation</category><category>Nebula</category><description>Thomas Spieker from Opto Gmbh was kind enough to send us a demo assembly of several microscopes made by his company.</description><content:encoded><![CDATA[<p class="wp-block-paragraph"><strong>Thomas Spieker</strong> from <a href="https://opto-gmbh.com/en/">Opto Gmbh</a> was kind enough to send us a demo assembly of several microscopes made by his company. Opto manufactures a series of highly integrated microscope modules, all provided in a small, integrated form factor. </p>

<p class="wp-block-paragraph">I was able to work with two different variations. One is a complete transmitted illumination setup with camera and objective at 20x. The second is a reflected light device with integrated LED illuminators. </p>

<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" width="768" height="1024" src="https://austinblanco.com/assets/posts/IMG_2708-768x1024-768.webp" alt="Image from “Starlyte Nebula Now Supports Opto Gmbh Microsocpes”" class="wp-image-3343" srcset="https://austinblanco.com/assets/posts/IMG_2708-768x1024-480.webp 480w, https://austinblanco.com/assets/posts/IMG_2708-768x1024-768.webp 768w" sizes="(max-width: 767px) calc(100vw - 32px), 760px"></figure>

<p class="wp-block-paragraph">It’s neat to see such a compact setup on the desk. Using the 20x with a typical gut section stained sample was a piece of cake. Field uniformity on the illuminator was great, and color balance was as expected. </p>

<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="768" src="https://austinblanco.com/assets/posts/IMG_2726-1024x768-1024.webp" alt="Image from “Starlyte Nebula Now Supports Opto Gmbh Microsocpes”" class="wp-image-3345" srcset="https://austinblanco.com/assets/posts/IMG_2726-1024x768-480.webp 480w, https://austinblanco.com/assets/posts/IMG_2726-1024x768-1024.webp 1024w" sizes="(max-width: 767px) calc(100vw - 32px), 760px"></figure>

<p class="wp-block-paragraph">The reflected design unit has both a coaxial and ring-style illuminator position – both are provided in Nebula as control LED options. </p>

<p class="wp-block-paragraph">Use of the camera was straightforward. It supports 8 and 12 bit readout on a color sensor. I can definitely imagine hooking this up to a small XYZ gantry or even a 3d printer for inspection use. Thanks to Opto for the demo unit! </p>

<p class="wp-block-paragraph">Here is a video review and live demo of hte unit while running on Starlyte Nebula.</p>

<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Opto Microscope &amp; Starlyte Nebula" src="https://www.youtube.com/embed/23ZIvvEDqq0?feature=oembed" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>]]></content:encoded></item>
<item><title>Touptek Cameras Supported in Nebula</title><link>https://austinblanco.com/posts/touptek-cameras-supported-in-nebula.html</link><guid isPermaLink="true">https://austinblanco.com/posts/touptek-cameras-supported-in-nebula.html</guid><pubDate>Sun, 12 Apr 2026 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><category>Camera</category><category>Nebula</category><description>Recently, I had two different requests to support the cameras manufactured by Touptek. Ash from Scientific Imaging was kind enough to let me borrow one…</description><content:encoded><![CDATA[<p class="wp-block-paragraph">Recently, I had two different requests to support the cameras manufactured by Touptek. Ash from Scientific Imaging was kind enough to let me borrow one for in-house integration and testing. </p>

<p class="wp-block-paragraph">These cameras support Sony IMX-174 sensors, use a USB 3.1 (locking!) cable, and are straightforward to hook up and use. A GPIO connection is provided for I/O, and some models also have opto-isolated IO as well. </p>

<p class="wp-block-paragraph">Binning, ROI and bit depth readout modes are also supported. </p>

<p class="wp-block-paragraph">The camera I had hands on had a color version of the sensor, and while today has been a lot of rain, I was able to get a gloomy scene outside for my demo video below. </p>

<p class="wp-block-paragraph">For questions on running this camera in Nebula, please contact us at <a href="https://www.starlyteimaging.com/">www.starlyteimaging.com</a></p>

<p class="wp-block-paragraph">If you are interested in these cameras, please contact <a href="https://scientificimaging.com/">Scientific Imaging</a>. </p>

<p class="wp-block-paragraph">Here is a brief video demo of the camera in Starlyte Nebula! </p>

<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Starlyte Nebula Touptek Driver" src="https://www.youtube.com/embed/WrFOS_vIu1w?feature=oembed" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>]]></content:encoded></item>
<item><title>Allied Vision Cameras Now Supported in Nebula</title><link>https://austinblanco.com/posts/allied-vision-cameras-now-supported-in-nebula.html</link><guid isPermaLink="true">https://austinblanco.com/posts/allied-vision-cameras-now-supported-in-nebula.html</guid><pubDate>Fri, 03 Apr 2026 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><category>Camera</category><category>Microscopes</category><category>Nebula</category><description>Starlyte Imaging has completed support for Allied Vision array scan cameras. The driver suite fully supports: This addition enables users with existing…</description><content:encoded><![CDATA[<p class="wp-block-paragraph">Starlyte Imaging has completed support for Allied Vision array scan cameras. The driver  suite fully supports:</p>

<ul class="wp-block-list">
<li>Gain modes</li>

<li>Color &amp; Bit Depth selection</li>

<li>Mono / Color Debayering</li>
</ul>

<p class="wp-block-paragraph">This addition enables users with existing cameras to easily integrate Nebula on machines used for inspection, materials processing, and other industrial applications. </p>

<p class="wp-block-paragraph">-Austin</p>]]></content:encoded></item>
<item><title>Triggerscope Mini Micro-Manager Setup</title><link>https://austinblanco.com/posts/triggerscope-mini-micro-manager-setup.html</link><guid isPermaLink="true">https://austinblanco.com/posts/triggerscope-mini-micro-manager-setup.html</guid><pubDate>Sun, 01 Mar 2026 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><category>ImageJ</category><category>Micro-Manager</category><category>Nebula</category><category>Triggerscope</category><description>Below is a short video introducing the Triggerscope Mini, as well as demonstrating how to set it up in micromanager.</description><content:encoded><![CDATA[<p class="wp-block-paragraph">Below is a short video introducing the Triggerscope Mini, as well as demonstrating how to set it up in micromanager. </p>

<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Triggerscope Mini Introduction &amp; Setup" src="https://www.youtube.com/embed/J8moLjCPLlo?feature=oembed" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>

<p class="wp-block-paragraph">If you’re in a hurry, I’ve also outlined the basic steps below with screen shots. </p>

<p class="wp-block-paragraph">Connect the triggerscope mini to a USB-2 compliant port, via it’s USB C connection cable (included). </p>

<p class="wp-block-paragraph">Open micromanager, select the device configuration wizard, and browse to the add device page.</p>

<p class="wp-block-paragraph">Scroll the device list until you see “Triggerscope-MM” expand that and select the -Hub device. </p>

<p class="wp-block-paragraph">A window will appear, set the COM port to the port used by the triggerscope mini, and set the baud to 115,200, then click OK. </p>

<ol class="wp-block-list"></ol>

<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="467" height="486" src="https://austinblanco.com/assets/posts/tgm1-467.webp" alt="tgm1" class="wp-image-3324"></figure>

<p class="wp-block-paragraph">After a few seconds, a list of components will appear.  Note this is for the full triggerscope, so we will only choose the TTL 1-8 Bank, and DAC 1 + DAC 2. Below is a basic chart showing what devices are supported on the mini vs the standard triggerscope. </p>

<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="468" height="355" src="https://austinblanco.com/assets/posts/tgm2-468.webp" alt="tgm2" class="wp-image-3323"></figure>

<ol class="wp-block-list"></ol>

<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="2560" height="1325" src="https://austinblanco.com/assets/posts/Screenshot-2026-02-28-at-12.21.29-PM-scaled-1024.webp" alt="Image from “Triggerscope Mini Micro-Manager Setup”" class="wp-image-3325" srcset="https://austinblanco.com/assets/posts/Screenshot-2026-02-28-at-12.21.29-PM-scaled-480.webp 480w, https://austinblanco.com/assets/posts/Screenshot-2026-02-28-at-12.21.29-PM-scaled-1024.webp 1024w" sizes="(max-width: 767px) calc(100vw - 32px), 760px"></figure>

<p class="wp-block-paragraph">When prompted for the DAC voltages, only select 0-5V (default), and click OK. </p>

<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="464" height="290" src="https://austinblanco.com/assets/posts/tgm3-464.webp" alt="tgm3" class="wp-image-3322"></figure>

<ol class="wp-block-list"></ol>

<p class="wp-block-paragraph">That’s it! Follow the manager to complete the install. Once done, you’ll have the common TTL output control, DAC control, blanking, sequencing and other features of a standard triggerscope! </p>

<ol class="wp-block-list"></ol>]]></content:encoded></item>
<item><title>Design of a cemented doublet lens using AI</title><link>https://austinblanco.com/posts/design-of-a-cemented-doublet-lens-using-ai.html</link><guid isPermaLink="true">https://austinblanco.com/posts/design-of-a-cemented-doublet-lens-using-ai.html</guid><pubDate>Sat, 28 Feb 2026 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><category>AI</category><category>Optics</category><description>How well can modern AI agents produce engineering designs for optics? Well – I wanted to find out. To test this, I’ll walk through my goal.</description><content:encoded><![CDATA[<p class="wp-block-paragraph">How well can modern AI agents produce engineering designs for optics? Well – I wanted to find out. </p>

<p class="wp-block-paragraph">To test this, I’ll walk through my goal. I need to get a lens made and I need it fast. I also need it to work properly. Lastly, I need it to be manufacturable at scale which means using glass substitutes often found in China. </p>

<p class="wp-block-paragraph">So – using Claude Chat, I took performance specs from several existing lenses, handed them over and added:<br> <br>“Make me a lens design that meets these general performance criteria.”<br><br>I also asked :</p>

<ul class="wp-block-list">
<li>Use Chinese available glass (e.g. K series)</li>

<li>Validate the design using a raytrace</li>

<li>produce estimated performance data</li>

<li>produce design drawings</li>

<li>produce a prescription</li>

<li>produce a ZMX file</li>
</ul>

<p class="wp-block-paragraph">Here is the design it produced, it sure doesn’t look bad so far! </p>

<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="2000" height="1279" src="https://austinblanco.com/assets/posts/achromatic_doublet_20mm_200mm_CDGM-1024.webp" alt="Design of a cemented doublet lens using AI" class="wp-image-3291" srcset="https://austinblanco.com/assets/posts/achromatic_doublet_20mm_200mm_CDGM-480.webp 480w, https://austinblanco.com/assets/posts/achromatic_doublet_20mm_200mm_CDGM-1024.webp 1024w" sizes="(max-width: 767px) calc(100vw - 32px), 760px"></figure>

<p class="wp-block-paragraph">After a while it decided to build it’s own python analysis tool using multiple metrics, it did the job and generally things look ok. However – is this actually OK? Let’s drop the lens design into Zemax. </p>

<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="730" src="https://austinblanco.com/assets/posts/plot-1024x730-1024.webp" alt="plot" class="wp-image-3292" srcset="https://austinblanco.com/assets/posts/plot-1024x730-480.webp 480w, https://austinblanco.com/assets/posts/plot-1024x730-1024.webp 1024w" sizes="(max-width: 767px) calc(100vw - 32px), 760px"></figure>

<p class="wp-block-paragraph">Using a COTS 200mm doublet as a comparison, I pulled a image, plot, ray fan and Huygens spot to inspect. All look quite similar, the spot size can be realized a bit better, but consider the aperture on the reference file was slightly larger, so that means difference in NA. </p>

<p class="wp-block-paragraph">AI Doublet Left                                      —                     COTS Design at right<br></p>

<p class="wp-block-paragraph">Ray Fan Diagram</p>

<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="936" height="702" data-id="3293" src="https://austinblanco.com/assets/posts/ray_fan-768x576-768.webp" alt="ray_fan" class="wp-image-3293" srcset="https://austinblanco.com/assets/posts/ray_fan-768x576-480.webp 480w, https://austinblanco.com/assets/posts/ray_fan-768x576-768.webp 768w" sizes="(max-width: 767px) calc(100vw - 32px), 760px"></figure>

<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="936" height="702" data-id="3295" src="https://austinblanco.com/assets/posts/comparison25_rayfan-768x576-768.webp" alt="comparison25_rayfan" class="wp-image-3295" srcset="https://austinblanco.com/assets/posts/comparison25_rayfan-768x576-480.webp 480w, https://austinblanco.com/assets/posts/comparison25_rayfan-768x576-768.webp 768w" sizes="(max-width: 767px) calc(100vw - 32px), 760px"></figure>
</figure>

<p class="wp-block-paragraph">Note there is a difference here, this design is not optimized – with an optimized second surface, it’s obvious a lot of improvement can be made. Yet for a commercial type lens, I think this is a good example of a sufficient result – it’s less than the diffraction limit, which is a suitable bar for pass failure. </p>

<p class="wp-block-paragraph">Huygens spot size is below, again note the difference in the psf due to optimization missed. </p>

<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="768" data-id="3294" src="https://austinblanco.com/assets/posts/huygens-1024x768-1024.webp" alt="huygens" class="wp-image-3294" srcset="https://austinblanco.com/assets/posts/huygens-1024x768-480.webp 480w, https://austinblanco.com/assets/posts/huygens-1024x768-1024.webp 1024w" sizes="(max-width: 767px) calc(100vw - 32px), 760px"></figure>

<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="768" data-id="3296" src="https://austinblanco.com/assets/posts/comparison25_huygens-1024x768-1024.webp" alt="comparison25_huygens" class="wp-image-3296" srcset="https://austinblanco.com/assets/posts/comparison25_huygens-1024x768-480.webp 480w, https://austinblanco.com/assets/posts/comparison25_huygens-1024x768-1024.webp 1024w" sizes="(max-width: 767px) calc(100vw - 32px), 760px"></figure>
</figure>

<p class="wp-block-paragraph">Finally, we can compare the simulated image formation – here I don’t think there is a clear winner, which is what we are shooting for in a commercially produced result. Very cool. </p>

<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-3 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="768" data-id="3297" src="https://austinblanco.com/assets/posts/imageform-1024x768-1024.webp" alt="Image from “Design of a cemented doublet lens using AI”" class="wp-image-3297" srcset="https://austinblanco.com/assets/posts/imageform-1024x768-480.webp 480w, https://austinblanco.com/assets/posts/imageform-1024x768-1024.webp 1024w" sizes="(max-width: 767px) calc(100vw - 32px), 760px"></figure>

<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="768" data-id="3298" src="https://austinblanco.com/assets/posts/comparison25_imageform-1024x768-1024.webp" alt="comparison25_imageform" class="wp-image-3298" srcset="https://austinblanco.com/assets/posts/comparison25_imageform-1024x768-480.webp 480w, https://austinblanco.com/assets/posts/comparison25_imageform-1024x768-1024.webp 1024w" sizes="(max-width: 767px) calc(100vw - 32px), 760px"></figure>
</figure>]]></content:encoded></item>
<item><title>xTool Conversion utilities</title><link>https://austinblanco.com/posts/xtool-conversion-utilities.html</link><guid isPermaLink="true">https://austinblanco.com/posts/xtool-conversion-utilities.html</guid><pubDate>Fri, 27 Feb 2026 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><category>Laser</category><category>Optics</category><description>We are about to announce some new products made using the amazing xTool UV laser engraver.</description><content:encoded><![CDATA[<p class="wp-block-paragraph">We are about to announce some new products made using the amazing xTool UV laser engraver. Along te way, we needed to convert the 3d files used on the system to SVG. I figured I may as well share that, and so you can find it on my github <a href="https://github.com/AdvancedResearchConsulting/xtool-utilities">here</a> . </p>

<p class="wp-block-paragraph">Of course, the first thing I made using this engraver was a 3D engraving of the USS Enterprise 1701-D inside of a BK7 Prism. Because why not?!?! </p>

<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="768" height="1024" src="https://austinblanco.com/assets/posts/IMG_2188-768x1024-768.webp" alt="Image from “xTool Conversion utilities”" class="wp-image-3285" srcset="https://austinblanco.com/assets/posts/IMG_2188-768x1024-480.webp 480w, https://austinblanco.com/assets/posts/IMG_2188-768x1024-768.webp 768w" sizes="(max-width: 767px) calc(100vw - 32px), 760px"></figure>]]></content:encoded></item>
<item><title>Triggerscope Mini Released</title><link>https://austinblanco.com/posts/triggerscope-mini-released.html</link><guid isPermaLink="true">https://austinblanco.com/posts/triggerscope-mini-released.html</guid><pubDate>Thu, 26 Feb 2026 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><category>Imaging</category><category>Microscopes</category><category>Nebula</category><category>Triggerscope</category><description>Compact, Simplified TTL and DAC – Micromanager Native I’m happy to share a new device I’ve been working on after encouragement from numerous clients.</description><content:encoded><![CDATA[<p class="is-style-text-subtitle is-style-text-subtitle--4 wp-block-paragraph">Compact, Simplified TTL and DAC – Micromanager Native</p>

<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1912" height="1477" src="https://austinblanco.com/assets/posts/Triggerscope_Mini-edited-1024.webp" alt="Triggerscope Mini Released" class="wp-image-3280" srcset="https://austinblanco.com/assets/posts/Triggerscope_Mini-edited-480.webp 480w, https://austinblanco.com/assets/posts/Triggerscope_Mini-edited-1024.webp 1024w" sizes="(max-width: 767px) calc(100vw - 32px), 760px"></figure>

<p class="wp-block-paragraph">I’m happy to share a new device I’ve been working on after encouragement from numerous clients. This new smaller version of the Triggerscope is intended to bridge the gap between large complex systems and more streamlined setups. <br><br>With the Mini you get:</p>

<ul class="wp-block-list">
<li>4 TTL Outputs at 5V</li>

<li>2 DAC Outputs at 5V</li>

<li>1 3.3V to 5V input Trigger</li>

<li>Status LEDs for all connections!</li>

<li>A single USB-C Connection to the computer</li>

<li>Full supported Micromanager Triggerscope-Hub Behavior</li>
</ul>

<p class="wp-block-paragraph">This was a super fun project for me, as for the first time this board uses a bare MCU, which enabled my team to use any connector we wanted (hence the USB C) as well as full USB-Serial emulation on our own terms. </p>

<p class="wp-block-paragraph">I’m also quite fond of the baby side-emitting LEDs on the outputs. These LED’s draw almost no current, but having them for all of the outputs makes it so easy to know whether a given control line is on or off. For the DAC LED’s, they change brightness with the output! </p>

<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="768" height="1024" src="https://austinblanco.com/assets/posts/IMG_2459-768x1024-768.webp" alt="Image from “Triggerscope Mini Released”" class="wp-image-3276" srcset="https://austinblanco.com/assets/posts/IMG_2459-768x1024-480.webp 480w, https://austinblanco.com/assets/posts/IMG_2459-768x1024-768.webp 768w" sizes="(max-width: 767px) calc(100vw - 32px), 760px"></figure>

<p class="wp-block-paragraph">I tried to keep this design in-line with the current TG4, as it’s worked well for us over the years. This one is of course thinner, lighter and smaller, but in effect a truly miniaturized version of the larger model. </p>

<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="768" src="https://austinblanco.com/assets/posts/IMG_2410-1024x768-1024.webp" alt="Image from “Triggerscope Mini Released”" class="wp-image-3277" srcset="https://austinblanco.com/assets/posts/IMG_2410-1024x768-480.webp 480w, https://austinblanco.com/assets/posts/IMG_2410-1024x768-1024.webp 1024w" sizes="(max-width: 767px) calc(100vw - 32px), 760px"></figure>

<p class="wp-block-paragraph">If you’d like to buy a Mini, we have them <a href="https://advancedresearch-consulting.com/product/triggerscope-mini/">ready for sale on the store page here</a>. For more information on the unit please <a href="https://advancedresearch-consulting.com/wp-content/uploads/2026/02/TriggerScope_Mini_Flyer.pdf">see this flyer</a> or the product page, thanks!</p>]]></content:encoded></item>
<item><title>Starlyte Nebula Adds Drag+Drop Merge Captures</title><link>https://austinblanco.com/posts/starlyte-nebula-adds-dragdrop-merge-captures.html</link><guid isPermaLink="true">https://austinblanco.com/posts/starlyte-nebula-adds-dragdrop-merge-captures.html</guid><pubDate>Tue, 24 Feb 2026 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><category>Camera</category><category>Device automation</category><category>Nebula</category><category>Programming</category><description>Tool simplifies manual capture We had a recent customer asking to solve a rather standard but annoying problem.</description><content:encoded><![CDATA[<p class="wp-block-paragraph">Tool simplifies manual capture</p>

<figure class="wp-block-image size-full"><video muted loop playsinline preload="none" controls poster="https://austinblanco.com/assets/posts/overlay_example-poster-1024.webp" width="1280" height="720" data-inview="" aria-label="Starlyte Nebula Adds Drag+Drop Merge Captures"><source src="https://austinblanco.com/assets/posts/overlay_example.mp4" type="video/mp4"></video></figure>

<p class="wp-block-paragraph">We had a recent customer asking to solve a rather standard but annoying problem. If I have a manual filter turret, and still want to overlay images, how easy is it to do? </p>

<p class="wp-block-paragraph">To solve this, we added the ability to drag+drop any image from our capture sidebar into our main view. By adding a demo filter turret to the system config, we captured the real ex, di and em filter settings from the image, insuring metadata is transferred with the images collected. The resulting view is a true multi-dim architecture, saved as an OME set or RGB combined view. Our team made the addition, ran bug testing and edge case validation, pushed the changes and compiled the application in 1 business day. </p>

<p class="wp-block-paragraph">Being able to react to our customers’ needs in a short timeframe is one of the best parts of working with my team. Nice work!</p>

<p class="wp-block-paragraph">-Austin</p>]]></content:encoded></item>
<item><title>Starlyte Nebula Now Supports Excelitas LED Illuminators</title><link>https://austinblanco.com/posts/starlyte-nebula-now-supports-excelitas-led-illuminators.html</link><guid isPermaLink="true">https://austinblanco.com/posts/starlyte-nebula-now-supports-excelitas-led-illuminators.html</guid><pubDate>Thu, 19 Feb 2026 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><description>Over the past few weeks, we’ve been building out driver support for the Excelitas illuminator line. Today i wrapped the Tetrem unit up.</description><content:encoded><![CDATA[<p class="wp-block-paragraph">Over the past few weeks, we’ve been building out driver support for the Excelitas illuminator line. Today i wrapped the Tetrem unit up.</p>

<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="432" height="440" src="https://austinblanco.com/assets/posts/image-1-2-432.webp" alt="Image from “Starlyte Nebula Now Supports Excelitas LED Illuminators”" class="wp-image-3266"></figure>

<p class="wp-block-paragraph">Below is a 2 channel illumination sequence using the Excelitas Tetrem, captured via a Hamamatsu Fusion camera. A nice feature of the Excelitas units is a commonality of protocol. By keeping the communication back end similar between different units, it’s a straightforward job to add new models as they release. Thanks to Gary Tokman from <a href="http://visualdynamix.net/">Visual Dynamix</a> for allowing us the system access to get this done! </p>

<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="640" src="https://austinblanco.com/assets/posts/image-scaled-e1771437527804-1024x640-1024.webp" alt="Tetrem 2 Channel" class="wp-image-3265" srcset="https://austinblanco.com/assets/posts/image-scaled-e1771437527804-1024x640-480.webp 480w, https://austinblanco.com/assets/posts/image-scaled-e1771437527804-1024x640-1024.webp 1024w" sizes="(max-width: 767px) calc(100vw - 32px), 760px"></figure>

<p class="wp-block-paragraph">Nebula can now control and support:</p>

<ul class="wp-block-list">
<li><a href="https://www.excelitas.com/product/x-cite-xylis-ii-broad-spectrum-led-illumination-system">Xylis Series</a></li>

<li><a href="https://www.excelitas.com/product/x-cite-novem-powerful-9-channel-led-illumination-system">Novem Series</a></li>

<li><a href="https://www.excelitas.com/product/x-cite-tetrem-4-channel-led-illumination-system">Tetrem Series</a></li>
</ul>

<p class="wp-block-paragraph">Each driver has a unique entry in the driver list. All drivers support the maximum possible device response time and full intensity range profile per device. The Mini will be added soon as well. </p>

<p class="wp-block-paragraph">Contact us for more info at www.starlyteimaging.com !</p>

<p class="wp-block-paragraph">-Austin</p>]]></content:encoded></item>
<item><title>Tucsen High QE Libra CMOS Announced</title><link>https://austinblanco.com/posts/tucsen-high-qe-libra-cmos-announced.html</link><guid isPermaLink="true">https://austinblanco.com/posts/tucsen-high-qe-libra-cmos-announced.html</guid><pubDate>Sat, 17 Jan 2026 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><category>Camera</category><category>sCMOS</category><description>High QE, small pixel size Recently Tucsen had a presentation on their new Libra CMOS cameras which includes some nice improvements in sensor performance.</description><content:encoded><![CDATA[<p class="wp-block-paragraph">High QE, small pixel size</p>

<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="486" src="https://austinblanco.com/assets/posts/image-2-1024x486-1024.webp" alt="Libra CMOS" class="wp-image-3254" srcset="https://austinblanco.com/assets/posts/image-2-1024x486-480.webp 480w, https://austinblanco.com/assets/posts/image-2-1024x486-1024.webp 1024w" sizes="(max-width: 767px) calc(100vw - 32px), 760px"></figure>

<p class="wp-block-paragraph">Recently Tucsen had a presentation on their new Libra CMOS cameras which includes some nice improvements in sensor performance. </p>

<p class="wp-block-paragraph">Key highlights were: </p>

<ul class="wp-block-list">
<li>Improved QE at 92%</li>

<li>Large Full Well Capacity (48,000 e)</li>

<li>Native binning / debin system</li>
</ul>

<p class="wp-block-paragraph">In a recent presentation <a href="https://streamyard.com/watch/6Acd5HJiYhRi">here </a> a series of improvements were listed, among them a smaller pixel size selection option which supports a drop in pixel size to ~ 3.27um. From the explanation I assume the camera runs natively in a binned mode to produce 7.x um pixels, but can be optionally de-binned. </p>

<p class="wp-block-paragraph">Each of the cameras (3 models announced) appear to have this feature, as shown below. </p>

<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="985" src="https://austinblanco.com/assets/posts/image-1-1024x985-1024.webp" alt="Image from “Tucsen High QE Libra CMOS Announced”" class="wp-image-3253" srcset="https://austinblanco.com/assets/posts/image-1-1024x985-480.webp 480w, https://austinblanco.com/assets/posts/image-1-1024x985-1024.webp 1024w" sizes="(max-width: 767px) calc(100vw - 32px), 760px"></figure>

<p class="wp-block-paragraph">I’m more interested in the full well, as having a ~50k e full well seems a nice improvement in dynamic range over current options. Once item that was very interesting to me is that the full well capacity does NOT reduce when enabling the higher resolution mode. If this is correct, a 3.x um pixel with a 48ke full well would still be quite a nice bump in range and quite a feat! </p>

<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="432" src="https://austinblanco.com/assets/posts/image-1024x432-1024.webp" alt="Image from “Tucsen High QE Libra CMOS Announced”" class="wp-image-3252" srcset="https://austinblanco.com/assets/posts/image-1024x432-480.webp 480w, https://austinblanco.com/assets/posts/image-1024x432-1024.webp 1024w" sizes="(max-width: 767px) calc(100vw - 32px), 760px"></figure>

<p class="wp-block-paragraph">For pricing, the presentation noted 0.4x the cost of a “classic CMOS”. I’m curious what that means in an actual dollar amount. </p>

<p class="wp-block-paragraph">-Austin</p>]]></content:encoded></item>
<item><title>Starlyte Nebula – Open Microscopy Control Software</title><link>https://austinblanco.com/posts/starlyte-nebula-open-microscopy-control-software.html</link><guid isPermaLink="true">https://austinblanco.com/posts/starlyte-nebula-open-microscopy-control-software.html</guid><pubDate>Sun, 09 Nov 2025 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><category>Nebula</category><description>A few months back, I started promoting a new software application called Nebula. As I introduced it to people I realized that I’d not explained the…</description><content:encoded><![CDATA[<p class="wp-block-paragraph">A few months back, I started promoting a new software application called Nebula. As I introduced it to people I realized that I’d not explained the development or release of it on my website, and so here I’ll take a minute to explain that.</p>

<h2 id="the-why">The Why</h2>

<p class="wp-block-paragraph">20 years ago I fell into a career in the life science imaging industry, working for an integration and microscope dealer in southern California. One of my first jobs was installing a copy of software application called MetaMorph. This was an interesting thing to me, having a background in building computers from the days of ISA cards and DOS boot menus.</p>

<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="400" height="301" src="https://austinblanco.com/assets/posts/mm-400.webp" alt="mm" class="wp-image-3224"></figure>

<p class="wp-block-paragraph">Metamorph could move things like a filter wheel (then a Sutter Instrument 10-2), and capture images from a camera like the then-new Photometrics 1300 YHS. </p>

<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="450" height="249" src="https://austinblanco.com/assets/posts/Lambda-10-2-450.webp" alt="Lambda-10-2" class="wp-image-3222"></figure>

<p class="wp-block-paragraph">It fascinated me to watch the camera snap images with it’s mechanical shutter as the filter wheel switched positions, compiling images into a singular display. I was intrigued by this ability and also how it was used in research. </p>

<p class="wp-block-paragraph">As time went on, I eventually moved from building the basic systems to maintaining them in-field, and then to offering complete hardware and software systems as a direct rep for the company who made this software, Universal Imaging Corporation.</p>

<h2 id="the-need">The Need</h2>

<p class="wp-block-paragraph">What made MetaMorph appealing was the wide array of devices it could control  at speed – from stages, to microscopes, to illuminators, basically anything. The company had no specific lockout, and would integrate device drivers for any product.</p>

<p class="wp-block-paragraph">Over time, UIC was acquired by Molecular Devices, and after a long run <a href="https://www.moleculardevices.com/sites/default/files/en/assets/brochures/dd/img/customer-discontinuation-letter-meta-morph-2023.pdf">ceased offering product sales in 2023</a>. By that time, the industry was somewhat locked into the major microscope companies selling brand-specific products. Further, these companies would refuse support (understandably) for specific competing devices. Yet, this posed a genuine challenge for users: </p>

<p class="wp-block-paragraph">Once invested into an automated microscope, I am forced to use proprietary software with restrictions, or use open-source software alternatives like <a href="https://micro-manager.org/">MicroManager</a>.</p>

<p class="wp-block-paragraph">Now, MicroManager is an exceptional suite of software with device drivers, but for customers who want a simplified approach to control, with minimal hands-on configuration, and someone to call when things go wrong, there really aren’t many commercial applications filling the need. This situation led me to conclude that a new company was needed in the industry to:</p>

<ul class="wp-block-list">
<li>Provide Custom Integration Support for existing microscopes</li>

<li>Offer hardware driver support for smaller and newer companies excluded by the major brands. </li>

<li>Wrap device control into a simple, easy to use interface</li>

<li>Provide exceptional support for products. </li>
</ul>

<p class="wp-block-paragraph">With this in mind, I engaged with my friend and colleague Jacob Gewerth, to launch Starlyte Imaging, and build our core product, Nebula. It’s been a long development process, but what Nebula does is something very special: </p>

<figure class="wp-block-image size-full"><video muted loop playsinline preload="none" controls poster="https://austinblanco.com/assets/posts/nebula_start-poster-1024.webp" width="1280" height="798" data-inview="" aria-label="Image from “Starlyte Nebula – Open Microscopy Control Software”"><source src="https://austinblanco.com/assets/posts/nebula_start.mp4" type="video/mp4"></video></figure>

<h2 id="the-what">The What</h2>

<p class="wp-block-paragraph">We imagined, <a href="https://www.starlyteimaging.com/microscopy-software">and have released</a>, a software application geared to capture, and capture alone: </p>

<ul class="wp-block-list">
<li>We are dedicated to controlling devices as the priority – it’s all about getting data</li>

<li>Our drivers are completely developed in Python, and our driver standard is open – meaning YOU or any company who wants to, can write device drivers for our software. </li>

<li>Our pricing is approachable and fair – no huge budget outlay for software – we offer fixed licenses, or service-based pricing. </li>

<li>We can support old as well as new devices – many older microscopes are perfectly suitable as a chassis to perform any modern study, they just need to be tied into the capture control scheme. </li>

<li>We also can support data collection and metadata recording from perfusion systems, peristaltic pumps, or any other environmental control device you want to talk to. </li>

<li>More than anything else, I wanted to bring the simple, fair and honest product support I’ve enjoyed providing to this industry for my career. Things fail, mistakes happen, but what makes the difference to me, is the dedication to see projects through, supporting your research, and seeing the project through. </li>
</ul>

<p class="wp-block-paragraph">In keeping with our vision, we have teamed up with Zaber technologies to showcase our software at this years <a href="https://www.sfn.org/meetings/neuroscience-2025">Society for Neuroscience convention</a> in San Diego. We will be at Booth # 2711 controlling the <a href="https://www.zaber.com/products/microscopes/MVR">Zaber Nucleus MVR inverted modular microscope</a>, and are looking forward to seeing you there! </p>

<figure class="wp-block-image aligncenter is-resized"><img loading="lazy" decoding="async" width="1236" height="1288" src="https://austinblanco.com/assets/posts/Starlyte-Logo-tall-1024.webp" alt="www.starlyteimaging.com" class="wp-image-3199" srcset="https://austinblanco.com/assets/posts/Starlyte-Logo-tall-480.webp 480w, https://austinblanco.com/assets/posts/Starlyte-Logo-tall-1024.webp 1024w" sizes="(max-width: 767px) calc(100vw - 32px), 760px"><figcaption class="wp-element-caption">www.starlyteimaging.com</figcaption></figure>

<p class="wp-block-paragraph">Austin</p>]]></content:encoded></item>
<item><title>Nikon Ti-E EPI Filter Wheel</title><link>https://austinblanco.com/posts/nikon-ti-e-epi-filter-wheel.html</link><guid isPermaLink="true">https://austinblanco.com/posts/nikon-ti-e-epi-filter-wheel.html</guid><pubDate>Wed, 15 Oct 2025 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><category>Device automation</category><category>Microscopes</category><category>Nikon</category><category>Optics</category><description>What to look for and how to replace the drive gear The Venerable Nikon Ti-E remains in service in research labs all over the world.</description><content:encoded><![CDATA[<h2 id="what-to-look-for-and-how-to-replace-the-drive-gear">What to look for and how to replace the drive gear</h2>

<p class="wp-block-paragraph">The Venerable Nikon Ti-E remains in service in research labs all over the world. One of the first autofocus-enabled instruments deployed with the <a href="https://www.microscopyu.com/applications/live-cell-imaging/nikon-perfect-focus-system">integrated PFS</a>, there isn’t much to ask for when it comes to a modern compound fluorescent stand. For owners of the instruments, it’s important to be aware of a big maintenance item on the scope –  it’s motorized epi filter cube turret.</p>

<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" width="876" height="1024" src="https://austinblanco.com/assets/posts/IMG_1274-scaled-e1760481889789-876x1024-876.webp" alt="It lived a good life!" class="wp-image-3202" srcset="https://austinblanco.com/assets/posts/IMG_1274-scaled-e1760481889789-876x1024-480.webp 480w, https://austinblanco.com/assets/posts/IMG_1274-scaled-e1760481889789-876x1024-876.webp 876w" sizes="(max-width: 767px) calc(100vw - 32px), 760px"><figcaption class="wp-element-caption">It lived a good life!</figcaption></figure>

<p class="wp-block-paragraph">These turrets use a stepper motor to rotate the large carousel into various positions. The motor, control electronics, and positional sensing system are all high quality and should last many years, however, there is an internal gear which connects the belt drive to the carousel, and over time and stress of use, these gear rings have a tendency to crack. </p>

<p class="wp-block-paragraph">I recently had a colleague ask if we could reverse engineer a solution for these, as Nikon charges a mint for them and in some cases they may be difficult to obtain depending on your region. You can see from the one supplied to me indeed had cracked, and under inspection, stress cracks from aged plastic are apparent. </p>

<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="768" src="https://austinblanco.com/assets/posts/IMG_1278-2-1024x768-1024.webp" alt="Gear under Inspection" class="wp-image-3203" srcset="https://austinblanco.com/assets/posts/IMG_1278-2-1024x768-480.webp 480w, https://austinblanco.com/assets/posts/IMG_1278-2-1024x768-1024.webp 1024w" sizes="(max-width: 767px) calc(100vw - 32px), 760px"></figure>

<p class="wp-block-paragraph"> It’s important to note here that these might “work fine” under manual rotation (where the motor isn’t applying stress to the belt drive). If you are having problems where the filter isn’t moving to position, or hearing any snapping, clicking or other unusual noises, it’s highly recommended to remove the carriage assembly, and to inspect the gear closely for cracks. This is a ~ 15 minute procedure and only requires a flashlight and removal of the top cover of the carriage. </p>

<p class="wp-block-paragraph">If yours is cracked, we can supply a replacement within 1 day of order placement <a href="https://advancedresearch-consulting.com/product/nikon-ti-e-filter-turret-gear-2b260-077-replacement/">from our web store</a>. </p>

<p class="wp-block-paragraph">Here is a video of how to inspect and replace the ring as well. </p>

<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Nikon TiE Gear Replacement" src="https://www.youtube.com/embed/C4KajHwwA4E?feature=oembed" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>]]></content:encoded></item>
<item><title>Why a $3 laser vs $5000?</title><link>https://austinblanco.com/posts/why-a-3-laser-vs-5000.html</link><guid isPermaLink="true">https://austinblanco.com/posts/why-a-3-laser-vs-5000.html</guid><pubDate>Fri, 04 Nov 2022 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><description>I made a short video describing why laser pricing is so different. Much of it comes down to how precise the beam performance needs to be, and as with so…</description><content:encoded><![CDATA[<p class="wp-block-paragraph">I made a short video describing why laser pricing is so different. Much of it comes down to how precise the beam performance needs to be, and as with so many similar fields, as precision becomes better and better, pricing begins to log scale up as the challenges increase. Thanks for watching! </p>

<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="$3 vs $5000 Laser" src="https://www.youtube.com/embed/KNjs6avPewA?feature=oembed" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>]]></content:encoded></item>
<item><title>Firmware setup for Micromanager</title><link>https://austinblanco.com/posts/firmware-setup-for-micromanager.html</link><guid isPermaLink="true">https://austinblanco.com/posts/firmware-setup-for-micromanager.html</guid><pubDate>Sun, 22 Aug 2021 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><description>Here is a quick video on how to get going with the TriggerscopeMM Firmware and Micromanager 2.0 Gamma. -Austin</description><content:encoded><![CDATA[<p class="wp-block-paragraph">Here is a quick video on how to get going with the TriggerscopeMM Firmware and Micromanager 2.0 Gamma. </p>

<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Triggerscope MM MicroManager  Device Setup" src="https://www.youtube.com/embed/F-LZnJs9CVk?start=3&amp;feature=oembed" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>

<p class="wp-block-paragraph">-Austin</p>]]></content:encoded></item>
<item><title>Triggerscope Driver Available for Volocity</title><link>https://austinblanco.com/posts/triggerscope-driver-available-for-volocity.html</link><guid isPermaLink="true">https://austinblanco.com/posts/triggerscope-driver-available-for-volocity.html</guid><pubDate>Wed, 07 Apr 2021 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><description>ARC now has a driver available for users of Quorum Volocity microscopy software. New releases of Volocity will include native support.</description><content:encoded><![CDATA[<p class="wp-block-paragraph">ARC now has a driver available for users of Quorum Volocity microscopy software. New releases of Volocity will include native support. If you need a driver file or assistance please contact ARC for support. </p>

<p class="wp-block-paragraph">-Austin</p>]]></content:encoded></item>
<item><title>Zaber MVR Automated Invert Review</title><link>https://austinblanco.com/posts/zaber-mvr-automated-invert-review.html</link><guid isPermaLink="true">https://austinblanco.com/posts/zaber-mvr-automated-invert-review.html</guid><pubDate>Tue, 16 Feb 2021 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><description>By: Austin Blanco &amp; Garrett Bunch One of the toughest aspects of working as a consultant engineer is that the coolest and most interesting projects are…</description><content:encoded><![CDATA[<p class="wp-block-paragraph">By: Austin Blanco &amp; Garrett Bunch</p>

<p class="has-link-color wp-elements-1 wp-block-paragraph">One of the toughest aspects of working as a consultant engineer is that the coolest and most interesting projects are the ones I don’t get to talk about or share online! But as time marches on, sometimes I get to share a few of my secrets. One of those secrets is Zaber. Years back, I needed to find a reasonable cost linear motion system, with integrated motor drive, that provided a well documented library and good customer support. I ended up working with Zaber on that system, and came to rely more and more on their linear and rotary motion products for such systems. As I grew more familiar with these devices, Zaber released a few products into the microscopy industry, starting with an <a href="https://www.zaber.com/products/scanning-microscope-stages">XY stage platform</a> a few years back. Recently, Zaber released an <a href="https://www.zaber.com/products/microscopes/MVR">entire microscope system</a>. This microscope provides 3 channel LED excitation for fluorescence, a linear motor Z drive, motorized fluorescent filter cube changer, and XY top plate motorized stage.  </p>

<p class="wp-block-paragraph">One of the product engineers was kind enough to ask if I would give this new microscope an eyeball, so I spent some time with one of the younger employees at ARC to see if we could set it on fire or otherwise break it. 🙂 I’m happy to report it survived our abuse, no small feat for a microscope in my shop! </p>

<figure class="wp-block-image size-large"><img decoding="async" src="https://www.zaber.com/w/images/thumb/1/1b/MVRdaisychain6.jpg/264px-MVRdaisychain6.jpg" alt="Image from “Zaber MVR Automated Invert Review”" loading="lazy" referrerpolicy="no-referrer" data-remote=""></figure>

<p class="wp-block-paragraph"><strong>Unboxing &amp; Assembly </strong></p>

<p class="wp-block-paragraph">Microscopes typically require a knowledgeable sales rep or service expert to build. As a test of difficulty and complexity for system setup, I decided to assign my relatively new employee Garrett to the build. His report from the build experience was insightful: </p>

<p class="has-link-color wp-elements-2 wp-block-paragraph"><em>Overall, the assembly and the initial testing of the microscope was simple and concise. The assembly is pretty easy for a person’s first time building a microscope. The <a href="https://www.zaber.com/manuals/MVR">directions</a> were clear and provided great examples of what to look for in terms of parts and what to do. The assembly itself wasn’t too hard as screws were accessible and easy to get to. It was also a little fun seeing the microscope work at the end of the assembly. The whole microscope was packaged in a pelican shipping case, so the parts were well protected. Directions were very concise and provided much detail aligned with picture guidance. The motor locks are very good, they never moved or slid in the slightest during assembly.  Cable management is fairly good, doesn’t get in the way of any moving parts at any time.</em> <em> -Garrett Bunch</em></p>

<p class="wp-block-paragraph">We also noted some areas for improvement along the way.  For our model, the directions for mounting the microscope body and brackets, (5th hole) do not allow enough room for both the motor controller and the LED controller side-by-side as the picture shows. It would need to state at least the 6th or 7th hole. While used in all zaber systems, the the type of male cable connector for the X-DC02 cables were a little tricky to get connected. We had to fiddle with the inside thread on some of the internal drive connectors for a while to get it to connect properly. </p>

<p class="wp-block-paragraph">In summary, while we had the regular amount of small questions, this was quite a straightforward system to build. There are far fewer components on this microscope for the user to assemble than on other systems. It results that the build requires simple tools and techniques, and all of the hard jobs are already done at the factory. </p>

<p class="wp-block-paragraph"><strong>First Runs and XYZ performance</strong></p>

<p class="wp-block-paragraph">For our tests, we used a Hamamatsu Orca Flash 4.0 generously loaned to us from Hamamatsu. Connecting the camera to the microscope did demonstrate that cameras with a larger body would have a tough time fitting into the microscope access location on the sensor connection. We brought this to Zaber’s attention and were informed that they offer a riser kit for larger cameras, and can support cameras with large bodies. </p>

<figure class="wp-block-image size-large"><img decoding="async" src="https://austinblanco.com/wp-content/uploads/2021/02/IMG_3687-768x1024.jpg" alt="Camera connection area. Note the LED illuminator cube directly above the camera. Larger bodies will require a riser kit supplied by Zaber for mounting." class="wp-image-3044" loading="lazy" referrerpolicy="no-referrer" data-remote=""><figcaption class="wp-element-caption">Camera connection area. Note the LED illuminator cube directly above the camera. Larger bodies will require a riser kit supplied by Zaber for mounting. </figcaption></figure>

<p class="wp-block-paragraph">Motion performance on the system was as expected. The XY stage uses a standard setup of lead screws and stepper motors. The focus/Z drive uses a linear motor, which supports fast operation, high accuracy and repeatability, but at a higher cost of components. I think it was a good decision to use a linear motor with the focus drive, and would love to see Zaber add linear XY to this microscope.  </p>

<p class="wp-block-paragraph">The control over the microscope can be performed using an included joystick, the Zaber Console software, or a Micromanager driver. We elected to first configure things in the Zaber Console to confirm proper operation, then to set up MicroManager for automated capture. Micromanager’s driver is a bit confusing to link up between drivers (you have to determine what controller and axis are operating a given function, 3.g. Controller 01 Axis B might == the Filter turret changer). But once things were configured, we had zero communication issues with the driver. Below is a video captured demonstrating the speed on a repeated XY move using MicroManager MDA for control. </p>

<figure class="wp-block-image size-large"><img decoding="async" src="https://austinblanco.com/wp-content/uploads/2021/02/zaber-MVR-console-config-1024x325.png" alt="Config window for Zaber Console." class="wp-image-3052" loading="lazy" referrerpolicy="no-referrer" data-remote=""><figcaption class="wp-element-caption">Config window for Zaber Console. </figcaption></figure>

<p class="wp-block-paragraph">We used MM 2.0 Gamma for our testing. A demonstration of the XY motion can be seen in the video below. This example included large Z moves and multiple channel settings to better visualize the speed of channel switching and Z stepping.</p>

<iframe loading="lazy" src="https://drive.google.com/file/d/1Dz1k_BM2-EJbv_9STAiNPGZuEL9AMyDu/preview" width="640" height="480" title="Embedded content"></iframe>

<p class="wp-block-paragraph">Initial samples used were a quite beat up kidney section, to demonstrate typical fluorescence performance. The objective we added to the system was a Zeiss 40x without UV apo correction, so some Z shift in color is apparent. Field illumination gradient was adequate, overall image field to the camera was well covered. This camera is a great tool for such testing as almost the entire 25mm output from the tube lens can be captured. </p>

<iframe loading="lazy" src="https://drive.google.com/file/d/1a-KketSiAsNyVK67wLhY3rn8-AAZ2F0d/preview" width="640" height="480" title="Embedded content"></iframe>

<p class="wp-block-paragraph">Collection of Z stacks for PSF analysis was straightforward. For these tests we used typical tetra-speck bead sets from Life technologies. What I was interested to look for here were coma or aberrations due to off-axis construction, none of which were observed. The system appears to be stacked up squarely, which was great to see. </p>

<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="https://austinblanco.com/wp-content/uploads/2021/02/psf-1.png" alt="40x PSF in Z/X" class="wp-image-3038" width="572" height="278" referrerpolicy="no-referrer" data-remote=""><figcaption class="wp-element-caption">40x PSF in Z/X</figcaption></figure>

<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="https://austinblanco.com/wp-content/uploads/2021/02/psf-2.png" alt="40x PSF in ZY, note slight angular shift due to my failure to level the stage insert before scanning." class="wp-image-3039" width="298" height="406" referrerpolicy="no-referrer" data-remote=""><figcaption class="wp-element-caption">40x PSF in ZY, note slight angular shift due to my failure to level the stage insert before scanning. </figcaption></figure>

<p class="wp-block-paragraph"> To analyze the repeatability of the XY stage, several locations were saved on the bead slide, and then imaged in XYZ using MDA with timelapse. The resulting locations were then projected to produce a single image. Results showed repeatability in all axes within Zaber’s specification. The GIF below shows total drift over several hours. Note the stage is moving away from and re-visiting this location. Z drift from thermal is also evident, but to be expected without an automated focus tracking mechanism. </p>

<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="https://austinblanco.com/wp-content/uploads/2021/02/Beads-Timelapse-Drift-Test-40x.gif" alt="Single location timelapse of beads under 40x magnification." class="wp-image-3031" width="573" height="557" referrerpolicy="no-referrer" data-remote=""><figcaption class="wp-element-caption">Single location timelapse of beads under 40x magnification. </figcaption></figure>

<p class="wp-block-paragraph">Z stacks captured in a similar manner to the prior experiment demonstrated even better Z performance, due to the employment of a linear motor stage on the focus axis by Zaber. Here, a single section is scanned multiple times in Z. The timelapse of these scans is stacked, so that numerous re-scans on a single set of images represents the same location scanned over time. When projecting this scan orthogonally, variations in Z will be visible. While expecting some linear shift due to thermal, there is almost no “wiggle” in the Z axis, due to the linear motor being so precise. </p>

<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="https://austinblanco.com/wp-content/uploads/2021/02/Z-Center-Tracking-1024x242.png" alt="Image from “Zaber MVR Automated Invert Review”" class="wp-image-3040" width="1000" height="236" referrerpolicy="no-referrer" data-remote=""></figure>

<p class="wp-block-paragraph"><strong>LED Performance</strong></p>

<p class="wp-block-paragraph">To test the LED performance we wanted to target two areas: field illumination performance and linear intensity regulation. Testing both can be somewhat tricky as almost everything will bleach over time. I used the blue isolation region of my bead slide, and it’s white label, to capture 2 multichannel timelapse series. Overall field analysis of each channel was then graphed to demonstrate intensity regulation. While a very small spike was observed in the UV channel, all channels performed considerably well, and it appears intensity regulation is well handled on the drivers for these LEDs. </p>

<figure class="wp-block-image size-large"><img decoding="async" src="https://austinblanco.com/wp-content/uploads/2021/02/Blue-Section-of-LT-Bead-Slide-1024x622.png" alt="Intensity plot on blue section of Life Tech slide. Channel intensity looks linear." class="wp-image-3056" loading="lazy" referrerpolicy="no-referrer" data-remote=""><figcaption class="wp-element-caption">Intensity plot on blue section of Life Tech slide. Channel intensity looks linear. </figcaption></figure>

<figure class="wp-block-image size-large"><img decoding="async" src="https://austinblanco.com/wp-content/uploads/2021/02/white-label-region-LT-bead-slide-1024x608.png" alt="White label region of bead slide. Decay rates for all channels look good, no major deviations caused by LED regulation, aside from a small UV blip at the start." class="wp-image-3057" loading="lazy" referrerpolicy="no-referrer" data-remote=""><figcaption class="wp-element-caption">White label region of bead slide. Decay rates for all channels look good, no major deviations caused by LED regulation, aside from a small UV blip at the start. </figcaption></figure>

<p class="wp-block-paragraph">Field uniformity was great for a built-in LED system. This is always something tough to work on in a short-pathway LED excited system. Performance on multiple surfaces looked quite good. Some clipping can be seen at the upper left, due to camera placement. All channels showed this as well as a simple flashlight illuminated above, indicating this was due to my mounting and adjusting of the camera, rather than an excitation-side issue. </p>

<figure class="wp-block-image size-large"><img decoding="async" src="https://austinblanco.com/wp-content/uploads/2021/02/intensity-ps.png" alt="Blue region of bead slide, pseudo-color spectrum applied to better visualize intensity flatness." class="wp-image-3059" loading="lazy" referrerpolicy="no-referrer" data-remote=""><figcaption class="wp-element-caption">Blue region of bead slide, pseudo-color spectrum applied to better visualize intensity flatness. </figcaption></figure>

<p class="wp-block-paragraph"><strong>Further Observations</strong></p>

<p class="wp-block-paragraph">Zaber added a drop/refocus feature to the microscope, similar to an escape function on a traditional scope. Using the linear motor’s speed, it is quite a fast shift to go from escaped to “in focus”. While this demonstrates the speed of a linear motor system, I would take care as an owner to know if I were “escaped” or just assuming so, for if a sample were placed over the objective, and the system to “return” at such a high rate through the sample, I imagine damage would occur to the sample or objective, or both. At the same time, this demonstrates the capability of such a motor, and slowing motion down in firmware/software is easy, while speeding things up is hard! </p>

<iframe loading="lazy" src="https://drive.google.com/file/d/18kFSvQONczrd_2rHmD-PD0Gw6354UB1h/preview" width="640" height="480" title="Embedded content"></iframe>

<p class="wp-block-paragraph">While Zaber did a great job with the included LED illumination, I can imagine customers would also benefit from using a LLG-coupled or fiber coupled light source. 4 channels is adequate, but many clients need greater diversity in channel selection, and stuffing more than 3 LEDs into an excitation module on-scope can be tricky, so I hope Zaber offers this as an option in the future.</p>

<p class="wp-block-paragraph">The use of a linear motor for Z shows how great this motion method is for fast, reliable positioning. If Zaber were to add an autofocusing system to this axis, it would provide a nice improvement in market applicability for timelapse observations and high speed high magnification scanning. Similarly, the option to purchase a linear-motion XY top plate would be great, for those clients needing high speed scanning of a large region. </p>

<p class="wp-block-paragraph"><strong>Summary</strong></p>

<p class="wp-block-paragraph">I really like this microscope. It has the feel of an industrial motion system adapted to an optical platform, which makes sense considering its pedigree. I can imagine that this would make an excellent choice for a plate scanning system, would do well coupled to an incubator, or would be a great fit for commercial clients working on automated analysis of a product, reagent or similar project. The addition of an integrated autofocusing system using reflection would greatly expand the use of this scope into timelapse live-cell work, where it’s shape and design would be a great fit for an incubation enclosure. </p>

<p class="wp-block-paragraph">Customers who would do well with this microscope are those with some technical chops, who also don’t want to hand-build a microscope due to time constraints, or commercial customers who need a no-frills motorized microscope for scanning. As a company, Zaber has always provided great technical support and has a history of building precision motion systems at fair prices, so I would definitely recommend considering this system if you are in the market for an automated microscope. </p>

<p class="wp-block-paragraph">-Austin Blanco &amp; Garrett Bunch</p>

<pre class="wp-block-preformatted"><em>(Disclosure) - I was not compensated for writing this review, and my observations and commentary are my own. - AB</em></pre>]]></content:encoded></item>
<item><title>Setting Triggerscope Range Values</title><link>https://austinblanco.com/posts/setting-triggerscope-range-values.html</link><guid isPermaLink="true">https://austinblanco.com/posts/setting-triggerscope-range-values.html</guid><pubDate>Wed, 03 Feb 2021 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><description>Here is a quick example of using the RANGE controls in the Triggerscope GUI Application, as well as an example of saving ranges to the on board SD Card.</description><content:encoded><![CDATA[<p class="wp-block-paragraph">Here is a quick example of using the RANGE controls in the Triggerscope GUI Application, as well as an example of saving ranges to the on board SD Card. </p>

<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Triggerscope DAC Range Setting Demo" src="https://www.youtube.com/embed/yehCfkW6ixY?feature=oembed" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>

<p class="wp-block-paragraph">EDIT – Fixed Video link! </p>]]></content:encoded></item>
<item><title>Triggerscope 4 Getting Started Video &amp; MM Firmware</title><link>https://austinblanco.com/posts/triggerscope-4-getting-started-video.html</link><guid isPermaLink="true">https://austinblanco.com/posts/triggerscope-4-getting-started-video.html</guid><pubDate>Mon, 01 Feb 2021 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><description>We’ve made a new video example of how to get things set up on the Triggerscope with the “Micromanager” version firmware from Nico.</description><content:encoded><![CDATA[<p class="has-link-color wp-elements-3 wp-block-paragraph">We’ve made a new video example of how to get things set up on the Triggerscope with the “Micromanager” version <a href="https://github.com/micro-manager/TriggerScopeMM">firmware from Nico</a>. Please take a look if you are interested in updating your Triggerscope to use this code, or if you want to learn more about using Shutters, blanking, and presets for the -MM firmware device. </p>

<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Triggerscope MM Firmware Setup and Use Demo" src="https://www.youtube.com/embed/IgaqnItAfas?feature=oembed" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>

<p class="wp-block-paragraph">-Austin</p>]]></content:encoded></item>
<item><title>New Product Announcement – 3.3 – 5V TTL Level Shifter</title><link>https://austinblanco.com/posts/new-product-announcement-3-3-5v-ttl-level-shifter.html</link><guid isPermaLink="true">https://austinblanco.com/posts/new-product-announcement-3-3-5v-ttl-level-shifter.html</guid><pubDate>Mon, 28 Sep 2020 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><description>Recently one of my clients was working with a Blackfly S camera from FLIR, and noticed that the TTL signaling was not working properly.</description><content:encoded><![CDATA[<p class="has-link-color wp-elements-4 wp-block-paragraph">Recently one of my clients was working with a <a href="https://www.flir.com/products/blackfly-s-usb3/">Blackfly S</a> camera from FLIR, and noticed that the TTL signaling was not working properly. With some investigation, we discovered the cause to be the camera running at 3.3V output TTL, with very little drive current, whereas the Triggerscope is configured to accept 5V input TTL signals. </p>

<figure class="wp-block-image size-large is-style-rounded"><img decoding="async" src="https://arc.austinblanco.com/wp-content/uploads/2020/09/FLIR-PTG-ASSY_2020-Sep-28_05-45-11PM-000_CustomizedView19886717750.png" alt="Image from “New Product Announcement – 3.3 – 5V TTL Level Shifter”" loading="lazy" referrerpolicy="no-referrer" data-remote=""></figure>

<p class="has-link-color wp-elements-5 wp-block-paragraph">Needing to address this problem, we used a standard level shifting circuit, and stuffed the wires into a small enclosure. After thinking about this, I figured others may have the same problem (not only with PTG or FLIR cameras, but others also), and so decided to roll out a dedicated PCB to address this need. So – it’s <a href="https://arc.austinblanco.com/product/ttl-3v-5v-level-shifter-for-flir-point-grey-cameras/">posted to the store website</a>. The circuit diagram can be seen below for those interested. You can place orders for these on the <a href="https://arc.austinblanco.com/product/ttl-3v-5v-level-shifter-for-flir-point-grey-cameras/">storefront here</a>, with shipping as early as the week of 10/12/20. </p>

<p class="has-link-color wp-elements-6 wp-block-paragraph">This can be used with any device that outputs a 3.3v signal. If you have questions on how to connect things or if it will work for your system, please don’t hesitate to <a href="https://arc.austinblanco.com/contact/">contact us</a>! – Austin</p>

<figure class="wp-block-image size-large"><img decoding="async" src="https://austinblanco.com/wp-content/uploads/2020/09/FLIR-PTG-33V-SHIFTER-SCHEMA-1024x743.png" alt="Click to Enlarge Schema" class="wp-image-3009" loading="lazy" referrerpolicy="no-referrer" data-remote=""></figure>]]></content:encoded></item>
<item><title>Triggerscope 4 Released – with New Software and New Micromanager Driver Options</title><link>https://austinblanco.com/posts/triggerscope-4-released-with-new-software-and-new-micromanager-driver-options.html</link><guid isPermaLink="true">https://austinblanco.com/posts/triggerscope-4-released-with-new-software-and-new-micromanager-driver-options.html</guid><pubDate>Fri, 18 Sep 2020 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><description>I’m excited today to announce the release of the Triggerscope version 4. TG4 marks a major improvement in the performance and capability of the…</description><content:encoded><![CDATA[<h2 id="i-m-excited-today-to-announce-the-release-of-the-triggerscop">I’m excited today to announce the release of the Triggerscope version 4. TG4 marks a major improvement in the performance and capability of the Triggerscope. </h2>

<figure class="wp-block-image aligncenter is-resized"><img loading="lazy" decoding="async" src="https://austinblanco.com/wp-content/uploads/2020/09/TG4-1-1024x768.jpg" alt="Image from “Triggerscope 4 Released – with New Software and New Micromanager Driver Options”" class="wp-image-3000" width="398" height="299" referrerpolicy="no-referrer" data-remote=""></figure>

<h2 id="new-features"><strong>New Features</strong></h2>

<ul class="wp-block-list">
<li>At the heart of Triggerscope 4 is a New high speed MCU running @ 600 Mhz. This is an 83x improvement over the Triggerscope 3B. </li>

<li>On board 1024K MCU RAM provides more than enough memory for arrays.</li>

<li>A new features provides access to a 16GB External SD Card, installed inside. Memory may be used for storing data for sequence access, recording of external parameters and timing events, or saving of advanced settings. </li>

<li>A new Real Time Clock is included for better timing over long duration experiments and delays. </li>

<li>DAC update rates can be overclocked, to a maximum frequency of 270kHz. </li>

<li>Integrated and simplified external controls for easier operation. </li>
</ul>

<figure class="wp-block-image"><img decoding="async" src="https://austinblanco.com/wp-content/uploads/2020/09/TGsSC-1024x593.png" alt="Image from “Triggerscope 4 Released – with New Software and New Micromanager Driver Options”" class="wp-image-3001" loading="lazy" referrerpolicy="no-referrer" data-remote=""></figure>

<h2 id="new-software">New Software</h2>

<p class="wp-block-paragraph">In addition to the release of Triggerscope 4, ARC is introducing a python-based, multi-platform compatible standalone control application. Our application can be installed on Windows, OS-X, or Linux systems. Source is also available from the GitHub Repo here. Users have two options for use – EXE and APP executables provide a small containerized version of python, so the entire application runs without any external installs required. Or, for customers who already have python installed, simply downloading and running the native python file is an option.</p>

<p class="wp-block-paragraph">For debugging, all communication between the software and the triggerscope are printed for the user to view, to make diagnostics and custom driver development as simple as possible. </p>

<figure class="wp-block-image aligncenter is-resized"><img loading="lazy" decoding="async" src="https://austinblanco.com/wp-content/uploads/2020/09/TGS1-1024x190.png" alt="Image from “Triggerscope 4 Released – with New Software and New Micromanager Driver Options”" class="wp-image-3002" width="787" height="146" referrerpolicy="no-referrer" data-remote=""></figure>

<p class="has-link-color wp-elements-7 wp-block-paragraph">Light and Dark themes are provided to keep monitor glare down during imaging. This software is available for all Triggerscope 3 and up devices, and can be found on our <a href="https://github.com/AdvancedResearchConsulting/Triggerscope-GUI">GitHub Repo here</a>. </p>

<figure class="wp-block-image is-resized"><img loading="lazy" decoding="async" src="https://austinblanco.com/wp-content/uploads/2020/09/TGssDrk-1024x170.png" alt="Image from “Triggerscope 4 Released – with New Software and New Micromanager Driver Options”" class="wp-image-3003" width="788" height="130" referrerpolicy="no-referrer" data-remote=""></figure>

<h2 id="new-micromanager-firmware-options">New Micromanager Firmware Options</h2>

<p class="wp-block-paragraph"> Nico Stuurman recently undertook a huge endeavor, and implemented a new approach for using MicroManager and the Triggerscope, with faster syntax, greater memory capacity, and tight integration into the Micromanager sequencing system for fast device control. ARC can install this firmware option before your triggerscope ships, just let us know which version you’d like to use! </p>

<ul class="has-link-color wp-block-list wp-elements-8">
<li>If you already have a triggerscope, and would like to use the new TriggerscopeMM Firmware, please refer to the <a href="https://micro-manager.org/wiki/TriggerScopeMM">MicroManager device adaptor variant here</a>. </li>
</ul>

<p class="has-link-color wp-elements-9 wp-block-paragraph">For Information on setting up the Triggerscope 4, please <a href="https://docs.google.com/document/d/13OtzqhJc6QlTVzQQjW094r0ShG2ocjKoVsy8aUYu28s/edit#">refer to this guide</a>. </p>

<h2 class="has-link-color wp-block-heading wp-elements-10" id="purchase-your-triggerscope-4-at-the-arc-online-store-here">Purchase your Triggerscope 4 at the <a href="https://advancedresearch-consulting.com/product/triggerscope-4/">ARC Online Store here</a>. </h2>

<p class="wp-block-paragraph">-Austin</p>]]></content:encoded></item>
<item><title>Raspberry Pi High Quality Camera – Can it be Cooled?</title><link>https://austinblanco.com/posts/raspberry-pi-high-quality-camera-can-it-be-cooled.html</link><guid isPermaLink="true">https://austinblanco.com/posts/raspberry-pi-high-quality-camera-can-it-be-cooled.html</guid><pubDate>Sat, 20 Jun 2020 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><description>Thanks to some generous industry friends, I finally managed to get my hands on a seemingly unobtanium RPI “High Quality” camera.</description><content:encoded><![CDATA[<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Raspberry PI High QUality Camera Cooling Run" src="https://www.youtube.com/embed/Qc0pfO5IAjg?feature=oembed" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>

<p class="has-link-color wp-elements-11 wp-block-paragraph">Thanks to some generous industry friends, I finally managed to get my hands on a seemingly unobtanium RPI “High Quality” camera. I’ll have more info on the camera itself regarding performance, but my first question was – “can it be effectively cooled? ” Fortunately, having run similar experiments on a <a href="https://austinblanco.com/posts/cooling-pt-grey-camera.html">Point Grey / FLIR camera</a>, I had most of the components and a basic test method ready to go to figure out the answer. </p>

<p class="wp-block-paragraph">To start, we simply piled up thermal tape on the backside of the camera. This provided a poor but useable thermal coupling to the back of the camera PCB. Ideally, we would wrap the entire camera system in aluminum, but for now, this works. Next, we used a off the shelf TEC, and a CPU radiator, for the heat exchange. </p>

<figure class="wp-block-image is-resized"><img loading="lazy" decoding="async" src="https://austinblanco.com/wp-content/uploads/2020/06/IMG_4039-576x1024.png" alt="The camera sits atop a TEC, which sits on an aluminum block, which sits on top of a CPU cooling sink." class="wp-image-2990" width="582" height="1035" referrerpolicy="no-referrer" data-remote=""><figcaption class="wp-element-caption">The camera sits atop a TEC, which sits on an aluminum block, which sits on top of a CPU cooling sink. </figcaption></figure>

<p class="wp-block-paragraph"><br><br>To test performance, we obtained 40 images with an exposure time of 5 seconds. We only ran the TEC at 1V / 125mA. While running the experiment we recorded an IR video to document the reaction. What is quite evident at about the halfway mark, when the cooler is enabled, is that the TEC Cold side goes “dark”, and shortly thereafter the aluminum C mount housing of the camera as well as the exposed PCB begins to cool down. Images obtained showed corresponding drops in background intensity of ~ 10% for this test. Not amazing, but the drop in mean image intensity directly matches the enable and disable of the cooler. Further tests will include a tightly wrapped enclosure to better thermally sink the complete camera sensor cell and PCB. </p>

<figure class="wp-block-image aligncenter is-resized"><img loading="lazy" decoding="async" src="https://austinblanco.com/wp-content/uploads/2020/06/data.png" alt="A drop of ~ 8 counts can be seen after the cooler is enabled. Once the Cooler is disabled at ~ frame 24, the mean continues rising." class="wp-image-2991" width="934" height="579" referrerpolicy="no-referrer" data-remote=""><figcaption class="wp-element-caption">A drop of ~ 8 counts can be seen after the cooler is enabled. Once the Cooler is disabled at ~ frame 24, the mean continues rising.</figcaption></figure>

<p class="wp-block-paragraph">Of additional interest is the noise in the image from the readout taps. Of the images obtained, a clear pattern can be seen, again with the lens cover on and exposures of 5 seconds. A bloom can be seen on one side. I’m curious how this may change with a better cooling system. Below is a pseudo-colored maximum intensity projection of the 40 frames obtained during the experiment. </p>

<figure class="wp-block-image"><img decoding="async" src="https://austinblanco.com/wp-content/uploads/2020/06/PS-MAX-1024x578.png" alt="Image from “Raspberry Pi High Quality Camera – Can it be Cooled?”" class="wp-image-2993" loading="lazy" referrerpolicy="no-referrer" data-remote=""></figure>

<p class="wp-block-paragraph">A basic example of read noise on the taps can be seen by looking at the standard deviation over the frames. This isn’t perfect but it does show a general amount of error in readout. Performance here was not bad at 3 counts maximum change over the sensor field. <br><br></p>

<figure class="wp-block-image"><img decoding="async" src="https://austinblanco.com/wp-content/uploads/2020/06/stddev-1024x601.png" alt="Image from “Raspberry Pi High Quality Camera – Can it be Cooled?”" class="wp-image-2994" loading="lazy" referrerpolicy="no-referrer" data-remote=""></figure>

<p class="wp-block-paragraph">As with all such tests – further study is needed :-). We plan on taking this camera through it’s paces in a lot more detail – so – more to come soon!<br><br></p>

<p class="wp-block-paragraph">-Austin</p>]]></content:encoded></item>
<item><title>How to Succeed at Working From Home</title><link>https://austinblanco.com/posts/how-to-succeed-at-working-from-home.html</link><guid isPermaLink="true">https://austinblanco.com/posts/how-to-succeed-at-working-from-home.html</guid><pubDate>Fri, 13 Mar 2020 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><description>All over the world people are being asked to work from home… Yet how many of us have had to do so for extended periods of time?</description><content:encoded><![CDATA[<figure class="wp-block-image"><img decoding="async" src="https://austinblanco.com/wp-content/uploads/2020/03/home.png" alt="Image from “How to Succeed at Working From Home”" class="wp-image-2985" loading="lazy" referrerpolicy="no-referrer" data-remote=""></figure>

<p class="wp-block-paragraph">All over the world people are being asked to work from home… <br></p>

<p class="wp-block-paragraph">Yet how many of us have had to do so for extended periods of time? As a case in point, are you reading this now while sitting at the office? Or, worse – while sitting at home, when you <em>should be working?</em> If so, this guide is for you! I also have experienced this challenge, but have had the opportunity to refine my work procedures while conducting business at home for the last 20 years. So – if you are working from home today, or plan to do so in the future, I hope these tools will help you maximize your enjoyment and impact while away from the office. The following sections I hope will give you clarity of purpose, the proper mindset to work alone, a set of practical tools to work alone, and finally, a method to evaluate how well you are doing at coping with this change. <br></p>

<p class="wp-block-paragraph"><strong>Preparing the heart and mind to work alone</strong></p>

<p class="wp-block-paragraph"> To be free to operate independently is a privilege. For most people over the course of history, employers or overseers would not or could not trust those they watched to “work hard”. As a result, work was “managed”, typically under brutal forms of motivation. Of course, there were notable exceptions to this. In the New Testament we find Jesus using a story of three servants who are given large sums of money, “Talents”. All are given rather large, but different sums of money (roughly, 1-3 years’ wages), and told to use the money for the masters’ benefit. Two of them do so, realizing a gain, while the third, buries the money. When the master returns, the two who have profited are rewarded with further authority. The third returns the original sum, saying, “Master I know you are a hard man, taking what you did not earn, reaping what you did not sow, and so I was afraid and hid the money, so here is your Talent back.” But the master replies, “You know I was a hard man? At least you could have put the money in the bank and earned interest!”. The servant is then fired. This to me is a fascinating story. It tells us so much about how life was 2,000 years ago, and what we can basically see is that not much has changed today. Leaders of companies may be tough people, oftentimes we will find ourselves questioning the morality or fairness of the decisions they make. Some wrestle with a love of money so intense that they will allow others to be hurt, so that they can gain further wealth. At the same time, we can see that those of us who use resources wisely are given further trust – and can we not see this principle applies today? If we at our work prove ourselves capable and responsible with the freedom and authority we are granted, most of the time, we will be offered greater freedom and authority. Now of course this is not 100% of the time – when it isn’t, I’d suggest the management is not doing well – as this principle is a simple, effective and fair one for any organization. So – whether by promotion, a change in work policy, a change in life situation, or even a global pandemic, here we find ourselves with this new authority – the authority to do <em>what we want, when we want, and with no one watching over us</em>. So what will you do with this new authority over yourself? The question itself is defined by one word: <strong>Integrity</strong> <br></p>

<p class="wp-block-paragraph"> In the Marine Corps, one of the principles drilled into our heads was that integrity is what you do when your drill instructor isn’t there. Similarly for us, integrity is what we will do at home when our management, more importantly <em>our team</em> isn’t there to motivate us and keep an eye on us. So these stories convey operational principles and the question of our own personal morality. We all must ask ourselves if what we are doing is the Right Thing. So, here are some thoughts to keep handy while working, or in case you find yourself browsing facebook during work time:<br></p>

<ul class="wp-block-list"><li><strong>YOUR COMPETITOR IS WORKING HARDER THAN YOU RIGHT NOW </strong>If you don’t work hard, keep in mInd the people who you compete with. They are likely also at home – and if they are working harder than you, at some point this energy difference will result in your company losing it’s position, resulting in you losing your employment. This is harsh, but I think we can all agree rather obvious. </li><li><strong>DISCIPLINE PROVIDES OPPORTUNITY AND POWER </strong>If you do work hard, you can realize the personal joy and pride of knowing you did well for yourself, your team, all on your own – further, you can grasp the power of your discipline, knowing that you can work on your own in any other job! This opens up a massive new world of employment opportunities – as there are quite a few people who simply cannot discipline themeselves! So you are more capable, a better team member, more employable, and ultimately, have greater freedom as a result of your discipline and efforts. </li><li><strong>YOU ARE NOT A THIEF – SO DON’T STEAL. </strong>If you are being paid to work, and are not working, you are stealing. Not only from your employer, but from those members of your group who ARE working hard while you don’t. You may not consider the owners or management worthy of your integrity, but we should all consider our peers as deserving of our best. Get after it.</li></ul>

<p class="wp-block-paragraph"><strong>Practical tools for working at home</strong><br></p>

<p class="wp-block-paragraph"><strong>Prepare yourself</strong></p>

<p class="wp-block-paragraph"><strong>	</strong>For the next few months – keep your regular work routine as much as you possibly can. Get up and dress in your work clothes. Do whatever you need to be presentable and prepared for your job. Eat breakfast as you normally would at the same time. All of these activities will help mentally set the stage to understand that “We are now working”. I know it seems wasteful – but the mind needs this routine, especially when so many changes are all around us. Bear in mind, your work commute now takes 3 seconds, and traffic is always light! <br></p>

<p class="wp-block-paragraph"><strong>Prepare your “office”</strong></p>

<figure class="wp-block-image"><img decoding="async" src="https://austinblanco.com/wp-content/uploads/2020/03/Office-2002-797x1024.png" alt="My office in 2002. Note the Ghost Recon game &amp; IPA were NOT during work hours! 🙂 Our 700 sq/ft apartment was small, but I accomplished a ton of work from this tiny desk!" class="wp-image-2984" loading="lazy" referrerpolicy="no-referrer" data-remote=""><figcaption>My office in 2002. Note the Ghost Recon game &amp; IPA were NOT during work hours! 🙂 Our 700 sq/ft apartment was small, but I accomplished a ton of work from this tiny desk! </figcaption></figure>

<p class="wp-block-paragraph">My first office was a piece of junk computer stand 4 feet from our kitchen in a one bedroom apartment (pictured above). From that little cove I covered a sales territory encompassing all of northern California for 2 years. In that time I attained a salesperson of the year award from Molecular Devices. But I MADE THE SPACE for my office, and when I was sitting there, even when the wife was watching tv 5 feet away, I was “at work” during business hours. Because so many of us find ourselves without preparation today, you might make your office be the kitchen table or even a folding table for now. But – wherever it is it should be away from the living room if possible, and in a place where there are the least possible distractions. In front of a window? Close it if it’s distracting. You can open it after you rebuild the routine. In a noisy location? Amazon prime a headset. But make the space, and remember that while you are there, you are “away at work”, away from the responsibilities of the home, away from the XBOX, away from the kitchen. Those things don’t exist, because you aren’t there – you are at the office! <br></p>

<p class="wp-block-paragraph"><strong>Prepare your schedule</strong></p>

<p class="wp-block-paragraph">	As you are now your own boss at home, you will probably find it hard to stay motivated, as until there is a deadline, do I really <em>have to do this now? </em>Yes you do! Using our calendar, block out time for each project as you need. Make sure to include a 15 minute break every so often, as well as your lunch break. This is helpful as when the desire to check Instagram hits – it’s better to have an alternative – e.g. “Well I only have 2 hours to finish this data entry project, so if I hit instagram right now I won’t have time for the job”, instead of “Hey let’s go see what’s up on instagram, there isn’t anything pressing at work right now…”. The difference in mental position is amazing. <br></p>

<p class="wp-block-paragraph"><strong>Prepare your family</strong></p>

<p class="wp-block-paragraph">	Kids and the spouse may find it tough to understand why they can’t pester you while at home. This is very important to draw a line while working. If they are interrupting you while at work in the house, they are literally taking food from their own mouths (is your competitor allowing such distraction? No? Then you are losing right now!!!). Your work is important, and they must honor your endeavour. This simply takes training and repetition to realize for them, but give it a few days and they will see your clothes, you sitting at the office, and soon realize, “Mom is working right now, I can’t bother her”. Now – I should note that one of the greatest joys for me is allowing my boys into my work life. I’ve had them help with many work projects, learning along the way.  Over the years we have developed a system where they will visit the office to tell me stories about school, ask questions on things etc. But at first – the barrier must be established <em>for your benefiet as well as theirs</em>. If you allow distractions now, they won’t respect your requests later for peace and quiet. Further, what are you telling them about the value of your work? So have the family meetings as many times as are needed, and keep up the barrier for the short term. In a few months you can experiment with opening that up – but this is a tough change for you – so minimize the number of fronts you need to be fighting on at the same time! <br></p>

<p class="wp-block-paragraph"><strong>Prepare your management</strong></p>

<p class="wp-block-paragraph"> Any time we are suddenly gone from the office, management can have trouble. People in leadership positions can have greater fear, greater uncertainty, than those in operational positions. So as bad as things may be for you with this change, it’s worse for them! Further, while you are struggling with how to cope with the change, they are doing the same, but also struggling with how to handle the managerial/directive changes needed to keep things going. In this time of chaos, you can be the stable anchor. This requires some creative thinking, good communication and diligent follow through. </p>

<ul class="wp-block-list"><li><strong>Get the tools you need.</strong> This is critical. If you do assembly work, check out or record the tools needed from the office and take them home. If you need a soldering iron, buy one. If you need to have supplies shipped to you or you need to have a monday pickup / friday drop-off, talk with management and set it up. Ultimately there is a way to do your work anywhere – it might not be optimal, but it is possible. Be creative and solve these problems for your management, so they can worry about others and not you. . </li><li>During online meetings, <strong>write down the tasks</strong> you are supposed to accomplish, and then review them with the team or leader at the end of the meeting. </li><li>Share your online “self-schedule” with your management – this can be a great way to help them allocate resources. It’s much better to have a conversation where you say, “Hey I am trying to maximize my work in this situation, so I’ve cooked up a work schedule for myself. Please take a second to look at it and let me know if you want anything changed.”. If they see this, and have half a brain, the reaction will be “Wow, his employee is good to go – and I’m lucky they are so self reliant!”</li><li>If you are running out of things to do at home, spend some time thinking up new things you can do to help the team. Brainstorm with management – This is quite important because ultimately, if you do run out of things to do, why should the company keep paying you? With enough creative thinking and hard work, you should never end up with nothing to do.</li></ul>

<p class="wp-block-paragraph"><strong>Conclusion</strong></p>

<p class="wp-block-paragraph">      I have set a rather strong tone on this subject. I have done so because initially, it takes a heap of effort to think differently about your work. But what also needs to be understood is the amazing freedom, efficiency and joy of working in isolation. How long is your commute? 30 minutes? You now have 5 hours back in your life, <strong>5 hours</strong>. That’s almost a work day! What can you do with 5 new hours in your life? Learn a new skill? Spend more time with your family? This new time is a gift, and the only loss is the auto company and gas station! Learning to work this way makes you exponentially more powerful and employable. If an employer can see that you are capable of working like this – will they really question you when you ask for greater autonomy? Further, when you do meet in person, your meeting time will be more valued, and you will find greater joy in sharing time with colleagues. The richness of doing work together will be realized as now, it will be rare. </p>

<p class="wp-block-paragraph">As with all things in life – today can be a chance for us to shrink from what we are called to do, or to rise to the challenge, and grow as a result. But having tools helps in our growth. I hope some of these tools help you in learning to adapt to this new work environment you may find yourself in. Good luck!   – Austin</p>]]></content:encoded></item>
<item><title>8020 Extrusion Optic Sliders</title><link>https://austinblanco.com/posts/8020-extrusion-optic-sliders.html</link><guid isPermaLink="true">https://austinblanco.com/posts/8020-extrusion-optic-sliders.html</guid><pubDate>Mon, 19 Aug 2019 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><description>For some time now I’ve been using 8020 extrusion for quick prototyping of optical assemblies.</description><content:encoded><![CDATA[<p class="has-link-color wp-elements-12 wp-block-paragraph">For some time now I’ve been using 8020 extrusion for quick prototyping of optical assemblies. It’s great for assemblies which require longer focal lengths and larger elements. <br>For such systems, the choices are to use a breadboard or table, with posts – and then line everything up, having to worry at minimum about elevation and rotation of each element. Once lined up the parts aren’t quite easily moved around. For my parts, I simply created a negative profile for the <a href="https://8020.net/25-2525.html">“8020” 2525</a> brand of extrusion, then placed a 32mm circle at the center of this profile with vertical clearance. Likely I should have placed it higher, but for most elements it’s simple to create a clamp, send it to the 3-D printer, stick the element inside and voila, held at an axial center, generally en face, and very easy to slide back and forth. </p>

<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-5 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image"><img decoding="async" data-id="2977" src="https://austinblanco.com/wp-content/uploads/2019/08/Screen-Shot-2019-08-19-at-3.02.17-PM-1024x774.png" alt="Image from “8020 Extrusion Optic Sliders”" class="wp-image-2977" loading="lazy" referrerpolicy="no-referrer" data-remote=""></figure>
</figure>

<p class="wp-block-paragraph">For complicated systems which may use reflection or episcopic combined paths, additional pieces of extrusion can be cut and aligned to a core axis quite easily, and even attached in 3 rotations (left, right and “up” from the primary optical axis). Extrusion pieces can be ordered pre-cut, or easily cut to length using a hacksaw. Right angle clamps avoid any angular errors caused by bad cuts. Personally I use a mill to face off the ends, but most people don’t have access to a mill. </p>

<figure class="wp-block-image"><img decoding="async" src="https://austinblanco.com/wp-content/uploads/2019/08/Screen-Shot-2019-08-19-at-3.06.31-PM-877x1024.png" alt="In this image I use the extrusion to align a large optic, with further parts out of frame." class="wp-image-2975" loading="lazy" referrerpolicy="no-referrer" data-remote=""><figcaption class="wp-element-caption">In this image I use the extrusion to align a large optic, with further parts out of frame. </figcaption></figure>

<p class="wp-block-paragraph">To make things even easier, it’s nice to be able to mark off critical dimensions on the extrusion with a felt tip pen, which is easily later removed from the anodized surface with IPA.  </p>

<figure class="wp-block-image"><img decoding="async" src="https://austinblanco.com/wp-content/uploads/2019/08/T-1-563x1024.png" alt="In this example a high power excitation input was designed in Zemax to squeeze a bit more power from a fluorescent system. Before building the assembly the profile extrusion was used to verify the field collimation and flatness at the desired focal length." class="wp-image-2976" loading="lazy" referrerpolicy="no-referrer" data-remote=""><figcaption class="wp-element-caption">In this example a high power excitation input was designed in Zemax to squeeze a bit more power from a fluorescent system. Before building the assembly the profile extrusion was used to verify the field collimation and flatness at the desired focal length. </figcaption></figure>

<p class="wp-block-paragraph">I’ve added all of the designs I frequently start from, in STEP format. If someone needs another format please let me know and I’ll export one. </p>

<p class="has-link-color wp-elements-13 wp-block-paragraph">The files are <a href="https://github.com/AdvancedResearchConsulting/CAD">hosted on my CAD share on Github Here</a>. </p>

<p class="wp-block-paragraph">-Austin</p>]]></content:encoded></item>
<item><title>Laser Alignment for Microscopes Using 3D Printed Parts</title><link>https://austinblanco.com/posts/laser-alignment-for-microscopes-using-3d-printed-parts.html</link><guid isPermaLink="true">https://austinblanco.com/posts/laser-alignment-for-microscopes-using-3d-printed-parts.html</guid><pubDate>Tue, 13 Aug 2019 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><description>A few months back I was working on a custom microscope that required several sections to be aligned.</description><content:encoded><![CDATA[<p class="has-link-color wp-elements-14 wp-block-paragraph">A few months back I was working on a custom microscope that required several sections to be aligned. The camera to be centered on it’s axis and aligned to the objective, the excitation wide-field illuminator to be aligned to the back aperture of the objective (and for that alignment to be coaxial), and finally, a laser source to be aligned into the back aperture as well. <br><br>Before the on site work, I decided to cook up a little “starter” jig, that would screw into the objective threads, and easily identify whether the laser was in fact coaxial. It worked fairly well, so I figured I’d share the model for anyone who wants it. You can find the f3d, STEP and STL files <a href="https://github.com/AdvancedResearchConsulting/CAD">here on  Github</a> – Note the threads modeled work decently, but are my own mod job off of another fine pitch close-ish thread. They worked great when printed using my Prusa MK3, so I figure most people using the model should have no issues.  I’ll probably make one for Olympus RMS threads when the need arises.</p>

<figure class="wp-block-image"><img decoding="async" src="https://austinblanco.com/wp-content/uploads/2019/08/image.png" alt="Image from “Laser Alignment for Microscopes Using 3D Printed Parts”" class="wp-image-2971" loading="lazy" referrerpolicy="no-referrer" data-remote=""></figure>

<p class="wp-block-paragraph">Some additional screenshots of the tool. </p>

<figure class="wp-block-image"><img decoding="async" src="https://austinblanco.com/wp-content/uploads/2019/08/image-1.png" alt="Image from “Laser Alignment for Microscopes Using 3D Printed Parts”" class="wp-image-2972" loading="lazy" referrerpolicy="no-referrer" data-remote=""></figure>]]></content:encoded></item>
<item><title>High Speed Triggering for Micromanager using Triggerscope Stream Script</title><link>https://austinblanco.com/posts/high-speed-triggering-for-micromanager-using-triggerscope-stream-script.html</link><guid isPermaLink="true">https://austinblanco.com/posts/high-speed-triggering-for-micromanager-using-triggerscope-stream-script.html</guid><pubDate>Sat, 27 Jul 2019 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><description>Over the past few years, I’ve often battled the Micromanager MDA window, when needing to perform high speed triggered acquisitions.</description><content:encoded><![CDATA[<p class="wp-block-paragraph">Over the past few years, I’ve often battled the Micromanager MDA window, when needing to perform high speed triggered acquisitions. While the system works well for multi channel Z stacks, running timelapse 2 channel streams, or “Z first” streams, didn’t work well. To overcome this, I’ve written a script that pulls all of the MDA user settings out of the window, loads up the Triggerscope, and captures the sequence. </p>

<p class="wp-block-paragraph">This approach gives any user of the triggerscope far greater control over how sequences are run, and offers users the ability to customize external device commands if needed. </p>

<p class="wp-block-paragraph">I’ve cooked up a brief video overview here, with some example screenshots of the results on an oscilloscope below. </p>

<ul class="has-link-color wp-block-list wp-elements-15">
<li>If you’d like to use or check the script out, it can be found on my <a href="https://github.com/AdvancedResearchConsulting/MicroManagerTriggerStream">GitHub site here</a>. </li>

<li>Please note this requires updated firmware (V 600 or up)</li>
</ul>

<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Triggerscope Stream Script" src="https://www.youtube.com/embed/BQVZWyNnd7k?start=7&amp;feature=oembed" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>

<p class="wp-block-paragraph">A basic example of a Z stack in a single channel is shown below. In this configuration, 1 channel is selected in the MDA window, and a single Z stack is collected. The Yellow line indicates intensity of a laser or LED on Ch1, the pink line indicates the Z voltage output, and the blue line indicates a TTL input from the camera. </p>

<figure class="wp-block-image"><img decoding="async" src="https://austinblanco.com/wp-content/uploads/2019/07/1-Channel-with-Z.png" alt="Image from “High Speed Triggering for Micromanager using Triggerscope Stream Script”" class="wp-image-2962" loading="lazy" referrerpolicy="no-referrer" data-remote=""></figure>

<p class="wp-block-paragraph">In the next example, output from a “channel first” Z capture is shown. Here Channel is prioritized, so the system runs Ch1 , then captures all Z frames, thens witches to Ch2, and captures all Z frames. </p>

<figure class="wp-block-image"><img decoding="async" src="https://austinblanco.com/wp-content/uploads/2019/07/2-Channel-Channel-First.png" alt="Image from “High Speed Triggering for Micromanager using Triggerscope Stream Script”" class="wp-image-2963" loading="lazy" referrerpolicy="no-referrer" data-remote=""></figure>

<p class="wp-block-paragraph">Next, is an example of a capture previously impossible in MM. In this capture we stream 3 time loops back to back, with no delay. </p>

<figure class="wp-block-image"><img decoding="async" src="https://austinblanco.com/wp-content/uploads/2019/07/Time-Sequence-Channel-First.png" alt="Image from “High Speed Triggering for Micromanager using Triggerscope Stream Script”" class="wp-image-2967" loading="lazy" referrerpolicy="no-referrer" data-remote=""></figure>

<p class="wp-block-paragraph">Next up is an example of a “Z First” capture, where all channels are acquired for a single Z position.</p>

<figure class="wp-block-image"><img decoding="async" src="https://austinblanco.com/wp-content/uploads/2019/07/2-Channel-Z-First.png" alt="Image from “High Speed Triggering for Micromanager using Triggerscope Stream Script”" class="wp-image-2966" loading="lazy" referrerpolicy="no-referrer" data-remote=""></figure>

<p class="wp-block-paragraph">Finally, a multi channel example can be seen in this image, with 2 channels running in a time series. </p>

<figure class="wp-block-image"><img decoding="async" src="https://austinblanco.com/wp-content/uploads/2019/07/2-Channel-Time-Series.png" alt="Image from “High Speed Triggering for Micromanager using Triggerscope Stream Script”" class="wp-image-2964" loading="lazy" referrerpolicy="no-referrer" data-remote=""></figure>

<p class="wp-block-paragraph">Those are the highlights – I hope others find this useful!</p>

<p class="wp-block-paragraph">-Austin</p>]]></content:encoded></item>
<item><title>THOR SM1 Threads in Fusion360</title><link>https://austinblanco.com/posts/thor-sm1-threads-in-fusion360.html</link><guid isPermaLink="true">https://austinblanco.com/posts/thor-sm1-threads-in-fusion360.html</guid><pubDate>Thu, 30 May 2019 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><description>I frequently build parts, both aluminum and 3d printed, which are used with thor components.</description><content:encoded><![CDATA[<p class="wp-block-paragraph">I frequently build parts, both aluminum and 3d printed, which are used with thor components. Using Fusion360 from Autodesk, it’s simple to add threads into a hole, or even create pre-threaded holes in objects. Luckily, Fusion360 even includes a C-Mount thread option. </p>

<p class="has-link-color wp-elements-16 wp-block-paragraph">But – the SM1 thread from Thor is another matter. I had to add one to a part, so I found this nifty trick in fusion which supports <a href="https://knowledge.autodesk.com/support/fusion-360/troubleshooting/caas/sfdcarticles/sfdcarticles/Custom-Threads-in-Fusion-360.html">adding custom threads to your install.</a></p>

<p class="has-link-color wp-elements-17 wp-block-paragraph">It turns out Thor <a href="https://www.thorlabs.com/newgrouppage9.cfm?objectgroup_id=1524">provides the required information</a> to form the threads, so using this page I was able to pull in the thread settings, and generate my own thread selection. </p>

<figure class="wp-block-image alignleft is-resized"><img loading="lazy" decoding="async" src="https://austinblanco.com/wp-content/uploads/2019/05/SM1-in-Fusion.png" alt="Image from “THOR SM1 Threads in Fusion360”" class="wp-image-2952" width="263" height="424" referrerpolicy="no-referrer" data-remote=""></figure>

<p class="has-link-color wp-elements-18 wp-block-paragraph">For anyone who just wants to use the threads in their copy of fusion, please find the file located on my <a href="https://github.com/AdvancedResearchConsulting/CAD">Github page here</a>.</p>

<figure class="wp-block-image is-resized"><img loading="lazy" decoding="async" src="https://austinblanco.com/wp-content/uploads/2019/05/modeled-threads-1024x787.png" alt="Image from “THOR SM1 Threads in Fusion360”" class="wp-image-2953" width="268" height="205" referrerpolicy="no-referrer" data-remote=""></figure>]]></content:encoded></item>
<item><title>Lab Automation using Arduino</title><link>https://austinblanco.com/posts/lab-automation-using-arduino.html</link><guid isPermaLink="true">https://austinblanco.com/posts/lab-automation-using-arduino.html</guid><pubDate>Wed, 22 May 2019 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><description>This is a great example of using Arduino in the lab. If you have limitations to your Lab hardware, and want to explore how to expand or modify it, please…</description><content:encoded><![CDATA[<p class="has-link-color wp-elements-19 wp-block-paragraph">This is a great example of <a href="https://www.nature.com/articles/d41586-019-01590-z?fbclid=IwAR2VH7Sq-LMeXCIGkq6BY6so65-CPNzDN7CE4Wbr3MueV0vryEla1dMfYPw">using Arduino in the lab</a>. If you have limitations to your Lab hardware, and want to explore how to expand or modify it, please <a href="https://arc.austinblanco.com/contact-us/">get in touch</a>, as this is what we do!</p>

<p class="wp-block-paragraph">-Austin</p>]]></content:encoded></item>
<item><title>On a lifetime of Learning</title><link>https://austinblanco.com/posts/on-a-lifetime-of-learning.html</link><guid isPermaLink="true">https://austinblanco.com/posts/on-a-lifetime-of-learning.html</guid><pubDate>Thu, 16 May 2019 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><description>Like so many who live in the sciences, I am fascinated by all things new, unknown, or barely discovered.</description><content:encoded><![CDATA[<p class="wp-block-paragraph">Like so many who live in the sciences, I am fascinated by all things new, unknown, or barely discovered. I think some people just have this innate sense of a continued drive to understand, to improve our awareness and knowledge in the world. </p>

<p class="wp-block-paragraph">Yet for many, the financial or temporal obligations of higher education aren’t possible to accept. Sure, there is night school, online correspondence etc, and these frameworks are excellent sources of gaining credentials, and of accessing new opportunities in a career. But what if I simply want to learn a bit about making parts? What if I want to build a little trinket of electronics, or to learn a little bit about optics? Today, this concise/iterative form of learning is available to everyone, yet only a few I interact with seem to exploit it’s full potential. It’s the way I’ve learned almost everything I know and use today. It does have downsides, but these can be filled with proper guidance. I would call this form of learning “Project-based” in nature. So, how does one attend such a lesson? </p>

<figure class="wp-block-image"><img decoding="async" src="https://austinblanco.com/wp-content/uploads/2019/05/3dp.jpg" alt="The Jellybox is a 3D printer kit you can build with your kids. (https://www.imade3d.com/)" class="wp-image-2933" loading="lazy" referrerpolicy="no-referrer" data-remote=""><figcaption class="wp-element-caption">The Jellybox is a 3D printer kit you can build with your kids. (https://www.imade3d.com/)</figcaption></figure>

<h2 id="step-1-take-on-a-project-in-the-field-of-interest">Step 1: Take on a project in the field of interest</h2>

<p class="has-link-color wp-elements-20 wp-block-paragraph">Let’s say that, like me you have an interest or a curiosity on how machines move. You’ve seen a 3-D printer, or maybe a robot, or a CNC machine, and wondered, “how does the table top move, what drives it? How does it “know” where it is?” All good questions of course! Now, I had these questions, and I never truly was able to answer them until I embarked on my first <a href="https://austinblanco.com/about-2/cnc-construction-project/">CNC construction project</a>. This began as a kick-starter investment, and probably had a total cost of ~ $350 by the time I was done. It took 2 months or so of work to finish it completely. Spending a few hours here and there to construct it. From there, I tinkered and modified a bit, and finally, after several months of use, I ended up stripping it down to use for other projects. Now, numerous issues and limitations popped up during this process, and I also realized I was left with several questions. Which brings us to the next level of learning.</p>

<h3 id="step-2-learn-from-the-experts">Step 2: Learn from the Experts</h3>

<p class="wp-block-paragraph">Some of the questions which gnawed on my brain at the end of this build were: </p>

<ul class="wp-block-list">
<li>Was this machine actually capable of milling aluminum? </li>

<li>Why did the speed seem so slow? </li>

<li>Did I need liquid cutting fluid all the time? </li>

<li>How come these tiny dremel end-mills kept breaking?</li>

<li>What was the best GCODE generator to use?</li>
</ul>

<p class="has-link-color wp-elements-21 wp-block-paragraph">These are questions which come not from the top level of a neophyte, but from a marginally deeper question of the enthusiast with some minimal experience. I moved from the neophyte to the enthusiast when I took on the project. I now had a surface level understanding of what questions to even ask! Not only that, but my ears itched for the answer. I HAD TO UNDERSTAND these answers, because my lack of knowledge was killing me, and affecting my understanding as to what this little machine could do! So I turned to people I know in the microscopy automation industry, gents like Chris Ballard from Sutter, John Zemek from ASI, and during the course of other work, would ask things like, “Hey so what exactly do you do with your machines to compensate for backlash?” Now here’s the fun part – no-one EVER denies an opportunity to share their expertise when prompted! So while I absorbed everything they had to teach, they were happy to share and to receive an opportunity to deliver lessons and experiences gained from years of effort. These small interactions may have taken 10, or 15 minutes, but over time I accumulated a series of data points. Some things like, “well, we always use fluid because we are cutting so fast” allowed me to understand that speed impacted heat to a greater degree than I had assumed, prompting me to search down google eggs like this <a href="https://littlemachineshop.com/mobile/speeds_feeds.php">speed &amp; feed calculator</a>. Other times, I’d learn objective known facts like Chris stating, “It’s hard to beat mass, when it comes to CNC, and microscopes for that matter, the heavier the better. ” Now such a statement seems simple, but because I had the background of watching my tiny machine struggle to cut, and had the framework of knowledge for that statement to fit, I quickly was able to understand the why behind the fact, which allowed me to cement a better understanding of what this meant for such machines. Vibration, strength, heat, inertia, it was all making sense. </p>

<figure class="wp-block-image"><img decoding="async" src="https://austinblanco.com/wp-content/uploads/2019/05/ai_courses-600x383.png" alt="This kickstarter campaign will provide classes on AI using openCV. https://www.learnopencv.com/" class="wp-image-2935" loading="lazy" referrerpolicy="no-referrer" data-remote=""><figcaption class="wp-element-caption">This kickstarter campaign will provide classes on AI using openCV. https://www.learnopencv.com/</figcaption></figure>

<h3 id="step-3-take-the-next-class">Step 3: Take the next class</h3>

<p class="has-link-color wp-elements-22 wp-block-paragraph">How to proceed? Simple: Build a machine that supported my next level of learning! In this case, it was a used <a href="https://www.mscdirect.com/browse/tnpla/80152135?cid=ppc-google-New+-+Machinery+-+PLA_sTtF8HGSz___291757062200_c_S&amp;mkwid=sTtF8HGSz|dc&amp;pcrid=291757062200&amp;rd=k&amp;product_id=80152135&amp;gclid=EAIaIQobChMIgoqMrM-g4gIVMCCtBh05HwAPEAQYASABEgKBD_D_BwE">RF-45 geared head mill</a>.  Armed with my understanding of how motors drove my current CNC, I snagged a used RF45, and designed my own CNC conversion for it. My design was additive, meaning that even if it completely failed, I could revert back to owning a manual mill – and who doesn’t want a milling machine? 🙂 So the next level of learning, the next class, had begun. Through it I learned my motors weren’t strong enough, my motor drivers were not high enough current and too slow, I had to account for additional backlash on the bigger machine, and so the journey continued. I still use the results from that machine for small projects today. The experience gained during the project has been too enormous to measure as I’ve applied it to things like, “hey, you can’t make a box with square inside corners, because all end mills are round, so how will it be cut?” </p>

<figure class="wp-block-image"><img decoding="async" src="https://austinblanco.com/wp-content/uploads/2019/05/br-complete-front-m-1024x681.jpg" alt="A drone you can make on your own is described by Nathan Vertile here" class="wp-image-2936" loading="lazy" referrerpolicy="no-referrer" data-remote=""><figcaption class="wp-element-caption">A drone you can make on your own is described by <a href="https://nathan.vertile.com/blog/2015/12/05/rctimer-micro-160-beerotor-build-setup-and-review/">Nathan Vertile here </a></figcaption></figure>

<h3 id="step-4-the-finals-exam">Step 4: The finals Exam</h3>

<p class="has-link-color wp-elements-23 wp-block-paragraph">How do I know I’ve gained requisite knowledge in a field? The answer is, I never have. At each level of learning I’ve discovered new and more interesting aspects of a field. Liner encoding, DRO’s, automated tool changing heads, variable speed control GCODE, a litany of CAM generators, new 3 phase motors and controller options. So when is learning a field enough? I don’t think there is an upper limit. And this is the most important principle in my humble opinion. Those of us given this gift of curiosity have an obligation to leverage it. In an era in which <a href="https://www.khanacademy.org/math/trigonometry">Khan Academy can teach you trig for free</a>, there is no excuse to stay stagnant.  More importantly, I have watched several colleagues declare an end of learning, and subsequently become irrelevant. From, “I don’t do email” to “I can’t understand programming”, these people made the choice to stop. </p>

<p class="wp-block-paragraph">And the world kept going. </p>

<p class="wp-block-paragraph">And they were left behind, no longer useful to the community they lived or worked in. So whether it’s art, philosophy, religion, sports, outdoors, history, science, or just learning about the lives of others, we must never accept a point at which we believe, “I have arrived”. And so what is the final exam? Well, it’s likely comfort. Are you comfortable in your work? In your technical experience? Then get uncomfortable. Engage in that arena you were scared to try. Try out Jiu-Jitsu even if you’re scared. Order that 3-D printer kit, even if you don’t have time to build it. Download Python and follow some online tutorials, even if you never use it again. Stay off balance. If you are comfortable today, you failed the exam. The good news is that you have another opportunity to take the test, and learn something new, staring today.</p>

<p class="wp-block-paragraph">-Austin</p>]]></content:encoded></item>
<item><title>Setup Guide for Triggerscope 3B Using MicroManager</title><link>https://austinblanco.com/posts/setup-guide-for-triggerscope-3b-using-micromanager.html</link><guid isPermaLink="true">https://austinblanco.com/posts/setup-guide-for-triggerscope-3b-using-micromanager.html</guid><pubDate>Wed, 27 Mar 2019 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><description>Required Components and Preparation For a new Triggerscope 3B shipment, remove from packaging and account for the following: Hardware Connections Once…</description><content:encoded><![CDATA[<p class="wp-block-paragraph"><strong>Required Components and Preparation</strong></p>

<p class="wp-block-paragraph">For a new Triggerscope 3B shipment, remove from packaging and account for the following: </p>

<ul class="wp-block-list">
<li>12V power supply</li>

<li>Mini-USB cable</li>

<li>SMA-BNC connector cables, if purchased</li>

<li>ARC certificate of compliance paperwork</li>

<li>Triggerscope 3B Controller </li>
</ul>

<p class="wp-block-paragraph"><strong>Hardware Connections</strong></p>

<p class="wp-block-paragraph">Once unpackaged and all components are accounted for, plug the 12V power supply into the slot located on the left side of the unit labeled “12V,” and plug the other end of the power supply into an available power outlet. </p>

<p class="wp-block-paragraph">Next, plug the mini-USB cable into the left side of the Triggerscope unit in the slot labeled “USB,” and plug the other end into the computer you are going to be using. </p>

<p class="wp-block-paragraph"><strong>Driver Install</strong></p>

<p class="has-link-color wp-elements-24 wp-block-paragraph">Next, locate the switch on the right side of the Triggerscope 3B, flip the switch either way, both ways turn the Triggerscope on. Open a new tab on your web browser, and download the<a href="https://www.arduino.cc/en/Main/Software"> Arduino IDE Software</a> that matches the Operating System you are currently using. Follow the install prompts to install the software</p>

<p class="wp-block-paragraph">With install of Arduino IDE complete, open the newly installed Arduino IDE application on your computer. </p>

<p class="wp-block-paragraph">On the top ribbon, select the “Tools” tab. Then hover over the section that says “board” and then click on the “Board Manager” option. </p>

<figure class="wp-block-image"><img decoding="async" src="https://austinblanco.com/wp-content/uploads/2019/03/TG3B_Setup_03-954x1024.png" alt="Image from “Setup Guide for Triggerscope 3B Using MicroManager”" class="wp-image-2920" loading="lazy" referrerpolicy="no-referrer" data-remote=""></figure>

<p class="wp-block-paragraph">Next, in the “Board Manager” window, click on the “filter your search” box and type “DUE,” and the following should pop up on the screen, “Arduino SAM Boards (32-bits ARM Cortex -M3) by Arduino.” Click install on this option. </p>

<figure class="wp-block-image"><img decoding="async" src="https://austinblanco.com/wp-content/uploads/2019/03/TG3B_Setup_04.png" alt="Image from “Setup Guide for Triggerscope 3B Using MicroManager”" class="wp-image-2921" loading="lazy" referrerpolicy="no-referrer" data-remote=""></figure>

<p class="wp-block-paragraph">The Arduino application will proceed to download and install the driver package needed to run the Triggerscope 3B unit. </p>

<p class="wp-block-paragraph"><strong>MicroManager Setup</strong></p>

<p class="has-link-color wp-elements-25 wp-block-paragraph">Most end-users will already have MicroManager installed, but if not, make sure to use the <a href="https://micro-manager.org/wiki/Micro-Manager_Nightly_Builds">nightly builds found here</a>. </p>

<p class="wp-block-paragraph">In MicroManager, select the “Hardware Configuration Wizard”, Click Next until reaching step 2. In the lower list, browse to the “Triggerscope” section, and add the Triggerscope Hub Device. </p>

<figure class="wp-block-image"><img decoding="async" src="https://austinblanco.com/wp-content/uploads/2019/03/MMS_01.png" alt="Image from “Setup Guide for Triggerscope 3B Using MicroManager”" class="wp-image-2923" loading="lazy" referrerpolicy="no-referrer" data-remote=""></figure>

<p class="wp-block-paragraph">For the Communication setup, select the COM # assigned to your triggerscope under the Windows Device manager, read as “Arduino Due Programming Port”. </p>

<figure class="wp-block-image"><img decoding="async" src="https://austinblanco.com/wp-content/uploads/2019/03/MMS_02-1.png" alt="Image from “Setup Guide for Triggerscope 3B Using MicroManager”" class="wp-image-2926" loading="lazy" referrerpolicy="no-referrer" data-remote=""></figure>

<p class="wp-block-paragraph">Configure the Com # found int he device manager, make sure to set the BAUD rate to 115200. </p>

<figure class="wp-block-image"><img decoding="async" src="https://austinblanco.com/wp-content/uploads/2019/03/MMS_03.png" alt="Image from “Setup Guide for Triggerscope 3B Using MicroManager”" class="wp-image-2927" loading="lazy" referrerpolicy="no-referrer" data-remote=""></figure>

<p class="wp-block-paragraph">When prompted, select the TTL and DAC lines needed for your application. Also note DAC 16 is tied by default to the FOCUS device. If running sequencing for Z stacks you’ll want to add this. </p>

<figure class="wp-block-image"><img decoding="async" src="https://austinblanco.com/wp-content/uploads/2019/03/Screen-Shot-2019-03-26-at-5.25.01-PM.png" alt="Image from “Setup Guide for Triggerscope 3B Using MicroManager”" class="wp-image-2928" loading="lazy" referrerpolicy="no-referrer" data-remote=""></figure>

<p class="wp-block-paragraph">Continue through the dialog options, if connecting to a Z stage, be sure to specify the maximum and minimum height of your stage so that Z data is properly calibrated. Contact ARC if using a range other than 0-10V. </p>

<p class="wp-block-paragraph">Next, confirm proper operation by opening up the Device Property Browser. You should have discrete control over the DAC lines added, and on/off state control over TTL lines. Note that the Triggerscope 3B will illuminate an output LED when DAC control is enabled, or when TTL control is enabled. This can be very useful to confirm proper communication with the computer. </p>

<p class="wp-block-paragraph">This concludes the basic setup for Triggerscope 3B. Please contact ARC with any questions if you are having difficulty!</p>]]></content:encoded></item>
<item><title>ARC Expands Technical Talent</title><link>https://austinblanco.com/posts/arc-expands-technical-talent.html</link><guid isPermaLink="true">https://austinblanco.com/posts/arc-expands-technical-talent.html</guid><pubDate>Tue, 29 Jan 2019 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><description>As client demand continues to grow , ARC has been looking to expand the team, and is pleased to announce the hiring of ARC’s first employee, Daymian…</description><content:encoded><![CDATA[<p class="wp-block-paragraph">As client demand continues to grow , ARC has been looking to expand the team, and is pleased to announce the hiring of ARC’s first employee, Daymian Rocca. </p>

<figure class="wp-block-image is-resized"><img loading="lazy" decoding="async" src="https://austinblanco.com/wp-content/uploads/2019/01/IMG_00262.jpg" alt="Image from “ARC Expands Technical Talent”" class="wp-image-2914" width="176" height="178" referrerpolicy="no-referrer" data-remote=""></figure>

<p class="wp-block-paragraph">Daymian joined the team as Technical Systems Engineer Jan 15th, and brings to the company experience in MSCA, fabrication, additive manufacturing and firmware development. His primary role will be hardware &amp; technical systems , as well as supporting work in the software and optical areas we work in. Please join me in welcoming Daymian to the team!<br><br>– Austin</p>]]></content:encoded></item>
<item><title>New Triggerscope 3-B Adds Range Spanning, LEDs, High Current Drive and More</title><link>https://austinblanco.com/posts/new-triggerscope-3-b-adds-range-spanning-leds-high-current-drive-and-more.html</link><guid isPermaLink="true">https://austinblanco.com/posts/new-triggerscope-3-b-adds-range-spanning-leds-high-current-drive-and-more.html</guid><pubDate>Thu, 10 Jan 2019 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><description>I’m excited to announce the release of the newest Triggerscope model the 3-B. This version replaces the V3, and is packed with improvements for practical…</description><content:encoded><![CDATA[<p class="wp-block-paragraph">I’m excited to announce the release of the newest Triggerscope model the 3-B. This version replaces the V3, and is packed with improvements for practical laboratory use, including:</p>

<ul class="wp-block-list"><li><strong>DAC Software Range Selection </strong> <ul><li>Range selection is now software controllable for each channel. This means you can get a full 16 Bit resolution delivered to your device in any range from -2.5/+2.5V, to -10V/+10V, as well as -5/+5V, 0-5V, and 0-10V. A demo video of this feature is available below. </li></ul></li><li><strong>LED Status Indication</strong> <ul><li>When integrating or first using any TTL controlled system, it’s difficult to determine whether the controller is properly firing trigger signals, and whether the device is properly outputting changes on the TTL and DAC lines. New LED’s on the Triggerscope 3B indicate an active sequence, TTL status, DAC output status, and input trigger status, all from the face of the device. In addition, these signals can be disabled or enabled for compatibility with ultra low light acquisition environments. </li></ul></li><li><strong>High Current TTL Drivers</strong> <ul><li>When driving Lasers, the 50 Ohm impedance used can cause a tough <a href="https://electronics.stackexchange.com/questions/180679/difficulties-supplying-5v-ttls-to-50-ohm-terminated-single-photon-counter">voltage drop problem</a>. This has been addressed by now sourcing up to 500mA per line on TTL lines 1-4. In addition, lines 5-8 now source 200mA per channel. While most systems should work great at 200mA, the higher current channels may also optionally be used to drive low intensity LEDs if needed, for applications such as transmitted illumination, powered directly from the Triggerscope. </li></ul></li><li>An External DC Power switch is now included for simple restarts.</li></ul>

<p class="wp-block-paragraph">More specs on the <a href="http://www.austinblanco.com/Resources/TRIGGERSCOPE3_SPEC.pdf">datasheet found here</a></p>

<p class="wp-block-paragraph">Here’s a quick demo of the DAC Range function as shown on my Oscilloscope. <br><br><br></p>

<figure><div class="video-wrap"><iframe loading="lazy" src="https://www.youtube.com/embed/mooPo5JvjpE" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" title="YouTube video"></iframe></div></figure>

<p class="wp-block-paragraph">List price is $1,500 USD. Current lead times are 2 weeks ARO. <a href="http://arc.austinblanco.com/contact-us/">Please contact ARC for purchase.</a></p>

<p class="wp-block-paragraph">-Austin</p>]]></content:encoded></item>
<item><title>Live Animal Imaging Confocal Activates Vascular Clotting</title><link>https://austinblanco.com/posts/live-animal-imaging-confocal-photoactivates-vascular-clotting.html</link><guid isPermaLink="true">https://austinblanco.com/posts/live-animal-imaging-confocal-photoactivates-vascular-clotting.html</guid><pubDate>Sat, 22 Sep 2018 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><description>On a recent project I had an opportunity to collaborate with some great manufacturers and vendors, to build a custom microscope for Dr.</description><content:encoded><![CDATA[<p>On a recent project I had an opportunity to collaborate with some great manufacturers and vendors, to build a custom microscope for Dr. Chia-Yi (Alex) Kuan, at the University of Virginia School of Medicine. This instrument is quite unique, and required a team of manufacturers to pull it off.</p>
<figure id="attachment_2876" aria-describedby="caption-attachment-2876" class="wp-caption alignleft"><img loading="lazy" decoding="async" class="wp-image-2876" src="https://austinblanco.com/wp-content/uploads/2018/09/VA-13-1024x768.png" alt="Completed system ready for use." width="383" height="287" referrerpolicy="no-referrer" data-remote=""><figcaption id="caption-attachment-2876" class="wp-caption-text">Completed system ready for use.</figcaption></figure>
<p>Dr. Kuan required an upright confocal microscope, which could perform photoactivation, widefield and confocal fluorescent excitation, all while running on an extended focus throw of 2″ range. The system required several custom pieces of hardware and software, which made things extra *fun*.</p>
<figure id="attachment_2878" aria-describedby="caption-attachment-2878" class="wp-caption alignright"><img loading="lazy" decoding="async" class=" wp-image-2878" src="https://austinblanco.com/wp-content/uploads/2018/09/Screen-Shot-2018-09-21-at-2.05.29-PM.png" alt="This image was taken from a live specimen, showing cranial vasculature in vivo." width="381" height="340" referrerpolicy="no-referrer" data-remote=""><figcaption id="caption-attachment-2878" class="wp-caption-text">This image was taken from a live specimen, showing cranial vasculature in vivo.</figcaption></figure>

<p><strong>Team Contributors</strong></p>
<p><a href="http://visualdynamix.net/">Visual Dynamix LLC</a>, headed by Gary Tockman, was the lead system integrator on the project as well as the primary service provider for the system. Gary led the team on the build and did an excellent job defining input specifications and performance criteria, as well as managing the crazy logistics of building a system from so many different vendors.</p>
<p>Using the same device for slides and for live specimens required some work on the focuser throw. Sutter Instruments provided a great solution via the <a href="https://www.sutter.com/MICROSCOPES/bob.html">BOB microscope</a>. Chris Ballard spent a great deal of effort working out a long travel Z motor relying on the MPC control system for XYZ axis.</p>
<p><a href="https://www.89north.com/">89 North</a> provided the photostimulation system, confocal, and LDI laser excitation. Scott Phillips and Simona Stelea both spent several days on site working on the system to make sure everything was dialed in properly.</p>
<figure id="attachment_2880" aria-describedby="caption-attachment-2880" class="wp-caption alignleft"><img loading="lazy" decoding="async" class=" wp-image-2880" src="https://austinblanco.com/wp-content/uploads/2018/09/VA-5-768x1024.png" alt="Scott Phillips works on cable connections" width="276" height="368" referrerpolicy="no-referrer" data-remote=""><figcaption id="caption-attachment-2880" class="wp-caption-text">Scott Phillips works on cable connections</figcaption></figure>
<p>All of the devices on the system needed control via Metamorph. I worked with David Biggs over at <a href="http://kbimaging.com/">KB Imaging</a> to handle this part, and was very glad I chose his work. David has extensive experience with driver development, and due to the proprietary nature of the firmware on this instrument, his experience saved the day on dialing in the driver for speed and reliability.</p>
<p>Finally, I took on the system I/O side for lasers and triggering, as well as building the imaging PC and configuring Metamorph. Because the latest Triggerscope 3 model needed to drive the lasers,I also managed to work with David to create a Metamorph driver, so if you happen to run MetaMorph and want to control the triggerscope, please get in touch.</p>
<figure id="attachment_2882" aria-describedby="caption-attachment-2882" class="wp-caption alignright"><img loading="lazy" decoding="async" class=" wp-image-2882" src="https://austinblanco.com/wp-content/uploads/2018/09/VA-6-768x1024.png" alt="Gary inspecting the filters on the XLight" width="304" height="406" referrerpolicy="no-referrer" data-remote=""><figcaption id="caption-attachment-2882" class="wp-caption-text">Gary inspecting the filters on the XLight</figcaption></figure>

<p>Systems like this usually require a day or two for the install, but in our case, most of the install team spent a week on site, to be certain that the details were ironed out and to get some training on the system in for the end users. In our situation this was a good call, as we found the inevitable last minute changes which needed to be addressed. Having the team together made addressing these things straightforward.</p>
<p><strong>Results</strong></p>
<p>A bit after leaving, the client sent over a beautiful video showing experimental data which includes the visualization of vasculature, with a clot stimulated by the laser exciter, and a resulting timelapse of that clot forming.</p>

<figure id="attachment_2884" aria-describedby="caption-attachment-2884" class="wp-caption alignnone"><img loading="lazy" decoding="async" class=" wp-image-2884" src="https://austinblanco.com/wp-content/uploads/2018/09/VA-11-1024x768.png" alt="Training for end users on a live specimen" width="516" height="387" referrerpolicy="no-referrer" data-remote=""><figcaption id="caption-attachment-2884" class="wp-caption-text">Training for end users on a live specimen</figcaption></figure>

<p><div class="video-wrap"><iframe loading="lazy" src="https://www.youtube.com/embed/rsMlmyZOmu8" allowfullscreen="allowfullscreen" title="YouTube video"></iframe></div></p>
<p>It’s great to be able to participate with clients, manufacturers and engineers who can pull builds like this together, and better still to watch this important and exciting research move forward. I’m even happier I get to share this build!</p>
<p>-Austin</p>]]></content:encoded></item>
<item><title>Vortex mixer mod using Ryobi Orbital Sander</title><link>https://austinblanco.com/posts/vortex-mixer-mod-using-ryobi-orbital-sander.html</link><guid isPermaLink="true">https://austinblanco.com/posts/vortex-mixer-mod-using-ryobi-orbital-sander.html</guid><pubDate>Fri, 13 Jul 2018 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><description>During a recent project for a client, I had to prepare a fluorescent bead slide for imaging.</description><content:encoded><![CDATA[<p>During a recent project for a client, I had to prepare a fluorescent bead slide for imaging. Beads require dilution, and a vortex mixer is recommended in order to provide ample separation of the individual beads. Not having one on hand, I figured there must be a way to achieve similar results, and found this <a href="https://www.homebrewtalk.com/forum/threads/diy-lab-style-vortex-mixer.300589/">used by a homebrewer</a> for yeast prep. It was close for my needs, but I didn’t want to use wood due to the fabrication time and difficulty of install / removal. So I measured the screw hole spacing on the sander pad, and sketched one up in Fusion. A PLA print was made, and the result has been great for simple use.<br>
<img loading="lazy" decoding="async" class="alignnone  wp-image-2871" src="https://austinblanco.com/wp-content/uploads/2018/07/Mixer_example.png" alt="Image from “Vortex mixer mod using Ryobi Orbital Sander”" width="376" height="268" referrerpolicy="no-referrer" data-remote=""></p>
<p>One additional trick I use for mods like this, is a router speed control, available form <a href="https://www.harborfreight.com/router-speed-control-43060.html">Harbor freight</a> or <a href="https://www.amazon.com/Lighthouse-Hydro-Variable-Speed-Controller/dp/B00BLOSG7I/ref=asc_df_B00BLOSG7I/?tag=hyprod-20&amp;linkCode=df0&amp;hvadid=241912880102&amp;hvpos=1o2&amp;hvnetw=g&amp;hvrand=10407665585707142056&amp;hvpone=&amp;hvptwo=&amp;hvqmt=&amp;hvdev=c&amp;hvdvcmdl=&amp;hvlocint=&amp;hvlocphy=9032457&amp;hvtargid=pla-396868566683&amp;psc=1">Amazon</a>. It allows the motor speed to be adjusted. The little Ryobi is super fast, so I ended up suing the speed control on it’s lowest setting. These controls work well for most motors – some using “soft start” motors may not work, but it did great in this case!<br>
<img loading="lazy" decoding="async" class="wp-image-2872 size-medium alignleft" src="https://austinblanco.com/wp-content/uploads/2018/07/IMG_9532-e1531492928203-225x300.jpg" alt="Image from “Vortex mixer mod using Ryobi Orbital Sander”" width="225" height="300" referrerpolicy="no-referrer" data-remote=""><br>
If you would like to print your own (assuming the hole spacing is compatible), the STL file and STEP for modification are available on my <a href="https://github.com/AdvancedResearchConsulting/ROB_Vortex_Adapter">Github page here</a>.</p>

<ul>
<li>Austin</li>
</ul>]]></content:encoded></item>
<item><title>Polarization sensitive cameras for Microscopy</title><link>https://austinblanco.com/posts/polarization-sensitive-cameras-microscopy.html</link><guid isPermaLink="true">https://austinblanco.com/posts/polarization-sensitive-cameras-microscopy.html</guid><pubDate>Wed, 06 Jun 2018 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><description>Flir is pushing these new Sony sensors, along with Lucid, for use in remote sensing and inspection. These are interesting.</description><content:encoded><![CDATA[<p>Flir is pushing these<a href="https://www.ptgrey.com/sony-polarization"> new Sony sensors</a>, along with Lucid, for use in remote sensing and inspection. These are interesting.</p>
<p>Basically each camera can capture 4 polarization states in one image. I can imagine these may be used for several microscopy applications, chiefly in polarization light microscopes, but also in DIC, and stereo applications where specular reflection is prevalent.</p>
<p>-Austin</p>]]></content:encoded></item>
<item><title>Mac OSX Serial Terminal for ARC</title><link>https://austinblanco.com/posts/mac-osx-serial-terminal-arc.html</link><guid isPermaLink="true">https://austinblanco.com/posts/mac-osx-serial-terminal-arc.html</guid><pubDate>Thu, 01 Feb 2018 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><category>Arduino</category><category>Programming</category><category>Triggerscope</category><description>I’ve long wanted to build a terminal and testing application for my products. Using the exceptional QT Creator, I was able to cook one up in a relatively…</description><content:encoded><![CDATA[<p>I’ve long wanted to build a terminal and testing application for my products. Using the exceptional <a href="https://www.qt.io/">QT Creator</a>, I was able to cook one up in a relatively short period of time!<br>
This application was built using the QT Terminal example program, so it will work for the ARC Triggerscope 2, 16, and Triggerscope 3 products, as well as the ARCLED.<br>
In addition, anyone using an Arduino or other serial-based device may find it useful. You can find the program on my <a href="https://github.com/AdvancedResearchConsulting/ARCTerminal">Github</a>.</p>
<p>I am aware that the vast majority of end users rely on Windows for control of devices, so if you read this and have an interest in a compiled x64 version, I’d be interested to know.<br>
Over time I plan on expanding this application to include full configuration over delay timing, sequencing, and other functions.</p>
<figure id="attachment_2859" aria-describedby="caption-attachment-2859" class="wp-caption alignnone"><img loading="lazy" decoding="async" class=" wp-image-2859" src="https://austinblanco.com/wp-content/uploads/2018/02/ARC_Terminal_Demo.gif" alt="Quick Demo of the program" width="556" height="511" referrerpolicy="no-referrer" data-remote=""><figcaption id="caption-attachment-2859" class="wp-caption-text">Quick Demo of the program</figcaption></figure>]]></content:encoded></item>
<item><title>ARCLED 8 Channel LED Engine</title><link>https://austinblanco.com/posts/arcled-8-channel-led-engine.html</link><guid isPermaLink="true">https://austinblanco.com/posts/arcled-8-channel-led-engine.html</guid><pubDate>Tue, 28 Nov 2017 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><category>Device automation</category><description>I’m happy to announce a new product made by ARC. Over the years I’ve worked with a large number of illuminators, from mercury excitation lamps to laser…</description><content:encoded><![CDATA[<p>I’m happy to announce a new product made by ARC. Over the years I’ve worked with a large number of illuminators, from mercury excitation lamps to laser combiners. I’ve tried to combine the best traits of a light source into this device, while ignoring some of the super-awesome features that drive costs up. Key to this is to be completely flexible in LED selection. This is a “dichroic-less” device, as such, one can select as many close-line LEDs as needed for a given application. In addition, LED’s can be installed after purchase by end-users, should they need to add or modify custom modules to the system. Another great advantage for users is the ability to use a broad spectrum white channel, built into the device with the discrete LED channels. This is a unique advantage over other devices, for in many cases all that is required is a broad spectrum light source and a filter cube. Finally, due to the nature of the design and manufacturing engineering of this product, we can offer this multi-channel exciter at what I believe is the lowest price in the industry, $8,500 USD with 8 LEDs installed.</p>
<p>Here’s a brief video showing the device, you can purchase it from the <a href="http://arc.austinblanco.com/product/arcled/">online store here.</a></p>
<p><div class="video-wrap"><iframe loading="lazy" src="https://www.youtube.com/embed/qnB4DEzDVdI?showinfo=0" allowfullscreen="allowfullscreen" title="YouTube video"></iframe></div></p>]]></content:encoded></item>
<item><title>sUAS Drone Pilot Test Resources</title><link>https://austinblanco.com/posts/suas-drone-pilot-test-resources.html</link><guid isPermaLink="true">https://austinblanco.com/posts/suas-drone-pilot-test-resources.html</guid><pubDate>Sat, 28 Oct 2017 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><description>The resources below are for students attending my drone courses at Norcal Flight Center, but if other readers stop by, I hope you find these useful!</description><content:encoded><![CDATA[<p>The resources below are for students attending my drone courses at <a href="https://www.norcalflightcenter.com/">Norcal Flight Center</a>, but if other readers stop by, I hope you find these useful!</p>
<p>The FAA classifies certification for commercial use of drones as an “sUAS” cert. Or, a small Unmanned Aerial System, Remote Pilot certification. This certification allows us to operate a drone up to 55lb, for profit, in much of the US airspace. Below are links and resources, as well as questions and answers that come up during classes. Feel free to post here with more questions if you have them!</p>
<p>This is for part 107 operations, or sUAS operations.</p>
<ul>
<li><a href="https://www.faa.gov/documentLibrary/media/Advisory_Circular/AC_107-2.pdf">FAA Advisory Circular 107-2 – many common questions answered here </a></li>
<li><a href="https://www.faa.gov/uas/where_to_fly/b4ufly/">FAA’s B4UFLY App, this is a great too to confirm you are free to operate in an area.</a></li>
<li><a href="https://www.faa.gov/uas/request_waiver/">Waiver for operation in controlled airspace (request for from FAA)</a></li>
<li><a href="https://3dr.com/faa/drone-practice-tests/">Interactive test questions</a></li>
<li><a href="https://northrup.photo/free-faa-part-107-suas-drone-certification-study-guide/">Excellent summary of numbers &amp; facts</a></li>
<li><a href="https://www.faa.gov/training_testing/testing/supplements/media/sport_rec_private_akts.pdf">FAA Test Supplement PDF (2016)</a></li>
<li><a href="https://jrupprechtlaw.com/drone-logbook#template">Drone Logbook References</a></li>
<li><a href="https://skyvector.com/">Free Online Charts </a></li>
<li><a href="http://part107.org/wiki/index.php?title=Sample_Test">Excellent online test with chart images</a></li>
</ul>
<p>If you are having trouble with reading of charts, especially the Lat/Long stuff, here’s a great video that walks through the steps.</p>
<p><div class="video-wrap"><iframe loading="lazy" src="https://www.youtube-nocookie.com/embed/de1JxnfzZNA?rel=0" allowfullscreen="allowfullscreen" title="YouTube video"></iframe></div></p>
<p>—-UPDATE—-</p>
<p>Some answers to the questions which came up during the class:</p>
<p><strong>Question: “Can a rPIC certificate holder operate within 5 miles of a non-towered airport?”</strong></p>
<p>Yes – refer to FAA AC 107-2, section 5.8.1. “…Unless the flight is conducted within controlled airspace, no notification or authorization is necessary to operate at or near an airport. ” (Applies to certificated sUAS pilots)</p>
<p><strong>Question: “Are sUAS operations permitted in MOA’s?”</strong></p>
<p>Yes – There si a great study table on airspace <a href="https://3dr.com/faa/study-guides/airspace/">from this website</a>, search for “MOA”.</p>
<p>-Austin</p>]]></content:encoded></item>
<item><title>Looking for Alzheimer’s in the Eye</title><link>https://austinblanco.com/posts/looking-alzheimers-eye.html</link><guid isPermaLink="true">https://austinblanco.com/posts/looking-alzheimers-eye.html</guid><pubDate>Fri, 18 Aug 2017 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><description>I’m excited to share the following publication from my colleagues at Neurovision Imaging &amp; Cedars Sinai Medical Center.</description><content:encoded><![CDATA[<p>I’m excited to share the <a href="https://insight.jci.org/articles/view/93621">following publication</a> from my colleagues at Neurovision Imaging &amp; Cedars Sinai Medical Center. This paper represents a ton of work, from people all over the world. I’m also happy to say I had a chance to play a very small role in supporting the efforts!</p>
<p>This research continues to advance the work of attempting identification of Alzheimer’s via the retina. If we can continue to refine this approach, someday, people will be able to have frequent checkups to determine whether they are approaching a risk of Alzheimers – early enough for intervention to occur.</p>
<figure id="attachment_2835" aria-describedby="caption-attachment-2835" class="wp-caption alignnone"><img loading="lazy" decoding="async" class="wp-image-2835 size-full" src="https://austinblanco.com/wp-content/uploads/2017/08/Alzh1.png" alt="Heat map example of AB plaque identification" width="175" height="174" referrerpolicy="no-referrer" data-remote=""><figcaption id="caption-attachment-2835" class="wp-caption-text">Heat map example of AB plaque identification</figcaption></figure>
<p>For the human trials, images were obtained of the retina, using a custom modified confocal ophthalmoscope. The retinal imager obtains images from the patient’s eye, and the images are then analyzed for a number of potential plaque sites (those sites which may contain AB plaques). If enough sites, and or site density is found, the patient indication shows higher, whereas a control would show less grouping and/or less sites. This is a simplified explanation of course, and a ton of work went into figuring out how to best identify these sites. Here’s an image of such a patient. Int his image the heat map indicates the grouping and intensity of the AB plaque locations.</p>
<p>Hats off to Maya &amp; Yosef Koronyo, the team at <a href="http://neurovision.com/">Neurovision Imaging</a>, and the folks at <a href="https://www.cedars-sinai.edu/Research/Research-Labs/Koronyo-Hamaoui-Lab/">Cedars</a> for this awesome work!</p>
<p>(Ref) <a href="https://insight.jci.org/articles/view/93621">https://insight.jci.org/articles/view/93621</a></p>
<p>-Austin</p>]]></content:encoded></item>
<item><title>Sine wave Generator from iPhone</title><link>https://austinblanco.com/posts/sine-wave-generator-iphone.html</link><guid isPermaLink="true">https://austinblanco.com/posts/sine-wave-generator-iphone.html</guid><pubDate>Fri, 14 Jul 2017 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><description>I keep looking into a low cost, yet stable way to generate nice sine waves which are controllable, using something other than a signal generator or one…</description><content:encoded><![CDATA[<p>I keep looking into a low cost, yet stable way to generate nice sine waves which are controllable, using something other than a signal generator or one of the cheap breakouts which never seem to work that well. This led me to considering audio systems as a possible source of signal. It turns out that the iPhone app store has a nice little tone generator app – aptly named “<a href="https://itunes.apple.com/us/app/signal-generator-audio-test-tone-utility/id543661843?mt=8">Signal Generator</a>“.  The app has a frequency range from 100Hz to 20Khz. Connecting the output of this into an oscilloscope shows a really nice signal. I worked on buffering this through an op amp, and sure enough, it works great! So, could an enterprising person use an old iPhone as a driver for a galvo…? If anyone is interested, I can send over my inverter+amp design for you!</p>
<p>I made a short video showing the results – I hope someone can make use of it!</p>
<p>-Austin</p>
<p><div class="video-wrap"><iframe loading="lazy" src="https://www.youtube.com/embed/FNU7GjHA3Z4" allowfullscreen="allowfullscreen" title="YouTube video"></iframe></div></p>]]></content:encoded></item>
<item><title>New Site Design</title><link>https://austinblanco.com/posts/new-site-design.html</link><guid isPermaLink="true">https://austinblanco.com/posts/new-site-design.html</guid><pubDate>Fri, 16 Jun 2017 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><description>So i finally spent some money on a decent site theme. I hope you like it! If anyone experiences any issues in using the site with this theme, please let…</description><content:encoded><![CDATA[<p>So i finally spent some money on a decent site theme. I hope you like it! If anyone experiences any issues in using the site with this theme, please <a href="http://arc.austinblanco.com/contact-us/">let me know</a>!</p>
<p>-Austin</p>]]></content:encoded></item>
<item><title>DIY Syringe Pump</title><link>https://austinblanco.com/posts/diy-syringe-pump.html</link><guid isPermaLink="true">https://austinblanco.com/posts/diy-syringe-pump.html</guid><pubDate>Fri, 16 Jun 2017 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><category>Arduino</category><category>Device automation</category><description>Interesting little project. Not sure the money pans out considering how much time it would take to build, but if one wanted to learn mechanical control…</description><content:encoded><![CDATA[<p>Interesting little project.</p>
<p>Not sure the money pans out considering how much time it would take to build, but if one wanted to learn mechanical control, this would be a good way to dive in!</p>
<p><a href="https://www.drdflo.com/syringe">https://www.drdflo.com/syringe</a></p>]]></content:encoded></item>
<item><title>Cooling a Pt Grey Camera</title><link>https://austinblanco.com/posts/cooling-pt-grey-camera.html</link><guid isPermaLink="true">https://austinblanco.com/posts/cooling-pt-grey-camera.html</guid><pubDate>Tue, 13 Jun 2017 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><category>Device automation</category><category>Optics</category><category>sCMOS</category><category>Micro-Manager</category><description>I’ve been working with Pt Grey (now FLIR) cameras for a few years now, and one nagging question in the back of my mind has been whether or not it is…</description><content:encoded><![CDATA[<p>I’ve been working with Pt Grey (now FLIR) cameras for a few years now, and one nagging question in the back of my mind has been whether or not it is possible to cool them via external means. There are basically 3 categories of cooling when it comes to low light cameras:</p>
<ul>
<li>no cooling whatsoever</li>
<li>cooling to + or – some delta from ambient</li>
<li>fixed-temperature cooling to some set point.</li>
</ul>
<p>Of these methods, the fixed temp cooling is the most difficult to achieve, for a number of reasons, and I don’t believe these types of cameras would benefit greatly from such an attempt, so my idea was to simply answer the question, “Will cooling improve the performance of these cameras in a measurable way?”</p>
<p>Normally, the cooling of a sensor takes place as close as possible to the back side of the sensor itself. In this case, I started with an already-encased camera, the Pt Grey Chameleon 3. Because I didn’t have access to the sensor back directly, I figured making contact with the case, at as much surface as possible, would suffice. In order to do that I simply used 2 l channel strips of aluminum, and placed thermal tape on all 3 sides touching the camera. The graphic below shows what was added after the aluminum wrapper. First, a peltier (thermo-electric heat exchanger) was coupled to the aluminum. From there, a large CPU heat sink/cooler was attached to the hot side of the TEC. The general idea here is that the aluminum should absorb the heat from the camera. The peltier moves a lot of that heat to the CPU cooler, which radiates the heat into the air. This is a rather rudimentary setup, but it works for the proof of concept.</p>

<p><img loading="lazy" decoding="async" class="size-full wp-image-2762 aligncenter" src="https://austinblanco.com/wp-content/uploads/2017/06/thermal_stack.png" alt="Image from “Cooling a Pt Grey Camera”" width="567" height="391" referrerpolicy="no-referrer" data-remote=""></p>

<p>Below is an image of the assembled system. To provide the required 5V and 12V power to the cooler and peltier, I used my <a href="https://austinblanco.com/posts/lab-psu-from-a-pc-atx-power-supply.html">old reliable ATX Power supply</a>.  This assembly low cost components from Amazon and the like. I think the total cost was $27 or so. Maybe more including thermal tape.</p>
<p><img loading="lazy" decoding="async" class="size-large wp-image-2760 aligncenter" src="https://austinblanco.com/wp-content/uploads/2017/06/tec-stack-768x1024.jpg" alt="Image from “Cooling a Pt Grey Camera”" width="640" height="853" referrerpolicy="no-referrer" data-remote=""></p>
<p>So how did the system perform?</p>
<p>First I allowed the stack to heat up for ~ 30 minutes. I wanted the camera to heat-soak the wrapper, so that when cooling was applied any measurable change could be collected. I think the act of adding the non-powered stack aided in the camera performance a bit, as simply having the radiator attached means that the hot camera can cool more readily from greater surface area exposure. In any case, a thermal camera was used in timelapse mode to collect the change in temperature over time. The recording was started after 30 minutes of warm-up. Images from the thermal camera were captured during a 1 hour period, while the camera was run in timelapse mode using Micro-Manager 1.4. First, here’s a GIF showing a time-compressed thermal image.</p>
<p><img loading="lazy" decoding="async" class="size-full wp-image-2753 aligncenter" src="https://austinblanco.com/wp-content/uploads/2017/06/COOLING_PTG2.gif" alt="Image from “Cooling a Pt Grey Camera”" width="480" height="640" referrerpolicy="no-referrer" data-remote=""></p>
<p>Several things to note here. One is the large drop in camera body temp during the experiment. Another is the subsequent increase in radiator temperature, as it works to shunt the heat from the peltier. Also note the wings on each side of the camera body. They start at a similar temp as the camera body, then drop in temperature significantly (40-50°F) over the duration of the timelapse. It’s important to also note that the emissivity of the plastic camera body differs from that of the aluminum. As a result, even if the temperature is exactly the same, a slight difference in the IR image will be visible.</p>
<p>Below are the results of the image captures. First is a graph showing maximum measured intensity of any pixel in-frame, over the duration of the timelapse (120 frames @ 30Seconds interval). In the case of “hot pixels”, as the camera temperature decreases, the collected signal from those pixels drops.</p>
<figure id="attachment_2763" aria-describedby="caption-attachment-2763" class="wp-caption aligncenter"><img loading="lazy" decoding="async" class="wp-image-2763 size-full" src="https://austinblanco.com/wp-content/uploads/2017/06/Max_int_time.png" alt="Graph of measured 8-bit maximum intensity in image over time of experiment. Orange line represents a 20 point moving average trend." width="1971" height="1110" referrerpolicy="no-referrer" data-remote=""><figcaption id="caption-attachment-2763" class="wp-caption-text">Graph of measured 8-bit maximum intensity in image over time of experiment. Orange line represents a 20 point moving average trend.</figcaption></figure>

<p>Next, I wanted to measure the total # of hot pixels. Now, it’s somewhat nebulous to define a hot pixel, but I used anything 1.5x greater in intensity than the minimum background, or offset, of the image. On this experiment, the average background was ~ 14, resulting in a threshold of 21. I was really surprised by this one. There is a rather large spike in the data, and I’m not certain what that is from. However, this again shows that the cooling is indeed reducing the hot pixel count, as would be expected. Additionally, the count can be seen to normalize at around 1500 pixels, which I expect is where the system started to thermal stabilize.</p>

<p><img loading="lazy" decoding="async" class="alignnone wp-image-2764 size-full" src="https://austinblanco.com/wp-content/uploads/2017/06/therm_hot_pixels.png" alt="Image from “Cooling a Pt Grey Camera”" width="1629" height="1246" referrerpolicy="no-referrer" data-remote=""></p>
<p>For a final set of interesting images. Here’s a shot of the stack after the experiment finished. Note the low temp of the wings and the back wrapper block.</p>
<p><img loading="lazy" decoding="async" class="alignnone size-large wp-image-2761" src="https://austinblanco.com/wp-content/uploads/2017/06/tek-stack-ir.jpg" alt="Image from “Cooling a Pt Grey Camera”" width="480" height="640" referrerpolicy="no-referrer" data-remote=""></p>
<p>Another interesting shot, this one of the sensor face. Using the cooling system it was at 104°F.</p>
<p><img loading="lazy" decoding="async" class="alignnone  wp-image-2758" src="https://austinblanco.com/wp-content/uploads/2017/06/flir-face-cooled.jpg" alt="Image from “Cooling a Pt Grey Camera”" width="477" height="358" referrerpolicy="no-referrer" data-remote=""></p>
<p>Turning the system off produced a temp of ~ 130°F.</p>
<p><img loading="lazy" decoding="async" class="alignnone size-large wp-image-2759" src="https://austinblanco.com/wp-content/uploads/2017/06/Flir-Face-hot.jpg" alt="Image from “Cooling a Pt Grey Camera”" width="480" height="640" referrerpolicy="no-referrer" data-remote=""></p>
<p>My conclusion is that it is possible to cool even encased cameras using external cooling methods, to improve the performance of the camera(s). I do not think such adaptation will yield comparable results to a camera designed with cooling from the start, but this is an interesting option to achieve better results from a camera with a low price point.</p>

<p>-Austin</p>]]></content:encoded></item>
<item><title>Calling all Arduino and Raspberry Pi Users!</title><link>https://austinblanco.com/posts/calling-arduino-raspberry-pi-users.html</link><guid isPermaLink="true">https://austinblanco.com/posts/calling-arduino-raspberry-pi-users.html</guid><pubDate>Tue, 09 May 2017 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><description>Do you build systems which use Arduino or Raspberry Pi boards? Are you happy with the enclosure options available today? I’m not either.</description><content:encoded><![CDATA[<p>Do you build systems which use Arduino or Raspberry Pi boards? Are you happy with the enclosure options available today? I’m not either. But I’m having some trouble figuring out the best possible products to offer. So, I figure there’s no one better to help than the people who need such products. Would you help me out by filling out this very brief survey? It’ll go a long way in helping me find the best path forward in offering a next-level enclosure for our community!</p>
<p><iframe loading="lazy" src="https://docs.google.com/forms/d/e/1FAIpQLSdRnyevZdIVSNptkZIWygKB4cnbOSAuWWlvqhNXXRoTH84baA/viewform?embedded=true" width="760" height="500" marginwidth="0" marginheight="0" title="Embedded content">Loading…</iframe></p>]]></content:encoded></item>
<item><title>LED, laser, or other PWM control using Triggerscope</title><link>https://austinblanco.com/posts/led-laser-pwm-control-using-triggerscope.html</link><guid isPermaLink="true">https://austinblanco.com/posts/led-laser-pwm-control-using-triggerscope.html</guid><pubDate>Thu, 13 Apr 2017 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><category>Micro-Manager</category><category>Microscopes</category><category>Programming</category><category>Triggerscope</category><description>It appears that more and more people want to use PWM control for illumination devices from Micro-Manager and other imaging software.</description><content:encoded><![CDATA[<p>It appears that more and more people want to use PWM control for illumination devices from Micro-Manager and other imaging software. PWM may be used for any number of applications, from high speed pulsing of an LED, or a laser, in order to reduce phototoxicity or just to control brightness, or to drive a DC motor at a varying speed, or to drive a device like a spinning disk to set the PRM. I figured I’d address this using the <a href="http://www.triggerscope.com">Triggerscope system controllers</a>. rIn order to support PWM drive over an external device, I wanted a few useful functions to work in MM:</p>
<ul>
<li>PWM duty cycle should be controlled form presets</li>
<li>PWM should be called to “off” from a TTL or other “shutter” style command</li>
<li>Once off, a similar “ttl on” type command should re-enable PWM at the alst used duty cycle</li>
<li>multiple output lines should be supported at different duty cycles.</li>
</ul>
<p>Version 407 of the Triggerscope firmware now supports this, and uses the existing driver available for these devices. I’ve made a short demo video showing how this works on an oscilloscope output. I’ll place an option for this <a href="http://arc.austinblanco.com/store/">on the store</a>. Please <a href="http://arc.austinblanco.com/contact-us/">get in touch</a> with any questions or post here – thanks!<br>
<div class="video-wrap"><iframe loading="lazy" src="https://www.youtube.com/embed/S1nl-M65nrQ" allowfullscreen="allowfullscreen" title="YouTube video"></iframe></div></p>]]></content:encoded></item>
<item><title>Intel NUC, Pt Grey camera and ASI RAMM offer serious performance for a great price</title><link>https://austinblanco.com/posts/nuc-ptgrey-asi.html</link><guid isPermaLink="true">https://austinblanco.com/posts/nuc-ptgrey-asi.html</guid><pubDate>Fri, 07 Apr 2017 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><category>ASI Stage</category><category>Microscopes</category><category>sCMOS</category><description>One of my recent projects which was very exciting and interesting was to build a custom imaging system for John Mclaughlin at Torch Therapeutics.</description><content:encoded><![CDATA[<p>One of my recent projects which was very exciting and interesting was to build a custom imaging system for John Mclaughlin at Torch Therapeutics. This was a great build for a number of reasons, one of which is that Torch has allowed me to write a report on this build, which is greatly appreciated! From the tiny camera to similarly tiny NUC computer, this was a really interesting build, and I’m excited to share what I found during the testing and setup of the system. If you are looking for this type of custom integrated system, please take a look at what <a href="http://arc.austinblanco.com/">my company offers</a>, as we’d love to build a system for you!</p>
<p><strong>Scope Selection</strong></p>
<p>What we were looking to build on this system was a low cost, yet fully automated imaging scope that would be easy to modify, simple to operate, and compatible with Micro-manager. In the short term, only Z control is required, but as the work grows, we wanted provision for XY automation, as well as autofocus tracking. For fluorescence excitation we an LED illuminator. After looking at several options, we selected the <a href="http://www.asiimaging.com/index.php/products/complete-system-solutions/rapid-automated-modular-microscope-ramm-system/">ASI RAMM microscope</a>, with the inclusion of the <a href="http://www.asiimaging.com/index.php/products/controllers/tiger-controller/">Tiger unified controller</a>, and the<a href="http://www.asiimaging.com/index.php/products/illumination-control/led-lamp/"> ASI LED excitation module</a>. This system offers a complete microscope from one control box, on a scalable build platform, at a competitive price. I <a href="https://austinblanco.com/posts/asi-ramm-microsocpe-testing.html">reviewed the RAMM scope a few years back</a>, and happy to see that the quality and options have only increased over time. When I reviewed the system, it was required that I build the frame and align things correctly. The new systems ship completely assembled. I literally pulled it out of the box, plugged it in and things were operational. This out-of-box experience isn’t normally seen even in the “big 4” microscopes.</p>
<figure id="attachment_2710" aria-describedby="caption-attachment-2710" class="wp-caption aligncenter"><img loading="lazy" decoding="async" class="wp-image-2710 size-full" src="https://austinblanco.com/wp-content/uploads/2017/04/00-6.jpg" alt="RAMM scope after unboxing" width="640" height="480" referrerpolicy="no-referrer" data-remote=""><figcaption id="caption-attachment-2710" class="wp-caption-text">RAMM scope after unboxing</figcaption></figure>

<figure id="attachment_2712" aria-describedby="caption-attachment-2712" class="wp-caption aligncenter"><img loading="lazy" decoding="async" class="wp-image-2712 size-full" src="https://austinblanco.com/wp-content/uploads/2017/04/00-8.jpg" alt="Dual lightpath setup for focus tracking – dichroic for epi on the left (thumbscrews shown) and provision for IR cut mirror on right." width="640" height="480" referrerpolicy="no-referrer" data-remote=""><figcaption id="caption-attachment-2712" class="wp-caption-text">Dual lightpath setup for focus tracking – dichroic for epi on the left (thumbscrews shown) and provision for IR cut mirror on right.</figcaption></figure>
<p>Another feature of this scope is the inclusion of all needed driver components in one box, ASI’s Tiger controller. This is a modular control box which can accept riser cards as-needed to drive various components. The controller on this setup was actually the largest electronic box in the system! From left to right are installed driver cards for joystick/control input, Z stage, LED output, and filter wheel control. Another great feature of this box is that when installing in Micro-manager, only a single USB connection, and single hub device are required.</p>
<figure id="attachment_2709" aria-describedby="caption-attachment-2709" class="wp-caption aligncenter"><img loading="lazy" decoding="async" class="wp-image-2709 size-full" src="https://austinblanco.com/wp-content/uploads/2017/04/00-5.jpg" alt="Tiger Controller, with intel NUC on top" width="480" height="640" referrerpolicy="no-referrer" data-remote=""><figcaption id="caption-attachment-2709" class="wp-caption-text">Tiger Controller, with intel NUC on top</figcaption></figure>
<p><strong>LED Illumination</strong></p>
<p>ASI offers a 4 channel LED illuminator, with option for almost any available LED module. This is a simple illumination setup using a common ladder-dichroic design. The open nature of the hardware allows for changes to the dichroics, or the LED modules, as may be needed by the customer as things change in the future. Each LED is driven using a simple audio style TRS cable, so connecting or disconnecting the LEDs from the driver is straightforward. On the output side of the module, an aperture diapragm is provided to avoid overfilling the back aperture of the objective.</p>

<p><img loading="lazy" decoding="async" class="size-full wp-image-2708 aligncenter" src="https://austinblanco.com/wp-content/uploads/2017/04/00-4.jpg" alt="Image from “Intel NUC, Pt Grey camera and ASI RAMM offer serious performance for a great price”" width="640" height="480" referrerpolicy="no-referrer" data-remote=""></p>
<p><strong>Camera Selection</strong></p>
<p>When selecting a camera, we wanted good QE, decent resolution, but didn’t require any advanced cooling or long exposures. Of the available options, the Pt Grey (FLIR) BlackFly camera fit the bill. Recently, Nico Stuurman @ UCSF <a href="https://micro-manager.org/wiki/Point_Grey_Research">wrote up a driver to support this camera in Micro-manager</a>, and after working with it for w while I’m quite impressed. I was able to configure some tricky stuff, I tested various binning modes, subarrays, a wide range of exposure times, and things seemed stable. One suggestion if using this camera is to always snap an image after making changes, vs. simply clicking “live”.</p>
<p>The camera is unbelievably small, roughly the size of a 1″ cube. While cool at first glance, there are some drawbacks to such a design which I note below. I tested the camera at no-light conditions for 2 things – dark current over exposure time, and read noise. Read noise shows a 16-bit count standard deviation of 214.78. Value ranges on the noise floor ran 3264 counts max-min. This works out to a noise level of 4%. Calculation for this measurement was from 2 images in a sequence.</p>
<p>(Image1+2000) -image2 = 200 count centered noise level. (ranging around the 2k level).</p>
<p>Not the best performance from a typical sCMOS camera, but if we consider the next lowest-cost camera runs ~ $5,000, this is quite good in my opinion. There is some pattern noise apparent in the camera, below is an average of 20 exposures, all using 10ms exposure time. The image has been contrast enhanced and pseudo-colored for presentation.</p>
<figure id="attachment_2719" aria-describedby="caption-attachment-2719" class="wp-caption aligncenter"><img loading="lazy" decoding="async" class="wp-image-2719 size-large" src="https://austinblanco.com/wp-content/uploads/2017/04/screenshot-1024x649.png" alt="Average of 20 images captured @ 10ms exposure time." width="640" height="406" referrerpolicy="no-referrer" data-remote=""><figcaption id="caption-attachment-2719" class="wp-caption-text">Average of 20 images captured @ 10ms exposure time.</figcaption></figure>
<p>So it appears the taps are drifting a bit. Just for grins I tossed one of these images into an FFT and redisplayed the spectrum for view. Looking at the output, my gut says the image below results from temperature bias on the output taps, and this bias is distributed across the back side of the sensor, or at least wherever the taps are located on the readout layer of the PCB. The higher frequency events at the center look like the typical clock timing jitter seen on any ADC. But this is only my non-expert observation – I’d love for any uber-camera experts to weigh in!</p>
<p><img loading="lazy" decoding="async" class="alignnone size-large wp-image-2720" src="https://austinblanco.com/wp-content/uploads/2017/04/FFT-1024x1024.png" alt="Image from “Intel NUC, Pt Grey camera and ASI RAMM offer serious performance for a great price”" width="640" height="640" referrerpolicy="no-referrer" data-remote=""></p>
<p>I also wanted to look at how bad the hot pixel effects would be using longer exposures. For this test I ran a set of exposure times from 1ms to 3000ms.</p>
<p>Increase in dark current over time was about as expected.</p>
<p><img loading="lazy" decoding="async" class="size-full wp-image-2721 aligncenter" src="https://austinblanco.com/wp-content/uploads/2017/04/Dark-current-ptgrey.png" alt="Image from “Intel NUC, Pt Grey camera and ASI RAMM offer serious performance for a great price”" width="975" height="585" referrerpolicy="no-referrer" data-remote=""></p>

<p>I think the bottom line on this camera is that it runs as hot as any other camera, but has neither the active cooling nor the inherent surface area to radiate heat well. I took a pic of it using my Flir One camera, and it runs at about 95°F while idle.</p>
<p><img loading="lazy" decoding="async" class="size-full wp-image-2714 aligncenter" src="https://austinblanco.com/wp-content/uploads/2017/04/00-10.jpg" alt="Image from “Intel NUC, Pt Grey camera and ASI RAMM offer serious performance for a great price”" width="640" height="480" referrerpolicy="no-referrer" data-remote=""></p>

<p>Does this mean the camera isn’t suitable for microscopy? Not at all? This is an amazing piece of tech for a very low price. I can imagine buying 3 of these, one for each of 3 emission channels on a single scope! My goal in presenting this information is to share what the current limitations are for such a product. I think the raw QE and ~2.3MP resolution of the camera make it a perfect fit for most microscopy jobs. Of course, there will always be need for higher end cameras, but for many run of the mill operations, this is a nice solution.</p>
<p><strong>NUC Computer</strong></p>
<p>When searching for an “imaging computer” on this project, I had initially considered using a Mac Mini, dual booted with windows 10. I’ve used this for a number of other projects, and it has always run well in windows. John suggested looking at the NUC as an option, which provided later opportunity to upgrade the RAM and disk space. After building it up (which only required installing memory and an SSD), this little guy kicked butt!I ran Windows 10-Professional x64 for this build, and used the latest version of Micro-manager. Funny that a $500 computer and a $500 camera can be had for what used to run ~ $15k!. I successfully ran this on timelapse for 10 hours, and captured streams in MM of 100 frames. I didn’t push the buffer too much or analyze the USB-3 performance, but overall this is a great little machine for simple capture of images.</p>
<p><img loading="lazy" decoding="async" class="size-full wp-image-2717 aligncenter" src="https://austinblanco.com/wp-content/uploads/2017/04/00-13.jpg" alt="Image from “Intel NUC, Pt Grey camera and ASI RAMM offer serious performance for a great price”" width="480" height="640" referrerpolicy="no-referrer" data-remote=""></p>

<p>Building this system was a lot of fun, and I really enjoyed using non-traditional components for it. I think this type of system will become commonplace in the future, as more and more customers realize that traditional components, at a traditional high cost,  aren’t always the best fit for their needs. If you are interested in this type of solution for your lab or company, please <a href="http://arc.austinblanco.com/contact-us/">get in touch</a>, as I’d love to build one just for you!</p>
<p>-Austin</p>]]></content:encoded></item>
<item><title>Micro-Manager on the Raspberry Pi</title><link>https://austinblanco.com/posts/micro-manager-raspberry-pi.html</link><guid isPermaLink="true">https://austinblanco.com/posts/micro-manager-raspberry-pi.html</guid><pubDate>Sun, 05 Mar 2017 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><description>Micro-manager guru Kyle M. Douglass recently posed his implementation of micro-manager on a raspberry Pi 3.</description><content:encoded><![CDATA[<p>Micro-manager guru Kyle M. Douglass recently <a href="http://kmdouglass.github.io/posts/micro-manager-on-the-raspberry-pi.html">posed his implementation</a> of micro-manager on a raspberry Pi 3. Very cool potential here, considering when the computing power of the pi is exceeded for a given application, one could just add more for $45!</p>
<p>I’d imagine that memory handling issues related to image capture would be the biggest problem for the rpi, but it wouldn’t be surprising to see that addressed in the future. It looks like accessing cameras such as the point grey chamelion<a href="https://www.raspberrypi.org/forums/viewtopic.php?f=38&amp;t=15287"> has been accomplished</a>, however over 1394, not USB.</p>
<p>-Austin</p>]]></content:encoded></item>
<item><title>Computational imaging continues to grow in microscopy</title><link>https://austinblanco.com/posts/computational-illumination-continues-grow-microscopy.html</link><guid isPermaLink="true">https://austinblanco.com/posts/computational-illumination-continues-grow-microscopy.html</guid><pubDate>Wed, 01 Mar 2017 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><category>Microscopes</category><category>Programming</category><category>Super Resolution</category><description>The Waller Lab recently had a demo announcement of their awesome implementation of computational imaging.</description><content:encoded><![CDATA[<p>The Waller Lab recently had a demo announcement of their <a href="https://www.osapublishing.org/boe/fulltext.cfm?uri=boe-5-7-2376&amp;id=294149#top">awesome implementation</a> of computational imaging. They have some examples on their <a href="https://pictures.lytro.com/zkphil/albums/205322">lytro page</a>, which look really cool! This got me thinking about the last 10 years or so, and how the combination of image capture with control over input and output image fields, has grown into a new force in microscopy today.</p>
<p>It’s interesting to consider what techniques fit into the field of computational imaging. Optical microscopy has pushed into an ever smaller domain of resolution, to the point that Abbe’s laws need to be avoided in order to pull resolution out of an image. Consider the initial techniques used for this – phase, DIC, confocal, TIRF, and the like are <a href="http://zeiss-campus.magnet.fsu.edu/articles/basics/contrast.html">contrast enhancement</a> techniques of enhancing an image’s contrast, by either increasing the signal intensity, or by reducing the surrounding noise/background intensity.  Beginning with the <a href="http://zeiss-campus.magnet.fsu.edu/tutorials/opticalsectioning/apotome/indexflash.html">Apotome</a>, and maybe earlier, <a href="http://www.kbimaging.com/3ddeconvolution/gallery_spirogyra.html">with deconvolution</a>, a combination of using multiple image samples with post-capture image processing, to gather more information than can be obtained by a single image, started to emerge.</p>
<p>Building on these first techniques, we can see further sampling methods in the optical domain, like STORM/PALM, where optical control over emission is coupled with high sampling rates, and back-end processing, to statistically avoid Abbe’s laws. I’d imagine FLIM falls into this category as well, using time and multiple images, again to extract more data than may be obtained by a single sample. Non-microscopy applications for yet another method in this domain, the employment of coded apertures, similar to <a href="https://groups.csail.mit.edu/graphics/CodedAperture/">this work from MIT</a>,  are growing in a number of imaging fields.</p>
<p>This combination, of computing power + controlled image fields, can be employed to do all sorts of as-yet untouched things with a conventional microscope. I can imagine that very soon, we will see a few of the following products available for use:</p>
<ul>
<li>phase contrast, and fluorescent, multi-capture resolution enhancement systems, all built into an “off the shelf” microscope</li>
<li>angular changes to fluorescence excitation, used to improve resolution</li>
<li>wavelength-based restriction inside an image field, to eliminate the potential for crosstalk in emission</li>
<li>multiple excitation power sampling, to pull greater dynamic range from images</li>
<li>multiple cameras used with restricting apertures, used to pull focus information, or multiple focal fields, from a single position in a sample</li>
</ul>
<p>These are only a few ideas where this can go, but the general path I can see in the future is lower cost components, which are leveraged to do better and better work, which gives more imaging power to a greater number of researchers. At least – that’s a future I’d like to see 🙂</p>
<p>-Austin</p>]]></content:encoded></item>
<item><title>An awesome gerber viewer for OSX</title><link>https://austinblanco.com/posts/awesome-gerber-viewer-osx.html</link><guid isPermaLink="true">https://austinblanco.com/posts/awesome-gerber-viewer-osx.html</guid><pubDate>Tue, 28 Feb 2017 12:00:00 +0000</pubDate><dc:creator>Austin Blanco</dc:creator><description>While there are a few viewing tools available for OSX, I’ve been looking for something that was higher quality, and more configurable.</description><content:encoded><![CDATA[<p>While there are a few viewing tools available for OSX, I’ve been looking for something that was higher quality, and more configurable. Today I stumbled upon <a href="http://www.wortum.com/cuprum/">Cuprum</a>. This viewer supports layering, export of user-configured views, some good print options and other stuff. It’s $13 on the Mac App store, and well worth it IMHO.</p>

<p>Here’s an example of one of my breakout board shields. Overall this makes review of a gerber output MUCH easier than other programs I’ve tried. An app store DL is available here – It’s $14,99 <a href="https://itunes.apple.com/us/app/cuprum/id1088670425?mt=12">on the app store</a>.</p>

<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-2673" src="https://austinblanco.com/wp-content/uploads/2017/02/screenshot.png" alt="Image from “An awesome gerber viewer for OSX”" width="696" height="413" referrerpolicy="no-referrer" data-remote=""></p>
<p>-Austin</p>]]></content:encoded></item>
</channel>
</rss>
