めぐり娘

 

■Fritzing ロジックゲートパーツを作成する

回路図を描くのに Fritzing 使っているのだけれど、ロジックゲートのシンボルがなくて論理回路を描けなくて困ってた。困ったなぁと言ってても仕方ないので自分で作ることにした。でもなぁ、いくつかサイトをみてみたんだけどさっぱりわからんし、ちょっとやってみても全然うまくいかない。

そんなこんなの試行錯誤の備忘録です。他の人に教えようとかゆー考えがあまりないので、以下もやっぱりわけわからん内容かもしれませんが、あしからず m(_ _)m

また、俺は回路図しか利用しないし作るのはゲートなので、ブレッドボードやプリントパターンのパーツは作りません。基本は同じですけどね。

パーツの作り方は本家の Creating custom Parts を参照のこと。

 

Fritzing を使えることは大前提。その上で、

 

  1. Inkscape でパーツをデザインする
  2. Fritzing でコネクタの設定をする

 

という 2つの作業を行ないます。

そのためにまず Inkscape をインストール。俺のパソコンは ubuntu なので、「ubuntu ソフトウェア」で検索すると出てきますから「インストール」をポチッ。もちろん、Inkscape 以外でも svg 形式で画像を保存できるソフトなら可です。

 

 

1. Inkscape でパーツをデザインする

 

グラフィックに関することは本家の Fritzing's graphic standards を参考にします。

色はパーツを  RGB(0,0,0) 、コネクタやラベルは RGB(85,85,85) にします。フォントは Driod Sans が指定されているけど、「オブジェクトをパスへ」操作をすれば何でも良い。ちなみに ubuntu には Droid Sans Fallback ってのがあるけど、使えるかどうかは確認していません。

文字サイズはパーツ名 4.25pt 、ピンラベル 3.5pt 、ピン番号 2.5pt 。コネクタの間隔は 0.1inch 、太さ 0.7pt 、長さ 7.2pt 。といったところが指定されています。

色や文字サイズは好きにしてもいいけど、コネクタについてはサイズを守る必要があります。そのために、Inkscape の「ドキュメントのプロパティ」でページサイズを in (インチ) に替えておく。グリッドの単位も in にしておく。インチでデザインしないと Fritzing に載っけたときにコネクタ位置が合いません。

 

下は Inkscape で AND ゲートを作っているところ。使い方は試行錯誤しているうちになんとなくわかってきます (^_^;) もちろんグラフィックソフトの一般的な知識 (例えばレイヤとか) は必要でしょうね。デザインの細かいコツなんかはグーグル先生に教えてもらってください。ちなみに俺が参考にしたことのひとつは、コネクタの端形状は丸にしておくってこと。ラインとの繋がりがきれいになるらしい。

 

Inkscapeパーツデザイン

 

 

デザインができたら次を実行します。

 

  1. フォントが指定と異なる場合はメニューの「パス」から「オブジェクトをパスへ」をクリックしておく。
  2. オブジェクト全体を選択し、グループ化する。
  3. 「ドキュメントのプロパティ」の「ページ」タブから「ページサイズをコンテンツに合わせて変更」を選び、「ページサイズを描画全体または選択オブジェクトに合わせる」をクリック。これでページがパーツのサイズになります。
  4. svg 形式で保存。ファイル名にも標準があるようですけど、末尾に _schematic とか付けとけばいいかなと (^_^;)

 

以上でパーツデザインができ上がりました。

 

 

2. Fritzing でコネクタの設定をする

 

Fritzing でパーツを作るには parts editor を使用します。

まず、新たに作るパーツに類似した既製のパーツを選びます。今回はゲートなので Core Parts の 74HC595 にしました。例えば抵抗でもかまわないのですけど、Metadata があまりに異なると修正が面倒です (^_^;) まぁ自分で回路図に利用するだけなら修正する必要もないんですけど。

