Richard Parker's blog

Internet Explorer banned from European version of Windows 7

Posted in News, Technology by Richard on June 12, 2009

“European buyers of Windows 7 will have to download and install a web browser for themselves,” according to this BBC News article, published today. “Bowing to European competition rules, Microsoft Windows 7 will ship without Internet Explorer”. Internet Explorer 8

This, it would seem, is another victory for the European Commission and it’s competition rules. Microsoft has previously fallen foul of these in early 2008 when it was fined £765m by the European Commission for ‘anti-competitive behavior’: including Windows Media Player and Internet Explorer with Windows. Understandably then, it has decided to avoid that kind of financial pain again by bowing to the pressure.

Why?

Why does it matter what Microsoft choose to ship with Windows? It’s not like I have to pay for Internet Explorer, or any other browser by any other vendor, for that matter. So I, the consumer, am not losing out by it’s inclusion in the operating system.

Internet Explorer, like Windows Media Player, are features designed to make the operating system better, easier to use and increase the overall value of the product. Browsers should be features of every operating system.

Every major consumer-targeted operating system has it’s own browser included. Let’s take Apple’s Mac OS, for example: that ships with the Safari browser. Safari and IE browsers do essentially the same thing, and they are distributed to the consumer in exactly the same fashion: automatic inclusion by the vendor on to the newly purchased computer. Yet, Apple aren’t the target (so far as I know) of the EC competition rulings because they aren’t the market leader.

To impose this type of ruling on Microsoft because they are the market leader seems very similar to saying that Microsoft are the market leader because of Internet Explorer, which isn’t true at all. So surely, if you’re going to impose this type of rule on any vendor then surely you must apply it to all of them: that’s really the only way to give consumers a free, fair choice, right?

What’s the difference?

I assume that the EC are interested so much in Microsoft’s activities because it holds the majority market share. So too, then, I would assume it to be equally interested in Nokia, who according to this article, held 40.43% of the Mobile Device market share in Q12009, making them the market leader. Are Nokia the subject of an EC competition rules enquiry for bundling their own software with their device?

I can’t see much practical difference either, between companies like Dell and HP, who pre-bundle their own proprietary software programs and utilities onto the PC’s they ship, and this, either. Perhaps the EC will go after these companies under their ‘anti-competition’ rules, too.

Ultimately, it comes down to education

Eight or 9 times in 10, most users don’t care what browser they’re using: at least in my experience. Most consumers just want something that works. They don’t care what it is, why should they? I certainly don’t get all shirty when my new car comes with Michelin tyres, or Goodyear, or – who cares… they do the job.

But my point is, if I do want something different, I’m free to change those tyres. Perhaps I’ll read that Pirelli tyres are better than my Goodyears, and I’ll change them. Just as I can change my browser, any time I want to. And I don’t need the EC to make that happen for me because Microsoft haven’t prevented me from using Firefox, or any other browser, for that matter. And that’s the point: this is about education. Those who know enough to understand why they might want another browser, and can make a comparative choice, are completely free to do so, and (if I do say so myself) it is ridiculously easy to swap to an alternative.

I can’t say the same about the tyres on my car though (the ones I’ll have to pay a hefty cost to change). Thankfully, swapping my browser is free and easy. And that’s another reason why these confusing rules make me, well, confused.

It’s all down hill from here…

Now, when Windows 7 ships in Europe, what on earth will the majority of consumers do? What will Microsoft do, in order to help users make the choice that’s right for them? Will consumers see a choice of browsers pop up on their screen? How will they choose? Why should they have to choose? Does Mr And Mrs Average really care? Please comment!

#CompetitionCommissionFail?

Using Windows Live Writer with WordPress

Posted in Technology by Richard on June 7, 2009

Windows Live Writer is a new, free software program provided by Microsoft. The caption on the download site says: “Writer makes it easy to share your photos and videos on almost any blog service—Windows Live, WordPress, Blogger, LiveJournal, TypePad, and many more”.

