ホチキス先生の「プログラマーと呼ばれたい」

InfoPath & SQL Server !

Archive for the ‘シリアル通信’ Category

Arduino UNO と XBee で双方向無線通信のテストをする。

with one comment

Arduino に XBee を取り付けると、シリアル通信を無線化することができる。シリアル通信は双方向に送受信できるので、PC側から XBee によってデータを送り、Arduino で受け取ったデータを判断して結果を返す、という実験をする。

Arduino と XBee はあらかじめ設定しておく。通信の対になる XBee も設定しておき、通信できる状態にする。一方の XBee は XBee Wireless プロトシールドで Arduino に載せ、もう一方の XBee はXBee USB アダプターで PC に接続する。

Arduino_XBee_双方向通信_003_IMG_6553_mid_640_480

<Fig.1 : XBee を載せた Arduino と USB アダプターで PC に接続した XBee>

Arduino のスケッチは次のようなものだ。シリアルポートから受け取ったデータを数値に変え、値が正か負かゼロかを判断している。受け取った値が正なら「It is bigger than 0」、値が負なら「It is smaller than 0」、値がゼロなら「It is the same as 0」の文字列を送る。

————————————————————————————

int i = 1;
void setup()
{
  Serial.begin(9600);
}
void loop()
{
  while (Serial.available() > 0) {
    int i = Serial.parseInt();
    if (i > 0) {
      Serial.print("It is bigger than 0");
      Serial.print("\n");
      }
    if (i < 0) {
      Serial.print("It is smaller than 0");
      Serial.print("\n");
    }
    if (i == 0) {
      Serial.print("It is the same as 0");
      Serial.print("\n");
    }
  }
}

————————————————————————————

Arduino_XBee_双方向通信_002

<Fig.2 : 双方向通信をテストするArduinoのスケッチ>

スケッチを Arduino に書き込んだら PC から切り離して XBee Wireless プロトシールドで XBee を載せ、別電源を使って USB に給電して動かす。次に PC に XBee を載せた XBee USB アダプターを接続し、XBee でシリアル通信を行う。シリアル通信には X-CTU を使ってみる。

X-CTU を起動したら Terminal タブを開き、シリアル通信を行う。正の数や負の数、ゼロを送信し、正しい結果が返ってくることを確かめる。Arduino を PC から離し、どの程度の距離まで通信するか、障害物があれば通信が途絶えるか、などを確かめる。

Arduino_XBee_双方向通信_001

<Fig.3 : X-CTU を使った XBee 無線シリアル通信のテスト>

広告

Written by Yoshio Matsumoto

2014年1月18日 at 2:30 PM

Arduino UNOをWindows 7に接続しVisual Studio 2010 Expressを使ってC#でプログラミングし制御する – その2 – 光センサの値をArduinoで読みとりシリアルポートでPCに送信する

with one comment

ArduinoはUSBインタフェースをもっており、PCで作った「スケッチ」と呼ぶプログラムをArduinoにアップロードするために使われるが、このUSBインターフェースを介してArduinoとPCの間でデータ通信をさせることもできる。このとき、物理的にはUSBインタフェースを使うが、プログラム上はシリアル通信でデータを送受信する。なぜUSBでシリアル通信ができるかといえば、ArduinoにはシリアルコンバーターATmega8U2が組み込まれており、一方PC側にはArduino用のシリアルUSBドライバをインストールしてあるからである。

コンピュータのコントロールパネルから「デバイスマネージャ―」を開き「ポート」を展開すると「Arduino UNO R3 (COM3)」ドライバがあるのがわかる。そしてドライバのプロパティを開き「ポートの設定」をみると、シリアル通信の定義がわかる。またここで「詳細設定」のボタンをクリックすれば「COMポート番号」を変更することができる。

Arduino_002_Serial_001_mid_640

<Fig.1 : デバイスマネージャでArduino UNO R3ドライバを確認する>

Arduino_002_Serial_002

<Fig.2 : Arduino UNO R3ドライバのプロパティでポートの設定を確認する>

