2015年08月23日

番外編 -文字コード

今回は2進数(16進数)を使って文字を表現する方法、文字コードについて説明します。


目次



1. JISコード

電子機器のデータは2進数でできていますので、電子機器が文字を扱うためには文字も2進数で表現する必要があります。例えば「あ」という文字を0001(2)という2進数で表せば、0001(2)のデータをやり取りすることで「あ」の文字をやり取りすることができます。
ただし、電子機器同士で文字のやり取りをするときに、どの2進数がどの文字を表しているのかを互いの電子機器が知らなければなりません。例えばある電子機器は「あ」を0001(2)、もう片方の電子機器は「A」を0001(2)と表してしまったら、「あ」と「A」の文字がごちゃまぜになってしまいます。
文字を正しくやり取りできるように文字を表す2進数のルールがあり、そのルールを文字コードといいます。

文字コードに限らず工業製品では違うメーカーの部品や機器同士でも使えるよう、多くのルールが決められています(=標準化)。日本でよく使われるルールは日本工業規格(JIS)、世界規模のルールを決める組織を国際標準化機構(ISO)といいます。
JISでは文字コードも定めておりJISコードといいます。下表はJISコードの中からアルファベットと数字を抜粋した表です。

  上位桁
  0123456789ABCDEF
下位桁0   0 P p        
1   1AQaq        
2   2BRbr        
3   3CScs        
4   4DTdt        
5   5EUeu        
6   6FVfv        
7   7GWgw        
8   8HXhx        
9   9IYIy        
A    JZjz        
B    K k         
C    L l         
D    M m         
E    N n         
F    O o         

上表では1つの文字が2桁の16進数で構成されており、「A」は41(16)、「B」は42(16)、「a」は61(16)、「b」は62(16)と表します。アルファベットや数字以外の漢字やひらがななどもJISコードで決められています。漢字やひらがなを表すには16進数2桁だと桁数が足りないので、4桁で表します。
JISコードは日本の文字コードですが、ASCIIコードというアメリカで誕生した文字コードを基本に漢字やひらがなを加えた規格です。ISOもASCIIコードを使って標準化していますので、アルファベットや数字の文字コードは共通しています。


2. 文字コードの通信

電子機器で文字のやり取りを行う場合は文字コードのデータを送ります。データはHighとLowの電気信号を組み合わせることで通信できます。
例えば「a」は61(16)、「A」は41(16)、ですので、「aA」という文字を送りたいなら6141(16)というデータをHighとLowで表現し、通信すればよいです。

19_文字コード_1.png

19_文字コード_2.png


文字コードに従って文字を2進数で表し、その2進数を電気信号で通信することで、文字のやり取りを行うことができます。
ただし、電気信号で通信するといっても通信には様々なルールがあります。例えばHighとLowのどちらを1として扱うのか、2進数のデータは先頭から送るのか末尾から送るのか、通信には何本の線を使うのかなどです。
次回は通信のルールについて説明します。


参考資料

  1. 著書名:喜安善市・清水賢資. 書名:ディジタル情報回路. [2版], 出版社:森北出版, 出版年:1989, 参照頁(pp.23-25)
  2. 著書名:小高知宏. 書名:計算機システム. 出版社:森北出版, 出版年:1999, 参照頁(pp.8-11)


プログラマのための文字コード技術入門 [ 矢野啓介 ]

価格:2,786円
(2015/8/23 10:50時点)




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

2015年08月18日

番外編 -2進数

今回は2進数について説明します。
シリアル通信というArduinoがパソコンなどとデータをやりとりする機能を説明しようと元々は思ってましたが、その前にデータと関係が深い2進数について説明した方がいいと思いました。


目次



1. 2進数

今までArduinoでスイッチやLEDなどの入出力制御を行うときはHighとLowの2種類の電気信号を使ってきました。Arduinoがパソコンなどとデータをやり取りする場合もHighとLowの2種類だけでやり取りを行います。2種類の値だけでデータを表現する方法が2進数です。

