何か作るか、どうせヒマだし

何か作ったり、作ろうとして放り出したりした記録を蓄積していきます。
...という構想だけ練っています。

pcDuino3 nano の SPIを使います、のその後のダイオードの順方向電圧

2021-01-01 11:34:36 | pcDuino

タイトルの通りです。

前回の投稿でpcDuino3 nano用に製作したカーブトレーサシールドをPythonで動かします。

まずはpcDuino3 nanoのPython2.xからSPIを使えるようセットアップを行います。

次にシールド上のDACとpcDuino3 nano内蔵のADCを利用するプログラムを作成し、その後、実際に何種類かのダイオードを使って順電流If-順電圧Vf特性を測定します。

 

***** SPIの用意 *****

...はここの解説の通りです。

全くの受け売りですが、一応日本語でも書いておきます。

PythonからSPIを利用するには2つのソフト、Python-devとSPI-pyをインストールする必要があります。

 

(1)Python-devをインストールする

Python-devはubuntuのリポジトリにあります。

デスクトップからSynapticを起動して(パスワードはubuntu)、Python-devを探してインストールするか、コンソールを開いて

 

apt-get install Python-dev[Enter]

 

とタイプしてインストールします。

Python-devが何をするものなのかは知りません。

でもきっと必要なんでしょう。

 

(2)SPI-Pyをインストールする

SPI-PyはGithubにあります。

PC Duino3 nanoの Webブラウザで以下のアドレスを開きます。

 

https://github.com/lthiery/SPI-Py

 

"Code"の部分をクリックし、表示された選択肢の中から"Download ZIP"をクリックします。

 

以下の場所にZIP形式で保存されます。

 

/home/ubuntu/Downloads

 

LXTerminalを開き

 

cd Downloads[Enter]

 

でダウンロードフォルダに移動します。

 

unzip SPI-Py-master[Enter]

 

でダウンロードしたzipファイルが解凍されます。

 

cd SPI-Py-master[Enter]

 

で解凍されたフォルダに移動し

 

sudo python setup.py install[Enter]

 

でインストールされます。下の画面を参考にしてください。

 

***** インストールが完了したら *****

あとはPythonから

import spi[Enter]

と打てばSPIが利用できます。

 

***** プログラムの説明 *****

こちらにPythonのソースを置いておきます。コンソールから

 

python Main.py[Enter]

 

と打って実行するか、SpyderなどのIDEで読み込んでMain.pyを実行してください。

実行すると順電流Ifを0から1.2mAまでスイープさせた時の順方向電圧Vfの値がだらだらっと表示されます。

ファイルに保存したい場合は

 

python Main.py >ファイル名[Enter]

 

と打つと、テキストで保存されます。

例えば

 

python Main.py >TestData1.csv[Enter]

 

と打てば TestData1.csv という名前で保存されます。

その間10秒くらい、画面には何も表示されませんので、あわてずに待っていてください。

 

***** 実験 *****

次の4種類のサンプルを用意して順方向電流If vs 順方向電圧Vf特性を測ってみました。

 

(1)  赤色LED                OSR5JA3Z74A

(2)  小信号用ダイオード  1S2076A

(3)  小信号用SBD          SD103A

(4)  抵抗                      10kΩ +/-0.1%

 

(3)はショットキーバリアダイオードです。(4)の抵抗は回路の動作確認用です。たまたま部品箱に高精度のものがあったので使いました。

測定の様子はこんな感じです。

 

結果をMS-Excelで読み込んでグラフにしたものが下の図です(Gnumericを使うと思った?)。

 

まず10kΩ抵抗ですが、電流が低いところでは順方向電圧Vfが理論通り一直線に上昇していますが、3Vに達したところで飽和しています。

これは今回電源電圧の制約が非常に厳しい中で設計したため、仕方がありません。

次に赤色LEDのOSR5JA3Z74Aですが、順方向電圧Vfはおよそ1.7~1.8Vとなりました。

データシートによるとVfは2.1V(typ)ですが、これはIf=20mAの時の値ですので、今回の測定結果は妥当なところです。

