めぐり娘

 

■リレーを動かしてみる

ジャンク部品のリレー「信号リレー C2CA005G」を動かしてみます。コイル電圧 5V 、ノンラッチタイプの DPDT (Double Pole, Double Throw) です。

 

コンパレーターでマルチバイブレーターを作り、リレーを駆動して LED を点滅させる回路です。

R1 はデューティー比の調整用です。R4 とともにコンパレーターになっています。R5 と C1 の積分回路で方形波を発生させています。Q1 でリレーを駆動します。


コンパレーターとリレー

 

簡単な、っつーかテキトーな計算を (^_^;)

コンパレーターの出力が 4V ぐらいなので、+IN の基準電圧が 2V 程度になるように R2、R3 を決めてますが、ヒステリシスのための抵抗 R4 に近い値になるようにしました。

積分回路の時定数は 330KΩ × 1μF で、周期はまぁだいたい 1.5倍ぐらいなので 0.5 秒ですね。難しい計算は嫌いです (^_^;)

リレーのコイルの抵抗値が 83Ω ですので 5V 電源で 60mA 流れます。KSC1815Y のコレクタ電流は 150mA ですので使えますね。増幅率を 40 としてベース電流は 1.5mA 。オペアンプ BA10324AF の出力電流は 20mA ですので十分駆動できます。ベース抵抗 R6 は (4.0V - 0.7V) / 1.5mA = 2.2KΩ です。手元に 2.2KΩ がなかったので、4.7KΩ を 2 本並列にしてます (^_^;)

リレーのサージ吸収用のダイオード 1S1588 は手元にあったスイッチング用なので良くないです。逆耐電圧が 35V しかありませんので壊れるかも。ここは最低でも逆耐電圧 50V 以上のダイオードにすべきですよ。

 

ブレッドボードです。


ブレッドボード

 

左側の白い四角い部品がリレーです。このリレーのコイルは極性があり、プラス・マイナスを逆につなぐと動きません。最初それに気づかず、動かなくて悩んでしまいました (^_^;)

 


■オペアンプを動かしてみた

ジャンク基板から取り外したオペアンプを動かしてみます。実際に動かしてみたという話だけなので、オペアンプの理論的なことなどはググってみてください。

 

オペアンプは「グランドセンスオペアンプ BA10324AF」というもので、SOP14 のパッケージに 4回路入っています。電源は単電源でも使える 3.0V 〜 32.0V 。VCC = 5.0V 、VEE = 0V 時の出力電圧は、HIGH = 3.5V (最小) 、LOW = 150mV (最大) となっています。

 

パッケージが SOP ですので変換基板に乗せて DIP 化しました。これを VCC = 5.0V 、VEE = 0V の単電源で動作させます。


オペアンプ

 

 

まずは「ボルテージフォロア」です。


ボルテージフォロア

R1 で入力電圧を 0V 〜 3.8V に変化させると、出力電圧も 0V 〜 3.8V と変化していきます。入力電圧 1.9V のとき出力電圧も 1.9V です。入力電圧を 5V まで上げても、出力電圧は 3.8V より上がりません。出力電圧 (HIGH) が 3.5V とのことなので、そーゆーことです。LOW はしっかり 0V になります。これが「グランドセンス」ということなのでしょうか。

 

 

次は「反転増幅回路」です。


反転増幅回路

単電源ですので、電源電圧を R4、R5 で分圧して基準電圧とします。出力が 3.5V とのことなので 1.6V を基準としました。

R1 で入力電圧を 0V ~ 2.5V に変化させると、出力電圧は 3.2V 〜 0.6V と変化していきます。入力が 1.0V のときに出力は 2.2V 、2.0V のとき 1.2V となりました。増幅率は R3/R2 = 1 倍です。

 

ちなみにオペアンプの電源を 12.3V (*) にしても出力電圧は最大 3.2V です。基準電圧を 2.5V にしてみると、0V 〜 5.1V (*) の入力に対して出力は 5.1V 〜 0.7V となりました。最大出力は基準電圧によって決まりますね。

どちらにしても、この回路では出力が 0V にはなりません。

 

(*) +12V 電源の実測値は 12.3V 、+5V 電源は 5.1V でした。

 

 

