<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>cool tech zone</title>
    <link rel="self" type="application/atom+xml" href="https://cooltech.zone/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://cooltech.zone"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2024-03-07T00:00:00+00:00</updated>
    <id>https://cooltech.zone/atom.xml</id>
    <entry xml:lang="en">
        <title>Pre-production Progress</title>
        <published>2024-03-07T00:00:00+00:00</published>
        <updated>2024-03-07T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              cool tech zone peeps
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://cooltech.zone/tangara/blog/2024-03-07-preprod/"/>
        <id>https://cooltech.zone/tangara/blog/2024-03-07-preprod/</id>
        
        <content type="html" xml:base="https://cooltech.zone/tangara/blog/2024-03-07-preprod/">&lt;p&gt;&lt;em&gt;This is a mirror of a campaign update originally posted on &lt;a href=&quot;https:&#x2F;&#x2F;www.crowdsupply.com&#x2F;cool-tech-zone&#x2F;tangara&#x2F;updates&#x2F;pre-production-progress&quot;&gt;CrowdSupply&lt;&#x2F;a&gt;.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Hi!&lt;&#x2F;p&gt;
&lt;p&gt;Our campaign crossed 500 backers this week! Thank you so much to everyone for your kind support! All of us in the Cool Tech Zone feel so lucky to have this opportunity to share our little music player with so many people.&lt;&#x2F;p&gt;
&lt;p&gt;This week we were intending to talk about the design of Tangara&#x27;s case, but some illnesses in the team have left us without time to do a proper write-up. So instead we&#x27;ll tell you about the case design next week, while this week I&#x27;ll be giving you a short update on how things are going with our pre-production work.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;case-refinements&quot;&gt;Case Refinements&lt;&#x2F;h3&gt;
&lt;p&gt;As I said, we&#x27;ll share more about this next week, but we (well, mostly Erin) have been making some great improvements to Tangara&#x27;s case. The improved design is slightly slimmer, is easier to produce, has nicer feeling fittings, and even has room for an easily replaced transparent cover in front of the display!&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;cooltech.zone&#x2F;tangara&#x2F;blog&#x2F;2024-03-07-preprod&#x2F;cases.jpg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;On the left is a CNC prototype of our previous design. On the right is a 3D printed prototype of the new design (a new CNC prototype should arrive this week).&lt;&#x2F;p&gt;
&lt;h3 id=&quot;packaging&quot;&gt;Packaging&lt;&#x2F;h3&gt;
&lt;p&gt;One of the tricky things about having so many backers is that a lot of processes that work fine for 100 devices, don&#x27;t really work when you&#x27;ve got to pack and ship 500 or 1000 devices.&lt;&#x2F;p&gt;
&lt;p&gt;To help us scale up our packing process, we&#x27;ve gotten a die-line made up for a small folded cardboard insert that fits inside the boxes we&#x27;re using. This will hold each device securely, be faster for us to pack consistently than other methods, and is a reasonably environmentally friendly approach, as cardboard is easy to recycle.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;cooltech.zone&#x2F;tangara&#x2F;blog&#x2F;2024-03-07-preprod&#x2F;insert1.jpg&quot; alt=&quot;&quot; &#x2F;&gt;
&lt;img src=&quot;https:&#x2F;&#x2F;cooltech.zone&#x2F;tangara&#x2F;blog&#x2F;2024-03-07-preprod&#x2F;insert2.jpg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;ce-and-fcc-compliance&quot;&gt;CE and FCC Compliance&lt;&#x2F;h3&gt;
&lt;p&gt;We had hoped that we would have regulatory EMC work finished up before the completion of our campaign, but we&#x27;ve had some difficulty finding a testing lab in Sydney that we&#x27;re happy to work with. We are still making good progress however, and it&#x27;s unlikely that these difficulties will affect our production timelines.&lt;&#x2F;p&gt;
&lt;p&gt;One nice win for us is that, due to how successful this campaign has been, we&#x27;ve been able to justify acquiring the equipment needed to do more thorough pre-compliance testing ourselves. This should reduce the risk of major compliance issues down the track.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;firmware-development&quot;&gt;Firmware Development&lt;&#x2F;h3&gt;
&lt;p&gt;In amongst the pre-production work, we&#x27;re also making steady progress on improving Tangara&#x27;s firmware. Most recently, we&#x27;ve made some substantial performance improvements and implemented a few more important features, including seeking support and gapless playback.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;thanks-again&quot;&gt;Thanks Again!&lt;&#x2F;h3&gt;
&lt;p&gt;That&#x27;s all we have for this week. Thanks so much to everyone again for your support!&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Lua Support</title>
        <published>2024-02-24T00:00:00+00:00</published>
        <updated>2024-02-24T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              cool tech zone peeps
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://cooltech.zone/tangara/blog/2024-02-24-lua/"/>
        <id>https://cooltech.zone/tangara/blog/2024-02-24-lua/</id>
        
        <content type="html" xml:base="https://cooltech.zone/tangara/blog/2024-02-24-lua/">&lt;p&gt;&lt;em&gt;This is a mirror of a campaign update originally posted on &lt;a href=&quot;https:&#x2F;&#x2F;www.crowdsupply.com&#x2F;cool-tech-zone&#x2F;tangara&#x2F;updates&#x2F;lua-support&quot;&gt;CrowdSupply&lt;&#x2F;a&gt;.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Hey everyone, Daniel here again. At the time of writing this we just passed 2000% funded! Thank you all so much!&lt;&#x2F;p&gt;