1S2076AとSD103Aは構造の違いが良く表れています。1S2076Aは一般的なPN接合のダイオードでVfがおよそ0.6Vなのに対し、SD103AはショットキーバリアダイオードなのでVfが0.2~0.3Vと低くなっています。

なお、両者とも今回の測定電流は小さいため、データシート記載のVfより低めの値となっています。

 

というわけで、あけましておめでとうございます。

ダイオードの電気的特性を測りたい時にpcDuino3 nanoは有益であるということが証明されたところで、今年もよろしくお願いいたします。

 

おわり

 


pcDuino3 nanoのSPIを使います

2020-06-07 13:10:19 | pcDuino

pcDuino3 nanoのArduino風ヘッダに備わっているSPI通信機能を使って何かやってみようと考えていたのですが、色々考えてカーブトレーサ(のようなもの)を作ることにしました。

 

***** それで、何が出来るの? *****

 

カーブトレーサ...半導体の特性を測定するあれです。学校の実習でやりましたか?

今回製作したのはダイオードの順方向電圧を測定する装置です。つまり、ダイオードに一定の電流を流し、その時の両端の電圧を測定します。

回路図などの設計資料はこちらに置いておきますので良かったら見てってやってくださいな。

 

***** 回路の説明 *****

 

今回製作する回路の全体は以下の通りです。ぼやけて見づらいと思いますので、こちらのpdfも参照してください。

回路の電源電圧は3.3Vとしました。これはpcDuino3 nano のアナログ入力の絶対最大定格が3.3Vであるためです。

では左から見ていきます。

 

***** DAコンバータ *****

 

U1のMCP4922-E/Pはマイクロチップ社のDAコンバータです。pcDuino3 nanoとはSPIインターフェースで接続しています。

価格も手ごろで制御も簡単に出来るので部品箱に常備しています。

分解能は12bitです。

2chあるので、VOUTAを電流の設定に、VOUTBをオペアンプのオフセットの調整に...使おうと思ったのですが、途中で考えるのがめんどくさくなってやめました。なのでVOUTBはただつながっているだけです。

#CS端子だけ抵抗R1でプルアップしています。本来ならSDIなど他の入力端子にもプルアップ抵抗を入れるべきでしょうが、限られた基板スペースに回路を作らなくてはいけないので省略しました。

DAコンバータの基準電圧はU2で1.2Vを作っています。

この時のDAコンバータの出力電圧範囲は0~1.2Vになります。厳密には最大出力電圧は以下の式で求められます。

 

            最大電圧 = 基準電圧 * 設定可能な最大値 / 分解能

= 1.2[V] * 4095 / 4096

= 1.1997[V]

 

が、今回の回路はあまり精度にこだわっていないので1.2Vということにしておきます。

 

***** 定電流回路 *****

 

次にDAコンバータの出力電圧をオペアンプU3Aで定電流に変換しています。

この定電流回路はオペアンプの解説書で必ずといっていいくらいお目にかかる基本的なものです。

回路図をじ~~っと見ているとどんな原理で動作するのか判るとおもいますが、一応説明しておきます。

下の図はオペアンプによる定電流回路の部分だけを抜き出して簡略化したものです。

 

非反転増幅回路のフィードバック抵抗のあるべき部分がそのまま定電流回路の負荷になっています。

ここで、例えば非反転入力(+IN端子)に1.2Vが加えられたとします。

オペアンプの動作原理として、反転入力(-IN端子)にも同じ電圧1.2Vが現れるので(そうなるようにオペアンプが動作する)、抵抗R4には1.2[V]/1k[Ω]=1.2[mA]の電流が流れなくてはなりません(その電流はオペアンプの出力端子から供給される)。

従って、負荷には1.2mAの電流が流れることになります。そして、この電流の値は(R4=一定として)非反転入力端子の電圧だけで決まるので、電圧→電流変換となります。

式で表すと

 

出力電流 = 入力電圧 / R4

 

の式が成り立ち、ゲインは

 

出力電流 / 入力電圧 = 1/R4 [S]

 

です。 単位は[S](ジーメンス)であり、電導度とか電気伝導率とも呼ばれる抵抗の逆数です。伝承によるとΩを上下ひっくり返してモー(オームのスペルohmを逆にしてmho)と呼んでいた時代もあったらしいですよ。