2進数では10の2つだけで数を数えることができます。2つだけなのでHighとLowをやり取りできれば、2進数もやり取りすることができます。

18_2進数_1-1.png

※上図ではHigh=1 Low=0としていますが、High=0 Low=1とする場合もあります



2. 2進数の数え方

2進数を説明する前に普段使っている10進数について説明します。10進数では0〜9までの数字が使え、桁が上がるとその桁の位は10倍になります。

18_2進数_2-1.png

一方、2進数では0と1の数字が使え、桁が上がるとその桁の位は2倍になります。下図では8の位までしか書いていませんがその後も16の位、32の位、……、と増えていきます。

18_2進数_3-1.png

2進数の値を10進数にするときはそれぞれの桁の値と位をかけて、それらを全て足します
例えば2進数で1001の値を10進数に変換すると以下のようになります。

$1\times 8 \  + \  0 \times 4 \  + \  0 \times 2 \  + \  1 \times 1 = 9$

110110だとこうなります。

$1 \times 32 \  + \  1 \times 16 \  + \  0 \times 8 \  + \  1 \times 4 \  + \  1 \times 2 \  + \  0 \times 1 = 54$

2進数の読み方ですが数字を一桁ずつ読みます。1001は「いちぜろぜろいち」、110110は「いちいちぜろいちいちぜろ」です。0は「まる」や「れい」と読んでもよいですが、1000を「せん」と読んだり10を「じゅう」と読んだりはしないでください。

このブログで扱う数字は基本的に10進数ですが、今回のように2進数を使ったりする場合があります。10進数と2進数が混ざる場合、10進数は数字の後ろに(10)、2進数は(2)、後述する16進数は(16)を付けます。なお一般的には数字の前に0xを付けると16進数です。


3. 16進数

10進数だと4桁あれば0(10)〜9999(10)まで表せますが、2進数だと0(10)〜15(10)までしか表せません。2進数で大きい数字を表すには桁がたくさん必要ですが、桁が多いと見て分かりにくいです。そこで桁数を減らして見やすくするために、2進数の4桁をまとめて16進数という数え方を使います。
16進数では16個の数字を使え、桁が上がるとその桁の位は16倍になります。数字は0〜9までしかありませんので、10〜15はA〜Fを使います。A(16)=10(10)、B(16)=11(10)、F(16)=15(10)です。

18_2進数_4-1.png

B(16)、51(16)、FC7(16)を10進数に変換すると、それぞれ以下のようになります。

$11\times 1 = 11$

$5\times 16 \  + \  1 \times 1 = 81$

$15\times 256 \  + \  12 \times 16 \ + \   7 \times 1 = 4039$

16進数の数字の読み方も2進数と同様に数字を一桁ずつ読みます。ですのでB(16)は「びー」、51(16)は「ごーいち」、FC7(16)は「えふしーなな」と読みます。
なお、16進数は表示がそうなっているだけで、電子機器が実際に扱っているのは2進数です。あくまで見やすくするために2進数を4桁ずつまとめて、16進数として表示しているだけです。


やり取りできる電気信号がHighとLowの2つだけでも、2進数を使うことで数字のやり取りを行うことが出来ます。電子機器はデータに2進数の番号を割り振り、その番号をやり取りすることでデータをやり取りしています。
例えば「あ」という文字に「0001(2)」という番号を割り振れば、「0001(2)」の電気信号をやり取りすることで、「あ」の文字をやり取りすることが出来ます。
ただ、どの番号にどの文字が割り振られているかを電子機器同士が知らなければ、文字を正しくやり取りすることが出来ません。どの番号がどの文字に割り振られているのかのルールを文字コードといいます。
次回は文字コードについて説明します。


ディジタル回路 [ 春日健 ]

価格:1,620円
(2015/8/18 20:53時点)


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

2015年08月08日

割り込み処理 -第3回:チャタリング防止

