<?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>橋本商会 &#187; Talktic</title>
	<atom:link href="http://shokai.org/blog/archives/tag/talktic/feed" rel="self" type="application/rss+xml" />
	<link>http://shokai.org/blog</link>
	<description>なんか作ったりした記録を忘れないうちに書くblog</description>
	<lastBuildDate>Mon, 06 Feb 2012 13:32:44 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com/" />
			<item>
		<title>moxaでバイオメタルを動かした</title>
		<link>http://shokai.org/blog/archives/4182</link>
		<comments>http://shokai.org/blog/archives/4182#comments</comments>
		<pubDate>Tue, 10 Feb 2009 15:57:04 +0000</pubDate>
		<dc:creator>shokai</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[biometal]]></category>
		<category><![CDATA[moxa]]></category>
		<category><![CDATA[PWM]]></category>
		<category><![CDATA[Talktic]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://shokai.org/blog/?p=4182</guid>
		<description><![CDATA[バイオメタルをmoxaで動かすために0V～3V程度を出せる回路とプログラムを作った。 色々試した結果、最終的にPCからシリアル通信でmoxaのanalogWrite（PWM出力）を制御できるようにして、analogWri [...]]]></description>
			<content:encoded><![CDATA[<p>
バイオメタルをmoxaで動かすために0V～3V程度を出せる回路とプログラムを作った。<br />
<br />
色々試した結果、最終的にPCからシリアル通信でmoxaのanalogWrite（PWM出力）を制御できるようにして、analogWriteをトランジスタ（2SC1815）に突っ込む。トランジスタは三端子レギュレータ7805から得た5Vを出すが、トランジスタを通る事で3.7V程度に落ちて、バイオメタルにちょうど良い電圧になった。<br />
<br />
バイオメタルは「3Vで駆動」と書いてあったけど3.7Vでも大丈夫だった。5Vそのまま入れると変な臭いがしてきてヤバイ（すぐ止めました）<br />
<br />
AVRマイコンのGPIO出力は3Vだけど40mAと電流が足りなかった。<br />
バイオメタルを動かすには200mA程度必要で、<a href="http://akizukidenshi.com/catalog/g/gI-00538/">秋月の3.3Vの三端子レギュレータ</a>を使っても動いたけどマイコンから制御するためにトランジスタをかますと2V程度に落ちてしまうので5V電源でやったらちょうど良くなった。アクチュエータ系は試行錯誤が必要だなー<br />
<br />
<br />
<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/Xnyhoo5QABY&#038;hl=ja&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/Xnyhoo5QABY&#038;hl=ja&#038;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object><br />
パソコンでアナログ値を制御している動画<br />
<br />
<br />
回路。基盤で隠れて見えないけど、moxaの左下のGNDはブレッドボードのGNDと接続されている<br />
<a href="http://www.flickr.com/photos/shokai/3269462758/" title="moxaでバイオメタル動かす by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3329/3269462758_67443e9061.jpg" width="500" height="375" alt="moxaでバイオメタル動かす" /></a><br />
<a href="http://www.flickr.com/photos/shokai/3268639249/" title="moxaでバイオメタル動かす by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3437/3268639249_6773751957.jpg" width="500" height="375" alt="moxaでバイオメタル動かす" /></a><br />
<br />
<br />
今回のtalkticコード<br />
<a href="http://www.uc.sfc.keio.ac.jp/xtel/learning/analog-read-write.html">xtel technical information ＞ learning＞ Analog Read &amp; Write</a>を参考にした<br />
</p>
<blockquote><p>
serialInit(9600);<br />
pinMode(1,true);<br />
pinMode(0,true);<br />
power&nbsp;=&nbsp;0.0;<br />
<br />
function&nbsp;onSerialReceive(){&nbsp;//&nbsp;シリアル受信イベント<br />
&nbsp;&nbsp;&nbsp;&nbsp;while(serialAvailable()){&nbsp;//&nbsp;受信データがある時<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;recvData&nbsp;=&nbsp;serialRead();&nbsp;//&nbsp;読み出し<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;power&nbsp;=&nbsp;recvData*0.01;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;analogWrite(0,&nbsp;power);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;analogWrite(1,&nbsp;power)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;serialSend(recvData);&nbsp;//&nbsp;受信した文字列をそのままエコーする<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
while(true){<br />
}<br />
</p></blockquote>
<p>
</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/4182/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PCなしで、moxaで音を出す</title>
		<link>http://shokai.org/blog/archives/2237</link>
		<comments>http://shokai.org/blog/archives/2237#comments</comments>
		<pubDate>Wed, 05 Nov 2008 03:16:32 +0000</pubDate>
		<dc:creator>shokai</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[gemsbok]]></category>
		<category><![CDATA[moxa]]></category>
		<category><![CDATA[sound]]></category>
		<category><![CDATA[Talktic]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[xtel]]></category>

		<guid isPermaLink="false">http://shokai.org/blog/?p=2237</guid>
		<description><![CDATA[xtel technical information ＞ learning＞ Sound Writeより moxaとスピーカを直結させて、soundWrite(ピン番号, 周波数)関数を使うと音が出せる センサと組み合わ [...]]]></description>
			<content:encoded><![CDATA[<p>
<a href="http://uc.sfc.keio.ac.jp/xtel/learning/sound-write.html">xtel technical information ＞ learning＞ Sound Write</a>より<br />
<br />
moxaとスピーカを直結させて、soundWrite(ピン番号, 周波数)関数を使うと音が出せる <br />
<br />
<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/Nt6rr4BsNXY&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;hl=ja&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><embed src="http://www.youtube.com/v/Nt6rr4BsNXY&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;hl=ja&#038;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"></embed></object><br />
<br />
<br />
<br />
センサと組み合わせるとインタラクティブに音階を変えられる。CdSという明度センサを使っている<br />
<a href="http://uc.sfc.keio.ac.jp/xtel/learning/sound-write.html"><img src="http://uc.sfc.keio.ac.jp/xtel/learning/tt/sound-write.gif" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/2237/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>moxaでセンサーネットワーク</title>
		<link>http://shokai.org/blog/archives/2229</link>
		<comments>http://shokai.org/blog/archives/2229#comments</comments>
		<pubDate>Tue, 04 Nov 2008 16:19:23 +0000</pubDate>
		<dc:creator>shokai</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[gemsbok]]></category>
		<category><![CDATA[moxa]]></category>
		<category><![CDATA[Talktic]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[xtel]]></category>
		<category><![CDATA[zigbee]]></category>

		<guid isPermaLink="false">http://shokai.org/blog/?p=2229</guid>
		<description><![CDATA[xtelのmoxaを使う。 moxaのzigbee無線で距離を測るから距離情報を削って、少しフォーマットを変えただけだが たくさんあるセンサ付きノードの状態を、zigbee無線で一カ所に集めるのが簡単にできる。 8ビット [...]]]></description>
			<content:encoded><![CDATA[<p>
<a href="http://uc.sfc.keio.ac.jp/xtel/">xtelのmoxa</a>を使う。<br />
<br />
<a href="http://shokai.org/blog/archives/1584">moxaのzigbee無線で距離を測る</a>から距離情報を削って、少しフォーマットを変えただけだが<br />
たくさんあるセンサ付きノードの状態を、zigbee無線で一カ所に集めるのが簡単にできる。<br />
8ビットマイコンなのにclassが作れて（厳密にはJavaScript互換なのでクラスではないが）文字列が可変長でString.splitなども使えてArrayもあるので、こういう無線通信プロトコルは簡単に作れる<br />
<br />
<span id="more-2229"></span><br />
<br />
■<a href="http://www.bitbucket.org/shokai/orf08moxa/src/c3c0f6aa2df2/nodeSample/source.js">ノードのプログラム</a><br />
定義したsensor_send()関数でデバイス名,センサ名,センサ値を送信する<br />
あまり頻繁に送ると受信側が困るので、適度にsleepを入れる<br />
</p>
<blockquote><p>var&nbsp;debugMode&nbsp;=&nbsp;false;&nbsp;//&nbsp;trueの時、無線データなどをシリアルポートで確認できる<br />
<br />
var&nbsp;radio&nbsp;=&nbsp;new&nbsp;Object();<br />
radio.id&nbsp;=&nbsp;2;&nbsp;&nbsp;<br />
radio.channel&nbsp;=&nbsp;15;<br />
<br />
radioInit(0xDEAD,&nbsp;radio.id,&nbsp;radio.channel,&nbsp;31);<br />
serialInit(9600);<br />
<br />
pinMode(0,&nbsp;true);<br />
<br />
function&nbsp;loop()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;an&nbsp;=&nbsp;analogRead(0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;send_sensor(&quot;sampleDevice&quot;,&nbsp;&quot;lightSensor&quot;,&nbsp;an);&nbsp;//&nbsp;デバイス名,センサ名,センサ値<br />
&nbsp;&nbsp;&nbsp;&nbsp;sleep(100);&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;約1秒停止<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;button&nbsp;=&nbsp;digitalRead(0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;send_sensor(&quot;sampleDevice&quot;,&nbsp;&quot;pushButton&quot;,&nbsp;button);<br />
&nbsp;&nbsp;&nbsp;&nbsp;sleep(100);<br />
}<br />
<br />
//&nbsp;デバイス名,センサ名,センサ値を送信<br />
function&nbsp;send_sensor(deviceName,&nbsp;sensorName,&nbsp;sensorValue){<br />
&nbsp;&nbsp;&nbsp;&nbsp;message&nbsp;=&nbsp;deviceName&nbsp;+&nbsp;&quot;:&quot;&nbsp;+&nbsp;sensorName&nbsp;+&nbsp;&quot;=&quot;&nbsp;+&nbsp;sensorValue;<br />
&nbsp;&nbsp;&nbsp;&nbsp;radioSend(0xFFFF,&nbsp;message);<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(debugMode)&nbsp;serialSend(message&nbsp;+&nbsp;&quot;&yen;r&yen;n&quot;);&nbsp;//&nbsp;無線データ確認用<br />
}<br />
<br />
<br />
function&nbsp;sleep(count){<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(var&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;count*10;&nbsp;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
while(true){<br />
&nbsp;&nbsp;&nbsp;&nbsp;loop();<br />
}</p></blockquote>
<p>
<br />
<br />
<br />
■<a href="http://www.bitbucket.org/shokai/orf08moxa/src/c3c0f6aa2df2/root/source.js">ルートのプログラム</a><br />
センサ群を集約するroot。<br />
センサのデバイス名、センサ名、値をSensorListクラス内に複数保持して、定期的にシリアル通信でPCに渡す。<br />
</p>
<blockquote><p>var&nbsp;radio&nbsp;=&nbsp;new&nbsp;Object();<br />
radio.id&nbsp;=&nbsp;1;&nbsp;&nbsp;<br />
radio.channel&nbsp;=&nbsp;15;<br />
<br />
//&nbsp;class定義<br />
function&nbsp;Sensor(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;this.deviceName&nbsp;=&nbsp;&quot;&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;this.name&nbsp;=&nbsp;&quot;&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;this.value&nbsp;=&nbsp;null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;this.toString&nbsp;=&nbsp;function(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;this.deviceName&nbsp;+&nbsp;&quot;:&quot;&nbsp;+&nbsp;this.name&nbsp;+&nbsp;&quot;=&quot;&nbsp;+&nbsp;this.value;<br />
&nbsp;&nbsp;&nbsp;&nbsp;};<br />
}<br />
<br />
function&nbsp;SensorList(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;this.sensors&nbsp;=&nbsp;new&nbsp;Array();<br />
&nbsp;&nbsp;&nbsp;&nbsp;this.store&nbsp;=&nbsp;function(sensor){&nbsp;//&nbsp;sensor値を保持する<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;上書き保存<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(s&nbsp;in&nbsp;this.sensors){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(s.name&nbsp;==&nbsp;sensor.name&nbsp;&amp;&amp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.deviceName&nbsp;==&nbsp;sensor.deviceName){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.value&nbsp;=&nbsp;sensor.value;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;新規保存<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.sensors.push(sensor);<br />
&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;this.toString&nbsp;=&nbsp;function(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;result&nbsp;=&nbsp;&quot;&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(s&nbsp;in&nbsp;this.sensors){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;+=&nbsp;s.toString()&nbsp;+&nbsp;&quot;&amp;&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;this.length&nbsp;=&nbsp;function(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;this.sensors.length;<br />
&nbsp;&nbsp;&nbsp;&nbsp;};<br />
}<br />
<br />
//&nbsp;class定義終わり<br />
<br />
sensors&nbsp;=&nbsp;new&nbsp;SensorList();<br />
<br />
radioInit(0xDEAD,&nbsp;radio.id,&nbsp;radio.channel,&nbsp;31);<br />
serialInit(9600);<br />
<br />
function&nbsp;loop()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;str&nbsp;=&nbsp;&quot;&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;serialSend(sensors.toString()&nbsp;+&nbsp;&quot;&yen;r&yen;n&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;sleep(10);/**/<br />
}<br />
<br />
function&nbsp;onRadioReceive(seq,id,pan,data,rss)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;sensor&nbsp;=&nbsp;new&nbsp;Sensor();<br />
&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;=&nbsp;data.split(&quot;:&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;sensor.deviceName&nbsp;=&nbsp;tmp[0];<br />
&nbsp;&nbsp;&nbsp;&nbsp;tmp2&nbsp;=&nbsp;tmp[1].split(&quot;=&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;sensor.name&nbsp;=&nbsp;tmp2[0];<br />
&nbsp;&nbsp;&nbsp;&nbsp;sensor.value&nbsp;=&nbsp;tmp2[1];<br />
&nbsp;&nbsp;&nbsp;&nbsp;sensors.store(sensor);<br />
&nbsp;&nbsp;&nbsp;&nbsp;//serialSend(sensors.length()&nbsp;+&nbsp;&quot;,&quot;&nbsp;+&nbsp;sensor.toString()&nbsp;+&nbsp;&quot;&yen;r&yen;n&quot;);<br />
}<br />
<br />
function&nbsp;sleep(count){<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(var&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;count*10;&nbsp;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
while(true){<br />
&nbsp;&nbsp;&nbsp;&nbsp;loop();<br />
}<br />
</p></blockquote>
<p></p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/2229/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>moxa &#8211; 明るさと振動をシリアル通信で送る</title>
		<link>http://shokai.org/blog/archives/2211</link>
		<comments>http://shokai.org/blog/archives/2211#comments</comments>
		<pubDate>Tue, 21 Oct 2008 11:28:44 +0000</pubDate>
		<dc:creator>shokai</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[CdS]]></category>
		<category><![CDATA[gemsbok]]></category>
		<category><![CDATA[moxa]]></category>
		<category><![CDATA[Talktic]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[xtel]]></category>
		<category><![CDATA[振動スイッチ]]></category>

		<guid isPermaLink="false">http://shokai.org/blog/?p=2211</guid>
		<description><![CDATA[CdSと振動スイッチを使った。 xtel基盤のDigitalReadとAnalog Readのページが大変参考になりました。 このサイズのCdSだと、330ΩをGNDにつないで分圧したら丁度良くなった。 まずブレッドボー [...]]]></description>
			<content:encoded><![CDATA[<p>
CdSと振動スイッチを使った。<br />
xtel基盤の<a href="http://www.uc.sfc.keio.ac.jp/xtel/learning/digital-read.html">DigitalRead</a>と<a href="http://www.uc.sfc.keio.ac.jp/xtel/learning/analog-read-write.html">Analog Read</a>のページが大変参考になりました。<br />
<br />
<br />
このサイズのCdSだと、330ΩをGNDにつないで分圧したら丁度良くなった。<br />
<a href="http://www.flickr.com/photos/shokai/2960178243/" title="DSCF4111 by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3137/2960178243_2dac765e1d.jpg" width="500" height="375" alt="DSCF4111" /></a><br />
<br />
<br />
まずブレッドボードで回路を組んでみた<br />
<a href="http://www.flickr.com/photos/shokai/2960178937/" title="DSCF4114 by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3067/2960178937_8b0aabbb5d.jpg" width="500" height="375" alt="DSCF4114" /></a><br />
<br />
<br />
それからはんだづけ<br />
<a href="http://www.flickr.com/photos/shokai/2961108278/" title="明るさ、振動 by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3012/2961108278_b674a54213.jpg" width="375" height="500" alt="明るさ、振動" /></a><br />
<br />
<br />
プログラム。<br />
連続でシリアル通信するとPCが大変なので、1秒ぐらいのインターバルを取る。<br />
明るさはアナログ値なのでその時間内の平均を取った。<br />
振動も、一度でも振動センサが反応したらshaked:trueになるようにして、serialSendでまとめて送った。<br />
</p>
<blockquote><p>serialInit(9600);<br />
pinMode(0,&nbsp;true);&nbsp;//&nbsp;振動センサ<br />
<br />
function&nbsp;loop(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;an&nbsp;=&nbsp;0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;shaked&nbsp;=&nbsp;false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;loopTime&nbsp;=&nbsp;1000;<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(var&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;loopTime;&nbsp;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;an&nbsp;+=&nbsp;analogRead(0);&nbsp;//&nbsp;明るさ<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!digitalRead(0))&nbsp;shaked&nbsp;=&nbsp;true;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;an&nbsp;=&nbsp;an/loopTime;<br />
&nbsp;&nbsp;&nbsp;&nbsp;serialSend(&quot;light:&quot;+an+&quot;,shake:&quot;+shaked+&quot;&yen;r&yen;n&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;sleep(1);<br />
}<br />
<br />
<br />
function&nbsp;sleep(count){<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(var&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;count*10;&nbsp;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
while(true){<br />
&nbsp;&nbsp;&nbsp;&nbsp;loop();<br />
}</p></blockquote>
<p>
<br />
<br />
PCでシリアル通信受信したところ<br />
<a href="http://www.flickr.com/photos/shokai/2960976604/" title="振動と明るさ by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3050/2960976604_b6a951ebc9.jpg" width="500" height="239" alt="振動と明るさ" /></a><br />
</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/2211/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>moxaのzigbee無線で距離を測る</title>
		<link>http://shokai.org/blog/archives/1584</link>
		<comments>http://shokai.org/blog/archives/1584#comments</comments>
		<pubDate>Mon, 11 Aug 2008 07:39:54 +0000</pubDate>
		<dc:creator>shokai</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[moxa]]></category>
		<category><![CDATA[Talktic]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[xtel]]></category>
		<category><![CDATA[zigbee]]></category>

		<guid isPermaLink="false">http://shokai.org/blog/?p=1584</guid>
		<description><![CDATA[zigbee無線で距離を測った。 moxaの無線は出力を変える事ができる。これを利用して、サンプルプログラムの中にあった距離が近づいたらLEDが点灯する奴を改造し、 ・複数nodeをID識別 ・距離の計測の高速化 を行っ [...]]]></description>
			<content:encoded><![CDATA[<p>
zigbee無線で距離を測った。<br />
<br />
<a href="http://xtel.sfc.keio.ac.jp/jp/xtel.html">moxa</a>の無線は出力を変える事ができる。これを利用して、サンプルプログラムの中にあった距離が近づいたらLEDが点灯する奴を改造し、<br />
・複数nodeをID識別<br />
・距離の計測の高速化<br />
を行った。<br />
<br />
1つのanchorと複数のnodeとの間の距離を取る。たくさんプログラムを書きこむ羽目になるのでUSBハブが無いと大変。<br />
<a href="http://www.flickr.com/photos/shokai/2697119204/" title="DSCF2544 by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3294/2697119204_d11f387aab.jpg" width="500" height="375" alt="DSCF2544" /></a><br />
<br />
■しくみ<br />
徐々に電波強度を上げていくと、「最も弱い出力で受信できた時」を距離とする事ができる。<br />
電波強度は、無線通信のデータ本文に数値として含めておいて、受信側で文字列をparseして読み出す。<br />
<br />
moxaはマイコン上でECMAScriptが使えるので、Stringを分解したり、Object型インスタンスに何でも突っ込んだり、配列に溜めたりするのが楽に出来るので通信プロトコルを作るのが楽だった。<br />
<br />
<br />
■nodeのプログラム<br />
徐々に電波強度を上げながらanchorに無線を送り続ける<br />
<a href="http://shokai.org/archive/moxa/0808_RadioDistance/node/source.js">node/source.js</a><br />
</p>
<blockquote><p>var&nbsp;radio&nbsp;=&nbsp;new&nbsp;Object();<br />
radio.id&nbsp;=&nbsp;2;&nbsp;//&nbsp;id:2以降がnode<br />
radio.group&nbsp;=&nbsp;7;<br />
<br />
var&nbsp;time&nbsp;=&nbsp;1;<br />
var&nbsp;power_borders&nbsp;=&nbsp;new&nbsp;Array();<br />
power_borders&nbsp;=&nbsp;[1,2,3,4,11,12,13,30,31];&nbsp;//&nbsp;距離の境目リスト<br />
<br />
<br />
function&nbsp;loop()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dist_send();<br />
}<br />
<br />
function&nbsp;dist_send(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(p&nbsp;in&nbsp;power_borders){&nbsp;//&nbsp;power<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;radioInit(0xDEAD,&nbsp;radio.id,&nbsp;radio.group,&nbsp;p);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message&nbsp;=&nbsp;&quot;power:&quot;+p+&quot;,time:&quot;+time;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;radioSend(0xFFFF,&nbsp;message);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;time++;<br />
}<br />
<br />
function&nbsp;sleep(count){<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(var&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;count*10;&nbsp;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
while(true){<br />
&nbsp;&nbsp;&nbsp;&nbsp;loop();<br />
}</p></blockquote>
<p>
<br />
■プロトコル<br />
powerを1から徐々に上げながら送信する。<br />
</p>
<blockquote><p>&#8220;power:2,time:15&#8243;<br />
&#8220;power:3,time:15&#8243;<br />
&#8220;power:4,time:15&#8243;</p></blockquote>
<p>
 という風にtimeという変数も合わせて送る事で、1セット分の無線送信試行を表している。<br />
<br />
■距離の境目<br />
実際にはpowerと無線の飛距離は正比例していなくて、簡単に調べた所<br />
・power 4ぐらい → 4メートル以内ぐらい<br />
・power 10前後 → 5~15メートルぐらい<br />
・power 20前後 → 15～30メートルぐらい<br />
・power 30前後 → それ以上<br />
となっていた。なので、その境目あたりを重点的に送信するために<br />
</p>
<blockquote><p>power_borders&nbsp;=&nbsp;[1,2,3,4,11,12,13,30,31];&nbsp;//&nbsp;距離の境目リスト</p></blockquote>
<p>を使った。こうすると1から最大31まで全powerを試す必要が無くなり、3倍ぐらい速くなっても精度はあまり落ちない。<br />
<br />
<br />
■anchorのプログラム<br />
nodeからの最低出力で受信できた時のpowerを本文から取り出し、nodeのID毎に配列に保存しておく。<br />
<a href="http://shokai.org/archive/moxa/0808_RadioDistance/anchor/source.js">anchor/source.js</a><br />
</p>
<blockquote><p>var&nbsp;radio&nbsp;=&nbsp;new&nbsp;Object();<br />
radio.id&nbsp;=&nbsp;1;&nbsp;//&nbsp;nodeはid:2以降<br />
radio.group&nbsp;=&nbsp;7;<br />
<br />
var&nbsp;dist&nbsp;=&nbsp;new&nbsp;Object();<br />
dist.lastTime&nbsp;=&nbsp;0;<br />
dist.lastPower&nbsp;=&nbsp;0;<br />
<br />
nodes&nbsp;=&nbsp;new&nbsp;Array(16);<br />
nodes_init(nodes);<br />
<br />
serialInit(9600);<br />
radioInit(0xDEAD,&nbsp;radio.id,&nbsp;radio.group,&nbsp;31);<br />
<br />
function&nbsp;loop(){<br />
}<br />
<br />
function&nbsp;onRadioReceive(seq,id,pan,data,rss)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(id&nbsp;&lt;&nbsp;2)&nbsp;return;&nbsp;//&nbsp;nodeからではない時<br />
&nbsp;&nbsp;&nbsp;&nbsp;commands&nbsp;=&nbsp;data.split(&quot;,&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(c&nbsp;in&nbsp;commands){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;=&nbsp;c.split(&quot;:&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(tmp[0]&nbsp;==&nbsp;&quot;power&quot;)&nbsp;distance&nbsp;=&nbsp;tmp[1];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(tmp[0]&nbsp;==&nbsp;&quot;time&quot;)&nbsp;time&nbsp;=&nbsp;tmp[1];<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(nodes[id].lastTime&nbsp;!=&nbsp;time){&nbsp;//&nbsp;新しいデータの時<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nodes[id].distance&nbsp;=&nbsp;distance;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;nodeのidと距離を出力<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;serialSend(&quot;id:&quot;+id+&quot;,distance:&quot;+distance+&quot;,time:&quot;+time+&quot;&yen;r&yen;n&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nodes[id].lastTime&nbsp;=&nbsp;time;<br />
}<br />
<br />
function&nbsp;nodes_init(nodes){<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;&nbsp;nodes.length;&nbsp;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;node&nbsp;=&nbsp;new&nbsp;Object();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node.lastTime&nbsp;=&nbsp;0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node.distance&nbsp;=&nbsp;0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node.id&nbsp;=&nbsp;i;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nodes[i]&nbsp;=&nbsp;node;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
function&nbsp;sleep(count){<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(var&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;count*10;&nbsp;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
while(true){<br />
&nbsp;&nbsp;&nbsp;&nbsp;loop();<br />
}</p></blockquote>
<p>
<br />
■無線データの受信と解析<br />
onRadioReceive(seq,id,pan,data,rss) という関数を宣言すると無線を受信できる。<br />
こういうデータが来るので</p>
<blockquote><p>&#8220;power:3,time:15&#8243;</p></blockquote>
<p>splitで : と , を分けて、nodeオブジェクトに保存する。<br />
</p>
<blockquote><p>&nbsp;&nbsp;&nbsp;&nbsp;commands&nbsp;=&nbsp;data.split(&quot;,&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(c&nbsp;in&nbsp;commands){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;=&nbsp;c.split(&quot;:&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(tmp[0]&nbsp;==&nbsp;&quot;power&quot;)&nbsp;distance&nbsp;=&nbsp;tmp[1];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(tmp[0]&nbsp;==&nbsp;&quot;time&quot;)&nbsp;time&nbsp;=&nbsp;tmp[1];<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</p></blockquote>
<p>
また、引数 id に送信元のIDが入っているので、あわせて保存しておく。<br />
<br />
■シリアルポートに出力<br />
今回はanchorからパソコンにシリアル通信で出力した。<br />
</p>
<blockquote><p>id:2,distance:10,time:18\r\n<br />
id:6,distance:3,time:11\r\n<br />
id:7,distance:13,time:7\r\n</p></blockquote>
<p>
こんな感じの文字列がきて、anchorとnodeの間の距離、IDがわかる。<br />
<br />
<a href="http://www.flickr.com/photos/shokai/2743267975/" title="距離計測、ついでにボタン状態も by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3280/2743267975_da725fcb17.jpg" width="500" height="370" alt="距離計測、ついでにボタン状態も" /></a><br />
ちなみに、node側でさらにボタンの押下状態なんかも付けられる。<br />
<br />
</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/1584/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