“Splendid,” I thought. I’ve wanted to try Writer out, and I needed to write a new blog post as I haven’t been as faithful to my blog the past month as I’d have liked to have been. Also, as much as I like the web-based revolution, I don’t particularly find WordPress.com’s online article editor very good for much else other than writing plain-text. Inserting and uploading media is a bit of a chore, but as I found out, Writer makes that rather easy.

Without further ado, I’ll run you through the setup process here, and comment on my experiences as I go. For added authenticity, I’ll actually be writing this blog post using Live Writer. So, fingers crossed – the proof (should be) in the pudding.

Installation

Installation is straightforward, simple and easy. The Windows Live downloader includes the option to include other products within the Live suite too, including Windows Live Messenger and Movie Maker Beta.

Setup

When you run the program for the firs time, you’re asked which blogging service you use:

image

You then need to fill out a few other details:

image

And, that really is about all you need to do. Once you’ve done this, Live Writer connects to your blog, configures itself (correctly) and even downloads your blog’s CSS styles and gives you a live preview as you type.  So far, so good.

The Editor

As soon as you startup after configuring your blog account, you’ll see the new editor window. It’s blank, waiting for you to write your next masterpiece:

image

Of particular interest here are the “Insert” links on the right-hand side of the screen:

image

I’ve always found the WordPress.com web editor a bit, well, clumsy. It’s clear (for sure), it’s just fiddly if you want to do anything that write text. Uploading pictures is a bit of a pain. Using Writer, I’ve simply been taking screenshots and pasting directly in to the editor window.

Rich Media Integration

Writer boasts the ability to publish your videos directly to the MSN Soapbox service, or to YouTube and then embed those videos directly into your blog. This is a really nice feature, and to test if it works, I’m going to insert a sample video here:

 

EDIT: As you can see, WordPress.com doesn’t seem to like the player code generated via Windows Live Writer. I’ll write to them, and ask why – and if I get a response, I’ll post it here. Shame!

Clicking on the “Video” link under “Insert” menu:

I chose “Soapbox” (as this is a service I have never used). Thankfully, there’s no registration forms to fill out. I just enter my Windows Live ID and create a ‘nickname’ for my Soapbox account:

image

… And that’s it. You’re then returned to the Live Writer editor and you can see your video uploading right in-place on your blog. Quite handy actually, because it meant I could carry on writing my article while the upload took place in the background.

image

After about 15 minutes, my video had uploaded and Soapbox had finished processing my video. The “uploading video” screen above is now replaced with:

image

Absolutely fantastic, so far then. So, let’s recap:

  • I’ve uploaded a video to a service I’ve never used
  • I didn’t have to prepare my video, I just found one and selected it
  • I could carry on writing my article while uploading in the background, with the video placeholder in-line
  • The video was uploaded and transcoded in around 15 minutes.

Very impressive. All I need now is some hyperlinks.

Hyperlinking

Ok, I’ve been building web pages since I was about 12. Hyperlinks are easy, right? Of course they are. But tell that to the WordPress.com editor. Linking to my previous posts has always been a pain because it doesn’t let me browse through them and pick them when creating a new link. I have to get my previous article URL and then cut and paste (somebody, please correct me if I’m wrong here – I really hope I’ve just missed this feature). Live Writer, though, does a great job:

image

Choosing “Previous post” then pops up the following:

image

Another awesome little helper-feature. Job done. Hyperlinks inserted. And I’m still in my nice WYSIWYG editor.

Summary

So, to finish up then, how would I summarise my experience using Windows Live Writer?

In a word, “brilliant”. In four words: “you should use it”.

It’s free, it’s very well built (as you’d expect), and it has a very polished interface. Microsoft have done a fantastic job here.

Arduinometer, anyone?

Posted in Arduino, Projects by Richard on April 27, 2009