前回は割り込み処理を使ってLEDの点灯と消灯を切り替えようとしましたが、チャタリング(スイッチをON/OFFした瞬間の数[ms]〜数十[ms]の間に信号が何度もHIGHとLOWに変化すること)という問題が発生しました。

06_チャタリング_1.png
※この図ではスイッチの立ち上がり変化(LOWからHIGHへの変化)で割り込み処理を発生させています

今回はチャタリングの除去を行い、LEDの消点灯を正しく切り替えられるようにします。


目次



1. チャタリングの除去

1. 割り込み処理を使用しない場合の除去方法

チャタリング除去は以前作成したタイマーでも行っています。そのときに用いた除去の方法は信号がチャタリング発生時間より長い間安定してから行いたい処理をするというものでした。

06_チャタリング_2.png

この方法を行うためには信号を一定時間ごとに読み続ける必要があります。一方、割り込み処理は割り込みが発生した瞬間(=信号が変化した瞬間)しか行うことが出来ないため、信号を読み続けるというのはできず、安定したかどうかを判断することが出来ません
ですので、割り込み処理を使ってチャタリングを除去するためには別の方法で行う必要があります。

2. 割り込み処理を使用する場合の除去方法

割り込み処理でのチャタリング対策として、前回の割り込み発生から短い時間で発生した割り込みでは何もしないという処理を行います。この除去方法はM.IさんとA.IさんのブログMaicommon.ciao.jpの自学のページ 2.2.Arduino入門 5.割り込み処理を参考にしました。この場を借りてお礼申し上げます。

06_チャタリング_3.png
※この図ではスイッチの立ち上がり変化(LOWからHIGHへの変化)で割り込み処理を発生させています

チャタリングはわずかな時間の間に発生します。逆に言えばわずかな時間の間に信号が変化したならばそれはチャタリングです。ですので前回の割り込みからわずかな時間で発生した割り込みの場合は処理を行わないことで、チャタリングによる誤動作を防ぐことが出来ます。
どのくらい時間をわずかな時間とするかですが、チャタリング発生時間より長くスイッチを操作する間隔より短くする必要があります。場合によると思いますが、100[ms]前後であれば大抵の状況に対応できると思います。


2. 回路

回路は前回と同じです。プルダウンのスイッチ回路と、LED回路から構成されています。

31_attachinterrupt_schem.png

31_attachinterrupt_bb.png


3. スケッチ

作成したスケッチを以下にアップロードしています。本来の拡張子は".ino"ですが、".txt"に書き換えています。
なおチャタリング除去の時間は実機で調節し20[ms]としました。

割り込み処理の条件はスイッチの立ち上がり変化(RISING)にする予定でしたが、それだとスイッチを離したときのチャタリングでLEDの消点灯が切り替わってしまいました

06_チャタリング_4.png
※この図ではスイッチの立ち上がり変化で割り込み処理を発生させています

そこで、割り込み処理の条件をスイッチの立ち上がり立ち下がり両変化(CHANGE)とし、スイッチがLOWのときに割り込みが発生した場合のみLED消点灯を切り替えるようにしました。
このようにすることで、スイッチを押したときのみLED消点灯を切り替えることが出来ました。

06_チャタリング_5.png
※この図ではスイッチの立ち上がり立ち下がり両変化で割り込み処理を発生させています


4. 動作

これが実際に動かしている映像です。スイッチを押したときのみLEDの消灯と点灯が切り替わっており、正しく動いていることが分かります。



これで割り込み処理を使ったLEDの消灯と点灯の切り替えは完成です。
次回の詳細は未定ですが、シリアル通信を使ってみようと思います。


参考資料

  1. 作者名:M.I, A.I . "割り込み処理とメソッド". サイト名:Maicommon.ciao.jp. http://maicommon.ciao.jp/ss/Arduino_g/intrupt/index.htm, (参照日:2015-08-07)


AVRマイコン・プログラミング入門 [ 廣田修一 ]

価格:3,132円
(2015/8/8 12:31時点)


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

