2.PICを始めよう! (2021.11.18-2021.11.26)

Arduinoを始めたばかりですが、続いてPICの学習もスタートさせます。実は私の本命はPICの方なのですが、開発の手軽さ等からArduinoも視野に入れているわけです。制御する相手や装置によって、PICにするかArduinoにするかを使い分ければ良いので、これから本コーナーは両者が混在したものになると思います。大雑把な分類として小規模のものはPIC、やや大掛かりなものはArduinoで実現するつもりです。GUIも絡むような本格的なシステムはRasPiを使うことになるでしょう。使用するプログラム言語がそれぞれ違うため頭が混乱しそうですが、うまく使い分けてコンテンツを充実していこうと考えています。

始めにPICについて少しだけおさらいをしておきましょう。私自身もこれまで使用したことは無いので、概略を頭に入れておきたいと思います。本コーナーの概要でも触れましたが、電子工作の類ではいかにコストパフォーマンス良く物を作るかがキモだと思います。少なくとも私自身はそう考えていて、無尽蔵に資金を使える幸せな人には当てはまらないかもしれません。材料もなるべく身近な素材や製品を組み合わせることで、とにかく安く作れるよう工夫します。もちろん要となるコンピューター(マイコン)は、必要な機能に絞ったチップを選択し、余計なコストをかけないようにしたいものです。ただし、慣れないうちは最適なものを選択するのが難しいので、オーバースペックになるのも止むを得ません。大は小を兼ねるわけで、まずは色々な実験を通じて経験を積むことにします。

RasPiのコーナーでは、色々な装置を作ってコンピューターで制御しようと始めたものの、単純な操作をするためにわざわざスペックの高い高価なコンピューターを使うのは大いなる無駄だと感じました。しかもOS上では高速な動作も期待できません。使い回せば良いと思われるかもしれませんが、再び同じものを使用したいと思った時に配線を1からやり直すのでは大変です。コンピューターも含めた1つの作品として考えた時、いつでも実用になる状態で手元に置きたいものです。特にワンチップマイコンであるPICは制御用途が得意で、マシン語で直接動作するため低スペックでも高速です。チップだけなら数百円で済むことから、失敗して壊れても大した損害ではありません。安価なため同じ装置を量産するのも容易です。トライアンドエラーでいくらでも挑戦できるので、電子工作にはもってこいのアイテムなのです。

そんなPICにも色々な種類があります。元々小規模な装置用に使うつもりなので、8または16bitのPICで十分なことから、広く普及しているMicrochip Technology社のものを採用します。他にAVRやARMと言ったものが有名ですが、前者を製造するatmel社はMicrochip Technology社に買収されたため、いずれは統合されたものになると思います。後者は64bitや128bitのチップをラインナップに加えた高性能なもので、スマホを中心としたハイスペックのシステムに採用されていて、電子工作レベルでは明らかにオーバースペックです。


PICの一例(PIC12F683-I/P)
秋月電子で1個130円(税込)

さて、一口にMicrochip Technology社のPICと言っても、その商品ラインナップは実に多岐に渡っています。上の例に上げたPIC12F683-I/Pは8ピンのDIPタイプで、プログラムメモリ2KW、EEPROM256バイト、RAMは128バイトです。2KWでどのくらいの規模のものが実現できるか実感が沸きませんが、1チップマイコンもここまで低価格になったと言うことで、本当に気軽に使うことができます。これでできることはかなり限られてくると思いますが、プログラムのボリューム(或いは必要な機能)に応じて、使うPICを選択することになります。最初は規模の小さなアイテム(主に実験レベル)でPICの基礎を学習しつつ、慣れたら順次上位のPICを扱っていきたいと思います。ちょうどRasPiでDCモーター制御(マイコンカーを動かす)実験をしていたところなので、これをArduinoやPICで引き継ぐ形で進めることにします。マイコンカーを動かすためには色々なセンサー類を駆使しなければならないので、学習としても最適の素材であると言えます。

<参考>
PIC12F683-I/Pはプログラムメモリを2KW搭載しています。このPICの命令長は14bitなので、2048×14=28672bitになります。1byteは8bitですから28672÷8=3584byte(約3.5KB)です。簡単な操作なら思ったよりも色々なことができそうです。

PICの使い方について、マルツオンラインで詳しい説明を公開しています。まずはそれを読んでから始めれば理解が進むと思います。
超入門 PICマイコンの使い方

では、PICの開発環境を整えることから始めましょう。Microchip Technology社のサイトからMPLAB X IDEをダウンロードします。開いたページを下に見て行くと、各OSに対応したIDEが示されるので、Windowsであれば「MPLAB X IDE Windows」を選択します。