「非反転増幅回路」を試してみましょう。


非反転増幅回路

R1 で入力電圧を 0V 〜 1.9V に変化させると出力電圧は 0V 〜 3.8V と変化していきます。入力電圧 1.0V のときの出力電圧は 2.0V でした。入力電圧を 1.9V 以上に上げても出力は 3.8V で変化ありません。増幅率は 1+R3/R4 なので 2 倍ですね。

R3 を4.7KΩ にしたとき、入力電圧 2.6V で出力電圧 3.8V、増幅率は 1.5 倍でした。R3 を 22KΩ にすると、入力電圧 1.2V で出力電圧 3.8V となり、増幅率は 3.2 倍です。計算通りの結果になりますね。

 

ちなみにオペアンプの電源電圧を 12.3V にしたときの出力電圧は 10.2V でした。

 

 

ブレッドボードの写真は反転増幅回路を実験していたときのものです。

使っていない 3回路分の入力はアースに落としています。電源にはパスコンをお約束に。ボリュームは手元にあったもので、33KΩ という値に特に意味はありません (^_^;) ジャンク品です。


ブレッドボード

 

 

ということでまぁ理屈はさておき、こんな感じで単電源で 0V から 3.5V を出力できるってことがわかりました。今度はこれで何か遊んでみましょうねぇ (^_^;)

 


■ジャンク部品を外す

以前から眺めていたジャンク基板からいくつか部品を取り外してみました。


ジャンク部品

 

レギュレーター、パワー MOS FET、オペアンプ、コンパレーター、バッファ、シュミットトリガ、などなど。どれも表面実装用の小さな部品なので扱いが面倒です (^_^;) 写真上にあるように DIP 化基板に乗っけてブレッドボードで利用できるようにしました。

あとは電解コンデンサやリレー、LED なんてのがあります。

 

さて、次はオペアンプの勉強でもしましょうかね。

 


■Arduino シリアル通信でLチカを試す

Arduino とパソコンをシリアル通信でつないでみましょう。

 

パソコンの OS は ubuntu 18.04 LTS です。python でシリアル通信を行うためには「pyserial」というパッケージが必要です。そいつをインストールするには「pip」というパッケージをインストールするユーティリティが必要になります。

 

とゆーことで、まず「pip」のインストールです。

 

$ sudo apt install python3-pip

 

ちなみにこれでインストールされるのは「pip3」です。「pip」というのもありますが、python3 を使うのでこれで良いようです。「pip」も必要なら、

 

$ sudo apt install python-pip python3-pip

 

で両方インストールされます。

 

次に「pyserial」をインストールします。

 

$ sudo pip3 install pyserial

 

特権ユーザーでインストールすると /usr/local/lib にインストールされます。一般ユーザーでインストールすると ~/.local にインストールされ、他のユーザーに影響を与えずに追加・削除ができるとか。自分のパソコンなので特権ユーザーで良しです。

ちなみに、パッケージ名は「pyserial」ですが、使うときは「import serial」と書きます。

 

以上、シリアル通信のための準備作業。

 

下図のような LED を点灯させるための回路を作っておきます。基本的にね、出力ポートに直接 LED つなぐなんてのはやめときましょうね。


画像キャプション

 

Arduino のスケッチです。

シリアルから二桁の数字を受け取ります。10の位は制御する LED 、1の位は 0 で消灯、1 で点灯します。たとえば「11」と入力すると 2番目の LED が点灯します。「a」を受け取るとすべて消灯させます。

まぁシリアル通信のデータの受け渡しがまだよく理解できていないので、なんだかこれで動いたよってレベルなので笑ってやってください。

 

// シリアル入力 2桁の数字
// 10位:PIN番号 0:PIN1 1:PIN2 2:PIN3 3:PIN4
//  1位:制御 0:消灯 1:点灯
// 「a」を受信したら全消灯

 

int pin[4] = {3,5,6,9};
int input[3];

 

void setup() {
    Serial.begin(115200);

    for(int i=0; i<4; i++) {
        pinMode(pin[i], OUTPUT);
    }
}

 

