一度、PICマイコンを使って見たかったのです。電子工作をやっていると、AVRと並んで良く見かけるマイコンですから。しかし、「最初の開発環境整備が大変だな」と、手をこまねいていたところ、PICAXEという製品を知りました。
シリアル通信(UART)でプログラムの書き込みが可能で、BASICやフロウチャート、Blockly等の開発環境が使えます。PICマイコンに専用のファームウェア(BASIC処理系)が書き込まれた状態で販売されている、カスタムマーク品です。
前回、開発環境をインストールして使用感を確かめましたので、今回は、実チップを使って見ようと思います。
PICAXEマイコンへのプログラム書き込み環境を立ち上げて行きましょう。
PICAXEのマニュアル等から、書き込み回路の必要事項をまとめてみました。
調査によって判ったこと:
※PICAXEマニュアルから引用。
まず、FTDI社製USB⇔UART変換モジュールで、FTDI社の設定ツールを使うと、TXD,RXD端子の極性を反転できるらしいですが、これは速攻却下しました。本HPでも、FTDI社製USB⇔UART変換モジュール(下図)を使っているので、「可能」ではあるけれど、非常に使用頻度の高いUSB⇔UART変換モジュールの設定を変更して、極性を反転するなど、あり得ません。
通常用途で使う時と、PICAXE用に使う時に、一々設定変更しなくてはならなくなります。面倒な事、この上なし。よって、極性の反転は、NOT論理演算回路を追加して対処します。
マニュアルの推奨回路例に示された、高抵抗接地やダンピング抵抗は、書き込み端子(ステレオミニプラグ)を抜き/挿しする時の保護が目的だと思われるので、抜き/挿しせずに使う場合は不要と判断しました(以下考察が根拠)。
PICAXEとUARTの接続回路考察:
あくまで、「本ページの使い方では不要」と判断しています。各自の使い方に照らして、必要な回路を設計するようにしてください。「良く解らない」という方は、悪いことは言いません、専用のダウンロードケーブルを購入した上で、マニュアルの推奨回路通りに書き込み回路を構成してください。
前節の考察に基づいて、PICAXEマイコンへのプログラム書き込み回路を設計して行きます。
UART信号線(TXD,RXD)の論理を反転するため、NOT論理演算回路(NOTゲート)が必要となります。NOTゲート用としては、他の用途への応用も考えて、標準ロジックIC(74HC00)を購入済みです。
書き込み回路は、以下図の様になります。
※PIC16F1825の電気的特性規定では、2.5V(MIN)〜5.5V(MAX)の電源供給が可能なため、マージン込みでVcc=3〜5[V]としました。
単純に、標準ロジックIC(74シリーズ74HC00、2入力NANDゲート)でTXD,RXDの論理を反転して接続しました(以下図)。
USB⇔UART変換モジュール(本ページではFTDIを使用)と、上の書き込み回路を、以下接続表の通り結線してください。
USB⇔UART変換 モジュール(FTDI等) |
接続 | PICAXE書き込み回路 |
VCC(電圧ジャンパは5V側) | → | Vcc |
GND | ⇔ | GND |
RX | ← | TXO |
TX | → | RXI |
※FTDIの電圧ジャンパは5V側を指定しましたが、3.3V側でも問題なく使用可能です。
本ページでは、電源もFTDIから供給しています。PICAXEへ電源を供給したまま、書き込み信号(TXD,RXD)を挿抜する事はありません。
FTDIをPCに接続、PICAXE Editor 6の通信ポートにFTDIの通信ポートを設定したら準備完了です。PICAXE Editor 6でプログラムファイルを開いたら、「Homeタブ ⇒ Download ⇒ Programボタン」を押すと、PICAXEマイコンへの書き込みが実行されます。
手元に「74HC00なんて無いよ〜」と言う向きには、FTDIのファームウェアを設定して、論理反転した方が楽かもしれません。
他には:
各自の環境・実力に合わせて、考えてみてください。
74HC00等のNOT論理演算可能なICが手元にない場合、もし、NPNトランジスタをお持ちなら、TTL回路でNOTゲートを2個作るという方法もあります。
NPNトランジスタを使って作るロジック回路をTTL(Transistor-Transistor Logic)と言って、CMOS(Complementary Metal-Oxide-Semiconductor)ロジックが全盛になる以前に使われていた論理回路となります。
本節は寄り道なので、不要な場合は読み飛ばしてください。
NOTゲートを作る前に、まず、NANDゲートから解説して行きます。今回の書き込み回路で使用した74HC00と同じ論理演算回路のTTL版です。
回路図は以下の通りです。
NPNトランジスタ×3個と抵抗×2個を使って、2入力NANDゲートを構成しています。
論理動作としては、入力(Vi1,Vi2)がHIGH,HIGHの場合だけ出力VoがLOWとなり、それ以外の組み合わせでは、HIGHを出力します。が、見ての通り、トランジスタを使ったアナログ回路ですので、LTspiceを使って回路図を入力してあります。
以下図が、LTspiceを使ったシミュレーション波形です。
Vi1=Vi2=HIGHとなると、トランジスタQ1,Q2のエミッタ端子に電流が流れなくなるため、Q1,Q2がOFFします。すると、Vcc→R1→[Q1,Q2]のベース→コレクタ→Q3のベース→エミッタと、電流が流れ、Q3がONします。よって、VoがGNDに引かれて、LOW出力となるのです。
この時、Q3にはVce(SAT)の電圧がかかるので、Voは完全に0Vまで落ちず、Vce(SAT)程度の電圧を出力しています。
例として、NPNトランジスタS8050のデータシートによると、Vce(SAT)=0.5V(MAX)なので、LOWレベル出力時、最大でVo=0.5Vまで浮くということです。次段でこの信号を受ける側が、Vo=0.5VをLOW入力だと認識する必要があります。
このようなTTL側の都合で決まる入出力レベルを「TTLレベル」などと呼びます。
※シミュレーションでは、しっかり0Vまで落ちているみたいです。理想的に近いNPNトランジスタのモデルをそのまま使っているからです。実在するトランジスタのモデルでシミュレーションして見てください。もっとアナログ的な波形でシミュレーションされます。
HIGH出力側も同じで、R2でプルアップされているので、LEDなど重たい電流負荷を繋いでしまうとVoの出力レベルが下がってしまいます。つながる先のVIHを満たせる範囲内で使用してください。
※この後示す、他のTTL回路も同様ですが、回路図で使った抵抗値は、「万能の確定値」ではありません。アナログ回路ですから。次段/前段の回路構成などに従って、都度、最適値を選択する必要があります。
現在、論理回路に使われているCMOSロジックの場合なら、一般的に入力インピーダンスが高いので、前段や次段の回路構成を気にするケースは少ないのですが、上で指摘した様に、TTLは入力端子に電流が流れます。それを前提として論理回路を組む必要があるのがちょっと、面倒です。
それに、TTLは基本的にオープンドレインっぽい回路になっているので、HIGHの出力はプルアップとなります。動作速度が制限されることに加えて、LOWを出力している間、Vcc→抵抗→NPNトランジスタ→GNDに貫通電流が流れ続けるので、抵抗値を小さくすると消費電流が大きくなってしまう事などが短所です。
同様に、NORゲートの回路図は以下となります。
NPNトランジスタ×2個、抵抗×3個で構成できます。部品点数としてはNANDと同じ5個ですが、NORの方が、必要なトランジスタ数が少なくなっています。
シミュレーションは割愛します。各自ご確認ください。
漸く最後に登場するのが、NOTゲートです。回路図は以下の通りです。
NPNトランジスタ×1個、抵抗×2個で構成できます。
今回、UART信号(TXD,RXD)の論理を反転するのに必要な回路です。上図の様な回路を2組作って、TXD,RXD信号の論理を反転して使ってください。
LEDやブザーなど、大電流を駆動したい時に、よく使われる回路ですよね?論理回路的には、論理否定NOT回路と、なります。
実物のPICAXEで遊んでみましょう。
こちらの書き込み回路をブレッドボードなどに構築した上で、Lチカ用に以下の回路を接続してください。
追加回路:
USB⇔UART変換モジュールをPCに接続、PICAXE Editor 6を起動して、こちらのプログラムを読み込みます。
回路等が正しければ、PICAXE Editor 6の「Homeタブ ⇒ Download ⇒ Programボタン」を押すと、PICAXE-14M2への書き込みが実行されます。
※書き込みに使用するUARTの通信速度は4,800baudらしいです。その為なのか、書き込み時間が長い印象があります。
以下図に実験中の様子を示します。
PICAXE Editor 6の「PICAXEタブ ⇒ Tools ⇒ Terminalボタン」を押すと、シリアルモニタが開き、PICAXE-14M2が計算したフィボナッチ数列が送信されてきていることを確認できます。
また、PICAXE-14M2に接続したLEDが、リニアに明るさを変化させながら、消灯⇔点灯を繰り返しているはずです(下図、アニメーションPNG)。
PWM波形を出力するための、BASIC pwmoutコマンドに於いて、引数periodとduty cyclesへの設定値の関係が解り難いので確認しておこうと思います。Blocklyではset pwmoutブロックが用意されており、引数はperiodとdutyの2個です(下図)。
本来、デューティと言ったら、周期に対するHIGH幅の比率を指し、一般的な単位はパーセント[%]です。pwmoutコマンドの引数名=duty cyclesって事は、%ではなく、サイクル数で指定するのかな?引数periodは周期なので、これも時間の長さが単位で、一般にはサイクル数のハズ?
ところが、マニュアル記載の、periodとduty cyclesの関係式を見ていると、互いに分周比が異なるサイクル数なので、これが理解を妨げています。
と言う事で、ここから先は、実際にPWMを出力させてみて、STM32ボード+Logiscopeを使い、PWM波形を取得、確かめてみた方が早いです。
Logiscopeで取り込んだPWM波形が以下図となります。
最初に示したset pwmoutブロック(period=100、duty=100)では、上波形図の通り、周期=約100μs、HIGH幅=約25μsのPWM波形が観測できました。どうやら、クロックスピード(BASICのsetfreqコマンド等)が、4MHz(デフォルト)の時、periodの数値がPWM周期[μs]、PWMのHIGH幅(時間長さ)が、duty÷4[μs]と、なる様です。
従って: PWMデューティ[%]=duty÷4÷period
恐らく、引数dutyの解像度を上げるため、×4倍した値を設定する仕様なのだろうけど、そこが理解のし難さを醸成していました。ここで、引数dutyは16ビット値(0〜1,023)で指定可能です。
一方、set pwmoutブロックでは、引数periodが8ビット値(0〜255)に限定されており、最大周期255μsのPWMまでしか出力できないのですが、これでは周期が短すぎます。LEDの電流制限抵抗値と既成容量次第では、PWM周期に比べて時定数が長すぎるため、リニアに明るさを制御できないように見えました。
BASICのコマンドでは、タイマの分周比をPWMDIV4/PWMDIV16/PWMDIV64から選択できるのですが、set pwmoutブロックでは分周比の指定ができません。Blocklyでは、BASICコマンドを直接指定可能なBASICブロックを使って、タイマの分周比を指定して使った方が良さそうです(下図)。
上のプログラムで使った「PWMDIV16」は、タイマのカウントクロックを1/16分周するオプションなので、PWM周期=128μs×16=2,048μs、即ち約2msです。Arduino UNOでanalogWrite()関数を使った時のPWM周期と同じ値を設定しました。
ついでに、上のプログラムで使ったstart1ブロックですが、マルチタスクを起動するブロックです。PICAXE-14M2では、start,start1,……,start7まで8つのタスクを定義することができます。この裏で、メインのstartブロックでは、こちらのフィボナッチ数列を計算し続けています。
最後にPICAXEマイコンのクロックスピードに関してのトピックです。
マニュアルによると、デフォルトのクロックスピードは、4MHzみたいです。PICAXE-14M2は、最大32MHzで動作可能なので、BASICでは、setfreqコマンドでクロックスピードを変化させることができます。
クロックスピードに関するマニュアルの記述まとめ:
特に、マルチタスクモードに於ける自動制御というのは、良い様な、悪い様な、大きなお世話な様な……、実時間処理が大半となるマイコンには似つかわしくなく、注意が必要です。
現に、前節のサンプルプログラムでは、Lチカをマルチタスクモードで実行したため、pauseブロックの待ち時間が、想定に対してズレている様です。想定では2s間隔で点滅させているのに、1s間隔でチカチカしているみたい……。
こちらのプログラムでは:
これ、致命的なのでは?何でこういう、余計な事をするかな?
使って見た結果、実用には程遠く、教育用、初学者用、等、ただの「おもちゃ」だったな、という印象です。
その分(?)シミュレーションができたり、ステップ実行ができたりと言った、デバッグや動作理解用の機能は充実している感があります。シミュレーションで動作確認できてしまうので、一つ間違うと、実物を動かしてみる前に「満足」してしまいそうになります(笑)。
もう、満足しましたよ(お腹一杯)。これで、PICマイコンは必要ないや(もう沢山)。初心者ユーザに優しくない(書き込みツールが高価な)時点で、AVRマイコンに軍配が上がっています。AVRマイコン←ラブ💖。浮気しようとしてしまってゴメンね。やっぱり、キミが一番好きだぁ〜。