2015年10月25日

番外編 -I2C その1(概要)

今回はI2C(アイ・スクウェアド・シー)という通信方式について説明します。I2Cはシリアル通信と同様に電子工作ではよく使われる通信方式です。


目次


1. 概要

I2Cは以前に作成した記事(デジタル通信のルール)で説明した言葉で表すと、以下のような通信方式です。
I2Cはシリアル通信と同様にシングルエンドでシリアル伝送な通信方式ですので、通信速度は高速な部類ではありません。ただ、シリアル通信が非同期方式であるのに対してI2Cは同期方式ですので、シリアル通信よりはI2Cの方が高速です


図1はI2Cの接続図です。SCLがクロックSDAがデータの信号線です。I2Cはこの2本の信号線で通信を行います。

oct25_I2C_1-1.png
図1 I2C接続図

I2Cで使用する部品は行う動作によってマスターとスレーブの2種類に分けられます。マスターとスレーブについては2. マスターとスレーブで説明します。

I2CはSCLもSDAもオープンコレクタ出力であるため、双方向通信が可能です。SCLは常にマスターからスレーブへの一方通行ですが、SDAはマスターとスレーブで入力側と出力側が入れ替わる双方向通信です。
また、SCLもSDAもオープンコレクタ出力であるため、SCLとSDAにはプルアップ回路が必要です。


2. マスターとスレーブ

図1で描いたようにI2Cにはマスターとスレーブがあります。それぞれの役割を以下に記します。
  • マスター:クロック信号や命令を出す側。Arduinoなどのマイコンが担当する
  • スレーブ:クロック信号や命令を受け取る側。LCDなどの周辺機器が担当する
このようにI2Cではマスターの命令に従ってスレーブが動作します。マスターが出す命令は大きく分けて2つです。
  1. 複数あるスレーブの内、どのスレーブと通信するか
  2. Read(マスターがスレーブからデータを読み込み)かWrite(マスターがスレーブにデータを書き込み)か

スレーブとして動く部品にはアドレスという固有の番号が部品メーカーによって割り振られています。マスターはアドレスを使うことで、通信を行うスレーブを指定することができます。
アドレスは基本的に7[bit]の2進数です。たまに10[bit]のアドレスもあります。

I2Cではまず、図2のようにマスターがどのスレーブと通信するかの命令を送ります。このとき、この命令は全てのスレーブが受け取ります。
また、R/W(Read/Write)のどちらを行うかの命令もアドレスと一緒にスレーブへ送っています
なお、マスター-スレーブ間でやり取りするデータは総てSDAの線で行います。ですので、図2と図3ではSCLを省略しています。

oct25_I2C_2.png
図2 マスターからスレーブへの命令

マスターが指定したアドレスと一致するスレーブは図3のようにマスターに対して通信可能であることの返事を行います。この返事をACK(アック)といいます。ACKはacknowledgementの略です。
マスターが指定したアドレスと一致しないスレーブは何もしません。

oct25_I2C_3.png
図3 スレーブからマスターへのACK

マスターはスレーブからのACKを確認してから、データのやり取りを始めます。


このようにI2Cでは双方向通信やアドレス、ACKなどを活用しています。ただし、これらの命令はマスターとスレーブが互いに通信の手順を守らなければいけません。手順を守らなければ、互いの信号をうまくやり取りすることができません。
次回はI2Cの通信手順について説明します。


参考資料

  1. 作者名:後閑哲也. "I2C通信の使い方". サイト名:電子工作の実験室. http://www.picfun.com/c15.html, (参照日:2015-10-25)
  2. 作者名:Shigehiro Kimura. "I2Cの実験(1/5)". サイト名:きむ茶工房ガレージハウス. http://www.geocities.jp/zattouka/GarageHouse/micon/I2C/I2C_1.htm, (参照日:2015-10-25)
  3. 作者名:NXP Semiconductors. "I2C バス仕様およびユーザーマニュアル". サイト名:NXP Semiconductors. http://www.nxp.com/documents/user_manual/UM10204_JA.pdf, (参照日:2015-10-25)

インターネットガジェット入門 面白チャレンジ! USB、I2C、UART、XBee・・・自由自在

価格:1,944円
(2015/10/25 15:01時点)
感想(0件)

posted by ました at 16:50| Comment(0) | TrackBack(0) | 電子工作の知識 | このブログの読者になる | 更新情報をチェックする

2015年10月18日