void loop() {
    if(Serial.available()) {
        for(int i=0; i<3; i++) {
            input[i] = Serial.read();    // input[2]は'¥n'
        delay(10);
        }

 

    if(input[0] != 'a') {
        digitalWrite(pin[input[0]-48], input[1]&1);
        } else {
        for(int i=0; i<4; i++) {
            digitalWrite(pin[i], 0);
      }
    }
  }
}

 

シリアルモニタから送信して、期待どおりに動くことを確認しておきます。

 

さて、パソコン側の python のソースです。こちらも同様に、笑ってやってください。エラー処理とかまったくやっていません。

起動すると入力待ちになるので、たとえば「21」と入力すると 3番めの LED が点灯し「20」とすると消灯します。「a」を入力するとすべて消灯し、プログラムが終了します。

# シリアル通信でArduinoへLED制御コードを送る
# 10位:PIN番号 0:PIN1 1:PIN2 2:PIN3 3:PIN4
#  1位:制御 0:消灯 1:点灯

 

import serial

 

def main():
    with serial.Serial('/dev/ttyACM0',115200,timeout=1) as ser:

        while True:
            flag = bytes(input(),'utf-8')
            ser.write(flag)
            if(flag == bytes('a','utf-8')):
                break;

        ser.close()

 

if __name__ == "__main__":
    main()

 

パソコン側で「01」と入力します。すると変数 flag に代入されますが、シリアル通信のためには bytes 型にしなければいけませんので、flag=bytes(input(), 'utf-8') としています。入力する文字は utf-8 です。このとき flag の値は「b'01'」、つまり文字列「01」をバイナリコードにしたものです。

「a」を入力すると、while True: のループを抜けて終了します。Arduino へは「b'a'」が送られます。

 

Arduino 側では serial.read() を 3回繰り返しています。1回目は10の位、2回目は 1の位、3回目は終端の ¥n などを受け取ります。ただし受け取るデータは文字の「'0'」や「'1'」ですので、その値は「48」( b'0') や「49」(b'1') という数値になっています。

そこで、input[0] ( 10 の位) から 48 を引いて出力する PIN 番号を決めています。

input[1] ( 1 の位) も同様にしても良かったのですが、こちらは &1 で最後の 1 ビットを取り出して、そのまま PIN の出力を制御させています。1 の位に 2 以上の値がきたときの動きが変わりますが、そこらあたりはエラー処理で考えることになるんだろうと思います。

 

そんなわけで、パソコンからデータを送ること、それを Arduino で受け取ること、それらのデータの型や処理の仕方などなど、いろいろわからないことだらけの中でもなんとか形ができたので、またいろいろ応用していけるかなぁと思っています。

 

参考:PC-Arduino間 Python経由 シリアル通信備忘録 - Qiita

 


■Arduino デコーダでLチカを試す

4つの LED ぐらいなら問題はありませんが、数が多くなるとデコーダが必要になります。ということで、簡単なデコーダ回路を作って L チカしてみました。

 

Arduino の出力は、よくわからんのですが、電源が落ちたときなど中途半端な電圧になるようなのでプルアップしています。U7、U8 はバッファにすべきですが、NAND ゲートが余っていたので利用しました。


ロジック回路図

 

PIN 9 と 10 を利用し、それぞれの出力が下表のようになると対応した LED が点灯します。

 

点灯 PIN 9 PIN10
L1 0 0
L2 1 0
L3 0 1
L4 1 1

 

 

回路図です。余計にわかりにくいですね (^_^;)


回路図

 

スケッチです。

PIN 9、10 にビットを順次出力するだけなので簡素です。ビット操作がちょっと難しいのですが、数値を 1 と AND 演算すると 1ビット目が取り出せます。

int a = i&1;

右にシフトして同様に AND 演算すると 2 ビット目が取り出せます。

int b = (i>>1)&1;

それぞれを PIN 9、10 に出力しています。

 

void setup() {
  pinMode( 9,OUTPUT);
  pinMode(10,OUTPUT);

}

void loop() {
  for (int i=0; i<4; i++) {
    int a = i&1;
    int b = (i>>1)&1;

    digitalWrite( 9, a);
    digitalWrite(10, b);
    delay(125);
  }

}

 

