<?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; Arduino</title>
	<atom:link href="http://labs.infoalive.com/tag/arduino/feed" rel="self" type="application/rss+xml" />
	<link>http://labs.infoalive.com</link>
	<description>プロダクトの紹介とTipsのまとめサイト</description>
	<lastBuildDate>Thu, 02 Sep 2010 07:45:40 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>QステアをArduinoから操作</title>
		<link>http://labs.infoalive.com/tips/155</link>
		<comments>http://labs.infoalive.com/tips/155#comments</comments>
		<pubDate>Mon, 09 Nov 2009 01:57:45 +0000</pubDate>
		<dc:creator>o2</dc:creator>
				<category><![CDATA[tips]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[Q STEER]]></category>
		<category><![CDATA[Qステア]]></category>
		<category><![CDATA[タカラトミー]]></category>
		<category><![CDATA[チョロQ]]></category>
		<category><![CDATA[ラジコン]]></category>
		<category><![CDATA[赤外線LED]]></category>
		<category><![CDATA[赤外線リモコン受信モジュール]]></category>

		<guid isPermaLink="false">http://labs.infoalive.com/?p=155</guid>
		<description><![CDATA[今回は、タカラトミーのQ STEERをArduinoから操作するハックになります。
先週末、日本橋にある共立電子産業株式会社 3階のセンサー売り場にて赤外線のパーツ類を購入しました。
そんなわけで日曜大工エンジニアです。
○赤外線LED
東芝製 TLN115A(大)　60円
東芝製 TLN119(小)　80円
○赤外線リモコン受信モジュール
EVERLIGHT製 IRM-3638N3　210円





左からOUTPUT、GND、vcc(2.5-5.5V)

赤外線受信用回路



赤外線解析用コードは、ArduinoのサイトからInfrared receiver modulesのコードを利用して解析しました。
○キャプチャ値
データーの０と１が点灯、消灯の間隔。
点灯時は常に点灯しているのではなく、ON、OFFを繰り返します。
この繰り返しの間隔次第で変調信号として機能してます。
今回は38khzの変調信号での利用となります。
&#8212;- ここから
0    0
1796    0
1796    1
2168    1
2168    0
2648    0
2648    1
3016    1
&#8230;. 略
157372    0
158284    0
158284    1
&#8212;- ここまで
Qステア赤外線解析のサイトに書かれているのとほぼ同じ値が返ってきてます。
他には、1回の操作で２回同じ信号が送信されており、2回目の信号を送る間隔はch毎に異なっています。
Ach 間隔 7516
Bch 間隔 21860
Cch 間隔 36212
Dch 間隔 50568
チャネル毎に操作する場合は必要と考えれます。
○Ach の前進用サンプルコード
キャプチャした値の点灯間隔をサンプルコードに設定

#define LED 13
unsigned long us = micros();
void setup(){
pinMode(LED , OUTPUT);
}
void loop(){
digitalWrite(LED, LOW);
delay(1000);
int testdata[] = {1796 ,372 ,480 ,368 ,480 ,368 ,480 ,368 ,480 ,372 ,480 ,364 [...]]]></description>
			<content:encoded><![CDATA[<p>今回は、タカラトミーの<a href="http://www.takaratomy.co.jp/products/qsteer/" target="_blank">Q STEER</a>をArduinoから操作するハックになります。</p>
<p>先週末、日本橋にある<a href="http://www.kyohritsu.com/" target="_blank">共立電子産業株式会社</a> 3階のセンサー売り場にて赤外線のパーツ類を購入しました。</p>
<p>そんなわけで日曜大工エンジニアです。</p>
<p>○赤外線LED<br />
東芝製 TLN115A(大)　60円<br />
東芝製 TLN119(小)　80円</p>
<p>○赤外線リモコン受信モジュール<br />
EVERLIGHT製 IRM-3638N3　210円</p>
<table border="0">
<tbody>
<tr>
<td align="center" valign="top"><a href="http://labs.infoalive.com/wp-content/uploads/2009/11/398.jpg"><img class="alignnone size-thumbnail wp-image-152" title="赤外線LED" src="http://labs.infoalive.com/wp-content/uploads/2009/11/398-150x150.jpg" alt="赤外線LED" width="150" height="150" /></a></td>
<td align="center" valign="top"><a href="http://labs.infoalive.com/wp-content/uploads/2009/11/399.jpg"><img class="alignnone size-thumbnail wp-image-153" title="赤外線リモコン受信モジュール" src="http://labs.infoalive.com/wp-content/uploads/2009/11/399-150x150.jpg" alt="赤外線リモコン受信モジュール" width="150" height="150" /></a><br />
左からOUTPUT、GND、vcc(2.5-5.5V)</td>
<td align="center" valign="top"><a href="http://labs.infoalive.com/wp-content/uploads/2009/11/400.jpg"><img class="alignnone size-thumbnail wp-image-154" title="赤外線受信用回路" src="http://labs.infoalive.com/wp-content/uploads/2009/11/400-150x150.jpg" alt="赤外線受信用回路" width="150" height="150" /></a><br />
赤外線受信用回路</td>
</tr>
</tbody>
</table>
<p>赤外線解析用コードは、Arduinoのサイトから<a href="http://www.arduino.cc/playground/Code/InfraredReceivers">Infrared receiver modules</a>のコードを利用して解析しました。</p>
<p>○キャプチャ値<br />
データーの０と１が点灯、消灯の間隔。<br />
点灯時は常に点灯しているのではなく、ON、OFFを繰り返します。<br />
この繰り返しの間隔次第で変調信号として機能してます。<br />
今回は38khzの変調信号での利用となります。</p>
<p>&#8212;- ここから<br />
0    0<br />
1796    0<br />
1796    1<br />
2168    1<br />
2168    0<br />
2648    0<br />
2648    1<br />
3016    1<br />
&#8230;. 略<br />
157372    0<br />
158284    0<br />
158284    1<br />
&#8212;- ここまで<br />
<a href="http://abetuyo.net/blog/2007/05/q_1.html" target="_blank">Qステア赤外線解析のサイト</a>に書かれているのとほぼ同じ値が返ってきてます。</p>
<p>他には、1回の操作で２回同じ信号が送信されており、2回目の信号を送る間隔はch毎に異なっています。<br />
Ach 間隔 7516<br />
Bch 間隔 21860<br />
Cch 間隔 36212<br />
Dch 間隔 50568</p>
<p>チャネル毎に操作する場合は必要と考えれます。</p>
<p>○Ach の前進用サンプルコード<br />
キャプチャした値の点灯間隔をサンプルコードに設定<br />
<code><br />
#define LED 13<br />
unsigned long us = micros();</code></p>
<p>void setup(){</p>
<p style="padding-left: 30px;">pinMode(LED , OUTPUT);</p>
<p>}</p>
<p>void loop(){</p>
<p style="padding-left: 30px;">digitalWrite(LED, LOW);</p>
<p style="padding-left: 30px;">delay(1000);</p>
<p style="padding-left: 30px;">int testdata[] = {1796 ,372 ,480 ,368 ,480 ,368 ,480 ,368 ,480 ,372 ,480 ,364 ,912 ,7516 ,1744 ,396 ,480 ,372 ,476 ,368 ,484 ,364 ,484 ,364 ,484 ,368 ,912 ,93576 ,1792 ,372 ,452 ,400 ,480 ,368 ,476 ,368 ,480 ,372 ,480 ,368 ,908 ,7512 ,1772 ,368 ,480 ,372 ,476 ,368 ,480 ,368 ,484 ,364 ,484 ,368 ,908 ,15680 ,1800 ,368 ,456 ,392 ,480 ,368 ,912 };</p>
<p style="padding-left: 30px;">for (int cnt = 0; cnt &lt; 500; cnt++) {</p>
<p style="padding-left: 60px;">unsigned long len = testdata[cnt];</p>
<p style="padding-left: 60px;">if (len == 0) break;</p>
<p style="padding-left: 60px;">unsigned long us = micros();</p>
<p style="padding-left: 60px;">do {</p>
<p style="padding-left: 90px;">digitalWrite(LED, 1 &#8211; (cnt&amp;1)); // iが偶数なら赤外線ON、奇数なら0のOFFのまま</p>
<p style="padding-left: 90px;">delayMicroseconds(8);  // キャリア周波数38kHzでON/OFFするよう時間調整</p>
<p style="padding-left: 90px;">digitalWrite(LED, 0);</p>
<p style="padding-left: 90px;">delayMicroseconds(7);</p>
<p style="padding-left: 60px;">} while (long(us + len &#8211; micros()) &gt; 0);</p>
<p style="padding-left: 30px;">}</p>
<p>}</p>
<p>以上が今回のハックの内容となります。</p>
<p>前回と違い非常に安価にラジコンが製作出来ます。</p>
<p>また、赤外線は様々な用途での利用が考えれます。</p>
<p>今後も発想次第で色々作れそうです。</p>
]]></content:encoded>
			<wfw:commentRss>http://labs.infoalive.com/tips/155/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>その後のラジコン</title>
		<link>http://labs.infoalive.com/tips/139</link>
		<comments>http://labs.infoalive.com/tips/139#comments</comments>
		<pubDate>Fri, 30 Oct 2009 08:20:22 +0000</pubDate>
		<dc:creator>o2</dc:creator>
				<category><![CDATA[tips]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[wii]]></category>
		<category><![CDATA[XBee]]></category>
		<category><![CDATA[ラジコン]]></category>
		<category><![CDATA[車]]></category>

		<guid isPermaLink="false">http://labs.infoalive.com/?p=139</guid>
		<description><![CDATA[すっかりブログを書くのを忘れてました。
本日返信がついたので思い出した次第です。
あれから、ラジコンはサーバーに繋いだXBeeを介し、flashやjava applet から操作が可能となりました。
構成図はこんな感じです。先日社内のプレゼンで使った資料の流用になります。


Flashから操作できる＝Wiiのブラウザからも操作が出来る！。。はずです。
カメラを搭載していないので遠隔から操作は出来ません。今後の課題ですね。
Linuxを搭載するように考えてましたが、消費電力が大きいのと、組み込みLinuxは高価なこともあり、搭載は諦めました。
今後は社内のサービスに何らかの形で技術提供できればと考えております。
]]></description>
			<content:encoded><![CDATA[<p>すっかりブログを書くのを忘れてました。</p>
<p>本日返信がついたので思い出した次第です。</p>
<p>あれから、ラジコンはサーバーに繋いだXBeeを介し、flashやjava applet から操作が可能となりました。</p>
<p>構成図はこんな感じです。先日社内のプレゼンで使った資料の流用になります。</p>
<p><img class="alignnone size-full wp-image-141" title="ハード構成図" src="http://labs.infoalive.com/wp-content/uploads/2009/10/arduino1.PNG" alt="ハード構成図" width="535" height="401" /></p>
<p><img class="alignnone size-full wp-image-142" title="ネットワーク構成図" src="http://labs.infoalive.com/wp-content/uploads/2009/10/arduino2.PNG" alt="ネットワーク構成図" width="532" height="399" /></p>
<p>Flashから操作できる＝Wiiのブラウザからも操作が出来る！。。はずです。</p>
<p>カメラを搭載していないので遠隔から操作は出来ません。今後の課題ですね。</p>
<p>Linuxを搭載するように考えてましたが、消費電力が大きいのと、組み込みLinuxは高価なこともあり、搭載は諦めました。</p>
<p>今後は社内のサービスに何らかの形で技術提供できればと考えております。</p>
]]></content:encoded>
			<wfw:commentRss>http://labs.infoalive.com/tips/139/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<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 Proxy」を使うことで、ストリームからシリアルの制御が可能となります。
Linuxへのインストールは簡単

Arduino公式サイトのダウンロードページの一番下にある「Serial Proxy」のソース版をダウンロードhttp://www.arduino.cc/en/Main/Software
make
serproxy.cfgを設定。comm_baud=9600、serial_device1=/dev/ttyUSB0に設定
./serproxy を実行

あとはProcessingのコードをストリーム用に修正。
以下は実際に利用したWiiハンドルからネットワーク越しにラジコンを操作するコードです。
# ハンドル周りに角度変更後の値から±5～10度の遊びを加えると操作しやすくなります（たぶん

import lll.wrj4P5.*;
import lll.Loc.*;
import processing.net.*;
float i = 0.0;
float angle = 0.0;
int kakudo = 0;
int old_kakudo = 0;
Wrj4P5 wii;
LinkedList p = new LinkedList();
Client client;
void setup() {
size(300,300,P3D);
wii=new Wrj4P5(this).connect();
client = new Client(this, &#8220;10.0.2.2&#8243;, 5331);
smooth();
rectMode(CENTER);
}
void draw() {
if (wii.isConnecting()) return;
stroke(32);
fill(255);
ellipse(width/2, height/2, width/1.6, width/1.6);
translate(width/2,height/2);
rotate( atan2(wii.rimokon.sensed.y , wii.rimokon.sensed.x ) );
fill(0);
rect(0,0,width/2,height/7);
angle = atan2(wii.rimokon.sensed.y , wii.rimokon.sensed.x ) * 180 / [...]]]></description>
			<content:encoded><![CDATA[<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>
]]></content:encoded>
			<wfw:commentRss>http://labs.infoalive.com/tips/109/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>wiiリモコンの制御</title>
		<link>http://labs.infoalive.com/tips/95</link>
		<comments>http://labs.infoalive.com/tips/95#comments</comments>
		<pubDate>Fri, 11 Sep 2009 05:18:42 +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[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=95</guid>
		<description><![CDATA[昨夜組み込みLinuxのインストールも終え、もうすぐラジコンが完成します。
今日は、Wiiリモコンの制御について書きます。
wiiリモコンの制御にはProcessing 1.0.6を使いました。
ProcessingでWiiリモコンを扱うにはライブラリの用意が必要です。
今回はwrj4P5.jar (alpha-011)を利用しますので以下を用意しました。

Loc.jar (beta 005)
avetanabt-20070719.tgz or bluecove-2.1.0.jar
WiiRemoteJ v1.6.zip.gz

avetanabtはLinuxで利用する以外は有料ですので、macやwindowsの方はbluecoveがおすすめです。
Linux用のbluecove-2.1.0は幾つかのライブラリが不足してますので、avetanabtがおすすめです。
私の環境では、Linux(ubuntu)とMacの両方にwrj4P5をインストールしました。
インストールに手間取った点を書きますと、
Macでは、wrj4P5を利用する際、Javaを64bit から 32bit に変更が必要でした。ここが解らず悩みました。
LinuxではaventaBTのインストールに若干手間取りました。
以下は参考までにインストールログです。

$ mkdir ~/src/aventaBT
$ cd ~/src/aventaBT
$ wget "http://downloads.sourceforge.net/project/avetanabt/avetanabt/20070719/avetanabt-20070719.tgz?use_mirror=jaist"
$ tar xvzf avetanabt-20070719.tgz
$ sudo aptitude install autoconf2.13
$ sudo aptitude install g++
$ export JDK_HOME=/usr/lib/jvm/java-6-sun
$ export BIN_DIR=/home/[user]/src/aventaBT/binaries
$ ./install
$ cp binaries/avetanaBT.jar ~/src/processing-1.0.6/libraries/wrj4P5/library

以上で、インストール出来たとしまして、ハンドルの制御コードは以下になります。

import lll.wrj4P5.*;
import lll.Loc.*;
float angle = 0.0;
Wrj4P5 wii;
LinkedList p = new LinkedList();
void setup() {
size(300,300,P3D);
wii=new Wrj4P5(this).connect();
smooth();
rectMode(CENTER);
}
void draw() {
if (wii.isConnecting()) return;
stroke(32);
fill(255);
ellipse(width/2, height/2, width/1.6, [...]]]></description>
			<content:encoded><![CDATA[<p>昨夜組み込みLinuxのインストールも終え、もうすぐラジコンが完成します。</p>
<p>今日は、Wiiリモコンの制御について書きます。</p>
<p>wiiリモコンの制御にはProcessing 1.0.6を使いました。</p>
<p>ProcessingでWiiリモコンを扱うにはライブラリの用意が必要です。</p>
<p>今回はwrj4P5.jar (alpha-011)を利用しますので以下を用意しました。</p>
<ul>
<li>Loc.jar (beta 005)</li>
<li>avetanabt-20070719.tgz or bluecove-2.1.0.jar</li>
<li>WiiRemoteJ v1.6.zip.gz</li>
</ul>
<p>avetanabtはLinuxで利用する以外は有料ですので、macやwindowsの方はbluecoveがおすすめです。</p>
<p>Linux用のbluecove-2.1.0は幾つかのライブラリが不足してますので、avetanabtがおすすめです。</p>
<p>私の環境では、Linux(ubuntu)とMacの両方にwrj4P5をインストールしました。</p>
<p>インストールに手間取った点を書きますと、</p>
<p>Macでは、wrj4P5を利用する際、Javaを64bit から 32bit に変更が必要でした。ここが解らず悩みました。</p>
<p>LinuxではaventaBTのインストールに若干手間取りました。</p>
<p>以下は参考までにインストールログです。<br />
<code><br />
$ mkdir ~/src/aventaBT<br />
$ cd ~/src/aventaBT<br />
$ wget "http://downloads.sourceforge.net/project/avetanabt/avetanabt/20070719/avetanabt-20070719.tgz?use_mirror=jaist"<br />
$ tar xvzf avetanabt-20070719.tgz<br />
$ sudo aptitude install autoconf2.13<br />
$ sudo aptitude install g++<br />
$ export JDK_HOME=/usr/lib/jvm/java-6-sun<br />
$ export BIN_DIR=/home/[user]/src/aventaBT/binaries<br />
$ ./install<br />
$ cp binaries/avetanaBT.jar ~/src/processing-1.0.6/libraries/wrj4P5/library<br />
</code></p>
<p>以上で、インストール出来たとしまして、ハンドルの制御コードは以下になります。</p>
<p><code><br />
import lll.wrj4P5.*;<br />
import lll.Loc.*;</code></p>
<p>float angle = 0.0;</p>
<p>Wrj4P5 wii;<br />
LinkedList p = new LinkedList();</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;">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>}</p>
<p>wii リモコンはラジアン値を返しますので、角度を求める場合は以下の公式になります。</p>
<p>angle = atan2( y , x ) * 180 / PI;</p>
<p>角度を求めれたことでハンドルの制御も計算しやすくなりましたね。</p>
<p>これにシリアル通信のコードを加えることで、Arudinoの制御が出来ます。</p>
<p>今回は以上です。</p>
]]></content:encoded>
			<wfw:commentRss>http://labs.infoalive.com/tips/95/feed</wfw:commentRss>
		<slash:comments>0</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シリアルケーブルがそのまま繋がると思っていましたら、組み込みのRS-232 は10pin だったのです！
9pinのRS-232 ケーブルは用意してたのですが、これには困りました。
実際使われるpinはTX/RX、GNDと3本のケーブルのみでしたので、ピンを直刺しすることで対応できました。
また、この話は後日まとめてから書きます。
今日はサーボの制御について書きます。
サーボの制御はArduinoというイタリア生まれのマイコンで行っています。
普通の基盤だと決まったことしか出来ませんが、Arduinoは普通の基盤と違い配線の仕方と、プログラム制御で様々なことが出来ます。
サーボのコントロール方法は、パルス幅の信号長で角度を制御します。
実際はサーボ向けにライブラリがあり、角度を指定するだけで制御が行えます。
気をつける点としては、ラジコンのシャーシの稼動域よりもサーボの稼動域が広いことです。
サーボの稼動域がシャーシの稼動域を超えるとサーボが負荷で嫌な音を立てて潰れます。
実際に潰しましたので間違いないです！
なので先にサーボを取り外し、ラジコンに付属のプロポと同じ稼動域であるか、確認をオススメします。
以下はサーボと前後のモーターをシリアル通信で制御するコードです。
Arduinoでは短いコードで簡潔に書けます。
よろしければ参考ください。

#include
#define servoPin 9
#define Motor 3
Servo myservo;
void setup()
{
pinMode(Motor,OUTPUT);
myservo.attach(servoPin);
Serial.begin(9600);
Serial.println(&#8220;Ready&#8221;);
}
void loop() {
static int v = 0;
if ( Serial.available() &#62; 0) {
char ch = Serial.read();
switch(ch) {
case &#8216;0&#8242;&#8230;&#8217;9&#8242;:
v = v * 10 + ch &#8211; &#8216;0&#8242;;
break;
case &#8217;s&#8217;:
if (v &#60;= 45) v = 45;
if (v &#62;= 135) v = 135;
myservo.write(v);
Serial.print(v);
Serial.println(&#8217;s&#8217;);
v = 0;
break;
case &#8216;w&#8217;:
if (v &#60;= 0) v = [...]]]></description>
			<content:encoded><![CDATA[<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 &#8216;0&#8242;&#8230;&#8217;9&#8242;:</p>
<p style="padding-left: 120px;">v = v * 10 + ch &#8211; &#8216;0&#8242;;</p>
<p style="padding-left: 120px;">break;</p>
<p style="padding-left: 90px;">case &#8217;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(&#8217;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>
]]></content:encoded>
			<wfw:commentRss>http://labs.infoalive.com/tips/80/feed</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>パソコンからラジコンを操作</title>
		<link>http://labs.infoalive.com/tips/60</link>
		<comments>http://labs.infoalive.com/tips/60#comments</comments>
		<pubDate>Wed, 09 Sep 2009 03:11:24 +0000</pubDate>
		<dc:creator>o2</dc:creator>
				<category><![CDATA[tips]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[processing]]></category>
		<category><![CDATA[wii]]></category>
		<category><![CDATA[マイコン]]></category>
		<category><![CDATA[ラジコン]]></category>
		<category><![CDATA[組み込み系]]></category>
		<category><![CDATA[車]]></category>

		<guid isPermaLink="false">http://labs.infoalive.com/?p=60</guid>
		<description><![CDATA[はじめまして。ラボに初参加のinfoaliveのo2です。
時々書かせていただきますのでお見知りおきください。
普段はAMP（Apache,MySQL,PHP) で開発してますが、趣味でマイコンの制御を始めましたので、マイコンの事を書かせていただきます。
マイコンは１週間前まで触ったことすらなかったのですが、唐突にパソコンからラジコンの制御がしたくなり始めました。
きっかけはJoker Racerを見て、これは面白い是非やってみようと思った次第です。
Joker Racerはインターネットを通じて実物のラジコンを操作するサービスです。説明終わり。
では早速、インターネットを通じてラジコンを操作するにはどうすればいいかを考えます。
ラジコンをパソコンから操作するにはマイコンをパソコンに繋げば出来そうです。
マイコンが制御するのは左右に動作するサーボモーターと、前後の動作をするモーターの２つを制御することになります。
ラジコンに直接パソコンのような大きなものは乗りませんので、組み込み系に使われるARMのLinuxを利用します。
LinuxにはWEBカメラと無線LANを積めば遠隔からも操作ができますね。
ラジコンのハンドリングはキーボードで操作するのは面白くないのでWiiリモコンを利用することにします。
現段階では、パソコンにマイコンを繋いだ状態でラジコンの制御が出来るところまで完成してます。
詳しくは追々書くとしまして、Youtubeにアップした動画をどうぞ！

]]></description>
			<content:encoded><![CDATA[<p>はじめまして。ラボに初参加のinfoaliveのo2です。</p>
<p>時々書かせていただきますのでお見知りおきください。</p>
<p>普段はAMP（Apache,MySQL,PHP) で開発してますが、趣味でマイコンの制御を始めましたので、マイコンの事を書かせていただきます。</p>
<p>マイコンは１週間前まで触ったことすらなかったのですが、唐突にパソコンからラジコンの制御がしたくなり始めました。</p>
<p>きっかけはJoker Racerを見て、これは面白い是非やってみようと思った次第です。</p>
<p>Joker Racerはインターネットを通じて実物のラジコンを操作するサービスです。説明終わり。</p>
<p>では早速、インターネットを通じてラジコンを操作するにはどうすればいいかを考えます。</p>
<p>ラジコンをパソコンから操作するにはマイコンをパソコンに繋げば出来そうです。</p>
<p>マイコンが制御するのは左右に動作するサーボモーターと、前後の動作をするモーターの２つを制御することになります。</p>
<p>ラジコンに直接パソコンのような大きなものは乗りませんので、組み込み系に使われるARMのLinuxを利用します。</p>
<p>LinuxにはWEBカメラと無線LANを積めば遠隔からも操作ができますね。</p>
<p>ラジコンのハンドリングはキーボードで操作するのは面白くないのでWiiリモコンを利用することにします。</p>
<p>現段階では、パソコンにマイコンを繋いだ状態でラジコンの制御が出来るところまで完成してます。</p>
<p>詳しくは追々書くとしまして、Youtubeにアップした動画をどうぞ！</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="350" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="wmode" value="transparent" /><param name="src" value="http://www.youtube.com/v/apckgFxvFpI" /><embed type="application/x-shockwave-flash" width="425" height="350" src="http://www.youtube.com/v/apckgFxvFpI" wmode="transparent"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://labs.infoalive.com/tips/60/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