番外編 -オープンコレクタ出力

今度使おうとしている部品がI2C(アイスクウェアドシー)という通信方式をつかっており、そのI2Cではピンの出力がオープンコレクタ出力という方式です。
I2Cもオープンコレクタ出力も今までに使ったことがありませんので、今回と次回でそれらの説明をします。今回はまずオープンコレクタ出力について説明します。


目次



1. CMOS出力

オープンコレクタ出力を説明する前に普通の出力について説明します。
電子部品はデジタル信号をやり取りするためにHigh/Low 2つの電圧を出力できるようになっています(参照:LED制御(スイッチ) -第2回)。電子部品の中にはスイッチのような回路があり、この回路が電源側やGND側に切り替わることでHigh/Lowを出力します。

OCt18_CMOS出力_1.png
図1 HighとLowを出力できる電子部品のイメージ

OCt18_CMOS出力_2.png
図2 Low出力時のイメージ

OCt18_CMOS出力_3.png
図3 High出力時のイメージ

スイッチのような回路の仕組みは電子部品によって異なりますが、CMOS(しーもす)出力という方式が多いです。次によく使われるのはTTL(てぃーてぃーえる)出力です。
本ブログではこのようなHigh/Lowの2つを出力できる方式をCMOS出力と呼ぶことにします。


2. オープンコレクタ出力とは

オープンコレクタ出力もCMOS出力と同様に電子部品の中にスイッチのような回路があります。CMOS出力と違うのはオープンコレクタ出力の場合、GNDに接続するかしないかということです。電源側とは繋がりません。

OCt18_オープンコレクタ_1.png
図4 オープンコレクタ出力のイメージ

ちなみにオープンコレクタ出力という名前ですが、電子部品の中にトランジスタのスイッチング回路のようなものがあるからです。出力ピンはトランジスタのコレクタ側がそのまま接続されています。コレクタ側が他の部品に繋がっていない(=オープン)状態ですので、オープンコレクタ出力といいます。

OCt18_オープンコレクタ_2.png
図5 オープンコレクタ出力内部のイメージ

さてオープンコレクタ出力の出力についてですが、GND側に接続されたときはLowが出力されます。これはCMOS出力と同じです。

OCt18_オープンコレクタ_3.png
図6 オープンコレクタ出力Low出力時のイメージ

一方、GND側と切断されているときは、出力ピンがどこにも繋がりません。オープンコレクタ出力の電子部品はこの状態のときに、出力ピンの抵抗値がとても高くなるように作られています。このような高い抵抗値(≒インピーダンス)の状態をハイ・インピーダンス(Hi-Z)といいます。

OCt18_オープンコレクタ_4.png
図7 オープンコレクタ出力Hi-Z出力時のイメージ

ただし、出力がHi-Zだと電圧が分からない(=不定)ので、デジタル信号をただしくやりとりすることができません。
そこで、オープンコレクタ出力の場合はプルアップ回路が必須となります。プルアップ回路を付けることでオープンコレクタ出力がHi-Zのとき出力ピンはHighとなります。オープンコレクタ出力がLowのときは出力ピンもLowです。プルアップ回路についての説明は以下を参照してください。

OCt18_オープンコレクタ_5.png
図8 プルアップ回路付きオープンコレクタ出力

以上でオープンコレクタ出力の説明は終わりです。


3. オープンコレクタ出力の活用

さて、オープンコレクタ出力について説明しましたが、オープンコレクタ出力は主に複数の出力を1本の線でまとめたいときに活用されます。
図9はオープンコレクタ出力を複数まとめたときの回路です。

OCt18_オープンコレクタ_複数_1.png
図9 オープンコレクタ出力の複数接続(通常時)

ちなみにオープンコレクタ出力では何もしないときはHi-Z状態としますので、普段はHighを出力しています。Lowにしたいときだけ、出力をLowにします。

図10のように電子部品の内どれか1つでもLowになれば、出力はLowになります。このときHi-Z状態の電子部品はHi-Zを状態のままで、大丈夫です。

OCt18_オープンコレクタ_複数_2.png
図10 オープンコレクタ出力の複数接続(Low出力時)

このように複数のオープンコレクタ出力をまとめることができます。この接続方法については次回のI2Cで詳しく説明します。


