Robot Drawing Arm

February 28, 2012

Printer ink is the most expensive commodity in the world (by weight, or volume.. apparently). I’m always running out of it just when I need to print out a boarding pass, or some other essential printed document. So wouldn’t it be great if you could print things out using a biro?

Here is my version 0 attempt at such a device in action at Lift’12. It actually has a lot of similarities to this drawing automaton, although I only realised that after I’d finished and the video blogger Nicolas Charbonnier pointed it out to me! Nicolas did a video interview with me at Lift’12 where I had the chance to show off my creation a little. You can watch the video (which includes a fair bit of discussion about my day job at CERN) here.

Basic idea: A robot arm with two drive servos and one more to move a pen (or pencil) up and down onto standard A5 paper. Plugs into a computer for the power and the drawing data. Draws following the mouse or via a crude black & white filter on a JPEG image.

Ingredients:

Arduino (I used my trusty old duemilanove), USB lead to connect it to a computer, three Futaba S3003 servos (or equivalent), a few bits of wire, and some stationary from Muji (one A5 file box, two aluminium rulers, one wooden ruler and one acryllic one to be precise). A biro (one with four colours if you are feeling fancy!). Software: Processing and some jpg’s (+a bit of patience)!

Building it was fairly straight foreward, with the most complicated part making a cam to lift the pen up/down. I did this by drilling 1/2 of an acryllic ruler so that the pen can pass through it, with the pen attached using a single thin screw to an extremity of a servo horn. Fixing the acrylic ruler to the up/down servo didn’t work very well, hence the blue ‘LIFT’ tape in the photos.

Once assembled it should look like this – obviously you can modify the hardware build as you wish.Image

You can see the coins I added (wrapped in masking tape) as a counterweight on the left. It helped to resolve some issues with the lack of co-planar motion in the two arm segments.

After trying to write my own code I gave up and used the excellent Firmata library for the arduino/processing link (my own code was doing strange things…). The computer communicates serially to the plotter, sending positions for each of the three servos.

When I was writing the initial processing sketch, I controlled the arm directly for the first few passes. This was disasterous as I managed to snap teeth off two out of my three servos (originally they were super-micro lightweight ones… after the damage I decided to upgrade to the S3003′s). This lead me to develop my own ‘emulator’ for the arm, so that I could solve the mathematical and physical constraints without breaking anything else. You can see an early demo of the arm here.

Here is the processing source code:

import processing.serial.*;
import cc.arduino.*;
Arduino arduino;
int countstart = 0;
int servo1Pin = 9; // Control pin for servo motor
int servo2Pin = 10; // Control pin for servo motor
int servo3Pin = 11; // Control pin for servo motor
int armposn;// = 0;
int digitposn;// = 0;
//int penposn;//= 0;
int penstate = 0;

int xcent = 300;
int ycent = 300;
//int targetX= 400;
//int targetY= 200;
int line1 = 130;
int line2 = 130;
int minimumlength = 40;
color black = color(0);
PImage img;
PImage edgeImg ;

void setup(){
float[][] kernel = { { -1, -1, -1 },
{ -1, 9, -1 },
{ -1, -1, -1 } };

size (600, 600);
background(255);

img = loadImage(“ben.jpg”); // Load the original image

img.loadPixels();
edgeImg = createImage(img.width, img.height, RGB);

// Loop through every pixel in the image.
for (int y = 1; y < img.height-1; y++) { // Skip top and bottom edges
for (int x = 1; x < img.width-1; x++) { // Skip left and right edges
float sum = 0; // Kernel sum for this pixel
for (int ky = -1; ky <= 1; ky++) {
for (int kx = -1; kx <= 1; kx++) {
// Calculate the adjacent pixel for this kernel point
int pos = (y + ky)*img.width + (x + kx);
// Image is grayscale, red/green/blue are identical
float val = red(img.pixels[pos]);
// Multiply adjacent pixels based on the kernel values
sum += kernel[ky+1][kx+1] * val;
}
}
// For this pixel in the new image, set the gray value
// based on the sum from the kernel
edgeImg.pixels[y*img.width + x] = color(sum);
}
}
// State that there are changes to edgeImg.pixels[]
edgeImg.updatePixels();

arduino = new Arduino(this, Arduino.list()[1]);
arduino.pinMode(servo1Pin, Arduino.OUTPUT);
arduino.pinMode(servo2Pin, Arduino.OUTPUT);
arduino.pinMode(servo3Pin, Arduino.OUTPUT);

arduino.analogWrite(servo1Pin, 70);
arduino.analogWrite(servo2Pin, 170);
arduino.analogWrite(servo3Pin, 50); // the servo moves to the horizontal location of the mouse

// note – we are setting a digital pin to output
background(255);

}

void draw()
{
if (countstart == 1){
makepic();
arduino.analogWrite(servo1Pin, 70);
arduino.analogWrite(servo2Pin, 170);
arduino.analogWrite(servo3Pin, 50);
}
countstart = countstart +1;
}

//void draw(){
void makepic(){
background(255);
//fill(50);
stroke(0);
//rect(350+30,320-10,130,130);
image(img, 0, 0, 130, 130); // Displays the image from point (0,0)

image(img, 130, 0, 130, 130); // Draw the new image
filter(POSTERIZE,4);
filter(THRESHOLD);
colorMode(HSB);

for (int xcycle = 130; xcycle < 259; xcycle = xcycle+2)
{
for (int ycycle = 0; ycycle < 129; ycycle++)
{
if (get(xcycle,ycycle)<-2)
{
set(xcycle+350-130+30,ycycle+320-10,black);
markpaper(xcycle+350-130+30,ycycle+320-10,110);//changed pen variable 110
delay(20);
markpaper(xcycle+350-130+30,ycycle+320-10,170);//comment this line and the one further below out to draw lines not dots
//delay(20);
}
else
{
set(xcycle,ycycle,0);
markpaper(xcycle+350-130+30,ycycle+320-10,170);
//delay(50);
}
}
for (int ycycle = 129; ycycle > 0; ycycle–)
{
if (get(xcycle+1,ycycle)<-2)
{
set(xcycle+350-130+1+30,ycycle+320-10,black);
markpaper(xcycle+350-130+1+30,ycycle+320-10,110);
delay(20);
markpaper(xcycle+350-130+1+30,ycycle+320-10,170);//likewise comment this line out for lines not dots on your paper as well as the one further up

}
else
{
set(xcycle+1,ycycle,0);
markpaper(xcycle+350-130+1+30,ycycle+320-10,170);
//delay(50);
}
}
}

}