ただし、この定電流回路は負荷の電位がGNDから浮いているという制約があります。

そのため、後述の電圧測定回路は差動増幅回路となっています。

また、今回のようにオペアンプの電源電圧が低い時に定電流回路の出力電圧範囲が入力電圧によって狭められてしまうという制約もあります。

先ほどの例で言うと入力電圧を1.2Vとした場合、オペアンプの最大出力電圧が3.3Vだとしてもそこから1.2Vを引いた2.1Vが負荷にかけられる最大電圧となってしまいます。

最近の高輝度なLEDは順方向電圧Vfが高くなる傾向があるので、できれば出力電圧は2.5V以上欲しいところです。

オペアンプの電源電圧を5Vにすれば可能ですが、先述の通りpcDuino3 nanoのAD端子の絶対最大定格が3.3Vなので、オペアンプの電源電圧も安全のため3.3Vとしました。

 

***** 差動増幅回路 *****

 

回路図中のU3Bが差動増幅回路を構成しています。

こちらもごく基本的な回路です。少ない部品でまぁまぁの性能が期待できます。

ここではゲインを1とし、回路を構成する4つの入力抵抗は全て100kΩとしました。

これも一応動作を説明しておきます。下の図が差動増幅回路の基本回路です。

 

 

例として、(+)入力が1.8[V]、(-)入力が0.7[V]であるとします。

(+)入力は2つの抵抗R5とR7によって分圧されるので、オペアンプの+IN端子の電圧は0.9[V]になります。

オペアンプの動作原理から、-IN端子にも同じ電圧0.9[V]が現れるため、図のように2[uA]の電流が-IN端子に接続された2つの抵抗R6とR8に流れます。

その結果、オペアンプの出力端子には1.1[V]が現れ、これはまさしく(+)入力電圧と(-)入力電圧の差です。

なんだか騙されているような気になりますが、この回路の出力電圧は次の式で表されます。

 

出力電圧 = {(+)入力電圧 - (-)入力電圧} * R7 / R5

 

あるいは

 

出力電圧 = {(+)入力電圧 - (-)入力電圧} * R8 / R6

 

ただし、R7 / R5 = R8 / R6 であることが条件です。

 

この差動増幅回路は簡単に設計できるものの、欠点は負荷から見た(+)入力端子と(-)入力端子の電気的特性が同一ではなく、それに伴う誤差の補正も難しいことです。

たとえば(+)入力側の入力インピーダンスは200[kΩ]で一定です。それはいいです。

一方、(-)入力側の入力インピーダンスは一定ではなく、しかも上の図の例では2[uA]が負荷に向かって流れ出す方向です。

抵抗をどんどん大きくしていけば入力電流を無視できるほど小さく出来ますが、むやみに大きな抵抗を使うと色々と副作用も出てきます。

今回はなんとなく100[kΩ]としました。

また、この回路が正しく動作する条件

 

R7 / R5 = R8 / R6

 

に誤差があると、これも回路の性能を下げる要因となります。

とはいえ、これは抵抗の絶対的な精度よりもお互いのマッチングが重要なので、出来るだけ同じ値かつ同じロットの部品を使うなどすれば無用なコスト増を避けることが出来るでしょう。

 

差動増幅回路の出力はpcDuino3 nano のAD入力に直結しています。

pcDuino3 nano のAD入力の入力電圧レンジは0~3.0[V]、分解能は12bit です。

 

***** 部品を集める *****

下は部品表ですが、同じものをこちらにも置いておきます。

入手が難しい部品はないはずです。殆ど秋月電子で調達可能です。

抵抗は誤差1%の金属皮膜抵抗をお勧めします。

オペアンプの品種はDC特性を重視して選びます。今回の回路に適したスペックはこのようなものです。

 

  • 電源電圧3.3Vで動作すること(もちろん片電源)
  • 入力バイアス電流が低いこと(FET入力)
  • 電源電圧3.3Vで動作させたときに入力電圧範囲が0~1.2V以上あること
  • 出力電圧範囲がフルスイング(0~電源電圧いっぱいまで振れる)であること

 