次にCコンパイラをダウンロードします。こちらのページを開くとドキュメントやコンパイラのダウロードができます。そこで「Compiler Downloads」をクリックして、開いたページからダウンロードしたいコンパイラを選択します。Windows版なら一番上に表示されていて、Linux版、Mac版と続きます。例えば8bit用であれば「MPLAB XC8 Compiler」をダウンロードして下さい。とりあえず8bitと16bit用があれば十分でしょう。私がダウンロードした時の最新はV.2.32でした。

インストールはIDE、Cコンパイラの順に行います。逆だとIDEにCコンパイラが統合されないので注意して下さい。IDEには元々低レベル開発言語としてのアッセンブラが含まれていて、Cコンパイラが無くてもプログラミングはできます。しかし、アッセンブラはマシン語(機械語)を人間に理解できるように記述したもので、かなりコンピュータ寄りの言語なので、人間にはやや扱いづらい面があります。初期の1ボードマイコンの時代にはアッセンブラしか無かったので、命令自体は単純ながらも長大なプログラムを書き続けたわけですが、今となっては非効率なので最初からC言語で進めた方が良いと思います。

ソフトウェア環境が揃ったところで、問題は書き込みツールです。PCでプログラミング→コンパイルを行った後、PICにプログラムを転送(書き込み)しなければなりません。純正ツールはMicrochip社のMPLAB PICkit4インサーキットデバッガ/プログラマで、1万円以上する高価なものです。安いものは無いかとamazonで検索すると、先代のPICkit3と似たような互換(コピー品?)ツールが続々出てきました。どれも格安です。しかし、よくよくレビューを読むと、かなり問題が多いことがわかりました。うまく動作したとか成功したとの報告以上に、不具合のオンパレードと言った感じです。設計自体や部品選定の問題を指摘する内容もあり、さすがに心配になって他を当たると、秋月電子からもツールが販売されていました。価格は互換品よりは高いですが、純正品の半額程度です。これでも良いかとも思いましたが、安心度は高いものの互換品であることに変わり無く、新しいデバイスへの対応や予期せぬ不具合等いくばくかの不安も残ります。

迷った挙句、amazonで比較的評価やレビューの良いPICkit3の互換品(送料・税込で3000円程度)を選択しました。どうも私の悪いクセでジャンクの血が騒ぎ、怪しいものの方が興味を惹かれてしまうのです。さほど高額でも無いし、ダメ元で使えなければバラして調査すれば良いし、使えれば儲けものと考えれば気が楽です。自己責任なので、くれぐれも良い子はマネをしないようにしましょう。(たぶん動くと思っていますが・・・)

予想よりもずいぶん出来が良い感じです。本体プラスチックの成型も良いし、外観上の欠点は見当たりません。さすがに世界中のモノ作りの中心だけあって、一部の粗悪品を除けばレベルは高いです。これできちんと動作すれば申し分無いですが、PICチップの持ち合わせも無いし知識も無いので、しばらくはお預けになりそうです。と、思っていましたが、すぐに初心者でも使いやすそうなPIC12F675-I/Pをヤフオクで見つけて入手してしまいました。上で紹介したPIC12F683-I/Pに似た製品で、秋月電子で1個130円となっています。昨今は半導体不足で値上がりしているのか、他では大体300円程度が相場になっているようです。プログラムメモリ1KW、EEPROM128バイト、RAMは64バイトとPIC12F683-I/Pの半分程度のスペックです。小さいのにADCを4ch持っているので、色々と応用が効きそうです。今回はLチカと呼ばれるLEDの点滅実現を通して、プログラム開発の基本をマスターしたいと思います。LED出力には5番ピンのGP2を使います。LEDは「1.Arduinoを始めよう!」で使った抵抗付きのものです。

PICの書き込みにはライターに付属するソケットを使わず、ブレッドボードにPICを挿して接続回路を組んだ方が安全なようです。5本のリードをつなぐだけで接続自体は簡単です。なぜ直接ライターをつなぐかと言うと2つ理由があります。単なる個人的な事情なので、マネする必要はありません。(慣れの問題もあるので最近はソケットを使うことも多くなりました)
1.付属ソケットは多くのPICに対応するため、回路に少々無理がある(解析者の話では、書込済のPICだと通電した時にピンの設定によっては壊す可能性がある)。
2.書き換える度に外してソケットに挿さなくてはならないので面倒
実験ではブレッドボードを使うのでさほど手間ではありませんが、特に1の問題をクリアしておきたいためです。捕捉として付属のソケットで注意しなければならない点があります。それはPICをセットする場所で、基板の裏にどの部分にセットするかシルク印刷されていますが、図の通りにセットすると1つずれることになります(図が紛らわしいため)。太線で書かれている部分が先頭のピンが入る場所なので間違えないようにして下さい。ずれたままセットすると書き込みエラーが起こるだけでなく、PICが発熱して最悪破壊する可能性があります。

