1. Christopher De Vries
  2. arduino-tcl

Commits

Christopher De Vries  committed 9a3f9c9

First go at Arduino Total Control Lighting library.

  • Participants
  • Branches default

Comments (0)

Files changed (8)

File .hgignore

View file
+syntax: glob
+*~
+*.pyc
+
+syntax: regexp
+(^|/)CVS($|/)
+(^|/)build($|/)
+(^|/)dist($|/)
+(^|/)MANIFEST$

File LICENSE.txt

View file
+Artistic License 2.0
+Copyright (c) 2000-2006, The Perl Foundation.
+
+Everyone is permitted to copy and distribute verbatim copies of this license
+document, but changing it is not allowed.
+
+Preamble
+This license establishes the terms under which a given free software Package
+may be copied, modified, distributed, and/or redistributed. The intent is that
+the Copyright Holder maintains some artistic control over the development of
+that Package while still keeping the Package available as open source and free
+software.
+
+You are always permitted to make arrangements wholly outside of this license
+directly with the Copyright Holder of a given Package. If the terms of this
+license do not permit the full use that you propose to make of the Package,
+you should contact the Copyright Holder and seek a different licensing
+arrangement.
+
+Definitions
+"Copyright Holder" means the individual(s) or organization(s) named in the
+copyright notice for the entire Package.
+
+"Contributor" means any party that has contributed code or other material to
+the Package, in accordance with the Copyright Holder's procedures.
+
+"You" and "your" means any person who would like to copy, distribute, or
+modify the Package.
+
+"Package" means the collection of files distributed by the Copyright Holder,
+and derivatives of that collection and/or of those files. A given Package may
+consist of either the Standard Version, or a Modified Version.
+
+"Distribute" means providing a copy of the Package or making it accessible to
+anyone else, or in the case of a company or organization, to others outside of
+your company or organization.
+
+"Distributor Fee" means any fee that you charge for Distributing this Package
+or providing support for this Package to another party. It does not mean
+licensing fees.
+
+"Standard Version" refers to the Package if it has not been modified, or has
+been modified only in ways explicitly requested by the Copyright Holder.
+
+"Modified Version" means the Package, if it has been changed, and such changes
+were not explicitly requested by the Copyright Holder.
+
+"Original License" means this Artistic License as Distributed with the
+Standard Version of the Package, in its current version or as it may be
+modified by The Perl Foundation in the future.
+
+"Source" form means the source code, documentation source, and configuration
+files for the Package.
+
+"Compiled" form means the compiled bytecode, object code, binary, or any other
+form resulting from mechanical transformation or translation of the Source
+form.
+
+Permission for Use and Modification Without Distribution
+(1) You are permitted to use the Standard Version and create and use Modified
+Versions for any purpose without restriction, provided that you do not
+Distribute the Modified Version.
+
+Permissions for Redistribution of the Standard Version
+(2) You may Distribute verbatim copies of the Source form of the Standard
+Version of this Package in any medium without restriction, either gratis or
+for a Distributor Fee, provided that you duplicate all of the original
+copyright notices and associated disclaimers. At your discretion, such
+verbatim copies may or may not include a Compiled form of the Package.
+
+(3) You may apply any bug fixes, portability changes, and other modifications
+made available from the Copyright Holder. The resulting Package will still be
+considered the Standard Version, and as such will be subject to the Original
+License.
+
+Distribution of Modified Versions of the Package as Source
+(4) You may Distribute your Modified Version as Source (either gratis or for a
+Distributor Fee, and with or without a Compiled form of the Modified Version)
+provided that you clearly document how it differs from the Standard Version,
+including, but not limited to, documenting any non-standard features,
+executables, or modules, and provided that you do at least ONE of the
+following:
+
+(a) make the Modified Version available to the Copyright Holder of the
+Standard Version, under the Original License, so that the Copyright Holder may
+include your modifications in the Standard Version.
+(b) ensure that installation of your Modified Version does not prevent the
+user installing or running the Standard Version. In addition, the Modified
+Version must bear a name that is different from the name of the Standard
+Version.
+(c) allow anyone who receives a copy of the Modified Version to make the
+Source form of the Modified Version available to others under
+(i) the Original License or
+(ii) a license that permits the licensee to freely copy, modify and
+redistribute the Modified Version using the same licensing terms that apply to
+the copy that the licensee received, and requires that the Source form of the
+Modified Version, and of any works derived from it, be made freely available
+in that license fees are prohibited but Distributor Fees are allowed.
+
+Distribution of Compiled Forms of the Standard Version or Modified Versions
+without the Source
+(5) You may Distribute Compiled forms of the Standard Version without the
+Source, provided that you include complete instructions on how to get the
+Source of the Standard Version. Such instructions must be valid at the time of
+your distribution. If these instructions, at any time while you are carrying
+out such distribution, become invalid, you must provide new instructions on
+demand or cease further distribution. If you provide valid instructions or
+cease distribution within thirty days after you become aware that the
+instructions are invalid, then you do not forfeit any of your rights under
+this license.
+
+(6) You may Distribute a Modified Version in Compiled form without the Source,
+provided that you comply with Section 4 with respect to the Source of the
+Modified Version.
+
+Aggregating or Linking the Package
+(7) You may aggregate the Package (either the Standard Version or Modified
+Version) with other packages and Distribute the resulting aggregation provided
+that you do not charge a licensing fee for the Package. Distributor Fees are
+permitted, and licensing fees for other components in the aggregation are
+permitted. The terms of this license apply to the use and Distribution of the
+Standard or Modified Versions as included in the aggregation.
+
+(8) You are permitted to link Modified and Standard Versions with other works,
+to embed the Package in a larger work of your own, or to build stand-alone
+binary or bytecode versions of applications that include the Package, and
+Distribute the result without restriction, provided the result does not expose
+a direct interface to the Package.
+
+Items That are Not Considered Part of a Modified Version
+(9) Works (including, but not limited to, modules and scripts) that merely
+extend or make use of the Package, do not, by themselves, cause the Package to
+be a Modified Version. In addition, such works are not considered parts of the
+Package itself, and are not subject to the terms of this license.
+
+General Provisions
+(10) Any use, modification, and distribution of the Standard or Modified
+Versions is governed by this Artistic License. By using, modifying or
+distributing the Package, you accept this license. Do not use, modify, or
+distribute the Package, if you do not accept this license.
+
+(11) If your Modified Version has been derived from a Modified Version made by
+someone other than you, you are nevertheless required to ensure that your
+Modified Version complies with the requirements of this license.
+
+(12) This license does not grant you the right to use any trademark, service
+mark, tradename, or logo of the Copyright Holder.
+
+(13) This license includes the non-exclusive, worldwide, free-of-charge patent
+license to make, have made, use, offer to sell, sell, import and otherwise
+transfer the Package with respect to any patent claims licensable by the
+Copyright Holder that are necessarily infringed by the Package. If you
+institute patent litigation (including a cross-claim or counterclaim) against
+any party alleging that the Package constitutes direct or contributory patent
+infringement, then this Artistic License to you shall terminate on the date
+that such litigation is filed.
+
+(14) Disclaimer of Warranty: THE PACKAGE IS PROVIDED BY THE COPYRIGHT HOLDER
+AND CONTRIBUTORS "AS IS' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES. THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+NON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT PERMITTED BY YOUR LOCAL LAW.
+UNLESS REQUIRED BY LAW, NO COPYRIGHT HOLDER OR CONTRIBUTOR WILL BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING IN ANY WAY
+OUT OF THE USE OF THE PACKAGE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGE.

