{"componentChunkName":"component---src-create-pages-templates-blog-post-tsx","path":"/blog/aum2-raspberry-pi-zero-w-based-robot","result":{"data":{"markdownRemark":{"id":"69e9883f-1791-569a-8d1d-020296832911","html":"<p>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.</p>\n<p>I bought an <a href=\"https://aaf.li/2913d\">Arduino Smart Car kit in Aliexpress</a>, there is a lot of information online about this chassis, and it’s not expensive at all.</p>\n<p>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 <a href=\"https://aaf.li/b6839\">camera module</a> and 3 <a href=\"https://aaf.li/f09a7\">SR04 ultrasonic distance sensors</a>.</p>\n<p><figure class=\"gatsby-resp-image-figure\" style=\"\">\n    <span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 300px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/7bc67a1463ad9f977c12466188887ebe/f93b5/whatsapp-image-2017-04-17-at-10.47.37-am-300x169.jpg\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 56.333333333333336%; position: relative; bottom: 0; left: 0; background-image: url('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'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Arduino smart car chassis\"\n        title=\"Arduino smart car chassis\"\n        src=\"/static/7bc67a1463ad9f977c12466188887ebe/f93b5/whatsapp-image-2017-04-17-at-10.47.37-am-300x169.jpg\"\n        srcset=\"/static/7bc67a1463ad9f977c12466188887ebe/f93b5/whatsapp-image-2017-04-17-at-10.47.37-am-300x169.jpg 300w\"\n        sizes=\"(max-width: 300px) 100vw, 300px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n  </a>\n    </span>\n    <figcaption class=\"gatsby-resp-image-figcaption\">Arduino smart car chassis</figcaption>\n  </figure></p>\n<p>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.</p>\n<p><figure class=\"gatsby-resp-image-figure\" style=\"\">\n    <span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 300px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/de3fc85e7ddc665ef8c9526da3f685b6/f93b5/img_20170418_120115-300x169.jpg\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 56.333333333333336%; position: relative; bottom: 0; left: 0; background-image: url('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'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Aum Batteries view\"\n        title=\"Aum Batteries view\"\n        src=\"/static/de3fc85e7ddc665ef8c9526da3f685b6/f93b5/img_20170418_120115-300x169.jpg\"\n        srcset=\"/static/de3fc85e7ddc665ef8c9526da3f685b6/f93b5/img_20170418_120115-300x169.jpg 300w\"\n        sizes=\"(max-width: 300px) 100vw, 300px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n  </a>\n    </span>\n    <figcaption class=\"gatsby-resp-image-figcaption\">Aum Batteries view</figcaption>\n  </figure></p>\n<p>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.</p>\n<p>To control the motors I used a <a href=\"https://aaf.li/5d8e3\">16 servo driver</a>, 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.</p>\n<p>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.</p>\n<p>The first task I wanted to tackle on this robot was enabling it to be remote controled.</p>\n<p>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 <a href=\"https://play.google.com/store/apps/details?id=org.zwiener.wimu&#x26;hl=en\">here</a>.</p>\n<p>On this video you can see how it worked out:</p>\n<p><strong>TODO Add video</strong></p>\n<p>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.</p>\n<p>So, lets go to the code..</p>\n<p>I divided the code in these files, that I will be explaining one by one:</p>\n<ul>\n<li>aum2.py</li>\n<li>l298NDrive.py</li>\n<li>remoteControl.py</li>\n<li>utils.py</li>\n</ul>\n<h2 id=\"aum2py\">aum2.py</h2>\n<p>This is the main entry point of the application, and contains the robot class:</p>\n<div class=\"code-block\"><div class=\"code-block__bar\"><div class=\"code-block__meta\"><span class=\"code-block__file\">aum2.py</span><span class=\"code-block__lang\">PY</span></div><button type=\"button\" class=\"code-block__copy\" data-copy-code>Copy</button></div><div class=\"code-block__body\"><pre class=\"code-block__gutter\" aria-hidden=\"true\">1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47</pre><pre class=\"code-block__code\"><code><span class=\"token keyword\">import</span> RPi<span class=\"token punctuation\">.</span>GPIO <span class=\"token keyword\">as</span> GPIO\n<span class=\"token keyword\">from</span> twisted<span class=\"token punctuation\">.</span>internet <span class=\"token keyword\">import</span> reactor<span class=\"token punctuation\">,</span> task\n<span class=\"token keyword\">import</span> l298NDrive\n<span class=\"token keyword\">import</span> remoteControl\n<span class=\"token keyword\">import</span> logging\n<span class=\"token keyword\">import</span> utils\n\nlogging<span class=\"token punctuation\">.</span>basicConfig<span class=\"token punctuation\">(</span>level<span class=\"token operator\">=</span>logging<span class=\"token punctuation\">.</span>WARN<span class=\"token punctuation\">)</span>\nlog <span class=\"token operator\">=</span> logging<span class=\"token punctuation\">.</span>getLogger<span class=\"token punctuation\">(</span><span class=\"token string\">'Aum2'</span><span class=\"token punctuation\">)</span>\n\nenableMotors <span class=\"token operator\">=</span> <span class=\"token boolean\">True</span> <span class=\"token comment\"># Motors can be disabled for testing with this</span>\nrunFrequency <span class=\"token operator\">=</span> <span class=\"token number\">1</span> <span class=\"token comment\"># The frequency on wich the main Task will be ran</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">Aum2</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">object</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">__init__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        log<span class=\"token punctuation\">.</span>debug<span class=\"token punctuation\">(</span><span class=\"token string\">\"Initializing Aum2 robot...\"</span><span class=\"token punctuation\">)</span>\n        <span class=\"token comment\"># Configuration</span>\n        self<span class=\"token punctuation\">.</span>port <span class=\"token operator\">=</span> <span class=\"token number\">5555</span> <span class=\"token comment\"># Port to open so the remote can connect</span>\n        GPIO<span class=\"token punctuation\">.</span>setmode<span class=\"token punctuation\">(</span>GPIO<span class=\"token punctuation\">.</span>BOARD<span class=\"token punctuation\">)</span>\n        <span class=\"token comment\"># Configure min and max servo pulse lengths</span>\n        <span class=\"token comment\"># Keep in mind these are not pins but servo outs</span>\n        self<span class=\"token punctuation\">.</span>motors <span class=\"token operator\">=</span> l298NDrive<span class=\"token punctuation\">.</span>L298NDrive<span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">,</span> <span class=\"token number\">11</span><span class=\"token punctuation\">,</span> <span class=\"token number\">12</span><span class=\"token punctuation\">,</span> <span class=\"token number\">13</span><span class=\"token punctuation\">,</span> <span class=\"token number\">14</span><span class=\"token punctuation\">,</span> <span class=\"token number\">15</span><span class=\"token punctuation\">,</span> enableMotors<span class=\"token punctuation\">)</span>\n        self<span class=\"token punctuation\">.</span>rc <span class=\"token operator\">=</span> remoteControl<span class=\"token punctuation\">.</span>RemoteControl<span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>port<span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">processRemoteCommand</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> cmd<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token punctuation\">(</span>vr<span class=\"token punctuation\">,</span> vl<span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span> utils<span class=\"token punctuation\">.</span>joystickToDiff<span class=\"token punctuation\">(</span>cmd<span class=\"token punctuation\">.</span>x<span class=\"token punctuation\">,</span> cmd<span class=\"token punctuation\">.</span>y<span class=\"token punctuation\">,</span> <span class=\"token operator\">-</span><span class=\"token number\">9.8</span><span class=\"token punctuation\">,</span> <span class=\"token number\">9.8</span><span class=\"token punctuation\">,</span> <span class=\"token operator\">-</span><span class=\"token number\">4095</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4095</span><span class=\"token punctuation\">)</span>\n        self<span class=\"token punctuation\">.</span>motors<span class=\"token punctuation\">.</span>setSpeeds<span class=\"token punctuation\">(</span><span class=\"token builtin\">int</span><span class=\"token punctuation\">(</span>vr<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">int</span><span class=\"token punctuation\">(</span><span class=\"token operator\">-</span>vl<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">run</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"running...\"</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">start</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>rc<span class=\"token punctuation\">.</span>start<span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>processRemoteCommand<span class=\"token punctuation\">)</span>\n        l <span class=\"token operator\">=</span> task<span class=\"token punctuation\">.</span>LoopingCall<span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>run<span class=\"token punctuation\">)</span>\n        l<span class=\"token punctuation\">.</span>start<span class=\"token punctuation\">(</span>runFrequency<span class=\"token punctuation\">)</span> <span class=\"token comment\"># run will be called with this frequency</span>\n\n<span class=\"token comment\"># Gather our code in a main() function</span>\n<span class=\"token keyword\">def</span> <span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    robot <span class=\"token operator\">=</span> Aum2<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    robot<span class=\"token punctuation\">.</span>start<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    reactor<span class=\"token punctuation\">.</span>run<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># Standard boilerplate to call the main() function to begin</span>\n<span class=\"token comment\"># the program.</span>\n<span class=\"token keyword\">if</span> __name__ <span class=\"token operator\">==</span> <span class=\"token string\">'__main__'</span><span class=\"token punctuation\">:</span>\n    main<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></code></pre></div></div>\n<p>Some points I’d like to comment about this file:</p>\n<ul>\n<li>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.</li>\n<li>The <em>processRemoteCommand</em> method will be called each time we get a message from the remote control, so we should act accordingly.</li>\n<li>The <em>start</em> method is were I configure the two things that needs to be coordinated: listening for remote commands, and the robots <em>run</em> method.</li>\n</ul>\n<h2 id=\"remotecontrolpy\">remoteControl.py</h2>\n<p>This file contains two classes, the RemoteControl class, and the RCCommand class</p>\n<div class=\"code-block\"><div class=\"code-block__bar\"><div class=\"code-block__meta\"><span class=\"code-block__file\">remoteControl.py</span><span class=\"code-block__lang\">PY</span></div><button type=\"button\" class=\"code-block__copy\" data-copy-code>Copy</button></div><div class=\"code-block__body\"><pre class=\"code-block__gutter\" aria-hidden=\"true\">1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47</pre><pre class=\"code-block__code\"><code><span class=\"token keyword\">import</span> logging\n<span class=\"token keyword\">import</span> traceback\n<span class=\"token keyword\">from</span> twisted<span class=\"token punctuation\">.</span>internet<span class=\"token punctuation\">.</span>protocol <span class=\"token keyword\">import</span> DatagramProtocol\n<span class=\"token keyword\">from</span> twisted<span class=\"token punctuation\">.</span>internet <span class=\"token keyword\">import</span> reactor\n<span class=\"token keyword\">import</span> utils\n\nlog <span class=\"token operator\">=</span> logging<span class=\"token punctuation\">.</span>getLogger<span class=\"token punctuation\">(</span><span class=\"token string\">'RemoteControl'</span><span class=\"token punctuation\">)</span>\n\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">RemoteControl</span><span class=\"token punctuation\">(</span>DatagramProtocol<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">__init__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> port<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>port <span class=\"token operator\">=</span> port\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">start</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> onCommandReceived<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        log<span class=\"token punctuation\">.</span>debug<span class=\"token punctuation\">(</span><span class=\"token string\">\"Initializing RemoteControl...\"</span><span class=\"token punctuation\">)</span>\n        self<span class=\"token punctuation\">.</span>onCommandReceived <span class=\"token operator\">=</span> onCommandReceived\n        reactor<span class=\"token punctuation\">.</span>listenUDP<span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>port<span class=\"token punctuation\">,</span> self<span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">datagramReceived</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> data<span class=\"token punctuation\">,</span> addr<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">try</span><span class=\"token punctuation\">:</span>\n            log<span class=\"token punctuation\">.</span>debug<span class=\"token punctuation\">(</span><span class=\"token string\">\"Received %r from %s\"</span> <span class=\"token operator\">%</span> <span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">,</span> addr<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n            command <span class=\"token operator\">=</span> RCCommand<span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span>\n            self<span class=\"token punctuation\">.</span>onCommandReceived<span class=\"token punctuation\">(</span>command<span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">except</span> <span class=\"token punctuation\">(</span>KeyboardInterrupt<span class=\"token punctuation\">,</span> SystemExit<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">raise</span>\n        <span class=\"token keyword\">except</span><span class=\"token punctuation\">:</span>\n            traceback<span class=\"token punctuation\">.</span>print_exc<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">RCCommand</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">object</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token comment\"># Timestamp [sec], sensorid, x, y, z, sensorid, x, y, z, sensorid, x, y, z</span>\n    <span class=\"token comment\"># 890.71558, 3, 0.076, 9.809, 0.565, ...</span>\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">__init__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> message<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>x <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n        self<span class=\"token punctuation\">.</span>y <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n        self<span class=\"token punctuation\">.</span>z <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n        self<span class=\"token punctuation\">.</span>values <span class=\"token operator\">=</span> message<span class=\"token punctuation\">.</span>split<span class=\"token punctuation\">(</span><span class=\"token string\">\",\"</span><span class=\"token punctuation\">)</span>\n\n        <span class=\"token keyword\">if</span> <span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>values<span class=\"token punctuation\">)</span> <span class=\"token operator\">>=</span> <span class=\"token number\">5</span> <span class=\"token keyword\">and</span> self<span class=\"token punctuation\">.</span>values<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>strip<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">==</span> <span class=\"token string\">\"3\"</span><span class=\"token punctuation\">:</span>\n            self<span class=\"token punctuation\">.</span>x <span class=\"token operator\">=</span> <span class=\"token operator\">-</span><span class=\"token builtin\">float</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>values<span class=\"token punctuation\">[</span><span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>strip<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n            self<span class=\"token punctuation\">.</span>y <span class=\"token operator\">=</span> <span class=\"token operator\">-</span><span class=\"token builtin\">float</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>values<span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>strip<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n            self<span class=\"token punctuation\">.</span>z <span class=\"token operator\">=</span> <span class=\"token builtin\">float</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>values<span class=\"token punctuation\">[</span><span class=\"token number\">4</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>strip<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n            log<span class=\"token punctuation\">.</span>debug<span class=\"token punctuation\">(</span><span class=\"token string\">\"x={} y={} z={}\"</span><span class=\"token punctuation\">.</span><span class=\"token builtin\">format</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>x<span class=\"token punctuation\">,</span> self<span class=\"token punctuation\">.</span>y<span class=\"token punctuation\">,</span> self<span class=\"token punctuation\">.</span>z<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n            log<span class=\"token punctuation\">.</span>warn<span class=\"token punctuation\">(</span><span class=\"token string\">\"Invalid message: {}\"</span><span class=\"token punctuation\">.</span><span class=\"token builtin\">format</span><span class=\"token punctuation\">(</span>message<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div></div>\n<p>Again, the RemoteControl class, uses <em>twisted</em> framework to listen for UDP packages sent by the Android phone running  the <a href=\"https://play.google.com/store/apps/details?id=org.zwiener.wimu&#x26;hl=en\">Wireless IMU app</a>. This application sends messages with this structure:</p>\n<p>890.71558, <strong>3, 0.076, 9.809, 0.565</strong>, 4, -0.559, 0.032, -0.134, 5, -21.660,-36.960,-28.140</p>\n<p>I’m only interested in the part of the message I highlighted above, this would be, sensor id <strong>3</strong>, and the three measurements provided by the accelerometer (<strong>0.076, 9.809, 0.565</strong>). As you can see in the code, the class <em>RCCommand</em> 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.</p>\n<h2 id=\"l298ndrivepy\">l298NDrive.py</h2>\n<p>This is the file responsible to control the motors. For this it sends orders to the the <a href=\"https://aaf.li/5d8e3\">16 Servo driver</a>, which is connected to the <a href=\"https://aaf.li/2df9b\">L298N Motor driver</a>. 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.</p>\n<div class=\"code-block\"><div class=\"code-block__bar\"><div class=\"code-block__meta\"><span class=\"code-block__file\">l298NDrive.py</span><span class=\"code-block__lang\">PY</span></div><button type=\"button\" class=\"code-block__copy\" data-copy-code>Copy</button></div><div class=\"code-block__body\"><pre class=\"code-block__gutter\" aria-hidden=\"true\">1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n56\n57\n58\n59\n60\n61\n62\n63\n64\n65\n66</pre><pre class=\"code-block__code\"><code><span class=\"token keyword\">import</span> Adafruit_PCA9685\n<span class=\"token keyword\">import</span> logging\n<span class=\"token keyword\">import</span> math\n<span class=\"token keyword\">import</span> utils\n\nlog <span class=\"token operator\">=</span> logging<span class=\"token punctuation\">.</span>getLogger<span class=\"token punctuation\">(</span><span class=\"token string\">'L298NDrive'</span><span class=\"token punctuation\">)</span>\n\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">L298NDrive</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">object</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">__init__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> enA<span class=\"token punctuation\">,</span> in1<span class=\"token punctuation\">,</span> in2<span class=\"token punctuation\">,</span> in3<span class=\"token punctuation\">,</span> in4<span class=\"token punctuation\">,</span> enB<span class=\"token punctuation\">,</span> enabled<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        log<span class=\"token punctuation\">.</span>debug<span class=\"token punctuation\">(</span><span class=\"token string\">\"Initializing L298Drive...\"</span><span class=\"token punctuation\">)</span>\n        self<span class=\"token punctuation\">.</span>minPwm <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n        self<span class=\"token punctuation\">.</span>MaxPwm <span class=\"token operator\">=</span> <span class=\"token number\">4095</span>\n        self<span class=\"token punctuation\">.</span>enA <span class=\"token operator\">=</span> enA\n        self<span class=\"token punctuation\">.</span>in1 <span class=\"token operator\">=</span> in1\n        self<span class=\"token punctuation\">.</span>in2 <span class=\"token operator\">=</span> in2\n        self<span class=\"token punctuation\">.</span>in3 <span class=\"token operator\">=</span> in3\n        self<span class=\"token punctuation\">.</span>in4 <span class=\"token operator\">=</span> in4\n        self<span class=\"token punctuation\">.</span>enB <span class=\"token operator\">=</span> enB\n        self<span class=\"token punctuation\">.</span>enabled <span class=\"token operator\">=</span> enabled\n        <span class=\"token keyword\">if</span> enabled<span class=\"token punctuation\">:</span>\n            self<span class=\"token punctuation\">.</span>enable<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">enable</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>enabled <span class=\"token operator\">=</span> <span class=\"token boolean\">True</span>\n        <span class=\"token comment\"># Initialise the PCA9685 using the default address (0x40).</span>\n        self<span class=\"token punctuation\">.</span>pwm <span class=\"token operator\">=</span> Adafruit_PCA9685<span class=\"token punctuation\">.</span>PCA9685<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        self<span class=\"token punctuation\">.</span>setSpeeds<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">disable</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>enabled <span class=\"token operator\">=</span> <span class=\"token boolean\">False</span>\n        self<span class=\"token punctuation\">.</span>setSpeeds<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n        <span class=\"token comment\"># Initialise the PCA9685 using the default address (0x40).</span>\n        self<span class=\"token punctuation\">.</span>pwm <span class=\"token operator\">=</span> <span class=\"token boolean\">None</span>\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">setSpeeds</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> rSpeed<span class=\"token punctuation\">,</span> lSpeed<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>setSpeed<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> rSpeed<span class=\"token punctuation\">)</span>\n        self<span class=\"token punctuation\">.</span>setSpeed<span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> lSpeed<span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">setSpeed</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> motor<span class=\"token punctuation\">,</span> speed<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        pwm <span class=\"token operator\">=</span> <span class=\"token builtin\">int</span><span class=\"token punctuation\">(</span>math<span class=\"token punctuation\">.</span>fabs<span class=\"token punctuation\">(</span>speed<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n        log<span class=\"token punctuation\">.</span>info<span class=\"token punctuation\">(</span><span class=\"token string\">\"Motor: {} speed: {} pwm: {}\"</span><span class=\"token punctuation\">.</span><span class=\"token builtin\">format</span><span class=\"token punctuation\">(</span>motor<span class=\"token punctuation\">,</span> speed<span class=\"token punctuation\">,</span> pwm<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n        <span class=\"token keyword\">if</span> motor <span class=\"token operator\">==</span> <span class=\"token number\">1</span><span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">if</span> speed <span class=\"token operator\">>=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span>\n                <span class=\"token keyword\">if</span> self<span class=\"token punctuation\">.</span>enabled<span class=\"token punctuation\">:</span>\n                    self<span class=\"token punctuation\">.</span>pwm<span class=\"token punctuation\">.</span>set_pwm<span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>in1<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n                    self<span class=\"token punctuation\">.</span>pwm<span class=\"token punctuation\">.</span>set_pwm<span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>in2<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> self<span class=\"token punctuation\">.</span>MaxPwm<span class=\"token punctuation\">)</span>\n            <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n                <span class=\"token keyword\">if</span> self<span class=\"token punctuation\">.</span>enabled<span class=\"token punctuation\">:</span>\n                    self<span class=\"token punctuation\">.</span>pwm<span class=\"token punctuation\">.</span>set_pwm<span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>in1<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> self<span class=\"token punctuation\">.</span>MaxPwm<span class=\"token punctuation\">)</span>\n                    self<span class=\"token punctuation\">.</span>pwm<span class=\"token punctuation\">.</span>set_pwm<span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>in2<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n            <span class=\"token keyword\">if</span> self<span class=\"token punctuation\">.</span>enabled<span class=\"token punctuation\">:</span>\n                self<span class=\"token punctuation\">.</span>pwm<span class=\"token punctuation\">.</span>set_pwm<span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>enA<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> pwm<span class=\"token punctuation\">)</span>\n       <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span> <span class=\"token comment\"># motor == 2</span>\n            <span class=\"token keyword\">if</span> speed <span class=\"token operator\">>=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span>\n                <span class=\"token keyword\">if</span> self<span class=\"token punctuation\">.</span>enabled<span class=\"token punctuation\">:</span>\n                    self<span class=\"token punctuation\">.</span>pwm<span class=\"token punctuation\">.</span>set_pwm<span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>in3<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n                    self<span class=\"token punctuation\">.</span>pwm<span class=\"token punctuation\">.</span>set_pwm<span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>in4<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> self<span class=\"token punctuation\">.</span>MaxPwm<span class=\"token punctuation\">)</span>\n            <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n                <span class=\"token keyword\">if</span> self<span class=\"token punctuation\">.</span>enabled<span class=\"token punctuation\">:</span>\n                    self<span class=\"token punctuation\">.</span>pwm<span class=\"token punctuation\">.</span>set_pwm<span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>in3<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> self<span class=\"token punctuation\">.</span>MaxPwm<span class=\"token punctuation\">)</span>\n                    self<span class=\"token punctuation\">.</span>pwm<span class=\"token punctuation\">.</span>set_pwm<span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>in4<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n            <span class=\"token keyword\">if</span> self<span class=\"token punctuation\">.</span>enabled<span class=\"token punctuation\">:</span>\n                self<span class=\"token punctuation\">.</span>pwm<span class=\"token punctuation\">.</span>set_pwm<span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>enB<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> pwm<span class=\"token punctuation\">)</span></code></pre></div></div>\n<!--StartFragment-->\n<p>As can be seen, the main part of the code is in the method <em>setSpeed(self, motor, speed)</em> 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.</p>\n<p>Maybe a little of explanation should be given to understand why I’m doing what I’m doing there..</p>\n<h3 id=\"the-l298n-motor-driver\">The L298N motor driver</h3>\n<p>Uses 6 pins to drive two motors:</p>\n<ul>\n<li><strong>enA</strong> Is used to tell the speed (<strong>using PWM)</strong> we want the motor to turn</li>\n<li><strong>in1</strong> When powered, Tells the driver that the motor <strong>1</strong> should move in one direction (in2 should be OFF)</li>\n<li><strong>in2</strong> When powered, Tells the driver that the motor <strong>1</strong> should move in the opposite direction (in1 should be OFF)</li>\n<li><strong>in3</strong> When powered, Tells the driver that the motor <strong>2</strong> should move in one direction (in4 should be OFF)</li>\n<li><strong>in4</strong> When powered, Tells the driver that the motor <strong>2</strong> should move in the opposite direction (in4 should be OFF)</li>\n<li><strong>enB</strong> Is used to tell the speed (<strong>using PWM</strong>) we want the motor to turn</li>\n</ul>\n<p>So in our case, as I’m using a servo driver for all of the pins (and only 2 of them need PWM):</p>\n<p>when I do this:</p>\n<div class=\"code-block\"><div class=\"code-block__bar\"><div class=\"code-block__meta\"><span class=\"code-block__lang\">PY</span></div><button type=\"button\" class=\"code-block__copy\" data-copy-code>Copy</button></div><div class=\"code-block__body\"><pre class=\"code-block__gutter\" aria-hidden=\"true\">1</pre><pre class=\"code-block__code\"><code>self<span class=\"token punctuation\">.</span>pwm<span class=\"token punctuation\">.</span>set_pwm<span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>in1<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span></code></pre></div></div>\n<p><em>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)</em></p>\n<p>and when I do this:</p>\n<div class=\"code-block\"><div class=\"code-block__bar\"><div class=\"code-block__meta\"><span class=\"code-block__lang\">PY</span></div><button type=\"button\" class=\"code-block__copy\" data-copy-code>Copy</button></div><div class=\"code-block__body\"><pre class=\"code-block__gutter\" aria-hidden=\"true\">1</pre><pre class=\"code-block__code\"><code>self<span class=\"token punctuation\">.</span>pwm<span class=\"token punctuation\">.</span>set_pwm<span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>in1<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> self<span class=\"token punctuation\">.</span>MaxPwm<span class=\"token punctuation\">)</span> </code></pre></div></div>\n<p><em>’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)</em></p>\n<p>And then, when I do this:</p>\n<div class=\"code-block\"><div class=\"code-block__bar\"><div class=\"code-block__meta\"><span class=\"code-block__lang\">PY</span></div><button type=\"button\" class=\"code-block__copy\" data-copy-code>Copy</button></div><div class=\"code-block__body\"><pre class=\"code-block__gutter\" aria-hidden=\"true\">1</pre><pre class=\"code-block__code\"><code>self<span class=\"token punctuation\">.</span>pwm<span class=\"token punctuation\">.</span>set_pwm<span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>enA<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> pwm<span class=\"token punctuation\">)</span></code></pre></div></div>\n<!--StartFragment-->\n<p>I use the real PWM pin, and set the pulse with that I was requested with the speed parameter.</p>\n<h2 id=\"utilspy\">utils.py</h2>\n<p>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.</p>\n<div class=\"code-block\"><div class=\"code-block__bar\"><div class=\"code-block__meta\"><span class=\"code-block__file\">utils.py</span><span class=\"code-block__lang\">PY</span></div><button type=\"button\" class=\"code-block__copy\" data-copy-code>Copy</button></div><div class=\"code-block__body\"><pre class=\"code-block__gutter\" aria-hidden=\"true\">1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n56\n57\n58\n59\n60\n61\n62\n63\n64\n65</pre><pre class=\"code-block__code\"><code><span class=\"token keyword\">import</span> math\n<span class=\"token keyword\">import</span> logging\n\nlog <span class=\"token operator\">=</span> logging<span class=\"token punctuation\">.</span>getLogger<span class=\"token punctuation\">(</span><span class=\"token string\">'utils'</span><span class=\"token punctuation\">)</span>\n\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">map</span><span class=\"token punctuation\">(</span>v<span class=\"token punctuation\">,</span> in_min<span class=\"token punctuation\">,</span> in_max<span class=\"token punctuation\">,</span> out_min<span class=\"token punctuation\">,</span> out_max<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token comment\"># Check that the value is at least in_min</span>\n    <span class=\"token keyword\">if</span> v <span class=\"token operator\">&lt;</span> in_min<span class=\"token punctuation\">:</span>\n    v <span class=\"token operator\">=</span> in_min\n\n    <span class=\"token comment\"># Check that the value is at most in_max</span>\n    <span class=\"token keyword\">if</span> v <span class=\"token operator\">></span> in_max<span class=\"token punctuation\">:</span>\n       v <span class=\"token operator\">=</span> in_max\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>v <span class=\"token operator\">-</span> in_min<span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token punctuation\">(</span>out_max <span class=\"token operator\">-</span> out_min<span class=\"token punctuation\">)</span> <span class=\"token operator\">//</span> <span class=\"token punctuation\">(</span>in_max <span class=\"token operator\">-</span> in_min<span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> out_min\n\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">joystickToDiff</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">,</span> minJoystick<span class=\"token punctuation\">,</span> maxJoystick<span class=\"token punctuation\">,</span> minSpeed<span class=\"token punctuation\">,</span> maxSpeed<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n\n    <span class=\"token comment\"># If x and y are 0, then there is not much to calculate...</span>\n    <span class=\"token keyword\">if</span> x <span class=\"token operator\">==</span> <span class=\"token number\">0</span> <span class=\"token keyword\">and</span> y <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token comment\"># First Compute the angle in deg</span>\n    <span class=\"token comment\"># First hypotenuse</span>\n    z <span class=\"token operator\">=</span> math<span class=\"token punctuation\">.</span>sqrt<span class=\"token punctuation\">(</span>x <span class=\"token operator\">*</span> x <span class=\"token operator\">+</span> y <span class=\"token operator\">*</span> y<span class=\"token punctuation\">)</span>\n\n    <span class=\"token comment\"># angle in radians</span>\n    rad <span class=\"token operator\">=</span> math<span class=\"token punctuation\">.</span>acos<span class=\"token punctuation\">(</span>math<span class=\"token punctuation\">.</span>fabs<span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span> <span class=\"token operator\">/</span> z<span class=\"token punctuation\">)</span>\n\n    <span class=\"token comment\"># and in degrees</span>\n    angle <span class=\"token operator\">=</span> rad <span class=\"token operator\">*</span> <span class=\"token number\">180</span> <span class=\"token operator\">/</span> math<span class=\"token punctuation\">.</span>pi\n\n    <span class=\"token comment\"># Now angle indicates the measure of turn</span>\n    <span class=\"token comment\"># Along a straight line, with an angle o, the turn co-efficient is same</span>\n    <span class=\"token comment\"># this applies for angles between 0-90, with angle 0 the coeff is -1</span>\n    <span class=\"token comment\"># with angle 45, the co-efficient is 0 and with angle 90, it is 1</span>\n\n    tcoeff <span class=\"token operator\">=</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span> <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span>angle <span class=\"token operator\">/</span> <span class=\"token number\">90</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token number\">2</span>\n    turn <span class=\"token operator\">=</span> tcoeff <span class=\"token operator\">*</span> math<span class=\"token punctuation\">.</span>fabs<span class=\"token punctuation\">(</span>math<span class=\"token punctuation\">.</span>fabs<span class=\"token punctuation\">(</span>y<span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span> math<span class=\"token punctuation\">.</span>fabs<span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    turn <span class=\"token operator\">=</span> <span class=\"token builtin\">round</span><span class=\"token punctuation\">(</span>turn <span class=\"token operator\">*</span> <span class=\"token number\">100</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">/</span> <span class=\"token number\">100</span>\n\n    <span class=\"token comment\"># And max of y or x is the movement</span>\n    mov <span class=\"token operator\">=</span> <span class=\"token builtin\">max</span><span class=\"token punctuation\">(</span>math<span class=\"token punctuation\">.</span>fabs<span class=\"token punctuation\">(</span>y<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> math<span class=\"token punctuation\">.</span>fabs<span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token comment\"># First and third quadrant</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>x <span class=\"token operator\">>=</span> <span class=\"token number\">0</span> <span class=\"token keyword\">and</span> y <span class=\"token operator\">>=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">or</span> <span class=\"token punctuation\">(</span>x <span class=\"token operator\">&lt;</span> <span class=\"token number\">0</span> <span class=\"token keyword\">and</span> y <span class=\"token operator\">&lt;</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        rawLeft <span class=\"token operator\">=</span> mov\n        rawRight <span class=\"token operator\">=</span> turn\n    <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n        rawRight <span class=\"token operator\">=</span> mov\n        rawLeft <span class=\"token operator\">=</span> turn\n\n    <span class=\"token comment\"># Reverse polarity</span>\n    <span class=\"token keyword\">if</span> y <span class=\"token operator\">&lt;</span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span>\n        rawLeft <span class=\"token operator\">=</span> <span class=\"token number\">0</span> <span class=\"token operator\">-</span> rawLeft\n        rawRight <span class=\"token operator\">=</span> <span class=\"token number\">0</span> <span class=\"token operator\">-</span> rawRight\n\n    <span class=\"token comment\"># minJoystick, maxJoystick, minSpeed, maxSpeed</span>\n    <span class=\"token comment\"># Map the values onto the defined rang</span>\n    rightOut <span class=\"token operator\">=</span> <span class=\"token builtin\">map</span><span class=\"token punctuation\">(</span>rawRight<span class=\"token punctuation\">,</span> minJoystick<span class=\"token punctuation\">,</span> maxJoystick<span class=\"token punctuation\">,</span> minSpeed<span class=\"token punctuation\">,</span> maxSpeed<span class=\"token punctuation\">)</span>\n    leftOut <span class=\"token operator\">=</span> <span class=\"token builtin\">map</span><span class=\"token punctuation\">(</span>rawLeft<span class=\"token punctuation\">,</span> minJoystick<span class=\"token punctuation\">,</span> maxJoystick<span class=\"token punctuation\">,</span> minSpeed<span class=\"token punctuation\">,</span> maxSpeed<span class=\"token punctuation\">)</span>\n\n    log<span class=\"token punctuation\">.</span>debug<span class=\"token punctuation\">(</span><span class=\"token string\">\"x={} y={}, rOut={}, lOut={}\"</span><span class=\"token punctuation\">.</span><span class=\"token builtin\">format</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">,</span> rightOut<span class=\"token punctuation\">,</span> leftOut<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>rightOut<span class=\"token punctuation\">,</span> leftOut<span class=\"token punctuation\">)</span></code></pre></div></div>\n<p>There are just two methods here, the first is a port from Arduino of the <strong>map function</strong>. It converts a value (v) within the specified input limits (in<em>min, in</em>max) to the corresponding value within the output range (out<em>min, out</em>max).</p>\n<p>I added limits for the input value, so I only accept a v, that is within the in<em>min and in</em>max.</p>\n<p>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 <a href=\"https://taibo.ca/blog/joystick-to-differential-drive-python\">article</a></p>\n<p>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.</p>","headings":[{"id":"aum2py","value":"aum2.py"},{"id":"remotecontrolpy","value":"remoteControl.py"},{"id":"l298ndrivepy","value":"l298NDrive.py"},{"id":"utilspy","value":"utils.py"}],"fields":{"slug":"/blog/aum2-raspberry-pi-zero-w-based-robot","readingTime":6},"frontmatter":{"title":"Aum2: Raspberry Pi Zero W based robot","description":"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.","tags":["arduino","raspberrypi","python","robotics"],"topic":"robotics","type":"build-log","projects":[{"slug":"aum2-robot"}],"img":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAKABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAMEAv/EABYBAQEBAAAAAAAAAAAAAAAAAAACA//aAAwDAQACEAMQAAABlainOnGQ/8QAGBAAAwEBAAAAAAAAAAAAAAAAAAECQTH/2gAIAQEAAQUCdJOmqJ5un//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABURAQEAAAAAAAAAAAAAAAAAAAAR/9oACAECAQE/AVf/xAAaEAEAAQUAAAAAAAAAAAAAAAABEAACETFx/9oACAEBAAY/AqMKLsIt7P8A/8QAHBABAAIDAAMAAAAAAAAAAAAAAQARITFBEGFx/9oACAEBAAE/IdiT0dlsAcHsVnZ9iCSWVlF8d8f/2gAMAwEAAgADAAAAECf/AP/EABYRAQEBAAAAAAAAAAAAAAAAAAEAEf/aAAgBAwEBPxBNUbL/xAAWEQEBAQAAAAAAAAAAAAAAAAABEQD/2gAIAQIBAT8QGRNW/8QAGxABAQADAAMAAAAAAAAAAAAAAREAITEQQWH/2gAIAQEAAT8QG1wUDS+6wCM6hR7vAm8VaJJOsBEhIlEuSmCMIeP/2Q==","aspectRatio":2.0833333333333335,"src":"/static/7b17f3f4e8451117729f2842af40e43f/19c02/img_20170418_120138-730x350.jpg","srcSet":"/static/7b17f3f4e8451117729f2842af40e43f/39f27/img_20170418_120138-730x350.jpg 600w,\n/static/7b17f3f4e8451117729f2842af40e43f/19c02/img_20170418_120138-730x350.jpg 730w","srcWebp":"/static/7b17f3f4e8451117729f2842af40e43f/bc29f/img_20170418_120138-730x350.webp","srcSetWebp":"/static/7b17f3f4e8451117729f2842af40e43f/6ef99/img_20170418_120138-730x350.webp 600w,\n/static/7b17f3f4e8451117729f2842af40e43f/bc29f/img_20170418_120138-730x350.webp 730w","sizes":"(max-width: 730px) 100vw, 730px"}}},"imgAlt":"Aum robot","publishedDate":"2022-05-03T03:29:12.612Z"}},"related":{"nodes":[{"fields":{"slug":"/blog/joystick-to-differential-drive-python","readingTime":2},"frontmatter":{"title":"Joystick to Differential Drive (Python)","description":"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","tags":["robotics","python"],"imgAlt":"Arduino smart car","publishedDate":"2022-05-03T03:08:42.109Z","topic":"robotics","type":"how-to","img":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAEEAwX/xAAVAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAABvi6Sl3GJ/8QAGRAAAwADAAAAAAAAAAAAAAAAAQIDAAQT/9oACAEBAAEFAqVDolaIJuKLwGNrgrNBNf/EABURAQEAAAAAAAAAAAAAAAAAABAh/9oACAEDAQE/AYf/xAAVEQEBAAAAAAAAAAAAAAAAAAAQIf/aAAgBAgEBPwGn/8QAGhAAAwEAAwAAAAAAAAAAAAAAAAERAiFBcf/aAAgBAQAGPwLSzeOxRrXpRxyiVjTtIj//xAAYEAADAQEAAAAAAAAAAAAAAAABESEAQf/aAAgBAQABPyE8AMsTEGIjDlmCKru+A2QsJUgTVEm7v//aAAwDAQACAAMAAAAQaC//xAAVEQEBAAAAAAAAAAAAAAAAAAAAAf/aAAgBAwEBPxAr/8QAGREAAgMBAAAAAAAAAAAAAAAAABEBITFB/9oACAECAQE/EO8Ias//xAAdEAEBAAICAwEAAAAAAAAAAAABEQAxIUFRYXGB/9oACAEBAAE/EK7LZGCfOrjDL/wZzvBBmkeRvEIUEBKvPWKxDIdnrWUuqJVatc//2Q==","aspectRatio":1.3333333333333333,"src":"/static/fa07ee23080921116f1965be7e7106e0/62e35/arduino-smart-car.jpg","srcSet":"/static/fa07ee23080921116f1965be7e7106e0/3b6b7/arduino-smart-car.jpg 200w,\n/static/fa07ee23080921116f1965be7e7106e0/151d2/arduino-smart-car.jpg 400w,\n/static/fa07ee23080921116f1965be7e7106e0/62e35/arduino-smart-car.jpg 800w,\n/static/fa07ee23080921116f1965be7e7106e0/4cde7/arduino-smart-car.jpg 1000w","srcWebp":"/static/fa07ee23080921116f1965be7e7106e0/6f4a3/arduino-smart-car.webp","srcSetWebp":"/static/fa07ee23080921116f1965be7e7106e0/0df6e/arduino-smart-car.webp 200w,\n/static/fa07ee23080921116f1965be7e7106e0/e4831/arduino-smart-car.webp 400w,\n/static/fa07ee23080921116f1965be7e7106e0/6f4a3/arduino-smart-car.webp 800w,\n/static/fa07ee23080921116f1965be7e7106e0/db890/arduino-smart-car.webp 1000w","sizes":"(max-width: 800px) 100vw, 800px"}}}}},{"fields":{"slug":"/blog/joystick-to-differential-drive-arduino","readingTime":1},"frontmatter":{"title":"Joystick to Differential Drive (Arduino)","description":"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.","tags":["arduino","c++","programming","robotics"],"imgAlt":"Arduino Smart Car","publishedDate":"2022-05-02T04:09:59.722Z","topic":"robotics","type":"how-to","img":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAEEAwX/xAAVAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAABvi6Sl3GJ/8QAGRAAAwADAAAAAAAAAAAAAAAAAQIDAAQT/9oACAEBAAEFAqVDolaIJuKLwGNrgrNBNf/EABURAQEAAAAAAAAAAAAAAAAAABAh/9oACAEDAQE/AYf/xAAVEQEBAAAAAAAAAAAAAAAAAAAQIf/aAAgBAgEBPwGn/8QAGhAAAwEAAwAAAAAAAAAAAAAAAAERAiFBcf/aAAgBAQAGPwLSzeOxRrXpRxyiVjTtIj//xAAYEAADAQEAAAAAAAAAAAAAAAABESEAQf/aAAgBAQABPyE8AMsTEGIjDlmCKru+A2QsJUgTVEm7v//aAAwDAQACAAMAAAAQaC//xAAVEQEBAAAAAAAAAAAAAAAAAAAAAf/aAAgBAwEBPxAr/8QAGREAAgMBAAAAAAAAAAAAAAAAABEBITFB/9oACAECAQE/EO8Ias//xAAdEAEBAAICAwEAAAAAAAAAAAABEQAxIUFRYXGB/9oACAEBAAE/EK7LZGCfOrjDL/wZzvBBmkeRvEIUEBKvPWKxDIdnrWUuqJVatc//2Q==","aspectRatio":1.3333333333333333,"src":"/static/fa07ee23080921116f1965be7e7106e0/62e35/arduino-smart-car.jpg","srcSet":"/static/fa07ee23080921116f1965be7e7106e0/3b6b7/arduino-smart-car.jpg 200w,\n/static/fa07ee23080921116f1965be7e7106e0/151d2/arduino-smart-car.jpg 400w,\n/static/fa07ee23080921116f1965be7e7106e0/62e35/arduino-smart-car.jpg 800w,\n/static/fa07ee23080921116f1965be7e7106e0/4cde7/arduino-smart-car.jpg 1000w","srcWebp":"/static/fa07ee23080921116f1965be7e7106e0/6f4a3/arduino-smart-car.webp","srcSetWebp":"/static/fa07ee23080921116f1965be7e7106e0/0df6e/arduino-smart-car.webp 200w,\n/static/fa07ee23080921116f1965be7e7106e0/e4831/arduino-smart-car.webp 400w,\n/static/fa07ee23080921116f1965be7e7106e0/6f4a3/arduino-smart-car.webp 800w,\n/static/fa07ee23080921116f1965be7e7106e0/db890/arduino-smart-car.webp 1000w","sizes":"(max-width: 800px) 100vw, 800px"}}}}},{"fields":{"slug":"/blog/radio-controlled-minnie-mouse-quad","readingTime":1},"frontmatter":{"title":"Radio Controlled Minnie Mouse Quad","description":"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.","tags":["3d-print","remote-control"],"imgAlt":"Minnie quad","publishedDate":"2022-05-01T17:43:04.637Z","topic":"robotics","type":"build-log","img":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAIEAQX/xAAWAQEBAQAAAAAAAAAAAAAAAAACAAH/2gAMAwEAAhADEAAAAess2qrEMX//xAAYEAADAQEAAAAAAAAAAAAAAAABAgMRAP/aAAgBAQABBQKtAOWgCrTQ8qErMsFjg//EABgRAAMBAQAAAAAAAAAAAAAAAAABAhEx/9oACAEDAQE/AZqH1Go//8QAFREBAQAAAAAAAAAAAAAAAAAAACH/2gAIAQIBAT8BR//EABwQAAEDBQAAAAAAAAAAAAAAAAACITERMkFxkf/aAAgBAQAGPwKhPS0U+hoySf/EABoQAAMBAAMAAAAAAAAAAAAAAAABESExkbH/2gAIAQEAAT8houuTZNmsNt6NgJWsmPVaymNhPR//2gAMAwEAAgADAAAAEDQ//8QAGREAAwADAAAAAAAAAAAAAAAAAAERkcHR/9oACAEDAQE/EIFk9Da7Jnp//8QAFhEBAQEAAAAAAAAAAAAAAAAAEQEQ/9oACAECAQE/ECGP/8QAHBABAAMAAwEBAAAAAAAAAAAAAQARITFBYVGh/9oACAEBAAE/ELdkFKexBiDyM7quSb+N6E0nyad9HrP2C6iNkrvEsVtafif/2Q==","aspectRatio":1.3333333333333333,"src":"/static/bc9dddb8f87b424e71e2551a0ff1adc0/62e35/minnie-quad.jpg","srcSet":"/static/bc9dddb8f87b424e71e2551a0ff1adc0/3b6b7/minnie-quad.jpg 200w,\n/static/bc9dddb8f87b424e71e2551a0ff1adc0/151d2/minnie-quad.jpg 400w,\n/static/bc9dddb8f87b424e71e2551a0ff1adc0/62e35/minnie-quad.jpg 800w,\n/static/bc9dddb8f87b424e71e2551a0ff1adc0/2c49b/minnie-quad.jpg 1200w,\n/static/bc9dddb8f87b424e71e2551a0ff1adc0/892e5/minnie-quad.jpg 1500w","srcWebp":"/static/bc9dddb8f87b424e71e2551a0ff1adc0/6f4a3/minnie-quad.webp","srcSetWebp":"/static/bc9dddb8f87b424e71e2551a0ff1adc0/0df6e/minnie-quad.webp 200w,\n/static/bc9dddb8f87b424e71e2551a0ff1adc0/e4831/minnie-quad.webp 400w,\n/static/bc9dddb8f87b424e71e2551a0ff1adc0/6f4a3/minnie-quad.webp 800w,\n/static/bc9dddb8f87b424e71e2551a0ff1adc0/aa1e8/minnie-quad.webp 1200w,\n/static/bc9dddb8f87b424e71e2551a0ff1adc0/fb75b/minnie-quad.webp 1500w","sizes":"(max-width: 800px) 100vw, 800px"}}}}}]},"topicPosts":{"totalCount":4},"projects":{"nodes":[{"frontmatter":{"slug":"aum2-robot","title":"Aum2 robot","topic":"robotics","summary":"A Raspberry Pi Zero W robot base with a servo driver, an L298N and phone-tilt remote control.","imgAlt":"Aum robot","img":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAKABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAMEAv/EABYBAQEBAAAAAAAAAAAAAAAAAAACA//aAAwDAQACEAMQAAABlainOnGQ/8QAGBAAAwEBAAAAAAAAAAAAAAAAAAECQTH/2gAIAQEAAQUCdJOmqJ5un//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABURAQEAAAAAAAAAAAAAAAAAAAAR/9oACAECAQE/AVf/xAAaEAEAAQUAAAAAAAAAAAAAAAABEAACETFx/9oACAEBAAY/AqMKLsIt7P8A/8QAHBABAAIDAAMAAAAAAAAAAAAAAQARITFBEGFx/9oACAEBAAE/IdiT0dlsAcHsVnZ9iCSWVlF8d8f/2gAMAwEAAgADAAAAECf/AP/EABYRAQEBAAAAAAAAAAAAAAAAAAEAEf/aAAgBAwEBPxBNUbL/xAAWEQEBAQAAAAAAAAAAAAAAAAABEQD/2gAIAQIBAT8QGRNW/8QAGxABAQADAAMAAAAAAAAAAAAAAREAITEQQWH/2gAIAQEAAT8QG1wUDS+6wCM6hR7vAm8VaJJOsBEhIlEuSmCMIeP/2Q==","aspectRatio":2,"src":"/static/7b17f3f4e8451117729f2842af40e43f/6118d/img_20170418_120138-730x350.jpg","srcSet":"/static/7b17f3f4e8451117729f2842af40e43f/fd0a7/img_20170418_120138-730x350.jpg 200w,\n/static/7b17f3f4e8451117729f2842af40e43f/bf9b8/img_20170418_120138-730x350.jpg 400w,\n/static/7b17f3f4e8451117729f2842af40e43f/6118d/img_20170418_120138-730x350.jpg 730w","srcWebp":"/static/7b17f3f4e8451117729f2842af40e43f/b74a0/img_20170418_120138-730x350.webp","srcSetWebp":"/static/7b17f3f4e8451117729f2842af40e43f/afb53/img_20170418_120138-730x350.webp 200w,\n/static/7b17f3f4e8451117729f2842af40e43f/b4c88/img_20170418_120138-730x350.webp 400w,\n/static/7b17f3f4e8451117729f2842af40e43f/b74a0/img_20170418_120138-730x350.webp 730w","sizes":"(max-width: 730px) 100vw, 730px"}}}}}]},"projectParts":{"nodes":[{"fields":{"slug":"/blog/aum2-raspberry-pi-zero-w-based-robot"},"frontmatter":{"title":"Aum2: Raspberry Pi Zero W based robot","projects":[{"slug":"aum2-robot","part":1}]}},{"fields":{"slug":"/blog/joystick-to-differential-drive-python"},"frontmatter":{"title":"Joystick to Differential Drive (Python)","projects":[{"slug":"differential-drive","part":2},{"slug":"aum2-robot","part":2}]}}]}},"pageContext":{"id":"69e9883f-1791-569a-8d1d-020296832911","topic":"robotics","projectSlugs":["aum2-robot"]}},"staticQueryHashes":["1942088059","4080856488"]}