Tag: arduino

  • … we stand in line for thee

    A little bit of silliness for Thanksgiving:

    This took almost no time to put together. The “speaker” is a Tim Hortons cup with a cheap piezo glued to the base. What makes the Arduino sing is the Tone Library running its RTTTL demo sketch, with the anthem itself pasted in from a rather old Nokia Ringtones library.

    Update: Here’s the code, such as it is. It’s just the Tone/examples/RTTTL code with the tune data pasted in. I’d been programming Arduino for about a year, so that was a semi-major achievement for me:

    It’s nice to revisit old code and find it was written by a friend, Brett Hagman of Rogue Robotics.

  • Arduino Uno USB invisible to OS X

    as posted on the forum:

    Just got my Uno after finding semi-permanent projects for two previous Duemilanoves. Upgraded to Arduino 0020. After rebooting, and power cycling the Uno, there’s still no serial port for the Uno.

    The board is noted under Linux, which reports an unknown device with ID 2341:0001. On my MacBook (10.6.4), System Profiler lists:
    Code:

    Communication Device:
    
      Product ID:	0x0001
      Vendor ID:	0x2341
      Version:	 0.00
      Speed:	Up to 12 Mb/sec
      Location ID:	0x24110000
      Current Available (mA):	500
      Current Required (mA):	Unknown (Device has not been configured) 
    
    

    There are no /dev/tty* or /dev/cu* devices that correspond to the device.

  • much improved HSV colour cycling LED on Arduino

    There were some flaws in the post HSV colour cycling LED on Arduino. This does much more what I wanted:

    /*
    HSV fade/bounce for Arduino - Stewart C. Russell - scruss.com - 2010/09/19
    
    Wiring:
    LED is RGB common cathode (SparkFun sku: COM-09264 or equivalent)
        * Digital pin  9 → 165Ω resistor → LED Red pin
        * Digital pin 10 → 100Ω resistor → LED Green pin
        * Digital pin 11 → 100Ω resistor → LED Blue pin
        * GND → LED common cathode.
    */
    
    #define RED                9 // pin for red LED; green on RED+1 pin, blue on RED+2 pin
    #define DELAY              2
    
    long rgb[3];
    long rgbval, k;
    float hsv[3] = {
      0.0, 0.5, 0.5
    };
    float hsv_min[3] = {
      0.0, 0.0, 0.4 // keep V term greater than 0 for smoothness
    };
    float hsv_max[3] = {
      6.0, 1.0, 1.0
    };
    float hsv_delta[3] = {
      0.0005, 0.00013, 0.00011
    };
    
    /*
    chosen LED SparkFun sku: COM-09264
     has Max Luminosity (RGB): (2800, 6500, 1200)mcd
     so we normalize them all to 1200 mcd -
     R  1200/2800  =  0.428571428571429   =   109/256
     G  1200/6500  =  0.184615384615385   =    47/256
     B  1200/1200  =  1.0                 =   256/256
     */
    long bright[3] = {
      109, 47, 256
    };
    
    void setup () {
      randomSeed(analogRead(4));
      for (k=0; k<3; k++) {
        pinMode(RED + k, OUTPUT);
        rgb[k]=0; // start with the LED off
        analogWrite(RED + k, rgb[k] * bright[k]/256);
        if (k>1 && random(100) > 50) {
          // randomly twiddle direction of saturation and value increment on startup
          hsv_delta[k] *= -1.0;
        }
      }
    }
    
    void loop() {
      for (k=0; k<3; k++) { // for all three HSV values
        hsv[k] += hsv_delta[k];
        if (k<1) { // hue sweeps simply upwards
          if (hsv[k] > hsv_max[k]) {
            hsv[k]=hsv_min[k];
          }    
        }
        else { // saturation or value bounce around
          if (hsv[k] > hsv_max[k] || hsv[k] < hsv_min[k]) {
            hsv_delta[k] *= -1.0;
            hsv[k] += hsv_delta[k];
          }
        }
        hsv[k] = constrain(hsv[k], hsv_min[k], hsv_max[k]); // keep values in range
      }
    
      rgbval=HSV_to_RGB(hsv[0], hsv[1], hsv[2]);
      rgb[0] = (rgbval & 0x00FF0000) >> 16; // there must be better ways
      rgb[1] = (rgbval & 0x0000FF00) >> 8;
      rgb[2] = rgbval & 0x000000FF;
    
      for (k=0; k<3; k++) { // for all three RGB values
        analogWrite(RED + k, rgb[k] * bright[k]/256);
      }
      delay(DELAY);
    }
    
    long HSV_to_RGB( float h, float s, float v ) {
      /*
         modified from Alvy Ray Smith's site:
       http://www.alvyray.com/Papers/hsv2rgb.htm
       H is given on [0, 6]. S and V are given on [0, 1].
       RGB is returned as a 24-bit long #rrggbb
       */
      int i;
      float m, n, f;
    
      // not very elegant way of dealing with out of range: return black
      if ((s<0.0) || (s>1.0) || (v<0.0) || (v>1.0)) {
        return 0L;
      }
    
      if ((h < 0.0) || (h > 6.0)) {
        return long( v * 255 ) + long( v * 255 ) * 256 + long( v * 255 ) * 65536;
      }
      i = floor(h);
      f = h - i;
      if ( !(i&1) ) {
        f = 1 - f; // if i is even
      }
      m = v * (1 - s);
      n = v * (1 - s * f);
      switch (i) {
      case 6:
      case 0: // RETURN_RGB(v, n, m)
        return long(v * 255 ) * 65536 + long( n * 255 ) * 256 + long( m * 255);
      case 1: // RETURN_RGB(n, v, m) 
        return long(n * 255 ) * 65536 + long( v * 255 ) * 256 + long( m * 255);
      case 2:  // RETURN_RGB(m, v, n)
        return long(m * 255 ) * 65536 + long( v * 255 ) * 256 + long( n * 255);
      case 3:  // RETURN_RGB(m, n, v)
        return long(m * 255 ) * 65536 + long( n * 255 ) * 256 + long( v * 255);
      case 4:  // RETURN_RGB(n, m, v)
        return long(n * 255 ) * 65536 + long( m * 255 ) * 256 + long( v * 255);
      case 5:  // RETURN_RGB(v, m, n)
        return long(v * 255 ) * 65536 + long( m * 255 ) * 256 + long( n * 255);
      }
    } 
    
  • my little nerd whiskers are quivering

    I notice that TheSource.ca has the BlueLine PowerCost Monitor at a good price. I also notice that the PowerCost uses 433MHz wireless, for which you can get a 433MHz Receiver Shield for Arduino. People have used this to receive data from home weather stations.

    It’s just a smop before I have my own network-connected meter now …

  • HSV colour cycling LED on Arduino

    Pretty much everyone tries the RGB colour cycler when they get their first Arduino. This variant cycles through the HSV colour wheel, though at fixed saturations and values.

    Code:

    // HSV fade/bounce for Arduino - scruss.com - 2010/09/12
    // Note that there's some legacy code left in here which seems to do nothing
    // but should do no harm ...
    
    // don't futz with these, illicit sums later
    #define RED       9 // pin for red LED
    #define GREEN    10 // pin for green - never explicitly referenced
    #define BLUE     11 // pin for blue - never explicitly referenced
    #define SIZE    255
    #define DELAY    10
    #define HUE_MAX  6.0
    #define HUE_DELTA 0.01
    
    long deltas[3] = {
      5, 6, 7 };
    long rgb[3];
    long rgbval;
    // for reasons unknown, if value !=0, the LED doesn't light. Hmm ...
    // and saturation seems to be inverted
    float hue=0.0, saturation=1.0, value=1.0;
    
    /*
    chosen LED SparkFun sku: COM-09264
     has Max Luminosity (RGB): (2800, 6500, 1200)mcd
     so we normalize them all to 1200 mcd -
     R  1200/2800  =  0.428571428571429   =   109/256
     G  1200/6500  =  0.184615384615385   =    47/256
     B  1200/1200  =  1.0                 =   256/256
     */
    long bright[3] = {
      109, 47, 256};
    
    long k, temp_value;
    
    void setup () {
      randomSeed(analogRead(4));
      for (k=0; k<3; k++) {
        pinMode(RED + k, OUTPUT);
        rgb[k]=0;
        analogWrite(RED + k, rgb[k] * bright[k]/256);
        if (random(100) > 50) {
          deltas[k] = -1 * deltas[k]; // randomize direction
        }
      }
    }
    
    void loop() {
      hue += HUE_DELTA;
      if (hue > HUE_MAX) {
        hue=0.0;
      }
      rgbval=HSV_to_RGB(hue, saturation, value);
      rgb[0] = (rgbval & 0x00FF0000) >> 16; // there must be better ways
      rgb[1] = (rgbval & 0x0000FF00) >> 8;
      rgb[2] = rgbval & 0x000000FF;
      for (k=0; k<3; k++) { // for all three colours
        analogWrite(RED + k, rgb[k] * bright[k]/256);
      }
      delay(DELAY);
    }
    
    long HSV_to_RGB( float h, float s, float v ) {
      /* modified from Alvy Ray Smith's site: http://www.alvyray.com/Papers/hsv2rgb.htm */
      // H is given on [0, 6]. S and V are given on [0, 1].
      // RGB is returned as a 24-bit long #rrggbb
      int i;
      float m, n, f;
    
      // not very elegant way of dealing with out of range: return black
      if ((s<0.0) || (s>1.0) || (v<0.0) || (v>1.0)) {
        return 0L;
      }
    
      if ((h < 0.0) || (h > 6.0)) {
        return long( v * 255 ) + long( v * 255 ) * 256 + long( v * 255 ) * 65536;
      }
      i = floor(h);
      f = h - i;
      if ( !(i&1) ) {
        f = 1 - f; // if i is even
      }
      m = v * (1 - s);
      n = v * (1 - s * f);
      switch (i) {
      case 6:
      case 0:
        return long(v * 255 ) * 65536 + long( n * 255 ) * 256 + long( m * 255);
      case 1:
        return long(n * 255 ) * 65536 + long( v * 255 ) * 256 + long( m * 255);
      case 2:
        return long(m * 255 ) * 65536 + long( v * 255 ) * 256 + long( n * 255);
      case 3:
        return long(m * 255 ) * 65536 + long( n * 255 ) * 256 + long( v * 255);
      case 4:
        return long(n * 255 ) * 65536 + long( m * 255 ) * 256 + long( v * 255);
      case 5:
        return long(v * 255 ) * 65536 + long( m * 255 ) * 256 + long( n * 255);
      }
    }
    

    The circuit is very simple:

    • Digital pin 9 → 165Ω resistor → LED Red pin
    • Digital pin 10 → 100Ω resistor → LED Green pin
    • Digital pin 11 → 100Ω resistor → LED Blue pin
    • GND → LED common cathode.

    The different resistor values are to provide a limited current to the Triple Output LED RGB – Diffused, as each channel has different requirements. The 165Ω resistor is actually two 330Ω in parallel; I didn’t have the right value, and this was the closest I could make with what I had.