File README.txt

View file
+Arduino Total Control Lighting Library
+Copyright 2011 Christopher De Vries
+
+This library allows you to control Cool Neon's Total Control Lighting using an
+Arduino. The library is built on SPI and requires that the Arduino SPI library
+also be included.
+
+Hardware
+--------
+The Total Control Lighting strands use 4 wires to provide both power and
+communication. If you are using the Cool Neon connectors, the wires are
+designated with the following colors.
+
+Red:    +5V
+Yellow: Clock
+Green:  Data
+Blue:   Ground
+
+If you are using a small number of LEDs the Arduino itself can provide power
+to the strand, but for a significant number of lights (greater than 5) an
+external power source should be attached. The Arduino will control the lights
+using the Clock and Data wires.
+
+The Clock wire should be connected to the SPI clock out of the Arduino. For an
+Arduino UNO this is digital IO Pin 13, for an Arduino Mega this is digital IO
+pin 52. The Data line should be connected to the SPI MOSI line, which for an
+Arduino UNO is digital IO Pin 11, and for an Arduino Mega is digital IO pin
+51. Be sure there is a common ground between the Arduino and the Total Control
+Lighting and your LED strand should be ready to receive data.
+
+Software
+--------
+In order to use the library, your sketch should start with the following
+#include directives:
+
+#include <SPI.h>
+#include <TCL.h>
+
+Before starting communication, initialize the SPI bus by issuing the command:
+
+TCL.begin();
+
+Before sending a group of colors to your LEDs, you must send 4 bytes of 0s to
+initialize the strand. You can do this using the command:
+
+TCL.sendEmptyFrame();
+
+You must also do this after every set of colors is sent to the strand.
+
+To send an RGB color, use the command:
+
+TCL.sendColor(byte red, byte green, byte blue);
+
+So, for example to send a yellow pixel, I would issue the command:
+
+TCL.sendColor(0xff,0xb0,0x00);
+
+The first color you send, will be the color of the first pixel (closest to the
+Arduino), the next will be the next pixel and so on down the line.
+
+When you are done sending colors, remember to finish with
+
+TCL.sendEmptyFrame();
+

