miniSoOnCon 2009
October 2nd and 3rd, 2009 — Hamilton, Ontario
Presented by: Think|Haus, 152 Niagara Street, Hamilton, ON
Events
On Friday night, there will be an awesome BBQ and party. On Saturday, come learn new things in the how-to track, and check out the projects on display in the projects gallery.
Saturday evening, we’ll be heading to Toronto for Nuit Blanche.
Schedule
Time | Cleanroom | Lounge |
---|---|---|
13:00 – 13:29 | Richard Degelder: Introduction to OpenStreetMap | Trevyn Watson / Vive La Resistance |
13:30 – 13:59 | Steve Singer: Importing GeoBase data into OpenStreetMap | Chad Mounteny (HacklabTO): OpenWRT Demo |
14:00 – 14:29 | Trevyn Watson and James Arlen / Badge Hacking | |
14:30 – 14:59 | TBA | Seth Hardy – Intro to Electronics Hardware Design By Someone Who Isn’t an Expert |
15:00 – 15:29 | James Arlen: You Let Your Kid Do What? | Natalie Silvanovich: ZigBee: Fact and Fiction |
15:30 – 15:59 | Zach Lanier: Disclosure Samsara | Michel Gallant – Serial / Parallel Domination |
16:00 – 16:29 | Jedediah Smith: Laser Quest | Byron Sonne & Kent Spragget [Kent not presenting]: RF Countersurveillance |
16:30 – 16:59 | Adina Bogert-O’Brien and Trevyn Watson: Intro to Kite Aerial Photography | Ted Clancy (HackLab.to): Introduction to Motorcycles |
17:00 – 17:29 | Benjamin Tompkins: Multiple Personality Disorder | Darin White: Overcoming Internet-Induced Inertia to Making |
17:30 – 17:59 | Leigh Honeywell: Holy Crap We Built (Most of) A Makerbot Today | Tony Clifton: Process of fractionation for the Purposes of Refining and Collection of CH3–CH2–OH. |
Press
Social Media
- Twitter Search
- Twitter Pics: Hacked Badge | Makerbot | Pano of Main Space | Leigh being interviewed with Wayne’s furrycam | Badge! | Badge! | Badge!
- Flickr: Wayne MacPhail’s Set | Library Bazaar’s Set
Blog Posts & Articles
Leigh and Amy Assemble a MakerBot- miniHacker at miniSoOnCon
- Journalism Students covering miniSoOnCon
- Library Bazaar Blog
Badge Hacking & Info
Here’s a single page for all of this magic.
What you’ve got is a very simple and yet very awesome electronic badge. It’s a collaborative effort amongst the various spaces. A little bit of plastic work from Toronto and KW, impromptu software from Montreal and some awesome electronics hardware from Hamilton.
As far as the arduino environment is concerned, it’s a Lilypad with the ATMEGA328P running at 8MHz.
There are LEDs on each of the PWM channels and a button on Pin 8 — which requires that you set the internal pull-up resistor on the board.
Here is some reliable code to read the S1 button from the badge
/* Global/static vars */ const int BUTTON_PIN = 8; const int BOUNCE_DELAY = 10; int bounceFilter = 0; int buttonState = LOW;
/* In loop() */ if (bounceFilter == 0) { if (buttonState != digitalRead(BUTTON_PIN)) { buttonState = (buttonState == HIGH ? LOW : HIGH); bounceFilter = BOUNCE_DELAY; if (buttonState == LOW) { /* handle button press */ } else { /* handle button release */ } } } else { bounceFilter--; }
The technique is to simply ignore the button for a certain amount of time after any state change. A delay of 100ms seems to work well.
The ideal value for BOUNCE_DELAY will depend on the timing of your loop. If that is unpredictable, you might need to keep time some other way.
Software
This is currently loaded on all badges as of Friday night – it has issues. Sorry.
int mode = 0; int reading; //debouncing variables int buttonstate; int lastButtonState = LOW; long lastDebounceTime = 0; long debounceDelay = 50; // setup the number of available programs int programQuant = 4; // variable to keep the actual value // set initial state to "off" int programMode = 0; // program mode: 0 is off mode, higher than 0 is on mode int val; // variable for reading the pin status int val2; // variable for reading the delayed status int buttonState; // variable to hold the button state // set up the pins int Red2 = 9; // light connected to digital pin 9 int Red1 = 3; int Green2 = 10; int Green1 = 5; int Blue2 = 11; int Blue1 = 6; int inputPin = 8; // choose the input pin (for a pushbutton) // end pin setup // set up for Randomizer int rval = 0; // placeholder value for the new red led brightness int gval = 0; // placeholder value for the new green led brightness int bval = 0; // placeholder value for the new blue led brightness int oldrval = 0; //placeholders for the old red led brightness int oldgval = 0; //placeholders for the old green led brightness int oldbval = 0; //placeholders for the old blue led brightness int counter = 0; // a counter for loops int fadetime = 1000; // the amount of time it takes to fade // from one colour to another in ms int steps = 10; // the number of steps between each colour //end Randomizer setup // set up for Jamie's programs int value1 = LOW; int value = 0; // end Jamie's setup //check for button press and change mode void pincheck(){ int reading = digitalRead(inputPin); if( reading != lastButtonState ) { lastDebounceTime = millis(); } if((millis() - lastDebounceTime) > debounceDelay ){ buttonState = reading; } if ( lastButtonState && !buttonState ){ mode = ( mode + 1 ) % 3; Serial.println(mode , DEC); } lastButtonState = reading; /* delay(2); int second = digitalRead(inputPin); if( !first && !second ){ mode = (mode + 1) % 8; Serial.println(mode , DEC); } */ } void mode0(){ //Array of values to output to leds int a[6]; for( int fill = 0; fill < 6; fill ++ ){ a[fill]=fill*42; } //Fade LEDS in order for( int i = 0; i < 256; i++ ){ for( int fill = 0; fill < 6; fill ++ ){ a[fill]=(a[fill]+i)%256; } analogWrite( Red1, a[0] ); analogWrite( Green1, a[1] ); analogWrite( Blue1, a[2] ); analogWrite( Red2, a[3] ); analogWrite( Green2, a[4] ); analogWrite( Blue2, a[5] ); pincheck(); } } void setup() { Serial.begin(9600); // setup various pin modes pinMode(Red1, OUTPUT); pinMode(Red2, OUTPUT); pinMode(Green1, OUTPUT); pinMode(Green2, OUTPUT); pinMode(Blue1, OUTPUT); pinMode(Blue2, OUTPUT); pinMode(inputPin, INPUT); // declare pushbutton as input digitalWrite(inputPin, HIGH); // activate ATMEGA328P internal pull-up resistors // from http://www.arduino.cc/en/Reference/Random: // if analog input pin 0 is unconnected, random analog // noise will cause the call to randomSeed() to generate // different seed numbers each time the sketch runs. // randomSeed() will then shuffle the random function. randomSeed(analogRead(0)); delay(1000); /* //Enable interrupts GICR |= ( 1 < < INT0); // Signal high triggers interrupt MCUCR |= ( 1 << ISC00); MCUCR |= ( 0 << ISC01); EICRA |= ( 1 << ISC00); EICRA |= ( 0 << ISC01); */ } void loop() { switch(mode){ case 0: mode0(); break; case 1: mode1(); break; case 2: mode2(); break; } } void mode2(){ // Weld my ass... digitalWrite(Red1, LOW); digitalWrite(Red2, LOW); digitalWrite(Green1, LOW); digitalWrite(Green2, LOW); analogWrite(Blue1, random(120)+135); // analogWrite(Green1, random(120)+135); analogWrite(Blue2, random(120)+135); // analogWrite(Green2, random(120)+135); int d = random(50); for( int i = 0; i < d; i++ ){ pincheck(); delay(2); } //delay(random(100)); } void mode1(){ digitalWrite(Red1, LOW); digitalWrite(Red2, LOW); digitalWrite(Green1, LOW); digitalWrite(Green2, LOW); analogWrite(Blue1, random(120)+135); analogWrite(Green1, random(120)+135); analogWrite(Blue2, random(120)+135); analogWrite(Green2, random(120)+135); int d = random(500); for( int i = 0; i < d; i++ ){ pincheck(); delay(2); } }
PCB Strain Relief