選んだパーツを右クリックして「Edit Parts」をクリックするとParts Editor が起動します。

 

  1. 「コネクタ」タブでコネクタ数を 3 に変更
  2. 必要ならコネクタ名と詳細を変更
  3. 「回路図」タブを選択し、メニューの「ファイル」から「Load Image for view」をクリック
  4. 作成したパーツファイルを選択する。フォントに関する情報ダイアログが出たら OK をクリック。これで作成したパーツデザインが表示されます。
  5. コネクタリストの「Select Graphic」をクリックして対応するコネクタ図形をクリック。これでワイヤが接続できるようになります。これをすべてのコネクタで実行
  6. コネクタの接続点をワイヤを接続する端部に移動する。これもすべてのコネクタで実施 (*注)
  7. 「アイコン」タブを選択し、メニューの「ファイル」から「Reuse schematic image」をクリック。パーツのアイコンが作成したデザインに替わる
  8. 必要なら「Metadata」を修正する
  9. メニューの「ファイル」から「Save as new part」をクリックする。ファイルネームプリフィックスはそのままで OK をクリックと、MINE に新しいパーツが登録される

 

(*注) 接続点の移動について

下図のように表示されているコネクタの白い点線の枠の中央の縦線部分が接続点で、ここにワイヤが繋がります。これをワイヤを接続したい左端へドラッグして移動します。なお、画像がコネクタリストで選択されていると、画像自体が動いてしまってうまく移動ができません。ドラッグする前に画像の外側を一度クリックして選択を解除しておくとうまくいきます。

 

Inkscapeパーツデザイン

 

 

これで MINE に新しいパーツが登録されました。実際に回路図を描いてみて、自分なりにでき上がりを評価してみましょうね。

 

 


■プライオリティエンコーダ 4to2 ラインを組む

プライオリティエンコーダ 4 to 2 ライン」で作った論理回路を実際に組み立ててみることにしましょう。

 

が 、手元にあるゲート IC で使えそうなのは NAND の HD74LS00 と Schmitt Inverter の 74VHCT14A ぐらいです。諦めないで (^_^;) これらを使って実験してみます。

 

エンコーダの論理式は以下でした。

A1 = Z2 + Z3

A0 = Z2・Z1 + Z3

E = Z3Z2Z1Z0

 

AND と OR の組み合わせですので、NAND ゲートに置き換えることができますね。

まずは A1 です。fOR(A,B) = fNAND (fNOT(A) , fNOT(B)) ですから、

A1 = Z2 + Z3

     = fOR ( Z2 , Z3 )

     = fNAND ( fNOT ( Z2 ) , fNOT ( Z3 ) )

     = fNAND ( Z2 , Z3 )

となります。

 

次に A0 ですが、ちょっと難しいですよ (^_^;)

A0 = Z2・Z1 + Z3

     = fOR ( fAND ( Z2 , Z3 ) , Z3 )

     = fNAND ( fNOT ( fAND ( Z2 , Z3 ) ) , fNOT ( Z3 ) )

     = fNAND ( fNAND ( Z2 , Z3 ) , Z3 )

 

最後に E を NAND に置き換えます。

E = Z3Z2Z1Z0

   = fAND ( fAND ( Z3Z2 ) , fAND ( Z1 , Z0 ) )

   = fAND ( fNOT ( fNAND ( Z3Z2 ) ) , fNOT ( fNAND ( Z1 , Z0 ) ) )

   = fNOT ( fNAND ( fNOT ( fNAND ( Z3Z2 ) ) , fNOT ( fNAND ( Z1 , Z0 ) ) ) )

NOT はインバータを利用しますからそのままです。

 

以上の式を使って組み立てた回路がこれです。


4to2プライオリティエンコーダ回路図

 

左の押しボタンスイッチが入力 Z3〜Z0 です。プルダウンではゲート入力が不安定になる部分があったので、プルアップにしてバッファとしてインバータを入れました。インバータはヒステリシスがあるタイプですが問題はありません。

押しボタンが押されていないときは右の赤の LED が点灯します。赤 LED は高輝度タイプだったので抵抗の定数が異なっています。

入力に応じて A1 A0 の緑 LED が点灯します。

押しボタンを二つ以上同時に押したとき、大きい値が優先されることが確認できました。

 

ブレッドボードです。


ブレッドボード

 

左側の DIP が NAND ゲート、SSOP 変換基板に載っているのがインバータです。右上部分が LED 駆動回路、中央付近に見える 4本のが入力のプルアップ抵抗です。

 


