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) | 電子工作の実践 | このブログの読者になる | 更新情報をチェックする

2015年09月27日

番外編 -7セグメントLED基板の作成

シリアル通信を使って何かする予定でしたがまだ何をするか決めていないので、とりあえず今回は7セグメントLEDのArduino用シールド基板を作ります。
シールドとはArduinoの上に取り付けられる基板のことです。回路をシールドとして実装すれば、シールドを抜き差しするだけで回路を変更することが可能です。
7セグメントLEDの回路は以前も作成しており今後も出番が多そうですので、シールド化します。

IMG_8414.jpg



Sunhayato/サンハヤト UB-ARD03 Arduino用ユニバーサル基板

価格:345円
(2015/9/27 15:49時点)
感想(0件)


目次



1. 回路設計

基本的な設計は以前に作成したダイナミック点灯式の7セグメントLED回路と同じです。下図のLEDスイッチング回路を7セグメントLEDを制御するのに必要な数(LEDを7つ、トランジスタを4つ)へと増やします。

26_LEDスイッチング回路_1.png


下図が実際に作成するシールドの回路です。Arduinoに取り付け可能なよう7セグメントLEDの回路にArduinoと接続するためのコネクタ(部品記号:SV)を加えています。

26_7SegScheme.png



2. 基板実装

作成した回路図を元に必要な部品をまとめ、基板を実装しました。

部品番号部品数量
1R1-R4抵抗器 10[kΩ]4
2R5-R12抵抗器 330[kΩ]8
3TR1-TR4トランジスタ 2SC18154
4LED17セグメントLED OSL40562LR1
5SV1-SV2ピンソケット(8pin)2
6SV3ピンソケット(10pin)1
7SV4ピンソケット(6pin)1
8-Arduinoシールド用基板1

IMG_8402.jpg

IMG_8403.jpg


コネクタに白い箇所がありますが、これはただのテープです。
シールドのコネクタもArduinoのコネクタと同様に線を繋ぐことができます。ですが、シールドで使用しているピンに線を繋ぐと動作がおかしくなりますので、間違って線を繋がないようテープで防止しています。

26_LEDスイッチング回路_7.png


基板の設計で特筆するようなことはありませんが見栄えのことを考え、LED回路はLED回路、スイッチング回路はスイッチング回路でまとめています。

26_LEDスイッチング回路_2.png

26_LEDスイッチング回路_3.png


なお、基板は回路図通りに実装するつもりでしたが、この基板は回路図通りではありません。誤って、抵抗器を実装する際に接続する穴をずらしてしまいました。そのため、抵抗器とコネクタの接続が回路図と異なっています。
幸いにも抵抗器とコネクタの接続が回路図と異なっていても、Arduinoのスケッチで制御するピンを変更すれば修正可能ですので、基板実装は修正せずそのままにしています。

26_LEDスイッチング回路_4.png


3. スケッチ

動作確認用に、起動してからの時間を表示するスケッチを作成しました。(本来の拡張子は「.ino」ですが、「.txt」に書き換えています)

なお、以前のダイナミック点灯制御間違いがありましたので、今回のスケッチで修正しています。
以前の制御では "数字を数[ms]表示→桁を移動→数字を数[ms]表示→桁を移動→…" と繰り返していました。この制御だと数字を表示したまま桁を移動するので、直前の桁の数字がうっすらと表示されてしまいます

26_LEDスイッチング回路_5.png


そこで桁を移動する前に数字の消灯処理を入れ、 "数字を数[ms]表示→数字を一瞬消灯→桁を移動→数字を数[ms]表示→数字を一瞬消灯→桁を移動→…" に変更しました。これで直前の桁の数字がうっすらと表示されることはなくなりました。

26_LEDスイッチング回路_6.png


4. 動作

動作確認の動画です。起動すると1秒ごとにカウントアップしていますので、シールドは正常に動いていることがわかります。