File TCL.cpp

View file
+/*****************************************************************************
+ * Tcl.cpp
+ *
+ * Copyright 2011 Christpher De Vries
+ * This program is distributed under the Artistic License 2.0, a copy of which
+ * is included in the file LICENSE.txt
+ ****************************************************************************/
+
+#include "Wprogram.h"
+#include "SPI.h"
+#include "TCL.h"
+
+TclClass TCL;
+
+void TclClass::begin() {
+  // Set the SPI parameters
+  SPI.begin();
+  SPI.setBitOrder(MSBFIRST);
+  SPI.setDataMode(SPI_MODE0);
+  SPI.setClockDivider(SPI_CLOCK_DIV2);
+}
+
+void TclClass::end() {
+  SPI.end();
+}
+
+byte TclClass::makeFlag(byte red, byte green, byte blue) {
+  byte flag = 0;
+
+  flag = (red&0xC0)>>6;
+  flag |= ((green&0xC0)>>4);
+  flag |= ((blue&0xC0)>>2);
+  return ~flag;
+}
+
+void TclClass::sendFrame(byte flag, byte red, byte green, byte blue) {
+  SPI.transfer(flag);
+  SPI.transfer(blue);
+  SPI.transfer(green);
+  SPI.transfer(red);
+}
+
+void TclClass::sendColor(byte red, byte green, byte blue) {
+  byte flag = makeFlag(red,green,blue);
+
+  sendFrame(flag,red,green,blue);
+}
+
+void TclClass::sendEmptyFrame() {
+  sendFrame(0x00,0x00,0x00,0x00);
+}
+

File TCL.h

View file
+/*****************************************************************************
+ * TCL.h
+ *
+ * Copyright 2011 Christpher De Vries
+ * This program is distributed under the Artistic License 2.0, a copy of which
+ * is included in the file LICENSE.txt
+ ****************************************************************************/
+#ifndef TCL_h
+#define TCL_h
+#include <Wprogram.h>
+#include <SPI.h>
+
+class TclClass {
+  public:
+    static void begin();
+    static void end();
+    static void sendFrame(byte flag, byte red, byte green, byte blue);
+    static void sendColor(byte red, byte green, byte blue);
+    static void sendEmptyFrame();
+    static byte makeFlag(byte red, byte green, byte blue);
+};
+
+extern TclClass TCL;
+#endif

