<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">

<channel>
	<title>Circuits@Home</title>
	
	<link>http://www.circuitsathome.com</link>
	<description>A Solder Joint</description>
	<lastBuildDate>Thu, 12 Aug 2010 23:06:20 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/chome" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="chome" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Designing DC-DC converters using TI TPS61200 controller</title>
		<link>http://www.circuitsathome.com/low-power/designing-dc-dc-converters-using-ti-tps61200-controller</link>
		<comments>http://www.circuitsathome.com/low-power/designing-dc-dc-converters-using-ti-tps61200-controller#comments</comments>
		<pubDate>Tue, 10 Aug 2010 06:17:06 +0000</pubDate>
		<dc:creator>oleg</dc:creator>
				<category><![CDATA[DC-DC]]></category>
		<category><![CDATA[Low Power]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[boost]]></category>
		<category><![CDATA[Li-ion]]></category>
		<category><![CDATA[Li-poly]]></category>
		<category><![CDATA[NiMH]]></category>
		<category><![CDATA[solar]]></category>
		<category><![CDATA[super capacitor]]></category>
		<category><![CDATA[TPS61200]]></category>

		<guid isPermaLink="false">http://www.circuitsathome.com/?p=2105</guid>
		<description><![CDATA[<p class="wp-caption-text">1.2V to 5V DC_DC converter based on TI TPS61200</p>
<p>About a year ago, while researching low startup voltage DC-DC converters I ran into Texas Instruments&#8217; TPS61200. This monolithic synchronous rectifier boost converter has several nice features. First, the input voltage range starts at 0.3V; therefore, it&#8217;s possible to run the converter from low-voltage source such [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_3722" class="wp-caption alignright" style="width: 298px"><a href="/wp/wp-content/uploads/LiPo33_title.jpg"><img src="/wp/wp-content/uploads/LiPo33_title-288x216.jpg" alt="1.2V to 5V DC_DC converter based on TI TPS61200" title="1.2V to 5V DC_DC converter based on TI TPS61200 " width="288" height="216" class="size-thumbnail wp-image-3722" /></a><p class="wp-caption-text">1.2V to 5V DC_DC converter based on TI TPS61200</p></div>
<p>About a year ago, while researching low startup voltage DC-DC converters I ran into <a href="http://focus.ti.com/docs/prod/folders/print/tps61200.html">Texas Instruments&#8217; TPS61200</a>. This monolithic synchronous rectifier boost converter has several nice features. First, the input voltage range starts at 0.3V; therefore, it&#8217;s possible to run the converter from low-voltage source such as single solar cell or supercapacitor. Second, the converter is powerful &#8211; up to 1.8A for certain input/output voltage combination. (&#8221;Certain&#8221; is a key word here &#8211; see below for explanation). Another nice feature is the ability to down-regulate the output when Vin exceeds Vout; for example, you can configure the converter to run from single-cell Li-ion/Li-poly battery and output stable 3.3V over the whole 4.2V-2.7V Li-Poly range. In addition to all that, the controller has built-in undervoltage lockout feature &#8211; minimum input voltage, below which controller would shut itself off can be set with simple voltage divider. This feature comes handy when rechargeable battery is used as power source. TPS61200 also has pins for enabling/disabling and power-saving mode on/off. Device is manufactured in 2 fixed Vout configurations &#8211; 3.3V, 5V, plus adjustable variant. Maximum working input voltage is 5.5V, minimum output voltage for adjustable part is specified at 1.8V.</p>
<p>After much prototyping and testing I came out with a layout that works well. The result can be seen on title picture &#8211; Arduino Duemilanove board (running <a href="/mcu/programming/how-to-drive-usb-keyboard-from-arduino">USB keyboard polling sketch</a> ) , USB Host Shield, LCD display and USB keyboard all powered by single 1.2V NiMH AA cell. The circuit that makes it possible can be seen on the left side of the picture connected between the battery and USB B connector, which is used here as 5V power connector to the Arduino.</p>
<p>The run time of this setup from freshly charged 1800ma NiMH cell is 6 hours which makes it quite practical. It should be noted that when input voltage is much lower than output voltage, efficiency suffers ( see figure 8 in the <a href="http://focus.ti.com/lit/ds/symlink/tps61200.pdf">datasheet</a>. 3 NiMH cells in series or single-cell Li-Poly is much better for 5V output, even 4 NiMHs will work if load is light &#8211; in down conversion mode power losses in the converter increase and I found that the chip gets very warm with output current of 200ma or more while down converting.</p>
<p><span id="more-2105"></span></p>
<div id="attachment_3751" class="wp-caption alignleft" style="width: 298px"><a href="/wp/wp-content/uploads/LiPo33_closeup1.jpg"><img src="https://www.circuitsathome.com/wp/wp-content/uploads/LiPo33_closeup1-288x216.jpg" alt="LiPo33 closeup" title="LiPo33 closeup" width="288" height="216" class="size-thumbnail wp-image-3751" /></a><p class="wp-caption-text">LiPo33 closeup</p></div>
<p>Another non-obvious characteristic of this controller is maximum possible output current to input voltage relation. Figure 1 in the data sheet shows that for input voltages up to 0.6V output current is really small &#8211; less than 50ma. This is the current one should expect while running the converter from single 0.55V solar cell. Voltage drop due to battery discharging shall also be considered. For example, fresh Li-Poly cell has 4.2V terminal voltage. According to Figure 1, this gives output current of 1500mA. However, at the end of discharge (2.7V) max.output current drops to ~800ma and this current should be taken as maximum for the whole range.</p>
<p>The controller has built-in over-current and over-temperature protection so experimenting with heavy loads won&#8217;t kill it. I found it running not too hot with output current up to 1A. More current is quite possible when input to output voltage ratio is small and cooling is adequate.</p>
<p>Now let&#8217;s talk about choice of power sources. A pair of AA or AAA alkaline batteries will make good source for 3.3V generation. 3 will work well for 5V. As little as one can be used if weight and/or volume of a circuit has to be reduced. Absolute max.input voltage for TPS61200 is specified at 7V, therefore, for maximum run time a series of up to 4 AA cells can be used with big loss of efficiency at the beginning of discharge, until input voltage drops below output voltage. Also, solar cells and super capacitors can be used when loads are really light. Rechargeable batteries are another good option; however, since TPS61200 is capable of working with input voltage down to 250mv, special precautions must be taken when using rechargeables with this controller.</p>
<p>Draining rechargeable cell below its end-of-discharge voltage may cause damage to the cell. As a result, a cell may become non-rechargeable and Lithium cell may even overheat and catch fire. For NiMH cell, end-of-discharge is 0.8V; for Li-Poly cells recommended end-of-discharge is 2.5-2.7V. To work properly with rechargeable power sources TPS61200 has built-in undervoltage lockout circuitry &#8211; when voltage on UVLO pin drops below 250mV, the converter turns off. Therefore, desired end-of-discharge voltage can be easily set with voltage divider ( R3, R4 of the <a href="/chome_downloads/LiPo33_121.pdf">schematic</a>). UVLO pin also has hysteresis of 50mv and this hysteresis gets multiplied by dividers&#8217; ratio; for example, when UVLO is set to 2.5V, minimum turn-on voltage of the converter will be 3V. Capacitor C4 takes care of this issue by shorting resistor R3 during turn-on.</p>
<p>The closeup picture shows TPS61200-based DC-DC converter designed for 5V output and Li-Poly input. Blue part marked &#8220;0&#8243; close to the low right corner of the PCB is a jumper across R5 (I&#8217;m using fixed-otput TPS61202 here) and two resistors placed along the edge of a board make UVLO divider. JST connector polarity is compatible with Sparkfun <a href="http://www.sparkfun.com/commerce/product_info.php?products_id=8483">single-cell Li-Po batteries</a>.</p>
<p>Project files can be <a href="/chome_downloads/LiPo33_121_ea.zip">downloaded</a> from Downloads section. Also, PCB is <a href="http://batchpcb.com/index.php/Products/37429">available at BatchPCB</a>. TPS61200 comes in 10 pin QFN package with thermal slug on the bottom of the package, which has to be soldered on the PCB for proper cooling. Other parts are size 0603 and 1206. Both surface mount and through-hole JST connectors can be used on the input side.</p>
<p>I&#8217;m getting ready to start producing this converter in 3.3V and 5V variants with 0.8, 1.6, and 2.5V end-of-discharge voltages. Please let me know if any other output or end-of-discharge voltages are necessary. Also, any other comments about this design are most welcome!</p>
<p>Oleg.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.circuitsathome.com/low-power/designing-dc-dc-converters-using-ti-tps61200-controller/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Arduino USB Host Mini – first prototype.</title>
		<link>http://www.circuitsathome.com/mcu/programming/arduino-usb-host-mini-first-prototype</link>
		<comments>http://www.circuitsathome.com/mcu/programming/arduino-usb-host-mini-first-prototype#comments</comments>
		<pubDate>Wed, 28 Jul 2010 20:45:00 +0000</pubDate>
		<dc:creator>oleg</dc:creator>
				<category><![CDATA[Arduino]]></category>
		<category><![CDATA[MCU]]></category>
		<category><![CDATA[USB]]></category>
		<category><![CDATA[USB Shield]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[camera]]></category>
		<category><![CDATA[control]]></category>
		<category><![CDATA[host]]></category>
		<category><![CDATA[mini]]></category>
		<category><![CDATA[pro]]></category>
		<category><![CDATA[PTP]]></category>
		<category><![CDATA[shield]]></category>

		<guid isPermaLink="false">http://www.circuitsathome.com/?p=3706</guid>
		<description><![CDATA[<p class="wp-caption-text">First prototype of USB Host Mini</p>
<p>This is the status update on Arduino USB Host Mini development, announced 3 weeks ago. I received rev.0 PCBs last Saturday &#8211; BatchPCB is faster than ever! I made a test build (see title picture) and after fixing one major and several minor mistakes placed an order for what [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_3707" class="wp-caption alignright" style="width: 298px"><a href="/wp/wp-content/uploads/UHS_mini_r0_proto.jpg"><img src="https://www.circuitsathome.com/wp/wp-content/uploads/UHS_mini_r0_proto-288x216.jpg" alt="First prototype of USB Host Mini" title="First prototype of USB Host Mini" width="288" height="216" class="size-thumbnail wp-image-3707" /></a><p class="wp-caption-text">First prototype of USB Host Mini</p></div>
<p>This is the status update on Arduino USB Host Mini development, <a href="/mcu/programming/arduino-usb-host-mini-initial-revision">announced 3 weeks ago</a>. I received rev.0 PCBs last Saturday &#8211; BatchPCB is faster than ever! I made a test build (see title picture) and after fixing one major and several minor mistakes placed an order for what I&#8217;m hoping will be the final pre-production sample.</p>
<p>The prototype was built to sit on top of Arduino Pro Mini to make access to the parts easier during troubleshooting. On the final board USB connector is placed slightly further away from the pins; it will be possible to place Arduino on top of the shield so that the height of the &#8220;sandwich&#8221; will be less or equal to the height of USB connector.</p>
<p>In 2-3 weeks I&#8217;m hoping to finalize the design and start producing the USB Host Mini. Stay tuned!</p>
<p>Oleg. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.circuitsathome.com/mcu/programming/arduino-usb-host-mini-first-prototype/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Controlling robotic arm with Arduino and USB mouse</title>
		<link>http://www.circuitsathome.com/mcu/programming/controlling-robotic-arm-with-arduino-and-usb-mouse</link>
		<comments>http://www.circuitsathome.com/mcu/programming/controlling-robotic-arm-with-arduino-and-usb-mouse#comments</comments>
		<pubDate>Sat, 17 Jul 2010 02:14:13 +0000</pubDate>
		<dc:creator>oleg</dc:creator>
				<category><![CDATA[Arduino]]></category>
		<category><![CDATA[MCU]]></category>
		<category><![CDATA[USB]]></category>
		<category><![CDATA[USB Shield]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[arm]]></category>
		<category><![CDATA[host]]></category>
		<category><![CDATA[inverse]]></category>
		<category><![CDATA[kinematics]]></category>
		<category><![CDATA[mouse]]></category>
		<category><![CDATA[robotic]]></category>
		<category><![CDATA[shield]]></category>

		<guid isPermaLink="false">http://www.circuitsathome.com/?p=3656</guid>
		<description><![CDATA[<p>Many people asked me to post a video showing an arm from inverse kinematics article in action. While making a video, I realized that shots of the arm following a pattern of computer-generated coordinates is going to be less than exciting and decided to add manual control. The video below shows the result. In addition [...]]]></description>
			<content:encoded><![CDATA[<p>Many people asked me to post a video showing an <a href="/mcu/programming/robotic-arm-inverse-kinematics-on-arduino">arm from inverse kinematics article</a> in action. While making a video, I realized that shots of the arm following a pattern of computer-generated coordinates is going to be less than exciting and decided to add manual control. The video below shows the result. In addition to the video, a <a href="/communicating-arduino-with-hid-devices-part-1">HID introductory page</a> has been written describing HID communication basics as well as some simple Arduino code. Enjoy! ( <a href="http://www.youtube.com/watch?v=nz_tgDD8FNw">Youtube link</a>, where HD quality video can be selected ).</p>
<p><a href="http://github.com/felis/USB_Host_Shield/blob/master/examples/arm_mouse.pde">Arduino sketch written for this video</a> is on gitHub.</p>
<p><object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/nz_tgDD8FNw&amp;hl=en_US&amp;fs=1?rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/nz_tgDD8FNw&amp;hl=en_US&amp;fs=1?rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://www.circuitsathome.com/mcu/programming/controlling-robotic-arm-with-arduino-and-usb-mouse/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Arduino USB Host Mini – initial revision</title>
		<link>http://www.circuitsathome.com/mcu/programming/arduino-usb-host-mini-initial-revision</link>
		<comments>http://www.circuitsathome.com/mcu/programming/arduino-usb-host-mini-initial-revision#comments</comments>
		<pubDate>Thu, 08 Jul 2010 12:00:45 +0000</pubDate>
		<dc:creator>oleg</dc:creator>
				<category><![CDATA[Arduino]]></category>
		<category><![CDATA[MCU]]></category>
		<category><![CDATA[USB]]></category>
		<category><![CDATA[USB Shield]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[camera]]></category>
		<category><![CDATA[control]]></category>
		<category><![CDATA[host]]></category>
		<category><![CDATA[mini]]></category>
		<category><![CDATA[pro]]></category>
		<category><![CDATA[PTP]]></category>
		<category><![CDATA[shield]]></category>

		<guid isPermaLink="false">http://www.circuitsathome.com/?p=3633</guid>
		<description><![CDATA[<p class="wp-caption-text">USB Host mini rev.0</p>
<p>This post announces starting of development of new Arduino USB Host Shield variant. There are several projects in the works (thanks, guys for letting me know!), where standard size Arduino board is too big. Since electronics of USB Host Shield is pretty simple, it was decided to shrink the board as [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_3632" class="wp-caption alignright" style="width: 298px"><a href="/wp/wp-content/uploads/UHS_mini_r0.jpg"><img src="https://www.circuitsathome.com/wp/wp-content/uploads/UHS_mini_r0-288x216.jpg" alt="USB Host mini rev.0" title="UHS_mini_r0" width="288" height="216" class="size-thumbnail wp-image-3632" /></a><p class="wp-caption-text">USB Host mini rev.0</p></div>
<p>This post announces starting of development of new Arduino USB Host Shield variant. There are several projects in the works (thanks, guys for letting me know!), where standard size Arduino board is too big. Since electronics of USB Host Shield is pretty simple, it was decided to shrink the board as much as possible. Here is the first iteration.</p>
<p>The initial revision of USB Host Shield in Mini form factor is shown on title picture, It is intended to be used with Sparkfun&#8217;s <a href="http://www.sparkfun.com/commerce/product_info.php?products_id=9220">3.3V Arduino Pro Mini</a>. Intended applications include digital camera control devices, robots, as well as any other projects where size and weight has to be minimized. The Gerbers was sent to BatchPCB; I&#8217;m expecting boards back in couple of weeks. The main goals of this first prototype are manufacturability check as well as checking claims made below.</p>
<p>The Mini Host is simplified version of full-sized shield; only USB and GPIO are available. By default, VBUS is routed to VCC, therefore only self-powered USB devices are expected to function (even though I have at least one USB flash drive which works fine powered from 3.3V VBUS). I also provided extra pads to simplify signal re-routing, however, since there was no place left for jumpers a trace has to be cut instead.  The same has been arranged for VBUS &#8211; if 5V power is necessary, Arduino Pro Mini/Shield combination can be powered with 5V on RAW pin, the VCC trace cut off VBUS and RAW and VBUS connected.</p>
<p>As soon as first prototype is tested, I will post CAD files and also make boards available at BatchPCB. Stay tuned!</p>
<p>Oleg.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.circuitsathome.com/mcu/programming/arduino-usb-host-mini-initial-revision/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Towards an FT232 Driver for the USB Host Shield- Part 0</title>
		<link>http://www.circuitsathome.com/mcu/towards-an-ft232-driver-for-the-usb-host-shield-part-0</link>
		<comments>http://www.circuitsathome.com/mcu/towards-an-ft232-driver-for-the-usb-host-shield-part-0#comments</comments>
		<pubDate>Sat, 03 Jul 2010 16:16:15 +0000</pubDate>
		<dc:creator>I-Bot</dc:creator>
				<category><![CDATA[Arduino]]></category>
		<category><![CDATA[MCU]]></category>
		<category><![CDATA[USB Shield]]></category>
		<category><![CDATA[FT232]]></category>
		<category><![CDATA[host]]></category>
		<category><![CDATA[MAX3421E]]></category>
		<category><![CDATA[shield]]></category>
		<category><![CDATA[USB]]></category>

		<guid isPermaLink="false">http://www.circuitsathome.com/?p=3581</guid>
		<description><![CDATA[<p class="wp-caption-text">FTDI232RL IC on a breakout board</p>
<p>Based on some discussion on the Arduino Forum, Richard has added this blog entry as work in progress on developing a library to support FTDI Serial port devices on the USB Host Shield. While cautious to publish at this early testing stage, the content here should help parallel developers.</p>
<p>My [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_3611" class="wp-caption alignright" style="width: 298px"><a href="/wp/wp-content/uploads/ftdi232_01.jpg"><img src="/wp/wp-content/uploads/ftdi232_01-288x216.jpg" alt="FTDI232RL IC on a breakout board" width="288" height="216" class="size-thumbnail wp-image-3611" /></a><p class="wp-caption-text">FTDI232RL IC on a breakout board</p></div>
<p>Based on some discussion on the Arduino Forum, Richard has added this blog entry as work in progress on developing a library to support FTDI Serial port devices on the USB Host Shield. While cautious to publish at this early testing stage, the content here should help parallel developers.</p>
<p>My thoughts last year were that an FT232 driver for the Host Shield was not really useful. It seemed rather reverse to add a USB host plus a USB device to achieve something that can be done with a piece of wire. However USB is coming to be the baseline interface and is now the only interface offered on many serial devices.</p>
<p><strong>USB Shield Hardware</strong><br />
Since my last blog update, Sparkfun have released their own version of the USB Host Shield. Great to have another source of the shield, with good stock at many International Sparkfun distributors. However they did add a couple of problems too:<br />
Sparkfun swapped the <strong>RESET</strong> and the <strong>GPX</strong> pins from the original from Oleg. This means the shield will not work with the libraries from Oleg without a modification.<br />
The current <em>Max3421e_constants.h</em> from Oleg has:<br />
<code><br />
/* Arduino pin definitions for USB Host Shield signals. They can be changed here or while calling constructor */<br />
#define MAX_SS 10<br />
#define MAX_INT 9<br />
//#define MAX_GPX 8<br />
#define MAX_RESET 7<br />
</code><br />
These work for the shield from Oleg, and existing published code and libraries without change.</p>
<p>However for the Sparkfun Shield they must be changed in <em>Max3421e_constants.h</em>, or optionally changed when the constructor is called to:</p>
<p><code><br />
#define MAX_SS 10<br />
#define MAX_INT 9<br />
//#define MAX_GPX 7<br />
#define MAX_RESET 8<br />
</code></p>
<p><span id="more-3581"></span></p>
<p>To add further complication, In the FTDI code I will describe below MAX_GPX is used, so must be uncommented in <em>Max3421e_constants.h</em> or added as a #define in the sketch. Again this should match the shield type as above.</p>
<p>The other common problem with the Sparkfun shield is that it is powered differently from the shield from Oleg. The Sparkfun Shield and the connected USB device is powered from Vin via voltage regulators. While the Arduino 5V and 3.3V supplies can be provided by either Vin or Vusb, Vin cannot be provided by Vusb. This means the Sparkfun shield must have an external Vin supply to work, while the shield from Oleg does not need this.</p>
<p><strong>Library Updates</strong><br />
There have been some library updated from Oleg over the last months to include a number of changes to support latest applications. The latest version from Oleg should be backward compatible to existing sketches and examples.<br />
Here again, I will propose another addtional change to the usb.h library. The reason for this is that the existing devices which have been used on the USB Host Shield, all returned either a known number of bytes during an in transfer, or the data bytes contained the length within the data itself. The FTDI device, does not do this and sends a variable length packet, without length indication within the data. Thus we need to pass the data length back to the sketch in some other way.<br />
To maintain backward compatibility I added an new version of the in transfer:<br />
In usb.h<br />
<code>byte inTransfern( byte addr, byte ep, unsigned int* nbytes, char* data, unsigned int nak_limit = USB_NAK_LIMIT );<br />
</code><br />
and in usb.cpp</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">/* Version with pointer to nbytes, to return actual number */</span>
<span style="color: #808080; font-style: italic;">/* IN transfer to arbitrary endpoint. Assumes PERADDR is set. Handles multiple packets if necessary. Transfers 'nbytes' bytes. */</span>
<span style="color: #808080; font-style: italic;">/* Keep sending INs and writes data to memory area pointed by 'data' */</span>
<span style="color: #808080; font-style: italic;">/* rcode 0 if no errors. rcode 01-0f is relayed from dispatchPkt(). Rcode f0 means RCVDAVIRQ error,
fe USB xfer timeout */</span>
byte USB<span style="color: #339933;">::</span><span style="color: #202020;">inTransfern</span><span style="color: #009900;">&#40;</span> byte addr<span style="color: #339933;">,</span> byte ep<span style="color: #339933;">,</span> <span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span><span style="color: #339933;">*</span> nbytes<span style="color: #339933;">,</span> <span style="color: #993333;">char</span><span style="color: #339933;">*</span> data<span style="color: #339933;">,</span> <span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> nak_limit <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
 byte rcode<span style="color: #339933;">;</span>
 byte pktsize<span style="color: #339933;">;</span>
 byte maxpktsize <span style="color: #339933;">=</span> devtable<span style="color: #009900;">&#91;</span> addr <span style="color: #009900;">&#93;</span>.<span style="color: #202020;">epinfo</span><span style="color: #009900;">&#91;</span> ep <span style="color: #009900;">&#93;</span>.<span style="color: #202020;">MaxPktSize</span><span style="color: #339933;">;</span>
 <span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> xfrlen <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
  regWr<span style="color: #009900;">&#40;</span> rHCTL<span style="color: #339933;">,</span> devtable<span style="color: #009900;">&#91;</span> addr <span style="color: #009900;">&#93;</span>.<span style="color: #202020;">epinfo</span><span style="color: #009900;">&#91;</span> ep <span style="color: #009900;">&#93;</span>.<span style="color: #202020;">rcvToggle</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//set toggle value</span>
  <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span> <span style="color: #0000dd;">1</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">// use a 'return' to exit this loop</span>
    rcode <span style="color: #339933;">=</span> dispatchPkt<span style="color: #009900;">&#40;</span> tokIN<span style="color: #339933;">,</span> ep<span style="color: #339933;">,</span> nak_limit <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//IN packet to EP-'endpoint'. Function takes care of NAKS.</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> rcode <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #b1b100;">return</span><span style="color: #009900;">&#40;</span> rcode <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//should be 0, indicating ACK. Else return error code.</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #808080; font-style: italic;">/* check for RCVDAVIRQ and generate error if not present */</span>
    <span style="color: #808080; font-style: italic;">/* the only case when absense of RCVDAVIRQ makes sense is when toggle error occured. Need to add handling for that */</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span> regRd<span style="color: #009900;">&#40;</span> rHIRQ <span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span> bmRCVDAVIRQ <span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span> <span style="color: #208080;">0xf0</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//receive error</span>
    <span style="color: #009900;">&#125;</span>
    pktsize <span style="color: #339933;">=</span> regRd<span style="color: #009900;">&#40;</span> rRCVBC <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//number of received bytes</span>
    data <span style="color: #339933;">=</span> bytesRd<span style="color: #009900;">&#40;</span> rRCVFIFO<span style="color: #339933;">,</span> pktsize<span style="color: #339933;">,</span> data <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    regWr<span style="color: #009900;">&#40;</span> rHIRQ<span style="color: #339933;">,</span> bmRCVDAVIRQ <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Clear the IRQ &amp;amp; free the buffer</span>
    xfrlen <span style="color: #339933;">+=</span> pktsize<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// add this packet's byte count to total transfer length</span>
    <span style="color: #808080; font-style: italic;">/* The transfer is complete under two conditions: */</span>
    <span style="color: #808080; font-style: italic;">/* 1. The device sent a short packet (L.T. maxPacketSize) */</span>
    <span style="color: #808080; font-style: italic;">/* 2. 'nbytes' have been transferred. */</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span> pktsize <span style="color: #339933;">=</span> <span style="color: #339933;">*</span>nbytes <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">// have we transferred 'nbytes' bytes?</span>
      <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> regRd<span style="color: #009900;">&#40;</span> rHRSL <span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span> bmRCVTOGRD <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">//save toggle value</span>
        devtable<span style="color: #009900;">&#91;</span> addr <span style="color: #009900;">&#93;</span>.<span style="color: #202020;">epinfo</span><span style="color: #009900;">&#91;</span> ep <span style="color: #009900;">&#93;</span>.<span style="color: #202020;">rcvToggle</span> <span style="color: #339933;">=</span> bmRCVTOG1<span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
      <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
        devtable<span style="color: #009900;">&#91;</span> addr <span style="color: #009900;">&#93;</span>.<span style="color: #202020;">epinfo</span><span style="color: #009900;">&#91;</span> ep <span style="color: #009900;">&#93;</span>.<span style="color: #202020;">rcvToggle</span> <span style="color: #339933;">=</span> bmRCVTOG0<span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
      <span style="color: #339933;">*</span>nbytes <span style="color: #339933;">=</span> xfrlen<span style="color: #339933;">;</span>
      <span style="color: #b1b100;">return</span><span style="color: #009900;">&#40;</span> <span style="color: #0000dd;">0</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #666666; font-style: italic;">//if (( pktsize = *nbytes ))...</span>
  <span style="color: #009900;">&#125;</span><span style="color: #666666; font-style: italic;">//while( 1 )...</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><strong>FTDI FT232 devices</strong><br />
The FT232 range of devices from FTDI is now fairly large and quite a lot of data is available on the <a href="http://www.ftdichip.com/FTDocuments.htm">FTDI Website</a>.<br />
Further information was taken from linux driver sources and other USB Host sources.<br />
I did not get a chance to test devices other than the FT232B and FT232R at this time.</p>
<p><strong>Blocking vs. Unblocking code</strong><br />
The eventual objective is to create a version of the serial library which supports the FTDI Serial port over the USB Host Shield. The existing serial libraries allow for blocking code, especially when waiting for input. It was therefore decided to use interrupts to perform the regular tasks required for the USB protocol layers, so the FTDI libraries could appear identical to the existing serial drivers.</p>
<p>The MAX3421e MAX_GPX pin is set up to send a pulse output at the SOF rate of the USB (1 per ms) and this generates a pin change interrupt on the Arduino. This interrupt routine then performs the required USB tasks without need for the sketch to repeatedly call them. Some protection is also added to ensure that USB transactions generated outside the interrupt routine and any associated temporary data, are protected from the interrupt routines.</p>
<p><strong>Buffer Management</strong><br />
Seperate data buffers are created for the transmit and receive directions.<br />
The transmit buffer is filled by the calls to send a serial byte via the FTDI. If the buffer is filled by the byte the data is sent over the USB immediately, other wise it is sent at the next SOF interrupt.</p>
<p>Calls to read the receive buffer check for any characters locally, and return them if found. If there are no characters in the local buffer, a read is made to the remote FTDI device to check if any data is ready there. This process is to reduce the local buffer requirement. The first two bytes returned over USB are status bytes, not data, and these are also sent at regular intervals without data. I am not sure whether this is the best way to handle the receive buffers.</p>
<p>Code is <a href="http://github.com/ribbotson/USB-Host/tree/master/FTDI/">here on github</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.circuitsathome.com/mcu/towards-an-ft232-driver-for-the-usb-host-shield-part-0/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PTPDevinfo in 16K</title>
		<link>http://www.circuitsathome.com/mcu/programming/ptpdevinfo-in-16k</link>
		<comments>http://www.circuitsathome.com/mcu/programming/ptpdevinfo-in-16k#comments</comments>
		<pubDate>Mon, 28 Jun 2010 23:02:39 +0000</pubDate>
		<dc:creator>oleg</dc:creator>
				<category><![CDATA[Arduino]]></category>
		<category><![CDATA[MCU]]></category>
		<category><![CDATA[USB]]></category>
		<category><![CDATA[USB Shield]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[camera]]></category>
		<category><![CDATA[control]]></category>
		<category><![CDATA[device]]></category>
		<category><![CDATA[digital]]></category>
		<category><![CDATA[getdevinfo]]></category>
		<category><![CDATA[host]]></category>
		<category><![CDATA[info]]></category>
		<category><![CDATA[PTP]]></category>
		<category><![CDATA[shield]]></category>

		<guid isPermaLink="false">http://www.circuitsathome.com/?p=3573</guid>
		<description><![CDATA[<p class="wp-caption-text">Blue Arduino USB Host Shield tied to telephoto lens mount</p>
<p>Developer Si Li shared his version of PTPDevinfo.pde, which fits into older Aduinos. Si wanted to get PTP device information from Canon EOS 500D, but he only has 16K Seeduino at hand. So he stripped devinfoparser off all unnecessary strings leaving only ones essential for [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_3572" class="wp-caption alignright" style="width: 298px"><a href="/wp/wp-content/uploads/blue_aus_telephoto.jpg"><img src="/wp/wp-content/uploads/blue_aus_telephoto-288x216.jpg" alt="Blue Arduino USB Host Shield tied to telephoto lens mount" title="Blue Arduino USB Host Shield tied to telephoto lens mount" width="288" height="216" class="size-thumbnail wp-image-3572" /></a><p class="wp-caption-text">Blue Arduino USB Host Shield tied to telephoto lens mount</p></div>
<p>Developer Si Li shared his version of PTPDevinfo.pde, which fits into older Aduinos. Si wanted to get PTP device information from Canon EOS 500D, but he only has 16K Seeduino at hand. So he stripped devinfoparser off all unnecessary strings leaving only ones essential for parsing Canon EOS camera device info.</p>
<p>The <a href="/chome_downloads/si_devinfoparser.zip">modified devinfoparser files</a> are available from &#8220;Downloads&#8221; section.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.circuitsathome.com/mcu/programming/ptpdevinfo-in-16k/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A reel of ADuM4160 ICs has arrived</title>
		<link>http://www.circuitsathome.com/news/a-reel-of-adum4160-ics-has-arrived</link>
		<comments>http://www.circuitsathome.com/news/a-reel-of-adum4160-ics-has-arrived#comments</comments>
		<pubDate>Fri, 14 May 2010 11:00:57 +0000</pubDate>
		<dc:creator>oleg</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[Production]]></category>
		<category><![CDATA[Store]]></category>
		<category><![CDATA[adum4160]]></category>
		<category><![CDATA[isolator]]></category>
		<category><![CDATA[USB]]></category>

		<guid isPermaLink="false">http://www.circuitsathome.com/?p=3380</guid>
		<description><![CDATA[<p><p class="wp-caption-text">A reel of ADuM4160s</p>
I&#8217;m pleased to announce that the long wait is finally over &#8211; I&#8217;m now in possession of a reel (this is 1000 pcs!) of ADuM4160 &#8211; the core chip of USB Isolator. I will be shipping back orders today and tomorrow &#8211; if you have ordered any of USB Isolator products [...]]]></description>
			<content:encoded><![CDATA[<p><div id="attachment_3393" class="wp-caption alignright" style="width: 298px"><a href="/wp/wp-content/uploads/adum4160_reel.jpg"><img src="/wp/wp-content/uploads/adum4160_reel-288x216.jpg" alt="A reel of ADuM4160s" title="adum4160_reel" width="288" height="216" class="size-thumbnail wp-image-3393" /></a><p class="wp-caption-text">A reel of ADuM4160s</p></div><br />
I&#8217;m pleased to announce that the long wait is finally over &#8211; I&#8217;m now in possession of a reel (this is 1000 pcs!) of ADuM4160 &#8211; the core chip of <a href="/mcu/usb/usb-isolator">USB Isolator</a>. I will be shipping back orders today and tomorrow &#8211; if you have ordered any of USB Isolator products from me in February, March, or April, and will not have gotten shipping notification by Monday, please contact me.</p>
<p>USB Isolators are <a href="/products-page/usb-interfaces">back in stock</a>. By popular demand, I also started selling ADuM4160 in single quantities &#8211; look in <a href="/products-page/components">components section</a> of the store.</p>
<p>On a side note, I received an e-mail from a company in Denmark offering ADuM4160-based USB Isolators in &#8220;complete&#8221; form &#8211; sporting a nice looking case and bus-powered supply for the peripheral side. I bought one yesterday to take a look. I&#8217;m going to write a review and, if I like it, start reselling it.</p>
<p>Oleg.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.circuitsathome.com/news/a-reel-of-adum4160-ics-has-arrived/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Robotic Arm Inverse Kinematics on Arduino</title>
		<link>http://www.circuitsathome.com/mcu/programming/robotic-arm-inverse-kinematics-on-arduino</link>
		<comments>http://www.circuitsathome.com/mcu/programming/robotic-arm-inverse-kinematics-on-arduino#comments</comments>
		<pubDate>Wed, 12 May 2010 12:00:47 +0000</pubDate>
		<dc:creator>oleg</dc:creator>
				<category><![CDATA[Arduino]]></category>
		<category><![CDATA[MCU]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[arm]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[control]]></category>
		<category><![CDATA[inverse]]></category>
		<category><![CDATA[kinematics]]></category>
		<category><![CDATA[robotic]]></category>
		<category><![CDATA[servo]]></category>

		<guid isPermaLink="false">http://www.circuitsathome.com/?p=3289</guid>
		<description><![CDATA[<p><p class="wp-caption-text">Lynxmotion AL5D robotic arm</p>
I&#8217;m proud owner of Lynxmotion AL5D robotic arm. The parts kit is of very high quality, and as a result, the arm is very strong and versatile. I wanted my arm to be portable and independent of big computers and all currently available controllers lack flexibility that I needed, therefore I [...]]]></description>
			<content:encoded><![CDATA[<p><div id="attachment_3288" class="wp-caption alignright" style="width: 298px"><a href="/wp/wp-content/uploads/IK_title.jpg"><img src="/wp/wp-content/uploads/IK_title-288x216.jpg" alt="Lynxmotion AL5D robotic arm" title="Lynxmotion AL5D robotic arm" width="288" height="216" class="size-thumbnail wp-image-3288" /></a><p class="wp-caption-text">Lynxmotion AL5D robotic arm</p></div><br />
I&#8217;m proud owner of <a href="http://www.lynxmotion.com/Category.aspx?CategoryID=27">Lynxmotion AL5D robotic arm</a>. The parts kit is of very high quality, and as a result, the arm is very strong and versatile. I wanted my arm to be portable and independent of big computers and all currently available controllers lack flexibility that I needed, therefore I started building my own controller around Arduino platform. This article shows first preliminary result of this work &#8211; inverse kinematics code which would be used to position the arm.</p>
<p>In robotics, <a href="http://en.wikipedia.org/wiki/Inverse_kinematics">inverse kinematics</a> is a method to position a tip of some linked stricture in 3D space by calculating joint angles from tip X, Y, and Z coordinates. Much information about the subject exists on the web, for example,  this <a href="http://www.learnaboutrobots.com/inverseKinematics.htm">introductory article</a> explains the subject using simple trigonometry. </p>
<p>To move the arm, six servos need to be controlled ( five for the arm without wrist rotate ). Given that large amount of processing time would be spent calculating servo angles, I decided not to drive servos directly from Arduino pins and made simple servo shield using <a href="http://www.renbotics.com/products/servoshield.php">Renbotics</a> schematic and library code. I built only half of the circuit using single 4017 counter &#8211; this gives me seven servo control channels, which is plenty.</p>
<p>In addition to the article linked above, I&#8217;d like to mention two other resources, which helped me tremendously during code development. First is <a href="http://www.micromegacorp.com/appnotes.html">Micromega Application Note 44</a>, which shows inverse kinematics equations for similar arm. They also have nice video of working arm. It should be noted that gripper of AL5D arm has much simpler geometry, therefore second order polynomial calculations are not necessary. The second one is this <a href="http://www.lynxmotion.com/images/html/proj057.htm">Lynxmotion project page</a> with Excel spreadsheet. Many formulas from the spreadsheet were used in my code; I also used the spreadsheet during debugging after modifying arm dimensions.</p>
<p>Below is first working draft of inverse kinematics code. It can be used as-is or transformed into a library. As presented, it shall be used with caution &#8211; no boundary check is performed so it is quite easy to inadvertently send the arm flying into your forehead or the control board. The code uses single-precision floating point math, which seems to be adequate for the task. </p>
<p><span id="more-3289"></span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;ServoShield.h&gt;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/* Servo control for AL5D arm */</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/* Arm dimensions( mm ) */</span>
<span style="color: #339933;">#define BASE_HGT 67.31      //base hight 2.65&quot;</span>
<span style="color: #339933;">#define HUMERUS 146.05      //shoulder-to-elbow &quot;bone&quot; 5.75&quot;</span>
<span style="color: #339933;">#define ULNA 187.325        //elbow-to-wrist &quot;bone&quot; 7.375&quot;   </span>
<span style="color: #339933;">#define GRIPPER 100.00          //gripper (incl.heavy duty wrist rotate mechanism) length 3.94&quot;</span>
&nbsp;
<span style="color: #339933;">#define ftl(x) ((x)&gt;=0?(long)((x)+0.5):(long)((x)-0.5))  //float to long conversion</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/* Servo names/numbers */</span>
<span style="color: #808080; font-style: italic;">/* Base servo HS-485HB */</span>
<span style="color: #339933;">#define BAS_SERVO 0</span>
<span style="color: #808080; font-style: italic;">/* Shoulder Servo HS-5745-MG */</span>
<span style="color: #339933;">#define SHL_SERVO 1</span>
<span style="color: #808080; font-style: italic;">/* Elbow Servo HS-5745-MG */</span>
<span style="color: #339933;">#define ELB_SERVO 2</span>
<span style="color: #808080; font-style: italic;">/* Wrist servo HS-645MG */</span>
<span style="color: #339933;">#define WRI_SERVO 3</span>
<span style="color: #808080; font-style: italic;">/* Wrist rotate servo HS-485HB */</span>
<span style="color: #339933;">#define WRO_SERVO 4</span>
<span style="color: #808080; font-style: italic;">/* Gripper servo HS-422 */</span>
<span style="color: #339933;">#define GRI_SERVO 5</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/* pre-calculations */</span>
<span style="color: #993333;">float</span> hum_sq <span style="color: #339933;">=</span> HUMERUS<span style="color: #339933;">*</span>HUMERUS<span style="color: #339933;">;</span>
<span style="color: #993333;">float</span> uln_sq <span style="color: #339933;">=</span> ULNA<span style="color: #339933;">*</span>ULNA<span style="color: #339933;">;</span>
&nbsp;
ServoShield servos<span style="color: #339933;">;</span>                       <span style="color: #666666; font-style: italic;">//ServoShield object</span>
&nbsp;
<span style="color: #993333;">void</span> setup<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  servos.<span style="color: #202020;">setbounds</span><span style="color: #009900;">&#40;</span> BAS_SERVO<span style="color: #339933;">,</span> <span style="color: #0000dd;">900</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">2100</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  servos.<span style="color: #202020;">setbounds</span><span style="color: #009900;">&#40;</span> SHL_SERVO<span style="color: #339933;">,</span> <span style="color: #0000dd;">1000</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">2100</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  servos.<span style="color: #202020;">setbounds</span><span style="color: #009900;">&#40;</span> ELB_SERVO<span style="color: #339933;">,</span> <span style="color: #0000dd;">900</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">2100</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  servos.<span style="color: #202020;">setbounds</span><span style="color: #009900;">&#40;</span> WRI_SERVO<span style="color: #339933;">,</span> <span style="color: #0000dd;">600</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">2400</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  servos.<span style="color: #202020;">setbounds</span><span style="color: #009900;">&#40;</span> WRO_SERVO<span style="color: #339933;">,</span> <span style="color: #0000dd;">600</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">2400</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  servos.<span style="color: #202020;">setbounds</span><span style="color: #009900;">&#40;</span> GRI_SERVO<span style="color: #339933;">,</span> <span style="color: #0000dd;">600</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">2400</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #808080; font-style: italic;">/**/</span>
  servos.<span style="color: #202020;">start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>                         <span style="color: #666666; font-style: italic;">//Start the servo shield</span>
  servo_park<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  Serial.<span style="color: #202020;">begin</span><span style="color: #009900;">&#40;</span> <span style="color: #0000dd;">115200</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  Serial.<span style="color: #202020;">println</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Start&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  delay<span style="color: #009900;">&#40;</span> <span style="color: #0000dd;">500</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> loop<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">//zero_x();</span>
  <span style="color: #666666; font-style: italic;">//line();</span>
  circle<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/* arm positioning routine utilizing inverse kinematics */</span>
<span style="color: #808080; font-style: italic;">/* z is height, y is distance from base center out, x is side to side. y,z can only be positive */</span>
<span style="color: #666666; font-style: italic;">//void set_arm( uint16_t x, uint16_t y, uint16_t z, uint16_t grip_angle )</span>
<span style="color: #993333;">void</span> set_arm<span style="color: #009900;">&#40;</span> <span style="color: #993333;">float</span> x<span style="color: #339933;">,</span> <span style="color: #993333;">float</span> y<span style="color: #339933;">,</span> <span style="color: #993333;">float</span> z<span style="color: #339933;">,</span> <span style="color: #993333;">float</span> grip_angle_d <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #993333;">float</span> grip_angle_r <span style="color: #339933;">=</span> radians<span style="color: #009900;">&#40;</span> grip_angle_d <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>    <span style="color: #666666; font-style: italic;">//grip angle in radians for use in calculations</span>
  <span style="color: #808080; font-style: italic;">/* Base angle and radial distance from x,y coordinates */</span>
  <span style="color: #993333;">float</span> bas_angle_r <span style="color: #339933;">=</span> atan2<span style="color: #009900;">&#40;</span> x<span style="color: #339933;">,</span> y <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #993333;">float</span> rdist <span style="color: #339933;">=</span> sqrt<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span> x <span style="color: #339933;">*</span> x <span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span> y <span style="color: #339933;">*</span> y <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #808080; font-style: italic;">/* rdist is y coordinate for the arm */</span>
  y <span style="color: #339933;">=</span> rdist<span style="color: #339933;">;</span>
  <span style="color: #808080; font-style: italic;">/* Grip offsets calculated based on grip angle */</span>
  <span style="color: #993333;">float</span> grip_off_z <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span> sin<span style="color: #009900;">&#40;</span> grip_angle_r <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> GRIPPER<span style="color: #339933;">;</span>
  <span style="color: #993333;">float</span> grip_off_y <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span> cos<span style="color: #009900;">&#40;</span> grip_angle_r <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> GRIPPER<span style="color: #339933;">;</span> 
  <span style="color: #808080; font-style: italic;">/* Wrist position */</span>
  <span style="color: #993333;">float</span> wrist_z <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span> z <span style="color: #339933;">-</span> grip_off_z <span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> BASE_HGT<span style="color: #339933;">;</span>
  <span style="color: #993333;">float</span> wrist_y <span style="color: #339933;">=</span> y <span style="color: #339933;">-</span> grip_off_y<span style="color: #339933;">;</span>
  <span style="color: #808080; font-style: italic;">/* Shoulder to wrist distance ( AKA sw ) */</span>
  <span style="color: #993333;">float</span> s_w <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span> wrist_z <span style="color: #339933;">*</span> wrist_z <span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span> wrist_y <span style="color: #339933;">*</span> wrist_y <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #993333;">float</span> s_w_sqrt <span style="color: #339933;">=</span> sqrt<span style="color: #009900;">&#40;</span> s_w <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #808080; font-style: italic;">/* s_w angle to ground */</span>
  <span style="color: #666666; font-style: italic;">//float a1 = atan2( wrist_y, wrist_z ); </span>
  <span style="color: #993333;">float</span> a1 <span style="color: #339933;">=</span> atan2<span style="color: #009900;">&#40;</span> wrist_z<span style="color: #339933;">,</span> wrist_y <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #808080; font-style: italic;">/* s_w angle to humerus */</span>
  <span style="color: #993333;">float</span> a2 <span style="color: #339933;">=</span> acos<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span> hum_sq <span style="color: #339933;">-</span> uln_sq <span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> s_w <span style="color: #009900;">&#41;</span> <span style="color: #339933;">/</span> <span style="color: #009900;">&#40;</span> <span style="color: #0000dd;">2</span> <span style="color: #339933;">*</span> HUMERUS <span style="color: #339933;">*</span> s_w_sqrt <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #808080; font-style: italic;">/* shoulder angle */</span>
  <span style="color: #993333;">float</span> shl_angle_r <span style="color: #339933;">=</span> a1 <span style="color: #339933;">+</span> a2<span style="color: #339933;">;</span>
  <span style="color: #993333;">float</span> shl_angle_d <span style="color: #339933;">=</span> degrees<span style="color: #009900;">&#40;</span> shl_angle_r <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
  <span style="color: #808080; font-style: italic;">/* elbow angle */</span>
  <span style="color: #993333;">float</span> elb_angle_r <span style="color: #339933;">=</span> acos<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span> hum_sq <span style="color: #339933;">+</span> uln_sq <span style="color: #339933;">-</span> s_w <span style="color: #009900;">&#41;</span> <span style="color: #339933;">/</span> <span style="color: #009900;">&#40;</span> <span style="color: #0000dd;">2</span> <span style="color: #339933;">*</span> HUMERUS <span style="color: #339933;">*</span> ULNA <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #993333;">float</span> elb_angle_d <span style="color: #339933;">=</span> degrees<span style="color: #009900;">&#40;</span> elb_angle_r <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #993333;">float</span> elb_angle_dn <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #009900;">&#40;</span> <span style="color:#800080;">180.0</span> <span style="color: #339933;">-</span> elb_angle_d <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #808080; font-style: italic;">/* wrist angle */</span>
  <span style="color: #993333;">float</span> wri_angle_d <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span> grip_angle_d <span style="color: #339933;">-</span> elb_angle_dn <span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> shl_angle_d<span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #808080; font-style: italic;">/* Servo pulses */</span>
  <span style="color: #993333;">float</span> bas_servopulse <span style="color: #339933;">=</span> <span style="color:#800080;">1500.0</span> <span style="color: #339933;">-</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span> degrees<span style="color: #009900;">&#40;</span> bas_angle_r <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color:#800080;">11.11</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #993333;">float</span> shl_servopulse <span style="color: #339933;">=</span> <span style="color:#800080;">1500.0</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span> shl_angle_d <span style="color: #339933;">-</span> <span style="color:#800080;">90.0</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color:#800080;">6.6</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #993333;">float</span> elb_servopulse <span style="color: #339933;">=</span> <span style="color:#800080;">1500.0</span> <span style="color: #339933;">-</span>  <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span> elb_angle_d <span style="color: #339933;">-</span> <span style="color:#800080;">90.0</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color:#800080;">6.6</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #993333;">float</span> wri_servopulse <span style="color: #339933;">=</span> <span style="color: #0000dd;">1500</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span> wri_angle_d  <span style="color: #339933;">*</span> <span style="color:#800080;">11.1</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #808080; font-style: italic;">/* Set servos */</span>
  servos.<span style="color: #202020;">setposition</span><span style="color: #009900;">&#40;</span> BAS_SERVO<span style="color: #339933;">,</span> ftl<span style="color: #009900;">&#40;</span> bas_servopulse <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  servos.<span style="color: #202020;">setposition</span><span style="color: #009900;">&#40;</span> WRI_SERVO<span style="color: #339933;">,</span> ftl<span style="color: #009900;">&#40;</span> wri_servopulse <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  servos.<span style="color: #202020;">setposition</span><span style="color: #009900;">&#40;</span> SHL_SERVO<span style="color: #339933;">,</span> ftl<span style="color: #009900;">&#40;</span> shl_servopulse <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  servos.<span style="color: #202020;">setposition</span><span style="color: #009900;">&#40;</span> ELB_SERVO<span style="color: #339933;">,</span> ftl<span style="color: #009900;">&#40;</span> elb_servopulse <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/* move servos to parking position */</span>
<span style="color: #993333;">void</span> servo_park<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  servos.<span style="color: #202020;">setposition</span><span style="color: #009900;">&#40;</span> BAS_SERVO<span style="color: #339933;">,</span> <span style="color: #0000dd;">1715</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  servos.<span style="color: #202020;">setposition</span><span style="color: #009900;">&#40;</span> SHL_SERVO<span style="color: #339933;">,</span> <span style="color: #0000dd;">2100</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  servos.<span style="color: #202020;">setposition</span><span style="color: #009900;">&#40;</span> ELB_SERVO<span style="color: #339933;">,</span> <span style="color: #0000dd;">2100</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  servos.<span style="color: #202020;">setposition</span><span style="color: #009900;">&#40;</span> WRI_SERVO<span style="color: #339933;">,</span> <span style="color: #0000dd;">1800</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  servos.<span style="color: #202020;">setposition</span><span style="color: #009900;">&#40;</span> WRO_SERVO<span style="color: #339933;">,</span> <span style="color: #0000dd;">600</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  servos.<span style="color: #202020;">setposition</span><span style="color: #009900;">&#40;</span> GRI_SERVO<span style="color: #339933;">,</span> <span style="color: #0000dd;">900</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> zero_x<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span> <span style="color: #993333;">double</span> yaxis <span style="color: #339933;">=</span> <span style="color:#800080;">150.0</span><span style="color: #339933;">;</span> yaxis <span style="color: #339933;">&lt;</span> <span style="color:#800080;">356.0</span><span style="color: #339933;">;</span> yaxis <span style="color: #339933;">+=</span> <span style="color: #0000dd;">1</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    set_arm<span style="color: #009900;">&#40;</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> yaxis<span style="color: #339933;">,</span> <span style="color:#800080;">127.0</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    delay<span style="color: #009900;">&#40;</span> <span style="color: #0000dd;">10</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span> <span style="color: #993333;">double</span> yaxis <span style="color: #339933;">=</span> <span style="color:#800080;">356.0</span><span style="color: #339933;">;</span> yaxis <span style="color: #339933;">&gt;</span> <span style="color:#800080;">150.0</span><span style="color: #339933;">;</span> yaxis <span style="color: #339933;">-=</span> <span style="color: #0000dd;">1</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    set_arm<span style="color: #009900;">&#40;</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> yaxis<span style="color: #339933;">,</span> <span style="color:#800080;">127.0</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    delay<span style="color: #009900;">&#40;</span> <span style="color: #0000dd;">10</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/* moves arm in a straight line */</span>
<span style="color: #993333;">void</span> line<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span> <span style="color: #993333;">double</span> xaxis <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color:#800080;">100.0</span><span style="color: #339933;">;</span> xaxis <span style="color: #339933;">&lt;</span> <span style="color:#800080;">100.0</span><span style="color: #339933;">;</span> xaxis <span style="color: #339933;">+=</span> <span style="color:#800080;">0.5</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      set_arm<span style="color: #009900;">&#40;</span> xaxis<span style="color: #339933;">,</span> <span style="color: #0000dd;">250</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">100</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      delay<span style="color: #009900;">&#40;</span> <span style="color: #0000dd;">10</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span> <span style="color: #993333;">float</span> xaxis <span style="color: #339933;">=</span> <span style="color:#800080;">100.0</span><span style="color: #339933;">;</span> xaxis <span style="color: #339933;">&gt;</span> <span style="color: #339933;">-</span><span style="color:#800080;">100.0</span><span style="color: #339933;">;</span> xaxis <span style="color: #339933;">-=</span> <span style="color:#800080;">0.5</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      set_arm<span style="color: #009900;">&#40;</span> xaxis<span style="color: #339933;">,</span> <span style="color: #0000dd;">250</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">100</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      delay<span style="color: #009900;">&#40;</span> <span style="color: #0000dd;">10</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> circle<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #339933;">#define RADIUS 80.0</span>
  <span style="color: #666666; font-style: italic;">//float angle = 0;</span>
  <span style="color: #993333;">float</span> zaxis<span style="color: #339933;">,</span>yaxis<span style="color: #339933;">;</span>  
  <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span> <span style="color: #993333;">float</span> angle <span style="color: #339933;">=</span> <span style="color:#800080;">0.0</span><span style="color: #339933;">;</span> angle <span style="color: #339933;">&lt;</span> <span style="color:#800080;">360.0</span><span style="color: #339933;">;</span> angle <span style="color: #339933;">+=</span> <span style="color:#800080;">1.0</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      yaxis <span style="color: #339933;">=</span> RADIUS <span style="color: #339933;">*</span> sin<span style="color: #009900;">&#40;</span> radians<span style="color: #009900;">&#40;</span> angle <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #0000dd;">200</span><span style="color: #339933;">;</span>
      zaxis <span style="color: #339933;">=</span> RADIUS <span style="color: #339933;">*</span> cos<span style="color: #009900;">&#40;</span> radians<span style="color: #009900;">&#40;</span> angle <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #0000dd;">200</span><span style="color: #339933;">;</span>
      set_arm<span style="color: #009900;">&#40;</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> yaxis<span style="color: #339933;">,</span> zaxis<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      delay<span style="color: #009900;">&#40;</span> <span style="color: #0000dd;">1</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Here is a short description of the code. The coordinate space follows one in Micromega AN44. <strong>set_arm()</strong> takes 3 coordinates and grip angle and sets servo angles for base, elbow, shoulder and wrist. Arm dimensions are defined in millimeters at the beginning of the sketch. Three short functions are written to demonstrate the functionality. <strong>zero_x()</strong> moves the arm in a straight line along the y-axis, <strong>line()</strong> moves the arm side to side and <strong>circle()</strong> moves the arm in a circle in y-z plane. In all 3 functions, wrist angle is set to 0 degrees, it can be changed to some other value to make motion more interesting.</p>
<p>Resources mentioned before the code listing are very helpful in understanding the calculations and problem solving approach. If they are not enough, please don&#8217;t hesitate to ask questions. I will be posting my progress as more code is developed. Stay tuned.</p>
<p>Oleg.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.circuitsathome.com/mcu/programming/robotic-arm-inverse-kinematics-on-arduino/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Magnetic Probe Amplifier. Final board design.</title>
		<link>http://www.circuitsathome.com/measurements/magnetic-probe-amplifier-final-board-design</link>
		<comments>http://www.circuitsathome.com/measurements/magnetic-probe-amplifier-final-board-design#comments</comments>
		<pubDate>Mon, 10 May 2010 21:50:46 +0000</pubDate>
		<dc:creator>oleg</dc:creator>
				<category><![CDATA[DC-DC]]></category>
		<category><![CDATA[Measurements]]></category>
		<category><![CDATA[amplifier]]></category>
		<category><![CDATA[mag]]></category>
		<category><![CDATA[magnetic]]></category>
		<category><![CDATA[probe]]></category>
		<category><![CDATA[trigger]]></category>

		<guid isPermaLink="false">http://www.circuitsathome.com/?p=3313</guid>
		<description><![CDATA[<p class="wp-caption-text">Magnetic probe amplifier connected to external trigger input</p>
<p>I made (hopefully) last iteration of magnetic probe amplifier board. Schematic remains the same. Layout, however, is slightly different. First, I made it more narrow to better fit Tektronix 7000-series time base plugins external trigger input, as can be seen on the title picture. Second, the amplified [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_3311" class="wp-caption alignright" style="width: 298px"><a href="/wp/wp-content/uploads/tpa2_title.jpg"><img src="/wp/wp-content/uploads/tpa2_title-288x216.jpg" alt="Magnetic probe amplifier connected to external trigger input" title="Magnetic probe amplifier connected to external trigger input" width="288" height="216" class="size-thumbnail wp-image-3311" /></a><p class="wp-caption-text">Magnetic probe amplifier connected to external trigger input</p></div>
<p>I made (hopefully) last iteration of <a href="/measurements/trigger-probe-amplifier">magnetic probe amplifier</a> board. Schematic remains the same. Layout, however, is slightly different. First, I made it more narrow to better fit Tektronix 7000-series time base plugins external trigger input, as can be seen on the title picture. Second, the amplified probe output is made via SMx type connector &#8211; PCB-mounted SMA and SMB all have the same footprint. I used straight SMB since I have a surplus of Tektronix P6041 cables. The board layout permits soldering right-angle connector here as well. This arrangement is much handier than previous one.</p>
<p>Since publishing initial design I haven&#8217;t seen much interest in it, so instead of ordering a bunch of PCBs I made this board <a href="http://www.batchpcb.com/index.php/Products/27182">available on BatcPCB Marketplace</a>. <a href="/chome_downloads/Mag_probe_amp_r1_0rc.zip">Schematic and board layout</a> in Eagle 5.x format are also available. I built one board and haven&#8217;t found any errors on copper or silkscreen &#8211; if you find any, please let me know.</p>
<p>Oleg.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.circuitsathome.com/measurements/magnetic-probe-amplifier-final-board-design/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Digital camera control from Arduino-hosted webpage</title>
		<link>http://www.circuitsathome.com/mcu/programming/digital-camera-control-from-arduino-hosted-webpage</link>
		<comments>http://www.circuitsathome.com/mcu/programming/digital-camera-control-from-arduino-hosted-webpage#comments</comments>
		<pubDate>Wed, 05 May 2010 23:23:20 +0000</pubDate>
		<dc:creator>oleg</dc:creator>
				<category><![CDATA[Arduino]]></category>
		<category><![CDATA[MCU]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[wireless]]></category>
		<category><![CDATA[control]]></category>
		<category><![CDATA[digital camera]]></category>
		<category><![CDATA[wifi]]></category>
		<category><![CDATA[wishield]]></category>

		<guid isPermaLink="false">http://www.circuitsathome.com/?p=3296</guid>
		<description><![CDATA[<p></p>
<p>I found this little video while looking for ideas for my digital camera controller. There is also project description and  summary page. Device consists of Arduino board mated with Asynclabs WiShield controlling shutter release of SLR camera via cable release port.  Arduino runs TCP/IP stack and Web server while access to pre-focus, time [...]]]></description>
			<content:encoded><![CDATA[<p><object width="660" height="405"><param name="movie" value="http://www.youtube.com/v/GbUsvdtd64o&#038;hl=en_US&#038;fs=1&#038;rel=0&#038;border=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/GbUsvdtd64o&#038;hl=en_US&#038;fs=1&#038;rel=0&#038;border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="660" height="405"></embed></object></p>
<p>I found this little video while looking for ideas for my digital camera controller. There is also <a href="http://svbreakaway.info/tp.php#cc">project description</a> and <a href="http://svbreakaway.info/tp-cc.php"> summary page</a>. Device consists of Arduino board mated with <a href="http://asynclabs.com/wiki/index.php?title=WiShield_2.0">Asynclabs WiShield</a> controlling shutter release of SLR camera via cable release port.  Arduino runs TCP/IP stack and Web server while access to pre-focus, time interval and other settings is done via web browser on an iPod. In addition, it is possible to release shutter using signal from proximity sensor or even set conditions based on states of different Arduino pins.</p>
<p>The web interface is well designed &#8211; watch this little movie and see it for yourself. There is also a <a href="http://svbreakaway.info/tp/cc/r.html">demo page</a>, where you can play with controller functions.  The &#8220;Adm&#8221; page is my favourite. I&#8217;m looking forward to see the code, which author is going to publish soon.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.circuitsathome.com/mcu/programming/digital-camera-control-from-arduino-hosted-webpage/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss><!-- Dynamic page generated in 0.433 seconds. --><!-- Cached page generated by WP-Super-Cache on 2010-08-24 06:47:25 -->