...といった要件を満たすオペアンプとしてテキサスインスツルメンツ社(旧ナショナルセミコンダクター)のLMC6482AINを選びました。

が、テキサスインスツルメンツ社の半導体は少しづつ入手が難しくなっているような気がしないでもないので、代替品としてアナログデバイセズのAD8506ARMZも挙げておきます。ただし、AD8506はDIP形状のものがないので、買うなら秋月電子のモジュールが良いでしょう。

回路を設計した時はLMC6482AINも秋月で売ってたんですけどねぇ...

 

1.2Vの基準電圧源はNJRCのNJM2825Fを選びました。よくわかりませんが、値段の割に精度がよさそうです。これも表面実装パッケージしかないので、変換基板も併せて買いましょう。

 

その他、Shield万能基板やコネクタなどは同等なものが色々あるので好みで選べばよいでしょう。

 

***** 組み立て *****

 

特に注意することもないと思います。

下の写真は参考です。好きなようにやっちゃってください。

 

***** 完成したらどうするの? *****

 

次はプログラムの説明です。

例によってPythonを使いますが、今回はここまでです。

 

 

 


pcDuino3 nano の例の話(Python)の続き

2020-03-22 15:16:33 | pcDuino

前々回に製作したArduinoシールド風デバッグボードをベースに、pcDuino3 nano の I/O をPythonで操作するサンプルプログラムを作りました。

今回使用する機能は GPIO(汎用入出力)、アナログ入力、IIC です。

Python は2.x 系です。

 

***** 準備運動(しましょう) *****

 

プログラムのソースはこちらに置いておきますので、適当に自分のpcDuino3 nanoにダウンロードしてください。

ソースは3つに分かれています。

 

IOExample_main.py   ...プログラム本体です。

HW.py                                ...I/Oを操作するクラスライブラリです。

HW_IIC.py                          ...IIC接続されたLCDを制御するクラスライブラリです。

 

また、このプログラムはIICインターフェースにアクセスするためにPythonのSMBusモジュールを使用しています。

SMBusはIICから派生した規格で、ソフトウェアから見ればIICと殆ど違いはありません。

Synapticを起動して(パスワードはubuntu)、”python-smbus"で検索するか、あるいはコンソールから

 

$ sudo apt-get install python-smbus[Enter]

 

とすればインストールされます。

インストールされたら、Pythonからは

 

import smbus

 

で利用できるようになります。

なお、私の環境ではpython-smbusをインストールした後、実際に機能を有効にするために一旦pcDuino3 nanoの電源を切る必要がありました(リブートではダメっぽい)。

 

***** プログラムの動作 *****

 

準備が出来たら、コンソールから

 

$ python IOExample_main.py [Enter]

 

と入力するか、前回紹介したSpyderで読み込んだ後、IOExample_main.py を実行してください。

プログラムの動作は大体こんな感じです

 

  • 実行すると緑のLEDが点灯します。
  • SW1を押すと黄色のLEDが点灯します。
  • SW2を押すと赤色のLEDが点灯します。
  • SW1とSW2を同時に押すと、プログラムが終了します。
  • LCDの上段はLM35Zで測定した室温を表示します
  • LCDの下段はボリュームの状態です。0~100.0%のスケールで表示します

 

温度はLM35Zの自己発熱の影響もあって、実際の温度よりもかなり高く表示されています。

ADコンバータの入力レンジを間違えているわけではありません。

心配ならADの端子電圧を測ってみてください。電圧[V] * 100.0が温度です。例えば電圧が0.274[V]だとすると、室温は27.4℃ということになります。

 

***** プログラムの中身について *****

 

短いプログラムなので、ソースを見ればどんな処理をしているかは判ると思います。

I/Oの操作の詳細についてはSparkfunのチュートリアルを参考にしてください。もしリンクが切れていたら、SparkfunのホームページからpcDuinoで検索してみてください。

このブログではポイントだけ説明しておきます。

 

***** 初めにモードの設定を *****

 

Arduino風ヘッダに割り当てられているI/Oのうち、いくつかは使用する前にモードを設定する必要があります。

