<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	>

<channel>
	<title>infoalive labs &#187; RS-232</title>
	<atom:link href="http://labs.infoalive.com/tag/rs-232/feed" rel="self" type="application/rss+xml" />
	<link>http://labs.infoalive.com</link>
	<description>プロダクトの紹介とTipsのまとめサイト</description>
	<lastBuildDate>Fri, 04 Nov 2011 10:15:41 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<item>
		<title>ネットワークラジコンをコントロール</title>
		<link>http://labs.infoalive.com/tips/109</link>
		<comments>http://labs.infoalive.com/tips/109#comments</comments>
		<pubDate>Tue, 15 Sep 2009 04:14:57 +0000</pubDate>
		<dc:creator>o2</dc:creator>
				<category><![CDATA[tips]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[avetanabt]]></category>
		<category><![CDATA[bluecove]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[processing]]></category>
		<category><![CDATA[RS-232]]></category>
		<category><![CDATA[serproxy]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[wii]]></category>
		<category><![CDATA[WiiRemoteJ]]></category>
		<category><![CDATA[wrj4P5]]></category>
		<category><![CDATA[ラジアン]]></category>
		<category><![CDATA[ラジコン]]></category>
		<category><![CDATA[組み込み系]]></category>
		<category><![CDATA[車]]></category>

		<guid isPermaLink="false">http://labs.infoalive.com/?p=109</guid>
		<description><![CDATA[昨晩Macからネットワークを経由し、ラジコン(組み込みLinuxに繋がったArduino)を操作できました。 ネットワークからArduinoを操作するのに、「Serial Proxy」を使いました。 「Serial Pr [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Flabs.infoalive.com%2Ftips%2F109"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Flabs.infoalive.com%2Ftips%2F109&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>昨晩Macからネットワークを経由し、ラジコン(組み込みLinuxに繋がったArduino)を操作できました。</p>
<p>ネットワークからArduinoを操作するのに、「Serial Proxy」を使いました。</p>
<p>「Serial Proxy」を使うことで、ストリームからシリアルの制御が可能となります。</p>
<p>Linuxへのインストールは簡単</p>
<ol>
<li>Arduino公式サイトのダウンロードページの一番下にある「Serial Proxy」のソース版をダウンロード<a href="http://www.arduino.cc/en/Main/Software" target="_blank">http://www.arduino.cc/en/Main/Software</a></li>
<li>make</li>
<li>serproxy.cfgを設定。comm_baud=9600、serial_device1=/dev/ttyUSB0に設定</li>
<li>./serproxy を実行</li>
</ol>
<p>あとはProcessingのコードをストリーム用に修正。</p>
<p>以下は実際に利用したWiiハンドルからネットワーク越しにラジコンを操作するコードです。</p>
<p># ハンドル周りに角度変更後の値から±5～10度の遊びを加えると操作しやすくなります（たぶん</p>
<p><code><br />
import lll.wrj4P5.*;<br />
import lll.Loc.*;<br />
import processing.net.*;</code></p>
<p>float i = 0.0;<br />
float angle = 0.0;<br />
int kakudo = 0;<br />
int old_kakudo = 0;</p>
<p>Wrj4P5 wii;<br />
LinkedList p = new LinkedList();<br />
Client client;</p>
<p>void setup() {</p>
<p style="padding-left: 30px;">size(300,300,P3D);</p>
<p style="padding-left: 30px;">wii=new Wrj4P5(this).connect();</p>
<p style="padding-left: 30px;">client = new Client(this, &#8220;10.0.2.2&#8243;, 5331);</p>
<p style="padding-left: 30px;">smooth();</p>
<p style="padding-left: 30px;">rectMode(CENTER);</p>
<p>}</p>
<p>void draw() {</p>
<p style="padding-left: 30px;">if (wii.isConnecting()) return;</p>
<p style="padding-left: 30px;">stroke(32);</p>
<p style="padding-left: 30px;">fill(255);</p>
<p style="padding-left: 30px;">ellipse(width/2, height/2, width/1.6, width/1.6);</p>
<p style="padding-left: 30px;">translate(width/2,height/2);</p>
<p style="padding-left: 30px;">rotate( atan2(wii.rimokon.sensed.y , wii.rimokon.sensed.x ) );</p>
<p style="padding-left: 30px;">fill(0);</p>
<p style="padding-left: 30px;">rect(0,0,width/2,height/7);</p>
<p style="padding-left: 30px;">angle = atan2(wii.rimokon.sensed.y , wii.rimokon.sensed.x ) * 180 / PI;</p>
<p style="padding-left: 30px;">if (angle &gt; 0) {</p>
<p style="padding-left: 60px;">kakudo = int(angle) -90;</p>
<p style="padding-left: 60px;">kakudo = 180 &#8211; kakudo;</p>
<p style="padding-left: 30px;">}</p>
<p style="padding-left: 30px;">if (angle &lt; 0) {</p>
<p style="padding-left: 60px;">kakudo = int(angle) * -1 -90;</p>
<p style="padding-left: 30px;">}</p>
<p style="padding-left: 30px;">kakudo = int(kakudo * 0.1) * 10;</p>
<p style="padding-left: 30px;">if (kakudo &gt;= 65 &amp;&amp; kakudo &lt;= 115) kakudo = 90;</p>
<p style="padding-left: 30px;">if (kakudo &gt;= 115 &amp;&amp; kakudo &lt;= 135) kakudo = 115;</p>
<p style="padding-left: 30px;">if (kakudo &gt;= 135) kakudo = 135;</p>
<p style="padding-left: 30px;">if (kakudo &gt;= 45 &amp;&amp; kakudo &lt;= 65) kakudo = 65;</p>
<p style="padding-left: 30px;">if (kakudo &lt;= 45) kakudo = 45;</p>
<p style="padding-left: 30px;">if (old_kakudo != kakudo){</p>
<p style="padding-left: 60px;">old_kakudo = kakudo;</p>
<p style="padding-left: 60px;">client.write(str(kakudo) + &#8220;s\n&#8221;);</p>
<p style="padding-left: 60px;">println(client.read());</p>
<p style="padding-left: 30px;">}</p>
<p>}</p>
<p>void buttonPressed(RimokonEvent evt,int rid){</p>
<p style="padding-left: 30px;">if (evt.wasPressed(evt.TWO)) {</p>
<p style="padding-left: 60px;">client.write(&#8220;255w\n&#8221;);</p>
<p style="padding-left: 30px;">}</p>
<p style="padding-left: 30px;">if (evt.wasPressed(evt.ONE)) {</p>
<p style="padding-left: 60px;">client.write(&#8220;150w\n&#8221;);</p>
<p style="padding-left: 30px;">}</p>
<p>}<br />
void buttonReleased(RimokonEvent evt,int rid){</p>
<p style="padding-left: 30px;">if (evt.wasReleased(evt.TWO)) {</p>
<p style="padding-left: 60px;">client.write(&#8220;0w\n&#8221;);</p>
<p style="padding-left: 30px;">}</p>
<p style="padding-left: 30px;">if (evt.wasReleased(evt.ONE)) {</p>
<p style="padding-left: 60px;">client.write(&#8220;0w\n&#8221;);</p>
<p style="padding-left: 30px;">}</p>
<p>}</p>
<p>以上です。</p>
<p>「Serial Proxy」を使うとFlashなどからもArduinoの操作が可能となります。何が出来るか想像するだけでご飯が３杯は食べれます。もっと？</p>
<p>Arduinoを始めてからここまで２週間かかりました。Amazonの商品発送が9/1なので間違いないです。</p>
<p>平日は仕事しながら家で開発してましたので結構疲れました。</p>
<p>次回はラジコンを操作している動画のアップを予定してます。 # Serial Proxyとの通信に不具合があるので調整中です。</p>
<p>おまけ：Processing 1.0.7 を利用することでMacの64bitでもwiiリモコンを操作できました。</p>
<g:plusone href="http://labs.infoalive.com/tips/109"></g:plusone>]]></content:encoded>
			<wfw:commentRss>http://labs.infoalive.com/tips/109/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>サーボのコントロール</title>
		<link>http://labs.infoalive.com/tips/80</link>
		<comments>http://labs.infoalive.com/tips/80#comments</comments>
		<pubDate>Thu, 10 Sep 2009 02:11:28 +0000</pubDate>
		<dc:creator>o2</dc:creator>
				<category><![CDATA[tips]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[RS-232]]></category>
		<category><![CDATA[ラジコン]]></category>
		<category><![CDATA[組み込み系]]></category>
		<category><![CDATA[車]]></category>

		<guid isPermaLink="false">http://labs.infoalive.com/?p=80</guid>
		<description><![CDATA[昨夜は遅くまでラジコンに実装予定の組み込みLinuxを触ってました。 組み込みLinuxのファーストステップとして、シリアル接続が前提となるのですが、RS-232シリアルケーブルがそのまま繋がると思っていましたら、組み込 [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Flabs.infoalive.com%2Ftips%2F80"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Flabs.infoalive.com%2Ftips%2F80&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>昨夜は遅くまでラジコンに実装予定の組み込みLinuxを触ってました。</p>
<p>組み込みLinuxのファーストステップとして、シリアル接続が前提となるのですが、RS-232シリアルケーブルがそのまま繋がると思っていましたら、組み込みのRS-232 は10pin だったのです！</p>
<p>9pinのRS-232 ケーブルは用意してたのですが、これには困りました。</p>
<p>実際使われるpinはTX/RX、GNDと3本のケーブルのみでしたので、ピンを直刺しすることで対応できました。</p>
<p>また、この話は後日まとめてから書きます。</p>
<p>今日はサーボの制御について書きます。</p>
<p>サーボの制御はArduinoというイタリア生まれのマイコンで行っています。</p>
<p>普通の基盤だと決まったことしか出来ませんが、Arduinoは普通の基盤と違い配線の仕方と、プログラム制御で様々なことが出来ます。</p>
<p>サーボのコントロール方法は、パルス幅の信号長で角度を制御します。</p>
<p>実際はサーボ向けにライブラリがあり、角度を指定するだけで制御が行えます。</p>
<p>気をつける点としては、ラジコンのシャーシの稼動域よりもサーボの稼動域が広いことです。</p>
<p>サーボの稼動域がシャーシの稼動域を超えるとサーボが負荷で嫌な音を立てて潰れます。</p>
<p>実際に潰しましたので間違いないです！</p>
<p>なので先にサーボを取り外し、ラジコンに付属のプロポと同じ稼動域であるか、確認をオススメします。</p>
<p>以下はサーボと前後のモーターをシリアル通信で制御するコードです。</p>
<p>Arduinoでは短いコードで簡潔に書けます。</p>
<p>よろしければ参考ください。<br />
<code><br />
#include<br />
#define servoPin 9<br />
#define Motor 3<br />
Servo myservo;</code></p>
<p>void setup()<br />
{</p>
<p style="padding-left: 30px;">pinMode(Motor,OUTPUT);</p>
<p style="padding-left: 30px;">myservo.attach(servoPin);</p>
<p style="padding-left: 30px;">Serial.begin(9600);</p>
<p style="padding-left: 30px;">Serial.println(&#8220;Ready&#8221;);</p>
<p>}</p>
<p>void loop() {</p>
<p style="padding-left: 30px;">static int v = 0;</p>
<p style="padding-left: 30px;">if ( Serial.available() &gt; 0) {</p>
<p style="padding-left: 60px;">char ch = Serial.read();</p>
<p style="padding-left: 60px;">switch(ch) {</p>
<p style="padding-left: 90px;">case &#8217;0&#8242;&#8230;&#8217;9&#8242;:</p>
<p style="padding-left: 120px;">v = v * 10 + ch &#8211; &#8217;0&#8242;;</p>
<p style="padding-left: 120px;">break;</p>
<p style="padding-left: 90px;">case &#8216;s&#8217;:</p>
<p style="padding-left: 120px;">if (v &lt;= 45) v = 45;</p>
<p style="padding-left: 120px;">if (v &gt;= 135) v = 135;</p>
<p style="padding-left: 120px;">myservo.write(v);</p>
<p style="padding-left: 120px;">Serial.print(v);</p>
<p style="padding-left: 120px;">Serial.println(&#8216;s&#8217;);</p>
<p style="padding-left: 120px;">v = 0;</p>
<p style="padding-left: 120px;">break;</p>
<p style="padding-left: 90px;">case &#8216;w&#8217;:</p>
<p style="padding-left: 120px;">if (v &lt;= 0) v = 0;</p>
<p style="padding-left: 120px;">if (v &gt;= 255) v = 255;</p>
<p style="padding-left: 120px;">analogWrite(Motor,v);</p>
<p style="padding-left: 120px;">Serial.print(v);</p>
<p style="padding-left: 120px;">Serial.println(&#8216;w&#8217;);</p>
<p style="padding-left: 120px;">v = 0;</p>
<p style="padding-left: 120px;">break;</p>
<p style="padding-left: 60px;">}</p>
<p style="padding-left: 30px;">}</p>
<p>}</p>
<p>以下は簡易な回路図のつもりです。<br />
電源は外部電源を利用してます。外部電源はvinのpinから電源を引きます。<br />
<img class="alignnone size-full wp-image-85" title="サーボ制御" src="http://labs.infoalive.com/wp-content/uploads/2009/09/rimg04421.jpg" alt="サーボ制御" width="640" height="480" /></p>
<p>回路図に１点間違いがありました。<br />
モーターからのワイヤはモスの真ん中にさします。モスに繋がるマイナス電源は端にさします。</p>
<g:plusone href="http://labs.infoalive.com/tips/80"></g:plusone>]]></content:encoded>
			<wfw:commentRss>http://labs.infoalive.com/tips/80/feed</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
	</channel>
</rss>