ライターとの接続図を下に示します。あくまでも一例であり、ピンの接続位置さえ間違えなければ、この通りに配線する必要はありません。下の表は端子名とピン番号を示したものです。

互換ライターを色々調べていると、書き込みの際に電源をライターから供給するようにして、電源電圧を4.75Vに設定すると良いように書いてあったので、IDEを起動してから設定を変更することにしました。初めてなので最初に新規プロジェクトを実行します。ファイルメニューからNew Projectを選択すると設定ウインドウが開き、ウイザード形式なので問いに答える形で次に進んでいきます。私の場合はPIC12F675-I/Pが使えるように設定しました。参考までに手順を記します。

1.ではCategoriesは「Microchip Embedded」、Projectsは「Standalone Project」をクリックして選択します。

Nextで次に進みます。2.は使用するPICチップを選択します。PIC12F675の場合は次の通りです。Toolは右のShow Allのチェックボックスにチェックを入れて、全ツールの中から目的の機器(私の場合は接続したPICkit3)を選択します。

Nextで次に進みます。3.はデバッグのための設定で、とりあえずここはそのまま(None)にします。

Nextで次に進みます。4.では書き込みツールの選択画面になるので、使用する機器(私の場合は接続したPICkit3)を選択します。機器の名前の後に実機のモデルナンバーのようなものが表示されるので、見分けが付くと思います。スクリーンショットを撮り損ねたため、ここは他の人のショット(バージョンは違います)を拝借しました。選択したPICkit3の前の○が緑色になっていれば使える状態です。

Nextで次に進みます。5.はコンパイラの設定です。コンパイラは8bit用のXC8(IDEインストール時に別途ダウンロードしたコンパイラをあらかじめインストール済)を選択します。別のコンパイラやアッセンブラを使う場合は、その項目を選択して下さい。

Nextで次に進みます。6.ではProject名や保存場所に関する設定をします。Project名は自分で管理しやすい名前にして下さい。LocationやFolderはデフォルトで構いませんが、これも好みで場所を設定して構いません。

Finishでウイザードを終えます。新規プロジェクトを設定すると、ウインドウの左にツリー状の項目が表示されます。ツリー上に表示される書き込みツール(この場合はPICkit3)のところでマウスを右クリックしてpropertyを選択、ウインドウの右にプロパティの設定項目が表示されるので、一番上の選択メニューでPowerの項目を選択します。PICkit3のチェックボックスにチェックを入れ、電源電圧を4.75V(私は4.5Vに設定)に設定します。5Vの場合は書き込みエラーが出やすいようで、電源供給可能なHUB経由でUSBに接続すると改善されるとのことです。実際、私の環境でも5Vの設定ではエラーになったため、電圧を下げるべきと考えておいた方が無難です。書き込みツールからでは無く回路付属の電源から供給する場合は、ここでチェックを入れる必要はありません。これでツールの準備は完了です。

書き込むプログラムは既に実績のあるものを使えば確実なので、ネットで落としてきたLチカのプログラムを使います。サンプルではGP2ピン出力でLEDを点滅させますが、GPIOは全て出力に設定してあるので、他のピンに設定しても構いません。ただし、GP3だけは常に入力となるので、今回のLチカ実験には使えません。プログラムの最初には、コンフィグレーションビットと呼ばれる設定が必要です。これはPICごとに設定しなければならない重要部分で、起動時にどのようにPICを動作させるか(例えばクロックを外部から供給するか内蔵を使うか等)をあらかじめ決めておくわけです。

設定項目は IDEにツールが用意されていて、1から記述しなくても次のように操作して得ることができます。メニューバーの「Window」メニューから「Window」>「PIC Memory Views」>「Configuration Bits」を選択します。そうするとウインドウ右下に設定用のツールが表示されます。それぞれの項目のOptionのところが変更できる部分です。使用するPICや自分の環境に合わせて適切に設定しなくてはなりません。設定が終わったら「Generate Source Code to Output」ボタンをクリックして設定ファイルを生成すれば、出力ウインドウに内容が表示されます。それをコピー&ペーストでプログラムソースの頭の部分に貼り付ければOKです。ただし、#include <xc.h>はソース自体にも既に記述されているので、重複しないように一方は除いておいて下さい。

