PICマイコン電子工作入門の基礎編と応用編で触れなかった知識を、実践編としてまとめていきます。第1回目は全体像を説明します。
実践編のテーマ
PICマイコン電子工作入門の基礎編、応用編と進んでこられて、いかがでしたでしょうか。
「いかがでしたでしょうか」なんて急に感想を聞かれても、「別に?」って気もしますし、そもそも「入門」という割には難しいところもありましたので、感想としてはどちらかというと「うんざり」って感じに近いのではないでしょうか。
そういうお気持ちもあるかとは思いますが、この実践編ではさらに込み入った長い記事をお届けしようと考えております。
基礎編と応用編の内容を振り返ってみると、基礎編では簡単なタイマーを製作することにより、マイコンの基本的な機能であるデジタルの入出力制御の使い方を確認しました。
また、応用編ではタイマーの機能を拡張させることにより、ADコンバータやPWM制御など、マイコンが持ついろいろな機能の使い方を確認しました。ただ、機能を説明するために無理やりタイマー機能を拡張したので、出来上がったタイマーは、なんとなく「これじゃないタイマー」って感じになってしまいました。すみません。
ところで、基礎編と応用編でご説明した機能を一通り使えるようになると、一般的な電子部品の制御はできるようになります。この入門シリーズでは登場しませんが、普通のモーターやステッピングモーター、サーボモーターをマイコンで制御する場合、モーターを駆動するための電子回路の知識は必要になりますが、制御するPICマイコンの使い方(プログラム)は基礎編と応用編の知識の範囲内です。
このように、これまでの知識で大半の電子部品が制御できるようになりますが、この先、さらに製作できるものの範囲を広げるために、実践編では「データ通信」をテーマに、新しい知識を一緒に身につけていきたいと思います。
データ通信を行う電子部品
電子部品の通販サイトなどを見ていると、いろいろな種類のセンサやモジュールが売られてます。例えば以下のように、「温湿度・気圧センサ」や「液晶ディスプレイモジュール」など、さまざまな高機能の電子部品があります。
これらの電子部品の説明を見ると「通信方式: I2C、SPI」や「I2C接続」などという言葉が出てきます。これらはデータ通信の方式(種類)を意味しています。
「I2C」や「SPI」という言葉の意味はこのシリーズの記事で詳しく説明していきますので、今は、何の略で、何を意味しているのか、さっぱりわからなくても大丈夫です。ここでは、データ通信にはいくつか種類があるんだな、という程度でご理解いただければ問題ありません。
イメージが湧かないようでしたら、例えばデスクトップPCとディスプレイを接続する場合を思い出してみてください。PCからディスプレイに映像データを送信するわけですが、接続するケーブルは何種類かありますよね。
一例を挙げると、HDMIケーブル接続やUSB Type-Cケーブル接続など、同じ映像データを送るのに、いくつか方式(種類)があります。I2C通信とSPI通信もこれに似ていて、データを送ることに変わりありませんが、接続形態やデータの送り方などが異なっています。
このようなセンサやモジュールは、マイコンに接続して「データ通信」を行うことより制御できるようになります。例えばマイコンに温湿度・気圧センサを接続した場合は、マイコンとセンサがデータ通信を行なって温度と湿度のデータをセンサから取得します。また、液晶ディスプレイモジュールを接続した場合は、データ通信を行うことにより、表示する内容などをマイコンから液晶ディスプレイモジュールに送信します。
データ通信でどの方式(SPIやI2Cなど)を使うかは、電子部品ごとに異なります。例えば上の温湿度・気圧センサはSPIかI2Cを選択できます。また、上の液晶ディスプレイモジュールはI2Cで通信を行います。
最近は、このようなデータ通信をして制御する電子部品が増えてきていますので、実践編では「データ通信」を中心に説明をすることにしました。
作るもの
実践編で製作するものを簡単にご紹介します。機能としては現在の気温、湿度、気圧の情報をセンサから読み取り、読み取った値をLCDモジュール(液晶ディスプレイモジュール)に表示する、という基本的な機能を持つ環境モニタみたいなものです。
使用する主な部品を簡単にご紹介します。
PICマイコンは、(1)PIC16F18857を使用します。基礎編と応用編で製作したタイマー程度の機能でしたらPIC12F1822で十分ですが、今回は気温などの小数点の計算処理が多くあるため、ある程度のメモリ容量が必要になります。そこで、メモリ容量の多いPIC16F18857を選んでみました。またこのマイコンはピン数が多いので、実践編の製作後、いろいろな機能拡張もできると思います。
(2)温湿度・気圧センサは、微妙な環境変化にも敏感に反応します。特に気圧センサは1〜2mの高さの気圧の差もわかります(自分で試したところ50cmぐらいの高さの変化もわかるような気がします)。センサのデータシートによると気圧センサはドアの開け閉めなどの影響も受けるということなので、何かの検知にも使えそうですよね。
(3)の温度センサも感度の高いセンサで、0.0078度の変化がわかります。日常生活ではここまで正確に気温を測定する必要はなさそうですが、農業(ハウス栽培)などでは微妙な気温の変化も収穫量に影響するとのことで、この程度のセンサがあるといいかもしれません。ところで、(2)のセンサでも温度が測定できますが、気温測定についてはこのセンサを使用することにします。この理由については、記事の中で詳しく説明します。
(2)と(3)のセンサで測定した値は、(4)のLCDモジュールに表示します。表示できる文字数は16文字 x 2行ですので、それほど多くの情報を表示することはできませんが、何秒かおきに表示を変えれば色々な情報が表示できると思います。またスイッチをつけて表示を切り替えるというのもいいかもしれませんね。
なお、今回のシステムの動作電圧は3.3Vにします。理由は、温湿度・気圧センサの電源電圧範囲が1.7V〜3.6V、LCDモジュールの電源電圧範囲が3.1V〜5.5Vであるため、両方のセンサが動作する範囲の電圧にしたいためです(なぜ「3.3V」か? については記事の中で説明します)。
この3.3Vという電圧を作るために、(5) 3端子レギュレータという部品を使います。この部品は特定の電圧が欲しい場合に容易に使用できますが、注意点もありますので回路設計の時に詳しく説明します。
あと、何かの通知を行うために(6)の2色LEDも接続しました。赤と青の2色のLEDですので、両方同時点灯も入れると、赤、青、紫の3色が表示できます。この3色を天気予報の通知に使おうと考えています。
天気予報ってできるの?
実践編の最後に、天気予報のプログラムを作ってみる予定です。この記事を書いている段階では目処は立っていないのですが、何とか作れるのではないかと思っています。
とはいっても、プログラムで天気予報なんてできるのかな? と思いますよね。
このような製品があるのはご存知でしょうか。
「超アナログ」とつけなくてもいいと思いますが、このキットでは、気圧の変化を検知して、現在地から半径20km以内ぐらいの、8〜9時間後の、おおよその天気を予測する、というものです。「ぐらい」とか「おおよそ」って出てくるのでやっぱり「超アナログ」って感じなんでしょうか。
上の画像は実際に動作させているところです。LEDが点灯して予測を示します。センサーが示している表示は「現在晴れ、このあと雨の傾向」となっています。実際、この時点では晴れていたのですが、翌日は雨になりました。うまく予測ができた例だと思いますが、しばらく使ってみると外れることもあります。全体的には当たらずとも遠からず、という感じでしょうか。
またこのような製品もあります。
こちらも気圧の変化を読み取って同じように天気予報をする機能がついています。
これらの製品の仕組みですが、気圧が上昇傾向に入ると8〜9時間後には晴れ、下降傾向に入ると同じく8〜9時間後に雨になる確率が高くなる、という気圧の変化と天気の変化の関係を利用しています。気圧の変化を読み取ってその場所の天気予報を行っているわけです。
実践編で製作するものは気圧データも取得しますので、なんとかこの判定のアルゴリズムを作って、天気予報システムを作ってみよう、という算段です。
説明の進め方
電子工作の幅を広げようとすると、どうしてもハンダ付けが必要になってきます。
この実践編でもハンダ付けが必要な部品を使用します。そのため、ハンダ付けについては基本的なところから説明を行い、実際に一緒にハンダ付けを行いましょう!
また、自分でハンダ付けをして組み立てると、部品がきちんと動作するのか不安になってしまいますので、実践編では最初にブレッドボードに回路を全て組み立てて、全部の部品が正しく動作するか早い段階で確認することにします。動作確認ができたら、詳しい説明に入ります。
このあとの説明は以下のように進める予定です。
- 全体像の説明(今回の記事)
この記事で全体像の説明をします。 - 買い物リスト
基礎編で使用した部品の余りも使用しますので、実践編で新規に入手する道具や部品を整理します。 - ハンダ付けの練習とセンサ/モジュール組み立て
実践編ではハンダ付けを行う部品が3個あります。ハンダ付けが初めての場合はいろいろと不安ですので、慣れるために最初に練習基板で練習をしてから実際の部品のハンダ付けを行います。 - 回路図
最初に回路図を設計してしまいます。電源周りの回路は詳しく説明しますが、通信周りの回路はここでは単に接続するだけにして、詳しい説明はデータ通信方式のところで詳しく説明します。 - ブレッドボード回路組み立て
回路図をもとにブレッドボードに組み立てます。今回はなるべく配線が少なくなるように工夫してみます。 - 動作確認
全部の部品の動作確認ができるように、温湿度・気圧をLCDモジュールに表示するプログラムを使って動作確認します。センサがどの程度の感度で反応するか、ここで確認してみてください。 - 通信方法考察
データ通信方式として、「SPI通信」と「I2C通信」と呼ばれているもの利用しますが、これらの通信方法を「このように通信します」というように説明すると、なぜそのようになっているのか理解しづらいところもあるため、そもそも通信はどのように行えばよいか根本的なところから考えてみます。 - SPI通信方式の説明
通信の考え方がわかったところで、SPI通信の方式を詳しく説明します。 - 温湿度・気圧センサ制御
温湿度・気圧センサはSPI通信を利用しますので、SPI通信で温湿度・気圧データを取得するプログラムを作ります。 - デバッグ方法
温湿度・気圧センサからデータを取得しても、液晶ディスプレイを接続していませんので、正しいデータが取得できたか確認できません。そこで、MPLABX IDEのデバッグ機能を利用して、PICマイコンの動作の様子をMPLAB IDE状で確認します。 - I2C通信方式の説明
次にI2C通信の方式を詳しく説明します。 - LCDモジュール制御
LCDモジュールはI2C通信を利用しますので、I2C通信でLCDモジュールを制御するプログラムを作ります。温湿度と気圧データを表示します。 - 温度センサ制御
温度センサもI2C通信を利用しますので、I2C通信で温度センサからデータを取得して、液晶ディスプレイに表示するプログラムを作ります。 - 天気予報
最後に、取得したデータを元にして天気予報に挑戦してみます。
予算
予算ですが、今回はハンダ付けがありますので、ハンダ付けの道具をどうするかで予算がかなり変わります。
ハンダ付けの道具関連の予算は、記事内で使用するものを揃えると7,000円程度になります。特にハンダこてなどは値段に幅があるため、標準的なものを揃える場合にこのぐらいの予算が必要、とご理解ください。すでにハンダこてなどをお持ちの場合はこの予算は必要ありません。
また、実践編で使用する電子部品やその他部材ですが、基礎編と応用編で使用した道具(PICKit3など)や余った部品(抵抗やLED)がある場合、新規購入分は3,000円程度になります。
ところで、実践編で使用する部品のうち、LCDモジュールは細かいハンダ付けを行うため、組み立ての難度は若干高いです。そのため、ハンダ付けに自信がない場合、こちらでハンダ付けを代行いたします。ご希望の方は、このサイトのお問い合わせページからご連絡ください。部品代と送料をご負担いただければと思います。また、部品を購入後にハンダ付け代行を頼みたい、という場合は、部品をお送りいただければ折り返しハンダ付けした部品をお送りいたします。その場合も送料をご負担いただければと思います。
実際に揃える道具や部品については、次回の記事で買い物リストを作ります。
前提とする知識
実践編では、基礎編と応用編で説明した内容は再度説明しませんので、基礎編と応用編の知識は前提とします。とは言っても、時間が経つと忘れてしまいますので、必要なところで参考ページのリンクをつけるようにいたしますので、必要に応じて復習しましょう!
また、C言語については基本的な文法の理解で問題ありません。以下の内容は理解している前提で進めますので、忘れてしまっている場合は再度確認していただくようにお願いいたします。
- コメントの書き方
- #define、#include
- 関数とプロトタイプ宣言
- 変数型、各種演算子、キャスティング
- 配列
- printf文(%フォーマット)
- 繰り返し構文(while文、for文)
- 条件判断構文(if文、switch文)
- 2進数、16進数
特にセンサを使う場合、数値データをたくさん扱います。2進数、16進数は十分慣れておくようにしましょう!
次回は買い物リストを作ります!
更新履歴
日付 | 内容 |
---|---|
2018.3.10 | 新規投稿 |
ツール・ラボ様、いつも大変お世話になっております。
PICの実践編で、PIC16F18857の使い方ものすごく理解できました。 ありがとうございます。
他の方のHPなどを参考にして、色んな事にチャレンジしているのですが、Raspberry PiとのSPI通信が上手く出来ません、本来のこのコメント欄にはツール・ラボ様の記事に直接関連した事を書くべきなのは重々承知しているのですが、Web上の他の方のHPでもSPI通信のマスター側のプログラムの事ばかりでスレーブ側の記事はほぼ見つからず、時間ばかり費やしている状況なので、今回もダメもとでコメントしている次第です。
Raspberry Pi(マスタ)とPIC16F18857(スレーブ)でSPI通信をしようと思い、過去にRaspberry PiとPIC16F1827でSPI通信をしたものを参考にして以下の様な初期化を書いてみましたが、ラズパイからの信号受け取っていない様に思っています.。
/*******************************************************************************
// SPI 初期化
******************************************************************************/
void SPI_Init(void){
// SPIの設定 RaspberryPi(マスター)との通信 **** PIC16F18857(スレーブ) ****
// SSP1STAT SMP CKE D/A P S R/W UA BF PDF 495p
SSP1STAT = 0b01000000; // クロック位相は1(立上がりエッジで読込む)
// SSPxCON1 WCOL SSPxOV SSPxEN CKP SSPxM3 SSPxM2 SSPxM1 SSPxM0 PDF 496p
SSP1CON1 = 0b00100100; // クロック極性はLOW スレーブモードでSS有効
// SSP1CON3 ACKTM PCIE SCIE BOEN SDAHT SBCDE AHEN DHEN PDF 498p
SSP1CON3 = 0b00010000; // 新しいデータバイトがシフトインするたびに更新 BOEN
// PERIPHERAL PIN SELECT (PPS) MODULE
// 設定ロック解除
PPSLOCK = 0x55; // おまじない PDF 239p EXAMPLE 13-1
PPSLOCK = 0xAA; // おまじない PDF 239p
PPSLOCKbits.PPSLOCKED = 0x00; // ロック解除
// 18857 ピン設定 役割名にPINの値を割り当てる
SSP1SSPPS = 0x14; // SS : RC4 Value to Write to Register PDF 237p/243p
SSP1DATPPS = 0x15; // SDI : RC5 Value to Write to Register PDF 237p/243p
// SSP1DATPPS = 0x16; // SDI : RC6 Value to Write to Register PDF 237p/243p
SSP1CLKPPS = 0x17; // SCK : RC7 Value to Write to Register PDF 237p/243p
// 18857 ピン設定 PIN番号に役割の値を割り当てる
RC6PPS = 0x15; // SDO : RC6 RxyPPS Register Value PDF 240p/243p
// RC5PPS = 0x15; // SDO : RC5 RxyPPS Register Value PDF 240p/243p
// 設定再ロック
PPSLOCK = 0x55; // おまじない PDF 239p EXAMPLE 13-1
PPSLOCK = 0xAA; // おまじない PDF 239p
PPSLOCKbits.PPSLOCKED = 0x01; // 設定ロック
// SPI通信 割込み 設定 INTCON,PIR3,PIE3のレジスタの各Bitをセットする
SSP1IF = 0 ; // SPIの割込みフラグを初期化する PIR3 PDF 147p
SSP1IE = 1 ; // SPIの割込みを許可する PIE3 PDF 138p
PEIE = 1 ; // 周辺装置割込み有効 INTCON PDF 134p
GIE = 1 ; // 全割込み処理を許可する INTCON PDF 134p
}
************************************************************************************************
* PIC16F18857ピン設定
* RC0 LED * RE3 MCLR
* RC1 AB_sw
* RC2 LCD SDA2
* RC3 LCD SCL2
* RC4 SPI SS
* RC5 SPI SDI1
* RC6 SPI SDO1
* RC7 SPI SCK1
************************************************************************************************
// ピン属性設定
ANSELC = 0b00000000; // C-PROT 全てデジタル
TRISC = 0b10111110; // C-PROT
そもそも、これだけの定義だけで事足りているのでしょうか?
何かヒントとなる事が有りましたらご教授お願い致します。
コメントどうもありがとうございます。
MSSPのレジスタの設定は問題ないように思います。
SPI通信は単純な通信手順ですので、うまく動かない場合はタイミングが合っていないなどの原因もありえるかもしれません。
これ、という解決策はないのですが、以下の方法を試してみても良いのではないかと思います。
1) MCCで生成したコードで動作確認してみる
MCC(Microchip Code Configurator)で、MSSPモジュールを選択してUIで設定を行うと、必要なコード(関数)を生成してくれます。そのコードを利用して動作確認してみるのも参考になると思います。
2) MSSPモジュールを使用せず、ポートレジスタを読み書きするコードで確認してみる
MSSPモジュールは設定が1ヶ所違うと動作がおかしくなってしまうことがあります。SPI通信は単純ですので、このシリーズ記事で行っているように、SPIスレーブ動作を単にRCポートレジスタの読み書きで行うコードで確認してみるのも良いと思います。
明確な解決策でなく申し訳ございません…
御回答、ありがとうございました。
ただ、提案頂いた内容は、
1)はMCCで設定する項目を熟知していなければ正しい解が得られないような気がして試す事ができませんでした。
2)のMSSPモジュールを使用せずポートレジスタを読み書きするコード自体が全く思い浮かばずこれもまた試す事ができませんでした。
しかし、回答の「MSSPのレジスタの設定は問題ないように思います。」を信じてSPI通信(折り返し)だけのコードを試したところ、マスター(RaspberryPi)からの送信データがきれいに受信できました。
私の書いた元のソースコードには、実践編のI2CやLCDの制御コードも含まれているので、その部分と何か干渉しているのかと思われます。
とりあえず、SPI(スレーブ側)自体の機能の確認はできました。
ありがとうございました。
結果のご連絡をいただきどうもありがとうございました。
また、直接のご回答ができずに申し訳ございませんでした。
SPI送信の受信はできているとのことでよかったです。I2C通信との関係が疑われるようでしたら、ちょっと面倒ですが、SPI通信のみのプログラムを作成して動作確認してみるのも問題の切り分けになりそうですね。
PICマイコンはいろいろな機能が実装できますので、I2C通信とSPI通信の同時制御自体は問題になることはないと思いますので、もしかしたら回路上で何か問題がある可能性もあります。
動作確認されてまた詰まってしまったらご質問いただければと思います。