On Sunday, I published an article showing how I’d built an Arduino-powered ethernet gas meter, to publish real-time gas meter readings to Pachube. Thanks to James Taylor (http://twitter.com/jtonline) who re-tweeted my initial tweet highlighting it as potentially of interest to the #homecamp folks, within a few hours some 200 people had read the article, and I’ve received some great feedback and inclusion on several sites on the web. Not bad for my first article of this kind, I thought!

I’ve been thinking that I should really extend this little venture into a project that adds support for:

  • Tracking electricity, gas and water meter values (all from the same Arduino), using cheap sensors
  • Add support for pulse meters, as well as what I’ve dubbed ‘reflective’ meters (not sure of the proper name, but these are the meters with the little reflective discs of metal on one of the dials).

I’ve created a project on Google Code for anyone who’s interested in following (there’s not a lot there just yet, though). I’ve got a busy few weeks ahead, but will do what I can in the interim. It’s look like June will be the first real chance I have to sit down and extend the code. If anyone’s interested in getting involved, or helping out in any way, please get in touch. I’m still fairly new to the world of Arduino and physical computing, so I’m still learning too – all feedback is appreciated!

Tagged with: , , , ,

How to build a web connected gas meter with your Arduino

Posted in Arduino, Projects, Uncategorized by Richard on April 25, 2009

A few months back, I bought a Current Cost electricity meter, hacked that and started pushing the data up to Pachube and displaying real-time electricity usage right here on my blog. But, electricity is only one part of the picture – we also use gas for our heating and hot water systems, and I wanted to track our usage of this too. The catch, of course, is that there doesn’t appear to be a consumer product on the market to do this for me, and I really wanted an excuse to go out and buy an Arduino and start playing with that.

My goal for this project was to hook the gas meter up to Pachube, using EEML as the format:

<eeml xmlns='http://www.eeml.org/xsd/005' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='http://www.eeml.org/xsd/005 http://www.eeml.org/xsd/005/005.xsd'>
<environment>
<location exposure='indoor' domain='physical' disposition='fixed'>
<name>London, United Kingdom</name>
</location>
<data id='0'>
<tag>gas</tag><tag>cubic metres</tag>
<value>2</value>
</data>
<data id='1'>
<tag>temperature</tag><tag>degrees</tag><tag>celsius</tag>
<value>28</value></data>
</environment>
</eeml>

What follows is how I set about using my Arduino, an Ethernet Shield and various other parts in order to build the gas meter!

Introduction

Those of you who have been following my previous blog posts will know that I’ve been working on this for a while, finding a few minutes spare to tinker as and when I can. This post is the promised amalgamation of all those recent posts.

The completed Arduino Ethernet Gas Meter unit

The completed Arduino Ethernet Gas Meter unit

So, this is the completed unit (picture, left). Whilst this isn’t intended as a complete step-by-step tutorial, my aim is to provide enough information to enable somebody else to build one of these.

To keep things nice and neat, I mounted the Arduino, Ethernet- and Proto- shields into a plastic project box from Maplin. I drilled a ventillation hole and added a mini CPU fan connected to a temperature sensor to help keep the unit cool. I also wanted to add one because it’s nice to tinker around with new sensors and I hadn’t yet played with a temp sensor ;)

How does it work?

The main sensor on this unit is a photo-reflector, which is a fancy name for an infrared LED and an infrared sensor in one assembly. When the infrared sensor detects a reflection from the infrared LED, the strength of that reflection is fed back into the Arduino. I used a pull-up resistor circuit to connect this sensor to a digital input pin, which is switched to LOW when a reflection is detected. Because my gas meter has a little reflective metal disc on one of the dials, this gives me a nice reflection to count when the dial passes.

The Arduino then keeps a tally of all the reflections it has counted, which is accessible in XML (conformant to the EEML standard) over the web via the Ethernet Shield. To keep my meter in synch with the actual gas meter, one can pass a parameter via the HTTP querystring to the gas meter module to set it’s current value (useful, for instance, after a power cut or if you need to disconnect it). Because the unit is accessible over the public internet (without authentication), I only allow the querystring parameter to reset the meter value if a certain digital pin is ‘HIGH’ – a crude (yet effective) kind of physical security.