ソースファイルが完成したら、上のメニューボタンのコンパイル(トンカチのようなマーク)をクリックして実行し、エラーが出なければ書き込み(右向きの△マーク)をクリックしてPICマイコンに転送です。エラー無く書き込みが終了したら一度電源をカット(ツールを外す等)します。再度電源をオン(アダプタ等から電源供給)にすれば、書き込んだプログラムによってPICが動作を始めます。ただし、PICのVPP/MCLR(PIC12F675の4ピン)には注意が必要で、通常は10キロオーム程度の抵抗でプルアップし、端子をHレベルにする必要があるようです。オープン状態だとリセットがかかりっ放しになって動作しません。(最初はこれでハマりました)


LED点滅の様子(4番ピンはプルアップが必要)

テスト動作時のボード(上面視)

未知のものなので簡単には動作までに至りませんでしたが、最終的にはLチカが成功して必要な手順を理解することができました。また、心配した互換ツールでも正常に書き込みできることが正式に確認できたわけです。余談ですが、ネットの情報でもMicrochip社は互換ツールを認めているようで、回路も公開しているとのことです。たぶん広くPICを普及させる目的で、チップ自体の互換品製造にさえ手を出さなければ、逆に安価な互換ツールが普及の促進にもなるとの考えなのでしょう。想像ですが、粗悪なツールは部品自体に粗悪品を使っていたり、適当に回路をアレンジ(簡略化)して自滅しているのだと思います。さすがにPICも歴史が長くなって、ツールもある程度淘汰されていると考えられそうです。

なお、今回PICに書き込んだLチカ用のソースプログラムは次の通りです。上の方のCONFIG記述部分がツールで生成した命令です(各行のコメントが長いため、以下では削除しています)。500msごとにLEDが点滅するだけの簡単なものですが、基本的な手続きは他のPICでも同じようなものなので、これを基礎として次のPICプログラミングに活かしていきたいと思います。

/*
* File: main.c
* Author: user
*
* Created on 2021/11/23, 17:36
*/


// PIC12F675 Configuration Bit Settings

// 'C' source line config statements

// CONFIG
#pragma config FOSC = INTRCIO
#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config MCLRE = ON
#pragma config BOREN = ON
#pragma config CP = OFF
#pragma config CPD = OFF

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>

#define _XTAL_FREQ 4000000

void main() {
ADCON0 = 0; // A/D変換しない
CMCON = 0x07; // コンパレータは使用しない
ANSEL = 0; // アナログは使用しない(すべてデジタルI/Oに割当てる)
TRISIO = 0b00000000; // ピンは全て出力に割当てる(GP3は入力のみとなる)

GPIO = 0b00000000; // 出力ピンの初期化(全てLOWにする)

// 500ms毎にLEDの点滅を繰り返す
while(1) {
GPIO2 = 1; // 5番ピン(GP2)にHIGH(5V)を出力する(LED ON)
__delay_ms(500);
GPIO2 = 0; // 5番ピン(GP2)にLOW(0V)を出力する(LED OFF)
__delay_ms(500);
}
}

コメント付のソースファイルも置いておきます(本来の拡張子は.cです)。コンパイル時にコメントは除かれるので、後で見てわかりやすいように色々書いておくと良いと思います。
Lチカのサンプルプログラム

<追記(2021.11.26)
ソースプログラムを記述する際には、普通にコメントとして日本語も書けたのですが、改めて開いてみたら文字化けしていました。どうやらデフォルトの文字セットの設定が関係しているようです。日本語表示には文字セットをUTF-8(最近はこちら)かShift-JISに設定する必要があります。そこで、既に入力済みのソースに関しては、次のように操作して正しく表示できるようにします。まずはプロジェクトを開いてウインドウ左下にDashboardを表示し、左上の「Project Properties」アイコンをクリックし、Project Propertiesウインドウを開きます。次に開いたウインドウ左の「General」をクリックします。最後にウインド最下部の「Encording」欄の上下矢印をクリックすると文字コードの一覧が表示されるので、その中から指定すべき文字セットを選びます。

実は新規プロジェクトを作成する際に、文字セットに関する指定があったのですが、無視して進んでしまっていました。上述のプロジェクト作成手順の最後6.の項目を見ると、最下段に「Encoding」の設定があります。ここを使用したい文字セットに変更しておけば、新規プロジェクトで変更後の文字セットが適用されるわけです。しかし、新規プロジェクトの際にいちいち設定するのも面倒なので、デフォルトで新たな文字セットを適用するようにした方が効率的です。IDEの文字セットをあらかじめ変更するには、次のように操作します。ただし、それまでに作成したプロジェクトには適用されません。

上部のメニューバーで「Tools」→「Options」と選択すると、オプションウインドウが開きます。メニューの中の「Enbeded」を選択すると色々な項目が表示されますが、その中の「Default Charset」を変更しておけば、次からは文字化けせずに日本語を扱えるようになります。