File build.xml

View file
+<project name="arduino-tcl" default="zip" basedir=".">
+
+  <target name="init">
+    <property name="version" value="1.0"/>
+    <property name="zipname" value="arduino-TCL-${version}.zip"/>
+  </target>
+
+  <target name="zip" depends="init">
+    <zip destfile="${zipname}">
+      <zipfileset dir="." prefix="TCL">
+        <include name="*.h"/>
+        <include name="*.cpp"/>
+        <include name="*.txt"/>
+      </zipfileset>
+      <zipfileset dir="examples" prefix="TCL/examples"/>
+    </zip>
+  </target>
+
+  <target name="clean" depends="init">
+    <delete file="${zipname}"/>
+  </target>
+</project>

File examples/fire/fire.pde

View file
+/*****************************************************************************
+ * fire.pde
+ *
+ * This example will send a flickering fire sequence down a 25 pixel long
+ * strand of total control lighting. It uses random numbers to shift in
+ * intensity and color between two color limits.
+ *
+ * Copyright 2011 Christopher De Vries
+ * This program is distributed under the Artistic License 2.0, a copy of which
+ * is included in the file LICENSE.txt along with this library.
+ ****************************************************************************/
+#include <SPI.h>
+#include <TCL.h>
+
+const int LEDS 25; // There are 25 LEDs in the Total Control Lighting Strand
+byte color1[] = {0xff, 0x00, 0x00};
+byte color2[] = {0xff, 0x90, 0x00};
+
+const int transition_low = 0;
+const int transition_high = 101;
+
+const int intensity_low = 0;
+const int intensity_high = 101;
+
+void setup() {
+  SPI.begin();
+
+}
+
+void loop() {
+  int i;
+  int transition;
+  int intensity;
+
+  SPI.sendEmptyFrame();
+  for(i=0;i<LEDS;i++) {
+    transition=(int)random(transition_low,transition_high);
+    intensity=(int)random(intensity_low,intensity_high);
+    sendTransitionScaleFrame(color1,color2,transition,intensity);
+  }
+  SPI.sendEmptyFrame();
+
+  delay(50);
+}
+
+void sendTransitionScaleFrame(byte *c1, byte *c2, int transition, int intensity) {
+  byte rscale;
+  byte gscale;
+  byte bscale;
+
+  rscale = ((c2[0]-c1[0])*transition/100+c1[0])*intensity/100;
+  gscale = ((c2[1]-c1[1])*transition/100+c1[1])*intensity/100;
+  bscale = ((c2[2]-c1[2])*transition/100+c1[2])*intensity/100;
+
+  SPI.sendColor(rscale,gscale,bscale);
+}

File examples/rainbow/rainbow.pde

View file
+/*****************************************************************************
+ * rainbow.pde
+ *
+ * This example will send a sequence of rainbow colors down a 25 pixel long
+ * strand of total control lighting. The Arduino will send an update every
+ * second to the strand, although this is unnecessary and if you disconnect
+ * the Arduino from the strand, you will see that as long as the lights have
+ * power, they will retain the last color information sent to them.
+ *
+ * Copyright 2011 Christopher De Vries
+ * This program is distributed under the Artistic License 2.0, a copy of which
+ * is included in the file LICENSE.txt along with this library.
+ ****************************************************************************/
+#include <SPI.h>
+#include <TCL.h>
+
+const int LEDS 25; // There are 25 LEDs in the Total Control Lighting Strand
+const byte red[] = {0xff, 0xff, 0xff, 0x00, 0x00};
+const byte green[] = {0x00, 0x60, 0xb0, 0x80, 0x00};
+const byte blue[] = {0x00, 0x00, 0x00, 0x00, 0xff};
+
+void setup() {
+  SPI.begin();
+
+}
+
+void loop() {
+  int i;
+
+  SPI.sendEmptyFrame();
+  for(i=0;i<LEDS;i++) {
+    SPI.sendColor(red[i%5],green[i%5],blue[i%5]);
+  }
+  SPI.sendEmptyFrame();
+
+  delay(1000);
+}