<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[taibo.ca]]></title><description><![CDATA[My adventures as a Maker and Software developer]]></description><link>https://taibo.ca</link><generator>GatsbyJS</generator><lastBuildDate>Thu, 01 Oct 2026 06:46:38 GMT</lastBuildDate><item><title><![CDATA[Aum2: Raspberry Pi Zero W based robot]]></title><description><![CDATA[As soon as I got my Raspberry Pi Zero W, I started thinking how to test it. I chose to use it as brain of one of those standard robot bases available online.]]></description><link>https://taibo.ca/blog/aum2-raspberry-pi-zero-w-based-robot</link><guid isPermaLink="false">https://taibo.ca/blog/aum2-raspberry-pi-zero-w-based-robot</guid><pubDate>Tue, 03 May 2022 03:29:12 GMT</pubDate><content:encoded>&lt;p&gt;As soon as I got my Raspberry Pi Zero W, I started thinking how to test it. I chose to use it as brain of one of those standard robot bases available online.&lt;/p&gt;
&lt;p&gt;I bought an &lt;a href=&quot;https://aaf.li/2913d&quot;&gt;Arduino Smart Car kit in Aliexpress&lt;/a&gt;, there is a lot of information online about this chassis, and it’s not expensive at all.&lt;/p&gt;
&lt;p&gt;As I mentioned, the brain of the robot is a Raspberry Pi Zero W, as can be seen in the images, I also connected to it the &lt;a href=&quot;https://aaf.li/b6839&quot;&gt;camera module&lt;/a&gt; and 3 &lt;a href=&quot;https://aaf.li/f09a7&quot;&gt;SR04 ultrasonic distance sensors&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 300px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/7bc67a1463ad9f977c12466188887ebe/f93b5/whatsapp-image-2017-04-17-at-10.47.37-am-300x169.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.333333333333336%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAMBAgT/xAAVAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAABVY0xUjBP/8QAGRAAAgMBAAAAAAAAAAAAAAAAAAIBETES/9oACAEBAAEFAoo6oSbVBcjP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAFxAAAwEAAAAAAAAAAAAAAAAAABExIP/aAAgBAQAGPwIjHMf/xAAaEAEAAwEBAQAAAAAAAAAAAAABABEhMUGB/9oACAEBAAE/IRjCFyHy8j1Bv4zGnZlJ17BQn//aAAwDAQACAAMAAAAQBP8A/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBABAAIDAAMAAAAAAAAAAAAAAQARITFBcbHh/9oACAEBAAE/ECt8jSFCktcI4fcQKGX0jVqFg9hMA2jvmEI1U//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Arduino smart car chassis&quot;
        title=&quot;Arduino smart car chassis&quot;
        src=&quot;/static/7bc67a1463ad9f977c12466188887ebe/f93b5/whatsapp-image-2017-04-17-at-10.47.37-am-300x169.jpg&quot;
        srcset=&quot;/static/7bc67a1463ad9f977c12466188887ebe/f93b5/whatsapp-image-2017-04-17-at-10.47.37-am-300x169.jpg 300w&quot;
        sizes=&quot;(max-width: 300px) 100vw, 300px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Arduino smart car chassis&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;I’m not using them right now, but I thought it was a good idea to lay out all the hardware in place, so I can avoid surprises down the path, when I finally want to use them.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 300px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/de3fc85e7ddc665ef8c9526da3f685b6/f93b5/img_20170418_120115-300x169.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.333333333333336%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAEEAgP/xAAWAQEBAQAAAAAAAAAAAAAAAAAAAgP/2gAMAwEAAhADEAAAAW5M53Wcg//EABgQAAMBAQAAAAAAAAAAAAAAAAACAwER/9oACAEBAAEFAmr0lbjvmuzEzT//xAAWEQEBAQAAAAAAAAAAAAAAAAAAERL/2gAIAQMBAT8BjL//xAAXEQEAAwAAAAAAAAAAAAAAAAAAAQIS/9oACAECAQE/AYs0/8QAGhAAAgIDAAAAAAAAAAAAAAAAACERQSAiof/aAAgBAQAGPwLa+CslYf/EABsQAQACAgMAAAAAAAAAAAAAAAEAIRExEGFx/9oACAEBAAE/IXWdtIG6Jl3Ehp4TXiBbJ//aAAwDAQACAAMAAAAQI+//xAAXEQADAQAAAAAAAAAAAAAAAAAAARFB/9oACAEDAQE/EHZWM//EABgRAAIDAAAAAAAAAAAAAAAAAAARASFB/9oACAECAQE/EKGLsH//xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhQTFRcYH/2gAIAQEAAT8QXOLgkwOfhA6HNpSuN0V5GtucFVHUycALWrqAEFrZP//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Aum Batteries view&quot;
        title=&quot;Aum Batteries view&quot;
        src=&quot;/static/de3fc85e7ddc665ef8c9526da3f685b6/f93b5/img_20170418_120115-300x169.jpg&quot;
        srcset=&quot;/static/de3fc85e7ddc665ef8c9526da3f685b6/f93b5/img_20170418_120115-300x169.jpg 300w&quot;
        sizes=&quot;(max-width: 300px) 100vw, 300px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Aum Batteries view&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Another choice I made was to use two different batteries, one for electronics, and another for the motors. This ensures I wont get weird stuff when the motors are draining current.&lt;/p&gt;