これで7セグメントLEDのArduino用シールド基板ができました。
次回はこのシールドをパソコンで操作できるようにしたいと思います。


参考資料

  1. 作者名:J.Sugita . "7セグのセグメントが薄っすら光ってしまう件". サイト名:『昼夜逆転』工作室. http://jsdiy.web.fc2.com/seg7dynamicdrive/, (参照日:2015-09-27)
posted by ました at 16:47| Comment(0) | TrackBack(0) | 電子工作の実践 | このブログの読者になる | 更新情報をチェックする

2015年09月20日

シリアル通信 -第2回:シリアル通信の使用

今回はシリアル通信を使って、Arduinoとパソコンでデータのやり取りをします。
シリアル通信自体は以前にも温度センサーで使いましたが、使い方の説明はしていませんでした。今回はArduinoとパソコンの接続やシリアルモニタの使い方を説明します。


オーム社 Arduinoをはじめよう 第2版

価格:2,160円
(2015/9/20 10:25時点)
感想(0件)


目次



1. 接続


Arduinoとパソコンでシリアル通信を行うために、USBケーブルで接続します。

18_シリアル通信2回目_1.png


USBとシリアル通信は別物ですが、Arduinoの中にはUSB-シリアル通信変換ICが内蔵されています。このICがあることでArduinoとパソコンをUSBで接続しても、シリアル通信が行えます。
また、シリアル通信の線は外部コネクタにも繋がっていますので、Arduinoと他の部品でシリアル通信を行うこともできます。ただし、他の部品と接続した場合はパソコンとシリアル通信を行うことはできません。

18_シリアル通信2回目_2.png


Arduinoでなくとも、パソコンでシリアル通信を行うにはUSB-シリアル通信変換を行うのが一般的です。Arduinoは変換ICが内蔵されておりますが、変換用の基板やケーブルなども売られています。

サンハヤト USB⇔シリアル変換モジュール MM-FT232

価格:2,000円
(2015/9/18 16:02時点)
感想(0件)

エレコム USBtoシリアルケーブル/USBオス_RS-232C用/グラファイト UC-SGT1

価格:3,238円
(2015/9/18 16:05時点)
感想(4件)


パソコンとArduinoを接続しドライバーのインストールが正常に行われれば、パソコン側でArduinoを認識できるようになります。
なお、パソコンとシリアル通信できる機器を接続すると、このポートという欄に機器が表示されます。シリアル通信のポートですので、シリアルポートといいます。Arduino Uno (COM3)と表示されていますが、このCOM3というのはポート番号です。シリアル通信を行う際にはポート番号を指定して、どのシリアルポートを使うのかをパソコンに教える必要があります。(3. 動作参照)

18_デバイスマネージャー.png


Arduinoを認識できれば接続は完了です。正しく認識できないようであればArduino IDEをインストールしなおすなど試してみてください。


2. スケッチ

スケッチは自作せずにArduino公式のavaiable()関数のサンプルスケッチを使います。

概要

このスケッチはパソコンからArduinoへ送られてきた文字の文字コードを10進数に変換して、パソコンへ送り返します。

18_シリアル通信2回目_4.png


詳細

このスケッチは主に4つの関数から成り立っています。

シリアル通信を使用可能な状態にして、通信速度をbpsで設定します。通信速度は9600[bps]に設定することが多いです。通信速度以外のことも設定できますが、基本的には通信速度だけ設定します。

シリアル通信のデータバッファ(やってきたデータを一時的に溜めるバケツのようなもの)にあるデータが何[Byte]かを知ることができます。基本的にはこの関数でバッファを確認し、データが0[Byte]より多い(=1[Byte]でもデータがある)なら、何か動作(データの読み込みなど)を実行します。

18_シリアル通信2回目_3-2.png


バッファに溜まったデータを読み出します。

Arduinoからデータを送ります。送る際に10進数や2進数、16進数などを指定することができます。
Serial.println()関数も同様のデータを送る関数です。Serial.print()関数は改行無し、Serial.pringln()関数は改行有りです。

