<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.phidgets.com/docs21/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Burley</id>
	<title>Phidgets Legacy Support - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://www.phidgets.com/docs21/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Burley"/>
	<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/Special:Contributions/Burley"/>
	<updated>2026-04-23T03:28:09Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=T-Slot_Primer&amp;diff=23866</id>
		<title>T-Slot Primer</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=T-Slot_Primer&amp;diff=23866"/>
		<updated>2016-08-03T15:36:03Z</updated>

		<summary type="html">&lt;p&gt;Burley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Primer]]&lt;br /&gt;
{|&lt;br /&gt;
|- valign=middle&lt;br /&gt;
| align=center width=300px| __TOC__ &lt;br /&gt;
| [[Image:tsl_header.jpg|500px|link=]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
T-Slot is a framing system composed of extruded aluminum profiles which use the namesake slot as a mounting point for various hardware components.  Phidgets carries three different series of T-Slot extrusions.  A 20mm, 30mm, and 40mm standard.  For each series we carry a single (20x20mm, 30x30mm, 40x40mm) and double (20x40mm, 30x60mm, 40x80mm) wide extrusion.  The series you end up using depends where on the weight vs. strength scale your project ends up falling.  Obviously the smaller extrusions will not be as strong and rigid as the larger extrusions.  The manufacturer provides equations for calculating how strong the extrusions are on pages 11 and 12 of their catalogue which can be found [{{SERVER}}/documentation/Modular_Assembly_System.pdf here].  The modulus of elasticity is listed as approximately 70,000N/mm².  The moment of inertia is listed under the specifications for the specific extrusion profile you are using.  With those two parameters you should be able to calculate with reasonable accuracy the relationship between force applied and resultant beam deflection.  &lt;br /&gt;
&lt;br /&gt;
The first thing you will need to do is cut the extrusions to length.  There are 2 ways to do with.  Either with a band saw or a chop saw with an appropriate blade (there are carbide blades designed for cutting aluminum).  Once your extrusions are cut down to size you will want to connect them together:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Connecting Extrusions Together==&lt;br /&gt;
In order for this whole system to be useful you need a way to combine individual extrusions into a more complicated structure.  There are a number of options available for this, each better suited for different situations.  &lt;br /&gt;
&lt;br /&gt;
===Screw Connectors===&lt;br /&gt;
These are the most basic form of connection.  A simple bolt that goes from one extrusion to the next.  In order to use a screw connector there are 2 prerequisite steps you must do before installing.  You need to tap the first extrusion with an appropriate tap for the series you are using (check the product page for the screw connector for which tap is required), and you need to drill a hole in the second extrusion big enough to allow Allen key access to the head of the screw connector.  For example, here is a piece of 30x60mm extrusion prepped for connecting:&lt;br /&gt;
&lt;br /&gt;
[[Image:Screw_connector_prep.png|link=|center]]&lt;br /&gt;
&lt;br /&gt;
Once this is done you can screw the connector into the newly tapped extrusion.  When you get close to the end, slide the head of the connector into the slot on the other extrusion and tighten the rest of the way through the hole you drilled. &lt;br /&gt;
&lt;br /&gt;
[[image:Screw_connections.png|center|link=|1200px]]&lt;br /&gt;
&lt;br /&gt;
===Brackets===&lt;br /&gt;
The diecast aluminum as well as the T and L plate steel brackets allow you to strengthen joints that will experience particularly heavy loads.  You should always use them to reinforce joints which already use another type of connector rather than connecting the extrusions &#039;&#039;purely&#039;&#039; via the brackets.  For all three styles of bracket you will need a few nuts.  We recommend preset or square, the T nuts won&#039;t work well for this application.  Installation is fairly simple, you don&#039;t have to drill and preliminary holes or anything.  Just insert the nuts and bolt the brackets on.  For example:&lt;br /&gt;
&lt;br /&gt;
[[image:Tsl_brackets.png|link=|center|1000px]]&lt;br /&gt;
&lt;br /&gt;
===Inner Brackets===&lt;br /&gt;
The inner brackets are a special variant of bracket that are different enough from the other brackets that they deserve their own section.  These brackets do not need to be used with other connection methods.  They are suitable by themselves (though you could use a reinforcement as well if you wanted to).  The one important distinction to make with these brackets is that there are two models of bracket, A and B.  The difference is that the set screw hole is slightly canted so that the set screw pushes the bracketed extrusion into the other extrusion to tighten the hold.  For example:&lt;br /&gt;
&lt;br /&gt;
[[image:inner_bracket_ab.jpg|center|700px|link=]]&lt;br /&gt;
&lt;br /&gt;
Notice how both brackets have the set screws canted towards the extrusion.  This way the extrusion you are connecting to this one will be pulled in towards it when the set screws are tightened.  The effect is small but important.  The left-hand bracket in this case is the A series while the right-hand one is the B series.  Here is a diagram showing which series is appropriate for which connection a bit more clearly:&lt;br /&gt;
&lt;br /&gt;
[[image:Inner_bracket_ab_diagram.png|center|600px|link=]]&lt;br /&gt;
&lt;br /&gt;
You should always use 2 inner brackets to connect 2 extrusions together.  &lt;br /&gt;
&lt;br /&gt;
[[image:TSL_90deg01_Small.jpg|center|link=]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Butt Connectors===&lt;br /&gt;
These connectors are ideally suited to connecting an extrusion to the middle of another extrusion in a T junction.  They have a similar effect to the screw connectors but don&#039;t require access to the other side of the perpendicular extrusion (for example if you had another extrusion there already for a + configuration).  They can also be used with the plate brackets if you want an even stronger connection (but not the diecast brackets).  They do require that you drill a hole into the extrusion to use however.  Specifically 13mm hole, 11mm deep and 16mm in from the end of the extrusion for the PG30 variant and a 17mm hole, 14mm deep and 22mm in from the end of the extrusion for the PG40 variant.  These connectors should always be used in pairs (on opposite sides of an extrusion) so you will need to drill 2 such holes.  Once done, you can insert the connectors and bolt the extrusions together using preset nuts or square nuts.&lt;br /&gt;
&lt;br /&gt;
[[image:Butt_connector.png|center|link=|1200px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notice that because of the way these connectors line up with the nuts they won&#039;t make a clean 90° corner.  This is why they are better suited for use in the middle of an extrusion somewhere to make a T junction.  For cleaner corners, we recommend you use the screw connectors instead.  &lt;br /&gt;
&lt;br /&gt;
===Cubic Connectors===&lt;br /&gt;
In addition to making 2D right angle corners, you may want to connect 3 extrusions together like in the corner of a cube.  For this, you will want to use the cubic connectors.  These connectors behave vary much like screw connectors in that you must tap out the central hole on the end of the extrusion.  You will then also need to insert a bore reducing sleeve (included with the connector) into the hole which will allow you to bolt the connector on.  The PG30 variant requires an M12 tap while the PG40 variant requires an M14 tap.    &lt;br /&gt;
&lt;br /&gt;
[[image:Cubic_connector.png|center|link=|1200px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Linear Bar Connectors===&lt;br /&gt;
To join two extrusions together to make a longer extrusion you can use linear bar connectors.  They come in packages of 4 so that you can connect all 4 slots for strength but you could get away with just using 2 and it will be plenty strong.  We recommend not using 2 at the minimum though.  Nothing special needs to be done to prep the extrusions, you can simply slot the bar into the extrusions and tighten the set screws.  &lt;br /&gt;
&lt;br /&gt;
[[image:linear_connector.jpg|link=|center|700px]]&lt;br /&gt;
&lt;br /&gt;
===Anchor Connectors===&lt;br /&gt;
Anchor connectors are the only real option available for connecting extrusions at &#039;&#039;non&#039;&#039;-right angles.  While they can also connect extrusions at right angles, there are other connection methods that are better suited for this case.  To use an anchor connector you will need to drill a hole in the extrusion being butted up against the other.  For the PG30 variant it will need to be a 12mm hole, 21mm deep and 30mm from the end of the extrusions (measure from the center of the extrusion if you have cut it at an angle) and for the PG40 variant it will need to be a 15mm hole, 27mm deep and 32mm from the end of the extrusion.  Then, back out the hex head on the anchor so that it comes apart into two pieces:&lt;br /&gt;
&lt;br /&gt;
[[image:anchor_disassembled.png|center|link=|700px]]&lt;br /&gt;
&lt;br /&gt;
The half with the hex head will insert into the hole you have drilled while the half with the actual anchor slides into the central hole in the profile of the extrusion.  Slide the pieces back together and tighten the hex head just enough that it bites and holds the halves together again.  You can now slide the pivoting head into the slot on your other extrusion and tighten the hex head to clamp the extrusions together.&lt;br /&gt;
&lt;br /&gt;
[[image:Anchor_install.png|center|1000px|link=]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Connecting Things to Extrusions==&lt;br /&gt;
T-Slot offers a convenient way to build frames for all manner of different applications.  None of that is useful of course if you can&#039;t easily mount things to that frame.  There are two main methods for attaching things to a frame.  You can either bolt it directly to the frame with a small bracket or plate that is bolted on with some form of nut, or alternatively use the slot profile reducers to insert a panel into the frame which you can then mount to.&lt;br /&gt;
&lt;br /&gt;
===Preset/Square/T Nuts===&lt;br /&gt;
Bolting something directly to the frame is the easiest method for attaching things to T-Slot structures.  There are 3 options for nuts that work with each series (PG20, 30, 40).  &lt;br /&gt;
&lt;br /&gt;
====Preset nuts====&lt;br /&gt;
The preset nut is shaped to fit loosely into the slot so it can slide back and forth into position but not turn.  This allows you to tighten the bolts to it with no fuss.  These are the fastest possible option, with a good combination of strength and ease of use.  Here is an example of an acrylic plate mounted to an extrusion with some preset nuts.  &lt;br /&gt;
&lt;br /&gt;
[[image:Preset_nut.png|center|link=|700px]]&lt;br /&gt;
&lt;br /&gt;
One note on the bolts:  The size of bolt required is dictated by the size of hole in the nut being used obviously.  We have several bore sizes for each series of nut (20,30,40).  The length of the bolt though is the tricky part.  The bolt should &#039;&#039;not&#039;&#039; touch the extrusion at all, you want to make sure that the bolt is long enough to go through the object you are mounting on and sink into the nut far enough to get a strong connection but not so long that it sticks out the far side of the nut and digs into the aluminum as this will cause some wiggle in the mounting point.  For example, for the 5mm thick acrylic plate above M6x10mm bolts were used.  Since the nuts are about 6mm thick in the case of PG30 (which is what was used for this example) that lets the bolt go deep enough into the nut to be secure while still leaving about 1mm of clearance plus the distance between the nut and the extrusion.&lt;br /&gt;
&lt;br /&gt;
====Square nuts====&lt;br /&gt;
Square nuts behave in almost exactly the same way as preset nuts except that they require you to put the tension spring on them and slid into the profile a bit more carefully.  Technically the tensioner isn&#039;t totally necessary but it helps keep the nut in place while you are bolting to it.  It also allows you to bolt things to a vertical surface more easily.  See the preset nut section about the size and length of bolts you should use.&lt;br /&gt;
&lt;br /&gt;
[[image:Square_nut.png|center|link=|1200px]]&lt;br /&gt;
&lt;br /&gt;
====T nuts====&lt;br /&gt;
T nuts are the trickiest to use as well as the least secure of the 3 nut variants but in return they are the only one that can be used after the fact or on extrusions where the ends are not accessible for one reason or another.  The ability to install T nuts directly on the side of an extrusion is very useful.  They also allow you to disconnect a component quickly.  To use a T nut you should start by screwing it on to the object loosely.  Then orient the nuts so they are aligned and slot them into the extrusion.  Finally, carefully turn the bolt heads until the nut is turned 90 degrees and is seated in the extrusion.  Then tighten the bolts the rest of the way and you are done.  See the preset nut section about the size and length of bolts you should use.&lt;br /&gt;
&lt;br /&gt;
[[image:T_nut.png|link=|center|1200px]]&lt;br /&gt;
&lt;br /&gt;
===Profile Reducers and Panel Mounts===&lt;br /&gt;
The profile reducers are plastic inserts for the T-slot slots which allow you to put panels in your structure.  While the profile reducers grip surprisingly strong we still recommend you border the panel on at least 2 sides to ensure a secure hold though you could border the panel on all 4 sides if you wanted to be extra secure.  The profile reducers are simple to cut to length with side cutters or even a sharp utility knife and they slot into the extrusions with minimal effort.  They accept panels anywhere from 3-5mm in width.  Here is an example of an acrylic panel being used but you could use anything you&#039;d like (steel or aluminum plate, other types of plastic, even cardboard if you do desired).  &lt;br /&gt;
&lt;br /&gt;
[[image:Slot_reducers.png|center|link=|700px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Feet and Castors===&lt;br /&gt;
In order to connect feet or castor wheels to your structure you will first have to install an adapter end plate.  This requires tapping the face of the extrusion with an M6 tap or M14 tap for the 40x40mm and 40x80mm profiles respectively.  These plates are only available for the PG40 series extrusions.  Once the plate it installed, the foot or castor will screw into the central hole.&lt;br /&gt;
&lt;br /&gt;
[[image:End_cap.png|center|link=|1200px]]&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=Linear_Motion_Primer&amp;diff=23865</id>
		<title>Linear Motion Primer</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=Linear_Motion_Primer&amp;diff=23865"/>
		<updated>2016-08-03T15:35:56Z</updated>

		<summary type="html">&lt;p&gt;Burley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Primer]]&lt;br /&gt;
&lt;br /&gt;
The goal of a linear system is to have an object or other subsystem move along a linear track with a controllable velocity and position.  The key features of a linear system are the efficiency with which you can move the load, the speed you can move it at, and the accuracy with which you can position the load along the track.  Typically a linear system will consist of 1 or more rails/shafts with linear bearings which support the load.  The bearing surface is machined to be extremely smooth and is case hardened so it doesn&#039;t deform whatsoever under rated load.  Then you will also need a drive mechanism so that you can actually control the position along your track.  There are a number of options for this such as belt drives, chain drives, and ball screws.  Which you use will depend on your specific requirements so lets briefly discuss why and how you would use each.&lt;br /&gt;
&lt;br /&gt;
==Slides==&lt;br /&gt;
The first choice is for the type of track you use.  The two options available are linear shaft and rail.  &lt;br /&gt;
&lt;br /&gt;
[[Image:Linear_slides.png|link=|700px|center]]&lt;br /&gt;
&lt;br /&gt;
In most cases using rail is preferable.  The continuous support under the shaft minimizes deflection under load and it also has many mounting holes along the track which makes for easier and more secure installation in your system.  Rail also has the potential for longer travel distances as the shaft won&#039;t experience any deflection due to it&#039;s own weight.  Of course, using rail isn&#039;t practical for all applications.  In cases where you need to span a gap of some kind or the surface you are travelling along isn&#039;t easy to mount to then using suspended shaft is a suitable alternative to rail.  There are also flange mount blocks for the shaft so you can mount to a perpendicular surface rather than the pillow blocks shown in the image above.  &lt;br /&gt;
&lt;br /&gt;
==Drive Systems==&lt;br /&gt;
There are three main ways to drive your system available from Phidgets:&lt;br /&gt;
&lt;br /&gt;
===Ball Screws===&lt;br /&gt;
Ball screws allow for very precise positioning with very little backlash.  They are also very efficient, meaning they don&#039;t require very much force to move a sizeable load in comparison to other methods.  A ball screw system typically consists of 4 or 5 elements plus something to turn the screw.  To support the screw you need a drive bearing and a support bearing.  To apply force to your object you need a nut that will move along the screw (you can also have a housing for the nut depending on how you want to attach your load).  Then you of course need the screw itself.  Here is an example of a ball screw assembly using a stepper motor to direct drive the screw:&lt;br /&gt;
&lt;br /&gt;
[[image:Ball_screw_assembly_wiki.png|link=|center|1000px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Since the ball screw isn&#039;t designed to apply force that is &#039;&#039;not&#039;&#039; in the direction of travel we want to use a sliding support system like the rails or shafts mentioned in the slide section.  Ideally we should use 2 rails with 1 or more bearings on each.  For example:&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
|[[image:Ball_screw_drive_full.JPG|center|600px|link=]]||[[image:Belt_driven_ball_screw.JPG|center|600px|link=]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note that here we used a belt to drive the ball screw rather than direct drive off the motor.  This was just so that we could simplify the chassis.  Belt drives allow for more misalignment than shaft couplers do.  Here is a demonstration of how it looks and sounds:&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|_brx8IxYSik}}&lt;br /&gt;
&lt;br /&gt;
===Belt Drive===&lt;br /&gt;
A sufficiently tensioned belt will move linearly between the 2 pulleys it is circulating on.  We can take advantage of this by attaching something to the belt to have it get pulled along as well.  Belt drives are not as precise as ball screws and can have some additional error if there is any slack in the belt.  However, they are easier to set up than a ball screw, are more practical for long distance runs, are cheaper, and they can generally move things more quickly.  &lt;br /&gt;
&lt;br /&gt;
All you need for a belt drive system is a belt, and 2 pulleys.  Similarly to a ball screw system the drive mechanism (your belt) won&#039;t be supporting any load other than in the axis of travel.  This means that you will need a sliding track made from shaft or rail on which to rest your load.  There are a bunch of fancy ways to attach the belt to your load but the reality is it doesn&#039;t take much.  A small metal plate and some screws is really all that is required.  For example:&lt;br /&gt;
&lt;br /&gt;
[[image:Belt_clamp.png|link=|600px|center]]&lt;br /&gt;
&lt;br /&gt;
This style of clamping does reduce the maximum strength of the belt somewhat so you should factor that into your design.  Here is an example of a functional single stage belt drive system:&lt;br /&gt;
&lt;br /&gt;
[[image:Belt_drive_assembly_wiki.png|link=|1500px|center]]&lt;br /&gt;
&lt;br /&gt;
This is all in reference to linear systems.  If you want more information about belt systems in rotary systems you can refer to our [[Rotary Motion Primer]] here.&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|BAnt21tCL8I}}&lt;br /&gt;
&lt;br /&gt;
===Chain Drive===&lt;br /&gt;
Chain drives work in an identical fashion to belt drives.  They are a bit more complicated to work with but they have the advantage that they can handle much more load than a belt of similar size.&lt;br /&gt;
&lt;br /&gt;
Just replace the pulleys with chain sprockets and the belt with a chain and you are done.  Attaching chain to your load is a matter of putting a screw through a hole between chain pitches.  For example:&lt;br /&gt;
&lt;br /&gt;
[[image:Chain_mount.png|link=|center|700px]]&lt;br /&gt;
&lt;br /&gt;
For more information on setting up chain systems you should have a look at our [[Rotary Motion Primer]] which goes into more depth about the specifics of working with roller chains.&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=Rotary_Motion_Primer&amp;diff=23864</id>
		<title>Rotary Motion Primer</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=Rotary_Motion_Primer&amp;diff=23864"/>
		<updated>2016-08-03T15:35:49Z</updated>

		<summary type="html">&lt;p&gt;Burley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Primer]]&lt;br /&gt;
&lt;br /&gt;
In rotary systems, you have a rotating shaft which applies torque to do work.  Typically this shaft is turned by an electric motor of some kind and then, through a series of belts/chains/couplers transmits that power to a final output shaft or arm or wheel which accomplishes the desired task.  Why not just use the output shaft of the motor directly?  There are two main reasons:&lt;br /&gt;
&lt;br /&gt;
*You might want to gear the motor down further to increase the torque available by using pulleys or sprockets of differing sizes.  &lt;br /&gt;
*The shaft on the motor itself isn&#039;t really designed for forces other than torque.  It is difficult to put anything of significant size on the shaft without putting too much overhung (radial) load on the shaft which will stall the motor.  &lt;br /&gt;
&lt;br /&gt;
As a result, the base of any rotary system is the rotating shaft.  Phidgets has 4 sizes of shaft available: 8mm, 12mm, 17mm, and 25mm.  The 12, 17, and 25mm shafts also have a variant available with a keyway machined in the length of the shaft if you don&#039;t want to machine it yourself.  These shafts need to be suspended on bearings, we do not sell any bearings currently but they are commonly available components that you can find locally.  For the larger shaft sizes (17 and 25mm) we recommend using steel bearing housings.  &lt;br /&gt;
&lt;br /&gt;
==Motors==&lt;br /&gt;
Every system will need a motor or else there will be no motion (without external input).  Phidgets offers a wide selection of motors of a number of different types that would all be suitable for rotary systems.  For more information on this you can check out our primers for [[DC Motor and Controller Primer|DC motors]] and [[Stepper Motor and Controller Primer|Stepper motors]].&lt;br /&gt;
==Pulleys/Timing belts==&lt;br /&gt;
A belt is simply a loop of tough, flexible material such as rubber and kevlar with a series of teeth that mesh with the teeth on specially designed pulley wheels to synchronize two (or more) rotating shafts.  Belts are a cheap options for shafts that are not axially aligned and tend to run quietly and smoothly.  Belts are typically tensioned either by adjusting center to center distance between pulleys or via a tensioner/idler pulley.  This leads to very low backlash and a high efficiency (as high as 98%).  &lt;br /&gt;
&lt;br /&gt;
We have two types of belts available, 2GT (6mm wide) and 5GT (15mm wide).  Each comes in loops of varying circumferences.  The 2GT belts are rated for 6lbs of working tension while the 5GT are rated for 100lbs.  Belt systems are fairly simple, you have 2 or more pulleys and a belt that goes around all of them.  One of the pulleys is driven by your motor and the other(s) are either connected to your load or in the case of an idler pulley are simply free spinning to act as a tensioner for the belt.  For example, here is a system that uses a belt to transmit power form a stepper motor to a ball screw:&lt;br /&gt;
&lt;br /&gt;
[[image:Belt driven ball screw.JPG|700px|center|link=]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Chain/Sprockets==&lt;br /&gt;
Pretty much everyone has at least seen a chain system in their life in the form of a bicycle.  This system of course is driven by human input rather than a motor.  Automated systems behave no differently though, you have several sprockets, and chain that wraps around them.  One sprocket is driven and the others perform work on the load.  Chain tends to be noisier than belts and cannot be tensioned as tightly meaning there is a bit more backlash inherent in the system.  In exchange though, chain can move much heavier loads for their size.  &lt;br /&gt;
&lt;br /&gt;
We sell ANSI#25 and #40 chain and sprockets (that is 0.25&amp;quot; pitch and 0.5&amp;quot; pitch).  The #25 is rated for 100lbs of working tension while the #40 is rated for 800lbs.  Chain is sold by the meter and you can form closed loops of any length you&#039;d like with the link kits that we sell.  To calculate how many links you will need for a particular sprocket spacing you can use [http://www.botlanta.org/converters/dale-calc/sprocket.html this calculator], just enter in the number of teeth on each sprocket, the chain pitch, and the center to center distance between the sprockets to get the number of links you will need.  If the number is not whole, you should always round up (and probably even add one).  Once you know how many links you will require you will need to use the link kit to connect your chain up.  This is where it gets a bit fiddly.  &lt;br /&gt;
&lt;br /&gt;
There are two ways to connect chain, you can either use a hammer and a pin of some kind to knock out one of the pins which you can then connect up with an offset link:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The other way is if you have a chain breaker tool you can remove an entire link properly and can use a normal split link.  This process is a bit more tricky but it is stronger over all and will increase the length of the chain by a standard amount unlike the offset link which adds a sort of half link to your total length.  To use a split link you must remove the snap ring and the top plate, then slot it into the chain and replace them both.  For example:&lt;br /&gt;
&lt;br /&gt;
[[image:Chain_link_insert_wiki.png|link=|center|1200px]]&lt;br /&gt;
&lt;br /&gt;
A good example of a chain system is our MURVV robot.  Here is how it&#039;s drive mechanism works:&lt;br /&gt;
&lt;br /&gt;
[[Image:Murvv_chain.jpg|link=|center|700px]]&lt;br /&gt;
&lt;br /&gt;
==Worm Gearboxes==&lt;br /&gt;
In general, worm gearboxes are just another type of gearbox that can be fitted to a motor.  The main benefit of a worm drive is that it is all but impossible to back drive even when not powered.  This is due to the steep angle used by the gears as they mesh together.  As a result, this type of gearbox is not the most efficient.  There is a lot of frictional loss at the mesh point and they will tend to run hot.  That being said, in the context of the worm drives Phidget&#039;s sells, they are a means to substantially increase the output torque of our larger motors for applications where maximum strength is required.  All our worm gearboxes have a 30:1 gear ratio and since the bearings built into the gearbox can handle much higher axial and radial loads that motors themselves you can easily direct drive very large loads from these gearboxes without having to set up an external mechanism.&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=Programming_Resources&amp;diff=23853</id>
		<title>Programming Resources</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=Programming_Resources&amp;diff=23853"/>
		<updated>2016-06-17T13:58:53Z</updated>

		<summary type="html">&lt;p&gt;Burley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Overview]]&lt;br /&gt;
==Language Support==&lt;br /&gt;
&lt;br /&gt;
We provide a variety of supported languages for using Phidgets.  Each language has its own &#039;&#039;libraries&#039;&#039;, which may be found on the language pages below, along with code examples and an in-depth API. &lt;br /&gt;
&lt;br /&gt;
Many languages also depend on the &#039;&#039;core drivers&#039;&#039; being installed as well.  These drivers can be found on the [[#Operating System Support|operating system pages]] above.&lt;br /&gt;
&lt;br /&gt;
Phidgets supports the following languages.  If the language you have chosen is not fully supported with examples for all products then there are some resources available for you to fill in the gaps.  First we recommend you look at the API which will show you all of the functions you can use.  Next, you should look at the code samples that &#039;&#039;are&#039;&#039; available in that language.  Finally you should look at code samples for your device in other languages.  Between those three things you should be able to piece together what you need to be doing, as always, if you run into trouble [[Contact Us]].  If you have some flexibility in what language to use, we recommend using a &#039;&#039;&#039;Core Language&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border:1px solid darkgray;&amp;quot; cellpadding=&amp;quot;7px;&amp;quot;&lt;br /&gt;
|-style=&amp;quot;background: #f0f0f0&amp;quot; align=center &lt;br /&gt;
! Language || Libraries || API || Code Samples&amp;lt;sup&amp;gt;&amp;amp;dagger;&amp;lt;/sup&amp;gt; || [[General Phidget Programming#Event Driven Code|Events]] || [[General Phidget Programming#Logic Code|Logic Code]] || Use via Direct USB* || [[Phidget WebService]] || Native Library** || Phidget User Base || OS Support&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|&#039;&#039;&#039;Core Languages&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[[Image:Icon-CSharp.png|alt=C Sharp|24x24px|link=Language - C Sharp]] [[Language - C Sharp|C#]]&lt;br /&gt;
|style=&amp;quot;background: #f0f0ff&amp;quot; align=center| [[Language - C Sharp#Quick Downloads|Quick Downloads]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| All Devices &lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| All Devices&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Level-10.png|link=|alt=Extensive]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Icon-Windows.png|alt=OS - Windows|24x24px|link=OS - Windows]]  [[Image:Icon-Mac-OS.png|alt=OS - OS X|24x24px|link=OS - OS X]]  [[Image:Icon-Linux.png|alt=OS - Linux|24x24px|link=OS - Linux]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[[Image:Icon-C++.png|alt=C/C++|24x24px|link=Language - C/C++]] [[Language - C/C++|C/C++]] &lt;br /&gt;
|style=&amp;quot;background: #f0f0ff&amp;quot; align=center| [[Language - C/C++#Quick Downloads|Quick Downloads]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| All Devices &lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| All Devices&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Level-10.png|link=|alt=Extensive]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Icon-Windows.png|alt=OS - Windows|24x24px|link=OS - Windows]]  [[Image:Icon-Mac-OS.png|alt=OS - OS X|24x24px|link=OS - OS X]]  [[Image:Icon-Linux.png|alt=OS - Linux|24x24px|link=OS - Linux]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[[Image:Icon-Python.png|alt=Python|24x24px|link=Language - Python]] [[Language - Python|Python]] &lt;br /&gt;
|style=&amp;quot;background: #f0f0ff&amp;quot; align=center| [[Language - Python#Quick Downloads|Quick Downloads]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| All Devices &lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| All Devices&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Level-07.png|link=|alt=Extensive]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Icon-Windows.png|alt=OS - Windows|24x24px|link=OS - Windows]]  [[Image:Icon-Mac-OS.png|alt=OS - OS X|24x24px|link=OS - OS X]]  [[Image:Icon-Linux.png|alt=OS - Linux|24x24px|link=OS - Linux]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[[Image:Icon-Java.png|alt=Java|24x24px|link=Language - Java]] [[Language - Java|Java]] &lt;br /&gt;
|style=&amp;quot;background: #f0f0ff&amp;quot; align=center| [[Language - Java#Quick Downloads|Quick Downloads]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| All Devices &lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| All Devices&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Level-07.png|link=|alt=Extensive]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Icon-Windows.png|alt=OS - Windows|24x24px|link=OS - Windows]]  [[Image:Icon-Mac-OS.png|alt=OS - OS X|24x24px|link=OS - OS X]]  [[Image:Icon-Linux.png|alt=OS - Linux|24x24px|link=OS - Linux]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[[Image:Icon-Visual Basic Net.png|alt=Visual Basic .NET|24x24px|link=Language - Visual Basic .NET]] [[Language - Visual Basic .NET|Visual Basic .NET]]&lt;br /&gt;
|style=&amp;quot;background: #f0f0ff&amp;quot; align=center| [[Language - Visual Basic .NET#Quick Downloads|Quick Downloads]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| All Devices &lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| All Devices&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Level-05.png|link=|alt=Extensive]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Icon-Windows.png|alt=OS - Windows|24x24px|link=OS - Windows]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[[Image:Icon-Visual Basic.png|alt=Visual Basic 6.0|24x24px|link=Language - Visual Basic 6.0]] [[Language - Visual Basic 6.0|Visual Basic 6.0]]&lt;br /&gt;
|style=&amp;quot;background: #f0f0ff&amp;quot; align=center| [[Language - Visual Basic 6.0#Quick Downloads|Quick Downloads]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| All Devices &lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| All Devices&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Level-03.png|link=|alt=Extensive]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Icon-Windows.png|alt=OS - Windows|24x24px|link=OS - Windows]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[[Image:Icon-Cocoa.png|alt=Cocoa|24x24px|link=Language - Cocoa]] [[Language - Cocoa|Cocoa]] &lt;br /&gt;
|style=&amp;quot;background: #f0f0ff&amp;quot; align=center| [[Language - Cocoa#Quick Downloads|Quick Downloads]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| All Devices &lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| All Devices&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Level-01.png|link=|alt=Extensive]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Icon-Mac-OS.png|alt=OS - OS X|24x24px|link=OS - OS X]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|&#039;&#039;&#039;Mobile Languages&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[[Image:Icon-Android.png|alt=Android Java|24x24px|link=Language - Android Java]] [[Language - Android Java|Android Java]]&lt;br /&gt;
|style=&amp;quot;background: #f0f0ff&amp;quot; align=center| [[Language - Android Java#Quick Downloads|Quick Downloads]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| All Devices &lt;br /&gt;
|style=&amp;quot;background: #EFE973&amp;quot; align=center| InterfaceKit Only&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #E28585&amp;quot; align=center| X&lt;br /&gt;
|style=&amp;quot;background: #FFC17F&amp;quot; align=center| Some Devices [[Image:Icon-Android_Honeycomb.png|24px|link=Software_Overview#Honeycomb|alt=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Level-01.png|link=|alt=Moderate]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Icon-Android.png|alt=OS - Android|link=OS - Android|24x24px|link=OS - Android]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[[Image:Icon-iOS.png|alt=iOS|24x24px|link=Language - iOS]] [[Language - iOS|iOS]]&lt;br /&gt;
|style=&amp;quot;background: #f0f0ff&amp;quot; align=center| [[Language - iOS#Quick Downloads|Quick Downloads]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| All Devices &lt;br /&gt;
|style=&amp;quot;background: #EFE973&amp;quot; align=center| InterfaceKit Only&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #E28585&amp;quot; align=center| X&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Level-01.png|link=|alt=Moderate]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Icon-iOS.png|alt=OS - iOS|link=OS - iOS|24x24px|link=OS - iOS]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|&#039;&#039;&#039;Scripting&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[[Image:Icon-Applescript.png|alt=Applescript|24x24px|link=Language - Applescript]] [[Language - Applescript|Applescript]]&lt;br /&gt;
|style=&amp;quot;background: #f0f0ff&amp;quot; align=center| [[Language - Applescript#Quick Downloads|Quick Downloads]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| All Devices &lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| All Devices&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Level-01.png|link=|alt=Moderate]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Icon-Mac-OS.png|alt=OS - OS X|24x24px|link=OS - OS X]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[[Image:Icon-Autoit.png|alt=AutoIt|24x24px|link=Language - AutoIt]] [[Language - AutoIt|AutoIt]]&lt;br /&gt;
|style=&amp;quot;background: #f0f0ff&amp;quot; align=center| [[Language - AutoIt#Quick Downloads|Quick Downloads]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| All Devices &lt;br /&gt;
|style=&amp;quot;background: #E28585&amp;quot; align=center| None&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Level-01.png|link=|alt=Small]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Icon-Windows.png|alt=OS - Windows|24x24px|link=OS - Windows]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[[Image:Icon-Ruby.png|alt=Ruby|24x24px|link=Language - Ruby]] [[Language - Ruby|Ruby]] &lt;br /&gt;
|style=&amp;quot;background: #f0f0ff&amp;quot; align=center| [[Language - Ruby#Quick Downloads|Quick Downloads]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| All Devices &lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| All Devices&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Level-01.png|link=|alt=Small]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Icon-Mac-OS.png|alt=OS - OS X|24x24px|link=OS - OS X]]  [[Image:Icon-Linux.png|alt=OS - Linux|24x24px|link=OS - Linux]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|&#039;&#039;&#039;Science and Math&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[[Image:Icon-LabVIEW.png|alt=LabVIEW|24x24px|link=Language - LabVIEW]] [[Language - LabVIEW|LabVIEW]] &lt;br /&gt;
|style=&amp;quot;background: #f0f0ff&amp;quot; align=center| [[Language - LabVIEW#Quick Downloads|Quick Downloads]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| All Devices &lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| All Devices&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Level-04.png|link=|alt=Moderate]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Icon-Windows.png|alt=OS - Windows|24x24px|link=OS - Windows]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[[Image:Icon-Matlab.png|alt=MATLAB|24x24px|link=Language - MATLAB]] [[Language - MATLAB|MATLAB]]&lt;br /&gt;
|style=&amp;quot;background: #f0f0ff&amp;quot; align=center| [[Language - MATLAB#Quick Downloads|Quick Downloads]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| All Devices &lt;br /&gt;
|style=&amp;quot;background: #FFC17F&amp;quot; align=center| Some Devices&lt;br /&gt;
|style=&amp;quot;background: #E28585&amp;quot; align=center| X&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #E28585&amp;quot; align=center| X&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Level-02.png|link=|alt=Moderate]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Icon-Windows.png|alt=OS - Windows|24x24px|link=OS - Windows]]  [[Image:Icon-Mac-OS.png|alt=OS - OS X|24x24px|link=OS - OS X]]  [[Image:Icon-Linux.png|alt=OS - Linux|24x24px|link=OS - Linux]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|&#039;&#039;&#039;Multimedia&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[[Image:Icon-Flash AS3.png|alt=Flash AS3|24x24px|link=Language - Flash AS3]] [[Language - Flash AS3|Flash AS3]] &lt;br /&gt;
|style=&amp;quot;background: #f0f0ff&amp;quot; align=center| [[Language - Flash AS3#Quick Downloads|Quick Downloads]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| All Devices &lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| All Devices&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Level-02.png|link=|alt=Extensive]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Icon-Windows.png|alt=OS - Windows|24x24px|link=OS - Windows]]  [[Image:Icon-Mac-OS.png|alt=OS - OS X|24x24px|link=OS - OS X]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[[Image:Icon-MaxMSP.png|24x24px|alt=Max/MSP|link=Language - Max/MSP]] [[Language - Max/MSP|Max/MSP]]&lt;br /&gt;
|style=&amp;quot;background: #f0f0ff&amp;quot; align=center| [[Language - Max/MSP#Quick Downloads|Quick Downloads]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| All Devices &lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| All Devices&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Level-02.png|link=|alt=Moderate]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Icon-Windows.png|alt=OS - Windows|24x24px|link=OS - Windows]]  [[Image:Icon-Mac-OS.png|alt=OS - OS X|24x24px|link=OS - OS X]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[[Image:Icon-Adobe Director.png|alt=Adobe Director|24x24px|link=Language - Adobe Director]] [[Language - Adobe Director|Adobe Director]]&lt;br /&gt;
|style=&amp;quot;background: #f0f0ff&amp;quot; align=center| [[Language - Adobe Director#Quick Downloads|Quick Downloads]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| All Devices &lt;br /&gt;
|style=&amp;quot;background: #EFE973&amp;quot; align=center| InterfaceKit Only&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Level-01.png|link=|alt=Small]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Icon-Windows.png|alt=OS - Windows|24x24px|link=OS - Windows]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[[Image:Icon-LiveCode.png|alt=LiveCode|24x24px|link=Language - LiveCode]] [[Language - LiveCode|LiveCode]] &lt;br /&gt;
|style=&amp;quot;background: #f0f0ff&amp;quot; align=center| [[Language - LiveCode#Quick Downloads|Quick Downloads]]&lt;br /&gt;
|style=&amp;quot;background: #EFE973&amp;quot; align=center| InterfaceKit Only &lt;br /&gt;
|style=&amp;quot;background: #EFE973&amp;quot; align=center| InterfaceKit Only&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #E28585&amp;quot; align=center| X&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Level-01.png|link=|alt=Small]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Icon-Windows.png|alt=OS - Windows|24x24px|link=OS - Windows]]  [[Image:Icon-Mac-OS.png|alt=OS - OS X|24x24px|link=OS - OS X]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|&#039;&#039;&#039;Other Languages&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[[Image:Icon-CSharp.png|24x24px|alt=C Sharp (.NET Compact Framework)|link=Language - C Sharp (.NET Compact Framework)]] [[Language - C Sharp (.NET Compact Framework)|C# (.NET Compact)]]&lt;br /&gt;
|style=&amp;quot;background: #f0f0ff&amp;quot; align=center| [[Language - C Sharp (.NET Compact Framework)#Quick Downloads|Quick Downloads]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| All Devices &lt;br /&gt;
|style=&amp;quot;background: #FFC17F&amp;quot; align=center| Some Devices&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Level-01.png|link=|alt=Small]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Icon-Windows CE.png|alt=OS - Windows CE|24x24px|link=OS - Windows CE]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[[Image:Icon-Visual Basic Net.png|24x24px|alt=Visual Basic (.NET Compact Framework)|link=Language - Visual Basic (.NET Compact Framework)]] [[Language - Visual Basic (.NET Compact Framework)|Visual Basic&amp;lt;br&amp;gt; (.NET Compact Framework)]]&lt;br /&gt;
|style=&amp;quot;background: #f0f0ff&amp;quot; align=center| [[Language - Visual Basic (.NET Compact Framework)#Quick Downloads|Quick Downloads]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| All Devices &lt;br /&gt;
|style=&amp;quot;background: #E28585&amp;quot; align=center| None&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Level-01.png|link=|alt=Small]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Icon-Windows CE.png|alt=OS - Windows CE|24x24px|link=OS - Windows CE]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[[Image:Icon-Visual Basic for Applications.png|alt=Visual Basic for Applications|24x24px|link=Language - Visual Basic for Applications]] [[Language - Visual Basic for Applications|Visual Basic for Apps]] &lt;br /&gt;
|style=&amp;quot;background: #f0f0ff&amp;quot; align=center| [[Language - Visual Basic for Applications#Quick Downloads|Quick Downloads]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| All Devices &lt;br /&gt;
|style=&amp;quot;background: #FFC17F&amp;quot; align=center| Some Devices&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Level-01.png|link=|alt=Small]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Icon-Windows.png|alt=OS - Windows|24x24px|link=OS - Windows]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[[Image:Icon-Visual Basic Script.png|alt=Visual Basic Script|24x24px|link=Language - Visual Basic Script]] [[Language - Visual Basic Script|Visual Basic Script]]&lt;br /&gt;
|style=&amp;quot;background: #f0f0ff&amp;quot; align=center| [[Language - Visual Basic Script#Quick Downloads|Quick Downloads]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| All Devices &lt;br /&gt;
|style=&amp;quot;background: #FFC17F&amp;quot; align=center| Some Devices&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Checkmark.png|link=]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Level-01.png|link=|alt=Small]]&lt;br /&gt;
|style=&amp;quot;background: #ade6ab&amp;quot; align=center| [[Image:Icon-Windows.png|alt=OS - Windows|24x24px|link=OS - Windows]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; A direct USB connection would be plugging the Phidget into a USB port and using it locally.  This is the typical way to use a Phidget.  However, some platforms (such as the iPhone platform) do not have USB ports and hence can only use a Phidget over a network, via the [[Phidget WebService]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; Native library support means that the calls you make to a Phidget in this language are in the language as well.  If the calls are non-native, the use of Phidgets is through an external library linker, such as callib() in MATLAB, for example.  The core Phidget library is written in C, and most other languages use this library as their core, but a &#039;Native&#039; interface cleanly hides this detail.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;&amp;amp;dagger;&amp;lt;/sup&amp;gt; Most languages have code samples for all Phidgets, but some have only some devices (visit the language page to learn which ones), and some only have an Interface Kit example. The Phidget Interface Kit is a common Phidget which provides an interface with analog sensors, digital input, and digital output.  So, when we choose which examples to write, the Interface Kit is often at the top of our customer&#039;s lists.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;Honeycomb&amp;quot;&amp;gt;[[Image:Icon-Android_Honeycomb.png|24px|link=]]&amp;lt;/span&amp;gt;Android Honeycomb Version 3.1 or Higher Only&lt;br /&gt;
&lt;br /&gt;
==Third Party Support==&lt;br /&gt;
&lt;br /&gt;
{{GentleAlert|&#039;&#039;&#039;These products must be purchased directly from these companies and all support calls must be directed to them&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
Some third party companies also offer and support software programs that work with Phidgets boards. Phidgets does not have a certification program and does not make any warranty about these products.&lt;br /&gt;
&lt;br /&gt;
In alphabetical order:&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border:1px solid darkgray;&amp;quot; cellpadding=&amp;quot;7px;&amp;quot;&lt;br /&gt;
|-style=&amp;quot;background: #f0f0f0&amp;quot; align=center &lt;br /&gt;
! Company &lt;br /&gt;
! Product&lt;br /&gt;
! Runs On&lt;br /&gt;
! Website&lt;br /&gt;
! style=&amp;quot;width:50%;&amp;quot; | Synopsis&lt;br /&gt;
! Product Information&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|&#039;&#039;&#039;24U&#039;&#039;&#039;&lt;br /&gt;
|24U Phidgets Plug-in 1.0&lt;br /&gt;
|Mac, Windows&lt;br /&gt;
|[http://www.24usoftware.com/plugins.php Website]&lt;br /&gt;
|24U Phidgets Plug-In lets you connect different kind of phidgets (www.phidgets.com) to your computer&#039;s USB port and interact with them directly from FileMaker Pro.&lt;br /&gt;
|[[Image:Pdficon_small.gif|link={{SERVER}}/documentation/ThirdPartyInfo/ThirdPartySoftware/24U.pdf]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|&#039;&#039;&#039;DSPRobotics&#039;&#039;&#039;&lt;br /&gt;
|Flowstone &lt;br /&gt;
|Windows 2000/XP/Vista/7/Embedded&lt;br /&gt;
|[http://www.dsprobotics.com/ Website]&lt;br /&gt;
|Graphical Programming Language aimed at real-time Digital Signal Processing.(DSP), Robotics and Embedded applications. FlowStone is a drag and drop environment where you combine high-level and low-level modules to build real time applications.&lt;br /&gt;
|[[Image:Pdficon_small.gif|link={{SERVER}}/documentation/ThirdPartyInfo/ThirdPartySoftware/FlowStone.pdf]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|&#039;&#039;&#039;MANIPIL&#039;&#039;&#039;&lt;br /&gt;
|Visual Domotique&lt;br /&gt;
|Windows XP/Vista/7&lt;br /&gt;
|[http://www.manipil.ch/cms1/vd/tutoriels/setup-and-to-use-a-phidget-module.html Website]&lt;br /&gt;
|Visual Domotique is a Graphical I/O programming for Windows XP/Vista/7. Various components allow you to draw electrical schema and control panel. No need to know how to program to use this software. Varied uses are possible: Home automation, security, hobby, Control process education... Available in French. &lt;br /&gt;
|[[Image:Pdficon_small.gif|link={{SERVER}}/documentation/ThirdPartyInfo/ThirdPartySoftware/Manipil_en.pdf]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|&#039;&#039;&#039;PCRBOX&#039;&#039;&#039;&lt;br /&gt;
|PCR Automation&lt;br /&gt;
|Windows XP/Vista/7 (32 &amp;amp; 64bit)&lt;br /&gt;
|[http://www.pcrbox.com/en/ Website]&lt;br /&gt;
|PCR Automation is an easy to use software that works immediately without the need for any programming. It interfaces with the 1018, 1070 and 1072. Several interfaces can be opened simultaneously, each in a different window. Each input / output can be customized (label, sensor, offset, units, sensitivity, recording ...). The log files can be automatically sent by E-mail. Users can add their own sensors to the library of thirty Phidgets sensors.&lt;br /&gt;
|[[Image:Pdficon_small.gif|link={{SERVER}}/documentation/ThirdPartyInfo/ThirdPartySoftware/pcr-automation-en.pdf]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|&#039;&#039;&#039;PiXCL Automation Technologies&#039;&#039;&#039;&lt;br /&gt;
|PiXCL Advanced Imaging 10.2&lt;br /&gt;
|Windows XP/Vista/7&lt;br /&gt;
|[http://pixcl.com/Using-Phidgets-with-PiXCL.htm Website]&lt;br /&gt;
|PiXCL is a powerful and easy-to-learn event driven interpreted language for the fast creation of image acquisition, processing and advanced analysis applications. The suite includes a compiler and development studio with context sensitive help and plenty of sample code. V10.1 provides you with the tools to create applications that combine Phidget devices with digital cameras and scanners.&lt;br /&gt;
|[[Image:Pdficon_small.gif|link={{SERVER}}/documentation/ThirdPartyInfo/ThirdPartySoftware/PiXCL.pdf]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|&#039;&#039;&#039;SoapBox Automation&#039;&#039;&#039;&lt;br /&gt;
|SoapBox Snap&lt;br /&gt;
|Windows XP/Vista/7&lt;br /&gt;
|[http://soapboxautomation.com/products/soapbox-snap/ Website]&lt;br /&gt;
|SoapBox Snap is a free and open source PC-based automation platform. It includes a ladder logic editor and a “soft” runtime right out of the box.&lt;br /&gt;
|[[Image:Pdficon_small.gif|link={{SERVER}}/documentation/ThirdPartyInfo/ThirdPartySoftware/SoapBox.pdf]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|&#039;&#039;&#039;UACh - Universida Austral de Chile&#039;&#039;&#039;&lt;br /&gt;
|monoBOTICS-icarus&lt;br /&gt;
|Linux&lt;br /&gt;
|[http://www.monobotics.ic.uach.cl/ Website]&lt;br /&gt;
|The monoBOTICS project aims to become an OpenSource Framework, to facilitate the tasks of design, simulation and implementation of solutions for areas of Robotics and Automation, both for people with basic knowledge of programming, as for more advanced developers.&lt;br /&gt;
|[[Image:Pdficon_small.gif|link={{SERVER}}/documentation/ThirdPartyInfo/ThirdPartySoftware/monoBOTICS.pdf]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|&#039;&#039;&#039;Omnipotence Software&#039;&#039;&#039;&lt;br /&gt;
|ECS (Event Control System)&lt;br /&gt;
|Windows, Linux&lt;br /&gt;
|[http://OmnipotenceSoftware.com Website]&lt;br /&gt;
|Powerful and flexible, general purpose automation software for commercial and residential applications.  Supports simple schedules and English-like scripts for more elaborate logic.&lt;br /&gt;
|[[File:ExternalLink.png|15px|link=http://omnipotencesoftware.com/wpc.htm]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Legacy Languages==&lt;br /&gt;
&lt;br /&gt;
Legacy languages are languages which we supported in the past; however, we no longer actively develop or support them.  We provide this software page information for the limited existing users:  &lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border:1px solid darkgray;&amp;quot; cellpadding=&amp;quot;7px;&amp;quot;&lt;br /&gt;
|-style=&amp;quot;background: #f0f0f0&amp;quot; align=center &lt;br /&gt;
! Language&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Icon-REALBasic.png|alt=REALBasic|24x24px|link=Language - REALBasic]] [[Language - REALBasic|REALBasic]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[[Image:Icon-Flex AS3.png|alt=Flex AS3|24x24px|link=Language - Flex AS3]] [[Language - Flex AS3|Flex AS3]] &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[[Image:Icon-Robot Studio.png|alt=Robotics Studio|24x24px|link=Language - Microsoft Robotics Studio]] [[Language - Microsoft Robotics Studio|Microsoft Robotics Studio]] &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|[[Image:Icon-Simulink.png|alt=Simulink|24x24px|link=Language - Simulink]] [[Language - Simulink|Simulink]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|[[Image:Icon-Delphi.png|alt=Delphi|24x24px|link=Language - Delphi]] [[Language - Delphi|Delphi]] &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
If you have an existing code base in these languages and the legacy status of these languages is a serious inconvenience, please [[Contact Us]].&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=Language_-_Delphi&amp;diff=23852</id>
		<title>Language - Delphi</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=Language_-_Delphi&amp;diff=23852"/>
		<updated>2016-06-17T13:58:09Z</updated>

		<summary type="html">&lt;p&gt;Burley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Language]]&lt;br /&gt;
{{OSLang|[[File:Icon-Delphi.png|64px|alt=|link=]]|&#039;&#039;&#039;[http://www.embarcadero.com/products/delphi Embarcadero Delphi]&#039;&#039;&#039; is an integrated development environment for console, desktop graphical, web application, and mobile applications.}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
{{LanguageSupport|Delphi|the complete Phidget API|AdvancedServo, Servo, Phidget Interface Kit, Phidget IR, Encoder, and RFID.|Windows|}}&lt;br /&gt;
&lt;br /&gt;
==Quick Downloads==&lt;br /&gt;
{{QuickDownloads|Delphi|&lt;br /&gt;
{{APIQuickDownloads|{{SERVER}}/documentation/COM_API_Manual.pdf COM}}|&lt;br /&gt;
{{ExampleQuickDownloads|{{SERVER}}/downloads/examples/Delphi.zip Delphi|}}|&lt;br /&gt;
{{WindowsQuickDownloads}}&lt;br /&gt;
}}&lt;br /&gt;
==Getting Started with Delphi==&lt;br /&gt;
&lt;br /&gt;
If you are new to writing code for Phidgets, we recommend starting by running, then modifying existing examples. This will allow you to:&lt;br /&gt;
{{ExampleCodeReasons}}&lt;br /&gt;
&lt;br /&gt;
Delphi is a .COM-based language.  Currently Windows is the only supported operating system for Delphi:&lt;br /&gt;
*[[#Windows(2000/XP/Vista/7)|Windows 2000 / XP / Vista / 7]]&lt;br /&gt;
&lt;br /&gt;
==Windows(XP/Vista/7/8)==&lt;br /&gt;
&lt;br /&gt;
===Borland Delphi===&lt;br /&gt;
&lt;br /&gt;
The Phidget examples were written using Borland Delphi 2005 and 7, although they also work with other versions of Delphi as described on this Delphi Language page.  We include the method to import ActiveX objects onto these platforms, but our current in-depth support for using our examples and writing your own code is only for [[#Embarcadero Delphi XE2|Embarcadero Delphi XE2]].&lt;br /&gt;
&lt;br /&gt;
====Import ActiveX Objects====&lt;br /&gt;
 &lt;br /&gt;
The ActiveX objects installed with the Phidget libraries are not automatically imported into Delphi, so to begin you will need to manually import them.&lt;br /&gt;
&lt;br /&gt;
In Delphi 2005/2006:&lt;br /&gt;
&lt;br /&gt;
#Go to File&amp;amp;rarr;New&amp;amp;rarr;Package - Delphi for Win32. Rename and save the package using File&amp;amp;rarr;Save Project As...&lt;br /&gt;
#Import the ActiveX component, go to Component&amp;amp;rarr;Import Component.&lt;br /&gt;
#Choose Inport ActiveX Control and click Next&lt;br /&gt;
#Select Phidget Library 2.1 and click Next&lt;br /&gt;
#Click Next&lt;br /&gt;
#Select ‘Add unit to [Package Name] project’ and click Finish.&lt;br /&gt;
#Install the ActiveX package you have created by right-mouse-clicking the package name in the Project Manager pane and selecting ‘Install’.&lt;br /&gt;
#Delphi should now display a confirmation that the package was installed.  Click ok and save the package.&lt;br /&gt;
#When you open a new or existing application, you should now see all the Phidget device control objects listed under the ActiveX category.&lt;br /&gt;
&lt;br /&gt;
In slightly newer versions of Delphi:&lt;br /&gt;
&lt;br /&gt;
#Go to Component&amp;amp;rarr;Import Component...&lt;br /&gt;
#Choose “Import ActiveX Control” and click Next&lt;br /&gt;
#Pick Phidget Library 2.1 from the list and click Next&lt;br /&gt;
#Set the palette Page to ActiveX and check the Generate Component Wrappers option&lt;br /&gt;
#Choose Install into a new package and click next&lt;br /&gt;
#Give the package a name and description such as “Phidgets”, and then click Finish&lt;br /&gt;
&lt;br /&gt;
Once installed, all future projects will be able to use the Phidget ActiveX objects.&lt;br /&gt;
&lt;br /&gt;
===Embarcadero Delphi XE2===&lt;br /&gt;
&lt;br /&gt;
Embarcadero Delphi is the more recent platform for developing Delphi on.  To use it, we follow the same setup procedure as Borland, which is to first import the Phidget library as an ActiveX object.  We then offer in-depth instructions on how to use the Phidget examples, both as described below.&lt;br /&gt;
&lt;br /&gt;
====Import ActiveX Objects====&lt;br /&gt;
&lt;br /&gt;
The ActiveX objects installed with the Phidget libraries are not automatically imported into Delphi, so to begin you will need to manually import them.  In Embarcadero XE2, do the following:&lt;br /&gt;
&lt;br /&gt;
1. Go to Component&amp;amp;rarr;Import Component...&lt;br /&gt;
&lt;br /&gt;
[[Image:Delphi open component.png|link=|alt=]]&lt;br /&gt;
&lt;br /&gt;
2. Choose “Import ActiveX Control” and click Next:&lt;br /&gt;
&lt;br /&gt;
[[Image:Delphi import activex.png|link=|alt=]]&lt;br /&gt;
&lt;br /&gt;
3. Pick Phidget Library 2.1 from the list and click Next:&lt;br /&gt;
&lt;br /&gt;
[[Image:Delphi register activex.png|link=|alt=]]&lt;br /&gt;
&lt;br /&gt;
4. Choose Install into a new package and click next:&lt;br /&gt;
&lt;br /&gt;
[[Image:Delphi as new package.png|link=|alt=]]&lt;br /&gt;
&lt;br /&gt;
5. Give the package a name and description such as “Phidgets”, and then click Finish.&lt;br /&gt;
&lt;br /&gt;
6. To finish, the objects need to be re-linked.  When prompted to do this, click Yes:&lt;br /&gt;
&lt;br /&gt;
[[Image:Delphi finish activex.png|link=|alt=]]&lt;br /&gt;
&lt;br /&gt;
At this point, opening a new project will have the use of the Phidget library.  If you already had a project open, you will need to close and re-open it for the linking to Phidgets to occur.&lt;br /&gt;
&lt;br /&gt;
====Use Our Examples====&lt;br /&gt;
&lt;br /&gt;
After you have installed the [[#Install ActiveX Objects|Active X objects]], you can open our examples and run code to test your device.  {{FindYourDevice}}&lt;br /&gt;
&lt;br /&gt;
First download the [{{SERVER}}/downloads/examples/Delphi.zip Delphi examples] and unpack them.  Each project has its own folder.  You can open an existing project and navigate to the project file itself to open it:&lt;br /&gt;
&lt;br /&gt;
[[Image:Delphi open project.png|link=|alt=]]&lt;br /&gt;
&lt;br /&gt;
Then, the project and all of its files will appear in your project navigator on the right.  Plug in your Phidget to your computer, and make sure no other programs are accessing the Phidget.  Right-click on the project root and select &amp;quot;Run&amp;quot;.  For example, for the Interface Kit Phidget, your project will probably look something like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Delphi run interfacekit.png|link=|alt=]]&lt;br /&gt;
&lt;br /&gt;
The GUI form of the example will open, and you can test your device.&lt;br /&gt;
&lt;br /&gt;
====Write Your Own Code====&lt;br /&gt;
&lt;br /&gt;
In Embarcadero, the lower right panel displays the available ActiveX objects for coding.  You can create a new project and then simply drag the ActiveX object that matches your Phidget device into your project.&lt;br /&gt;
&lt;br /&gt;
We have a [[#Follow The Examples|teaching section]] below which includes code snippets to augment the examples and help you compose your project.&lt;br /&gt;
&lt;br /&gt;
==Follow The Examples==&lt;br /&gt;
&lt;br /&gt;
By following the instructions above, you probably now have a working example and want to understand it better so you can change it to do what you want.  This teaching section has resources for you to learn from the examples and write your own.&lt;br /&gt;
&lt;br /&gt;
Your main reference for writing Delphi code will be our .COM API information, with syntax for all of our functions:&lt;br /&gt;
&lt;br /&gt;
{{UsingAPhidgetInCodeGeneral|both of which are available in Delphi|[{{SERVER}}/documentation/COM_API_Manual.pdf .COM API]}}&lt;br /&gt;
&lt;br /&gt;
===Code Snippets===&lt;br /&gt;
&lt;br /&gt;
Specific calls in Delphi will differ in syntax from those on the [[General Phidget Programming]] page, but the concepts stay the same.  &lt;br /&gt;
&lt;br /&gt;
It may help to have the [[General Phidget Programming]] page and this section open at the same time, because they parallel each other and you can refer to the Delphi syntax.  However, &#039;&#039;many&#039;&#039; additional concepts are covered on the General Phidget Programming page on a high level, such as using multiple Phidgets, handling errors, and different styles of programming.&lt;br /&gt;
&lt;br /&gt;
====Step One: Initialize and Open====&lt;br /&gt;
&lt;br /&gt;
Before you can use the Phidget, you must declare and initialize its ActiveX object. The simplest method is to place the control from the ActiveX component tab on to your form. For this tutorial, we create a Phidget Interface Kit control (PhidgetInterfaceKit1) and then add a text edit field to the form for the purpose of capturing simple output. The object name for any type of Phidget is listed in the API manual. &lt;br /&gt;
Every type of Phidget also inherits functionality from the Phidget base class.&lt;br /&gt;
&lt;br /&gt;
Next, we need to tell the program to try and connect to the Phidget through a call to open(). &lt;br /&gt;
The open will tell the program to continuously try to connect to a Phidget, based on the parameters given, even trying to reconnect if it gets disconnected:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;source&amp;quot;&amp;gt;&amp;lt;syntaxhighlight lang=delphi&amp;gt;&lt;br /&gt;
  procedure TForm1.FormCreate(Sender: TObject);&lt;br /&gt;
  begin&lt;br /&gt;
     PhidgetInterfaceKit1.Open(-1);&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The parameters (here just a -1) can also be used to open the first Phidget of a type it can find, open based on its serial number, or even open across the network. The API manual lists all of the available modes that open provides. &lt;br /&gt;
&lt;br /&gt;
One important thing to remember is that when working with Phidgets, a local connection will reserve the device until closed. This prevents any other instances from retrieving data from the Phidget, including other programs. The one connection per device limit does not apply when exclusively using the Phidget WebService. To open multiple Phidgets, they each need their own ActiveX object, and you can distinguish between them by serial number.&lt;br /&gt;
&lt;br /&gt;
====Step Two: Wait for Attachment (plugging in) of the Phidget====&lt;br /&gt;
&lt;br /&gt;
Calling open does not guarantee you can use the Phidget immediately. To use the Phidget, it must be plugged in (attached). We can handle this by using event driven programming and tracking the AttachEvents and DetachEvents, or we can handle this by calling WaitForAttachment. You can put the wait function right after your open function.  So we can modify our opening block to read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;source&amp;quot;&amp;gt;&amp;lt;syntaxhighlight lang=delphi&amp;gt;&lt;br /&gt;
  procedure TForm1.FormCreate(Sender: TObject);&lt;br /&gt;
  begin&lt;br /&gt;
     PhidgetInterfaceKit1.Open(-1);&lt;br /&gt;
     PhidgetInterfaceKit1.WaitForAttachment(3000);&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This function works for any Phidget. WaitForAttachment will block indefinitely until a connection is made to the Phidget, or an optional timeout is exceeded.&lt;br /&gt;
&lt;br /&gt;
====Step Three: Do Things with the Phidget====&lt;br /&gt;
&lt;br /&gt;
We recommend the use of [[General Phidget Programming#Event Driven Code|event driven programming]] when working with Phidgets. This allows the program to execute other tasks until the Phidget fires a new event. &lt;br /&gt;
&lt;br /&gt;
In Delphi, when the event library was installed as described in the [[#Use Our Examples|Use Our Examples]] section, it added Phidget ActiveX components for each type of Phidget. These ActiveX components will show up in the toolbox under the ActiveX tab, usually in the lower right. The ActiveX object for your Phidget can be added to the form and then hooked to the event handlers you wish to use like any other control. &lt;br /&gt;
&lt;br /&gt;
For example, for a Phidget21COMIPhidgetInterfaceKitEvents control, the event handler looks like the following:  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;source&amp;quot;&amp;gt;&amp;lt;syntaxhighlight lang=delphi&amp;gt;&lt;br /&gt;
  procedure TForm1.PhidgetInterfaceKit1SensorChange(ASender: TObject; Index, SensorValue: Integer);&lt;br /&gt;
  begin&lt;br /&gt;
       Edit1.Text := IntToStr(Index) + &#039;: &#039; + IntToStr(SensorValue);&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With this method, the code inside PhidgetInterfaceKit1SensorChange will get executed every time the PhidgetInterfaceKit reports a change on one of its analog inputs. Some events such as Attach and Detach belong to the base Phidget object and thus are common to all types of Phidgets.  Other events, like this sensor change one, are specific to the type of Phidget.  Please refer to the COM API manual for a full list of events and their general usage.&lt;br /&gt;
&lt;br /&gt;
Some values can be directly read and set on the Phidget. These functions can be used inside a polling loop as an alternative to event driven programming.    Simply use the CallString such as SensorValue[Index] or OutputState[Index] for PhidgetInterfaceKits:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;source&amp;quot;&amp;gt;&amp;lt;syntaxhighlight lang=delphi&amp;gt;&lt;br /&gt;
  PhidgetInterfaceKit1.OutputState[0] := true;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Step Four: Close and Delete====&lt;br /&gt;
&lt;br /&gt;
Remember that the Open call reserves the Phidget for sole use by your program.  Close removes this lock.  You can call Close any time outside of the Phidget&#039;s own event handlers to end the connection.&lt;br /&gt;
&lt;br /&gt;
====Enabling Logging====&lt;br /&gt;
&lt;br /&gt;
Often it’s a good idea to enable logging during development for debugging purposes. This log, depending on the level set, will record certain events and errors from Phidgets. In Delphi, this is accomplished by calling EnableLogging(logLevel, filename) on the Phidget object. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;source&amp;quot;&amp;gt;&amp;lt;syntaxhighlight lang=delphi&amp;gt;&lt;br /&gt;
  PhidgetInterfaceKit1.EnableLogging(6, &#039;testlog.txt&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Similarly, you can call DisableLogging() at the end of your program to shut it off. Should you need to contact Phidgets for support, including this log is very helpful for revealing the cause of the problem. &lt;br /&gt;
Please see the Programming Manual for a general discussion on Phidget logging and the levels provided.&lt;br /&gt;
&lt;br /&gt;
{{MoreHowTos}}&lt;br /&gt;
&lt;br /&gt;
==Common Problems and Solutions/Workarounds==&lt;br /&gt;
&lt;br /&gt;
===Embarcadero XE2: The Phidget Manager creates a runtime fault===&lt;br /&gt;
&lt;br /&gt;
In Delphi XE2, you cannot use the Phidget Manager as an object directly.  If you need to open multiple Phidgets of the same device type, use the serial number to distinguish between them.&lt;br /&gt;
&lt;br /&gt;
===Embarcadero XE2 under Windows in Oracle VirtualBox: System Crash===&lt;br /&gt;
&lt;br /&gt;
Embarcadero Delphi does &#039;&#039;not&#039;&#039; work under Windows running as a guest on Oracle&#039;s VirtualBox.  Adding an ActiveX object on such a system will crash the system and appear to destroy it, although a hard power cycle will recover the system.  VMWare does not suffer from this problem, and of course native Windows 7 works fine.&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=File:Belt_drive_assembly_wiki.png&amp;diff=23828</id>
		<title>File:Belt drive assembly wiki.png</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=File:Belt_drive_assembly_wiki.png&amp;diff=23828"/>
		<updated>2016-05-30T19:21:42Z</updated>

		<summary type="html">&lt;p&gt;Burley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=Linear_Motion_Primer&amp;diff=23827</id>
		<title>Linear Motion Primer</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=Linear_Motion_Primer&amp;diff=23827"/>
		<updated>2016-05-30T19:20:38Z</updated>

		<summary type="html">&lt;p&gt;Burley: /* Belt Drive */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The goal of a linear system is to have an object or other subsystem move along a linear track with a controllable velocity and position.  The key features of a linear system are the efficiency with which you can move the load, the speed you can move it at, and the accuracy with which you can position the load along the track.  Typically a linear system will consist of 1 or more rails/shafts with linear bearings which support the load.  The bearing surface is machined to be extremely smooth and is case hardened so it doesn&#039;t deform whatsoever under rated load.  Then you will also need a drive mechanism so that you can actually control the position along your track.  There are a number of options for this such as belt drives, chain drives, and ball screws.  Which you use will depend on your specific requirements so lets briefly discuss why and how you would use each.&lt;br /&gt;
&lt;br /&gt;
==Slides==&lt;br /&gt;
The first choice is for the type of track you use.  The two options available are linear shaft and rail.  &lt;br /&gt;
&lt;br /&gt;
[[Image:Linear_slides.png|link=|700px|center]]&lt;br /&gt;
&lt;br /&gt;
In most cases using rail is preferable.  The continuous support under the shaft minimizes deflection under load and it also has many mounting holes along the track which makes for easier and more secure installation in your system.  Rail also has the potential for longer travel distances as the shaft won&#039;t experience any deflection due to it&#039;s own weight.  Of course, using rail isn&#039;t practical for all applications.  In cases where you need to span a gap of some kind or the surface you are travelling along isn&#039;t easy to mount to then using suspended shaft is a suitable alternative to rail.  There are also flange mount blocks for the shaft so you can mount to a perpendicular surface rather than the pillow blocks shown in the image above.  &lt;br /&gt;
&lt;br /&gt;
==Drive Systems==&lt;br /&gt;
There are three main ways to drive your system available from Phidgets:&lt;br /&gt;
&lt;br /&gt;
===Ball Screws===&lt;br /&gt;
Ball screws allow for very precise positioning with very little backlash.  They are also very efficient, meaning they don&#039;t require very much force to move a sizeable load in comparison to other methods.  A ball screw system typically consists of 4 or 5 elements plus something to turn the screw.  To support the screw you need a drive bearing and a support bearing.  To apply force to your object you need a nut that will move along the screw (you can also have a housing for the nut depending on how you want to attach your load).  Then you of course need the screw itself.  Here is an example of a ball screw assembly using a stepper motor to direct drive the screw:&lt;br /&gt;
&lt;br /&gt;
[[image:Ball_screw_assembly_wiki.png|link=|center|1000px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Since the ball screw isn&#039;t designed to apply force that is &#039;&#039;not&#039;&#039; in the direction of travel we want to use a sliding support system like the rails or shafts mentioned in the slide section.  Ideally we should use 2 rails with 1 or more bearings on each.  For example:&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
|[[image:Ball_screw_drive_full.JPG|center|600px|link=]]||[[image:Belt_driven_ball_screw.JPG|center|600px|link=]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note that here we used a belt to drive the ball screw rather than direct drive off the motor.  This was just so that we could simplify the chassis.  Belt drives allow for more misalignment than shaft couplers do.  Here is a demonstration of how it looks and sounds:&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|_brx8IxYSik}}&lt;br /&gt;
&lt;br /&gt;
===Belt Drive===&lt;br /&gt;
A sufficiently tensioned belt will move linearly between the 2 pulleys it is circulating on.  We can take advantage of this by attaching something to the belt to have it get pulled along as well.  Belt drives are not as precise as ball screws and can have some additional error if there is any slack in the belt.  However, they are easier to set up than a ball screw, are more practical for long distance runs, are cheaper, and they can generally move things more quickly.  &lt;br /&gt;
&lt;br /&gt;
All you need for a belt drive system is a belt, and 2 pulleys.  Similarly to a ball screw system the drive mechanism (your belt) won&#039;t be supporting any load other than in the axis of travel.  This means that you will need a sliding track made from shaft or rail on which to rest your load.  There are a bunch of fancy ways to attach the belt to your load but the reality is it doesn&#039;t take much.  A small metal plate and some screws is really all that is required.  For example:&lt;br /&gt;
&lt;br /&gt;
[[image:Belt_clamp.png|link=|600px|center]]&lt;br /&gt;
&lt;br /&gt;
This style of clamping does reduce the maximum strength of the belt somewhat so you should factor that into your design.  Here is an example of a functional single stage belt drive system:&lt;br /&gt;
&lt;br /&gt;
[[image:Belt_drive_assembly_wiki.png|link=|1500px|center]]&lt;br /&gt;
&lt;br /&gt;
This is all in reference to linear systems.  If you want more information about belt systems in rotary systems you can refer to our [[Rotary Motion Primer]] here.&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|BAnt21tCL8I}}&lt;br /&gt;
&lt;br /&gt;
===Chain Drive===&lt;br /&gt;
Chain drives work in an identical fashion to belt drives.  They are a bit more complicated to work with but they have the advantage that they can handle much more load than a belt of similar size.&lt;br /&gt;
&lt;br /&gt;
Just replace the pulleys with chain sprockets and the belt with a chain and you are done.  Attaching chain to your load is a matter of putting a screw through a hole between chain pitches.  For example:&lt;br /&gt;
&lt;br /&gt;
[[image:Chain_mount.png|link=|center|700px]]&lt;br /&gt;
&lt;br /&gt;
For more information on setting up chain systems you should have a look at our [[Rotary Motion Primer]] which goes into more depth about the specifics of working with roller chains.&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=Linear_Motion_Primer&amp;diff=23825</id>
		<title>Linear Motion Primer</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=Linear_Motion_Primer&amp;diff=23825"/>
		<updated>2016-05-26T20:28:56Z</updated>

		<summary type="html">&lt;p&gt;Burley: /* Chain Drive */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The goal of a linear system is to have an object or other subsystem move along a linear track with a controllable velocity and position.  The key features of a linear system are the efficiency with which you can move the load, the speed you can move it at, and the accuracy with which you can position the load along the track.  Typically a linear system will consist of 1 or more rails/shafts with linear bearings which support the load.  The bearing surface is machined to be extremely smooth and is case hardened so it doesn&#039;t deform whatsoever under rated load.  Then you will also need a drive mechanism so that you can actually control the position along your track.  There are a number of options for this such as belt drives, chain drives, and ball screws.  Which you use will depend on your specific requirements so lets briefly discuss why and how you would use each.&lt;br /&gt;
&lt;br /&gt;
==Slides==&lt;br /&gt;
The first choice is for the type of track you use.  The two options available are linear shaft and rail.  &lt;br /&gt;
&lt;br /&gt;
[[Image:Linear_slides.png|link=|700px|center]]&lt;br /&gt;
&lt;br /&gt;
In most cases using rail is preferable.  The continuous support under the shaft minimizes deflection under load and it also has many mounting holes along the track which makes for easier and more secure installation in your system.  Rail also has the potential for longer travel distances as the shaft won&#039;t experience any deflection due to it&#039;s own weight.  Of course, using rail isn&#039;t practical for all applications.  In cases where you need to span a gap of some kind or the surface you are travelling along isn&#039;t easy to mount to then using suspended shaft is a suitable alternative to rail.  There are also flange mount blocks for the shaft so you can mount to a perpendicular surface rather than the pillow blocks shown in the image above.  &lt;br /&gt;
&lt;br /&gt;
==Drive Systems==&lt;br /&gt;
There are three main ways to drive your system available from Phidgets:&lt;br /&gt;
&lt;br /&gt;
===Ball Screws===&lt;br /&gt;
Ball screws allow for very precise positioning with very little backlash.  They are also very efficient, meaning they don&#039;t require very much force to move a sizeable load in comparison to other methods.  A ball screw system typically consists of 4 or 5 elements plus something to turn the screw.  To support the screw you need a drive bearing and a support bearing.  To apply force to your object you need a nut that will move along the screw (you can also have a housing for the nut depending on how you want to attach your load).  Then you of course need the screw itself.  Here is an example of a ball screw assembly using a stepper motor to direct drive the screw:&lt;br /&gt;
&lt;br /&gt;
[[image:Ball_screw_assembly_wiki.png|link=|center|1000px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Since the ball screw isn&#039;t designed to apply force that is &#039;&#039;not&#039;&#039; in the direction of travel we want to use a sliding support system like the rails or shafts mentioned in the slide section.  Ideally we should use 2 rails with 1 or more bearings on each.  For example:&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
|[[image:Ball_screw_drive_full.JPG|center|600px|link=]]||[[image:Belt_driven_ball_screw.JPG|center|600px|link=]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note that here we used a belt to drive the ball screw rather than direct drive off the motor.  This was just so that we could simplify the chassis.  Belt drives allow for more misalignment than shaft couplers do.  Here is a demonstration of how it looks and sounds:&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|_brx8IxYSik}}&lt;br /&gt;
&lt;br /&gt;
===Belt Drive===&lt;br /&gt;
A sufficiently tensioned belt will move linearly between the 2 pulleys it is circulating on.  We can take advantage of this by attaching something to the belt to have it get pulled along as well.  Belt drives are not as precise as ball screws and can have some additional error if there is any slack in the belt.  However, they are easier to set up than a ball screw, are more practical for long distance runs, are cheaper, and they can generally move things more quickly.  &lt;br /&gt;
&lt;br /&gt;
All you need for a belt drive system is a belt, and 2 pulleys.  Similarly to a ball screw system the drive mechanism (your belt) won&#039;t be supporting any load other than in the axis of travel.  This means that you will need a sliding track made from shaft or rail on which to rest your load.  There are a bunch of fancy ways to attach the belt to your load but the reality is it doesn&#039;t take much.  A small metal plate and some screws is really all that is required.  For example:&lt;br /&gt;
&lt;br /&gt;
[[image:Belt_clamp.png|link=|600px|center]]&lt;br /&gt;
&lt;br /&gt;
This style of clamping does reduce the maximum strength of the belt somewhat so you should factor that into your design.  Here is an example of a functional single stage belt drive system:&lt;br /&gt;
&lt;br /&gt;
[[image:Belt_drive_assembly_wiki.png|link=|1500px|center]]&lt;br /&gt;
&lt;br /&gt;
This is all in reference to linear systems.  If you want more information about belt systems in rotary systems you can refer to our rotary primer here  INSERT LINK HERE.&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|BAnt21tCL8I}}&lt;br /&gt;
&lt;br /&gt;
===Chain Drive===&lt;br /&gt;
Chain drives work in an identical fashion to belt drives.  They are a bit more complicated to work with but they have the advantage that they can handle much more load than a belt of similar size.&lt;br /&gt;
&lt;br /&gt;
Just replace the pulleys with chain sprockets and the belt with a chain and you are done.  Attaching chain to your load is a matter of putting a screw through a hole between chain pitches.  For example:&lt;br /&gt;
&lt;br /&gt;
[[image:Chain_mount.png|link=|center|700px]]&lt;br /&gt;
&lt;br /&gt;
For more information on setting up chain systems you should have a look at our [[Rotary Motion Primer]] which goes into more depth about the specifics of working with roller chains.&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=File:Murvv_chain.jpg&amp;diff=23824</id>
		<title>File:Murvv chain.jpg</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=File:Murvv_chain.jpg&amp;diff=23824"/>
		<updated>2016-05-25T19:29:38Z</updated>

		<summary type="html">&lt;p&gt;Burley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=File:Chain_link_insert_wiki.png&amp;diff=23823</id>
		<title>File:Chain link insert wiki.png</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=File:Chain_link_insert_wiki.png&amp;diff=23823"/>
		<updated>2016-05-25T19:29:37Z</updated>

		<summary type="html">&lt;p&gt;Burley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=Rotary_Motion_Primer&amp;diff=23822</id>
		<title>Rotary Motion Primer</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=Rotary_Motion_Primer&amp;diff=23822"/>
		<updated>2016-05-25T19:15:19Z</updated>

		<summary type="html">&lt;p&gt;Burley: Created page with &amp;quot;In rotary systems, you have a rotating shaft which applies torque to do work.  Typically this shaft is turned by an electric motor of some kind and then, through a series of b...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In rotary systems, you have a rotating shaft which applies torque to do work.  Typically this shaft is turned by an electric motor of some kind and then, through a series of belts/chains/couplers transmits that power to a final output shaft or arm or wheel which accomplishes the desired task.  Why not just use the output shaft of the motor directly?  There are two main reasons:&lt;br /&gt;
&lt;br /&gt;
*You might want to gear the motor down further to increase the torque available by using pulleys or sprockets of differing sizes.  &lt;br /&gt;
*The shaft on the motor itself isn&#039;t really designed for forces other than torque.  It is difficult to put anything of significant size on the shaft without putting too much overhung (radial) load on the shaft which will stall the motor.  &lt;br /&gt;
&lt;br /&gt;
As a result, the base of any rotary system is the rotating shaft.  Phidgets has 4 sizes of shaft available: 8mm, 12mm, 17mm, and 25mm.  The 12, 17, and 25mm shafts also have a variant available with a keyway machined in the length of the shaft if you don&#039;t want to machine it yourself.  These shafts need to be suspended on bearings, we do not sell any bearings currently but they are commonly available components that you can find locally.  For the larger shaft sizes (17 and 25mm) we recommend using steel bearing housings.  &lt;br /&gt;
&lt;br /&gt;
==Motors==&lt;br /&gt;
Every system will need a motor or else there will be no motion (without external input).  Phidgets offers a wide selection of motors of a number of different types that would all be suitable for rotary systems.  For more information on this you can check out our primers for [[DC Motor and Controller Primer|DC motors]] and [[Stepper Motor and Controller Primer|Stepper motors]].&lt;br /&gt;
==Pulleys/Timing belts==&lt;br /&gt;
A belt is simply a loop of tough, flexible material such as rubber and kevlar with a series of teeth that mesh with the teeth on specially designed pulley wheels to synchronize two (or more) rotating shafts.  Belts are a cheap options for shafts that are not axially aligned and tend to run quietly and smoothly.  Belts are typically tensioned either by adjusting center to center distance between pulleys or via a tensioner/idler pulley.  This leads to very low backlash and a high efficiency (as high as 98%).  &lt;br /&gt;
&lt;br /&gt;
We have two types of belts available, 2GT (6mm wide) and 5GT (15mm wide).  Each comes in loops of varying circumferences.  The 2GT belts are rated for 6lbs of working tension while the 5GT are rated for 100lbs.  Belt systems are fairly simple, you have 2 or more pulleys and a belt that goes around all of them.  One of the pulleys is driven by your motor and the other(s) are either connected to your load or in the case of an idler pulley are simply free spinning to act as a tensioner for the belt.  For example, here is a system that uses a belt to transmit power form a stepper motor to a ball screw:&lt;br /&gt;
&lt;br /&gt;
[[image:Belt driven ball screw.JPG|700px|center|link=]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Chain/Sprockets==&lt;br /&gt;
Pretty much everyone has at least seen a chain system in their life in the form of a bicycle.  This system of course is driven by human input rather than a motor.  Automated systems behave no differently though, you have several sprockets, and chain that wraps around them.  One sprocket is driven and the others perform work on the load.  Chain tends to be noisier than belts and cannot be tensioned as tightly meaning there is a bit more backlash inherent in the system.  In exchange though, chain can move much heavier loads for their size.  &lt;br /&gt;
&lt;br /&gt;
We sell ANSI#25 and #40 chain and sprockets (that is 0.25&amp;quot; pitch and 0.5&amp;quot; pitch).  The #25 is rated for 100lbs of working tension while the #40 is rated for 800lbs.  Chain is sold by the meter and you can form closed loops of any length you&#039;d like with the link kits that we sell.  To calculate how many links you will need for a particular sprocket spacing you can use [http://www.botlanta.org/converters/dale-calc/sprocket.html this calculator], just enter in the number of teeth on each sprocket, the chain pitch, and the center to center distance between the sprockets to get the number of links you will need.  If the number is not whole, you should always round up (and probably even add one).  Once you know how many links you will require you will need to use the link kit to connect your chain up.  This is where it gets a bit fiddly.  &lt;br /&gt;
&lt;br /&gt;
There are two ways to connect chain, you can either use a hammer and a pin of some kind to knock out one of the pins which you can then connect up with an offset link:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The other way is if you have a chain breaker tool you can remove an entire link properly and can use a normal split link.  This process is a bit more tricky but it is stronger over all and will increase the length of the chain by a standard amount unlike the offset link which adds a sort of half link to your total length.  To use a split link you must remove the snap ring and the top plate, then slot it into the chain and replace them both.  For example:&lt;br /&gt;
&lt;br /&gt;
[[image:Chain_link_insert_wiki.png|link=|center|1200px]]&lt;br /&gt;
&lt;br /&gt;
A good example of a chain system is our MURVV robot.  Here is how it&#039;s drive mechanism works:&lt;br /&gt;
&lt;br /&gt;
[[Image:Murvv_chain.jpg|link=|center|700px]]&lt;br /&gt;
&lt;br /&gt;
==Worm Gearboxes==&lt;br /&gt;
In general, worm gearboxes are just another type of gearbox that can be fitted to a motor.  The main benefit of a worm drive is that it is all but impossible to back drive even when not powered.  This is due to the steep angle used by the gears as they mesh together.  As a result, this type of gearbox is not the most efficient.  There is a lot of frictional loss at the mesh point and they will tend to run hot.  That being said, in the context of the worm drives Phidget&#039;s sells, they are a means to substantially increase the output torque of our larger motors for applications where maximum strength is required.  All our worm gearboxes have a 30:1 gear ratio and since the bearings built into the gearbox can handle much higher axial and radial loads that motors themselves you can easily direct drive very large loads from these gearboxes without having to set up an external mechanism.&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=File:Belt_driven_ball_screw.JPG&amp;diff=23821</id>
		<title>File:Belt driven ball screw.JPG</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=File:Belt_driven_ball_screw.JPG&amp;diff=23821"/>
		<updated>2016-05-25T19:11:45Z</updated>

		<summary type="html">&lt;p&gt;Burley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=File:Ball_screw_drive_full.JPG&amp;diff=23820</id>
		<title>File:Ball screw drive full.JPG</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=File:Ball_screw_drive_full.JPG&amp;diff=23820"/>
		<updated>2016-05-25T19:11:41Z</updated>

		<summary type="html">&lt;p&gt;Burley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=File:Ball_screw_assembly_wiki.png&amp;diff=23819</id>
		<title>File:Ball screw assembly wiki.png</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=File:Ball_screw_assembly_wiki.png&amp;diff=23819"/>
		<updated>2016-05-25T19:11:34Z</updated>

		<summary type="html">&lt;p&gt;Burley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=File:Belt_clamp.png&amp;diff=23818</id>
		<title>File:Belt clamp.png</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=File:Belt_clamp.png&amp;diff=23818"/>
		<updated>2016-05-25T19:11:28Z</updated>

		<summary type="html">&lt;p&gt;Burley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=File:Linear_slides.png&amp;diff=23817</id>
		<title>File:Linear slides.png</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=File:Linear_slides.png&amp;diff=23817"/>
		<updated>2016-05-25T19:11:24Z</updated>

		<summary type="html">&lt;p&gt;Burley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=File:Chain_mount.png&amp;diff=23816</id>
		<title>File:Chain mount.png</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=File:Chain_mount.png&amp;diff=23816"/>
		<updated>2016-05-25T19:11:22Z</updated>

		<summary type="html">&lt;p&gt;Burley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=Linear_Motion_Primer&amp;diff=23815</id>
		<title>Linear Motion Primer</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=Linear_Motion_Primer&amp;diff=23815"/>
		<updated>2016-05-25T18:31:40Z</updated>

		<summary type="html">&lt;p&gt;Burley: Created page with &amp;quot;The goal of a linear system is to have an object or other subsystem move along a linear track with a controllable velocity and position.  The key features of a linear system a...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The goal of a linear system is to have an object or other subsystem move along a linear track with a controllable velocity and position.  The key features of a linear system are the efficiency with which you can move the load, the speed you can move it at, and the accuracy with which you can position the load along the track.  Typically a linear system will consist of 1 or more rails/shafts with linear bearings which support the load.  The bearing surface is machined to be extremely smooth and is case hardened so it doesn&#039;t deform whatsoever under rated load.  Then you will also need a drive mechanism so that you can actually control the position along your track.  There are a number of options for this such as belt drives, chain drives, and ball screws.  Which you use will depend on your specific requirements so lets briefly discuss why and how you would use each.&lt;br /&gt;
&lt;br /&gt;
==Slides==&lt;br /&gt;
The first choice is for the type of track you use.  The two options available are linear shaft and rail.  &lt;br /&gt;
&lt;br /&gt;
[[Image:Linear_slides.png|link=|700px|center]]&lt;br /&gt;
&lt;br /&gt;
In most cases using rail is preferable.  The continuous support under the shaft minimizes deflection under load and it also has many mounting holes along the track which makes for easier and more secure installation in your system.  Rail also has the potential for longer travel distances as the shaft won&#039;t experience any deflection due to it&#039;s own weight.  Of course, using rail isn&#039;t practical for all applications.  In cases where you need to span a gap of some kind or the surface you are travelling along isn&#039;t easy to mount to then using suspended shaft is a suitable alternative to rail.  There are also flange mount blocks for the shaft so you can mount to a perpendicular surface rather than the pillow blocks shown in the image above.  &lt;br /&gt;
&lt;br /&gt;
==Drive Systems==&lt;br /&gt;
There are three main ways to drive your system available from Phidgets:&lt;br /&gt;
&lt;br /&gt;
===Ball Screws===&lt;br /&gt;
Ball screws allow for very precise positioning with very little backlash.  They are also very efficient, meaning they don&#039;t require very much force to move a sizeable load in comparison to other methods.  A ball screw system typically consists of 4 or 5 elements plus something to turn the screw.  To support the screw you need a drive bearing and a support bearing.  To apply force to your object you need a nut that will move along the screw (you can also have a housing for the nut depending on how you want to attach your load).  Then you of course need the screw itself.  Here is an example of a ball screw assembly using a stepper motor to direct drive the screw:&lt;br /&gt;
&lt;br /&gt;
[[image:Ball_screw_assembly_wiki.png|link=|center|1000px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Since the ball screw isn&#039;t designed to apply force that is &#039;&#039;not&#039;&#039; in the direction of travel we want to use a sliding support system like the rails or shafts mentioned in the slide section.  Ideally we should use 2 rails with 1 or more bearings on each.  For example:&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
|[[image:Ball_screw_drive_full.JPG|center|600px|link=]]||[[image:Belt_driven_ball_screw.JPG|center|600px|link=]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note that here we used a belt to drive the ball screw rather than direct drive off the motor.  This was just so that we could simplify the chassis.  Belt drives allow for more misalignment than shaft couplers do.  Here is a demonstration of how it looks and sounds:&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|_brx8IxYSik}}&lt;br /&gt;
&lt;br /&gt;
===Belt Drive===&lt;br /&gt;
A sufficiently tensioned belt will move linearly between the 2 pulleys it is circulating on.  We can take advantage of this by attaching something to the belt to have it get pulled along as well.  Belt drives are not as precise as ball screws and can have some additional error if there is any slack in the belt.  However, they are easier to set up than a ball screw, are more practical for long distance runs, are cheaper, and they can generally move things more quickly.  &lt;br /&gt;
&lt;br /&gt;
All you need for a belt drive system is a belt, and 2 pulleys.  Similarly to a ball screw system the drive mechanism (your belt) won&#039;t be supporting any load other than in the axis of travel.  This means that you will need a sliding track made from shaft or rail on which to rest your load.  There are a bunch of fancy ways to attach the belt to your load but the reality is it doesn&#039;t take much.  A small metal plate and some screws is really all that is required.  For example:&lt;br /&gt;
&lt;br /&gt;
[[image:Belt_clamp.png|link=|600px|center]]&lt;br /&gt;
&lt;br /&gt;
This style of clamping does reduce the maximum strength of the belt somewhat so you should factor that into your design.  Here is an example of a functional single stage belt drive system:&lt;br /&gt;
&lt;br /&gt;
[[image:Belt_drive_assembly_wiki.png|link=|1500px|center]]&lt;br /&gt;
&lt;br /&gt;
This is all in reference to linear systems.  If you want more information about belt systems in rotary systems you can refer to our rotary primer here  INSERT LINK HERE.&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|BAnt21tCL8I}}&lt;br /&gt;
&lt;br /&gt;
===Chain Drive===&lt;br /&gt;
Chain drives work in an identical fashion to belt drives.  They are a bit more complicated to work with but they have the advantage that they can handle much more load than a belt of similar size.&lt;br /&gt;
&lt;br /&gt;
Just replace the pulleys with chain sprockets and the belt with a chain and you are done.  Attaching chain to your load is a matter of putting a screw through a hole between chain pitches.  For example:&lt;br /&gt;
&lt;br /&gt;
[[image:Chain_mount.png|link=|center|700px]]&lt;br /&gt;
&lt;br /&gt;
For more information on setting up chain systems you should have a look at our rotary primer which goes into more depth about the specifics of working with roller chains.&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=Language_-_Delphi&amp;diff=23812</id>
		<title>Language - Delphi</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=Language_-_Delphi&amp;diff=23812"/>
		<updated>2016-05-16T16:22:51Z</updated>

		<summary type="html">&lt;p&gt;Burley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Language]]&lt;br /&gt;
{{OSLang|[[File:Icon-Delphi.png|64px|alt=|link=]]|&#039;&#039;&#039;[http://www.embarcadero.com/products/delphi Embarcadero Delphi]&#039;&#039;&#039; is an integrated development environment for console, desktop graphical, web application, and mobile applications.}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delphi is used by such a small group of our users that we have decided to drop active support for Delphi.  We will continue support until June 16th 2016.  The libraries will still exist and be available for download and use though no further development will occur and official support will end.  &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
{{LanguageSupport|Delphi|the complete Phidget API|AdvancedServo, Servo, Phidget Interface Kit, Phidget IR, Encoder, and RFID.|Windows|}}&lt;br /&gt;
&lt;br /&gt;
==Quick Downloads==&lt;br /&gt;
{{QuickDownloads|Delphi|&lt;br /&gt;
{{APIQuickDownloads|{{SERVER}}/documentation/COM_API_Manual.pdf COM}}|&lt;br /&gt;
{{ExampleQuickDownloads|{{SERVER}}/downloads/examples/Delphi.zip Delphi|}}|&lt;br /&gt;
{{WindowsQuickDownloads}}&lt;br /&gt;
}}&lt;br /&gt;
==Getting Started with Delphi==&lt;br /&gt;
&lt;br /&gt;
If you are new to writing code for Phidgets, we recommend starting by running, then modifying existing examples. This will allow you to:&lt;br /&gt;
{{ExampleCodeReasons}}&lt;br /&gt;
&lt;br /&gt;
Delphi is a .COM-based language.  Currently Windows is the only supported operating system for Delphi:&lt;br /&gt;
*[[#Windows(2000/XP/Vista/7)|Windows 2000 / XP / Vista / 7]]&lt;br /&gt;
&lt;br /&gt;
==Windows(XP/Vista/7/8)==&lt;br /&gt;
&lt;br /&gt;
===Borland Delphi===&lt;br /&gt;
&lt;br /&gt;
The Phidget examples were written using Borland Delphi 2005 and 7, although they also work with other versions of Delphi as described on this Delphi Language page.  We include the method to import ActiveX objects onto these platforms, but our current in-depth support for using our examples and writing your own code is only for [[#Embarcadero Delphi XE2|Embarcadero Delphi XE2]].&lt;br /&gt;
&lt;br /&gt;
====Import ActiveX Objects====&lt;br /&gt;
 &lt;br /&gt;
The ActiveX objects installed with the Phidget libraries are not automatically imported into Delphi, so to begin you will need to manually import them.&lt;br /&gt;
&lt;br /&gt;
In Delphi 2005/2006:&lt;br /&gt;
&lt;br /&gt;
#Go to File&amp;amp;rarr;New&amp;amp;rarr;Package - Delphi for Win32. Rename and save the package using File&amp;amp;rarr;Save Project As...&lt;br /&gt;
#Import the ActiveX component, go to Component&amp;amp;rarr;Import Component.&lt;br /&gt;
#Choose Inport ActiveX Control and click Next&lt;br /&gt;
#Select Phidget Library 2.1 and click Next&lt;br /&gt;
#Click Next&lt;br /&gt;
#Select ‘Add unit to [Package Name] project’ and click Finish.&lt;br /&gt;
#Install the ActiveX package you have created by right-mouse-clicking the package name in the Project Manager pane and selecting ‘Install’.&lt;br /&gt;
#Delphi should now display a confirmation that the package was installed.  Click ok and save the package.&lt;br /&gt;
#When you open a new or existing application, you should now see all the Phidget device control objects listed under the ActiveX category.&lt;br /&gt;
&lt;br /&gt;
In slightly newer versions of Delphi:&lt;br /&gt;
&lt;br /&gt;
#Go to Component&amp;amp;rarr;Import Component...&lt;br /&gt;
#Choose “Import ActiveX Control” and click Next&lt;br /&gt;
#Pick Phidget Library 2.1 from the list and click Next&lt;br /&gt;
#Set the palette Page to ActiveX and check the Generate Component Wrappers option&lt;br /&gt;
#Choose Install into a new package and click next&lt;br /&gt;
#Give the package a name and description such as “Phidgets”, and then click Finish&lt;br /&gt;
&lt;br /&gt;
Once installed, all future projects will be able to use the Phidget ActiveX objects.&lt;br /&gt;
&lt;br /&gt;
===Embarcadero Delphi XE2===&lt;br /&gt;
&lt;br /&gt;
Embarcadero Delphi is the more recent platform for developing Delphi on.  To use it, we follow the same setup procedure as Borland, which is to first import the Phidget library as an ActiveX object.  We then offer in-depth instructions on how to use the Phidget examples, both as described below.&lt;br /&gt;
&lt;br /&gt;
====Import ActiveX Objects====&lt;br /&gt;
&lt;br /&gt;
The ActiveX objects installed with the Phidget libraries are not automatically imported into Delphi, so to begin you will need to manually import them.  In Embarcadero XE2, do the following:&lt;br /&gt;
&lt;br /&gt;
1. Go to Component&amp;amp;rarr;Import Component...&lt;br /&gt;
&lt;br /&gt;
[[Image:Delphi open component.png|link=|alt=]]&lt;br /&gt;
&lt;br /&gt;
2. Choose “Import ActiveX Control” and click Next:&lt;br /&gt;
&lt;br /&gt;
[[Image:Delphi import activex.png|link=|alt=]]&lt;br /&gt;
&lt;br /&gt;
3. Pick Phidget Library 2.1 from the list and click Next:&lt;br /&gt;
&lt;br /&gt;
[[Image:Delphi register activex.png|link=|alt=]]&lt;br /&gt;
&lt;br /&gt;
4. Choose Install into a new package and click next:&lt;br /&gt;
&lt;br /&gt;
[[Image:Delphi as new package.png|link=|alt=]]&lt;br /&gt;
&lt;br /&gt;
5. Give the package a name and description such as “Phidgets”, and then click Finish.&lt;br /&gt;
&lt;br /&gt;
6. To finish, the objects need to be re-linked.  When prompted to do this, click Yes:&lt;br /&gt;
&lt;br /&gt;
[[Image:Delphi finish activex.png|link=|alt=]]&lt;br /&gt;
&lt;br /&gt;
At this point, opening a new project will have the use of the Phidget library.  If you already had a project open, you will need to close and re-open it for the linking to Phidgets to occur.&lt;br /&gt;
&lt;br /&gt;
====Use Our Examples====&lt;br /&gt;
&lt;br /&gt;
After you have installed the [[#Install ActiveX Objects|Active X objects]], you can open our examples and run code to test your device.  {{FindYourDevice}}&lt;br /&gt;
&lt;br /&gt;
First download the [{{SERVER}}/downloads/examples/Delphi.zip Delphi examples] and unpack them.  Each project has its own folder.  You can open an existing project and navigate to the project file itself to open it:&lt;br /&gt;
&lt;br /&gt;
[[Image:Delphi open project.png|link=|alt=]]&lt;br /&gt;
&lt;br /&gt;
Then, the project and all of its files will appear in your project navigator on the right.  Plug in your Phidget to your computer, and make sure no other programs are accessing the Phidget.  Right-click on the project root and select &amp;quot;Run&amp;quot;.  For example, for the Interface Kit Phidget, your project will probably look something like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Delphi run interfacekit.png|link=|alt=]]&lt;br /&gt;
&lt;br /&gt;
The GUI form of the example will open, and you can test your device.&lt;br /&gt;
&lt;br /&gt;
====Write Your Own Code====&lt;br /&gt;
&lt;br /&gt;
In Embarcadero, the lower right panel displays the available ActiveX objects for coding.  You can create a new project and then simply drag the ActiveX object that matches your Phidget device into your project.&lt;br /&gt;
&lt;br /&gt;
We have a [[#Follow The Examples|teaching section]] below which includes code snippets to augment the examples and help you compose your project.&lt;br /&gt;
&lt;br /&gt;
==Follow The Examples==&lt;br /&gt;
&lt;br /&gt;
By following the instructions above, you probably now have a working example and want to understand it better so you can change it to do what you want.  This teaching section has resources for you to learn from the examples and write your own.&lt;br /&gt;
&lt;br /&gt;
Your main reference for writing Delphi code will be our .COM API information, with syntax for all of our functions:&lt;br /&gt;
&lt;br /&gt;
{{UsingAPhidgetInCodeGeneral|both of which are available in Delphi|[{{SERVER}}/documentation/COM_API_Manual.pdf .COM API]}}&lt;br /&gt;
&lt;br /&gt;
===Code Snippets===&lt;br /&gt;
&lt;br /&gt;
Specific calls in Delphi will differ in syntax from those on the [[General Phidget Programming]] page, but the concepts stay the same.  &lt;br /&gt;
&lt;br /&gt;
It may help to have the [[General Phidget Programming]] page and this section open at the same time, because they parallel each other and you can refer to the Delphi syntax.  However, &#039;&#039;many&#039;&#039; additional concepts are covered on the General Phidget Programming page on a high level, such as using multiple Phidgets, handling errors, and different styles of programming.&lt;br /&gt;
&lt;br /&gt;
====Step One: Initialize and Open====&lt;br /&gt;
&lt;br /&gt;
Before you can use the Phidget, you must declare and initialize its ActiveX object. The simplest method is to place the control from the ActiveX component tab on to your form. For this tutorial, we create a Phidget Interface Kit control (PhidgetInterfaceKit1) and then add a text edit field to the form for the purpose of capturing simple output. The object name for any type of Phidget is listed in the API manual. &lt;br /&gt;
Every type of Phidget also inherits functionality from the Phidget base class.&lt;br /&gt;
&lt;br /&gt;
Next, we need to tell the program to try and connect to the Phidget through a call to open(). &lt;br /&gt;
The open will tell the program to continuously try to connect to a Phidget, based on the parameters given, even trying to reconnect if it gets disconnected:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;source&amp;quot;&amp;gt;&amp;lt;syntaxhighlight lang=delphi&amp;gt;&lt;br /&gt;
  procedure TForm1.FormCreate(Sender: TObject);&lt;br /&gt;
  begin&lt;br /&gt;
     PhidgetInterfaceKit1.Open(-1);&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The parameters (here just a -1) can also be used to open the first Phidget of a type it can find, open based on its serial number, or even open across the network. The API manual lists all of the available modes that open provides. &lt;br /&gt;
&lt;br /&gt;
One important thing to remember is that when working with Phidgets, a local connection will reserve the device until closed. This prevents any other instances from retrieving data from the Phidget, including other programs. The one connection per device limit does not apply when exclusively using the Phidget WebService. To open multiple Phidgets, they each need their own ActiveX object, and you can distinguish between them by serial number.&lt;br /&gt;
&lt;br /&gt;
====Step Two: Wait for Attachment (plugging in) of the Phidget====&lt;br /&gt;
&lt;br /&gt;
Calling open does not guarantee you can use the Phidget immediately. To use the Phidget, it must be plugged in (attached). We can handle this by using event driven programming and tracking the AttachEvents and DetachEvents, or we can handle this by calling WaitForAttachment. You can put the wait function right after your open function.  So we can modify our opening block to read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;source&amp;quot;&amp;gt;&amp;lt;syntaxhighlight lang=delphi&amp;gt;&lt;br /&gt;
  procedure TForm1.FormCreate(Sender: TObject);&lt;br /&gt;
  begin&lt;br /&gt;
     PhidgetInterfaceKit1.Open(-1);&lt;br /&gt;
     PhidgetInterfaceKit1.WaitForAttachment(3000);&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This function works for any Phidget. WaitForAttachment will block indefinitely until a connection is made to the Phidget, or an optional timeout is exceeded.&lt;br /&gt;
&lt;br /&gt;
====Step Three: Do Things with the Phidget====&lt;br /&gt;
&lt;br /&gt;
We recommend the use of [[General Phidget Programming#Event Driven Code|event driven programming]] when working with Phidgets. This allows the program to execute other tasks until the Phidget fires a new event. &lt;br /&gt;
&lt;br /&gt;
In Delphi, when the event library was installed as described in the [[#Use Our Examples|Use Our Examples]] section, it added Phidget ActiveX components for each type of Phidget. These ActiveX components will show up in the toolbox under the ActiveX tab, usually in the lower right. The ActiveX object for your Phidget can be added to the form and then hooked to the event handlers you wish to use like any other control. &lt;br /&gt;
&lt;br /&gt;
For example, for a Phidget21COMIPhidgetInterfaceKitEvents control, the event handler looks like the following:  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;source&amp;quot;&amp;gt;&amp;lt;syntaxhighlight lang=delphi&amp;gt;&lt;br /&gt;
  procedure TForm1.PhidgetInterfaceKit1SensorChange(ASender: TObject; Index, SensorValue: Integer);&lt;br /&gt;
  begin&lt;br /&gt;
       Edit1.Text := IntToStr(Index) + &#039;: &#039; + IntToStr(SensorValue);&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With this method, the code inside PhidgetInterfaceKit1SensorChange will get executed every time the PhidgetInterfaceKit reports a change on one of its analog inputs. Some events such as Attach and Detach belong to the base Phidget object and thus are common to all types of Phidgets.  Other events, like this sensor change one, are specific to the type of Phidget.  Please refer to the COM API manual for a full list of events and their general usage.&lt;br /&gt;
&lt;br /&gt;
Some values can be directly read and set on the Phidget. These functions can be used inside a polling loop as an alternative to event driven programming.    Simply use the CallString such as SensorValue[Index] or OutputState[Index] for PhidgetInterfaceKits:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;source&amp;quot;&amp;gt;&amp;lt;syntaxhighlight lang=delphi&amp;gt;&lt;br /&gt;
  PhidgetInterfaceKit1.OutputState[0] := true;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Step Four: Close and Delete====&lt;br /&gt;
&lt;br /&gt;
Remember that the Open call reserves the Phidget for sole use by your program.  Close removes this lock.  You can call Close any time outside of the Phidget&#039;s own event handlers to end the connection.&lt;br /&gt;
&lt;br /&gt;
====Enabling Logging====&lt;br /&gt;
&lt;br /&gt;
Often it’s a good idea to enable logging during development for debugging purposes. This log, depending on the level set, will record certain events and errors from Phidgets. In Delphi, this is accomplished by calling EnableLogging(logLevel, filename) on the Phidget object. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;source&amp;quot;&amp;gt;&amp;lt;syntaxhighlight lang=delphi&amp;gt;&lt;br /&gt;
  PhidgetInterfaceKit1.EnableLogging(6, &#039;testlog.txt&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Similarly, you can call DisableLogging() at the end of your program to shut it off. Should you need to contact Phidgets for support, including this log is very helpful for revealing the cause of the problem. &lt;br /&gt;
Please see the Programming Manual for a general discussion on Phidget logging and the levels provided.&lt;br /&gt;
&lt;br /&gt;
{{MoreHowTos}}&lt;br /&gt;
&lt;br /&gt;
==Common Problems and Solutions/Workarounds==&lt;br /&gt;
&lt;br /&gt;
===Embarcadero XE2: The Phidget Manager creates a runtime fault===&lt;br /&gt;
&lt;br /&gt;
In Delphi XE2, you cannot use the Phidget Manager as an object directly.  If you need to open multiple Phidgets of the same device type, use the serial number to distinguish between them.&lt;br /&gt;
&lt;br /&gt;
===Embarcadero XE2 under Windows in Oracle VirtualBox: System Crash===&lt;br /&gt;
&lt;br /&gt;
Embarcadero Delphi does &#039;&#039;not&#039;&#039; work under Windows running as a guest on Oracle&#039;s VirtualBox.  Adding an ActiveX object on such a system will crash the system and appear to destroy it, although a hard power cycle will recover the system.  VMWare does not suffer from this problem, and of course native Windows 7 works fine.&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=Driver_Changelog&amp;diff=23809</id>
		<title>Driver Changelog</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=Driver_Changelog&amp;diff=23809"/>
		<updated>2016-04-22T17:36:05Z</updated>

		<summary type="html">&lt;p&gt;Burley: /* 2.1.8.20151020 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Administrative]]&lt;br /&gt;
__NOTOC__&lt;br /&gt;
===2.1.8.20160202===&lt;br /&gt;
*Windows release&lt;br /&gt;
**Labview 7.1 support&lt;br /&gt;
&lt;br /&gt;
===2.1.8.20160107===&lt;br /&gt;
*Windows release&lt;br /&gt;
**Don&#039;t throw an exception on EncoderPositionChangeEventArgs.Time in the .Net library when time it unknown - just return 0x7fffffff&lt;br /&gt;
&lt;br /&gt;
===2.1.8.20160104===&lt;br /&gt;
*Mac/Windows release&lt;br /&gt;
**New firmware for 1042 and 1044, fixing digital gyro&lt;br /&gt;
===2.1.8.20151217===&lt;br /&gt;
*Fixed 1045 bug where it will display an unknown ambient temperature sometimes&lt;br /&gt;
*Fixed a crash in the windows control panel&lt;br /&gt;
&lt;br /&gt;
===2.1.8.20151020===&lt;br /&gt;
*Windows release&lt;br /&gt;
**Fixed an issue where the examples would error when trying to run them from the control panel.&lt;br /&gt;
&lt;br /&gt;
===2.1.8.20151009===&lt;br /&gt;
*OS X and Windows release&lt;br /&gt;
**Upgraded firmware for 1024, 1032, 1041, 1042, 1043, 1044 and 1067 to address issues with these Phidgets on OS X El Capitan&lt;br /&gt;
*SBC release&lt;br /&gt;
**Support for multiple webcams &lt;br /&gt;
===2.1.8.20150821===&lt;br /&gt;
*OS X-only release&lt;br /&gt;
**Support OS X 10.11 El Capitan&lt;br /&gt;
===2.1.8.20150805===&lt;br /&gt;
*OS X-only release&lt;br /&gt;
**Preliminary support for OS X 10.11 El Capitan&lt;br /&gt;
===2.1.8.20150410===&lt;br /&gt;
*Linux-only release&lt;br /&gt;
**Fixed Makefile phidget21.h target issues&lt;br /&gt;
===2.1.8.20150326===&lt;br /&gt;
*Windows-only release&lt;br /&gt;
**Fixed issue with webservice buttons not being visible in the control panel&lt;br /&gt;
===2.1.8.20150323===&lt;br /&gt;
*Windows-only release&lt;br /&gt;
**Updated icons with new company logo&lt;br /&gt;
===2.1.8.20150227===&lt;br /&gt;
*Linux-only release&lt;br /&gt;
**Added copyright/licence headers to source code files&lt;br /&gt;
**Updated cvtutf files to a newer version&lt;br /&gt;
===2.1.8.20150109===&lt;br /&gt;
*Windows-only&lt;br /&gt;
**Fixed examples for Labview 8.5&lt;br /&gt;
===2.1.8.20141209===&lt;br /&gt;
*OS X-only release&lt;br /&gt;
**Added support for armv7s and arm64 to the iOS library. Dropped support for armv6. Requires iOS 5.1.1 or later.&lt;br /&gt;
===2.1.8.20141202===&lt;br /&gt;
*Windows-only release&lt;br /&gt;
**Labview release to support older versions&lt;br /&gt;
===2.1.8.20141119===&lt;br /&gt;
*OS X-only release&lt;br /&gt;
**Fixed an issue with the 2.1.8.20141117 release where nothing was actually installed.&lt;br /&gt;
===2.1.8.20141117===&lt;br /&gt;
*OS X-only release&lt;br /&gt;
**Fixed a code-signing issue that make the installer appear unsigned on OS X 10.10&lt;br /&gt;
**Dropped support for OS X 10.4&lt;br /&gt;
===2.1.8.20140905===&lt;br /&gt;
*Windows-only release&lt;br /&gt;
**Added an IA32 folder to the windows libraries download - this supports Windows on the Intel Galileo platform&lt;br /&gt;
===2.1.8.20140428===&lt;br /&gt;
*Windows-only release&lt;br /&gt;
**Fixes to C# Stepper GUI Example&lt;br /&gt;
===2.1.8.20140319===&lt;br /&gt;
*CPhidget_getDeviceClass can now be called on handle before it is attached.&lt;br /&gt;
*Added support for 64-bit Max/MSP (Version 6.1+) on both OS X and Windows.&lt;br /&gt;
===2.1.8.20140227===&lt;br /&gt;
*Deals with 1046 bug in v100 and v101 firmware.&lt;br /&gt;
**No longer reports bad values that appear right after a channel is enabled.&lt;br /&gt;
**Fixes issue where changing the gain while channel 0 is disabled would sometimes cause bad readings.&lt;br /&gt;
&lt;br /&gt;
===2.1.8.20131105===&lt;br /&gt;
* Fixed a defect in the Flash examples for the 1012 (Outputs 11-16 were not addressed properly).&lt;br /&gt;
&lt;br /&gt;
===2.1.8.20130926===&lt;br /&gt;
*Windows-only release&lt;br /&gt;
**Support setting label on 1067 from Windows&lt;br /&gt;
===2.1.8.20130820===&lt;br /&gt;
*Windows-only release&lt;br /&gt;
**Added logging option to control panel / C# full examples&lt;br /&gt;
===2.1.8.20130802===&lt;br /&gt;
*Windows-only release&lt;br /&gt;
**Fix for Windows 8 issue where only &#039;Uninitialized Phidget Handle&#039; would show up in the Manager, and Phidgets could not be opened.&lt;br /&gt;
===2.1.8.20130723===&lt;br /&gt;
*Improvement to java: we don&#039;t attach/detach our native threads for each event, just one attach, then detach before the thread exits.&lt;br /&gt;
**This increases performance, esp. when debugging on Android.&lt;br /&gt;
*Improvement to Android: We reuse the UsbRequest object rather then creating a new one for each transfer. This reduces logcat messages tremendously, and increases performance.&lt;br /&gt;
===2.1.8.20130710===&lt;br /&gt;
*Android-only release&lt;br /&gt;
**Added extra android target architectures: x86, MIPS, armeabi-v7a&lt;br /&gt;
===2.1.8.20130618===&lt;br /&gt;
*Changed setCompassCorrectionParameters() API call so that compass calibration parameters are written out to non-volatile storage on 1042/1044, so that they persist across power cycles. Previously, calibration data would need to be re-programmed at each attach.&lt;br /&gt;
*Changes to C# Spatial example:&lt;br /&gt;
**Compass calibration parameter set dialog removed from for 1042/1044 because parameters are set by the calibration software - and thus do not need setting in the example.&lt;br /&gt;
**Stores/restores parameters for 1056 based on serial number, so multiple different calibrations can be maintained.&lt;br /&gt;
===2.1.8.20130607===&lt;br /&gt;
*Windows-only release&lt;br /&gt;
**Fixes to compass calibration software for 1042/1044&lt;br /&gt;
===2.1.8.20130419===&lt;br /&gt;
*Windows-only release&lt;br /&gt;
**Fixed setCompassCorrectionParameters in the COM library&lt;br /&gt;
===2.1.8.20130327===&lt;br /&gt;
*Windows-only release&lt;br /&gt;
**Changed Windows installer to stop virus-scanner false positives&lt;br /&gt;
**Dropped support for Windows 2000&lt;br /&gt;
===2.1.8.20130320===&lt;br /&gt;
*Added EPHIDGET_NOTFOUND exception to Dictionary.getKey() for when the key is not found.&lt;br /&gt;
*Added exceptions back into the Java library - they have been missing since 2.1.8.20121015 release.&lt;br /&gt;
===2.1.8.20130313===&lt;br /&gt;
*Updates to Matlab support&lt;br /&gt;
**Works properly on Matlab 7+, on Windows, Mac, Linux without needing changes to .m files.&lt;br /&gt;
===2.1.8.20130221===&lt;br /&gt;
*Windows-only release&lt;br /&gt;
**Encoder Index event added to C and .NET libraries&lt;br /&gt;
===2.1.8.20121218===&lt;br /&gt;
*Webservice version: 1.0.10&lt;br /&gt;
**Support for 1024, 1032&lt;br /&gt;
*Support for 1024, 1032&lt;br /&gt;
*fixed bug where if one half of a composite device is open, and PHIDGET_USB_ERROR_FLAG gets set, the device may never re-attach.&lt;br /&gt;
===2.1.8.20121015===&lt;br /&gt;
*Windows-only release&lt;br /&gt;
**Support for new pressure/light sensors in example.&lt;br /&gt;
===2.1.8.20120914===&lt;br /&gt;
*Windows-only release&lt;br /&gt;
**Improved firmware upgrading in control panel - it was giving some false-errors on some machines.&lt;br /&gt;
===2.1.8.20120912===&lt;br /&gt;
*Fixed bug where 1065 could fail to attach when opened over webservice&lt;br /&gt;
*Fixed bug where close() could deadlock on Phidgets opened over the webservice&lt;br /&gt;
*Changed LED64 LED Brightness from int to double&lt;br /&gt;
**this may cause issues when controlling the LED64 over the webservice and library/webservice are not the same version&lt;br /&gt;
**the old setDiscreteLED call will remain, deprecated, with an int argument for compatibility.&lt;br /&gt;
===2.1.8.20120716===&lt;br /&gt;
*Linux-Only Release&lt;br /&gt;
**Fixed a bug where opening a device in two program at once would cause an attach-detach cycle as they fight each other for control.&lt;br /&gt;
===2.1.8.20120713===&lt;br /&gt;
*Mac-Only Release&lt;br /&gt;
**Added signing of the Mac installer, so Mountain Lion (OS X 10.8) doesn&#039;t refuse to run it.&lt;br /&gt;
===2.1.8.20120615===&lt;br /&gt;
*Windows-only release&lt;br /&gt;
**Fixed a bug that caused java to crash on events introduced in 2.1.8.20120612&lt;br /&gt;
===2.1.8.20120612===&lt;br /&gt;
*Windows-only release&lt;br /&gt;
**Fixed another bug that will cause Unity3D to hang on exit after having used Phidgets.&lt;br /&gt;
===2.1.8.20120606===&lt;br /&gt;
*Windows-only release&lt;br /&gt;
**Fixed a bug that will cause Unity3D to hang on exit after having used Phidgets.&lt;br /&gt;
===2.1.8.20120525===&lt;br /&gt;
*Windows-only release&lt;br /&gt;
**Fixed PhidgetIR sendRawData bug in .NET on 64-bit machines.&lt;br /&gt;
===2.1.8.20120514===&lt;br /&gt;
*Linux-only release&lt;br /&gt;
**Fixed a bug that causes a segfault with libusb-1.0 under 64-bit Linux.&lt;br /&gt;
===2.1.8.20120507===&lt;br /&gt;
*Mac/Linux-only release&lt;br /&gt;
**Fixes a setLabel bug introduced in 2.1.8.20120503&lt;br /&gt;
===2.1.8.20120503===&lt;br /&gt;
*Fixed some spelling mistakes&lt;br /&gt;
*Moved to libusb-1.0&lt;br /&gt;
**This resolves a bug where having a webcam plugged in caused a memory leak in the webservice.&lt;br /&gt;
*Fixed bug with advanced servo where setting acceleration to accelerationMax would cause an exception for some servo types&lt;br /&gt;
===2.1.8.20120216===&lt;br /&gt;
*Fixed bug with RFID Reader on OS X and Linux, as well as .NET over the webservice&lt;br /&gt;
*Fixed bug that could cause the Java Phidget Manager to crash during garbage collection.&lt;br /&gt;
===2.1.8.20120131===&lt;br /&gt;
*Fixed RFID Reader bug that caused tag event to not get thrown in .NET Applications&lt;br /&gt;
*Changed compass bearing calculations in spatial C# example&lt;br /&gt;
===2.1.8.20120123===&lt;br /&gt;
*Added support for 1061 v300+&lt;br /&gt;
*Fixed a bug where the firmware version could be mis-reported over Bonjour&lt;br /&gt;
===2.1.8.20111220===&lt;br /&gt;
*Fixed a bug in AppleScript where closing a Phidget opened via label would give a &#039;Connection Invalid&#039; error.&lt;br /&gt;
*Fixed a bug where the webservice may fail to start on Linux systems that don&#039;t support IPv6 (ie. SBC2).&lt;br /&gt;
*Fixed issue where ratiometric state on newest interfacekit wouldn&#039;t be read back properly if it was false during attach.&lt;br /&gt;
*Fixed webservice issue where ratiometric state would not be reported properly for newest interfacekits&lt;br /&gt;
*Increased the number of overrun errors ignored during initial attach for InterfaceKit.&lt;br /&gt;
*Fixed an issue with the iPhone library and header&lt;br /&gt;
===2.1.8.20111219===&lt;br /&gt;
*fixed various other webservice stability/performance/memory leak bugs&lt;br /&gt;
*Faster connection to SBC-connected Phidgets from Mac OS&lt;br /&gt;
*Don&#039;t report packetlost or overrun errors that happen during early initialization - these are just noise.&lt;br /&gt;
*Fixed a bug in the webservice tree removal function that could cause memory leaks.&lt;br /&gt;
*Fixed bug where Webservice would crash on Linux if the chosen serverID was already under use on the network&lt;br /&gt;
*Stopped sending hardware Error Events before the Attach event - they are now queued up and sent after Attach&lt;br /&gt;
*Fixed a crash in the [[Phidget Control Panel]]&lt;br /&gt;
*Added ability to remove dictionary keys from a key change listener&lt;br /&gt;
*Reduced the number of false &#039;pending command not finished&#039; error events on Close()&lt;br /&gt;
*Fixed a webservice bug where exceptions/false attach events could occur when close() is called soon after open&lt;br /&gt;
*Fixed bug where closing a PhidgetRFID soon after attach could cause a crash&lt;br /&gt;
*Fixed webservice but on MacOS where client could exit with SIG_PIPE error&lt;br /&gt;
*Fixed webservice bug where the server would sometimes exit(1) after many connect/disconnect cycles&lt;br /&gt;
*Fixed webservice bug where client could deadlock during close()&lt;br /&gt;
*Fixed webservice bug where opening a single remote phidget multiple times from the same application would fail&lt;br /&gt;
*Fixed a webservice bug where sockets weren&#039;t being closed properly sometimes&lt;br /&gt;
*Fixed a webservice bug where pre-attach error events wouldn&#039;t get through&lt;br /&gt;
*Fixed a bug where the webservice running on Linux would stop responding to clients after ~300 connect/disconnect cycles&lt;br /&gt;
*Fixed bug where a Phidget would become inaccessible until the app is restarted if a thread creation failed&lt;br /&gt;
*Fixed webservice bug where connect is slow on Windows when multiple clients are running simultaneously&lt;br /&gt;
*Fixed webservice bug where authentication would fail on a valid password&lt;br /&gt;
*Fixed webservice bug where attach may never happen, and would require a close()/open()&lt;br /&gt;
&lt;br /&gt;
===2.1.8.20111121===&lt;br /&gt;
*Added support for new servo types to all libraries&lt;br /&gt;
*Fixed min/max position/velocity causing invalid arg exception on servo/advservo&lt;br /&gt;
*IPv6 support on MacOS&lt;br /&gt;
*Fixed some memory leaks&lt;br /&gt;
*Fixed hostname lookup issue on Mac OS with Back To My Mac enabled.&lt;br /&gt;
===2.1.8.20111028===&lt;br /&gt;
*Fixed Applescript bugs and released examples&lt;br /&gt;
*Added openLabel to .NET, Java, COM&lt;br /&gt;
*Setting change trigger to 0 on interfacekit will not set event mode.&lt;br /&gt;
**Previously setting change trigger to 0 after setting data rate would supersede the data rate setting, which is probably unexpected.&lt;br /&gt;
===2.1.8.20110630 - MacOS Only===&lt;br /&gt;
*handle USB bug introduced in MacOS 10.6.8&lt;br /&gt;
===2.1.8.20110615===&lt;br /&gt;
*Added error event when trying to open Phidgets with an unsupported version&lt;br /&gt;
===2.1.8.20110614 - Windows Only===&lt;br /&gt;
*Fixed bug in C# Spatial example&lt;br /&gt;
*Added support for negative gains in 1056&lt;br /&gt;
===2.1.8.20110601 - MacOS Only===&lt;br /&gt;
*Fixed AppleScript issues&lt;br /&gt;
===2.1.8.20110527===&lt;br /&gt;
*Fixed AS3.0 library (Flash/Flex) - wouldn&#039;t connect to webservice as of last release&lt;br /&gt;
*Fixed bug where webservice doesn&#039;t release a closed Phidget&lt;br /&gt;
*Fixed bug where devices that don&#039;t support label didn&#039;t show up on MacOS&lt;br /&gt;
*Fixed iPhone library issues&lt;br /&gt;
===2.1.8.20110524===&lt;br /&gt;
*AppleScript support added&lt;br /&gt;
*fixed problem with Spatial in .NET on 64-bit Windows&lt;br /&gt;
*Added remote setLabel to mac preference pane.&lt;br /&gt;
*fixed a bug where label characters 7,8,9 would be read back corrupted on certain devices.&lt;br /&gt;
**labels &amp;gt;7 characters that exhibit this bug will now be truncated to 7 characters when being read back&lt;br /&gt;
**call setLabel again using this library or newer to support 10 character labels.&lt;br /&gt;
**To maintain compatibility with older library versions, limit labels to &amp;lt;=7 characters on these devices.&lt;br /&gt;
*fixed bug on MacOS where serial number and/or label strings could be read wrong.&lt;br /&gt;
*better support for recovering misbehaving devices in Linux&lt;br /&gt;
*fixed a deadlock on linux when Avahi is installed but not running&lt;br /&gt;
*clear list of attached devices when closing remote manager&lt;br /&gt;
*Added support for Unicode labels&lt;br /&gt;
**To maintain compatibility with older library versions, limit labels to ASCII.&lt;br /&gt;
*Added open by label&lt;br /&gt;
*Webservice protocol version up to 1.0.9 (for open by label)&lt;br /&gt;
*Made opening multiple device is one application faster.&lt;br /&gt;
*TextLCD changes:&lt;br /&gt;
**cursor is disabled while writing to the display or setting a custom character to prevent display artifacts&lt;br /&gt;
**cursor is disabled when a full line is written so it doesn&#039;t go to the start of another line&lt;br /&gt;
**1204 should be stable&lt;br /&gt;
**setDisplayCharacter supports 0x00-0xff&lt;br /&gt;
*stopped property reflected more accurately in the C# stepper example&lt;br /&gt;
*Added error events to mac examples&lt;br /&gt;
===2.1.8.20110329 - Windows only===&lt;br /&gt;
*Fixed problem with control panel encoder example where enable wouldn&#039;t work&lt;br /&gt;
*Fixed issue with SpatialData, GPSPositionChange, PHChange and WeightChange events in Labview 64-bit&lt;br /&gt;
===2.1.8.20110322===&lt;br /&gt;
*Fixed [[Phidget Control Panel]] memory leak when Bonjour in installed but not running&lt;br /&gt;
*Fixed current sense formula on 1061_0 v200&lt;br /&gt;
*Fixed bug in webservice protocol while using the PhidgetAdvancedServo&lt;br /&gt;
*Fixed bug in old PhidgetTemperatureSensor&lt;br /&gt;
&lt;br /&gt;
===2.1.8.20110310===&lt;br /&gt;
*Fixed bug in webservice protocol while using the PhidgetServo&lt;br /&gt;
*Fixed some Labview bugs&lt;br /&gt;
*Added some Java and VB.NET examples&lt;br /&gt;
===2.1.8.20110301===&lt;br /&gt;
*Full Support for 1002, 1011, 1040, 1046, 1054, 1065, 1204&lt;br /&gt;
*New webservice version - 1.0.8&lt;br /&gt;
**Support for new devices&lt;br /&gt;
**Support for error events&lt;br /&gt;
===2.1.7.20110203===&lt;br /&gt;
*fixed crash on close of remote Phidget on MacOS&lt;br /&gt;
*C# ifkit example bugfix - crashed on 1015/1016&lt;br /&gt;
*webservice improvements&lt;br /&gt;
*Switch to IP address for SBC config in browser&lt;br /&gt;
*Faster IP lookup for SBCs in control panel&lt;br /&gt;
===2.1.7.20101222 / 2.1.7.20101223===&lt;br /&gt;
*fixed getServerID on Linux&lt;br /&gt;
*removed report ack&lt;br /&gt;
**this was causing some bad side effects&lt;br /&gt;
*manual .local lookups on Windows&lt;br /&gt;
**much faster then letting Windows do it itself&lt;br /&gt;
*Support for new Labview library&lt;br /&gt;
*Fixed PhidgetIR bug where library would crash if repeat code is longer then IR_MAX_REPEAT_LENGTH&lt;br /&gt;
===2.1.7.20101103===&lt;br /&gt;
*Decreased Phidget Webservice event latency on Windows&lt;br /&gt;
*Preliminary support for 1002, 1011, 1040, 1045, 1046, 1054, 1065, 1204 (C, .NET)&lt;br /&gt;
*Webservice version updated to 1.0.7&lt;br /&gt;
**support for 1045, 1011, 1204&lt;br /&gt;
*Fixed a bug where webservice connections could be unexpectedly lost&lt;br /&gt;
*Bugfix: couldn&#039;t set interfacekit data rate over webservice.&lt;br /&gt;
*Fixed some memory leaks in the Mac library&lt;br /&gt;
*Fixed bug where blocking for &amp;gt;2 seconds in an events handler when opening remotely could cause a crash.&lt;br /&gt;
===2.1.7.20100803===&lt;br /&gt;
*Windows only release&lt;br /&gt;
*fixed setLabel in WindowsCE&lt;br /&gt;
*fixed getHashCode in .NET library - needed for working with Phidgets in Labview via .NET&lt;br /&gt;
===2.1.7.20100621===&lt;br /&gt;
*Linux only release - autotools updates&lt;br /&gt;
**call ldconfig automatically&lt;br /&gt;
**remove old phidget21 library (pre-autotools) when installing new one.&lt;br /&gt;
===2.1.7.20100620===&lt;br /&gt;
*Linux only release - added version.sh for autoreconf&lt;br /&gt;
===2.1.7.20100618===&lt;br /&gt;
*Linux only release - added udev/hotplug files&lt;br /&gt;
===2.1.7.20100617===&lt;br /&gt;
*Linux only release&lt;br /&gt;
*Transitioned to autotools in linux for phidget21 / webservice&lt;br /&gt;
*phidget21 library and webservice are now separate downloads&lt;br /&gt;
===2.1.7.20100525===&lt;br /&gt;
*full support for PhidgetSpatial and PhidgetIR in all libraries&lt;br /&gt;
*fixed 1031 not attaching in AS3.0&lt;br /&gt;
*Better error messages in JNI&lt;br /&gt;
*Updated error codes, device ID/Class lists in Java, Flash, COM, etc.&lt;br /&gt;
*Fixed TemperatureSensor version 200,201,202 bug - ambient sensor would not report negative temperatures.&lt;br /&gt;
*Revised temperaturesensor API to report tempMin/tempMax and errors more accurately.&lt;br /&gt;
*Added initial events for encoder digital inputs&lt;br /&gt;
*full support for 1047&lt;br /&gt;
*Added new device support to WindowsCE&lt;br /&gt;
*Updated mac examples for 1047, 1048&lt;br /&gt;
===2.1.6.20100504===&lt;br /&gt;
*Windows only Release&lt;br /&gt;
**Added 1131 and 1132 to InterfaceKit example in MSI&lt;br /&gt;
===2.1.6.20100428===&lt;br /&gt;
*limit data rate maximum to 16ms over the webservice for devices that expose dataRate (InterfaceKit, Spatial)&lt;br /&gt;
*fixed bug where TextLCD 8/8/8 would stay in Bonjour list after webservice is shutdown&lt;br /&gt;
*set/get Brightness for 1203_2&lt;br /&gt;
*Support 1048 in C# example&lt;br /&gt;
*webservice version incremented to 1.0.6&lt;br /&gt;
**TextLCD set/get brightness&lt;br /&gt;
**PhidgetIR support&lt;br /&gt;
**PhidgetSpatial support&lt;br /&gt;
**1047 support (enable, index)&lt;br /&gt;
===2.1.6.20100406===&lt;br /&gt;
*Support for 1018_2 (dataRate)&lt;br /&gt;
*Webservice version incremented to 1.0.5&lt;br /&gt;
===2.1.6.20100401===&lt;br /&gt;
*Updated InterfaceKit example with new sensors&lt;br /&gt;
*make Windows connect cancelable&lt;br /&gt;
*make pending zeroconf lookups cancelable during close&lt;br /&gt;
===2.1.6.20100318===&lt;br /&gt;
*Mac only release&lt;br /&gt;
**Added WillSleep and Wakeup events to give user control of Phidgets immediately before and after a system sleep (MacOS Only).&lt;br /&gt;
===2.1.6.20100317===&lt;br /&gt;
*Windows only release&lt;br /&gt;
**Some of the examples were being built using an out of date .NET library&lt;br /&gt;
===2.1.6.20100310===&lt;br /&gt;
*MaxMSP fix - 2.1.6.20100126 introduced a bug for some Phidgets where openremote/open by serial didn&#039;t work and MaxMSP would sometimes crash.&lt;br /&gt;
**No code changes to any of the other libraries.&lt;br /&gt;
===2.1.6.20100304===&lt;br /&gt;
*stopped property changes trigger events over webservice so they are noticed.&lt;br /&gt;
**more compatible with how local open works&lt;br /&gt;
*added 5 new servos&lt;br /&gt;
*fixed bug where remote close would not set detached so a subsequent open would not always connect.&lt;br /&gt;
*handle UninitializeZeroconf better - shut down thread before closing handles, fixes hang on SBC&lt;br /&gt;
*fixed bug on Mac where detaching 2 or more Phidgets at the same time caused a crash&lt;br /&gt;
*fixed close blocking because of a pending connect (mac, linux)&lt;br /&gt;
*Final support for 1031 in all libraries.&lt;br /&gt;
===2.1.6.20100129===&lt;br /&gt;
*Implemented initial events in Flash&lt;br /&gt;
**Flash behaviour should now be identical to C library local and remote.&lt;br /&gt;
*Fix RFID issue where close could cause crash&lt;br /&gt;
*increment webservice version to 1.0.4&lt;br /&gt;
*fixed RFID remote open&lt;br /&gt;
**Flash would never get an attach event if the reader had been previously opened&lt;br /&gt;
**Initial tag event would not be fired when a tag was present and the antenna was enabled prior to open&lt;br /&gt;
*fixed openRemote failing on Mac&lt;br /&gt;
*fixed deadlock in webservice which could be hit by opening/closing a device over and over again.&lt;br /&gt;
*fixed bug in stepper, which caused seg fault on SBC on position change events.&lt;br /&gt;
===2.1.6.20100126===&lt;br /&gt;
*added network open support in Max/MSP&lt;br /&gt;
===2.1.6.20100115===&lt;br /&gt;
*Increased network performance for Linux/MacOS&lt;br /&gt;
*Added five servo types&lt;br /&gt;
===2.1.6.20091215===&lt;br /&gt;
*Fixed busy loop in Linux openRemote&lt;br /&gt;
*JNI Library relocated to /Library/Java/Extensions on MacOS&lt;br /&gt;
===2.1.6.20091211===&lt;br /&gt;
*Heartbeat now works on Linux as well (had to make sockets non-blocking)&lt;br /&gt;
===2.1.6.20091130===&lt;br /&gt;
*Added heartbeat to webservice (client side)&lt;br /&gt;
**Better detects network failures by using active polling timeouts&lt;br /&gt;
*Fixed 0/8/8 over webservice&lt;br /&gt;
===2.1.6.20091020===&lt;br /&gt;
*Fixed 1052 counting issue on 1070 (-1 reported as 255)&lt;br /&gt;
*Fixed issue where Phidget21 would try to reinstall from a limited user account or when the Control Panel was disabled.&lt;br /&gt;
*64-bit kernel support in Snow Leopard&lt;br /&gt;
===2.1.6.20090928===&lt;br /&gt;
*Support for PhidgetSBC (1070)&lt;br /&gt;
*zeroconf can handle starting up before the mdns daemon, and will keep trying to connect.&lt;br /&gt;
*fixed 1066 not showing up on Mac&lt;br /&gt;
*added advanced servo example to mac pref pane&lt;br /&gt;
*implemented proper error handling in COM&lt;br /&gt;
**default behavious remains the same, enable proper error handling with &#039;EnableVerboseErrors&#039;&lt;br /&gt;
*implemented error events in Java&lt;br /&gt;
===2.1.6.20090917===&lt;br /&gt;
*Updated webservice protocol version to 1.0.3&lt;br /&gt;
*Fixed stepper under AS3.0&lt;br /&gt;
*added setServoType, getServoType, setServoParameters to PhidgetServo and PhidgetAdvancedServo&lt;br /&gt;
*possible race condition fixed in webservice (pdictclient.c:907)&lt;br /&gt;
===2.1.6.20090902 (mac only release)===&lt;br /&gt;
*Support MacOSX 10.6, drop support for 10.3.9, require 10.4 or newer&lt;br /&gt;
**Fully 64-bit compliant, library supports ppc, i386, x86_64&lt;br /&gt;
===2.1.6.20090806===&lt;br /&gt;
*Added 1049 support&lt;br /&gt;
*Fixed RFID tag events over webservice&lt;br /&gt;
===2.1.6.20090804===&lt;br /&gt;
*Added 1051_2 support&lt;br /&gt;
*Fixed various small initialization issues - stepper, adv servo, rfid&lt;br /&gt;
*Added 32-bit library install to 64-bit installer&lt;br /&gt;
**VB6.0, etc. need the 32-bit COM library on 64-bit windows&lt;br /&gt;
===2.1.6.20090717===&lt;br /&gt;
*?&lt;br /&gt;
===2.1.6.20090708===&lt;br /&gt;
*Added DeviceID to zeroconf&lt;br /&gt;
*fixed RFID.LastTag in .NET&lt;br /&gt;
*Changed the error codes returned by error events; error events now have their own set of error codes rather then sharing the function return codes.&lt;br /&gt;
*Added support for 1047, 1048&lt;br /&gt;
*Added error event codes rather then trying to reuse the EPHIDGET return codes.&lt;br /&gt;
*fixed TextLCD issue where display could get corrupted during a detach/attach&lt;br /&gt;
*made mac more reliable on attach&lt;br /&gt;
*more error logging on mac&lt;br /&gt;
===2.1.6.20090525===&lt;br /&gt;
*fixed RFID not attaching via webservice if a tag is present.&lt;br /&gt;
*bugfix related to double free on detach event.&lt;br /&gt;
*Implemented getKey&lt;br /&gt;
*Added MIPS II support to Windows CE&lt;br /&gt;
===2.1.6.20090430===&lt;br /&gt;
*Added ActiveX interface to COM library&lt;br /&gt;
*Added stepper and advancedServo to Flex .swc library&lt;br /&gt;
===2.1.6.20090417===&lt;br /&gt;
*added PhidgetIR prototype support to C library&lt;br /&gt;
*properly handles sleeping on OSX&lt;br /&gt;
*fixed some webservice field initializations in Flash and C&lt;br /&gt;
*fixed security exceptions in [[Phidget Control Panel]] under Vista&lt;br /&gt;
*added [[Phidget Control Panel]] to start menu&lt;br /&gt;
&lt;br /&gt;
===2.1.6.20090318 (Examples/AS3.0 only release)===&lt;br /&gt;
*Fixed AdvancedServo in Flash - wouldn&#039;t attach&lt;br /&gt;
===2.1.6.20090317===&lt;br /&gt;
*[[Phidget Control Panel]] properly supports Vista UAC and Limited user accounts in XP, etc.&lt;br /&gt;
*Added 64-bit release of Phidget21.msi for Windows&lt;br /&gt;
&lt;br /&gt;
===2.1.6.20090312===&lt;br /&gt;
*added 1064, 1059 to WindowsCE&lt;br /&gt;
*fixed opening 1051 over webservice&lt;br /&gt;
*fixed opening 1015/1016 over webservice broken in last release&lt;br /&gt;
===2.1.6.20090302===&lt;br /&gt;
*Advanced servo bugfix: stopped would stop being true if min/max was set to exclude current position.&lt;br /&gt;
*linux USB improvements when many Phidgets are attached and opened at once.&lt;br /&gt;
*1031 support in phidget21, webservice, .NET - hidden until product release&lt;br /&gt;
**CPhidgetLED_setVoltage&lt;br /&gt;
**CPhidgetLED_getVoltage&lt;br /&gt;
**CPhidgetLED_setCurrentLimit&lt;br /&gt;
**CPhidgetLED_getCurrentLimit&lt;br /&gt;
*unknown timechange == PUNK_INT in encoder position change event&lt;br /&gt;
**1st position change event&lt;br /&gt;
**&amp;gt; 30 seconds time change&lt;br /&gt;
*AS3 updates&lt;br /&gt;
**updated to 1.0.2 webservice&lt;br /&gt;
**encoder position change events report relative change rather then absolute position&lt;br /&gt;
**encoder adds getTimeChange function for timing encoder changes&lt;br /&gt;
*webservice updated to 1.0.2&lt;br /&gt;
**Authorization is asynchronous&lt;br /&gt;
**Doesn&#039;t match the old version checking, so errors will not be nice when trying to connect to an old webservice&lt;br /&gt;
**Sends out all initial data, so it&#039;s just like opening locally&lt;br /&gt;
**supports interfacekit Raw sensor value&lt;br /&gt;
**supports labels on remoteIP managers&lt;br /&gt;
*avahi bugfix&lt;br /&gt;
*webservice more stable against forcefully closed clients&lt;br /&gt;
*closing a network Phidget won&#039;t block - ever.&lt;br /&gt;
**no longer using quit, just closing the socket&lt;br /&gt;
*added libavahi-client.so.3 reference to linux library.&lt;br /&gt;
*Fixed bug with opening one phidget with serial and no serial at the same time over the webservice&lt;br /&gt;
===2.1.5.20090105===&lt;br /&gt;
*[[Phidget Control Panel]] stability improvements&lt;br /&gt;
*added CPhidgetSBC_getHostname&lt;br /&gt;
*advanced servo 1 motor current sense equation - support should now be complete&lt;br /&gt;
*webservice and network code bugfixes - crash / deadlock during close, problems with concurrent connections, etc.&lt;br /&gt;
*fixed close on remote and remoteIP managers&lt;br /&gt;
*name of RFID changed from &amp;quot;Phidget RFID 4-output&amp;quot; to &amp;quot;Phidget RFID 2-output&amp;quot; - updated anything referencing old name.&lt;br /&gt;
&lt;br /&gt;
===2.1.5.20081023===&lt;br /&gt;
*added advanced servo and stepper examples to VB6.0, VB.NET and C&lt;br /&gt;
*added deviceClass and deviceID&lt;br /&gt;
*updated Mac examples&lt;br /&gt;
*webservice protocol version enforcement&lt;br /&gt;
*internal fix/rework of device id&#039;s etc.&lt;br /&gt;
*Fixed memory leaks in webservice and phidget21 network code.&lt;br /&gt;
*Dictionary and network stability improvements.&lt;br /&gt;
*duplicate calls to open or close are now silently ignored.&lt;br /&gt;
===2.1.4.20080924===&lt;br /&gt;
*Old TextLCD 0/8/8&#039;s can now have both halves open at the same time on Windows&lt;br /&gt;
*fixed bug with composite devices on linux&lt;br /&gt;
*fixed manager on linux to better deal with unique devices&lt;br /&gt;
===2.1.4.20080922===&lt;br /&gt;
*Updated Delphi files&lt;br /&gt;
*TextLCD can display 0x80-0xFF characters from Java&lt;br /&gt;
*getAttachedDevices works for mdns managers&lt;br /&gt;
*fixed a deadlock in the webservice&lt;br /&gt;
*better network error handling / password support for windows C# examples&lt;br /&gt;
*waitForAttachment will return EPHIDGET_CLOSED if the handle is closed while it is waiting.&lt;br /&gt;
*added EPHIDGET_CLOSED&lt;br /&gt;
*joining central threads checks whether they are trying to be joined by themselves first (avoid deadlocks).&lt;br /&gt;
*changed context of error event to be free from locks (can call close, open, etc. from them).&lt;br /&gt;
===2.1.4.20080821===&lt;br /&gt;
*zeroconf threads exit cleanly on last _close (apple zeroconf)&lt;br /&gt;
*Added advanced servo and stepper to Max&lt;br /&gt;
===2.1.4.20080811 (mac only release)===&lt;br /&gt;
*Fixed manager on Mac (wasn&#039;t working at all since 2.1.4.20080808)&lt;br /&gt;
===2.1.4.20080808===&lt;br /&gt;
*added CPhidgetSBC and CPhidgetSBCManager to the c library - these interfaces are hidden from users and meant to be used internally (for now).&lt;br /&gt;
*CPhidgetManager_open no longer blocks to send out initial attach events. These initial events are sent from the CentralThread context like all other attach events.&lt;br /&gt;
*fixed CThread_wait_on_event on Linux&lt;br /&gt;
*added CPhidgetGeneric interface for prototyping to C, .NET libraries. product ID is 0x99. These are only visible in debug releases, only to be used internally.&lt;br /&gt;
===2.1.4.20080715===&lt;br /&gt;
*udev rules fixed for product IDs with alpha-hex values&lt;br /&gt;
*blocking in an attach event does not block calls to open anymore&lt;br /&gt;
*RFID tag event handlers can now handle blocking - tag lost is timed after the tag handler exits.&lt;br /&gt;
===2.1.4.20080623===&lt;br /&gt;
*Flex .swc library was out of sync&lt;br /&gt;
*fixed CPhidgetManager_getAttachedDevices for network managers&lt;br /&gt;
*Added CPhidgetManager_freeAttachedDevicesArray&lt;br /&gt;
===2.1.4.20080613===&lt;br /&gt;
*Max/MSP RFID fixed&lt;br /&gt;
*0/0/8 and advanced servo added to CE&lt;br /&gt;
*fixed flash policy file server in webservice&lt;br /&gt;
*webservice with password and asynchronous together work now&lt;br /&gt;
===2.1.4.20080602===&lt;br /&gt;
*phidget21.h -&amp;gt; phidget21int.h so as not to be confused with generated phidget21.h&lt;br /&gt;
*some changes to Makefile fro crosscompiling&lt;br /&gt;
*no more vbscript in msi&lt;br /&gt;
===2.1.4.20080513===&lt;br /&gt;
*removed long long from COM - not supported by VB6.0&lt;br /&gt;
*added LastTag to RFID in .NET&lt;br /&gt;
===2.1.4.20080428===&lt;br /&gt;
*support Mac OS X 10.3.9 again&lt;br /&gt;
*Rev up to 2.1.4&lt;br /&gt;
*finalize Phidget Stepper API - Phidget Stepper requires 2.1.4 as a minimum&lt;br /&gt;
*fixed serverConnect and serverDisconnect handlers for manager and dictionary in COM&lt;br /&gt;
*Changed:&lt;br /&gt;
**PhidgetStepper and PhidgetAdvancedServo&lt;br /&gt;
***MotorPosition -&amp;gt; Position&lt;br /&gt;
***MotorOn -&amp;gt; Engaged&lt;br /&gt;
***MotorStopped -&amp;gt; Stopped&lt;br /&gt;
*Added:&lt;br /&gt;
**CPhidgetStepper_getCurrentLimit&lt;br /&gt;
**CPhidgetEncoder_getPosition&lt;br /&gt;
**CPhidgetEncoder_setPosition&lt;br /&gt;
**CPhidgetMotorControl_getVelocity&lt;br /&gt;
**CPhidgetMotorControl_setVelocity&lt;br /&gt;
**CPhidgetMotorControl_set_OnVelocityChange_Handler&lt;br /&gt;
**CPhidgetServo_setEngaged&lt;br /&gt;
**CPhidgetServo_getEngaged&lt;br /&gt;
**CPhidgetServo_getPosition&lt;br /&gt;
**CPhidgetServo_setPosition&lt;br /&gt;
**CPhidgetServo_set_OnPositionChange_Handler&lt;br /&gt;
**CPhidgetServo_getPositionMax&lt;br /&gt;
**CPhidgetServo_getPositionMin&lt;br /&gt;
**Count functions&lt;br /&gt;
*Deprecated:&lt;br /&gt;
**CPhidgetEncoder_getEncoderPosition&lt;br /&gt;
**CPhidgetEncoder_setEncoderPosition&lt;br /&gt;
**CPhidgetMotorControl_getMotorSpeed&lt;br /&gt;
**CPhidgetMotorControl_setMotorSpeed&lt;br /&gt;
**CPhidgetMotorControl_set_OnMotorChange_Handler&lt;br /&gt;
**CPhidgetServo_setMotorOn&lt;br /&gt;
**CPhidgetServo_getMotorOn&lt;br /&gt;
**CPhidgetServo_getMotorPosition&lt;br /&gt;
**CPhidgetServo_setMotorPosition&lt;br /&gt;
**CPhidgetServo_set_OnMotorPositionChange_Handler&lt;br /&gt;
**CPhidgetServo_getMotorPositionMax&lt;br /&gt;
**CPhidgetServo_getMotorPositionMin&lt;br /&gt;
**Num functions&lt;br /&gt;
*Added ability to deprecate funcitons in the C library - compiler will issue a warning when they are used.&lt;br /&gt;
*added names to some arguments in phidget21.h&lt;br /&gt;
*fixes to the webservice for initial state stuff - now it behaves almost like non-webservice, with guaranteed initial events, but we don&#039;t guarantee initial state in the attach event yet. Min/Max, Num motors, inputs, etc. are all guaranteed in the attach handler.&lt;br /&gt;
*Finalized support for Phidget Stepper&lt;br /&gt;
===2.1.3.20080402===&lt;br /&gt;
*Fixed windows BUG - Device Type was showing up wrong&lt;br /&gt;
*CPhidgetStepper_getPosition -&amp;gt; CPhidgetStepper_getCurrentPosition&lt;br /&gt;
===2.1.3.20080327===&lt;br /&gt;
*added:&lt;br /&gt;
**CPhidgetAdvancedServo_setMotorPositionMax&lt;br /&gt;
**CPhidgetAdvancedServo_setMotorPositionMin&lt;br /&gt;
**CPhidgetAdvancedServo_getMotorStopped&lt;br /&gt;
*changes to API&lt;br /&gt;
**CPhidgetStepper_setMotorPosition -&amp;gt; CPhidgetStepper_setTargetMotorPosition&lt;br /&gt;
**added CPhidgetStepper_getTargetMotorPosition&lt;br /&gt;
**Stepper MotorSpeed -&amp;gt; Velocity&lt;br /&gt;
**Stepper and AdvancedServo MaxVelocity -&amp;gt; VelocityLimit&lt;br /&gt;
*add waitForAttachment to COM&lt;br /&gt;
*COM getbool (not indexed) will now return FALSE on false (rather then always returning true)&lt;br /&gt;
*fixed write thread timeouts - was setting attached after starting write thread so write thread would see a detached device and exit immediately&lt;br /&gt;
===2.1.3.20080206===&lt;br /&gt;
*changed long long to __int64, to be happy in borland C++&lt;br /&gt;
*added:&lt;br /&gt;
**CPhidgetStepper_getMaxMotorSpeed&lt;br /&gt;
**CPhidgetStepper_setMotorOn&lt;br /&gt;
**CPhidgetStepper_getMotorOn&lt;br /&gt;
**CPhidgetStepper_getMotorStopped&lt;br /&gt;
**CPhidgetStepper_setCurrentMotorPosition&lt;br /&gt;
*removed CPhidgetStepper_setVelocity&lt;br /&gt;
*added CPhidgetStepper_setMaxVelocity, CPhidgetStepper_getMaxVelocity&lt;br /&gt;
===2.1.3.20080114===&lt;br /&gt;
*Added new functions to Flash API&lt;br /&gt;
*Added new functions to Webservice Protocol&lt;br /&gt;
*Added new functions to COM Library&lt;br /&gt;
*Added new functions to Java Library&lt;br /&gt;
*All device fiels in C library cleaned up and made consistent&lt;br /&gt;
*Open in windows is exclusive - this needs to be tested for stability&lt;br /&gt;
*No data will be returned / accepted if it lies outside of max/min range&lt;br /&gt;
*if a data value is unknown, user variable is set to PUNK_INT, PUNK_DBL, or PUNK_BOOL, and return value is EPHIDGET_UNKNOWNVAL&lt;br /&gt;
*Proper Device initializations on Attach:&lt;br /&gt;
**triggers are set to defaults on attach&lt;br /&gt;
**device state is read in and preserved on attach&lt;br /&gt;
**during attach event, all sensor data, etc. is provided if available&lt;br /&gt;
**no data events until after the attach event returns&lt;br /&gt;
**everything initialized by the time waitForAttachment returns&lt;br /&gt;
**after attach event returns, a full set of initial state data events are thrown&lt;br /&gt;
*.NET collections are readonly, and never NULL (but empty when phidget detached)&lt;br /&gt;
*.NET callbacks no longer catch and hide all exceptions&lt;br /&gt;
**make sure to use try/catch blocks especially in Attach when accessing properties that may not be initialized.&lt;br /&gt;
*added min/max functions:&lt;br /&gt;
**CPhidgetAccelerometer_getAccelerationMax&lt;br /&gt;
**CPhidgetAccelerometer_getAccelerationMin&lt;br /&gt;
**CPhidgetAdvancedServo_getAccelerationMax&lt;br /&gt;
**CPhidgetAdvancedServo_getAccelerationMin&lt;br /&gt;
**CPhidgetAdvancedServo_getVelocityMax&lt;br /&gt;
**CPhidgetAdvancedServo_getVelocityMin&lt;br /&gt;
**CPhidgetAdvancedServo_getMotorPositionMax&lt;br /&gt;
**CPhidgetAdvancedServo_getMotorPositionMin&lt;br /&gt;
**CPhidgetMotorControl_getAccelerationMax&lt;br /&gt;
**CPhidgetMotorControl_getAccelerationMin&lt;br /&gt;
**CPhidgetPHSensor_getPHMax&lt;br /&gt;
**CPhidgetPHSensor_getPHMin&lt;br /&gt;
**CPhidgetPHSensor_getPotentialMax&lt;br /&gt;
**CPhidgetPHSensor_getPotentialMin&lt;br /&gt;
**CPhidgetServo_getMotorPositionMax&lt;br /&gt;
**CPhidgetServo_getMotorPositionMin&lt;br /&gt;
**CPhidgetStepper_getAccelerationMax&lt;br /&gt;
**CPhidgetStepper_getAccelerationMin&lt;br /&gt;
**CPhidgetStepper_getMotorSpeedMax&lt;br /&gt;
**CPhidgetStepper_getMotorSpeedMin&lt;br /&gt;
**CPhidgetStepper_getMotorPositionMax&lt;br /&gt;
**CPhidgetStepper_getMotorPositionMin&lt;br /&gt;
**CPhidgetTemperatureSensor_getPotentialMax&lt;br /&gt;
**CPhidgetTemperatureSensor_getPotentialMin&lt;br /&gt;
**CPhidgetTemperatureSensor_getAmbientTemperatureMax&lt;br /&gt;
**CPhidgetTemperatureSensor_getAmbientTemperatureMin&lt;br /&gt;
**CPhidgetTemperatureSensor_getTemperatureMax&lt;br /&gt;
**CPhidgetTemperatureSensor_getTemperatureMin&lt;br /&gt;
*Added functions:&lt;br /&gt;
**CPhidgetTemperatureSensor_getAmbientTemperature&lt;br /&gt;
**CPhidgetTemperatureSensor_getThermocoupleType&lt;br /&gt;
**CPhidgetTemperatureSensor_setThermocoupleType&lt;br /&gt;
**CPhidget_set_OnServerConnectHandler&lt;br /&gt;
**CPhidget_set_OnServerDisconnectHandler&lt;br /&gt;
**CPhidgetDictionary_set_OnServerConnectHandler&lt;br /&gt;
**CPhidgetDictionary_set_OnServerDisconnectHandler&lt;br /&gt;
**CPhidgetManager_set_OnServerConnectHandler&lt;br /&gt;
**CPhidgetManager_set_OnServerDisconnectHandler&lt;br /&gt;
**CPhidgetDictionary_getServerID&lt;br /&gt;
**CPhidgetDictionary_getServerAddress&lt;br /&gt;
**CPhidgetDictionary_getServerStatus&lt;br /&gt;
**CPhidgetManager_getServerID&lt;br /&gt;
**CPhidgetManager_getServerAddress&lt;br /&gt;
**CPhidgetManager_getServerStatus&lt;br /&gt;
**CPhidgetServo_setMotorOn&lt;br /&gt;
**CPhidgetServo_getMotorOn&lt;br /&gt;
*Removed functions:&lt;br /&gt;
**CPhidgetServo_setMotorOff&lt;br /&gt;
*TemperatureSensor:&lt;br /&gt;
**Ambient sensor is accessed with it&#039;s own function&lt;br /&gt;
**first thermocouple is Index 0 everywhere&lt;br /&gt;
**no ambient sensor events&lt;br /&gt;
*getServerID is implemented&lt;br /&gt;
*changed the internal network structure (added CPhidgetRemote)&lt;br /&gt;
*reworked the USB code (mostly on Windows)&lt;br /&gt;
**Better handles closing, ESD events, timeouts&lt;br /&gt;
**fixed issues with Encoder, RFID stopping reading after a certain time.&lt;br /&gt;
**added USB error flag&lt;br /&gt;
*openRemote functions have been implemented&lt;br /&gt;
**these require bonjour (mac / windows) or avahi (linux) to be installed on both the client and server&lt;br /&gt;
**if they are not, you get EPHIDGET_UNSUPPORTED when you call them&lt;br /&gt;
*openRemoteIP functions are asynchronous and persistent&lt;br /&gt;
*include cphidgetconstants.h in phidget21.h for users&lt;br /&gt;
===2.1.2.20071108===&lt;br /&gt;
*start of chagelog&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=3401_User_Guide&amp;diff=23808</id>
		<title>3401 User Guide</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=3401_User_Guide&amp;diff=23808"/>
		<updated>2016-04-22T15:37:39Z</updated>

		<summary type="html">&lt;p&gt;Burley: /* Playing an MP3 File */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:UserGuide]]&lt;br /&gt;
{{UserguideTOC|3401.jpg|3401}}&lt;br /&gt;
==Getting Started==&lt;br /&gt;
The USB to Audio adapter provides sound capabilities to the PhidgetSBC.  The audio adapter offers two integrated channels - one for speakers or headphones, and one for a microphone.  The Audio Adapter  plugs into any of the PhidgetSBC USB ports.  The USB to Audio Adapter is not a Phidget device and is not controlled using Phidgets APIs.  &lt;br /&gt;
&lt;br /&gt;
Using this product requires a working knowledge of Linux.  &lt;br /&gt;
&lt;br /&gt;
[[File:3401_0_Connecting_The_Hardware.jpg|400px|link=|left]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
===Connect the Sound Adapter to the PhidgetSBC===&lt;br /&gt;
1. Log onto the SBC via SSH.  &lt;br /&gt;
:&#039;&#039;&#039;PhidgetSBC (1070)&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
::Your SBC may be running an older version of firmware that does not support the USB Audio Adapter, requiring you to update your SBC firmware to the latest version - update to the full version.&lt;br /&gt;
:&#039;&#039;&#039;PhidgetSBC2 (1072) or PhidgetSBC3 (1073)&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
::You must install libasound2, and optionally mpg123: apt-get install libasound2 mpg123 Make sure to set “Include full Debian Package Repository” to true on the System-&amp;gt;Packages web interface page and save changes first, or the packages won’t be available.&lt;br /&gt;
2. Plug the Audio Adapter into an open USB port on the SBC. The SBC should automatically recognize the converter.&lt;br /&gt;
&lt;br /&gt;
Type &amp;lt;code&amp;gt;dmesg | tail –n 5&amp;lt;/code&amp;gt; on the SBC to view the last 5 lines of the kernel’s message buffer. You should see something similar to the lines below (this is output from a PhidgetSBC2):&lt;br /&gt;
&amp;lt;div class=&amp;quot;source&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
usb 1-1.1: New USB device strings: Mfr=0, Product=1, SerialNumber=0&lt;br /&gt;
usb 1-1.1: Product: USB Headphone Set&lt;br /&gt;
input: USB Headphone Set as /devices/platform/s3c2410-ohci/usb1/1-1/1-1.1/1-1.1:1.3/&lt;br /&gt;
input/input0&lt;br /&gt;
usbcore: registered new interface driver snd-usb-audio&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
This tells you that the USB to Audio adapter was properly recognized.&lt;br /&gt;
&lt;br /&gt;
===Playing an MP3 File===&lt;br /&gt;
1. Plug a set of headphones, or computer speakers into the green jack on the back of the audio device.&lt;br /&gt;
&lt;br /&gt;
[[File:3401 0 Speakers.jpg|400px|link=]]&lt;br /&gt;
&lt;br /&gt;
2. Included with the Phidget SBC is an mpeg audio playback program mpg123.  To play an mp3 file, simple type:&lt;br /&gt;
&amp;lt;div class=&amp;quot;source&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
mpg123 –g 100 filename.mp3 &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
This file can be located either in your home director, or on a USB storage device.  The &amp;lt;code&amp;gt;-g 100&amp;lt;/code&amp;gt; option tells mpg123 to turn the gain on the audio device to 100%.&lt;br /&gt;
&lt;br /&gt;
3. The program can also be used to play streaming audio.  If you SBC is connected to the internet through your home network, you can type a command like:&lt;br /&gt;
&amp;lt;div class=&amp;quot;source&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
mpg123 -g 100 -@ http://www.di.fm/mp3/club.pls. &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
The &amp;lt;code&amp;gt;-@&amp;lt;/code&amp;gt; option tells mpg123 that the file is actually a playlist, not a sound file.&lt;br /&gt;
&lt;br /&gt;
4. Your SBC should start playing music from the radio stream.&lt;br /&gt;
&lt;br /&gt;
===Using a Microphone===&lt;br /&gt;
[[File:3401 0 Mic.jpg|400px|link=]]&lt;br /&gt;
&lt;br /&gt;
1. Plug a set of headphones, or computer speakers into the green jack on the back of the audio adapter.&lt;br /&gt;
&lt;br /&gt;
2. Plug a microphone into the yellow jack on the back of the audio adapter.&lt;br /&gt;
&lt;br /&gt;
3. You can test the input of the audio adapter by typing (1070 only):&lt;br /&gt;
&amp;lt;div class=&amp;quot;source&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
cat /dev/audio &amp;gt; /dev/audio &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
The /dev/audio device can be used for both input, as well as playback.  This command reads the input, and sends it right back to the output.&lt;br /&gt;
&lt;br /&gt;
4. Speak into the microphone, you should be able to hear your voice on your headphones or speakers.&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=T-Slot_Primer&amp;diff=23776</id>
		<title>T-Slot Primer</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=T-Slot_Primer&amp;diff=23776"/>
		<updated>2016-03-21T19:29:34Z</updated>

		<summary type="html">&lt;p&gt;Burley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{|&lt;br /&gt;
|- valign=middle&lt;br /&gt;
| align=center width=300px| __TOC__ &lt;br /&gt;
| [[Image:tsl_header.jpg|500px|link=]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
T-Slot is a framing system composed of extruded aluminum profiles which use the namesake slot as a mounting point for various hardware components.  Phidgets carries three different series of T-Slot extrusions.  A 20mm, 30mm, and 40mm standard.  For each series we carry a single (20x20mm, 30x30mm, 40x40mm) and double (20x40mm, 30x60mm, 40x80mm) wide extrusion.  The series you end up using depends where on the weight vs. strength scale your project ends up falling.  Obviously the smaller extrusions will not be as strong and rigid as the larger extrusions.  The manufacturer provides equations for calculating how strong the extrusions are on pages 11 and 12 of their catalogue which can be found [{{SERVER}}/documentation/Modular_Assembly_System.pdf here].  The modulus of elasticity is listed as approximately 70,000N/mm².  The moment of inertia is listed under the specifications for the specific extrusion profile you are using.  With those two parameters you should be able to calculate with reasonable accuracy the relationship between force applied and resultant beam deflection.  &lt;br /&gt;
&lt;br /&gt;
The first thing you will need to do is cut the extrusions to length.  There are 2 ways to do with.  Either with a band saw or a chop saw with an appropriate blade (there are carbide blades designed for cutting aluminum).  Once your extrusions are cut down to size you will want to connect them together:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Connecting Extrusions Together==&lt;br /&gt;
In order for this whole system to be useful you need a way to combine individual extrusions into a more complicated structure.  There are a number of options available for this, each better suited for different situations.  &lt;br /&gt;
&lt;br /&gt;
===Screw Connectors===&lt;br /&gt;
These are the most basic form of connection.  A simple bolt that goes from one extrusion to the next.  In order to use a screw connector there are 2 prerequisite steps you must do before installing.  You need to tap the first extrusion with an appropriate tap for the series you are using (check the product page for the screw connector for which tap is required), and you need to drill a hole in the second extrusion big enough to allow Allen key access to the head of the screw connector.  For example, here is a piece of 30x60mm extrusion prepped for connecting:&lt;br /&gt;
&lt;br /&gt;
[[Image:Screw_connector_prep.png|link=|center]]&lt;br /&gt;
&lt;br /&gt;
Once this is done you can screw the connector into the newly tapped extrusion.  When you get close to the end, slide the head of the connector into the slot on the other extrusion and tighten the rest of the way through the hole you drilled. &lt;br /&gt;
&lt;br /&gt;
[[image:Screw_connections.png|center|link=|1200px]]&lt;br /&gt;
&lt;br /&gt;
===Brackets===&lt;br /&gt;
The diecast aluminum as well as the T and L plate steel brackets allow you to strengthen joints that will experience particularly heavy loads.  You should always use them to reinforce joints which already use another type of connector rather than connecting the extrusions &#039;&#039;purely&#039;&#039; via the brackets.  For all three styles of bracket you will need a few nuts.  We recommend preset or square, the T nuts won&#039;t work well for this application.  Installation is fairly simple, you don&#039;t have to drill and preliminary holes or anything.  Just insert the nuts and bolt the brackets on.  For example:&lt;br /&gt;
&lt;br /&gt;
[[image:Tsl_brackets.png|link=|center|1000px]]&lt;br /&gt;
&lt;br /&gt;
===Inner Brackets===&lt;br /&gt;
The inner brackets are a special variant of bracket that are different enough from the other brackets that they deserve their own section.  These brackets do not need to be used with other connection methods.  They are suitable by themselves (though you could use a reinforcement as well if you wanted to).  The one important distinction to make with these brackets is that there are two models of bracket, A and B.  The difference is that the set screw hole is slightly canted so that the set screw pushes the bracketed extrusion into the other extrusion to tighten the hold.  For example:&lt;br /&gt;
&lt;br /&gt;
[[image:inner_bracket_ab.jpg|center|700px|link=]]&lt;br /&gt;
&lt;br /&gt;
Notice how both brackets have the set screws canted towards the extrusion.  This way the extrusion you are connecting to this one will be pulled in towards it when the set screws are tightened.  The effect is small but important.  The left-hand bracket in this case is the A series while the right-hand one is the B series.  Here is a diagram showing which series is appropriate for which connection a bit more clearly:&lt;br /&gt;
&lt;br /&gt;
[[image:Inner_bracket_ab_diagram.png|center|600px|link=]]&lt;br /&gt;
&lt;br /&gt;
You should always use 2 inner brackets to connect 2 extrusions together.  &lt;br /&gt;
&lt;br /&gt;
[[image:TSL_90deg01_Small.jpg|center|link=]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Butt Connectors===&lt;br /&gt;
These connectors are ideally suited to connecting an extrusion to the middle of another extrusion in a T junction.  They have a similar effect to the screw connectors but don&#039;t require access to the other side of the perpendicular extrusion (for example if you had another extrusion there already for a + configuration).  They can also be used with the plate brackets if you want an even stronger connection (but not the diecast brackets).  They do require that you drill a hole into the extrusion to use however.  Specifically 13mm hole, 11mm deep and 16mm in from the end of the extrusion for the PG30 variant and a 17mm hole, 14mm deep and 22mm in from the end of the extrusion for the PG40 variant.  These connectors should always be used in pairs (on opposite sides of an extrusion) so you will need to drill 2 such holes.  Once done, you can insert the connectors and bolt the extrusions together using preset nuts or square nuts.&lt;br /&gt;
&lt;br /&gt;
[[image:Butt_connector.png|center|link=|1200px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notice that because of the way these connectors line up with the nuts they won&#039;t make a clean 90° corner.  This is why they are better suited for use in the middle of an extrusion somewhere to make a T junction.  For cleaner corners, we recommend you use the screw connectors instead.  &lt;br /&gt;
&lt;br /&gt;
===Cubic Connectors===&lt;br /&gt;
In addition to making 2D right angle corners, you may want to connect 3 extrusions together like in the corner of a cube.  For this, you will want to use the cubic connectors.  These connectors behave vary much like screw connectors in that you must tap out the central hole on the end of the extrusion.  You will then also need to insert a bore reducing sleeve (included with the connector) into the hole which will allow you to bolt the connector on.  The PG30 variant requires an M12 tap while the PG40 variant requires an M14 tap.    &lt;br /&gt;
&lt;br /&gt;
[[image:Cubic_connector.png|center|link=|1200px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Linear Bar Connectors===&lt;br /&gt;
To join two extrusions together to make a longer extrusion you can use linear bar connectors.  They come in packages of 4 so that you can connect all 4 slots for strength but you could get away with just using 2 and it will be plenty strong.  We recommend not using 2 at the minimum though.  Nothing special needs to be done to prep the extrusions, you can simply slot the bar into the extrusions and tighten the set screws.  &lt;br /&gt;
&lt;br /&gt;
[[image:linear_connector.jpg|link=|center|700px]]&lt;br /&gt;
&lt;br /&gt;
===Anchor Connectors===&lt;br /&gt;
Anchor connectors are the only real option available for connecting extrusions at &#039;&#039;non&#039;&#039;-right angles.  While they can also connect extrusions at right angles, there are other connection methods that are better suited for this case.  To use an anchor connector you will need to drill a hole in the extrusion being butted up against the other.  For the PG30 variant it will need to be a 12mm hole, 21mm deep and 30mm from the end of the extrusions (measure from the center of the extrusion if you have cut it at an angle) and for the PG40 variant it will need to be a 15mm hole, 27mm deep and 32mm from the end of the extrusion.  Then, back out the hex head on the anchor so that it comes apart into two pieces:&lt;br /&gt;
&lt;br /&gt;
[[image:anchor_disassembled.png|center|link=|700px]]&lt;br /&gt;
&lt;br /&gt;
The half with the hex head will insert into the hole you have drilled while the half with the actual anchor slides into the central hole in the profile of the extrusion.  Slide the pieces back together and tighten the hex head just enough that it bites and holds the halves together again.  You can now slide the pivoting head into the slot on your other extrusion and tighten the hex head to clamp the extrusions together.&lt;br /&gt;
&lt;br /&gt;
[[image:Anchor_install.png|center|1000px|link=]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Connecting Things to Extrusions==&lt;br /&gt;
T-Slot offers a convenient way to build frames for all manner of different applications.  None of that is useful of course if you can&#039;t easily mount things to that frame.  There are two main methods for attaching things to a frame.  You can either bolt it directly to the frame with a small bracket or plate that is bolted on with some form of nut, or alternatively use the slot profile reducers to insert a panel into the frame which you can then mount to.&lt;br /&gt;
&lt;br /&gt;
===Preset/Square/T Nuts===&lt;br /&gt;
Bolting something directly to the frame is the easiest method for attaching things to T-Slot structures.  There are 3 options for nuts that work with each series (PG20, 30, 40).  &lt;br /&gt;
&lt;br /&gt;
====Preset nuts====&lt;br /&gt;
The preset nut is shaped to fit loosely into the slot so it can slide back and forth into position but not turn.  This allows you to tighten the bolts to it with no fuss.  These are the fastest possible option, with a good combination of strength and ease of use.  Here is an example of an acrylic plate mounted to an extrusion with some preset nuts.  &lt;br /&gt;
&lt;br /&gt;
[[image:Preset_nut.png|center|link=|700px]]&lt;br /&gt;
&lt;br /&gt;
One note on the bolts:  The size of bolt required is dictated by the size of hole in the nut being used obviously.  We have several bore sizes for each series of nut (20,30,40).  The length of the bolt though is the tricky part.  The bolt should &#039;&#039;not&#039;&#039; touch the extrusion at all, you want to make sure that the bolt is long enough to go through the object you are mounting on and sink into the nut far enough to get a strong connection but not so long that it sticks out the far side of the nut and digs into the aluminum as this will cause some wiggle in the mounting point.  For example, for the 5mm thick acrylic plate above M6x10mm bolts were used.  Since the nuts are about 6mm thick in the case of PG30 (which is what was used for this example) that lets the bolt go deep enough into the nut to be secure while still leaving about 1mm of clearance plus the distance between the nut and the extrusion.&lt;br /&gt;
&lt;br /&gt;
====Square nuts====&lt;br /&gt;
Square nuts behave in almost exactly the same way as preset nuts except that they require you to put the tension spring on them and slid into the profile a bit more carefully.  Technically the tensioner isn&#039;t totally necessary but it helps keep the nut in place while you are bolting to it.  It also allows you to bolt things to a vertical surface more easily.  See the preset nut section about the size and length of bolts you should use.&lt;br /&gt;
&lt;br /&gt;
[[image:Square_nut.png|center|link=|1200px]]&lt;br /&gt;
&lt;br /&gt;
====T nuts====&lt;br /&gt;
T nuts are the trickiest to use as well as the least secure of the 3 nut variants but in return they are the only one that can be used after the fact or on extrusions where the ends are not accessible for one reason or another.  The ability to install T nuts directly on the side of an extrusion is very useful.  They also allow you to disconnect a component quickly.  To use a T nut you should start by screwing it on to the object loosely.  Then orient the nuts so they are aligned and slot them into the extrusion.  Finally, carefully turn the bolt heads until the nut is turned 90 degrees and is seated in the extrusion.  Then tighten the bolts the rest of the way and you are done.  See the preset nut section about the size and length of bolts you should use.&lt;br /&gt;
&lt;br /&gt;
[[image:T_nut.png|link=|center|1200px]]&lt;br /&gt;
&lt;br /&gt;
===Profile Reducers and Panel Mounts===&lt;br /&gt;
The profile reducers are plastic inserts for the T-slot slots which allow you to put panels in your structure.  While the profile reducers grip surprisingly strong we still recommend you border the panel on at least 2 sides to ensure a secure hold though you could border the panel on all 4 sides if you wanted to be extra secure.  The profile reducers are simple to cut to length with side cutters or even a sharp utility knife and they slot into the extrusions with minimal effort.  They accept panels anywhere from 3-5mm in width.  Here is an example of an acrylic panel being used but you could use anything you&#039;d like (steel or aluminum plate, other types of plastic, even cardboard if you do desired).  &lt;br /&gt;
&lt;br /&gt;
[[image:Slot_reducers.png|center|link=|700px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Feet and Castors===&lt;br /&gt;
In order to connect feet or castor wheels to your structure you will first have to install an adapter end plate.  This requires tapping the face of the extrusion with an M6 tap or M14 tap for the 40x40mm and 40x80mm profiles respectively.  These plates are only available for the PG40 series extrusions.  Once the plate it installed, the foot or castor will screw into the central hole.&lt;br /&gt;
&lt;br /&gt;
[[image:End_cap.png|center|link=|1200px]]&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=File:End_cap.png&amp;diff=23775</id>
		<title>File:End cap.png</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=File:End_cap.png&amp;diff=23775"/>
		<updated>2016-03-21T19:08:08Z</updated>

		<summary type="html">&lt;p&gt;Burley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=File:Tsl_header.jpg&amp;diff=23774</id>
		<title>File:Tsl header.jpg</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=File:Tsl_header.jpg&amp;diff=23774"/>
		<updated>2016-03-21T19:07:14Z</updated>

		<summary type="html">&lt;p&gt;Burley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=File:Tsl_brackets.png&amp;diff=23773</id>
		<title>File:Tsl brackets.png</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=File:Tsl_brackets.png&amp;diff=23773"/>
		<updated>2016-03-21T19:07:09Z</updated>

		<summary type="html">&lt;p&gt;Burley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=File:T_nut.png&amp;diff=23772</id>
		<title>File:T nut.png</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=File:T_nut.png&amp;diff=23772"/>
		<updated>2016-03-21T19:07:03Z</updated>

		<summary type="html">&lt;p&gt;Burley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=File:TSL_90deg01_Small.jpg&amp;diff=23771</id>
		<title>File:TSL 90deg01 Small.jpg</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=File:TSL_90deg01_Small.jpg&amp;diff=23771"/>
		<updated>2016-03-21T19:07:02Z</updated>

		<summary type="html">&lt;p&gt;Burley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=File:Square_nut.png&amp;diff=23770</id>
		<title>File:Square nut.png</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=File:Square_nut.png&amp;diff=23770"/>
		<updated>2016-03-21T19:06:55Z</updated>

		<summary type="html">&lt;p&gt;Burley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=File:Slot_reducers.png&amp;diff=23769</id>
		<title>File:Slot reducers.png</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=File:Slot_reducers.png&amp;diff=23769"/>
		<updated>2016-03-21T19:06:52Z</updated>

		<summary type="html">&lt;p&gt;Burley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=File:Screw_connector_prep.png&amp;diff=23768</id>
		<title>File:Screw connector prep.png</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=File:Screw_connector_prep.png&amp;diff=23768"/>
		<updated>2016-03-21T19:06:42Z</updated>

		<summary type="html">&lt;p&gt;Burley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=File:Screw_connections.png&amp;diff=23767</id>
		<title>File:Screw connections.png</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=File:Screw_connections.png&amp;diff=23767"/>
		<updated>2016-03-21T19:06:42Z</updated>

		<summary type="html">&lt;p&gt;Burley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=File:Preset_nut.png&amp;diff=23766</id>
		<title>File:Preset nut.png</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=File:Preset_nut.png&amp;diff=23766"/>
		<updated>2016-03-21T19:06:34Z</updated>

		<summary type="html">&lt;p&gt;Burley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=File:Linear_connector.jpg&amp;diff=23765</id>
		<title>File:Linear connector.jpg</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=File:Linear_connector.jpg&amp;diff=23765"/>
		<updated>2016-03-21T19:06:27Z</updated>

		<summary type="html">&lt;p&gt;Burley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=File:Inner_bracket_ab_diagram.png&amp;diff=23764</id>
		<title>File:Inner bracket ab diagram.png</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=File:Inner_bracket_ab_diagram.png&amp;diff=23764"/>
		<updated>2016-03-21T19:06:20Z</updated>

		<summary type="html">&lt;p&gt;Burley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=File:Inner_bracket_ab.jpg&amp;diff=23763</id>
		<title>File:Inner bracket ab.jpg</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=File:Inner_bracket_ab.jpg&amp;diff=23763"/>
		<updated>2016-03-21T19:06:04Z</updated>

		<summary type="html">&lt;p&gt;Burley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=File:Cubic_connector.png&amp;diff=23762</id>
		<title>File:Cubic connector.png</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=File:Cubic_connector.png&amp;diff=23762"/>
		<updated>2016-03-21T19:06:00Z</updated>

		<summary type="html">&lt;p&gt;Burley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=File:Butt_connector.png&amp;diff=23761</id>
		<title>File:Butt connector.png</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=File:Butt_connector.png&amp;diff=23761"/>
		<updated>2016-03-21T19:05:54Z</updated>

		<summary type="html">&lt;p&gt;Burley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=File:Anchor_install.png&amp;diff=23760</id>
		<title>File:Anchor install.png</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=File:Anchor_install.png&amp;diff=23760"/>
		<updated>2016-03-21T19:05:51Z</updated>

		<summary type="html">&lt;p&gt;Burley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=File:Anchor_disassembled.png&amp;diff=23759</id>
		<title>File:Anchor disassembled.png</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=File:Anchor_disassembled.png&amp;diff=23759"/>
		<updated>2016-03-21T19:05:47Z</updated>

		<summary type="html">&lt;p&gt;Burley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=T-Slot_Primer&amp;diff=23758</id>
		<title>T-Slot Primer</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=T-Slot_Primer&amp;diff=23758"/>
		<updated>2016-03-21T19:03:06Z</updated>

		<summary type="html">&lt;p&gt;Burley: Created page with &amp;quot;{| |- valign=middle | align=center width=300px| __TOC__  | link= |}  T-Slot is a framing system composed of extruded aluminum profiles which use...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{|&lt;br /&gt;
|- valign=middle&lt;br /&gt;
| align=center width=300px| __TOC__ &lt;br /&gt;
| [[Image:tsl_header.jpg|500px|link=]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
T-Slot is a framing system composed of extruded aluminum profiles which use the namesake slot as a mounting point for various hardware components.  Phidgets carries three different series of T-Slot extrusions.  A 20mm, 30mm, and 40mm standard.  For each series we carry a single (20x20mm, 30x30mm, 40x40mm) and double (20x40mm, 30x60mm, 40x80mm) wide extrusion.  The series you end up using depends where on the weight vs. strength scale your project ends up falling.  Obviously the smaller extrusions will not be as strong and rigid as the larger extrusions.  The manufacturer provides equations for calculating how strong the extrusions are on pages 11 and 12 of their catalogue which can be found here.  The modulus of elasticity is listed as approximately 70,000N/mm².  The moment of inertia is listed under the specifications for the specific extrusion profile you are using.  With those two parameters you should be able to calculate with reasonable accuracy the relationship between force applied and resultant beam deflection.  &lt;br /&gt;
&lt;br /&gt;
The first thing you will need to do is cut the extrusions to length.  There are 2 ways to do with.  Either with a band saw or a chop saw with an appropriate blade (there are carbide blades designed for cutting aluminum).  Once your extrusions are cut down to size you will want to connect them together:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Connecting Extrusions Together==&lt;br /&gt;
In order for this whole system to be useful you need a way to combine individual extrusions into a more complicated structure.  There are a number of options available for this, each better suited for different situations.  &lt;br /&gt;
&lt;br /&gt;
===Screw Connectors===&lt;br /&gt;
These are the most basic form of connection.  A simple bolt that goes from one extrusion to the next.  In order to use a screw connector there are 2 prerequisite steps you must do before installing.  You need to tap the first extrusion with an appropriate tap for the series you are using (check the product page for the screw connector for which tap is required), and you need to drill a hole in the second extrusion big enough to allow Allen key access to the head of the screw connector.  For example, here is a piece of 30x60mm extrusion prepped for connecting:&lt;br /&gt;
&lt;br /&gt;
[[Image:Screw_connector_prep.png|link=|center]]&lt;br /&gt;
&lt;br /&gt;
Once this is done you can screw the connector into the newly tapped extrusion.  When you get close to the end, slide the head of the connector into the slot on the other extrusion and tighten the rest of the way through the hole you drilled. &lt;br /&gt;
&lt;br /&gt;
[[image:Screw_connections.png|center|link=|1200px]]&lt;br /&gt;
&lt;br /&gt;
===Brackets===&lt;br /&gt;
The diecast aluminum as well as the T and L plate steel brackets allow you to strengthen joints that will experience particularly heavy loads.  You should always use them to reinforce joints which already use another type of connector rather than connecting the extrusions &#039;&#039;purely&#039;&#039; via the brackets.  For all three styles of bracket you will need a few nuts.  We recommend preset or square, the T nuts won&#039;t work well for this application.  Installation is fairly simple, you don&#039;t have to drill and preliminary holes or anything.  Just insert the nuts and bolt the brackets on.  For example:&lt;br /&gt;
&lt;br /&gt;
[[image:Tsl_brackets.png|link=|center|1000px]]&lt;br /&gt;
&lt;br /&gt;
===Inner Brackets===&lt;br /&gt;
The inner brackets are a special variant of bracket that are different enough from the other brackets that they deserve their own section.  These brackets do not need to be used with other connection methods.  They are suitable by themselves (though you could use a reinforcement as well if you wanted to).  The one important distinction to make with these brackets is that there are two models of bracket, A and B.  The difference is that the set screw hole is slightly canted so that the set screw pushes the bracketed extrusion into the other extrusion to tighten the hold.  For example:&lt;br /&gt;
&lt;br /&gt;
[[image:inner_bracket_ab.jpg|center|700px|link=]]&lt;br /&gt;
&lt;br /&gt;
Notice how both brackets have the set screws canted towards the extrusion.  This way the extrusion you are connecting to this one will be pulled in towards it when the set screws are tightened.  The effect is small but important.  The left-hand bracket in this case is the A series while the right-hand one is the B series.  Here is a diagram showing which series is appropriate for which connection a bit more clearly:&lt;br /&gt;
&lt;br /&gt;
[[image:Inner_bracket_ab_diagram.png|center|600px|link=]]&lt;br /&gt;
&lt;br /&gt;
You should always use 2 inner brackets to connect 2 extrusions together.  &lt;br /&gt;
&lt;br /&gt;
[[image:TSL_90deg01_Small.jpg|center|link=]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Butt Connectors===&lt;br /&gt;
These connectors are ideally suited to connecting an extrusion to the middle of another extrusion in a T junction.  They have a similar effect to the screw connectors but don&#039;t require access to the other side of the perpendicular extrusion (for example if you had another extrusion there already for a + configuration).  They can also be used with the plate brackets if you want an even stronger connection (but not the diecast brackets).  They do require that you drill a hole into the extrusion to use however.  Specifically 13mm hole, 11mm deep and 16mm in from the end of the extrusion for the PG30 variant and a 17mm hole, 14mm deep and 22mm in from the end of the extrusion for the PG40 variant.  These connectors should always be used in pairs (on opposite sides of an extrusion) so you will need to drill 2 such holes.  Once done, you can insert the connectors and bolt the extrusions together using preset nuts or square nuts.&lt;br /&gt;
&lt;br /&gt;
[[image:Butt_connector.png|center|link=|1200px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notice that because of the way these connectors line up with the nuts they won&#039;t make a clean 90° corner.  This is why they are better suited for use in the middle of an extrusion somewhere to make a T junction.  For cleaner corners, we recommend you use the screw connectors instead.  &lt;br /&gt;
&lt;br /&gt;
===Cubic Connectors===&lt;br /&gt;
In addition to making 2D right angle corners, you may want to connect 3 extrusions together like in the corner of a cube.  For this, you will want to use the cubic connectors.  These connectors behave vary much like screw connectors in that you must tap out the central hole on the end of the extrusion.  You will then also need to insert a bore reducing sleeve (included with the connector) into the hole which will allow you to bolt the connector on.  The PG30 variant requires an M12 tap while the PG40 variant requires an M14 tap.    &lt;br /&gt;
&lt;br /&gt;
[[image:Cubic_connector.png|center|link=|1200px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Linear Bar Connectors===&lt;br /&gt;
To join two extrusions together to make a longer extrusion you can use linear bar connectors.  They come in packages of 4 so that you can connect all 4 slots for strength but you could get away with just using 2 and it will be plenty strong.  We recommend not using 2 at the minimum though.  Nothing special needs to be done to prep the extrusions, you can simply slot the bar into the extrusions and tighten the set screws.  &lt;br /&gt;
&lt;br /&gt;
[[image:linear_connector.jpg|link=|center|700px]]&lt;br /&gt;
&lt;br /&gt;
===Anchor Connectors===&lt;br /&gt;
Anchor connectors are the only real option available for connecting extrusions at &#039;&#039;non&#039;&#039;-right angles.  While they can also connect extrusions at right angles, there are other connection methods that are better suited for this case.  To use an anchor connector you will need to drill a hole in the extrusion being butted up against the other.  For the PG30 variant it will need to be a 12mm hole, 21mm deep and 30mm from the end of the extrusions (measure from the center of the extrusion if you have cut it at an angle) and for the PG40 variant it will need to be a 15mm hole, 27mm deep and 32mm from the end of the extrusion.  Then, back out the hex head on the anchor so that it comes apart into two pieces:&lt;br /&gt;
&lt;br /&gt;
[[image:anchor_disassembled.png|center|link=|700px]]&lt;br /&gt;
&lt;br /&gt;
The half with the hex head will insert into the hole you have drilled while the half with the actual anchor slides into the central hole in the profile of the extrusion.  Slide the pieces back together and tighten the hex head just enough that it bites and holds the halves together again.  You can now slide the pivoting head into the slot on your other extrusion and tighten the hex head to clamp the extrusions together.&lt;br /&gt;
&lt;br /&gt;
[[image:Anchor_install.png|center|1000px|link=]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Connecting Things to Extrusions==&lt;br /&gt;
T-Slot offers a convenient way to build frames for all manner of different applications.  None of that is useful of course if you can&#039;t easily mount things to that frame.  There are two main methods for attaching things to a frame.  You can either bolt it directly to the frame with a small bracket or plate that is bolted on with some form of nut, or alternatively use the slot profile reducers to insert a panel into the frame which you can then mount to.&lt;br /&gt;
&lt;br /&gt;
===Preset/Square/T Nuts===&lt;br /&gt;
Bolting something directly to the frame is the easiest method for attaching things to T-Slot structures.  There are 3 options for nuts that work with each series (PG20, 30, 40).  &lt;br /&gt;
&lt;br /&gt;
====Preset nuts====&lt;br /&gt;
The preset nut is shaped to fit loosely into the slot so it can slide back and forth into position but not turn.  This allows you to tighten the bolts to it with no fuss.  These are the fastest possible option, with a good combination of strength and ease of use.  Here is an example of an acrylic plate mounted to an extrusion with some preset nuts.  &lt;br /&gt;
&lt;br /&gt;
[[image:Preset_nut.png|center|link=|700px]]&lt;br /&gt;
&lt;br /&gt;
One note on the bolts:  The size of bolt required is dictated by the size of hole in the nut being used obviously.  We have several bore sizes for each series of nut (20,30,40).  The length of the bolt though is the tricky part.  The bolt should &#039;&#039;not&#039;&#039; touch the extrusion at all, you want to make sure that the bolt is long enough to go through the object you are mounting on and sink into the nut far enough to get a strong connection but not so long that it sticks out the far side of the nut and digs into the aluminum as this will cause some wiggle in the mounting point.  For example, for the 5mm thick acrylic plate above M6x10mm bolts were used.  Since the nuts are about 6mm thick in the case of PG30 (which is what was used for this example) that lets the bolt go deep enough into the nut to be secure while still leaving about 1mm of clearance plus the distance between the nut and the extrusion.&lt;br /&gt;
&lt;br /&gt;
====Square nuts====&lt;br /&gt;
Square nuts behave in almost exactly the same way as preset nuts except that they require you to put the tension spring on them and slid into the profile a bit more carefully.  Technically the tensioner isn&#039;t totally necessary but it helps keep the nut in place while you are bolting to it.  It also allows you to bolt things to a vertical surface more easily.  See the preset nut section about the size and length of bolts you should use.&lt;br /&gt;
&lt;br /&gt;
[[image:Square_nut.png|center|link=|1200px]]&lt;br /&gt;
&lt;br /&gt;
====T nuts====&lt;br /&gt;
T nuts are the trickiest to use as well as the least secure of the 3 nut variants but in return they are the only one that can be used after the fact or on extrusions where the ends are not accessible for one reason or another.  The ability to install T nuts directly on the side of an extrusion is very useful.  They also allow you to disconnect a component quickly.  To use a T nut you should start by screwing it on to the object loosely.  Then orient the nuts so they are aligned and slot them into the extrusion.  Finally, carefully turn the bolt heads until the nut is turned 90 degrees and is seated in the extrusion.  Then tighten the bolts the rest of the way and you are done.  See the preset nut section about the size and length of bolts you should use.&lt;br /&gt;
&lt;br /&gt;
[[image:T_nut.png|link=|center|1200px]]&lt;br /&gt;
&lt;br /&gt;
===Profile Reducers and Panel Mounts===&lt;br /&gt;
The profile reducers are plastic inserts for the T-slot slots which allow you to put panels in your structure.  While the profile reducers grip surprisingly strong we still recommend you border the panel on at least 2 sides to ensure a secure hold though you could border the panel on all 4 sides if you wanted to be extra secure.  The profile reducers are simple to cut to length with side cutters or even a sharp utility knife and they slot into the extrusions with minimal effort.  They accept panels anywhere from 3-5mm in width.  Here is an example of an acrylic panel being used but you could use anything you&#039;d like (steel or aluminum plate, other types of plastic, even cardboard if you do desired).  &lt;br /&gt;
&lt;br /&gt;
[[image:Slot_reducers.png|center|link=|700px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Feet and Castors===&lt;br /&gt;
In order to connect feet or castor wheels to your structure you will first have to install an adapter end plate.  This requires tapping the face of the extrusion with an M6 tap or M14 tap for the 40x40mm and 40x80mm profiles respectively.  These plates are only available for the PG40 series extrusions.  Once the plate it installed, the foot or castor will screw into the central hole.&lt;br /&gt;
&lt;br /&gt;
[[image:End_cap.png|center|link=|1200px]]&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=Enclosure_Guide&amp;diff=23756</id>
		<title>Enclosure Guide</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=Enclosure_Guide&amp;diff=23756"/>
		<updated>2016-03-08T17:45:02Z</updated>

		<summary type="html">&lt;p&gt;Burley: Created page with &amp;quot;To set up one of our project boxes in a useful fashion you will need to do a few things.  First is obviously to select an enclosure size that is large enough for everything yo...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;To set up one of our project boxes in a useful fashion you will need to do a few things.  First is obviously to select an enclosure size that is large enough for everything you intend to put in it.  Once you have your enclosure you will want to mount all of your equipment inside of it.  You don&#039;t want to mount directly to the enclosure since this would entail drilling many holes in the base of the enclosure and thereby ruining the watertight seal.  Instead you will want to cut a plate of something stiff that can be mounted to the mounting points inside the enclosure which you will then put all your electronics on.  For example, we used polycarbonate but steel/aluminum plate, acrylic, wood, even cardboard would do the trick.  Here, we have just mounted an SBC to our polycarbonate plate which will then be put in the enclosure:&lt;br /&gt;
&lt;br /&gt;
[[Image:Plate.png|700px|link=]]&lt;br /&gt;
&lt;br /&gt;
Next you will need to drill holes in your enclosure where you want to cables to come in.  Presumably you want the equipment in the box to actually interact with things external to it so you will need at least 1 cable passing in/out.  For this example I will have 2 cables, for the power line to my SBC and 1 for data.  Theoretically with sufficient conductors you could do this with a single cable but for demonstration I will use 2.  The cable glands and enclosure mount cable connectors we sell require relatively large holes (16 and 17mm respectively):&lt;br /&gt;
&lt;br /&gt;
[[Image:Holes_drilled.png|700px|link=]]&lt;br /&gt;
&lt;br /&gt;
With these holes drilled, we can install the plate with our electronics on it and put the cable gland/connector through the holes we drilled.  You may want to connect up all your wires before screwing the plate into the enclosure since it can be difficult to work when everything is crammed into the tight space.&lt;br /&gt;
&lt;br /&gt;
[[Image:Finished.png|700px|link=]]&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=File:Plate.png&amp;diff=23755</id>
		<title>File:Plate.png</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=File:Plate.png&amp;diff=23755"/>
		<updated>2016-03-08T17:44:44Z</updated>

		<summary type="html">&lt;p&gt;Burley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=File:Holes_drilled.png&amp;diff=23754</id>
		<title>File:Holes drilled.png</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=File:Holes_drilled.png&amp;diff=23754"/>
		<updated>2016-03-08T17:44:40Z</updated>

		<summary type="html">&lt;p&gt;Burley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=File:Finished.png&amp;diff=23753</id>
		<title>File:Finished.png</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=File:Finished.png&amp;diff=23753"/>
		<updated>2016-03-08T17:44:36Z</updated>

		<summary type="html">&lt;p&gt;Burley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=Cable_Connector_Guide&amp;diff=23752</id>
		<title>Cable Connector Guide</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=Cable_Connector_Guide&amp;diff=23752"/>
		<updated>2016-03-08T17:43:40Z</updated>

		<summary type="html">&lt;p&gt;Burley: Created page with &amp;quot;The CBL44XX cable connectors allow you to connect cables together quickly, without the need for soldering, and in a waterproof fashion.  There are a lot of pieces to these con...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The CBL44XX cable connectors allow you to connect cables together quickly, without the need for soldering, and in a waterproof fashion.  There are a lot of pieces to these connectors though and they aren&#039;t the most obvious things to assemble, so let&#039;s quickly run through the process step by step.  The first step is to totally disassemble the connector and solder your conductors on to the pin contacts.  Unscrew all the parts (each connector should have 3 or 4 parts depending on if it&#039;s male or female).  &lt;br /&gt;
&lt;br /&gt;
[[Image:Disassembled.png|700px|link=]]&lt;br /&gt;
&lt;br /&gt;
Slide the rear 2/3 sections onto the cable and down out of the way.  Then solder your conductors to the gold half cylinders on the final section.&lt;br /&gt;
&lt;br /&gt;
[[Image:Soldered.png|700px|link=]]&lt;br /&gt;
&lt;br /&gt;
Now you can screw the sections back together and you have completed one half of the connection.  Repeat this for the other cable and you will be able to join them together by plugging them in and locking them closed with the threaded shroud.&lt;br /&gt;
&lt;br /&gt;
[[Image:Complete.png|700px|link=]]&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=File:Complete.png&amp;diff=23751</id>
		<title>File:Complete.png</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=File:Complete.png&amp;diff=23751"/>
		<updated>2016-03-08T17:43:22Z</updated>

		<summary type="html">&lt;p&gt;Burley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=File:Soldered.png&amp;diff=23750</id>
		<title>File:Soldered.png</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=File:Soldered.png&amp;diff=23750"/>
		<updated>2016-03-08T17:43:17Z</updated>

		<summary type="html">&lt;p&gt;Burley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=File:Disassembled.png&amp;diff=23749</id>
		<title>File:Disassembled.png</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=File:Disassembled.png&amp;diff=23749"/>
		<updated>2016-03-08T17:43:00Z</updated>

		<summary type="html">&lt;p&gt;Burley: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=Language_-_LabVIEW&amp;diff=23744</id>
		<title>Language - LabVIEW</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=Language_-_LabVIEW&amp;diff=23744"/>
		<updated>2016-02-02T17:21:39Z</updated>

		<summary type="html">&lt;p&gt;Burley: /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Language]]&lt;br /&gt;
{{OSLang|[[File:icon-LabVIEW.png|64x64px|link=|alt=]]|LabVIEW, developed by [http://www.ni.com National Instruments] is dataflow programming language for data processing.}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
{{LanguageSupport|LabVIEW|the complete Phidget API, including events|all Phidget devices.| Windows. A minimum version of LabVIEW 2009 is required. OS X and Linux are unsupported as the Labview/Phidgets combination has not been tested on those systems.|}}&lt;br /&gt;
&lt;br /&gt;
Note that with LabVIEW you can install a 32-bit version on a 64-bit computer without any issues, but the 64-bit version cannot obviously be installed on a 32-bit computer.  The reason this is relevant is that the respective versions cannot create executables that the other can run.  I.E. 64-bit LabVIEW cannot generate a 32-bit executable.  The upshot of this is that if you need your executable to be compatible with older machines (such as Windows XP machines) then you will need to use a 32-bit version of LabVIEW to create your program.&lt;br /&gt;
&lt;br /&gt;
==Quick Downloads==&lt;br /&gt;
{{QuickDownloads|LabVIEW|&lt;br /&gt;
{{APIQuickDownloads|{{SERVER}}/documentation/LabVIEW_Manual.pdf PDF}}&lt;br /&gt;
{{ExtraAPIQuickDownloads|{{SERVER}}/documentation/web/LabVIEWDoc/index.html|HTML version of}}|&lt;br /&gt;
{{ExampleQuickDownloads|{{SERVER}}/downloads/examples/LabVIEWx86.zip| (32 bit Windows - same file as LabVIEW library)}}&lt;br /&gt;
{{ExampleQuickDownloads|{{SERVER}}/downloads/examples/LabVIEWx64.zip| (64 bit Windows - same file as LabVIEW library)}}|&lt;br /&gt;
{{ExtraLibraryQuickDownloads|{{SERVER}}/downloads/examples/LabVIEWx86.zip|LabVIEW|(32 bit Windows - same file as LabVIEW Examples)}}&lt;br /&gt;
{{ExtraLibraryQuickDownloads|{{SERVER}}/downloads/examples/LabVIEWx64.zip|LabVIEW|(64 bit Windows - same file as LabVIEW Examples)}}&lt;br /&gt;
{{WindowsQuickDownloads}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Please note that the x64 examples are only compatible with LabVIEW 9 and newer.&lt;br /&gt;
&lt;br /&gt;
==Getting started with LabVIEW==&lt;br /&gt;
&lt;br /&gt;
If you are new to writing code for Phidgets, we recommend starting by running, then modifying existing examples. This will allow you to:&lt;br /&gt;
{{ExampleCodeReasons}}&lt;br /&gt;
&lt;br /&gt;
==Windows (XP/Vista/7/8)==&lt;br /&gt;
&lt;br /&gt;
===Description of Library Files===&lt;br /&gt;
LabVIEW programs on Windows depend on the following two items, The installers in the [[#Libraries and Drivers|Quick Downloads]] section put only the {{Code|phidget21.dll}} into your system. You will need to manually put the Phidget LabVIEW library onto your system:&lt;br /&gt;
* &amp;lt;b&amp;gt;{{Code|phidget21.dll}}&amp;lt;/b&amp;gt; contains the actual Phidget library, which is used at run-time.  By default, it is placed in {{Code|C:\Windows\System32}}.&lt;br /&gt;
* &amp;lt;b&amp;gt;{{Code|Phidgets LabVIEW library}}&amp;lt;/b&amp;gt; contains the Phidget library for LabVIEW. You need to place the library into your LabVIEW functions palette. Instructions are explained in the [[#Write Your Own Code | Write Your Own Code]] section.&lt;br /&gt;
&lt;br /&gt;
If you do not want to use our installer, you can download the [{{SERVER}}/downloads/libraries/phidget21-x86.zip {{Code|phidget21.dll}}] and manually install it where you want; refer to our [[OS_-_Windows#Manual_File_Installation | Manual Installation Instructions]].&lt;br /&gt;
&lt;br /&gt;
We include instructions for LabVIEW 2011 on [[#Use Our Examples | using our examples]] and [[#Write Your Own Code | writing your own code]].&lt;br /&gt;
&lt;br /&gt;
====Use Our Examples====&lt;br /&gt;
&lt;br /&gt;
To run the examples, you first download the examples found in the [[#Example Code | Quick Downloads]] section and unpack them into a folder. Here, you will find the {{Code|examples}} folder, which contains {{Code|vi}} programs for all the devices. Each {{Code|vi}} example demonstrate the usage of a few of the device&#039;s properties. To get a broader understanding of the device, you should take a look at all the  {{Code|vi}} examples inside the directory for your device. {{FindYourDevice}}&lt;br /&gt;
&lt;br /&gt;
1. Inside the {{Code|examples}} folder, navigate to the directory for your device. &lt;br /&gt;
&lt;br /&gt;
2. Open up any {{Code|.vi}} of your choice in LabVIEW. In this section, the {{Code|Sensor to Output Example.vi}} of the PhidgetInterfaceKit examples will be used. &lt;br /&gt;
&lt;br /&gt;
[[File:LabVIEW Win Front Panel.PNG|link=|alt=Front Panel]]&lt;br /&gt;
&lt;br /&gt;
You will see the front panel of the example. The front panel shows the user interface of the {{code|vi}} program.&lt;br /&gt;
&lt;br /&gt;
3. Next, let us take a look at the block diagram by navigating to {{Code|Window &amp;amp;rarr; Show Block  Diagram}}.&lt;br /&gt;
&lt;br /&gt;
[[File:LabVIEW Win Block Diagram 1.PNG|link=|alt=Block Diagram]]&lt;br /&gt;
&lt;br /&gt;
The block diagram shows the logic of the application.&lt;br /&gt;
&lt;br /&gt;
[[File:LabVIEW Win Block Diagram 2.PNG|link=|alt=Block Diagram]]&lt;br /&gt;
&lt;br /&gt;
4. The only thing left to do is to run the examples! Navigate to {{Code|Operate &amp;amp;rarr; Run}}.&lt;br /&gt;
&lt;br /&gt;
[[File:LabVIEW Win Run 1.PNG|link=|alt=Run]]&lt;br /&gt;
&lt;br /&gt;
5. The application will run. &lt;br /&gt;
&lt;br /&gt;
[[File:LabVIEW Win Run 2.PNG|link=|alt=Run]]&lt;br /&gt;
&lt;br /&gt;
You can determine that your device is connected to your application if you see the indicator for {{Code|attached}} turn green and the correct serial number is displayed. These features are available in most of the example {{Code|vis}} we provide.&lt;br /&gt;
 &lt;br /&gt;
6. When you are ready to terminate the application, click on the [[File:LabVIEW Win Stop.PNG|link=|alt=Stop]] button to release the hold on the device. Please keep in mind that the application may not terminate properly if you stop it by clicking on {{Code|Operate &amp;amp;rarr; Stop}}.&lt;br /&gt;
&lt;br /&gt;
Once you have the LabVIEW examples running, we have a [[#Follow the Examples|teaching]] section below to help you follow them.&lt;br /&gt;
&lt;br /&gt;
====Write Your Own Code====&lt;br /&gt;
&lt;br /&gt;
When you are building a project from scratch, or adding Phidget function calls to an existing project, you&#039;ll need to add the Phidget LabVIEW library to your development environment. To begin: &lt;br /&gt;
&lt;br /&gt;
1. Navigate to {{Code|Tools &amp;amp;rarr; Advanced &amp;amp;rarr; Edit Palette Set}} to modify the functions palette.&lt;br /&gt;
&lt;br /&gt;
[[File:LabVIEW Win Functions Palette 1.PNG|link=|alt=Edit Function Palette]]&lt;br /&gt;
&lt;br /&gt;
2. The functions palette will show up. Right click an empty area, and select {{Code|Insert &amp;amp;rarr; Subpalette}}. &lt;br /&gt;
&lt;br /&gt;
[[File:LabVIEW Win Functions Palette 2.PNG|link=|alt=Insert Function Palette]]&lt;br /&gt;
&lt;br /&gt;
3. Next, select {{Code|Link to a directory}}.&lt;br /&gt;
&lt;br /&gt;
[[File:LabVIEW Win Functions Palette 3.PNG|link=|alt=Link to a library]]&lt;br /&gt;
&lt;br /&gt;
4. Make sure you have the Phidget LabVIEW library and examples in the [[#Libraries and Drivers| Quick Downloads]] section downloaded and extracted. After extracting, you will find the {{Code|Phidgets}} folder. In LabVIEW, browse to the {{Code|Phidgets}} folder, and select {{Code|Current Folder}}. &lt;br /&gt;
&lt;br /&gt;
[[File:LabVIEW Win Functions Palette 4.PNG|link=|alt=Select Phidgets library]]&lt;br /&gt;
&lt;br /&gt;
This will load the Phidget LabVIEW library into the functions palette. You can find all the functions that pertain to Phidgets inside the {{Code|Phidgets}} palette. &lt;br /&gt;
&lt;br /&gt;
[[File:LabVIEW Win Functions Palette 5.PNG|link=|alt=Phidgets LabVIEW Library]]&lt;br /&gt;
&lt;br /&gt;
5. Click on {{Code|Save Changes}} in the {{Code|Edit Controls and Functions Palette Set}} window. &lt;br /&gt;
&lt;br /&gt;
[[File:LabVIEW Win Functions Palette 6.PNG|link=|alt=Save Function Palette]]&lt;br /&gt;
&lt;br /&gt;
The project now has access to the Phidget function calls and you are ready to begin coding.&lt;br /&gt;
&lt;br /&gt;
The same [[#Follow the Examples|teaching]] section which describes the examples also has further resources for programming your Phidget.&lt;br /&gt;
&lt;br /&gt;
==Follow the Examples==&lt;br /&gt;
&lt;br /&gt;
By following the instructions for your operating system and compiler above, you probably now have a working example and want to understand it better so you can change it to do what you want.  &lt;br /&gt;
&lt;br /&gt;
Since LabVIEW is a graphical language, the best way to get the &#039;code snippets&#039; you need is to take them from our examples.  The best way to find what blocks exist and how to use them is probably to switch between the block diagram view and the GUI view between examples that apply to you.  This will allow you to use pieces from our examples to create your own LabVIEW application.&lt;br /&gt;
&lt;br /&gt;
Your main reference for writing LabVIEW code will be our LabVIEW API information, with syntax for all of our functions:&lt;br /&gt;
&lt;br /&gt;
{{UsingAPhidgetInCodeGeneral|both of which are available in LabVIEW|[{{SERVER}}/documentation/LabVIEW_Manual.pdf API Manual]}}&lt;br /&gt;
&lt;br /&gt;
If you are really getting in to using Phidgets, you probably want our more general programming resources as well.  Although these are focused on the text-based languages that we support (C++, Java, etc), the concepts remain the same on how Phidgets are used within code.  Our [[General Phidget Programming]] page gives more information about:&lt;br /&gt;
* [[General Phidget Programming#Using Multiple Phidgets|Using Multiple Phidgets]] (or a Phidget [[General Phidget Programming#Creating a Software Object|other than the Interface Kit]])&lt;br /&gt;
* Catching [[General Phidget Programming#Exceptions and Errors|exceptions and errors]] and [[General Phidget Programming#Logging|using logging]]&lt;br /&gt;
* [[General Phidget Programming#Event Driven Code|Event catching]] versus [[General Phidget Programming#Logic Code|direct polling]]&lt;br /&gt;
* And more....&lt;br /&gt;
Of course, most of these concepts are covered using block flow within LabVIEW, but knowing the general order of operations can help you structure your code.&lt;br /&gt;
&lt;br /&gt;
==LabVIEW Error Codes==&lt;br /&gt;
LabVIEW uses a number of Phidget specific error codes which are not always well described when they pop up.  If you are debugging your application and are running into one that you cannot figure out you can get more information from the [[General Phidget Programming#Error Codes|Phidget Error Codes list]] under &amp;quot;Software Errors&amp;quot;.  The LabVIEW error codes are just the Phidget error codes + 7000.&lt;br /&gt;
&lt;br /&gt;
==Common Problems and Solutions/Workarounds==&lt;br /&gt;
&lt;br /&gt;
===Issue: Events can occasionally cause issues, especially when there are multiple of the same type of event===&lt;br /&gt;
In other words, if you open 2 Interface Kits and have a sensor change event for each one your system can behave unpredictably.  This problem is a quirk in the way that LabVIEW handles passing pointers to C.  There are a few solutions to this issue, either:&lt;br /&gt;
&lt;br /&gt;
*Stop using events and simply poll the device.  Events work similarly to polling in LabVIEW anyway and should not cause substantial performance changes to your application.&lt;br /&gt;
*Implement a simple fix to the events which are causing the problem.  The pointer is identical in the case where two events of the same type are passed from a single function.  This causes the events in C to output to the same event in LabVIEW.  To get around this you would need to copy the offending subVI, then change the name of the cluster object in it from &amp;quot;Event&amp;quot; to something else (your choice), change the name of the .vi to something else and then use those two different subVIs in your program.  You would need to repeat this for each subsequent event of the same type you wish to have.&lt;br /&gt;
&lt;br /&gt;
Either solution will work and while the first is a bit cleaner the second will work just as well.&lt;br /&gt;
&lt;br /&gt;
===Issue: I cannot attach to an object any more after running my program once===&lt;br /&gt;
What this means is you probably halted the VI instead of using the stop button.  Halting operation will not release the Phidget device properly and will consequently make it unusable until LabVIEW has been exited and restarted.  In order to prevent this from happening you should always use the stop button instead of simply halting operation.  That way the close subVI gets called and the Phidget will be released.&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
	<entry>
		<id>https://www.phidgets.com/docs21/index.php?title=Simple_Spatial_Experiments&amp;diff=23736</id>
		<title>Simple Spatial Experiments</title>
		<link rel="alternate" type="text/html" href="https://www.phidgets.com/docs21/index.php?title=Simple_Spatial_Experiments&amp;diff=23736"/>
		<updated>2015-11-24T16:53:22Z</updated>

		<summary type="html">&lt;p&gt;Burley: /* Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- CATEGORIES --&amp;gt;&lt;br /&gt;
[[Category:fileIO]]&lt;br /&gt;
[[Category:Application Guides]]&lt;br /&gt;
The project described here is a simple data recording program for the Phidget Spatial.  We play with the program and record data to learn things about our environment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|Practical concepts covered are (click on links to see other projects on that topic):&lt;br /&gt;
* Data Logging&lt;br /&gt;
** [[:Category:FileIO|Writing to a text file]]&lt;br /&gt;
** Using Phidgets with C/C++&lt;br /&gt;
* Analyzing your Phidget Data&lt;br /&gt;
|width=&amp;quot;45px&amp;quot;|&amp;amp;nbsp;&lt;br /&gt;
|[[Image:app_guide_simplespatial_introphoto.png|link=|alt=]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As with any of our [[:Category:Application Guides|described projects]], Phidgets takes care of the electrical component design.  Here, we also provide some simple code so you can play around with your Spatial and save the data to plot later.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border:1px solid darkgray;&amp;quot; cellpadding=&amp;quot;5px;&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;Time:&#039;&#039;&#039; &lt;br /&gt;
| About two hours&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Special Needed Tools:&#039;&#039;&#039; &lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Materials and Phidgets:&#039;&#039;&#039;&lt;br /&gt;
|A Phidget Spatial, USB cord, and your computer&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
You should also have:&lt;br /&gt;
*Already worked through our Phidget Spatial Getting Started Guide for your Spatial Device, found in its [[:Category:UserGuide|user guide]] - this will show you how to get the the Phidget Libraries installed [[Software Overview#Operating System Support|for your operating system]].&lt;br /&gt;
*A [[Language - C/C++|a C compiler we support]] (including gcc, MinGW, Borland, Visual Studio, and many more) on your computer&lt;br /&gt;
*If you would like to follow along with the graphing examples, you can install the R Statistical package, which is [http://www.r-project.org/ free and available] for Windows, Mac, and Linux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
A Phidget Spatial can measure acceleration, and some models can also measure gyroscopic motion and magnetic fields.&lt;br /&gt;
&lt;br /&gt;
We start with a Phidget spatial just on our desk, and then play around with it and plot the data.&lt;br /&gt;
&lt;br /&gt;
==Phidgets==&lt;br /&gt;
&lt;br /&gt;
All you need is a Phidget Spatial - this page shows use of the [{{SERVER}}/products.php?product_id=1056 1056 - PhidgetSpatial 3/3/3].  Hook it up using USB to your computer as shown in the getting started guide for your Spatial.  (This can be found in its [[:Category:UserGuide|user guide]].)&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&lt;br /&gt;
Our code measures data by writing it every time we have a &#039;new data&#039; event.  Here we call the function that handles that event {{Code|SpatialDataHandler}}.  &lt;br /&gt;
That function receives an event at the default timing (about every 8 ms) and then writes the received data to a file called {{Code|spatial_data.csv}}.&lt;br /&gt;
&lt;br /&gt;
You can either peruse the code and modify it to your needs, or simply copy and paste it into a file.  We called our file {{Code|sample_code.c}}.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;source&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=cpp&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;quot;phidget21.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#ifndef _WIN32 &lt;br /&gt;
#define __stdcall&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
// Our function that gets called at the set data rate (default of 8 ms)&lt;br /&gt;
// Different rates can be set using CPhidgetSpatialHandle_setDataRate(milliseconds)&lt;br /&gt;
int __stdcall SpatialDataHandler(CPhidgetSpatialHandle spatial, void *userptr, CPhidgetSpatial_SpatialEventDataHandle *data, int count)&lt;br /&gt;
{&lt;br /&gt;
    int i;&lt;br /&gt;
    printf(&amp;quot;.&amp;quot;);&lt;br /&gt;
    fflush(stdout);&lt;br /&gt;
    // Sometimes we get more than one packet per event, this counts through them&lt;br /&gt;
    for(i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
        FILE *file = (FILE *) userptr;&lt;br /&gt;
        // Our header was already printed on opening the file: &lt;br /&gt;
        // Timestamp, then Accel X,Y,Z, then Ang Rate X,Y,Z then Mag Field X,Y,Z&lt;br /&gt;
        fprintf(file, &amp;quot;%f,&amp;quot;, data[i]-&amp;gt;timestamp.seconds + (data[i]-&amp;gt;timestamp.microseconds)/1000000.0);&lt;br /&gt;
        fprintf(file, &amp;quot;%6f,%6f,%6f,&amp;quot;, data[i]-&amp;gt;acceleration[0], data[i]-&amp;gt;acceleration[1], data[i]-&amp;gt;acceleration[2]);&lt;br /&gt;
        fprintf(file, &amp;quot;%6f,%6f,%6f,&amp;quot;, data[i]-&amp;gt;angularRate[0], data[i]-&amp;gt;angularRate[1], data[i]-&amp;gt;angularRate[2]);&lt;br /&gt;
        // Due to time for internal calibration, the compass sometimes returns the large constant PUNK_DBL&lt;br /&gt;
        if (data[i]-&amp;gt;magneticField[0] == PUNK_DBL) {&lt;br /&gt;
	    fprintf(file, &amp;quot;%6f,%6f,%6f\n&amp;quot;, 0.0, 0.0, 0.0);&lt;br /&gt;
        } else {&lt;br /&gt;
    	    fprintf(file, &amp;quot;%6f,%6f,%6f\n&amp;quot;, data[i]-&amp;gt;magneticField[0], data[i]-&amp;gt;magneticField[1], data[i]-&amp;gt;magneticField[2]);&lt;br /&gt;
        }&lt;br /&gt;
        fflush(file);&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char* argv[]) {&lt;br /&gt;
&lt;br /&gt;
    int result;&lt;br /&gt;
    char character;&lt;br /&gt;
&lt;br /&gt;
    FILE *file = fopen(&amp;quot;spatial_data.csv&amp;quot;,&amp;quot;w&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	CPhidgetSpatialHandle spatial = 0;&lt;br /&gt;
&lt;br /&gt;
    // Print the header at the top of the file&lt;br /&gt;
    fprintf(file, &amp;quot;Time,Accel_X,Accel_Y,Accel_Z,Ang_X,Ang_Y,Ang_Z,Mag_X,Mag_Y,Mag_Z\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    CPhidgetSpatial_create(&amp;amp;spatial);&lt;br /&gt;
&lt;br /&gt;
    // Hook our file-writing function above into the data stream events&lt;br /&gt;
    CPhidgetSpatial_set_OnSpatialData_Handler(spatial, SpatialDataHandler, (void *) file);&lt;br /&gt;
&lt;br /&gt;
    CPhidget_open((CPhidgetHandle)spatial, -1);&lt;br /&gt;
&lt;br /&gt;
    result = CPhidget_waitForAttachment((CPhidgetHandle)spatial, 10000);&lt;br /&gt;
    if (result) {&lt;br /&gt;
        printf(&amp;quot;No Device!\n&amp;quot;);&lt;br /&gt;
        return 0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Press Enter to end\n&amp;quot;);&lt;br /&gt;
    getchar();&lt;br /&gt;
&lt;br /&gt;
    CPhidget_close((CPhidgetHandle)spatial);&lt;br /&gt;
    CPhidget_delete((CPhidgetHandle)spatial);&lt;br /&gt;
    fclose(file);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Compile your C file using the instructions for our examples on the [[Language - C/C++]] page.  &lt;br /&gt;
* This code was written for gcc, so you&#039;ll either have to use a gcc compiler (Cygwin, Mac OSX, or Linux) or modify the code to work with your favourite platform.  &lt;br /&gt;
* The code has been tested on Linux, and Cygwin on Windows. &lt;br /&gt;
* Make sure to copy the last blank line return at the end of the file - many Windows compilers insist on this being present. &lt;br /&gt;
&lt;br /&gt;
Then, run your program in a command line manner, so you can input a keystroke and Enter to end the program.  If you:&lt;br /&gt;
# Have your spatial plugged in&lt;br /&gt;
# Lie the spatial down flat (chips up) on the same surface as your computer keyboard&lt;br /&gt;
# Compile the {{Code|sample_code.c}} file using the source code above &lt;br /&gt;
# Use {{Code|gcc}} on Mac OS, Linux, or Cygwin, and then &lt;br /&gt;
# Run the program for about three seconds before pressing a key (and Enter) to exit&lt;br /&gt;
...It might look something like this:&lt;br /&gt;
&lt;br /&gt;
[[File:app_guide_simplespatial_runprog.png|alt=|link=]]&lt;br /&gt;
&lt;br /&gt;
==Putting it All Together==&lt;br /&gt;
&lt;br /&gt;
Running the program as described in the [[#Code|Code]] section above will give you a file called {{Code|spatial_data.csv}} in the same folder as your source code.&lt;br /&gt;
&lt;br /&gt;
The file is a Comma-Separated-Value (csv) file, and can be easily imported into a spreadsheet by using a comma character as a separator.  Often, your default installed spreadsheet program (such as Microsoft Office Excel) will automatically detect that the csv file should be opened into a spreadsheet:&lt;br /&gt;
&lt;br /&gt;
[[File:app_guide_simplespatial_xls.png|alt=|link=]]&lt;br /&gt;
&lt;br /&gt;
You can then make your own plots on the spreadsheet.  Or, you can install the R Statistical package, which is [http://www.r-project.org/ free and available] for Windows, Mac, and Linux, and follow along making these graphs as well....&lt;br /&gt;
&lt;br /&gt;
If you start R in the same directory as your code and data (for example, on the DOS prompt going to that directory and typing &amp;quot;R&amp;quot;), you can then import the data file like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;source&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=rsplus&amp;gt;&lt;br /&gt;
data = read.csv(&amp;quot;spatial_data.csv&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can then access each column of data using a &amp;quot;$&amp;quot; separator.  For example, {{Code|data$Accel_X}} is the column of X-axis acceleration data.&lt;br /&gt;
&lt;br /&gt;
Since it is the Z axis that is feeling the effects of gravity&#039;s pull (which is itself acceleration), we can plot the Z-axis acceleration versus Time in R like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;source&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=rsplus&amp;gt;&lt;br /&gt;
plot(data$Time,data$Accel_Z)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or we can pretty it up with connecting lines, some colour, and some axis labels like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;source&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=rsplus&amp;gt;&lt;br /&gt;
plot(data$Time,data$Accel_Z,type=&amp;quot;l&amp;quot;,xlab=&amp;quot;Time in Seconds&amp;quot;,ylab=&amp;quot;Z Axis Acceleration&amp;quot;,col=&amp;quot;blue&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
...Which produces a graph like this of our three seconds of recording:&lt;br /&gt;
&lt;br /&gt;
[[File:app_guide_simplespatial_startgraph.png|700px|link=|alt=]]&lt;br /&gt;
&lt;br /&gt;
Even from this little three second experiment, we have a number of events and data boundaries:&lt;br /&gt;
&lt;br /&gt;
[[File:app_guide_simplespatial_startgraph_labels.png|700px|link=|alt=]]&lt;br /&gt;
&lt;br /&gt;
If both your keyboard and your spatial are on a shared and sufficiently hard surface, the force from your key presses starting and ending the program in a command line prompt will vibrate down the table and show up as acceleration.  Force equals mass times acceleration, so applying a force to the keys, and there to the table, and there to the Spatial will create acceleration in the Spatial.&lt;br /&gt;
&lt;br /&gt;
You will also notice that there is some small up and down between key presses.  This gives us both:&lt;br /&gt;
* The average noise (as long as your table is completely still and untouched), and &lt;br /&gt;
* The average sensed gravity along the Z axis&lt;br /&gt;
&lt;br /&gt;
You may also note that the sensed acceleration is very slightly off of one gravity in the Z direction.  Gravity varies very slightly naturally over the Earth. However, before you go brushing off a deviation from 1.00 as due to natural variation, we want to make sure we have no tilt.  Examining the Spatial on your desk may reveal something like this:&lt;br /&gt;
&lt;br /&gt;
[[File:app_guide_simplespatial_tiltvisual.png|550px|link=|alt=]]&lt;br /&gt;
&lt;br /&gt;
Using the [[:Category:UserGuide|user guide]] for the spatial, we can use the equation for tilt to calculate tilt for each time point in R (the 180 over 3.14 is to convert from radians to degrees):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;source&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=rsplus&amp;gt;&lt;br /&gt;
tilt = 180/3.14 * (asin(data$Accel_X) + asin(data$Accel_Y))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And plotting this data (with some colour and labels) by using:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;source&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=rsplus&amp;gt;&lt;br /&gt;
plot(data$Time,tilt,type=&amp;quot;l&amp;quot;,xlab=&amp;quot;Time in Seconds&amp;quot;,ylab=&amp;quot;Tilt&amp;quot;,col=&amp;quot;orange&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
....Gives:&lt;br /&gt;
&lt;br /&gt;
[[File:app_guide_simplespatial_tiltgraph.png|700px|link=|alt=]]&lt;br /&gt;
&lt;br /&gt;
We can see that the tilt doesn&#039;t really vary much at 0 and 3 seconds when our key presses occurred.  So the up and down is probably mostly due to axis noise.  This means we&#039;re mostly interested in the average tilt on the table rather than the constant fluctuation.  &lt;br /&gt;
&lt;br /&gt;
Finding an average tilt value over these three seconds by:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;source&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=rsplus&amp;gt;&lt;br /&gt;
sum(tilt)/length(tilt)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gives an average tilt in our data of -2.6 degrees, which is reasonable for what we saw in the photo of the Spatial on our desk.&lt;br /&gt;
&lt;br /&gt;
==Extra Credit==&lt;br /&gt;
&lt;br /&gt;
Use the datalogger program to:&lt;br /&gt;
* Record vibrations when the Spatial is on a humming device (your computer, your fridge, etc) - compare with a still desk&lt;br /&gt;
* Measure rotation using the Gyroscope if one is on your Spatial&lt;br /&gt;
* Record acceleration while you move the Spatial (without rotating) a &#039;&#039;known distance&#039;&#039;&lt;br /&gt;
** Try to reverse-derive this distance (position change) from the acceleration data alone (it is hard!)&lt;br /&gt;
** Move the accelerometer quickly and slowly along this distance and see how it becomes easier or harder to measure&lt;br /&gt;
** Think about leaving the accelerometer still for a little while to measure noise, and then moving it&lt;br /&gt;
&lt;br /&gt;
And so on.  Capturing data and plotting it can be a powerful first step before using that data to actually perform additional tasks.&lt;/div&gt;</summary>
		<author><name>Burley</name></author>
	</entry>
</feed>