まずArduinoとPCでシリアル通信のテストをしてみよう。Arduinoには一定の間隔でデータをシリアルポートに送信するスケッチを書き、実行する。PC側ではシリアル通信のデータを受け取るコンソールアプリケーションを作る。

Arduinoのスケッチは次のようになる。一定の間隔で変数iをカウントアップし、シリアルポートに送信するものだ。

Arduino_002_Serial_003

<Fig.3 : シリアルポートからカウントアップした値を連続出力するスケッチ>

次にVisual Studioでシリアルポートからデータを受信するコンソールアプリケーションを作る。System.IO.Ports名前空間を追加しておくことを忘れずに。

————————————————————————————

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;

namespace Arduino_001_Com_Read
{
    class Program
    {
        static bool running = true;
        static void Main(string[] args)
        {
            SerialPort mySerialPort = new SerialPort("COM3");
            mySerialPort.BaudRate = 9600;
            mySerialPort.Open();
            while (running)
            {
                string myData = mySerialPort.ReadLine();
                Console.WriteLine(myData);
            }
        }
    }
}

————————————————————————————

Arduinoに作ったスケッチを書き込んでおく。スケッチを書き込むとArduinoはシリアルポートに対して数字をカウントアップしながらデータを出力し始める。一方PCではシリアルデータを受け取るコンソールアプリケーションをビルドし起動する。するとコンソールにArduinoから数字データが連続して受信されることが確認できる。これでArduinoからPCにシリアルデータが送受信できたことが確かめられた。

Arduino_002_Serial_004_mid_640

<Fig.4 : コンソールアプリケーションでArduinoからシリアルポートに送信される数字データを受信する>

ではArduinoに光センサを取り付け、センサの値を読み取ってシリアルポートに送信してみよう。光センサとArduinoの接続はブレッドボードを使うといいだろう。Arduinoのアナログ入力はA0を使うこととし、ピンA0を光センサの一方の端子に接続する。次の写真では緑色のジャンパワイヤを使っている。光センサのもう一方の端子はArduinoの5V出力に接続する。写真では赤色のジャンパワイヤだ。ArduinoのピンA0に接続した光センサの端子には、10kΩの抵抗をつけ、ArduinoのGNDへ接続する。

Arduino_002_Serial_005_circuit_2_mid_640

<Fig.5 : Arduinoと光センサ、抵抗の接続図>

先に作ったArduinoのテスト用スケッチをスケッチを次のように変更する。シリアルポートに出力するiの値をアナログI/OのA0から取得し、改行する。Serial.print()の第2引数「DEC」は出力フォーマットを10進数にするという意味だ。また値を取得する間隔を一定程度あけるため、delay(1000)を書いている。delayの単位はミリ秒なので、delay(1000)は1秒だ。

Arduino_002_Serial_006

<Fig.6 : Arduinoで光センサの出力をシリアルポートに送信するスケッチ>

Arduinoにスケッチを書きこんだら、シリアルポートに光センサの値を出力しはじめる。Visual Studioで作ったシリアルポートの値を取得するコンソールアプリケーションは最初に作ったテスト用のものでいい。コンソールアプリケーションを起動すると次のように光センサの出力を受信しはじめる。光センサを手で覆ったり、部屋の明かりを強くしたりしてセンサの出力が変わることを確かめよう。

Arduino_002_Serial_007_mid_640

<Fig.7 : Arduinoから光センサの出力を受け取るコンソールアプリケーション>

Arduinoはスタンドアロン型のマイコンボードだが、このようにセンサの値ををシリアル出力にするインタフェースとして使うこともできる。光センサを温度センサや距離センサに置き換えると、温度や距離をPCで受け取ることもできる。Arduinoで各種センサを使う方法はいくつかの書籍で紹介されており、Webでも公開されている。Arduinoとブレッドボードを使えば、はんだ付けをする必要なくセンサの実験ができる。教科「情報」でセンサの実習に使うこともできるだろう。

●関連記事