For fun, I then added a mini-CPU fan connected to a temperature sensor which causes the fan to start up when the temperature inside the unit gets a bit too toasty. It then kicks in until it has successfully dropped the temperature to within the threshold amount. The CPU fan runs off 12v, which the Arduino will happily produce – but it gave me an opportunity to use a transistor to switch the 12V supply on/off based on the state of a digital output pin @ 5 volts.

Contents

  1. Before you begin: finding out if this will this work for you!
  2. Shopping list – what you need to buy and where to get it
  3. Constructing the sensor circuit
  4. The sketch
  5. Connect it all up, fine tune and test
  6. Acknowledgements

Before you begin: check your gas meter

Please note: this project involves mounting sensing equipment in a non-permanent, non-invasive way to your household gas meter, based on my experience and research. I strongly encourage you to check for yourself whether these instructions are suitable for you, and, if so, only to proceed if you feel competent enough to connect this unit safely. This information is provided ‘as is’, and you use it entirely at your own risk.

This kit will only work on certain types of gas meter. Firstly, you must have the odometer-style gas meter (these are the ones with rotary dials with numbers on). Secondly, one of the dials, usually the dial representing a 100th of a Cubic Metre should have a little reflective disk between two of the digits (on mine, that is digit 5 and 6). I’ve no doubt that you could probably modify my design here to work with another type of meter, but you may need to change the photo reflector to either a pulse counter or something else appropriate. The underlying code to count the pulses and make the Arduino web-connectable should be the same.

Shopping list

1 x Arduino Duemillanove (or similar) ….. £23.81
1 x Sparkfun Ethernet Shield … £33.35
1 x 9v DC Power Supply with a 2.1mm centre-positive connector (Maplin: GS74R) … £7.99
1 x 220 ohm resistor
1 x 10K ohm resistor
1 x Transistor (if you plan to add the fan circuit and you use a 12V fan)
1 x Fairchild QRB1134 IR Photoreflector …. £2.62
1 x Project Box (eg. Maplin XYZXYZ) …. £2.99
1 x Mini CPU Fan (eg. Maplin) …. £4.99
1 x Breadboard – OR -
1 x Nuelectronics Protoshield …. £4.99

Total cost to build from scracth: £80.74
Total cost if you already have the Arduino, an ethernet shield and a few other bits and bobs: < £20.

You will also need/want the following tools to hand:

  • Soldering iron and lead-free solder (well, use whatever you like, but lead-free is better for you and the environment!)
  • Wire cutters
  • Some suitable wire/jump leads etc
  • A pair of “helping hands” if you have them

Goals

Before starting out, I had a quick think about the project’s desired behaviors. That way, coding it up would be a little easier because I’d know what I was supposed to be coding :)

Here they are:

  • Connect the photo reflector to a digital input
    • When the input goes LOW, increment a counter
  • Check the current temperature inside the unit
    • When the temperature is above the threshold, turn on the CPU fan.
    • When the temperature falls below the threshold, turn off the CPU fan.
  • Check if a web client is connecting.
    • Read the query string.
    • If the query string value contains “?x=”, change the internal count to the value of x but only when a digital pin is set to HIGH (so web users can’t set it for us!).
    • If the query string does not contain the above element, generate EEML containing the data that we need.

With these points in mind, I started to construct the sensor circuit.

Constructing the sensor circuit and preparing the project box

Ok, so first things first – let’s start by preparing the project box. Drill two holes into the box – one on top, and another on the side (as pictured):

Prepared Project Box

Prepared Project Box

It doesn’t really matter what size you make the hole on the side providing that there is sufficient room to fit a power cable, ethernet cable and the 4 wires from the photoreflector through. The hole on top should be just a shade smaller than the size of the fan that you have so that you can mount it to the inside of the case properly.

Next up, we’re going to construct the sensor circuit board. You can use either a breadboard, or – as I have used – an unassembled protoshield board from nuelectronics. I have used Fritzing to create a diagram of the entire circuit (shown below). I’ve also produced a schematic to accompany the diagram. I’m not quite sure how correct it is though, so be warned! (Corrections on a post-card, please!).