なお、複数のCMOS出力をまとめることは絶対にしないでください。
CMOS出力を複数まとめるとどこかでHighとLowがぶつかります。その状態は電源とGNDが抵抗値0[Ω]で接続されている状態(=ショート)ですので、電源が流せる限りの電流を流します。大量の電流が流れると、動作不良、部品の破壊、煙の発生、出火、爆発が考えられますので、複数のCMOS出力をまとめることは絶対にしないでください。

OCt18_オープンコレクタ_複数_3.png
図11 CMOS出力の複数接続(ダメな例)


今回の説明をまとめます。
  • 電子部品のデジタル信号の出力方式は主にCMOS出力とオープンコレクタ出力がある(他にもあります)
  • CMOS出力はHigh/Lowを出力
  • オープンコレクタ出力はHi-Z/Lowを出力。プルアップ回路が必要
  • 複数のオープンコレクタ出力をまとめることができる

次回はオープンコレクタ出力を利用する通信方式I2Cについて説明します。


【送料無料】 マイコンの1線2線3線インターフェース活用入門 PICとH8で具体的な1‐Wire、SPI、I2Cプログラミングを行う マイコン活用シリーズ / 中尾司 【単行本】

価格:2,808円
(2015/10/18 14:32時点)
感想(0件)

posted by ました at 15:00| Comment(0) | TrackBack(0) | 電子工作の知識 | このブログの読者になる | 更新情報をチェックする

2015年10月11日

シリアル通信 -第4回:PCアプリに受信処理の追加

前回はシリアル通信ができるWindowsアプリを作成し、パソコンからArduinoへデータを送りました。今回はArduinoからパソコンへデータを送ります。
今回は図1のようにスイッチで7セグメントLEDの表示を時刻か日付に切り替えられるものを作ります。赤字が前回からの変更点です。

Oct11_シリアル通信アプリ2_1.png
図1 作成物概要


目次



1. Arduino側

Arduino側の変更点はスイッチが押されたことをシリアル通信にてWindowsアプリへ伝えることです。Windowsアプリへ伝えるには何でもいいからデータを送ればよいので、今回はスイッチが押されたら"A"の文字を送るようにします。

Oct11_シリアル通信アプリ2_2.png
図2 Arduino変更点

図2を実現するためにはプルダウン回路の追加や立ち上がりの検出などを行う必要がありますが、どちらも以前に行っておりますので説明はそちらを参照してください。

以下に回路図とスケッチを載せます。スケッチは拡張子を「.ino」から「.txt」に書き換えています。

Oct11_プルダウン付き7セグメントLED回路図.png
図3 回路図


なお、図3の回路図では結線を省略して書いています。図4のように同じ名前の線同士は繋がっています。

Oct11_シリアル通信アプリ2_3.png
図4 結線の省略


2. Windowsアプリ側

Windowsアプリでは"A"の文字を受信したらArduinoへ送るデータを日付と時刻で切り替えるようにします。

Oct11_シリアル通信アプリ2_5.png
図5 Windowsアプリ変更点


Windowsアプリでは新しくシリアル通信の受信処理を追加します。ただ、私がまだ説明できるほど詳しくありませんので、詳細は参考資料を参照してください。

プロジェクト自体は前回と同じですので、今回はコードのみアップロードしています。コードは拡張子を「.cs」から「.txt」に書き換えています。


3. 動作

作成した物を実際に動かしました。スイッチを押すと時刻(分分秒秒)と日付(1011)が切り替わっています。




これでWindowsアプリでシリアル通信の受信ができるようになりました。次回もシリアル通信を使って何か作ろうと思います。


参考資料

  1. 著書名:金城俊哉. 書名:Visual C# 2013 パーフェクトマスター.  出版社:秀和システム, 出版年:2013
  2. 作者名:青柳 臣一. ".NET Framework 2.0 コア機能解説 〜 第 2 回 シリアルポートのサポート 〜". サイト名:Microsoft Developer Network. https://msdn.microsoft.com/ja-jp/library/cc825644.aspx, (参照日:2015-10-04)
  3. 作者名:金澤 宣明. "C#でシリアル通信を行う". サイト名:金澤ソフト設計. http://kana-soft.com/tech/sample_0007.htm, (参照日:2015-10-04)


サインスマート RFID マスターキット モーターサボー、LCD、多種のセンサー Arduino IDE/AVR/MCU勉強者用

価格:11,300円
(2015/10/11 15:53時点)
感想(0件)

posted by ました at 16:39| Comment(0) | TrackBack(0) | 電子工作の実践 | このブログの読者になる | 更新情報をチェックする