「Arduino UNOをWindows 7に接続しVisual Studio 2010 Expressを使ってC#でプログラミングし制御する – その1 – シリアルポートで文字を送信しLEDをON、OFFする」
https://matsumotoyoshio.wordpress.com/2013/02/03/arduino-uno%e3%82%92windows-7%e3%81%ab%e6%8e%a5%e7%b6%9a%e3%81%97visual-studio-2012-express-for-windows-desktop%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6c%e3%81%a7%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9/

Arduino UNOをWindows 7に接続しVisual Studio 2010 Expressを使ってC#でプログラミングし制御する – その1 – シリアルポートで文字を送信しLEDをON、OFFする

with one comment

Arduinoは「アルドゥイーノ」と読み、AVRマイコンと入出力ポートを備えた基板、C言語風のArduino言語とそれの統合開発環境から構成されるシステムで、2005年にイタリアで始まったプロジェクトで、学生向けの安価なロボット製造用コントロールデバイスのプロトタイピング・システムを製造する目的で設計された。スタンドアロン型のインタラクティブデバイスとしてだけでなく、ホストコンピュータ上のソフトウェアで制御することもできる。オープンソースハードウェアであり、ハードウェア設計情報が公開され、誰でも自分の手で組み立てることができるが、多くの組み立て済みの基板が販売されており、またLEDや抵抗、ジャンパケーブルなど実験に必要な部品をあわせたキットもあり、これらを購入して手軽に実験を始めることができる。

コンピュータとの接続はRS-232シリアル接続で行う設計がされているが、発展形のモデルにはUSB-to-serial アダプタチップが表面実装されるなどしており、USBでコンピュータに接続するようになっている。Arduino UnoではFTDIを使わずAVRマイコンにUSBシリアル変換機能を搭載し、このマイコンにプログラムすることで様々なUSBデバイスとして動作させることができるようになっている。今回の実験で使ったのは、Physical Computing Labが発売している「Arduinoエントリーキット」だ。

IMG_1342_mid_640_480

<Fig.1 : Physical Computing Labの「Arduinoエントリーキット」>

いくつかの日本語の書籍が出版されているので参考にすることができるが、C#によるプログラミングでArduinoを制御したかったので、洋書「Getting Started with Arduino and .NET」をKindleストアで購入した。著者はAgus Kurniawanだ。このような技術書を読むには一般サイズのKindleでは小さすぎ、Kindle DXを使うのがいい。

IMG_1344_mid_640_480

<Fig.2 : Kindleストアで購入しKindle DXで開いた洋書「Getting Started with Arduino and .NET」>

「Arduinoエントリーキット」にはArduino UNOが入っている。これを付属のUSBケーブルでPCに接続しよう。

IMG_1345_mid_640_480

<Fig.3 : Arduino UNOを付属のUSBケーブルでPCに接続する>

Windowsがドライバを適用しようとするが、デバイスドライバがないため、デバイスドライバのインストールに失敗する。コントトールパネルのデバイスマネージャをみてみよう。

20130202_ArduinoInstall_001_mid_640

<Fig.4 : デバイスマネージャでArduino UNOは「不明なデバイス」となっている>

Arduinoの開発環境とデバイスドライバは、http://arduino.cc/en/Main/Softwareから取得することができる。Windows用のソフトウエアをダウンロードし、解凍する。ドライバは「drivers」フォルダに入っているので、デバイスマネージャで「ドライバーソフトウエアの更新」を行う。「不明なデバイス」が「ポート(COMとLPT)」の下に「Arduino UNO R3 (COM3)」となればドライバのインストールが完了だ。

20130202_ArduinoSoftware_001_edit_002_mid_640

<Fig.5 : 開発ツールとドライバをダウンロードするし解凍したArduino.cc>

20130202_ArduinoInstall_005_mid_640

<Fig.6 : ダウンロードし解凍したArduinoソフトウエアのファイル>

20130202_ArduinoInstall_004_mid_640

<Fig.7 : デバイスマネージャでドライバーソフトウエアの更新」を行いArduino UNO R3 (COM3)を認識した>