A tidier view of the wiring

A tidier view of the wiring

Schematic

Schematic

Start by soldering two wires – one each to the 5V rail and the GND rail respectively. Next, solder the resistors, transistor and temperature sensor onto the board, according to the schematic shown. Take care when soldering the transistor and temperature sensor to the board: the heat from your soldering iron may damage them.

Next, pass the bare sensor wires through the outside hole that you drilled and then solder them onto the board in the posistions shown. Make sure you use enough wire – you’ll want about 11-13cm for each connection you make (you can trim the non-soldered ends later).  Finally, solder the positive and ground wires for the CPU fan onto your board.

If you’re new to soldering (as I am), then do take extra care that your connections are good and don’t bridge multiple points on the board. If you do, you’ll likely create a short circuit and that will drive you nuts, trust me! When you’re done, you should end up with something that looks a bit like this:

The finished sensor circuit

The finished sensor circuit

The sketch

Now that you’ve done the hard part, here comes the copy and paste! Take the sketch below and place it into your Arduino suite. You’ll need to modify the following:

  • Line 13: Set your own unique MAC address
  • Line 14: Set your own unique IP address (accessible from computers on your network)
  • Line 15: Set your router’s gateway address
#include "Ethernet2.h"
#include "WString.h"
#include "stdio.h"

// --- [ Pin setup ] ---
int sensorPin = 5;
int ledPin = 9;
int fanPin = 7;
int tempPin = 3;
int unlockPin = 8;

// --- [ Ethernet setup ] ---
static uint8_t mac[6] = { 0x02, 0xAA, 0xAA, 0xCC, 0x00, 0x22 };
static uint8_t ip[4] = { 192, 168, 1, 99 };
static uint8_t gateway[4] = { 192, 168, 1, 2 };
int serverPort = 80;

String url = String(25);
int maxLength=25;

// --- [ Variables to control when the unit fan kicks in/cuts out... ] ---
float maxTemp = 26.0;
float minTemp = 24.0;

// --- [ Variables to store our sensor values ] ---
volatile int totalTicks = 0;
float tempc = 0.0;
int maxi = -100, mini = 100;

// --- [ Misc. vars ] ---
float inputVolts = 5.01;
int previousState = -2;
int delayMs = 1500;
int i;
boolean lock;

Server server(serverPort);

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(fanPin, OUTPUT);
  pinMode(sensorPin, INPUT);
  pinMode(unlockPin, INPUT);
  previousState = digitalRead(sensorPin);
  Serial.begin(115200);                                   // Use serial for debugging locally...
  Serial.println("Ardugas server saying: Howdy!");
  Ethernet.begin(mac, ip, gateway);
  server.begin();
}

void loop() {
  checkUnitTemp();                                      // Take action based on unit temp
  checkSensor();                                        // Check the gas meter sensor
  getCurrentTemperature();                              // Get the unit temperature
  listenWeb();                                          // Handle any web connections
  digitalWrite(ledPin, !digitalRead(sensorPin));        // Light LED if sensor is LOW
}