void markpaper(int targetX, int targetY, int penposn){
//print(“xposn” + targetX);
//println(” yposn” + targetY);
float angle1 = atan2((targetX – xcent), (targetY – ycent));
float sectorlength = sqrt(sq(targetX – xcent)+sq(targetY – ycent));

//if it’s out of reach, shorten the length in the same direction
if (sectorlength > (line1+line2))
{
sectorlength = line1+line2;
targetX = int(xcent + sin(angle1)*sectorlength);
targetY = int(ycent + cos(angle1)*sectorlength);
}

if (sectorlength < minimumlength)
{
sectorlength = minimumlength;
targetX = int(xcent + sin(angle1)*sectorlength);
targetY = int(ycent + cos(angle1)*sectorlength);
}

float internangle = acos((sq(sectorlength)-sq(line2)-sq(line1))/(2*line1*line2));

float sendangle1st = (angle1+(internangle/2));
if (degrees(sendangle1st) < 0 )
{
sendangle1st = radians(0);
}
if (degrees(sendangle1st) > 180 )
{
sendangle1st = radians(180);
}

int line1X = int(xcent+ sin(sendangle1st)*line1);
int line1Y = int(ycent+ cos(sendangle1st)*line1);
int line2X = line1X + int(sin(((angle1+(internangle/2) – internangle)))*line2);
int line2Y = line1Y + int(cos(((angle1+(internangle/2) – internangle)))*line2);
stroke(0,9);
line(xcent, ycent, line1X, line1Y);
line(line1X, line1Y, line2X-1, line2Y-1);
// if (penposn == 150)
// {
// set(line2X,line2Y,black);
// println(“TEXT”);
// }
// set(mouseX,mouseY,black);

//if it’s too close set the minimum threshold in the same direction

int sendangle1 = round(degrees(sendangle1st));
int sendangle2 = round(degrees((radians(180) – internangle)-radians(35)));
//println(“Send1>”+ sendangle1 + ” Send2 >” + sendangle2);
digitposn = sendangle2;
armposn = sendangle1;

arduino.analogWrite(servo1Pin, digitposn);
arduino.analogWrite(servo2Pin, penposn);
arduino.analogWrite(servo3Pin, armposn);
if (penstate != penposn)
{
delay(300);
}
else
{
delay(1);
}// the servo moves to the horizontal location of the mouse
penstate = penposn;
}

//end of source\\

I should add that this code is very rough, and contains hard-coded boundary limits for the drawing area which are specific to the physical configuration of my hardware (and painstakingly obtained by moving the arm and looking at where the pen is). This code is also set to draw dots rather than lines, as people generally indicated a preference for this kind of output.

Performance is ‘interesting’. I’ve set it to draw an approx 160×160 matrix, one pixel at a time. Depending upon the number of dark pixels this can take up to 1.5 hours per image. If you want to draw lines that go between all the connected pixels the time per image comes down to <20 minutes. This is mostly a function of delays added in the code to cope with mechanical oscillations in the two arms and the pen.

Things that could be improved:

  • The code is very ropey! Like my flat, it would benefit from a tidy and the hoovering up of any stray variables.
  • The drawing area is still a bit sub-optimal. The arm can cover almost 100% of the space of an A5 sheet, however I’m only using about 65% for drawing at the moment. The boundary conditions for the angles would need to be carefully adjusted for this.
  • Worst of all the image processing is very crude (simple cut for black and white). This is mostly because I’ve been lazy (it WORKS, right?) and wish to avoid re-inventing the wheel when there are so many excellent image processing suites out there. If I have time it would be great to code something to vectorise JPG’s properly rather than my current ‘quick and dirty’ approach.
  • Colour! My pen has Red, Green, Blue and Black ink.. mostly I use black or blue for clarity, but it would be very interesting to come up with a multi-pass colour image reproduction system.
  • Good projects are never quite finished ;)

Image

A picture of Ben Bashford drawn from a JPG photo, live on the stage of Lift’12.

I hope you liked my creation – please feel free to comment, suggest and contribute. I’d like to thank Amy Shen for being my first drawing subject and for helping me to figure out the maths of converting an XY co-ordinate space into a two polar variables.


How to win at project management

February 10, 2012

This week I became a project manager. It’s just another role, like managing budgets and doing calculations.

I never particularly wanted to be a project manager. If I did I would have studied business administration at uni and spent the last 6 years of my career “telling” people what to do. Rather than just occasionally suggesting things!

However, in life you don’t always get to do exactly what you want. Plus over the yearsI’ve spent a fair amount of time watching other project managers win, lose and draw. So here are my top five tips (for myself as much as anyone else) on how to be a winner not a loser.

1. Play the man, not the ball. Unless you are doing something really technical, chances are that putting the ball in the net isn’t actually that hard, but persuading your man to do it might be. That’s a real skill!

2. Find yourself a project partner. If you try to play good cop-bad cop on your own you will only come across as schizophrenic.

3. Make lists and colour them in. Green for good and red for bad.

4. Never forget that projects are often a zero sum game. If you give something away, you are unlikely to ever get it back. So choose wisely!

5. Nobody can concentrate for more than 50 minutes. Not even you! So when it comes to meetings, keep it short buddy.

Meeting closed 11.05pm.


Arduinopower Source Code

July 27, 2011

So the other day I got a comment about my Ardunipower project. This encouraged me to dig out the source code and post it here. It’s a long way short of finished (and I’ve stopped working on the project.. since early 2010!), but hopefully this will provide at least some kind of insight into how I had commands going back and forth to the ADE7753 power measurement IC.

This code initialises all the various addresses within the ADE7753 from the data sheet. I then wrote (hardest part) a couple of routines to do multi-byte send/receive operations over SPI (Maybe it’s I2C.. I can’t remember anymore!) between the Arduino and the ADE7753. This particular version of the code is a demonstrator that polls some values and sends them back to a PC over serial (great if you have a bluetooth link going on!), slightly less good if you’re on a cable as my PCB design isn’t opto-isolated.

The next stage (that I didn’t do!) was calibration – actually turning the echoed values into something meaningful, and in particular adjusting to the measurement skew introduced between the voltage measures and the current transformer.

 

//registers on ADE7753
#define WAVEFORM 0x01
#define AENERGY 0x02
#define RAENERGY 0x03
#define LAENERGY 0x04
#define VAENERGY 0x05
#define LVAENERGY 0x06
#define LVARENERGY 0x07
#define MODE 0x09
#define IRQEN 0x0A
#define STATUS 0x0B
#define RSTSTATUS 0x0C
#define CH1OS 0x0D
#define CH2OS 0x0E
#define GAIN 0x0F
#define PHCAL 0x10
#define APOS 0x11
#define WGAIN 0x12
#define WDIV 0x12
#define CFNUM 0x14
#define CFDEN 0x15
#define IRMS 0x16
#define VRMS 0x17
#define IRMSOS 0x18
#define VRMSOS 0x19
#define VAGAIN 0x1A
#define VADIV 0x1B
#define LINECYC 0x1C
#define ZXTOUT 0x1D
#define SAGCYC 0x1E
#define SAGLVL 0x1F
#define IPKLVL 0x20
#define VPKLVL 0x21
#define IPEAK 0x22
#define RSTIPEAK 0x23
#define VPEAK 0x24
#define RSTVPEAK 0x25
#define TEMP 0x26
#define PERIOD 0x27
#define TMODE 0x3D
#define CHKSUM 0x3E
#define DIEREV 0x3F

#define DATAOUT 11//MOSI
#define DATAIN  12//MISO
#define SPICLOCK  13//sck
#define SLAVESELECT 10//ss

//opcodes
#define WREN  6
#define WRDI  4
#define RDSR  5
#define WRSR  1
#define READ  3
#define WRITE 2

//SPCR = (1<<SPE)|(1<<MSTR)|(1<<CPOL)|(1<<CPHA)|(1<<SPR1)|(1<<SPR0); //set clock rate to 1/16th system

byte eeprom_output_data;
byte multi_byte_data[3];
byte eeprom_input_data=0;
long long_eeprom_data = 0;
byte clr;
int address=0;
//data buffer
char buffer [128];

void fill_buffer()
{
  for (int I=0;I<128;I++)
  {
    buffer[I]=I;
  }
}

