<?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>Thomas Panek Gonzalez, Author at DMC, Inc.</title>
	<atom:link href="https://static.dmcinfo.com/blog/author/thomasp/feed/index.xml" rel="self" type="application/rss+xml" />
	<link></link>
	<description></description>
	<lastBuildDate>Fri, 04 Sep 2026 18:27:18 +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>Thomas Panek Gonzalez, Author at DMC, Inc.</title>
	<link></link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Zephyr RTOS Explained: Overcoming the Fear of Change</title>
		<link>https://static.dmcinfo.com/blog/44235/zephyr-rtos-explained-overcoming-the-fear-of-change/</link>
		
		<dc:creator><![CDATA[Thomas Panek Gonzalez]]></dc:creator>
		<pubDate>Wed, 06 May 2026 14:00:00 +0000</pubDate>
				<category><![CDATA[Embedded Development & Programming]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/?p=44235</guid>

					<description><![CDATA[<p>Choose the Right RTOS for Embedded Systems Embedded projects can be very simple and small, with not much going on, but often have a large number of events all looking to happen. To handle all these events, engineers will want to add a Real Time Operating System (RTOS) to their system’s architecture. The purpose of [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/44235/zephyr-rtos-explained-overcoming-the-fear-of-change/">Zephyr RTOS Explained: Overcoming the Fear of Change</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading" id="h-choose-the-right-rtos-for-embedded-systems">Choose the Right RTOS for Embedded Systems</h2>



<p class="wp-block-paragraph">Embedded projects can be very simple and small, with not much going on, but often have a large number of events all looking to happen. To handle all these events, engineers will want to add a Real Time Operating System (RTOS) to their system’s architecture. The purpose of an RTOS is to ensure specific tasks occur within a set time frame. This is very important in embedded devices, as many different tasks must occur for the device to function. </p>



<p class="wp-block-paragraph">Once an RTOS is needed, the next question is which RTOS to use. Some common RTOS options are FreeRTOS, Mbed, ThreadX, and Zephyr. Many have great uses across various systems, though the highlight of this article is Zephyr, as it uses a different methodology for how it works and how it is used. If you&#8217;re reading this article, you may be facing the struggles of Zephyr’s learning curve, but hopefully, by the end, you will gain a greater appreciation for Zephyr.</p>



<h2 class="wp-block-heading" id="h-understanding-zephyr-s-learning-curve">Understanding Zephyr&#8217;s Learning Curve</h2>



<p class="wp-block-paragraph">All things in life need to be learned and dealt with to get the most out of them. Zephyr is the same way, but with a much steeper learning curve for users familiar with other RTOSs. Nearly all users of Zephyr have struggled with it for a reason: the hardware agnosticism, feature set, and continued growth of the RTOS. Most engineers are familiar with how to set up a new project: choose an MCU, define the required features, write drivers, and then test. </p>



<p class="wp-block-paragraph">On Zephyr, the steps are more akin to establishing needed features, writing drivers, and then testing on a long list of possible MCUs. This flip can be hard for many engineers who are familiar with a certain schema, though once one has sipped from the fountain of the future, they may not want to go back. Talk is only so much, though, so now we’ll get into some actual tips and tricks to hopefully help you become a functional Zephyr user!</p>



<h2 class="wp-block-heading" id="h-core-zephyr-concepts-usage-kconfigs-and-device-trees">Core Zephyr Concepts: Usage, Kconfigs, and Device Trees</h2>



<p class="wp-block-paragraph">Zephyr is primarily used via the CLI and a program called “west” to handle nearly everything, including building, flashing, debugging, repo management, and much more. The Zephyr Foundation has <a href="https://docs.zephyrproject.org/latest/develop/getting_started/index.html" target="_blank" rel="noreferrer noopener">documentation</a> on how to install things and is quite helpful for starting out. Once install is done, Zephyr’s greatest hurdles appear on the horizon:</p>



<ol class="wp-block-list">
<li><a href="#h-configuration-files" type="internal" id="#h-configuration-files">Configuration Files</a></li>



<li><a href="#h-device-tree" type="internal" id="#h-device-tree">Device Tree</a></li>



<li><a href="#h-overlay">Overlay</a></li>
</ol>



<p class="wp-block-paragraph">All three are outlined in greater detail below:</p>



<h3 class="wp-block-heading" id="h-configuration-files">Configuration Files</h3>



<p class="wp-block-paragraph">Zephyr is hardware-agnostic, which means the user must say what they want included in the project. There are two files to edit: `kconfig` and `prj.conf`. Kconfig files may be familiar to those who frequent Linux, as Zephyr is a kernel; these are the “kernel configs”. &nbsp;That said, in most cases, not much should need to be changed here, as the stock file created will serve most users just fine. The prj.conf file is the main location where one would define the software’s capabilities, such as the inclusion of logging, UART, ADCs, or SPI. </p>



<p class="wp-block-paragraph">The Zephyr project includes the <a href="https://docs.zephyrproject.org/latest/kconfig.html">full list</a> of variables that can be added to the prj.conf file to configure a project. This is the part that confuses most people, as they either don’t know what to set or would rather set them in the codebase itself, so they feel more like local variables or #defines. This schema enables Zephyr&#8217;s hardware-agnostic nature, since the settings are held outside the driver. To help with the volume of config variables, Zephyr includes a GUI that lets you select settings based on your needs; this helps alleviate the issue of not knowing your options. I wish I had known about this when I was configuring my first project in Zephyr.</p>



<p class="wp-block-paragraph">Zephyr configuration can be done using either a graphical interface or a terminal-based menu, both exposing the same Kconfig options:</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-0e47273b wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="937" height="1024" src="https://static.dmcinfo.com/wp-content/uploads/2026/05/zephyr-gui-1-937x1024.png" alt="Zephyr GUI" class="wp-image-44260" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/05/zephyr-gui-1-937x1024.png 937w, https://static.dmcinfo.com/wp-content/uploads/2026/05/zephyr-gui-1-275x300.png 275w, https://static.dmcinfo.com/wp-content/uploads/2026/05/zephyr-gui-1-768x839.png 768w, https://static.dmcinfo.com/wp-content/uploads/2026/05/zephyr-gui-1.png 959w" sizes="(max-width: 937px) 100vw, 937px" /></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full"><img decoding="async" width="955" height="521" src="https://static.dmcinfo.com/wp-content/uploads/2026/05/zephyr-kernal.png" alt="Zephyr Kernal" class="wp-image-44261" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/05/zephyr-kernal.png 955w, https://static.dmcinfo.com/wp-content/uploads/2026/05/zephyr-kernal-300x164.png 300w, https://static.dmcinfo.com/wp-content/uploads/2026/05/zephyr-kernal-768x419.png 768w" sizes="(max-width: 955px) 100vw, 955px" /></figure>
</div>
</div>



<h3 class="wp-block-heading" id="h-device-tree">Device Tree</h3>



<p class="wp-block-paragraph">Where prj.conf files define the software, the device tree defines the hardware. There are three main files in play here:</p>



<ul class="wp-block-list">
<li>.dts. This is an MCU-specific configuration.</li>



<li>.dtsi. It is more general hardware info that can apply to a MCU family or brand of MCUs, potentially</li>
</ul>



<h3 class="wp-block-heading" id="h-overlay">.Overlay</h3>



<p class="wp-block-paragraph">While the first two are often left alone as is, since they define the capabilities of the MCU, which don’t change. User intervention is needed within the .overlay file. This is where the peripherals are set up, along with the pins used to control them. An example of the overlay structure can be found <a href="https://docs.zephyrproject.org/latest/build/dts/howtos.html#use-devicetree-overlays" target="_blank" rel="noreferrer noopener">here at the bottom of the section</a>; the example shown is for an SPI and I2C setup. The .overlay will need to be curated for each hardware-related function of the setup. These created peripherals will later be used in the main code.</p>



<h2 class="wp-block-heading" id="h-moving-forward-with-zephyr">Moving Forward with Zephyr</h2>



<p class="wp-block-paragraph">In my experience and others’ sentiments, the ability to grasp the purpose and schema of the files above is the biggest hurdle in Zephyr. Once those are understood, the rest of Zephyr is quite similar to other RTOS or general embedded methodologies. It’s highly recommended to follow a guide when setting up a sample project before starting your own, as guidance can be very beneficial when starting out with Zephyr.</p>



<h3 class="wp-block-heading" id="h-practical-considerations">Practical Considerations</h3>



<p class="wp-block-paragraph">Currently, it is hard to avoid AI. For a case like Zephyr, it can be quite useful for understanding what to add to one’s prj.conf and .overlay files. Be aware that these config variables may change over time, and new ones may be unfamiliar to the AI model. It&#8217;s best to consult official sources if things are not working/building correctly.</p>



<h3 class="wp-block-heading" id="h-additional-resources">Additional Resources</h3>



<p class="wp-block-paragraph">Here are a few reference materials to help get you on the right path in your Zephyr journey:</p>



<ul class="wp-block-list">
<li><a href="https://docs.zephyrproject.org/latest/index.html" type="link" id="https://docs.zephyrproject.org/latest/index.html">Zephyr Project Home</a></li>



<li><a href="https://gateway.on24.com/wcc/eh/2295376/category/144246/mastering-zephyr-rtos" type="link" id="https://gateway.on24.com/wcc/eh/2295376/category/144246/mastering-zephyr-rtos">Mastering Zephyr Webinar</a></li>
</ul>



<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">Have an upcoming project? 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">Take your project to the next level with engineering solutions from DMC. Learn more about our <a href="https://static.dmcinfo.com/services/embedded-development-and-embedded-programming/" id="https://static.dmcinfo.com/services/embedded-development-and-embedded-programming/">Embedded Development &amp; Programming</a> solutions or contact us to get started 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 class="wp-block-paragraph"></p>
<p>The post <a href="https://static.dmcinfo.com/blog/44235/zephyr-rtos-explained-overcoming-the-fear-of-change/">Zephyr RTOS Explained: Overcoming the Fear of Change</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Power Profiling Embedded Systems: Tools, Techniques, and Real-World Results</title>
		<link>https://static.dmcinfo.com/blog/42943/power-profiling-embedded-systems/</link>
		
		<dc:creator><![CDATA[Thomas Panek Gonzalez]]></dc:creator>
		<pubDate>Tue, 14 Apr 2026 19:53:37 +0000</pubDate>
				<category><![CDATA[Embedded Development & Programming]]></category>
		<category><![CDATA[Low-Power Embedded Design]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/?p=42943</guid>

					<description><![CDATA[<p>Batteries have brought us into a cordless era, from electric vehicles with 75KWh batteries to handheld devices powered by 0.66Wh coin cells. Regardless of the use case (hand warmers aside), the customer wants the most efficient system, thus the longest battery life. To improve battery life, designers need to understand where power is being consumed [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/42943/power-profiling-embedded-systems/">Power Profiling Embedded Systems: Tools, Techniques, and Real-World Results</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Batteries have brought us into a cordless era, from <a href="https://static.dmcinfo.com/industries/automotive/">electric vehicles with 75KWh batteries</a> to <a href="https://static.dmcinfo.com/our-work/category/industry/consumer-goods/">handheld devices</a> powered by 0.66Wh coin cells. Regardless of the use case (hand warmers aside), the customer wants the most efficient system, thus the longest battery life. To improve battery life, designers need to understand where power is being consumed so they can reduce it. One of the best ways to do that is to measure current over time with a power profiler.</p>



<h2 id="h-what-is-a-power-profiler" class="wp-block-heading">What Is a Power Profiler?</h2>



<p class="wp-block-paragraph">A power profiler precisely measures the power a device consumes over a given period of time. Often, a graph is generated with the data so one can examine consistency and anomalies. Typically, the power profiler supplies power to the device, so all power flows through the profiler, enabling better measurement. In contrast, one would need to place a digital multimeter (DMM) in line with the device to measure current, and have the voltage measured with a separate instrument. An engineer would then use this data to observe how changes in hardware and software are affecting the device’s power consumption.</p>



<h2 id="h-devices-used" class="wp-block-heading">Devices Used</h2>



<p class="wp-block-paragraph">We typically use two main power profilers when working on low-power Embedded systems:</p>



<ul class="wp-block-list">
<li><a href="https://www.nordicsemi.com/Products/Development-hardware/Power-Profiler-Kit-2" target="_blank" rel="noreferrer noopener">Nordic Power Profiler Kit II</a>. It is usually referred to as PPK2 (Power Profiler Kit 2) and is a USB device that plugs into a computer and uses Nordic’s software to view the power characteristics of the device in question.</li>



<li><a href="https://www.qoitech.com/otii-ace/" target="_blank" rel="noreferrer noopener">Qoitech Otii Ace Pro</a>. The Otii does the same thing as the PPK2, though with a more comprehensive feature set. It offers a wider range of voltage and current, better read resolutions, and other features. It is worth noting that this tool is more expensive.</li>
</ul>



<h2 id="h-lower-power-techniques" class="wp-block-heading">Lower Power Techniques</h2>



<p class="wp-block-paragraph">It is one thing to know a device&#8217;s power draw; it&#8217;s another to know how to lower its average draw. In the simplest terms, the best way to reduce power draw is to turn off as many things as possible. LEDs, Integrated Circuits (ICs), and the microcontroller (MCU) can all be powered on, off, or put to sleep via smart decisions made in hardware and software. Adding a Metal-Oxide-Semiconductor Field-Effect Transistor (MOSFET) or specialized power switches allows subsystems to be turned on and off as needed. Most MCUs support various sleep modes, which can reduce average power by orders of magnitude.</p>



<p class="wp-block-paragraph" style="padding-bottom:var(--wp--preset--spacing--40)">As an example, the ESP32, a popular MCU, provides a table in its datasheet that shows various sleep modes and their power consumption in those modes. Looking at these tables (see Figures 1 and 2 below), it&#8217;s seen that a maximum of 240 mA can be reduced to 5 µA by changing the power mode, a ~48,000-fold difference.</p>



<figure class="wp-block-image aligncenter size-full" style="margin-top:var(--wp--preset--spacing--40);margin-bottom:var(--wp--preset--spacing--50)"><img decoding="async" width="624" height="250" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/hardware-embedded-devices-power-profiling-figure-1.png" alt="Power modes and consumption for ESP32." class="wp-image-42944" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/hardware-embedded-devices-power-profiling-figure-1.png 624w, https://static.dmcinfo.com/wp-content/uploads/2026/04/hardware-embedded-devices-power-profiling-figure-1-300x120.png 300w" sizes="(max-width: 624px) 100vw, 624px" /><figcaption class="wp-element-caption"><em>Figure 1: Power modes and consumption for ESP32</em></figcaption></figure>



<figure class="wp-block-image aligncenter size-full" style="margin-top:var(--wp--preset--spacing--30);margin-bottom:var(--wp--preset--spacing--60)"><img decoding="async" width="624" height="187" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/hardware-embedded-devices-power-profiling-figure-2.png" alt="Active RF power consumption." class="wp-image-42945" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/hardware-embedded-devices-power-profiling-figure-2.png 624w, https://static.dmcinfo.com/wp-content/uploads/2026/04/hardware-embedded-devices-power-profiling-figure-2-300x90.png 300w" sizes="(max-width: 624px) 100vw, 624px" /><figcaption class="wp-element-caption"><em>Figure 2: Active RF power consumption</em></figcaption></figure>



<h2 id="h-examples" class="wp-block-heading">Examples</h2>



<p class="wp-block-paragraph">Out of simplicity, I will provide some data and examples using the Arduino Nano R4. This is Arduino’s smallest microcontroller development kit board and can be used for simple projects, including low-power applications. I’ll recreate the same setup in two different ways, both of which will result in a simple blinky program.</p>



<p class="wp-block-paragraph">For hardware, a Nano R4 will be plugged into a breadboard along with an LED and a resistor. The LED will blink at 2Hz in both software setups, though the second will include power-saving logic. Figures 3 and 4 below show a large drop in power when the CPU is put to sleep with nothing happening. In normal operation, the MCU idles and consumes power doing nothing, whereas in the sleep code, it can sleep and consume much less power.</p>



<p class="wp-block-paragraph">Figure 3 shows an average power draw of 24.3 mA in the 20s window, while the low-power version shown in Figure 4 has an average draw of 13.4 mA, nearly half the current used. These numbers can mean very little without some context. If the system were powered by a single CR2032 3V coin cell battery with a capacity of 225 mAh, the runtime would range from 225 mAh / 24.3 mA = 9.25 h to 16.8 h.</p>



<p class="wp-block-paragraph">This is roughly double the runtime under ideal situations. The true benefits of low power come from using a device with ultra-low-power saving modes, as seen in Figure 1 for the ESP32. If the same rough calculations are done with the modem off vs hibernation, we see a runtime range of 225mAh/25mA = 9hours to 225mAh/5uA =45000h = 1875days = 5.13years.</p>



<p class="wp-block-paragraph" style="padding-bottom:var(--wp--preset--spacing--40)">This is a perfect-world situation and is highly unlikely to happen, especially as it assumes the device would be asleep for the entire time, doing nothing productive. Though systems can be optimized to last for months or years, depending on their use case and the amount of power-saving logic applied.</p>



<figure class="wp-block-image aligncenter size-full" style="margin-top:var(--wp--preset--spacing--40);margin-bottom:var(--wp--preset--spacing--60)"><img decoding="async" width="925" height="519" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/hardware-embedded-devices-power-profiling-figure-3-2.jpg" alt="Average power draw of 24.3 mA in the 20s window." class="wp-image-42974" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/hardware-embedded-devices-power-profiling-figure-3-2.jpg 925w, https://static.dmcinfo.com/wp-content/uploads/2026/04/hardware-embedded-devices-power-profiling-figure-3-2-300x168.jpg 300w, https://static.dmcinfo.com/wp-content/uploads/2026/04/hardware-embedded-devices-power-profiling-figure-3-2-768x431.jpg 768w" sizes="(max-width: 925px) 100vw, 925px" /><figcaption class="wp-element-caption"><em>Figure 3: Simple Blinky</em></figcaption></figure>



<figure class="wp-block-image aligncenter size-full" style="margin-top:var(--wp--preset--spacing--40);margin-bottom:var(--wp--preset--spacing--60)"><img decoding="async" width="925" height="520" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/hardware-embedded-devices-power-profiling-figure-4.jpg" alt="Low-power version, average draw of 13.4 mA." class="wp-image-42976" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/hardware-embedded-devices-power-profiling-figure-4.jpg 925w, https://static.dmcinfo.com/wp-content/uploads/2026/04/hardware-embedded-devices-power-profiling-figure-4-300x169.jpg 300w, https://static.dmcinfo.com/wp-content/uploads/2026/04/hardware-embedded-devices-power-profiling-figure-4-768x432.jpg 768w" sizes="(max-width: 925px) 100vw, 925px" /><figcaption class="wp-element-caption"><em>Figure 4: Low Power Blinky</em></figcaption></figure>



<h2 id="h-code" class="wp-block-heading">Code</h2>



<p class="wp-block-paragraph">Below are the two sketches used for the measurements above:</p>



<ul class="wp-block-list">
<li>A baseline 2 Hz blinky</li>



<li style="padding-bottom:var(--wp--preset--spacing--50)">A low-power version that uses <strong>__WFI()</strong> to sleep between timer ticks</li>
</ul>



<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">JavaScript</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>//Baseline 2Hz Blinky
const int LED_PIN = 3;      // Built-in LED on Arduino Nano
const unsigned long TOGGLE_MS = 250;

unsigned long lastToggle = 0;
bool ledState = false;

void setup() {
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  unsigned long now = millis();

  if (now - lastToggle >= TOGGLE_MS) {
    lastToggle = now;
    ledState = !ledState;
    digitalWrite(LED_PIN, ledState);
  }
}</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: #6A9955">//Baseline 2Hz Blinky</span></span>
<span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">int</span><span style="color: #D4D4D4"> LED_PIN = </span><span style="color: #B5CEA8">3</span><span style="color: #D4D4D4">;      </span><span style="color: #6A9955">// Built-in LED on Arduino Nano</span></span>
<span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">unsigned</span><span style="color: #D4D4D4"> long TOGGLE_MS = </span><span style="color: #B5CEA8">250</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #9CDCFE">unsigned</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">long</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">lastToggle</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #9CDCFE">bool</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">ledState</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">false</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">setup</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #DCDCAA">pinMode</span><span style="color: #D4D4D4">(</span><span style="color: #4FC1FF">LED_PIN</span><span style="color: #D4D4D4">, </span><span style="color: #4FC1FF">OUTPUT</span><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">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">loop</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">unsigned</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">long</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">now</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">millis</span><span style="color: #D4D4D4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">now</span><span style="color: #D4D4D4"> - </span><span style="color: #9CDCFE">lastToggle</span><span style="color: #D4D4D4"> &gt;= </span><span style="color: #4FC1FF">TOGGLE_MS</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">lastToggle</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">now</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">ledState</span><span style="color: #D4D4D4"> = !</span><span style="color: #9CDCFE">ledState</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">digitalWrite</span><span style="color: #D4D4D4">(</span><span style="color: #4FC1FF">LED_PIN</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">ledState</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></code></pre></div>



<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">JavaScript</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>// Low Power 2Hz Blinky
#include &lt;Arduino.h>
const uint8_t LED_PIN = 3;
volatile bool tick = false;
extern "C" void SysTick_Handler(void)
{
  tick = true;
}

void setup()
{
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, LOW);

  // Configure SysTick for 250 ms ticks
  SysTick_Config(SystemCoreClock / 4);  // 1/4 second = 250 ms
}

void loop()
{
  // Wait in low-power idle until interrupt fires
  while (!tick) {
    __WFI();   // Wait For Interrupt (CPU sleeps until an interrupt occurs)
  }
  tick = false;

  // Toggle LED each tick
  digitalWrite(LED_PIN, !digitalRead(LED_PIN));
}</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: #6A9955">// Low Power 2Hz Blinky</span></span>
<span class="line"><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">include</span><span style="color: #D4D4D4"> &lt;</span><span style="color: #9CDCFE">Arduino</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">h</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">uint8_t</span><span style="color: #D4D4D4"> LED_PIN = </span><span style="color: #B5CEA8">3</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #9CDCFE">volatile</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">bool</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">tick</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">false</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #9CDCFE">extern</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;C&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">SysTick_Handler</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">void</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">tick</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">true</span><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">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">setup</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: #DCDCAA">pinMode</span><span style="color: #D4D4D4">(</span><span style="color: #4FC1FF">LED_PIN</span><span style="color: #D4D4D4">, </span><span style="color: #4FC1FF">OUTPUT</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #DCDCAA">digitalWrite</span><span style="color: #D4D4D4">(</span><span style="color: #4FC1FF">LED_PIN</span><span style="color: #D4D4D4">, </span><span style="color: #4FC1FF">LOW</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">// Configure SysTick for 250 ms ticks</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #DCDCAA">SysTick_Config</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">SystemCoreClock</span><span style="color: #D4D4D4"> / </span><span style="color: #B5CEA8">4</span><span style="color: #D4D4D4">);  </span><span style="color: #6A9955">// 1/4 second = 250 ms</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">loop</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: #6A9955">// Wait in low-power idle until interrupt fires</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">tick</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">__WFI</span><span style="color: #D4D4D4">();   </span><span style="color: #6A9955">// Wait For Interrupt (CPU sleeps until an interrupt occurs)</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">tick</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">false</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">// Toggle LED each tick</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #DCDCAA">digitalWrite</span><span style="color: #D4D4D4">(</span><span style="color: #4FC1FF">LED_PIN</span><span style="color: #D4D4D4">, !</span><span style="color: #DCDCAA">digitalRead</span><span style="color: #D4D4D4">(</span><span style="color: #4FC1FF">LED_PIN</span><span style="color: #D4D4D4">));</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h2 id="h-conclusion" class="wp-block-heading" style="padding-top:var(--wp--preset--spacing--50)">Conclusion</h2>



<p class="wp-block-paragraph">Power profiling turns battery life from a guessing game into a measurable target for engineers. By capturing current over time, you can quickly spot spikes, reduce idle waste, and validate that firmware and hardware changes actually improve energy use. Even small changes, like sleeping between periodic tasks, can meaningfully reduce average current, and deeper optimizations can extend runtime further.</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>Want to optimize the power consumption of your embedded device?</strong> Ask DMC.</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">Power profiling can improve the battery life of your embedded project. Learn more about DMC&#8217;s <a href="https://static.dmcinfo.com/services/embedded-development-and-embedded-programming/" data-type="page" data-id="431">embedded</a> expertise and our <a href="https://static.dmcinfo.com/services/test-and-measurement-automation/battery-pack-and-bms-test-systems/" data-type="page" data-id="611">battery life</a> optimization capabilities</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/42943/power-profiling-embedded-systems/">Power Profiling Embedded Systems: Tools, Techniques, and Real-World Results</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Arduino Nano R4 CAN Protocol</title>
		<link>https://static.dmcinfo.com/blog/40485/arduino-nano-r4-can-protocol/</link>
		
		<dc:creator><![CDATA[Thomas Panek Gonzalez]]></dc:creator>
		<pubDate>Tue, 13 Jan 2026 13:00:00 +0000</pubDate>
				<category><![CDATA[Embedded Development & Programming]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/?p=40485</guid>

					<description><![CDATA[<p>This past summer, Arduino released a new version within their popular microcontroller series, the Nano R4. In a previous article I wrote about the new USB HID functionality that was added in the release. In this article I would like to focus on the addition of the CAN protocol being native to the Arduino Nano [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/40485/arduino-nano-r4-can-protocol/">Arduino Nano R4 CAN Protocol</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">This past summer, Arduino released a new version within their popular microcontroller series, the Nano R4. In <a href="https://static.dmcinfo.com/blog/37479/arduino-nano-r4-usb-hid-functionality-and-first-impressions/">a previous article</a> I wrote about the new USB HID functionality that was added in the release. In this article I would like to focus on the addition of the CAN protocol being native to the Arduino Nano R4.</p>



<h2 id="h-can-protocol-electrical" class="wp-block-heading">CAN Protocol &#8211; Electrical</h2>



<p class="wp-block-paragraph">The CAN (Controller Area Network) Protocol is a serial bus interface used to connect multiple devices in a <strong>Network. </strong>The devices all connect to a common <strong>Bus</strong> and share a twisted pair of wires called <strong>CAN High</strong> and <strong>CAN Low</strong>. The protocol requires 3 conductors to operate: <strong>CAN H</strong>, <strong>CAN L</strong>, and Ground. These CAN lines are opposites of each other. When the CAN lines are digital low, both <strong>CAN H</strong> and <strong>CAN L</strong> are at the same voltage. When the bus goes digital high, the line’s voltages go in opposite directions. For example, if they are digital low at a voltage of 2.5V, then at digital high, <strong>CAN H</strong> may be at 3.5V while <strong>CAN L</strong> would be at 1.5V. The voltages are equidistant from the digital low voltage which is called <strong>differential signaling. </strong>The benefits for differential signaling are that they minimize EMI (Electromagnetic Interference), allow long runs of wire, and high throughput. CAN is most used in vehicular communications and industrial automation.</p>



<h2 id="h-how-can-works-logical-protocol" class="wp-block-heading">How CAN Works – Logical Protocol</h2>



<p class="wp-block-paragraph">CAN in its simplest explanation can be thought of a group call full of people attempting to all talk to each other. Someone initiates a conversation by stating their ID and the ID of whom they need to communicate with. This allows the two to communicate effectively, all while sharing space with others. If two speakers attempt to communicate at the same time, the ID that is lower numerically is allowed to communicate first, the other follows unless a speaker with an ID that is lower attempts to speak. The speakers here are the devices (sensors, MCUs, etc.) and the shared space is the wires/bus.</p>



<h2 id="h-what-the-nano-r4-can-now-do" class="wp-block-heading">What the Nano R4 CAN Now Do</h2>



<p class="wp-block-paragraph">This iteration of the Arduino Nano now has the R7FA4M1AB3CFM#HA0 32-bit MCU from <strong>Renesas</strong> which has a CAN controller packaged into it. The use of R4’s CAN peripheral <strong>requires an external CAN transceiver</strong>&nbsp;to work with a CAN bus. Arduino recommends transceivers such as the SN65HVD230 from Texas Instruments or the MCP2561 from Microchip. For my setup I used a TJA1050T made by NXP USA.</p>



<h2 id="h-example-code" class="wp-block-heading">Example Code</h2>



<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">C++</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>#include &lt;Arduino_CAN.h>
//This Code Honks the horn of a Tesla when a button is pressed on D6
#define BUTTON_PIN D6
#define HONK_TIME_MS 50
#define CAN_ID_HONK 0x273
bool lastButtonState = HIGH;

void setup() {
  // Serial is optional; do not block startup
  Serial.begin(115200);

  pinMode(BUTTON_PIN, INPUT_PULLUP); // button wired D6 → GND

  if (!CAN.begin(CanBitRate::BR_500k)) //Check if CAN started up fine
  {
    while (1); // hard fail
  }
}

void loop() {
  bool buttonState = digitalRead(BUTTON_PIN); //Read button

  if (buttonState == LOW &amp;&amp; lastButtonState == HIGH)   // Detect button press and release
  {
    // Build CAN frame
    CanMsg hornMsg;
    hornMsg.id = CAN_ID_HONK; // ID273UI_vehicleControl
    hornMsg.data_length = 8;

    // Zero the 8 bytes
    for (int i = 0; i &lt; 8; i++) {
      hornMsg.data&#091;i&#093; = 0;
    }

    // Bit 61 → byte 7, bit 5
    hornMsg.data&#091;7&#093; = 0x20;

    // Honk ON
    CAN.write(hornMsg);

    delay(HONK_TIME_MS);//Horn honks for 

    // Honk OFF
    hornMsg.data&#091;7&#093; = 0x00;
    CAN.write(hornMsg);
    Serial.println("Horn triggered"); 
  }
  lastButtonState = buttonState; //Set previous button state
}</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: #C586C0">#include</span><span style="color: #569CD6"> </span><span style="color: #CE9178">&lt;Arduino_CAN.h&gt;</span></span>
<span class="line"><span style="color: #6A9955">//This Code Honks the horn of a Tesla when a button is pressed on D6</span></span>
<span class="line"><span style="color: #C586C0">#define</span><span style="color: #569CD6"> BUTTON_PIN D6</span></span>
<span class="line"><span style="color: #C586C0">#define</span><span style="color: #569CD6"> HONK_TIME_MS 50</span></span>
<span class="line"><span style="color: #C586C0">#define</span><span style="color: #569CD6"> CAN_ID_HONK 0x273</span></span>
<span class="line"><span style="color: #569CD6">bool</span><span style="color: #D4D4D4"> lastButtonState = HIGH;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">setup</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #6A9955">  // Serial is optional; do not block startup</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">Serial</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">begin</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">115200</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #DCDCAA">pinMode</span><span style="color: #D4D4D4">(BUTTON_PIN, INPUT_PULLUP);</span><span style="color: #6A9955"> // button wired D6 → GND</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (!</span><span style="color: #9CDCFE">CAN</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">begin</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">CanBitRate</span><span style="color: #D4D4D4">::BR_500k))</span><span style="color: #6A9955"> //Check if CAN started up fine</span></span>
<span class="line"><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: #B5CEA8">1</span><span style="color: #D4D4D4">);</span><span style="color: #6A9955"> // hard fail</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">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">loop</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">bool</span><span style="color: #D4D4D4"> buttonState = </span><span style="color: #DCDCAA">digitalRead</span><span style="color: #D4D4D4">(BUTTON_PIN);</span><span style="color: #6A9955"> //Read button</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (buttonState == LOW &amp;&amp; lastButtonState == HIGH)</span><span style="color: #6A9955">   // Detect button press and release</span></span>
<span class="line"><span style="color: #D4D4D4">  {</span></span>
<span class="line"><span style="color: #6A9955">    // Build CAN frame</span></span>
<span class="line"><span style="color: #D4D4D4">    CanMsg hornMsg;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">hornMsg</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">id</span><span style="color: #D4D4D4"> = CAN_ID_HONK;</span><span style="color: #6A9955"> // ID273UI_vehicleControl</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">hornMsg</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">data_length</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">8</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">    // Zero the 8 bytes</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> (</span><span style="color: #569CD6">int</span><span style="color: #D4D4D4"> i = </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">; i &lt; </span><span style="color: #B5CEA8">8</span><span style="color: #D4D4D4">; i++) {</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">hornMsg</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">&#091;i&#093; = </span><span style="color: #B5CEA8">0</span><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: #6A9955">    // Bit 61 → byte 7, bit 5</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">hornMsg</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">&#091;</span><span style="color: #B5CEA8">7</span><span style="color: #D4D4D4">&#093; = </span><span style="color: #B5CEA8">0x20</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">    // Honk ON</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">CAN</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">write</span><span style="color: #D4D4D4">(hornMsg);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">delay</span><span style="color: #D4D4D4">(HONK_TIME_MS);</span><span style="color: #6A9955">//Horn honks for </span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">    // Honk OFF</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">hornMsg</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">&#091;</span><span style="color: #B5CEA8">7</span><span style="color: #D4D4D4">&#093; = </span><span style="color: #B5CEA8">0x00</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">CAN</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">write</span><span style="color: #D4D4D4">(hornMsg);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">Serial</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">println</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;Horn triggered&quot;</span><span style="color: #D4D4D4">); </span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">  lastButtonState = buttonState;</span><span style="color: #6A9955"> //Set previous button state</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h2 id="h-setup" class="wp-block-heading">Setup</h2>



<p class="wp-block-paragraph">To use the code shown above, one needs access to the CAN network in their Tesla vehicle. In the car used for this article, a 2021 Tesla Model Y Long Range, the CAN bus was found behind the center console, near the floor. A plastic cover needed to be pried off, and a splicer was purchased to connect in series. USB-C power was supplying the Nano R4.&nbsp;The provided code waits for a button to be pressed and released, connected to D6 and GND, and from there a data packet sends the honk horn bit for 50ms before setting it back to off. The idea is if the driver is hesitant to honk, the passenger can take some initiative. Below is the wiring needed for the CAN buses to work:</p>



<ul class="wp-block-list">
<li>Arduino GND to CAN Transceiver GND to Pin 5</li>



<li>Arduino 5V to CAN Transceiver PWR</li>



<li>CAN Transceiver CAN HIGH to Pin 6</li>



<li>CAN Transceiver CAN LOW to Pin 14</li>



<li>Arduino CAN RX to CAN Transceiver CAN RX</li>



<li>Arduino CAN TX to CAN Transceiver CAN TX</li>
</ul>



<figure class="wp-block-image size-large is-resized"><img decoding="async" width="1024" height="576" src="https://static.dmcinfo.com/wp-content/uploads/2026/01/can-bus-wires.drawio-1-1024x576.png" alt="CAN BUS Wires" class="wp-image-40626" style="width:1175px;height:auto" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/01/can-bus-wires.drawio-1-1024x576.png 1024w, https://static.dmcinfo.com/wp-content/uploads/2026/01/can-bus-wires.drawio-1-300x169.png 300w, https://static.dmcinfo.com/wp-content/uploads/2026/01/can-bus-wires.drawio-1-768x432.png 768w, https://static.dmcinfo.com/wp-content/uploads/2026/01/can-bus-wires.drawio-1-1536x863.png 1536w, https://static.dmcinfo.com/wp-content/uploads/2026/01/can-bus-wires.drawio-1-2048x1151.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2 id="h-can-bus-demo" class="wp-block-heading">CAN BUS Demo</h2>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
<div style="width: 640px;" class="wp-video"><video class="wp-video-shortcode" id="video-40485-1" width="640" height="360" preload="metadata" controls="controls"><source type="video/mp4" src="https://static.dmcinfo.com/wp-content/uploads/2025/12/25.12.17-CAN-Demo-Vid.mp4?_=1" /><a href="https://static.dmcinfo.com/wp-content/uploads/2025/12/25.12.17-CAN-Demo-Vid.mp4">https://static.dmcinfo.com/wp-content/uploads/2025/12/25.12.17-CAN-Demo-Vid.mp4</a></video></div>
</div></figure>



<h2 id="h-conclusion" class="wp-block-heading">Conclusion</h2>



<p class="wp-block-paragraph">In my sample code, I was able to control one of thousands of settings within my vehicle through the CAN bus. Some other examples could be starting seat heat on various seats, opening and closing the trunk, or turning on the wipers, with thousands of other controls for the vehicle. Some of these can damage the car and tinkerers should be careful not to damage the car with the messages being sent to it, especially whilst driving. The ones chosen here are generally low risk. Though overall CAN is a very robust protocol and can be used in many applications.</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>Need a partner who can help develop reliable CAN-based embedded solutions</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">Learn more about DMC&#8217;s capabilities in <a href="https://static.dmcinfo.com/services/embedded-development-and-embedded-programming/arduino-programming/" data-type="page" data-id="671">Arduino Nano R4</a> CAN Bus Communication, including hardware setup, transceivers, and example code for your <a href="https://static.dmcinfo.com/services/embedded-development-and-embedded-programming/" data-type="page" data-id="431">Embedded</a> systems.</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 class="wp-block-paragraph"></p>
<p>The post <a href="https://static.dmcinfo.com/blog/40485/arduino-nano-r4-can-protocol/">Arduino Nano R4 CAN Protocol</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		<enclosure url="https://static.dmcinfo.com/wp-content/uploads/2025/12/25.12.17-CAN-Demo-Vid.mp4" length="14936136" type="video/mp4" />

			</item>
		<item>
		<title>Arduino Nano R4 USB HID Functionality and First Impressions</title>
		<link>https://static.dmcinfo.com/blog/37479/arduino-nano-r4-usb-hid-functionality-and-first-impressions/</link>
		
		<dc:creator><![CDATA[Thomas Panek Gonzalez]]></dc:creator>
		<pubDate>Fri, 01 Aug 2025 17:03:56 +0000</pubDate>
				<category><![CDATA[Embedded Development & Programming]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/?p=37479</guid>

					<description><![CDATA[<p>Arduino released the Nano R4 on July 25, 2025, powered by the same RA4M1 microcontroller that’s at the core of the popular UNO R4 boards. The board features 256 kB Flash, 32 kB SRAM and an 8 kB EEPROM, all running at 48 MHz with a built-in real-time clock (RTC), 14-bit ADC and a 12-bit [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/37479/arduino-nano-r4-usb-hid-functionality-and-first-impressions/">Arduino Nano R4 USB HID Functionality and First Impressions</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Arduino released the <a href="https://docs.arduino.cc/hardware/nano-r4/" target="_blank" rel="noreferrer noopener">Nano R4</a> on July 25, 2025, powered by the same RA4M1 microcontroller that’s at the core of the popular UNO R4 boards. The board features 256 kB Flash, 32 kB SRAM and an 8 kB EEPROM, all running at 48 MHz with a built-in real-time clock (RTC), 14-bit ADC and a 12-bit DAC. &nbsp;In addition to a standard set of peripherals it also features UCB-C with HID support, CAN, a built-in OPAMP and the standard Qwiic I²C Connector.&nbsp;</p>



<p class="wp-block-paragraph">The form factor is the same as other Nanos although the storage and speed have increased significantly. The focus for this article is on the USB HID functionality supported by this new design, along with the ability to create a simple keyboard wedge using the Nano R4.&nbsp;</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="900" height="600" src="https://static.dmcinfo.com/wp-content/uploads/2025/08/Arduino-Nano-R4-box.jpg" alt="Arduino-Nano-R4" class="wp-image-37484" style="width:500px;height:auto" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/08/Arduino-Nano-R4-box.jpg 900w, https://static.dmcinfo.com/wp-content/uploads/2025/08/Arduino-Nano-R4-box-300x200.jpg 300w, https://static.dmcinfo.com/wp-content/uploads/2025/08/Arduino-Nano-R4-box-768x512.jpg 768w" sizes="(max-width: 900px) 100vw, 900px" /><figcaption class="wp-element-caption"><em>Arduino Nano R4 box and included parts</em></figcaption></figure>



<h2 id="h-keyboard-wedge" class="wp-block-heading">Keyboard Wedge</h2>



<p class="wp-block-paragraph">A keyboard wedge is a device that uses HID to mimic a keyboard without one being present. This is a common use case in industrial applications such as barcode scanners, sensor logging, and various automations when inputs are required. No special software is needed as the computer thinks it is a keyboard that is plugged in and making the inputs. This feature of the new design can also be used to make a mouse wedge which would mimic a mouse’s inputs on a computer. Any program that has an area to input text (Excel, Chrome, Word, Notepad, etc.) can be used with an HID like the Arduino Nano R4. &nbsp;</p>



<h2 id="h-keyboard-wedge-example" class="wp-block-heading">Keyboard Wedge Example</h2>



<p class="wp-block-paragraph">To illustrate the capability and functionality of the wedge, a demonstration has been built using the following:&nbsp;</p>



<ul class="wp-block-list">
<li>Arduino Nano R4&nbsp;</li>
</ul>



<ul class="wp-block-list">
<li>Tactile Button&nbsp;</li>
</ul>



<ul class="wp-block-list">
<li>Ultra-sonic Sensor&nbsp;</li>
</ul>



<p class="wp-block-paragraph">If the button is pressed, the reading from the ultra-sonic sensor is read and formatted into a line like this “Distance: X cm” where the X is the current distance measured by the sensor. If I were to open any area on my computer in which text can be entered, Excel for example, then the above line would print into a new cell on each cycle. The speed can also be changed within the code, which can be found below. &nbsp;</p>



<p class="wp-block-paragraph">This logic can be applied to many other use cases and sensors. The user can decide how they need their keyboard wedge to work. As mentioned previously, a mouse wedge is also an option, though it is often not as practical except in some niche cases. A sample code is provided to see the effect of a mouse wedge, in a fun way! This code spirals the mouse in and out as long as the Arduino Nano is connected to the PC, the code can be found below.</p>



<h3 id="h-keyboard-wedge-code" class="wp-block-heading">Keyboard Wedge Code</h3>



<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">JavaScript</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>#include &lt;Keyboard.h> 

#define LOOP_TIME_MS 500 

const int trigPin = 3; 

const int echoPin = 4; 

const int buttonPin = 2; 

  

void setup() { 

  pinMode(trigPin, OUTPUT); 

  pinMode(echoPin, INPUT); 

  pinMode(buttonPin, INPUT_PULLUP); // Use internal pull-up resistor 

  

  Keyboard.begin(); 

  delay(1000); // Wait for USB to stabilize 

} 

  

void loop() { 

  // Check if button is pressed (LOW due to pull-up config) 

  if (digitalRead(buttonPin) == LOW) { 

    long duration; 

    int distance; 

  

    // Send ultrasonic pulse 

    digitalWrite(trigPin, LOW); 

    delayMicroseconds(2); 

    digitalWrite(trigPin, HIGH); 

    delayMicroseconds(10); 

    digitalWrite(trigPin, LOW); 

  

    // Read echo time 

    duration = pulseIn(echoPin, HIGH); 

  

    // Calculate distance in cm 

    distance = duration * 0.034 / 2; 

  

    // Send distance as keystrokes 

    Keyboard.print("Distance: "); 

    Keyboard.print(distance); 

    Keyboard.println(" cm"); 

  

    // Debounce delay so it doesn't repeat too fast 

    delay(LOOP_TIME_MS); 

  } 

} </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: #D4D4D4">#</span><span style="color: #9CDCFE">include</span><span style="color: #D4D4D4"> &lt;</span><span style="color: #9CDCFE">Keyboard</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">h</span><span style="color: #D4D4D4">&gt; </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">define</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">LOOP_TIME_MS</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">500</span><span style="color: #D4D4D4"> </span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">int</span><span style="color: #D4D4D4"> trigPin = </span><span style="color: #B5CEA8">3</span><span style="color: #D4D4D4">; </span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">int</span><span style="color: #D4D4D4"> echoPin = </span><span style="color: #B5CEA8">4</span><span style="color: #D4D4D4">; </span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">int</span><span style="color: #D4D4D4"> buttonPin = </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">; </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">setup</span><span style="color: #D4D4D4">() { </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #DCDCAA">pinMode</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">trigPin</span><span style="color: #D4D4D4">, </span><span style="color: #4FC1FF">OUTPUT</span><span style="color: #D4D4D4">); </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #DCDCAA">pinMode</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">echoPin</span><span style="color: #D4D4D4">, </span><span style="color: #4FC1FF">INPUT</span><span style="color: #D4D4D4">); </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #DCDCAA">pinMode</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">buttonPin</span><span style="color: #D4D4D4">, </span><span style="color: #4FC1FF">INPUT_PULLUP</span><span style="color: #D4D4D4">); </span><span style="color: #6A9955">// Use internal pull-up resistor </span></span>
<span class="line"></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: #9CDCFE">Keyboard</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">begin</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">1000</span><span style="color: #D4D4D4">); </span><span style="color: #6A9955">// Wait for USB to stabilize </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">} </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">loop</span><span style="color: #D4D4D4">() { </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">// Check if button is pressed (LOW due to pull-up config) </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #DCDCAA">digitalRead</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">buttonPin</span><span style="color: #D4D4D4">) == </span><span style="color: #4FC1FF">LOW</span><span style="color: #D4D4D4">) { </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">long</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">duration</span><span style="color: #D4D4D4">; </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">int</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">distance</span><span style="color: #D4D4D4">; </span></span>
<span class="line"></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: #6A9955">// Send ultrasonic pulse </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">digitalWrite</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">trigPin</span><span style="color: #D4D4D4">, </span><span style="color: #4FC1FF">LOW</span><span style="color: #D4D4D4">); </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">delayMicroseconds</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">); </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">digitalWrite</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">trigPin</span><span style="color: #D4D4D4">, </span><span style="color: #4FC1FF">HIGH</span><span style="color: #D4D4D4">); </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">delayMicroseconds</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">10</span><span style="color: #D4D4D4">); </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">digitalWrite</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">trigPin</span><span style="color: #D4D4D4">, </span><span style="color: #4FC1FF">LOW</span><span style="color: #D4D4D4">); </span></span>
<span class="line"></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: #6A9955">// Read echo time </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">duration</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">pulseIn</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">echoPin</span><span style="color: #D4D4D4">, </span><span style="color: #4FC1FF">HIGH</span><span style="color: #D4D4D4">); </span></span>
<span class="line"></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: #6A9955">// Calculate distance in cm </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">distance</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">duration</span><span style="color: #D4D4D4"> * </span><span style="color: #B5CEA8">0.034</span><span style="color: #D4D4D4"> / </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">; </span></span>
<span class="line"></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: #6A9955">// Send distance as keystrokes </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">Keyboard</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;Distance: &quot;</span><span style="color: #D4D4D4">); </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">Keyboard</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">distance</span><span style="color: #D4D4D4">); </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">Keyboard</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">println</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot; cm&quot;</span><span style="color: #D4D4D4">); </span></span>
<span class="line"></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: #6A9955">// Debounce delay so it doesn&apos;t repeat too fast </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: #4FC1FF">LOOP_TIME_MS</span><span style="color: #D4D4D4">); </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  } </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">} </span></span></code></pre></div>



<h3 id="h-mouse-wedge-code" class="wp-block-heading">Mouse Wedge Code</h3>



<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">JavaScript</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>#include &lt;Mouse.h> 

#include &lt;math.h> 

  

float angle = 0.0; 

float radius = 0.0; 

const float maxRadius = 50.0; 

const float minRadius = 5.0; 

const float angleStep = 0.3; 

const float radiusStep = 0.1; 

bool expanding = true; 

  

void setup() { 

  Mouse.begin(); 

  delay(1000); // Let USB settle 

} 

  

void loop() { 

  // Calculate position in polar coordinates 

  int dx = int(radius * cos(angle)); 

  int dy = int(radius * sin(angle)); 

  

  // Move the mouse 

  Mouse.move(dx, dy, 0); 

  

  // Advance angle 

  angle += angleStep; 

  

  // Adjust radius 

  if (expanding) { 

    radius += radiusStep; 

    if (radius >= maxRadius) expanding = false; 

  } else { 

    radius -= radiusStep; 

    if (radius &lt;= minRadius) expanding = true; 

  } 

  delay(10); 

} </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: #D4D4D4">#</span><span style="color: #9CDCFE">include</span><span style="color: #D4D4D4"> &lt;</span><span style="color: #9CDCFE">Mouse</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">h</span><span style="color: #D4D4D4">&gt; </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">#</span><span style="color: #9CDCFE">include</span><span style="color: #D4D4D4"> &lt;</span><span style="color: #9CDCFE">math</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">h</span><span style="color: #D4D4D4">&gt; </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span></span>
<span class="line"></span>
<span class="line"><span style="color: #9CDCFE">float</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">angle</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">0.0</span><span style="color: #D4D4D4">; </span></span>
<span class="line"></span>
<span class="line"><span style="color: #9CDCFE">float</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">radius</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">0.0</span><span style="color: #D4D4D4">; </span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">float</span><span style="color: #D4D4D4"> maxRadius = </span><span style="color: #B5CEA8">50.0</span><span style="color: #D4D4D4">; </span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">float</span><span style="color: #D4D4D4"> minRadius = </span><span style="color: #B5CEA8">5.0</span><span style="color: #D4D4D4">; </span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">float</span><span style="color: #D4D4D4"> angleStep = </span><span style="color: #B5CEA8">0.3</span><span style="color: #D4D4D4">; </span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">float</span><span style="color: #D4D4D4"> radiusStep = </span><span style="color: #B5CEA8">0.1</span><span style="color: #D4D4D4">; </span></span>
<span class="line"></span>
<span class="line"><span style="color: #9CDCFE">bool</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">expanding</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: #D4D4D4">  </span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">setup</span><span style="color: #D4D4D4">() { </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">Mouse</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">begin</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">1000</span><span style="color: #D4D4D4">); </span><span style="color: #6A9955">// Let USB settle </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">} </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">loop</span><span style="color: #D4D4D4">() { </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">// Calculate position in polar coordinates </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">int</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">dx</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">int</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">radius</span><span style="color: #D4D4D4"> * </span><span style="color: #DCDCAA">cos</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">angle</span><span style="color: #D4D4D4">)); </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">int</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">dy</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">int</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">radius</span><span style="color: #D4D4D4"> * </span><span style="color: #DCDCAA">sin</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">angle</span><span style="color: #D4D4D4">)); </span></span>
<span class="line"></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: #6A9955">// Move the mouse </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">Mouse</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">move</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">dx</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">dy</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">); </span></span>
<span class="line"></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: #6A9955">// Advance angle </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">angle</span><span style="color: #D4D4D4"> += </span><span style="color: #9CDCFE">angleStep</span><span style="color: #D4D4D4">; </span></span>
<span class="line"></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: #6A9955">// Adjust radius </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">expanding</span><span style="color: #D4D4D4">) { </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">radius</span><span style="color: #D4D4D4"> += </span><span style="color: #9CDCFE">radiusStep</span><span style="color: #D4D4D4">; </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">radius</span><span style="color: #D4D4D4"> &gt;= </span><span style="color: #9CDCFE">maxRadius</span><span style="color: #D4D4D4">) </span><span style="color: #9CDCFE">expanding</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">false</span><span style="color: #D4D4D4">; </span></span>
<span class="line"></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>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">radius</span><span style="color: #D4D4D4"> -= </span><span style="color: #9CDCFE">radiusStep</span><span style="color: #D4D4D4">; </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">radius</span><span style="color: #D4D4D4"> &lt;= </span><span style="color: #9CDCFE">minRadius</span><span style="color: #D4D4D4">) </span><span style="color: #9CDCFE">expanding</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: #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">10</span><span style="color: #D4D4D4">); </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">} </span></span></code></pre></div>



<h2 id="h-conclusion" class="wp-block-heading">Conclusion</h2>



<p class="wp-block-paragraph">The Arduino, with its small form factor and relatively easy coding environment can be used in many ways to automate anything the user needs. Whether it be for a personal project or a business or industrial need, an HID keyboard wedge can save the user time and money at scale. </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>Need Help Integrating USB Functionality into Your Embedded Device?</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">DMC can implement HID Keyboard Wedges into your next <a href="https://static.dmcinfo.com/services/embedded-development-and-embedded-programming/" data-type="page" data-id="431">Embedded Development</a> project. Learn more about our <a href="https://static.dmcinfo.com/services/embedded-development-and-embedded-programming/arduino-programming/" data-type="page" data-id="671">Nano R4</a> capabilities.</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/37479/arduino-nano-r4-usb-hid-functionality-and-first-impressions/">Arduino Nano R4 USB HID Functionality and First Impressions</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>M5 Stack Analysis as a Rapid Prototyping Platform</title>
		<link>https://static.dmcinfo.com/blog/15977/m5-stack-analysis-as-a-rapid-prototyping-platform/</link>
		
		<dc:creator><![CDATA[Thomas Panek Gonzalez]]></dc:creator>
		<pubDate>Tue, 17 Sep 2024 08:30:15 +0000</pubDate>
				<category><![CDATA[Embedded Development & Programming]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/15977/m5-stack-analysis-as-a-rapid-prototyping-platform/</guid>

					<description><![CDATA[<p>Recently, DMC Embedded has been looking for a platform that allows for rapid prototyping to show proof of concept. We wanted an off-the-shelf product that had room for modularity and easy expansion for various peripherals based on&#160;the needs of the prototype. We chose the M5 Stack ecosystem because the stacking nature of the product gave [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/15977/m5-stack-analysis-as-a-rapid-prototyping-platform/">M5 Stack Analysis as a Rapid Prototyping Platform</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Recently, DMC Embedded has been looking for a platform that allows for rapid prototyping to show proof of concept. We wanted an off-the-shelf product that had room for modularity and easy expansion for various peripherals based on&nbsp;the needs of the prototype. We chose the M5 Stack ecosystem because the stacking nature of the product gave us the modularity we were looking for, while the wide range of expansion boards offered the freedom to add the features we needed. This was the first product we tested, and its results were very positive.&nbsp;</p>



<p class="wp-block-paragraph">The model we tested was the <a href="https://docs.m5stack.com/en/core/basic" target="_blank">M5 Stack Core Basic</a>. We chose this model for its simplicity, physical buttons, and validation that the most basic model can be used effectively. This model is equipped with an ESP32, SD Card slot, three physical buttons, a color LCD TFT screen, a speaker, and GPIO pinouts. Additionally, we purchased a larger battery and a proto stack, which all stacked together, nice and clean. There is also a USB-C port used for charging and programming, along with a power/reset button.&nbsp;</p>



<p class="wp-block-paragraph"><img decoding="async" alt="M5 stack" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/m5-stack.jpg"><br>
<em>Left to right:&nbsp;M5 Stack Core Basic, Battery Stack, and Proto Stack</em></p>



<p class="wp-block-paragraph">The device is based on two or three possible architectures, including Arduino, MicroPython, and UI Flow 2. MicroPython and UI Flow 2 can be combined since UI Flow 2 is a drag-and-drop language that is translated into MicroPython. The main gap between UI Flow 2 and base MicroPython is the online vs. offline aspects of the two. Since drag and drop most likely won’t be used, we’ll focus on the other two architectures.&nbsp;</p>



<h2 id="h-ui-flow-2" class="wp-block-heading">UI Flow 2</h2>



<p class="wp-block-paragraph">UI Flow 2 is a web-based IDE that allows the user to flash and burn the device through a browser-based serial. It does this using the MicroPython environment, which has a base firmware loaded to the ESP32, then replaces the main.py code for fast flashing and testing. I have supplied short tutorials for each of the methods at the end of the document, or have provided the M5 curated document.<br> &nbsp;<br> A nice feature in UI Flow 2 is the ability to design a UI in the IDE and have it created into MicroPython code. This helps when designing a screen since you can see how it looks in real time without having to flash the device each time a change is made. I did not use the drag and drop functionality much for main development, although I did use it to get an instance reference to the source code. For example, to set up UART, I dragged an Init UART and Setup UART block to get the MicroPython code that showed how those functions are actually used. I did this for many peripherals to find out how to use them without referencing the source code directly.&nbsp;</p>



<p class="wp-block-paragraph"><img decoding="async" alt="UI Flow 2 main IDE" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/UI-Flow-2-main-IDE.png"><br>
<em>UI Flow 2 main IDE</em></p>



<p class="wp-block-paragraph">I encountered one issue when using the UI Flow 2 cloud save function. My entire project seemed to have been deleted, and I couldn’t find out why. After that, I did my work in Visual Studio Code and copied the code into UI Flow 2 for fast flashing and error checking.<br> <br> Aside from that issue, I think a user could get very far with just UI Flow 2, and I would highly recommend it as a starting point to using the M5 stack, as it demonstrates how the device can be used and can even write much of it for you using the drag and drop functions. Some functions that were tested and confirmed to work were UART, screen-related changes, the buttons, write/read to the SD card, ISR, an async library, and programming the device.&nbsp;</p>



<h2 id="h-arduino" class="wp-block-heading">Arduino</h2>



<p class="wp-block-paragraph">Since the device is based on an ESP32, Arduino is another option for using the device. This can be done through the desktop-based Arduino IDE. The M5 tutorial was generally fine, although it did not show a step to get the specific device library files.</p>



<p class="wp-block-paragraph">Once all was set up, I used example code to test the board and its peripherals. The same tests that I did on the UI Flow 2 setup were done in Arduino, all of which worked.</p>



<p class="wp-block-paragraph">Another benefit of the Arduino framework is the C/C++ based language, as it is often used within DMC Embedded. Since this is a C/C++ based method, a major downfall was time. Being a compiled language, I lost a lot of time waiting for compilation and flashing of the device. Although I would prefer to use a C/C++ based language, I do not feel Arduino is the ideal environment to use the M5 in. It may have great applications depending on the use case if certain libraries are only found in Arduino. A benefit of Arduino over UI Flow 2 was that the error messages when compiling were much clearer.&nbsp;</p>



<p class="wp-block-paragraph"><img decoding="async" alt="Arduino IDE with some sample code" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Arduino-IDE-with-some-sample-code.png"><br>
<em>Arduino IDE with some sample code</em></p>



<h2 id="h-micropython" class="wp-block-heading">MicroPython</h2>



<p class="wp-block-paragraph">Although I covered some of the functionality in the UI Flow 2 section, this section focuses more on a local setup of using MicroPython on the device. This method used a different base firmware from MicroPython directly. Because of this, I had to add libraries to the firmware for the MicroPython code to work.</p>



<p class="wp-block-paragraph">When testing, I focused more on the accessibility of the device through command-line interfaces. The goal was to use VS Code extensions, although at the time of writing, none of them seemed to work anymore. Some good offline options are Thonny and PowerShell using esptool, ampy, mpremote, and REPL. The benefit of these is that you don’t need an internet connection to use them, and development can thus happen anywhere and without fear of the site being down or discontinued. This method was very quick and allowed for a similar workflow as seen in UI Flow 2. The only downside is setting things up to do this, as it can be a bit confusing. I&#8217;ve included instructions below for the reader’s ease. Also, you can use scripts to make a simpler one-click solution. You can use the base UI Flow 2 firmware as a starting point, as it has the needed drivers and libraries within it to use the M5 device effectively.&nbsp;</p>



<h2 id="h-tutorials" class="wp-block-heading">Tutorials</h2>



<h3 id="h-ui-flow-2-0" class="wp-block-heading">UI Flow 2</h3>



<p class="wp-block-paragraph">The <a href="https://docs.m5stack.com/en/uiflow2/uiflow_web" type="link" id="https://docs.m5stack.com/en/uiflow2/uiflow_web" target="_blank" rel="noreferrer noopener">tutorial provided by M5Stack</a> is pretty good. The general steps go as follows:</p>



<ol class="wp-block-list">
<li>Download M5Burner.exe</li>



<li>Burn the related UIFlow2.0 firmware
 
 
<ol class="wp-block-list">
<li>Choose COM port that the device is attached to and set baud to 1500000</li>
</ol>
</li>



<li>Open the <a href="https://uiflow2.m5stack.com/" target="_blank" rel="noreferrer noopener">UIFlow2</a> IDE
<ol class="wp-block-list">
<li>This requires you to make an account to save things</li>
</ol>
</li>



<li><a href="https://docs.m5stack.com/en/core/basic" type="link" id="https://docs.m5stack.com/en/core/basic" target="_blank" rel="noreferrer noopener">Install drivers</a> for your specific setup. I used CP210x_VCP_Windows.</li>



<li>Once in UI Flow 2, make a project and open it
 
 
<ol class="wp-block-list">
<li>A simple demo of things working is to make the screen a color
  
  
<ol class="wp-block-list">
<li>On the left side, under the UI drop-down down select UI-&gt; Screen and drag a “Set screen background color ‘Palette’” block to after the “Init built-in hardware at beginning” block</li>



<li>Select a color</li>



<li>In the bottom right corner, press run</li>



<li>A WebTerminal will come up and or a browser serial picker</li>



<li>Choose a serial port that corresponds to your setup
   
   
<ol class="wp-block-list">
<li>If this doesn’t come up, press the chain link icon in the top left corner of the terminal</li>
</ol>
</li>



<li>Press the play button to send the code to the device. The screen should now be the color you picked</li>
</ol>
</li>



<li>To burn a file to the device to use on battery power
  
  
<ol class="wp-block-list">
<li>Sometimes the burn button to the right of run works, but if not, follow the directions below</li>



<li>In the WebTerminal, select File, scroll down to main.py-&gt;Delete
<ol class="wp-block-list">
<li>This will delete what is stored locally on the device&nbsp;</li>
</ol>
</li>



<li>Create a file called main.py in a text editor, and  paste your code there</li>



<li>Press Send File to Here and select main.py-&gt; Confirm</li>
</ol>
</li>
</ol>
</li>
</ol>



<h2 id="h-arduino-nbsp" class="wp-block-heading">Arduino&nbsp;</h2>



<p class="wp-block-paragraph">The <a href="https://docs.m5stack.com/en/arduino/arduino_ide" type="link" id="https://docs.m5stack.com/en/arduino/arduino_ide" target="_blank" rel="noreferrer noopener">tutorial provided by M5Stack</a> is pretty good.</p>



<h2 id="h-micropython-0" class="wp-block-heading">MicroPython</h2>



<p class="wp-block-paragraph">This documentation is neither great nor clear. Here is the <a href="http://docs.micropython.org/en/latest/esp32/tutorial/intro.html#esp32-intro" type="link" id="http://docs.micropython.org/en/latest/esp32/tutorial/intro.html#esp32-intro" target="_blank" rel="noreferrer noopener">tutorial</a> I followed. A general guide is here:</p>



<ol class="wp-block-list">
<li>Either download a <a href="https://micropython.org/download/#esp32" type="link" id="https://micropython.org/download/#esp32">bin file</a> or use the M5Burner.exe to burn the UIFlow2.0 firmware. If you download a bin, keep following; if not, skip to step 7</li>



<li>Open a CMD or PowerShell terminal</li>



<li>Create a virtual environment for this project</li>



<li><strong>Run pip install esptool</strong> in the terminal, this will install the esptool</li>



<li>Run <strong>esptool.py &#8211;port COMX erase_flash</strong>&nbsp;
 
 
<ol class="wp-block-list">
<li>Change X with your com number</li>



<li>If this doesn’t work, try <strong>esptool &#8211;port COMX erase_flash</strong></li>
</ol>
</li>



<li>Run <strong>esptool.py &#8211;chip esp32 &#8211;port COMX write_flash -z 0x1000 YOUR_FW.bin</strong>
 
 
<ol class="wp-block-list">
<li>This should be run where your file is located</li>
</ol>
</li>



<li>If this doesn’t work, try <strong>esptool.py &#8211;chip esp32 &#8211;port COMX &#8211;baud 460800 write_flash -z 0x1000 YOUR_FW.bin</strong></li>



<li>Your ESP32 will now have firmware on it</li>



<li>At step 1.5 in the MicroPython tutorial, it changes to <a href="https://docs.micropython.org/en/latest/esp8266/tutorial/index.html#esp8266-tutorial" target="_blank">this tutorial</a></li>



<li>Now we will work on getting a main.py onto the device</li>



<li>Run <strong>pip install adafruit-ampy&nbsp;</strong></li>



<li>Run <strong>ampy &#8211;port COMX put main.py</strong></li>



<li><strong>Run ampy &#8211;port COMX run main.py</strong></li>



<li>You should now have your file running on the M5 Device</li>
</ol>



<h2 id="h-useful-links" class="wp-block-heading">Useful Links</h2>



<ul class="wp-block-list">
<li>Source code references</li>



<li><a href="https://docs.m5stack.com/en/start" type="link" id="https://docs.m5stack.com/en/start">Devices list</a></li>



<li><a href="https://uiflow2.m5stack.com/" target="_blank">UI Flow 2 IDE</a></li>



<li>MicroPython homepage</li>
</ul>



<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>Accelerate Embedded Prototyping with M5Stack</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">Explore our <a href="https://static.dmcinfo.com/services/embedded-development-and-embedded-programming/" data-type="page" data-id="431">Embedded Development</a> expertise in M5Stack, ESP32, MicroPython, and <a href="https://static.dmcinfo.com/services/embedded-development-and-embedded-programming/arduino-programming/" data-type="page" data-id="671">Arduino Programming</a> for building modular proofs of concept and rapidly validating new product ideas.</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/15977/m5-stack-analysis-as-a-rapid-prototyping-platform/">M5 Stack Analysis as a Rapid Prototyping Platform</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>DMC Dogs in the Office</title>
		<link>https://static.dmcinfo.com/blog/16625/dmc-dogs-in-the-office/</link>
		
		<dc:creator><![CDATA[Thomas Panek Gonzalez]]></dc:creator>
		<pubDate>Tue, 06 Feb 2024 16:02:07 +0000</pubDate>
				<category><![CDATA[Culture]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/16625/dmc-dogs-in-the-office/</guid>

					<description><![CDATA[<p>A wonderful aspect of working at DMC and going into the office is seeing a furry friend approach you, tail wagging. For as long as many DMC employees can remember, dogs have been allowed to come into the office. There are only two simple rules to bring a dog to the office. First and most [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/16625/dmc-dogs-in-the-office/">DMC Dogs in the Office</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">A wonderful aspect of working at DMC and going into the office is seeing a furry friend approach you, tail wagging. For as long as many DMC employees can remember, dogs have been allowed to come into the office.</p>



<p class="wp-block-paragraph">There are only two simple rules to bring a dog to the office. First and most importantly, they must behave well. This means that they play nicely with other dogs and humans alike, they don’t destroy things around the office, and they are able to keep an overall peaceful office setting for all. A second much easier hoop to jump through is to get the approval of our Founder &amp; CEO,&nbsp;<a href="https://static.dmcinfo.com/about/our-team/frank-riordan/">Frank Riordan</a>.</p>



<p class="wp-block-paragraph">As time moves on, more companies are including policies that allow pets into office settings. DMC believes they are great additions to the workplace and make all those involved much happier.</p>



<figure class="wp-block-image aligncenter size-large"><img decoding="async" width="701" height="1024" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/lenny-chair-supervising-701x1024.jpg" alt="Lenny sitting in a chair in Chicago" class="wp-image-16608" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/lenny-chair-supervising-701x1024.jpg 701w, https://static.dmcinfo.com/wp-content/uploads/2025/05/lenny-chair-supervising-205x300.jpg 205w, https://static.dmcinfo.com/wp-content/uploads/2025/05/lenny-chair-supervising-768x1121.jpg 768w, https://static.dmcinfo.com/wp-content/uploads/2025/05/lenny-chair-supervising.jpg 900w" sizes="(max-width: 701px) 100vw, 701px" /></figure>



<p class="has-text-align-center wp-block-paragraph">Lenny lays in a chair supervising the Chicago office</p>



<figure class="wp-block-image aligncenter size-large"><img decoding="async" width="838" height="1024" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/dunkin-blanket-bed-838x1024.jpg" alt="Dunkin laying on his blanket bed in Chicago" class="wp-image-16609" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/dunkin-blanket-bed-838x1024.jpg 838w, https://static.dmcinfo.com/wp-content/uploads/2025/05/dunkin-blanket-bed-245x300.jpg 245w, https://static.dmcinfo.com/wp-content/uploads/2025/05/dunkin-blanket-bed-768x939.jpg 768w, https://static.dmcinfo.com/wp-content/uploads/2025/05/dunkin-blanket-bed.jpg 900w" sizes="(max-width: 838px) 100vw, 838px" /></figure>



<p class="has-text-align-center wp-block-paragraph">Dunkin sits on his blanket bed in the Chicago office</p>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" width="900" height="879" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/bently-sticking-tongue-out.jpg" alt="Bently sticking out his tongue in the Chicago office" class="wp-image-16610" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/bently-sticking-tongue-out.jpg 900w, https://static.dmcinfo.com/wp-content/uploads/2025/05/bently-sticking-tongue-out-300x293.jpg 300w, https://static.dmcinfo.com/wp-content/uploads/2025/05/bently-sticking-tongue-out-768x750.jpg 768w" sizes="(max-width: 900px) 100vw, 900px" /></figure>



<p class="wp-block-paragraph">Bently sticks out his tongue at his owner, Nicolette from the other side of the Recruiting &amp; Onboarding team&#8217;s quad in Chicago</p>



<figure class="wp-block-image aligncenter size-large"><img decoding="async" width="771" height="1024" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/pepper-tried-long-day-771x1024.jpg" alt="Pepper tired after a long day at the Chicago office" class="wp-image-16611" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/pepper-tried-long-day-771x1024.jpg 771w, https://static.dmcinfo.com/wp-content/uploads/2025/05/pepper-tried-long-day-226x300.jpg 226w, https://static.dmcinfo.com/wp-content/uploads/2025/05/pepper-tried-long-day-768x1020.jpg 768w, https://static.dmcinfo.com/wp-content/uploads/2025/05/pepper-tried-long-day.jpg 900w" sizes="(max-width: 771px) 100vw, 771px" /></figure>



<p class="has-text-align-center wp-block-paragraph">Pepper is tired from a long day at the Chicago office</p>



<p class="wp-block-paragraph">Many employees at DMC take advantage of this rule and bring their dogs into the office. Some visit the office occasionally and others every day.</p>



<p class="wp-block-paragraph">Allowing office dogs in the workplace is great for some obvious reasons. This allows DMC pet owners to not have to stress over their dogs being home alone all day and trying to organize a way to feed them or take them out throughout the workday. The dogs also seem to enjoy the policy as they get to be in a more social environment as opposed to being home alone for the day.</p>



<p class="wp-block-paragraph">A third beneficiary of this policy is for those in the office who don’t have dogs. Dogs are known to reduce stress and boost human morale. The joy that stems from the sounds of excitement coming from the voices around the office when DMCers get to pet and greet a dog is contagious.</p>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" width="900" height="1007" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/charlie-getting-belly-rubs.jpg" alt="Charlie getting belly rubs" class="wp-image-16612" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/charlie-getting-belly-rubs.jpg 900w, https://static.dmcinfo.com/wp-content/uploads/2025/05/charlie-getting-belly-rubs-268x300.jpg 268w, https://static.dmcinfo.com/wp-content/uploads/2025/05/charlie-getting-belly-rubs-768x859.jpg 768w" sizes="(max-width: 900px) 100vw, 900px" /></figure>



<p class="has-text-align-center wp-block-paragraph">Charlie begs for belly rubs to distract Aaron and others from Chicago&#8217;s Embedded team</p>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" width="900" height="954" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/ronin-having-lunch-break.jpg" alt="Ronin having a lunch break in San Diego" class="wp-image-16613" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/ronin-having-lunch-break.jpg 900w, https://static.dmcinfo.com/wp-content/uploads/2025/05/ronin-having-lunch-break-283x300.jpg 283w, https://static.dmcinfo.com/wp-content/uploads/2025/05/ronin-having-lunch-break-768x814.jpg 768w" sizes="(max-width: 900px) 100vw, 900px" /></figure>



<p class="has-text-align-center wp-block-paragraph">Ronin enjoys his lunch break in San Diego</p>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" width="900" height="839" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/arthur-checking-floor-levelness.jpg" alt="Arthur checking floor levelness in Chicago" class="wp-image-16614" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/arthur-checking-floor-levelness.jpg 900w, https://static.dmcinfo.com/wp-content/uploads/2025/05/arthur-checking-floor-levelness-300x280.jpg 300w, https://static.dmcinfo.com/wp-content/uploads/2025/05/arthur-checking-floor-levelness-768x716.jpg 768w" sizes="(max-width: 900px) 100vw, 900px" /></figure>



<p class="has-text-align-center wp-block-paragraph">Arthur checks the Automation team&#8217;s floor levelness in Chicago</p>



<figure class="wp-block-image aligncenter size-large"><img decoding="async" width="824" height="1024" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/margaux-taking-power-nap-824x1024.jpg" alt="Margaux takes a power nape in the Test &amp; Measurement quad in the Chicago office" class="wp-image-16615" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/margaux-taking-power-nap-824x1024.jpg 824w, https://static.dmcinfo.com/wp-content/uploads/2025/05/margaux-taking-power-nap-242x300.jpg 242w, https://static.dmcinfo.com/wp-content/uploads/2025/05/margaux-taking-power-nap-768x954.jpg 768w, https://static.dmcinfo.com/wp-content/uploads/2025/05/margaux-taking-power-nap.jpg 900w" sizes="(max-width: 824px) 100vw, 824px" /></figure>



<p class="has-text-align-center wp-block-paragraph">Margaux takes a power nap in the Chicago Test &amp; Measurement team&#8217;s quad</p>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" width="900" height="879" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/bailey-nap-marketing-quad.jpg" alt="Bailey napping in the marketing quad in Chicago" class="wp-image-16616" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/bailey-nap-marketing-quad.jpg 900w, https://static.dmcinfo.com/wp-content/uploads/2025/05/bailey-nap-marketing-quad-300x293.jpg 300w, https://static.dmcinfo.com/wp-content/uploads/2025/05/bailey-nap-marketing-quad-768x750.jpg 768w" sizes="(max-width: 900px) 100vw, 900px" /></figure>



<p class="has-text-align-center wp-block-paragraph">Bailey naps in the Marketing Quad during her first week in the Chicago office</p>



<p class="wp-block-paragraph">As a dog owner myself, being able to bring my dog Lenny is an amazing perk of working at DMC. Not only do I enjoy spending time with him throughout the day, but it also helps in situations where he would otherwise be left home alone. Dogs left home alone can become stressed out, so this policy helps avoid stress on both and dogs and their owners!</p>



<p class="wp-block-paragraph">A day for a DMC Dog is very consistent. They start with a strong breakfast of kibble and some water to wash it down. From there, they can situate themselves in their owner’s quad or office and may even put their toys in places their owner will only find three weeks later or see in a Slack channel. After this, they start their first of many naps. These naps must be taken underneath desks or in high foot traffic areas — to ensure the dogs get the type of attention they are looking to receive while in the office of course.</p>



<p class="wp-block-paragraph">Occasionally, someone may be in the kitchen and the sound of a dog’s nails on the hardwood is coincidentally heard; these things must be investigated thoroughly. Every couple of hours the dogs must get dressed in their harnesses, some in coats too, to go outside and take care of business. After a group lunch, the dogs have had their fill of food and love, and they can begin their real work: which is supervising. DMC dogs are well trained in this field as they can sit anywhere and watch DMCers fulfil one of our <a href="https://static.dmcinfo.com/about/core-values">Core Values</a>: Make Things Happen.</p>



<p class="wp-block-paragraph">The last duty of a DMC dog is to wander around and hope someone pets them, talks to them in a baby voice, and maybe even spoils them with a treat. Frank’s office is a guaranteed treat haven.</p>



<p class="wp-block-paragraph">With all this talk about dogs, one may consider asking “what about cats?” Well, DMC has that covered too. On certain occasions, cats have also visited the office — some for a few hours and others for an entire day. Cats do need some higher levels of supervision as they can be quite curious, so it often helps to work in a room or closed office to prevent cat-based mischief.</p>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" width="900" height="925" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/sasha-testing-ribbon-samples.jpg" alt="Sasha testing ribbons samples" class="wp-image-16617" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/sasha-testing-ribbon-samples.jpg 900w, https://static.dmcinfo.com/wp-content/uploads/2025/05/sasha-testing-ribbon-samples-292x300.jpg 292w, https://static.dmcinfo.com/wp-content/uploads/2025/05/sasha-testing-ribbon-samples-768x789.jpg 768w" sizes="(max-width: 900px) 100vw, 900px" /></figure>



<p class="has-text-align-center wp-block-paragraph">Sasha tests ribbon samples in Chicago</p>



<figure class="wp-block-image aligncenter size-large"><img decoding="async" width="881" height="1024" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/pepper-halloween-costume-881x1024.jpg" alt="Pepper in her Halloween costume" class="wp-image-16618" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/pepper-halloween-costume-881x1024.jpg 881w, https://static.dmcinfo.com/wp-content/uploads/2025/05/pepper-halloween-costume-258x300.jpg 258w, https://static.dmcinfo.com/wp-content/uploads/2025/05/pepper-halloween-costume-768x893.jpg 768w, https://static.dmcinfo.com/wp-content/uploads/2025/05/pepper-halloween-costume.jpg 900w" sizes="(max-width: 881px) 100vw, 881px" /></figure>



<p class="has-text-align-center wp-block-paragraph">Pepper dresses up in her Halloween costume in Denver</p>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" width="900" height="583" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/ben-nd-leon-code-review.jpg" alt="Ben and Leon doing a code review in Chicago" class="wp-image-16619" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/ben-nd-leon-code-review.jpg 900w, https://static.dmcinfo.com/wp-content/uploads/2025/05/ben-nd-leon-code-review-300x194.jpg 300w, https://static.dmcinfo.com/wp-content/uploads/2025/05/ben-nd-leon-code-review-768x497.jpg 768w" sizes="(max-width: 900px) 100vw, 900px" /></figure>



<p class="has-text-align-center wp-block-paragraph">Ben assists Leon in a code review</p>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" width="900" height="589" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/nola-providing-it-support.jpg" alt="Nola providing IT support in Denver" class="wp-image-16620" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/nola-providing-it-support.jpg 900w, https://static.dmcinfo.com/wp-content/uploads/2025/05/nola-providing-it-support-300x196.jpg 300w, https://static.dmcinfo.com/wp-content/uploads/2025/05/nola-providing-it-support-768x503.jpg 768w" sizes="(max-width: 900px) 100vw, 900px" /></figure>



<p class="has-text-align-center wp-block-paragraph">Nola provides IT support in DMC Denver</p>



<figure class="wp-block-image aligncenter size-large"><img decoding="async" width="798" height="1024" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/bowsers-first-day-798x1024.jpg" alt="Bowser's first day at the office" class="wp-image-16621" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/bowsers-first-day-798x1024.jpg 798w, https://static.dmcinfo.com/wp-content/uploads/2025/05/bowsers-first-day-234x300.jpg 234w, https://static.dmcinfo.com/wp-content/uploads/2025/05/bowsers-first-day-768x986.jpg 768w, https://static.dmcinfo.com/wp-content/uploads/2025/05/bowsers-first-day.jpg 900w" sizes="(max-width: 798px) 100vw, 798px" /></figure>



<p class="has-text-align-center wp-block-paragraph">Bowser&#8217;s first day in the office was exhausting</p>



<figure class="wp-block-image aligncenter size-large"><img decoding="async" width="819" height="1024" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/nooner-luna-in-meeting-819x1024.jpg" alt="Nooner and Luna in a meeting" class="wp-image-16622" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/nooner-luna-in-meeting-819x1024.jpg 819w, https://static.dmcinfo.com/wp-content/uploads/2025/05/nooner-luna-in-meeting-240x300.jpg 240w, https://static.dmcinfo.com/wp-content/uploads/2025/05/nooner-luna-in-meeting-768x960.jpg 768w, https://static.dmcinfo.com/wp-content/uploads/2025/05/nooner-luna-in-meeting.jpg 900w" sizes="(max-width: 819px) 100vw, 819px" /></figure>



<p class="has-text-align-center wp-block-paragraph">Nooner and Luna join Elizabeth in a meeting in Seattle</p>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" width="900" height="580" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/denver-tongue-inspections.jpg" alt="Denver tongue inspections" class="wp-image-16623" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/denver-tongue-inspections.jpg 900w, https://static.dmcinfo.com/wp-content/uploads/2025/05/denver-tongue-inspections-300x193.jpg 300w, https://static.dmcinfo.com/wp-content/uploads/2025/05/denver-tongue-inspections-768x495.jpg 768w" sizes="(max-width: 900px) 100vw, 900px" /></figure>



<p class="has-text-align-center wp-block-paragraph">Denver tongue inspections</p>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" width="900" height="932" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/chicago-weekly-lay-down.jpg" alt="Chicago weekly lay down" class="wp-image-16624" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/chicago-weekly-lay-down.jpg 900w, https://static.dmcinfo.com/wp-content/uploads/2025/05/chicago-weekly-lay-down-290x300.jpg 290w, https://static.dmcinfo.com/wp-content/uploads/2025/05/chicago-weekly-lay-down-768x795.jpg 768w" sizes="(max-width: 900px) 100vw, 900px" /></figure>



<p class="has-text-align-center wp-block-paragraph">Chicago&#8217;s weekly lay down</p>



<p class="wp-block-paragraph">DMC is a pet-loving environment and is welcoming to them as long as it makes sense, so no pet alligators, I would assume. Our pets also bring a lot of culture to the workplace as they are another topic of conversation and way for employees to interact with each other. With the kind employees at DMC, you can even find a dog sitter if a less dog-friendly meeting must occur at the office.</p>



<p class="wp-block-paragraph">This policy brings joy to many of DMC’s offices and many office settings could benefit from dogs in the workplace. In DMC’s case, this is one of the best parts of going into the office!</p>



<p class="wp-block-paragraph"><strong>Learn more about DMC’s&nbsp;<a href="https://static.dmcinfo.com/careers/#culture">culture</a>&nbsp;and explore our&nbsp;<a href="https://static.dmcinfo.com/careers#openpositions">open positions</a>!</strong></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">A Paws-itively Great Place to Work. Unleash Your Potential With DMC.</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">Looking for a workplace with supportive teammates, unique perks, and four-legged coworkers? Discover what makes DMC&#8217;s <a href="https://static.dmcinfo.com/careers/culture/" id="838">culture</a> stand out. Explore <a href="https://static.dmcinfo.com/careers/" id="408">careers</a> with us and view our <a href="https://static.dmcinfo.com/careers/open-positions/" id="835">open positions</a>.</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/16625/dmc-dogs-in-the-office/">DMC Dogs in the Office</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Speeding Into Spring</title>
		<link>https://static.dmcinfo.com/blog/17596/speeding-into-spring/</link>
		
		<dc:creator><![CDATA[Thomas Panek Gonzalez]]></dc:creator>
		<pubDate>Mon, 08 May 2023 16:30:37 +0000</pubDate>
				<category><![CDATA[Activities]]></category>
		<category><![CDATA[Chicago]]></category>
		<category><![CDATA[Culture]]></category>
		<category><![CDATA[Locations]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/17596/speeding-into-spring/</guid>

					<description><![CDATA[<p>Spring has sprung in Chicago. A terribly cold winter followed by a week of heat gave DMC the itch for a joyride at K1 Speed Go Karting&#160;in Addison, IL. K1 hosts high-speed electric go karting events in their large indoor facility. The idea for the event was tossed around a few months prior but had [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/17596/speeding-into-spring/">Speeding Into Spring</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Spring has sprung in Chicago. A terribly cold winter followed by a week of heat gave DMC the itch for a joyride at <a href="https://www.k1speed.com/" target="_blank">K1 Speed Go Karting</a>&nbsp;in Addison, IL. K1 hosts high-speed electric go karting events in their large indoor facility. The idea for the event was tossed around a few months prior but had not been planned by anyone.</p>



<p class="wp-block-paragraph">While talking with some of my colleagues, the topic of an April Activity Fund event came up, and I took the initiative of getting an event planned. The ability for any DMC employee to plan&nbsp;an event for their office has always been something I thought was interesting – and &nbsp;somewhat scary – but after the fact, it&nbsp;makes me want to host more events in the future.</p>



<p class="wp-block-paragraph">Go karting was an easy choice primarily for the desire for acceleration, the need for speed if you will. The main selling point of these go-karts was that they have a max speed of 45 MPH and they don’t make you smell like gasoline. After planning with K1, we had a date, time, and general schedule for the event with about 20 people attending (including +1’s). With the closeness of the DMC community, everyone was able to make the trip by carpooling despite the long distance.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/k1-speed-group-photo.jpg" alt="K1 Speed group photo"/></figure>



<p class="wp-block-paragraph">Once everyone had arrived and signed their safety waivers, K1 served food and drinks. As we ate, excitement grew.&nbsp;When everyone finished eating, K1 employees gave us a safety debrief on how to drive the karts and what to look out for and avoid when racing.</p>



<figure class="wp-block-image size-full"><img decoding="async" width="900" height="587" src="https://static.dmcinfo.com/wp-content/uploads/2023/05/image-1.jpg" alt="Chicago K1 Speeding Event" class="wp-image-32670" srcset="https://static.dmcinfo.com/wp-content/uploads/2023/05/image-1.jpg 900w, https://static.dmcinfo.com/wp-content/uploads/2023/05/image-1-300x196.jpg 300w, https://static.dmcinfo.com/wp-content/uploads/2023/05/image-1-768x501.jpg 768w" sizes="(max-width: 900px) 100vw, 900px" /></figure>



<p class="wp-block-paragraph">People began to size up their helmet liners/facemasks and their competition; in the end, it was still a race to be the best.</p>



<p class="wp-block-paragraph">Everyone got their helmets, and half of the group was ready for their first race. Each racer was entitled to two races. The first race was the 12-lap qualifier: the goal was speed. Racers were given their ranking by fastest laps around the track. After both groups finished their first set of laps, their stats were used to make their race order for race two, the finals.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/k1-speed-race.png" alt="K1 Speed Race people going around the track"/></figure>



<p class="wp-block-paragraph">The finals were different from race one; this was position based. Racers now had to worry about taking over other racers and holding their position from other racers, all while driving around a track at high speeds. Each racer got their race stats via email for viewing – which showed metrics like individual lap speed, fastest lap, and data of the other racers as well to compare for bragging rights.</p>



<figure class="wp-block-image size-full"><img decoding="async" width="900" height="496" src="https://static.dmcinfo.com/wp-content/uploads/2023/05/image-1-1.jpg" alt="K1 Speed top three finalists" class="wp-image-32672" srcset="https://static.dmcinfo.com/wp-content/uploads/2023/05/image-1-1.jpg 900w, https://static.dmcinfo.com/wp-content/uploads/2023/05/image-1-1-300x165.jpg 300w, https://static.dmcinfo.com/wp-content/uploads/2023/05/image-1-1-768x423.jpg 768w" sizes="(max-width: 900px) 100vw, 900px" /></figure>



<p class="wp-block-paragraph">After many bumps, drifts, spinouts, and acceleration that puts a smile on your face, everyone involved had a blast.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/top-three-k1-finalists-overall.jpg" alt="top three k1 finalists overall"/></figure>



<p class="wp-block-paragraph">For a potential return to K1, DMC has considered going to a drift night that focuses more on the precision of the driver as opposed to their ability to maneuver at high speeds. Some other potential activities at K1 included a Whirly Ball clone, an arcade, and various other mode on the go-kart track.</p>



<p class="wp-block-paragraph">I think the positivity of this event will bring in those that came the first time and many more in the future. I loved being able to plan the event and bring something to DMC that everyone enjoyed. With this experience of planning, I’d like to put it towards the planning of another event that, hopefully, everyone enjoys even more.</p>



<p class="wp-block-paragraph"><strong>Learn more about <a href="https://static.dmcinfo.com/blog/category/culture/">DMC’s company culture</a> and check out our <a href="https://static.dmcinfo.com/careers/open-positions/" target="_blank" rel="noreferrer noopener">open positions</a>!</strong></p>
<p>The post <a href="https://static.dmcinfo.com/blog/17596/speeding-into-spring/">Speeding Into Spring</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Introduction to the Digilent Analog Discovery 2</title>
		<link>https://static.dmcinfo.com/blog/17666/introduction-to-the-digilent-analog-discovery-2/</link>
		
		<dc:creator><![CDATA[Thomas Panek Gonzalez]]></dc:creator>
		<pubDate>Tue, 04 Apr 2023 15:09:41 +0000</pubDate>
				<category><![CDATA[Embedded Development & Programming]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/17666/introduction-to-the-digilent-analog-discovery-2/</guid>

					<description><![CDATA[<p>The Analog Discovery 2 (AD2) by Digilent is a USB device that connects to one’s computer and has numerous features for embedded engineers, all in a convenient 3x3in package (see Figure 1). The AD2 includes important features such as a two-channel, 14-bit, 100 MS/s oscilloscope, two-channels for wave generation, a variable power supply, a voltmeter, [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/17666/introduction-to-the-digilent-analog-discovery-2/">Introduction to the Digilent Analog Discovery 2</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">The Analog Discovery 2 (AD2) by Digilent is a USB device that connects to one’s computer and has numerous features for embedded engineers, all in a convenient 3x3in package (see Figure 1).</p>



<p class="wp-block-paragraph">The AD2 includes important features such as a two-channel, 14-bit, 100 MS/s oscilloscope, two-channels for wave generation, a variable power supply, a voltmeter, and many other useful tools as shown in Figure 2.</p>



<p class="wp-block-paragraph">This can all be controlled through Digilent’s WaveForms PC app, available on Windows, MacOS, and Linux.</p>



<p class="wp-block-paragraph"><p align="center"><img decoding="async" alt="The Digilent Analog Discovery 2 Tool" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Figure-1_-The-Analog-Discovery-2.png"></p></p>



<p class="wp-block-paragraph"><p align="center">Figure 1: The Analog Discovery 2</p></p>



<p class="wp-block-paragraph"><p align="center"><img decoding="async" alt="Waveforms app showing full list of functions." src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Figure-2_-Waveforms-App-showing-full-list-of-functions_1.png"></p></p>



<p class="wp-block-paragraph"><p align="center">Figure 2: The WaveForms app showing a full list of functions</p></p>



<h2 id="h-the-waveforms-application" class="wp-block-heading">The WaveForms Application</h2>



<p class="wp-block-paragraph">The WaveForms application wraps all functions for a clear user interface that includes all of the settings required for the task at hand. For example, the oscilloscope page shown in Figure 3 has many options including scaling and viewing the two channels, and functions for achieving the desired WaveForm.</p>



<p class="wp-block-paragraph">Along the top of the interface, the user can choose from supplemental subplots that display helpful visuals such as a spectrogram to see the strength of a signal.</p>



<p class="wp-block-paragraph">Some other non-plot options can be found in the measurements tab, which allows the user to look at specific qualities of a channel such as the frequency, duty cycle, period, and even custom measurements defined by the user. The full list can be found in Figure 4.</p>



<p class="wp-block-paragraph"><p align="center"><img decoding="async" alt="The osciliscope screen." src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Figure-3_-The-Oscillope-Screen.png"></p></p>



<p class="wp-block-paragraph"><p align="center">Figure 3: The oscilloscope screen</p></p>



<p class="wp-block-paragraph"><p align="center"><img decoding="async" alt="The measurement options." src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Figure-4_-The-Measurement-Options.png"></p></p>



<p class="wp-block-paragraph"><p align="center">Figure 4: The measurement options</p></p>



<h2 id="h-the-wave-generator-screen" class="wp-block-heading">The Wave Generator Screen</h2>



<p class="wp-block-paragraph">Moving on, the wave generator screen has all the essential features of most WaveForm generators, such as an area to choose the parameters for a specific wave, as seen in figure 5. The device can create two WaveForms at once that have their own specific settings.</p>



<p class="wp-block-paragraph">The voltmeter and supplies are fairly simple but very useful for someone looking for a low current -5V to 5V supply. If more current is required, the AD2 allows for an auxiliary power source through its barrel connector which raises the max power from 500mW via USB to 2.1W with AUX. These two screens can be seen in Figure 6.</p>



<p class="wp-block-paragraph"><p align="center"><img decoding="async" alt="The wave generator screen" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Figure-5_-The-Wave-Generator-Screen.png"></p></p>



<p class="wp-block-paragraph"><p align="center">Figure 5: The Wave Generator screen</p></p>



<p class="wp-block-paragraph"><p align="center"><img decoding="async" alt="The Voltmeter and Variable Power Supply screens" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Figure-6_-The-Voltmeter-and-Variable-Power-Supply-Screens_1.png"></p></p>



<p class="wp-block-paragraph"><p align="center">Figure 6: The Voltmeter and Variable Power Supply screens</p></p>



<h2 id="h-logic-and-protocol-analyzers" class="wp-block-heading">Logic and Protocol Analyzers</h2>



<p class="wp-block-paragraph">Another useful feature of the AD2 is its logic and protocol analyzers. The logic/ protocol analyzers are useful when communications like UART, I2C, CAN, or SPI are being used. There are 16 digital I/O pins on the board that can be used for the logic analyzer and other digital I/O features such as the ability to use the I/O pins as buttons, LEDs, and switches.</p>



<p class="wp-block-paragraph">The AD2 is a powerful tool for someone who wants a full debugging toolkit that can easily be stored in their tool bag or backpack. Only a Micro-USB cable and the jumper wires required for the task are necessary to access the full capabilities of the device.</p>



<p class="wp-block-paragraph">Most of the functions can be used in tandem, such as generating a wave through a system and watching the output in the oscilloscope on the same device and screen.</p>



<p class="wp-block-paragraph">Digilent’s AD2 reference manual provides extremely detailed coverage of each of the device’s functions to best aid the user. There are also many resources on the internet about some of the more niche features, for those that require that information.</p>



<p class="wp-block-paragraph"><strong>Learn more about DMC’s <a href="https://static.dmcinfo.com/services/embedded-development-and-embedded-programming">Embedded Development</a> expertise and <a href="https://static.dmcinfo.com/contact">contact us</a> for your next project. </strong></p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://static.dmcinfo.com/blog/17666/introduction-to-the-digilent-analog-discovery-2/">Introduction to the Digilent Analog Discovery 2</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
