<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Product Development Archives | DMC, Inc.</title>
	<atom:link href="https://static.dmcinfo.com/blog/category/embedded-development-programming/product-development/feed/index.xml" rel="self" type="application/rss+xml" />
	<link></link>
	<description></description>
	<lastBuildDate>Thu, 03 Sep 2026 18:23:34 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.2</generator>

<image>
	<url>https://static.dmcinfo.com/wp-content/uploads/2025/04/site-icon-150x150.png</url>
	<title>Product Development Archives | DMC, Inc.</title>
	<link></link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Adapting Manufacturing Operations? Flexible PCB and PCBA Testing Is Key to Success </title>
		<link>https://static.dmcinfo.com/blog/44756/pcb-test-systems/</link>
		
		<dc:creator><![CDATA[Brent Hoerman]]></dc:creator>
		<pubDate>Tue, 09 Jun 2026 18:18:17 +0000</pubDate>
				<category><![CDATA[Embedded Development & Programming]]></category>
		<category><![CDATA[Product Development]]></category>
		<category><![CDATA[Test and Measurement Automation]]></category>
		<category><![CDATA[Manufacturing Test Solutions]]></category>
		<category><![CDATA[PCB Testing]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/?p=44756</guid>

					<description><![CDATA[<p>As manufacturing strategies evolve and production lines reshore to the United States, one challenge continues to come up for many companies: How do we make sure we can get reliable circuit board testing in a manufacturing setting? Testing does not have to be an afterthought or a necessary evil. When designed correctly, it becomes a [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/44756/pcb-test-systems/">Adapting Manufacturing Operations? Flexible PCB and PCBA Testing Is Key to Success </a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">As manufacturing strategies evolve and production lines reshore to the United States, one challenge continues to come up for many companies: How do we make sure we can get reliable circuit board testing in a manufacturing setting? Testing does not have to be an afterthought or a necessary evil. When designed correctly, it becomes a critical part of the quality strategy, supporting higher efficiency, improved yields, and cost savings across the production lifecycle.</p>



<p class="wp-block-paragraph">At DMC, we see these challenges firsthand through our work with a wide range of manufacturers in different industries. Our team designs custom test solutions that meet demanding performance requirements while remaining practical, cost-effective, and scalable. By focusing on adaptability and reliability, we help operators build test systems that support the needs of today while looking forward to tomorrow.</p>



<h2 class="wp-block-heading" id="h-why-testing-matters-more-than-ever"><strong>Why Testing Matters More Than Ever</strong></h2>



<p class="wp-block-paragraph">A well-designed PCB and PCBA test strategy does more than test products at the end of the line. It supports quality, throughput, and futureproofs manufacturing operations as they continue to scale and evolve:</p>



<ul class="wp-block-list">
<li><strong>Quality Assurance:</strong> Catch defects early to avoid costly downstream failures.</li>



<li><strong>Throughput Optimization:</strong> Keep your line moving without sacrificing accuracy.</li>



<li><strong>Compliance &amp; Traceability:</strong> Meet industry standards and maintain audit-ready records.</li>



<li><strong>Lifecycle Adaptability:</strong> Design systems that adapt as your product mix evolves.</li>
</ul>



<p class="wp-block-paragraph">There are many reasons today for manufacturers to take a flexible approach when building a test system. Flexibility allows manufacturers to balance precision with speed, validating each unit without bottlenecking production. Automated test solutions also enable constant measurement, surfacing issues before they impact final assembly or the field. This approach not only improves first-pass yield, it also shortens feedback loops.</p>



<p class="wp-block-paragraph" id="h-why-testing-matters-now-more-than-ever">It’s equally important that modern test platforms are built for change. As products evolve and regulations shift, operators need test systems that can scale easily, integrate new test points, and support expanded data collection without a full redesign every time. Flexible, software-driven architectures make it easier to maintain compliance and protect your testing investment.</p>



<h2 class="wp-block-heading" id="h-dmc-s-approach-expertise-flexibility">DMC&#8217;s Approach: Expertise + Flexibility</h2>



<p class="wp-block-paragraph">What sets DMC apart? Deep in-house expertise, industry certifications, and best practices, combined with strategic partnerships. We’ve built relationships with leading fixture manufacturers, instrumentation vendors, and automation specialists. This allows us to deliver end-to-end solutions tailored to your requirements, or any specific pieces of the system you need:</p>



<ul class="wp-block-list">
<li><strong>Fixturing Options:</strong> From full bed-of-nails (BoN) systems for high-volume lines, to cost-effective connector-based fixturing solutions for smaller runs.</li>



<li><strong>Instrumentation:</strong> Modular, serviceable, and upgradeable DAQ and rack-based instruments sourced from trusted partners, and selected based on your needs and requirements.</li>



<li><strong>Software:</strong> Several customizable platforms ready to deploy and meet your current and future needs.</li>



<li style="padding-bottom:var(--wp--preset--spacing--30)"><strong>Peripheral Systems:</strong> From simple barcode scanners, printers, &amp; PLC automation interfaces to add-on services like MES integration and analytics platform design and delivery.</li>
</ul>



<figure class="wp-block-image size-full is-resized" style="margin-bottom:var(--wp--preset--spacing--60)"><img fetchpriority="high" decoding="async" width="1073" height="236" src="https://static.dmcinfo.com/wp-content/uploads/2026/05/flexible-pcb-pcba-testing-image-1.png" alt="" class="wp-image-44772" style="width:1192px;height:auto" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/05/flexible-pcb-pcba-testing-image-1.png 1073w, https://static.dmcinfo.com/wp-content/uploads/2026/05/flexible-pcb-pcba-testing-image-1-300x66.png 300w, https://static.dmcinfo.com/wp-content/uploads/2026/05/flexible-pcb-pcba-testing-image-1-1024x225.png 1024w, https://static.dmcinfo.com/wp-content/uploads/2026/05/flexible-pcb-pcba-testing-image-1-768x169.png 768w" sizes="(max-width: 1073px) 100vw, 1073px" /></figure>



<h2 class="wp-block-heading" id="h-fixturing-the-foundation-of-reliable-testing">Fixturing: The Foundation of Reliable Testing</h2>



<p class="wp-block-paragraph">Whether your Device Under Test (DUT) is a bare PCB, a PCB assembly, or a fully enclosed PCB, your connection strategy drives cost, reliability, and timing. DMC can offer consulting and execution for:</p>



<ul class="wp-block-list">
<li><strong>Complete Bed-of-Nails Fixtures:</strong> High-reliability, low-cost, or well-balanced systems can be sourced from multiple DMC partners.</li>



<li><strong>Cost-Sensitive Alternatives:</strong> DMC can offer in-house-designed and built fixturing or pogo-pin connector-based systems to reduce your spend.</li>



<li><strong>Automation Options:</strong> Robotic or auto-loading systems for high-throughput environments.</li>



<li style="padding-bottom:var(--wp--preset--spacing--30)"><strong>Flexibility for Low-Volume, High-Mix Assembly:</strong> Quick-change fixtures and adaptable test sequences.</li>
</ul>



<h2 class="wp-block-heading" id="h-test-system-architecture-built-for-your-needs">Test System Architecture: Built for Your Needs</h2>



<p class="wp-block-paragraph">Every system we design can be tailored to your application and include the components needed to support reliable, efficient testing, including:</p>



<ul class="wp-block-list">
<li><strong>DUT Connections &amp; Fixturing: </strong>Based on your project needs.</li>



<li><strong>Instrumentation:</strong> High-power, high-current, and high-voltage measurements are our specialty.</li>



<li><strong>Overall System Integration:</strong> Turn-key workbenches and/or racks with integrated fixtures and peripherals, to cost-saving, simple enclosure-based systems to add to your workbench.</li>



<li><strong>Software:</strong> Modular, intuitive GUIs that make operation simple, and test-engineering-friendly test sequence and parameter modification.</li>



<li><strong>Peripheral Integration:</strong> Barcode scanners, printers, databases, MES, analytics, and more.</li>
</ul>



<p class="wp-block-paragraph">For low-volume, high-mix operations, we can often recommend a single flexible test system that supports easy fixture changeovers and multiple DUT configurations, a real cost saver.</p>



<figure class="wp-block-image size-full is-resized" style="margin-bottom:var(--wp--preset--spacing--50)"><img decoding="async" width="1075" height="240" src="https://static.dmcinfo.com/wp-content/uploads/2026/05/flexible-pcb-pcba-testing-image-2.png" alt="" class="wp-image-44778" style="width:1200px;height:auto" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/05/flexible-pcb-pcba-testing-image-2.png 1075w, https://static.dmcinfo.com/wp-content/uploads/2026/05/flexible-pcb-pcba-testing-image-2-300x67.png 300w, https://static.dmcinfo.com/wp-content/uploads/2026/05/flexible-pcb-pcba-testing-image-2-1024x229.png 1024w, https://static.dmcinfo.com/wp-content/uploads/2026/05/flexible-pcb-pcba-testing-image-2-768x171.png 768w" sizes="(max-width: 1075px) 100vw, 1075px" /></figure>



<h3 class="wp-block-heading" id="h-advanced-capabilities"><strong>Advanced Capabilities</strong></h3>



<ul class="wp-block-list">
<li><strong>Multiplexing:</strong> Reduce instrumentation costs and/or support multi-DUT setups with smart switching topologies.</li>



<li><strong>Microcontroller Programming:</strong> Need PCBA flashing station capability in your test system? We’ve got you covered.</li>



<li><strong>Scalable Design:</strong> If needed, DMC’s flexible designs let you start small and expand as your needs grow.</li>



<li><strong>Non-Standard Measurements:</strong> From magnetic and optical sensing to RF and high-power applications, we take on complex PCBA test challenges others may avoid.</li>
</ul>



<h2 class="wp-block-heading" id="h-software-that-works-for-you">Software That Works for You</h2>



<p class="wp-block-paragraph">DMC software solutions are not one-size-fits-all; they’re built to deliver speed, flexibility, and futureproofing in one package. With ready-to-deploy base designs and a wide range of platform tools at our experts’ fingertips, we can get your custom application up and running quickly, reducing downtime and fortifying your system for the future. All of our platforms and tools are designed with future flexibility and integration in mind, helping to ensure system effectiveness as demand and technologies change:</p>



<ul class="wp-block-list">
<li><strong>Ready-to-Deploy:</strong> Base designs and a wide range of platform tools allow us to get your test software up and running quickly.</li>



<li><strong>Customizable:</strong> DMC can quickly add the software features you need now, while our modular platform tools allow you to grow as your requirements evolve.</li>



<li><strong>Future-Proof: </strong>All of our software platforms and tools are designed with your future flexibility and integration needs in mind.</li>
</ul>



<p class="wp-block-paragraph">We can also walk through GUI examples and provide live software demonstrations to show how powerful and intuitive our systems are. For a deeper look at one of our platforms, see <a href="https://static.dmcinfo.com/blog/39679/the-hidden-cost-of-one-off-test-systems/" target="_blank" rel="noreferrer noopener">The Hidden Cost of One-Off Test Systems</a>.</p>



<h2 class="wp-block-heading" id="h-why-choose-dmc-for-test-and-measurement-solutions">Why Choose DMC for Test and Measurement Solutions?</h2>



<p class="wp-block-paragraph">DMC has a proven track record with major US manufacturers, supporting their complex test and measurement challenges and shifting technology needs. With multiple regional offices across the country, DMC is able to provide coast-to-coast support wherever our clients operate.</p>



<p class="wp-block-paragraph">In addition to deep test and measurement expertise, our team also specializes in non-standard measurements and challenging test scenarios, partnering with leading instrumentation vendors to deliver reliable results.</p>



<p class="wp-block-paragraph" style="padding-bottom:var(--wp--preset--spacing--40)">Whether our clients are looking for a complete, turnkey system or modular components that fit within an existing strategy, DMC adapts every approach to meet business goals and project needs.</p>



<div class="wp-block-group alignwide has-custom-light-blue-background-color has-background is-layout-flow wp-container-core-group-is-layout-dbd34961 wp-block-group-is-layout-flow" style="border-radius:20px;margin-top:var(--wp--preset--spacing--50);margin-bottom:var(--wp--preset--spacing--50);padding-top:var(--wp--preset--spacing--50);padding-right:0;padding-bottom:var(--wp--preset--spacing--50);padding-left:0">
<div class="wp-block-columns alignwide are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-43efaee5 wp-block-columns-is-layout-flex" style="padding-right:var(--wp--preset--spacing--60);padding-left:var(--wp--preset--spacing--60)">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:85%">
<h3 class="wp-block-heading has-text-align-left" id="h-have-an-upcoming-project-dmc-can-help-you-take-the-next-step">Ready to optimize your testing? DMC can help you take the next step.</h3>



<p class="has-text-align-left wp-block-paragraph" id="h-need-help-turning-ideas-into-outcomes-automation-project-to-the-next-level-contact-us-today-to-learn-more-about-our-solutions-and-how-we-can-help-you-achieve-your-goals">Contact DMC to discuss your project and learn how our <a href="https://static.dmcinfo.com/services/test-and-measurement-automation/">Test &amp; Measurement solutions</a> can support reshoring, test strategy upgrades, and more.</p>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:15%">
<div class="wp-block-buttons is-horizontal is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-2236275c wp-block-buttons-is-layout-flex">
<div class="wp-block-button is-style-fill"><a class="wp-block-button__link has-base-contrast-color has-text-color has-link-color wp-element-button" href="https://static.dmcinfo.com/contact/">Contact Us</a></div>
</div>
</div>
</div>
</div>



<div class="wp-block-group alignwide has-global-padding is-layout-constrained wp-container-core-group-is-layout-9243fccf wp-block-group-is-layout-constrained" style="margin-top:var(--wp--preset--spacing--70);margin-bottom:var(--wp--preset--spacing--70);padding-right:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--50)">
<h2 class="wp-block-heading alignwide has-text-align-left" id="h-related-work">Related Work</h2>



<div class="wp-block-cb-carousel-v2 alignwide cb-carousel-block" data-cb-slides-per-view="1" data-cb-slides-per-group="1" data-cb-space-between="15" data-cb-speed="300" data-cb-navigation="true" data-cb-pagination="true" data-cb-loop="true" data-cb-autoplay="true" data-cb-autoplay-speed="3000" data-cb-breakpoints="{&quot;768&quot;:{&quot;slidesPerView&quot;:3,&quot;slidesPerGroup&quot;:1}}"><div class="swiper"><div class="cb-wrapper swiper-wrapper">
<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<div class="wp-block-query is-layout-flow wp-block-query-is-layout-flow"><ul class="wp-block-post-template is-layout-flow wp-block-post-template-is-layout-flow"><li class="wp-block-post post-15285 our_work type-our_work status-publish has-post-thumbnail hentry work_category-automotive work_category-battery-pack-test-systems work_category-energy-and-utilities work_category-green-technology work_category-labview work_category-semiconductor work_category-test-measurement-automation work_category-test-stand">
<figure class="wp-block-post-featured-image"><img decoding="async" width="1400" height="500" src="https://static.dmcinfo.com/wp-content/uploads/2025/03/Bed-of-Nails-Battery-Management-System-PCB-Test-Station.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="Bed-of-Nails Battery Management System" style="border-radius:20px;object-fit:cover;" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/03/Bed-of-Nails-Battery-Management-System-PCB-Test-Station.png 1400w, https://static.dmcinfo.com/wp-content/uploads/2025/03/Bed-of-Nails-Battery-Management-System-PCB-Test-Station-300x107.png 300w, https://static.dmcinfo.com/wp-content/uploads/2025/03/Bed-of-Nails-Battery-Management-System-PCB-Test-Station-1024x366.png 1024w, https://static.dmcinfo.com/wp-content/uploads/2025/03/Bed-of-Nails-Battery-Management-System-PCB-Test-Station-768x274.png 768w" sizes="(max-width: 1400px) 100vw, 1400px" /></figure>

<h4 class="has-link-color wp-elements-1 wp-block-post-title"><a href="https://static.dmcinfo.com/our-work/bed-of-nails-battery-management-system-pcb-test-station/" target="_self" >Bed-of-Nails Battery Management System PCB Test Station</a></h4>
</li></ul>

</div>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<div class="wp-block-query is-layout-flow wp-block-query-is-layout-flow"><ul class="wp-block-post-template is-layout-flow wp-block-post-template-is-layout-flow"><li class="wp-block-post post-14687 our_work type-our_work status-publish has-post-thumbnail hentry work_category-automotive work_category-embedded-development-programming work_category-labview work_category-product-development work_category-test-measurement-automation work_category-test-stand">
<figure class="wp-block-post-featured-image"><img decoding="async" width="1400" height="500" src="https://static.dmcinfo.com/wp-content/uploads/2019/03/Bed-of-Nails-PCB-Functional-Test-System-1.jpg" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="Bed of Nails PCB Functional Test System" style="border-radius:20px;object-fit:cover;" srcset="https://static.dmcinfo.com/wp-content/uploads/2019/03/Bed-of-Nails-PCB-Functional-Test-System-1.jpg 1400w, https://static.dmcinfo.com/wp-content/uploads/2019/03/Bed-of-Nails-PCB-Functional-Test-System-1-300x107.jpg 300w, https://static.dmcinfo.com/wp-content/uploads/2019/03/Bed-of-Nails-PCB-Functional-Test-System-1-1024x366.jpg 1024w, https://static.dmcinfo.com/wp-content/uploads/2019/03/Bed-of-Nails-PCB-Functional-Test-System-1-768x274.jpg 768w" sizes="(max-width: 1400px) 100vw, 1400px" /></figure>

<h4 class="has-link-color wp-elements-2 wp-block-post-title"><a href="https://static.dmcinfo.com/our-work/bed-of-nails-pcb-test-system/" target="_self" >Bed-of-Nails PCB Functional Test System, Automotive Gauge Cluster Controller</a></h4>
</li></ul>

</div>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<div class="wp-block-query is-layout-flow wp-block-query-is-layout-flow"><ul class="wp-block-post-template is-layout-flow wp-block-post-template-is-layout-flow"><li class="wp-block-post post-15318 our_work type-our_work status-publish has-post-thumbnail hentry work_category-automotive work_category-embedded-development-programming">
<figure class="wp-block-post-featured-image"><img decoding="async" width="1400" height="500" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/End-of-Line-Test-for-a-Wireless-Lockbox-1.jpg" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="End-of-Line Test for a Wireless Lockbox" style="border-radius:20px;object-fit:cover;" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/End-of-Line-Test-for-a-Wireless-Lockbox-1.jpg 1400w, https://static.dmcinfo.com/wp-content/uploads/2025/05/End-of-Line-Test-for-a-Wireless-Lockbox-1-300x107.jpg 300w, https://static.dmcinfo.com/wp-content/uploads/2025/05/End-of-Line-Test-for-a-Wireless-Lockbox-1-1024x366.jpg 1024w, https://static.dmcinfo.com/wp-content/uploads/2025/05/End-of-Line-Test-for-a-Wireless-Lockbox-1-768x274.jpg 768w" sizes="(max-width: 1400px) 100vw, 1400px" /></figure>

<h4 class="has-link-color wp-elements-3 wp-block-post-title"><a href="https://static.dmcinfo.com/our-work/end-of-line-tester-for-a-wireless-lockbox-controller/" target="_self" >End-of-Line Tester for a Wireless Lockbox Controller</a></h4>
</li></ul>

</div>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<div class="wp-block-query is-layout-flow wp-block-query-is-layout-flow"><ul class="wp-block-post-template is-layout-flow wp-block-post-template-is-layout-flow"><li class="wp-block-post post-15146 our_work type-our_work status-publish has-post-thumbnail hentry work_category-automotive work_category-labview work_category-test-measurement-automation">
<figure class="wp-block-post-featured-image"><img decoding="async" width="1400" height="500" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-156.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="border-radius:20px;object-fit:cover;" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-156.png 1400w, https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-156-300x107.png 300w, https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-156-1024x366.png 1024w, https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-156-768x274.png 768w" sizes="(max-width: 1400px) 100vw, 1400px" /></figure>

<h4 class="has-link-color wp-elements-4 wp-block-post-title"><a href="https://static.dmcinfo.com/our-work/functional-end-of-line-test-system-for-automotive-ecus/" target="_self" >Functional End of Line Test System for Automotive ECUs</a></h4>
</li></ul>

</div>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<div class="wp-block-query is-layout-flow wp-block-query-is-layout-flow"><ul class="wp-block-post-template is-layout-flow wp-block-post-template-is-layout-flow"><li class="wp-block-post post-14995 our_work type-our_work status-publish has-post-thumbnail hentry work_category-automotive work_category-labview work_category-test-measurement-automation work_category-test-stand">
<figure class="wp-block-post-featured-image"><img decoding="async" width="1400" height="500" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-121.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="border-radius:20px;object-fit:cover;" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-121.png 1400w, https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-121-300x107.png 300w, https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-121-1024x366.png 1024w, https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-121-768x274.png 768w" sizes="(max-width: 1400px) 100vw, 1400px" /></figure>

<h4 class="has-link-color wp-elements-5 wp-block-post-title"><a href="https://static.dmcinfo.com/our-work/test-stand-automotive-flashing-station/" target="_self" >Test Stand Automotive Flashing Station</a></h4>
</li></ul>

</div>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<div class="wp-block-query is-layout-flow wp-block-query-is-layout-flow"><ul class="wp-block-post-template is-layout-flow wp-block-post-template-is-layout-flow"><li class="wp-block-post post-14681 our_work type-our_work status-publish has-post-thumbnail hentry work_category-data-analysis-data-mining-and-reporting work_category-labview work_category-test-measurement-automation work_category-test-stand">
<figure class="wp-block-post-featured-image"><img decoding="async" width="1400" height="500" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/8-UP-ECU-Flashing-Station.jpg" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="border-radius:20px;object-fit:cover;" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/8-UP-ECU-Flashing-Station.jpg 1400w, https://static.dmcinfo.com/wp-content/uploads/2025/05/8-UP-ECU-Flashing-Station-300x107.jpg 300w, https://static.dmcinfo.com/wp-content/uploads/2025/05/8-UP-ECU-Flashing-Station-1024x366.jpg 1024w, https://static.dmcinfo.com/wp-content/uploads/2025/05/8-UP-ECU-Flashing-Station-768x274.jpg 768w" sizes="(max-width: 1400px) 100vw, 1400px" /></figure>

<h4 class="has-link-color wp-elements-6 wp-block-post-title"><a href="https://static.dmcinfo.com/our-work/8-up-ecu-flashing-station/" target="_self" >8-UP ECU Flashing Station</a></h4>
</li></ul>

</div>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<div class="wp-block-query is-layout-flow wp-block-query-is-layout-flow"><ul class="wp-block-post-template is-layout-flow wp-block-post-template-is-layout-flow"><li class="wp-block-post post-15153 our_work type-our_work status-publish has-post-thumbnail hentry work_category-application-development work_category-automotive work_category-pc-application-development">
<figure class="wp-block-post-featured-image"><img decoding="async" width="1400" height="500" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-157.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="border-radius:20px;object-fit:cover;" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-157.png 1400w, https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-157-300x107.png 300w, https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-157-1024x366.png 1024w, https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-157-768x274.png 768w" sizes="(max-width: 1400px) 100vw, 1400px" /></figure>

<h4 class="has-link-color wp-elements-7 wp-block-post-title"><a href="https://static.dmcinfo.com/our-work/flexible-desktop-application-for-automotive-chip-flashing/" target="_self" >Flexible Desktop Application for Automotive Chip Flashing</a></h4>
</li></ul>

</div>
</div>
</div></div><div class="cb-pagination swiper-pagination"></div><div class="cb-button-prev swiper-button-prev"></div><div class="cb-button-next swiper-button-next"></div></div>
</div>
<p>The post <a href="https://static.dmcinfo.com/blog/44756/pcb-test-systems/">Adapting Manufacturing Operations? Flexible PCB and PCBA Testing Is Key to Success </a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Battery Life Calculator</title>
		<link>https://static.dmcinfo.com/blog/41922/battery-life-calculator/</link>
		
		<dc:creator><![CDATA[Tim Jager]]></dc:creator>
		<pubDate>Thu, 05 Mar 2026 13:00:00 +0000</pubDate>
				<category><![CDATA[Embedded Development & Programming]]></category>
		<category><![CDATA[Low-Power Embedded Design]]></category>
		<category><![CDATA[Product Development]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/?p=41922</guid>

					<description><![CDATA[<p>As engineers who design electronic products, maximizing battery life is a constant challenge. Devices keep getting smaller while their feature sets continue to grow, forcing us to carefully manage power consumption across multiple operating modes, batteries, and power conversion stages. This calculator helps explore those tradeoffs by letting you tune system parameters and compare different [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/41922/battery-life-calculator/">Battery Life Calculator</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">As engineers who design electronic products, maximizing battery life is a constant challenge. Devices keep getting smaller while their feature sets continue to grow, forcing us to carefully manage power consumption across multiple operating modes, batteries, and power conversion stages.</p>



<p class="wp-block-paragraph">This calculator helps explore those tradeoffs by letting you tune system parameters and compare different battery and power architecture options. Unlike many simple online calculators, it breaks power usage down by operating mode and accounts for conversion efficiency so you can better see where energy is going and how design choices affect battery life.</p>



<style>
    /* Root layout */
    .dmc-calc-root {
      margin: 2rem auto;
      padding: 1.5rem;
      border: 1px solid #ccc;
      border-radius: 8px;
      background-color: #fff;
      box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
    }

    .dmc-calc-root h1 {
      margin-top: 0;
      margin-bottom: 0.25rem;
      font-size: 1.6rem;
    }

    .dmc-calc-root p.dmc-calc-subtitle {
      margin-top: 0;
      color: #555;
      font-size: 0.95rem;
    }

    .dmc-calc-section {
      margin-top: 1.75rem;
    }

    .dmc-calc-section h2 {
      margin: 0 0 0.75rem 0;
      font-size: 1.25rem;
      border-bottom: 1px solid #ddd;
      padding-bottom: 0.25rem;
    }

    .dmc-calc-section h3 {
      margin: 1rem 0 0.5rem 0;
      font-size: 1.05rem;
    }

    /* Battery configuration */
    .dmc-calc-battery-grid {
      display: grid;
      grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
      gap: 0.75rem 1rem;
    }

    .dmc-calc-field {
      display: flex;
      flex-direction: column;
      font-size: 0.9rem;
    }

    .dmc-calc-field label {
      margin-bottom: 0.15rem;
      font-weight: 600;
    }

    .dmc-calc-field input,
    .dmc-calc-field select {
      padding: 0.3rem 0.4rem;
      border: 1px solid #ccc;
      border-radius: 4px;
      font-size: 0.9rem;
    }

    .dmc-calc-field input.dmc-calc-readonly {
      background-color: #f4f6fb;
      border-color: #cdd6e4;
      color: #394255;
      cursor: not-allowed;
    }

    .dmc-calc-field input.dmc-calc-readonly:focus {
      outline: none;
      box-shadow: none;
    }

    .dmc-calc-field span.dmc-calc-unit {
      font-size: 0.8rem;
      color: #666;
      margin-top: 0.15rem;
    }

    .dmc-calc-example-links {
      margin: 0;
      padding-left: 1.05rem;
      display: flex;
      flex-direction: column;
      gap: 0.35rem;
    }

    .dmc-calc-example-links li {
      line-height: 1.3;
    }

    .dmc-calc-example-links a {
      color: #0057b8;
      text-decoration: underline;
      text-underline-offset: 2px;
    }

    .dmc-calc-example-links a:hover,
    .dmc-calc-example-links a:focus-visible {
      color: #003f84;
    }

    .dmc-calc-example-blurb {
      margin: 0.1rem 0 0 0;
      color: #666;
      font-size: 0.78rem;
    }

    /* Rails and modes tables */
    .dmc-calc-table-wrapper {
      overflow-x: auto;
    }

    .dmc-calc-table {
      width: 100%;
      border-collapse: collapse;
      font-size: 0.85rem;
      min-width: 760px;
    }

    .dmc-calc-table th,
    .dmc-calc-table td {
      border: 1px solid #ddd;
      padding: 0.3rem;
      text-align: left;
      vertical-align: middle;
      white-space: nowrap;
    }

    .dmc-calc-table thead {
      background-color: #f7f7f7;
      position: sticky;
      top: 0;
      z-index: 1;
    }

    .dmc-calc-table th {
      font-weight: 600;
    }

    .dmc-calc-table input,
    .dmc-calc-table select {
      width: 100%;
      box-sizing: border-box;
      font-size: 0.8rem;
      padding: 0.2rem 0.25rem;
    }

    .dmc-calc-rails-table input[data-rail-field="name"] {
      max-width: 6rem;
    }

    .dmc-calc-rails-table input[data-rail-field="voltage"] {
      max-width: 4.75rem;
    }

    .dmc-calc-rails-table input[data-rail-field="efficiency"],
    .dmc-calc-rails-table input[data-rail-field="eff-low-pct"],
    .dmc-calc-rails-table input[data-rail-field="eff-high-pct"] {
      max-width: 3.5rem;
    }

    .dmc-calc-rails-table input[data-rail-field="iq-ua"] {
      max-width: 6rem;
    }

    .dmc-calc-rails-table select[data-rail-field="parent"] {
      max-width: 8rem;
    }

    .dmc-calc-rails-eff-mode-hidden:disabled {
      color: transparent;
      text-shadow: none;
      -webkit-text-fill-color: transparent;
    }

    .dmc-calc-rails-table {
      min-width: 640px;
    }

    .dmc-calc-loads-table {
      min-width: 640px;
    }

    .dmc-calc-modes-table {
      min-width: 1000px;
    }

    .dmc-calc-modes-table input[data-load-id] {
      width: 4.5rem;
      min-width: 4.5rem;
      max-width: 4.5rem;
    }

    .dmc-calc-modes-table input[data-mode-field="period"] {
      width: 4.5rem;
      min-width: 4.5rem;
    }

    .dmc-calc-input-with-unit {
      display: inline-flex;
      align-items: center;
      gap: 0.15rem;
    }

    .dmc-calc-input-with-unit > input,
    .dmc-calc-input-with-unit > .dmc-calc-computed-field {
      box-sizing: border-box;
      height: 1.95rem;
      line-height: 1.2;
    }

    .dmc-calc-input-with-unit select {
      width: auto;
      min-width: 4.9rem;
      padding: 0.2rem 0.2rem;
      padding-right: 1.45rem;
      border: 1px solid #ccc;
      border-radius: 4px;
      font-size: 0.85rem;
      color: #111;
      background-color: #fff;
      flex: 0 0 auto;
      -webkit-appearance: menulist;
      appearance: auto;
    }

    .dmc-calc-unit-label {
      width: 4.9rem;
      min-width: 4.9rem;
      box-sizing: border-box;
      height: 1.95rem;
      display: inline-flex;
      align-items: center;
      justify-content: center;
      padding: 0.2rem 0.2rem;
      border: 1px solid #ccc;
      border-radius: 4px;
      background-color: #f7f7f7;
      color: #394255;
      font-size: 0.85rem;
      font-weight: 600;
      user-select: none;
    }

    .dmc-calc-modes-table input[data-mode-field="name"] {
      width: 9rem;
      min-width: 9rem;
    }

    .dmc-calc-computed-field {
      display: inline-block;
      padding: 0.3rem 0.4rem;
      background-color: #f4f6fb;
      border: 1px solid #cdd6e4;
      border-radius: 4px;
      font-size: 0.9rem;
      color: #394255;
      font-variant-numeric: tabular-nums;
      text-align: right;
      min-width: 4.5rem;
    }

    .dmc-calc-modes-table .dmc-calc-mode-period-value {
      width: 4.5rem;
      min-width: 4.5rem;
    }

    .dmc-calc-modes-table .dmc-calc-mode-active-value {
      width: 5.5rem;
      min-width: 5.5rem;
    }

    .dmc-calc-modes-table input[data-mode-field="active"] {
      width: 5.5rem;
      min-width: 5.5rem;
    }

    .dmc-calc-modes-table .dmc-blc-duty,
    .dmc-calc-modes-table .dmc-blc-avg-power,
    .dmc-calc-modes-table .dmc-blc-contrib {
      font-variant-numeric: tabular-nums;
      text-align: right;
      display: inline-block;
      min-width: 2.2rem;
    }

    .dmc-calc-modes-table th.dmc-calc-narrow-col,
    .dmc-calc-modes-table td.dmc-calc-narrow-col {
      width: 3.2rem;
      min-width: 3.2rem;
      max-width: 3.5rem;
      white-space: normal;
      line-height: 1.3;
      text-align: right;
    }

    .dmc-calc-modes-table td[role="button"] {
      padding: 0.3rem 0.15rem;
      width: 2rem;
      min-width: 2rem;
    }

    .dmc-calc-modes-table .dmc-calc-delete-col {
      width: 2rem;
      min-width: 2rem;
      padding: 0.3rem 0.15rem;
      text-align: center;
    }

    .dmc-calc-rails-eff-cell {
      white-space: normal;
    }

    .dmc-calc-rails-eff-cell input[data-rail-field="efficiency"],
    .dmc-calc-rails-eff-cell {
      white-space: normal;
    }

    .dmc-calc-rails-eff-rows {
      display: grid;
      gap: 0.2rem;
      align-items: center;
    }

    .dmc-calc-rails-eff-row {
      display: grid;
      grid-template-columns: auto 3.25rem auto 4rem auto;
      align-items: center;
      gap: 0.2rem;
    }

    .dmc-calc-rails-eff-row input[type="number"] {
      width: 100%;
      min-width: 3rem;
    }

    .dmc-calc-rails-eff-row span {
      color: #555;
      font-size: 0.85rem;
      white-space: nowrap;
    }

    .dmc-calc-rails-eff-label {
      display: inline-block;
      min-width: 2.6rem;
      text-align: right;
    }

    .dmc-calc-rails-eff-rows .dmc-calc-rails-eff-simple-only {
      grid-template-columns: 1fr;
      gap: 0;
    }

    /* Topology diagram */
    .dmc-calc-topology {
      margin: 1rem 0 1.25rem 0;
      padding: 0.75rem;
      border: 1px solid #e0e0e0;
      border-radius: 6px;
      background: linear-gradient(120deg, #fafafa 0%, #f5f7fa 100%);
    }

    .dmc-calc-topology {
      position: relative;
    }

    .dmc-calc-topology svg {
      width: 100%;
      height: 100%;
      min-height: 360px;
      max-height: 600px;
      display: block;
    }

    .dmc-calc-modes-actions {
      margin-top: 0.5rem;
      display: flex;
      gap: 0.5rem;
    }

    /* Concept tiles */
    .dmc-calc-concepts-grid {
      display: grid;
      grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
      gap: 0.9rem;
      margin-top: 0.75rem;
    }

    .dmc-calc-concept-card {
      border: 1px solid #e0e0e0;
      border-radius: 6px;
      padding: 0.6rem 0.75rem;
      background: #fcfcff;
    }

    .dmc-calc-concept-name {
      font-weight: 600;
      margin: 0 0 0.35rem 0;
    }

    .dmc-calc-concept-detail {
      margin: 0.15rem 0;
      font-size: 0.86rem;
    }

    .dmc-calc-concept-detail em {
      font-style: normal;
      font-weight: 600;
      display: block;
      margin-bottom: 0.05rem;
    }

    .dmc-calc-2pt-demo {
      margin-top: 0.5rem;
      padding: 0.45rem 0.55rem;
      border: 1px solid #d8dee8;
      border-radius: 6px;
      background: #ffffff;
    }

    .dmc-calc-2pt-demo svg {
      display: block;
      width: 100%;
      height: 122px;
    }

    .dmc-calc-2pt-rules {
      margin: 0.4rem 0 0 0.95rem;
      padding: 0;
      color: #4a4a4a;
      font-size: 0.79rem;
      line-height: 1.35;
    }

    /* Results cards */
    .dmc-calc-results-grid {
      display: grid;
      grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
      gap: 0.75rem;
    }

    .dmc-calc-card {
      border: 1px solid #ddd;
      border-radius: 6px;
      padding: 0.75rem 0.9rem;
      background-color: #fafafa;
    }

    .dmc-calc-card h3 {
      margin: 0 0 0.3rem 0;
      font-size: 0.95rem;
    }

    .dmc-calc-card-value {
      font-size: 1.1rem;
      font-weight: 600;
      margin-bottom: 0.15rem;
    }

    .dmc-calc-card-sub {
      font-size: 0.8rem;
      color: #666;
    }

    /* Mode contribution bars */
    .dmc-calc-mode-bars {
      margin-top: 1rem;
      font-size: 0.85rem;
    }

    .dmc-calc-mode-bars h3 {
      margin: 0 0 0.5rem 0;
      font-size: 0.95rem;
    }

    .dmc-calc-mode-bars-body {
      display: flex;
      flex-direction: column;
      gap: 0.35rem;
    }

    .dmc-calc-mode-bar-row {
      display: grid;
      grid-template-columns: minmax(100px, 140px) 1fr minmax(56px, 68px);
      align-items: center;
      gap: 0.5rem;
    }

    .dmc-calc-mode-bar-label {
      overflow: hidden;
      text-overflow: ellipsis;
      white-space: nowrap;
    }

    .dmc-calc-mode-bar-track {
      position: relative;
      height: 10px;
      border-radius: 999px;
      background-color: #eee;
      overflow: hidden;
    }

    .dmc-calc-mode-bar {
      position: absolute;
      left: 0;
      top: 0;
      bottom: 0;
      border-radius: 999px;
      background-color: #0074d9;
    }

    .dmc-calc-mode-bar-value {
      text-align: right;
      font-variant-numeric: tabular-nums;
      color: #444;
    }

    /* Sticky summary banner */
    #dmc-blc-summary-banner-container {
      display: flex;
      justify-content: flex-end;
      margin-bottom: 20px;
      position: sticky;
      top: 170px;
	  z-index: 60;
    }
    .dmc-calc-summary-banner {
      width: calc(100% - 1.4rem);
      margin: 0;
      padding: 0.45rem 0.7rem 0.55rem 0.7rem;
      border: 2px solid #0b5fc6;
      border-radius: 12px;
      background: linear-gradient(180deg, #f7fbff 0%, #edf4ff 100%);
      box-shadow: 0 8px 18px rgba(11, 95, 198, 0.18);
      display: flex;
      flex-direction: column;
      gap: 0.35rem 0.6rem;
      align-items: stretch;
      transition: transform 220ms ease, box-shadow 220ms ease;
    }

    .dmc-calc-summary-banner.dmc-calc-summary-banner-down {
      transform: translate(0, -8px);
      box-shadow: 0 4px 10px rgba(11, 95, 198, 0.14);
    }

    .dmc-calc-summary-banner-head {
      display: flex;
      align-items: center;
      gap: 0.5rem;
    }

    .dmc-calc-summary-banner-title {
      flex: 1 1 auto;
      font-size: 0.72rem;
      font-weight: 700;
      letter-spacing: 0.08em;
      text-transform: uppercase;
      color: #0b4a92;
      margin: 0;
      line-height: 1.15;
    }

    .dmc-calc-summary-toggle {
      flex: 0 0 auto;
      border: 1px solid #8fb3e0;
      border-radius: 999px;
      background: #ffffff;
      color: #225392;
      font-size: 0.72rem;
      font-weight: 700;
      letter-spacing: 0.02em;
      padding: 0.18rem 0.55rem;
      cursor: pointer;
      line-height: 1.2;
    }

    .dmc-calc-summary-toggle:hover,
    .dmc-calc-summary-toggle:focus-visible {
      border-color: #0b5fc6;
      color: #0b4a92;
      outline: none;
    }

    .dmc-calc-summary-banner-content {
      display: grid;
      grid-template-columns: repeat(3, minmax(220px, 1fr));
      gap: 0.35rem 0.6rem;
      align-items: center;
    }

    .dmc-calc-summary-pill {
      display: flex;
      flex-direction: column;
      gap: 0.08rem;
      background-color: #ffffff;
      border: 1px solid #d5deec;
      border-radius: 9px;
      padding: 0.28rem 0.45rem;
    }

    .dmc-calc-summary-pill-label {
      font-size: 0.74rem;
      color: #4f5f78;
      font-weight: 600;
    }

    .dmc-calc-summary-pill-value {
      font-size: 0.98rem;
      font-weight: 700;
      font-variant-numeric: tabular-nums;
      color: #1f2c42;
    }

    .dmc-calc-summary-pill-primary {
      border: 2px solid #ea8a15;
      background: linear-gradient(180deg, #fff9ef 0%, #fff2dc 100%);
      box-shadow: 0 2px 8px rgba(234, 138, 21, 0.18);
    }

    .dmc-calc-summary-pill-primary .dmc-calc-summary-pill-label {
      color: #8b4b00;
    }

    .dmc-calc-summary-pill-primary .dmc-calc-summary-pill-value {
      font-size: clamp(1.08rem, 2vw, 1.3rem);
      line-height: 1.1;
      color: #7a2e00;
    }

    .dmc-calc-summary-banner.dmc-calc-summary-banner-collapsed {
      transform: translate(0, 0);
      width: max-content;
      max-width: calc(100vw - 1.3rem);
      padding: 0.2rem 0.28rem;
      gap: 0.16rem;
    }

    .dmc-calc-summary-banner.dmc-calc-summary-banner-collapsed .dmc-calc-summary-banner-title {
      display: none;
    }

    .dmc-calc-summary-banner.dmc-calc-summary-banner-collapsed .dmc-calc-summary-banner-content {
      grid-template-columns: 1fr;
      gap: 0.25rem;
    }

    .dmc-calc-summary-banner.dmc-calc-summary-banner-collapsed .dmc-calc-summary-pill-secondary {
      display: none;
    }

    .dmc-calc-summary-banner.dmc-calc-summary-banner-collapsed .dmc-calc-summary-pill-primary {
      border-width: 1px;
      box-shadow: none;
      padding: 0.12rem 0.34rem;
    }

    .dmc-calc-summary-banner.dmc-calc-summary-banner-collapsed .dmc-calc-summary-pill-primary .dmc-calc-summary-pill-label {
      display: none;
    }

    .dmc-calc-summary-banner.dmc-calc-summary-banner-collapsed .dmc-calc-summary-pill-primary .dmc-calc-summary-pill-value {
      font-size: 0.86rem;
      color: #4f2b00;
    }

    .dmc-calc-summary-banner.dmc-calc-summary-banner-collapsed .dmc-calc-summary-toggle {
      font-size: 0.68rem;
      padding: 0.1rem 0.42rem;
    }

    .dmc-calc-summary-banner.dmc-calc-summary-banner-collapsed.dmc-calc-summary-banner-down {
      transform: translate(0, -8px);
    }

    /* Share section */
    .dmc-calc-share-row {
      display: flex;
      flex-wrap: wrap;
      gap: 0.5rem;
      align-items: center;
    }

    .dmc-calc-share-row button {
      white-space: nowrap;
    }

    .dmc-calc-share-row input[type="text"] {
      flex: 1 1 220px;
      min-width: 0;
      padding: 0.3rem 0.4rem;
      border: 1px solid #ccc;
      border-radius: 4px;
      font-size: 0.85rem;
    }

    .dmc-calc-share-status {
      font-size: 0.8rem;
      color: #555;
      margin-top: 0.3rem;
    }

    /* Buttons */
    .dmc-calc-button {
      display: inline-flex;
      align-items: center;
      justify-content: center;
      border-radius: 4px;
      border: 1px solid #0074d9;
      background-color: #0074d9;
      color: #fff;
      padding: 0.35rem 0.7rem;
      font-size: 0.85rem;
      cursor: pointer;
    }

    .dmc-calc-button.dmc-calc-secondary {
      background-color: #f5f5f5;
      border-color: #ccc;
      color: #333;
    }

    .dmc-calc-button:disabled {
      opacity: 0.6;
      cursor: default;
    }

    /* Explanation details */
    .dmc-calc-explainer {
      font-size: 0.9rem;
    }

    .dmc-calc-explainer summary {
      cursor: pointer;
      font-weight: 600;
    }

    .dmc-calc-explainer p {
      margin-top: 0.4rem;
      margin-bottom: 0.4rem;
    }

    /* Small helpers */
    .dmc-calc-muted {
      color: #666;
      font-size: 0.8rem;
    }

    .dmc-calc-warning {
      color: #a33;
      font-size: 0.85rem;
      margin-top: 0.45rem;
    }

    .dmc-calc-align-right {
      text-align: right;
    }

    .dmc-calc-collapsible {
      border: 1px solid #e0e0e0;
      border-radius: 6px;
      padding: 0.4rem 0.75rem 0.75rem 0.75rem;
      background: linear-gradient(180deg, #fafafa 0%, #fdfdfd 100%);
    }

    .dmc-calc-collapsible summary {
      cursor: pointer;
      list-style: none;
    }

    .dmc-calc-collapsible summary::-webkit-details-marker {
      display: none;
    }

    .dmc-calc-collapsible summary h2 {
      display: inline-block;
      margin: 0 0 0.35rem 0;
    }

    .dmc-calc-chem-curve {
      margin-top: 1.25rem;
      padding: 1rem;
      border: 1px solid #ddd;
      border-radius: 8px;
      background: linear-gradient(180deg, #fcfcfc 0%, #f5f6fa 100%);
    }

    .dmc-calc-chem-curve-header {
      display: flex;
      flex-wrap: wrap;
      justify-content: space-between;
      align-items: flex-end;
      gap: 0.5rem;
    }

    .dmc-calc-chem-curve-header h3 {
      margin: 0;
      font-size: 1.05rem;
    }

    .dmc-calc-chem-curve canvas {
      display: block;
      width: 100%;
      height: 260px;
      min-height: 220px;
      margin-top: 0.75rem;
      border-radius: 4px;
      background-color: #fff;
      box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.04);
    }

    .dmc-calc-chem-curve-legend {
      display: flex;
      flex-wrap: wrap;
      gap: 0.75rem;
      font-size: 0.85rem;
      color: #444;
    }

    .dmc-calc-chem-curve-note {
      margin-top: 0.4rem;
      font-size: 0.8rem;
      color: #666;
    }

    .dmc-calc-chem-curve-stats {
      display: grid;
      grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
      gap: 0.5rem 1rem;
      margin-top: 0.75rem;
      font-size: 0.85rem;
      color: #333;
    }

    .dmc-calc-chem-curve-stat-label {
      display: block;
      color: #666;
      font-size: 0.78rem;
      margin-bottom: 0.15rem;
    }

    .dmc-calc-chem-curve-stat-value {
      font-variant-numeric: tabular-nums;
    }

    @media (max-width: 640px) {
      .dmc-calc-root {
        margin: 1rem;
        padding: 1rem;
      }

      #dmc-blc-summary-banner-container {
        top: 90px;
      }

      .dmc-calc-summary-banner {
        width: calc(100% - 1.1rem);
        right: auto;
        bottom: auto;
        padding: 0.45rem 0.55rem 0.5rem 0.55rem;
        grid-template-columns: 1fr;
      }

      .dmc-calc-summary-banner-content {
        grid-template-columns: 1fr;
      }

      .dmc-calc-summary-banner-title {
        font-size: 0.68rem;
      }
      .dmc-calc-summary-banner.dmc-calc-summary-banner-collapsed {
        max-width: calc(100vw - 1rem);
      }
    }
.dmc-calc-section p code {
	padding: inherit;
	background-color: inherit;
	border-radius: inherit !important;
	color: inherit;
	font-size: inherit;
	box-decoration-break: inherit;
	-webkit-box-decoration-break: inherit;
}
  </style>
</head>
<body>
  <div id="battery-life-calculator" class="dmc-calc-root">
    <div id="dmc-blc-summary-banner-container">
      <div id="dmc-blc-summary-banner" class="dmc-calc-summary-banner" aria-label="Key results summary" data-collapsed="false">
        <div class="dmc-calc-summary-banner-head">
          <div class="dmc-calc-summary-banner-title">Final battery life estimate</div>
          <button type="button" id="dmc-blc-summary-toggle" class="dmc-calc-summary-toggle" aria-expanded="true" aria-controls="dmc-blc-summary-content">Collapse</button>
        </div>
        <div id="dmc-blc-summary-content" class="dmc-calc-summary-banner-content">
          <div class="dmc-calc-summary-pill dmc-calc-summary-pill-secondary">
            <span class="dmc-calc-summary-pill-label">Average power</span>
            <span class="dmc-calc-summary-pill-value" id="dmc-blc-summary-avg">&#8212; uW</span>
          </div>
          <div class="dmc-calc-summary-pill dmc-calc-summary-pill-secondary">
            <span class="dmc-calc-summary-pill-label">Usable pack energy</span>
            <span class="dmc-calc-summary-pill-value" id="dmc-blc-summary-energy">&#8212;</span>
          </div>
          <div class="dmc-calc-summary-pill dmc-calc-summary-pill-primary">
            <span class="dmc-calc-summary-pill-label">Life</span>
            <span class="dmc-calc-summary-pill-value" id="dmc-blc-summary-life">&#8212;</span>
          </div>
        </div>
      </div>
      </div>
    <header>
      <h2>Ultimate Online Battery Life Calculator for IoT, Embedded Systems, and Wearable Devices</h2>
      <p class="dmc-calc-subtitle">
        Explore battery life for embedded systems with multiple modes and power rails.
      </p>
    </header>

    <!-- Example configurations -->
    <section class="dmc-calc-section" aria-labelledby="dmc-blc-examples-heading">
      <h2 id="dmc-blc-examples-heading">Example configurations</h2>
      <div class="dmc-calc-field">
        <span class="dmc-calc-unit">Each link reloads this page with that template.</span>
        <p class="dmc-calc-muted">Each example demonstrates a realistic device setup, so the diagram, mode rows, and results cards line up as a teachable reference. After loading one, tweak values to see how assumptions change the life estimate.</p>
        <label id="dmc-blc-example-links-label">Load an example template</label>
        <ul class="dmc-calc-example-links" aria-labelledby="dmc-blc-example-links-label">
          <li>
            <a id="dmc-blc-example-link-coin_tracker_direct" data-example-link="coin_tracker_direct" href="#">Coin-cell tracker (direct battery)</a>
            <p class="dmc-calc-example-blurb">A simple one-cell CR2032 design with no intermediate rails, so the block diagram shows Battery feeding each load directly. Use this to see how tiny idle current and very short, frequent BLE pulses combine, then compare with the rare long beeper event to understand which activity actually dominates life.</p>
          </li>
          <li>
            <a id="dmc-blc-example-link-aa_logger_buckboost" data-example-link="aa_logger_buckboost" href="#">2xAA remote logger (buck-boost)</a>
            <p class="dmc-calc-example-blurb">Two AA alkaline cells feed a 3V3 buck-boost rail in switching 2-point efficiency mode, so the diagram includes one converter stage between battery and loads. This example helps you inspect how light-load efficiency and converter overhead affect average power during long idle windows, short samples, and periodic radio uplink bursts.</p>
          </li>
          <li>
            <a id="dmc-blc-example-link-aaa_beacon_boost" data-example-link="aaa_beacon_boost" href="#">1xAAA sensor beacon (boost)</a>
            <p class="dmc-calc-example-blurb">A single AAA cell powers a 3V0 boost rail with 2-point efficiency, representing a common ultra-low-power beacon architecture. Look at the mode table to compare near-zero idle current, periodic sensing, and brief BLE transmit pulses, then check how boost efficiency at low current impacts the final battery-life estimate.</p>
          </li>
          <li>
            <a id="dmc-blc-example-link-lipo_wearable_multirail" data-example-link="lipo_wearable_multirail" href="#">LiPo wearable (multi-rail)</a>
            <p class="dmc-calc-example-blurb">This model uses a 1S LiPo pack with a 3V3 buck rail and cascaded 1V8 core plus 2V8 sensor rails, so the diagram demonstrates a realistic multi-rail wearable tree. Use it to see how cascaded conversion losses and mixed digital/radio/sensor activity shape average power across continuous sensing and bursty communication modes.</p>
          </li>
          <li>
            <a id="dmc-blc-example-link-smart_lock_motor_boost" data-example-link="smart_lock_motor_boost" href="#">LiPo smart lock (motor boost rail)</a>
            <p class="dmc-calc-example-blurb">A 1S LiPo supply drives low-power logic rails and a separate 5V boost rail for a high-current motor, which makes the block diagram and duty-cycle math more event-driven. This example is useful for learning how rare but heavy actuation pulses can outweigh long standby periods in total energy budget.</p>
          </li>
        </ul>
      </div>
    </section>

    <section class="dmc-calc-section" aria-labelledby="dmc-blc-project-heading">
      <h2 id="dmc-blc-project-heading">Project</h2>
      <div class="dmc-calc-battery-grid">
        <div class="dmc-calc-field">
          <label for="dmc-blc-project-name">Project / device name</label>
          <input id="dmc-blc-project-name" type="text" placeholder="Example: Soil sensor v2" />
          <span class="dmc-calc-unit">Optional, not used in calculations.</span>
        </div>
      </div>
      <div class="dmc-calc-share-row" style="margin-top:0.5rem;">
        <button type="button" id="dmc-blc-copy-link" class="dmc-calc-button" disabled aria-describedby="dmc-blc-share-status">
          Copy shareable link
        </button>
        <input
          id="dmc-blc-share-url"
          type="text"
          placeholder="Project name required to enable sharing."
          readonly
        />
      </div>
      <div id="dmc-blc-share-status" class="dmc-calc-share-status">
        Enter a project name to enable sharing.
      </div>
    </section>

<!-- Battery configuration -->
    <section class="dmc-calc-section" aria-labelledby="dmc-blc-battery-heading">
      <h2 id="dmc-blc-battery-heading">Battery configuration</h2>
      <div class="dmc-calc-battery-grid">
        <div class="dmc-calc-field">
          <label for="dmc-blc-batt-chemistry">Battery chemistry</label>
          <select id="dmc-blc-batt-chemistry">
            <option value="">Generic flat (avg voltage)</option>
            <option value="generic_linear">Generic linear (min/max to 0 V)</option>
            <option value="alkaline">Alkaline (AA/AAA)</option>
            <option value="cr2032">Coin cell (CR2032)</option>
            <option value="liion">Li-ion (4.2-3.0 V)</option>
            <option value="lifepo4">LiFePO4 (3.6-2.5 V)</option>
            <option value="litc">Li-SOCl2 primary (3.6-2.5 V)</option>
          </select>
          <span class="dmc-calc-unit">Chemistry + min/max voltages control derating.</span>
        </div>

        <div class="dmc-calc-field">
          <label for="dmc-blc-num-cells">Number of cells (series)</label>
          <input id="dmc-blc-num-cells" type="number" min="1" step="1" />
          <span class="dmc-calc-unit">cells</span>
        </div>

        <div class="dmc-calc-field">
          <label for="dmc-blc-cell-capacity">Cell capacity</label>
          <input id="dmc-blc-cell-capacity" type="number" min="0" step="1" />
          <span class="dmc-calc-unit">mAh</span>
        </div>

        <div class="dmc-calc-field">
          <label for="dmc-blc-cell-voltage">Average cell voltage</label>
          <input id="dmc-blc-cell-voltage" type="number" min="0" step="0.0001" />
          <span class="dmc-calc-unit">V</span>
        </div>

        <div class="dmc-calc-field" data-chem-advanced>
          <label for="dmc-blc-batt-vmax">Cell max voltage (V)</label>
          <input id="dmc-blc-batt-vmax" type="number" min="0" step="0.01" />
          <span class="dmc-calc-unit">V/cell</span>
        </div>

        <div class="dmc-calc-field" data-chem-advanced>
          <label for="dmc-blc-batt-vmin">Cell min voltage (V)</label>
          <input id="dmc-blc-batt-vmin" type="number" min="0" step="0.01" />
          <span class="dmc-calc-unit">V/cell at cutoff</span>
        </div>
      </div>
      <p class="dmc-calc-muted">
        Pack energy is computed as: Pack_mWh = CellCapacity_mAh * AvgCellVoltage_V * NumCells.
      </p>
      <details open class="dmc-calc-collapsible" aria-labelledby="dmc-blc-chem-curve-summary">
        <summary><h2 id="dmc-blc-chem-curve-summary">Discharge curve &amp; pack stats</h2></summary>
        <div class="dmc-calc-chem-curve" aria-live="polite">
          <div class="dmc-calc-chem-curve-header">
            <div>
              <h3>Discharge curve preview</h3>
              <p class="dmc-calc-muted" style="margin: 0;">
                Normalized capacity (0% = fresh cell, 100% = fully discharged).
              </p>
            </div>
            <div class="dmc-calc-chem-curve-legend">
              <span id="dmc-blc-chem-curve-label">Select a chemistry to view its curve.</span>
              <span id="dmc-blc-chem-curve-stats"></span>
            </div>
          </div>
          <canvas
            id="dmc-blc-chem-curve"
            width="720"
            height="280"
            role="img"
            aria-label="Battery discharge curve visualization"
          ></canvas>
          <p id="dmc-blc-chem-curve-note" class="dmc-calc-chem-curve-note dmc-calc-muted"></p>
          <div class="dmc-calc-chem-curve-stats">
            <div>
              <span class="dmc-calc-chem-curve-stat-label">Pack energy max (mWh / Wh)</span>
              <span id="dmc-blc-pack-energy-full" class="dmc-calc-chem-curve-stat-value">&#8212;</span>
            </div>
            <div>
              <span class="dmc-calc-chem-curve-stat-label">Pack avg voltage</span>
              <span id="dmc-blc-pack-avg" class="dmc-calc-chem-curve-stat-value">&#8212;</span>
            </div>
            <div>
              <span class="dmc-calc-chem-curve-stat-label">Pack max voltage</span>
              <span id="dmc-blc-pack-max" class="dmc-calc-chem-curve-stat-value">&#8212;</span>
            </div>
            <div>
              <span class="dmc-calc-chem-curve-stat-label">Pack min voltage</span>
              <span id="dmc-blc-pack-min" class="dmc-calc-chem-curve-stat-value">&#8212;</span>
            </div>
            <div>
              <span class="dmc-calc-chem-curve-stat-label">Pack energy usable (mWh / Wh)</span>
              <span id="dmc-blc-pack-energy" class="dmc-calc-chem-curve-stat-value">&#8212;</span>
            </div>
            <div>
              <span class="dmc-calc-chem-curve-stat-label">Usable capacity fraction</span>
              <span id="dmc-blc-pack-usable-fraction" class="dmc-calc-chem-curve-stat-value">&#8212;</span>
            </div>
          </div>
        </div>
      </details>
    </section>

    <!-- Rails definition -->
    <section class="dmc-calc-section" aria-labelledby="dmc-blc-rails-heading">
      <details open class="dmc-calc-collapsible" aria-labelledby="dmc-blc-rails-heading">
        <summary><h2 id="dmc-blc-rails-heading">Power rails</h2></summary>
        <p class="dmc-calc-muted">
          Define each rail once, including its voltage, regulator model, and optional parent rail to
          model cascaded conversion. Use <strong>Switching (fixed)</strong> for a single efficiency point, <strong>Switching (2-point)</strong>
          for low/high efficiency versus current, and <strong>Linear (LDO)</strong> to enter quiescent current (Iq).
          Rails are treated as on by demand: Iq is applied only in modes where downstream load current is non-zero.
          The calculator also shows a nominal path efficiency back to the battery.
        </p>

        <div class="dmc-calc-table-wrapper">
          <table class="dmc-calc-table dmc-calc-rails-table" aria-describedby="dmc-blc-rails-heading">
            <thead>
              <tr>
                <th>Parent rail</th>
                <th>Rail name</th>
                <th>Volts</th>
                <th>Regulator</th>
                <th>Params</th>
                <th>Path Efficiency</th>
                <th>Notes</th>
                <th></th>
              </tr>
            </thead>
            <tbody id="dmc-blc-rails-tbody">
              <tr data-rail-row data-rail-id="battery">
                <td><select aria-label="Parent rail" data-rail-field="parent" disabled aria-disabled="true"><option value="">Battery (pack root)</option></select></td>
                <td><input type="text" value="Battery rail" aria-label="Rail name" readonly aria-readonly="true" data-rail-field="name" /></td>
                <td><input type="number" min="0" step="0.01" value="3.0" aria-label="Rail voltage" readonly aria-readonly="true" data-rail-field="voltage" /></td>
                <td>
                  <select id="eff-mode-battery" class="dmc-calc-rails-eff-mode-hidden" data-rail-field="eff-mode" aria-label="Regulator model" disabled aria-disabled="true">
                    <option value="switching-simple" selected></option>
                  </select>
                </td>
                <td class="dmc-calc-rails-eff-cell">
                  <span class="dmc-calc-muted">N/A</span>
                </td>
                <td><span data-rail-effective>&#8212; %</span></td>
                <td><input type="text" placeholder="Direct battery loads" aria-label="Rail notes" readonly aria-readonly="true" data-rail-field="notes" /></td>
                <td></td>
              </tr>
              <tr data-rail-row data-rail-id="sensor">
                <td><select aria-label="Parent rail" data-rail-field="parent"><option value="battery">Battery</option></select></td>
                <td><input type="text" value="Sensor rail" aria-label="Rail name" data-rail-field="name" /></td>
                <td><input type="number" min="0" step="0.01" aria-label="Rail voltage" data-rail-field="voltage" /></td>
                <td>
                  <select data-rail-field="eff-mode" aria-label="Regulator model">
                    <option value="switching-simple" selected>Switching (fixed eff.)</option>
                    <option value="switching-2pt">Switching (2-point eff.)</option>
                    <option value="linear">Linear (LDO)</option>
                  </select>
                </td>
                <td class="dmc-calc-rails-eff-cell">
                  <div class="dmc-calc-rails-eff-rows">
                    <div class="dmc-calc-rails-eff-row dmc-calc-rails-eff-simple-only">
                      <input type="number" min="0" max="100" step="1" aria-label="Stage efficiency (%)" inputmode="numeric" data-rail-field="efficiency" />
                      <span>%</span>
                    </div>
                    <div class="dmc-calc-rails-eff-row dmc-calc-rails-eff-adv" style="display: none;">
                      <span class="dmc-calc-rails-eff-label">Low</span>
                      <input type="number" min="0" max="100" step="1" aria-label="Low current efficiency (%)" inputmode="numeric" placeholder="%" data-rail-field="eff-low-pct" />
                      <span>% @</span>
                      <input type="number" min="0" step="0.000001" aria-label="Low current point (mA)" placeholder="mA" data-rail-field="eff-low-current" />
                      <span>mA</span>
                    </div>
                    <div class="dmc-calc-rails-eff-row dmc-calc-rails-eff-adv" style="display: none;">
                      <span class="dmc-calc-rails-eff-label">High</span>
                      <input type="number" min="0" max="100" step="1" aria-label="High current efficiency (%)" inputmode="numeric" placeholder="%" data-rail-field="eff-high-pct" />
                      <span>% @</span>
                      <input type="number" min="0" step="0.000001" aria-label="High current point (mA)" placeholder="mA" data-rail-field="eff-high-current" />
                      <span>mA</span>
                    </div>
                  </div>
                </td>
                <td><span data-rail-effective>&#8212; %</span></td>
                <td><input type="text" placeholder="e.g., ADC, sensor bias" aria-label="Rail notes" data-rail-field="notes" /></td>
                <td>
                  <button type="button" class="dmc-calc-button dmc-calc-secondary" data-remove-rail disabled aria-label="Remove rail">
                    <span aria-hidden="true">&times;</span>
                  </button>
                </td>
              </tr>
            <tr data-rail-row data-rail-id="transmitter">
              <td><select aria-label="Parent rail" data-rail-field="parent"><option value="battery">Battery</option></select></td>
              <td><input type="text" value="Transmitter rail" aria-label="Rail name" data-rail-field="name" /></td>
              <td><input type="number" min="0" step="0.01" aria-label="Rail voltage" data-rail-field="voltage" /></td>
              <td>
                <select data-rail-field="eff-mode" aria-label="Regulator model">
                  <option value="switching-simple" selected>Switching (fixed eff.)</option>
                  <option value="switching-2pt">Switching (2-point eff.)</option>
                  <option value="linear">Linear (LDO)</option>
                </select>
              </td>
              <td class="dmc-calc-rails-eff-cell">
                <div class="dmc-calc-rails-eff-rows">
                  <div class="dmc-calc-rails-eff-row dmc-calc-rails-eff-simple-only">
                    <input type="number" min="0" max="100" step="1" aria-label="Stage efficiency (%)" inputmode="numeric" data-rail-field="efficiency" />
                  </div>
                  <div class="dmc-calc-rails-eff-row dmc-calc-rails-eff-adv" style="display: none;">
                    <span>Low:</span>
                    <input type="number" min="0" max="100" step="1" aria-label="Low current efficiency (%)" inputmode="numeric" placeholder="%" data-rail-field="eff-low-pct" />
                    <span>@</span>
                    <input type="number" min="0" step="0.000001" aria-label="Low current point (mA)" placeholder="mA" data-rail-field="eff-low-current" />
                  </div>
                  <div class="dmc-calc-rails-eff-row dmc-calc-rails-eff-adv" style="display: none;">
                    <span>High:</span>
                    <input type="number" min="0" max="100" step="1" aria-label="High current efficiency (%)" inputmode="numeric" placeholder="%" data-rail-field="eff-high-pct" />
                    <span>@</span>
                    <input type="number" min="0" step="0.000001" aria-label="High current point (mA)" placeholder="mA" data-rail-field="eff-high-current" />
                  </div>
                </div>
              </td>
                <td><span data-rail-effective>&#8212; %</span></td>
                <td><input type="text" placeholder="e.g., PA boost" aria-label="Rail notes" data-rail-field="notes" /></td>
                <td>
                  <button type="button" class="dmc-calc-button dmc-calc-secondary" data-remove-rail aria-label="Remove rail">
                    <span aria-hidden="true">&times;</span>
                  </button>
                </td>
              </tr>
              <tr data-rail-row data-rail-id="receiver">
                <td><select aria-label="Parent rail" data-rail-field="parent"><option value="battery">Battery</option></select></td>
                <td><input type="text" value="Receiver rail" aria-label="Rail name" data-rail-field="name" /></td>
                <td><input type="number" min="0" step="0.01" aria-label="Rail voltage" data-rail-field="voltage" /></td>
                <td>
                  <select data-rail-field="eff-mode" class="dmc-calc-rails-eff-mode" aria-label="Regulator model">
                    <option value="switching-simple" selected>Switching (fixed eff.)</option>
                    <option value="switching-2pt">Switching (2-point eff.)</option>
                    <option value="linear">Linear (LDO)</option>
                  </select>
                </td>
                <td class="dmc-calc-rails-eff-cell">
                  <div class="dmc-calc-rails-eff-rows">
                    <div class="dmc-calc-rails-eff-row dmc-calc-rails-eff-simple-only">
                      <input type="number" min="0" max="100" step="1" aria-label="Stage efficiency (%)" inputmode="numeric" data-rail-field="efficiency" />
                      <span>%</span>
                    </div>
                    <div class="dmc-calc-rails-eff-row dmc-calc-rails-eff-adv" style="display: none;">
                      <span>Low (% @ mA):</span>
                      <input type="number" min="0" max="100" step="1" aria-label="Low current efficiency (%)" inputmode="numeric" placeholder="%" data-rail-field="eff-low-pct" />
                      <span>@</span>
                      <input type="number" min="0" step="0.000001" aria-label="Low current point (mA)" placeholder="mA" data-rail-field="eff-low-current" />
                    </div>
                    <div class="dmc-calc-rails-eff-row dmc-calc-rails-eff-adv" style="display: none;">
                      <span>High (% @ mA):</span>
                      <input type="number" min="0" max="100" step="1" aria-label="High current efficiency (%)" inputmode="numeric" placeholder="%" data-rail-field="eff-high-pct" />
                      <span>@</span>
                      <input type="number" min="0" step="0.000001" aria-label="High current point (mA)" placeholder="mA" data-rail-field="eff-high-current" />
                    </div>
                  </div>
                </td>
                <td><span data-rail-effective>&#8212; %</span></td>
                <td><input type="text" placeholder="e.g., LNA, RX path" aria-label="Rail notes" data-rail-field="notes" /></td>
                <td>
                  <button type="button" class="dmc-calc-button dmc-calc-secondary" data-remove-rail aria-label="Remove rail">
                    <span aria-hidden="true">&times;</span>
                  </button>
                </td>
              </tr>
              <tr data-rail-row data-rail-id="core">
                <td><select aria-label="Parent rail" data-rail-field="parent"><option value="battery">Battery</option></select></td>
                <td><input type="text" value="Core rail" aria-label="Rail name" data-rail-field="name" /></td>
                <td><input type="number" min="0" step="0.01" aria-label="Rail voltage" data-rail-field="voltage" /></td>
                <td>
                  <select data-rail-field="eff-mode" class="dmc-calc-rails-eff-mode" aria-label="Regulator model">
                    <option value="switching-simple" selected>Switching (fixed eff.)</option>
                    <option value="switching-2pt">Switching (2-point eff.)</option>
                    <option value="linear">Linear (LDO)</option>
                  </select>
                </td>
                <td class="dmc-calc-rails-eff-cell">
                  <div class="dmc-calc-rails-eff-rows">
                    <div class="dmc-calc-rails-eff-row dmc-calc-rails-eff-simple-only">
                      <input type="number" min="0" max="100" step="1" aria-label="Stage efficiency (%)" inputmode="numeric" data-rail-field="efficiency" />
                      <span>%</span>
                    </div>
                    <div class="dmc-calc-rails-eff-row dmc-calc-rails-eff-adv" style="display: none;">
                      <span>Low:</span>
                      <input type="number" min="0" max="100" step="1" aria-label="Low current efficiency (%)" inputmode="numeric" placeholder="%" data-rail-field="eff-low-pct" />
                      <span>@</span>
                      <input type="number" min="0" step="0.000001" aria-label="Low current point (mA)" placeholder="mA" data-rail-field="eff-low-current" />
                    </div>
                    <div class="dmc-calc-rails-eff-row dmc-calc-rails-eff-adv" style="display: none;">
                      <span>High:</span>
                      <input type="number" min="0" max="100" step="1" aria-label="High current efficiency (%)" inputmode="numeric" placeholder="%" data-rail-field="eff-high-pct" />
                      <span>@</span>
                      <input type="number" min="0" step="0.000001" aria-label="High current point (mA)" placeholder="mA" data-rail-field="eff-high-current" />
                    </div>
                  </div>
                </td>
                <td><span data-rail-effective>&#8212; %</span></td>
                <td><input type="text" placeholder="e.g., MCU core" aria-label="Rail notes" data-rail-field="notes" /></td>
                <td>
                  <button type="button" class="dmc-calc-button dmc-calc-secondary" data-remove-rail aria-label="Remove rail">
                    <span aria-hidden="true">&times;</span>
                  </button>
                </td>
              </tr>
              <tr data-rail-row data-rail-id="aux">
                <td><select aria-label="Parent rail" data-rail-field="parent"><option value="battery">Battery</option></select></td>
                <td><input type="text" value="Aux rail" aria-label="Rail name" data-rail-field="name" /></td>
                <td><input type="number" min="0" step="0.01" aria-label="Rail voltage" data-rail-field="voltage" /></td>
                <td>
                  <select data-rail-field="eff-mode" class="dmc-calc-rails-eff-mode" aria-label="Regulator model">
                    <option value="switching-simple" selected>Switching (fixed eff.)</option>
                    <option value="switching-2pt">Switching (2-point eff.)</option>
                    <option value="linear">Linear (LDO)</option>
                  </select>
                </td>
                <td class="dmc-calc-rails-eff-cell">
                  <div class="dmc-calc-rails-eff-rows">
                    <div class="dmc-calc-rails-eff-row dmc-calc-rails-eff-simple-only">
                      <input type="number" min="0" max="100" step="1" aria-label="Stage efficiency (%)" inputmode="numeric" data-rail-field="efficiency" />
                      <span>%</span>
                    </div>
                    <div class="dmc-calc-rails-eff-row dmc-calc-rails-eff-adv" style="display: none;">
                      <span>Low:</span>
                      <input type="number" min="0" max="100" step="1" aria-label="Low current efficiency (%)" inputmode="numeric" placeholder="%" data-rail-field="eff-low-pct" />
                      <span>@</span>
                      <input type="number" min="0" step="0.000001" aria-label="Low current point (mA)" placeholder="mA" data-rail-field="eff-low-current" />
                    </div>
                    <div class="dmc-calc-rails-eff-row dmc-calc-rails-eff-adv" style="display: none;">
                      <span>High:</span>
                      <input type="number" min="0" max="100" step="1" aria-label="High current efficiency (%)" inputmode="numeric" placeholder="%" data-rail-field="eff-high-pct" />
                      <span>@</span>
                      <input type="number" min="0" step="0.000001" aria-label="High current point (mA)" placeholder="mA" data-rail-field="eff-high-current" />
                    </div>
                  </div>
                </td>
                <td><span data-rail-effective>&#8212; %</span></td>
                <td><input type="text" placeholder="e.g., LEDs, misc" aria-label="Rail notes" data-rail-field="notes" /></td>
                <td>
                  <button type="button" class="dmc-calc-button dmc-calc-secondary" data-remove-rail aria-label="Remove rail">
                    <span aria-hidden="true">&times;</span>
                  </button>
                </td>
              </tr>
            </tbody>
          </table>
        </div>

        <div class="dmc-calc-modes-actions">
          <button type="button" id="dmc-blc-add-rail" class="dmc-calc-button">
            Add rail
          </button>
          <span class="dmc-calc-muted">
            Enter voltage and regulator parameters per rail so the calculator can translate per-mode currents into battery power.
          </span>
        </div>
      </details>
    </section>

    <!-- Loads definition -->
    <section class="dmc-calc-section" aria-labelledby="dmc-blc-loads-heading">
      <details open class="dmc-calc-collapsible" aria-labelledby="dmc-blc-loads-heading">
        <summary><h2 id="dmc-blc-loads-heading">Loads (peripherals)</h2></summary>
        <p class="dmc-calc-muted">
          Define generic loads such as MCU, sensor, transmitter, or receiver. Each load is powered from one of the
          rails above and appears as a column in the modes table.
        </p>

        <div class="dmc-calc-table-wrapper">
        <table class="dmc-calc-table dmc-calc-loads-table" aria-describedby="dmc-blc-loads-heading">
          <thead>
            <tr>
              <th>Load name</th>
              <th>Rail</th>
              <th>Notes</th>
                <th></th>
              </tr>
            </thead>
            <tbody id="dmc-blc-loads-tbody">
              <!-- Initial loads are seeded from rails in JavaScript -->
            </tbody>
          </table>
        </div>

        <div class="dmc-calc-modes-actions">
          <button type="button" id="dmc-blc-add-load" class="dmc-calc-button">
            Add load
          </button>
          <span class="dmc-calc-muted">
          Loads inherit voltage and cascaded efficiency from their rail; change the rail to move a load between rails.
          </span>
        </div>
      </details>
    </section>

    <section class="dmc-calc-section" aria-labelledby="dmc-blc-topology-heading">
      <details open class="dmc-calc-collapsible" aria-labelledby="dmc-blc-topology-heading">
        <summary><h2 id="dmc-blc-topology-heading">Block diagram</h2></summary>
        <div class="dmc-calc-topology">
          <svg id="dmc-blc-topology-svg" role="img" aria-label="Power rails and loads topology"></svg>
          <p class="dmc-calc-muted" style="margin-top: 0.4rem;">
            Diagram auto-generates from your rails (columns) and loads (final column). Parent rails feed child rails and loads.
          </p>
        </div>
      </details>
    </section>

    <!-- Modes and loads -->
    <section class="dmc-calc-section" aria-labelledby="dmc-blc-modes-heading">
      <details open class="dmc-calc-collapsible" aria-labelledby="dmc-blc-modes-heading">
        <summary><h2 id="dmc-blc-modes-heading">Modes, timing, and load currents</h2></summary>
        <p class="dmc-calc-muted">
          The <strong>first row (Idle)</strong> is always on and fills any time not used by other modes.
          Add additional modes such as Sensor sample, Transmitter burst, and Receiver listen by clicking &#8220;Add mode&#8221; below.
          Each mode specifies a current for each load during its active time; loads inherit voltage and efficiency from their rails above.
        </p>

      <div class="dmc-calc-table-wrapper">
        <table class="dmc-calc-table dmc-calc-modes-table" aria-describedby="dmc-blc-modes-heading">
          <thead id="dmc-blc-modes-thead"></thead>
          <tbody id="dmc-blc-modes-tbody"></tbody>
        </table>
      </div>

      <div class="dmc-calc-modes-actions">
        <button type="button" id="dmc-blc-add-mode" class="dmc-calc-button">
          Add mode
        </button>
        <span class="dmc-calc-muted">
          Modes share a single comparison period based on the longest configured period.
        </span>
      </div>
      <div id="dmc-blc-timing-warning" class="dmc-calc-warning" style="display:none;" role="status" aria-live="polite"></div>
      </details>
    </section>

    <!-- Results -->
    <section class="dmc-calc-section" aria-labelledby="dmc-blc-results-heading">
      <h2 id="dmc-blc-results-heading">Results</h2>
      <div class="dmc-calc-results-grid">
        <div class="dmc-calc-card">
          <h3>Average power</h3>
          <div class="dmc-calc-card-value" id="dmc-blc-avg-power-total">&#8212; uW</div>
          <div class="dmc-calc-card-sub">Time-weighted average across all modes.</div>
        </div>

        <div class="dmc-calc-card">
          <h3>Battery life (hours)</h3>
          <div class="dmc-calc-card-value" id="dmc-blc-life-hours">&#8212; h</div>
          <div class="dmc-calc-card-sub">Based on pack energy and average power.</div>
        </div>

        <div class="dmc-calc-card">
          <h3>Battery life (days / years)</h3>
          <div class="dmc-calc-card-value">
            <span id="dmc-blc-life-days">&#8212; days</span>,
            <span id="dmc-blc-life-years">&#8212; years</span>
          </div>
          <div class="dmc-calc-card-sub">Converted from hours for convenience.</div>
        </div>
      </div>
      <p class="dmc-calc-muted">
        Mode duty, average power, and contribution are shown per row in the modes table above. The chart
        below visualizes how much each mode contributes to the overall average power.
      </p>
      <div class="dmc-calc-mode-bars" aria-label="Mode contribution breakdown">
        <h3>Mode contributions</h3>
        <div id="dmc-blc-mode-bars-body" class="dmc-calc-mode-bars-body">
          <div class="dmc-calc-muted">
            Enter timing and currents above to see how each mode contributes to the total average power.
          </div>
        </div>
      </div>
    </section>

    <script id="dmc-blc-debug-payload" type="application/json" hidden></script>

<!-- Explanation -->
    <section class="dmc-calc-section">
      <div class="dmc-calc-explainer">
        <h2>How this calculator works (conceptually)</h2>
        <p><strong>Big picture</strong>: this is an estimator, not a simulator. It gives a defensible, first-order answer for &#8220;how long will my thing run?&#8221; and teaches how duty cycle, rails, and efficiency play together. Measure on hardware once you have a prototype.</p>
        <div class="dmc-calc-concepts-grid" style="margin-top:0.5rem;">
          <div class="dmc-calc-concept-card">
            <p class="dmc-calc-concept-name">1. Pack energy</p>
            <p class="dmc-calc-concept-detail">
              <em>Energy bucket</em> The model converts battery specs into one budget number:
              <code>Pack_mWh = CellCapacity_mAh * AvgCellVoltage_V * NumCells</code>. This is the full bucket before cutoff and
              chemistry derating.
            </p>
            <p class="dmc-calc-concept-detail">
              <em>How usable energy is estimated</em> For named chemistries with valid min/max cell voltage, the model applies a
              chemistry profile to compute a usable fraction and then uses
              <code>UsablePackEnergy_mWh = Pack_mWh * usable_capacity_fraction</code>. If chemistry or cutoff data is missing, it
              falls back to <code>usable_capacity_fraction = 1</code> instead of guessing.
            </p>
            <p class="dmc-calc-concept-detail">
              <em>Philosophy</em> This is a first-order planning model, not an electrochemical simulator. We intentionally keep one
              average-voltage energy bucket so design tradeoffs are easy to compare and assumptions stay visible.
            </p>
            <p class="dmc-calc-concept-detail">
              <em>Example</em> Two 2500 mAh alkaline cells at 1.3 V average give
              <code>Pack_mWh = 2500 * 1.3 * 2 = 6500 mWh</code>. If cutoff/chemistry gives
              <code>usable_capacity_fraction = 0.8</code>, usable energy is <code>5200 mWh</code>.
            </p>
          </div>

          <div class="dmc-calc-concept-card">
            <p class="dmc-calc-concept-name">2. Duty cycle</p>
            <p class="dmc-calc-concept-detail">
              Comparison window = longest non-idle period. Duty = <code>active_ms / (period_s * 1000)</code>. Idle duty is
              whatever time remains after non-idle modes.
            </p>
            <p class="dmc-calc-concept-detail">
              <em>Example</em> If a sensor sample runs for 250 ms every 60 s, then
              <code>Duty_sample = 250 / 60000 = 0.00417 = 0.417%</code>. If uplink runs 1200 ms every 900 s, then
              <code>Duty_uplink = 1200 / 900000 = 0.133%</code>. Idle gets the remaining time.
            </p>
          </div>

          <div class="dmc-calc-concept-card">
            <p class="dmc-calc-concept-name">3. Rail efficiency</p>
            <p class="dmc-calc-concept-detail">
              <em>Switching (fixed)</em> means one fixed efficiency for that rail: <code>efficiency = eff_pct / 100</code>. If you enter 90%,
              the model assumes about 10% of converter input power is lost as heat at all loads. <em>Switching (2-point)</em> means you enter two
              points from the regulator datasheet <em>Efficiency vs Output Current</em> graph at your expected VIN/VOUT:
              <code>(I_low, Eff_low)</code> and <code>(I_high, Eff_high)</code>. Below <code>I_low</code> the model uses
              <code>Eff_low</code>, above <code>I_high</code> it uses <code>Eff_high</code>, and between them it interpolates in
              log(current) so light-load and heavy-load behavior are both represented. Some datasheets use the Greek symbol
              <code>&eta;</code> for efficiency. <em>Linear (LDO)</em> uses <code>VIN/VOUT</code> behavior plus quiescent current:
              <code>P_in = V_in * (I_out + I_q)</code>.
            </p>
            <p class="dmc-calc-concept-detail">
              <em>Why it matters</em> Efficiency loss becomes heat, and that heat comes from your battery budget. A converter that
              is 90% efficient needs about 11% more input power than the load uses. At low currents, many converters get worse, so
              sleep-heavy products can lose more life than expected if you use one optimistic efficiency number.
            </p>
            <div class="dmc-calc-2pt-demo" role="img" aria-label="Two-point efficiency behavior with logarithmic current response">
              <svg viewBox="0 0 300 122" preserveAspectRatio="xMidYMid meet" aria-hidden="true">
                <rect x="0" y="0" width="300" height="122" fill="#ffffff"></rect>
                <line x1="34" y1="16" x2="34" y2="94" stroke="#c9cfdb" stroke-width="1"></line>
                <line x1="34" y1="94" x2="286" y2="94" stroke="#c9cfdb" stroke-width="1"></line>
                <line x1="78" y1="16" x2="78" y2="94" stroke="#e1e6f0" stroke-width="1"></line>
                <line x1="144" y1="16" x2="144" y2="94" stroke="#e1e6f0" stroke-width="1"></line>
                <line x1="212" y1="16" x2="212" y2="94" stroke="#e1e6f0" stroke-width="1"></line>
                <path d="M42 77 C58 77, 67 77, 74 76 C94 72, 116 61, 136 50 C164 37, 192 32, 220 31 C246 31, 265 31, 278 31" fill="none" stroke="#0057b8" stroke-width="2.4"></path>
                <circle cx="74" cy="76" r="4" fill="#0057b8"></circle>
                <circle cx="220" cy="31" r="4" fill="#0057b8"></circle>
                <line x1="74" y1="16" x2="74" y2="94" stroke="#8a94a8" stroke-dasharray="4 3" stroke-width="1"></line>
                <line x1="220" y1="16" x2="220" y2="94" stroke="#8a94a8" stroke-dasharray="4 3" stroke-width="1"></line>
                <text x="54" y="107" font-size="10.5" fill="#4a4a4a">Low current</text>
                <text x="198" y="107" font-size="10.5" fill="#4a4a4a">High current</text>
                <text x="8" y="23" font-size="10" fill="#666">Efficiency (%)</text>
                <text x="204" y="118" font-size="10" fill="#666">Current (mA, log-like)</text>
              </svg>
            </div>
          </div>

          <div class="dmc-calc-concept-card">
            <p class="dmc-calc-concept-name">4. Power per mode</p>
            <p class="dmc-calc-concept-detail">
              <em>Path efficiency</em> Multiply stage efficiencies up the parent chain to get <code>PathEfficiency</code>.
              <em>Per load</em> compute rail power with
              <code>RailPower_uW = RailVoltage_V * LoadCurrent_mA * 1000</code>; battery-side power is
              <code>BatteryPower_uW = RailPower_uW / PathEfficiency</code>. <em>Per mode</em> sum battery-side load powers:
              <code>ModePower_uW = sum(BatteryPower_uW)</code>.
            </p>
            <p class="dmc-calc-concept-detail">
              <em>Why it matters</em> Cascaded regulators stack losses. If one stage is 90% and the next is 90%, the path is
              <code>0.9 * 0.9 = 0.81</code>, so only 81% of battery power reaches the load. This is why “just add another rail”
              can reduce battery life more than expected.
            </p>
            <p class="dmc-calc-concept-detail">
              <em>Analogy</em> Think of power as water moved through hoses. Each regulator is a hose section with a leak. One small
              leak might be fine, but several leaks in series mean much less water reaches the plant at the end.
            </p>
            <p class="dmc-calc-concept-detail">
              <em>Example</em> A 3.3 V rail load at 2 mA is <code>3.3 * 2 * 1000 = 6600 uW</code>. If regulator path efficiency
              is 85%, battery-side power is <code>6600 / 0.85 = 7765 uW</code>.
            </p>
          </div>

          <div class="dmc-calc-concept-card">
            <p class="dmc-calc-concept-name">5. Time weighting &amp; life</p>
            <p class="dmc-calc-concept-detail">
              <em>Weighting</em> <code>ModeAveragePower_uW = ModePower_uW * DutyFraction</code>; total
              <code>TotalAveragePower_uW = sum(ModeAveragePower_uW)</code>. <em>Life</em>
              <code>Life_h = UsablePackEnergy_mWh * 1000 / TotalAveragePower_uW</code>; UI also shows days/years.
            </p>
            <p class="dmc-calc-concept-detail">
              <em>Example</em> If sleep is 100 uW at 99% duty and active is 50,000 uW at 1% duty, then
              <code>TotalAveragePower_uW = (100 * 0.99) + (50000 * 0.01) = 599 uW</code>. With 6000 mWh usable energy,
              <code>Life_h = 6000 * 1000 / 599 = 10017 h</code> (about 417 days).
            </p>
          </div>
        </div>
<div class="dmc-calc-concepts-grid">
        <div class="dmc-calc-concept-card">
          <p class="dmc-calc-concept-name">Battery chemistry &amp; capacity</p>
          <p class="dmc-calc-concept-detail">
            <em>What it is</em>
            The chemistry (alkaline, Li-ion, coin cell, etc.) sets the usable voltage range and how the cell behaves as it discharges.
            Capacity (mAh) tells you how much charge the battery can deliver at a gentle load.
          </p>
          <p class="dmc-calc-concept-detail">
            <em>Why it matters</em>
            The same device can run for weeks on a tiny coin cell or years on a larger primary lithium pack. Chemistry also affects
            self‑discharge, low‑temperature behavior, and how much of the cell’s capacity is usable at higher currents.
          </p>
          <p class="dmc-calc-concept-detail">
            <em>How to use it here</em>
            Pick a chemistry that roughly matches your cell type. Use datasheet or application‑note values for capacity and voltage.
            Remember this tool assumes “average” voltage; it does not simulate detailed discharge curves.
          </p>
          <p class="dmc-calc-concept-detail">
            <em>What to optimize</em>
            For long life, bigger is not always better. A slightly larger cell that lets your converter operate in a sweet spot
            (good efficiency, enough headroom) often buys more life than just stacking cells at random.
          </p>
        </div>

        <div class="dmc-calc-concept-card">
          <p class="dmc-calc-concept-name">Pack voltage &amp; rails</p>
          <p class="dmc-calc-concept-detail">
            <em>What it is</em>
            Pack voltage is the battery side. Rails are the local supply voltages your circuits actually use (3.3 V digital, 5 V sensor
            bias, 1.8 V core, and so on). Regulators connect the pack to each rail.
          </p>
          <p class="dmc-calc-concept-detail">
            <em>Why it matters</em>
            Every time you convert from the pack to a rail you lose some power in the regulator. Cascaded rails multiply those losses.
            A “simple” rail with 90% efficiency wastes 10% of its input power as heat.
          </p>
          <p class="dmc-calc-concept-detail">
            <em>How to use it here</em>
            Define one row per regulated rail. Use <strong>Switching (fixed eff.)</strong> when you only know one converter efficiency,
            <strong>Switching (2-point eff.)</strong> when data sheets give light-load and heavy-load points, and
            <strong>Linear (LDO)</strong> when you know VIN, VOUT, and quiescent current (Iq).
          </p>
          <p class="dmc-calc-concept-detail">
            <em>What to optimize</em>
            Avoid unnecessary rails and unnecessary cascades. For example, powering a low‑current MCU from a linear regulator off a
            switching pre‑regulator can be fine, but putting a linear on top of another linear wastes a lot of energy.
          </p>
        </div>

        <div class="dmc-calc-concept-card">
          <p class="dmc-calc-concept-name">2-point efficiency model</p>
          <p class="dmc-calc-concept-detail">
            <em>What it is</em>
            Real DC‑DC converters are not flat. They are usually less efficient at very light load, peak somewhere in the middle,
            and droop again near the current limit. Measuring or estimating the full curve is hard.
          </p>
          <p class="dmc-calc-concept-detail">
            <em>Why it matters</em>
            Many IoT devices spend most of their life sipping microamps, then wake up to tens of milliamps briefly. A single
            “typical” efficiency value hides how different those regimes are.
          </p>
          <p class="dmc-calc-concept-detail">
            <em>How to use it here</em>
            Enter a “Low” point (efficiency and current) and a “High” point. The calculator interpolates between them on a log
            current axis so you get a reasonable effective efficiency for each mode’s load current without a full curve.
          </p>
          <p class="dmc-calc-concept-detail">
            <em>What to optimize</em>
            When choosing converters, pay attention to efficiency near your dominant operating currents, not just the headline peak.
            A part that is fantastic at 500 mA but poor at 10 µA may be the wrong choice for a sleepy sensor node.
          </p>
        </div>

        <div class="dmc-calc-concept-card">
          <p class="dmc-calc-concept-name">Modes &amp; duty cycle</p>
          <p class="dmc-calc-concept-detail">
            <em>What it is</em>
            A mode is a named behavior: “Idle,” “Sense,” “Transmit,” “OTA update,” and so on. Each mode has a period (how often it
            happens) and an active time (how long it lasts when it happens).
          </p>
          <p class="dmc-calc-concept-detail">
            <em>Why it matters</em>
            Average power is dominated by the product of power and duty cycle. A very expensive‑looking transmit burst that happens
            for 2 ms once per minute can cost less energy than a “tiny” background current that flows all the time.
          </p>
          <p class="dmc-calc-concept-detail">
            <em>How to use it here</em>
            Enter realistic periods and active times for each behavior. You can select timing units per row
            (ms, s, m, h, d), and the duty column is computed for you from the effective values.
            OTA‑style events can be modeled with long periods (hours, days, months) and finite active times.
          </p>
          <p class="dmc-calc-concept-detail">
            <em>What to optimize</em>
            Design your firmware so that the system spends most of its life in the lowest‑power mode possible. Shorten active time,
            reduce how often expensive modes run, and move work into batch operations instead of frequent small bursts.
          </p>
        </div>

        <div class="dmc-calc-concept-card">
          <p class="dmc-calc-concept-name">Idle mode &amp; background current</p>
          <p class="dmc-calc-concept-detail">
            <em>What it is</em>
            “Idle” is the mode where nothing interesting happens: MCU in sleep, radios off, only keep‑alive circuits running.
            The calculator treats idle specially and fills any time that is not used by other modes.
          </p>
          <p class="dmc-calc-concept-detail">
            <em>Why it matters</em>
            In many IoT designs, idle dominates energy use. Shaving microamps off idle current can extend life more than tweaking
            a high‑power burst that only happens occasionally.
          </p>
          <p class="dmc-calc-concept-detail">
            <em>How to use it here</em>
            The first mode row is fixed as Idle and cannot be removed. Put your sleep/background currents in that row;
            its timing is auto-computed as whatever time remains after non-idle modes.
          </p>
          <p class="dmc-calc-concept-detail">
            <em>What to optimize</em>
            Turn off unneeded clocks and peripherals, use deep‑sleep states where possible, and make sure regulators are still
            efficient at your idle currents. Datasheet “off currents” for sensors and radios are often surprisingly high.
          </p>
        </div>

        <div class="dmc-calc-concept-card">
          <p class="dmc-calc-concept-name">Loads &amp; current estimates</p>
          <p class="dmc-calc-concept-detail">
            <em>What it is</em>
            Loads are the things that draw current on each rail: MCU, radio, sensor front‑end, LEDs, USB, buzzers, and so on. Each
            load can be active or mostly off depending on the mode.
          </p>
          <p class="dmc-calc-concept-detail">
            <em>Why it matters</em>
            Mode current is rarely just “one number.” Splitting by load lets you see which pieces dominate energy use, and how
            moving a load to a different rail or changing hardware affects the whole system.
          </p>
          <p class="dmc-calc-concept-detail">
            <em>How to use it here</em>
            Create a load per major block and assign it to a rail. For each mode, enter the current that block draws while the
            mode is active. Use data sheets, evaluation boards, or quick bench measurements as a starting point.
          </p>
          <p class="dmc-calc-concept-detail">
            <em>What to optimize</em>
            Look for loads that are on in many modes but do not always need to be. Can a sensor be duty‑cycled? Can LEDs flash more
            briefly? Can a radio use a lower TX power in some modes?
          </p>
        </div>

        <div class="dmc-calc-concept-card">
          <p class="dmc-calc-concept-name">Estimator vs. real hardware</p>
          <p class="dmc-calc-concept-detail">
            <em>What it is</em>
            A structured way to do the back‑of‑the‑envelope math you would otherwise keep in a spreadsheet or notebook. It does not
            know about temperature, aging, or detailed battery curves.
          </p>
          <p class="dmc-calc-concept-detail">
            <em>Why it matters</em>
            The goal is to be “right enough” to compare designs and guide experiments: choose between chemistries, rail topologies,
            firmware strategies, and component options before you build hardware.
          </p>
          <p class="dmc-calc-concept-detail">
            <em>How to use it here</em>
            Explore “what if?” questions: What if the radio wakes up twice as often? What if I change the sensor regulator from an
            LDO to a buck? How much life do I lose if my idle current doubles?
          </p>
          <p class="dmc-calc-concept-detail">
            <em>What to verify</em>
            Once you have a prototype, measure currents for each mode and update the model. If estimates and measurements disagree
            by a lot, that is a great learning opportunity—look for missing loads, sleep bugs, and efficiency assumptions.
          </p>
        </div>
      </div>
    </section>
  </div>



<div class="wp-block-group alignwide has-custom-light-blue-background-color has-background is-layout-flow wp-container-core-group-is-layout-dbd34961 wp-block-group-is-layout-flow" style="border-radius:20px;margin-top:var(--wp--preset--spacing--50);margin-bottom:var(--wp--preset--spacing--50);padding-top:var(--wp--preset--spacing--50);padding-right:0;padding-bottom:var(--wp--preset--spacing--50);padding-left:0">
<div class="wp-block-columns alignwide are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-43efaee5 wp-block-columns-is-layout-flex" style="padding-right:var(--wp--preset--spacing--60);padding-left:var(--wp--preset--spacing--60)">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:85%">
<h3 class="wp-block-heading has-text-align-left" id="h-have-an-upcoming-project-dmc-can-help-you-take-the-next-step"><strong>Ready to Maximize Battery Performance?</strong> See How DMC Can Get You Started.</h3>



<p class="has-text-align-left wp-block-paragraph" id="h-need-help-turning-ideas-into-outcomes-automation-project-to-the-next-level-contact-us-today-to-learn-more-about-our-solutions-and-how-we-can-help-you-achieve-your-goals">DMC can help optimize battery-powered products with system design. Learn more about how our <a href="https://static.dmcinfo.com/services/embedded-development-and-embedded-programming/" data-type="page" data-id="431">Embedded</a> team can help with your battery functions.</p>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:15%">
<div class="wp-block-buttons is-horizontal is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-2236275c wp-block-buttons-is-layout-flex">
<div class="wp-block-button is-style-fill"><a class="wp-block-button__link has-base-contrast-color has-text-color has-link-color wp-element-button" href="https://static.dmcinfo.com/contact/">Contact Us</a></div>
</div>
</div>
</div>
</div>
<p>The post <a href="https://static.dmcinfo.com/blog/41922/battery-life-calculator/">Battery Life Calculator</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>9 Things to Consider When Developing Consumer Electronics</title>
		<link>https://static.dmcinfo.com/blog/36579/9-things-to-consider-when-developing-consumer-electronics/</link>
		
		<dc:creator><![CDATA[DMC]]></dc:creator>
		<pubDate>Tue, 25 Nov 2025 21:35:21 +0000</pubDate>
				<category><![CDATA[Embedded Development & Programming]]></category>
		<category><![CDATA[Product Development]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/?p=36579</guid>

					<description><![CDATA[<p>Developing a consumer-grade electronic device is an exciting yet significant undertaking, and it can be an intimidating space to navigate on your own. As both an engineer and consultant in the embedded systems space, I’ve put together a list of personal insights that just might save your project from some common, unseen pitfalls. This list [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/36579/9-things-to-consider-when-developing-consumer-electronics/">9 Things to Consider When Developing Consumer Electronics</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Developing a consumer-grade electronic device is an exciting yet significant undertaking, and it can be an intimidating space to navigate on your own. As both an engineer and consultant in the embedded systems space, I’ve put together a list of personal insights that just might save your project from some common, unseen pitfalls. This list isn’t comprehensive by any means (I wish it were that easy), but hopefully it will help guide your project to success.</p>



<h2 id="h-1-fail-fast-and-fail-often" class="wp-block-heading">1. Fail Fast and Fail Often</h2>



<p class="wp-block-paragraph">A classic engineering motto. No matter how precious your product may be, it’s always best to push it to its limits and see where improvements or fixes can be made. Be sure to include testing in your timeline, as unforeseen issues are bound to arise when developing products of all types. Having a dedicated engineering team for product design, testing and planning can be an invaluable addition, as you can expect your product to undergo fewer iterations, streamline the process, and ultimately save yourself both time and money.<a id="_msocom_1"></a></p>



<h2 id="h-2-consider-support-for-your-users" class="wp-block-heading">2. Consider Support for Your Users</h2>



<p class="wp-block-paragraph">It’s very easy to get caught up in the excitement of developing a new product. So much so that it’s challenging to anticipate your customers’ needs once your product is in their hands. Support can look like replacing or repairing units, handling support cases, implementing firmware updates for quality of life, and a plethora of other tasks if IoT is involved. If you find yourself lacking the spare hands to tackle support requests, you always have the option to outsource work, even if temporary.</p>



<h2 id="h-3-backup-your-files" class="wp-block-heading">3. Backup Your Files</h2>



<p class="wp-block-paragraph">As a contractor, I’ve heard many horror stories of clients having lost their precious source code. Your future self will be so grateful that you took the extra precaution to keep the fruits of yesterday’s labor safe. This can apply to many different types of files: CAD, PCB design files, documentation, software/firmware, and much more. At DMC, we heavily utilize <a href="https://about.gitlab.com/">GitLab</a> to track development and releases, but there are many other platforms to choose from. Once you adopt version control, long gone are the days of file names like “source files (final) (2) (fixed).zip”.</p>



<h2 id="h-4-identify-your-needs-for-internal-teams" class="wp-block-heading">4. Identify Your Needs for Internal Teams</h2>



<p class="wp-block-paragraph">Depending on the intricacy of your product, you may need to employ dedicated teams to cover the different scopes involved. These teams may be involved with mechanical design, electrical design, firmware, backend software, and much more. To tie all these teams together, a project manager is essential for cohesion between teams.</p>



<h2 id="h-5-what-does-user-experience-look-like" class="wp-block-heading">5. What Does User Experience Look Like?</h2>



<p class="wp-block-paragraph">If a user needs to install your device, how can you simplify the process and minimize frustration? If your system is complex with multiple moving pieces, what user feedback is there to inform customers of proper use? The nature of user interaction varies widely from one product to another, but a polished and intuitive design is the ultimate driver of user satisfaction.</p>



<h2 id="h-6-determine-your-goals-for-production" class="wp-block-heading">6. Determine Your Goals for Production</h2>



<p class="wp-block-paragraph">Find a unique balance between the cost per unit in materials, the cost for assembly, and components used. Optimizing these aspects will have a significant impact on the profitability and success of your product. 3D printing is fantastic for highly customized parts, but terrible for large-scale production. Drop-in off-the-shelf components may be a breeze to work with but may incur significantly higher production costs than a fully custom solution.</p>



<h2 id="h-7-do-what-you-can-to-simplify-assembly" class="wp-block-heading">7. Do What You Can to Simplify Assembly</h2>



<p class="wp-block-paragraph">Assembly costs for a physical product can be a big budgetary blind spot. A robust and visually elegant design can still be one that is awkward to assemble, incurring exponential assembly costs. Whether you are assembling in-house or using a contractor, designing your product for ease of assembly will save you time and money in the long run.</p>



<h2 id="h-8-what-technologies-are-associated-with-your-niche" class="wp-block-heading">8. What Technologies Are Associated With Your Niche?</h2>



<p class="wp-block-paragraph">If you’re serving a high-tech market, you need to keep up with the latest technological advancements. If you’re entering a market that is standardized in antiquity, you’ll need to be familiar with the nuances and pitfalls of its technology to ensure the success of your device. If you and your team lack the technical know-how, outsourcing is always an option to satisfy the needs of your niche, whether that is getting a second opinion or completely outsourcing a given aspect of your product’s development.</p>



<h2 id="h-9-does-your-device-need-any-certification-before-it-can-hit-the-shelves" class="wp-block-heading">9. Does Your Device Need Any Certification Before It Can Hit the Shelves?</h2>



<p class="wp-block-paragraph">Many products need to be up-to-snuff with different regulatory bodies. If you aren’t sure what certifications you may need, looking at what your competitors are trying to meet is always a good starting point. Some regulatory bodies I have worked with are involved in communications and safety regulations, like the FCC and the CSA. Having a more intimate knowledge of the goings-on of these tests will ensure your device surpasses its requirements.<a id="_msocom_1"></a></p>



<h2 id="h-main-takeaways" class="wp-block-heading">Main Takeaways</h2>



<p class="wp-block-paragraph">While this list is certainly not comprehensive, it hopefully got some gears turning. Knowing all the unknowns is unrealistic when you’re at the starting line, but you don’t have to be alone on your journey. DMC offers a wide range of services to help bring your product to life, from the idea’s initial conception to the final ‘IT’S ALIIIVVEE!’ moment.</p>



<div class="wp-block-group alignwide has-custom-light-blue-background-color has-background is-layout-flow wp-container-core-group-is-layout-dbd34961 wp-block-group-is-layout-flow" style="border-radius:20px;margin-top:var(--wp--preset--spacing--50);margin-bottom:var(--wp--preset--spacing--50);padding-top:var(--wp--preset--spacing--50);padding-right:0;padding-bottom:var(--wp--preset--spacing--50);padding-left:0">
<div class="wp-block-columns alignwide are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-43efaee5 wp-block-columns-is-layout-flex" style="padding-right:var(--wp--preset--spacing--60);padding-left:var(--wp--preset--spacing--60)">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:85%">
<h3 class="wp-block-heading has-text-align-left" id="h-have-an-upcoming-project-dmc-can-help-you-take-the-next-step">Ready to Enhance Your Consumer Electronics Product?</h3>



<p class="has-text-align-left wp-block-paragraph" id="h-need-help-turning-ideas-into-outcomes-automation-project-to-the-next-level-contact-us-today-to-learn-more-about-our-solutions-and-how-we-can-help-you-achieve-your-goals">DMC&#8217;s <a href="https://static.dmcinfo.com/services/embedded-development-and-embedded-programming/" data-type="page" data-id="431">Embedded</a> experts bring cross-disciplinary capabilities to every stage of development. Discover our <a href="https://static.dmcinfo.com/services/embedded-development-and-embedded-programming/product-development/" data-type="page" data-id="629">Product Development</a> solutions today!</p>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:15%">
<div class="wp-block-buttons is-horizontal is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-2236275c wp-block-buttons-is-layout-flex">
<div class="wp-block-button is-style-fill"><a class="wp-block-button__link has-base-contrast-color has-text-color has-link-color wp-element-button" href="https://static.dmcinfo.com/contact/">Contact Us</a></div>
</div>
</div>
</div>
</div>
<p>The post <a href="https://static.dmcinfo.com/blog/36579/9-things-to-consider-when-developing-consumer-electronics/">9 Things to Consider When Developing Consumer Electronics</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Partnering with CardMill and Beyond Design to Bring a Game-Changing Product to Market</title>
		<link>https://static.dmcinfo.com/blog/39769/partnering-with-cardmill-and-beyond-design-to-bring-a-game-changing-product-to-market/</link>
		
		<dc:creator><![CDATA[DMC]]></dc:creator>
		<pubDate>Tue, 11 Nov 2025 22:50:45 +0000</pubDate>
				<category><![CDATA[Embedded Development & Programming]]></category>
		<category><![CDATA[Product Development]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/?p=39769</guid>

					<description><![CDATA[<p>DMC is excited to collaborate with CardMill and Beyond Design to bring a powerful new card sorting machine from prototype to production. This partnership represents a major milestone for CardMill, and we’re proud to contribute our engineering expertise to help make it happen. As a Chicago-based engineering firm specializing in embedded systems, industrial automation, and [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/39769/partnering-with-cardmill-and-beyond-design-to-bring-a-game-changing-product-to-market/">Partnering with CardMill and Beyond Design to Bring a Game-Changing Product to Market</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">DMC is excited to collaborate with <a href="https://www.cardmill.com/" target="_blank" rel="noreferrer noopener">CardMill</a> and <a href="https://www.beyonddesign.com/" target="_blank" rel="noreferrer noopener">Beyond Design</a> to bring a powerful new card sorting machine from prototype to production. This partnership represents a major milestone for CardMill, and we’re proud to contribute our engineering expertise to help make it happen.</p>



<p class="wp-block-paragraph">As a Chicago-based engineering firm specializing in embedded systems, industrial automation, and hardware-software integration, DMC has completed more than 10,000 projects across 40 countries. Our team is now focused on refining the motion systems and embedded intelligence that drive CardMill’s high-speed scanning and sorting capabilities.</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 has-custom-border"><img decoding="async" width="925" height="700" data-id="39771" src="https://static.dmcinfo.com/wp-content/uploads/2025/11/CardMill-TCG-scanner-and-sorter1.png" alt="DMC partners with CardMill and Beyond Design" class="wp-image-39771" style="border-radius:20px" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/11/CardMill-TCG-scanner-and-sorter1.png 925w, https://static.dmcinfo.com/wp-content/uploads/2025/11/CardMill-TCG-scanner-and-sorter1-300x227.png 300w, https://static.dmcinfo.com/wp-content/uploads/2025/11/CardMill-TCG-scanner-and-sorter1-768x581.png 768w" sizes="(max-width: 925px) 100vw, 925px" /></figure>



<figure class="wp-block-image size-large has-custom-border"><img decoding="async" width="925" height="700" data-id="39772" src="https://static.dmcinfo.com/wp-content/uploads/2025/11/CardMill-TCG-scanner-and-sorter2.png" alt="DMC partners with Beyond Design on CardMill Project" class="wp-image-39772" style="border-radius:20px" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/11/CardMill-TCG-scanner-and-sorter2.png 925w, https://static.dmcinfo.com/wp-content/uploads/2025/11/CardMill-TCG-scanner-and-sorter2-300x227.png 300w, https://static.dmcinfo.com/wp-content/uploads/2025/11/CardMill-TCG-scanner-and-sorter2-768x581.png 768w" sizes="(max-width: 925px) 100vw, 925px" /></figure>
</figure>



<p class="wp-block-paragraph">We’re working alongside Beyond Design, a long-time collaborator with deep expertise in industrial design and user experience. Together, we form a synchronized team that’s fully integrated into CardMill’s development process.</p>



<h2 id="h-engineering-for-performance-and-scalability" class="wp-block-heading">Engineering for Performance and Scalability</h2>



<p class="wp-block-paragraph">We’re currently focused on refining the core mechanics that make CardMill powerful and reliable:</p>



<ul class="wp-block-list">
<li>Optimizing motion systems for smooth, consistent card movement</li>



<li>Enhancing tray and feeder design for improved capacity and flow</li>



<li>Evaluating cameras, motors, and processors to boost speed and reliability</li>



<li>Strengthening alignment and durability for long-term performance</li>
</ul>



<p class="wp-block-paragraph">DMC and Beyond Design are also helping CardMill evaluate manufacturing partners to support tooling, pilot builds, and full-scale production. With over 60 years of combined experience, our teams are guiding the product toward a scalable and efficient manufacturing process.</p>



<h2 id="h-built-for-collectors-designed-to-last" class="wp-block-heading">Built for Collectors, Designed to Last</h2>



<p class="wp-block-paragraph">CardMill’s mission is to make high-performance card sorting accessible to everyday collectors. With DMC and Beyond Design leading the next phase, we’re confident the final product will deliver on that promise. The result will be an affordable, all-in-one scanner and sorter that’s built to last.</p>



<p class="wp-block-paragraph">We’re proud to be part of this journey and look forward to sharing more updates as we move closer to delivery.</p>



<div class="wp-block-group alignwide has-custom-light-blue-background-color has-background is-layout-flow wp-container-core-group-is-layout-dbd34961 wp-block-group-is-layout-flow" style="border-radius:20px;margin-top:var(--wp--preset--spacing--50);margin-bottom:var(--wp--preset--spacing--50);padding-top:var(--wp--preset--spacing--50);padding-right:0;padding-bottom:var(--wp--preset--spacing--50);padding-left:0">
<div class="wp-block-columns alignwide are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-43efaee5 wp-block-columns-is-layout-flex" style="padding-right:var(--wp--preset--spacing--60);padding-left:var(--wp--preset--spacing--60)">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:85%">
<h3 class="wp-block-heading has-text-align-left" id="h-have-an-upcoming-project-dmc-can-help-you-take-the-next-step"><strong><strong>Bring Complex Mechatronic Prototypes to Scalable Production</strong></strong>.</h3>



<p class="has-text-align-left wp-block-paragraph" id="h-need-help-turning-ideas-into-outcomes-automation-project-to-the-next-level-contact-us-today-to-learn-more-about-our-solutions-and-how-we-can-help-you-achieve-your-goals">Discover our <a href="https://static.dmcinfo.com/services/embedded-development-and-embedded-programming/" data-type="page" data-id="431">Embedded Development</a> solutions for your <a href="https://static.dmcinfo.com/services/manufacturing-automation-and-intelligence/motion-control-engineering-and-servo-systems/" data-type="page" data-id="479">motion control</a>, hardware-software integration, and production-ready product development goals.</p>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:15%">
<div class="wp-block-buttons is-horizontal is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-2236275c wp-block-buttons-is-layout-flex">
<div class="wp-block-button is-style-fill"><a class="wp-block-button__link has-base-contrast-color has-text-color has-link-color wp-element-button" href="https://static.dmcinfo.com/contact/">Contact Us</a></div>
</div>
</div>
</div>
</div>
<p>The post <a href="https://static.dmcinfo.com/blog/39769/partnering-with-cardmill-and-beyond-design-to-bring-a-game-changing-product-to-market/">Partnering with CardMill and Beyond Design to Bring a Game-Changing Product to Market</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Beckhoff XPlanar &#038; XTS</title>
		<link>https://static.dmcinfo.com/blog/18332/beckhoff-xplanar-xts/</link>
		
		<dc:creator><![CDATA[DMC]]></dc:creator>
		<pubDate>Thu, 11 Aug 2022 09:35:59 +0000</pubDate>
				<category><![CDATA[Beckhoff PLC]]></category>
		<category><![CDATA[Manufacturing Automation & Intelligence]]></category>
		<category><![CDATA[PLC]]></category>
		<category><![CDATA[Product Development]]></category>
		<category><![CDATA[Beckhoff]]></category>
		<category><![CDATA[XPlanar]]></category>
		<category><![CDATA[XTS]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/18332/beckhoff-xplanar-xts/</guid>

					<description><![CDATA[<p>Earlier this year, Mike Rauch and Chris Mauban of Beckhoff&#160;were kind enough to host us at their Chicago (Woodridge, IL) office to show off some live demos that showcase the latest updates to XPlanar® and the eXtended Transport System® (XTS®).&#160; XPlanar Beckhoff has generated quite a buzz with their new XPlanar system — taking the [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/18332/beckhoff-xplanar-xts/">Beckhoff XPlanar &#038; XTS</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Earlier this year, Mike Rauch and Chris Mauban of <a href="https://www.beckhoff.com/en-us/" target="_blank">Beckhoff</a>&nbsp;were kind enough to host us at their Chicago (Woodridge, IL) office to show off some live demos that showcase the latest updates to XPlanar® and the eXtended Transport System® (XTS®).&nbsp;</p>



<h2 class="wp-block-heading" id="h-xplanar">XPlanar</h2>



<p class="wp-block-paragraph">Beckhoff has generated quite a buzz with their new <a href="https://www.beckhoff.com/en-us/products/motion/xplanar-planar-motor-system/" target="_blank">XPlanar system</a> — taking the ability to move product off a conveyor or track and, instead, bringing it to a magnetic tile system with movers that fly above the surface with 6 degrees of freedom.</p>


<div data-oembed-url="https://www.youtube.com/watch?v=On_QL8znZHg*">
<div style="left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.25%;"><iframe allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture;" allowfullscreen="" scrolling="no" src="https://www.youtube.com/embed/On_QL8znZHg?rel=0" style="top: 0; left: 0; width: 100%; height: 100%; position: absolute; border: 0;"></iframe></div>
</div>


<p class="wp-block-paragraph">&nbsp;</p>



<p class="wp-block-paragraph">New applications and ways to apply the freedom provided by XPlanar are still being discovered; high-end assembly, pharmaceuticals, and laboratory/life science automation are among the popular use cases.</p>



<p class="wp-block-paragraph">The XPlanar movers float and fly above tiles in a contactless manner. They allow two dimensional (X-Y) freedom of movement but can also move up and down in the Z-axis up to 5 mm. The tiles they travel across can be mounted at 90 degree angles or even upside down for some crazy creativity.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/xplanar-tile.png" alt="XPlanar Tile"/></figure>



<p class="wp-block-paragraph"><p style="text-align: center;"><em>XPlanar Tile</em></p></p>



<p class="wp-block-paragraph">Each mover can travel independently, allowing a lot of parallel multi-tasking and efficiency. They can also spin at up to 600 RPM, acting as a mixer or centrifuge (as shown below).</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/XPlanar-360-mover-rotation-centrifuge.gif" alt="Mixer or Centrifugre"/></figure>



<p class="wp-block-paragraph"><p align="center"><strong>Mover Types</strong></p></p>



<p class="wp-block-paragraph"><em>Note: the variants, speeds, payloads, surfaces, and dimensions show specifications that represent the maximum values which can be reached. Movers can be grouped to increase the total payload.</em></p>



<p class="wp-block-paragraph"><p align="center"><strong>APM4220-0000-0000 | XPlanar mover, 0.4 kg payload</strong></p></p>



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



<p class="wp-block-paragraph">This is the smallest mover (about 4.5 inches squared) in the APM4xxx family and is compatible with all tiles of the type APS4xxx. The aluminum body is hard coated and can move at speeds up to 2 meters/second. This mover handles small, lightweight products (up to 0.4 kg) and can be used in bidirectional operation.</p>



<p class="wp-block-paragraph"><p style="text-align: center;"><b>APM4221-0000-0000 | XPlanar mover, 1.0 kg payload</b></p></p>



<p class="wp-block-paragraph"><p align="center"></p></p>



<p class="wp-block-paragraph">This mover is the second largest (about 5 inches squared) in the APM4xxx family and is very similar to the APM4220 other than its slightly larger size and an increase in payload (up to 1.0kg).</p>



<p class="wp-block-paragraph"><p align="center"><strong>APM4330-0000-0000 | XPlanar mover, 1.5 kg payload</strong></p></p>



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



<p class="wp-block-paragraph">This mover is the all-rounder (about 6.1 inches squared) of the APM4xxx family and is also very similar to the APM4221. With a payload capacity of 1.5 kilograms, this mover is ideally suited for use as a universal tool to handle a wide variety of products. It is available in a stainless steel variant for applications with particularly demanding hygienic requirements.</p>



<p class="wp-block-paragraph"><p align="center"><strong>APM4330-0001-0000 | XPlanar mover, 1.0 kg payload, stainless steel</strong></p></p>



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



<p class="wp-block-paragraph">This hygienic mover is completely encapsulated in stainless steel and designed to be easy to clean. At about 6.1 inches squared and with a payload capacity of 1.0 kilograms, it can move at speeds up to 2 meters/second. The mover is particularly suitable for all applications with particularly demanding hygiene requirements such as food and pharmaceutical applications.</p>



<p class="wp-block-paragraph"><p style="text-align: center;"><strong>APM4550-0000-0000 | XPlanar mover, 4.2 kg payload</strong></p></p>



<p class="wp-block-paragraph"><p style="text-align: center;"><strong></strong></p></p>



<p class="wp-block-paragraph">This mover offers the highest payload (about 9.25 inches squared) of the APM4xxx family and is compatible with all tiles of the type APS4xxx. The aluminum body is hard coated and can move at speeds up to 2 meters/second. With a high payload capacity of 4.2 kilograms, the mover is suitable for handling larger and heavier products with few limitations</p>



<h2 class="wp-block-heading" id="h-xts">XTS</h2>



<p class="wp-block-paragraph">While there are a few different track-based transport systems in the market, <a href="https://www.beckhoff.com/en-us/products/motion/xts-linear-product-transport/">Beckhoff’s eXtended Transport System (XTS)</a> has some key advantages and differentiators. It’s very good for high-speeds (4 m/s 10G acceleration) and extreme repeatability and positioning (10 microns when stationary, and an amazing 0.15 mm of predictable positioning while in motion).</p>



<p class="wp-block-paragraph">High-speed packaging machinery is a common application for XTS, along with assembly and laboratory projects. XTS is IP65 rated with IP69K hygienic options available as well. There are lower duty and heavier duty systems to accommodate different loads.</p>



<p class="wp-block-paragraph"><p align="center"><strong>Comparing the Beckhoff and HepcoMotion systems</strong></p></p>



<p class="wp-block-paragraph">The Beckhoff-manufactured XTS guide rails and movers can carry loads between 1.8 to 2.75 pounds. With a track made of aluminum and matching movers that have plastic rollers, the lack of required lubrication allows this system to be used in the pharmaceutical industry — among others.</p>



<p class="wp-block-paragraph"><p align="center"><strong>AT9014 | XTS Movers</strong></p></p>



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



<p class="wp-block-paragraph">This set of movers is ideal for higher payloads, higher mileage, and the smallest possible product spacing. The movers have a low overall weight and are available in 55mm and 70 mm lengths paths. The aluminum base body has partially plastic rollers and a magnetic plate set. With a high payload capacity of up to 1000 grams, the movers are suitable for flexible travel movements and individual travel paths.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/XTS-motor-modules.png" alt="XTS motor modules"/></figure>



<p class="wp-block-paragraph"><p align="center"><em>XTS motor modules</em></p></p>



<p class="wp-block-paragraph"><p align="center"></p></p>



<p class="wp-block-paragraph"><p align="center"><em>XTS guide rails and movers</em></p></p>



<p class="wp-block-paragraph"><p align="center"><em>From our live demo: Beckhoff’s eXtended Transport System using an oval track.</em></p></p>



<p class="wp-block-paragraph">Beckhoff teamed up with HepcoMotion to make a second, heavier duty XTS track option, the GFX. It allows you to mount a parallel <a href="https://www.beckhoff.com/en-us/products/motion/xts-linear-product-transport/at8x00-at9xxx-ath9xxx-xts-guide-rails-and-movers/gfx.html" target="_blank" rel="noreferrer noopener">Hepco guide rail system</a> on XTS motor modules from Beckhoff, and it can carry loads of 11 – 33 pounds as the movers are made for increased payloads and longer service life.</p>



<p class="wp-block-paragraph"><p style="text-align: right;"></p></p>



<p class="wp-block-paragraph"><p style="text-align: center;"></p></p>



<p class="wp-block-paragraph"><p style="text-align: center;"></p></p>



<p class="wp-block-paragraph">Depending on your company’s load requirements, one of these two systems can be customized for your application. Another feature Beckhoff offers is the option to allow the movers to switch tracks within your system. Through <a href="https://www.beckhoff.com/en-us/products/motion/xts-linear-product-transport/" target="_blank" rel="noreferrer noopener">XTS Track Management</a> hardware and software, you can exchange and switch movers from track to track in multiple XTS linear transport systems, as shown below.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/XTS-Track-Management-Track-Switching.gif" alt="XTS Track Management hardware and software"/></figure>



<p class="wp-block-paragraph"><em>Picture and multimedia credits: Beckhoff Automation, all rights reserved. Beckhoff®, eXtended Transport System®, XTS® and XPlanar® are registered trademarks of and licensed by Beckhoff Automation GmbH.</em></p>



<p class="wp-block-paragraph"><strong>Learn more about DMC’s </strong><a href="https://static.dmcinfo.com/services/manufacturing-automation-and-intelligence/plc-programming/beckhoff-and-twincat-3-programming"><strong>Beckhoff expertise</strong></a><strong> as part of the </strong><a href="https://static.dmcinfo.com/latest-thinking/blog/id/10118/dmc-joins-beckhoff-integrator-group-big"><strong>Beckhoff Integrator Group</strong></a><strong> and </strong><a href="https://static.dmcinfo.com/contact"><strong>contact us</strong></a><strong> today to get started on your next project!</strong></p>
<p>The post <a href="https://static.dmcinfo.com/blog/18332/beckhoff-xplanar-xts/">Beckhoff XPlanar &#038; XTS</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Oxidizing Bare Metal: Rust Programming for ARM Microcontrollers</title>
		<link>https://static.dmcinfo.com/blog/21750/oxidizing-bare-metal-rust-programming-for-arm-microcontrollers/</link>
		
		<dc:creator><![CDATA[DMC]]></dc:creator>
		<pubDate>Fri, 19 Apr 2019 12:33:02 +0000</pubDate>
				<category><![CDATA[Embedded Development & Programming]]></category>
		<category><![CDATA[Low-Power Embedded Design]]></category>
		<category><![CDATA[Product Development]]></category>
		<category><![CDATA[ARM Microcontrollers]]></category>
		<category><![CDATA[Embedded Systems]]></category>
		<category><![CDATA[Microcontroller Programming]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/21750/oxidizing-bare-metal-rust-programming-for-arm-microcontrollers-4/</guid>

					<description><![CDATA[<p>Being an embedded systems developer is always an exciting challenge. One of the downsides though is that in general, programming and development tools are somewhat limited. Developers are almost always restricted to C/C++ and often can&#8217;t rely on more extensive open source libraries. However, recently there have been many efforts to expand high-level language support [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/21750/oxidizing-bare-metal-rust-programming-for-arm-microcontrollers/">Oxidizing Bare Metal: Rust Programming for ARM Microcontrollers</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Being an <a href="/services/embedded-development-and-embedded-programming">embedded systems developer</a> is always an exciting challenge. One of the downsides though is that in general, programming and development tools are somewhat limited. Developers are almost always restricted to C/C++ and often can&#8217;t rely on more extensive open source libraries. However, recently there have been many efforts to expand high-level language support to ARM-based bare metal targets.</p>



<p class="wp-block-paragraph">Projects using MicroPython and JerryScript attempt to provide a means to write Python and JavaScript code and provide frameworks for “compiling” and running scripts on a variety of bare-metal targets. However, these types of frameworks have some inherent drawbacks. JavaScript and Python are both interpreted languages with garbage collection and weak typing. Running these languages requires relying on&nbsp;a run time or more complex cross compiler.</p>



<h2 class="wp-block-heading" id="h-a-new-language-for-embedded-systems">A New Language for Embedded Systems</h2>



<p class="wp-block-paragraph">More recently, Rust has emerged as an appealing language for applications that require <strong>memory safety and efficiency</strong>. Both of these features are often critical for embedded devices. Manual memory management often creates bugs which are hard to isolate and are not always easily remedied due to the resource constraints of embedded devices.</p>



<p class="wp-block-paragraph">Additionally, C/C++, even given all of its faults, remains a highly efficient language due to the control it provides developers and because it can use many target-specific optimizations at compile time. C/C++ sets a high benchmark for speed that is difficult for interpreted languages to match.</p>



<p class="wp-block-paragraph">Rust, fortunately, solves both problems in ways that are particularly well suited to <a href="/services/embedded-development-and-embedded-programming/embedded-systems-platforms">microcontrollers</a>. Rust does not require any run-time engine for garbage collection or memory management. Rust instead chooses to enforce memory safety at compile time. Furthermore, because Rust compiles to LLVM, target optimizations rivaling those achievable with C/C++ are possible. Recently, the Rust core team has made support for new target architectures a priority, and there are already many open source projects aimed at expanding support for embedded devices in Rust.</p>



<p class="wp-block-paragraph"><img decoding="async" alt="" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Rust-Board-3.jpg"><span style="font-size:12px;"><em>Nucleo PCB Running on Rust</em></span></p>



<h2 class="wp-block-heading" id="h-getting-started-with-rust">Getting Started with Rust</h2>



<p class="wp-block-paragraph">The <a href="https://docs.rust-embedded.org/book/index.html" target="_blank">Embedded Rust Book</a> provides many details regarding getting started with Rust on embedded devices. For this blog, I’ll highlight a few key components that make up the Rust embedded landscape. Specifically, I’ll be discussing support for <strong>ARM Cortex M based microcontrollers</strong>.</p>



<p class="wp-block-paragraph">The Rust ecosystem is built on an extensive library of packages called “Crates.” A few specific crates, “cortex-m” and “cortex-m-rt”, make up the core support for ARM targets. These packages provide the bare minimum of code to get a basic program up and running. It allows access and control of the core ARM registers.</p>



<p class="wp-block-paragraph">Below is an example of setting up the systick peripheral taken from the Rust Embedded Book.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Rust</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>use cortex_m::peripheral::{syst, Peripherals};
use cortex_m_rt::entry;

#&#91;entry&#93;
fn main() -> ! {
    let mut peripherals = Peripherals::take().unwrap();
    let mut systick = peripherals.SYST;
    systick.set_clock_source(syst::SystClkSource::Core);
    systick.set_reload(1_000);
    systick.clear_current();
    systick.enable_counter();
    while !systick.has_wrapped() {
        // Loop
    }

    loop {}
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">use</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">cortex_m</span><span style="color: #D4D4D4">::</span><span style="color: #4EC9B0">peripheral</span><span style="color: #D4D4D4">::{syst, </span><span style="color: #4EC9B0">Peripherals</span><span style="color: #D4D4D4">};</span></span>
<span class="line"><span style="color: #569CD6">use</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">cortex_m_rt</span><span style="color: #D4D4D4">::entry;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">#&#91;entry&#93;</span></span>
<span class="line"><span style="color: #569CD6">fn</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">main</span><span style="color: #D4D4D4">() -&gt; ! {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">let</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">mut</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">peripherals</span><span style="color: #D4D4D4"> = </span><span style="color: #4EC9B0">Peripherals</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">take</span><span style="color: #D4D4D4">().</span><span style="color: #DCDCAA">unwrap</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">let</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">mut</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">systick</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">peripherals</span><span style="color: #D4D4D4">.SYST;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">systick</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">set_clock_source</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">syst</span><span style="color: #D4D4D4">::</span><span style="color: #4EC9B0">SystClkSource</span><span style="color: #D4D4D4">::</span><span style="color: #4EC9B0">Core</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">systick</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">set_reload</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">1_000</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">systick</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">clear_current</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">systick</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">enable_counter</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">while</span><span style="color: #D4D4D4"> !</span><span style="color: #9CDCFE">systick</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">has_wrapped</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #6A9955">        // Loop</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">loop</span><span style="color: #D4D4D4"> {}</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">To implement something more interesting than a simple timer, we’ll need a <strong>Peripheral Access</strong> crate. These crates are typically specific to a <a href="/services/embedded-development-and-embedded-programming/embedded-systems-platforms">vendor and family</a> of microcontrollers. For example, the <strong>STM32F4 crate</strong> provides an API for accessing various peripherals such as GPIO, UART, and I2C for the STM32F4 family of devices.</p>



<p class="wp-block-paragraph">Pulling in a Peripheral Access crate, we can build a program for toggling an LED:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Rust</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>fn main() -> ! {
    let mut peripherals = stm32f429::Peripherals::take().unwrap();

    //Enable gpio b clock
    let rcc = &amp;peripherals.RCC;
    rcc.ahb1enr.write(|w| w.gpioben().bit(true));

    //set pin 14 to output
    let gpio = &amp;peripherals.GPIOB;
    gpio.moder.write(|w| w.moder14().bits(1));

    //Turn on led
    gpio.odr.write(|w| w.odr14().set_bit());

    loop {

        delay(10000);
        if  gpio.odr.read().odr14().bit()
        {
            gpio.odr.write(|w| w.odr14().clear_bit());
        }
        else {
            gpio.odr.write(|w| w.odr14().set_bit());
        }
        
    }
}

fn delay(count: u32) {
     for _ in 0..count { cortex_m::asm::nop() }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">fn</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">main</span><span style="color: #D4D4D4">() -&gt; ! {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">let</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">mut</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">peripherals</span><span style="color: #D4D4D4"> = </span><span style="color: #4EC9B0">stm32f429</span><span style="color: #D4D4D4">::</span><span style="color: #4EC9B0">Peripherals</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">take</span><span style="color: #D4D4D4">().</span><span style="color: #DCDCAA">unwrap</span><span style="color: #D4D4D4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">    //Enable gpio b clock</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">let</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">rcc</span><span style="color: #D4D4D4"> = &amp;</span><span style="color: #9CDCFE">peripherals</span><span style="color: #D4D4D4">.RCC;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">rcc</span><span style="color: #D4D4D4">.ahb1enr.</span><span style="color: #DCDCAA">write</span><span style="color: #D4D4D4">(|</span><span style="color: #9CDCFE">w</span><span style="color: #D4D4D4">| </span><span style="color: #9CDCFE">w</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">gpioben</span><span style="color: #D4D4D4">().</span><span style="color: #DCDCAA">bit</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">));</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">    //set pin 14 to output</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">let</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">gpio</span><span style="color: #D4D4D4"> = &amp;</span><span style="color: #9CDCFE">peripherals</span><span style="color: #D4D4D4">.GPIOB;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">gpio</span><span style="color: #D4D4D4">.moder.</span><span style="color: #DCDCAA">write</span><span style="color: #D4D4D4">(|</span><span style="color: #9CDCFE">w</span><span style="color: #D4D4D4">| </span><span style="color: #9CDCFE">w</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">moder14</span><span style="color: #D4D4D4">().</span><span style="color: #DCDCAA">bits</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">));</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">    //Turn on led</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">gpio</span><span style="color: #D4D4D4">.odr.</span><span style="color: #DCDCAA">write</span><span style="color: #D4D4D4">(|</span><span style="color: #9CDCFE">w</span><span style="color: #D4D4D4">| </span><span style="color: #9CDCFE">w</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">odr14</span><span style="color: #D4D4D4">().</span><span style="color: #DCDCAA">set_bit</span><span style="color: #D4D4D4">());</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">loop</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">delay</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">10000</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">gpio</span><span style="color: #D4D4D4">.odr.</span><span style="color: #DCDCAA">read</span><span style="color: #D4D4D4">().</span><span style="color: #DCDCAA">odr14</span><span style="color: #D4D4D4">().</span><span style="color: #DCDCAA">bit</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">gpio</span><span style="color: #D4D4D4">.odr.</span><span style="color: #DCDCAA">write</span><span style="color: #D4D4D4">(|</span><span style="color: #9CDCFE">w</span><span style="color: #D4D4D4">| </span><span style="color: #9CDCFE">w</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">odr14</span><span style="color: #D4D4D4">().</span><span style="color: #DCDCAA">clear_bit</span><span style="color: #D4D4D4">());</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">else</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">gpio</span><span style="color: #D4D4D4">.odr.</span><span style="color: #DCDCAA">write</span><span style="color: #D4D4D4">(|</span><span style="color: #9CDCFE">w</span><span style="color: #D4D4D4">| </span><span style="color: #9CDCFE">w</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">odr14</span><span style="color: #D4D4D4">().</span><span style="color: #DCDCAA">set_bit</span><span style="color: #D4D4D4">());</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"><span style="color: #D4D4D4">        </span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">fn</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">delay</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">count</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">u32</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">     </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">_</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">in</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">..</span><span style="color: #9CDCFE">count</span><span style="color: #D4D4D4"> { </span><span style="color: #4EC9B0">cortex_m</span><span style="color: #D4D4D4">::</span><span style="color: #4EC9B0">asm</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">nop</span><span style="color: #D4D4D4">() }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">Although Rust is an exciting new option for embedded development, it will take some time for it to supplant C/C++ as the standard. A lack of official support from major silicon vendors like <a href="/services/embedded-development-and-embedded-programming/embedded-systems-platforms">ST, NXP, and Silicon Labs</a> means that adding support for new microcontrollers can be a tedious process. Additionally, C/C++ frameworks like ARM&#8217;s mbed offer large, general purpose libraries and drivers that can be used across a variety of ARM targets with little to no modification.</p>



<p class="wp-block-paragraph">Learn more about DMC&#8217;s <a href="/services/embedded-development-and-embedded-programming/product-development">Embedded Product Development</a> Services and <a href="/services/embedded-development-and-embedded-programming/embedded-systems-platforms">Embedded Systems Platforms</a> expertise.</p>
<p>The post <a href="https://static.dmcinfo.com/blog/21750/oxidizing-bare-metal-rust-programming-for-arm-microcontrollers/">Oxidizing Bare Metal: Rust Programming for ARM Microcontrollers</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Arduino Programming with VSCode</title>
		<link>https://static.dmcinfo.com/blog/24043/arduino-programming-with-vscode/</link>
		
		<dc:creator><![CDATA[DMC]]></dc:creator>
		<pubDate>Tue, 01 Aug 2017 12:27:47 +0000</pubDate>
				<category><![CDATA[Embedded Development & Programming]]></category>
		<category><![CDATA[Product Development]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[Visual Studio Code]]></category>
		<category><![CDATA[VSCode]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/24043/arduino-programming-with-vscode-2/</guid>

					<description><![CDATA[<p>One of our core business areas here at DMC is Embedded Development, where we assist customers in bringing their ideas into a functional device. Typically, these projects are done in a staged approach where an initial prototype is designed and built. This prototype can then be used to secure funding for additional stages of design, [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/24043/arduino-programming-with-vscode/">Arduino Programming with VSCode</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">One of our core business areas here at DMC is <a href="https://static.dmcinfo.com/services/embedded-development-and-embedded-programming">Embedded Development</a>, where we assist customers in bringing their ideas into a functional device.</p>



<p class="wp-block-paragraph">Typically, these projects are done in a staged approach where an initial prototype is designed and built. This prototype can then be used to secure funding for additional stages of design, as well as ensure the product meets all of the requirements.</p>



<p class="wp-block-paragraph">For this type of rapid design and prototyping, we often utilize the <a href="https://www.arduino.cc/" target="_blank" rel="noreferrer noopener">Arduino</a>&nbsp;platform.</p>



<h2 id="h-what-s-up-with-arduino" class="wp-block-heading">What&#8217;s Up With Arduino?</h2>



<p class="wp-block-paragraph">Arduino&#8217;s come in a variety of configurations targeted at various <strong>Performance</strong>, <strong>IO</strong>, and <strong>Communication Requirements</strong>, so there is usually a model that has already been tried and tested that would work for your specific application. Arduino also provides a free IDE and C style programming language that allows you to start running custom code within a matter of minutes.</p>



<p class="wp-block-paragraph">However, once your program starts to stretch beyond a few hundred lines of code, or across more than a handful of files, the IDE can start to become cumbersome and difficult to work with, especially if you&#8217;re used to more advanced IDE&#8217;s or text editors. After dealing with the annoyances of the Arduino IDE for years, I&#8217;ve finally upgraded to a more user-friendly option: Visual Studio Code.</p>



<h2 id="h-what-is-vscode" class="wp-block-heading">What is VSCode?</h2>



<p class="wp-block-paragraph"><a href="https://code.visualstudio.com/" target="_blank" rel="noreferrer noopener">Visual Studio Code</a>, or VSCode, is an open source, lightweight, extensible text editor, that is designed and supported by <a href="https://www.microsoft.com/en-us/" target="_blank" rel="noreferrer noopener">Microsoft</a>, and runs on <a href="https://www.linux.org/" target="_blank" rel="noreferrer noopener">Linux</a> and Mac in addition to Windows. The extensibility allows you to write extensions to customize VSCode to best suit your needs, and programming language.</p>



<p class="wp-block-paragraph">With a broad user base, there are a lot of free extensions already available, including an extension to support Arduino programming without ever leaving the VSCode editor. VSCode is designed to handle multiple folders and files within the editor and utilized <a href="https://code.visualstudio.com/docs/editor/intellisense" target="_blank" rel="noreferrer noopener">Microsoft&#8217;s IntelliSense</a> auto-completion tool to help speed up your programming and reduce typos.</p>



<h2 id="h-using-vscode-for-arduino-projects" class="wp-block-heading">Using VSCode for Arduino Projects</h2>



<p class="wp-block-paragraph">To start using VSCode for your Arduino projects, follow the steps below.</p>



<h2 id="h-step-1-download-and-install-drivers" class="wp-block-heading">Step 1 &#8211; Download and Install Drivers</h2>



<p class="wp-block-paragraph">VSCode uses the drivers that are installed with the Arduino IDE, so we need to download and install that first.</p>



<ol class="wp-block-list">
<li><a href="https://www.arduino.cc/en/software/" type="link" id="https://www.arduino.cc/en/software/" target="_blank" rel="noreferrer noopener">Download the <strong>IDE</strong></a><strong> </strong>for your OS.<br> <br> <img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Picture-1-Download-the-Arduino-1.jpg" alt="Screenshot of Arduino IDE download page."><br>  </li>



<li>After the download is complete, run the installer, leaving all the default selections and options.<br>
 <br>
 <img decoding="async" alt="Screenshot of Arduino Setup Options." src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Picture-2-Arduino-Setup-Installation-Options-1.jpg"><br>
 &nbsp;</li>



<li>Be sure to install the <strong>COM port</strong> and <strong>USB drivers</strong> if prompted.<br>
 <br>
 <img decoding="async" alt="Screenshot of permissions for COM port and USB driver installation." src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Picture-3-Would-you-like-to-install-this-device-software-1.jpg"></li>
</ol>



<h2 id="h-step-2-download-vscode" class="wp-block-heading">Step 2 &#8211; Download VSCode</h2>



<ol class="wp-block-list">
<li>While the Arduino IDE is installing, <a href="https://code.visualstudio.com/Download?_exp_download=fb315fc982" type="link" id="https://code.visualstudio.com/Download?_exp_download=fb315fc982" target="_blank" rel="noreferrer noopener">download <strong>VSCode</strong></a>.<br> &nbsp;</li>



<li>After the download is complete, run the installer.<br>
 <br>
 <img decoding="async" alt="Screenshot of installer in Visual Studio Code - Select Additional Tasks." src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Picture-4-Select-Additional-Tasks-1.jpg"></li>
</ol>



<h2 id="h-next-steps" class="wp-block-heading">Next Steps</h2>



<p class="wp-block-paragraph">I recommend the following configuration for the additional tasks during the install.</p>



<ol class="wp-block-list">
<li>Once installed, Launch VSCode.<br>
 &nbsp;</li>



<li>Click the <strong>Extensions</strong>&nbsp;button on the left side of the editor, (or Ctrl+Shift+X) to display the extension marketplace.<br>
 <br>
 <img decoding="async" alt="Screenshot of Visual Studio Code Extensions Marketplace." src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Picture-5-Extension-Marketplace-1.jpg"><br>
 &nbsp;</li>



<li>Type <strong>Arduino</strong>&nbsp;in the search bar, to filter the extensions to only those related to the Arduino platform.<br>
 &nbsp;</li>



<li>There are a few extensions available for Arduino, but I prefer the one supported by Microsoft.<br>
 &nbsp;</li>



<li>Click the <strong>Install</strong>&nbsp;button&nbsp;and when prompted allow installation of dependencies.<br>
 &nbsp;</li>



<li>Click the <strong>Reload</strong>&nbsp;button to relaunch VSCode with the Arduino extension enabled.<br>
 <br>
 <img decoding="async" alt="Screenshot of Visual Studio Code Extensions Marketplace - Arduino Extension enabled." src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Picture-6-Reload-With-Arduino-Extension-1.jpg"><br>
 &nbsp;</li>



<li>Depending on your firewall settings, you may be prompted to give VSCode firewall access.<br>
 <br>
 <img decoding="async" alt="Screenshot of Visual Studio Code - Firewall settings - Firewall Access." src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Picture-7-VSCode-Firewall-Permission-1.jpg"></li>
</ol>



<h2 id="h-programming-in-vscode" class="wp-block-heading">Programming in VSCode</h2>



<p class="wp-block-paragraph">One more <strong>Reload</strong>&nbsp;and now, we&#8217;re set to start programming. To make sure everything is installed properly, we&#8217;ll start by opening up the example&nbsp;<strong>Blinky</strong>.</p>



<p class="wp-block-paragraph">Open VSCode&#8217;s <strong>Command Palette</strong>&nbsp;with <strong>Ctrl+Shift+P</strong>. Once the command palette is open, you can start typing to filter all the options or to search for useful commands.</p>



<ol class="wp-block-list">
<li>
<p class="wp-block-paragraph">Open the Command Palette and type <strong>Arduino</strong>, and select <strong>Arduino:Examples</strong>&nbsp;in the results list.<br> <br> <img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Picture-8-Command-Palette-Arduino-Examples-1.jpg" alt="Screenshot of Visual Studio Code Command Palette, selecting Arduino:Examples"></p>
</li>



<li>In the new pane to the right, select <strong>Built-in Examples&gt;&gt;01.Basics&gt;&gt;Blink</strong>. By default, this will open a new VSCode window, with the Blink sketch and a Blink.txt help file listed in the explorer pane on the left.<br>
 &nbsp;</li>



<li>Select <strong>Blink.ino</strong> from the explorer pane to open the sketch in the editor.<br>
 &nbsp;</li>



<li>Connect your Arduino board to your computer, and then, in the bottom bar of VSCode, you can specify the COM port for your Arduino and the board type.<br>
 <br>
 <img decoding="async" alt="Screenshot of VSCode permissions." src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Picture-9-Firewall-for-Java-platform-SE-binary-1.jpg"><br>
 &nbsp;</li>



<li>Clicking <strong>COM </strong>opens a small selection window at the top of VSCode that should display your connected Arduino.<br>
 <br>
 <img decoding="async" alt="Screenshot of VSCode Blink test - Open COM window." src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Picture-10-Visual-studio-code-blink-COM3-1.jpg"><br>
 &nbsp;</li>



<li>Clicking <strong>&lt;Select Board Type&gt;</strong> opens a new pane on the right where you can select the board type. If various configurations are available for your board, then you need to specify those as well. I&#8217;m using the Arduino Mega with the ATMega-2560.<br>
 <br>
 <img decoding="async" alt="Screenshot of board selection in VSCode." src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Picture-11-Select-board-type-configuations-1.jpg"><br>
 &nbsp;</li>



<li>Open the <strong>Command Palette</strong> again (Ctrl+Shift+P) and type <strong>Arduino:Upload</strong>&nbsp;(Ctrl+Alt+U) to upload the Blink sketch to your Arduino. You should see LED13 start blinking about once per second.</li>
</ol>



<p class="wp-block-paragraph">Now you&#8217;re all set to start writing new Arduino sketches in VSCode and enjoy the features of a more advanced text editor.&nbsp;<a href="https://static.dmcinfo.com/services/embedded-development-and-embedded-programming"><strong>Learn more about DMC&#8217;s </strong>Embedded Development and Embedded Programming</a>&nbsp;or <a href="https://static.dmcinfo.com/contact">Contact Us</a> to get started on a project today.</p>
<p>The post <a href="https://static.dmcinfo.com/blog/24043/arduino-programming-with-vscode/">Arduino Programming with VSCode</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>The Product Development Process: How to Bring Your Product to Market</title>
		<link>https://static.dmcinfo.com/blog/25824/the-product-development-process-how-to-bring-your-product-to-market/</link>
		
		<dc:creator><![CDATA[Tim Jager]]></dc:creator>
		<pubDate>Tue, 15 Mar 2016 15:45:38 +0000</pubDate>
				<category><![CDATA[Circuit Design]]></category>
		<category><![CDATA[Embedded Development & Programming]]></category>
		<category><![CDATA[Product Development]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[UI/UX]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/25824/the-product-development-process-how-to-bring-your-product-to-market/</guid>

					<description><![CDATA[<p>Have you ever had a product design idea? Our engineers created this overview of the product development process to&#160;demystify how to bring your product to market.&#160; Learn more about DMC&apos;s Custom Software and Hardware Development services.</p>
<p>The post <a href="https://static.dmcinfo.com/blog/25824/the-product-development-process-how-to-bring-your-product-to-market/">The Product Development Process: How to Bring Your Product to Market</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">Have you ever had a product design idea?</p>

<p class="wp-block-paragraph">Our engineers created this overview of the product development process to&nbsp;demystify how to bring your product to market.&nbsp;</p>

<p class="wp-block-paragraph"><iframe loading="lazy" allowfullscreen="" frameborder="0" height="360" src="https://www.youtube.com/embed/jS-rD6HuxIk?rel=0" width="640"></iframe></p>

<p class="wp-block-paragraph"><strong>Learn more about DMC&apos;s <a href="https://static.dmcinfo.com/services/embedded-development-and-embedded-programming">Custom Software and Hardware Development</a> services.</strong></p>
<p>The post <a href="https://static.dmcinfo.com/blog/25824/the-product-development-process-how-to-bring-your-product-to-market/">The Product Development Process: How to Bring Your Product to Market</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Updating Your Rotary Dial Phone for the Digital Age</title>
		<link>https://static.dmcinfo.com/blog/28080/updating-your-rotary-dial-phone-for-the-digital-age/</link>
		
		<dc:creator><![CDATA[DMC]]></dc:creator>
		<pubDate>Mon, 23 Sep 2013 14:39:18 +0000</pubDate>
				<category><![CDATA[Circuit Design]]></category>
		<category><![CDATA[Embedded Development & Programming]]></category>
		<category><![CDATA[Product Development]]></category>
		<category><![CDATA[DIY]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[How To]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/28080/updating-your-rotary-dial-phone-for-the-digital-age/</guid>

					<description><![CDATA[<p>Good-old rotary dial phones have been around since forever, and they used to be a part of everyday life, like dragons during medieval period. However, like dragons, suddenly all these marvelous ancient devices just disappeared one day. I was lucky to find one of these dinosaurs at the local flea market. I was eager to [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/28080/updating-your-rotary-dial-phone-for-the-digital-age/">Updating Your Rotary Dial Phone for the Digital Age</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Good-old <a href="http://en.wikipedia.org/wiki/Rotary_dial" re_target="_blank" target="_blank">rotary dial</a> phones have been around since forever, and they used to be a part of everyday life, like dragons during medieval period. However, like dragons, suddenly all these marvelous ancient devices just disappeared one day. I was lucky to find one of these dinosaurs at the local flea market.</p>



<p class="wp-block-paragraph">I was eager to try it out, but unfortunately I don&#8217;t have a home phone line anymore. I hooked it up to my <a href="http://en.wikipedia.org/wiki/Voice_over_IP" re_target="_blank" target="_blank">Voice Over IP</a> (VoIP) adapter that I haven&#8217;t used in years. It almost worked! Well, it rang like it is supposed to &#8211; waking up dogs and babies in a two block radius. I could even have a pleasant conversation over it, but I couldn&#8217;t dial out. I heard a dial tone, but it ignored the number I was trying to dial.</p>



<p class="wp-block-paragraph">The problem actually was not the phone &#8211; there is nothing could go wrong with it, ever. It&#8217;s probably bullet-proof and could easily survive a minor nuclear apocalypse (haven&#8217;t tried it, it is in my to-do list). The problem was in my Voice Over IP adapter. It&#8217;s not compatible with &#8220;ancient&#8221; rotary-dial phones, and is designed to work only with (well, also vintage) push-button phones.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6abf205eb64cd&quot;}" data-wp-interactive="core/image" data-wp-key="6abf205eb64cd" class="wp-block-image size-full is-resized wp-lightbox-container"><img decoding="async" width="1600" height="1200" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://static.dmcinfo.com/wp-content/uploads/2013/09/20111224_212049.jpg" alt="" class="wp-image-36312" style="width:640px" srcset="https://static.dmcinfo.com/wp-content/uploads/2013/09/20111224_212049.jpg 1600w, https://static.dmcinfo.com/wp-content/uploads/2013/09/20111224_212049-300x225.jpg 300w, https://static.dmcinfo.com/wp-content/uploads/2013/09/20111224_212049-1024x768.jpg 1024w, https://static.dmcinfo.com/wp-content/uploads/2013/09/20111224_212049-768x576.jpg 768w, https://static.dmcinfo.com/wp-content/uploads/2013/09/20111224_212049-1536x1152.jpg 1536w" sizes="(max-width: 1600px) 100vw, 1600px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p class="wp-block-paragraph"><span style="line-height: 1.5;">Ironically, rotary dial (or pulse-dial) is actually digital protocol, and is supposed to be closer relative to VoIP than &#8220;modern&#8221; push-buttons phones. The later ones use analog encoding to transmit digits. This process has a fancy name: Dual-Tone Multi-Frequency Signaling (<a href="http://en.wikipedia.org/wiki/Dual-tone_multi-frequency_signaling" re_target="_blank" style="line-height: 1.5;" target="_blank">DTMF</a><span style="line-height: 1.5;">).</span></span></p>



<p class="wp-block-paragraph">The rotary dial is pure digital &#8211; transmitting numbers as a sequence of on/off pulses. One pulse corresponds to digit &#8220;1&#8221;, two pulses &#8211; digit &#8220;2&#8221;, etc; Ten pulses represent digit &#8220;0&#8221;.</p>



<p class="wp-block-paragraph">Of course I could get another VoIP adapter that supports pulse dialing, but this would be too easy. Instead, I decided to make my own pulse-to-DTMF converter.</p>



<p class="wp-block-paragraph">I had a few <a href="http://www.atmel.com/products/microcontrollers/avr/tinyavr.aspx" re_target="_blank" target="_blank"> microcontrollers lying around and decided using them to generate DTMF signals should be trivial. Obviously, it&#8217;s been done before and I found an Atmel </a><a href="http://www.atmel.com/Images/doc1982.pdf" re_target="_blank" target="_blank">application note to do exactly that. There is nothing special there, just using a PWM (the same method I used to </a><a href="http://boris0.blogspot.com/2012/09/revealing-hidden-awesomeness-of-ti.html" re_target="_blank" target="_blank">play audio on the TI Launchpad</a>) to generate an analog signal. The only difference is that I am not using any external memory here. DTMF consists of just two sinusoidal waves, so we have to store one period of the sin wave and it is small enough to easily fit to the microcontroller&#8217;s internal memory.</p>



<p class="wp-block-paragraph">As I mentioned before, reading pulses from the phone is very simple. It&#8217;s already digital, just count them up &#8211; and bam you get your digit. Here is a test setup with my adapter still on the breadboard</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6abf205eb676b&quot;}" data-wp-interactive="core/image" data-wp-key="6abf205eb676b" class="wp-block-image size-full is-resized wp-lightbox-container"><img decoding="async" width="1600" height="1200" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://static.dmcinfo.com/wp-content/uploads/2013/09/DSC08821.jpg" alt="" class="wp-image-36314" style="width:640px" srcset="https://static.dmcinfo.com/wp-content/uploads/2013/09/DSC08821.jpg 1600w, https://static.dmcinfo.com/wp-content/uploads/2013/09/DSC08821-300x225.jpg 300w, https://static.dmcinfo.com/wp-content/uploads/2013/09/DSC08821-1024x768.jpg 1024w, https://static.dmcinfo.com/wp-content/uploads/2013/09/DSC08821-768x576.jpg 768w, https://static.dmcinfo.com/wp-content/uploads/2013/09/DSC08821-1536x1152.jpg 1536w" sizes="(max-width: 1600px) 100vw, 1600px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p class="wp-block-paragraph">From left to right:</p>


<div>


<ul class="wp-block-list">
<li>Wi-Fi to Ethernet converter. Just because my VoIP adapter doesn&#8217;t have a Wi-Fi and I don&#8217;t like having Ethernet cables everywhere</li>



<li>VoIP adapter. I had the old <a href="http://en.wikipedia.org/wiki/Linksys#VoIP" re_target="_blank" target="_blank">Cisco/Linksys PAP2</a></li>



<li>Phone (kinda obvious)</li>



<li>Breadboard. Schematic below:</li>
</ul>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6abf205eb6999&quot;}" data-wp-interactive="core/image" data-wp-key="6abf205eb6999" class="wp-block-image size-full is-resized wp-lightbox-container"><img decoding="async" width="1277" height="378" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://static.dmcinfo.com/wp-content/uploads/2013/09/Schematic_v1-0.jpg" alt="" class="wp-image-36315" style="width:640px" srcset="https://static.dmcinfo.com/wp-content/uploads/2013/09/Schematic_v1-0.jpg 1277w, https://static.dmcinfo.com/wp-content/uploads/2013/09/Schematic_v1-0-300x89.jpg 300w, https://static.dmcinfo.com/wp-content/uploads/2013/09/Schematic_v1-0-1024x303.jpg 1024w, https://static.dmcinfo.com/wp-content/uploads/2013/09/Schematic_v1-0-768x227.jpg 768w" sizes="(max-width: 1277px) 100vw, 1277px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p class="wp-block-paragraph">The phone line voltage is in the &#8220;on-hook&#8221; state. Confusing term? It seems to have originated because you are supposed to keep the earpiece on the hook and &#8220;off-hook&#8221; it in order to answer the call.</p>



<p class="wp-block-paragraph">Back to the voltage. So the &#8220;on-hook&#8221; voltage is quite high, around 48V DC and even higher (around 90V AC) during the ring. I decided to connect my board after the phone switch, so I am getting the power only when the phone is in the &#8220;off-hook&#8221; state (meaning the handset is not on the phone).</p>



<p class="wp-block-paragraph">In the &#8220;off-hook&#8221; state, line voltage is supposed to drop down to around 5V DC, which is perfect for my AVR, but I still added a 5.1V zener diode D1 just in case.</p>



<p class="wp-block-paragraph">The rotary dial module is disconnected from the phone circuit and connected to my adapter only. The purpose of the connection between pins F and RR is to make phone think that the dial is still connected.</p>



<p class="wp-block-paragraph">I am generating DTMF/PWM signal on the AVR pin 5 and feeding it to the emitter follower Q1 via the low-pass filter (C1, R3).</p>



<p class="wp-block-paragraph">If you are curious, you can grab an <a href="https://code.google.com/archive/p/miscellaneous-projects/source" type="link" id="https://code.google.com/archive/p/miscellaneous-projects/source" target="_blank" rel="noreferrer noopener">AVR source code</a>.</p>



<p class="wp-block-paragraph">Here is the video testing the adapter</p>


<p><iframe loading="lazy" frameborder="0" height="360" src="//www.youtube.com/embed/ZLoQ5UA1tvc?rel=0" width="640"></iframe></p>


<p class="wp-block-paragraph">During the test I ran into the interesting issue. I noticed that AVR power consumption at the power-down mode is much higher than I anticipated (~500uA instead of ~10uA). After poking around I traced the issue to the <a re_target="_blank" href="http://en.wikipedia.org/wiki/DebugWIRE" target="_blank">debugWIRE</a> interface. I was using debugWIRE to download and debug code on the AVR. Yet apparently debugWIRE draws a lot of current (~500uA). Disabling debugWIRE <a href="https://microchip.my.site.com/s/article/Unable-to-enter-programming-mode--while-using-ISP-interface" target="_blank" rel="noreferrer noopener">via fuses</a> and using <a re_target="_blank" href="http://en.wikipedia.org/wiki/Atmel_AVR#ISP" target="_blank">ISP</a> instead solved the problem.</p>



<p class="wp-block-paragraph">The last steps were to wire the adapter on the perforated board.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6abf205eb6c52&quot;}" data-wp-interactive="core/image" data-wp-key="6abf205eb6c52" class="wp-block-image size-full is-resized wp-lightbox-container"><img decoding="async" width="1600" height="1200" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://static.dmcinfo.com/wp-content/uploads/2013/09/20111224_165119.jpg" alt="" class="wp-image-36316" style="width:640px;height:auto" srcset="https://static.dmcinfo.com/wp-content/uploads/2013/09/20111224_165119.jpg 1600w, https://static.dmcinfo.com/wp-content/uploads/2013/09/20111224_165119-300x225.jpg 300w, https://static.dmcinfo.com/wp-content/uploads/2013/09/20111224_165119-1024x768.jpg 1024w, https://static.dmcinfo.com/wp-content/uploads/2013/09/20111224_165119-768x576.jpg 768w, https://static.dmcinfo.com/wp-content/uploads/2013/09/20111224_165119-1536x1152.jpg 1536w" sizes="(max-width: 1600px) 100vw, 1600px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6abf205eb6def&quot;}" data-wp-interactive="core/image" data-wp-key="6abf205eb6def" class="wp-block-image size-full is-resized wp-lightbox-container"><img decoding="async" width="1600" height="1200" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://static.dmcinfo.com/wp-content/uploads/2013/09/20111224_165336.jpg" alt="" class="wp-image-36317" style="width:640px" srcset="https://static.dmcinfo.com/wp-content/uploads/2013/09/20111224_165336.jpg 1600w, https://static.dmcinfo.com/wp-content/uploads/2013/09/20111224_165336-300x225.jpg 300w, https://static.dmcinfo.com/wp-content/uploads/2013/09/20111224_165336-1024x768.jpg 1024w, https://static.dmcinfo.com/wp-content/uploads/2013/09/20111224_165336-768x576.jpg 768w, https://static.dmcinfo.com/wp-content/uploads/2013/09/20111224_165336-1536x1152.jpg 1536w" sizes="(max-width: 1600px) 100vw, 1600px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p class="wp-block-paragraph">Then mount it inside the phone (thank you again, hot glue)</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6abf205eb6faa&quot;}" data-wp-interactive="core/image" data-wp-key="6abf205eb6faa" class="wp-block-image size-full is-resized wp-lightbox-container"><img decoding="async" width="1600" height="1200" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://static.dmcinfo.com/wp-content/uploads/2013/09/20111224_211658.jpg" alt="" class="wp-image-36318" style="width:640px" srcset="https://static.dmcinfo.com/wp-content/uploads/2013/09/20111224_211658.jpg 1600w, https://static.dmcinfo.com/wp-content/uploads/2013/09/20111224_211658-300x225.jpg 300w, https://static.dmcinfo.com/wp-content/uploads/2013/09/20111224_211658-1024x768.jpg 1024w, https://static.dmcinfo.com/wp-content/uploads/2013/09/20111224_211658-768x576.jpg 768w, https://static.dmcinfo.com/wp-content/uploads/2013/09/20111224_211658-1536x1152.jpg 1536w" sizes="(max-width: 1600px) 100vw, 1600px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p class="wp-block-paragraph">Done! Just put the cover on. Obviously it looks exactly the same as before modifications.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6abf205eb70f9&quot;}" data-wp-interactive="core/image" data-wp-key="6abf205eb70f9" class="wp-block-image size-full is-resized wp-lightbox-container"><img decoding="async" width="1600" height="1200" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://static.dmcinfo.com/wp-content/uploads/2013/09/20111224_212049.jpg" alt="" class="wp-image-36312" style="width:640px" srcset="https://static.dmcinfo.com/wp-content/uploads/2013/09/20111224_212049.jpg 1600w, https://static.dmcinfo.com/wp-content/uploads/2013/09/20111224_212049-300x225.jpg 300w, https://static.dmcinfo.com/wp-content/uploads/2013/09/20111224_212049-1024x768.jpg 1024w, https://static.dmcinfo.com/wp-content/uploads/2013/09/20111224_212049-768x576.jpg 768w, https://static.dmcinfo.com/wp-content/uploads/2013/09/20111224_212049-1536x1152.jpg 1536w" sizes="(max-width: 1600px) 100vw, 1600px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p class="wp-block-paragraph">Next steps. I guess there is none. Well, maybe to record how this phone rings and use it as a ringtone.</p>



<p class="wp-block-paragraph"><a href="/contact">Contact us</a> to get started on your next <a href="/services/embedded-development-and-embedded-programming">Embedded Development &amp; Programming</a> project.&nbsp;</p>


</div><p>The post <a href="https://static.dmcinfo.com/blog/28080/updating-your-rotary-dial-phone-for-the-digital-age/">Updating Your Rotary Dial Phone for the Digital Age</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