2015年07月25日

割り込み処理 -第1回:割り込みとは

Arduinoは色々な部品でできており、その中でもプログラムを実行している頭脳のような部品のことをマイコンといいます。マイコンはArduinoだけでなく多くの機器に使われています。
今回はマイコンが持っている機能の割り込み処理について説明します。


目次



1. 割り込み処理とは

割り込み処理の前にプログラムを実行する流れについて説明します。プログラム1つ1つの動きを処理と呼ぶことにします。プログラムを実行するとこの処理を順番に実行していきます。Arduinoの場合は最後の処理を終えた後、最初に戻ってまた順番に処理を実行していきます。

例えば、Arduinoに処理1〜5まであるスケッチを実行させると、Arduinoはそれらの処理を順番に実行し繰り返します。これが普通の流れです。

処理1 → 処理2 → 処理3 → 処理4 → 処理5 → 処理1 → 処理2 → 処理3 → …


一方、割り込み処理を行う場合は、文字通り別の処理が割り込みます。割り込み処理では、
「ある状態を割り込み条件とし、その条件を満たしたらそれまで行っていた処理を一時中断し割り込み処理を実行する。割り込み処理を終えたら元の処理を再開する」
ということを行います。

例えば、先ほどの処理1〜5まであるスケッチで割り込み処理が実行されるとこのようになります。

処理1 → 処理2 → 処理3 → 『割り込みの条件を満たす(割り込み発生)』割り込み処理処理3の再開 → 処理4 → 処理5 → 処理1 → 処理2 → 処理3 → …

処理3でなくても、割り込みが発生すればいつでも割り込み処理を実行します。

処理1 → 処理2 → 処理3 → 処理4 → 処理5 → 処理1 → 『割り込み発生』 → 割り込み処理 → 処理1の再開 → 処理2 → 処理3 → …


このように割り込み処理を行うことで、ある条件で行いたい処理を即座に実行することができます。


2. 割り込み処理の例

割り込み処理の例として、以前作成した7セグメントLEDを使ったタイマーを割り込み処理に変えた場合を説明します。

元々のスケッチの処理は大きく分けて3つです。この3つを順番に実行しています。
処理1:スイッチが押されたかの判定
処理2:表示する数字を計算
処理3:7セグメントLEDに数字を表示

23_割り込み処理_1.png

これを割り込み処理に変えるために、割り込み条件割り込み処理を加えます。割り込み条件は「スイッチが押された」にしようと思いますので、元々の処理1を削除します。
割り込み条件:スイッチが押されたとき
割り込み処理:スイッチが押された場合の数字を計算
処理1(元処理2):表示する数字を計算
処理2(元処理3):7セグメントLEDに数字を表示

これで割り込み処理を実行できるようになりました。
割り込みが発生しないときは処理1と処理2を実行し続けます。

23_割り込み処理_2.png

スイッチが押される(割り込み発生)とそれまで行っていた処理を一時中断し、スイッチが押された場合の数字を計算(割り込み処理)し始めます。それを終えると、元の処理に戻ります。

23_割り込み処理_3.png

割り込み処理の例の説明は以上です。


3. 割り込み処理の利点

割り込み処理の例として7セグメントLEDを使ったタイマーを説明しましたが、正直に言うと先ほどの例は割り込み処理でやってもやらなくても大して変わりません。割り込み処理の利点は割り込みが発生したら即座に処理が実行されるということです。逆に言えば即座に実行される必要がないのなら割り込み処理は不要です。
先ほどのタイマーの場合、人間がスイッチを押す動作はArduinoがスイッチの入力を処理する動作より遅いので、即座に実行する必要はありません。ですので、わざわざ割り込み処理を使う必要はありません。


割り込み処理の利点が活かせる例はある信号が変化した回数を数えるといった場合です。

割り込み処理を使わずに信号が変化した回数を数えると、信号の変化を数える処理とその他の処理が必要になります。
処理1 :信号が変化した回数を数える 
処理2:その他 