char spi_transfer(volatile char data)
{
  SPDR = data;                    // Start the transmission
  while (!(SPSR & (1<<SPIF)))     // Wait the end of the transmission
  {
  };
  return SPDR;                    // return the received byte
}

void setup()
{
  Serial.begin(115200);

  pinMode(DATAOUT, OUTPUT);
  pinMode(DATAIN, INPUT);
  pinMode(SPICLOCK,OUTPUT);
  pinMode(SLAVESELECT,OUTPUT);
  digitalWrite(SLAVESELECT,HIGH); //disable device
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<CPHA)|(1<<SPR1)|(1<<SPR0);
  SPSR = (0<<SPI2X);
  clr=SPSR;
  clr=SPDR;
  delay(10);
  Serial.println("init complete");
  delay(1000);

  //testrun starts here

  //utils
  //read_eeprom(address value, how many bytes)
  //write_to_eeprom(target, values, bytes to write)

  //read what is there right now
  //address = LINECYC;
//  Serial.print(address,HEX);
 // eeprom_output_data = read_eeprom(STATUS,2);

  //long TestWrite;
  //TestWrite = 0xABCD;
  //write_to_eeprom(address, TestWrite, 2);
// Serial.println(eeprom_output_data, BIN);
  //eeprom_output_data = read_eeprom(address, 2);
  //Serial.println("Completed basic read write test");

}

void write_to_eeprom(int EEPROM_address, long write_buffer, int bytes_to_write)
{
  //Serial.print("Multiwrite ops to addr>");
  //Serial.println(EEPROM_address, HEX);
  //set write mode
  byte make_write_cmd = B10000000;
  byte this_write = B00000000;
  EEPROM_address = EEPROM_address|make_write_cmd;
  digitalWrite(SLAVESELECT,LOW);
  spi_transfer((char)(EEPROM_address));      //send address

  //here there should be a t7 delay, however long that is
  for (int i = 0; i<bytes_to_write; i++){
  //Serial.println(i);
  this_write = byte(write_buffer>>(8*((bytes_to_write-1)-i)));
  //Serial.println(this_write, HEX);
  spi_transfer((char)(this_write));      //send data byte
  }
  digitalWrite(SLAVESELECT,HIGH); //release chip, signal end transfer
}

long read_eeprom(int EEPROM_address, int bytes_to_read)
{
  //Serial.print("Multi-read to addr>");
  //Serial.print(EEPROM_address, HEX);
  Serial.println(" Data starts:");
  long data = 0;
  byte reader_buf = 0;
  digitalWrite(SLAVESELECT,LOW);
  spi_transfer((char)(EEPROM_address));      //send LSByte address
  for (int i = 1; i <= bytes_to_read; i++){
    reader_buf = spi_transfer(0xFF); //get data byte
    Serial.println(i);
    Serial.println(reader_buf, BIN);

    data = data|reader_buf;
    if (i< bytes_to_read) {
      data = data<<8;
    }
    }
  Serial.print("completed. data was>");
  Serial.println(data, BIN);
  digitalWrite(SLAVESELECT,HIGH); //release chip, signal end transfer
  return data;
}

void loop()
{

    eeprom_output_data = read_eeprom(STATUS,2);
   Serial.println("STATUS CHECK");
   Serial.println(eeprom_output_data, BIN);
   Serial.println(eeprom_output_data, HEX);
   delay(1000);
   eeprom_output_data = read_eeprom(LINECYC,2);
   Serial.println("LINECYC CHECK");
   Serial.println(eeprom_output_data, BIN);
   Serial.println(eeprom_output_data, HEX);   

}

Wouldn’t it be cool…

June 20, 2011

 

I just got my first standby call out at work! A circuit breaker in the cloud experiment had tripped out causing them to lose power. My boss for the evening (I’m still very much on standby duty training…) Michael quickly found the problem and fixed it – but it set me thinking about how useful it would be to have ‘sticking plasters’ that measure temperature of electrical equipment (such as circuit breakers).

The problem was caused by an overload on the circuit. Simply put, too much stuff had been plugged in and turned on. It happens all the time, in domestic and industrial locations. After a while (between 0.001s and an hour or two) the circuit breaker decides it’s had enough of the overload and trips – cutting off whatever is connected downstream. In the meantime the circuit breaker (and the cables on either side of it) heat up, as a function of the current passing through the resistance of the copper cables. Most circuit breakers can get quite hot (>90 degrees C) without flinching, though occasionally you get one which is sensitive, or mostly just broken.

After fixing the problem we did a quick current measurement using a clamp meter (basically a multimeter with a large split-core Current Transformer stuck on the end) and found that everything was within the normal parameters for the circuit breaker. However, I think the call out service is often used because of this type of problem – okay it was only my first ever call out, but I’ve heard of it happening before.

So I thought of two things that would be useful in diagnosing and monitoring this type of problem. The first is an infra-red thermometer, the type with a laser targeting spot. Sure this sounds expensive, thoughI think Maplin sell them for less than £50 these days (don’t ask about the accuracy and calibration!), but would be really useful for measuring the temperature of equipment after a trip. However, it isn’t perfect as normally the standby service arrive some time after the trip happens, according to the following sequence:

  1. Circuit goes into overload
  2. Circuit breaker trips
  3. Somebody (or something… there’s a lot of electronic status monitoring already deployed) notices
  4. The person/thing that’s noticed calls the control room
  5. The control room call the standby service
  6. The standby person leaves their house and heads to the fault location
  7. The standby person find the fault (this could take a while… especially in complicated buildings)
  8. Fault gets fixed (hopefully!)

So there’s probably up to an hour of cool-down time in there, maybe more – all of which would render taking the temperature on arrival a little previous. It might be nice to take the temperature once it’s been fixed, to see if it starts to increase rapidly again (an indication that there is a persistent fault) but this can be done more scientifically using a clamp meter.

I think it would be cool if someone (maybe me?) could make a sticky probe to clamp on the device which would enable it to be remotely monitored over a short period of time. This could be either a split core CT for current monitoring (more accurate and expensive) or just a simple thermal sensor (probably a thermistor, or perhaps a more expensive thermocouple), or maybe even both – to see which works best.

The device would need the following characteristics:

  1. Small enough to fit into cramped existing switchboards
  2. Radio strong enough to penetrate the switchboard casing
  3. Batteries and/or power harvesting so that signals can be transmitted for a reasonable period of time, between 24 hours and 7 days.
  4. The sensor (temperature and/or current)
  5. Some form of enumeration – it would be great if there was a sticker you could just peel off that would title the device with the time of activation
  6. A way of getting the data back to the IP layer, so a radio-IP gateway. This is probably the trickiest bit, especially with a low cost solution in mind. It could take the form of a wifi RF package within the device, or a lower level, significantly cheaper radio format back to a base node with a wired connection.
  7. A website/database for tracking the data collected, and signalling when it’s time to go back and collect the magic sticking plaster.

Best of all would be if the device was self powering, so could be left in place indefinitely – each deployment helping to improve the reliability of the electrical network in a lasting and meaningful way. With a few devices in place, the biggest benefit would be from a ‘pre-trip’ temperature/current threshold – and if this feedback could be provided in a meaningful way to the user, they might even be able to load-shed (i.e. turn things off) before the trip actually happens.

Maybe one day…


DIY Wedding Photobooth

June 18, 2011

As if there aren’t enough accounts of how to build your own photobooth on the internet already, here is one more!

