{"componentChunkName":"component---src-create-pages-templates-blog-post-tsx","path":"/blog/joystick-to-differential-drive-python","result":{"data":{"markdownRemark":{"id":"0c95ea15-9ab0-5703-bda2-dadaf1cf24e6","html":"<p>As I’m now working on a <a href=\"https://www.raspberrypi.org/products/pi-zero-w/\">Raspberry Pi Zero W</a> based robot, doing my first test on Python programming, I needed to port the function created previously in this <a href=\"http://savagemakers.com/differential-drive-tank-drive-in-arduino/\">article</a> for Arduino (c++).</p>\n<p>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.</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: 1024px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/d61ec53246073cd3c166929c385559c3/72e01/cartesian-mapping-1024x577.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.4453125%; position: relative; bottom: 0; left: 0; background-image: url('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'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Cartesian - differentical drive\"\n        title=\"Cartesian - differentical drive\"\n        src=\"/static/d61ec53246073cd3c166929c385559c3/72e01/cartesian-mapping-1024x577.jpg\"\n        srcset=\"/static/d61ec53246073cd3c166929c385559c3/36dd4/cartesian-mapping-1024x577.jpg 512w,\n/static/d61ec53246073cd3c166929c385559c3/72e01/cartesian-mapping-1024x577.jpg 1024w\"\n        sizes=\"(max-width: 1024px) 100vw, 1024px\"\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\">Cartesian - differentical drive</figcaption>\n  </figure></p>\n<p>Joystick output requirements</p>\n<p>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:</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: 700px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/d02e5fb72be3908c672a2f60c9381486/8c557/differential-steering-tutorials-42bots2.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 42.578125%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAABFAAAARQAHJCQ3wAAACpklEQVQozy1Sa0gTUBT+fJZouQxfKaioONTUTG0+hs50Ppq6qc1Na+RjhpqPpTaF0krTxEx8MGfO6SqxMsGQosQiDSLRHlQ/jBKRCv8UBiHYZpzuwgvncO757nfuOfe7uKvhAR1wRB88pzWxICI808VjviEBK71pQA0OgmD5oV8IMpSgrTXYAuUAAmEFPvaz2AdiuLCMJVKZJ31B5mxzQutI9ZGLNJyvXLwidKChB6DxIpAun/e+PeVyW1FoK+nkFatdIs97PdFAM+z9zzlI5joFypulPPGjS3yl+jz3FCtoD7olX9rsFdG3q8lEBhnRuMLLoA0HDcrMmI602fS5RUA0kkd0Oz9tcoAHai4BTcqjyJBP7y4IyNQvYbyCO6Q/CVQei1x+01xI651Vpk4Ff8vdz7mSjbiLNe9ecDR0dq5RSj+u1RnHzgi3w0O9r6MBvgRYJ4f4lk9UC4m0yq1P7bl0NiNyEbvhDHVW+NpMbRW9VDeZtMVxRic/py6sww2HkKlIDF54XKegpzUdpskaoTEoyPM+GzeEFQwLcnfVtyviaaayxzitKqTkiIDvEELE3kn6lm5IaHsgg2hUtv3qeEgiI9izDjmkzRkjXS4ZNSIzRmuNAuUU4PCXdbhQwZeQXkp/NDlEw1Iy9UiexIKJRKNy7ZfW9OXntYLXpJe9oJZ0j01G0CyWMsFk9Rvd4pWpsrgl0uV9pL7saPYN2F2wetgRk0RDeT/nVQmrv7skv74OiiZggT1I8ne2K4r1cU3kugSkcF0cu90dYaZQhB9khz1tSuJ83MRhHv6pga4HsmDzHzM7zmnb4OIm74QTKq+YMrUvP6yek4Ju7DXDFsxsmdntxCzPOIsq7CxrZmaRrMwbIYedcWM4VYOJwEUUPLAPEUQbgAL4B1vyGqFjS7/0AAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Differential drive\"\n        title=\"Differential drive\"\n        src=\"/static/d02e5fb72be3908c672a2f60c9381486/8c557/differential-steering-tutorials-42bots2.png\"\n        srcset=\"/static/d02e5fb72be3908c672a2f60c9381486/01e7c/differential-steering-tutorials-42bots2.png 512w,\n/static/d02e5fb72be3908c672a2f60c9381486/8c557/differential-steering-tutorials-42bots2.png 700w\"\n        sizes=\"(max-width: 700px) 100vw, 700px\"\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\">Differential drive</figcaption>\n  </figure></p>\n<p>differential drive</p>\n<p>To achieve this, is that I made this function. Here you can check it:</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\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</pre><pre class=\"code-block__code\"><code><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    <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    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>rightOut<span class=\"token punctuation\">,</span> leftOut<span class=\"token punctuation\">)</span>\n\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    <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</code></pre></div></div>\n<p>I added as many comments as I could, trying to make everything clear.</p>\n<p>So, what are the differences with the Arduino version?</p>\n<p><strong>The name</strong>: just because I think this is more accurate to the purpose of the function</p>\n<p><strong>It returns a tuple:</strong> So you just get the right and left speeds on it</p>\n<p><strong>The joystick and wheel speed limits</strong></p>\n<p>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.</p>\n<p>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)</p>\n<p>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)</p>\n<h3 id=\"what-about-that-map-function\">What about that map function?</h3>\n<p>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.</p>\n<p>As I´m not aware of it existing in python, I just added to my utils functions.</p>\n<p>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.</p>\n<p>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.</p>","headings":[],"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"],"topic":"robotics","type":"how-to","projects":[{"slug":"differential-drive"},{"slug":"aum2-robot"}],"img":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAIEBQEG/8QAFgEBAQEAAAAAAAAAAAAAAAAAAQAC/9oADAMBAAIQAxAAAAHcjm1cvoVUlng0hX//xAAbEAEBAAIDAQAAAAAAAAAAAAACAQADBBAREv/aAAgBAQABBQJqAjYX1W1KPDx0lr8mfMsz/8QAFREBAQAAAAAAAAAAAAAAAAAAESD/2gAIAQMBAT8BI//EABURAQEAAAAAAAAAAAAAAAAAABEg/9oACAECAQE/AWP/xAAbEAABBQEBAAAAAAAAAAAAAAABAAIQESExUf/aAAgBAQAGPwKysh4cR3iaTm1YK32KoR//xAAbEAEAAgMBAQAAAAAAAAAAAAABABEQITFRkf/aAAgBAQABPyFRynX/AExrVED8hldtolhdtjZFOgxtDHlY/9oADAMBAAIAAwAAABCr7zz/xAAXEQADAQAAAAAAAAAAAAAAAAAAARAR/9oACAEDAQE/ENDv/8QAGREAAgMBAAAAAAAAAAAAAAAAAREAECFh/9oACAECAQE/EF3kBYd//8QAHBABAQEAAgMBAAAAAAAAAAAAAREAIVEQQZGh/9oACAEBAAE/EKox0XG116QTwCBMB2A+YwsKEI+1vOosQGHAw36uF0gi2gnzABAhv//Z","aspectRatio":1,"src":"/static/fa07ee23080921116f1965be7e7106e0/d91f7/arduino-smart-car.jpg","srcSet":"/static/fa07ee23080921116f1965be7e7106e0/39f27/arduino-smart-car.jpg 600w,\n/static/fa07ee23080921116f1965be7e7106e0/d91f7/arduino-smart-car.jpg 1000w","srcWebp":"/static/fa07ee23080921116f1965be7e7106e0/47f67/arduino-smart-car.webp","srcSetWebp":"/static/fa07ee23080921116f1965be7e7106e0/6ef99/arduino-smart-car.webp 600w,\n/static/fa07ee23080921116f1965be7e7106e0/47f67/arduino-smart-car.webp 1000w","sizes":"(max-width: 1000px) 100vw, 1000px"}}},"imgAlt":"Arduino smart car","publishedDate":"2022-05-03T03:08:42.109Z"}},"related":{"nodes":[{"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"],"imgAlt":"Aum robot","publishedDate":"2022-05-03T03:29:12.612Z","topic":"robotics","type":"build-log","img":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAMEAgX/xAAVAQEBAAAAAAAAAAAAAAAAAAACA//aAAwDAQACEAMQAAABnfz6JrI8Z//EABkQAQEBAAMAAAAAAAAAAAAAAAECEQADEv/aAAgBAQABBQI3lGlx2Kj6ywJA/8QAFhEBAQEAAAAAAAAAAAAAAAAAAAES/9oACAEDAQE/AWa//8QAFxEBAAMAAAAAAAAAAAAAAAAAABIhQf/aAAgBAgEBPwGsTf/EAB4QAAIBAwUAAAAAAAAAAAAAAAABEQMhcQIxMmGR/9oACAEBAAY/AplQKpT3dsHLwSTbnsemYwWP/8QAGxAAAgMAAwAAAAAAAAAAAAAAAAERIUFhcYH/2gAIAQEAAT8hsdDiRHzSpoYV2MZAkIG9AtJYXLP/2gAMAwEAAgADAAAAENsf/8QAFhEBAQEAAAAAAAAAAAAAAAAAASEQ/9oACAEDAQE/EKxw/8QAFxEBAQEBAAAAAAAAAAAAAAAAAQARUf/aAAgBAgEBPxBAmoHL/8QAHBABAQACAwEBAAAAAAAAAAAAAREAIUFRcTFh/9oACAEBAAE/EI7rAoUO1mvMoatQqH4d43VoIkjWJrJXBjRakRAs++4xQDkVeVz/2Q==","aspectRatio":1.3333333333333333,"src":"/static/7b17f3f4e8451117729f2842af40e43f/97d62/img_20170418_120138-730x350.jpg","srcSet":"/static/7b17f3f4e8451117729f2842af40e43f/3b6b7/img_20170418_120138-730x350.jpg 200w,\n/static/7b17f3f4e8451117729f2842af40e43f/151d2/img_20170418_120138-730x350.jpg 400w,\n/static/7b17f3f4e8451117729f2842af40e43f/97d62/img_20170418_120138-730x350.jpg 730w","srcWebp":"/static/7b17f3f4e8451117729f2842af40e43f/b85f0/img_20170418_120138-730x350.webp","srcSetWebp":"/static/7b17f3f4e8451117729f2842af40e43f/0df6e/img_20170418_120138-730x350.webp 200w,\n/static/7b17f3f4e8451117729f2842af40e43f/e4831/img_20170418_120138-730x350.webp 400w,\n/static/7b17f3f4e8451117729f2842af40e43f/b85f0/img_20170418_120138-730x350.webp 730w","sizes":"(max-width: 730px) 100vw, 730px"}}}}},{"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"}}}}},{"frontmatter":{"slug":"differential-drive","title":"Differential drive","topic":"robotics","summary":"One joystick-to-tank-drive function, written for both Arduino (C++) and Python.","imgAlt":"Cartesian mapping of joystick input to wheel output","img":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAKABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAIBAwX/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAHbRlLSA//EABkQAAIDAQAAAAAAAAAAAAAAAAABAhBBEf/aAAgBAQABBQJkX2txH//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABYQAAMAAAAAAAAAAAAAAAAAAAEQIP/aAAgBAQAGPwKCv//EABcQAQEBAQAAAAAAAAAAAAAAAAEAMRH/2gAIAQEAAT8hXO7MkiNxGL//2gAMAwEAAgADAAAAELPP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAGhABAAMBAQEAAAAAAAAAAAAAAQARITFBcf/aAAgBAQABPxBQwCC65FhfLx2ccT7EprkTZb5He5//2Q==","aspectRatio":2,"src":"/static/d61ec53246073cd3c166929c385559c3/6409c/cartesian-mapping-1024x577.jpg","srcSet":"/static/d61ec53246073cd3c166929c385559c3/fd0a7/cartesian-mapping-1024x577.jpg 200w,\n/static/d61ec53246073cd3c166929c385559c3/bf9b8/cartesian-mapping-1024x577.jpg 400w,\n/static/d61ec53246073cd3c166929c385559c3/6409c/cartesian-mapping-1024x577.jpg 800w,\n/static/d61ec53246073cd3c166929c385559c3/424f0/cartesian-mapping-1024x577.jpg 1024w","srcWebp":"/static/d61ec53246073cd3c166929c385559c3/1d154/cartesian-mapping-1024x577.webp","srcSetWebp":"/static/d61ec53246073cd3c166929c385559c3/afb53/cartesian-mapping-1024x577.webp 200w,\n/static/d61ec53246073cd3c166929c385559c3/b4c88/cartesian-mapping-1024x577.webp 400w,\n/static/d61ec53246073cd3c166929c385559c3/1d154/cartesian-mapping-1024x577.webp 800w,\n/static/d61ec53246073cd3c166929c385559c3/20158/cartesian-mapping-1024x577.webp 1024w","sizes":"(max-width: 800px) 100vw, 800px"}}}}}]},"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}]}},{"fields":{"slug":"/blog/joystick-to-differential-drive-arduino"},"frontmatter":{"title":"Joystick to Differential Drive (Arduino)","projects":[{"slug":"differential-drive","part":1}]}}]}},"pageContext":{"id":"0c95ea15-9ab0-5703-bda2-dadaf1cf24e6","topic":"robotics","projectSlugs":["differential-drive","aum2-robot"]}},"staticQueryHashes":["1942088059","4080856488"]}