この場合、処理2を実行している間に信号が変化しても、その回数は数えられません
下図の場合、信号が3回変化していますが内2回は処理2実行中に変化していますので、プログラムが数えられるのは1回だけです。

23_割り込み処理2_1.png

一方、割り込み処理を使った場合はこのようになります。割り込み条件を信号が変化したとき、割り込み処理は信号が変化した回数を数える、です。
割り込み条件 :信号が変化したとき 
割り込み処理:信号が変化した回数を数える 
処理1(元処理2):その他 

割り込み処理を使えばその他の処理を行っていても、即座に信号が変化した回数を数える処理に移れるので、回数を正確に数えられます。
下図の場合、信号の変化に対して3回とも割り込みが発生しますので。正確に3回数えられます

23_割り込み処理2_2.png

このように素早く変化する信号を確実に捉えたいときは割り込み処理が大いに役立ちます。


これで割り込み処理の説明は終わりです。
次回は実際にarduinoを使って割り込み処理を使います。


マイコンのしくみと動かし方 [ トランジスタ技術special編集部 ]

価格:1,944円
(2015/7/24 11:13時点)


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

2015年06月14日

番外編 -合成抵抗、分圧と分流

前回まででArduinoのアナログ入力を使った温度センサーを作りました。今回はアナログ入力機能を使って何かを作る予定でしたが、一度電気回路についての説明をします。
今回説明するのは抵抗器が複数ある回路の計算です。抵抗器が1つのときは電流や電圧はオームの法則で計算できましたが、複数になるとオームの法則に加えて合成抵抗や分圧、分流の計算をする必要があります。今回はこれらについて説明していきます。


1. 語句の説明

合成抵抗や分圧、分流を計算する必要があると言いましたが、まずこれらの語句について説明します。

合成抵抗とは抵抗器を複数組み合わせたときの回路全体の抵抗値です。下図左側の回路の合成抵抗が$R[\Omega]$ならば、左側の回路と右側の$R[\Omega]$1つの回路は同じです。
12_語句の説明_1.png

抵抗器を直列接続している回路に電圧を加えると、それぞれの抵抗器で電圧降下が発生します。これを分圧といいます。
下図の回路ですと、回路全体の電圧$V[V]$が抵抗$R_1[\Omega]$$V_1[V]$、抵抗$R_2[\Omega]$$V_2[V]$分圧しています。
12_語句の説明_2.png

抵抗を並列接続している回路に電流を流すと、電流がそれぞれの抵抗器に流れます。これを分流といいます。
下図の回路ですと、回路全体の電流$I[A]$が抵抗$R_1[\Omega]$$I_1[A]$、抵抗$R_2[\Omega]$$I_2[A]$分流しています。
12_語句の説明_3.png


2. 計算式

合成抵抗や分圧、分流の計算を順番に説明してします。

合成抵抗の計算式は直列接続と並列接続で違います。直列接続の合成抵抗は抵抗値の合計です。
$R = R_1 + R_2 + \cdots + R_n$

12_計算式_1.png

並列接続の合成抵抗は直列接続に比べると複雑になり、抵抗値の逆数の合計の逆数です。
$\displaystyle {R = \frac{1}{\displaystyle {\frac{1}{R_1} \times \frac{1}{R_2} \times \cdots \times \frac{1}{R_n} } }}$

12_計算式_2.png

ただ、この式の形だと複雑です。ですのでよく使う抵抗器2つの並列接続や同じ抵抗器の並列接続の形に変形します。
抵抗器を2つ並列接続したときの合成抵抗は、抵抗値のかけ算を足し算で割って求められます。この形の式を和文の積といいます。
$\displaystyle { R = \frac{1}{\displaystyle {\frac{1}{R_1} \times \frac{1}{R_2} } } = \frac{R_1 \times R_2}{R_1 + R_2} }$

12_計算式_3.png