setup()分の説明

Serial.begin()関数でシリアル通信を使用可能な状態にし、通信速度を9600[bps]に設定します。

loop()分の説明

Serial.avaiable()関数でバッファの状態をチェックし続けます。
バッファにデータが1[Byte]以上あるなら、Serial.read()関数でデータを読み出し、Serial.print()関数とSerial.println()関数を使ってそのデータの文字コードを送ります。
バッファのデータが0[Byte]ならば何もしません。


3. 動作

接続とスケッチの書き込みが出来たので、シリアル通信を使いパソコンとArduinoでやり取りを行います。全ての動作をArduinoだけで行いますので、回路はありません。

まず、Arduino IDEのツールからシリアルモニタを起動します。
起動する前にArduinoがどのシリアルポートに接続されているか設定する必要があります。今回は1. 接続のデバイスマネージャーで確認したCOM3に設定します。

18_シリアル通信2回目_5-2.png


起動すると下図のような画面になります。上の入力欄に文字を入力して送信をクリックすると、Arduinoに文字を送ることができます。
なお、シリアル通信は非同期方式ですので、Arduinoとパソコン側で通信速度を合わせなくてはなりません。下の方にある通信速度をスケッチのSerial.begin()関数で設定した速度に合わせます。今回は9600[bps]です。

18_シリアル通信2回目_6.png


通信速度を合わせ文字を送信すると、このように文字の文字コードが10進数で返ってきます。

18_シリアル通信2回目_7.png



今回はArduinoでのシリアル通信の仕方を一通り説明しました。今回はArduino単体でしたが、部品を制御する際もSerial.avaiable()関数でバッファを確認してから動作を行うという流れは同じです。
次回の内容は未定です。今のところはシリアル通信を使って部品を動かすか、シリアル通信をBluetoothで行おうかと考えています。


参考資料

  1. 著書名:Massimo Banzi. 書名:Arduinoをはじめよう 第2版.  出版社:(株)オライリー・ジャパン, 出版年:2012, 参照頁(pp.158-163)
posted by ました at 16:55| Comment(0) | TrackBack(0) | 電子工作の実践 | このブログの読者になる | 更新情報をチェックする

2015年08月02日

割り込み処理 -第2回:作成

前回は割り込み処理について説明しました。今回は実際にArduinoの割り込み処理を使ってみます。


目次



1. Arduinoでの割り込み処理

Arduinoで割り込み処理を行うにはattachinterrupt()関数を使います。この関数ではピンに接続された信号が変化したときに割り込み発生させることができます。Arduinoの外部からの信号で割り込みを行いますので、外部割り込みといいます。
attachinterrupt()関数を使うには3つのパラメータを与えます。

attachInterrupt(interrupt, ISR, mode)
  1. interrupt(割り込みに使うピン)
  2. ISR(割り込み発生で呼び出す関数)
  3. mode(割り込み発生の条件)

1. interrupt(割り込みに使うピン)

interruptでは割り込みに使うためのピンを指定します。
ただし、割り込みには全てのピンが使えるわけではありません。Arduino Unoの場合は割り込みに使えるピンは2ピンか3ピンです。使うピンの指定はピン番号ではなく割り込み番号(番号0=ピン2、番号1=ピン3)で指定します。

2. ISR(割り込み発生で呼び出す関数)

ISRでは割り込み時に行いたい処理の関数を指定します。
なお、割り込み用の関数で扱う変数を宣言する際はvolatileという修飾子を付け加える必要があります。

例)volatile int state = LOW;

3. mode(割り込み発生の条件)

modeではピンの信号がどのように変化したときに割り込みを発生させるかを指定します。
Arduino Unoの場合、割り込み発生の条件は以下の4通りの中から選択できます。

1.LOW
:信号がLowの間は常に割り込み発生
 割り込み処理を終えたら、また割り込み処理を繰り返す
