tag:blogger.com,1999:blog-46227755634167529302024-02-20T02:46:51.120+00:00Mark's stream of verbiageMark Robsonhttp://www.blogger.com/profile/15864507044869250062noreply@blogger.comBlogger49125tag:blogger.com,1999:blog-4622775563416752930.post-31581718795961701422021-12-12T11:55:00.000+00:002021-12-12T11:55:34.638+00:00Linux on the Acer SW3 laptop/tablet<p> This machine is the Acer SW3 which is an old tablet PC. It came with Windows 10 32-bit and has a 32Gb internal EMMC storage.</p><p><br /></p><p>Unfortunately, following many Windows updates, Windows no longer fits in the 32Gb storage and I can't find anything more that can be deleted. Windows won't update and has critical vulnerabilities; new software won't install (there is little space anyway) and Windows is very slow.</p><p>So I decided the only way to use the machine was to install Linux.</p><p><br /></p><p>This is not easy, as in 2021 finding a 32-bit Linux distribution is tricky. But Debian still works.</p><p> </p><p>So I put the installer on a usb stick and tried to install. Getting it to boot was the first hurdle - but solved eventually.</p><p>The BIOS on this machine is absolutely terrible. After much experimentation:</p><ul style="text-align: left;"><li>The BIOS ignores most of the EFI spec and will only boot Windows Boot Manager from the internal EMMC</li><li>It largely ignores the EFI boot table, and just does its own thing.</li><li>The BIOS setup program (Press F2 to activate) is graphical and does not have many useful keyboard shortcuts - so the only way is to use the mouse (or built-in touchscreen)</li><li> </li></ul><p> I have *eventually* got it to boot Debian from the emmc after looking at this page https://hansdegoede.livejournal.com/24132.html</p><p> </p><p>I copied the EFI boot files from their normal directory (EFI/debian) to where Windows puts them (EFI/Microsoft/Boot) and renamed shimia32.efi to bootmgfw.efi (the Windows loader) - then the BIOS just blindly loads it anyway.</p><p> </p><p>So far:</p><p> * Wifi is ok</p><p>* Touchscreen works</p><p>* There seems to be no sound.</p><p> </p><p>Needless to say, this machine is VERY slow and old, web browsing is possible but requires some patience. Videos play with a little skipping.</p><p> </p><p> <br /></p>Mark Robsonhttp://www.blogger.com/profile/15864507044869250062noreply@blogger.com0tag:blogger.com,1999:blog-4622775563416752930.post-54208663485628395392021-06-14T10:21:00.001+01:002021-06-14T17:12:14.351+01:00Making the BBB Red ESC<p> In this post I'll explain why, and how I designed the <a href="https://shop.bristolbotbuilders.com/product/redesc/">Bristol Bot Builders N20 Red ESC</a> electronic speed controller for small robots.<br /></p><h2 style="text-align: left;">The Antweight / 150g robot ESCs</h2><div style="text-align: left;">There are quite a few commonly used ESCs available.</div><div style="text-align: left;"><br /></div><div style="text-align: left;"><ul style="text-align: left;"><li>Various "dual channel" speed controllers with or without mixing - these come as a board with lots of flying leads and it's important to connect them correctly. BBB does a special one for Ants which has braking (most don't)</li><li>My previous project - the Malenki Nano - which has a built-in receiver</li><li><a href="https://www.dfrobot.com/product-1489.html">The DFRobot N20 </a></li></ul><p>The advantage of the DFRobot controller, is that it's build on the back of the N20 motor and can be plugged directly into a receiver. This makes it easy for newbies and flexible for different designs. It also simplifies the wiring - these robots are very small and it can often be difficult to cram all the wires into the chassis.</p><p>The good and bad of the DFRobot:</p><p>Good:</p><ul style="text-align: left;"><li>Very easy to use for newbies</li><li>Flexible for designs</li><li>Simple wiring <br /></li></ul><p>Unfortunately there are some problems: <br /></p><p>Bad</p><ul style="text-align: left;"><li>No braking</li><li>Many reports that these controllers fail on 2S lipo packs (8.4v maximum) after prolonged or regular use</li><li>The supplied lead is much too long for these small robots</li><li>Comes already soldered to a N20 motor - if it isn't the type you want - then you need to desolder it and put on a different motor.</li></ul><p>So in this project, I tried to fix <b>all the bad things</b> but keep all the good things :)</p><h2 style="text-align: left;">Features </h2><table><tbody><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Feature</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">DFRobot</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Red ESC</span></p></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Maximum voltage<br /></span></p><br /></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">about 6v (all day)</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">8.4v (for a while perhaps?) </span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;">9v forever :)<br /></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">Orientation<br /></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">"Vertical"</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Horizontal</span></p></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;">Braking<br /></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">No</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;">Yes<br /></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;">Lead<br /></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;">>200mm<br /></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;">80mm<br /></td></tr></tbody></table> <h2 style="text-align: left;">Design notes</h2><h3 style="text-align: left;">Connectors</h3><div style="text-align: left;">Choosing connectors is one of the most difficult things! The DFRobot esc uses a JST-XH 2.5mm pitch connector. To make it fit, they've put the connector on the opposite side of the board from the other components, and it uses the full width of the board. This means that it's a double-sided assembly. I didn't want to do double-sided assembly as it increases costs and I'm working at a much lower volume.</div><div style="text-align: left;"><br /></div><div style="text-align: left;">There are a bewildering array of connectors available, but I eventually settled on the incredibly tiny JST-SH 1mm pitch surface mount and wire-mount connector. Assembly of leads for prototyping was likely to be impossible (it is a super tiny crimp), so I bought some already-crimped leads with bare wires, and crimped my own servo connectors on the other end.</div><div style="text-align: left;"><br /></div><div style="text-align: left;"><h3 style="text-align: left;">Orientation</h3></div><div style="text-align: left;">I cannot take credit for this, it was <a href="https://joeb.xyz/bots.html">Joe's</a> idea. The idea was simply to have the pcb a similar size/shape as the dfrobot, but with the terminals in a different orientation, so it can go out "sideways" from the motor, </div><div style="text-align: left;"><br /></div><div style="text-align: left;"><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXib2BxdX94EZKPmSiK60R0mYXVAGLCsgcesleK8ZsSowVi85DknLMFJT7I2wrSbdrA9e4qFgx6mkteqJW7zU3kd7RVVoqbiX82Z7Tq_QE_tQBNcEyoSPCIyzFXTErBMk8mUxTTJ7JRT7d/s800/dfrobot_vs_red.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="562" data-original-width="800" height="281" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXib2BxdX94EZKPmSiK60R0mYXVAGLCsgcesleK8ZsSowVi85DknLMFJT7I2wrSbdrA9e4qFgx6mkteqJW7zU3kd7RVVoqbiX82Z7Tq_QE_tQBNcEyoSPCIyzFXTErBMk8mUxTTJ7JRT7d/w400-h281/dfrobot_vs_red.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;"><div style="text-align: left;">DFRobot (left), Red ESC (right), </div></td></tr></tbody></table><br /> <br /></div><div style="text-align: left;"><br /></div><div style="text-align: left;"> </div><div style="text-align: left;">This makes the setup work better for thin robots.</div><div style="text-align: left;"> </div><div style="text-align: left;"><h3 style="text-align: left;">Cable assembly</h3><div style="text-align: left;">This was a new experience for me - finding a random company to assemble cables. I am pleased that it worked very well.</div><div style="text-align: left;">The crimping for the jst-sh end is critical - I also wanted to make sure that the wire colours were correct.</div><div style="text-align: left;">The advantage of having these custom cables made - I could specify the length - so I made the cable 80mm, just about long enough for most small robots, but less than half the dfrobot one (which I think is about 200mm)</div><div style="text-align: left;"><br /></div><div style="text-align: left;"><h3 style="text-align: left;">Microcontroller and firmware</h3><div style="text-align: left;">After some messing around, I decided to use the Attiny4 microcontroller - it is the smallest and weakest AVR microcontroller, and one of the smallest ones generally available. It is in a sot-23-6 package, which is just-about hand-solderable, and has an amazing 4 gpio pins.</div><div style="text-align: left;"><br /></div><div style="text-align: left;">I did a couple of tricks -</div><div style="text-align: left;"><ul style="text-align: left;"><li>The internal oscillator on these microcontrollers is not perfectly accurate, so we can't measure 1500 microseconds reliably. So based on an idea from Scott (thanks Scott!) - I simply auto-calibrate when receiving the first pulse after power on.</li></ul></div><div style="text-align: left;"><ul style="text-align: left;"><li>The input signal pin - I have used the "reset" pin for the input signal - which has an advantage that it's tolerant of up to 12 volts, as the 12v is used for "high voltage programming mode" </li></ul><p> </p><p>The Attiny4 can be programmed using a Arduino with the ArduinoISP firmware. After the RSTDISABLE fuse is blow, then it can only be reprorgrammed by putting 12v into the reset pin. I haven't yet found a way to reset the fuse (but I think it's possible).</p><p><br /></p><p>The firmware is about 250 lines and compiles to 362 bytes (the Attiny4 has 512 bytes of flash)<br /></p></div><div style="text-align: left;"><br /></div><h3 style="text-align: left;">Development pictures</h3><h3 style="text-align: left;"> <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd055BoaKEfRCJ8w-lYUV-SQp7zxhQTssVSYSp3NVPfiK6EY7E7j_JAEyvdhiEgqUhpH7YXvzIkwDKDBRPQQENj-FJeliZ2GCg2yQzKlQQPTz1O1YN2fYz19U3gWXKHbirUkUKiEZiuSR8/s2048/badfit.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1539" data-original-width="2048" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd055BoaKEfRCJ8w-lYUV-SQp7zxhQTssVSYSp3NVPfiK6EY7E7j_JAEyvdhiEgqUhpH7YXvzIkwDKDBRPQQENj-FJeliZ2GCg2yQzKlQQPTz1O1YN2fYz19U3gWXKHbirUkUKiEZiuSR8/w640-h480/badfit.jpg" width="640" /></a></div><br /></h3><div style="text-align: left;"> <br /></div><div style="text-align: left;"> An early layout attempt - which didn't actually fit.<br /></div><h3 style="text-align: left;"> <br /></h3><h3 style="text-align: left;"></h3><h3 style="text-align: left;"></h3><h3 style="text-align: left;"><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC7vRlEUggwU8JcI4jUUTg79zwqbS6sWJoJRPoed2mXtNIqeMjPY60Xt1RBM_jsguvrZeSzsIVa2S-x7nkm6leypkCQABZLd1chyphenhyphenySCwDMbcWA-Hns9H7WKJEOuIXXxCA-7rQD1_KwYqzF/s1920/fit1.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1280" data-original-width="1920" height="427" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC7vRlEUggwU8JcI4jUUTg79zwqbS6sWJoJRPoed2mXtNIqeMjPY60Xt1RBM_jsguvrZeSzsIVa2S-x7nkm6leypkCQABZLd1chyphenhyphenySCwDMbcWA-Hns9H7WKJEOuIXXxCA-7rQD1_KwYqzF/w640-h427/fit1.JPG" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;"><div style="text-align: left;">Doing a fit test on the PCB minus components</div></td></tr></tbody></table><br /><br /></h3><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYGDKw5Nxm8QzpymhLaMIAKpb5nn6LsFIv2tZ1N4EpAjugRar9A6aRlSQ32toxbwQE8cC_PlX36rBTkwG5Ligi6xRQg0lEpma-yOza7Ko9BOQ6WT2bkJM41Lo-PNw-1Th0fDTNUQcNWEJ8/s800/panel4_proto.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="687" data-original-width="800" height="550" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYGDKw5Nxm8QzpymhLaMIAKpb5nn6LsFIv2tZ1N4EpAjugRar9A6aRlSQ32toxbwQE8cC_PlX36rBTkwG5Ligi6xRQg0lEpma-yOza7Ko9BOQ6WT2bkJM41Lo-PNw-1Th0fDTNUQcNWEJ8/w640-h550/panel4_proto.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;"><div style="text-align: left;">A
panel made by JLCPCB for the prototypes. I had them assemble some of
the trickier components and put the microcontroller and connector on by
myself.</div></td></tr></tbody></table><br /><div style="text-align: left;"><br /></div><h3 style="text-align: left;"></h3><div style="text-align: left;"></div><div style="text-align: left;"></div><div style="text-align: left;"></div><div style="text-align: left;"><br /></div></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCNvU4YjEosNMVc0Y2SxrURzvnd9ZNwRn-gbH1iwoWXPLjaKyXVhzCx42fwCk4jT-cCTzcH5KypsbHqiwnQpABbfUsByKa9JdB7EeEqJF3ofNSltX0MSa0bTOEDfnDt0DjBtbs9kEdwMu9/s679/n20_motorback_productpic.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="679" data-original-width="600" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCNvU4YjEosNMVc0Y2SxrURzvnd9ZNwRn-gbH1iwoWXPLjaKyXVhzCx42fwCk4jT-cCTzcH5KypsbHqiwnQpABbfUsByKa9JdB7EeEqJF3ofNSltX0MSa0bTOEDfnDt0DjBtbs9kEdwMu9/w564-h640/n20_motorback_productpic.jpg" width="564" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;"> A home made prototype - similar to the production version, but not quite so red </td></tr></tbody></table><br /><div style="text-align: left;"><br /></div><h3 style="text-align: left;"> <br /></h3><div style="text-align: left;"><br /></div></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjd1LNtMp7Wy3Nb2ya-p6TR4n8CB6PeH9pdldNvNp62aIBRdm-Uosam08UNNUBAz_c6JmzHtKzWhHDCF0_Tmw5a1aYMENbhAPFjsRf4p8bzZ-37i08Ue9MmAb70DaCRmDKEwLyuzri_XNPv/s800/dogfood-bot.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="600" data-original-width="800" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjd1LNtMp7Wy3Nb2ya-p6TR4n8CB6PeH9pdldNvNp62aIBRdm-Uosam08UNNUBAz_c6JmzHtKzWhHDCF0_Tmw5a1aYMENbhAPFjsRf4p8bzZ-37i08Ue9MmAb70DaCRmDKEwLyuzri_XNPv/w640-h480/dogfood-bot.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;"><div style="text-align: left;">Dogfood-robot with red on one side and dfrobot on the other <br /></div></td></tr></tbody></table><br /><h2 style="text-align: left;"><br /></h2><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3JB-awjpRnQrrdjTA7u2_hHQMJdaCzk9e5g6jj0ftxBsPfkgPq_FV_ZAbopM5WxkDVm1m0A-tHALFp1T9TaECYutdW7dRWcPSfPsqz-uu52Tkl51VyVpUZbNErKFiK0GPmfh6e6PKglBA/s800/n20_panel.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="740" data-original-width="800" height="592" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3JB-awjpRnQrrdjTA7u2_hHQMJdaCzk9e5g6jj0ftxBsPfkgPq_FV_ZAbopM5WxkDVm1m0A-tHALFp1T9TaECYutdW7dRWcPSfPsqz-uu52Tkl51VyVpUZbNErKFiK0GPmfh6e6PKglBA/w640-h592/n20_panel.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Some assembled panels</td></tr></tbody></table><br /><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div></div>Mark Robsonhttp://www.blogger.com/profile/15864507044869250062noreply@blogger.com0tag:blogger.com,1999:blog-4622775563416752930.post-80459102410114996122021-01-22T12:29:00.002+00:002021-01-22T12:38:36.635+00:00The Raspberry Pi Pico Microcontroller<p>Yesterday they launched a new product, the Pi Pico Microcontroller.</p><p>I thought "meh" what's so special? We already have plenty of microcontrollers, and several popular platforms with Makers:</p><p>* Arduino (AVR-based)</p><p>* ESP32 (dual core, weird xtensa architecture, hardware floating point, built-in wifi and bt radio) - a highly capable, very complex and poorly documented chip<br /></p><p>* Micro Bit and the NRF52* chips - built in radio, ARM cores</p><p>* Loads of 8-bit options and 32-bit options for uc</p><p><br /></p><p>So, what is good about the Pi Pico?</p><h2 style="text-align: left;">Proper USB</h2><div style="text-align: left;">Many of the other popular microcontrollers don't have a "real" USB interface. The Arduino Nano and ESP32 boards have a USB connector, but it's hard-wired into a usb-serial thing. This means it can only ever be a serial port.</div><div style="text-align: left;"><br /></div><div style="text-align: left;">With the Pi Pico, it can be a USB serial if you want, but it can also be other things, possibly at the same time:</div><div style="text-align: left;">* HID emulation (become a keyboard / mouse)</div><div style="text-align: left;">* Storage emulation - that's what the bootloader does</div><div style="text-align: left;"><br /></div><div style="text-align: left;">Also, the "USB Serial" on the Pi Pico is only emulated, it doesn't have the limitations of a real serial interface, it doesn't electrically exist - it's much faster and can't get its baud rates mixed up.</div><div style="text-align: left;"> </div><div style="text-align: left;">NB: Yes, I know that a lot of other microcontrollers DO have USB, and the latest ESP* chips have proper USB too. <br /></div><div style="text-align: left;"><h2 style="text-align: left;">Unbrickable</h2><div style="text-align: left;">I don't like to use the term "unbrickable" as I successfullly bricked a "unbrickable" esp8266 :)</div><div style="text-align: left;"> </div><div style="text-align: left;">But the bootloader is in ROM -so it can't be trashed - and both the SWD interface and USB bootloader will allow you to reflash a Pi Pico.</div><div style="text-align: left;"><br /></div><div style="text-align: left;">The Arduinos - are brickable in principle - as the chips have various "fuses" which can be set in a way which prohibits further programming. This is by design, but it's bad if accidetnally activated.</div><div style="text-align: left;"><br /></div><div style="text-align: left;">Also the Arduino bootloader, if overwritten, makes it more difficult (although not impossible) to reuse the device.</div><div style="text-align: left;"> </div><div style="text-align: left;"><h2 style="text-align: left;">PIO Interface</h2><div style="text-align: left;">I think it's fair to say that the hackers who have played with the PIO are only starting to appreciate its capability. I've not played with it yet, but it is:</div><div style="text-align: left;"><ul style="text-align: left;"><li>Flexible interface for reading / writing serial or modestly parallel protocols at (fairly) high speeds</li><li>Can be reprogrammed to do UART, SPI, and all sorts of other things which don't have dedicated hardware</li><li>Writing data to the "infamous" WS2812 "neopixel" self-clocking serial protocol - which needs to be bit-banged on nearly every device. <br /></li><li>Uses yet unimagined</li></ul>Some other microconrollers have similar things, but as far as I can see, the Pi Pico's PIO is more flexible, easier, better documented, and possibly more powerful than most of them.</div><div style="text-align: left;"> </div><div style="text-align: left;"> To be fair, the ESP32 also has a peripheral called "RMT" which can do some of these things.</div><div style="text-align: left;"><br /></div><div style="text-align: left;"><h2 style="text-align: left;">Enough memory</h2><div style="text-align: left;">A lot of the other chips in the same kind of price range have a smaller amount of SRAM - which makes even simple things awkward. Also low-SRAM chips have little or no capability of using high level languages or text-based diagnostics (think REPL) - because there simply isn't enough RAM to store the strings.</div><div style="text-align: left;"> </div><div style="text-align: left;">I tried programming the esp8266 using Micropython - it works, but there is a crippling lack of RAM which makes complex programs impossible (even though there is execute-in-place).</div><div style="text-align: left;"> </div><div style="text-align: left;">The Pi Pico also has execute-in-place which makes more ram available for applications.</div><div style="text-align: left;"> <br /></div></div></div></div><h2 style="text-align: left;">ARM cores?<br /></h2><div style="text-align: left;">To be honest, it would have been "interesting" to see RiscV cores, but I know that Cambridge-based Raspberry Pi is very ARM-centric. I suppose nobody got fired for using ARM. I'm far less excited about the cores than the rest of the chip.</div><div style="text-align: left;"><br /></div><div style="text-align: left;"><h2 style="text-align: left;">The PCB / dev board</h2><div style="text-align: left;">I've been talking so far about the microcontroller - but the Pi Foundation actually released a dev board (the microcontroller isn't generally available yet - but it will be - and some other integrators have already got samples).</div><div style="text-align: left;"><br /></div><div style="text-align: left;">The dev board isn't anything magical or special, but it is quite tidy and looks to have good power regulation.</div><div style="text-align: left;"><br /></div><div style="text-align: left;">Personally I'd have quite liked to see the header pins 0.1 inch closer together - but that would probably make breaking out all the GPIOs more difficult or compromise other things - so it's ok.</div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><h2 style="text-align: left;"> "Raspberry Pi Silicon"</h2><div style="text-align: left;">As far as I can tell this is a marketing gimmick mocking another fruity company.</div><div style="text-align: left;"> </div><div style="text-align: left;">Weren't the Raspberry Pi 2, 3, 3B+, 4 all Raspberry Pi silicon? They were all chips made by Broadcom but totally to the spec of the RPF and not generally available. Only the first Pi used an "off the shelf" chip.<br /></div><div style="text-align: left;"><br /></div><div style="text-align: left;">It seems the major difference is labelling. And the guts of the Pi Pico presumbly contains lots of IP from different companies. They could have easily outsourced much of the design and/or validation.</div><div style="text-align: left;"><br /></div><div style="text-align: left;">So I think it's just marketing words.<br /></div><h2 style="text-align: left;"><br /></h2><h2 style="text-align: left;"><br /></h2></div><div style="text-align: left;"><br /></div>Mark Robsonhttp://www.blogger.com/profile/15864507044869250062noreply@blogger.com0tag:blogger.com,1999:blog-4622775563416752930.post-3718995745522224282020-09-26T21:09:00.001+01:002020-09-26T21:09:42.080+01:001-wire radio control protocols<p>Ramble...</p><p> These protocols are used typically to communicate between a radio reciever and flight controller, or any other kind of controller in a flying drone, robot, or something else.</p><p> </p><p>I'm considering here, ibus, sbus and PPM</p><h2 style="text-align: left;"> FUTABA S-BUS</h2><p>------------<br /><br />This is the protocol used by Futaba receivers, servos, and some other things. It's a serial<br />1-wire protocol and uses an unusual bit rate of 100kbaud.<br /><br />Some details are here:<br /><a href="https://os.mbed.com/users/Digixx/notebook/futaba-s-bus-controlled-by-mbed/">https://os.mbed.com/users/Digixx/notebook/futaba-s-bus-controlled-by-mbed/</a> <br /><a href="https://github.com/uzh-rpg/rpg_quadrotor_control/wiki/SBUS-Protocol">https://github.com/uzh-rpg/rpg_quadrotor_control/wiki/SBUS-Protocol</a><br /><br />The S-bus signal is "upside down" - normally low, and uses low=0, high=1.</p><p>S-bus also requires some "bit twiddling" because it uses 10 bits per channel and splits them between several bytes.</p><p> Pros: Many digital receivers support it.</p><p>Cons: A pain in the arse to decode, difficult to simulate, USB serial dongles usually can't decode it. <br /></p><h2 style="text-align: left;">TURNIGY / HOBBYKING / FLYSKY - I-BUS</h2><p>Ibus uses a bit rate of 115,200 baud, which is a "standard" speed. I-bus is "the usual orientation", normally high, low=1, high=0 (this is consistent with most other serial protocols)<br /><br />Ibus uses simply 2 bytes per channel and outputs the number of microseconds wide that a pulse would be if the channel was transmitted as a servo pulse (1000 - 2000 with 1500 as the centre).</p><p>Pros: Much simpler than S-Bus to decode, can decode with a USB-Serial dongle easily.</p><p>Cons: Only Flysky (like) receivers support it.<br /></p><h2 style="text-align: left;">PPM</h2><div style="text-align: left;">PPM is a scheme of multiplexing several channels of servo pulses on the same wire. It still uses 1000-2000 microsecond pulses for the channels, but sends them sequentially with a longer sync pulse.</div><div style="text-align: left;"> </div><div style="text-align: left;">If your microcontroller doesn't have a crystal, you might not be able to detect the 1500us centre pulses accurately, and need to trim the centre position. The microcontroller might vary its speed slightly depending on voltage and temperature. (Radio receivers need a crystal to operate their radio, so their timing must be spot on)<br /></div><div style="text-align: left;"> </div><div style="text-align: left;"> </div><div style="text-align: left;">Pros: Widely supported</div><div style="text-align: left;">Cons: Analogue; need exact timing to get centre position trimmed correctly. Electrical noise could cause channels to get mixed up with crazy results. Supports fewer channels than sbus or ibus.<br /></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><h2 style="text-align: left;"> </h2>Mark Robsonhttp://www.blogger.com/profile/15864507044869250062noreply@blogger.com0tag:blogger.com,1999:blog-4622775563416752930.post-52104460496710624182020-06-14T22:03:00.000+01:002020-06-14T22:05:27.334+01:00Malenki-Nano receiver - development pictures<div dir="ltr" style="text-align: left;" trbidi="on">
Here are some pictures of prototypes of the Malenki-Nano.<br />
<br />
<h2 style="text-align: left;">
Prototype 0</h2>
<div style="text-align: left;">
This was a veroboard / stripboard which was already used for development of my earlier ESC. The MCU was atttiny1614, and the radio module was "dead bug" installed with hot glue and bodge wires.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Motor drivers were mostly none, but I did add a rz7899 on a breakout board at some point. There are various sockets in the front side of the board and quite a few LEDs, I can't remember why I put them all there or what plugged in where.</div>
<div style="text-align: left;">
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJ8hLY8hMfEYuup3DTEY3rjmjlOwLxkVX88OpZ4CxZ6lnYzlDLj8ku_Avdc6lu08tkIOddP-pYH0FXZG_D-VuMnjXUGsomvKCXAibemqk23FCZc_i-OvTtZ75VbPedyOo4U2QMW_CJdfDh/s1600/prototype0-a.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="655" data-original-width="647" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJ8hLY8hMfEYuup3DTEY3rjmjlOwLxkVX88OpZ4CxZ6lnYzlDLj8ku_Avdc6lu08tkIOddP-pYH0FXZG_D-VuMnjXUGsomvKCXAibemqk23FCZc_i-OvTtZ75VbPedyOo4U2QMW_CJdfDh/s320/prototype0-a.jpg" width="316" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQqHJQRiR4JsDVPtLJFGwFlIVU5aGxG6WM0kVFyqETYyotCvA4tT4N5h1vnu61v9uVHF9dquJ2-S0p8WfSw_EWzh3TqiPxLZI0Mqq28B4RoXinCFFpn2H7pPWxmcIKbpRFkIM-vYYGaNrm/s1600/prototype0-b.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1052" data-original-width="1408" height="239" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQqHJQRiR4JsDVPtLJFGwFlIVU5aGxG6WM0kVFyqETYyotCvA4tT4N5h1vnu61v9uVHF9dquJ2-S0p8WfSw_EWzh3TqiPxLZI0Mqq28B4RoXinCFFpn2H7pPWxmcIKbpRFkIM-vYYGaNrm/s320/prototype0-b.jpg" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
</div>
<h2 style="text-align: left;">
</h2>
<h2 style="text-align: left;">
Prototype 1</h2>
<div style="text-align: left;">
I created a PCB with rz7899 motor drivers x3 and components on both sides. It used the attiny1614 which was hand-soldered quite easily due to its 1.27mm pitch.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBkAl2SITqphh3RrqRlQQ4pjYZrBzt3LoUXbGet0gfl9Kj7F1xb2_Btk-ASr8vB9ZY4qWaxhntAkOhh7IUelI9pHE-RIwPSt5DT6Dylj4sxbWQhwEhiNaW-VKMzpwRWKrr9cZrHMXwtGAW/s1600/prototype1-a.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="338" data-original-width="342" height="316" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBkAl2SITqphh3RrqRlQQ4pjYZrBzt3LoUXbGet0gfl9Kj7F1xb2_Btk-ASr8vB9ZY4qWaxhntAkOhh7IUelI9pHE-RIwPSt5DT6Dylj4sxbWQhwEhiNaW-VKMzpwRWKrr9cZrHMXwtGAW/s320/prototype1-a.jpg" width="320" /></a></div>
Unfortunately this prototype died a fiery death caused by a short circuit connected to a lipo.<br />
<br />
This was a lot bigger than it needed to be, so I looked for other motor drivers to replace the (excellent, reliable) rz7899.<br />
<br />
<h2 style="text-align: left;">
Prototype 2</h2>
<div style="text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfnyElsyRCnsODZnnJhKvaqMBGNw9bhIO7eDmNkI7KQOnuqHbdKe-g-St6kmJz4pLqzZp1LKdUq5_1f1ujX8iIXm0wpBXdnQuFcZcJ1kA7gblrR6cLcgObSpC2B0z87Y9gA6aj6hsOYqGN/s1600/prototype2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1086" data-original-width="1254" height="277" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfnyElsyRCnsODZnnJhKvaqMBGNw9bhIO7eDmNkI7KQOnuqHbdKe-g-St6kmJz4pLqzZp1LKdUq5_1f1ujX8iIXm0wpBXdnQuFcZcJ1kA7gblrR6cLcgObSpC2B0z87Y9gA6aj6hsOYqGN/s320/prototype2.jpg" width="320" /></a></div>
This hand-soldered prototype uses the mx113l motor drivers, which are in a little sot23-6 package, but don't handle as much current as the later ones.<br />
<br />
Soldering the attiny3217 was quite tricky (no pins, 0.5mm pitch pads) <br />
<br />
This board unfortunately had a couple of design mistakes which were not easily corrected - I added a bodge wire to make the radio work, but the weapon channel is still broken.<br />
<br />
It still drives ok and I use it to test firmware in a robot (pictured).<br />
<br />
<h2 style="text-align: left;">
Prototype 3</h2>
<div style="text-align: left;">
I finally got it right! The motor drivers are now drv8837d which are really tiny and drive 1.8 amps. Hand-soldering this prototype was not easy and I broke one board completely before I made this prototype work.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCXD-FJhp_K7WOBhlNJdRLRSyvSQzAAQy_s0cHKi_hPkPuAq_8ISnymIevRcTNGCz31OhyB4oh5QBsI_2JoLm0YicsfmeN8XI0uYnm3uxn_Y_aobtT70hP7Hfx_fE70D-dQuK3kret0R3p/s1600/prototype3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="412" data-original-width="376" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCXD-FJhp_K7WOBhlNJdRLRSyvSQzAAQy_s0cHKi_hPkPuAq_8ISnymIevRcTNGCz31OhyB4oh5QBsI_2JoLm0YicsfmeN8XI0uYnm3uxn_Y_aobtT70hP7Hfx_fE70D-dQuK3kret0R3p/s320/prototype3.jpg" width="292" /></a></div>
<br />
<h2 style="text-align: left;">
Production board</h2>
<div style="text-align: left;">
The first production run. These were panelised with 2 boards per panel, so you can see the "mouse bites" where they were separated. A machine soldered these ones.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3EA3jNJIYPyecxFVlYBPXnlaLsJcLzq23zfS-s14Ot54IYF0H4g8n9Pehn3ErB-Bqhftr8aGQyZhFQqnqBeH0d-GCHnLhzrlK7BxbaE80yWN_CTGiiO61u3-PjHhbZ7LrQvqYQNJrm7WD/s1600/production.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="574" data-original-width="828" height="221" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3EA3jNJIYPyecxFVlYBPXnlaLsJcLzq23zfS-s14Ot54IYF0H4g8n9Pehn3ErB-Bqhftr8aGQyZhFQqnqBeH0d-GCHnLhzrlK7BxbaE80yWN_CTGiiO61u3-PjHhbZ7LrQvqYQNJrm7WD/s320/production.jpg" width="320" /></a></div>
<div style="text-align: left;">
<br /></div>
<h2 style="text-align: left;">
Programming pins rig</h2>
<div style="text-align: left;">
I made this rig to do programming and testing, to avoid the need to clip / unclip at least three test clips (without creating any shorts...)</div>
<div style="text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZ0wUEikUVX33zyspkbmsEDEXmG34m2Y1jJCwvnt60qFR27pFKvYBgEALHObjwMKCKb-mRSTh2fCX6UllDR0DmSQY76wMk0IRsPHDN7e1ZP6PO_Hxh7Xz3Eh4A3FCO9rllAyniiJiRwacJ/s1600/IMG_1463.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1067" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZ0wUEikUVX33zyspkbmsEDEXmG34m2Y1jJCwvnt60qFR27pFKvYBgEALHObjwMKCKb-mRSTh2fCX6UllDR0DmSQY76wMk0IRsPHDN7e1ZP6PO_Hxh7Xz3Eh4A3FCO9rllAyniiJiRwacJ/s320/IMG_1463.JPG" width="213" /></a></div>
<div style="text-align: left;">
</div>
<h2 style="text-align: left;">
<br /></h2>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijKXgOwtW4d_3eVUp_TaBJNVi38XeyatoCvFlWIXg2ZywkmleaH5M3wT6DAPi7a3MQiGoND28gE9hjNYJsm0GLnEBlTa9SpliM2t38SsWa3HhOy2tQHh8y99621Hi_RdtDIuptPP6M24XG/s1600/prog-test-board.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1067" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijKXgOwtW4d_3eVUp_TaBJNVi38XeyatoCvFlWIXg2ZywkmleaH5M3wT6DAPi7a3MQiGoND28gE9hjNYJsm0GLnEBlTa9SpliM2t38SsWa3HhOy2tQHh8y99621Hi_RdtDIuptPP6M24XG/s320/prog-test-board.jpg" width="213" /></a></div>
<br />
<div style="text-align: left;">
</div>
<br />
<br />
<div style="text-align: left;">
I can hold the pins down with a test-device, then wait while the firmware is written. It then automatically starts in a special test mode which flashes all the LEDs on the programmer (using the motor drivers) so that I know all the motor drivers are working ok.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<br /></div>
</div>
Mark Robsonhttp://www.blogger.com/profile/15864507044869250062noreply@blogger.com0tag:blogger.com,1999:blog-4622775563416752930.post-5709073146659672892020-04-29T09:33:00.002+01:002020-04-29T09:33:36.175+01:00Electronics assembly with Kicad and JLCPCB Assembly<div dir="ltr" style="text-align: left;" trbidi="on">
I am shortly getting this assembled:<br />
<br />
<img alt="" height="237" src="data:image/png;base64,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" width="400" /><br />
<br />
Thanks to <a href="http://jlcpcb.com/">JLCPCB </a>Assembly.<br />
<br />
Designed with <a href="https://kicad-pcb.org/">Kicad </a><br />
<br />
A big thanks to all EEVBlog forum users and EEVBlog forum user "essele" who created this <a href="https://github.com/essele/kicad_jlcpcba">Kicad plugin for jlcpcb assembly</a> which I have now <a href="https://github.com/MarkR42/kicad_jlcpcba">forked to work with panelised boards</a><br />
<br />
Also thanks to Flemming Frandsen for <a href="https://gitlab.com/dren.dk/kicad-util">kicad-util </a>which generated the pcb panelisation. I have forked this to work with Kicad-nightly.<br />
<br />
<br />
<br />
<br /></div>
Mark Robsonhttp://www.blogger.com/profile/15864507044869250062noreply@blogger.com0tag:blogger.com,1999:blog-4622775563416752930.post-81178273291021787172020-03-16T17:29:00.001+00:002020-06-14T22:05:40.023+01:00Malenki-nano radio receiver and speed controller<div dir="ltr" style="text-align: left;" trbidi="on">
Let's have a look at what I've been working on.<br />
<br />
The Malenki-Nano is control module board for robot builders, intended for small robots of 150g or less, where weight and space are important.<br />
<br />
Traditionally, a separate receiver and speed controller(s) were used. This is great but it means there are a lot of messy wires to get tangled / broken and take up space inside the robot. The integrated module reduces wiring and is lighter than a traditional rx / esc combination.<br />
<br />
My module's specs are:<br />
<ul style="text-align: left;">
<li>A PCB with radio module mounted on top, dimensions approx 30x20 mm</li>
<li>Overall height ~ 10mm (because of the very large crystal oscillator can on the radio, I cannot easily fix this)</li>
<li>Electronic speed controller: three channels of DC brushed motors @ 1.8A per channel maximum </li>
<li>Power input - 1-2S lipo pack (minimum ~3.6V, maximum 8.4V)</li>
<li>Radio protocol: "AFHDS 2A" which is used by many cheap radios (e.g. those sold by Hobbyking)</li>
<li>Antenna: PCB trace "F" antenna (see picture) - seems to give a range of at least 20 metres indoors, which is enough for robot combat. </li>
<li>Auxilliary channels - 2x PWM output for other devices e.g. brushed ESC or servo.</li>
<li>(NO built-in BEC / 5v regulator; the device uses 3.3v internally)</li>
<li>Weight: < 4g excluding wires </li>
</ul>
Pictures, or it didn't happen?<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://vectrex.org.uk/mark/back-01.png"><img alt="http://vectrex.org.uk/mark/back-01.png" border="0" data-original-height="766" data-original-width="1002" height="305" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFhDiPj9wAgF4_PvCPKqapUzRm8UNl5SDBNFHFFiWo9Bele1ZJJSm_epJKJQOfqnl0SpEC3ZytDNPVBcvodcqY_qLmVh-OyQcVXOI1ThTMylQCmEE-eh2rmqZnitEtCYC7lzdfVAcuUnTi/s400/back-01.png" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoXdAzKfsrXXkEFqCruxjb5_x85BXPZvFvAhVP07j9i-mV6tTApT9YDilR7v7xM_H2jszfGc3KBynmdIPpvQjsD8KmCMqWzXTXUBzyQwXxm7pZG2mCe_JYVgsUBX_Kz913pImmBVJxbCYA/s1600/front-01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="714" data-original-width="886" height="321" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoXdAzKfsrXXkEFqCruxjb5_x85BXPZvFvAhVP07j9i-mV6tTApT9YDilR7v7xM_H2jszfGc3KBynmdIPpvQjsD8KmCMqWzXTXUBzyQwXxm7pZG2mCe_JYVgsUBX_Kz913pImmBVJxbCYA/s400/front-01.png" width="400" /> </a></div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://github.com/MarkR42/malenki-nano">The Malenki-nano module is open source!</a> </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Status:</div>
<div class="separator" style="clear: both; text-align: left;">
* This module, pictured above, works in its current prototype, but there are a lot of changes I need to do, including swapping the motor driver chips and fixing a few minor problems with the pcb layout. </div>
<div class="separator" style="clear: both; text-align: left;">
I also need to test it with more different transmitters.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Availability: </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
I may be able to make some of these boards available to purchase, later in the year 2020. Update: fill in <a href="https://docs.google.com/forms/d/e/1FAIpQLScppgVBDqvEzrddiLGNNCNgslkn2GobI7XwGkdiXg22KRU8VA/viewform?vc=0&c=0&w=1&usp=mail_form_link">this contact form </a>if you are interested, and I will get back to you.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
</div>
Mark Robsonhttp://www.blogger.com/profile/15864507044869250062noreply@blogger.com0tag:blogger.com,1999:blog-4622775563416752930.post-80767839975560358482020-01-01T14:42:00.000+00:002020-01-01T14:42:15.861+00:00Renewable energy exaggeration<div dir="ltr" style="text-align: left;" trbidi="on">
Every year (or more often) we see these "feel good" renewable energy stories such as:<br />
<br />
<a href="https://news.sky.com/story/more-power-came-from-renewable-energy-than-fossil-fuels-in-uk-in-2019-11898806?dcmp=snt-sf-twitter">https://news.sky.com/story/more-power-came-from-renewable-energy-than-fossil-fuels-in-uk-in-2019-11898806?dcmp=snt-sf-twitter</a><br />
<br />
I'm not trying to single out Sky News, nor is it really "fake news".<br />
<br />
Just somewhat optimistic exaggeration.<br />
<br />
<h3 style="text-align: left;">
Forms of energy</h3>
<div style="text-align: left;">
In the UK, energy usage is approximately split three ways, for heating, transport and everything else.</div>
<div style="text-align: left;">
Grid electricity is almost 100% "everything else". So today only about one third of our energy goes through the grid. </div>
<div style="text-align: left;">
Almost all of the heating and transport is fossil-fuel based, and that's changing only very slowly.</div>
<div style="text-align: left;">
So even if the grid was to be magically 100% carbon-free (or "renewable", but that's another story) then the other two-thirds would still be mostly fossil fuel.</div>
<div style="text-align: left;">
As far as I can tell, people who haven't read <a href="https://withouthotair.com/">David MacKay's book, </a>usually forget this.</div>
<div style="text-align: left;">
New houses are being built, mostly with gas boilers, which cannot run off renewable energy (NB: I know, biogas etc, is a thing, but not at scale).</div>
<div style="text-align: left;">
New vehicles are being built which cannot run off anything except fossil fuels.</div>
<h3 style="text-align: left;">
Fake news or not?</h3>
<div style="text-align: left;">
No. The report is from National Grid, who don't monitor non-grid based energy. Heating was not mentioned at all, and transport was only mentioned for future planning.</div>
<div style="text-align: left;">
<br /></div>
<h3 style="text-align: left;">
What's the real story?</h3>
<div style="text-align: left;">
Really it should be "Fossil fuels still make 85% of UK's energy". (Or thereabouts)</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
This doesn't sound so encouraging.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
But have a happy new year anyway.</div>
</div>
Mark Robsonhttp://www.blogger.com/profile/15864507044869250062noreply@blogger.com0tag:blogger.com,1999:blog-4622775563416752930.post-7520291945751154982019-12-28T21:56:00.003+00:002019-12-28T22:12:02.946+00:00Reverse engineering the Flower Power app<div dir="ltr" style="text-align: left;" trbidi="on">
"Flower Power" is an "internet connected" plant / soil monitoring device which was sold in 2016 by Parrot. The company subsequently decided to discontinue these products to concentrate on its better-known flying drone products.<br />
<br />
We acquired some Flower Powers for an environmental study project.<br />
<br />
<h2 style="text-align: left;">
How did it work?</h2>
<div style="text-align: left;">
A small low power, very clever monitoring device ( see <a href="https://www.fictiv.com/blog/posts/parrot-flower-power-teardown">Sylvia Wu's magnificent teardown</a> ) monitors the environmental conditions, and logs them into a local non-volatile memory. It has a Bluetooth Low Energy (BLE) radio to communicate with smartphones.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Then periodically it synchronises with a smartphone app (available for Android and ios) to send the data up to a "cloud" internet server. The phone app doesn't need to connect to the sensor and the internet at the same time; it can buffer data and send them up later - which is useful if your plants are in a location where internet connection isn't available.</div>
<h2 style="text-align: left;">
What's the problem?</h2>
<div style="text-align: left;">
Parrot have stopped supporting the devices and will switch off the (internet) API soon.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
We still have working sensors and want to use them at least next year, maybe after.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
There may also be more Flower Powers sitting in storage somewhere; those will become really useless if the API to update the firmware isn't available. I wanted to get the firmware before Parrot turn off their servers.</div>
<div style="text-align: left;">
<br /></div>
<h2 style="text-align: left;">
Reverse engineering </h2>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
The Android app is a .apk file. I downloaded file from this "sideloading" site here: </div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<a href="https://apkpure.com/parrot-flower-power/com.parrot.flowerpower.android/download?from=details">https://apkpure.com/parrot-flower-power/com.parrot.flowerpower.android/download?from=details</a></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
- of course I don't know if this is the real, unmodified app (from "apkpure"), but it seems likely. I'm not going to load it on a real phone from here.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
I extracted the files from .zip formats, and eventually found the "meat" of the application in the .dex files classes.dex classes2.dex and classes3.dex.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
These are "Dalvik Executable" files, which are just packed in a different format to .jar - so I' used this utility "<a href="https://github.com/pxb1988/dex2jar/releases/tag/2.0">dex2jar</a>" to convert them into .jar</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Then I used this <a href="http://java-decompiler.github.io/">Java Decompiler</a> to extract the source code.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
I was able to see that the app communicates with https://api-flower-power-pot.parrot.com - but it uses some weird authentication scheme.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Fortunately, the code <a href="https://github.com/growobservatory/MyData">https://github.com/growobservatory/MyData</a> implements the authentication scheme for this API. </div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
The "secret" client id and client secret are also hard-coded in the Android app source code, so I was able to log in and call the APIs (and get the api token needed for authentication below).</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Using this, I obtained the firmware download location:</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<pre>wget -S - 'https://api-flower-power-pot.parrot.com/sensor_data/v1/firmware_update/flower-power' --header="Authorization: Bearer myapitoken"
// Got API token by using MyData
// "flower-power" device
{
"errors" : [],
"firmware_version" : "2016-09-14_hawaii-2.0.3_hardware-config-MP",
"user_config_version" : 39,
"server_identifier" : "2.1.18 April 6th 2017",
"firmware_update_url" : "http://hawaii2-web-service-prod-firmware.s3.amazonaws.com/2016-09-14_hawaii-2.0.3_hardware-config-MP.bin?1474470262",
"garden_status_version" : 219
}</pre>
<pre></pre>
<div style="text-align: left;">
Then I could download (without authentication) the firmware image file.</div>
<div style="text-align: left;">
<br /></div>
<h2 style="text-align: left;">
What next?</h2>
<div style="text-align: left;">
Ultimately, if we have any new boxed Flower Powers, I will create an app which flashes the firmware image without using Parrot's cloud servers.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
This should allow flashing the devices.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
We can also call any of the APIs which the app uses, to get our data from the cloud, plus pictures, etc. (Grow Observatory's Getdata app does some of this)</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
To be continued... I have all the files downloaded. I suppose if Parrot's servers go away, it gets more interesting.<br />
<br />
Also, this NodeJS project claims it can talk to the Flower Power:<br />
<br />
<a href="https://github.com/sandeepmistry/node-flower-power">https://github.com/sandeepmistry/node-flower-power </a><br />
<br />
It also says it can update the firmware. <br />
</div>
</div>
</div>
Mark Robsonhttp://www.blogger.com/profile/15864507044869250062noreply@blogger.com0tag:blogger.com,1999:blog-4622775563416752930.post-28721561816471141782019-11-17T18:40:00.002+00:002019-11-17T18:41:00.734+00:00Tinyavr toolchain update<div dir="ltr" style="text-align: left;" trbidi="on">
Attiny1614 / other tinyavr microcontrollers: <br />
<br />
I had a quick go at automating the toolchain build from these instructions<br />
<br />
<a href="https://github.com/vladbelous/tinyAVR_gcc_setup">https://github.com/vladbelous/tinyAVR_gcc_setup</a><br />
<br />
After falling down a couple of rabbit holes, I have made a better toolchain build script which is mostly automated and works with many of the chips (attiny3217, 1614 are the only ones I'm targetting).<br />
<br />
Build script is here:<br />
<br />
<a href="https://github.com/MarkR42/robotbits/tree/master/avr_toolchain">https://github.com/MarkR42/robotbits/tree/master/avr_toolchain</a><br />
<br />
The trick was to get a recent subversion avr-libc and patch it with a patch provided from somwhere... details are in the script and it should work.<br />
<br />
Now I don't need ot use Vlad Belous hacky method of installing (but thanks anyway, Vlad, it worked ok before). Vlad's instructions to install binutils and gcc were flawless though.<br />
<br />
YES!<br />
<br />
If you need to build with an open source toolchain, for attiny1614, attiny3217 or others in the same series, try my build.sh script (obviously read it first!)</div>
Mark Robsonhttp://www.blogger.com/profile/15864507044869250062noreply@blogger.com0tag:blogger.com,1999:blog-4622775563416752930.post-44813800031623947242019-10-13T21:31:00.000+01:002019-10-13T21:31:08.084+01:00Using the ATTINY1614 microcontroller<div dir="ltr" style="text-align: left;" trbidi="on">
Microchip / Atmel made some new microcontrollers. This adds to the already huge range of parts.<br />
<br />
I've been playing with the ATTINY1614. This is part of the tinyavr 1-series, which is a relatively new (2018?). I get the idea that these new micros are the product of the merger of Microchip and Atmel, so they take the good bits from the older chips of each (but aren't compatible with either).<br />
<br />
These are 8-bit MCU with a few kb of ram and a few k of flash (2k and 16k respectively, in this part) which can do quite a lot of work in a small package.<br />
<br />
I like them because<br />
<br />
<ul style="text-align: left;">
<li>Small package which is still hand-solderable (soic 14 pin)</li>
<li>Tolerate a wide range of supply voltage (2.5-6.5 I think)</li>
<li>Small number of passives / extra connections</li>
<li>The internal clock generator seems quite accurate</li>
</ul>
But also<br />
<br />
The data sheet doesn't suck. At least, I can understand it.<br />
Peripherals are fairly sane and consistent<br />
One-pin (UPDI) programming interface<br />
<br />
<h3>
Programming with open source toolchain </h3>
<div style="text-align: left;">
See <a href="https://github.com/vladbelous/tinyAVR_gcc_setup">https://github.com/vladbelous/tinyAVR_gcc_setup</a> - I followed these instructions and they worked.</div>
<h3 style="text-align: left;">
Flashing the firmware</h3>
<div style="text-align: left;">
The firmware programmer is just a serial port, plus one resistor. See <a href="https://github.com/mraardvark/pyupdi/">https://github.com/mraardvark/pyupdi/ </a></div>
<div style="text-align: left;">
<br /></div>
<h3 style="text-align: left;">
Example code</h3>
<div style="text-align: left;">
While it is a relatively new part, there is a bit of sample code "out there".</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<a href="https://github.com/chromia/attiny1614example">https://github.com/chromia/attiny1614example</a> - is a useful source of examples.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Also some of the official samples </div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<a href="https://www.avrfreaks.net/forum/getting-started-attiny-1-0-series-application-notes">https://www.avrfreaks.net/forum/getting-started-attiny-1-0-series-application-notes </a></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
The product page</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<a href="https://www.microchip.com/wwwproducts/en/attiny1614">https://www.microchip.com/wwwproducts/en/attiny1614</a> </div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Has "Documents" which includes some samples and ideas.</div>
<div style="text-align: left;">
<br /></div>
<h3>
</h3>
<h3>
</h3>
<h3>
</h3>
</div>
Mark Robsonhttp://www.blogger.com/profile/15864507044869250062noreply@blogger.com0tag:blogger.com,1999:blog-4622775563416752930.post-91049729293007934652019-01-09T23:19:00.000+00:002019-01-09T23:19:47.180+00:00Right to repair<div dir="ltr" style="text-align: left;" trbidi="on">
SO - if we agree that we have the right to repair things? Does that actually help?<br />
<br />
https://therestartproject.org/restart-project/first-ever-protest/<br />
<br />
"Right to repair" could be enshrined in law (EU or otherwise) but it won't really help, unless we also have the ability to repair.<br />
<br />
Just like Brother/Sister Loretta in Monty Python's Life of Brian, fighting for the right to have babies, but without a womb it's not really useful.<br />
<blockquote class="tr_bq">
<span class="name">REG:</span> What's the point of fighting for his right to have babies
when he can't have babies?! <br />
<span class="name">FRANCIS:</span> It is symbolic of our struggle against oppression.
<br />
<span class="name">REG:</span> Symbolic of his struggle against reality. <br />
</blockquote>
<br />
<u>My experience - Indesit Hob</u><br />
<br />
The Indesit hob was brilliant. It was perhaps, the most amazing thing I've ever repaired. I pulled it to pieces - with standard tools - and the parts were all clear. I easily identified the failed part.<br />
<br />
But the best thing was, Indesit supplied a replacement at a reasonable price and delivered it quickly. It was easy to fit and worked first time. The hob works to this day.<br />
<br />
<u>Unbranded / Screwfix hedge trimmer</u><br />
<br />
The hedge trimmer worked fine until it hit some metal fencing wire, then it stopped. The culprit was found - despite Torx security screws holding the thing closed - to be a smashed metal helical gear. After reading all documentation and talking to Screwfix. it was clear that a replacement was never going to be forthcoming.<br />
<br />
The trimmer got replaced under sale-of-goods "reasonable durability" but it's definitely a lose. I expect they threw the broken one in the bin (along with a bunch of others with the same fault presumably)<br />
<br />
<u>Deraileur gear mech hangers</u><br />
<br />
On bicycles, Deraileur <u> </u>gears are the most popular. Each bike frame which uses them, has a "mech hanger" which is a sacrifical steel part designed to bend or break if the mech ever ends up in the spokes.<br />
<br />
Unfortunately there is no standard for these parts and they come in a dizzying array of shapes and sizes. Manufacturers are not interested in providing spares for discontinued models (even though they might have some stock for current models).<br />
<br />
How do we fix our bikes? Several companies now use modern (CNC) techniques to make any mech hanger - and keep databases of designs. These will be available essentially forever because they are made to order and the designs don't consume physical space.<br />
<br />
<h2 style="text-align: left;">
Conclusion</h2>
<h2 style="text-align: left;">
</h2>
<div style="text-align: left;">
We need companies to provide spares (like Indesit). If they can't economically provide spares, they should provide information which allows other companies to make spares using modern CNC or other techniques (like mech hangers). </div>
<div style="text-align: left;">
The right to repair is great. The right to have babies is great, if you have a womb.</div>
<h2 style="text-align: left;">
<br /></h2>
</div>
Mark Robsonhttp://www.blogger.com/profile/15864507044869250062noreply@blogger.com0tag:blogger.com,1999:blog-4622775563416752930.post-47376795499825919112018-04-24T10:35:00.000+01:002018-04-24T10:35:15.684+01:00Controlling DC motors with the TB6612FNG<div dir="ltr" style="text-align: left;" trbidi="on">
I bought this H-bridge module containing the TB6612FNG chip (<a href="https://www.sparkfun.com/datasheets/Robotics/TB6612FNG.pdf">datasheet</a>)<br />
<br />
It is an interesting chip.<br />
<div style="text-align: left;">
<br /></div>
Points to note:<br />
<br />
<h3 style="text-align: left;">
Tie the standby pin high</h3>
<div style="text-align: left;">
Otherwise you're going nowhere. It was not clear that there is no internal pull-up in the standby pin - it will float low, which turns everything off. </div>
<h3 style="text-align: left;">
PWM is not what it seems</h3>
<div style="text-align: left;">
There are three input signals per channel (x2 channels). These are labelled IN1, IN2 and PWM. All is not as it seems.</div>
<div style="text-align: left;">
I initially assumed that if the PWM pin is low, it would drive the output high-impedence (open-circuit) to allow a motor to run freely. This is not the case.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
The free-running setting is actually PWM=high, IN1, IN2 = low.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
This means, that when we drive it with a pulse-width modulation duty cycle, we don't want to be pulsing the PWM pin (which is counter-inutitve).</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
To drive in either direction, set PWM=high, and one of the inputs high, the other low.</div>
<div style="text-align: left;">
To drive with <100 high="" in1="" in2="" leaving="" low.="" one="" or="" other="" p="" power="" pulse="" the=""><div style="text-align: left;">
To activate the brake, set PWM=low, and the value of the other signals doesn't seem to matter.</div>
<div style="text-align: left;">
To leave it free-running, set PWM=high and the other inputs low.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
We could pulse the PWM signal, but that would be activating the brake during the off duty-cycle. </div>
<h3 style="text-align: left;">
Raspberry Pi - some GPIO outputs are high on boot</h3>
<div style="text-align: left;">
A surprise to me was that on the Pi, some of the GPIO pins (not many) are high on boot. It is a (somewhat) documented behaviour. I didn't know about that, so I've managed to wire up the robot so that one of the motors runs on boot. This is undesirable as it means the robot tries to drive away while we connect the battery.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
(NB: GPIO 7 is high on boot)</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
It's possible, however, to make it go low <a href="https://www.raspberrypi.org/forums/viewtopic.php?f=117&t=208748">very early during the boot process</a>. It seems that this is approximately 1 second after power-on on my Zero W. </div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
It may be that there is a weak pull-up enabled at boot, and I could fix it by installing a resistor to provide a stronger "pull down", and still allow the pin to be high when I want it high.</div>
<div style="text-align: left;">
<br /></div>
</100></div>
</div>
Mark Robsonhttp://www.blogger.com/profile/15864507044869250062noreply@blogger.com0tag:blogger.com,1999:blog-4622775563416752930.post-12981843171182985962018-04-14T00:28:00.000+01:002018-10-16T17:46:26.344+01:00Eroadarlanda / Elways / Electric charging road in Sweden<div dir="ltr" style="text-align: left;" trbidi="on">
<h2 style="text-align: left;">
What is it?</h2>
<div style="text-align: left;">
The world's first electric charging road "opens**" in Sweden. Near Arlanda airport. It can "charge***" "electric" cars while they are driving.</div>
<div style="text-align: left;">
</div>
<div style="text-align: left;">
It is a massive press-release that appears to have hit a lot of mainstream media in the last couple of days (12 April 2018)</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
E.g. <a href="https://www.theguardian.com/environment/2018/apr/12/worlds-first-electrified-road-for-charging-vehicles-opens-in-sweden">The Guardian and a million other press outlets</a></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
"Stretch of road outside Stockholm transfers energy from two tracks of
rail in the road, recharging the batteries of electric cars and trucks" </div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
They certainly seem to have an excellent PR agency.</div>
<div style="text-align: left;">
<br /></div>
<h2 style="text-align: left;">
Can it do what it says?</h2>
<div style="text-align: left;">
Mostly, no.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
They have a truck which apparently can run from this scalextric-type road. <strike>It is not clear whether the truck is electric. </strike>The truck is electric. Most of the video I can find shows a diesel truck with a dummy electrical load. They also have a test-car (which is, I suspect, petrol-powered, at least it sounds like it in the video) which carries a 17kw dummy load powered from the track. It is not clear whether the car is road-legal with the dummy load (I can only find video of the car being used on a test-track)</div>
<h2 style="text-align: left;">
Could it possibly work, ever?</h2>
<div style="text-align: left;">
Maybe, yes. If it can actually deliver 17kw to a moving vehicle, that is approximately enough to run a car at motorway-type speed and charge at a modest rate simultaneously. </div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
They made various claims about its safety and robustness etc, which seem at least vaguely plausible. They obviously did some testing in various conditions. There is video of the truck driving in snow.</div>
<div style="text-align: left;">
<br /></div>
<h2 style="text-align: left;">
So what's the problem?</h2>
<div style="text-align: left;">
No
normal electric car could ever charge from the track while driving. The electrics
system would have to undergo major modifications. That's ignoring
the major software updates.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
That's to say - EVs <b>can</b> recharge while driving - it's called regenerative braking. </div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
The
electric system in an electric car is fairly complex and needs to
handle a lot of power in several directions. Most electric cars can
charge at up to 50kw, and many will discharge even faster in some
conditions. Moreover, they can switch from one to the other in a very
short time while driving.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
EVs
usually have an onboard charger for charging from AC (Level 1 and 2)
sources. This is part of the power electrics which can't operate at the
same time as the drive.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Rapid
charging (Level 3) is done by an external charger, which communicates
with the car in a rather complex way, and provides DC at the correct
voltage / current for the specific charging requirements of the vehicle.
The external charger is a big heavy box which would be prohibitively
heavy to put on a light vehicle. They usually take an industrial 3-phase
supply.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
I don't think it's plausible to use a level 3 charger in the track:</div>
<ul style="text-align: left;">
<li>There aren't enough pins for a level 3 charger, which needs at least an AC supply AND a DC supply.</li>
<li>There would not be time on a 50m section (or even 200m section) of track, for the charger to get the correct voltage, current etc for the specific vehicle</li>
<li>The large number of complex level 3 charger boxes would be prohibitively expensive.</li>
</ul>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
There
is a lot of difference between delivering some power to the vehicle
(which has been demonstrated) and charging an EV traction battery (which
has not).</div>
<div style="text-align: left;">
<br /></div>
<h2 style="text-align: left;">
But those things could be solved?</h2>
<div style="text-align: left;">
Yes, in principle, but no car maker is going to want to do that. Modern vehicles are not designed for a single market, it's not cost-effective. Cars designed now (without elways support) are going to continue to be made for 20 years without a major redesign of their drive train.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
It's not remotely viable to redesign the electrics of an EV for a feature which is available only in one country, as the weight / performance / space penalty would exist in the design everywhere else.</div>
<div style="text-align: left;">
<br /></div>
<h2 style="text-align: left;">
Why else am I sceptical?</h2>
<div style="text-align: left;">
Most of the videos that I've seen seem to be on the test-track (not on the airport highway). I saw <a href="https://eroadarlanda.se/wp-content/uploads/Il%C3%A4ggning-av-kontakt-2017-08-22.mp4">one 12-second clip</a> which appears to show a slightly less hacky pickup (maybe on an electric truck) looking like it might be powering the real truck. But otherwise, all the media seem to be from the test-track, or with dummy loads.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
The Guardian's funky video obviously shows a diesel truck with the test-load running some bright lights - this is presumably on the test-track because it won't be road-legal. </div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
The PR is certainly very strong. There is a lot of marketing wank that makes very big promises, but is very light on details.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
There is basically no detail whatsoever about any of the vehicles that they have to use on this "open" road. I understood from the various press releases that there was one truck which would be regularly using the road, which is a 2km section. Again, it's not clear whether the truck actually takes useful traction power from the road (whether charging or just driving), or just drives a dummy load.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
* I wish they would spend more money on developing the tech instead of making mockup videos and writing PR stuff </div>
<div style="text-align: left;">
</div>
<h2 style="text-align: left;">
Anything positive?</h2>
<div style="text-align: left;">
Yes a few things</div>
<ul style="text-align: left;">
<li>The tech for getting the track and pickup working seems well developed, they've shown it working back in 2013</li>
<li>It has been demonstrated working in bad weather. </li>
<li>If we forget about charging electric cars and just consider an extra power system for (ICE powered) commercial vehicles, it starts looking a lot more sensible.</li>
<li>Heavier, slower vehicles pay a lower weight and aerodynamics penalty for having the tech installed.</li>
<li>Delivering 17kw to an electric motor on an otherwise-diesel truck would save it a great deal of fuel, it would also extend the range of an electric one (but not much if you only have 2km)</li>
</ul>
<br />
** opens to the single vehicle it's designed to work with. But other traffic can still use the road, so I suppose that's open?<br />
*** well, not actually charge. But deliver power to. Perhaps?</div>
Mark Robsonhttp://www.blogger.com/profile/15864507044869250062noreply@blogger.com0tag:blogger.com,1999:blog-4622775563416752930.post-41535404685928781322018-04-08T20:07:00.001+01:002018-04-08T20:07:20.577+01:00Strange RC terminology<div dir="ltr" style="text-align: left;" trbidi="on">
Here are some terms used in RC models<br />
<br />
<h3 style="text-align: left;">
"Electronic speed contoller" aka ESC</h3>
<div style="text-align: left;">
What does it do?</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
It converts RC servo pulses (pulse width only matters, 1500us = centre, approx 1000 = left, 2000 = right) into a speed, often with reverse, so that it can drive between full speed reverse, stopped, full forward. These usually control brushed (DC) motors, but versions for the "brushless" motors are available too (which often only drive in one direction, they are intended for RC aircraft).</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
</div>
<div style="text-align: left;">
Why is it called "electronic" speed controller? Surely that's redundant?</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
No. Originally RC models used either a petrol engine (in which case, the engine is the speed controller, and servo operates its throttle) - or a second battery with a primitive electro-mechanical speed controller - essentially a variable resistor with a servo attached.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
So the "electronic" means that it's fully solid state - no moving parts.</div>
<div style="text-align: left;">
<br /></div>
<h3 style="text-align: left;">
"Battery eliminator circuit" aka BEC</h3>
<div style="text-align: left;">
WTF? It is apparently the RC term for a voltage regulator. Just a voltage regulator.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
So why is it called a BEC?</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Because originally models used two batteries, one for the radio receiver and servos, another for the main drive. The traction battery was much bigger and generally rechargable (NiCd chemistry was common before lithium cells were good). The radio batteries sometimes used primary cells, or a different form of rechargable e.g. AA or standard cells.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
The BEC essentially eliminates the secondary, or RC receiver battery, by regulating the voltage from the traction battery down to a stable voltage for the receiver (the receiver will probably want 5v, but the traction batteries are often 7v or higher)</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
The two-batteries scheme is probably somewhat obsolete, especially on flying models (the BEC is generally a lot lighter than a second battery).</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<br /></div>
</div>
Mark Robsonhttp://www.blogger.com/profile/15864507044869250062noreply@blogger.com0tag:blogger.com,1999:blog-4622775563416752930.post-26672977539217263792018-03-17T21:25:00.001+00:002018-03-17T21:25:24.723+00:00How to make a cheap ripoff PS3 controller work as a Bluetooth joystick under Linux<div dir="ltr" style="text-align: left;" trbidi="on">
The device was sold as a PS3 controller. I don't have a PS3, I wanted it to control a robot (obviously).<br />
<br />
The device in question identifies over USB as "Gasia Co.,Ltd PS(R) Gamepad"<br />
<br />
BUT the software support is terrible. I did some of the following things, and it eventually worked.<br />
<br />
Get qtsixa from here: https://github.com/supertypo/qtsixa.git - there are other branches available , this one has hacks for cheapo devices.<br />
<br />
* Do not bother trying to pair it with sixpair utility - the cheapo PS3 controller rip-off does not remember the paired device.<br />
* Instead, use sixpair to see what device it expects to be paired with, and change the host's bluetooth address accordingly.<br />
<br />
I'm using a Raspberry Pi, so I hacked this file:<br />
<br />
/usr/bin/btuart<br />
<br />
This file is specific to Raspberry Pi and is run on startup. Normally this file uses the Raspberry Pi serial number to generate a bluetooth address somehow.<br />
<br />
So I just hacked it to use the address 00:12:34:56:78:9b instead, which is the one the controller expects. Then reboot. <br />
<br />
THEN - install "sixad" and run "sixad --start" <br />
<br /></div>
Mark Robsonhttp://www.blogger.com/profile/15864507044869250062noreply@blogger.com0tag:blogger.com,1999:blog-4622775563416752930.post-33152429594019257722016-08-22T13:52:00.001+01:002016-08-22T13:52:37.095+01:00Deterministic json output from python<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: left;" trbidi="on">
How do we get deterministic JSON output from Python?<br />
<br />
JSON objects are not inherently ordered, their properties can be written in any order without making any difference to their meaning.<br />
<br />
Unfortunately, people often use text tools to check the output, and sometimes we want to generate deterministic JSON:<br />
<br />
Consider this bash/Python mess:<br />
<br />
<code>for ((i=0; i != 10; i++ )); do python3 -c 'import json; print(json.dumps({"a":420, "b":99, "c":100}))'; done </code><br />
<br />
<code>{"a": 420, "c": 100, "b": 99}<br />{"a": 420, "c": 100, "b": 99}<br />{"c": 100, "a": 420, "b": 99}<br />{"b": 99, "a": 420, "c": 100}<br />{"c": 100, "b": 99, "a": 420}<br />{"c": 100, "b": 99, "a": 420}<br />{"c": 100, "a": 420, "b": 99}<br />{"c": 100, "a": 420, "b": 99}<br />{"b": 99, "c": 100, "a": 420}<br />{"c": 100, "a": 420, "b": 99}</code></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
What's happening here?</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Python's internal dicts' hashing is using some random number <a href="http://bugs.python.org/issue13703">to prevent hash-collision attacks</a>, which means that each time we run the program a different hashing pattern is produced, and the dictionary keys appear in a different order. This is good because the order isn't predictable to an attacker, but it means that an otherwise deterministic program generates different output each time it's run.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Why would this be a problem?</div>
<div style="text-align: left;">
</div>
<ul style="text-align: left;">
<li>You can't compare JSON files using "diff" any more, because these differences always appear </li>
<li>Continuous integration - different output triggers false alerts </li>
<li>Humans may be able to read the json more easily in a specific order. </li>
</ul>
<br /> How do we fix it?<br /> <br /> Use collections.OrderedDict. But be sure that you don't initialise it from a regular dict.<br /> <br /> Correct:<br /> <br /> <span style="font-family: "Courier New",Courier,monospace;">od = collections.OrderedDict([("a",420), ("b", 999), ("c", 888)] )<br /> od = collections.OrderedDict(); od["a"] = 420; od["b"] = 999; od["c"] = 888<br /> </span><br /> <br /> Incorrect (creates a normal dict first):<br /> <br /> <span style="font-family: "Courier New",Courier,monospace;">od = collections.OrderedDict({"a":420, "b": 999, "c": 888})</span><br /><br /><div style="text-align: left;">
<code><code>
</code>
</code>
</div>
</div>
Mark Robsonhttp://www.blogger.com/profile/15864507044869250062noreply@blogger.com0tag:blogger.com,1999:blog-4622775563416752930.post-13306106325677523612016-04-26T11:05:00.002+01:002016-04-26T11:11:20.334+01:00How to use "cron" to run periodic scheduled jobs<div dir="ltr" style="text-align: left;" trbidi="on">
"cron" is the Unix (Linux, etc) scheduler which runs regularly scheduled jobs. This post is not meant to be the "man" page (it has one of those already), but ideas how to use "cron" in a robust way.<br />
<br />
<h2 style="text-align: left;">
Setting up cron jobs</h2>
<div style="text-align: left;">
There are at least *three* ways of configuring cron jobs on a modern Linux system; technically these are extensions, but they're so quasi-standard, they're even (possibly) available on FreeBSD :)</div>
<div style="text-align: left;">
<br /></div>
<ul style="text-align: left;">
<li>Per-user "crontab" file. This can be edited using crontab -e, or replaced by crontab <filename>. If you are installing system-level software, you probably don't want to use this. Each user can have only one crontab file.</filename></li>
<li>System-wide "crontab" file, usually /etc/crontab. This is usually managed by the distribution / package manager, and you probably don't want to change this; there is only one.</li>
<li>Per-package "crontab" files - usually kept in /etc/cron.d. There are multiple files, usually one per package (or per app). This is the best solution if you're distributing software as a package, on multiple machines, and want the installation to be robust and repeatable.</li>
</ul>
<br />
The system-wide crontab files, give the option of running cron jobs as any OS user (who must exist, obviously!)<br />
<br />
More tips on configuration:<br />
<br />
<ul style="text-align: left;">
<li>A few environment variables can be set, typically things like PATH, SHELL and importantly MAILTO</li>
<li>If you don't set MAILTO=, then the stdout and stderr will be sent by email to the user who owns the cron job. This is seldom what they want nowadays.</li>
</ul>
<br />
<h2 style="text-align: left;">
When to schedule jobs</h2>
<div style="text-align: left;">
Don't schedule daily jobs between midnight and 2am. Cron jobs are scheduled in local time. The sysadmin might not have configured the machine for UTC, therefore there is a possibility that some cron jobs are repeated, missed etc, during changes of time zone or daylight saving time.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
In general, I don't like to schedule daily jobs at all, unless they aren't very critical.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
For important stuff, it's probably better to have an hourly job just check the (UTC) hour, so it can avoid time-zone dependency.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
A feature of "cron" which is little-known, but available on most systems, is the "@reboot" jobs, which are run shortly after the system boots. Such jobs are useful to perform cleanup work that otherwise might not get done at all (e.g. a 6am job, when the user seldom has the machine powered on at 6am).</div>
<h2 style="text-align: left;">
Anacron</h2>
<div style="text-align: left;">
Some (i.e. most Linux) systems have a small script called "anacron", which runs jobs hourly, daily, weekly etc, with no particularly fixed schedule (because they run in sequence with other jobs which may take some time). </div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
This could be used as an alternative to "cron", however it's got more limitations and, in particular, runs everything as root.</div>
<div style="text-align: left;">
<br /></div>
<h2 style="text-align: left;">
Multiple instances</h2>
<div style="text-align: left;">
"cron" mostly does not care about multiple instances, and will execute more than one copy of your job. This is almost never desirable, so if there is any probability whatsoever of this happening, you should prevent multiple instances.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
The "flock" shell program might be handy (recipes are in the man page), or creating a file and exclusively locking it (e.g. in Python, C or your favourite language).</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
If you have a slow job (say, a backup, or something which relies on the network), and a second instance starts, there is a good chance that the 2nd instance will slow down the first instance, then a third instance starts, until the whole system comes down with too many instances of a cron job.</div>
<div style="text-align: left;">
<br /></div>
<h2 style="text-align: left;">
Stampeding herds</h2>
<div style="text-align: left;">
If your software will be installed on many machines sharing infrastructure (e.g. a network, a server, a VM host), then it may be useful to try to avoid a stampeding herd.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
"cron" has the unfortunately property that it usually runs jobs at the exact same moment (usually to the same second), if identically configured on several machines. If your cron job depends on something, it can cause problems or failures.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
The obvious solution is "random sleep"; sleeping a random amount of time (usually only seconds/ minutes) before doing any work which may require infrastructure access. In some cases though, a random sleep can increase resource usage, imagine this sequence:</div>
<ul style="text-align: left;">
<li>Start up program</li>
<li>Load loads of huge libraries</li>
<li>connect to database server</li>
<li>random sleep (0... 300 seconds)</li>
<li>perform work which takes, maybe 5 seconds</li>
<li>exit</li>
</ul>
The random sleep is doing more harm than good. Be sure to place "random sleep" before taking too many resources!<br />
<br />
Another option that I've seen occasionally, is to dynamically generate the "crontab" at install-time with a random value for the minute field.<br />
<h2 style="text-align: left;">
Error handling</h2>
<div style="text-align: left;">
One of the nice things about running in a "cron" job is that "log & exit" is often sufficient error handling. This is particularly true if it's an hourly job, where the next hour would be an ideal time to retry whatever failed.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Some types of errors (e.g. network problems) might just go away if we try again 1 hour later. Other types (e.g. out of disc space) might need someone to fix them.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
The stdout / stderr from a cron job is often lost, so it usually important to log to a file or system log. </div>
<div style="text-align: left;">
<br /></div>
<h2 style="text-align: left;">
Alternatives</h2>
<div style="text-align: left;">
Maybe you don't need "cron" at all?</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Historically, many popular web applications have just done periodic clean-up work in response to a user request. Sometimes random requests are chosen, or on particular user activity.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Some third party services exist, to simply "hit" a PHP script (such apps are usually written in PHP, which I'm not necessarily advocating) on a regular basis.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<br />
Writing a permanently-running "daemon" process has some advantages over "cron", although it does incur more initial work, more "boiler plate" code. If work is required very frequently (say, several times per hour) it might be more convenient or have better performance to run it in a daemon.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<br /></div>
</div>
Mark Robsonhttp://www.blogger.com/profile/15864507044869250062noreply@blogger.com0tag:blogger.com,1999:blog-4622775563416752930.post-70388791370653333832016-04-15T11:16:00.001+01:002016-04-15T11:16:30.286+01:00How to correctly make "latest" symlinks<div dir="ltr" style="text-align: left;" trbidi="on">
<h2 style="text-align: left;">
"Latest symlink"</h2>
<h2 style="text-align: left;">
</h2>
<div style="text-align: left;">
A "latest" symlink, is a symbolic link (on Linux, Unix etc) which links to the "latest" version of a file.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Suppose we have a file which takes some effort to create, which is generated periodically or in response to some stimulus (e.g. user activity). Then we want to create a "latest version" symlink.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Ideally the properties should be</div>
<ul style="text-align: left;">
<li>latest symlink always points at the latest version (duuh!)</li>
<li>latest symlink always exists</li>
<li>latest symlink never points at a partially completed, broken, missing or otherwise bad file</li>
</ul>
Sometimes people do this in a way which won't work.<br />
<h4 style="text-align: left;">
How to create a symlink</h4>
<div style="text-align: left;">
Dead easy, right? Just call the "symlink" function. </div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<code>
int symlink(const char *oldpath, const char *newpath);</code><br />
<code><br />
DESCRIPTION<br />
symlink() creates a symbolic link named newpath which contains the<br />
string oldpath.<br />
<br />
</code>
<br />
<div style="text-align: left;">
But if we call "symlink" and the newpath param points to an already existing file (including a symlink) then it will return EEXIST.<br />
<br />
<h3 style="text-align: left;">
The wrong (obvious) way</h3>
<div style="text-align: left;">
<code>try:</code><br />
<code> unlink(dest)</code><br />
<code>except OSError:</code><br />
<code> pass</code><br />
<code>symlink(src, dest)</code></div>
<h3 style="text-align: left;">
The correct (not so obvious) way</h3>
<code>
templink = dest + '.temp'</code><br />
<code>symlink(src, templink)</code><br />
<code>rename(templink, dest) </code><br />
<h2 style="text-align: left;">
Why?</h2>
<div style="text-align: left;">
Because we want to avoid a race condition where the destination symbolic link does not exist. Renaming files is atomic and will instantly replace the existing link with a new one; no other program can possibly see a non-existing file.</div>
<h2 style="text-align: left;">
Other wrong ways</h2>
<div style="text-align: left;">
Some possibly common, but wrong (or even wronger) ways to do this </div>
<ul style="text-align: left;">
<li>Just create the "latest" file using our "do lots of work" process directly. This is really bad, as during file creation, another process can see a partially completed file. If your code looks like this: write file header; do lots of work to create file body; write file footer, then there is a really good chance that another process sees an incomplete file.</li>
<li>Create a different file, then copy the file (file copying isn't atomic) </li>
</ul>
<h2 style="text-align: left;">
</h2>
</div>
</div>
</div>
Mark Robsonhttp://www.blogger.com/profile/15864507044869250062noreply@blogger.com0tag:blogger.com,1999:blog-4622775563416752930.post-45032423579536468202015-09-15T10:20:00.000+01:002015-09-15T10:20:49.320+01:00Headless web browsers: PhantomJS and SlimerJS<div dir="ltr" style="text-align: left;" trbidi="on">
<h2 style="text-align: left;">
What is headless web browsing?</h2>
<h2 style="text-align: left;">
<br /></h2>
<div style="text-align: left;">
It's using a web-browser like application to do automated fetching and analysis of web pages, without a human user present.This is different from simply fetching HTML content via HTTP; headless web browsers typically also load images, process Javascript code, CSS and layout the page content (albeit in an invisible way). </div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
The developer can then use scripting (usually Javascript) to examine the page as it is laid out in memory, as if in a "real" web browser, to look at the style of text, etc.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
We could even use OCR to look for text within images shown in the page. </div>
<h2 style="text-align: left;">
Why?</h2>
<ul style="text-align: left;">
<li>More effectively analyse the content of pages. Lots of pages nowadays contain a huge amount of "boiler plate" uninteresting text, often in HTML elements without semantic meaning (e.g. DIV). Only by using CSS (and sometimes Javascript) are we able to have a computer see the page as a human would</li>
<li>Generation of screenshots</li>
<li>Getting metadata which are dynamically written by scripts, etc, such as Javascript-created links.</li>
<li>Automated testing of web applications </li>
</ul>
<h2 style="text-align: left;">
What tools are available?</h2>
<div style="text-align: left;">
Several. Traditionally some users have hacked their own solutions using either a web browser extension, or embedding a web browser in a C++ program (often Webkit).</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Here I'm looking at <a href="http://phantomjs.org/">PhantomJS </a>and <a href="http://slimerjs.org/">SlimerJS.</a></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
PhantomJS and SlimerJS essentially perform the same task - to run developer-specified Javascript code in the context of an automated web browser, without using a real web browser.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
PhantomJS is based on Webkit; SlimerJS is based on Mozilla / Firefox.</div>
<div style="text-align: left;">
<br /></div>
<h2 style="text-align: left;">
PhantomJS</h2>
<div style="text-align: left;">
Two versions of PhantomJS are available - the 1.9 series and the 2.0 series. The main difference is that the 2.0 series uses a more recent version of Webkit.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Unfortunately, last time I tested them, neither is very good for browsing lots of real web pages "in the wild". NB: This may be fixed when you read this, test it yourself!</div>
<div style="text-align: left;">
<br /></div>
<ul style="text-align: left;">
<li>Lots of memory usage</li>
<li>Slow</li>
<li>Prone to crashing; diagnosing crashes is very difficult</li>
<li>v1.9 has an out-of-date Webkit which has less feature support</li>
<li>v2.0 seems to leak memory very badly.</li>
</ul>
<br />
So probably PhantomJS is ok for some automated testing scenarios, particularly if you have a "single page application", or only a small number of pages tested.<br />
<br />
But accessing large numbers of "real" web pages quickly breaks it, and it's not easy to fix.<br />
<br />
Essentially the problem is that Webkit is now an abandoned fork (Apple and Google have both forked off from it) and bugs don't get fixed upstream. PhantomJS does not usually apply bugfixes to Webkit itself.<br />
<br />
PhantomJS is a C++ executable that includes most of Webkit inside its binary. This is OK, as it's almost completely standalone, but it means that compiling it is VERY time consuming, particularly on limited resources. For example, on a Raspberry Pi I was able to run PhantomJS, but building it will take days (a more powerful system is really required). On a modern x86 system compiling is much quicker, but can still take 1 hour; the link step uses several Gb of memory (not really a problem on a server, but careful if building in a memory-limited VM).<br />
<br />
Linux binaries are also available from the web site, which is handy :)<br />
<br />
<h2 style="text-align: left;">
SlimerJS</h2>
<div style="text-align: left;">
SlimerJS is a completely different beast from PhantomJS. It is not a C++ binary and doesn't attempt to embed the engine directly in its own application. Instead, it uses an obscure feature of Firefox to run an alternative "user interface application" which provides an environment which is almost identical to PhantomJS.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
This has benefits and drawbacks</div>
<div style="text-align: left;">
<br /></div>
<ul style="text-align: left;">
<li>It is not completely headless. It doesn't require user input, but it won't work without an X server on Linux (this is easily fixed using Xvfb). Under Windows, visible windows may be shown unless running an an alternate desktop, or as a service.</li>
<li>The web browser used is really identical to the Firefox version you're using - all the same features are available.</li>
<li>If you update Firefox, SlimerJS updates too (pro: good for security; con: it might break)</li>
</ul>
<br />
SlimerJS is under moderately active development, but has a much smaller user community than PhantomJS.<br />
<br />
<ul style="text-align: left;">
<li>Performance of SlimerJS (using Firefox 40) seems MUCH BETTER than PhantomJS in general</li>
<li>Stability seems much better too (although I have had a few crashes)</li>
<li>The same APIs are supported, but doucmentation is mostly worse (example: the filesystem objects are barely documented)</li>
</ul>
<br />
<h2 style="text-align: left;">
Wrap up</h2>
<div style="text-align: left;">
So there you are - headless web browsing IS a niche application, but it is very useful in its place. I like SlimerJS because its overall design approach seems to work better in the general case.</div>
<br />
It would be interesting to have a SlimerJS / PhantomJS type application which uses GoogleChrome as its web browser. I imagine one may appear, if it does not already exist.<br />
</div>
Mark Robsonhttp://www.blogger.com/profile/15864507044869250062noreply@blogger.com3tag:blogger.com,1999:blog-4622775563416752930.post-46292585898595992022014-07-08T11:36:00.000+01:002014-07-08T11:37:05.132+01:00Why I use Python<div dir="ltr" style="text-align: left;" trbidi="on">
There are a lot of holy wars between programming language advocates in the industry.<br />
<br />
I use Python.<br />
<br />
Why?<br />
<br />
Because I have found that programs written in Python are significantly more likely to Work Correctly. They more often run correctly the first time, therefore I spend less time debugging.<br />
<br />
There are lots of other reasons, but it's mainly the "It just works".<br />
<br />
A few years ago, I had 10+ years of industry experience of Perl, but only 1 year of Python. I already found that my Python programs initially worked correctly FAR MORE OFTEN.<br />
<br />
This is comparing a language that I'd been using commercially, most days, for 10 years, with something that I'd only just picked up.<br />
<br />
That's why I use Python.<br />
<br />
---<br />
Other stuff?<br />
<br />
DEBUGGING: Stack traces. In Perl, it's possible to get a stack trace from an exception, but you sometimes have to jump through hoops to do it. Likewise, in PHP, stacktraces are available in principle, but don't always appear when you need them. Java? Stack traces usually appear, but are often huge and difficult to read (even better: in some versions of Java, the compiler "optimises" out line numbers from stack traces) In Python, stack traces Just Work. Like everything else.<br />
</div>
Mark Robsonhttp://www.blogger.com/profile/15864507044869250062noreply@blogger.com2tag:blogger.com,1999:blog-4622775563416752930.post-47948958494431203652014-01-03T10:45:00.000+00:002014-01-03T10:45:06.335+00:00The most common cause of unavailability<div dir="ltr" style="text-align: left;" trbidi="on">
Hi, Happy new year.<br />
<br />
I've done a lot of work on high-availability systems. There is a lot of writing on high-availability systems - how to implement failover, hot-spare systems, load-balancers etc.<br />
<br />
However, most of these seem to make an assumption: humans are infallible.<br />
<br />
In practice, this is not always the case.<br />
<br />
In fact, I'd say that probably about 75% of downtime is caused by human errors, cock-ups, mistakes. I'm not an expert, but I suspect that it's about the same proportion as air crashes caused by pilot (or someone else's) error.<br />
<br />
So, it's the human, stupid. PBKAC (problem between keyboard and chair).<br />
<br />
Here are some possible fixes:<br />
<br />
<h2 style="text-align: left;">
Give human less work to do</h2>
<div style="text-align: left;">
We can avoid SOME human errors by having systems automatically configure themselves, setup, or perform sanity checks before accepting settings. </div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
"Blindly accepting" instructions given by an idiot human, is what computers are generally very good at, and often results in chaos.</div>
<ul style="text-align: left;">
<li>Automatic configuration is less likely to make a mistake (when was the last time you saw a DHCP server give out a duplicate IP address? Never?)</li>
<li>Testing a configuration provided by a human, BEFORE applying it, might prevent a mistake.</li>
</ul>
HOWEVER<br />
<ul style="text-align: left;">
<li>Automatic configuration is a "clever" piece of software which can be difficult to test. Sometimes autoconfiguration tests are mind-blowingly difficult to set up. This means it's not likely to be very well tested.</li>
<li>If autoconfig gets it wrong, it's likely to do it on a large scale. </li>
<li>Automatic configuration probably means that the humans have no idea how it works, which may be bad.</li>
<li>Autoconfig might not correctly handle "very unusual" circumstances.</li>
</ul>
<h2 style="text-align: left;">
Give human more work to do</h2>
<div style="text-align: left;">
Perversely, we could give the humans more work. Something that someone does every day, they're unlikely to get wrong. The procedures which are done infrequently are more likely to be a problem.</div>
<div style="text-align: left;">
<br /></div>
<ul style="text-align: left;">
<li>Less code to test. Manual configuration.</li>
<li>Humans (ops engineer, support engineer) become used to getting manual configuration correct</li>
<li>Humans might be able to set up unusual configurations required for unusual circumstances. (Corollary: such unusual configurations probably won't have been tested!)</li>
</ul>
<h2 style="text-align: left;">
My view</h2>
<div style="text-align: left;">
This is a completely opinionated rant...</div>
<div style="text-align: left;">
<br /></div>
<ul style="text-align: left;">
<li>Humans cannot be trusted to do anything</li>
<li>Make everything either automatic, or hard-coded</li>
<li>Give users as few options as possible. Perhaps let them make some cosmetic changes (colours, window layout?). Don't let them change the TCP port number your application uses.</li>
<li>There is usually far less value in allowing a parameter to be changed than forcing it to a reasonable hard-coded value.</li>
<li>Sales engineers want to see screens full of knobs and dials? Give them placebo ones which do little or nothing (i.e. don't break it).</li>
<li>If you put a big red button in the reactor control room, marked "Do not press.", someone will press it sooner or later.</li>
</ul>
On testing...<br />
<br />
<ul style="text-align: left;">
<li>If your program fails to correctly find the server when running on Chinese-language Windows Vista connected to two VPNs at once, it's probably not really important.</li>
<li>If your software can't find the server for anyone who typoes the address, it's more important.</li>
</ul>
Of course users sometimes want to configure "policy". This is understandable, but try not to enable them to create stupid policies (or at least, make sure it's strongly discouraged!). A policy of "delete all emails instantly and irretrievably" sounds more like a bug to me.<br />
</div>
Mark Robsonhttp://www.blogger.com/profile/15864507044869250062noreply@blogger.com0tag:blogger.com,1999:blog-4622775563416752930.post-76748056751639386352013-10-17T21:14:00.000+01:002013-10-17T21:14:26.455+01:00On web crawling robots<div dir="ltr" style="text-align: left;" trbidi="on">
Here are some observations from writing web-crawling robots.<br />
<br />
<h2 style="text-align: left;">
Intro</h2>
<br />
<br />
At some point, many of us (in the IT security industry) will need to write a robot which scrapes lots of web sites. By "lots", I mean a very large number, run by arbitrary parties. Not just a few run by well-behaved, cooperative entities.<br />
<br />
Most owners of web servers try to make them compatible - but this is not guaranteed. Even with the best of intentions, we'll probably find things which go wrong. <br />
<br />
<h2 style="text-align: left;">
Behaviour observed</h2>
<br />
Faulty DNS<br />
* Returns too large responses<br />
* Returns private addresses in "A" responses<br />
<br />
Server hangs / timeout<br />
* Connection timeout<br />
* Timeout waiting for response<br />
* Connection hang during headers or response <br />
<br />
Bad responses<br />
* Connection closed after request<br />
* Connection closed while transmitting headers<br />
* Connection closed while transmitting bodies <br />
<br />
HTTP<br />
* Garbled response<br />
* Bad status code<br />
* too many headers<br />
* single very long header<br />
<br />
HTTP Redirects<br />
* Redirect to relative URI<br />
* Redirect loop<br />
* Redirect to private sites, e.g. not-qualified names, private IPs <br />
* 301 / 302 status, no Location: header <br />
<br />
Content<br />
* high-bit set in HTTP headers - but not valid utf8<br />
* No declared encoding, but not ascii or latin1<br />
* Wrong declared encoding<br />
* Unknown declared encoding (e.g. sjis variations)<br />
* Inconsistent encoding in Content-type header, HTML * bad byte sequence for declared or detected encoding<br />
* Non-html content served with html content-type (e.g. image, pdf)<br />
<br />
SSL<br />
* Bad certificates. If we don't care, it might be better not to attempt to verify certificates.<br />
* Things which break our SSL library<br />
<br />
<br />
Misc<br />
* 200 status even for pages which do not exist<br />
* 301 / 302 status for pages which do not exist (expecting 404)<br />
* robots.txt served as html<br />
* Unexpectedly large content<br />
<br />
Framers, ad-injectors<br />
* Frame somebody else's content<br />
* Use javascript to display someone else's content with other (advert) elements layered or obstructing<br />
<br />
Spam<br />
* Some web sites exist to spam search engines<br />
* These often contain large numbers of host names, linking to each other - "Link farms"<br />
* Spam will cause us to waste resource and "dilute" good content (for statistical analysis, etc) <br />
<br />
<h2 style="text-align: left;">
Advice</h2>
<h3 style="text-align: left;">
Robustness</h3>
<div style="text-align: left;">
If the process crashes, we have a problem. A web crawler needs to be able to recover from unexpected errors.</div>
<ul style="text-align: left;">
<li><div style="text-align: left;">
Set timeouts to reasonable value. Defaults are typically too high</div>
<ul>
<li>Check that timeouts work at any stage</li>
</ul>
</li>
<li><div style="text-align: left;">
Expect large responses; limit size if possible.</div>
<div style="text-align: left;">
Don't assume that anything is valid utf-8 bytes (even if it's required to be by some spec)</div>
<div style="text-align: left;">
Take metadata with a pinch of salt e.g. Content-length does not imply anything about the size of content!</div>
<div style="text-align: left;">
Be aware of race conditions. If you look again, something might disappear, appear or change. (example: do a HEAD request, see Content-type, you do a GET request, it has changed)</div>
<div style="text-align: left;">
<br /></div>
</li>
</ul>
<h3 style="text-align: left;">
Making sense</h3>
<div style="text-align: left;">
We all hope that everything makes sense. However, it's not that simple. What encoding should we interpret things as? What content-type is really present?</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Some sites serve data with incorrect metadata, but missing metadata is far more common.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
A large proportion of Russian web sites are encoded in Windows-1251 without any metadata. A significant proportion of Japanese sites use Shift_JIS (or its many variants) without metadata.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Sometimes we just have to try to guess. There are definitely cases where we're going to see garbage and need to be able to identify it so we can ignore it.</div>
<div style="text-align: left;">
<br /></div>
<h3 style="text-align: left;">
Performance</h3>
<div style="text-align: left;">
If we've got a lot of work to do, we want to get through it as quickly as possible. Or at least fast enough.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Ideas:</div>
<div style="text-align: left;">
<br /></div>
<ul style="text-align: left;">
<li>Parallel fetching. Any serious robot is going to need to do lots of this. so consider multiprocessing, or asynchronous frameworks. For large scale it might need to be split amongst several hosts</li>
<li>HTTP HEAD method. If we only want the headers, use HEAD. This can save a lot of bandwidth, all servers support it. </li>
<li>HTTP/1.1 Range requests. We can ask for, say, the first 10k of a page using a "Range" request. Not all servers support it, but we can fail gracefully</li>
<li>gzip content - if your client supports it and there are no interoperability problems.</li>
</ul>
<br />
Bad ideas:<br />
<ul style="text-align: left;">
<li>Keep-alive or pipelining. Can cause interoperability problems, usually unnecessary. These are latency optimisations for web-browsers. (Possibly desirable when getting lots of pages from the same site on SSL)</li>
<li>Caching, proxies. It would be better for the application to behave intelligently and avoid requesting the same data more than once. </li>
</ul>
Do remember to be polite - don't hammer the same site repeatedly. If you have lots of pages to get from the same site, interleave the requests with requests to different sites.<br />
<br />
Depending on your use-case, it might be a good idea to "back off" a site which returns errors (particularly 5xx or network-layer) and try again later.<br />
<br />
<h3 style="text-align: left;">
Decoupling </h3>
<div style="text-align: left;">
It's probably a good idea, to maximise throughput, to decouple different stages with queues of work between them. It might also make our code cleaner, easier to test and possibly more robust (we can possibly retry any stage which fails). For example, decouple</div>
<div style="text-align: left;">
* Fetching robots.txt (if you use it)</div>
<div style="text-align: left;">
* Fetching other entities</div>
<div style="text-align: left;">
* Parsing and processing</div>
<div style="text-align: left;">
* Scheduling / prioritisation</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
It might also be worthwhile to decouple DNS requests from actual fetching.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
One of the reasons to decouple is that parsing takes lots of memory, but fetching requires a lot of waiting for the network. We don't want to wait for the network a lot while simultaneously using a lot of memory. Doing fetching and parsing in different processes means we can let the parser make a mess of our heaps (i.e. heap fragmentation, possibly leaks) and occasionally call _exit to clean it all up without impacting the fetch latency.</div>
<h3 style="text-align: left;">
Last resorts - nuclear options</h3>
<h4 style="text-align: left;">
Ask a human </h4>
<div style="text-align: left;">
We could add "alarm" conditions, to have the crawler ask a human when it encounters something unexpected. This may be useful, for example, to try to decipher a page in the wrong encoding.</div>
<h4 style="text-align: left;">
Blacklisting</h4>
<div style="text-align: left;">
If we persistently see bad sites which are spam, causing robustness problems or just plain nonsense, we can blacklist them.</div>
<ul style="text-align: left;">
<li>Blacklisting host names (or domain names) is ok</li>
<li>Blacklisting IPv4 addresses is better (the supply is much more limited!)</li>
</ul>
Ideally we don't even connect to a blacklisted site. Failing that, we could connect then drop the connection<br />
<br />
If carrying out a very large-scale activity, automating blacklisting is desirable.<br />
<br />
<br /></div>
Mark Robsonhttp://www.blogger.com/profile/15864507044869250062noreply@blogger.com2tag:blogger.com,1999:blog-4622775563416752930.post-32361512524805298522012-04-22T15:45:00.000+01:002012-04-22T15:46:21.274+01:00Move the viewport, not the world!<div dir="ltr" style="text-align: left;" trbidi="on">
Two separate posts on gamedev.stackexchange.com drew my attention. It appears that some game programmers are getting it WRONG.<br />
<br />
Superficially, it seems that in some games (think of scrolling games with enemies appearing of the edge of the screen), the enemies are all approaching at a constant rate. <br />
<br />
But what REALLY happens, is that the viewport scrolls at a fixed rate, and each enemy starts at a fixed world-space position, and activates when the viewport reaches a particular place. <br />
<br />
This is not a very important distinction for the player, but its a HUGE distinction for the programmer.<br />
<br />
If the developer thinks it's good to have 1 million enemies, all of which are created at the beginning of the game, and then move each one of them, every single tick, to a slightly different position as the camera moves, then they are probably doing it wrong:<br />
<div style="text-align: left;">
<br /></div>
<div id="question-header">
<div itemprop="name" style="text-align: left;">
<a class="question-hyperlink" href="http://gamedev.stackexchange.com/questions/18550/how-to-increase-update-speed-of-game">How to increase update speed of game?</a></div>
<div itemprop="name" style="text-align: left;">
<br /></div>
<div id="question-header">
<div itemprop="name" style="text-align: left;">
<a class="question-hyperlink" href="http://gamedev.stackexchange.com/questions/27769/optimizing-updating-thousands-of-enemies-or-break-up-the-enemies-that-need-upd">Optimizing updating thousands of enemies? (Or break up the enemies that need updated?)</a></div>
<div itemprop="name" style="text-align: left;">
<br /></div>
<div itemprop="name" style="text-align: left;">
So games developers - remember - move the viewport, not the world! </div>
<div itemprop="name" style="text-align: left;">
<br /></div>
<div itemprop="name" style="text-align: left;">
Kevin Reid's answer to the "thousands of enemies" says it nicely "Don't move the enemies! move the camera"!</div>
</div>
</div>
</div>Mark Robsonhttp://www.blogger.com/profile/15864507044869250062noreply@blogger.com0tag:blogger.com,1999:blog-4622775563416752930.post-77106490455771357472011-05-23T20:19:00.004+01:002011-05-23T20:38:14.800+01:00Expecting the unexpectedFew developers consider, when trying to build robust platforms, all the possible modes of failure. Indeed, it is difficult to consider them all, let alone plan for them, or design tests which exercise particular symptoms.<br /><br />In this post, I discuss some of the types of failure we can see in real systems.<br /><br /><h2>Complete server failure</h2><br /><br />Most developers DO consider this. In a "Complete server failure", what generally happens is:<br /><br />* The server stops processing new requests, completely.<br />* The server's OS no longer responds to any network request at all (e.g. "ping")<br />* Processing does not continue within the server<br />* The contents of memory are immediately and irretrievably lost.<br /><br />Typically, the server recovers, and when it does so, it is rebooted and restored to full health. All writes which were acknowledged before its failure have been persisted.<br /><br />This is very easy to simulate (just hit the "power off" button in your VM hypervisor) and fairly easy to plan for; most robust systems consider this kind of scenario.<br /><br /><h2>Network failure</h2><br /><br />There are many different kinds of network failure, but consider the simplest, most severe network failure:<br /><br />* One or more machines in the infrastructure lose network connectivity<br />* None of them can talk to anything at all, including each other<br />* Local processing on these servers continues as normal<br />* No machines need to be rebooted to fix the fault, when it is repaired everything is back to normal.<br /><br />This is a symptom of, perhaps a switch failure, where a "complete" failure occurs.<br /><br />I won't discuss network failures at all, but there are many different kinds. My experience suggests that the most common is partial or complete loss of internet connectivity from one location (datacentre).<br /><br /><h2>IO subsystem failures</h2><br />* One or more discs / volumes suddenly become unavailable<br />* The OS does not reboot; processes do not stop<br /><br />These are the kinds of failures which developers typically don't consider and are a lot more difficult to simulate. What might happen is, the power fails for a disc enclosure unit, but not its host server, in this case the OS and its boot discs remain available, but data discs are not. In these cases, failover might not be triggered or might behave incorrectly.<br /><br /><h2>Heavy load or unexpected poor performance</h2><br /><br />* A single server unexpectedly starts performing very badly<br />* In the extreme, this means without sufficient capacity to do useful work<br />* But it's not failed; no subsystem is individually totally unavailable<br />* Sometimes the effect is severe enough to prevent operations engineers logging in to diagnose / fix the fault<br /><br />These kinds of faults usually cause a larger problem, because failover systems aren't triggered, or cannot take over in a timely fashion. Common causes can be<br /><br />* Rogue process consuming lots of resources<br />* Denial-of-service attack<br />* Bad application design causing legitimate requests to suddenly spike in resource usage.<br />* Operational error (well, anything can be caused by operational error :) )<br /><br /><h2>"Zombie" systems or, back from the dead</h2><br /><br />* A system fails in a catastrophic way and can't be remotely recovered<br />* Operations engineers assume that it's going to be completely dead until physically replaced (They are some distance away and don't raise a "remote hands" request, or are unable to recover it by doing so)<br />* Another system is provisioned in its place, and takes over its IP address, role etc<br />* Then one day... the "Zombie" system unexpectedly comes back from the dead to haunt its successsor ... Brraaainss.... <br /><br />Of course this could be months later, after many software updates (possibly security updates). The "zombie" system is running an old build and will not carry out correct processing if it is given work to do.<br /><br /><h2>Conclusion</h2><br /><br />These are just a few of the annoying types of failures which happen to real systems in production. Expect the unexpected (as if that's not a contradiction!).<br /><br />Happy hacking!Mark Robsonhttp://www.blogger.com/profile/15864507044869250062noreply@blogger.com0