同じ抵抗器を$n$個並列接続したときの合成抵抗は抵抗値を$n$で割れば求められます。
$\displaystyle {R = \frac{1}{\displaystyle {\frac{1}{R_1} \times \frac{1}{R_1} \times \cdots \times \frac{1}{R_1} } } = \frac{R_1}{n} }$

12_計算式_4.png


合成抵抗の計算式は以上ですので、分圧と分流について説明します。
分圧は抵抗値の比で決まります。
$V_1 : V_2 : \  \cdots \ : V_n = R_1 : R_2 : \ \cdots \ : R_n$

12_計算式_5.png

上の式を変形させただけですが、抵抗$R_i[\Omega]$の分圧$V_i[V]$を求める式は以下の通りです。$R[\Omega]$は回路全体の合成抵抗、$V[V]$は回路全体の電圧です。
$V_i = \displaystyle{ \frac{R_i}{R} } \times V$


分流は抵抗値の逆数の比で決まります。
$I_1 : I_2 : \ \cdots \ : I_n = \displaystyle{ \frac{1}{R_1} : \frac{1}{R_2} : \ \cdots \ : \frac{1}{R_n} }$

12_計算式_6.png

抵抗$R_i[\Omega]$の分流$I_i[A]$を求める式は以下の通りです。$R[\Omega]$は回路全体の合成抵抗、$I[A]$は回路全体の電流です。
$I_i = \displaystyle{ \frac{R}{R_i} } \times I$


以上で合成抵抗と分圧、分流の式の説明は終わりです。


3. 計算例

では、実際に計算をしてみようと思います。計算するのは下図の回路です。この回路の合成抵抗$R[\Omega]$、分圧$V_1[V]$$V_2[V]$、回路全体の電流$I[A]$、分流$I_1[A]$$I_2[A]$を計算します。
14_計算例_1.png


まず合成抵抗を求めます。先に下側にある並列回路の合成抵抗を求めます。この合成抵抗を$R_{23}[\Omega]$とします。
$\displaystyle { R_{23} = \frac{R_2 \times R_3}{R_2 + R_3} = \frac{80 \times 20}{80 + 20} = 16[\Omega] }$

回路全体の合成抵抗$R[\Omega]$を求めます。$R[\Omega]$は先ほど計算した$R_{23}[\Omega]$と元からある$R_1[\Omega]$の直列接続です。
$R = R_1 + R_{23} =24 + 16 = 40[\Omega]$



14_計算例_2.png

次に$R_1[\Omega]$$R_{23}[\Omega]$の分圧を求めます。先に$V_1[V]$を求め、その後$V[V]$とから$V_1[V]$を引いて$V_2[V]$を求めます(キルヒホッフの電圧則)。
$V_1 = \displaystyle{ \frac{R_1}{R} \times V = \frac{24}{40} } \times 5 = 3[V]$

$V_2 = V - V_1 = 5 - 3 = 2[V]$


最後に電流の計算です。先に回路全体の電流を求め、その後分流を求めます。回路全体の電流は合成抵抗と電圧から求められます(オームの法則)。
$I = \displaystyle{ \frac{V}{R} = \frac{5}{40} } = 0.125[A]$

分流は先に$I_1[A]$を求め、その後$I[A]$とから$I_1[A]$を引いて$I_2[A]$を求めます(キルヒホッフの電流則)。
$I_1 = \displaystyle{ \frac{16}{80} } \times 0.125 = 0.025[A]$

$I_2 = I - I_1 = 0.125 - 0.025 = 0.1[A]$


これで回路の計算は完成です。計算結果を図に加えるとこのようになります。
14_計算例_3.png



このように抵抗器が複数ある回路ですと合成抵抗や分圧、分流を計算する必要があります。
次回は分圧を利用した可変抵抗という部品とArduinoのアナログ入力機能を組みあわせたものを作ります。


図解でわかるはじめての電気回路 [ 大熊康弘 ]

価格:2,354円
(2015/6/14 18:43時点)




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

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