Brief: An easy to assemble, relatively drunken person (it is a wedding after all…) proof photobooth that is robust and easy to use by all ages. Basic photo taking capability that produces the authentic Photo-booth experience and encourages silly poses. Cheap-ish to construct with a maximum of re-usable parts afterwards as the remains are going to the bride and groom’s place as shelving units for their shed.

Physical Hardware (mostly from Ikea):

Two sets of GORM shelves, one slim (for the computer enclosure) and one deep for the seating area.

Four height-extenders used to brace the gap between the two shelf units (so 2 packs of 2 bits of wood each)

A curtain rail to cover the door when the booth is in use, hung with an Irma fleece rug that has holes cut into it to go on the rail

One additional large shelf to connect the two shelves together on the side

Four plastic shelf wall mounting brackets (a bargain at about 40p each!)

Covers – 10 x Irma covers (super cheap at 1 pound each) and two of the more expensive Polarvide covers – one black one for the front to cover the computer/electronics and one for the back to make the rear ‘curtain’

Electrical and Electronics:

Again from IKEA 4x Lagra spotlights and compact fluorescent 7W lamps to give it that ‘showbiz’ feel inside. I had problems screwing the bulbs in due to the metal reflectors, so had to cut a couple of them out. After removing the first two, I found that the other two could be persuaded to screw in with a fair bit of force.

One IKEA ‘non’ 11W fluorescent strip light, to go in the top of the booth for ‘house lights’ when the spotlights are off.

A four way power strip from home, plus a two way switch from my dad’s box of household electrical stuff. We also brought along an extension lead to ensure that we could power it all at the venue.

The main component of the electronics was my old laptop – A Highgrade Notino circa 2003, with a 180 degree hinge, so I could slot it in to a space between a shelf mounted vertically with a height extender batten screwed to the back of it. The laptop simply slots in and sits in the gap – excellent for checking the saving of files and making last minute modifications. If you don’t have a laptop that goes flat this will be more complicated! I hooked it up to an old MSI Star Cam Clip (as I bought a couple some time ago) to take the photos, which provided a resolution of 640×480. Not exactly HD, but fine for a photobooth.

Some more sparkle was added by including my girlfriends desk-fan, wired through the second switch on the switch plate, to give that ‘blowing hair’ look.

The booth action was controlled by a single button, mounted in between the slats of the vertical front facing shelf. It was connected to an Arduino running some very simple code which sent a letter over the serial port to the laptop when pressed. Originally I had two buttons, but actually only having one worked fine! The electronics weren’t that well screened, so switching on the fan also had the effect of triggering the booth countdown, which wasn’t all bad for those who couldn’t find the real trigger button.

Software:

The booth software was written in processing, running on Windows XP. To make it work with the webcam I needed to install quicktime and a legacy version of WinVDIG which I found on the web. In the traditional ‘photobooth’ format, I set it up to take 4 consecutive pictures, saving each as a JPEG with a unique time/date/incremented counter filename. On the completion of the fourth picture, they were all re-loaded and put into a 2×2 square format like a print out, displayed back to the user and saved as a composite JPEG. We didn’t attempt to print anything out as the booth was intended (and succeeded in being) able to run ‘stand alone’ without too much human intervention for the evening.

[After all the testing, I actually put my processing source on a corrupt USB key so had to re-write it from the previous version the night before the wedding! Oops.. ]

Source Code:

For the Arduino -

int stbuttonPin = 2;  // change to whatever you want
int tkbuttonPin = 3;
int ledPin = 13; // just using for example
boolean tkoldval = HIGH;
boolean stoldval = HIGH;

void setup()
{
     pinMode(ledPin, OUTPUT);     // LED as output
     pinMode(stbuttonPin, INPUT);    // button as input
     digitalWrite(stbuttonPin, HIGH); // turns on pull-up resistor after input
     pinMode(tkbuttonPin, INPUT);    // button as input
     digitalWrite(tkbuttonPin, HIGH); // turns on pull-up resistor after input
     Serial.begin(9600);
}

void loop()
{
tkoldval = digitalRead(tkbuttonPin);
stoldval = digitalRead(stbuttonPin);
     if( (tkoldval == HIGH) &(digitalRead(tkbuttonPin) == LOW ))   // when pin goes LOW
	   {
	    Serial.println('t');
            digitalWrite(ledPin, HIGH);	     // turn on LED
            delay(10);
	    }
     if( (stoldval == HIGH) & (digitalRead(stbuttonPin) == LOW ))   // when pin goes LOW
	   {
	    Serial.println('s');
            digitalWrite(ledPin, HIGH);	     // turn on LED
            delay(10);
	    }

    digitalWrite(ledPin, LOW);	  // well, turns led off!
    //delay(1000); //one second delay

}

And the code for Processing:

 
  public static void main( String args[] ) {
   PApplet.main( new String[] { "--present", "superbooth8511" } );
 }
//import fullscreen.*;
//import japplemenubar.*;
import processing.serial.*;

/* (made by Tjerk in 10 minutes  ) */

import processing.video.*;
Serial myPort;  // Create object from Serial class
char val;      // Data received from the serial port

Capture myCapture;
int a = 1024; // width of window
int b = 768;  // height of window
int x = 100;  // x- position text
int y = 700; // y- position text
int capnum = 0;
int countdowntimer = 10;
int globalframecount = 0;
PImage aj;
PImage bj;
PImage cj;
PImage dj;
//FullScreen fs;