自分の知っている範囲ではこんな感じです。

 

機能               値

===================================

デジタル出力                                             1

デジタル入力(プルアップなし)              0

デジタル入力(プルアップ使用)              8

UART                                                          3

SPI                                                              2

IIC                                                        (不要)

アナログ入力                                      (不要)

 

ところでUARTですが、こちらのSparkfunのチュートリアルではモード設定の処理が抜けており、このままでは動作しません。

実際にはプログラムの初めにこんな記述が必要です。

 

    GPIO_MODE_PATH=os.path.normpath('/sys/devices/virtual/misc/gpio/mode/')
    GPIO_MODE_PATH=os.path.join(GPIO_MODE_PATH, 'gpio0')
    file = open(GPIO_MODE_PATH, 'r+')
    file.write( "3" )                                                                                            # "3" is serial(UART) interface mode.
    file.close()

    GPIO_MODE_PATH=os.path.normpath('/sys/devices/virtual/misc/gpio/mode/')
    GPIO_MODE_PATH=os.path.join(GPIO_MODE_PATH, 'gpio1')
    file = open(GPIO_MODE_PATH, 'r+')
    file.write( "3" )                                                                                           # "3" is serial(UART) interface mode.
    file.close()

 

これでGPIO0とGPIO1がUARTモードになります。

 

***** デジタルインプット、アウトプット *****

 

特に説明するほどのものでもないと思います。

サンプルプログラムの通り、モードを設定後、ファイルを開いて読み書きするだけです。

 

***** アナログ入力 *****

 

モードの設定は不要です。ファイルを開いて読み込むだけです。

ただし、読み込んだ値は文字列なので、数値に変換する必要があります。

前々回の記事で説明した通り、チャンネルによって分解能と電圧範囲が異なります。

 

***** IIC で LCD を制御する *****

 

SMBusモジュールを使用しています。

ここではIICの使い方の例として8文字x2行のLCDを使用しています。

使用したのは秋月電子のAE-AQM0802です

制御コマンドのやり取りについてはネット上にある色々な情報を参考にさせてもらいました。

 

***** ところでIICの電気的仕様は? *****

 

秋月電子のFAQによると、AE-AQM0802はRaspberry Piでは動作しないことがあるそうです。

理由はRaspberry Pi の基板に実装されている1.8kΩのプルアップ抵抗がAE-AQM0802の負荷として重すぎ、信号線をLレベルにしようとした時に、電圧が十分なところまで下げられないためとのことです。

pcDuino3 nanoはどうかというと、基板上に2.2kΩのプルアップ抵抗が実装されており、無効にすることはできません。

LCDの制御は問題なく出来ているようなのですが、念のためオシロで信号線の波形を記録しておきました。結果は以下の通りです。

 

SCL(シリアルクロック)はA20が駆動するから良いとして、SDA(シリアルデータ)はAE-AQM0802が駆動する時(Acknowledgeを返す時)、狙ったようにほぼ1.0Vでした

とはいえ、波形を見ただけでは、設計の妥当性は確認できません。

肝心のA20 が、H/L入力レベルを認識する電圧が不明なためです。

ネット上に出回っているデータシートを読んでみましたが、GPIOとして使用した時のしきい値電圧は記載されているものの、IIC(A20ではTWIと呼んでいる、大人の事情で)モードに設定したときの値が不明です。

IICにはIICの規格があり、H/Lの入力電圧も決まっているわけですが、A20がどこまで従っているかは神のみぞ知る、です。

なので、波形はあくまで参考...ということにしておいてください。

 

おわりです。

 


激突! Python対Spyder !! もちろんpcDuinoも

2019-09-16 13:52:39 | pcDuino

前回の記事でpcDuino 3 nano用に簡単なシールドを作ったので、次はプログラムです。

それぞれ機能毎に見ていきましょう。

...とその前にプログラムの開発環境を整えます。

 

***** Spyderをインストールする *****

プログラミング言語はPythonとし、IDE(統合開発環境)はSpyderを選びました。

pythonのIDEとしては他にもいくつかUbuntu12のリポジトリに登録されていますが、個人的にSpyderがシンプルで好ましく感じました。

