Presented at CodeMash 2014
Buildingyour ownLightsaber
View Slide
me me mePete HodgsonConsultant at ThoughtWorks@ph1blog.thepete.net
TSAPro-Tip™
Green Fieldhttp://www.flickr.com/photos/jillclardy/3213748255
ContinuousIntegration
Feedback
http://www.flickr.com/photos/johnmueller/52621490/what if you have no build box?
Raspberry Pi
RaspberryPi
visual indicatorakabuild light
Build Light
Pretendingto work
raspberry pi&build light
done.
done.?
build lightbuild my ownlightsaber
LearningbyDoing
Learning Doing
Learning DoingLearningBy Doing
Choose a“right-sized“problem
LEDslow voltage (can be powered via USB)brightflexible (blinky! colors!)
allthe colors
TheDrefusModel
Beginner Expert
Beginnerdetailedstep-by-stepinstructionsno widercontext
Beginnerdetailedstep-by-stepinstructionsno widercontextExpertwidercontext(goal)no details(yet)
Know where youare on theDrefus scale
multi-color LEDs Search
multi-color LEDs Searchan LED can only be one color…but LEDs can come in many colors…solution: combine different colored LEDs
RGB color mixing
vary LED brightness Search
vary LED brightnessPulseWidthModulationPWMSearch
Incandescent BulbVoltageBrightness
LEDVoltageBrightness
voltage100%0%timebrightness: 100%
voltage100%0%time
50% on50% offduty cyclevoltage100%0%time
50% on50% offduty cyclebrightness: 50%voltage100%0%time
25%on75%offvoltage100%0%time
brightness: 25%25%on75%offvoltage100%0%time
Don'ttrust yourintuition'
Red LED+ Green LED+ Blue LED+ PWM= all the colors!
RaspberryPIredLEDgreenLEDblueLEDPWM
GPIOPins
Raspberry Pi has twoGPIO pins which capableof PWM output.Our light needs three.
Arduino
Arduino is an Open-Source electronicsprototyping platform based on flexible,easy-to-use hardware and software.- arduino.cc
RaspberryPIredLEDgreenLEDblueLEDPWMArduino???
Feature-creepas alearning tool
baby steps,towards aneventual goal.
sketch 1blinking an LED(Hello World of hardware)
IOpingroundpin
pin “high”(+ve voltage)
pin “low”(0 voltage)
int LED_PIN = 6;!!void setup() { !pinMode(LED_PIN, OUTPUT); !}!!void loop() {!digitalWrite(LED_PIN, HIGH);!delay(1000); !digitalWrite(LED_PIN, LOW);!delay(1000); !}!
sketch 2fading an LED (PWM)
int LED_PIN = 6;!int MAX_BRIGHTNESS = 255;!int brightness = 0;!!void setup() { !pinMode(LED_PIN, OUTPUT); !}!!void loop() {!analogWrite(LED_PIN, brightness);!!brightness = brightness + 5;!if( brightness > MAX_BRIGHTNESS )!brightness = 0;!!delay(30);!}!
int LED_PIN = 6;!int MAX_BRIGHTNESS = 255;!int brightness = 0;!!void setup() { !pinMode(LED_PIN, OUTPUT); !}!!void loop() {!analogWrite(LED_PIN, brightness);!!brightness = brightness + 5;!if( brightness > MAX_BRIGHTNESS )!brightness = 0;!!delay(30);!}!PWM
sketch 3mixing colors
int RED_PIN = 3;!int GREEN_PIN = 5;!int BLUE_PIN = 6;!int MAX_BRIGHTNESS = 255;!!void setup() { !pinMode(RED_PIN, OUTPUT );!pinMode(GREEN_PIN, OUTPUT );!pinMode(BLUE_PIN, OUTPUT );!}!!void loop() {!byte color[3];!assignRandomColorTo(color);!displayColor(color);!delay(1000); !}!!void assignRandomColorTo(byte colorComponents[]){!colorComponents[0] = random(MAX_BRIGHTNESS);!
!void loop() {!byte color[3];!assignRandomColorTo(color);!displayColor(color);!delay(1000); !}!!void assignRandomColorTo(byte colorComponents[]){!colorComponents[0] = random(MAX_BRIGHTNESS);!colorComponents[1] = random(MAX_BRIGHTNESS);!colorComponents[2] = random(MAX_BRIGHTNESS);!}!!void displayColor(byte colorComponents[]){!analogWrite( RED_PIN, colorComponents[0] );!analogWrite( GREEN_PIN, colorComponents[1] );!analogWrite( BLUE_PIN, colorComponents[2] ); !}!
RaspberryPIredLEDgreenLEDblueLEDPWMArduinoserial
sketch 4an echo server (serial IO)
void setup()!{!Serial.begin(57600); // start serial port at 57600 bps!}!!void loop() {!waitForInput();!!static char input[1025];!int bytesRead = Serial.readBytesUntil( '\n', input, 1024 );!!if( bytesRead ){!String str = String(input);!str.toUpperCase();!Serial.println(str);!}!}!!void waitForInput() {!while (Serial.available() <= 0) {!// busy loop!}!}!
RaspberryPIredLEDgreenLEDblueLEDArduino
RaspberryPIredLEDgreenLEDblueLEDArduino“ffaa11\n”
Much LearningArduino-compatiblesbareduinosLPC810soldering!transistorsprotoboardfritzingvoltageregulatorsnode.jscctrayline-levelconverterscommand-linebuildsC++ on Arduinousb to serialexternalprogrammersOSS hardware
Resources
moredip/aphex(work in progress)
Have FUN!
Pete Hodgson@ph1[email protected]theseslideshttp://bit.ly/buildlightsaber