&lt;p&gt;To control the motors I used a &lt;a href=&quot;https://aaf.li/5d8e3&quot;&gt;16 servo driver&lt;/a&gt;, and I think that was the best decision I made on this robot. It simplified a lot the coding and made it look a lot more tidy, since many cables staid on the lower level instead of needing to connect them to the RPi.&lt;/p&gt;
&lt;p&gt;Programming in python was so simple, that I am regretting not making the change long before. I love object oriented programming, and python gave me the perfect combination between OOP an access to hardware.&lt;/p&gt;
&lt;p&gt;The first task I wanted to tackle on this robot was enabling it to be remote controled.&lt;/p&gt;
&lt;p&gt;To accomplish this I am using my android’s phone accelerometer, with an app that sends to an IP address and port, using UDP protocol, the changes in the accelerometer (and other stuff, that I´m not currently using. You can download the app &lt;a href=&quot;https://play.google.com/store/apps/details?id=org.zwiener.wimu&amp;#x26;hl=en&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;On this video you can see how it worked out:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TODO Add video&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So I’m pretty happy with it, it’s responsive enough and super intuitive to drive. I would make it more powerful though.. I might in another iteration.&lt;/p&gt;
&lt;p&gt;So, lets go to the code..&lt;/p&gt;
&lt;p&gt;I divided the code in these files, that I will be explaining one by one:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;aum2.py&lt;/li&gt;
&lt;li&gt;l298NDrive.py&lt;/li&gt;
&lt;li&gt;remoteControl.py&lt;/li&gt;
&lt;li&gt;utils.py&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;aum2py&quot;&gt;aum2.py&lt;/h2&gt;
&lt;p&gt;This is the main entry point of the application, and contains the robot class:&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;div class=&quot;code-block__bar&quot;&gt;&lt;div class=&quot;code-block__meta&quot;&gt;&lt;span class=&quot;code-block__file&quot;&gt;aum2.py&lt;/span&gt;&lt;span class=&quot;code-block__lang&quot;&gt;PY&lt;/span&gt;&lt;/div&gt;&lt;button type=&quot;button&quot; class=&quot;code-block__copy&quot; data-copy-code&gt;Copy&lt;/button&gt;&lt;/div&gt;&lt;div class=&quot;code-block__body&quot;&gt;&lt;pre class=&quot;code-block__gutter&quot; aria-hidden=&quot;true&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47&lt;/pre&gt;&lt;pre class=&quot;code-block__code&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; RPi&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;GPIO &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; GPIO
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; twisted&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;internet &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; reactor&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; task
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; l298NDrive
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; remoteControl
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; logging
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; utils

logging&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;basicConfig&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;level&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;logging&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;WARN&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
log &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; logging&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;getLogger&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Aum2&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

enableMotors &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# Motors can be disabled for testing with this&lt;/span&gt;
runFrequency &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# The frequency on wich the main Task will be ran&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Aum2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;__init__&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        log&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;debug&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Initializing Aum2 robot...&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;# Configuration&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;port &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5555&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# Port to open so the remote can connect&lt;/span&gt;
        GPIO&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;setmode&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;GPIO&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;BOARD&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;# Configure min and max servo pulse lengths&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;# Keep in mind these are not pins but servo outs&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;motors &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; l298NDrive&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;L298NDrive&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;13&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;14&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;15&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; enableMotors&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;rc &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; remoteControl&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;RemoteControl&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;port&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;processRemoteCommand&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; cmd&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;vr&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; vl&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; utils&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;joystickToDiff&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cmd&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; cmd&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;y&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;9.8&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;9.8&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4095&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4095&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;motors&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;setSpeeds&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;vr&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;vl&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;running...&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;rc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;start&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;processRemoteCommand&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        l &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; task&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;LoopingCall&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;run&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        l&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;start&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;runFrequency&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# run will be called with this frequency&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Gather our code in a main() function&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    robot &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Aum2&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    robot&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;start&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    reactor&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;run&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Standard boilerplate to call the main() function to begin&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# the program.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; __name__ &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;__main__&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    main&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Some points I’d like to comment about this file:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I am using the twisted library to be able to coordinate the Remote Control orders coming from an UDP server (I’ll show that in its corresponding source file) and the main Run method of the robot. As you can see, that method is doing nothing right now, but the idea is to add there the code to make the robot a little more autonomous.&lt;/li&gt;
&lt;li&gt;The &lt;em&gt;processRemoteCommand&lt;/em&gt; method will be called each time we get a message from the remote control, so we should act accordingly.&lt;/li&gt;
&lt;li&gt;The &lt;em&gt;start&lt;/em&gt; method is were I configure the two things that needs to be coordinated: listening for remote commands, and the robots &lt;em&gt;run&lt;/em&gt; method.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;remotecontrolpy&quot;&gt;remoteControl.py&lt;/h2&gt;
&lt;p&gt;This file contains two classes, the RemoteControl class, and the RCCommand class&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;div class=&quot;code-block__bar&quot;&gt;&lt;div class=&quot;code-block__meta&quot;&gt;&lt;span class=&quot;code-block__file&quot;&gt;remoteControl.py&lt;/span&gt;&lt;span class=&quot;code-block__lang&quot;&gt;PY&lt;/span&gt;&lt;/div&gt;&lt;button type=&quot;button&quot; class=&quot;code-block__copy&quot; data-copy-code&gt;Copy&lt;/button&gt;&lt;/div&gt;&lt;div class=&quot;code-block__body&quot;&gt;&lt;pre class=&quot;code-block__gutter&quot; aria-hidden=&quot;true&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47&lt;/pre&gt;&lt;pre class=&quot;code-block__code&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; logging
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; traceback
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; twisted&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;internet&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;protocol &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; DatagramProtocol
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; twisted&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;internet &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; reactor
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; utils

log &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; logging&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;getLogger&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;RemoteControl&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;


&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;RemoteControl&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;DatagramProtocol&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;__init__&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; port&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;port &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; port

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; onCommandReceived&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        log&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;debug&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Initializing RemoteControl...&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;onCommandReceived &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; onCommandReceived
        reactor&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;listenUDP&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;port&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;datagramReceived&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; addr&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            log&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;debug&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Received %r from %s&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; addr&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            command &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; RCCommand&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;onCommandReceived&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;command&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;except&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;KeyboardInterrupt&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; SystemExit&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;raise&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;except&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            traceback&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;print_exc&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;


&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;RCCommand&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# Timestamp [sec], sensorid, x, y, z, sensorid, x, y, z, sensorid, x, y, z&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 890.71558, 3, 0.076, 9.809, 0.565, ...&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;__init__&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; message&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;x &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;y &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;z &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;values &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; message&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;split&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;,&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;values&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;values&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;strip&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;x &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;float&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;values&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;strip&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;y &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;float&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;values&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;strip&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;z &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;float&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;values&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;strip&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            log&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;debug&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;x={} y={} z={}&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;y&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;z&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            log&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;warn&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Invalid message: {}&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;message&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Again, the RemoteControl class, uses &lt;em&gt;twisted&lt;/em&gt; framework to listen for UDP packages sent by the Android phone running  the &lt;a href=&quot;https://play.google.com/store/apps/details?id=org.zwiener.wimu&amp;#x26;hl=en&quot;&gt;Wireless IMU app&lt;/a&gt;. This application sends messages with this structure:&lt;/p&gt;
&lt;p&gt;890.71558, &lt;strong&gt;3, 0.076, 9.809, 0.565&lt;/strong&gt;, 4, -0.559, 0.032, -0.134, 5, -21.660,-36.960,-28.140&lt;/p&gt;
&lt;p&gt;I’m only interested in the part of the message I highlighted above, this would be, sensor id &lt;strong&gt;3&lt;/strong&gt;, and the three measurements provided by the accelerometer (&lt;strong&gt;0.076, 9.809, 0.565&lt;/strong&gt;). As you can see in the code, the class &lt;em&gt;RCCommand&lt;/em&gt; translates the useful par of this message into the x, and y values we need for the robot, where x is the axis that goes from front to back, and y, goes from side to side. I also have code for the z axis, but I’m not using that for now.&lt;/p&gt;
&lt;h2 id=&quot;l298ndrivepy&quot;&gt;l298NDrive.py&lt;/h2&gt;
&lt;p&gt;This is the file responsible to control the motors. For this it sends orders to the the &lt;a href=&quot;https://aaf.li/5d8e3&quot;&gt;16 Servo driver&lt;/a&gt;, which is connected to the &lt;a href=&quot;https://aaf.li/2df9b&quot;&gt;L298N Motor driver&lt;/a&gt;. I think I will probably reusing this class on every Raspberry Pi robot I build. It’s really simple and makes what it needs without complicating anything.&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;div class=&quot;code-block__bar&quot;&gt;&lt;div class=&quot;code-block__meta&quot;&gt;&lt;span class=&quot;code-block__file&quot;&gt;l298NDrive.py&lt;/span&gt;&lt;span class=&quot;code-block__lang&quot;&gt;PY&lt;/span&gt;&lt;/div&gt;&lt;button type=&quot;button&quot; class=&quot;code-block__copy&quot; data-copy-code&gt;Copy&lt;/button&gt;&lt;/div&gt;&lt;div class=&quot;code-block__body&quot;&gt;&lt;pre class=&quot;code-block__gutter&quot; aria-hidden=&quot;true&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66&lt;/pre&gt;&lt;pre class=&quot;code-block__code&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Adafruit_PCA9685
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; logging
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; math
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; utils

log &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; logging&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;getLogger&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;L298NDrive&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;


&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;L298NDrive&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;__init__&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; enA&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; in1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; in2&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; in3&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; in4&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; enB&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; enabled&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        log&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;debug&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Initializing L298Drive...&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;minPwm &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;MaxPwm &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4095&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;enA &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; enA
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;in1 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; in1
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;in2 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; in2
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;in3 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; in3
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;in4 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; in4
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;enB &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; enB
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;enabled &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; enabled
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; enabled&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;enable&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;enable&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;enabled &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;# Initialise the PCA9685 using the default address (0x40).&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pwm &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Adafruit_PCA9685&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;PCA9685&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;setSpeeds&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;disable&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;enabled &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;False&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;setSpeeds&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;# Initialise the PCA9685 using the default address (0x40).&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pwm &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;setSpeeds&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; rSpeed&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; lSpeed&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;setSpeed&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; rSpeed&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;setSpeed&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; lSpeed&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;setSpeed&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; motor&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; speed&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        pwm &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;math&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fabs&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;speed&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        log&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;info&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Motor: {} speed: {} pwm: {}&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;motor&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; speed&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; pwm&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; motor &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; speed &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;enabled&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                    self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pwm&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;set_pwm&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;in1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                    self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pwm&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;set_pwm&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;in2&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;MaxPwm&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;enabled&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                    self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pwm&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;set_pwm&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;in1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;MaxPwm&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                    self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pwm&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;set_pwm&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;in2&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;enabled&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pwm&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;set_pwm&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;enA&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; pwm&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
       &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# motor == 2&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; speed &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;enabled&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                    self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pwm&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;set_pwm&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;in3&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                    self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pwm&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;set_pwm&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;in4&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;MaxPwm&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;enabled&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                    self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pwm&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;set_pwm&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;in3&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;MaxPwm&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                    self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pwm&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;set_pwm&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;in4&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;enabled&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pwm&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;set_pwm&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;enB&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; pwm&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;!--StartFragment--&gt;
&lt;p&gt;As can be seen, the main part of the code is in the method &lt;em&gt;setSpeed(self, motor, speed)&lt;/em&gt; this method receives the motor number to configure (1=right, 2= left) and tells the Servo Driver what to do with the pins associated with that motor.&lt;/p&gt;
&lt;p&gt;Maybe a little of explanation should be given to understand why I’m doing what I’m doing there..&lt;/p&gt;
&lt;h3 id=&quot;the-l298n-motor-driver&quot;&gt;The L298N motor driver&lt;/h3&gt;
&lt;p&gt;Uses 6 pins to drive two motors:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;enA&lt;/strong&gt; Is used to tell the speed (&lt;strong&gt;using PWM)&lt;/strong&gt; we want the motor to turn&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;in1&lt;/strong&gt; When powered, Tells the driver that the motor &lt;strong&gt;1&lt;/strong&gt; should move in one direction (in2 should be OFF)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;in2&lt;/strong&gt; When powered, Tells the driver that the motor &lt;strong&gt;1&lt;/strong&gt; should move in the opposite direction (in1 should be OFF)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;in3&lt;/strong&gt; When powered, Tells the driver that the motor &lt;strong&gt;2&lt;/strong&gt; should move in one direction (in4 should be OFF)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;in4&lt;/strong&gt; When powered, Tells the driver that the motor &lt;strong&gt;2&lt;/strong&gt; should move in the opposite direction (in4 should be OFF)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;enB&lt;/strong&gt; Is used to tell the speed (&lt;strong&gt;using PWM&lt;/strong&gt;) we want the motor to turn&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So in our case, as I’m using a servo driver for all of the pins (and only 2 of them need PWM):&lt;/p&gt;
&lt;p&gt;when I do this:&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;div class=&quot;code-block__bar&quot;&gt;&lt;div class=&quot;code-block__meta&quot;&gt;&lt;span class=&quot;code-block__lang&quot;&gt;PY&lt;/span&gt;&lt;/div&gt;&lt;button type=&quot;button&quot; class=&quot;code-block__copy&quot; data-copy-code&gt;Copy&lt;/button&gt;&lt;/div&gt;&lt;div class=&quot;code-block__body&quot;&gt;&lt;pre class=&quot;code-block__gutter&quot; aria-hidden=&quot;true&quot;&gt;1&lt;/pre&gt;&lt;pre class=&quot;code-block__code&quot;&gt;&lt;code&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pwm&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;set_pwm&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;in1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;I’m really telling the servo driver that that pin (in1) should be OFF during all the PWM cicle, (so I turn OFF that pin)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;and when I do this:&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;div class=&quot;code-block__bar&quot;&gt;&lt;div class=&quot;code-block__meta&quot;&gt;&lt;span class=&quot;code-block__lang&quot;&gt;PY&lt;/span&gt;&lt;/div&gt;&lt;button type=&quot;button&quot; class=&quot;code-block__copy&quot; data-copy-code&gt;Copy&lt;/button&gt;&lt;/div&gt;&lt;div class=&quot;code-block__body&quot;&gt;&lt;pre class=&quot;code-block__gutter&quot; aria-hidden=&quot;true&quot;&gt;1&lt;/pre&gt;&lt;pre class=&quot;code-block__code&quot;&gt;&lt;code&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pwm&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;set_pwm&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;in1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;MaxPwm&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;’m really telling the servo driver that that pin (in1) should be in ON during all the PWM cicle, (so I turn ON that pin)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;And then, when I do this:&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;div class=&quot;code-block__bar&quot;&gt;&lt;div class=&quot;code-block__meta&quot;&gt;&lt;span class=&quot;code-block__lang&quot;&gt;PY&lt;/span&gt;&lt;/div&gt;&lt;button type=&quot;button&quot; class=&quot;code-block__copy&quot; data-copy-code&gt;Copy&lt;/button&gt;&lt;/div&gt;&lt;div class=&quot;code-block__body&quot;&gt;&lt;pre class=&quot;code-block__gutter&quot; aria-hidden=&quot;true&quot;&gt;1&lt;/pre&gt;&lt;pre class=&quot;code-block__code&quot;&gt;&lt;code&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pwm&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;set_pwm&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;enA&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; pwm&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;!--StartFragment--&gt;
&lt;p&gt;I use the real PWM pin, and set the pulse with that I was requested with the speed parameter.&lt;/p&gt;
&lt;h2 id=&quot;utilspy&quot;&gt;utils.py&lt;/h2&gt;
&lt;p&gt;Finally the last peace of this. This doesn’t contain a class, but all the useful functions that I think I’ll be reusing in other places.&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;div class=&quot;code-block__bar&quot;&gt;&lt;div class=&quot;code-block__meta&quot;&gt;&lt;span class=&quot;code-block__file&quot;&gt;utils.py&lt;/span&gt;&lt;span class=&quot;code-block__lang&quot;&gt;PY&lt;/span&gt;&lt;/div&gt;&lt;button type=&quot;button&quot; class=&quot;code-block__copy&quot; data-copy-code&gt;Copy&lt;/button&gt;&lt;/div&gt;&lt;div class=&quot;code-block__body&quot;&gt;&lt;pre class=&quot;code-block__gutter&quot; aria-hidden=&quot;true&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65&lt;/pre&gt;&lt;pre class=&quot;code-block__code&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; math
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; logging

log &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; logging&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;getLogger&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;utils&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;


&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;v&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; in_min&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; in_max&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; out_min&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; out_max&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# Check that the value is at least in_min&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; v &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; in_min&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    v &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; in_min

    &lt;span class=&quot;token comment&quot;&gt;# Check that the value is at most in_max&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; v &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; in_max&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
       v &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; in_max
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;v &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; in_min&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;out_max &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; out_min&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;//&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;in_max &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; in_min&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; out_min


&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;joystickToDiff&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; y&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; minJoystick&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; maxJoystick&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; minSpeed&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; maxSpeed&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# If x and y are 0, then there is not much to calculate...&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; x &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; y &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# First Compute the angle in deg&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# First hypotenuse&lt;/span&gt;
    z &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; math&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sqrt&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; x &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; y &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; y&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# angle in radians&lt;/span&gt;
    rad &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; math&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;acos&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;math&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fabs&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; z&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# and in degrees&lt;/span&gt;
    angle &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; rad &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;180&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; math&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pi

    &lt;span class=&quot;token comment&quot;&gt;# Now angle indicates the measure of turn&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# Along a straight line, with an angle o, the turn co-efficient is same&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# this applies for angles between 0-90, with angle 0 the coeff is -1&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# with angle 45, the co-efficient is 0 and with angle 90, it is 1&lt;/span&gt;

    tcoeff &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;angle &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;90&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
    turn &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; tcoeff &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; math&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fabs&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;math&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fabs&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;y&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; math&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fabs&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    turn &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;round&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;turn &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# And max of y or x is the movement&lt;/span&gt;
    mov &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;math&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fabs&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;y&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; math&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fabs&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# First and third quadrant&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; y &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; y &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        rawLeft &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; mov
        rawRight &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; turn
    &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        rawRight &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; mov
        rawLeft &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; turn

    &lt;span class=&quot;token comment&quot;&gt;# Reverse polarity&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; y &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        rawLeft &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; rawLeft
        rawRight &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; rawRight

    &lt;span class=&quot;token comment&quot;&gt;# minJoystick, maxJoystick, minSpeed, maxSpeed&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# Map the values onto the defined rang&lt;/span&gt;
    rightOut &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;rawRight&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; minJoystick&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; maxJoystick&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; minSpeed&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; maxSpeed&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    leftOut &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;rawLeft&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; minJoystick&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; maxJoystick&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; minSpeed&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; maxSpeed&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    log&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;debug&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;x={} y={}, rOut={}, lOut={}&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; y&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; rightOut&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; leftOut&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;rightOut&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; leftOut&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;There are just two methods here, the first is a port from Arduino of the &lt;strong&gt;map function&lt;/strong&gt;. It converts a value (v) within the specified input limits (in&lt;em&gt;min, in&lt;/em&gt;max) to the corresponding value within the output range (out&lt;em&gt;min, out&lt;/em&gt;max).&lt;/p&gt;
&lt;p&gt;I added limits for the input value, so I only accept a v, that is within the in&lt;em&gt;min and in&lt;/em&gt;max.&lt;/p&gt;
&lt;p&gt;The other function I have (joystickToDiff) is a little more complex, but its purpose is to convert from an joystick pair of input values, to the required speeds of the right and left motors of a Differential drive robot. This output is delivered already converted to the range of speeds specified as parameters. You can find more details on this part on this previous &lt;a href=&quot;https://taibo.ca/blog/joystick-to-differential-drive-python&quot;&gt;article&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I hope this article makes sense for you, and if I can help you in any way to make it work in your own robot, please let me know. If you see something I could improve in the article, or the code, please also let me know, I will hear your recommendations.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Joystick to Differential Drive (Python)]]></title><description><![CDATA[As I’m now working on a Raspberry Pi Zero W based robot, doing my first test on Python programming, I needed to port the function created in my previous post for Arduino (c++). This is the same but written on python]]></description><link>https://taibo.ca/blog/joystick-to-differential-drive-python</link><guid isPermaLink="false">https://taibo.ca/blog/joystick-to-differential-drive-python</guid><pubDate>Tue, 03 May 2022 03:08:42 GMT</pubDate><content:encoded>&lt;p&gt;As I’m now working on a &lt;a href=&quot;https://www.raspberrypi.org/products/pi-zero-w/&quot;&gt;Raspberry Pi Zero W&lt;/a&gt; based robot, doing my first test on Python programming, I needed to port the function created previously in this &lt;a href=&quot;http://savagemakers.com/differential-drive-tank-drive-in-arduino/&quot;&gt;article&lt;/a&gt; for Arduino (c++).&lt;/p&gt;
&lt;p&gt;This time though, I changed its name, and added the capability to provide the limits for the input and the output on any range you need it. I’ll explain why Let’s suppose you have an input that is like a joystick, so the x, and y values provided by the joystick will vary between -1 and 1, as can be seen in the diagram.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1024px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/d61ec53246073cd3c166929c385559c3/72e01/cartesian-mapping-1024x577.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.4453125%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAECAwX/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAHbhahjD//EABgQAAIDAAAAAAAAAAAAAAAAAAABAhEg/9oACAEBAAEFAmRd5//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABgQAQEBAQEAAAAAAAAAAAAAAAEAERAx/9oACAEBAAE/IVm+zJIsgOf/2gAMAwEAAgADAAAAEKMP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAGxABAAIDAQEAAAAAAAAAAAAAAQAhETFhQXH/2gAIAQEAAT8QUMAgttRYZ1mm5ppPsTb69l4w32Biif/Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Cartesian - differentical drive&quot;
        title=&quot;Cartesian - differentical drive&quot;
        src=&quot;/static/d61ec53246073cd3c166929c385559c3/72e01/cartesian-mapping-1024x577.jpg&quot;
        srcset=&quot;/static/d61ec53246073cd3c166929c385559c3/36dd4/cartesian-mapping-1024x577.jpg 512w,
/static/d61ec53246073cd3c166929c385559c3/72e01/cartesian-mapping-1024x577.jpg 1024w&quot;
        sizes=&quot;(max-width: 1024px) 100vw, 1024px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Cartesian - differentical drive&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Joystick output requirements&lt;/p&gt;
&lt;p&gt;We need to convert this pair of values, to something we can use to drive a Differential drive (aka tank drive) robot. This is what we need the bot to behave like:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 700px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/d02e5fb72be3908c672a2f60c9381486/8c557/differential-steering-tutorials-42bots2.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 42.578125%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAABFAAAARQAHJCQ3wAAACpklEQVQozy1Sa0gTUBT+fJZouQxfKaioONTUTG0+hs50Ppq6qc1Na+RjhpqPpTaF0krTxEx8MGfO6SqxMsGQosQiDSLRHlQ/jBKRCv8UBiHYZpzuwgvncO757nfuOfe7uKvhAR1wRB88pzWxICI808VjviEBK71pQA0OgmD5oV8IMpSgrTXYAuUAAmEFPvaz2AdiuLCMJVKZJ31B5mxzQutI9ZGLNJyvXLwidKChB6DxIpAun/e+PeVyW1FoK+nkFatdIs97PdFAM+z9zzlI5joFypulPPGjS3yl+jz3FCtoD7olX9rsFdG3q8lEBhnRuMLLoA0HDcrMmI602fS5RUA0kkd0Oz9tcoAHai4BTcqjyJBP7y4IyNQvYbyCO6Q/CVQei1x+01xI651Vpk4Ff8vdz7mSjbiLNe9ecDR0dq5RSj+u1RnHzgi3w0O9r6MBvgRYJ4f4lk9UC4m0yq1P7bl0NiNyEbvhDHVW+NpMbRW9VDeZtMVxRic/py6sww2HkKlIDF54XKegpzUdpskaoTEoyPM+GzeEFQwLcnfVtyviaaayxzitKqTkiIDvEELE3kn6lm5IaHsgg2hUtv3qeEgiI9izDjmkzRkjXS4ZNSIzRmuNAuUU4PCXdbhQwZeQXkp/NDlEw1Iy9UiexIKJRKNy7ZfW9OXntYLXpJe9oJZ0j01G0CyWMsFk9Rvd4pWpsrgl0uV9pL7saPYN2F2wetgRk0RDeT/nVQmrv7skv74OiiZggT1I8ne2K4r1cU3kugSkcF0cu90dYaZQhB9khz1tSuJ83MRhHv6pga4HsmDzHzM7zmnb4OIm74QTKq+YMrUvP6yek4Ju7DXDFsxsmdntxCzPOIsq7CxrZmaRrMwbIYedcWM4VYOJwEUUPLAPEUQbgAL4B1vyGqFjS7/0AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Differential drive&quot;
        title=&quot;Differential drive&quot;
        src=&quot;/static/d02e5fb72be3908c672a2f60c9381486/8c557/differential-steering-tutorials-42bots2.png&quot;
        srcset=&quot;/static/d02e5fb72be3908c672a2f60c9381486/01e7c/differential-steering-tutorials-42bots2.png 512w,
/static/d02e5fb72be3908c672a2f60c9381486/8c557/differential-steering-tutorials-42bots2.png 700w&quot;
        sizes=&quot;(max-width: 700px) 100vw, 700px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Differential drive&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;differential drive&lt;/p&gt;
&lt;p&gt;To achieve this, is that I made this function. Here you can check it:&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;div class=&quot;code-block__bar&quot;&gt;&lt;div class=&quot;code-block__meta&quot;&gt;&lt;span class=&quot;code-block__lang&quot;&gt;PY&lt;/span&gt;&lt;/div&gt;&lt;button type=&quot;button&quot; class=&quot;code-block__copy&quot; data-copy-code&gt;Copy&lt;/button&gt;&lt;/div&gt;&lt;div class=&quot;code-block__body&quot;&gt;&lt;pre class=&quot;code-block__gutter&quot; aria-hidden=&quot;true&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57&lt;/pre&gt;&lt;pre class=&quot;code-block__code&quot;&gt;&lt;code&gt;&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;joystickToDiff&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; y&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; minJoystick&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; maxJoystick&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; minSpeed&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; maxSpeed&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# If x and y are 0, then there is not much to calculate...&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; x &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; y &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# First Compute the angle in deg&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# First hypotenuse&lt;/span&gt;
    z &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; math&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sqrt&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; x &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; y &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; y&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# angle in radians&lt;/span&gt;
    rad &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; math&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;acos&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;math&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fabs&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; z&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# and in degrees&lt;/span&gt;
    angle &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; rad &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;180&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; math&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pi

    &lt;span class=&quot;token comment&quot;&gt;# Now angle indicates the measure of turn&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# Along a straight line, with an angle o, the turn co-efficient is same&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# this applies for angles between 0-90, with angle 0 the coeff is -1&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# with angle 45, the co-efficient is 0 and with angle 90, it is 1&lt;/span&gt;

    tcoeff &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;angle &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;90&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
    turn &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; tcoeff &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; math&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fabs&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;math&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fabs&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;y&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; math&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fabs&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    turn &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;round&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;turn &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# And max of y or x is the movement&lt;/span&gt;
    mov &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;math&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fabs&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;y&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; math&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fabs&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# First and third quadrant&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; y &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; y &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        rawLeft &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; mov
        rawRight &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; turn
    &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        rawRight &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; mov
        rawLeft &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; turn

    &lt;span class=&quot;token comment&quot;&gt;# Reverse polarity&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; y &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        rawLeft &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; rawLeft
        rawRight &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; rawRight

    &lt;span class=&quot;token comment&quot;&gt;# minJoystick, maxJoystick, minSpeed, maxSpeed&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# Map the values onto the defined rang&lt;/span&gt;
    rightOut &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;rawRight&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; minJoystick&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; maxJoystick&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; minSpeed&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; maxSpeed&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    leftOut &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;rawLeft&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; minJoystick&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; maxJoystick&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; minSpeed&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; maxSpeed&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;rightOut&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; leftOut&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;



&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;v&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; in_min&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; in_max&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; out_min&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; out_max&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# Check that the value is at least in_min&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; v &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; in_min&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        v &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; in_min
    &lt;span class=&quot;token comment&quot;&gt;# Check that the value is at most in_max&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; v &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; in_max&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        v &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; in_max
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;v &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; in_min&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;out_max &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; out_min&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;//&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;in_max &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; in_min&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; out_min&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;I added as many comments as I could, trying to make everything clear.&lt;/p&gt;
&lt;p&gt;So, what are the differences with the Arduino version?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The name&lt;/strong&gt;: just because I think this is more accurate to the purpose of the function&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It returns a tuple:&lt;/strong&gt; So you just get the right and left speeds on it&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The joystick and wheel speed limits&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This change is the most important. In reality, I´m not using a joystick to control the robot, but my cellphone´s accelerometer, so, thanks to this parameters, I can reconfigure the limits of the input.&lt;/p&gt;
&lt;p&gt;In case of a joystick might be -1 to 1, but in case of the accelerometer, it goes from -9.8 to 9.8 (the gravity)&lt;/p&gt;
&lt;p&gt;Also, I wanted the output to be configurable with the minSpeed, maxSpeed parameters. This allows me to just get the range of values I need for my servo controller (in my case -4095 to 4095, but you can set whatever speed limits you want there, and the output will be scaled accordingly)&lt;/p&gt;
&lt;h3 id=&quot;what-about-that-map-function&quot;&gt;What about that map function?&lt;/h3&gt;
&lt;p&gt;If you are an Arduino programmer, you might know it already, since I port it from there. It is used to map an input value from the input range limits, to the output range limits.&lt;/p&gt;
&lt;p&gt;As I´m not aware of it existing in python, I just added to my utils functions.&lt;/p&gt;
&lt;p&gt;The only difference with the Arduino version, is that I added a constraint to the value, so it cannot be smaller or bigger than the input range specified.&lt;/p&gt;
&lt;p&gt;I hope this makes sense, and if it doesn’t, please let me know. I promise I’ll do my best to make it more clear.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Joystick to Differential Drive (Arduino)]]></title><description><![CDATA[When you are building robots, one of the most common chassis you find are the ones that use Differential Drive. This means they have a motor per wheel, might be threaded, two wheels and a caster, 4 wheels, etc.]]></description><link>https://taibo.ca/blog/joystick-to-differential-drive-arduino</link><guid isPermaLink="false">https://taibo.ca/blog/joystick-to-differential-drive-arduino</guid><pubDate>Mon, 02 May 2022 04:09:59 GMT</pubDate><content:encoded>&lt;p&gt;When you are building robots, one of the most common chassis you find are the ones that use Differential Drive. This means they have a motor per wheel, might be threaded, two wheels and a caster, 4 wheels, etc.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 700px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/d02e5fb72be3908c672a2f60c9381486/8c557/differential-steering-tutorials-42bots2.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 42.578125%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAABFAAAARQAHJCQ3wAAACpklEQVQozy1Sa0gTUBT+fJZouQxfKaioONTUTG0+hs50Ppq6qc1Na+RjhpqPpTaF0krTxEx8MGfO6SqxMsGQosQiDSLRHlQ/jBKRCv8UBiHYZpzuwgvncO757nfuOfe7uKvhAR1wRB88pzWxICI808VjviEBK71pQA0OgmD5oV8IMpSgrTXYAuUAAmEFPvaz2AdiuLCMJVKZJ31B5mxzQutI9ZGLNJyvXLwidKChB6DxIpAun/e+PeVyW1FoK+nkFatdIs97PdFAM+z9zzlI5joFypulPPGjS3yl+jz3FCtoD7olX9rsFdG3q8lEBhnRuMLLoA0HDcrMmI602fS5RUA0kkd0Oz9tcoAHai4BTcqjyJBP7y4IyNQvYbyCO6Q/CVQei1x+01xI651Vpk4Ff8vdz7mSjbiLNe9ecDR0dq5RSj+u1RnHzgi3w0O9r6MBvgRYJ4f4lk9UC4m0yq1P7bl0NiNyEbvhDHVW+NpMbRW9VDeZtMVxRic/py6sww2HkKlIDF54XKegpzUdpskaoTEoyPM+GzeEFQwLcnfVtyviaaayxzitKqTkiIDvEELE3kn6lm5IaHsgg2hUtv3qeEgiI9izDjmkzRkjXS4ZNSIzRmuNAuUU4PCXdbhQwZeQXkp/NDlEw1Iy9UiexIKJRKNy7ZfW9OXntYLXpJe9oJZ0j01G0CyWMsFk9Rvd4pWpsrgl0uV9pL7saPYN2F2wetgRk0RDeT/nVQmrv7skv74OiiZggT1I8ne2K4r1cU3kugSkcF0cu90dYaZQhB9khz1tSuJ83MRhHv6pga4HsmDzHzM7zmnb4OIm74QTKq+YMrUvP6yek4Ju7DXDFsxsmdntxCzPOIsq7CxrZmaRrMwbIYedcWM4VYOJwEUUPLAPEUQbgAL4B1vyGqFjS7/0AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;differential driving&quot;
        title=&quot;differential driving&quot;
        src=&quot;/static/d02e5fb72be3908c672a2f60c9381486/8c557/differential-steering-tutorials-42bots2.png&quot;
        srcset=&quot;/static/d02e5fb72be3908c672a2f60c9381486/01e7c/differential-steering-tutorials-42bots2.png 512w,