&lt;p&gt;This week&#x27;s update is about Tangara&#x27;s support for the Lua scripting language. I&#x27;ll talk a bit about what Lua is, describe what it can do, and share some fun examples of how you can control Tangara from a Lua console. Then Hailey will show off the desktop companion app she&#x27;s been working on, which uses Lua to do some really cool things as well.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;lua-on-tangara&quot;&gt;Lua on Tangara&lt;&#x2F;h2&gt;
&lt;p&gt;We&#x27;ve previously said that, in striving to make a truly hackable music player, we accidentally created a really fun and useful development board. One place where this really shines is in Tangara&#x27;s Lua support. By connecting your Tangara to a computer, you can use an interactive Lua session to run code directly on the device.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;what-is-lua&quot;&gt;What Is Lua?&lt;&#x2F;h3&gt;
&lt;p&gt;Lua is a scripting language similar to Python or JavaScript. It&#x27;s a great first language as it&#x27;s beginner friendly, has a lot of online resources, and is used in many different types of applications, especially in the worlds of game development and modding.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;control-your-device-with-code&quot;&gt;Control Your Device With Code&lt;&#x2F;h3&gt;
&lt;p&gt;Tangara&#x27;s UI is written in Lua, using the same APIs that are that are exposed through the serial console. What that means is that anything that Tangara&#x27;s UI can do, you can do with code as well.&lt;&#x2F;p&gt;
&lt;p&gt;Let&#x27;s go through an example of what that actually looks like. I&#x27;ll start by connecting my Tangara to my computer with a USB Type-C cable, and use the &lt;code&gt;screen&lt;&#x2F;code&gt; program to connect to the serial console. Alternatively, you could connect using our companion app (more on that later).&lt;&#x2F;p&gt;
&lt;p&gt;Once connected, we can open an interactive Lua shell by using the &lt;code&gt;lua&lt;&#x2F;code&gt; command:&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt; → lua
&lt;&#x2F;span&gt;&lt;span&gt;Lua 5.4.4  Copyright (C) 1994-2023 Lua.org, PUC-Rio
&lt;&#x2F;span&gt;&lt;span&gt;luarepl 0.10 Copyright (C) 2011-2015 Rob Hoelz
&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;That &lt;code&gt;&amp;gt;&amp;gt;&lt;&#x2F;code&gt; is Lua&#x27;s prompt, where we can write code and have it run directly on the device.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lua&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-lua &quot;&gt;&lt;code class=&quot;language-lua&quot; data-lang=&quot;lua&quot;&gt;&lt;span&gt;&amp;gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;print&lt;&#x2F;span&gt;&lt;span&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;hello&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;hello
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Our Lua API allows us to directly interact with many of the firmware&#x27;s features. For example, we can use the &lt;code&gt;volume&lt;&#x2F;code&gt; module to see the current volume and other related settings.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lua&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-lua &quot;&gt;&lt;code class=&quot;language-lua&quot; data-lang=&quot;lua&quot;&gt;&lt;span&gt;&amp;gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;volume
&lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;current_db &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;property &lt;&#x2F;span&gt;&lt;span&gt;{ -&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;9 &lt;&#x2F;span&gt;&lt;span&gt;},
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;current_pct &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;property &lt;&#x2F;span&gt;&lt;span&gt;{ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;100 &lt;&#x2F;span&gt;&lt;span&gt;},
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;left_bias &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;property &lt;&#x2F;span&gt;&lt;span&gt;{ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;0 &lt;&#x2F;span&gt;&lt;span&gt;},
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;limit_db &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;property &lt;&#x2F;span&gt;&lt;span&gt;{ -&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;10 &lt;&#x2F;span&gt;&lt;span&gt;},
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;We can see here that &lt;code&gt;current_pct&lt;&#x2F;code&gt; is a property with a value of 100, meaning the volume is currently at 100%. Tangara&#x27;s Lua API has many of these properties, which are values from the C++ firmware that you can inspect, modify (if the property is not read-only), and do data binding with. In this case, none of these properties are marked as read-only so we can use the &lt;code&gt;set&lt;&#x2F;code&gt; method to change their values. Let&#x27;s try setting the volume to 60%:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lua&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-lua &quot;&gt;&lt;code class=&quot;language-lua&quot; data-lang=&quot;lua&quot;&gt;&lt;span&gt;&amp;gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;volume&lt;&#x2F;span&gt;&lt;span&gt;.current_pct:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;60&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;true
&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;volume
&lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;current_db &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;property &lt;&#x2F;span&gt;&lt;span&gt;{ -&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;40 &lt;&#x2F;span&gt;&lt;span&gt;},
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;current_pct &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;property &lt;&#x2F;span&gt;&lt;span&gt;{ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;60 &lt;&#x2F;span&gt;&lt;span&gt;},
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;left_bias &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;property &lt;&#x2F;span&gt;&lt;span&gt;{ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;0 &lt;&#x2F;span&gt;&lt;span&gt;},
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;limit_db &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;property &lt;&#x2F;span&gt;&lt;span&gt;{ -&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;10 &lt;&#x2F;span&gt;&lt;span&gt;},
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Not only has the &lt;code&gt;current_pct&lt;&#x2F;code&gt; value changed, but we can also see that the &lt;code&gt;current_db&lt;&#x2F;code&gt; value has updated to reflect the new volume as well. Now let&#x27;s take a look at another module, the Bluetooth module.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lua&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-lua &quot;&gt;&lt;code class=&quot;language-lua&quot; data-lang=&quot;lua&quot;&gt;&lt;span&gt;&amp;gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;bluetooth
&lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;connected &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;property &lt;&#x2F;span&gt;&lt;span&gt;{ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;false&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;read&lt;&#x2F;span&gt;&lt;span&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;only &lt;&#x2F;span&gt;&lt;span&gt;},
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;devices &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;property &lt;&#x2F;span&gt;&lt;span&gt;{ table: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;0x3f939364&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;read&lt;&#x2F;span&gt;&lt;span&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;only &lt;&#x2F;span&gt;&lt;span&gt;},
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;enabled &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;property &lt;&#x2F;span&gt;&lt;span&gt;{ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;false &lt;&#x2F;span&gt;&lt;span&gt;},
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;paired_device &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;property &lt;&#x2F;span&gt;&lt;span&gt;{ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;nil &lt;&#x2F;span&gt;&lt;span&gt;},
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The &lt;code&gt;connected&lt;&#x2F;code&gt; property describes whether or not Tangara is currently connected to a Bluetooth device. This property is read-only, meaning we cannot set the value of this property from Lua. It can only be updated from the firmware when a device is connected or disconnected – it wouldn&#x27;t be very useful to be able to set &lt;code&gt;connected&lt;&#x2F;code&gt; to true if the device isn&#x27;t connected to anything. To turn Bluetooth on, we can set the &lt;code&gt;enabled&lt;&#x2F;code&gt; property to true.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lua&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-lua &quot;&gt;&lt;code class=&quot;language-lua&quot; data-lang=&quot;lua&quot;&gt;&lt;span&gt;&amp;gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;bluetooth&lt;&#x2F;span&gt;&lt;span&gt;.enabled:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;bluetooth
&lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;connected &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;property &lt;&#x2F;span&gt;&lt;span&gt;{ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;read&lt;&#x2F;span&gt;&lt;span&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;only &lt;&#x2F;span&gt;&lt;span&gt;},
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;devices &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;property &lt;&#x2F;span&gt;&lt;span&gt;{ table: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;0x3f93ec18&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;read&lt;&#x2F;span&gt;&lt;span&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;only &lt;&#x2F;span&gt;&lt;span&gt;},
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;enabled &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;property &lt;&#x2F;span&gt;&lt;span&gt;{ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;true &lt;&#x2F;span&gt;&lt;span&gt;},
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;paired_device &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;property &lt;&#x2F;span&gt;&lt;span&gt;{ table: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;0x3f93f418 &lt;&#x2F;span&gt;&lt;span&gt;},
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Here I was able to connect my Method ANC Bluetooth earphones by setting enabled to true, then the firmware automatically connects to previously connected devices, in this case my earphones. Checking the Bluetooth properties again shows that &lt;code&gt;connected&lt;&#x2F;code&gt; is now true.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;other-fun-examples&quot;&gt;Other Fun Examples&lt;&#x2F;h3&gt;
&lt;h4 id=&quot;controlling-playback&quot;&gt;Controlling Playback&lt;&#x2F;h4&gt;
&lt;p&gt;For properties and functions related to audio playback, we have the &lt;code&gt;playback&lt;&#x2F;code&gt; module.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lua&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-lua &quot;&gt;&lt;code class=&quot;language-lua&quot; data-lang=&quot;lua&quot;&gt;&lt;span&gt;&amp;gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;playback
&lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;playing &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;property &lt;&#x2F;span&gt;&lt;span&gt;{ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;false &lt;&#x2F;span&gt;&lt;span&gt;},
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;position &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;property &lt;&#x2F;span&gt;&lt;span&gt;{ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;read&lt;&#x2F;span&gt;&lt;span&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;only &lt;&#x2F;span&gt;&lt;span&gt;},
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;track &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;property &lt;&#x2F;span&gt;&lt;span&gt;{ &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;nil&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;read&lt;&#x2F;span&gt;&lt;span&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;only &lt;&#x2F;span&gt;&lt;span&gt;},
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;To pause playback we can do something like &lt;code&gt;playback.playing:set(false)&lt;&#x2F;code&gt;, and to begin playing again, we can do the same but with &lt;code&gt;true&lt;&#x2F;code&gt; instead of &lt;code&gt;false&lt;&#x2F;code&gt;. We could toggle play&#x2F;pause by using a combination of get and set to get the current value, then set the new value to the opposite:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lua&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-lua &quot;&gt;&lt;code class=&quot;language-lua&quot; data-lang=&quot;lua&quot;&gt;&lt;span&gt;&amp;gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;playback&lt;&#x2F;span&gt;&lt;span&gt;.playing:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span&gt;(not &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;playback&lt;&#x2F;span&gt;&lt;span&gt;.playing:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;get&lt;&#x2F;span&gt;&lt;span&gt;())
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h4 id=&quot;adding-tracks-to-the-queue&quot;&gt;Adding Tracks to the Queue&lt;&#x2F;h4&gt;
&lt;p&gt;This one is a bit more advanced, and explaining each element would be outside the scope of this post. As an example, though, here&#x27;s how you might add all tracks from the database to the queue:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lua&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-lua &quot;&gt;&lt;code class=&quot;language-lua&quot; data-lang=&quot;lua&quot;&gt;&lt;span&gt;&amp;gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;iterator &lt;&#x2F;span&gt;&lt;span&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;database&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;indexes&lt;&#x2F;span&gt;&lt;span&gt;()[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span&gt;]:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span&gt;()
&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;queue&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;add&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;iterator&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;queue&lt;&#x2F;span&gt;&lt;span&gt;.size:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;get&lt;&#x2F;span&gt;&lt;span&gt;()
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;607
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;For more about database indexes and getting tracks from the database, you can check out the &lt;a href=&quot;https:&#x2F;&#x2F;cooltech.zone&#x2F;tangara&#x2F;ldoc&#x2F;modules&#x2F;database.html&quot;&gt;ldocs pages here&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;controlling-display-brightness&quot;&gt;Controlling Display Brightness&lt;&#x2F;h4&gt;
&lt;h3 id=&quot;changing-settings&quot;&gt;Changing Settings&lt;&#x2F;h3&gt;
&lt;p&gt;You can use Lua to change many of Tangara&#x27;s settings, including display brightness, volume, input control method, scroll sensitivity, and more. This not only gives you more control over your device, but also improves accessibility and reliability.&lt;&#x2F;p&gt;
&lt;p&gt;For those of you already familiar with Lua or willing to learn, this is another way we&#x27;re giving you control over your device. Of course, we don&#x27;t expect everyone will be comfortable with or interested in writing code. You can also change all of these settings from within the on-device settings screen.&lt;&#x2F;p&gt;
&lt;p&gt;The fact that these settings are available in Lua also means you can easily set them from Tangara&#x27;s desktop companion app. Our friend Hailey has been doing amazing work on this, so I&#x27;ll hand the mic over to her to tell you all about it. Take it away, Hailey!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;desktop-companion&quot;&gt;Desktop Companion&lt;&#x2F;h2&gt;
&lt;p&gt;Thanks Daniel :) Hailey here! I&#x27;ve been helping the team out by working on Tangara Companion – the desktop companion app for Tangara. Our vision for Companion is to make it as easy as possible to hack, update, and explore your Tangara, without first needing to become an expert on the commandline or wrangle a whole pile of commandline tools. We want Companion to be convenient for seasoned users while also providing a gentle on ramp for everyone else looking to learn how Tangara works.&lt;&#x2F;p&gt;
&lt;p&gt;Just like Tangara, Companion is hackable and open source, under the GPL-3 license. Companion is written in &lt;a href=&quot;https:&#x2F;&#x2F;www.rust-lang.org&#x2F;&quot;&gt;Rust&lt;&#x2F;a&gt;, a programming language that makes it hard to make mistakes, and built with &lt;a href=&quot;https:&#x2F;&#x2F;www.gtk.org&#x2F;&quot;&gt;GTK&lt;&#x2F;a&gt;, a desktop framework that originally came from the Linux world and that makes it easy to write gorgeous cross-platform apps without getting too snarled up in the details of the various platforms. This means Companion is fully cross platform too, and we&#x27;ll be providing official downloads for all three major platforms: Linux, Windows, and macOS. We&#x27;ll make it as easy as possible to compile yourself, if that&#x27;s more your style, and if you happen to be an enthusiast of little-known operating systems, we&#x27;d also love to hear about your experience getting it going.&lt;&#x2F;p&gt;
&lt;p&gt;Let&#x27;s dive in and see what Tangara Companion actually looks like:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;cooltech.zone&#x2F;tangara&#x2F;blog&#x2F;2024-02-24-lua&#x2F;tangara-u04-companion1.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Straight away it shows a bunch of important details about your Tangara. Companion communicates with Tangara over USB Serial, and the serial port in use is shown. On my machine, that&#x27;s &lt;code&gt;&#x2F;dev&#x2F;ttyACM0&lt;&#x2F;code&gt;, but on Windows for example, it&#x27;ll be the familiar and enduring COM port. You don&#x27;t actually need to know all about serial ports to use Companion, but we&#x27;re building a hackable music player here, and it&#x27;s just not in our nature to hide the details.&lt;&#x2F;p&gt;
&lt;p&gt;From the topic of this post, you might be able to guess how Companion retrieves the rest of the information shown on this screen. That&#x27;s right – with Lua! Tangara&#x27;s Lua environment is exposed over the serial console, and Companion uses the Lua console to talk to Tangara just like you would if you were exploring what Daniel talked about above. To retrieve the firmware version, for example, Companion sends the code &lt;code&gt;require(&quot;version&quot;).esp()&lt;&#x2F;code&gt; to the Lua console and reads whatever that function returns.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;cooltech.zone&#x2F;tangara&#x2F;blog&#x2F;2024-02-24-lua&#x2F;tangara-u04-companion2.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The settings page works the same way, and even uses the fancy data binding stuff that Daniel spoke of. All settings changes in Companion take effect immediately on Tangara. Likewise, all settings changes on Tangara are reflected live in Companion. When I first got the settings page working, it was extremely cool—and kind of magical—to see my Tangara&#x27;s screen brightness change in real-time as I dragged the brightness slider up and down with my mouse.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;cooltech.zone&#x2F;tangara&#x2F;blog&#x2F;2024-02-24-lua&#x2F;tangara-u04-companion3.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Finally, there&#x27;s the Lua console and the firmware update pages. I won&#x27;t go into the Lua console in this part of the post, since I&#x27;d just be repeating what Daniel has already said, but it&#x27;s worth taking a look at how Tangara firmware updates work.&lt;&#x2F;p&gt;
&lt;p&gt;Firmware updates are distributed in a format we&#x27;ve designed specifically for Tangara—the Tangara Release Archive—which is also supported by Companion. This format is really simple. A Tangara Release Archive is just a ZIP file that contain binary images to be flashed to Tangara and a &lt;code&gt;tangaraflash.json&lt;&#x2F;code&gt; manifest that lists each binary image and its address in ROM:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;json&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-json &quot;&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;version&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;data&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: {
&lt;&#x2F;span&gt;&lt;span&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;firmware&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: {
&lt;&#x2F;span&gt;&lt;span&gt;            &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;version&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;0.6.0&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span&gt;            &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;images&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: [
&lt;&#x2F;span&gt;&lt;span&gt;                { &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;addr&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;65536&lt;&#x2F;span&gt;&lt;span&gt;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;tangara.bin&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot; },
&lt;&#x2F;span&gt;&lt;span&gt;                { &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;addr&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;11599872&lt;&#x2F;span&gt;&lt;span&gt;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;lua.bin&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot; }
&lt;&#x2F;span&gt;&lt;span&gt;            ]
&lt;&#x2F;span&gt;&lt;span&gt;        }
&lt;&#x2F;span&gt;&lt;span&gt;    }
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Hitting the flash button will take care of it all, and pretty soon you&#x27;ll have a freshly updated Tangara! Happy listening :)&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Creating a Custom Faceplate</title>
        <published>2024-02-21T00:00:00+00:00</published>
        <updated>2024-02-21T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              cool tech zone peeps
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://cooltech.zone/tangara/blog/2024-02-21-faceplates/"/>
        <id>https://cooltech.zone/tangara/blog/2024-02-21-faceplates/</id>
        
        <content type="html" xml:base="https://cooltech.zone/tangara/blog/2024-02-21-faceplates/">&lt;p&gt;&lt;em&gt;This is a mirror of a campaign update originally posted on &lt;a href=&quot;https:&#x2F;&#x2F;www.crowdsupply.com&#x2F;cool-tech-zone&#x2F;tangara&#x2F;updates&#x2F;creating-a-custom-faceplate&quot;&gt;CrowdSupply&lt;&#x2F;a&gt;.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Hello again!&lt;&#x2F;p&gt;