私はソフトのインストールにはSynapticを使っています。

Synapticの使い方についてはこちらを参考にしてください。パスワードに"Ubuntu"と入力してSynapticを起動後、"Spyder"のキーワードで検索すれば見つかるはずです。

 

 

 "Mark additional required changes ?" と聞かれたら[Mark]を選択します

 

インストールが完了するとスタートメニューの"Programming"にSpyderが登録されているので起動します。

 

 

起動するとオーソドックスなIDEの画面になります。

 

右下にはコンソールがあり、"Python 2.7.3"のバージョン表示が出ています。

この時点で何かが胸中に去来しますが(この記事を書いているのは2019年9月16日であり、Pythonの最新バージョンは3.7.4くらいだ)。肚をくくりましょう。

 

***** Spyderの使い方は? *****

Spyderを使うのに最低限必要なこと(本当に最低限な)を説明しておきます。

Spyderには大雑把に言うと編集(あるいは対話モードとかインタラクティブモード)、プログラム実行、デバッグの3つのモードがあり、それぞれ新しいコンソールタブが開きます。

編集中、コンソールのプロンプトは">>>"となっており、通常のPythonインタラクティブモードと同じ使い方が出来ます。

また、デバッグ中はコンソールのプロンプトが”(pdb)”となり、キーボードから目的に応じたコマンド(後述)をタイプして操作します(要するにpdbというデバッガを呼び出してるってことよ)。

 

***** プロジェクトとワークスペース *****

実行したいプログラムソースのファイルさえ開けばPythonの実行はできますが、一応IDEらしくプロジェクトと、そのプロジェクトを束ねるワークスペースの概念があります。

ワークスペースというのは左のProject Explorerで表示される場所です(初めてSpyderを起動したときはProject Explorerは表示されません)。

今後たくさんプロジェクトを作るのであれば新しいフォルダを作成し、そこをワークスペースにしたほうが良いでしょう。

初めてプロジェクトを作成しようとすると下のようなメッセージが表示されるので、ここで新しくフォルダを作成するなり既存のフォルダを指定するなりします。

 

下の図はワークスペースを"/home/ubuntu/Python"として、その下にプロジェクト"Proto_1"を作成した例です。

 

  

ここからは"/home/ubuntu/Python/Proto_1/"の下で作業することになります。

それでは、実行とデバッグに必要な最低限のポイントを説明します。

 

***** 変数のウォッチ *****

ウォッチしたい変数を登録する作業は必要ありません。メモリ上に存在する変数は常にVariable Explorerに表示されます。

表示されないようであれば、右のアイコン"Refresh"と"Refresh periodically"を押してみてください。

 

 

***** ブレークポイントの設定 *****

ブレークポイントの操作は編集中でもデバッグ中でも可能です。が、デバッガが正しくブレークポイントを認識したりしなかったり...

よくわかりませんです。

行の頭の部分をダブルクリックすることで設定/解除ができます。

下の図はデバッグモードでContinueコマンド(後述)を使用し、ブレークポイントまで実行して停止した状態です。

 

  

***** 実行 *****

実行はF5 あるいはメニューよりRun→Run です。

新しいコンソールタブが開き、print文の結果などはこちらに表示されます。

ブレークポイントが設定されていても止まりません。

 

***** デバッグ *****

デバッグ関連の操作はキーボードからコマンドの入力が基本となります。

といっても殆どの操作はアルファベット1文字を打つだけなので、それほど不便は感じないでしょう(すぐに忘れるけどな)。

変数のウォッチとブレークポイントについては前述のとおりです。

 

1.デバッグの開始

Ctrl+F5 あるいはメニューよりRun→Debug

デバッグモードになります。新しいコンソールタブが開きます。プロンプトは"(pdb)"です。

前の画面を参考にしてください。

 

2.デバッグの終了(Quit)

コンソールから"q"[Enter]とタイプします。

 

3.ステップ実行(サブルーチンの中に入って止まる: Step in)

コンソールから "s"[Enter] とタイプします

 

4.ステップ実行(サブルーチンの中では止まらない: Next)

コンソールから "n"[Enter] とタイプします

 