/static/d02e5fb72be3908c672a2f60c9381486/8c557/differential-steering-tutorials-42bots2.png 700w&quot;
        sizes=&quot;(max-width: 700px) 100vw, 700px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;One way of driving this differential drive robots is sending PWM signals to each motor. But how do you convert for example the signals from a Joystick, (or any Cartesian pair of coordinates, like a direction vector) to the specific order for each wheel?&lt;/p&gt;
&lt;p&gt;That is where this function is required. It receives a pair of cartesian x, and y coordinates, and calculates the differential drive output (right and left wheel commands) you will need to send to the motors.&lt;/p&gt;
&lt;p&gt;This function will generate an output as can be seen in the following image:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1024px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/d61ec53246073cd3c166929c385559c3/72e01/cartesian-mapping-1024x577.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.4453125%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAECAwX/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAHbhahjD//EABgQAAIDAAAAAAAAAAAAAAAAAAABAhEg/9oACAEBAAEFAmRd5//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABgQAQEBAQEAAAAAAAAAAAAAAAEAERAx/9oACAEBAAE/IVm+zJIsgOf/2gAMAwEAAgADAAAAEKMP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAGxABAAIDAQEAAAAAAAAAAAAAAQAhETFhQXH/2gAIAQEAAT8QUMAgttRYZ1mm5ppPsTb69l4w32Biif/Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;cartesian mapping&quot;
        title=&quot;cartesian mapping&quot;
        src=&quot;/static/d61ec53246073cd3c166929c385559c3/72e01/cartesian-mapping-1024x577.jpg&quot;
        srcset=&quot;/static/d61ec53246073cd3c166929c385559c3/36dd4/cartesian-mapping-1024x577.jpg 512w,