2.CHANGE:信号が変化したとき(立ち上がり、立ち下がりどちらも)に割り込み発生
3.RISING:信号が立ち上がり変化したときに割り込み発生
4.FALLING:信号が立ち下がり変化したときに割り込み発生

31_割り込み条件.png


ピン、関数、変化条件、Arduinoで割り込みを行うにはこれら3つパラメータを決めればよいです。
例えば、2ピン(割り込み番号0)の信号の立ち上がり変化blink()関数を割り込ませたいときは以下のように書きます。

例)attachInterrupt(0, blink, RISING);


2. 作るものを決める

スイッチを押す度にLEDが消灯と点灯を切り替えるものを作ります。
「スイッチが押された」を割り込み発生条件、「LEDの消灯と点灯を切り替える」を割り込み処理とします。


3. 回路

回路はプルアップスイッチ回路とLEDを組み合わせます。
注意するのはスイッチを割り込み可能なピンと接続することです。今回は2ピンと接続しました。

31_attachinterrupt_schem.png

31_attachinterrupt_bb.png

IMG_8365.jpg


4. スケッチ

作成したスケッチを以下にアップロードしています。(本来の拡張子は「.ino」ですが、「.txt」に書き換えています)

スケッチの内容は次の通りです。2. 作るものを決めるの内容とほぼ同じです。

1.割り込みの条件:2ピンの信号の立ち上がり変化で、blink()関数を実行する
2.Blink関数の動作:LEDが消灯ならば点灯、点灯ならば消灯に切り替える。


5. 動作

これが実際に動かしている映像です。ただしこれは失敗しています。


やりたいことはスイッチを押したときのみLEDが切り替わることなのですが、実際はスイッチを離したときもLEDが切り替わっています。これはチャタリングが原因ですので、チャタリング対策をする必要があります。


次回はチャタリング対策を行い、これを完成させます。


参考資料

  1. 作者名:Arduino. ページ名:"attachInterrupt()". サイト名:Arduino. URL:https://www.arduino.cc/en/Reference/AttachInterrupt, (参照日: 2015-08-01)


Arduinoをはじめよう第2版 [ マッシモ・バンジ ]

価格:2,160円
(2015/8/2 09:37時点)


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

2015年07月20日

モーター制御 -第3回:トランジスタで動かす

前回はダイオードを使ってトランジスタをモーターの逆電圧から保護する方法について説明しました。
今回はArduinoやトランジスタを使ってモーターを動かします。


目次



1. スイッチング回路の設計

モーターの制御はトランジスタによるスイッチング回路で行います。回路は次の順番で設計します。
  • モーターの電流確認
  • トランジスタ選定
  • ベース設計

モーターの電流確認

モーターを動かすために必要な電流を確認します。
LEDの場合は順電圧や抵抗値から順電流を計算できました。モーターの場合はLEDとはまったく違い、特性を表す性能線図から計算します。
下図は使用するモーターFA-130RAの性能線図です。

17_FA-130RA負荷特性.PNG

色々な線がありますが、表している内容はある重さの物を回すのに必要な力(トルク)電流回る早さ(回転数)の関係です。性能線図は左に行くほど回す物が軽いときの、右に行くほど回す物が重いときの関係を表しています。

17_モーター負荷特性_1.png

あるトルクにおける電流と回転数を知りたいときはそのトルクから線をまっすぐ上に引き、電流や回転数の曲線とぶつかるところを探します。線がぶつかったら、そのぶつかったところから線をまっすぐ横に引きます。その横線の値が電流や回転数の値です。

例えば、重い物(トルク:2.5[mN/m])を回すときは電流が約1.5[A]、回転数は約3500[rpm]です(下図上側)。一方、軽い物(トルク:0.25[mN/m])を回すときは電流が約0.15[A]、回転数は約11000[rpm]です(下図下側)。
このように軽い物を回すときは電流が少なく回転が早いですが、重い物を回すときは電流が多く回転が遅いです。

