Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

How To Build A Better Arduino


Published on

Published in: Self Improvement
  • Be the first to comment

How To Build A Better Arduino

  1. 1. How to Build a Better Arduino – the Development of MHVlib<br />Alastair D’Silva<br />@EvilDeece<br /><br /><br />
  2. 2. What is an Arduino<br />A hardware and software platform for prototyping electronics<br />Low entry barrier allows programmers to interact with the real world<br />Built on top of Wiring<br />
  3. 3. Love Arduino<br />Cheap hardware<br />Simple to understand<br />Serial bootloader makes programming easy<br />
  4. 4. Hate Arduino<br />Slow<br />Memory inefficient<br />Caused by:<br />Excessing handholding<br />Backwards compatibility<br />
  5. 5. Fix Arduino<br />Keep the good parts<br />Hardware<br />Bootloader<br />Ditch the bad parts<br />Runtime libraries<br />
  6. 6. Design Philosophy<br />Portable (support all ATMEGA & ATTINY)<br />Lean<br />Memory efficient<br />Use interrupts if possible<br />No deprecated calls<br />No warnings<br />
  7. 7. HardwareSerial<br />Arduino<br />Uses fixed length, preallocated 128 byte RX buffers<br />Preinstanties 1 object for each serial port<br />Reinvents the wheel regarding string formatting<br />Interrupt driven RX, busy TX<br />MHVlib<br />User allocates buffers and passes them in<br />User instantiates only what is needed<br />Provides interrupt driven & busy variants of RX/TX<br />Provides PROGMEM TX support<br />
  8. 8. Digital IO<br />Arduino<br />Lots of handholding<br />Uses extensive tables in PROGMEM to look up pin ports & bits<br />~55 clocks<br />MHVlib<br />No handholding<br />Uses macros<br />Single instruction, 2 clocks<br />
  9. 9. MHVlib Digital IO<br />io.h:<br /> //Dir,Output,Input,Bit<br />#define MHV_PIN_B0 &DDRB,&PORTB, &PINB,0<br />#define mhv_pinOn(mhvParms) <br />do { <br /> _mhv_pinOn(mhvParms) <br />} while(0)<br />#define _mhv_pinOn(mhvDir,mhvOutput,mhvInput,mhvBit) <br />*mhvOutput |= _BV(mhvBit);<br />
  10. 10. Digital IO Usage<br />Arduino<br />pinMode(13, OUTPUT);<br />digitalWrite(13, 1);<br />MHVlib<br />mhv_setOutput(MHV_ARDUINO_PIN_13);<br />mhv_pinOn(MHV_ARDUINO_PIN_13);<br />
  11. 11. Servo Library<br />Arduino Servo<br />Consumes 1 16 bit timer per 12 servos<br />~10 bits of significance<br />Resolution of 16 clock cycles<br />ArduinoSoftwareServo<br />Uses a 16 bit int, valid values are 0 to 180<br />Refresh must be called periodically<br />Sorts the list of servo positions on each pass<br />Lots of busy waiting<br />MHVlib<br />Uses a uint16_t, 0-65535 (~14 bits significant)<br />Consumes 1 16 bit timer<br />Resolution of 2 clock cycles<br />No restrictions as to how many servos<br />Only sorts when positions change<br />
  12. 12. References<br /><br /><br />
  13. 13. First (Real) Project<br />Spindle controller for a CNC Mill<br />Generates a servo signal to a BLDC controller to drive an RC helicopter motor (up to 1.8kW)<br />Read from the serial port and set the speed<br />Monitor the spindle and adjust the speed<br />Report actual speed back to the PC<br />Arduino version<br />11,900 bytes of flash<br />500 bytes of RAM<br />MHVlib version<br />6930 bytes of flash<br />177 bytes of RAM<br />