/static/d61ec53246073cd3c166929c385559c3/72e01/cartesian-mapping-1024x577.jpg 1024w&quot;
        sizes=&quot;(max-width: 1024px) 100vw, 1024px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LeftMotorOutput&lt;/strong&gt; and &lt;strong&gt;RightMotorOutput&lt;/strong&gt; will hold the values you should send to the right and left motors.&lt;/p&gt;
&lt;p&gt;You can also configure the limits of x, y, and right and left motors by using the 4 constants defined on top of the code, this is handy to adapt the function to your specific scenario.&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;div class=&quot;code-block__bar&quot;&gt;&lt;div class=&quot;code-block__meta&quot;&gt;&lt;span class=&quot;code-block__lang&quot;&gt;C++&lt;/span&gt;&lt;/div&gt;&lt;button type=&quot;button&quot; class=&quot;code-block__copy&quot; data-copy-code&gt;Copy&lt;/button&gt;&lt;/div&gt;&lt;div class=&quot;code-block__body&quot;&gt;&lt;pre class=&quot;code-block__gutter&quot; aria-hidden=&quot;true&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69&lt;/pre&gt;&lt;pre class=&quot;code-block__code&quot;&gt;&lt;code&gt;&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;define&lt;/span&gt; &lt;span class=&quot;token macro-name&quot;&gt;DDRIVE_MIN&lt;/span&gt; &lt;span class=&quot;token expression&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt; &lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;//The minimum value x or y can be.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;define&lt;/span&gt; &lt;span class=&quot;token macro-name&quot;&gt;DDRIVE_MAX&lt;/span&gt; &lt;span class=&quot;token expression&quot;&gt;&lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;  &lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;//The maximum value x or y can be.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;define&lt;/span&gt; &lt;span class=&quot;token macro-name&quot;&gt;MOTOR_MIN_PWM&lt;/span&gt; &lt;span class=&quot;token expression&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;255&lt;/span&gt; &lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;//The minimum value the motor output can be.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;define&lt;/span&gt; &lt;span class=&quot;token macro-name&quot;&gt;MOTOR_MAX_PWM&lt;/span&gt; &lt;span class=&quot;token expression&quot;&gt;&lt;span class=&quot;token number&quot;&gt;255&lt;/span&gt; &lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;//The maximum value the motor output can be.&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; LeftMotorOutput&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//will hold the calculated output for the left motor&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; RightMotorOutput&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//will hold the calculated output for the right motor&lt;/span&gt;



