Switchy

Ruby Application to switch AC loads (e.g. turn a lamp on and off).

Example

Command-line App

TODO: This documentation is prescriptive, not descriptive. Update this when it’s finally implemented.

$ switchy 1 status
Light 1 is: OFF
$ switchy 1 on
Light 1 switched on.
$ switchy 1 status
Light 1 is: ON
$ switchy 1 off
Light 1 switched off.
$ switchy 1 on
Light 1 switched on.

Ruby Library

TODO: This documentation is prescriptive, not descriptive. Update this when it’s finally implemented.

# Direct Access to individual lights
# ----------------------------------------
# Light 1 starts out off. 
s = Switchy.new
s.light1
# => false # light 1 is off
s.light1 = true
# => false # previous state returned; light1 was off, now on
s.light1
# => true
s.light1 = false
# => true # previous state again; light1 was on, now off

# Access to lights array
# ----------------------------------------
s.lights
# => [false, false, false, false, false, false]
s.lights[2]
# => false
s.lights[2] = true
# => false 
s.lights[2]
# => true
s.lights[2] = false
# => true
s.lights[2]
# => false

The Hardware

TODO: Write me!

  • This application

  • Ruby serialport gem

  • Teensy development board / Atmel AVR at90usb162

  • usb_serial driver for Teensy

  • switching circuit

  • modified power strip

USB Serial Driver

Teensy USB Serial Example, Simple Pin Control Shell

Example Commands
  B0?   Read Port B, pin 0
  C2=0  Write Port C, pin 1 LOW
  D6=1  Write Port D, pin 6 HIGH  (D6 is LED pin)

>

TODO

  • Circuit default lights at boot should light onboard LED and no other outputs.

  • Add blink feature to usb protocol. NOTE: This will entail setting up a flasher register and timing/counters. For starters, just set it to blink a hard-coded rate when “2” is sent, e.g “switchy 1 2” would blink light 1 at some rate. Later we can attach different blink rates and/or patterns to other numbers. For example, 3 might blink at the same rate as 2 but out of phase, so “switchy 1 2 2 3” would oscillate lights 1 and 2.

  • There’s an enable line on the 74ls244 driver chip. Use it. Device should boot disabled. Once everything’s had a chance to settle (10-100ms or so), enable the driver chip.

  • Add circuit schematics to the project.

  • Fork the circuit, make a version with just a little LED light bar and no 120VAC switching. (Trust me. The little LEDs are VERY compelling!)

    • 4-LED Version. Fixed colors on all LEDS.

      • Blue/White LED: Specs are running

      • Green LED: Specs passed!

      • Yellow LED: Specs were Pending!

      • Red LED: Specs failed!

    • 3-LED version. Fixed colors on all LEDS. LEDs blink when specs are running. Version 1: blink green, or all 3, or cycle all 3, LEDs. Version 2: blinking green means running, blinking yellow means running but a pending spec was found, and blinking red means it’s still running but failures have occurred.

      • Blinking: Specs are running.

      • Green LED: Specs passed!

      • Yellow LED: Specs were Pending!

      • Red LED: Specs failed!

    • 1-LED Version. Single RGB LED.

      • Blinking (ooh, or throbbing) Blue/White: Specs running

      • Green: Passed

      • Yellow: Pending

      • Red: Failed

    • 1-LED Version. Single Bi-color. Same as RGB. Will need to oscillate because red/green = orange.

      • Blinking: Running

      • Green: Passed

      • Orange: Pending

      • Red: Failed

  • Expand the switch control logic. Need static on/off, Timers, and blinkers. Note: if the board can handle infinite vs. countdown, then implementing one-shot timers is easy: just set countdown to 1.

    • Static on/off: Sit pin state and forget about it. SET C4 1

    • Blinker: set pin state for n milliseconds, toggle to other state for m milliseconds. Repeat x times. (0 = infinite) TMR C7 1 500 250 10

    • Timer: set pin state for n milliseconds, then toggle it to other state. TMR C6 0 60000 250 1 # alarm timer, flashes C6 once for 250ms after 60s

  • Given the above switch control logic, the ruby app should now be able to programmatically define compound events like:

    • When program starts, turn off siren, green, yellow and red lights.

    • When test runs, turn off siren, yellow and red lights, and blink green light at 2Hz.

    • If a spec is pending and green light is blinking, turn off green link and blink yellow light at 2Hz.

    • If a spec fails and red light is off, turn off green and yellow lights, honk siren for 250ms, and blink red light at 2Hz.

    • When specs all pass, turn on green light for 10 seconds.

    • When specs fail, “blink” siren for 1 second every 60 seconds, turn on red light and leave it on.

    • Blink RGB yellow by seting Red and Green to blink. (Need to build the system to permit synchronous blink rates.)