<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Kosaka laboratory Wiiremote Tips</title>
    <link rel="alternate" type="text/html" href="http://www.kosaka-lab.com/tips/" />
    <link rel="self" type="application/atom+xml" href="http://www.kosaka-lab.com/tips/atom.xml" />
    <id>tag:www.kosaka-lab.com,2009-01-08:/tips//11</id>
    <updated>2010-06-27T17:28:18Z</updated>
    <subtitle>このページでは技術的要素を紹介します。</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Commercial 4.22-ja</generator>

<entry>
    <title>秋月VFD RSSやTwitterの内容を表示</title>
    <link rel="alternate" type="text/html" href="http://www.kosaka-lab.com/tips/2010/06/vfd-rsstwitter.php" />
    <id>tag:www.kosaka-lab.com,2010:/tips//11.704</id>

    <published>2010-06-27T16:33:30Z</published>
    <updated>2010-06-27T17:28:18Z</updated>

    <summary>秋月VFDにRSSやTwitterの内容を表示させます。電車内の広告のような物が...</summary>
    <author>
        <name>笹山裕輔</name>
        
    </author>
    
        <category term="秋月VFD" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.kosaka-lab.com/tips/">
        <![CDATA[秋月VFDにRSSやTwitterの内容を表示させます。<br />電車内の広告のような物が作れます。<br /><br />TwitterはTwitterAPIを使うことで、ぶつやきの内容をRSSとして配信することができます。<br /><br />例<br /><a href="http://search.twitter.com/search.atom?q=IVRC">http://search.twitter.com/search.atom?q=IVRC</a>　つぶやきをIVRCで検索した結果<br /><a href="http://search.twitter.com/search.atom?q=from%3AIVRC">http://search.twitter.com/search.atom?q=from%3AIVRC</a>　ユーザーIVRCのつぶやき一覧<br /><a href="http://search.twitter.com/search.atom?q=%23IVRC">http://search.twitter.com/search.atom?q=%23IVRC</a>　ハッシュタグ#IVRCのつぶやき一覧<br /><br /><h6 id="page-title-date">1.プロジェクトの作成</h6>
Visual C#で「VFDTest」というWindowsフォームアプリケーションの新規プロジェクトを作成します。<br /><br />
<h6 id="page-title-date">2.フォームの作成</h6>フォーム上に、以下のようにコントロールを配置します<br />
<img src="http://www.kosaka-lab.com/tips/vfd/02_01.jpg" />
<br /><br /><br />フォーム、ラジオボタン、ボタンをダブルクリックし、イベントを登録します<br /><br />
<h6 id="page-title-date">3.文字表示プログラム</h6>form1.csに以下のプログラムを貼り付けます<br /><br />
<!-- code formatted by http://manoli.net/csharpformat/ -->
<pre class="csharpcode"><span class="kwrd">using</span> System;
<span class="kwrd">using</span> System.Collections.Generic;
<span class="kwrd">using</span> System.ComponentModel;
<span class="kwrd">using</span> System.Data;
<span class="kwrd">using</span> System.Drawing;
<span class="kwrd">using</span> System.Linq;
<span class="kwrd">using</span> System.Text;
<span class="kwrd">using</span> System.Windows.Forms;
<span class="kwrd">using</span> System.IO.Ports;
<span class="kwrd">using</span> System.Collections;

<span class="kwrd">using</span> System.Net;
<span class="kwrd">using</span> System.Xml;

<span class="kwrd">namespace</span> VFDTest
{
    <span class="kwrd">public</span> <span class="kwrd">partial</span> <span class="kwrd">class</span> Form1 : Form
    {
        <span class="kwrd">private</span> SerialPort serialPort = <span class="kwrd">new</span> SerialPort();
        <span class="kwrd">private</span> Boolean is58 = <span class="kwrd">false</span>;
        <span class="kwrd">private</span> Timer timer = <span class="kwrd">new</span> Timer();

        <span class="kwrd">public</span> Form1()
        {
            InitializeComponent();
            <span class="kwrd">this</span>.serialPort = <span class="kwrd">new</span> SerialPort();
        }

        <span class="rem">//フォームロード</span>
        <span class="kwrd">private</span> <span class="kwrd">void</span> Form1_Load(<span class="kwrd">object</span> sender, EventArgs e)
        {
            <span class="kwrd">this</span>.comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;

            <span class="kwrd">string</span>[] ports = SerialPort.GetPortNames();

            <span class="kwrd">foreach</span> (<span class="kwrd">string</span> port <span class="kwrd">in</span> ports)
            {
                <span class="kwrd">this</span>.comboBox1.Items.Add(port);
            }

            <span class="kwrd">this</span>.comboBox1.SelectedIndex = 0;

            <span class="rem">//ラジオボタン</span>
            <span class="kwrd">this</span>.radioButton1.Checked = <span class="kwrd">true</span>;
            <span class="kwrd">this</span>.is58 = <span class="kwrd">false</span>;

            <span class="rem">//ボタン無効</span>
            <span class="kwrd">this</span>.button2.Enabled = <span class="kwrd">false</span>;
            <span class="kwrd">this</span>.button3.Enabled = <span class="kwrd">false</span>;

            <span class="rem">//URLを追加</span>
            <span class="kwrd">this</span>.listBox1.Items.Add(<span class="str">"http://www.kosaka-lab.com/kosaka_laboratory/atom.xml"</span>);
            <span class="kwrd">this</span>.listBox1.SelectedIndex = 0;

            <span class="rem">//他スレッドからのコントロール呼び出し許可</span>
            Control.CheckForIllegalCrossThreadCalls = <span class="kwrd">false</span>;
        }

        <span class="rem">//接続</span>
        <span class="kwrd">private</span> <span class="kwrd">void</span> button1_Click(<span class="kwrd">object</span> sender, EventArgs e)
        {
            <span class="kwrd">try</span>
            {
                <span class="kwrd">this</span>.serialPort.BaudRate = 19200;<span class="rem">//通信速度 19200bps</span>
                <span class="kwrd">this</span>.serialPort.PortName = (<span class="kwrd">string</span>)<span class="kwrd">this</span>.comboBox1.SelectedItem;<span class="rem">//ポート番号はコンボボックスから選択</span>
                <span class="kwrd">this</span>.serialPort.DataReceived += <span class="kwrd">new</span> SerialDataReceivedEventHandler(serialPort_DataReceived);
                <span class="kwrd">this</span>.serialPort.Open();<span class="rem">//ポートオープン</span>

                <span class="rem">//GP1058の場合</span>
                <span class="kwrd">if</span> (<span class="kwrd">this</span>.is58 == <span class="kwrd">true</span>)
                {
                    <span class="rem">//画素数336x24</span>
                    <span class="kwrd">this</span>.send_commandFrame(0x25, 0x00);
                }
            }
            <span class="kwrd">catch</span> (Exception ex)
            {
                <span class="rem">//ポートオープンに失敗</span>
                MessageBox.Show(ex.ToString());
                <span class="kwrd">return</span>;
            }

            <span class="rem">//ボタン各種有効、無効</span>
            <span class="kwrd">this</span>.radioButton1.Enabled = <span class="kwrd">false</span>;
            <span class="kwrd">this</span>.radioButton2.Enabled = <span class="kwrd">false</span>;

            <span class="kwrd">this</span>.comboBox1.Enabled = <span class="kwrd">false</span>;

            <span class="kwrd">this</span>.button1.Enabled = <span class="kwrd">false</span>;
            <span class="kwrd">this</span>.button2.Enabled = <span class="kwrd">true</span>;
            <span class="kwrd">this</span>.button3.Enabled = <span class="kwrd">true</span>;

            <span class="rem">//タイマー</span>
            <span class="kwrd">this</span>.timer.Interval = 1000;
            <span class="kwrd">this</span>.timer.Tick += <span class="kwrd">new</span> EventHandler(timer_Tick);
            <span class="kwrd">this</span>.timer.Start();
        }

        <span class="rem">//VFDからの返答</span>
        <span class="kwrd">void</span> serialPort_DataReceived(<span class="kwrd">object</span> sender, SerialDataReceivedEventArgs e)
        {
            <span class="kwrd">byte</span>[] byteRcv = <span class="kwrd">new</span> <span class="kwrd">byte</span>[7];
            <span class="kwrd">if</span> (<span class="kwrd">this</span>.serialPort.BytesToRead &gt;= 7)<span class="rem">//7バイト以上バッファが溜まったら</span>
            {
                <span class="kwrd">this</span>.serialPort.Read(byteRcv, 0, 7);<span class="rem">//7バイトづつ読み込む</span>

                <span class="kwrd">if</span> (byteRcv[2] == 0xC0)<span class="rem">//スクロール停止中なら</span>
                {
                    <span class="kwrd">string</span> sendMessage = <span class="str">""</span>;

                    XmlReader reader = XmlReader.Create(<span class="kwrd">this</span>.listBox1.Items[<span class="kwrd">this</span>.listBox1.SelectedIndex] <span class="kwrd">as</span> String);
                    XmlDocument xd = <span class="kwrd">new</span> XmlDocument();
                    xd.Load(reader);
                    XmlNodeList Nodes = xd.GetElementsByTagName(<span class="str">"title"</span>);

                    <span class="kwrd">for</span> (<span class="kwrd">int</span> i = 1; i &lt; Nodes.Count; i++)<span class="rem">//サイト名を表示する場合はi = 0から</span>
                    {
                        <span class="kwrd">if</span> (i &gt; 10) <span class="kwrd">break</span>;<span class="rem">//10個以上は表示しない</span>
                        sendMessage = sendMessage + <span class="str">"  "</span> + Nodes[i].InnerXml;
                    }
                    <span class="kwrd">this</span>.send_Message(sendMessage);


                    <span class="rem">//次に表示するアイテムを変更</span>
                    <span class="kwrd">if</span> (<span class="kwrd">this</span>.listBox1.SelectedIndex == <span class="kwrd">this</span>.listBox1.Items.Count - 1)
                    {
                        <span class="kwrd">this</span>.listBox1.SelectedIndex = 0;<span class="rem">//最初から</span>
                    }<span class="kwrd">else</span>{
                        <span class="kwrd">this</span>.listBox1.SelectedIndex++;
                    }
                }
            }
        }

        <span class="rem">//切断</span>
        <span class="kwrd">private</span> <span class="kwrd">void</span> button2_Click(<span class="kwrd">object</span> sender, EventArgs e)
        {
            <span class="rem">//ポートクローズ</span>
            <span class="kwrd">this</span>.serialPort.Close();

            <span class="rem">//ボタン各種有効、無効</span>
            <span class="kwrd">this</span>.radioButton1.Enabled = <span class="kwrd">true</span>;
            <span class="kwrd">this</span>.radioButton2.Enabled = <span class="kwrd">true</span>;
            <span class="kwrd">this</span>.comboBox1.Enabled = <span class="kwrd">true</span>;

            <span class="kwrd">this</span>.button1.Enabled = <span class="kwrd">true</span>;
            <span class="kwrd">this</span>.button2.Enabled = <span class="kwrd">false</span>;

            <span class="rem">//タイマ-ストップ</span>
            <span class="kwrd">this</span>.timer.Stop();
        }

        <span class="rem">//コマンドフレーム送信</span>
        <span class="kwrd">private</span> <span class="kwrd">void</span> send_commandFrame(<span class="kwrd">byte</span> command, <span class="kwrd">byte</span> frame)
        {
            <span class="kwrd">byte</span>[] send = <span class="kwrd">new</span> <span class="kwrd">byte</span>[7];
            <span class="kwrd">byte</span>[] byteSum = <span class="kwrd">new</span> <span class="kwrd">byte</span>[2];
            send[2] = command;
            send[3] = frame;

            <span class="kwrd">int</span> nSum = send[0] + send[1] + send[2] + send[3];

            byteSum = BitConverter.GetBytes(nSum);

            send[4] = byteSum[1];
            send[5] = byteSum[0];

            send[6] = 0xEF;
            <span class="kwrd">if</span> (<span class="kwrd">this</span>.serialPort.IsOpen == <span class="kwrd">true</span>)
            {
                <span class="kwrd">try</span>
                {
                    <span class="kwrd">this</span>.serialPort.Write(send, 0, send.Length);
                }
                <span class="kwrd">catch</span> (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                }
            }
        }

        <span class="rem">//テキスト送信</span>
        <span class="kwrd">private</span> <span class="kwrd">void</span> send_Message(String message)
        {
            <span class="kwrd">byte</span>[] sendMessage = <span class="kwrd">new</span> <span class="kwrd">byte</span>[256];

            <span class="rem">//シフトjis-&gt;jis</span>
            <span class="kwrd">byte</span>[] byteMessage = Encoding.GetEncoding(50220).GetBytes(message);
            <span class="rem">//jis-&gt;vfd漢字ロムコード</span>
            <span class="kwrd">byte</span>[] vfdCode = toVFDCode(byteMessage);

            <span class="kwrd">int</span> nFrame = vfdCode.Length / 256 + 1;

            <span class="kwrd">if</span> (vfdCode.Length &gt; 4096)
            {
                Console.WriteLine(<span class="str">"エラー：文字数オーバー"</span>);
                <span class="kwrd">return</span>;
            }

            <span class="kwrd">this</span>.send_commandFrame(0x04, (<span class="kwrd">byte</span>)nFrame);

            <span class="rem">//FFHで埋める</span>
            <span class="kwrd">for</span> (<span class="kwrd">int</span> i = 0; i &lt; 256; i++)
            {
                sendMessage[i] = 0xff;
            }

            <span class="kwrd">int</span> frameCount = 0;
            <span class="kwrd">int</span> byteCount = 0;

            <span class="kwrd">for</span> (<span class="kwrd">int</span> i = 0; i &lt; vfdCode.Length; i++)
            {
                sendMessage[byteCount] = vfdCode[i];

                byteCount++;
                <span class="kwrd">if</span> (byteCount == 256 || i == vfdCode.Length - 1)
                {
                    frameCount++;
                    byteCount = 0;

                    <span class="kwrd">this</span>.send_dataFrame(sendMessage, (<span class="kwrd">byte</span>)frameCount);

                    <span class="rem">//FFHで埋める</span>
                    <span class="kwrd">for</span> (<span class="kwrd">int</span> j = 0; j &lt; 256; j++)
                    {
                        sendMessage[j] = 0xff;
                    }
                }
            }
        }

        <span class="rem">//データフレーム送信</span>
        <span class="kwrd">private</span> <span class="kwrd">void</span> send_dataFrame(<span class="kwrd">byte</span>[] message, <span class="kwrd">byte</span> frame)
        {
            <span class="kwrd">byte</span>[] send = <span class="kwrd">new</span> <span class="kwrd">byte</span>[262];
            <span class="kwrd">byte</span>[] byteSum = <span class="kwrd">new</span> <span class="kwrd">byte</span>[2];

            <span class="rem">//アドレス</span>
            send[0] = 0x00;
            <span class="rem">//フレーム番号</span>
            send[1] = frame;
            <span class="rem">//コマンド</span>
            send[2] = 0x00;

            <span class="rem">//メッセージ</span>
            <span class="kwrd">for</span> (<span class="kwrd">int</span> i = 3; i &lt; 256 + 3; i++)
            {
                send[i] = message[i - 3];
            }

            <span class="rem">//サム計算</span>
            <span class="kwrd">int</span> nSum = 0;
            <span class="kwrd">for</span> (<span class="kwrd">int</span> i = 0; i &lt; 256 + 3; i++)
            {
                nSum += send[i];
            }

            byteSum = BitConverter.GetBytes(nSum);

            <span class="rem">//SUM</span>
            send[259] = byteSum[1];
            send[260] = byteSum[0];

            <span class="rem">//END</span>
            send[261] = 0xEF;
            <span class="kwrd">if</span> (<span class="kwrd">this</span>.serialPort.IsOpen == <span class="kwrd">true</span>)
            {
                <span class="kwrd">this</span>.serialPort.Write(send, 0, send.Length);
            }
        }

        <span class="rem">//文字コード変換 jis-&gt;VFD独自コード</span>
        <span class="kwrd">private</span> <span class="kwrd">byte</span>[] toVFDCode(<span class="kwrd">byte</span>[] jisCode)
        {
            ArrayList arrayVFDCode = <span class="kwrd">new</span> ArrayList();
            <span class="kwrd">byte</span>[] byteVFDCode;
            Boolean isAscii = <span class="kwrd">true</span>;
            <span class="kwrd">for</span> (<span class="kwrd">int</span> i = 0; i &lt; jisCode.Length; i++)
            {
                <span class="rem">//アスキー、jis切り替え</span>
                <span class="kwrd">if</span> (jisCode.Length - i &gt;= 2)
                {
                    <span class="kwrd">if</span> (jisCode[i] == 0x1b &amp;&amp; jisCode[i + 1] == 0x24 &amp;&amp; jisCode[i + 2] == 0x42)
                    {
                        isAscii = <span class="kwrd">false</span>;
                        i += 2;
                        <span class="kwrd">continue</span>;
                    }
                    <span class="kwrd">else</span> <span class="kwrd">if</span> (jisCode[i] == 0x1b &amp;&amp; jisCode[i + 1] == 0x28 &amp;&amp; jisCode[i + 2] == 0x42)
                    {
                        isAscii = <span class="kwrd">true</span>;
                        i += 2;
                        <span class="kwrd">continue</span>;
                    }
                }

                <span class="kwrd">if</span> (isAscii)
                {
                    <span class="rem">//アスキーコード</span>
                    <span class="kwrd">short</span> tmp1, tmp2;
                    tmp1 = jisCode[i];
                    tmp2 = (<span class="kwrd">short</span>)(tmp1 &amp; 0xE0);
                    tmp2 = (<span class="kwrd">short</span>)(tmp2 &gt;&gt; 5);
                    tmp2--;
                    tmp2 = (<span class="kwrd">short</span>)(tmp2 &lt;&lt; 7);

                    tmp1 = (<span class="kwrd">short</span>)(tmp1 &amp; 0x1f);
                    tmp2 = (<span class="kwrd">short</span>)(tmp2 | tmp1);

                    tmp2 = (<span class="kwrd">short</span>)(tmp2 | 0x4000);
                    tmp1 = (<span class="kwrd">short</span>)(tmp2 &amp; 0x00FF);
                    tmp2 = (<span class="kwrd">short</span>)(tmp2 &gt;&gt; 8);
                    arrayVFDCode.Add((<span class="kwrd">byte</span>)tmp1);
                    arrayVFDCode.Add((<span class="kwrd">byte</span>)tmp2);
                }
                <span class="kwrd">else</span>
                {
                    <span class="kwrd">short</span> tmp1 = jisCode[i], tmp2 = jisCode[i + 1], tmp4 = 0;
                    <span class="kwrd">int</span> flag = jisCode[i] &gt;&gt; 4;
                    <span class="kwrd">switch</span> (flag)
                    {
                        <span class="kwrd">case</span> 2:
                            <span class="rem">//非漢字                            </span>
                            tmp1 = (<span class="kwrd">short</span>)(tmp1 &amp; 0x7F);
                            tmp4 = (<span class="kwrd">short</span>)(tmp1 &amp; 0x7);
                            tmp1 = (<span class="kwrd">short</span>)(tmp2 &gt;&gt; 2);
                            tmp1 = (<span class="kwrd">short</span>)(tmp1 &amp; 0x18);
                            tmp1 = (<span class="kwrd">short</span>)(tmp1 | tmp4);
                            tmp1 = (<span class="kwrd">short</span>)(tmp1 &lt;&lt; 7);
                            tmp1 = (<span class="kwrd">short</span>)(tmp1 &amp; 0xF9F);

                            tmp2 = (<span class="kwrd">short</span>)(tmp2 &amp; 0x1F);
                            tmp2 = (<span class="kwrd">short</span>)(tmp2 | tmp1);
                            tmp2 = (<span class="kwrd">short</span>)(tmp2 &amp; 0xFFF);
                            <span class="kwrd">break</span>;
                        <span class="kwrd">case</span> 3:
                        <span class="kwrd">case</span> 4:
                            <span class="rem">//3:漢字第一水準1   4:漢字第一水準2</span>
                            tmp1 = (<span class="kwrd">short</span>)(tmp1 &amp; 0x7F);
                            tmp4 = (<span class="kwrd">short</span>)(tmp1 &amp; 0xF);
                            tmp1 = (<span class="kwrd">short</span>)(tmp1 &gt;&gt; 2);
                            tmp1 = (<span class="kwrd">short</span>)(tmp1 &amp; 0x30);
                            tmp1 = (<span class="kwrd">short</span>)(tmp1 | tmp4);
                            tmp1 = (<span class="kwrd">short</span>)(tmp1 &lt;&lt; 7);

                            tmp2 = (<span class="kwrd">short</span>)(tmp2 &amp; 0x7F);
                            tmp2 = (<span class="kwrd">short</span>)(tmp2 | tmp1);
                            tmp2 = (<span class="kwrd">short</span>)(tmp2 &amp; 0xFFF);
                            <span class="kwrd">break</span>;
                        <span class="kwrd">case</span> 5:
                        <span class="kwrd">case</span> 6:
                            <span class="rem">//5:漢字第二水準1   6:漢字第二水準2</span>
                            tmp1 = (<span class="kwrd">short</span>)(tmp1 &amp; 0x7F);
                            tmp4 = (<span class="kwrd">short</span>)(tmp1 &amp; 0xF);
                            tmp1 = (<span class="kwrd">short</span>)(tmp1 &gt;&gt; 1);
                            tmp1 = (<span class="kwrd">short</span>)(tmp1 &amp; 0x10);
                            tmp1 = (<span class="kwrd">short</span>)(tmp1 | tmp4);
                            tmp1 = (<span class="kwrd">short</span>)(tmp1 &lt;&lt; 7);

                            tmp2 = (<span class="kwrd">short</span>)(tmp2 &amp; 0x7F);
                            tmp2 = (<span class="kwrd">short</span>)(tmp2 | tmp1);
                            tmp2 = (<span class="kwrd">short</span>)(tmp2 | 0x1000);
                            <span class="kwrd">break</span>;
                        <span class="kwrd">case</span> 7:
                            <span class="rem">//漢字第二水準3</span>
                            tmp1 = (<span class="kwrd">short</span>)(tmp1 &amp; 0x7F);
                            tmp4 = (<span class="kwrd">short</span>)(tmp1 &amp; 0x7);
                            tmp1 = (<span class="kwrd">short</span>)(tmp2 &gt;&gt; 2);
                            tmp1 = (<span class="kwrd">short</span>)(tmp1 &amp; 0x18);
                            tmp1 = (<span class="kwrd">short</span>)(tmp1 | tmp4);
                            tmp1 = (<span class="kwrd">short</span>)(tmp1 &lt;&lt; 7);

                            tmp2 = (<span class="kwrd">short</span>)(tmp2 &amp; 0x1F);
                            tmp2 = (<span class="kwrd">short</span>)(tmp2 | tmp1);
                            tmp2 = (<span class="kwrd">short</span>)(tmp2 | 0x1000);
                            <span class="kwrd">break</span>;
                        <span class="kwrd">default</span>:
                            <span class="rem">//その他</span>
                            <span class="rem">//スルー</span>
                            <span class="kwrd">continue</span>;
                    }

                    tmp1 = (<span class="kwrd">short</span>)(tmp2 &amp; 0x00ff);
                    tmp2 = (<span class="kwrd">short</span>)(tmp2 &gt;&gt; 8);

                    <span class="rem">//リストに追加</span>
                    arrayVFDCode.Add((<span class="kwrd">byte</span>)tmp1);
                    arrayVFDCode.Add((<span class="kwrd">byte</span>)tmp2);

                    <span class="rem">//2バイト分進めるために、先に+1しておく</span>
                    i++;
                }
            }
            byteVFDCode = <span class="kwrd">new</span> <span class="kwrd">byte</span>[arrayVFDCode.Count];
            <span class="kwrd">for</span> (<span class="kwrd">int</span> i = 0; i &lt; arrayVFDCode.Count; i++)
            {
                byteVFDCode[i] = (<span class="kwrd">byte</span>)arrayVFDCode[i];
            }

            <span class="kwrd">return</span> byteVFDCode;
        }

        <span class="rem">//ラジオボタン</span>
        <span class="kwrd">private</span> <span class="kwrd">void</span> radioButton1_CheckedChanged(<span class="kwrd">object</span> sender, EventArgs e)
        {
            <span class="kwrd">this</span>.is58 = <span class="kwrd">false</span>;
        }

        <span class="rem">//ラジオボタン</span>
        <span class="kwrd">private</span> <span class="kwrd">void</span> radioButton2_CheckedChanged(<span class="kwrd">object</span> sender, EventArgs e)
        {
            <span class="kwrd">this</span>.is58 = <span class="kwrd">true</span>;
        }

        <span class="rem">//巡回リスト追加</span>
        <span class="kwrd">private</span> <span class="kwrd">void</span> button3_Click(<span class="kwrd">object</span> sender, EventArgs e)
        {
            <span class="kwrd">this</span>.listBox1.Items.Add(textBox1.Text);
            <span class="kwrd">this</span>.textBox1.Text = <span class="str">""</span>;<span class="rem">//テキストボックスクリア</span>
        }

        <span class="rem">//タイマーイベント</span>
        <span class="kwrd">void</span> timer_Tick(<span class="kwrd">object</span> sender, EventArgs e)
        {
            <span class="kwrd">this</span>.send_commandFrame(0x1c, 0x00);<span class="rem">//スクロール中かどうか判断する</span>
        }
    }
}
</pre>

<br /><br /><h6 id="page-title-date">実行</h6>
1　VFDに電源を入れ、PCに繋ぎます。<br />
2　F5ボタンを押し、プログラムを実行します。<br />
3　GP1022かGP1058、自分が使用しているVFDの型番を選択します。<br />
4　VFDが接続されているCOMポートを選び、接続ボタンを押します。<br /><br />
<img src="http://www.kosaka-lab.com/tips/vfd/02_02.jpg" /><br /><br />
5　小坂研究室のニュース一覧がVFDに表示されます。最後まで表示するとまた最初から表示しなおします。<br />
6　「http://twitter.com/search.atom=%23okachan_sorry」をテキストボックスに貼り付け、追加ボタンをおします<br /><br /><br />
<img src="http://www.kosaka-lab.com/tips/vfd/02_03.jpg" /><br /><br /><br />
<img src="http://www.kosaka-lab.com/tips/vfd/02_04.jpg" /><br /><br /><br />
7　小坂研究室のニュース表示が終わると、Twitterハッシュタグ#okachan_sorryの一覧を表示し始めます。<br /><br /><br />
<img src="http://www.kosaka-lab.com/tips/vfd/02_05.jpg" /><br /><br /><br />
8　Twitterの表示が終わると、また小坂研究室のニュース表示を開始します。<br />
9　切断を押して終了します。<br /><br /><h6 id="page-title-date">解説</h6>VFDにRSSの文字を表示します。<br /><br />
タイマ<br /> 
接続ボタンを押すと、1秒間隔でタイマ割り込みを発生させます<br />
<br />
<font color="red">
this.timer.Interval = 1000;<br />
this.timer.Tick += new EventHandler(timer_Tick);<br />
this.timer.Start();</font><br />
<br />
また、シリアルVFDからデータを受信すると、割り込みを発生させるようにします。<br />
<font color="red">this.serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);</font><br />
<br />
タイマ割り込みが入ると、コマンド0x1Cを送信します。<br />
コマンド0x1CはVFDの表示動作を確認するコマンドです。<br />
スクロール中であればVFDから0xC2,スクロール停止中ならC0が送られてきます<br />
<br />
<b>コマンド応答</b><br />
<br />
VFDから送られてくる応答フレームは<br />
<br />
<img src="http://www.kosaka-lab.com/tips/vfd/02_07.jpg" /><br />
<br />
のような構成になっています。<br />
バッファが7バイト以上溜まったら、7バイトづつ読み込んで、3バイト目をチェックしています<br />
<font color="red">
void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)<br />
{<br />
　byte[] byteRcv = new byte[7];<br />
　if (this.serialPort.BytesToRead &gt;= 7)//7バイト以上バッファが溜まったら<br />
　{<br />
　　this.serialPort.Read(byteRcv, 0, 7);//7バイトづつ読み込む<br />
<br />
　　if (byteRcv[2] == 0xC0)//スクロール停止中なら</font><br />
<br />
XML<br />
選択されているlistBoxのURLをXMLとして読み込みます<br />
<br />
<font color="red">
XmlReader reader = XmlReader.Create(this.listBox1.Items[this.listBox1.SelectedIndex] as String);<br />
XmlDocument xd = new XmlDocument();<br />
xd.Load(reader);</font><br />
<br />
XML内の&lt;title&gt;タグ内で囲まれた項目をリストアップしています<br />
<font color="red">XmlNodeList Nodes = xd.GetElementsByTagName("title");</font><br />
<br />
XMLの項目を１つのStringに格納して、表示します<br />
<font color="red">for (int i = 1; i &lt; Nodes.Count; i++)//サイト名を表示する場合はi = 0から<br />
{<br />
　if (i &gt; 10) break;//10個以上は表示しない<br />
　sendMessage = sendMessage + "  " + Nodes[i].InnerXml;<br />
}<br />
this.send_Message(sendMessage);
</font>]]>
        
    </content>