// Serve pachube EEML and accept a querystring param to set the current value
void listenWeb() {   

 boolean read_url = true;
 boolean unlock = false;

 Client client = server.available();
  if (client) {

    Serial.println("Ethernet client connected...");

    // an http request ends with a blank line
    boolean current_line_is_blank = true;
    int valuesChanged = 0;
    while (client.connected()) {

      if (client.available()) {

        char c = client.read();
          if (url.length() < maxLength) {
            url.append(c);
          }
        if (c == '\n' && current_line_is_blank) {

           // send a standard http response header, but change the response type to text/xml
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/xml");
          client.println();

          // This is our unlock pin. When set to high, we allow the querystring parameter 'x' to force-set our meter value.
          if (digitalRead(unlockPin) == HIGH) {
            unlock = true;
          }

          if (url.contains("x") && unlock) {
            Serial.println(url);
            String v = String(10);
            int startIndex = url.indexOf('=')+1;
            int stopIndex = url.indexOf('H');
            v = url.substring(startIndex, stopIndex);
            Serial.println(v);
            totalTicks = atoi(v);
          } 

          int t = tempc;

          // EEML
          client.println("");
          client.println("");

          client.println("");
          client.println("Ardugas Server");
          client.println("");

          // Gas Meter Reading
          client.println("");
          client.println("gascubic metres");
          client.print("");
          client.print(totalTicks);
          client.println("");
          client.println("");

          client.println("");
          client.println("temperaturedegreescelsius");
          client.print("");
          client.print(t);
          client.print("");
          client.println("");         

          client.println("");
          client.println("");

          client.println(); 

          break;

        }

        if (c == '\n') {
          // we're starting a new line
          current_line_is_blank = true;
        } else if (c != '\r') {
          // we've gotten a character on the current line
          current_line_is_blank = false;
        }

      }
    }
    // give the web browser time to receive the data
    url = "";
    delay(5);
    client.stop();
  } 

}

// Switch the cooling fan on if it's too hot!
void checkUnitTemp() {
 if (tempc >= maxTemp) {
   digitalWrite(fanPin, HIGH);
 }
 if (tempc  maxi) {maxi = tempc;} // record max temperature
  if(tempc < mini) {mini = tempc;} // record min temperature
}

// Count sensor values
void checkSensor() {
  int currentState = digitalRead(sensorPin);
  if (currentState == LOW && previousState == HIGH) {
    if (!lock) {
      lock = true;
      delay(delayMs);
      totalTicks++;
    }
  }
  if (currentState == HIGH && previousState == LOW) {
    lock = false;
  }
  previousState = currentState;
}

Attach the Ethernet Shield to your Arduino, attach your sensor circuit, upload the sketch and then test it out according to the behaviours mapped out above. For testing, I used a a square of foil and passed it under the sensor. This should cause the sensor pin to swith to LOW, and increment the counter by one. To test if your cooling fan circuit is working, change the threshold values in the sketch above.

Connect it all up, fine tune and test

Now for the exciting bit… it’s time to connect it up to your gas meter. Now, my gas meter was really quite awkward because there is a curved plastic bezel cover over the meter dials, which made it had to find the best point to get a reflection. That is, in the end, why I opted for a very sturdy and reliable ‘blu-tac’ mount! I think I’ll definitely replace that with a bracket at some point in the futre though.

 [Photo to follow shortly]

Now, connect up your circuit. Make sure you’ve got your test LED inserted into the ledPin you defined in the sketch. This will light up when your sensor detects a reflection. At this point it would be good if you have someone to help you by turning your hot water on/off, or, turn your gas hob or heating on for the duration of the setup. The object here is to have the dial start to turn so that you can find the best position for your sensor. Begin by holding the photoreflector just over the dial with the reflective disc. Wait for it to turn one revolution. The LED should light when the sensor detects a reflection – so make sure that it only lights up when the dial is directly underneath it. As the disc approaches the sensor, there is a period of ‘noisy reflection’ that my sketch accounts for by forcing a delay after the first detection. This prevents artifical inflation of the meter count.

Once you’ve found the ideal position, firmly fix it in place – I used blu tac quite successfully but you can use whatever you need to, providing it doesn’t pierce or physically interfere with the meter in any way. Now that it’s attached, you need to program your arduino with your current gas meter value.  To enable this, you must first connect a jumper lead from 5V to resetPin. Then, browse to the IP address you set, but add the querystring value ‘x=[your meter reading]‘. For example, to set a meter reading of 894.121, and your IP address is 192.168.1.99, your URL would look like: http://192.168.1.99/?x=894121.

So, that’s it! I’ve been sitting on this article for about a week now, but due to work and other commitments I’ve not really had as much time as I’d have liked to work on it – so I thought I’d just get it out there and take as much feedback as possible from my readers to help improve it.

I hope you enjoyed reading and that you can derive some use from this.

Thanks!