void setup(){

    //print(Serial.list()[0]);
  String portName = Serial.list()[0];
  myPort = new Serial(this, portName, 9600);
  val = 'o';
  frameRate(25);
 size(a,b);
 // fs = new FullScreen(this);

// setFullScreen(true);
 background(0);

 //PFont fontB = loadFont("Ziggurat-HTF-Black-32.vlw");
 //textFont(fontB, 100);
myCapture = new Capture(this, a, b, 30);
}
void captureEvent(Capture myCapture) {
 myCapture.read();
 //fs.enter();
}
void draw(){
 PFont fontA = loadFont("Ziggurat-HTF-Black-32.vlw");
 textFont(fontA);
  //println("start");
if ( myPort.available() > 0) {  // If data is available,
    val = (myPort.readChar());
   //println('1');
//println(val);    // read it and store it in val
 }
 if (mousePressed== true){
   globalframecount = 1;
 }

   //background(255);
   fill(0);

switch(val) {

  case 's':
  globalframecount = 1;
//  background(0);

 break;

  case 't':
//null
    break;
  default:
    //println("Zulu");   // Prints "Zulu"
    break;
}

 if (globalframecount == 25) {
 countdowntimer = 9;
 }
 if (globalframecount == 50) {
 countdowntimer = 8;
 }
 if (globalframecount == 75) {
 countdowntimer = 7;
 }
 if (globalframecount == 100) {
 countdowntimer = 6;
 }
 if (globalframecount == 125) {
 countdowntimer = 5;
 }
 if (globalframecount == 150) {
 countdowntimer = 4;
 }
 if (globalframecount == 175) {
 countdowntimer = 3;
 }
 if (globalframecount == 200) {
 countdowntimer = 2;
 }
 if (globalframecount == 225) {
 countdowntimer = 1;
 } 

 if ((globalframecount < 250) & (globalframecount > 0)) {
       image (myCapture, 0,0);
       textFont(fontA, 30);
       fill(0);
       text ("Preview! Get ready for your photo in "+str(countdowntimer), x+2, y);
       text ("Preview! Get ready for your photo in "+str(countdowntimer), x, y+2);
       text ("Preview! Get ready for your photo in "+str(countdowntimer), x-2, y);
       text ("Preview! Get ready for your photo in "+str(countdowntimer), x, y-2);
       textFont(fontA, 30);
       fill(255);
       text ("Preview! Get ready for your photo in "+str(countdowntimer), x, y);
       //text (countdowntimer, width-250, y);
       globalframecount++;
 }

 if ((globalframecount >= 250) & (globalframecount < 500)) {
      image (myCapture, 0,0);

 if ((globalframecount > 250) & (globalframecount < 311))
 {
 textFont(fontA, 100);
 fill(0);
 text (str(countdowntimer), width/2+2, height/2);

 text (str(countdowntimer), width/2, height/2+2);

 text (str(countdowntimer), width/2-2, height/2);

 text (str(countdowntimer), width/2, height/2-2);

 fill(255);
 text (str(countdowntimer), width/2, height/2-2);
  }
if (globalframecount == 250)
{
  countdowntimer = 3;
}

if (globalframecount == 270)
{
  countdowntimer = 2;
}

if (globalframecount == 290)
{
  countdowntimer = 1;
}

if (globalframecount == 312) {
  background(255);
}
   if (globalframecount == 313){
  saveFrame(capnum+".jpeg");
  aj = loadImage(capnum+".jpeg");
  capnum++;}

  if ((globalframecount > 314) & (globalframecount < 373))
 {
 textFont(fontA, 100);
 fill(0);
 text (str(countdowntimer), width/2+2, height/2);

 text (str(countdowntimer), width/2, height/2+2);

 text (str(countdowntimer), width/2-2, height/2);

 text (str(countdowntimer), width/2, height/2-2);

 fill(255);
 text (str(countdowntimer), width/2, height/2-2);
  }
if (globalframecount == 314)
{
  countdowntimer = 3;
}

if (globalframecount == 335)
{
  countdowntimer = 2;
}

if (globalframecount == 355)
{
  countdowntimer = 1;
}

  if (globalframecount == 374) {
  background(255);
}

  if (globalframecount == 375){
  saveFrame(capnum+".jpeg");
  bj = loadImage(capnum+".jpeg");
  capnum++;
    }

  if ((globalframecount > 375) & (globalframecount < 436))
 {
 textFont(fontA, 100);
 fill(0);
 text (str(countdowntimer), width/2+2, height/2);

 text (str(countdowntimer), width/2, height/2+2);

 text (str(countdowntimer), width/2-2, height/2);

 text (str(countdowntimer), width/2, height/2-2);

 fill(255);
 text (str(countdowntimer), width/2, height/2-2);
  }
if (globalframecount == 376)
{
  countdowntimer = 3;
}

if (globalframecount == 401)
{
  countdowntimer = 2;
}

if (globalframecount == 420)
{
  countdowntimer = 1;
}

  if (globalframecount == 438) {
  background(255);
}

    if (globalframecount == 439){
  saveFrame(capnum+".jpeg");
  cj = loadImage(capnum+".jpeg");
  capnum++;
    }

  if ((globalframecount > 440) & (globalframecount < 497))
 {
 textFont(fontA, 100);
 fill(0);
 text (str(countdowntimer), width/2+2, height/2);

 text (str(countdowntimer), width/2, height/2+2);

 text (str(countdowntimer), width/2-2, height/2);

 text (str(countdowntimer), width/2, height/2-2);

 fill(255);
 text (str(countdowntimer), width/2, height/2-2);
  }
if (globalframecount == 440)
{
  countdowntimer = 3;
}

if (globalframecount == 460)
{
  countdowntimer = 2;
}

if (globalframecount == 480)
{
  countdowntimer = 1;
}

   if (globalframecount == 497) {
  background(255);
}    

     if (globalframecount == 498){
  saveFrame(capnum+".jpeg");
  dj = loadImage(capnum+".jpeg");
  capnum++;
     }

  if (globalframecount == 499) {
 fill(255);
 background(0);
 rect(width/11, height/10, (width-240), (height-100));
 image(aj, width/8, height/8, width/3, height/3);
 image(bj, 4*(width/8), height/8, width/3, height/3);
 image(cj, width/8, 4*(height/8), width/3, height/3);
 image(dj, 4*(width/8), 4*(height/8), width/3, height/3);
 fill(0);
 text ("Press button to take some more!", x, y);
 saveFrame("multipage"+capnum+".jpeg");
 globalframecount = -1;
     }

 //delay(50);
 globalframecount++;}

}

The photobooth output!

The assembly took a few hours with my trusty battery drill and a socket bit to drive the GORM bolts into place. I also used plenty of woodscrews for my ‘non standard’ fixings into the gorm framework, and a couple of different sizes of wood drill bits to pre-drill to prevent splitting in the new mount locations.

Relative to the picture above, the only modifications were the omission of the top and bottom shelves in the middle section – these were replaced with two height extender bars screwed into the tops of each of the other modules, which proved sufficiently rigid to hold it all together. I also added another height extender bar at the back of the computer cabinet, to mount the webcam on. With the installation of the 4 shelf brackets to support the seat, there wasn’t room to install a full depth shelf underneath as a ‘back board’ for peoples feet, so I put a narrow one there instead, and didn’t put any horizontal element in the middle of the computer cabinet section.

Finally, I wrapped the whole thing in the IRMA cloth, using screws as attachment – the original plan called for a staple gun but we couldn’t find one! The curtain rail was mounted above the entrance, screwed to each corner of the booth. The final height extender was screwed to the top using the 90 degree ‘non topple’ brackets, and served as a sign. I had to cut the black polarvide cloth that covered the laptop (apart from the camera and screen of course!), so that I could fit the screen up in the middle of it. Otherwise damage to the cloth was minimal.

A last minute enhancement came from the IKEA bargain bin, where I picked up a large seat cushion cover for £3 and secured this to the seat with some screws underneath. Extra padding would have been nice, but the cover was sufficient to make sure that fancy clothes didn’t get caught on any rough bits of wood.

On the night, the ‘non’ fluorescent tube was useful as I didn’t wire it through the switch, so it remained on all the time – showing people that the booth was ready to use, even if the spotlights inside had been turned off. The booth broke down a couple of times when users accidentally pressed the ‘take picture’ button on the webcam whilst adjusting it, but otherwise it was trouble free.

Disassembly took less than an hour, again using the power drill with a socket to remove the GORM bolts. I was also able to recover 90% of the screws I used, which I can recycle for future projects! I was very happy with how it all worked out, so was my girlfriend. Fingers crossed the bride and groom liked it too.. and will like their new shelves once they get back from honeymoon!

The finished product

Evaluation:

I thought it worked well, building was fast, the construction was solid enough for up to 2 adults and 2 small children to fit inside. The processing sketch performed perfectly, although the resolution wasn’t amazing – if I had a better webcam maybe next time, although there is also a constraint from the size of the laptop screen, as processing actually takes a screendump in my code, rather than a true photo (which would let you go up to 1.3Mp, if I knew how to do it). Overall I went a little over budget (the target was £100, it actually cost about £125) mostly buying extra lights, but everything except a couple of the cloths can be re-used – either somewhere in the house or re-building the photo booth for another happy occasion! I hope this is useful for anyone trying to build a booth.

Original Bill of Materials (we actually bought only some of this and some extra things not listed) -

NON
Countertop lighting,
fluorescent
£15.31
Length: 65.0 cm
Cord length: 1.5 m
Article no:: 001.436.45