ダウンロードしたArduinoソフトウエアのフォルダにあるarduino.exeがArduinoソフトウエアで提供される開発環境だ。専用の開発環境でテストをするためにarduino.exeを起動しよう。開発ツールは多言語化されており、そのままでメニュー等は日本語になっている。最初に起動したとき、シリアルポートの認識に失敗することがある。開発ツールの右下にCOMポートが表示されているので、もしデバイスマネージャに表示されたCOMポートと異なる表示であれば、「ツール」の「シリアルポート」で設定をする。

20130202_ArduinoDevelop_001_edit

<Fig.8 : Arduino開発ツールでシリアルポートの設定をする>

Arduino開発ツールでは、プログラムは「スケッチ」と呼ばれており、いくつかのチュートリアル的なサンプルプログラムがあらかじめ開発ツールに用意されている。まずLEDを点滅させるプログラムを実行し、Arduinoの動作を確認しよう。サンプルプログラムは「ファイル」メニューの「スケッチの例」から呼び出すことができる。「01.Basics」の中から「Blink」を呼び出すと開発ウィンドウが新たに別ウィンドウで表示される。

ArduinoにはLEDと抵抗を13番のディジタル出力ピンとGNDに接続する。キットに付属のブレッドボードを使うと良いだろう。サンプルコードの「Blink」では、13番ディジタル出力の出力を1000msごとにHighレベルとLowレベルを切り替えている。コードを確認し、コンパイルしてArduinoに書き込み動作を確認しよう。

IMG_1365_mid_640_480

<Fig.9 : ブレッドボードを使ってArduinoにLEDと抵抗を接続する>

IMG_1366_mid_640_480

<Fig.10 : 「Blink」のサンプルコードでLEDが点滅する(1)>

IMG_1367_mid_640_480

<Fig.11 : 「Blink」のサンプルコードでLEDが点滅する(2)>

ではArduinoがPCからシリアルポートで受信した文字によってLEDをON、OFFするプログラムをしよう。Arduinoでシリアルポートを監視し、文字を受け取るプログラムは「スケッチの例」の「09.USB」にある「KeyboardAndMouseControl」を参考にすると良いだろう。シリアルポートで受け取った文字が「h」ならLEDを光らせ、「l」なら消すプログラムとし、できたらArduinoに書き込もう。

20130202_ArduinoDevelop_004

<Fig.12 : Arduinoのシリアルポートを監視し、送られた文字でLEDをON、OFFするスケッチ>

次にVisual Studioでシリアルポートに文字を送るコンソールアプリケーションを作る。System.IO.Ports名前空間を追加しておくことを忘れずに。

————————————————————

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;

namespace Arduino_002_Com_Write
{
    class Program
    {
        static bool running = true;
        static string mySwitch = "l";

        static void Main(string[] args)
        {
            while (running)
            {
                SerialPort mySerialPort = new SerialPort("COM3");
                mySerialPort.BaudRate = 9600;
                mySerialPort.Open();
                mySerialPort.Write(mySwitch);
                mySerialPort.Close();

                mySwitch = Console.ReadLine();
            }
        }
         
    }
}

————————————————————

作ったコンソールアプリケーションをビルドし、コンソールで「l」や「h」の文字を入力すると、Arduinoに接続したLEDがON、OFFすることが確かめられる。

20130202_ArduinoDevelop_005_mid_640

<Fig.13 : Visual Studioで作ったコンソールアプリケーションからArduinoのシリアルポートに文字を送る>

IMG_1370_mid_640_480

<Fig.14 : コンソールアプリケーションから文字を受け取りArduinoがLEDをON、OFFする>

●追記:C#ソースコードに名前空間を追加(2013/06/01)

●関連記事

「Arduino UNOをWindows 7に接続しVisual Studio 2010 Expressを使ってC#でプログラミングし制御する – その2 – 光センサの値をArduinoで読みとりシリアルポートでPCに送信する」
https://matsumotoyoshio.wordpress.com/2013/06/02/arduino-uno%e3%82%92windows-7%e3%81%ab%e6%8e%a5%e7%b6%9a%e3%81%97visual-studio-2010-express%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6c%e3%81%a7%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9f%e3%83%b3/