Skip to content
Tags

Blinky Flasher sketch for Arduino IDE

by Layne on April 30, 2018

We recently started selling pre-assembled Blinky kits. As part of the manufacturing process, we really want to test out the optical programming process, to ensure that all the parts are working correctly. It would be inconvenient to dedicate a computer just to run the Blinky Programmer webpage to test each kit, so we decided to build a dedicated Blinky Flasher using an Arduino and two LEDs.

Here’s the simple sketch that transmits the pre-loaded data through the two LEDs. The code is also posted to our GitHub repository too.

/* Blinky Flasher
 * This sketch runs on an Arduino or compatible, with two LEDs.
 * It outputs the optical Clock / Data flashes to reprogram a blinky kit.
 *
 * Comment/uncomment one of the bytes[] definitions below to choose between:
 * 1. Original messages loaded into a Blinky Grid kit
 * 2. Original messages loaded into a Blinky POV kit
 * 3. Some other byte stream from the Blinky Programmer webpage:
 *    https://www.wayneandlayne.com/blinky_programmer/?debug
 *    Press 'Go' and then copy/paste the numbers from the `xmit_data` box
 *    into the bytes[] array below.
 *
 * The bytes are flashed-out once at power-up, then it stops until reset.
 * When it's done, the Arduino's built-in LED will start flashing.
 * Press the reset button to reset the Arduino and retransmit.
 *
 * More details about the Blinky message structure, framing, and transmission:
 * https://www.wayneandlayne.com/projects/blinky/design/#message
 *
 * Written by Matthew Beckler and Adam Wolf, for Wayne and Layne, LLC.
 * To the extent possible under law, Wayne and Layne, LLC has waived all
 * copyright and related or neighboring rights to Blinky Flasher.
 * This work is published from: United States.
 * More details: https://creativecommons.org/publicdomain/zero/1.0/
 */

/* Adjust these defines to match your LED connections.
 * This sketch assumes that HIGH output turns on each LED. */
#define PIN_CLOCK 14
#define PIN_DATA 16

/* Adjust this define to change the delay between LED state changes.
 * We've had reliable transmission with this set to 20. */
#define DELAY_MS 20

// The setup function runs once when you press reset or power the board
void setup() {
    // initialize digital pin LED_BUILTIN as an output.
    pinMode(LED_BUILTIN, OUTPUT);

    pinMode(PIN_CLOCK, OUTPUT);
    pinMode(PIN_DATA, OUTPUT);

    digitalWrite(PIN_CLOCK, LOW);
    digitalWrite(PIN_DATA, LOW);


    Serial.begin(9600);
}


// These are not message_data, they are xmit_data (including intel hex record framing)


// grid:
byte bytes[] = {16,0,0,6,8,230,14,170,85,170,85,170,85,170,85,170,85,170,85,170,74,16,0,16,6,85,10,11,17,14,21,21,24,41,32,24,27,21,13,234,7,128,16,0,32,6,4,98,97,9,97,98,4,10,11,32,10,34,23,14,38,21,114,16,0,48,6,10,34,23,14,222,14,48,72,68,34,68,72,48,48,120,124,191,16,0,64,6,62,124,120,48,10,34,11,21,18,23,20,34,41,16,27,18,55,16,0,80,6,13,41,18,28,41,10,41,28,22,10,27,29,41,21,14,13,13,16,0,96,6,41,22,10,29,27,18,33,37,10,40,11,21,18,23,20,34,0,16,0,112,6,41,16,27,18,13,41,32,10,28,41,22,10,13,14,41,11,0,16,0,128,6,34,41,32,10,34,23,14,41,10,23,13,41,21,10,34,23,214,16,0,144,6,14,37,10,60,11,21,18,23,20,34,41,16,27,18,13,41,198,16,0,160,6,18,28,41,27,14,25,27,24,16,27,10,22,22,14,13,41,217,16,0,176,6,11,34,41,17,24,21,13,18,23,16,41,18,29,41,30,25,168,16,0,192,6,41,29,24,41,34,24,30,27,41,28,12,27,14,14,23,37,108,0,0,0,1,255};


// pov:
//byte bytes[] = {16,0,0,6,6,145,16,24,60,62,31,62,60,24,0,96,240,248,124,248,68,16,0,16,6,240,96,0,33,10,11,21,18,23,20,34,41,25,24,31,145,214,16,0,32,6,14,128,64,32,16,8,4,2,1,2,4,8,16,32,64,17,46,16,0,48,6,7,17,14,21,21,24,41,41,253,14,170,85,170,85,170,85,248,11,0,64,6,170,85,170,85,170,85,170,85,211,1,170,53,0,0,0,1,255};


// other:
//byte bytes[] = {8,0,0,6,1,30,5,17,14,21,21,24,109,0,0,0,1,255};




// the loop function runs over and over again forever
void loop() {
    Serial.println("");
    for (unsigned int byix = 0; byix < sizeof(bytes); byix++) {
	Serial.print("\n");
	Serial.print(bytes[byix], HEX);
	Serial.print("  ");
	for (signed int btix = 7; btix >= 0; btix--) {
	    // set data to black/white
	    if (bytes[byix] & (1 << btix)) {
		Serial.print("1,");
		digitalWrite(PIN_DATA, HIGH);
	    } else {
		Serial.print("0,");
		digitalWrite(PIN_DATA, LOW);
	    }

	    // delay a few ms
	    delay(DELAY_MS);


	    // change clock state
	    digitalWrite(PIN_CLOCK, !digitalRead(PIN_CLOCK));


	    // delay a few ms
	    delay(DELAY_MS);
	}
    }


    // all done
    digitalWrite(PIN_CLOCK, LOW);
    digitalWrite(PIN_DATA, LOW);


    while (1) {
	digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
	delay(100);
	digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
	delay(100);
    }
}

From → Uncategorized

No comments yet

Leave a Reply

Note: HTML is allowed. Your email address will not be published.

Subscribe to this comment feed via RSS