IRMA
Throw
£1.01
color: light blue
Length: 170 cm
Width: 130 cm
Article no:: 000.704.89

POLARVIDE
Throw
£2.85
color: green
Length: 170 cm
Width: 130 cm
Article no:: 401.229.43

GORM
Post
£3.06
Height: 174 cm
Package quantity: 2 pack
Article no:: 000.585.24

GORM
Height extension post
£1.53
Height: 59 cm
Package quantity: 2 pack
Article no:: 700.585.06

GORM
Shelving unit
£24.50
Width: 78 cm
Depth: 55 cm
Height: 174 cm
Article no:: 000.585.19

So you want to work in Investment Banking?

February 24, 2011

A few years ago now I interviewed for a graduate position at a major investment bank. This is the story of my application, and all the fun I had on the way. I’ll refrain from disclosing the name of the bank, though I’m confident that any of you who have read Liars Poker by Micheal Lewis, or indeed have experience of the industry will see a familiar picture.

An investment bank

 

When I was in my final year at university, I was in the fortunate position of having a virtually guaranteed job offer from my sponsoring company Bovis Lend Lease. Rather than sit back and wait for my contract to arrive, I thought I would take the opportunity to play the field and see how much I was worth (if anything!). I made a list of desirable employers and ranked them in order of my salary expectations and application deadlines, which interestingly were strongly correlated.  In September/October 2004 I filled out my online application for a particular bank that I hadn’t quite chosen at random.

It was a fairly conventional form, like almost all the others for graduate employers. I can’t remember if I had to do a cheesy cover letter that included a quote from the founder or current CEO of the bank. I’ve certainly written a couple of those in my time and it makes me feel rather uncomfortable! I filled out all the usual details, such as my entire educational history, previous work experience, hobbies, interests and the competence questions along the lines of:

  • Tell us about when you worked in a team
  • Tell us about when you took a leading role
  • Tell us about how you dealt with a conflict or difficult situation

After pressing the send button I crossed my fingers and waited. I knew if they liked my answers (or even bothered to read them!) I should have the paper qualifications to at least make the first round. I was also expecting a numerical/verbal reasoning/how smart are you type online test, which I duly completed in response to the email invitation. At the same time I had applied for the Government ‘Fast Stream’ civil service recruitment program, so large numbers of online tests were nothing new – or especially challenging.

After a couple of weeks my first round interview invitation arrived. I was still quite naive at this point, and hadn’t really figured out that there would be numerous stages to the process – however I have to say I enjoyed all of it. The first round interview took place in a small meeting room at the Bank’s offices, on their executive entertainment floor. There were two interviewers, one manager from Operations, the department I had applied for and a second from HR. It was clear from the first question that the manager was the key player in the room and the one I had to impress, whilst taking care to keep HR satisfied that I didn’t have any undesirable ’downside’ attributes.

The questions initially focused on some of the points from my online application form. I was able to tell the stories about my leadership experiences, previous employment and hobbies in a bit more detail. The operations manager then took more of a handle on the interview and started to ask me questions to test my analytical capabilities. Two questions I remember in particular were:

  • How would you evaluate the value of an option to lease two additional floors of this building?
  • If I gave you £10,000, what would you invest it in?

The first question was quite interesting, as we discussed things like market growth, business cycles, headcount, the opportunity cost, strategic interests of keeping competitors or other organisations out of the building, and the future cost of leases. However the second question completely blew me away. I’d done some reading in the economist prior to the interview – if you’re going for this type of interview you are always well advised to have the price of gold, crude oil and at the very least the current BOE base rate written on the inside of your eyelids. However, as investment strategies go I didn’t really have a clue at the time – and wasn’t going to be able to come up with something in the 2 seconds thinking time I bought by sipping my glass of fizzy interview water.

I was quite pleased with my answer – I stated calmly that £10,000 wasn’t a lot of money. Really to make a serious investment you would need at least £100,000 or ideally £1M+.  I still didn’t really know what I would invest this amount of money in, so I said that I’d start my own business! The operations manager really liked this – he’d probably heard about 20 stories about hedged bond/equity portfolios by this point from all the other candidates. Anyway, a few seconds later the interview was over and I was on my way out of the polished walnut paneled hallways and headed back to earth with the security guard in the marble clad lift.

Sure enough a couple of weeks later I got another invitation to a ‘Meet the Managers’ type event at the Bank’s offices, where we would have the opportunity to meet a selection of senior staff, our potential future managers and the other applicants for the same roles. The format was an after work evening talk, given by a senior VP or MD (everyone seemed to be at least a VP actually.. this guy must have been more than that, maybe he was COO) who was responsible for all bank operations in Europe. He told us about how great the bank was, and how it was the biggest bank in the world by some measure or other. I’m sure every bank has a slide that it shows the new potential recruits showing how it is the leader in a particular field of looking after other peoples money. Anyway, the most interesting things was what happened after the talk had finished (and of course after the more annoying ones among the candidates had finished asking their stupid questions). We were lead into the buildings grand atrium and provided with access to a free bar, and some rather diminutive nibbles.

I’m not sure if it was just my cynical mind which saw this as another form of ‘interview’ under the presence of alcohol. This viewpoint wasn’t shared by at least one of the bank’s managers who proceeded to down a few too many bottles of beer and start to talk rather loudly (loud enough for me to hear on the other side of the room). If the bank had intended to see how the candidates could handle their beer then they failed. In fact the boot was on the other foot and this manager (a die hard West Ham fan) was giving the bank a kicking!  After he finished a particularly gratuitous ‘loads of money’ anecdote I thought it would be a good time to ask him about his team’s staff turn over. He stated bluntly “It’s bigger than 100%, you see 50% of the people I work with, or maybe 60% of the people I work with I don’t like them! So I have them fired. The other 50% tend to leave of their own accord”. Thanks for the tip…

I was pretty much decided that I didn’t really want to work there. And I certainly didn’t want to work for someone who makes a habit of firing 50% of their staff. At some point I heard a similar story from one of the 6 new graduates that had joined some 6 months earlier, recounting how one of them had already been fired by the self-same manager I had met above. The details in this case were even more frightening, apparently the now ex-graduate-banker hadn’t even been working for the manager when he got the chop. The manager had just seen him one day on the trading floor, thought he looked slightly un-tidy and immediately picked up the phone to HR to complain that he was untidy and should be fired. Bang!

One of the other war stories we picked up from the new grads was that the Bank’s entire Tokyo office had been fired recently. I’d heard that banks tend to make such decisions at high speed without much room for compassion, but this tale had them all fired over a lunchtime! I’m not sure if it’s true, but it certainly made me think about ‘stability’ and that old chestnut of ‘a job for life’ in the comparative benevolence of the construction industry.

The final part of the selection process was the dreaded (for those who cared…) assessment centre. The only thing I was dreading was the early morning start! We had to be at the Bank’s office for 7am on a Saturday. As my friends know, I’m not a particularly early riser – and indeed travelling by tube to ‘where you want to go’ in London at the weekend has been virtually impossible for a while now. So fortunately my dad woke me up super early and gave me a lift (in my best suit and tie!) down to the Bank. All the other candidates were already sitting in the big glass entrance in various stages of waking up.

The day consisted of a number of different exercises:

  • Numerical and Verbal Reasoning Tests – to check that we hadn’t somehow cheated in the online ones
  • Two personal interviews (I think.. I only remember one actually)
  • Lunch in the brasserie on the corporate hospitality floor
  • Team activities

The tests were simple enough. Perhaps it was a bit mean of me, but since everyone was wearing their hyper-competitive clothes and looking at each other through hyper-competitive eyes I guess I suffered a moment of weakness. So now is probably a good time to confess that I wrote the whole test as fast and loud as possible with my pencil. I slammed it down a lot louder than strictly necessary 3-4 minutes before the end of the 20 minute test, before I’d even finished, to make sure everyone in the room thought that I’d finished well ahead of time. I picked it up again a few seconds later and did the remaining questions quietly whilst everyone else was still blinded with panic.

The interviews were more or less unremarkable – with the only memorable incident being when a slightly mature looking guy asked me “So why do you want to do Banking when you’ve spent your education studying to do Engineering?”. He didn’t give me any pre-warning, but after I’d finished my polite response he put his cards on the table and said that he was trained as an engineer and that it’s always a good idea to be tactful when answering questions like that!

The group exercises were split into two parts – the first was competitions between groups, the second competition within the group. For the first competition they brought in a 5″ stack of FT’s and a few mini post-it tape dispensers. We were split into teams of about 5 candidates, told to sit together and then given the brief:

  • Build the highest tower you can using just the papers and the sellotape

Fortunately this is the same kind of exercise I used to make the kids in my Church Youth Group do – actually it was harder for them as they had to put an egg on the top of their paper tower (and keep it there for 5 minutes!). Fortunately we didn’t have any eggs, otherwise most of the other teams would have broken theirs. My personal highlight of this exercise was the look on the face of one of my economics graduate team mates, who had obviously never done anything more exciting with the FT than read it. With a little sunday-school engineering knowledge my team produced the tallest tower – so big in fact that we actually touched the ceiling of the conference room! Activity feedback at the end of the process included the suggestion that a taller room would be more suitable…

After the initial group activity we were lead away into a conference room, just the 5 candidates and two Bank employees – one manager from Operations and one from HR. The Ops manager supervising my group was the same guy that had given me my first round interview, which was nice as I quite liked him. We all sat round a circular conference table and the next task began. The Ops manager dealt out some of his business cards and told us not to turn them over.

We were then asked to stick them to our heads, so that the non-business card side was facing out. This revealed a number of celebrity names – the aim of the next game being to work out what name you were wearing on your own head using exclusively yes/no questions. Again this is a game I’ve played with my church youth group, so not especially challenging! Though you would have thought it was brain surgery to hear what some of the candidates asked as their ‘yes/no’ questions. I think one guy out of the 5 of us failed to guess his name, which was something like Robbie Williams.

Once everyone had either guessed or been ‘informed’ of their name we moved on to the final game – the lifeboat. Again it’s a fairly conventional game to play, where everyone votes each round to throw one person out of the boat, until only two people remain. Candidate ‘Robbie Williams’ was the first to be fed to the sharks, closely followed by a couple of other less persuasive individuals. The day was rounded off a few minutes later with a ‘thank you for coming, we will call you in a week or two’ general announcement and I went home (for a sleep of course, I’d missed at least 4 hours due to the early start).

That is the end of the exciting bit of the story – a week later the Bank did indeed call me, amazingly with a job offer that was indeed very well paid, especially for a graduate position.  I’d be lying if I said I didn’t seriously consider it – but in the end I decided to turn them down and stick with my sponsors and a career (so far) in engineering. I’m not sure if the story has a moral? Probably the most concise summary is:

  • As an employer you need to sell yourself to potential recruits, lots of money and a nice shiny office isn’t enough. If they hate your guts by the end of the interview they will probably reject your job offer.
  • Beware of other candidates in the recruitment process. Sometimes they are more-or-less along for a joyride, including free interview practice and complimentary beer.
  • Teenage children are often better problem solvers and communicators that supposed ‘top flight’ graduates.
  • I’m sure that not all banks are like this one, but there are definitely still a few that are very similar.

When thinking about your career choices my best advice is to apply for everything you feasibly can. Should you get the interview/assessment centre make sure you enjoy and learn from the experience.


10 reasons why (I think) Geneva is cool

January 30, 2011

 

As I was flying in to the airport here tonight I thought it would be nice to do a quick 10 point list of why Geneva is a really cool and nice place to live, chilled, civilised and tasteful etc.

  1. It has a lake. All cool and interesting places have a big body of water/decent sized river nearby or in the middle of them (London, Paris, New York, Washington, Cairo and probably more). The lake is rather chilly in winter, but awesome in summer.
  2. Food. The food here is delicious. It’s been 4 months and I haven’t come across a bad restaurant! True the food is expensive, but you more or less get what you pay for, which tastes great. Last weekend I had a wonderful chicken lasagne at les bains du paquis, with a side salad topped with bits of orange. Yum!
  3. The hot chocolate. Most places here serve world class hot chocolate that you practically need a spoon to eat.
  4. Wine. The Geneva region produces excellent whites, my personal fave at the moment is the Chasselas from Domaine du  Paradis, which I buy from the Coop supermarket. The Baccarat (fizzy champagne-esque stuff) is also rather decent too, especially the ‘La Grande Cuvee’ top of the range stuff.
  5. CERN is here, which is obviously very cool indeed. They do visitors tours if you book in advance and there are two permanent exhibitions open Monday to Friday. There is also a gift shop (that I haven’t visited yet) where you can buy cool stuff like CERN branded mugs.
  6. France is nearby! I’m sure the French will love me for saying this, but it’s true, that should Switzerland get too much you can always leave the country. France is about 10 minutes walk from my flat and indeed I tend to do my weekly shopping there! It has benefits such as being cheaper than Geneva, and selling a massive range of cheeses (I have some delicious tasting smelly blue stuff in my fridge right now..) and French wines. My personal highlights from France are the chocolate (as good or better than Swiss, depending upon who you ask) and the fruit cordials (they have every possible flavour from Grenadine to Arctic Mint to Grapefruit to Pineapple).
  7. Skiing. Apparently you can go skiing very easily here! Though due to a lack of snow and travelling home rather a lot I’m still yet to try it. Oh that and the fact that having rather large feet is a bit of an inconvenience for finding suitably sized ski boots, which would be a prerequisite of skiing.
  8. You can cycle to the airport! It even has under-cover bike stands, so that if it snows whilst you’re away, your bike won’t get all snowed up. The airport is very civilised in general, oh and it has free wifi too.
  9. Transport is really good. The bus and tram system run late most days (12ish) and operate a very good service. Occasionally it falls down when someone crashes their car on/into the trams or tram routes. And it isn’t super cheap (3 CHF per journey unless you’re travelling on a travel card) however, at weekends the 10 CHF day card is valid for 2 persons. Bonus! You can also get the tram from just outside my flat all the way through Geneva and out the other side to France.
  10. It’s neat any tidy and most people that I’ve come across are polite? Service isn’t always that fast.. in fact it can be painfully slow. I once queued for 7 minutes to buy one item from my local convenience store, as there was 1 person in front of me buying about 50 things at the speed of slow-drying paint. Also this place isn’t really geared up for rushing in the same frenetic way that London is. Fortunately I’m a patient guy.

Geneva is also a rather go-to-bed early kind of place. So it’s probably time for me to finish…


My Day Job – from Anticipations Magazine

January 18, 2011

A while ago (Nov 2010) I wrote a short article about my new job at CERN for Anticipations, the magazine of the Young Fabians. Mostly it’s full of left/centre left politics/social issues related articles, but they also have a ‘My Day Job’ column for people to write in with ‘genuinely’ interesting jobs. Hopefully mine fits the bill!