&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;DifferentialDriveService&lt;/span&gt;&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;CalculateTankDrive&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;float&lt;/span&gt; x&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;float&lt;/span&gt; y&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
 &lt;span class=&quot;token keyword&quot;&gt;float&lt;/span&gt; rawLeft&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
 &lt;span class=&quot;token keyword&quot;&gt;float&lt;/span&gt; rawRight&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
 &lt;span class=&quot;token keyword&quot;&gt;float&lt;/span&gt; RawLeft&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
 &lt;span class=&quot;token keyword&quot;&gt;float&lt;/span&gt; RawRight&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;


 &lt;span class=&quot;token comment&quot;&gt;// first Compute the angle in deg&lt;/span&gt;
 &lt;span class=&quot;token comment&quot;&gt;// First hypotenuse&lt;/span&gt;
 &lt;span class=&quot;token keyword&quot;&gt;float&lt;/span&gt; z &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sqrt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; x &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; y &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; y&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// angle in radians&lt;/span&gt;
 &lt;span class=&quot;token keyword&quot;&gt;float&lt;/span&gt; rad &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;acos&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;abs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; z&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Cataer for NaN values&lt;/span&gt;
 &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isnan&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;rad&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
 rad &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
 &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// and in degrees&lt;/span&gt;
 &lt;span class=&quot;token keyword&quot;&gt;float&lt;/span&gt; angle &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; rad &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;180&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; PI&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Now angle indicates the measure of turn&lt;/span&gt;
 &lt;span class=&quot;token comment&quot;&gt;// Along a straight line, with an angle o, the turn co-efficient is same&lt;/span&gt;
 &lt;span class=&quot;token comment&quot;&gt;// this applies for angles between 0-90, with angle 0 the co-eff is -1&lt;/span&gt;
 &lt;span class=&quot;token comment&quot;&gt;// with angle 45, the co-efficient is 0 and with angle 90, it is 1&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;float&lt;/span&gt; tcoeff &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;angle &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;90&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
 &lt;span class=&quot;token keyword&quot;&gt;float&lt;/span&gt; turn &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; tcoeff &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;abs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;abs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;y&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;abs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
 turn &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;round&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;turn &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// And max of y or x is the movement&lt;/span&gt;
 &lt;span class=&quot;token keyword&quot;&gt;float&lt;/span&gt; mov &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;abs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;y&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;abs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// First and third quadrant&lt;/span&gt;
 &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; y &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; y &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
 &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
 rawLeft &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; mov&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; rawRight &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; turn&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
 &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
 &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;
 &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
 rawRight &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; mov&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; rawLeft &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; turn&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
 &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Reverse polarity&lt;/span&gt;
 &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;y &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
 rawLeft &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; rawLeft&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
 rawRight &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; rawRight&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
 &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Update the values&lt;/span&gt;
 RawLeft &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; rawLeft&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
 RawRight &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; rawRight&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Map the values onto the defined rang&lt;/span&gt;
 LeftMotorOutput &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;rawLeft&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; DDRIVE_MIN&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; DDRIVE_MAX&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; MOTOR_MIN_PWM&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; MOTOR_MAX_PWM&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
 RightMotorOutput &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;rawRight&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; DDRIVE_MIN&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; DDRIVE_MAX&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; MOTOR_MIN_PWM&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; MOTOR_MAX_PWM&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;If you find this code snippet useful, need help to make it work, or to understand it, please leave a comment and we can talk about it!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Radio Controlled Minnie Mouse Quad]]></title><description><![CDATA[Some time ago I found in the curb a perfectly working Minnie Mouse Quad, This project is about making that Minnie Mouse Quad radio controlled.]]></description><link>https://taibo.ca/blog/radio-controlled-minnie-mouse-quad</link><guid isPermaLink="false">https://taibo.ca/blog/radio-controlled-minnie-mouse-quad</guid><pubDate>Sun, 01 May 2022 17:43:04 GMT</pubDate><content:encoded>&lt;p&gt;Some time ago I found in the curb a perfectly working Minnie Mouse Quad, This project is about making that Minnie Mouse Quad radio controlled.&lt;/p&gt;
