はじめに
このページでは、ビギナー向けに、マイコンボードPIColoの開発方法を説明します。開発環境の用意や無償のCコンパイラのインストールについてはこちら、プロジェクト/プログラム作成についてはこちらを参照願います。
※以下の情報は2010年7月現在のものです。ご注意ください。
PIColoについてはこちらを参照願います。
パーツリスト
※今回はPIColo以外に電圧出力型センサーを用意して下さい。電圧出力型ならなんでもOKです。浅草ギ研でも販売しています。
アナログとデジタル
コンピュータの内部は0か1のデジタルで動いています。0か1しかありませんが、各桁に重みをつけて表せば、1以上の大きな値も表せます。
自然界には連続した値がたくさんあります。このような値をアナログ値と言います。たとえば、水銀を使った温度計はアナログです。
これを見て、22度、と読めますが、実際には22.1度なのかもしれないし、21.999度なのかもしれません。連続しているので観測者が単位を考慮して何度か決める必要があります。
コンピュータはデジタルで動いていますので、なんらかの方法で自然界にあるアナログ量をデジタルに変換する必要があります。
余談ですが、マイコン本などによく「離散値が」とか「離散化して」という表現が出てきますが、これはデジタル値のことをさしています。連続していない、離散(とびとび)した値なのでデジタルです。
ADCについて
最近のほとんどのマイコンにはADC(Analog Digital
Converter:アナログ−デジタル変換機)が付いています。この場合のアナログは、アナログの電圧値を表します。自然界の現象を電圧に変換することができれば、マイコンで扱うデジタル値に変換することができます。
ADCはある電圧の範囲を設定し、その範囲内の値をデジタル量に変換します。たとえば、マイコンが乾電池x3本の電源で動いている場合に、設定できる最低は0V、最高は4.5Vになります。
PIC16F1936のADCは10ビットのADCです。これは変換した値を10ビットで表すことができます。先の最低0V、最高4.5Vに設定したとすると、0Vの時は
0b0000000000 、4.5Vの時は 0b1111111111(10進数で1024) となります。つまり0〜4.5Vの連続値を1024段階のデジタル値で表現できます。
PIC16F1936のADCについてはデータシートの11章に書いてあります。 11.1.3に書いてあるのが電圧の最高値と最低値についての記述です。AVDDというのが電源の+、AVSSというのが電源の−の意味です。ということでこれらに設定すれば、0〜4.5V(乾電池の電圧)の範囲になります。
その後、変換クロックなどの記述がありますが、読まなくても大丈夫です。
11.1.6結果のフォーマット、のところで、変換された10ビットの値が、2つの8ビットレジスタにどのように格納されるかが説明されています。
PIC16F1936は8ビットマイコンなので、基本的には8ビット単位の構造になっています。よって、10ビットの結果値は8ビットのレジスタ2個に振り分けられます。ADFM=0のように左つめで格納すると、ADRESHレジスタに8ビット値の結果が格納されることになります。このとき、ADRESLを無視すると末端の2ビットを無視することになります。
11.2以降に動作の説明がありますが、要約すると、「GO/DONE」ビットを1にすると変換が開始され、変換が終了するとGO/DONEビットが0になります。結果はADRESHとADRESLに格納されます。
設定はADCON0とADCON1で行います。ADCは、入力端子は沢山ありますが、マイコン内部で実際に変換する装置は1つしかなく、ADCON0のCHSビットでどの端子の電圧を変換するかを選択します。
VREF−が最低電圧、VREF+が最高電圧になります。ADCON1のビットが全部0の場合だと、VREF−がGND(0V)、VREF+がAVDD(電池の+に接続されている)になります。
プログラム
ということで作ったプログラムが次のようになります。
行20まではいままでと同じなので説明を省略します。
念のため、テキストファイルを用意しました。適当なプロジェクトを作ってコピー&ペーストしてもよいでしょう。
sensor.txt (右クリックで対象を保存)
今回、新しい部分は行32以降です。データシートを参考に、行33〜34のように設定しました。読み取り端子はAN12に設定しています。データシートを見るとAN12はRB0端子と共用なのがわかります。
htc.hの中(のその先にあるファイル)を読むと、GO/DONEビットは「GO_nDONE」という名前で定義されています。よってこれを1にして、0になるまで待てば変換されることになります。
while( ) はカッコ内の条件が成立しているあいだは繰り返す、という文ですが、C言語の仕様で、成立(真)は数値の1と同じと決まっています。よって、GO_nDONEビットが1の間はwhileが繰り返されます。while文に{}で囲まれた実際の処理部分が無いので、単にGO_nDONEビットが1の間待つという動きになります。
変換された値はADRESHとADRESLに入りますが、下位2ビットを無視してADRESHだけを行40で表示しています。
センサーの接続はこのようになります。白赤黒の線は浅草ギ研のセンサーケーブルです。他のセンサーでも同じように接続できます。
実際の実験の様子です。とりあえず、距離センサーのAS-PSDを付けてみました。白い線がRB0につながるように接続します。
浅草ギ研の電圧出力型センサーは、2mmピッチ3穴の出力になっており、浅草ギ研のセンサーケーブルで簡単に接続できるようになっています。白い信号線をPIColoの内側、赤を真ん中、黒を外側につなぎます。
出力結果です。出力はWindowsのハイパーターミナルで表示させました。これらの方法についても前回まででやっているので詳しくはそちらを参照願います。
さいごに
センサーが使えると、工作の幅もぐっと広がります。浅草ギ研では、AS−PSDのようにPIColoに簡単に接続できるセンサーを沢山用意しています。そちらの方も組み合わせて、オリジナルガジェットを製作してみてください。
次はDCモータ制御について
2010年7月22日
|