</entry>

<entry>
    <title>秋月VFD 文字表示</title>
    <link rel="alternate" type="text/html" href="http://www.kosaka-lab.com/tips/2010/06/vfd-1.php" />
    <id>tag:www.kosaka-lab.com,2010:/tips//11.703</id>

    <published>2010-06-27T09:42:37Z</published>
    <updated>2010-06-27T13:51:28Z</updated>

    <summary>秋月VFDで文字表示を行うプログラムを作成します。  1.プロジェクトの作成 V...</summary>
    <author>
        <name>笹山裕輔</name>
        
    </author>
    
        <category term="秋月VFD" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.kosaka-lab.com/tips/">
        <![CDATA[秋月VFDで文字表示を行うプログラムを作成します。<br /><br /> 

<h6 id="page-title-date">1.プロジェクトの作成</h6>
Visual C#で「VFDTest」というWindowsフォームアプリケーションの新規プロジェクトを作成します。<br />
<h6 id="page-title-date">2.フォームの作成</h6>フォーム上に、以下のようにコントロールを配置します<br /><img src="http://www.kosaka-lab.com/tips/vfd/01_01.jpg" /><br /><br /><br />フォーム、ラジオボタン、ボタンをダブルクリックし、イベントを登録します<br /><br /><br /><img src="http://www.kosaka-lab.com/tips/vfd/01_02.jpg" /><br />

<h6 id="page-title-date">3.文字表示プログラム</h6>form1.csに以下のプログラムを貼り付けます<br />
<!-- code formatted by http://manoli.net/csharpformat/ -->
<pre class="csharpcode"><span class="kwrd">using</span> System;
<span class="kwrd">using</span> System.Collections.Generic;
<span class="kwrd">using</span> System.ComponentModel;
<span class="kwrd">using</span> System.Data;
<span class="kwrd">using</span> System.Drawing;
<span class="kwrd">using</span> System.Linq;
<span class="kwrd">using</span> System.Text;
<span class="kwrd">using</span> System.Windows.Forms;
<span class="kwrd">using</span> System.IO.Ports;
<span class="kwrd">using</span> System.Collections;

<span class="kwrd">namespace</span> VFDTest
{
    <span class="kwrd">public</span> <span class="kwrd">partial</span> <span class="kwrd">class</span> Form1 : Form
    {
        <span class="kwrd">private</span> SerialPort serialPort = <span class="kwrd">new</span> SerialPort();
        <span class="kwrd">private</span> Boolean is58 = <span class="kwrd">false</span>;
        <span class="kwrd">public</span> Form1()
        {
            InitializeComponent();
            <span class="kwrd">this</span>.serialPort = <span class="kwrd">new</span> SerialPort();
        }

        <span class="rem">//フォームロード</span>
        <span class="kwrd">private</span> <span class="kwrd">void</span> Form1_Load(<span class="kwrd">object</span> sender, EventArgs e)
        {
            <span class="kwrd">this</span>.comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;

            <span class="kwrd">string</span>[] ports = SerialPort.GetPortNames();

            <span class="kwrd">foreach</span> (<span class="kwrd">string</span> port <span class="kwrd">in</span> ports)
            {
                <span class="kwrd">this</span>.comboBox1.Items.Add(port);
            }

            <span class="kwrd">this</span>.comboBox1.SelectedIndex = 0;

            <span class="rem">//ラジオボタン</span>
            <span class="kwrd">this</span>.radioButton1.Checked = <span class="kwrd">true</span>;
            <span class="kwrd">this</span>.is58 = <span class="kwrd">false</span>;

            <span class="kwrd">this</span>.button2.Enabled = <span class="kwrd">false</span>;
            <span class="kwrd">this</span>.button3.Enabled = <span class="kwrd">false</span>;
        }

        <span class="rem">//接続</span>
        <span class="kwrd">private</span> <span class="kwrd">void</span> button1_Click(<span class="kwrd">object</span> sender, EventArgs e)
        {
            <span class="kwrd">try</span>
            {
                <span class="kwrd">this</span>.serialPort.BaudRate = 19200;<span class="rem">//通信速度 19200bps</span>
                <span class="kwrd">this</span>.serialPort.PortName = (<span class="kwrd">string</span>)<span class="kwrd">this</span>.comboBox1.SelectedItem;<span class="rem">//ポート番号はコンボボックスから選択</span>
                <span class="kwrd">this</span>.serialPort.Open();<span class="rem">//ポートオープン</span>

                <span class="rem">//GP1058の場合</span>
                <span class="kwrd">if</span> (<span class="kwrd">this</span>.is58 == <span class="kwrd">true</span>)
                {
                    <span class="rem">//画素数336x24</span>
                    <span class="kwrd">this</span>.send_commandFrame(0x25, 0x00);
                }
            }
            <span class="kwrd">catch</span> (Exception ex)
            {
                <span class="rem">//ポートオープンに失敗</span>
                MessageBox.Show(ex.ToString());
                <span class="kwrd">return</span>;
            }

            <span class="rem">//ボタン各種有効、無効</span>
            <span class="kwrd">this</span>.radioButton1.Enabled = <span class="kwrd">false</span>;
            <span class="kwrd">this</span>.radioButton2.Enabled = <span class="kwrd">false</span>;

            <span class="kwrd">this</span>.comboBox1.Enabled = <span class="kwrd">false</span>;

            <span class="kwrd">this</span>.button1.Enabled = <span class="kwrd">false</span>;
            <span class="kwrd">this</span>.button2.Enabled = <span class="kwrd">true</span>;
            <span class="kwrd">this</span>.button3.Enabled = <span class="kwrd">true</span>;
        }


        <span class="rem">//切断</span>
        <span class="kwrd">private</span> <span class="kwrd">void</span> button2_Click(<span class="kwrd">object</span> sender, EventArgs e)
        {
            <span class="rem">//ポートクローズ</span>
            <span class="kwrd">this</span>.serialPort.Close();

            <span class="rem">//ボタン各種有効、無効</span>
            <span class="kwrd">this</span>.radioButton1.Enabled = <span class="kwrd">true</span>;
            <span class="kwrd">this</span>.radioButton2.Enabled = <span class="kwrd">true</span>;
            <span class="kwrd">this</span>.comboBox1.Enabled = <span class="kwrd">true</span>;

            <span class="kwrd">this</span>.button1.Enabled = <span class="kwrd">true</span>;
            <span class="kwrd">this</span>.button2.Enabled = <span class="kwrd">false</span>;
        }

        <span class="rem">//コマンドフレーム送信</span>
        <span class="kwrd">private</span> <span class="kwrd">void</span> send_commandFrame(<span class="kwrd">byte</span> command, <span class="kwrd">byte</span> frame)
        {
            <span class="kwrd">byte</span>[] send = <span class="kwrd">new</span> <span class="kwrd">byte</span>[7];
            <span class="kwrd">byte</span>[] byteSum = <span class="kwrd">new</span> <span class="kwrd">byte</span>[2];
            send[2] = command;
            send[3] = frame;

            <span class="kwrd">int</span> nSum = send[0] + send[1] + send[2] + send[3];

            byteSum = BitConverter.GetBytes(nSum);

            send[4] = byteSum[1];
            send[5] = byteSum[0];

            send[6] = 0xEF;
            <span class="kwrd">if</span> (<span class="kwrd">this</span>.serialPort.IsOpen == <span class="kwrd">true</span>)
            {
                <span class="kwrd">try</span>
                {
                    <span class="kwrd">this</span>.serialPort.Write(send, 0, send.Length);
                }
                <span class="kwrd">catch</span> (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                }
            }
        }

        <span class="rem">//テキスト送信</span>
        <span class="kwrd">private</span> <span class="kwrd">void</span> send_Message(String message)
        {
            <span class="kwrd">byte</span>[] sendMessage = <span class="kwrd">new</span> <span class="kwrd">byte</span>[256];

            <span class="rem">//シフトjis-&gt;jis</span>
            <span class="kwrd">byte</span>[] byteMessage = Encoding.GetEncoding(50220).GetBytes(message);
            <span class="rem">//jis-&gt;vfd漢字ロムコード</span>
            <span class="kwrd">byte</span>[] vfdCode = toVFDCode(byteMessage);

            <span class="kwrd">int</span> nFrame = vfdCode.Length / 256 + 1;

            <span class="kwrd">if</span> (vfdCode.Length &gt; 4096)
            {
                MessageBox.Show(<span class="str">"エラー：文字数オーバー"</span>);
                <span class="kwrd">return</span>;
            }

            <span class="kwrd">this</span>.send_commandFrame(0x04, (<span class="kwrd">byte</span>)nFrame);

            <span class="rem">//FFHで埋める</span>
            <span class="kwrd">for</span> (<span class="kwrd">int</span> i = 0; i &lt; 256; i++)
            {
                sendMessage[i] = 0xff;
            }

            <span class="kwrd">int</span> frameCount = 0;
            <span class="kwrd">int</span> byteCount = 0;

            <span class="kwrd">for</span> (<span class="kwrd">int</span> i = 0; i &lt; vfdCode.Length; i++)
            {
                sendMessage[byteCount] = vfdCode[i];

                byteCount++;
                <span class="kwrd">if</span> (byteCount == 256 || i == vfdCode.Length - 1)
                {
                    frameCount++;
                    byteCount = 0;

                    <span class="kwrd">this</span>.send_dataFrame(sendMessage, (<span class="kwrd">byte</span>)frameCount);

                    <span class="rem">//FFHで埋める</span>
                    <span class="kwrd">for</span> (<span class="kwrd">int</span> j = 0; j &lt; 256; j++)
                    {
                        sendMessage[j] = 0xff;
                    }
                }
            }
        }

        <span class="rem">//データフレーム送信</span>
        <span class="kwrd">private</span> <span class="kwrd">void</span> send_dataFrame(<span class="kwrd">byte</span>[] message, <span class="kwrd">byte</span> frame)
        {
            <span class="kwrd">byte</span>[] send = <span class="kwrd">new</span> <span class="kwrd">byte</span>[262];
            <span class="kwrd">byte</span>[] byteSum = <span class="kwrd">new</span> <span class="kwrd">byte</span>[2];

            <span class="rem">//アドレス</span>
            send[0] = 0x00;
            <span class="rem">//フレーム番号</span>
            send[1] = frame;
            <span class="rem">//コマンド</span>
            send[2] = 0x00;

            <span class="rem">//メッセージ</span>
            <span class="kwrd">for</span> (<span class="kwrd">int</span> i = 3; i &lt; 256 + 3; i++)
            {
                send[i] = message[i - 3];
            }

            <span class="rem">//サム計算</span>
            <span class="kwrd">int</span> nSum = 0;
            <span class="kwrd">for</span> (<span class="kwrd">int</span> i = 0; i &lt; 256 + 3; i++)
            {
                nSum += send[i];
            }

            byteSum = BitConverter.GetBytes(nSum);

            <span class="rem">//SUM</span>
            send[259] = byteSum[1];
            send[260] = byteSum[0];

            <span class="rem">//END</span>
            send[261] = 0xEF;
            <span class="kwrd">if</span> (<span class="kwrd">this</span>.serialPort.IsOpen == <span class="kwrd">true</span>)
            {
                <span class="kwrd">this</span>.serialPort.Write(send, 0, send.Length);
            }
        }

        <span class="rem">//文字コード変換 jis-&gt;VFD独自コード</span>
        <span class="kwrd">private</span> <span class="kwrd">byte</span>[] toVFDCode(<span class="kwrd">byte</span>[] jisCode)
        {
            ArrayList arrayVFDCode = <span class="kwrd">new</span> ArrayList();
            <span class="kwrd">byte</span>[] byteVFDCode;
            Boolean isAscii = <span class="kwrd">true</span>;
            <span class="kwrd">for</span> (<span class="kwrd">int</span> i = 0; i &lt; jisCode.Length; i++)
            {
                <span class="rem">//アスキー、jis切り替え</span>
                <span class="kwrd">if</span> (jisCode.Length - i &gt;= 2)
                {
                    <span class="kwrd">if</span> (jisCode[i] == 0x1b &amp;&amp; jisCode[i + 1] == 0x24 &amp;&amp; jisCode[i + 2] == 0x42)
                    {
                        isAscii = <span class="kwrd">false</span>;
                        i += 2;
                        <span class="kwrd">continue</span>;
                    }
                    <span class="kwrd">else</span> <span class="kwrd">if</span> (jisCode[i] == 0x1b &amp;&amp; jisCode[i + 1] == 0x28 &amp;&amp; jisCode[i + 2] == 0x42)
                    {
                        isAscii = <span class="kwrd">true</span>;
                        i += 2;
                        <span class="kwrd">continue</span>;
                    }
                }

                <span class="kwrd">if</span> (isAscii)
                {
                    <span class="rem">//アスキーコード</span>
                    <span class="kwrd">short</span> tmp1, tmp2;
                    tmp1 = jisCode[i];
                    tmp2 = (<span class="kwrd">short</span>)(tmp1 &amp; 0xE0);
                    tmp2 = (<span class="kwrd">short</span>)(tmp2 &gt;&gt; 5);
                    tmp2--;
                    tmp2 = (<span class="kwrd">short</span>)(tmp2 &lt;&lt; 7);
                    tmp1 = (<span class="kwrd">short</span>)(tmp1 &amp; 0x1f);
                    tmp2 = (<span class="kwrd">short</span>)(tmp2 | tmp1);
                    tmp2 = (<span class="kwrd">short</span>)(tmp2 | 0x4000);
                    tmp1 = (<span class="kwrd">short</span>)(tmp2 &amp; 0x00FF);
                    tmp2 = (<span class="kwrd">short</span>)(tmp2 &gt;&gt; 8);
                    arrayVFDCode.Add((<span class="kwrd">byte</span>)tmp1);
                    arrayVFDCode.Add((<span class="kwrd">byte</span>)tmp2);
                }
                <span class="kwrd">else</span>
                {
                    <span class="kwrd">short</span> tmp1 = jisCode[i], tmp2 = jisCode[i + 1], tmp4 = 0;
                    <span class="kwrd">int</span> flag = jisCode[i] &gt;&gt; 4;
                    <span class="kwrd">switch</span> (flag)
                    {
                        <span class="kwrd">case</span> 2:
                            <span class="rem">//非漢字                            </span>
                            tmp1 = (<span class="kwrd">short</span>)(tmp1 &amp; 0x7F);
                            tmp4 = (<span class="kwrd">short</span>)(tmp1 &amp; 0x7);
                            tmp1 = (<span class="kwrd">short</span>)(tmp2 &gt;&gt; 2);
                            tmp1 = (<span class="kwrd">short</span>)(tmp1 &amp; 0x18);
                            tmp1 = (<span class="kwrd">short</span>)(tmp1 | tmp4);
                            tmp1 = (<span class="kwrd">short</span>)(tmp1 &lt;&lt; 7);
                            tmp1 = (<span class="kwrd">short</span>)(tmp1 &amp; 0xF9F);

                            tmp2 = (<span class="kwrd">short</span>)(tmp2 &amp; 0x1F);
                            tmp2 = (<span class="kwrd">short</span>)(tmp2 | tmp1);
                            tmp2 = (<span class="kwrd">short</span>)(tmp2 &amp; 0xFFF);
                            <span class="kwrd">break</span>;
                        <span class="kwrd">case</span> 3:
                        <span class="kwrd">case</span> 4:
                            <span class="rem">//3:漢字第一水準1   4:漢字第一水準2</span>
                            tmp1 = (<span class="kwrd">short</span>)(tmp1 &amp; 0x7F);
                            tmp4 = (<span class="kwrd">short</span>)(tmp1 &amp; 0xF);
                            tmp1 = (<span class="kwrd">short</span>)(tmp1 &gt;&gt; 2);
                            tmp1 = (<span class="kwrd">short</span>)(tmp1 &amp; 0x30);
                            tmp1 = (<span class="kwrd">short</span>)(tmp1 | tmp4);
                            tmp1 = (<span class="kwrd">short</span>)(tmp1 &lt;&lt; 7);

                            tmp2 = (<span class="kwrd">short</span>)(tmp2 &amp; 0x7F);
                            tmp2 = (<span class="kwrd">short</span>)(tmp2 | tmp1);
                            tmp2 = (<span class="kwrd">short</span>)(tmp2 &amp; 0xFFF);
                            <span class="kwrd">break</span>;
                        <span class="kwrd">case</span> 5:
                        <span class="kwrd">case</span> 6:
                            <span class="rem">//5:漢字第二水準1   6:漢字第二水準2</span>
                            tmp1 = (<span class="kwrd">short</span>)(tmp1 &amp; 0x7F);
                            tmp4 = (<span class="kwrd">short</span>)(tmp1 &amp; 0xF);
                            tmp1 = (<span class="kwrd">short</span>)(tmp1 &gt;&gt; 1);
                            tmp1 = (<span class="kwrd">short</span>)(tmp1 &amp; 0x10);
                            tmp1 = (<span class="kwrd">short</span>)(tmp1 | tmp4);
                            tmp1 = (<span class="kwrd">short</span>)(tmp1 &lt;&lt; 7);

                            tmp2 = (<span class="kwrd">short</span>)(tmp2 &amp; 0x7F);
                            tmp2 = (<span class="kwrd">short</span>)(tmp2 | tmp1);
                            tmp2 = (<span class="kwrd">short</span>)(tmp2 | 0x1000);
                            <span class="kwrd">break</span>;
                        <span class="kwrd">case</span> 7:
                            <span class="rem">//漢字第二水準3</span>
                            tmp1 = (<span class="kwrd">short</span>)(tmp1 &amp; 0x7F);
                            tmp4 = (<span class="kwrd">short</span>)(tmp1 &amp; 0x7);
                            tmp1 = (<span class="kwrd">short</span>)(tmp2 &gt;&gt; 2);
                            tmp1 = (<span class="kwrd">short</span>)(tmp1 &amp; 0x18);
                            tmp1 = (<span class="kwrd">short</span>)(tmp1 | tmp4);
                            tmp1 = (<span class="kwrd">short</span>)(tmp1 &lt;&lt; 7);

                            tmp2 = (<span class="kwrd">short</span>)(tmp2 &amp; 0x1F);
                            tmp2 = (<span class="kwrd">short</span>)(tmp2 | tmp1);
                            tmp2 = (<span class="kwrd">short</span>)(tmp2 | 0x1000);
                            <span class="kwrd">break</span>;
                        <span class="kwrd">default</span>:
                            <span class="rem">//その他</span>
                            <span class="rem">//スルー</span>
                            <span class="kwrd">continue</span>;
                    }

                    tmp1 = (<span class="kwrd">short</span>)(tmp2 &amp; 0x00ff);
                    tmp2 = (<span class="kwrd">short</span>)(tmp2 &gt;&gt; 8);

                    <span class="rem">//リストに追加</span>
                    arrayVFDCode.Add((<span class="kwrd">byte</span>)tmp1);
                    arrayVFDCode.Add((<span class="kwrd">byte</span>)tmp2);

                    <span class="rem">//2バイト分進めるために、先に+1しておく</span>
                    i++;
                }
            }
            byteVFDCode = <span class="kwrd">new</span> <span class="kwrd">byte</span>[arrayVFDCode.Count];
            <span class="kwrd">for</span> (<span class="kwrd">int</span> i = 0; i &lt; arrayVFDCode.Count; i++)
            {
                byteVFDCode[i] = (<span class="kwrd">byte</span>)arrayVFDCode[i];
            }

            <span class="kwrd">return</span> byteVFDCode;
        }

        <span class="rem">//テキストメッセージ送信</span>
        <span class="kwrd">private</span> <span class="kwrd">void</span> button3_Click(<span class="kwrd">object</span> sender, EventArgs e)
        {
            <span class="kwrd">this</span>.send_Message(textBox1.Text);
            <span class="kwrd">this</span>.textBox1.Text = <span class="str">""</span>;<span class="rem">//テキストボックスクリア</span>
        }

        <span class="rem">//ラジオボタン</span>
        <span class="kwrd">private</span> <span class="kwrd">void</span> radioButton1_CheckedChanged(<span class="kwrd">object</span> sender, EventArgs e)
        {
            <span class="kwrd">this</span>.is58 = <span class="kwrd">false</span>;
        }

        <span class="rem">//ラジオボタン</span>
        <span class="kwrd">private</span> <span class="kwrd">void</span> radioButton2_CheckedChanged(<span class="kwrd">object</span> sender, EventArgs e)
        {
            <span class="kwrd">this</span>.is58 = <span class="kwrd">true</span>;
        }
    }
}
</pre>

<br />

<h6 id="page-title-date">実行</h6>
1　VFDに電源を入れ、PCに繋ぎます。<br />2　F5ボタンを押し、プログラムを実行します。<br />3　GP1022かGP1058、自分が使用しているVFDの型番を選択します。<br />4　VFDが接続されているCOMポートを選び、接続ボタンを押します。<br /><img src="http://www.kosaka-lab.com/tips/vfd/00_06.jpg" /><br /><br />5　テキストボックスに文字を入れて送信ボタンを押し、VFDに文字が表示されることを確認します。<br /><img src="http://www.kosaka-lab.com/tips/vfd/00_07.jpg" /><br /><br />6　切断ボタンを押して、終了します。
<h6 id="page-title-date">解説</h6>VFDにテキストボックスの文字を表示します。<br /><br /><br /><b>シリアルポート</b>を開きます。<br />this.serialPort.BaudRate = 19200;//通信速度 19200bps<br />this.serialPort.PortName = (string)this.comboBox1.SelectedItem;//ポート番号はコンボボックスから選択<br />this.serialPort.Open();//ポートオープン<br /><br />通信速度は19200bpsで固定です。コンボボックスで選んだシリアルポートを開きます。<br /><br /><br /><b>文字表示</b><br />秋月VFDには漢字ROMが搭載されており、日本語の表示が行えます。<br />漢字ROMコードはjisコードをベースにしたオリジナルのコードであるため、シフトJISコードからjisコードに変換した後、さらに漢字ROMオリジナルコードへ変換する必要があります。<br /><br /><font color="red">//シフトjis-&gt;jis<br />byte[] byteMessage = Encoding.GetEncoding(50220).GetBytes(message);<br />//jis-&gt;vfd漢字ロムコード<br />byte[] vfdCode = toVFDCode(byteMessage);</font><br /><br />jisから漢字ロムコードへの変換はこのメソッドで行っています。<br /><font color="red">private byte[] toVFDCode(byte[] jisCode)</font><br /><br />jisと漢字ROMコードの対応表はマニュアルの図のとおりです<br /><br /><img src="http://www.kosaka-lab.com/tips/vfd/01_03.jpg" /><br />秋月VFDへデータを送信するには、コマンドフレームとデータフレームの2種類を送信する必要があります。ここでは0x04「送信したデータを即時表示する」というコマンドを送信しています。<br /><br />実際に送信されるコマンドフレームの内容は<br /><br /><img src="http://www.kosaka-lab.com/tips/vfd/01_04.jpg" /><br /><br />の7バイトです。<br /><br /><font color="red">//アドレス<br />send[0] = 0x00;<br />//フレーム番号<br />send[1] = frame;<br />//コマンド<br />send[2] = 0x00;</font><br /><br />アドレスはDont' careとのことなので、何を入れても動作に違いはありません。<br />フレーム番号はコマンドフレームの場合、常に0x00を送信します。<br /><br />コマンドにはこれらの種類があります。<br /><br /><img src="http://www.kosaka-lab.com/tips/vfd/01_05.jpg" /><br /><br /><br /><img src="http://www.kosaka-lab.com/tips/vfd/01_06.jpg" /><br /><br />フレーム数にはこれから送信するデータフレームの総数を送信します。<br />データフレーム内のメッセージ部に入れられるデータは256バイトなので、漢字ROMコードへ変換されたバイト配列の総数からフレーム数を割り出します。<br /><br /><font color="red">int nFrame = vfdCode.Length / 256 + 1;<br />this.send_commandFrame(0x04, (byte)nFrame);</font><br /><br />SUMにはアドレスからフレーム数までのデータを合計した値を入れます。<br /><font color="red">int nSum = send[0] + send[1] + send[2] + send[3];<br />byteSum = BitConverter.GetBytes(nSum);<br />send[4] = byteSum[1];<br />send[5] = byteSum[0];</font><br />ENDは0xFEで固定です<br /><font color="red">send[6] = 0xEF;</font><br /><br />データフレームの構成はこのようになっています<br /><br /><br /><img src="http://www.kosaka-lab.com/tips/vfd/01_07.jpg" /><br /><br /><br />メッセージに、漢字ROMコードへ変換されたバイト配列を256バイトづつ入れて送信していきます。<br />フレーム番号はそのたびにカウントしていきます。<br /><br /><font color="red">//FFHで埋める<br />for (int i = 0; i &lt; 256; i++)<br />{<br />　sendMessage[i] = 0xff;<br />}<br /><br />int frameCount = 0;<br />int byteCount = 0;<br /><br />for (int i = 0; i &lt; vfdCode.Length; i++)<br />{<br />　sendMessage[byteCount] = vfdCode[i];<br /><br />　byteCount++;<br />　if (byteCount == 256 || i == vfdCode.Length - 1)<br />　{<br />　　frameCount++;<br />　　byteCount = 0;<br />　　this.send_dataFrame(sendMessage, (byte)frameCount);<br />　　//FFHで埋める<br />　　for (int j = 0; j &lt; 256; j++)<br />　　{<br />　　　sendMessage[j] = 0xff;</font><br />　　}<br />　}<br />}<br /><br />データフレームのメッセージ内には、このようなコマンドを入れることが出来ます。<br /><br /><br /><img src="http://www.kosaka-lab.com/tips/vfd/01_08.jpg" /><br /><br />しかし、今回は文字をそのまま表示するだけなので、使用しません。<br /><br /><br />
<h6 id="page-title-date">リンク</h6>とめくぎヨロズ製作所<br /><a href="http://www.harukaze.ne.jp/tomekugi/win/index.html">http://www.harukaze.ne.jp/tomekugi/win/index.html</a><br />]]>
        
    </content>
</entry>

<entry>
    <title>秋月VFDを作成する</title>
    <link rel="alternate" type="text/html" href="http://www.kosaka-lab.com/tips/2010/06/vfd.php" />
    <id>tag:www.kosaka-lab.com,2010:/tips//11.702</id>

    <published>2010-06-27T08:15:54Z</published>
    <updated>2010-06-27T09:45:01Z</updated>

    <summary>秋月で販売していた双葉電子工業製の蛍光表示管VFD(Vacuum Fluores...</summary>
    <author>
        <name>笹山裕輔</name>
        
    </author>
    
        <category term="秋月VFD" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.kosaka-lab.com/tips/">
        <![CDATA[秋月で販売していた双葉電子工業製の蛍光表示管VFD(Vacuum Fluorescent Display)を使ったプログラミングを行っていきます。<br />画素数が256*16のGP1022と336*24のGP1058のどちらにも対応しています。<br /><br /><img src="http://www.kosaka-lab.com/tips/vfd/00_01.jpg" /><br /><br /><br />なお、秋月では現在（2010年6月）VFDの販売を行っておりません。<br />別途<a href="http://www.furutaka-netsel.co.jp/maker/futaba/massege.html">こちら</a>などで入手してください。値段が10倍ほどしますが・・・<br /><br /><br />ここではまず、本体を組み立てます。<br /><br /><br /><h6 id="page-title-date">1　必要な機材を揃える</h6>必要な機材を揃えます。<br />最低限必要なものは、<br />・VFD本体<br />・5VDC電源<br />・24VDC電源<br />・RS-232Cケーブル<br /><br />が必要になります。<br /><br />その他、ソケットやDC電源用コネクタなど必要に応じて揃えます。<br /><br />今回使用した部品<br />・電源用<br />　　ソケット - <a href="https://www.marutsu.co.jp/user/shohin.php?p=45847">5195-04</a><br />　　ターミナルピン - <a href="https://www.marutsu.co.jp/user/shohin.php?p=55094">5194PBT</a><br />　　<br />・シリアル通信用<br />　　ソケット - <a href="https://www.marutsu.co.jp/user/shohin.php?p=54824">5264-06</a><br />　　ターミナルピン - <a href="https://www.marutsu.co.jp/user/shohin.php?p=59412">5263PBT</a><br />　　<br />・DCジャック - <a href="https://www.marutsu.co.jp/user/shohin.php?p=3588">MJ10</a><br />・D-SUB9 コネクタ - <a href="https://www.marutsu.co.jp/user/shohin.php?p=13955">3220DB9SSWGTE</a><br />細かな部品ですが、袋売りなので高くつくことがあります。<br />コネクタを取り外すことが無いのであれば、VFDに直接ハンダでもかまわないと思います。<br /><br /><br /><h6 id="page-title-date">2.配線</h6><br />秋月の基板上のピン配列はこのようになっています。<br /><img src="http://www.kosaka-lab.com/tips/vfd/00_02.jpg" /><br />上（CH1）が電源、下（CH2）がシリアル通信用です。<br /><br /><br /><br />電源はピンとDCジャックを繋ぎます。<br /><img src="http://www.kosaka-lab.com/tips/vfd/00_04.jpg" /><br />5Vと24Vを間違えないように注意してください。<br /><br /><br />シリアル通信用のピンは番号が合うピン同士を配線します。<br />また、D-SUBコネクタ側の4番ピン（データ端末レディ）と6番ピン（データセットレディ）を繋ぐ必要があります。<br /><img src="http://www.kosaka-lab.com/tips/vfd/00_03.jpg" /><br /><br />VFDは100V以上の高電圧が基板上にむき出しになっている部分があります。<br />危険なのでカバーを作成されることをオススメします。<br /><img src="http://www.kosaka-lab.com/tips/vfd/00_05.jpg" /><br /><br /><h6 id="page-title-date">動作テスト</h6><br /><br />配線に問題が無いことを確認してからプログラムの作成に移行したほうが、配線、プログラムどちらの問題か把握しやすいので既存のソフトで動作テストを行います。<br /><br />1　5V電源を繋ぎます。<br />2　24V電源を繋ぎます。5V、24Vの順番で電源を入れるようにしてください。<br />3　RS-232をVFD側とPC側に繋ぎます。<br />4　テストプログラムを<a href="http://www.kosaka-lab.com/tips/vfd/VFDTest.zip">ダウンロード</a>して解凍します。<br />5　VFDTest.exeを実行します。<br />6　GP1022かGP1058、自分が使用しているVFDの型番を選択します。<br />7　VFDが接続されているCOMポートを選び、接続ボタンを押します。<br /><img src="http://www.kosaka-lab.com/tips/vfd/00_06.jpg" /><br />8　テキストボックスに文字を入れて送信ボタンを押し、VFDに文字が表示されることを確認します。<br /><img src="http://www.kosaka-lab.com/tips/vfd/00_07.jpg" /><br />9　切断ボタンを押して、終了します。<br /><br /><h6 id="page-title-date">リンク</h6><br /><a href="http://plaza.rakuten.co.jp/DFLYRoom/diary/200611280001/">http://plaza.rakuten.co.jp/DFLYRoom/diary/200611280001/</a><br /><a href="http://mizupc8.bio.mie-u.ac.jp/pukiwiki/index.php?%E7%A7%8B%E6%9C%88VFD">http://mizupc8.bio.mie-u.ac.jp/pukiwiki/index.php?%E7%A7%8B%E6%9C%88VFD</a><br /> 
]]>
        
    </content>
</entry>

<entry>
    <title>バランスWiiボード(WiiFit)とWiiリモコンを同時に使う</title>
    <link rel="alternate" type="text/html" href="http://www.kosaka-lab.com/tips/2010/06/wiiwiifitwii.php" />
    <id>tag:www.kosaka-lab.com,2010:/tips//11.688</id>

    <published>2010-06-18T13:10:25Z</published>
    <updated>2010-06-18T13:21:30Z</updated>

    <summary>バランスWiiボード(WiiFit)とWiiリモコンを同時に使う方法を解説します...</summary>
    <author>
        <name>坪倉　輝明</name>
        
    </author>
    
        <category term="Wii Fit" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="wiifit" label="WiiFit" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="wiimote" label="Wiimote" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="wiimotelib" label="WiimoteLIB" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="wiiフィット" label="Wiiフィット" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.kosaka-lab.com/tips/">
        <![CDATA[バランスWiiボード(WiiFit)とWiiリモコンを同時に使う方法を解説します。<br /><a href="http://www.kosaka-lab.com/tips/2009/02/wii.php">Wiiリモコン 複数台の制御</a>の時と同じ方法を使ってWiiFitとWiiリモコンを同時に制御する事ができます。<br />WiiFitのLEDやボタンの使用方法は<a href="http://www.kosaka-lab.com/tips/2009/02/wiiwii-fit.php">前回</a>の記事を参照してください。<br /><br /><br />

<h6 id="page-title-date">1.WiiFitとWiiリモコンをBluetoothで認識させる</h6>
<blockquote>WiiFitとWiiリモコンをBluetoothでPCに接続します。<br />※スタックによっては同時に接続できないものもあるようです。</blockquote>

<h6 id="page-title-date">2.フォームの作成</h6>
<blockquote>1.前回と同じくフォームにプロジェクトを作成し、ボタンを2つフォームに貼り付けます。<br /><br />
<img src="http://www.kosaka-lab.com/tips/img/fit_led0.jpg" />
<br />
<br />2.各ボタンをダブルクリックし、ボタンクリックイベントを登録します。 </blockquote>

<h6 id="page-title-date">3.WiiFit Wiiリモコン同時制御プログラム</h6>
<!-- code formatted by http://manoli.net/csharpformat/ -->
<pre class="csharpcode"><span class="kwrd">using</span> System;
<span class="kwrd">using</span> System.Collections.Generic;
<span class="kwrd">using</span> System.ComponentModel;
<span class="kwrd">using</span> System.Data;
<span class="kwrd">using</span> System.Drawing;
<span class="kwrd">using</span> System.Linq;
<span class="kwrd">using</span> System.Text;
<span class="kwrd">using</span> System.Windows.Forms;
<span class="kwrd">using</span> WiimoteLib;                                         <span class="rem">//WimoteLibの宣言</span>


<span class="kwrd">namespace</span> WiimoteLib_Sample
{


    <span class="kwrd">public</span> <span class="kwrd">partial</span> <span class="kwrd">class</span> Form1 : Form
    {
        <span class="kwrd">public</span> <span class="kwrd">int</span> Conect = 0;                            <span class="rem">//接続数を格納</span>
        <span class="kwrd">public</span> WiimoteCollection wc = <span class="kwrd">null</span>;               <span class="rem">//WiimoteCollectionの宣言</span>
        <span class="kwrd">public</span> Boolean Button = <span class="kwrd">false</span>;　　　　　　　　　　<span class="rem">//Wiiリモコンボタン押下フラグ       </span>
        WiimoteLib.ExtensionType RemoteType = <span class="kwrd">new</span> ExtensionType();<span class="rem">//拡張コントローラータイプ</span>

        <span class="kwrd">public</span> Form1()
        {
            InitializeComponent();

            <span class="rem">//他スレッドからのコントロール呼び出し許可</span>
            Control.CheckForIllegalCrossThreadCalls = <span class="kwrd">false</span>;
            <span class="kwrd">this</span>.wc = <span class="kwrd">new</span> WiimoteLib.WiimoteCollection(); <span class="rem">//WiimoteCollectionを生成</span>

        }

        <span class="rem">//接続ボタンが押されたら</span>
        <span class="kwrd">private</span> <span class="kwrd">void</span> button1_Click(<span class="kwrd">object</span> sender, EventArgs e)
        {

            <span class="kwrd">this</span>.Conect = 0;                              <span class="rem">//接続数を初期化</span>
            <span class="kwrd">this</span>.wc.FindAllWiimotes();                    <span class="rem">//Wiiリモコン登録を調べる</span>

            <span class="kwrd">foreach</span> (WiimoteLib.Wiimote wm <span class="kwrd">in</span> wc)
            {
                <span class="rem">//Wiiリモコンが見つかった回数だけ繰り返す</span>
                <span class="kwrd">try</span>
                {
                    wm.Connect();                                          <span class="rem">//接続</span>
                    wm.SetReportType(WiimoteLib.InputReport.IRAccel, <span class="kwrd">true</span>);<span class="rem">//レポートタイプの設定</span>

                    <span class="kwrd">switch</span> (<span class="kwrd">this</span>.Conect)
                    {
                        <span class="kwrd">case</span> 0:
                            wm.WiimoteChanged += wm_WiimoteChanged_01;     <span class="rem">//イベント設定</span>
                            <span class="kwrd">break</span>;
                        <span class="kwrd">case</span> 1:
                            wm.WiimoteChanged += wm_WiimoteChanged_02;     <span class="rem">//イベント設定</span>
                            <span class="kwrd">break</span>;
                    }

                    <span class="kwrd">this</span>.Conect++;<span class="rem">//カウント++</span>
                }
                <span class="kwrd">catch</span>
                {
                }
            }
        }

        <span class="rem">//切断ボタンが押されたら</span>
        <span class="kwrd">private</span> <span class="kwrd">void</span> button2_Click(<span class="kwrd">object</span> sender, EventArgs e)
        {
            <span class="kwrd">if</span> (<span class="kwrd">this</span>.wc != <span class="kwrd">null</span>)
            {
                <span class="kwrd">foreach</span> (WiimoteLib.Wiimote wm <span class="kwrd">in</span> wc)
                {
                    <span class="rem">//Wiiリモコンが見つかった回数だけ繰り返す</span>
                    wm.Disconnect();                                           <span class="rem">//接続を切る</span>
                }
                <span class="kwrd">this</span>.wc.Clear();                                              <span class="rem">//クリア</span>
            }
        }

        <span class="rem">//Wiiリモコンの値が変化したときに呼ばれる関数</span>
        <span class="kwrd">void</span> wm_WiimoteChanged_01(<span class="kwrd">object</span> sender, WiimoteChangedEventArgs args)
        {
            <span class="rem">//WiimoteStageの値を取得</span>
            WiimoteState ws = args.WiimoteState;

            <span class="rem">//WiiFitの値を読み取る</span>
            RemoteType = ws.ExtensionType;<span class="rem">//拡張コントローラーの種類を入れる</span>

            <span class="rem">//バランスボードが接続されていて、かつボタン押下フラグがtrueなら実行</span>
            <span class="kwrd">if</span> (RemoteType == ExtensionType.BalanceBoard &amp;&amp; <span class="kwrd">this</span>.Button == <span class="kwrd">true</span>)
            {
                <span class="kwrd">this</span>.label1.Text = <span class="str">"測定中："</span> + ws.BalanceBoardState.WeightKg + <span class="str">"Kg"</span>;
            }
            <span class="kwrd">else</span>
            {
                <span class="kwrd">this</span>.label1.Text = <span class="str">"停止中"</span>;
            }
        }

        <span class="rem">//Wiiリモコンの値が変化したときに呼ばれる関数</span>
        <span class="kwrd">void</span> wm_WiimoteChanged_02(<span class="kwrd">object</span> sender, WiimoteChangedEventArgs args)
        {
            <span class="rem">//WiimoteStageの値を取得</span>
            WiimoteState ws = args.WiimoteState;

            <span class="rem">//WiiリモコンのAボタンが押されていればボタン押下フラグをtrueにする</span>
            <span class="kwrd">if</span> (ws.ButtonState.A)
            {
                <span class="kwrd">this</span>.Button = <span class="kwrd">true</span>;
            }
            <span class="kwrd">else</span>
            {
                <span class="kwrd">this</span>.Button = <span class="kwrd">false</span>;
            }
        }
    }
}</pre>
<h6 id="page-title-date">実行</h6>
<blockquote>
<p>1.WiiFit、Wiiリモコンの順に接続してください。接続の方法はWiiリモコンと同じです。</p>
<p>2.<span id="window_box">F5</span>キーを押して実行してください。<br />　　※もしエラーが発生する場合はWiiFit・Wiiリモコンが正しく接続されているか確認してください。</p>

<p>3.フォームの接続ボタンを押し、接続します。<br />
<img src="http://www.kosaka-lab.com/tips/img/fit_led1.jpg" />
</p>4.接続が成功したらラベルの表示が「停止中」に変わります。<br />この状態ではWiiFitに乗っても何も変化はありません。<br /><br />
<img src="http://www.kosaka-lab.com/tips/img/fit_mote1.jpg" />
<br /><br />5.次にWiiリモコンのAボタンを押します。<br />するとラベルの表示が「測定中：○○Kg」に変わり、重さの測定が開始されます。<br /><br />
<img src="http://www.kosaka-lab.com/tips/img/fit_mote2.jpg" />
<br /><br /><p>6.終了する際は、切断を押しフォームを閉じてください。 </p>
<h6 id="page-title-date">解説</h6>
<p>WiiリモコンのAボタンを押すことで、WiiFitの重さ測定機能をON/OFFできます。</p>
<font color="#ff0000">ws.ExtensionType</font> 
<blockquote>接続されている拡張コントローラーのタイプが取得できます。<br />WiiFitが接続されている場合は[ExtensionType.BalanceBoard]となります。<br />片方のWiiリモコンの処理の部分へWiiFitの場合だけ実行する処理を記述することで、WiiFitとWiiリモコンを同時に制御することが可能になります。<br /><br /></blockquote><font color="#ff0000">ws.BalanceBoardState.WeightKg</font> 
<blockquote>WiiFitにかかる重さをキログラムで出力します。</blockquote></blockquote>]]>
        

    </content>
</entry>

<entry>
    <title>バランスWiiボード(WiiFit)のLEDとボタンを使う</title>
    <link rel="alternate" type="text/html" href="http://www.kosaka-lab.com/tips/2010/05/wiiwiifitled.php" />
    <id>tag:www.kosaka-lab.com,2010:/tips//11.650</id>

    <published>2010-05-24T14:04:40Z</published>
    <updated>2010-05-24T14:32:16Z</updated>

    <summary>バランスWiiボード(Wii Fit)のボタンとLEDの使用方法です。重さセンサ...</summary>
    <author>
        <name>笹山裕輔</name>
        
    </author>
    
        <category term="Wii Fit" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="wiifit" label="WiiFit" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="wiimote" label="Wiimote" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="wiimotelib" label="WiimoteLIB" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="wiiフィット" label="Wiiフィット" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.kosaka-lab.com/tips/">
        <![CDATA[バランスWiiボード(Wii Fit)のボタンとLEDの使用方法です。<br />重さセンサを用いた重心や重さの計測は<a href="http://www.kosaka-lab.com/tips/2009/02/wiiwii-fit.php">前回</a>の記事を参照してください。<br /><br /><br />

<h6 id="page-title-date">1.WiimoteLibの準備</h6>
<blockquote>Wiiリモコンと同じく、<a href="http://www.kosaka-lab.com/tips/2009/01/wiimotelib.php">WiimoteLib</a>の準備を行います。</blockquote>

<h6 id="page-title-date">2.フォームの作成</h6>
<blockquote>1.WiiFitLEDというフォームプロジェクトを作成し、ボタンを2つフォームに貼り付けます。<br /><br />
<img src="http://www.kosaka-lab.com/tips/img/fit_led0.jpg" />
<br />
<br />2.各ボタンをダブルクリックし、ボタンクリックイベントを登録します。 </blockquote>

<h6 id="page-title-date">3.WiiFitLEDデモプログラム</h6>
<!-- code formatted by http://manoli.net/csharpformat/ -->
<pre class="csharpcode"><span class="kwrd">using</span> System;
<span class="kwrd">using</span> System.Collections.Generic;
<span class="kwrd">using</span> System.ComponentModel;
<span class="kwrd">using</span> System.Data;
<span class="kwrd">using</span> System.Drawing;
<span class="kwrd">using</span> System.Linq;
<span class="kwrd">using</span> System.Text;
<span class="kwrd">using</span> System.Windows.Forms;
<span class="kwrd">using</span> WiimoteLib;

<span class="kwrd">namespace</span> WiiFitLED
{
    <span class="kwrd">public</span> <span class="kwrd">partial</span> <span class="kwrd">class</span> Form1 : Form
    {
        <span class="kwrd">private</span> Wiimote wm = <span class="kwrd">new</span> Wiimote();
        <span class="kwrd">private</span> Boolean isPush;
        <span class="kwrd">private</span> Boolean isOn;

        <span class="kwrd">public</span> Form1()
        {
            InitializeComponent();
            <span class="rem">//他スレッドからのコントロール呼び出し許可</span>
            Control.CheckForIllegalCrossThreadCalls = <span class="kwrd">false</span>;

            <span class="kwrd">this</span>.button2.Enabled = <span class="kwrd">false</span>;<span class="rem">//切断ボタンを無効</span>
        }

        <span class="kwrd">private</span> <span class="kwrd">void</span> button1_Click(<span class="kwrd">object</span> sender, EventArgs e)
        {
            <span class="rem">//接続</span>
            <span class="kwrd">try</span>
            {
                <span class="kwrd">this</span>.wm.Connect();
                <span class="kwrd">this</span>.wm.WiimoteChanged += <span class="kwrd">new</span> EventHandler&lt;WiimoteChangedEventArgs&gt;(wm_WiimoteChanged);
                <span class="kwrd">this</span>.button1.Enabled = <span class="kwrd">false</span>;<span class="rem">//接続ボタンを無効</span>
                <span class="kwrd">this</span>.button2.Enabled = <span class="kwrd">true</span>;<span class="rem">//切断ボタンを有効</span>
            }
            <span class="kwrd">catch</span>
            {
                System.Windows.Forms.MessageBox.Show(<span class="str">"接続できません"</span>);
            }
        }

        <span class="rem">//接続</span>
        <span class="kwrd">void</span> wm_WiimoteChanged(<span class="kwrd">object</span> sender, WiimoteChangedEventArgs e)
        {

            <span class="kwrd">if</span> (<span class="kwrd">this</span>.wm.WiimoteState.ButtonState.A)<span class="rem">//ボタンが押されているなら</span>
            {
                <span class="kwrd">if</span> (<span class="kwrd">this</span>.isPush == <span class="kwrd">false</span>)<span class="rem">//最初のボタンの変化時のみ処理を行う</span>
                {
                    <span class="kwrd">if</span> (<span class="kwrd">this</span>.isOn == <span class="kwrd">false</span>)<span class="rem">//LEDがオフなら</span>
                    {
                        <span class="rem">//LEDをオンにする</span>
                        <span class="kwrd">this</span>.wm.SetLEDs(1);
                        <span class="kwrd">this</span>.isOn = <span class="kwrd">true</span>;
                        <span class="kwrd">this</span>.label1.Text = <span class="str">"LED:オン"</span>;
                    }
                    <span class="kwrd">else</span>
                    {
                        <span class="rem">//LEDをオフにする</span>
                        <span class="kwrd">this</span>.wm.SetLEDs(0);
                        <span class="kwrd">this</span>.isOn = <span class="kwrd">false</span>;
                        <span class="kwrd">this</span>.label1.Text = <span class="str">"LED:オフ"</span>;
                    }

                    <span class="kwrd">this</span>.isPush = <span class="kwrd">true</span>;
                }
            }
            <span class="kwrd">else</span>
            {
                <span class="kwrd">this</span>.isPush = <span class="kwrd">false</span>;
            }

            <span class="kwrd">return</span>;
        }

        <span class="rem">//切断</span>
        <span class="kwrd">private</span> <span class="kwrd">void</span> button2_Click(<span class="kwrd">object</span> sender, EventArgs e)
        {
            <span class="kwrd">this</span>.wm.Disconnect();
            <span class="kwrd">this</span>.button1.Enabled = <span class="kwrd">true</span>;<span class="rem">//接続ボタンを有効</span>
            <span class="kwrd">this</span>.button2.Enabled = <span class="kwrd">false</span>;<span class="rem">//切断ボタンを有効</span>
        }
    }
}
</pre>
<h6 id="page-title-date">実行</h6>
<blockquote>
<p>1.WiiFitを接続してください。接続の方法はWiiリモコンと同じです。</p>
<p>2.<span id="window_box">F5</span>キーを押して実行してください。<br />　　※もしエラーが発生する場合はWiiFitが正しく接続されているか確認してください。</p>

<p>3.フォームの接続ボタンを押し、接続します。<br />
<img src="http://www.kosaka-lab.com/tips/img/fit_led1.jpg" />
</p>4.WiiFitのボタンを押します。LEDが点灯し、ラベルがオンになります。<br /><br />
<img src="http://www.kosaka-lab.com/tips/img/fit_led2.jpg" />
<br /><br />5.再びボタンを押すと、LEDが消灯し、ラベルがオフになります。<br /><br />
<img src="http://www.kosaka-lab.com/tips/img/fit_led3.jpg" />
<br /><br /><p>6.終了する際は、切断を押しフォームを閉じてください。 </p>
<h6 id="page-title-date">解説</h6>
<p>ボタンをおすことで、LEDの状態が変化します。</p><font color="#ff0000">WiimoteState.ButtonState.A</font> 
<blockquote>WiiFitのボタンが押されているとtrue、押されていないときはfalseを返します。<br />最初に押したときの1回のみを処理したい場合は、サンプルプログラムのようにbooleanを使って処理します。<br /></blockquote><font color="#ff0000">wm.SetLEDs(X)</font> 
<blockquote>LEDを点灯する場合は1、消灯する場合は0を引数に渡します。Wiiリモコンと同じメソッドですが、WiiFitにはLEDが1つしかないため、0か1のみとなります。<br /></blockquote></blockquote>]]>
        
    </content>
</entry>

<entry>
    <title>複数アニメーション対応FBXの出力</title>
    <link rel="alternate" type="text/html" href="http://www.kosaka-lab.com/tips/2010/01/fbx.php" />
    <id>tag:www.kosaka-lab.com,2010:/tips//11.560</id>

    <published>2010-01-18T08:36:55Z</published>
    <updated>2010-01-18T08:59:58Z</updated>

    <summary><![CDATA[&nbsp;MayaからFBXにアニメーションを出力した場合、１つのFBXファイ...]]></summary>
    <author>
        <name>小坂崇之</name>
        
    </author>
    
        <category term="XNA" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="mayafbx　出力複数アニメーション" label="Maya FBX　出力 複数アニメーション" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.kosaka-lab.com/tips/">
        <![CDATA[&nbsp;MayaからFBXにアニメーションを出力した場合、１つのFBXファイルに対して１つのアニメーションしか出力されません。一つのFBXファイルに複数のアニメーション（歩く、座る、など）を格納する方法を発見しました。<div><br /></div><div>&nbsp;MayaからFBXに出力する時にバイナリではなくテキストモードで出力します。</div><div>そして、動作毎に、一つずつファイルを出力します。３つのモーションが欲しければ３つファイル出力します。<b>このとき、モデルのデータに変更を加えないようにしてください</b>。</div><div><br /></div><div>　どれか一つのファイルをメインとして、そのファイルにアニメーションデータを追加していきます。</div><div>メモ帳や秀丸などのテキストエディタでFBXファイルを開きます。</div><div><br /></div><div>ファイルの後方辺りに、アニメーションデータが格納されています。</div><div><br /></div>
<div id="window_box2"> 
<pre class="csharpcode">;Takes and animation section
;----------------------------------------------------

Takes:  {
    Current: "Take 001"
    Take: "Take 001" {
        FileName: "Take_001.tak"
       
           ・・・・略・・・・ 
    }
}
</pre></div>　Currentの行とTake : "Take 001" { ・・・・}の間が、一つのモーションとなります。<div>なので、他のファイルから取得した同じ部分をTakes{　・・・・}　に貼りつけます。</div><div>識別しやすいように任意の名前をつけてください。</div><div><br /></div><div>


<div id="window_box2"> 
<pre class="csharpcode">;Takes and animation section
;----------------------------------------------------

Takes:  {
    Current: "Take 001"
    Take: "Take 001" {
        FileName: "Take_001.tak"
       
           ・・・・略・・・・
    }

 
   Current: "Take 002"
    Take: "Take 002" {
        FileName: "Take_002.tak"
       
           ・・・・略・・・・
    }

   Current: "Take 003"
    Take: "Take 003" {
        FileName: "Take_003.tak"
       
           ・・・・略・・・・
    }

}
</pre></div></div>　これで、１つのファイルに複数のアニメーションを格納することができます。同じような方法でXファイルにも複数のアニメーションを格納することができます。]]>
        
    </content>
</entry>

<entry>
    <title>ヌンチャクを使う</title>
    <link rel="alternate" type="text/html" href="http://www.kosaka-lab.com/tips/2009/12/post-2.php" />
    <id>tag:www.kosaka-lab.com,2009:/tips//11.552</id>

    <published>2009-12-27T16:41:38Z</published>
    <updated>2009-12-27T16:58:37Z</updated>

    <summary>ヌンチャクを使ったプログラミングを行っていきます。ヌンチャクにはWiiリモコンと...</summary>
    <author>
        <name>笹山裕輔</name>
        
    </author>
    
        <category term="WiiRemote" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.kosaka-lab.com/tips/">
        <![CDATA[<p>ヌンチャクを使ったプログラミングを行っていきます。ヌンチャクにはWiiリモコンと同じく3軸加速度センサ、Cボタン、Zボタン、3Dスティックが内蔵されています。</p>
<img src="http://www.kosaka-lab.com/tips/nun/nun0.jpg" /><br />
<img src="http://www.kosaka-lab.com/tips/nun/nun1.jpg" />
<h6 id="page-title-date">1.フォームの作成</h6>
<p>フォームの作成
フォームにラベルを6つ、ピクチャーボックスを1つ貼り付けてください。</p><p>ピクチャーボックスのサイズは255,255とします。<br />

<img src="http://www.kosaka-lab.com/tips/nun/nun2.jpg" />

</p>
<h6 id="page-title-date">2.ヌンチャクでもプログラム</h6>
Form1.csに以下のプログラムを貼り付けます。<br />
<!-- code formatted by http://manoli.net/csharpformat/ -->
<pre class="csharpcode"><span class="kwrd">using</span> System;
<span class="kwrd">using</span> System.Collections.Generic;
<span class="kwrd">using</span> System.ComponentModel;
<span class="kwrd">using</span> System.Data;
<span class="kwrd">using</span> System.Drawing;
<span class="kwrd">using</span> System.Linq;
<span class="kwrd">using</span> System.Text;
<span class="kwrd">using</span> System.Windows.Forms;
<span class="kwrd">using</span> WiimoteLib;    <span class="rem">//WimoteLib</span>

<span class="kwrd">namespace</span> WiimoteLib_Sample
{
    <span class="kwrd">public</span> <span class="kwrd">partial</span> <span class="kwrd">class</span> Form1 : Form
    {

        Wiimote wm = <span class="kwrd">new</span> Wiimote();       <span class="rem">//Wiimoteの宣言</span>

        <span class="kwrd">public</span> Form1()
        {

            InitializeComponent();

            <span class="rem">//他スレッドからのコントロール呼び出し許可</span>
            Control.CheckForIllegalCrossThreadCalls = <span class="kwrd">false</span>;

            <span class="kwrd">this</span>.label6.Text = <span class="str">"ヌンチャク未接続"</span>;

            <span class="rem">//イベント関数の登録</span>
            wm.WiimoteChanged += wm_WiimoteChanged;

            <span class="rem">//拡張コネクタの接続イベントの登録</span>
            wm.WiimoteExtensionChanged += wm_WiimoteExtensionChanged;

            <span class="rem">//Wiimoteの接続</span>
            wm.Connect();
        }

        <span class="kwrd">void</span> wm_WiimoteExtensionChanged(<span class="kwrd">object</span> sender, WiimoteExtensionChangedEventArgs args)
        {

            <span class="kwrd">if</span> (args.ExtensionType == ExtensionType.Nunchuk)
            {
                <span class="kwrd">this</span>.label6.Text = <span class="str">"ヌンチャク接続"</span>;
            }
            <span class="kwrd">else</span> <span class="kwrd">if</span> (args.ExtensionType == ExtensionType.None)
            {
                <span class="kwrd">this</span>.label6.Text = <span class="str">"ヌンチャク未接続"</span>;
            }
        }

        <span class="rem">//Wiiリモコンの値が変化したときに呼ばれる関数</span>
        <span class="kwrd">void</span> wm_WiimoteChanged(<span class="kwrd">object</span> sender, WiimoteChangedEventArgs args)
        {
            WiimoteState ws = args.WiimoteState;    <span class="rem">//WiimoteStateの値を取得</span>

            <span class="rem">//ヌンチャク接続中であれば</span>
            <span class="kwrd">if</span> (ws.ExtensionType == ExtensionType.Nunchuk)
            {
                Graphics g = <span class="kwrd">this</span>.pictureBox1.CreateGraphics(); <span class="rem">//pictureBox1のグラフィックスを取得</span>
                g.Clear(Color.Black);     <span class="rem">//画面を黒色にクリア</span>

                <span class="rem">//ピクチャーボックスへアナログスティックの描画</span>
                <span class="kwrd">float</span> x = ws.NunchukState.RawJoystick.X;        <span class="rem">//X座標</span>
                <span class="kwrd">float</span> y = 256 - ws.NunchukState.RawJoystick.Y;  <span class="rem">//Y座標</span>

                <span class="rem">//赤色でマーカを描写</span>
                g.FillEllipse(Brushes.Red, x, y, 10, 10);

                g.Dispose();  <span class="rem">//グラフィックスを開放</span>

                <span class="rem">//加速度</span>
                <span class="kwrd">this</span>.label1.Text = <span class="str">"X軸:"</span> + (ws.NunchukState.AccelState.Values.X.ToString(<span class="str">"0.0"</span>) ); <span class="rem">//加速度 X</span>
                <span class="kwrd">this</span>.label2.Text = <span class="str">"Y軸:"</span> + (ws.NunchukState.AccelState.Values.Y.ToString(<span class="str">"0.0"</span>) ); <span class="rem">//加速度 Y</span>
                <span class="kwrd">this</span>.label3.Text = <span class="str">"Z軸:"</span> + (ws.NunchukState.AccelState.Values.Z.ToString(<span class="str">"0.0"</span>)); <span class="rem">//加速度 Z</span>

                <span class="rem">//Cボタン</span>
                <span class="kwrd">if</span> (ws.NunchukState.C == <span class="kwrd">true</span>)
                {
                    <span class="kwrd">this</span>.label4.Text = <span class="str">"Cボタン：オン"</span>;
                }
                <span class="kwrd">else</span>
                {
                    <span class="kwrd">this</span>.label4.Text = <span class="str">"Cボタン：オフ"</span>;
                }

                <span class="rem">//Zボタン</span>
                <span class="kwrd">if</span> (ws.NunchukState.Z == <span class="kwrd">true</span>)
                {
                    <span class="kwrd">this</span>.label5.Text = <span class="str">"Zボタン：オン"</span>;
                }
                <span class="kwrd">else</span>
                {
                    <span class="kwrd">this</span>.label5.Text = <span class="str">"Zボタン：オフ"</span>;
                }
            }
        }
    }
}
</pre>
<h6 id="page-title-date">3.実行</h6>
<p>
1.ヌンチャクを接続したWiiリモコンをPCに接続してください<br />
2.<span id="window_box">F5</span>を押して実行してください<br />
<img src="http://www.kosaka-lab.com/tips/nun/nun3.jpg" /><br />
3.ヌンチャクを振り回すことで、加速度が変化します<br />
4.スティックを動かすことで、ピクチャーボックスの赤い点が移動します<br />
5.ボタンを押すことで、ラベルの文字が変わります<br />
6.ヌンチャクをWiiリモコンから抜き差しすることで、接続・未接続が切り替わります。</p>

<h6 id="page-title-date">4.解説</h6>
<p>ヌンチャクの各状態をラベル、ピクチャーボックスに表示しています。 <br /></p><p><font color="#ff0000">wm.WiimoteExtensionChanged += wm_WiimoteExtensionChanged;</font></p>
<p>ヌンチャクを繋いだ時や、抜いたときに発生するイベントを登録します</p><p><br /></p><p><font color="#ff0000">ws.NunchukState.RawJoystick.X</font><br />
<font color="#ff0000">ws.NunchukState.RawJoystick.Y</font></p>
<p>スティックの傾きを30～230の間で出力します。本来ならばNunchukState.Joystick.X,.Yを使うべきですが、今回使用したWiimoteLibVer1.7では値が常に0になるバグ(?)があるようなのでRawJoystickを使用しています。</p>
<p><font color="#ff0000">ws.NunchukState.AccelState.Values.X</font><br />
<font color="#ff0000">ws.NunchukState.AccelState.Values.Y</font><br />
<font color="#ff0000">ws.NunchukState.AccelState.Values.Z</font></p>
<p>ヌンチャクの加速度センサの値を約-3.0～+3.0の間で出力します。<br /></p><p><font color="#ff0000">ws.NunchukState.C</font><br />
<font color="#ff0000">ws.NunchukState.Z</font></p>
<p>C、Zボタンが押されていればtrue、押されていなければfalseを返します。</p>]]>
        
    </content>
</entry>

<entry>
    <title>FASTRAKをC#で使う</title>
    <link rel="alternate" type="text/html" href="http://www.kosaka-lab.com/tips/2009/12/fastrakc.php" />
    <id>tag:www.kosaka-lab.com,2009:/tips//11.537</id>

    <published>2009-12-01T08:37:12Z</published>
    <updated>2009-12-02T07:48:43Z</updated>

    <summary>実際にFASTRAKを使ったプログラミングを行っていきます。 ここではフォームに...</summary>
    <author>
        <name>笹山裕輔</name>
        
    </author>
    
        <category term="Fastrak" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.kosaka-lab.com/tips/">
        <![CDATA[<p>実際にFASTRAKを使ったプログラミングを行っていきます。</p>
<p>ここではフォームにファストラックのデータを表示させるプログラムを作成します。</p>
<h6 id="page-title-date">準備</h6>
<p>&nbsp;　VisualC#で"fastrak_test"というWindowsフォームアプリケーションのプロジェクトを作成します。</p>
<h6 id="page-title-date">フォームの作成</h6>
<p>　フォームにボタンを3つ、チェックボックスを1つ、ラベルを6つ貼り付けます。</p>
<div style="TEXT-ALIGN: center"><img src="http://www.kosaka-lab.com/tips/img/f1/p1.jpg" /></div><br />
<p>　ボタンのテキストを"接続"、"切断"、"リクエスト"に変更します。チェックボックスのテキストを"自動"にします。</p>
<div style="TEXT-ALIGN: center"><img src="http://www.kosaka-lab.com/tips/img/f1/p2.jpg" /></div><br />
<p>　各ボタン、チェックボックスをダブルクリックしてイベントを登録します。</p>
<div style="TEXT-ALIGN: center"><img src="http://www.kosaka-lab.com/tips/img/f1/p3.jpg" /></div><br />
<h6 id="page-title-date">デモプログラム</h6>
<p>　Forn1.csに以下のプログラムを貼り付けます。"COM3"の部分は各自の環境に</p><!-- code formatted by http://manoli.net/csharpformat/ --><pre class="csharpcode"><span class="kwrd">using</span> System;
<span class="kwrd">using</span> System.Collections.Generic;
<span class="kwrd">using</span> System.ComponentModel;
<span class="kwrd">using</span> System.Data;
<span class="kwrd">using</span> System.Drawing;
<span class="kwrd">using</span> System.Linq;
<span class="kwrd">using</span> System.Text;
<span class="kwrd">using</span> System.Windows.Forms;
<span class="kwrd">using</span> System.IO.Ports;

<span class="kwrd">namespace</span> fastrak_test
{
    <span class="kwrd">public</span> <span class="kwrd">partial</span> <span class="kwrd">class</span> Form1 : Form
    {
        <span class="kwrd">private</span> SerialPort serialPort;<span class="rem">//コンポーネント</span>

        <span class="kwrd">public</span> Form1()
        {
            InitializeComponent();

            <span class="rem">//他スレッドからのコントロール呼び出し許可</span>
            Control.CheckForIllegalCrossThreadCalls = <span class="kwrd">false</span>;  

            <span class="rem">//シリアルポート</span>
            <span class="kwrd">this</span>.serialPort = <span class="kwrd">new</span> System.IO.Ports.SerialPort();
            <span class="kwrd">this</span>.serialPort.DataReceived += 
                <span class="kwrd">new</span> System.IO.Ports.SerialDataReceivedEventHandler(<span class="kwrd">this</span>.serialPort_DataReceived);

            <span class="kwrd">this</span>.serialPort.PortName = <span class="str">"COM3"</span>;<span class="rem">//ポート番号（＊自分の環境に合わせて変更すること）</span>
            <span class="kwrd">this</span>.serialPort.BaudRate = 115200;<span class="rem">//ビットレート</span>
            <span class="kwrd">this</span>.serialPort.DataBits = 8;
            <span class="kwrd">this</span>.serialPort.Parity = Parity.None;
            <span class="kwrd">this</span>.serialPort.Handshake = Handshake.XOnXOff;
            <span class="kwrd">this</span>.serialPort.Parity = Parity.None;
            <span class="kwrd">this</span>.serialPort.StopBits = StopBits.One;
        }

        <span class="rem">//接続</span>
        <span class="kwrd">private</span> <span class="kwrd">void</span> button1_Click(<span class="kwrd">object</span> sender, EventArgs e)
        {
            <span class="kwrd">try</span>
            {
                <span class="kwrd">this</span>.serialPort.Open();

                <span class="rem">//設定</span>
                <span class="kwrd">this</span>.serialPort.WriteLine(<span class="str">"u"</span>); <span class="rem">//インチからセンチへ</span>
            }
            <span class="kwrd">catch</span>
            {
                System.Windows.Forms.MessageBox.Show(<span class="str">"ポートを開けませんでした"</span>);
            }
        }

        <span class="rem">//切断</span>
        <span class="kwrd">private</span> <span class="kwrd">void</span> button2_Click(<span class="kwrd">object</span> sender, EventArgs e)
        {
            <span class="kwrd">this</span>.serialPort.Close();
        }

        <span class="rem">//リクエスト</span>
        <span class="kwrd">private</span> <span class="kwrd">void</span> button3_Click(<span class="kwrd">object</span> sender, EventArgs e)
        {
            <span class="kwrd">if</span> (<span class="kwrd">this</span>.serialPort.IsOpen == <span class="kwrd">true</span>)
            {
                <span class="kwrd">this</span>.serialPort.WriteLine(<span class="str">"P"</span>);
            }
        }
        
        <span class="rem">//チェックボックス</span>
        <span class="kwrd">private</span> <span class="kwrd">void</span> checkBox1_CheckedChanged(<span class="kwrd">object</span> sender, EventArgs e)
        {
            <span class="kwrd">if</span> (<span class="kwrd">this</span>.checkBox1.Checked == <span class="kwrd">true</span>)
            {
                <span class="kwrd">this</span>.serialPort.Write(<span class="str">"C"</span>);
            }
            <span class="kwrd">else</span>
            {
                <span class="kwrd">this</span>.serialPort.Write(<span class="str">"c"</span>);
            }
        }

        <span class="rem">//データ受信</span>
        <span class="kwrd">private</span> <span class="kwrd">void</span> serialPort_DataReceived(<span class="kwrd">object</span> sender,
            System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            <span class="kwrd">int</span> no = 0;<span class="rem">//レシーバ番号</span>

            <span class="kwrd">double</span> TX = 0;
            <span class="kwrd">double</span> TY = 0;
            <span class="kwrd">double</span> TZ = 0;

            <span class="kwrd">double</span> RX = 0;
            <span class="kwrd">double</span> RY = 0;
            <span class="kwrd">double</span> RZ = 0;

            <span class="kwrd">try</span>
            {
                SerialPort port = (SerialPort)sender;
                <span class="kwrd">string</span> s = port.ReadLine();

                <span class="rem">//レシーバー番号を取得</span>
                no = Convert.ToInt32(s.Substring(0, 2)) - 1;

                <span class="rem">//位置を取得</span>
                TX = Convert.ToDouble(s.Substring(3, 7));
                TY = Convert.ToDouble(s.Substring(10, 7));
                TZ = Convert.ToDouble(s.Substring(17, 7));

                RX = Convert.ToDouble(s.Substring(24, 7));
                RY = Convert.ToDouble(s.Substring(31, 7));
                RZ = Convert.ToDouble(s.Substring(38, 7));

                <span class="kwrd">if</span> (no == 0)
                {
                    <span class="kwrd">this</span>.label1.Text = <span class="str">"TX:"</span> + TX.ToString();
                    <span class="kwrd">this</span>.label2.Text = <span class="str">"TY:"</span> + TY.ToString();
                    <span class="kwrd">this</span>.label3.Text = <span class="str">"TZ:"</span> + TZ.ToString();

                    <span class="kwrd">this</span>.label4.Text = <span class="str">"RX:"</span> + RX.ToString();
                    <span class="kwrd">this</span>.label5.Text = <span class="str">"RY:"</span> + RY.ToString();
                    <span class="kwrd">this</span>.label6.Text = <span class="str">"RZ:"</span> + RZ.ToString();
                }
            }
            <span class="kwrd">catch</span>
            {
                Console.WriteLine(<span class="str">"データ受信エラー"</span>);
            }
        }
    }
}
</pre>
<h6 id="page-title-date">実行</h6>
<p>1.Fastrakの電源を入れて、緑のランプの点滅が終わるのを待ちます。</p>
<p>2.<span id="window_box">F5</span>キーを押して実行してください。<br /></p>
<div style="TEXT-ALIGN: center"><img src="http://www.kosaka-lab.com/tips/img/f1/p4.jpg" /></div><br />
<p>3.接続ボタンを押し、接続します。このままでは何もおこりません。</p>
<p>4.リクエストボタンを1度押します。ラベルに数字が表示されます。</p>
<div style="TEXT-ALIGN: center"><img src="http://www.kosaka-lab.com/tips/img/f1/p5.jpg" /></div>
<p><br />この値はレシーバ1のデータを表しています。レシーバ1を動かして、リクエストボタンを押してみてください。値が変わります。</p>
<p>5.毎回リクエストボタンを押すのは大変なので、"自動"と書かれたチェックボックスをチェックさせます。値がリアルタイムに表示されます。</p>
<div style="TEXT-ALIGN: center"><img src="http://www.kosaka-lab.com/tips/img/f1/p6.jpg" /></div>
<p>&nbsp;</p>
<p>6.切断ボタンを押して終了します。</p>
<h6 id="page-title-date">解説</h6>
<p><font color="#ff0000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.serialPort.PortName = "COM3";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.serialPort.BaudRate = 115200;//ビットレート<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.serialPort.DataBits = 8;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.serialPort.Parity = Parity.None;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.serialPort.Handshake = Handshake.XOnXOff;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.serialPort.Parity = Parity.None;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.serialPort.StopBits = StopBits.One;</font></p>
<p>フォームの&nbsp;コンストラクタでシリアル通信の設定を行っています。</p>
<p><font color="#ff0000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.serialPort.Open();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.serialPort.WriteLine("u");</font></p>
<p>接続ボタンを押すとポートを開いています。直後にuコマンドを送信しています。uコマンドはFastakのデータをインチからセンチに変更するコマンドです。</p>
<p>　　　　　　　<font color="#ff0000">this.serialPort.WriteLine("P");</font></p>
<p>リクエストボタンはPコマンドを送信しています。Pコマンドを送るとFASTRAKは1回だけデータを送ってきます。&nbsp;</p>
<p>　　　　　　　<font color="#ff0000">this.serialPort.Write("C");</font></p>
<p>自動チェックボックスではCコマンドを送信しています。Cコマンドを送るとc(小文字)コマンドが送られてくるまでデータを送信し続けます。</p>
<p><font color="#ff0000">　　　　　　　string s = port.ReadLine();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; no = Convert.ToInt32(s.Substring(0, 2)) - 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TX = Convert.ToDouble(s.Substring(3, 7));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TY = Convert.ToDouble(s.Substring(10, 7));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TZ = Convert.ToDouble(s.Substring(17, 7));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RX = Convert.ToDouble(s.Substring(24, 7));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RY = Convert.ToDouble(s.Substring(31, 7));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RZ = Convert.ToDouble(s.Substring(38, 7));</font></p>
<p>データ受信部分では、送られてきたデータを解析し、ラベルに表示させています。</p>
<p>特に設定を変更していない時は、FASTRAKから送られてくるデータはアスキーでこのような構成になっています。</p>
<p>01&nbsp;&nbsp; -7.60 -30.70&nbsp;&nbsp; 4.31-177.65&nbsp; -1.28&nbsp;&nbsp; 6.34<br />02&nbsp;&nbsp; 22.84&nbsp; -7.06&nbsp;&nbsp; 8.86&nbsp; -6.52&nbsp; -3.96 -48.27</p>
<p>&nbsp;レシーバ番号(2バイト),スペース(1バイト),X座標(7バイト),Y座標(7バイト),Z座標(7バイト),ピッチ(7バイト),ヨー(7バイト),ロール(7バイト),改行(1バイト)</p>
<p>&nbsp;</p>
<p>それぞれの値の位置が固定されているので、String.Substringで値を取り出しConvert.To○○で数字に変換しています。</p>
<p>noには0から始まるレシーバ番号が記録されているので、最初のレシーバの時のみラベルの値を変更しています。</p>]]>
        
    </content>
</entry>

<entry>
    <title>POLHEMUS FASTRAKを使う</title>
    <link rel="alternate" type="text/html" href="http://www.kosaka-lab.com/tips/2009/12/polhemus-fastrak.php" />
    <id>tag:www.kosaka-lab.com,2009:/tips//11.536</id>

    <published>2009-12-01T08:12:57Z</published>
    <updated>2009-12-01T08:35:38Z</updated>

    <summary>　PHLHEMUS社製 3SPACEシリーズ(3次元位置センサ)のFASTRAK...</summary>
    <author>
        <name>笹山裕輔</name>
        
    </author>
    
        <category term="Fastrak" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.kosaka-lab.com/tips/">
        <![CDATA[<p>　PHLHEMUS社製 3SPACEシリーズ(3次元位置センサ)のFASTRAKを使ったプログラミングを行っていきます。</p>
<p>　FASTRAKは磁気センサと呼ばれる物であり、磁場を発生させるトラスミッタと各レシーバとの相対的な3次元位置座標及びオイラー角（ピッチ、ヨー、ロール）の6自由度をリアルタイムに測定することが可能なセンサです。1台のFASTRAKに最大4つのレシーバを取り付けることが可能です。また、最大4台のFASTRAKと同期をさせることで、16個のレシーバを扱うことも可能です。</p>
<p>　レシーバを身体に装着することでモーションキャプチャを行ったり、HMDに取り付けることでAR用の座標を取得するといった使い方があります。</p>
<div style="TEXT-ALIGN: center"><img src="http://www.kosaka-lab.com/tips/img/f0/fast.jpg" /></div><br />
<p>ここではまず、本体に付属するサンプルプログラムを動作させます。</p>
<h6 id="page-title-date">1.機器の接続</h6>　トランスミッタ、レシーバ2つ、電源をFASTRAK本体に接続します。<br />　RS-232CをPCに接続してください。RS-232CがないPCを使用している場合は、USB変換するものでもかまいません。<br />　トランスミッタの周囲に金属や磁場を発生させるものがないか確認してください。 
<p></p>
<h6 id="page-title-date">2.ディップスイッチの設定</h6>　ここでは"1110 1001"に設定します。これは、転送レートは115200bps、パリティ無し、接続方式はRS-232であることを意味します。詳しくはマニュアルを見てください。 
<p></p>
<div style="TEXT-ALIGN: center"><img src="http://www.kosaka-lab.com/tips/img/f0/io.jpg" /></div><br />
<h6 id="page-title-date">3.インストール </h6>　FASTRAK Product Toolbox &amp; Manual のCDをPCに入れます。 
<p></p>
<p>　Install_FT.exeを実行し、"Install　Fastak Graphic User Interface"にチェックを入れてインストールします。</p>
<div style="TEXT-ALIGN: center"><img src="http://www.kosaka-lab.com/tips/img/f0/ftg0.jpg" /></div><br />
<h6 id="page-title-date">4.実行</h6>
<p>　インストール完了後、FTGuiを実行します。実行する前にFASTRAKの電源を入れて下さい。 背面の緑LEDの点滅が終わるとFASTRAKの起動完了です。 </p>
<p></p>
<p>　Baud Rateを"115200"、Portを各自FASTRAKを接続しているポートにあわせてください。ポート番号がわからない場合は、デバイスマネージャーで調べることができます。</p>
<div style="TEXT-ALIGN: center"><img src="http://www.kosaka-lab.com/tips/img/f0/ftg1.jpg" width="90%" /></div><br />
<p>　プログラムが起動します。"Reqest Data"ボタンを押してください。</p>
<div style="TEXT-ALIGN: center"><img src="http://www.kosaka-lab.com/tips/img/f0/ftg2.jpg" width="90%" /></div><br />
<p>　テキストボックス内に数字が表示されます。数字はそれぞれ</p>
<p>レシーバ番号　X座標値　Y座標値　Z座標値　ピッチ　ヨー　ロール</p>
<p>　を意味しています。　</p>
<div style="TEXT-ALIGN: center"><img src="http://www.kosaka-lab.com/tips/img/f0/ftg3.jpg" width="90%" /></div><br />
<p>　この座標の単位はインチですが、cmに変更することも可能です。</p>
<p>　Display TypeのラジオボタンをGraphicalに変更します。</p>
<p>　飛行機のライトのようなモデルと3Dモデルが2つ表示されます。<br />　ライトは原点（トランスミッタ）をあらわしており、飛行機は各レシーバをあらわしています。</p>
<div style="TEXT-ALIGN: center"><img src="http://www.kosaka-lab.com/tips/img/f0/ftg4.jpg" width="90%" /></div><br />
<p>　各レシーバを動かしたり、傾けたりすることで、3D空間内の飛行機も対応した動作をします。</p>
<p>　なお、このプログラムは動作確認用のものであり、ユーザが独自のプログラムにFastrakを用いる際にはインストールの必要はありません。</p>
<h6></h6>
<h6></h6>]]>
        
    </content>
</entry>

<entry>
    <title>Ｗｉｉラジコン　その２</title>
    <link rel="alternate" type="text/html" href="http://www.kosaka-lab.com/tips/2009/06/post-1.php" />
    <id>tag:www.kosaka-lab.com,2009:/tips//11.387</id>

    <published>2009-06-05T10:28:48Z</published>
    <updated>2009-06-05T10:32:34Z</updated>

    <summary> Wiiリモコンを２台用意します。　一台目をコントローラ用Wiiリモコン　二台目...</summary>
    <author>
        <name>小坂崇之</name>
        
    </author>
    
        <category term="改造" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.kosaka-lab.com/tips/">
        <![CDATA[ <div>Wiiリモコンを２台用意します。</div><div>　一台目をコントローラ用Wiiリモコン</div><div>　二台目をモータ制御用Wiiリモコンとします。</div><div><br /></div><div>コントローラ用Wiiリモコンを傾けると、Wiiラジコンが進みます。</div><div><span class="Apple-style-span" style="font-family: 'ヒラギノ角ゴ Pro W3'; font-size: 12px; line-height: 18px; ">ータ制御用リモコンのＬＥＤの信号をモータドライバに接続することで簡単にモータを制御します。</span></div><div><font class="Apple-style-span" face="'ヒラギノ角ゴ Pro W3'" size="3"><span class="Apple-style-span" style="font-size: 12px; line-height: 18px;"><br /></span></font></div><div>Wiiフィットで制御しても面白そうです。赤外線カメラが搭載されているので、赤外線を自動に追尾して動くものや、ライントレーサとしても使うことができますね。</div><div><br /></div><div><br /></div>

<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/YuSc7FqCWXs&amp;hl=ja&amp;fs=1&amp;" /><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><embed src="http://www.youtube.com/v/YuSc7FqCWXs&amp;hl=ja&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></object>]]>
        
    </content>
</entry>

<entry>
    <title>XNAとWiimoteLibで3Dオブジェクトを操作</title>
    <link rel="alternate" type="text/html" href="http://www.kosaka-lab.com/tips/2009/06/xnawiimotelib3d.php" />
    <id>tag:www.kosaka-lab.com,2009:/tips//11.378</id>

    <published>2009-06-02T06:00:30Z</published>
    <updated>2009-06-18T04:57:24Z</updated>

    <summary><![CDATA[更新作業中です。&nbsp;　こではXNAとWiimoteLibを使った簡単なプ...]]></summary>
    <author>
        <name>小坂崇之</name>
        
    </author>
    
        <category term="XNA" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.kosaka-lab.com/tips/">
        <![CDATA[<b>更新作業中です。</b><div>&nbsp;<div>　こではXNAとWiimoteLibを使った簡単なプログラミングを行います。&nbsp;</div><div><div>Wiiリモコンを傾けると3Dオブジェクトが同じように傾くといったプログラムを作成したいと思います。&nbsp;

</div><div><br /></div>

<div><b>3Dオブジェクトのダンロード</b></div></div></div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;">&nbsp;なんでもかまいませんが、ここではせっかくWiiリモコンを使うのでWiiリモコンに似せた（そっくりそのままでは問題ありそうなので）3Dオブジェクトを使います。
以下からダウンロードしてください。&nbsp;</blockquote><div><div><div><ul><ul><ul><ul><li><a href="http://www.kosaka-lab.com/tips/img/wiimodoki.x"> wiimodoki.x</a></li><li><a href="http://www.kosaka-lab.com/tips/img/texture_wii.jpg">texture_wii.jpg</a></li></ul></ul></ul></ul></div></div></div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><br />&nbsp;ダウンロードした２つのファイルを自分のドキュメントのプロジェクトのContentフォルダに入れてください。&nbsp;</blockquote><div><div><div><br /></div>



<div><b>リソースの読み込み</b></div></div></div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;">&nbsp;ダウンロードした２つのファイルをリソースとして読み込みます。&nbsp;<br />右側の[ソリューションエクスプローラ]の[Content]を右クリック、[追加(D)]→[既存の項目(G)]を選択し、先ほどダウンロードした２つのファイルを指定し、[追加(A)]を選択します。<br /><br /><img src="http://www.kosaka-lab.com/tips/img/XNA06.jpg" /><img src="http://www.kosaka-lab.com/tips/img/XNA07.jpg" /><br /><br />右側の[ソリューションエクスプローラ]の[Content]に２つのファイルが読み込まれました。&nbsp;<br /><img src="http://www.kosaka-lab.com/tips/img/XNA08.jpg" /></blockquote><div><div><div><br /></div><div><br /></div>



<div><b>プログラム
</b><blockquote><b>
</b><!-- code formatted by http://manoli.net/csharpformat/ -->
<div id="window_box2"> 
<pre class="csharpcode"><span class="kwrd">using</span> System;
<span class="kwrd">using</span> System.Collections.Generic;
<span class="kwrd">using</span> System.Linq;
<span class="kwrd">using</span> Microsoft.Xna.Framework;
<span class="kwrd">using</span> Microsoft.Xna.Framework.Audio;
<span class="kwrd">using</span> Microsoft.Xna.Framework.Content;
<span class="kwrd">using</span> Microsoft.Xna.Framework.GamerServices;
<span class="kwrd">using</span> Microsoft.Xna.Framework.Graphics;
<span class="kwrd">using</span> Microsoft.Xna.Framework.Input;
<span class="kwrd">using</span> Microsoft.Xna.Framework.Media;
<span class="kwrd">using</span> Microsoft.Xna.Framework.Net;
<span class="kwrd">using</span> Microsoft.Xna.Framework.Storage;
<span class="kwrd">using</span> WiimoteLib;                <span class="rem">//WiimoteLibの読み込み</span>
<span class="kwrd">using</span> System.Collections;        <span class="rem">//Collectionの読み込み</span>


<span class="kwrd">namespace</span> XNAWii {
  <span class="rem">/// &lt;summary&gt;</span>
  <span class="rem">/// This is the main type for your game</span>
  <span class="rem">/// &lt;/summary&gt;</span>
  <span class="kwrd">public</span> <span class="kwrd">class</span> Game1 : Microsoft.Xna.Framework.Game {
    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;

    <span class="kwrd">private</span> Model xfile;                 <span class="rem">//Xファイル</span>
    Wiimote wm = <span class="kwrd">new</span> Wiimote();          <span class="rem">//Wiimoteの宣言</span>
    ArrayList[] Accel = <span class="kwrd">new</span> ArrayList[2];<span class="rem">//傾きセンサの値格納</span>
    

    <span class="kwrd">public</span> Game1() {
      graphics = <span class="kwrd">new</span> GraphicsDeviceManager(<span class="kwrd">this</span>);
      Content.RootDirectory = <span class="str">"Content"</span>;
    }

    <span class="kwrd">protected</span> <span class="kwrd">override</span> <span class="kwrd">void</span> Initialize() {

      <span class="kwrd">base</span>.Initialize();

      <span class="rem">//生のデータを扱うと、センサ値のブレが酷いので指定した回数の平均を取るためのリスト</span>
      <span class="kwrd">this</span>.Accel[0] = <span class="kwrd">new</span> ArrayList();  <span class="rem">//リスト定義</span>
      <span class="kwrd">this</span>.Accel[1] = <span class="kwrd">new</span> ArrayList();  <span class="rem">//リスト定義</span>
      <span class="kwrd">this</span>.wm.Connect();                <span class="rem">//接続</span>
      <span class="kwrd">this</span>.wm.SetReportType(InputReport.IRExtensionAccel, <span class="kwrd">true</span>);<span class="rem">//レポートタイプの設定</span>
      <span class="kwrd">this</span>.wm.WiimoteChanged += wm_WiimoteChanged;              <span class="rem">//イベント関数の登録</span>
      <span class="kwrd">this</span>.wm.SetLEDs(0);

    }

    <span class="kwrd">protected</span> <span class="kwrd">override</span> <span class="kwrd">void</span> LoadContent() {
      spriteBatch = <span class="kwrd">new</span> SpriteBatch(GraphicsDevice);


      <span class="kwrd">this</span>.xfile = <span class="kwrd">this</span>.Content.Load&lt;Model&gt;(<span class="str">"wiimodoki"</span>);  <span class="rem">//Xファイルの読み込み</span>
      <span class="kwrd">foreach</span> (ModelMesh mesh <span class="kwrd">in</span> <span class="kwrd">this</span>.xfile.Meshes)  <span class="rem">//メッシュごと</span>
      {
        <span class="kwrd">foreach</span> (BasicEffect effect <span class="kwrd">in</span> mesh.Effects) {
          <span class="rem">//ビュー行列 カメラの視点を設定　x,y,zが(0.0f,0.0f,10.0f)の位置から原点を見る</span>
          effect.View =
                      Matrix.CreateLookAt(<span class="kwrd">new</span> Vector3(0.0f, 0.0f, 10.0f), Vector3.Zero, Vector3.Up);

          <span class="rem">//プロジェクション行列　視野角などの設定</span>
          effect.Projection = Matrix.CreatePerspectiveFieldOfView(
            MathHelper.ToRadians(45.0f),
            (<span class="kwrd">float</span>)<span class="kwrd">this</span>.GraphicsDevice.Viewport.Width / (<span class="kwrd">float</span>)<span class="kwrd">this</span>.GraphicsDevice.Viewport.Height,
            1.0f,
            50.0f
          );
        }
      }


    }

    <span class="kwrd">protected</span> <span class="kwrd">override</span> <span class="kwrd">void</span> UnloadContent() {
    }

    <span class="kwrd">protected</span> <span class="kwrd">override</span> <span class="kwrd">void</span> Update(GameTime gameTime) {
      <span class="rem">// Allows the game to exit</span>

      <span class="rem">//そのまま実行すると以下のようなエラーが発生します。</span>
      <span class="rem">//「エラー 1 'ButtonState'は、'Microsoft.Xna.Framework.Input.ButtonState' と
                                                 'WiimoteLib.ButtonState'' 間のあいまいな参照です。</span>
      <span class="rem">//'Microsoft.Xna.Framework.Input.ButtonState' と 'WiimoteLib.ButtonState'のButtonState、
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　どっちらを使うのかよくわからないと怒られます。</span>
      <span class="rem">//ここでは'Microsoft.Xna.Framework.Input.ButtonState'を使いますので、以下のように追加します。</span>
      <span class="rem">// 修正前:  if (GamePad.GetState(PlayerIndex.One).Buttons.Back ==
                                                  ButtonState.Pressed)</span>
      <span class="rem">// 修正後:  if (GamePad.GetState(PlayerIndex.One).Buttons.Back ==
                                                  Microsoft.Xna.Framework.Input.ButtonState.Pressed)</span>

      <span class="kwrd">if</span> (GamePad.GetState(PlayerIndex.One).Buttons.Back ==
                                                  Microsoft.Xna.Framework.Input.ButtonState.Pressed)
        <span class="kwrd">this</span>.Exit();


      <span class="kwrd">base</span>.Update(gameTime);
    }

    <span class="kwrd">protected</span> <span class="kwrd">override</span> <span class="kwrd">void</span> Draw(GameTime gameTime) {
      GraphicsDevice.Clear(Color.CornflowerBlue);

      <span class="kwrd">float</span> x, y;     <span class="rem">//回転角度を格納</span>
      <span class="kwrd">float</span> tmp;      <span class="rem">//計算用変数</span>



      <span class="rem">//Xの平均を求める</span>
      tmp = 0;  <span class="rem">//tmpの値を0にする</span>
      <span class="rem">//合計を求める</span>
      <span class="kwrd">for</span> (<span class="kwrd">int</span> i = 0; i &lt; <span class="kwrd">this</span>.Accel[0].Count; i++) {
        tmp = tmp + (<span class="kwrd">float</span>)<span class="kwrd">this</span>.Accel[0][i];
      }
      <span class="rem">//平均を求める　合計を個数で割る</span>
      x = tmp / <span class="kwrd">this</span>.Accel[0].Count;




      <span class="rem">//Yの平均を求める</span>
      tmp = 0;  <span class="rem">//tmpの値を0にする</span>
      <span class="rem">//合計を求める</span>
      <span class="kwrd">for</span> (<span class="kwrd">int</span> i = 0; i &lt; <span class="kwrd">this</span>.Accel[1].Count; i++) {
        tmp = tmp + (<span class="kwrd">float</span>)<span class="kwrd">this</span>.Accel[1][i];
      }
      <span class="rem">//平均を求める　合計を個数で割る</span>
      y = tmp / <span class="kwrd">this</span>.Accel[1].Count;

      


      <span class="rem">//90に拡張</span>
      <span class="rem">//センサの値を角度に変換</span>
      x = (-x * 90.0f);
      y = (-y * 90.0f);

      <span class="rem">//角度をラジアンに変換</span>
      x = x / 180 * 3.14f;
      y = y / 180 * 3.14f;

      <span class="rem">//画面に描画する</span>
      <span class="kwrd">foreach</span> (ModelMesh mesh <span class="kwrd">in</span> <span class="kwrd">this</span>.xfile.Meshes) {
        <span class="kwrd">foreach</span> (BasicEffect effect <span class="kwrd">in</span> mesh.Effects) {
          <span class="rem">//回転角度を設定　Yaw　Pitch　Rollを指定する。 Yawは使わないのでPitchにｙをRollにxを設定</span>
          effect.World = Matrix.CreateFromYawPitchRoll(0, y, x);
        }
        mesh.Draw();<span class="rem">//meshを描画</span>
      }


      <span class="kwrd">base</span>.Draw(gameTime);
    }

    <span class="rem">//Wiiリモコン値が変更したら</span>
    <span class="kwrd">void</span> wm_WiimoteChanged(<span class="kwrd">object</span> sender, WiimoteChangedEventArgs args) {
      WiimoteState ws = args.WiimoteState;        <span class="rem">//WiimoteStateの値を取得</span>

      <span class="rem">//リストに突っ込む</span>
      <span class="kwrd">this</span>.Accel[0].Add(ws.AccelState.Values.X);
      <span class="kwrd">this</span>.Accel[1].Add(ws.AccelState.Values.Y);


      <span class="kwrd">int</span> avg_count = 50;       <span class="rem">//平均を取る数</span>
			
      <span class="rem">//avg_count個得たら古い値を１つ削除する</span>
      <span class="rem">//常に最新の状態のavg_count個データが格納される。</span>
      <span class="kwrd">if</span> (<span class="kwrd">this</span>.Accel[0].Count &gt; avg_count) { <span class="kwrd">this</span>.Accel[0].RemoveAt(0); }
      <span class="kwrd">if</span> (<span class="kwrd">this</span>.Accel[1].Count &gt; avg_count) { <span class="kwrd">this</span>.Accel[1].RemoveAt(0); }</pre><pre class="csharpcode">    }

  }
}
</pre>
</div></blockquote></div></div></div><div><br /></div><div><br /></div><b>

実行してみよう</b><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;">&nbsp;　Wiiリモコンを接続した状態で[F5]キーを押して実行してみてください。
Wiiリモコンをクルクル回転させるなどの動作を行ってみてください。どうでしょう？Wiiリモコンの動作に合わせて画面のWiiリモコンが動いたでしょうか？
<img src="http://www.kosaka-lab.com/tips/img/XNA09.jpg" /></blockquote><div><br /></div><div><br /></div><div><b>

解説</b></div><div>&nbsp;　XNAでプロジェクトを作成すると標準で5個のメソッドができます。
<table border="1">
<tbody><tr><td aling="center" style="text-align: center;">メソッド</td><td aling="center" style="text-align: center;">説明</td><td aling="center" style="text-align: center;">このプログラムでの処理</td></tr>
<tr><td>Initialize</td><td>初期化<br /></td><td>変数の初期化 Wiimoteの接続</td></tr>
<tr><td>LoadContent</td><td>グラフィック関係の読み込み<br />グラフィックスの初期化など</td><td> wiimodoki.xファイルの読み込み、視点位置と視野角の設定</td></tr>
<tr><td>UnloadContent</td><td>グラフィック関係の破棄<br />グラフィックスが破棄された時の処理</td><td></td></tr>
<tr><td>Update</td><td>グラフィック以外の定期更新<br />グラフィック以外の処理を常に行う場合、ここに書く<br />フレーム毎に処理される</td><td></td></tr>
<tr><td>Draw</td><td>グラフィック関係の定期更新<br />グラフィック関係の処理を常に行う場合、ここに書く<br />フレーム毎に処理される</td><td>２つの角度の平均を求め、回転させ画面に描写</td></tr>
</tbody></table><table></table></div><div><br /></div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;">　センサの値は常に変化しています。そのため、センサ値の角度でそのまま描写するとオブジェクトがガクガクになってしまいます。そのため、ある一定の数で平均を取ると滑らかに回転することができます。試しに、wm_WiimoteChanged()の中のavg_countの値を5に変更してみてください。どうでしょう？さっきよりガクガクになりましたよね。avg_countの値を大きいものにすれば滑らかに回転しますが、あまり大きくしすぎると回転するまで時間がかかってしまいます。&nbsp;<br />　ここでは過去50個の平均を取っています。wm_WiimoteChanged()の中で、２つのセンサの値をリストに追加していきます。そしてリストが50個を超えたら、一番古いリストを削除しています。</blockquote>]]>
        
    </content>
</entry>

<entry>
    <title>XNAでWiimoteLibをプロジェクトに読み込む</title>
    <link rel="alternate" type="text/html" href="http://www.kosaka-lab.com/tips/2009/05/xnawiimotelib.php" />
    <id>tag:www.kosaka-lab.com,2009:/tips//11.372</id>

    <published>2009-05-29T04:44:24Z</published>
    <updated>2009-05-29T05:47:03Z</updated>

    <summary>ここではWiimoteLibを使ってプログラミングを行います。空のプロジェクトの...</summary>
    <author>
        <name>小坂崇之</name>
        
    </author>
    
        <category term="XNA" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.kosaka-lab.com/tips/">
        <![CDATA[ここではWiimoteLibを使ってプログラミングを行います。<div><br /></div><span class="Apple-style-span" style="font-weight: bold; ">空のプロジェクトの作成</span><div><ol><ol><li>&nbsp;　Visual C#　2008　Expressを起動します。</li><li>　 [ファイル(F)]　[新しいプロジェクト(P)]→[プロジェクトの種類(P)]から[XNA Game Studio3.0]を選択し、右側の[テンプレート(T):]から[Windows Game(3.0)]を選択します。&nbsp;</li><li>　[プロジェクト名(N):]に[XNAWii]という名前をつけて[OK]ボタンをクリックします。<img src="http://www.kosaka-lab.com/tips/img/XNA01.jpg" /></li></ol></ol></div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><img src="http://www.kosaka-lab.com/tips/img/XNA02.jpg" /><br /><br /></blockquote><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;">　数秒待つと新しいプロジェクトが作成されます。興味があればここで[F5]キーを押して、実行してみると良いでしょう。&nbsp;</blockquote><div><br /></div><div><br /></div><div>&nbsp;<b>WiimoteLibの追加</b></div><div><ol><ol><li>　先ほど作成した空のプロジェクトにWiimoteLibを追加します。この作業は<a href="http://www.kosaka-lab.com/tips/2009/01/wiimotelib.html">以前に行った作業</a>とまったく同じです。&nbsp;</li><li style="text-align: center;">　右側に表示されている、ソリューションエクスプローラの[参照設定]を右クリック、[参照の追加(R..)]を選択します。

参照の追加から[参照]を選択し、WiimoteLib.dllを選択します。マイドキュメントの「Visual Studio2008\Project」においた「WiimoteLib\wiimoteLib.dll」を選択し[OK]ボタンをクリックします。</li></ol></ol></div><div><div style="text-align: center;"><img src="http://www.kosaka-lab.com/tips/img/XNA03.jpg" /></div>
<div style="text-align: center;"><img src="http://www.kosaka-lab.com/tips/img/XNA04.jpg" /></div>
<div style="text-align: center;"><img src="http://www.kosaka-lab.com/tips/img/XNA05.jpg" /></div><div><br /></div><div><br /></div>

これでソリューションエクスプローラの参照設定にWiimoteLibが追加されました。
<a href="http://www.kosaka-lab.com/tips/2009/01/wiimotelib.html">前回</a>と同じようにusingにWiimoteLibを追加してみましょう。

<!-- code formatted by http://manoli.net/csharpformat/ -->
<div id="window_box2">
<pre class="csharpcode"><span class="kwrd">using</span> System;
<span class="kwrd">using</span> System.Collections.Generic;
<span class="kwrd">using</span> System.Linq;
<span class="kwrd">using</span> Microsoft.Xna.Framework;
<span class="kwrd">using</span> Microsoft.Xna.Framework.Audio;
<span class="kwrd">using</span> Microsoft.Xna.Framework.Content;
<span class="kwrd">using</span> Microsoft.Xna.Framework.GamerServices;
<span class="kwrd">using</span> Microsoft.Xna.Framework.Graphics;
<span class="kwrd">using</span> Microsoft.Xna.Framework.Input;
<span class="kwrd">using</span> Microsoft.Xna.Framework.Media;
<span class="kwrd">using</span> Microsoft.Xna.Framework.Net;
<span class="kwrd">using</span> Microsoft.Xna.Framework.Storage;
<span class="kwrd">using</span> WiimoteLib;

<span class="kwrd">namespace</span> XNAWii {
    <span class="rem">/// &lt;summary&gt;</span>
    <span class="rem">/// This is the main type for your game</span>
    <span class="rem">/// &lt;/summary&gt;</span>
    <span class="kwrd">public</span> <span class="kwrd">class</span> Game1 : Microsoft.Xna.Framework.Game {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;

        <span class="kwrd">public</span> Game1() {
            graphics = <span class="kwrd">new</span> GraphicsDeviceManager(<span class="kwrd">this</span>);
            Content.RootDirectory = <span class="str">"Content"</span>;
        }

        <span class="rem">/// &lt;summary&gt;</span>
        <span class="rem">/// Allows the game to perform any initialization it needs to before starting to run.</span>
        <span class="rem">/// This is where it can query for any required services and load any non-graphic</span>
        <span class="rem">/// related content.  Calling base.Initialize will enumerate through any components</span>
        <span class="rem">/// and initialize them as well.</span>
        <span class="rem">/// &lt;/summary&gt;</span>
        <span class="kwrd">protected</span> <span class="kwrd">override</span> <span class="kwrd">void</span> Initialize() {
            <span class="rem">// TODO: Add your initialization logic here</span>

            <span class="kwrd">base</span>.Initialize();
        }

        <span class="rem">/// &lt;summary&gt;</span>
        <span class="rem">/// LoadContent will be called once per game and is the place to load</span>
        <span class="rem">/// all of your content.</span>
        <span class="rem">/// &lt;/summary&gt;</span>
        <span class="kwrd">protected</span> <span class="kwrd">override</span> <span class="kwrd">void</span> LoadContent() {
            <span class="rem">// Create a new SpriteBatch, which can be used to draw textures.</span>
            spriteBatch = <span class="kwrd">new</span> SpriteBatch(GraphicsDevice);

            <span class="rem">// TODO: use this.Content to load your game content here</span>
        }

        <span class="rem">/// &lt;summary&gt;</span>
        <span class="rem">/// UnloadContent will be called once per game and is the place to unload</span>
        <span class="rem">/// all content.</span>
        <span class="rem">/// &lt;/summary&gt;</span>
        <span class="kwrd">protected</span> <span class="kwrd">override</span> <span class="kwrd">void</span> UnloadContent() {
            <span class="rem">// TODO: Unload any non ContentManager content here</span>
        }

        <span class="rem">/// &lt;summary&gt;</span>
        <span class="rem">/// Allows the game to run logic such as updating the world,</span>
        <span class="rem">/// checking for collisions, gathering input, and playing audio.</span>
        <span class="rem">/// &lt;/summary&gt;</span>
        <span class="rem">/// &lt;param name="gameTime"&gt;Provides a snapshot of timing values.&lt;/param&gt;</span>
        <span class="kwrd">protected</span> <span class="kwrd">override</span> <span class="kwrd">void</span> Update(GameTime gameTime) {
            <span class="rem">// Allows the game to exit</span>
            <span class="kwrd">if</span> (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                <span class="kwrd">this</span>.Exit();

            <span class="rem">// TODO: Add your update logic here</span>

            <span class="kwrd">base</span>.Update(gameTime);
        }

        <span class="rem">/// &lt;summary&gt;</span>
        <span class="rem">/// This is called when the game should draw itself.</span>
        <span class="rem">/// &lt;/summary&gt;</span>
        <span class="rem">/// &lt;param name="gameTime"&gt;Provides a snapshot of timing values.&lt;/param&gt;</span>
        <span class="kwrd">protected</span> <span class="kwrd">override</span> <span class="kwrd">void</span> Draw(GameTime gameTime) {
            GraphicsDevice.Clear(Color.CornflowerBlue);

            <span class="rem">// TODO: Add your drawing code here</span>

            <span class="kwrd">base</span>.Draw(gameTime);
        }
    }
}
</pre>
</div>

以上で終了です。相変わらず簡単にXNAにWiimoteLibを読み込むことができました。

</div>]]>
        
    </content>
</entry>

<entry>
    <title>開発環境のダウンロード</title>
    <link rel="alternate" type="text/html" href="http://www.kosaka-lab.com/tips/2009/05/post.php" />
    <id>tag:www.kosaka-lab.com,2009:/tips//11.371</id>

    <published>2009-05-29T04:33:23Z</published>
    <updated>2009-05-29T04:37:23Z</updated>

    <summary>　XNAを用いると簡単にゲームなどを作ることができます。WiimoteLibと組...</summary>
    <author>
        <name>小坂崇之</name>
        
    </author>
    
        <category term="XNA" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.kosaka-lab.com/tips/">
        <![CDATA[<div>　XNAを用いると簡単にゲームなどを作ることができます。</div><div>WiimoteLibと組み合わせるとWiiリモコンの加速度に合わせて３Dオブジェクトを動かしたりすることもできます。</div><div><br /></div><div>　XNAとはMicrosoftが提供しているゲーム開発環境です。XNAを用いるとWindowsだけでなくXbox 360やZoneなどの環境でも動かすことができます。</div><div><br /></div><div>　XNAは無料で開発環境を手に入れることができます。だだしXBoxで開発するためには年間１万程度のライセンス料を払う必要がありますが、コンシューマゲーム機で開発できるのは大きな魅力です。</div><div><br /></div><div>　プログラム言語はC#で設計されているます。XNA Frameworkは、DirectXやManaged DirectXより、ゲーム開発に便利な関数が多く含まれており、簡単にプログラムでゲームを作成できるようになっています。</div><div><br /></div><div>XNAを用いてプログラムを開発するためには2つのソフトが必要です。</div><div><ul><li><a href="http://www.microsoft.com/japan/msdn/vstudio/Express/">Microsoft Visual C# 2008</a>&nbsp;</li><li><a href="http://www.microsoft.com/downloads/details.aspx?familyid=7D70D6ED-1EDD-4852-9883-9A33C0AD8FEE&amp;displaylang=en">XNA Game Studio 3.</a>0　</li></ul></div><div><br /></div> ]]>
        
    </content>
</entry>

<entry>
    <title>Wiiでラジコン（作成中）</title>
    <link rel="alternate" type="text/html" href="http://www.kosaka-lab.com/tips/2009/05/wii-2.php" />
    <id>tag:www.kosaka-lab.com,2009:/tips//11.370</id>

    <published>2009-05-28T10:23:45Z</published>
    <updated>2009-06-05T10:40:04Z</updated>

    <summary>　WiimoteLibを用いてWiiリモコンを制御する方法についていままで行って...</summary>
    <author>
        <name>小坂崇之</name>
        
    </author>
    
        <category term="改造" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.kosaka-lab.com/tips/">
        <![CDATA[　WiimoteLibを用いてWiiリモコンを制御する方法についていままで行ってきました。非常に簡単に制御することが分かったかと思います。<div>　今回は、その応用としてWiiリモコンを使ったラジコンを作ってみたいと思います。いきなり敷居が高くなったと思われるかと思いますが非常に簡単にできます。C#側のプログラムはLEDを制御するのと同じでできます。つまりWiiリモコンの４つのLEDのアウトプットでラジコンを制御できます。</div><div><br /></div><div>　wiiリモコンでラジコンカーを制御するものは、結構ありますが、これらはWiiリモコンをコントローラとして使用しているだけです。</div><div>　<a href="http://gigazine.net/index.php?/news/comments/20061222_wii_rc/">http://gigazine.net/index.php?/news/comments/20061222_wii_rc/</a></div><div>　<a href="http://www.inside-games.jp/news/329/32904.html">http://www.inside-games.jp/news/329/32904.html</a></div><div>今回、行うのは、Wiiリモコンをラジコンのモータを制御するという方法です。</div><div><br /></div><div><br /></div><div>&nbsp;LEDからの信号をモータドライバに接続することで、制御します。前進、後進、停止を２ビットのデータで表すことができます。LEDは４つあるので、２個のモータを制御することが可能です。</div><div><br /></div><div>一番難しいのは、「<b>Wiiリモコンを分解しEDに配線し、元通りに収めること</b>」かと思います。かなりの集中力が要求されます。</div><div><br /></div><div><br /></div><div>詳細については、おいおい書いていきます。</div><div><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.kosaka-lab.com/tips/img/DSC00378.JPG"><img alt="DSC00378.JPG" src="http://www.kosaka-lab.com/tips/assets_c/2009/05/DSC00378-thumb-320x240-590.jpg" width="320" height="240" class="mt-image-none" style="" /></a></span></div><div><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.kosaka-lab.com/tips/img/DSC00379.JPG"><img alt="DSC00379.JPG" src="http://www.kosaka-lab.com/tips/assets_c/2009/05/DSC00379-thumb-320x240-592.jpg" width="320" height="240" class="mt-image-none" style="" /></a></span></div><div><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.kosaka-lab.com/tips/img/DSC00380.JPG"><img alt="DSC00380.JPG" src="http://www.kosaka-lab.com/tips/assets_c/2009/05/DSC00380-thumb-320x240-594.jpg" width="320" height="240" class="mt-image-none" style="" /></a></span></div><div><br /></div><div><br /></div><div><br /></div>

<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/aAVHWXU2So4&amp;hl=ja&amp;fs=1" /><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><embed src="http://www.youtube.com/v/aAVHWXU2So4&amp;hl=ja&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></object>

<div>Wiiラジコンというよりは、Wiiタンクになってしまいました。</div><div><br /></div><div><br /></div><div>　これは夢が広がります。</div><div>もう一台、Wiiリモコンを用意して、そのWiiを傾けると、Wiiラジコンが進みます。Wiiフィットで制御しても面白そうです。赤外線カメラが搭載されているので、赤外線を自動に追尾して動くものや、ライントレーサとしても使うことができますね。</div>]]>
        
    </content>
</entry>

<entry>
    <title>Wiiリモコンの青色LEDを赤色LEDに変更</title>
    <link rel="alternate" type="text/html" href="http://www.kosaka-lab.com/tips/2009/05/wiiledled.php" />
    <id>tag:www.kosaka-lab.com,2009:/tips//11.361</id>

    <published>2009-05-12T02:29:15Z</published>
    <updated>2009-05-12T02:39:12Z</updated>

    <summary>　WiiリモコンのLEDは青色です。赤色に改造して人とは違うWiiリモコンにする...</summary>
    <author>
        <name>小坂崇之</name>
        
    </author>
    
        <category term="改造" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.kosaka-lab.com/tips/">
        <![CDATA[　WiiリモコンのLEDは青色です。赤色に改造して人とは違うWiiリモコンにすることができます。<br />
WiiリモコンのLEDを赤色にするためには、Wiiリモコンを分解する必要があります。が、一度バラしてしまうと任天堂のサポートが受けれません。
また、失敗してWiiリモコンが破損する可能性もありますので、各自、<u><b>自分の責任</b></u>で行ってください。 <div><br /></div><div>　この赤色にLEDを変更することは、改造に該当し、小坂研究室としても推奨していません。純正品をそのまま使うことを推奨しています。 <div><br /></div><div>


<h6 id="page-title-date">1.Wiiリモコンを分解します。</h6> 
<blockquote> 
　Wiiリモコンは特殊なネジを使用していますので、普通のドライバで開けることはできません。専用ドライバを使うか、精密ドライバのマイナスを差し込むことで回すことができます。力をうまくかけないとネジ穴が潰れる可能性があります。

<div style="TEXT-ALIGN: center"><img src="http://www.kosaka-lab.com/tips/img/led_01.jpg" /></div> 
<p>　</p> 
 
分解すると下図のようになります。4か所が青色LEDチップです。その横についている黒い部分がLED抵抗です。
<div style="TEXT-ALIGN: center"><img src="http://www.kosaka-lab.com/tips/img/led_02.jpg" />

</div></blockquote> 
 
 
 
<h6 id="page-title-date">2.青色LEDを外す</h6> 
 
 
<blockquote>
　半田付け作業に慣れていない方には難しい作業ですが、電子工作が得意な方にはそれほど難しくありません。
ここでは、簡単に基盤からチップLEDの取り外し方を示します。</blockquote><blockquote>　下図のようにチップLED全体を半田付して熱します。その状態で基盤を持って半田を振り払うと、半田と共にチップLEDが飛んでいきます。難しい方は、
チップLED全体を半田付しておいて、ハンダ吸引器なのでチップLEDごと吸い取ってしまえば良いです。ただし、取り外した青色チップLEDを再度使うのはあきらめてください。
<div style="TEXT-ALIGN: center"><img src="http://www.kosaka-lab.com/tips/img/led_03.jpg" /></div> 
<p>　</p> 
若干、ゴケてしましたが、無事にLEDが取れました。
<div style="TEXT-ALIGN: center"><img src="http://www.kosaka-lab.com/tips/img/led_04.jpg" /></div> 

</blockquote> 
 
 
 
<h6 id="page-title-date">3.赤色LEDを取り付ける</h6> 
<blockquote>
　あとは取り外した部分に、赤色LEDを取り付ければ完成です。
これにも若干コツが必要ですが、ゆっくり慎重にハンダ付を行えば問題ないです。 簡単ですが、無事に赤色に光りました。
<div style="TEXT-ALIGN: center"><img src="http://www.kosaka-lab.com/tips/img/led_05.jpg" /></div> 
<blockquote> 

 
 </blockquote></blockquote></div></div>]]>
        
    </content>
</entry>

</feed>