ブレッドボードです。IC でのロジック回路はジャンプワイヤーだらけになってしまいます (^_^;) でも、もちろんトランジスタで組むより断然簡単です。


ブレッドボード

 


■Arduino Lチカを試す

正月休みもブレッドボードで遊んでいる meyon さんであります (^_^;)

 

さて、初めての Arduino Uno を動かしてみしょう。

基本は Lチカとのことなのですが単純に LED を点灯させるだけじゃつまらないので 、ダーリントンドライバが 4回路入ったTD62308BP1G がありますから 4個の LED を順番に点灯させてみることにしました。

 

回路図です。

電源は 12V AC アダプタとそれをレギュレーターで降圧した 5V (*) を使用します。Arduino へも Vin へ 12V を供給します。

(*)「+5V電源回路とLED駆動回路を作る

 


回路図

 

スケッチです。C 言語も初めてなので、出来の悪さはご容赦ください。

int pin[5]={0,6,9,10,11}; // 出力pin 0はダミー
int seq[4]={4,3,2,1};     // 出力する順番

int ptn[][5]={            // 点灯パターンと時間
  {1,0,0,0,100},
  {1,1,0,0,50},
  {0,1,0,0,100},
  {0,1,1,0,50},
  {0,0,1,0,100},
  {0,0,1,1,50},
  {0,0,0,1,100},
  {1,0,0,1,50}
};

 

void setup() {
  pinMode(pin[1], OUTPUT);
  pinMode(pin[2], OUTPUT);
  pinMode(pin[3], OUTPUT);
  pinMode(pin[4], OUTPUT);
}

 

void loop() {
  for (int i=0; i<sizeof(ptn)/sizeof(ptn[0]); i++) {
    digitalWrite(pin[seq[0]],ptn[i][0]^1);
    digitalWrite(pin[seq[1]],ptn[i][1]^1);
    digitalWrite(pin[seq[2]],ptn[i][2]^1);
    digitalWrite(pin[seq[3]],ptn[i][3]^1);
    delay(ptn[i][4]);
  }
}

 

pin[ ] は出力する pin 番号です。最初の「0」はダミーですので、必ず書いておきます。

seq[ ] は出力する順番です。既定は LED4 、LED3 、LED2 、LED1 の順になっています。

ptn[ ][ ] は点灯パターンと時間を指定します。「1」は点灯、「0」は消灯。5番目の数字は点灯時間 (ms) です。既定のパターンは、ひとつの LED を 100ms 点灯し、次の LED を点灯して 50ms 待ってから前の LED を消灯しています。これは、点灯の切り替えを滑らかにするためです。

 

loop() の中で「ptn[i][0]^1」というのがありますが、ドライバが LOW で LED 点灯のため、点灯パターンの「1」と「0」を反転させるために XOR 演算する部分です。論理演算すると、ビットごとの比較になりますから、例えば 4bit ならば下表のようになります。

 

ptn

1 XOR (ptn)
0000 0001 0001
0001 0001 0000

 

じつはこの部分、最初は NOT と考えたのですが、プログラマの息子から「 NOT だと他のビットが 1 になってしまう」とダメ出しをもらいました。つまり、

 

ptn NOT (ptn)
0000 1111
0001 1110

 

ってことですね。難しい… (^_^;)

 

 

Arduino とブレッドボードです。


ブレッドボード

 

ドライバ IC は上から見ると反時計回りに 1 、2 、3 、4 となっていますので、LED を時計回りに点灯させるために seq[ ] を逆順にしています。まぁ順番なんてつなぎ方でどうにでもなるんですけどね。

Arduino の電源はブレッドボードの 12V からとっています。ちなみに、AC アダプタのコネクタを DIP 化したので、電源部分がすっきりできました。

 


■排他的論理和(XOR)回路

最後に排他的論理和 (XOR) 回路を作ってみます。

NOR と同様に NAND を 4段利用しますが、結線が異なります。

スイッチで入力を HIGH またはLOW に切り替えると、出力が HIGH ならば LED が点灯します。


排他的論理和_XOR_回路図

XORゲート

fXOR( A , B ) = fNAND( fNAND( A , fNAND( A , B ) ) , fNAND( fNAND( A , B ) , B ) )

      = ( A * B ) + ( A * B ) = ( A + B ) * (A + B )