&lt;p&gt;Thanks so much to everyone for continuing to support our campaign! We&#x27;re so excited we&#x27;ll be able to get our little music player into so many people&#x27;s hands and pockets!&lt;&#x2F;p&gt;
&lt;p&gt;So far we&#x27;ve talked a lot about Tangara being &quot;easy to hack on&quot; and we&#x27;ve shown you a few small examples. But what about larger changes to your device? In this update, I&#x27;ll be walking through the process of creating a totally custom faceplate. Specifically, it&#x27;ll be a faceplate that uses a physical rotary encoder, rather than a capacitive touchwheel.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;cooltech.zone&#x2F;tangara&#x2F;blog&#x2F;2024-02-21-faceplates&#x2F;finished.jpg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;This is a great little project that&#x27;s very easy to design and cheap to build. The most difficult part will be soldering the small pitch 15-pin FFC connector.&lt;&#x2F;p&gt;
&lt;p&gt;If you&#x27;re interested in diving deeper, the sources for this design are all available &lt;a href=&quot;https:&#x2F;&#x2F;git.sr.ht&#x2F;~jacqueline&#x2F;tangara-clicky-faceplate&quot;&gt;on Sourcehut&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;constraints&quot;&gt;Constraints&lt;&#x2F;h3&gt;
&lt;p&gt;We want our custom faceplate to be compatible with an unmodified Tangara mainboard, so we don&#x27;t have to build a totally new device. Mostly, that means we need to reuse the same general faceplate form factor (the size, mounting hole locations), as well as the same FFC connector and pinout.&lt;&#x2F;p&gt;
&lt;p&gt;The FFC connector has 15 pins, including:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;3v3 power&lt;&#x2F;li&gt;
&lt;li&gt;Ground&lt;&#x2F;li&gt;
&lt;li&gt;An I²C bus (SCL and SDA)&lt;&#x2F;li&gt;
&lt;li&gt;A half-duplex SPI bus (SCLK, PICO, CS)&lt;&#x2F;li&gt;
&lt;li&gt;Three extra GPIO pins, connected directly to the ESP32&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The display -- which we&#x27;ll leave unchanged -- uses the SPI bus and two GPIOs. This leaves us with one spare GPIO, which we can use either as a CS line for a second SPI device, or as an interrupt line for an I²C device.&lt;&#x2F;p&gt;
&lt;p&gt;This may not sound like a huge array of possibilities, but remember that it&#x27;s very easy to &quot;add&quot; extra GPIO lines by using a cheap microcontroller configured as an I²C device.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;selecting-parts&quot;&gt;Selecting Parts&lt;&#x2F;h3&gt;
&lt;p&gt;For our rotary encoder, we&#x27;ll be using &lt;a href=&quot;https:&#x2F;&#x2F;www.adafruit.com&#x2F;product&#x2F;5001&quot;&gt;a low-profile &quot;scroll wheel&quot; from Adafruit&lt;&#x2F;a&gt;. It clicks in a way that feels nice, the extra buttons it includes are handy to have, and it&#x27;s small enough to not add too much bulk to the device.&lt;&#x2F;p&gt;
&lt;p&gt;To act as an interface between the encoder and the ESP32, we&#x27;ll be using a small microcontroller. I happened to have some &lt;a href=&quot;https:&#x2F;&#x2F;www.microchip.com&#x2F;en-us&#x2F;product&#x2F;attiny816&quot;&gt;Microchip ATTINY816s&lt;&#x2F;a&gt; left over from a previous project and they&#x27;re very easy to implement (although flashing is a slight pain), so I&#x27;ll use one of those.&lt;&#x2F;p&gt;
&lt;p&gt;The rest of the parts used are the same as Tangara&#x27;s production faceplate; some passives, a MOSFET, an FFC connector (all available on Mouser), and a display panel (&lt;a href=&quot;https:&#x2F;&#x2F;www.adafruit.com&#x2F;product&#x2F;618&quot;&gt;Adafruit&lt;&#x2F;a&gt; actually stocks these too!).&lt;&#x2F;p&gt;
&lt;h3 id=&quot;making-a-schematic&quot;&gt;Making a Schematic&lt;&#x2F;h3&gt;
&lt;p&gt;The easiest way to start on the electrical design for our faceplate is to take the &lt;a href=&quot;https:&#x2F;&#x2F;git.sr.ht&#x2F;~jacqueline&#x2F;tangara-hw&#x2F;tree&#x2F;main&#x2F;item&#x2F;tangara-faceplate&quot;&gt;existing faceplate KiCad files&lt;&#x2F;a&gt;, make a copy, then delete the parts we don&#x27;t need. In this case, I deleted the touchwheel controller, the test points, and the haptic motor driver (who needs haptics when you have a real physical dial!).&lt;&#x2F;p&gt;
&lt;p&gt;Adafruit provide a schematic symbol for their touchwheel and the ATTINY816 has a symbol built into KiCad, so adding them into the schematic and wiring them up is a breeze:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;cooltech.zone&#x2F;tangara&#x2F;blog&#x2F;2024-02-21-faceplates&#x2F;schematic.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;You can obviously get much more complicated than this. There&#x27;s enough room between the faceplate and mainboard PCBs (especially in the top half of the PCB) to add even something like a micro-usb port, if your choice of microcontroller supports it.&lt;&#x2F;p&gt;
&lt;p&gt;It may also be a good idea to add a small LED (plus a series resistor) to one of the unused GPIO pins to help with debugging; I left this out of the schematic and PCB because I&#x27;m confident in just soldering a through-hole LED directly to one of the legs of the ATTINY; YMMV!&lt;&#x2F;p&gt;
&lt;h3 id=&quot;routing&quot;&gt;Routing&lt;&#x2F;h3&gt;
&lt;p&gt;Similar to the schematic design, we can start with most of the work done for us by copying the standard Tangara faceplate PCB and then deleting the components, fills, vias, and traces that we don&#x27;t need (KiCad can even do most of this for us automatically).&lt;&#x2F;p&gt;
&lt;p&gt;In this case, this leaves us with just five components to place. Routing traces for each of these components is not too challenging, even for beginners, as it&#x27;s all just slow-speed I²C signals and some GPIO lines.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;cooltech.zone&#x2F;tangara&#x2F;blog&#x2F;2024-02-21-faceplates&#x2F;pcb.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Ordering this PCB is also very cheap; I got five copies from JLCPCB for AUD$6.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;soldering&quot;&gt;Soldering&lt;&#x2F;h3&gt;
&lt;p&gt;Soldering the board is something that comes down very much to your own preferences, skill level, and available tools. For the small MOSFET, passives, and the FFC connector, I usually lay down a small amount of solder paste by hand, place each component, then reflow the board on a hotplate. For the FFC connector especially I&#x27;ve found this to be the most consistent approach for hand assembly.&lt;&#x2F;p&gt;
&lt;p&gt;For assembling this faceplate in particular, I constrained myself to just my soldering iron and ordinary solder. The result looks like a complete mess, but it does work!&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;cooltech.zone&#x2F;tangara&#x2F;blog&#x2F;2024-02-21-faceplates&#x2F;ffc.jpg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The display may seem intimidating, but there&#x27;s a trick to soldering it easily: first ensure your iron is well cleaned and tinned. Then, lay down some flux over the pads. Next, line up the display&#x27;s connector and solder one pad. Double check the alignment, then solder the pad on the opposite end. Lastly, go back across every pad until everything looks properly soldered.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;cooltech.zone&#x2F;tangara&#x2F;blog&#x2F;2024-02-21-faceplates&#x2F;display.jpg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;programming&quot;&gt;Programming&lt;&#x2F;h3&gt;
&lt;p&gt;The ATTINY816 I used has Arduino support, which makes putting together a working firmware very, very quick. First, I used a simple firmware that blinks an LED off and on in order to verify that my flashing setup worked.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;cooltech.zone&#x2F;tangara&#x2F;blog&#x2F;2024-02-21-faceplates&#x2F;led.jpg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Then I altered the firmware to blink the LED differently depending on how the rotary encoder is used.&lt;&#x2F;p&gt;
&lt;p&gt;After this, I added I²C support. Most I²C devices use a model where you first write a byte indicating which &quot;register&quot; you&#x27;d like to read, then begin a read to get the value of that register. Implementing this model with Arduino is quite straightforward:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;c++&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-c++ &quot;&gt;&lt;code class=&quot;language-c++&quot; data-lang=&quot;c++&quot;&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;static volatile &lt;&#x2F;span&gt;&lt;span&gt;uint8_t sRegister = &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;void &lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fa1b3;&quot;&gt;i2cReceive&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;int &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;numBytes&lt;&#x2F;span&gt;&lt;span&gt;) {
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;while &lt;&#x2F;span&gt;&lt;span&gt;(Wire.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;available&lt;&#x2F;span&gt;&lt;span&gt;()) {
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;sRegister &lt;&#x2F;span&gt;&lt;span&gt;= Wire.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;read&lt;&#x2F;span&gt;&lt;span&gt;();
&lt;&#x2F;span&gt;&lt;span&gt;  }
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;void &lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fa1b3;&quot;&gt;i2cRequest&lt;&#x2F;span&gt;&lt;span&gt;() {
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;sRegister &lt;&#x2F;span&gt;&lt;span&gt;== &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;) {
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;&#x2F;&#x2F; Encoder register. Returns the number of ticks since the last read.
&lt;&#x2F;span&gt;&lt;span&gt;    Wire.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;write&lt;&#x2F;span&gt;&lt;span&gt;(static_cast&amp;lt;uint8_t&amp;gt;(encoder.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;getPosition&lt;&#x2F;span&gt;&lt;span&gt;() + &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;127&lt;&#x2F;span&gt;&lt;span&gt;));
&lt;&#x2F;span&gt;&lt;span&gt;    encoder.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;setPosition&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;);
&lt;&#x2F;span&gt;&lt;span&gt;  } &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;else if &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;sRegister &lt;&#x2F;span&gt;&lt;span&gt;== &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;) {
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;&#x2F;&#x2F; Button register. Returns the state of each button.
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;&#x2F;&#x2F; FIXME: Ideally we would set one bit per button. For this example, we
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;&#x2F;&#x2F; only make use of the centre button.
&lt;&#x2F;span&gt;&lt;span&gt;    Wire.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;write&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;digitalRead&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;kButtonCentre&lt;&#x2F;span&gt;&lt;span&gt;));
&lt;&#x2F;span&gt;&lt;span&gt;  }
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;void &lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fa1b3;&quot;&gt;setup&lt;&#x2F;span&gt;&lt;span&gt;() {
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;&#x2F;&#x2F; [...]
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;  Wire.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;pins&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;kI2cSda&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;kI2cScl&lt;&#x2F;span&gt;&lt;span&gt;);
&lt;&#x2F;span&gt;&lt;span&gt;  Wire.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;onReceive&lt;&#x2F;span&gt;&lt;span&gt;(i2cReceive);
&lt;&#x2F;span&gt;&lt;span&gt;  Wire.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;onRequest&lt;&#x2F;span&gt;&lt;span&gt;(i2cRequest);
&lt;&#x2F;span&gt;&lt;span&gt;  Wire.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;begin&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;0x1C&lt;&#x2F;span&gt;&lt;span&gt;);
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;(The above code snippet is actually almost the &lt;a href=&quot;https:&#x2F;&#x2F;git.sr.ht&#x2F;~jacqueline&#x2F;tangara-clicky-faceplate&#x2F;tree&#x2F;main&#x2F;item&#x2F;firmware&#x2F;src&#x2F;main.cpp&quot;&gt;entire file&lt;&#x2F;a&gt;.)&lt;&#x2F;p&gt;
&lt;h3 id=&quot;esp32-changes&quot;&gt;ESP32 Changes&lt;&#x2F;h3&gt;
&lt;p&gt;Finally, we need to modify Tangara&#x27;s input driver to support using this clickwheel instead of the usual touchwheel. This largely involves &lt;a href=&quot;https:&#x2F;&#x2F;git.sr.ht&#x2F;~jacqueline&#x2F;tangara-clicky-faceplate&#x2F;tree&#x2F;main&#x2F;item&#x2F;firmware&#x2F;esp-firmware-changes.patch&quot;&gt;deleting code&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;result&quot;&gt;Result&lt;&#x2F;h3&gt;
&lt;p&gt;I asked Robin to throw together a modified case design for me and she came up with something that feels like it should be much more beige:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;cooltech.zone&#x2F;tangara&#x2F;blog&#x2F;2024-02-21-faceplates&#x2F;scrolling.webp&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;As you can see, it works pretty well! But looks kind of weirdly undersized!&lt;&#x2F;p&gt;
&lt;p&gt;I hope you can see that from this simple approach of using a low-power microcontroller to monitor an encoder, many different faceplates are possible. You could use the same approach to implement different kinds of touch interface, physical keypads, or even a physical d-pad and buttons to give the device more of a handheld console aesthetic.&lt;&#x2F;p&gt;
&lt;p&gt;Long-term, we&#x27;d love to produce more faceplate designs (in particular, I really want to make one that&#x27;s just the FFC connector + display, a microcontroller, and then a protoboard-like array of through-hole pads).&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Measuring (Tangara&#x27;s) Audio Quality</title>
        <published>2024-02-14T00:00:00+00:00</published>
        <updated>2024-02-14T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              cool tech zone peeps
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://cooltech.zone/tangara/blog/2024-02-14-audio-quality/"/>
        <id>https://cooltech.zone/tangara/blog/2024-02-14-audio-quality/</id>
        
        <content type="html" xml:base="https://cooltech.zone/tangara/blog/2024-02-14-audio-quality/">&lt;p&gt;&lt;em&gt;This is a mirror of a campaign update originally posted on &lt;a href=&quot;https:&#x2F;&#x2F;www.crowdsupply.com&#x2F;cool-tech-zone&#x2F;tangara&#x2F;updates&#x2F;measuring-tangaras-audio-quality&quot;&gt;CrowdSupply&lt;&#x2F;a&gt;.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Hi there!&lt;&#x2F;p&gt;
&lt;p&gt;In this week&#x27;s update, I&#x27;ll be talking about the thing you have to talk about if you&#x27;ve made an audio device: the design and quality of Tangara&#x27;s audio output.&lt;&#x2F;p&gt;
&lt;p&gt;I don&#x27;t like just throwing out a bunch of very technical measurements and hoping people trust they&#x27;re good, so I will also give a very brief introduction to audio quality measurement in general. I&#x27;ll then go through a neat little hack you can do to Tangara&#x27;s audio chain to improve compatibility with cheap, sensitive IEMs.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;tangara-s-audio-design&quot;&gt;Tangara&#x27;s Audio Design&lt;&#x2F;h3&gt;
&lt;p&gt;Tangara&#x27;s audio chain is designed to perform well with both average and high-end headphones, whilst also being easy to understand and modify.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;cooltech.zone&#x2F;tangara&#x2F;blog&#x2F;2024-02-14-audio-quality&#x2F;simplified.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;We start with our digital-to-analogue converter (DAC), the WM8523 (and its recommended output filter). The DAC takes the raw digital audio samples and converts them into an audio signal. The WM8523 in particular is a fairly cheap device -- its specifications may be unexciting to folks craving the absolute best performance numbers -- but in my opinion this DAC&#x27;s performance is good enough that any deficiencies with it are inaudible to human ears.&lt;&#x2F;p&gt;
&lt;p&gt;Where we&#x27;ve chosen to spend money on high quality components is with Tangara&#x27;s amplifier: the INA1620 (for nerds, it&#x27;s an OPA1622 with integrated resistors). I selected this amplifier due to its fantastic features when used as an output stage:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;It provides a very well-matched +6 db of gain on each channel, for better compatibility with high-end headphones.&lt;&#x2F;li&gt;
&lt;li&gt;Its 140 mA maximum output current is more than enough for the kind of headphones you would want to use with a portable device.&lt;&#x2F;li&gt;
&lt;li&gt;Its output is very consistent across a wide variety of loads; many cheaper amplifiers have issues with distortion as you approach their power limits.&lt;&#x2F;li&gt;
&lt;li&gt;Power-on pop and click elimination and shorted output protection built-in make implementation very simple. Other amplifiers might be cheaper, but then end up needing a larger amount of supporting components.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;By using such a sophisticated amplifier, we&#x27;ve made it very easy to hack on the audio chain of Tangara without compromising the quality of your output. Whether you&#x27;re replacing the DAC, dampening the signal for a lower noise floor, or adding an alternate source such as an FM receiver, the INA1620 makes for a great, stable front-end between Tangara&#x27;s audio source and your headphones.&lt;&#x2F;p&gt;
&lt;p&gt;Now that we&#x27;ve examined what Tangara&#x27;s audio chain &lt;em&gt;is&lt;&#x2F;em&gt;, we can talk about how it performs. AES17 is the Audio Engineering Society&#x27;s standard for characterising audio devices, and the metrics that tend to be of most interest are &quot;total harmonic distortion and noise&quot; and the &quot;signal to noise ratio&quot;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;total-harmonic-distortion-and-noise-thd-n&quot;&gt;Total Harmonic Distortion and Noise (THD+N)&lt;&#x2F;h3&gt;
&lt;p&gt;THD+N is, very broadly speaking, a measurement where you play a test tone at a specified frequency, then filter that tone out of the recording. The resulting signal is a combination of any distorted elements of the test tone, plus any background noise. The difference between the level (&quot;volume&quot;) of this resulting signal, with the level of the original test tone, represents how much of a device&#x27;s audio output differs from a &quot;perfect&quot; reproduction.&lt;&#x2F;p&gt;
&lt;p&gt;THD+N is often presented as a single number, either as a percentage or a decibel (dB) value. This presentation is quite difficult to reason about, for a number of reasons:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;A device&#x27;s THD+N typically varies depending on the output level. For example, our &lt;a href=&quot;https:&#x2F;&#x2F;statics.cirrus.com&#x2F;pubs&#x2F;proDatasheet&#x2F;WM8523_v4.3.pdf&quot;&gt;WM8523 DAC&#x27;s datasheet&lt;&#x2F;a&gt; shows that its THD+N at its maximum volume is slightly higher than its THD+N at 1 dB below its maximum volume.&lt;&#x2F;li&gt;
&lt;li&gt;The exact test setup can have a very large impact on THD+N measurements. For example, it is possible to perform the same test with an unloaded output, a 32 ohm load, or a 10k ohm load, and end up with very different numbers (and not all manufacturers disclose their exact test setups).&lt;&#x2F;li&gt;
&lt;li&gt;Whether or not a particular THD+N statistic is actually audible is incredibly difficult to determine; it depends on the exact nature of any distortion, as well as whether the distortion or noise component is dominating the calculation. At high volumes, the distortion will tend to dominate. At low volumes, the noise will tend to dominate.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;I measured Tangara&#x27;s THD+N using a Cosmos E1DA ADC, with a load of 600 ohms and a variety of different volume levels:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;THD+N&lt;&#x2F;th&gt;&lt;th&gt;dBFS&lt;&#x2F;th&gt;&lt;th&gt;Volume %*&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;0.015%&lt;&#x2F;td&gt;&lt;td&gt;0dB&lt;&#x2F;td&gt;&lt;td&gt;87%&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;0.014%&lt;&#x2F;td&gt;&lt;td&gt;-1dB&lt;&#x2F;td&gt;&lt;td&gt;86%&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;0.014%&lt;&#x2F;td&gt;&lt;td&gt;-10dB&lt;&#x2F;td&gt;&lt;td&gt;78%&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;0.022%&lt;&#x2F;td&gt;&lt;td&gt;-20dB&lt;&#x2F;td&gt;&lt;td&gt;68%&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;0.066%&lt;&#x2F;td&gt;&lt;td&gt;-30dB&lt;&#x2F;td&gt;&lt;td&gt;58%&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;0.150%&lt;&#x2F;td&gt;&lt;td&gt;-40dB&lt;&#x2F;td&gt;&lt;td&gt;47%&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;0.480%&lt;&#x2F;td&gt;&lt;td&gt;-50dB&lt;&#x2F;td&gt;&lt;td&gt;37%&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;0.185%&lt;&#x2F;td&gt;&lt;td&gt;-60dB&lt;&#x2F;td&gt;&lt;td&gt;27%&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;(*The highest 13% of Tangara&#x27;s volume meter is used for digital gain.)&lt;&#x2F;p&gt;
&lt;p&gt;From this we can see that, as long as your headphones reach a comfortable volume above 47% of Tangara&#x27;s maximum volume (equiv. to 60% &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Line_level&quot;&gt;consumer line level&lt;&#x2F;a&gt;), there should not be any perceptible noise or distortion. But, what about more sensitive headphones that are only comfortable to use below this level? To address these, first we need to talk about signal-to-noise ratios.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;signal-to-noise-ratio-snr&quot;&gt;Signal-to-Noise Ratio (SNR)&lt;&#x2F;h3&gt;
&lt;p&gt;SNR is a measure of the difference between the loudest sound a device can produce, and the loudest noise present when not playing anything (or more specifically per AES17, the noise present when playing a -60 dBFS test tone). This is an important metric for understanding audio devices, as it gives an indication of how much listenable volume a device has before you will begin to hear the background noise inherent in every device (the &quot;noise floor&quot;).&lt;&#x2F;p&gt;
&lt;p&gt;Your ears have an effective dynamic range of about 70-80dB before you begin to damage your hearing. Tangara has an SNR of 106 dB. But how do you compare these numbers? Does Tangara&#x27;s wider range mean you won&#x27;t hear any background noise? It&#x27;s difficult to answer this without knowing the characteristics of your headphones; particularly the SPL (sound pressure level; usually measured in decibels per watt, or sometimes decibels per volt) and impedance (usually measured in ohms).&lt;&#x2F;p&gt;
&lt;p&gt;A full explanation of these characteristics is beyond the scope of this post, but at a very high level you can put most headphones into one of three categories:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&quot;Easy to drive&quot; headphones that are neither particularly sensitive, nor particularly high fidelity. Most non-audiophile headphones are in this category.&lt;&#x2F;li&gt;
&lt;li&gt;&quot;Easy to drive&quot; headphones that are highly sensitive, but also high fidelity. Most IEMs (especially the cheaper ones) are in this category.&lt;&#x2F;li&gt;
&lt;li&gt;&quot;Difficult to drive&quot; headphones that are less sensitive, but high fidelity. This category includes the bulk of what you might call &quot;high-end&quot; gear; everything from fancy studio headphones to expensive planar IEMs.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;The second and third categories are the most problematic, as they have contradictory requirements.&lt;&#x2F;p&gt;
&lt;p&gt;Highly sensitive headphones need only a tiny amount of power to produce sound, which makes them susceptible to high noise floors. To support these devices, it&#x27;s best to use your available SNR at the low end (by applying damping, then running your DAC at a higher volume), in order to keep the noise floor below an audible volume.&lt;&#x2F;p&gt;
&lt;p&gt;&quot;Difficult to drive&quot; headphones, on the other hand, will rarely pick up a device&#x27;s noise floor. They may, however, struggle to produce sound at a loud enough volume to be well audible. To best support these devices, it&#x27;s best to use your available SNR at the top end by applying gain, so that you have enough headroom to increase volume before you run out of power.&lt;&#x2F;p&gt;
&lt;p&gt;Ultimately, when designing a device like Tangara, you have three options for what to do with your dynamic range:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Use it for top-end, giving people with high-end headphones the best experience.&lt;&#x2F;li&gt;
&lt;li&gt;Use it to lower your noise floor, giving people with more sensitive headphones the best experience.&lt;&#x2F;li&gt;
&lt;li&gt;Use a substantially better DAC, increasing the cost of the device.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;For Tangara, we chose option one. First, because we didn&#x27;t want to further increase the cost of the device with an expensive DAC that most users won&#x27;t get value out of. Second, because lowering the noise floor post-hoc is a much easier modification to make than adding more amplification.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;a-hack-for-budget-iems&quot;&gt;A Hack for Budget IEMs&lt;&#x2F;h3&gt;
&lt;p&gt;There is a whole market these days of cheap, high-fidelity &#x27;in-ear monitors&#x27; (IEMs; they&#x27;re fancy earbuds). You can typically find them for $20-$40, and they sound great.&lt;&#x2F;p&gt;
&lt;p&gt;The main downside of this style of headphone is that they typically are overly sensitive; often able to pick up and make audible the noise floor of even very good DAC implementations. You will hear this as a very quiet &#x27;hiss&#x27; or white noise during quiet pieces of music.&lt;&#x2F;p&gt;
&lt;p&gt;It is difficult to provide a good experience for this kind of device without either spending more money on a more advanced DAC chip, or adding complicated circuity to modify your amplifier&#x27;s gain (both upgrades that are wasted when paired with higher-end headphones).&lt;&#x2F;p&gt;
&lt;p&gt;Tangara&#x27;s noise floor &lt;em&gt;is&lt;&#x2F;em&gt; audible through such devices; although it&#x27;s quiet enough that most of the team could only hear it when I coached them into what to listen for and then played back pure tones through various other devices. It&#x27;s therefore probably good enough for you.&lt;&#x2F;p&gt;
&lt;p&gt;If you&#x27;re a real audio head, and this &lt;em&gt;isn&#x27;t&lt;&#x2F;em&gt; good enough for you, then soldering two small resistors is an easy mod that will shift the whole signal down. You can then listen at a higher volume, without an audible noise floor.&lt;&#x2F;p&gt;
&lt;p&gt;Referring back to the schematic for Tangara&#x27;s audio chain, pay attention to the region between the DAC&#x27;s output filter and the amplifier&#x27;s input.&lt;&#x2F;p&gt;
&lt;p&gt;This is a tremendously good location for implementing all kinds of modifications. In this example, we&#x27;re going to add some small resistors from the signal path to ground. This will attenuate the entire signal -- including the noise floor. We can then set the volume level higher to compensate for this, resulting in audio output that is still loud enough to listen to, but with greatly reduced background noise.&lt;&#x2F;p&gt;
&lt;p&gt;This is the same principle as devices like the &lt;a href=&quot;https:&#x2F;&#x2F;ifi-audio.com&#x2F;products&#x2F;iematch&#x2F;&quot;&gt;iFi iEMatch&lt;&#x2F;a&gt;. However, because Tangara is an open source device constructed with hand-solderable parts, it&#x27;s very practical to implement this solution completely internally. This avoids a bulky extra dongle, and also eliminates any chance of affecting the frequency response of the output.&lt;&#x2F;p&gt;
&lt;p&gt;In our case, we&#x27;re going to solder one 0603 resistor per channel, on top of C15 and C6.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;cooltech.zone&#x2F;tangara&#x2F;blog&#x2F;2024-02-14-audio-quality&#x2F;schematic-pcb.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;This creates a voltage divider together with the DAC&#x27;s output filter resistor and the input impedance of the amplifier (which I&#x27;ve simplified into one resistance value. Don&#x27;t worry about it!)&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;cooltech.zone&#x2F;tangara&#x2F;blog&#x2F;2024-02-14-audio-quality&#x2F;divider.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;We can then make an equation to find the damping amount provided by various resistor values:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;20log10(x &#x2F; (525 + x))&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Resistor&lt;&#x2F;th&gt;&lt;th&gt;Damping (approx)&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;650&lt;&#x2F;td&gt;&lt;td&gt;-5dB&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;250&lt;&#x2F;td&gt;&lt;td&gt;-10dB&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;100&lt;&#x2F;td&gt;&lt;td&gt;-16dB&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;60&lt;&#x2F;td&gt;&lt;td&gt;-20dB&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;16&lt;&#x2F;td&gt;&lt;td&gt;-30dB&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;In my case, I wanted to use a pair of Salnotes Zeroes. These felt comfortable at around 30-40% volume, so I used a 100 ohm resistor to bring the noise floor down by 16 dB.&lt;&#x2F;p&gt;
&lt;p&gt;Soldering this together is fairly easy as SMD work goes, since we can place the new resistors directly on top of the capacitors:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;cooltech.zone&#x2F;tangara&#x2F;blog&#x2F;2024-02-14-audio-quality&#x2F;soldering.jpg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Redoing my THD+N measurements with the mod in place, I got the same results as earlier, except that now my device&#x27;s &quot;0dB&quot; point is a bit quieter than it was earlier. Finally, testing with my IEMs, there is now dead silence (to my ears, anyway) during very quiet playback.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h3&gt;
&lt;p&gt;I hope this update has been informative about not only Tangara&#x27;s audio quality, but also discussions of audio quality in general. There is no perfect solution to high quality audio, but I think we&#x27;ve designed a device that strikes a good balance between quality, cost, and upgradeability.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>A Deep Dive Into the Design of Tangara&#x27;s Touchwheel</title>
        <published>2024-02-07T00:00:00+00:00</published>
        <updated>2024-02-07T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              cool tech zone peeps
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://cooltech.zone/tangara/blog/2024-02-07-touchwheel/"/>
        <id>https://cooltech.zone/tangara/blog/2024-02-07-touchwheel/</id>
        
        <content type="html" xml:base="https://cooltech.zone/tangara/blog/2024-02-07-touchwheel/">&lt;p&gt;&lt;em&gt;This is a mirror of a campaign update originally posted on &lt;a href=&quot;https:&#x2F;&#x2F;www.crowdsupply.com&#x2F;cool-tech-zone&#x2F;tangara&#x2F;updates&#x2F;a-deep-dive-into-the-design-of-our-touchwheel&quot;&gt;CrowdSupply&lt;&#x2F;a&gt;.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;First off, thank you so much everyone for your amazing initial response! We hit our funding goal within half an hour of campaign launch!&lt;&#x2F;p&gt;
&lt;p&gt;Over the next few weeks, we&#x27;ll be releasing a series of updates showcasing particular aspects of Tangara&#x27;s design. The first of these is written by Daniel (@ailurux), and will cover a feature many of you have been curious about: the touchwheel&lt;&#x2F;p&gt;
&lt;p&gt;In this update, we&#x27;ll go through the history of why we chose a capacitive touchwheel for Tangara, how the current design works, and what it can do, as well as some resources and tips for incorporating this kind of touchwheel into your own projects.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;to-begin-a-bit-of-background&quot;&gt;To Begin, a Bit of Background...&lt;&#x2F;h3&gt;
&lt;p&gt;Tangara&#x27;s input hardware has changed a lot over the last year of development. Whilst Tangara&#x27;s current design may be nostalgic for fans of the original iPod, our original concepts were actually much more inspired by cassette tapes. I&#x27;ve long had an affinity for cassette tapes, and there is some overlap between my love of tapes and my excitement about making a physical, distraction-free music player that can&#x27;t suddenly decide you don&#x27;t have the right to listen to your music.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;cooltech.zone&#x2F;tangara&#x2F;blog&#x2F;2024-02-07-touchwheel&#x2F;cassette.png&quot; alt=&quot;A concept sketch of a cassette tape like music player, with a circular screen and 3d printed reel&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The notion of using a circular screen was short-lived. Whilst it&#x27;s absolutely possible, and circular TFT screens are available and fairly cheap, it just wasn&#x27;t functional to reduce the screen real-estate by about a fifth just for the aesthetics. But already, a wheel was feeling like a compelling input method.&lt;&#x2F;p&gt;
&lt;p&gt;We made a few prototypes that used a rotary encoder with a 3D printed wheel or knob, but we realised this method was going to add a lot of complexity and bulk to the case, especially if we wanted a push-button as well.&lt;&#x2F;p&gt;
&lt;p&gt;Our next idea was to use an angular sensor, as they have a lower profile and can detect position as well as rotation. However, these components don&#x27;t come with push buttons, often don&#x27;t have a full 360 degree operating angle, and still required a separate part – one with even tighter tolerances.&lt;&#x2F;p&gt;
&lt;p&gt;With neither of those two initial ideas working, we went back to the drawing board and came up with a bunch of different ideas. We had a pretty good idea of what our requirements for the input were at this point: we wanted something low-profile, affordable, with some kind of haptic or tactile feedback, and with enough flexibility to support multiple methods of use.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;cooltech.zone&#x2F;tangara&#x2F;blog&#x2F;2024-02-07-touchwheel&#x2F;concepts.png&quot; alt=&quot;5 different concept sketches of various input hardware ideas. A cassette-inspired reel, directional buttons around a middle button, a circular trackpad, an analog joystick, and a rotary encoder&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The most promising idea was to use a circular trackpad module, like the Azoteq ProxSense or Cirque Glidepoint trackpads. These are very low profile, high resolution trackpads that come in a variety of sizes and seemed ideal. We ordered a few of these modules and built some prototypes to test. Unfortunately, we discovered the Azoteq ProxSense range requires an additional, rather-costly flashing tool (and Windows-only software) to unlock its full functionality, with only basic gesture controls available by default. Our prototypes with the Cirque Glidepoint trackpad worked better, but we were worried about the cost and availability of these modules for smaller manufacturing runs.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;cooltech.zone&#x2F;tangara&#x2F;blog&#x2F;2024-02-07-touchwheel&#x2F;trackpad-modules.png&quot; alt=&quot;A photo of two trackpad modules. On the left: An Azoteq Proxsense trackpad module stuck to a scrap piece of FR4, wired up to a microcontroller On the right: A Cirque Glidepoint trackpad module with some jumper leads soldered to it&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;We then considered designing and manufacturing our own custom trackpad module for Tangara. Whilst researching this, we found a &lt;a href=&quot;https:&#x2F;&#x2F;ww1.microchip.com&#x2F;downloads&#x2F;aemDocuments&#x2F;documents&#x2F;TXFG&#x2F;ApplicationNotes&#x2F;ApplicationNotes&#x2F;Capacitive-Touch-Sensor-Design-Guide-DS00002934-B.pdf&quot;&gt;design guide&lt;&#x2F;a&gt; on capacitive touch sensors that described a wheel sensor design for capacitive touch electrodes. This design would  allow us to build a capacitive touchwheel directly onto Tangara&#x27;s faceplate. Not only would we be able to do this with just one affordable IC and three fancy-shaped electrodes, but it would also be extremely low profile, give us the flexibility to customise the size and shape, and even leave us room for a middle button and haptic motor. We were really excited by this and so we set to the task of making a prototype.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;how-not-to-re-invent-the-wheel&quot;&gt;How (Not) to Re-Invent the Wheel&lt;&#x2F;h3&gt;
&lt;p&gt;The aforementioned design guide is a really great resource on how this kind of capacitive touch wheel works, and I&#x27;d highly recommend starting there. The guide lists a few different arrangements of electrodes for different capacitive buttons, sliders and wheels.&lt;&#x2F;p&gt;
&lt;p&gt;One way to make a capacitive touch wheel is to place many electrodes in order in a circular arrangement and when one of these electrodes detects a touch, based on the known order of electrodes the approximate position of the finger on the wheel can be determined. This is actually how the iPod&#x27;s click-wheel works.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;cooltech.zone&#x2F;tangara&#x2F;blog&#x2F;2024-02-07-touchwheel&#x2F;diagram-spoke.png&quot; alt=&quot;A diagram showing 6 electrodes arranged in a circle. To the left is a chart labeled &amp;quot;finger position&amp;quot; on the x axis and &amp;quot;signal&amp;quot; on the y axis. The chart shows 6 distinct shapes, representing each electrodes signal as the finger moves around the wheel&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Another way is to use just three electrodes with an interpolated shape, so that as the finger moves around the sensor, the signal moves smoothly between electrodes and we can use this to determine roughly where the finger is on the wheel.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;cooltech.zone&#x2F;tangara&#x2F;blog&#x2F;2024-02-07-touchwheel&#x2F;diagram-interleaved.png&quot; alt=&quot;A similar diagram as the last showing 3 electrodes arranged in a radial zig-zag shape. The chart shows 3 overlapping curves representing the transitions between signals as a finger moves around the wheel&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;We were pretty excited to try out the interpolated wheel design, the only thing left was to figure out how to create that tessellating, radial zig-zag shape. I watched Jacqueline try to trace the image from the design guide in KiCad, manually clicking each point along the path for 15 minutes or so, when a misclick caused the path to be lost and she paused for a moment, sighed, and then started over again. I felt a need to jump in at this point and said I&#x27;d create the path as an SVG and send it to her.&lt;&#x2F;p&gt;
&lt;p&gt;I knew I wanted to programmatically create this shape, with the ability to tweak the parameters so that we could quickly iterate on the design if needed. I&#x27;ve previously used JavaScript to generate SVG files, so I reached for that here.&lt;&#x2F;p&gt;
&lt;p&gt;I found this &lt;a href=&quot;https:&#x2F;&#x2F;bryanduxbury.com&#x2F;2013&#x2F;12&#x2F;05&#x2F;designing-a-capacitive-touch-wheel-in-openscad-and-eagle&#x2F;&quot;&gt;decade old blog post&lt;&#x2F;a&gt; which was really helpful. It details how the author solved this problem with OpenSCAD by using chain-hulls in place of arbitrarily defined paths. As SVG does allow for arbitrarily defined paths, I could use the author&#x27;s first idea of generating a triangular path around an arc.&lt;&#x2F;p&gt;
&lt;p&gt;The basic process is to generate the shape using polar coordinates, which, instead of defining a position from the origin in terms of X and Y, defines a point by its distance and angle from the origin. This allows us to move outward from the center in an arc, and we can switch the direction by changing the angle or draw a straight line outwards by changing just the distance.&lt;&#x2F;p&gt;
&lt;iframe src=&quot;&#x2F;tangara&#x2F;labs&#x2F;touchwheel-electrode-tool&#x2F;&quot; style=&quot;width: 100%; min-height: 400px; margin: 2rem auto;&quot;&gt;&lt;&#x2F;iframe&gt;
&lt;p&gt;You can &lt;a href=&quot;https:&#x2F;&#x2F;cooltech.zone&#x2F;tangara&#x2F;labs&#x2F;touchwheel-electrode-tool&#x2F;&quot;&gt;access our SVG tool here&lt;&#x2F;a&gt;, along with the code that powers it, all of which is visible in the page source. The SVG path does usually need some manual processing before it can be used in a PCB, but this should hopefully be a good starting point for anyone looking to incorporate this kind of touch sensor into their own projects. I think it would be really cool to see more projects using it!&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;cooltech.zone&#x2F;tangara&#x2F;blog&#x2F;2024-02-07-touchwheel&#x2F;pcb-touchwheel.png&quot; alt=&quot;A photo of the trackpad design on Tangara&amp;#39;s faceplate&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;We were super-impressed with the performance of the final result. With just three electrodes and a cool form-meets-function design, we&#x27;re able to offer a touch input that feels really responsive and nice to use. This design can also support other input methods, such as a directional pad mode, or even just using the wheel as a large button. We&#x27;ve even experimented with using the angular detection to control the pitch of a basic square wave synthesizer, which produced fun results.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;final-thoughts&quot;&gt;Final Thoughts&lt;&#x2F;h3&gt;
&lt;p&gt;Overall, we&#x27;re really happy about what we&#x27;ve come up with for Tangara&#x27;s input. It&#x27;s space-efficient, versatile, and effective. We think the touchwheel is a great fit for this kind of device, but because we&#x27;ve implemented it on a separate PCB, it&#x27;s also easy to replace with other input hardware. In a later update, Jacqueline will be showing off a custom faceplate featuring a rotary encoder and buttons.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>All Aboard!</title>
        <published>2024-02-01T00:00:00+00:00</published>
        <updated>2024-02-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              cool tech zone peeps
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://cooltech.zone/tangara/blog/2024-02-01-all-aboard/"/>
        <id>https://cooltech.zone/tangara/blog/2024-02-01-all-aboard/</id>
        
        <content type="html" xml:base="https://cooltech.zone/tangara/blog/2024-02-01-all-aboard/">&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=mxyWlJrm02M&quot;&gt;And we&#x27;re away!&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Tangara is a cool, hackable, ESP32-powered music player that provides high-quality audio, long battery life, and a design that&#x27;s easy to customize, repair, and upgrade.&lt;&#x2F;p&gt;
&lt;p&gt;If you read our pre-launch page, you may be delighted to learn that Tangara has gotten even better since then! Standby battery life is now much longer, and we&#x27;ve rewritten our entire user interface in Lua, for easier customization.&lt;&#x2F;p&gt;
&lt;p&gt;We&#x27;d love for you to give &lt;a href=&quot;https:&#x2F;&#x2F;www.crowdsupply.com&#x2F;cool-tech-zone&#x2F;tangara&quot;&gt;our campaign page&lt;&#x2F;a&gt; a look, and consider backing Tangara!&lt;&#x2F;p&gt;
&lt;p&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;&#x2F;p&gt;
&lt;p&gt;ps: here&#x27;s a picture of jacqueline&#x27;s cat&lt;&#x2F;p&gt;
&lt;p&gt;
  &lt;img
    src=&quot;https:&amp;#x2F;&amp;#x2F;cooltech.zone&amp;#x2F;processed_images&amp;#x2F;chungus.990a98e95e598e0b.jpg&quot;
    alt=&quot;Chungus, the beautiful orange tabby boy, resting on a chaise lounge underneath his window perch.&quot;
    
  &#x2F;&gt;
&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