■DIY トイレのドアレバーを交換

トイレを改装してもう10数年経ちます。最近ドアレバーが少しぐらつくようになったなぁと思っていたら、ラッチが戻らず閉まらなくなったり、トイレから「開かなくなったぁ!!」と叫び声が聞こえたり、どうも調子が悪くなってしまったようです。

で、ドアレバーを交換することにしました。

 

ドアレバーをいろいろ調べてみたところ、現在のドアレバーは長沢製作所の製品で「バックセット 51mm スペーシング 45mm」だとわかり、同サイズのものであれば交換可能だとわかりましたので、楽天市場のイーヅカから下の商品を購入しました。

レバーの形状の違う TXS-G94R という商品もあって迷ったのですが、こっちのほうが少し安いし、レバーを握る感じがよさそうだったのでこれを選んでいます。

バックセット 51mm の製品は納期がかかると書いてあるショップもあったのですが、イーヅカでは注文から 4日で届いています。

 

 

 

取り換えは難しくはありませんが、取付説明書はちょっとややこしいです。まぁきちんと読んで理解すればなんてことはありません。

受座を取り換えるには切欠き穴を大きくする必要があったので現状のまま利用していますが、まったく問題はありません。

 

これでトイレに閉じ込められることもなく安心でしょう (^_^;)

ちなみに、ラッチが戻らなくなったら錠の取り替え時期なんだそうで、油差して動いたぜ、なんてことしているとそのうち閉じ込められてしまうようです。ご用心。

 


■プライオリティエンコーダ 4 to 2 ライン

前に「エンコーダー 10進数を2進数に変換」で 8 入力 3 出力 ( 8 to 3 ライン) のエンコーダを作ってみましたが、これは入力が必ず一つという条件がありました。テンキーのような同時に二つ以上の入力があるかもしれない場合には正常な出力になりません。

そこで、同時に二つ以上の入力があった場合にどれかを優先させるようにした「プライオリティエンコーダ」を考えてみることにします。

 

まず今回は 4 to 2 ラインのプライオリティエンコーダを作ってみます。2 つ以上の入力があった場合には大きい方の数値を優先することにします。

 

真理値表

入力 出力
Z3 Z2 Z1 Z0 A1 A0 E
0 0 0 0 0 0 1
0 0 0 1 0 0 0
0 0 1 - 0 1 0
0 1 - - 1 0 0
1 - - - 1 1 0

 

例えば Z3 が 1 のときこれを優先にしますので、Z2 以下は 1 でも 0 でもどちらでも構いません。すべての入力が 0 のときは E を 1 にします。

 

真理値表から論理式を書くと次のようになります。

A1 = Z3・Z2 + Z3

A0 = Z3Z2・Z1 + Z3

E = Z3Z2Z1Z0

 

論理式ができましたのでロジック回路を作りましょう…… とはいきません。この論理式は冗長なので簡略化できます。が、これがちょっと大変です (^_^;)

論理式の簡略化というとカルノー図法とかクワイン・マクラスキー法とかあるそうですが、ここではコツコツ計算していくことにしましょう。

まずは A1 の式です。

A1  = Z3・Z2 + Z3

        = Z3・Z2 + Z3(1+Z2)

        = Z3・Z2 + Z3 + Z3・Z2

        = Z2(Z3+Z3) + Z3

        = Z2 + Z3

 

簡単になりましたね。つまりは、Z2 か Z3 のどちらかが 1 ならば、A1 は 1 で良いわけです。

次は A0 です。

A0  = Z3Z2・Z1 + Z3

        = Z3Z2・Z1 + Z3(1+Z2・Z1)

        = Z3Z2・Z1 + Z3 + Z3・Z2・Z1

        = Z2・Z1(Z3+Z3) + Z3

        = Z2・Z1 + Z3

 

E の式はこれ以上簡略化できません。ということで論理式は以下のようになりました。

 

論理式

A1 = Z2 + Z3

A0 = Z2・Z1 + Z3

E = Z3Z2Z1Z0

 