この式は XOR が NAND の組み合わせでできる、ってことを表しています。

 

真理値表

Input A Input B Output
0 0 0
0 1 1
1 0 1
1 1 0

 

参考: ブール代数と論理演算 (コンピュータと情報数理) (2) - 中川雅央(滋賀大学)

 

 

ブレッドボードです。

ますます混雑してしまいました。パーツの足を長いまま組んでいるので、ショートしないように注意が必要です。もっと大きいブレッドボードで組んだほうが良いですね (^_^;)


ブレッドボード

 

左側のスライドスイッチで入力を操作します。出力が HIGH になると右下の LED が点灯します。

 


■否定論理和(NOR)回路

NAND を 4段にして否定論理和 (OR) 回路をつくります。

OR の出力を否定することで NOR になります。

スイッチで入力を HIGH またはLOW に切り替えると、出力が HIGH ならば LED が点灯します。


否定論理和_NOR_回路図

NORゲート

fNOR( A , B ) = fNOT( fNAND( fNOT( A ) , fNOT( B ) ) )

式をすべて NAND で表現しようとするとかなり長くなるので fNOT( ) はそのままにしてありますが、NOT は NAND でできますから、NOR も NAND で作れるということです。

 

真理値表

Input A Input B Output
0 0 1
0 1 0
1 0 0
1 1 0

 

参考: ブール代数と論理演算 (コンピュータと情報数理) (2) - 中川雅央(滋賀大学)

 

 

ブレッドボードです。

NAND 回路が 4つになり、かなり混雑してきましたね (^_^;)


ブレッドボード

 

左側のスライドスイッチで入力を操作します。出力が HIGH になると右下の LED が点灯します。

 


■論理和(OR)回路

更に NAND を 1段増やして論理和 (OR) 回路をつくります。

入力 A 、B をそれぞれ否定して NAND へ入力することで OR になります。

スイッチで入力を HIGH またはLOW に切り替えると、出力が HIGH ならば LED が点灯します。


論理和_OR_回路図

ORゲート

fOR( A , B ) = fNAND( fNOT( A ) , fNOT( B ) ) = fNAND( fNAND ( A , A ) , fNAND( B , B ) )

この式は、OR が NAND の組み合わせでできる、ってことを表しています。

 

真理値表

Input A Input B Output
0 0 0
0 1 1
1 0 1
1 1 1

 

参考: ブール代数と論理演算 (コンピュータと情報数理) (2) - 中川雅央(滋賀大学)

 

 

ブレッドボードです。

NAND 回路が 3つになりました。


ブレッドボード

 

左側のスライドスイッチで入力を操作します。出力が HIGH になると右下の LED が点灯します。

 


■論理積(AND)回路

NAND 回路をもう一段追加して、論理積 (AND) 回路を作ってみます。

1段目は NAND で、2段目は入力 A 、B をまとめて NOT として使用します。

スイッチで入力を HIGH またはLOW に切り替えると、出力が HIGH ならば LED が点灯します。


論理積_AND_回路図

ANDゲート

fNOT( A ) = fNAND( A , A )

fAND( A , B ) = fNOT( fNAND( A , B ) ) = fNAND( fNAND( A , B ) , fNAND( A , B ) )

この式は、AND が NAND の組み合わせでできる、ってことを表しています。

 

真理値表

Input A Input B Output
0 0 0
0 1 0
1 0 0
1 1 1

 

参考: ブール代数と論理演算 (コンピュータと情報数理) (2) - 中川雅央(滋賀大学)

 

 

ブレッドボードです。NAND 回路が追加されています。


ブレッドボード

 

左側のスライドスイッチで入力を操作します。出力が HIGH になると右下の LED が点灯します。

 


| 1/2PAGES | >>

■calendar

S M T W T F S
  12345
6789101112
13141516171819
20212223242526
2728293031  
<< January 2019 >>

■search this site.

■recommend

毎日貯まるポイントサイト ECナビ

■recommend





■Twitter

■recommend

■recommend

■selected entries

■categories

■archives

■recent comment

■recent trackback

■links

■profile

■others

■mobile

qrcode

■powered

無料ブログ作成サービス JUGEM