5.最後まで実行(Continue)

コンソールから"c"[Enter]とタイプします。

ブレークポイントがあれば止まります。

 

6.今いるサブルーチンの終わりまで実行(Return)

コンソールから"r"[Enter]とタイプします。

 

7. 変数の表示(Print)

デバッグ中、コンソールから"p (変数名)"[Enter]とタイプすることで特定の変数をコンソールに表示することができます。

下の画面を参考にしてください。

 

 

Variable Explorerに変数が何故か表示されない、表示されても数が多すぎて探すのが大変といったときに使うとええかも。

 

8.繰り返し

[Enter]だけを押すと、直前の操作を繰り返します。

例えば、"n"コマンドでステップ実行を1回行った後で[Enter]キーを連打すれば、ステップ実行を繰り返します。

 

***** いよいよプログラムを開発する *****

それでは、満を持してプログラムの開発に取り掛かるわけですが、なーんか疲れちゃったのでここまでにしておきます。

 


pcDuinoでArduinoっぽいことをする

2019-01-05 13:51:42 | pcDuino

pcDuino3 nano のウリの一つに、Arduinoとの互換性というのがあります。

今回はこの、pcDuino3 nanoの基板上に実装されているArduino風ヘッダについて調べてみます。

ヘッダーの見取り図はここに置きましたので、良かったら参考にしてくださいな。

他に見ておいたほうがいい資料として、pcDuino3 nanoの回路図をLinksprite社のHP(←リンク先の下の方、Schematic)で見ることができます。

また、pcDuino3 nanoのCPUである All winner A20のデータシートはメーカーのHPにはなさそうですが、ネット上で検索するといくつか見つかります。

以下、自分なりに「これは大変だ。早く知らせなくては...」と思った点を書き記しておきます。

 

...ああ、そうでした。

Sparkfunの解説も重要です。というか、ネット上のまともな解説記事はこれしかないです。初代pcDuino V1ですが、貴重な情報です。

 

***** Arduino-ish ヘッダの仕様 *****

(1)GPIO

まず、電圧は3.3Vです。

データシートを見る限り、5Vトレラントにはなっておらず、入出力ともに3.3Vです。市販のシールドは殆ど使えないと思ったほうが良いでしょう。

IICなど、いくつかの端子は基板上でプルアップされています。

他の端子についてもA20がプルアップ抵抗を内蔵しており、ソフトから有効/無効を設定することができます。

A20はプルダウン抵抗も内蔵しているようですが、設定の仕方がちょっと判りません。あと、抵抗値もデータシートに記載が見当たりませんでした。

どのくらい電流が取り出せるか、GPIO-0(J11-1)に様々な値の抵抗を接続し、電流-電圧特性を測ってみました。結果は下のグラフの通りです。A20のデータシートでは絶対最大定格が+/-40mAとなっており、だいたい+/-20mA程度までは実用範囲のようです。

 

  

IOREF端子は3.3Vが出力されています。

 

(2)ADC

pcDuino3 nano のADC入力はチャンネルによって仕様が異なります。

ヘッダーの見取り図の通りですが、ch0とch1はレンジが2.0Vで分解能 6bit、ch2~5はレンジが3.0V(3.3Vではナイ)で分解能12bitとなっています。

リファレンス電圧は固定となっており、AREF端子はpcDuino3 nanoの場合なぜか0.1uFのコンデンサだけ接続されて事実上N.C.となっています。

サンプリングレートは不明です。LinkspriteのForumのどっかに書いてあったような気がしましたが忘れましたよ。

あと、なぜかch0だけ680kΩでプルアップされています。

 

(3)PWM

Arudino同様にPWM3/5/6/9/10/11が使用可能です。

周波数もソフトで設定できますが、あんまし使ったことがないので、この辺のことはよくわかりません。

 

(4)電源入力

ArduinoのヘッダにはVinとかいう名称の電源入力端子があり、Arduino UNOであれば7~12Vを印加することができます。

一方pcDuino3 nanoのVinに相当するのはJ9-8, +5Vinですが、5Vのみ入力可能となっています。