Last month I started a new job. By almost all measures, it’s rather unusual – It involves a massive high voltage electrical network, but this isn’t the National Grid, over 27km of underground tunnel system, but it’s not the London Underground, international co-operation on a huge scale, though this isn’t (quite!) the United Nations. I’m lucky enough to work on a small part of what is arguably the most complicated and technically advanced machine ever created by the human race, so far… I work at CERN, home of the Large Hadron Collider.

 CERN is an international collaboration in the field of particle physics which was founded by a number of European nations in 1954. The UK was one of the twelve founder members and continues to benefit from access to the unique research facilities which CERN offers. On a typical day here there may be up to ten thousand people on site (which spans the French-Swiss border near Geneva), the majority of whom are research physicists. They are the ‘users’ of the huge underground machines. The remainder of those on site are permanent staff responsible for running CERN (everything from catering contracts to particle accelerator design and engineering) number only about two thousand, which makes for a demanding working environment. The collaboration exists to provide facilities which are far beyond the scale and scope of what individual member could achieve on their own. At CERN active research takes place in fundamental physics across the board, rather than the specific quest for the next ‘new’ particle such as the Higgs Boson. Although of course everyone here is hoping that the discovery of the Higgs will be made possible by the LHC.

  As an electrical engineer, my particular work involves the provision of power supplies for the particle accelerators and physics experiments. At the moment I’m working on some new supplies for the safety system which protects the particle beams circulating within the LHC and the new experimental ground control room for the Alpha Magnetic Spectrometer, which is scheduled to be attached to the International Space Station next year and will be searching for dark matter and anti-matter in space.

 The languages that I’ve heard spoken so far since my arrival include English, French, German, Portuguese and Japanese as well as many others that I can’t yet recognise! The electrical team I work in is predominantly French speaking, although as part of the procurement procedure all major items of work must be tendered in a process, open exclusively to companies from member states (which now include 20 European nations) with all documentation provided in English. Most of my colleagues have a good degree of fluency in two languages, with a few being fully tri- or even quad-lingual! The majority of my meetings take place in French and when projects come to the implementation stage most of the workers actually doing the construction and installation work are also French speakers. I studied French at A-level and throughout university, though at the moment working in a foreign language every day is proving to be a real (and enjoyable) challenge!

 Of course, it isn’t just about the job. I’ve had to move countries to come here, which like all major changes in life brings both advantages and inconveniences. The best thing about being here so far is definitely the food. The range of wines and cheeses available in local shops is superb, with competitive prices. The countryside here is breath-taking, I can see snow covered mountains from my office window, and on clear day even Mt Blanc! The biggest downside is that I’ve left my friends and family behind in the UK. Fortunately flights from Geneva to London are frequent and not too expensive, so I can at least visit regularly. The ski season is also rapidly approaching so I’m expecting an influx of welcome visitors to take advantage of cheap (free!) accommodation on the floor of my flat and the proximity of many nearby ski slopes.

 It’s probably a fair question to ask how I ended up in my current position, so here’s a little explanation: I first visited CERN back in 1999, as part of an international school trip I persuaded my parents to send me on (thanks Mum & Dad!). During that first visit I was inspired by the possibilities of the groundbreaking physics research and the incredible machines being constructed here. After graduating with a degree in Electrical Engineering, I was able to obtain a CERN ‘Summer Student’ internship in 2005. During my internship I worked directly on a tiny (just 10 square centimetres across) part of the particle detection system for one of the gigantic physics experiment called LHCb, which is part of the LHC complex. I highly recommend applying for the CERN programme to anyone currently studying a Physics, Engineering or Computing related course at the moment!

 After finishing my internship, I spent 5 years working in the UK construction sector, designing buildings. At the same time I was making progress towards obtaining my registration as a Chartered Engineer, which can only be gained through a period of working as an engineer. Demonstrating good progress towards registration was an integral part of the application for my current position at CERN. I was able to achieve Chartered Engineer status just before taking up my new role here.


Miserable (weather)

January 9, 2011

I’ve spent the whole day inside today. It’s been cold, wet and dark for most of the last week.  Walking round in the cold dark wetness isn’t exactly exciting. Which I guess goes to show that it isn’t possible to move to a place with a perfect climate and a super job, and also that it’s much easier to be happy when the sun is shining and it’s warm outside! Or even when it’s cold and snowy.

Returning to work has been a bit of a shock to my system, especially after 2 weeks of less than strenuous activity involving primarily sleeping and eating. Since Wednesday I’ve been speaking French again, all day every day and getting up in the morning. We had some emergency stop testing (part of the fixed annual safety tests) on Saturday so I had a particularly early start (in work by 6AM!). The emergency stop system at CERN is fairly similar to most industrial safety systems, however due to the scale and complexity of the campus, testing is quite involved! Highlight of the tests was exploring the AD (Anti-proton Decelerator) facility again. I had a guided tour given by my friend Gorm when he was working on it as a summer student (he then went on to do his PhD on the experiment and is now Dr. Gorm!)

Today I’ve been mostly staying in the house making food, tidying up and setting up my various bits of computer gadgetry (my wifi had gone wonky over Christmas and I needed to set up my wireless print drivers). Fortunately I managed to get it all resolved without too much re-booting.  Otherwise, I recently watched the excellent Band of Brothers series which I picked up from HMV at T5 on my way back to Geneva. It was 10 hours of really amazing television, that actually made me feel excited just to watch it. Can’t recommend it highly enough if you haven’t already seen it! Also my friend Natalie’s dad worked on the production crew – so I saw his name in the credits which was cool.


Welcome to Geneva!

January 4, 2011

I just got back after the Christmas break, so I thought I’d put together a little summary of tips for traveling to Geneva.

 

Tip 1 – Free tickets! When you arrive and are waiting for your baggage, there are two ticket machines in the reclaim hall that give out 80 minute duration free TPG tickets valid for bus and tram. If you want to come to my flat, it’s best to get the bus to Blandonet (where there’s a big Co-Op) and change onto the tram, direction Meyrin Gravier – and stay on till the end of the line (about 10 mins). If you want to go directly to CERN you can pick up the 56 bus here (using the same ticket) and it’s about another 10 minutes. Busses are quite frequent. You can get to central Geneva by taking the tram the other way at Blandonet, which takes about 15 minutes to Cornavin, the main station.

Tip 2 – Fondu! I’ve tried a couple of places for fondu in Geneva. Les Bains du Paquis (ON the lake! Thanks for the recommendation Estel) and Cafe du Soleil, near the UN. Both were excellent and not that expensive. White wine is a good drink to go with it. Make sure you’re not already at your cheese-eating limit before starting.

Tip 3 – Things to do in Geneva? So far I don’t have much to add to this list. My colleagues have told me about a lot of stuff, but I haven’t tried it myself yet. On the prospective list are things like going to an Ice Hockey game in Servette. Something I have done is visit the Patek Philipe Watch museum. It was rather good, with a reasonable explanation of all aspects of watch making, and more luxury watches than you can shake a stick at. However, I did find all the watches they had made since 1960 to be rather similar and boring. It appears that all the innovation in mechanical watchmaking happened between 1700 and 1960. If you are at all interested in watches, or especially if you like jewelry and expensive stuff of that ilk, it’s well worth a visit.

Tip 4 – There is no tip 4 yet!


Follow

Get every new post delivered to your Inbox.