2015年10月04日

シリアル通信 -第3回:PCアプリで通信

今回はシリアル通信を使って、7セグメントLEDに数字を表示します。シリアル通信はArduino IDEのシリアルモニタで行わずに、Visual C#でシリアル通信用のWindowsアプリを作成して行います。

Oct03_シリアル通信アプリ_1.png
図1 作成物概要

ただし、C#については詳しくありませんので、アプリについては動作概要のみ説明します。


目次



1. シリアル通信アプリ

シリアル通信をするために以下のようなアプリを作りました。

Oct03_シリアル通信アプリ_2.png
図2 シリアル通信アプリ

  1. COMポートとボーレートを設定できる
  2. 「接続」をクリックするとシリアル通信を開始し、現在時刻を送信する
  3. 「切断」をクリックするとシリアル通信を終了する
  4. 状況をテキストに表示する

このアプリを使えば、パソコンの現在時刻をシリアル通信で送ることが出来ます。
時刻の表示形式は「時時分分」です。7セグメントLEDが4桁までの数字しか表示できないので、この形式にしました。

作成したプロジェクトとテキスト形式に変更したソースファイルを以下にアップロードしています。


2. Arduinoスケッチ

Arduinoは以下の動作を行っております。
  1. シリアル通信で4桁の時刻を受信する
  2. 受信した時刻を7セグメントLED表示用の形式へ変換する
  3. 変換した時刻を7セグメントLEDに表示する

今回新規で行うのは1番と2番です。3番は以前との7セグメントLED制御を流用しています。

1番について説明します。以前の記事では、Serial.avaiable()関数を使って受信したかどうかを確認しながら処理を行っていました。このときは1文字ずつ処理すればよかったので、確認することは受信したかどうかだけでした。
一方、今回は時刻を表示するために4桁ごとに受信しなければなりません。4桁ごとに受信できなければ、正しく「時時分分」の並びで表示することが出来ません。
今回のスケッチではSerial.avaiable()関数を使い、4文字受信したかどうかを確認しながら処理を行っています。

Oct03_シリアル通信アプリ_3.png
図3 4桁ごとの受信概要


2番について説明します。プログラミングの世界にはというものがあり、おおざっぱに言うと表示するための1(char型)と計算に使う1(int型)は別物ということです。
シリアル通信でやり取りした数字は表示用の数字、7セグメントLEDに表示する数字は計算用の数字です。ですので、シリアル通信で受信した数字を7セグメントLEDへ表示するには、数字を表示用(char型)から計算用(int型)へ変換する必要があります。
今回のスケッチではatoi()関数を使って変換を行いました。

Oct03_シリアル通信アプリ_4.png
図4 型変換の概要

作成したスケッチを以下にアップロードしています。(本来の拡張子は「.ino」ですが、「.txt」に書き換えています)
また、7セグメントLEDの制御方法は以前と同じですが、見やすいようにスケッチを書き換えています。(ダイナミック点灯の関数化、消灯処理の追加)


3. 動作

作成したアプリでArduinoを実際に動かしてみました。なお、表示時刻は見やすくするために「時時分分」から「分分秒秒」へ変更しています。
接続をクリックすると7セグメントLEDの表示が現在時刻になり、切断をクリックすると止まるのが分かると思います。

https://youtu.be/Vgt1OBG1QCU


これでパソコンのアプリとArduinoでシリアル通信を行うことができました。
次回はパソコンがArduinoからのデータを受信できるようにしてみたいと思います。


参考資料

  1. 著書名:金城俊哉. 書名:Visual C# 2013 パーフェクトマスター.  出版社:秀和システム, 出版年:2013
  2. 作者名:青柳 臣一. ".NET Framework 2.0 コア機能解説 〜 第 2 回 シリアルポートのサポート 〜". サイト名:Microsoft Developer Network. https://msdn.microsoft.com/ja-jp/library/cc825644.aspx, (参照日:2015-10-04)
  3. 作者名:金澤 宣明. "C#でシリアル通信を行う". サイト名:金澤ソフト設計. http://kana-soft.com/tech/sample_0007.htm, (参照日:2015-10-04)

Visual C# 2013逆引き大全555の極意 [ 増田智明 ]

価格:2,808円
(2015/10/4 14:37時点)
感想(0件)

posted by ました at 14:37| Comment(0) | TrackBack(0) | 電子工作の実践 | このブログの読者になる | 更新情報をチェックする