pcDuino3 nanoを組み込み用途で使用する場合、自作のシールドを作ってここから電源を供給することもあり得ると思いますが、要注意です。

下の図はpcDuino3 nanoの電源系統について5Vの部分だけを抜き出したものです。  

 

  

ArduinoヘッダのVinとマイクロUSB型の電源入力、USB-OTGは単純に並列接続されています。回路図にあるFB23というのはフェライトビーズあるいはリセッタブルヒューズでしょう。逆流防止のダイオードなども入っていないので、同時に複数の電源をつなぐことはできません。

前回の記事で

 

「USB-OTGを使用する時、PC側に十分な電源供給能力があれば別途電源は不要」

 

みたいなことを書いたのですが、正確に言い直すと

 

「USB-OTGを使用する時は別の電源は外さなくてはならない」

 

です。要するにUSBケーブルを抜き差しする度にOSをシャットダウンしなくてはならない、ってぇことです。

ホント??

 

***** 何かやってみる、しよう *****

ここまででAruduino風ヘッダの仕様について判ったような気になれたので、実際に入出力を試すための簡単なシールドを作ることにしました。

今回作るシールドではArduino風ヘッダの次の機能を確認することができます。

GPIO入力 ... 押しボタンスイッチ

GPIO出力 ... LED

ADC ... 可変抵抗と温度センサー

IIC ...  8x2文字のLCD

 

SPIとシリアル入出力については、シールド基板の面積による制約と、あと特に何もアイデアが思い浮かばなかったので割愛しました。

プログラム(Python)については次回の投稿で説明します。

 

***** 回路の説明 *****

いちおう、簡単に回路の構成を説明しておきます。

下に回路図の画像をあげておきますが、ぼやけてて見づらいので、部品表と一緒にここにpdfを置いておきました。

 

以下、各機能毎に簡単に説明していきます。

 

1)押しボタンスイッチ

 

2個の押しボタンスイッチをGPIO3とGPIO4につなぎました。

前述の通り、A20  CPUはプルアップ抵抗を内蔵しているので、シールド上ではプルアップ抵抗を実装せずに負論理になるよう接続してあります。

直列に入っている330Ωの抵抗は、GPIOが出力に設定された状態でSWを押した時の保護です。

 

2)LED

LEDは緑、黄、赤のLEDをそれぞれGPIO5、GPIO6、GPIO7に接続しました。

 

3)LCD(IIC)

秋月電子で扱っている8x2文字のキャラクタ型LCDです。IICインターフェースです。

pcDuino3 nanoは2.2kΩのプルアップ抵抗を基板上に持っているので、液晶モジュール側のプルアップ抵抗は使用しません。

 

4)アナログ入力

A4に可変抵抗をつなぎました。アナログ入力チャンネルA4の入力レンジは3.0Vなので、1kΩの可変抵抗と100Ωの固定抵抗を直列にし、調整範囲が0~3.0Vになるようにしてあります。

また、温度センサLM35DZを入力チャンネルA3につないであります。3.3V電源との間に入っているダイオードD4は何の目的で入れたのか忘れました。LM35DZが壊れた時にADCを保護しようと思ったのかもしれません。

抵抗R6とコンデンサーC2の存在は単純に私的な習慣です。 

 

***** 部品の説明 ****

 

部品はほぼ全て秋月電子で購入できます。

LEDに別の品種を使う場合は直列に入っている抵抗の値を変更してください。

LCDは秋月電子で扱っている、LCD本体と変換基板がセットになっているものです。

シールド用の万能基板も何種類かあるようです、好みに応じて選べばよいと思います。

 

***** 組み立て *****

組み立てにあたって特に難しいところはないと思います。

LCDモジュールの裏面のプルアップ抵抗は使用しないので無効にします。

 

 

ピンヘッダーはかさばるし、ピンが華奢で曲がりやすいので最後に取り付けるのがよいでしょう。

配線の仕方は人によってそれぞれだと思いますが、私はAWG32くらいの耐熱ワイヤーを愛用しています(千石電商で買っている)。

私の場合の作例はこんな感じです。 

 

 

裏面の配線は...

 

***** 動作確認 *****

 ...は次回の予定です。Pythonを使います。