17_モーター負荷特性_2.png

17_モーター負荷特性_3.png

このようにして、モーターに流れる電流は回したい物のトルクと性能線図を元に、線を引いて求めます。

今回モーターで回す物は軽いので0.15[A]くらいしか流れないとは思いますが、回す物が思ったより重い場合に備えて1[A]を想定してスイッチング回路を設計します。

トランジスタ選定

スイッチング回路で1[A]以上流せるトランジスタを選びます。選んだのは秋月電子通商の「トランジスタ 2SC2655L−Y 50V2A (10個入) / 通販コード I-08746」です。
2SC2655の最大コレクタ電流は2[A]ですので、余裕を持ってモーターを動かすことができます。

IMG_8360.jpg

ベース設計

ベース側回路の設計をします。必要なのは、コレクタ電流、増幅率、ベース-エミッタ間電圧、ベース制御電圧です。
ベース制御電圧はArduinoのデジタルピンを使用するので5[V]それ以外の値は2SC2655のデータシートに書いてあります。ただし、計算に使う値はモーターが確実に動くようデータシートの値より少し多くしたり少なくしたりしています。

コレクタ電流を1[A]、トランジスタの増幅率を40倍とします。そうすると、必要なベース電流は25[mA]です。Arduinoのピンは最大40[mA]流せますので、これくらいなら流せます。
$\displaystyle{ \frac{1}{40} = 0.025[A] = 25[mA] }$

ベース-エミッタ間制御電圧を5[V]、ベース-エミッタ間電圧を1[V]とすると、ベース電流を25[mA]以上にするにはベース抵抗を160[Ω]以下にすればよいです。E系列の中で160[Ω]に近くて小さい値は150[Ω]なので、150[Ω]を採用します。
$ \displaystyle{ \frac{5-1}{0.025} = 160[\Omega]}$

これでスイッチング回路の設計が出来ました。

20_DCmotor_Arduino_TrSwitch_schem.png


2. その他の回路の設計

モーターを手動で動かせるようにスイッチのプルダウン回路を付け加えます。回路は以前LEDをスイッチで制御した回路と同じです。

20_DCmotor_Arduino_Pulldown_schem.png


3. 組み立て

スイッチング回路とその他の回路の設計が終わりましたので、この2つの回路を組み合わせると回路は完成です。1項のスイッチング回路と2項のプルダウン回路を組み合わせた回路が下図です。

20_DCmotor_Arduino_schem.png

上図の回路図をブレッドボードに組み立てたのが下図です。

19_DCmotor_Arduino_bb.png

IMG_8353.jpg

ダイオードの取り付け場所ですが、モーターに直接半田付けしています。これは逆電圧を少しでも早く逃がすためです。
電気にもはやさがありますので、線の長さによって電気が届く時間が変わりますモーターとダイオードの距離を短くすることで、少しでも早く逆電圧を逃がそうとしています。
とはいえ、これくらいの電流のモーターですと多少モーターとダイオードの距離があっても問題はないと思います。


4. スケッチ

スケッチはArduino公式が公開しているサンプルスケッチButtonを使います。2番ピンがHIGHになる(=スイッチを押す)と13番ピンがHIGHになる(=モーターが回る)スケッチです。


5. 動かす

これが実際に動かした動画です。スイッチを押す度にモーターが回っています。



これでArduinoを使ってモーターを回すことが出来ました。
次回やることは未定ですが、そろそろスケッチをもう少し作り込もうかなと思っています。


参考資料

  1. 作者名:マブチモーター. ページ名:"性能線図の見方と使用例". サイト名:マブチモーター. http://www.mabuchi-motor.co.jp/ja_JP/technic/t_0201.html, (参照 2015-07-19)


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

価格:11,300円
(2015/7/20 13:28時点)


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

この広告は180日以上新しい記事の投稿がないブログに表示されております。