Close
0%
0%

LEDs as photodiodes for 1 kB challenge

Within 1 kB of executable code, a LED matrix can be used as a canvas to draw on and a pair of LEDs can be turned into an optical chat.

Similar projects worth following
Monochrome matrix canvas and Ledcomm for Hackaday 1 kB Challenge by Matthias Koch

Light emitting diodes are fun, and sensing light with LEDs can even increase the joy. Just connect both anode and cathode to GPIO pins. The idea is to reverse charge the junction capacitance, which is subsequently discharged by photocurrent, and wait for the pin state to toggle. The brighter it is, the shorter you'll need to wait.

The idea dates back to Forrest Mims books, and the earliest publication using this idea with a microcontroller seems to be "Very Low-Cost Sensing and Communication Using Bidirectional LEDs". A description of the protocol used by me can be found on http://mecrisp.sourceforge.net/ledcomm.htm

See README in the source package for more description !

Monochrome matrix canvas and Ledcomm for Hackaday 1 kB Challenge by Matthias Koch


Light emitting diodes are fun, and sensing light with LEDs can even increase the joy. Just connect both anode and cathode to GPIO pins. The idea is to reverse charge the junction capacitance, which is subsequently discharged by photocurrent, and wait for the pin state to toggle. The brighter it is, the shorter you'll need to wait.


The idea dates back to Forrest Mims books, and the earliest publication using this idea with a microcontroller seems to be "Very Low-Cost Sensing and Communication Using Bidirectional LEDs". A description of the protocol used by me can be found on http://mecrisp.sourceforge.net/ledcomm.htm


For this Challenge, the rules clearly allow to split the 1 kb of binary over multiple processors, but demonstrating communication without controlling the whole terminal with rendering fonts and scanning keys on our own will always blow the requirements, as any vanilla terminal software will have an overall count of running bytes far beyond imagination. I could argument that I developed a standalone Serial<->Ledcomm bridge, but without a connection on its ports, it is not fulfilling anything really useful other than to test Ledcomm ranges, so therefore I decided to split my contribution to this challenge in two parts:


512 bytes go to a simple yellow 8x8 LED matrix connected to a MSP430G2452 which you can paint on with another LED or laser pointer. This canvas demo nicely shows the effect and clearly fulfills all judging criteria of the challenge. One corner pixel serves to erase the image. Before it starts, it displays a memory dump. As a small easter egg, this binary is a polyglot and will also run on a LM4F120 Stellaris Launchpad (ARM Cortex M4), just doing a bit more than what an embedded "Hello World" should do, displaying a binary counter on the RGB LED.

"Schematic":


MSP430G2452 in 20 pin DIP package
Cathodes of a yellow 8x8 LED matrix directly to Port 1
Anodes of the same 8x8 LED matrix through eight 100 Ohm resistors to Port 2
100 uF and 100 nF capacitors across Vcc and GND
15 kOhm resistor from /Reset to Vcc
Four pin header Vcc, /Reset, Test, GND for flashing
Two pin screw terminal for Vcc and GND


The other 512 bytes are used to implement a Serial<->Ledcomm bridge on a MSP430G2553 on a classic Launchpad, which you can use to chat over a red or yellow LED. Two nodes are necessary, but they will run the same binary. At Reset, it checks the state of the button on the Launchpad, so you can choose between bright and dark mode. At least one node needs to be in bright mode for the link to synchronise. If this half fulfills the requirements of the challenge is at the mercy of the judges: Its own binary is small enough and lets you probe the distances Ledcomm may bridge, giving visual link state information, but to fully make use of this, you need a generic serial terminal emulator. On the other hand, additional functionality available beyond the challenge limits is encouraged. I had no space to implement buffers in software, so you need type slowly enough or set up a character delay in your terminal as the UART has no hardware FIFO to buffer characters while Ledcomm is transmitting.


"Schematic" for one node, you'll need two:


MSP430G2553 in 20 pin DIP package on classic MSP430 Launchpad for terminal and status
Red or yellow LED with anode on P2.0 and cathode on P2.1


Additional memory:


The ROM bootloader section is not used, and for the "matrix paint" oscillator calibrations constants are hardwired, as there is no need for an accurate clock. To get a correct baudrate for the Ledcomm bridge, we need accurate chip specific oscillator calibration constants from info flash segment. To be fair and to compensate for the two extra bytes within the challenge limits, a NOP (which is also 2 bytes long) opcode is inserted after placing the calibration constants into the DCO registers.


Tricks:


* LEDs used as photodiodes
* Both binaries use a second stack for parameter...

Read more »

x-gzip - 9.61 kB - 01/21/2017 at 23:03

Download

JPEG Image - 4.48 MB - 01/04/2017 at 13:49

Preview
Download

Hackaday 1 kb Challenge Matthias Koch.tar.gz

Description, sources and schematics

gzip - 41.49 kB - 01/03/2017 at 18:41

Download

  • 1 × MSP430G2452 Microprocessors, Microcontrollers, DSPs / ARM, RISC-Based Microcontrollers
  • 1 × Yellow 8x8 LED Matrix
  • 8 × 100 Ohms
  • 1 × 1 00nF
  • 1 × 100µF

View all 8 components

  • Prepared for 256 byte Challenge.

    Matthias Koch01/21/2017 at 23:08 0 comments

    Just in case if the next contest will have a lower size limit: I squeezed the Monochrome demo into 256 bytes. Currently exactly 242 ! ARM Polyglot, memory dump and the fish are gone, but the matrix as a shining canvas effect is still there. Enjoy !

View project log

Enjoy this project?

Share

Discussions

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates