{"componentChunkName":"component---src-create-pages-templates-blog-post-tsx","path":"/blog/joystick-to-differential-drive-arduino","result":{"data":{"markdownRemark":{"id":"1f3799c3-f107-52e5-9b9c-b24e596e3f3a","html":"<p>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.</p>\n<p><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 driving\"\n        title=\"differential driving\"\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></p>\n<p>One way of driving this differential drive robots is sending PWM signals to each motor. But how do you convert for example the signals from a Joystick, (or any Cartesian pair of coordinates, like a direction vector) to the specific order for each wheel?</p>\n<p>That is where this function is required. It receives a pair of cartesian x, and y coordinates, and calculates the differential drive output (right and left wheel commands) you will need to send to the motors.</p>\n<p>This function will generate an output as can be seen in the following image:</p>\n<p><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 mapping\"\n        title=\"cartesian mapping\"\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></p>\n<p><strong>LeftMotorOutput</strong> and <strong>RightMotorOutput</strong> will hold the values you should send to the right and left motors.</p>\n<p>You can also configure the limits of x, y, and right and left motors by using the 4 constants defined on top of the code, this is handy to adapt the function to your specific scenario.</p>\n<div class=\"code-block\"><div class=\"code-block__bar\"><div class=\"code-block__meta\"><span class=\"code-block__lang\">C++</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\n67\n68\n69</pre><pre class=\"code-block__code\"><code><span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">define</span> <span class=\"token macro-name\">DDRIVE_MIN</span> <span class=\"token expression\"><span class=\"token operator\">-</span><span class=\"token number\">100</span> </span><span class=\"token comment\">//The minimum value x or y can be.</span></span>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">define</span> <span class=\"token macro-name\">DDRIVE_MAX</span> <span class=\"token expression\"><span class=\"token number\">100</span>  </span><span class=\"token comment\">//The maximum value x or y can be.</span></span>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">define</span> <span class=\"token macro-name\">MOTOR_MIN_PWM</span> <span class=\"token expression\"><span class=\"token operator\">-</span><span class=\"token number\">255</span> </span><span class=\"token comment\">//The minimum value the motor output can be.</span></span>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">define</span> <span class=\"token macro-name\">MOTOR_MAX_PWM</span> <span class=\"token expression\"><span class=\"token number\">255</span> </span><span class=\"token comment\">//The maximum value the motor output can be.</span></span>\n\n<span class=\"token keyword\">int</span> LeftMotorOutput<span class=\"token punctuation\">;</span> <span class=\"token comment\">//will hold the calculated output for the left motor</span>\n<span class=\"token keyword\">int</span> RightMotorOutput<span class=\"token punctuation\">;</span> <span class=\"token comment\">//will hold the calculated output for the right motor</span>\n\n\n\n<span class=\"token keyword\">void</span> <span class=\"token class-name\">DifferentialDriveService</span><span class=\"token double-colon punctuation\">::</span><span class=\"token function\">CalculateTankDrive</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">float</span> x<span class=\"token punctuation\">,</span> <span class=\"token keyword\">float</span> y<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n <span class=\"token keyword\">float</span> rawLeft<span class=\"token punctuation\">;</span>\n <span class=\"token keyword\">float</span> rawRight<span class=\"token punctuation\">;</span>\n <span class=\"token keyword\">float</span> RawLeft<span class=\"token punctuation\">;</span>\n <span class=\"token keyword\">float</span> RawRight<span class=\"token punctuation\">;</span>\n\n\n <span class=\"token comment\">// first Compute the angle in deg</span>\n <span class=\"token comment\">// First hypotenuse</span>\n <span class=\"token keyword\">float</span> z <span class=\"token operator\">=</span> <span class=\"token function\">sqrt</span><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><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// angle in radians</span>\n <span class=\"token keyword\">float</span> rad <span class=\"token operator\">=</span> <span class=\"token function\">acos</span><span class=\"token punctuation\">(</span><span class=\"token function\">abs</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span> <span class=\"token operator\">/</span> z<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Cataer for NaN values</span>\n <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token function\">isnan</span><span class=\"token punctuation\">(</span>rad<span class=\"token punctuation\">)</span> <span class=\"token operator\">==</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n rad <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n <span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// and in degrees</span>\n <span class=\"token keyword\">float</span> angle <span class=\"token operator\">=</span> rad <span class=\"token operator\">*</span> <span class=\"token number\">180</span> <span class=\"token operator\">/</span> PI<span class=\"token punctuation\">;</span>\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 co-eff 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<span class=\"token keyword\">float</span> 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><span class=\"token punctuation\">;</span>\n <span class=\"token keyword\">float</span> turn <span class=\"token operator\">=</span> tcoeff <span class=\"token operator\">*</span> <span class=\"token function\">abs</span><span class=\"token punctuation\">(</span><span class=\"token function\">abs</span><span class=\"token punctuation\">(</span>y<span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span> <span class=\"token function\">abs</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n turn <span class=\"token operator\">=</span> <span class=\"token function\">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 operator\">/</span> <span class=\"token number\">100</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// And max of y or x is the movement</span>\n <span class=\"token keyword\">float</span> mov <span class=\"token operator\">=</span> <span class=\"token function\">max</span><span class=\"token punctuation\">(</span><span class=\"token function\">abs</span><span class=\"token punctuation\">(</span>y<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token function\">abs</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span><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><span class=\"token punctuation\">(</span>x <span class=\"token operator\">>=</span> <span class=\"token number\">0</span> <span class=\"token operator\">&amp;&amp;</span> y <span class=\"token operator\">>=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">||</span> <span class=\"token punctuation\">(</span>x <span class=\"token operator\">&lt;</span> <span class=\"token number\">0</span> <span class=\"token operator\">&amp;&amp;</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 <span class=\"token punctuation\">{</span>\n rawLeft <span class=\"token operator\">=</span> mov<span class=\"token punctuation\">;</span> rawRight <span class=\"token operator\">=</span> turn<span class=\"token punctuation\">;</span>\n <span class=\"token punctuation\">}</span>\n <span class=\"token keyword\">else</span>\n <span class=\"token punctuation\">{</span>\n rawRight <span class=\"token operator\">=</span> mov<span class=\"token punctuation\">;</span> rawLeft <span class=\"token operator\">=</span> turn<span class=\"token punctuation\">;</span>\n <span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// Reverse polarity</span>\n <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</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> <span class=\"token number\">0</span> <span class=\"token operator\">-</span> rawLeft<span class=\"token punctuation\">;</span>\n rawRight <span class=\"token operator\">=</span> <span class=\"token number\">0</span> <span class=\"token operator\">-</span> rawRight<span class=\"token punctuation\">;</span>\n <span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// Update the values</span>\n RawLeft <span class=\"token operator\">=</span> rawLeft<span class=\"token punctuation\">;</span>\n RawRight <span class=\"token operator\">=</span> rawRight<span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Map the values onto the defined rang</span>\n LeftMotorOutput <span class=\"token operator\">=</span> <span class=\"token function\">map</span><span class=\"token punctuation\">(</span>rawLeft<span class=\"token punctuation\">,</span> DDRIVE_MIN<span class=\"token punctuation\">,</span> DDRIVE_MAX<span class=\"token punctuation\">,</span> MOTOR_MIN_PWM<span class=\"token punctuation\">,</span> MOTOR_MAX_PWM<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n RightMotorOutput <span class=\"token operator\">=</span> <span class=\"token function\">map</span><span class=\"token punctuation\">(</span>rawRight<span class=\"token punctuation\">,</span> DDRIVE_MIN<span class=\"token punctuation\">,</span> DDRIVE_MAX<span class=\"token punctuation\">,</span> MOTOR_MIN_PWM<span class=\"token punctuation\">,</span> MOTOR_MAX_PWM<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div></div>\n<p>If you find this code snippet useful, need help to make it work, or to understand it, please leave a comment and we can talk about it!</p>","headings":[],"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"],"topic":"robotics","type":"how-to","projects":[{"slug":"differential-drive"}],"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-02T04:09:59.722Z"}},"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-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/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":"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/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":"1f3799c3-f107-52e5-9b9c-b24e596e3f3a","topic":"robotics","projectSlugs":["differential-drive"]}},"staticQueryHashes":["1942088059","4080856488"]}