簡略化した論理式より論理回路図を書くと以下のようになります。E は 4入力 AND を 2入力 AND 3つで構成させています。


プライオリティエンコーダ

 


■デコーダ 3bit 2進数を10進数に変換

前回は 10 進数を 3bit 2 進数に変換するエンコーダを試してみましたので、今度は 3bit 2 進数を 10 進数に変換するデコーダを考えてみました。

 

真理値表

入力 出力
A2 A1 A0 Z7 Z6 Z5 Z4 Z3 Z2 Z1 Z0
0 0 0 0 0 0 0 0 0 0 1
0 0 1 0 0 0 0 0 0 1 0
0 1 0 0 0 0 0 0 1 0 0
0 1 1 0 0 0 0 1 0 0 0
1 0 0 0 0 0 1 0 0 0 0
1 0 1 0 0 1 0 0 0 0 0
1 1 0 0 1 0 0 0 0 0 0
1 1 1 1 0 0 0 0 0 0 0

 

論理式

Z0 = A2A1A0

Z1 = A2A1・A0

Z2 = A2・A1・A0

Z3 = A2・A1・A0

Z4 = A2・A1A0

Z5 = A2・A1・A0

Z6 = A2・A1・A0

Z7 = A2・A1・A0

 

論理回路図
デコーダー論理回路図

 


■エンコーダー 10進数を2進数に変換

「エンコーダー」を試してみます。

Z0 〜 Z7 のいずれか一つ、つまり 0 から 7 までの 10 進数を入力とします。出力は A0 〜 A2 の 3桁の 2 進数です。

 

真理値表

入力 出力
Z7 Z6 Z5 Z4 Z3 Z2 Z1 Z0 A2 A1 A0
0 0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 0 0 0 1
0 0 0 0 0 1 0 0 0 1 0
0 0 0 0 1 0 0 0 0 1 1
0 0 0 1 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0 1 0 1
0 1 0 0 0 0 0 0 1 1 0
1 0 0 0 0 0 0 0 1 1 1

 

論理式で表すと

A0 = Z1 + Z3 + Z5 + Z7

A1 = Z2 + Z3 + Z6 + Z7

A2 = Z4 + Z5 + Z6 + Z7

 

論理回路図で表すと


エンコーダー論理回路図

 

4 入力 OR ゲートでいいんだけど、シンボルが 2 入力しかなかった (^_^;) ので 2 入力 OR ゲートを 3 個組み合わせました。

fOR( A , B , C , D ) = fOR( fOR( A , B ) , fOR( C , D ) )

 

参考:「Hatada's Home Page」

 

 

これを実際に組んでみましょう。

入力はボリュームで変化させる 0 〜 5V の電圧です。それを Arduino で 0〜 7 の 10 進数に A/D 変換し、数値に応じた出力 pin (Z0 〜 Z7) を HIGH に制御します。マトリクスから OR ゲートを介して 2 進数 (A0 〜 A2) に変換、対応した LED を点灯させることにしました。

 

回路図です。


エンコーダー回路図

 

OR ゲートと言ってもダイオードだけです (^_^;) トランジスタで LED を駆動しています。

 

スケッチです。

void setup() {
  for(int i=2; i<10; i++) {
    pinMode(i,OUTPUT);
  }
  Serial.begin(115200);
}

 

void loop() {
  int sensorValue = analogRead(A0);
  delay(50);

 

  int voltage = sensorValue * (8.0/1024.0);
  Serial.println(voltage);

 

  for(int i=0; i<8; i++) {
    if(i==voltage) {
      digitalWrite(i+2, HIGH);
    } else {
      digitalWrite(i+2, LOW);
    }
  }

 

}

 

シリアルポートに出力しているのは 10 進数 0 〜 7 の出力チェック用です。なくてもいいです。

 

ブレッドボードです。


ブレッドボード

 

上の半固定ボリュームを 0 から上げていくと、3 つの LED が「000」から「111」の 2 進数に応じて点灯します。

 


■リレーを動かしてみる

ジャンク部品のリレー「信号リレー 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

 


| 1/56PAGES | >>

■calendar

S M T W T F S
     12
3456789
10111213141516
17181920212223
2425262728  
<< February 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