&lt;p&gt;Why would I want to do that?&lt;/p&gt;
&lt;p&gt;First: My daughter, the Quad and me frequently go to the park one block from home to ride it. We don’t take the stroller, as we have the quad for her to ride. After five minutes she get bored of riding it.. Now I have to carry home my daughter and the quad… Wouldn’t it be nice to just sit my daughter in the quad and drive it home? Or at least only carry her?&lt;/p&gt;
&lt;p&gt;Second: Its cool to drive such a big car remotely!&lt;/p&gt;
&lt;p&gt;So lets do it!&lt;/p&gt;
&lt;p&gt;You can probably get based on this project to convert any kind of toddler vehicle to Radio Control. If that’s the case, please share some pics of your project, I’d love to see it!&lt;/p&gt;
&lt;p&gt;The benefit of using an already electric car, is that I don’t need to worry much about power and adding a motor as those are already there and working.&lt;/p&gt;
&lt;p&gt;The main issue here, is controlling the stearing remotely. For that, I designed a servo linear actuator, that produces the same movement the stearing wheel would.&lt;/p&gt;
&lt;p&gt;You can find the 3D design of the servo linear actuator &lt;a href=&quot;https://aaf.li/f20cd&quot;&gt;here at Printables.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Once this is installed (as you can see it is done in the pics), the only remaining thing is to re work the connections, so we can control the motor from both the driver activated button, and the remote control receiver.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Starting a new blog..]]></title><description><![CDATA[So, I decided to give a try to this blogging thing, lets see how it goes!]]></description><link>https://taibo.ca/blog/starting-a-new-blog</link><guid isPermaLink="false">https://taibo.ca/blog/starting-a-new-blog</guid><pubDate>Sun, 01 May 2022 05:19:55 GMT</pubDate><content:encoded>&lt;p&gt;So, I decided to give a try to this blogging thing, lets see how it goes!&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Note to myself: Learn to write longer post.&lt;/p&gt;</content:encoded></item></channel></rss>