RC Robot Tutorial

This commit is contained in:
2025-07-21 03:08:18 -04:00
parent f94208f921
commit 51b11d2e67
3 changed files with 51 additions and 31 deletions

View File

@@ -1,4 +1,4 @@
# Sphinx build info version 1 # Sphinx build info version 1
# This file records the configuration used when building these files. When it is not found, a full rebuild will be done. # This file records the configuration used when building these files. When it is not found, a full rebuild will be done.
config: e22baa48f9e7069a3e9b5dc9ddc22300 config: 796e17b103e65790f3a1610a89da3193
tags: 62a1e7829a13fc7881b6498c52484ec0 tags: 62a1e7829a13fc7881b6498c52484ec0

View File

@@ -725,7 +725,9 @@ left turn, the receiver translates the signal into 100% PWM on the left-side mot
to pivot. The opposite occurs for a right turn, with 100% PWM on the right and 0% on the left, enabling precise directional control. to pivot. The opposite occurs for a right turn, with 100% PWM on the right and 0% on the left, enabling precise directional control.
</p> </p>
<p> <p>
The table below summarizes the reserved GPIOs. The table below summarizes the reserved GPIOs. These GPIOs are hard-wired to the corresponding components, and hard-coded in the
corresponding functions. For example, the GPIOs 0 and 1 are hard-wired to the joystick x- and y- axis, respectively; and, hard-coded
to read analog values and store them in the corresponding x- and y- variables.
</p> </p>
<table class="docutils align-default"> <table class="docutils align-default">
<thead> <thead>
@@ -910,11 +912,10 @@ to pivot. The opposite occurs for a right turn, with 100% PWM on the right and 0
</tbody> </tbody>
</table> </table>
<p> <p>
The The struct used to store motor PWM values is shown below. While the bitByteRider RC car can be effectively controlled using
<em> just two PWM signals&mdash;one for each side&mdash;the structure is designed to hold four values, allowing room for future enhancements. This
struct forward-thinking design supports potential upgrades such as improved maneuverability, individual wheel control, or advanced driving
</em> modes, making the system more adaptable and scalable for future development.
for storing motors PWM values.
</p> </p>
<div class="highlight-c notranslate"> <div class="highlight-c notranslate">
<div class="highlight"> <div class="highlight">
@@ -928,7 +929,11 @@ to pivot. The opposite occurs for a right turn, with 100% PWM on the right and 0
</div> </div>
</div> </div>
<p> <p>
The function for updating motors&rsquo; PWM values. On the transmitter`` device, the PWM values for the DC motors are send to the receover using the following function. The variable
<strong>
receiver_mac
</strong>
stores the MAC address of the receiver device (ESP32-C3 bitBoard on the RC car).
</p> </p>
<div class="highlight-c notranslate"> <div class="highlight-c notranslate">
<div class="highlight"> <div class="highlight">
@@ -965,29 +970,9 @@ to pivot. The opposite occurs for a right turn, with 100% PWM on the right and 0
</div> </div>
</div> </div>
<p> <p>
The onDataReceived() and onDataSent() are two call-back functions that get evoked on each corresponding event. This function is invoked by a dedicated FreeRTOS task every 100 milliseconds, ensuring consistent and timely transmission of
</p> control data to the receiver device. By leveraging FreeRTOS&rsquo;s precise task scheduling, the system maintains low-latency
<div class="highlight-c notranslate"> communication and predictable behavior&mdash;critical for real-time control in embedded applications.
<div class="highlight">
<pre><span></span><span class="c1">// Call-back for the event when data is being received</span>
<span class="kt">void</span><span class="w"> </span><span class="nf">onDataReceived</span><span class="w"> </span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="o">*</span><span class="n">mac_addr</span><span class="p">,</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="o">*</span><span class="n">data</span><span class="p">,</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">data_len</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">buf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">sensors_data_t</span><span class="o">*</span><span class="p">)</span><span class="n">data</span><span class="p">;</span><span class="w"> </span><span class="c1">// Allocate memory for buffer to store data being received</span>
<span class="w"> </span><span class="n">ESP_LOGW</span><span class="p">(</span><span class="n">TAG</span><span class="p">,</span><span class="w"> </span><span class="s">"Data was received"</span><span class="p">);</span>
<span class="w"> </span><span class="n">ESP_LOGI</span><span class="p">(</span><span class="n">TAG</span><span class="p">,</span><span class="w"> </span><span class="s">"x-axis: 0x%04x"</span><span class="p">,</span><span class="w"> </span><span class="n">buf</span><span class="o">-&gt;</span><span class="n">x_axis</span><span class="p">);</span>
<span class="w"> </span><span class="n">ESP_LOGI</span><span class="p">(</span><span class="n">TAG</span><span class="p">,</span><span class="w"> </span><span class="s">"x-axis: 0x%04x"</span><span class="p">,</span><span class="w"> </span><span class="n">buf</span><span class="o">-&gt;</span><span class="n">y_axis</span><span class="p">);</span>
<span class="w"> </span><span class="n">ESP_LOGI</span><span class="p">(</span><span class="n">TAG</span><span class="p">,</span><span class="w"> </span><span class="s">"PWM 1: 0x%04x"</span><span class="p">,</span><span class="w"> </span><span class="n">buf</span><span class="o">-&gt;</span><span class="n">motor1_rpm_pwm</span><span class="p">);</span>
<span class="p">}</span>
<span class="c1">// Call-back for the event when data is being sent</span>
<span class="kt">void</span><span class="w"> </span><span class="nf">onDataSent</span><span class="w"> </span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="o">*</span><span class="n">mac_addr</span><span class="p">,</span><span class="w"> </span><span class="n">esp_now_send_status_t</span><span class="w"> </span><span class="n">status</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">ESP_LOGW</span><span class="p">(</span><span class="n">TAG</span><span class="p">,</span><span class="w"> </span><span class="s">"Packet send status: 0x%04X"</span><span class="p">,</span><span class="w"> </span><span class="n">status</span><span class="p">);</span>
<span class="p">}</span>
</pre>
</div>
</div>
<p>
The rc_send_data_task() function runs every 0.1 second to transmit the data to the receiver.
</p> </p>
<div class="highlight-c notranslate"> <div class="highlight-c notranslate">
<div class="highlight"> <div class="highlight">
@@ -1003,6 +988,41 @@ to pivot. The opposite occurs for a right turn, with 100% PWM on the right and 0
</pre> </pre>
</div> </div>
</div> </div>
<p>
As data is being sent, the function onDataSent() is called to check &amp; display the status of the data transmission.
</p>
<div class="highlight-c notranslate">
<div class="highlight">
<pre><span></span><span class="c1">// Call-back for the event when data is being sent</span>
<span class="kt">void</span><span class="w"> </span><span class="nf">onDataSent</span><span class="w"> </span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="o">*</span><span class="n">mac_addr</span><span class="p">,</span><span class="w"> </span><span class="n">esp_now_send_status_t</span><span class="w"> </span><span class="n">status</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">ESP_LOGW</span><span class="p">(</span><span class="n">TAG</span><span class="p">,</span><span class="w"> </span><span class="s">"Packet send status: 0x%04X"</span><span class="p">,</span><span class="w"> </span><span class="n">status</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">...</span><span class="w"> </span><span class="p">...</span><span class="w"> </span><span class="p">...</span>
<span class="p">...</span><span class="w"> </span><span class="p">...</span><span class="w"> </span><span class="p">...</span>
</pre>
</div>
</div>
<p>
On the receiver device, the data is saved in the variables by the call-back function onDataReceived().
</p>
<div class="highlight-c notranslate">
<div class="highlight">
<pre><span></span><span class="c1">// Call-back for the event when data is being received</span>
<span class="kt">void</span><span class="w"> </span><span class="nf">onDataReceived</span><span class="w"> </span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="o">*</span><span class="n">mac_addr</span><span class="p">,</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="o">*</span><span class="n">data</span><span class="p">,</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">data_len</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">buf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">sensors_data_t</span><span class="o">*</span><span class="p">)</span><span class="n">data</span><span class="p">;</span><span class="w"> </span><span class="c1">// Allocate memory for buffer to store data being received</span>
<span class="w"> </span><span class="n">ESP_LOGW</span><span class="p">(</span><span class="n">TAG</span><span class="p">,</span><span class="w"> </span><span class="s">"Data was received"</span><span class="p">);</span>
<span class="w"> </span><span class="n">ESP_LOGI</span><span class="p">(</span><span class="n">TAG</span><span class="p">,</span><span class="w"> </span><span class="s">"x-axis: 0x%04x"</span><span class="p">,</span><span class="w"> </span><span class="n">buf</span><span class="o">-&gt;</span><span class="n">x_axis</span><span class="p">);</span>
<span class="w"> </span><span class="n">ESP_LOGI</span><span class="p">(</span><span class="n">TAG</span><span class="p">,</span><span class="w"> </span><span class="s">"x-axis: 0x%04x"</span><span class="p">,</span><span class="w"> </span><span class="n">buf</span><span class="o">-&gt;</span><span class="n">y_axis</span><span class="p">);</span>
<span class="w"> </span><span class="n">ESP_LOGI</span><span class="p">(</span><span class="n">TAG</span><span class="p">,</span><span class="w"> </span><span class="s">"PWM 1: 0x%04x"</span><span class="p">,</span><span class="w"> </span><span class="n">buf</span><span class="o">-&gt;</span><span class="n">motor1_rpm_pwm</span><span class="p">);</span>
<span class="p">}</span>
</pre>
</div>
</div>
<p>
The rc_send_data_task() function runs every 0.1 second to transmit the data to the receiver.
</p>
</section> </section>
<section id="schematic"> <section id="schematic">
<h3> <h3>