Author: scruss

  • Ever heard the term “Appropriate Use of Technology”?

    Well, this is not that: For He’s a Jolly Good Fellow [mp3], as played on this:

    — an Arduino driving a stepper motor driving a Sankyo musical box. And yes, heat-shrink tubing ‘reinforced’ with dental floss doesn’t make a very robust flexible coupling.

  • Potentially handy Raspberry Pi power source

    This looks handy; it’s the Globe Electric 2-Outlet Tap with Surge Protection and 2 USB Chargers (#46082). The USB outlets are rated at 1A. It was $12 at Loblaws. I’ll let you know how it works out for powering the Raspberry Pi.

    Update: Yes! It works!

  • python + Arduino + Tk: Toggling an LED

    Whoa! This is so old I don’t even know where to start!

    • It’s using Python 2, so if it works at all it probably won’t for much longer, and Tkinter is something completely different under Python 3
      (grrreat planning there, Python guys …)
    • pyfirmata is likely ancient history too.

    Phil sent me a note last week asking how to turn an LED on or off using Python talking through Firmata to an Arduino. This was harder than it looked.

    It turns out the hard part is getting the value from the Tkinter Checkbutton itself. It seems that some widgets don’t return values directly, so you must read the widget’s value with a get() method. This appears to work:

    #!/usr/bin/python
    # turn an LED on/off with a Tk Checkbutton - scruss 2012/11/13
    # Connection:
    # - small LED connected from D3, through a resistor, to GND
    
    import pyfirmata
    from Tkinter import *
    
    # Create a new board, specifying serial port
    # board = pyfirmata.Arduino('/dev/ttyACM0') # Raspberry Pi
    board = pyfirmata.Arduino('/dev/tty.usbmodem411') # Mac
    
    root = Tk()
    var = BooleanVar()
    
    # set up pins
    pin3 = board.get_pin('d:3:o') # D3 On/Off Output (LED)
    
    def set_led():  # set LED on/off
        ledval = var.get()
        print "Toggled", ledval
        pin3.write(ledval)
    
    # now set up GUI
    b = Checkbutton(root, text = "LED", command = set_led,
                    variable = var)
    b.pack(anchor = CENTER)
    
    root.mainloop()
    

    This is explained quite well here: Tkinter Checkbutton doesn’t change my variable – Stack Overflow. I also learnt a couple of things about my previous programs:

    • You don’t really need to set up an Iterator unless you’re reading analogue inputs
    • My “clever” cleanup-on-exit code actually made the script hang on Mac OS.
  • No … just no.

    No … just no.

    Instagram filter used: Lo-fi

    Photo taken at: Ellis Parking Structure-University of Chicago

    View in Instagram ⇒

  • A Manz Building.

    A Manz Building.

    Instagram filter used: 1977

    View in Instagram ⇒

  • Bloody el!

    Bloody el!

    Instagram filter used: Earlybird

    View in Instagram ⇒

  • Deagan

    Deagan

    Instagram filter used: Nashville

    View in Instagram ⇒

  • My American Science & Surplus haul

    american
    I went to American Science and Surplus yesterday, and picked up:

    • a pair of cross lock tweezers
    • a small 12V stepper motor
    • two P-38 can openers
    • a musical box mechanism that plays “For He’s a Jolly Good Fellow“.
  • Metal owl.

    Metal owl.

    Instagram filter used: Lo-fi

    Photo taken at: Old Town School of Folk Music

    View in Instagram ⇒

  • Old Town

    Old Town

    Instagram filter used: Lo-fi

    Photo taken at: Old Town School of Folk Music

    View in Instagram ⇒

  • Meats of the world

    Meats of the world

    Instagram filter used: Sierra

    Photo taken at: Smoque BBQ

    View in Instagram ⇒

  • Pwned by King James V

    The Earl of Northumberland had dismissed as mere bragging the expressed intention of the Scottish government to try to do something about the Liddesdale robbers. Like Sim the Laird, he believed the Armstrongs were far too powerful for King James. But he was wrong. The young king had undertaken to “proceed to the sharpe and rygorouse pwnyssching of all transgressioune apone the bordouris”, and he now went to work, beginning with a gentle approach.

    —  from The Steel Bonnets, by George MacDonald Fraser, chapter 27.

    Yes, the Scots. We may have been the bunk at spelling, but we’ve been pwning since 1529.

  • Power Cost Monitor signals — for reals!

    After doing almost nothing with the Arduino and the elusive Power Cost Monitor signal, I’m finally getting something from it. Matt Colyer’s Power Monitor sketch does all the heavy lifting, for he managed to reverse engineer the protocol. His solution is a rather complex one, involving ethernet shields and Ruby. All I wanted was a simple serial logger, so I cut down Matt’s code, and modified the network output to simple print statements:

    == Waiting (38464857ms, 1676 bytes) ==
    == Sending (38467858ms, 1668 bytes) ==
    sample[data]=0000000a
    sample[data]=0000015a
    == Waiting (38467863ms, 1676 bytes) ==
    == Received (38592156ms, 1670 bytes) ==
    == Waiting (38592157ms, 1676 bytes) ==
    == Sending (38595158ms, 1668 bytes) ==
    sample[data]=00000000
    == Waiting (38595159ms, 1676 bytes) ==
    == Received (38624334ms, 1670 bytes) ==
    == Waiting (38624335ms, 1676 bytes) ==
    == Sending (38627336ms, 1668 bytes) ==
    sample[data]=ffffe746
    == Waiting (38627337ms, 1676 bytes) ==
    == Received (38688007ms, 1670 bytes) ==
    == Waiting (38688009ms, 1676 bytes) ==
    == Received (38688045ms, 1670 bytes) ==
    == Waiting (38688046ms, 1676 bytes) ==
    == Sending (38691047ms, 1668 bytes) ==
    sample[data]=00001748
    sample[data]=00000008
    == Waiting (38691052ms, 1676 bytes) ==
    == Received (38720026ms, 1670 bytes) ==
    == Waiting (38720027ms, 1676 bytes) ==
    == Sending (38723028ms, 1668 bytes) ==
    sample[data]=00000000
    == Waiting (38723030ms, 1676 bytes) ==
    == Received (38783686ms, 1670 bytes) ==
    == Waiting (38783687ms, 1676 bytes) ==
    == Sending (38786688ms, 1668 bytes) ==
    sample[data]=00000011
    == Waiting (38786689ms, 1676 bytes) ==
    == Received (38815636ms, 1670 bytes) ==
    == Waiting (38815637ms, 1676 bytes) ==
    == Sending (38818638ms, 1668 bytes) ==
    sample[data]=fffff322
    == Waiting (38818639ms, 1676 bytes) ==
    == Received (38847547ms, 1670 bytes) ==
    == Waiting (38847548ms, 1676 bytes) ==
    == Sending (38850549ms, 1668 bytes) ==
    sample[data]=00000001
    == Waiting (38850550ms, 1676 bytes) ==
    == Received (38879444ms, 1670 bytes) ==
    == Waiting (38879446ms, 1676 bytes) ==
    == Sending (38882445ms, 1668 bytes) ==
    sample[data]=0000374f
    == Waiting (38882446ms, 1676 bytes) ==
    == Received (38911210ms, 1670 bytes) ==
    == Waiting (38911211ms, 1676 bytes) ==
    == Sending (38914212ms, 1668 bytes) ==
    sample[data]=00000043
    == Waiting (38914213ms, 1676 bytes) ==
    == Received (39006981ms, 1670 bytes) ==
    == Waiting (39006982ms, 1676 bytes) ==
    == Sending (39009982ms, 1668 bytes) ==
    sample[data]=00000000
    == Waiting (39009983ms, 1676 bytes) ==
    == Received (39038895ms, 1670 bytes) ==
    == Waiting (39038896ms, 1676 bytes) ==
    == Sending (39041897ms, 1668 bytes) ==
    sample[data]=00000001
    == Waiting (39041898ms, 1676 bytes) ==
    == Received (39102999ms, 1670 bytes) ==
    == Waiting (39103000ms, 1676 bytes) ==
    == Sending (39106001ms, 1668 bytes) ==
    sample[data]=00000000
    == Waiting (39106002ms, 1676 bytes) ==
    == Received (39134880ms, 1670 bytes) ==
    == Waiting (39134881ms, 1676 bytes) ==
    == Sending (39137882ms, 1668 bytes) ==
    sample[data]=00000001
    == Waiting (39137883ms, 1676 bytes) ==

    Now it’s just a small matter of programming to work out what Matt’s Ruby code does. Ruby always looks to me like two programmers started coding at different ends of the same line, and collided in the middle. I’m hoping there’s enough processing power in the Arduino to do the conversion in the chip, and output useful log data as a serial stream.

    More later …

     

     

  • pretty-printing Arduino sketches

    I don’t often need it, but the code printing facility in the Arduino IDE is very weak. It has some colour highlighting, but no page numbering, no line numbering, and no headers at all.

    a2ps will sort you right out here. Years back, it was a simple text to PostScript filter, but now it has many wonderful filters for pretty-printing code. The Wiring/Arduino language is basically C++, and a2ps knows how to deal with that. So, to create a PostScript file with a nice version of the the most basic Blink sketch:

    a2ps --pro=color -C -1 -M letter -g --pretty-print='c++' -o ~/Desktop/Blink.ps Blink.ino

    If you’re somewhere that uses sensible paper sizes (in other words, not North America), you probably don’t want the -M letter option. a2ps is supposed to have a PDF print option (-P pdf), but it doesn’t work on my installation, so I just splat the output through ps2pdf. You can’t use the -P «printer» option combined with the -o «file» option, but cups-pdf is your friend if you need to print to a PDF. The results are linked below:

    Not bad, eh?

    (Update: think I must have written this post on a Mac with a case-insensitive filesystem. Using the --pretty-print='C++' option I had before failed on Linux.)