第1回 全体像

PICマイコン電子工作入門の基礎編と応用編で触れなかった知識を、実践編としてまとめていきます。第1回目は全体像を説明します。

目次

実践編のテーマ

PICマイコン電子工作入門の基礎編、応用編と進んでこられて、いかがでしたでしょうか。

「いかがでしたでしょうか」なんて急に感想を聞かれても、「別に?」って気もしますし、そもそも「入門」という割には難しいところもありましたので、感想としてはどちらかというと「うんざり」って感じに近いのではないでしょうか。

そういうお気持ちもあるかとは思いますが、この実践編ではさらに込み入った長い記事をお届けしようと考えております。

基礎編と応用編の内容を振り返ってみると、基礎編では簡単なタイマーを製作することにより、マイコンの基本的な機能であるデジタルの入出力制御の使い方を確認しました。

また、応用編ではタイマーの機能を拡張させることにより、ADコンバータやPWM制御など、マイコンが持ついろいろな機能の使い方を確認しました。ただ、機能を説明するために無理やりタイマー機能を拡張したので、出来上がったタイマーは、なんとなく「これじゃないタイマー」って感じになってしまいました。すみません。

ところで、基礎編と応用編でご説明した機能を一通り使えるようになると、一般的な電子部品の制御はできるようになります。この入門シリーズでは登場しませんが、普通のモーターやステッピングモーター、サーボモーターをマイコンで制御する場合、モーターを駆動するための電子回路の知識は必要になりますが、制御するPICマイコンの使い方(プログラム)は基礎編と応用編の知識の範囲内です。

このように、これまでの知識で大半の電子部品が制御できるようになりますが、この先、さらに製作できるものの範囲を広げるために、実践編では「データ通信」をテーマに、新しい知識を一緒に身につけていきたいと思います。

データ通信を行う電子部品

電子部品の通販サイトなどを見ていると、いろいろな種類のセンサやモジュールが売られてます。例えば以下のように、「温湿度・気圧センサ」や「液晶ディスプレイモジュール」など、さまざまな高機能の電子部品があります。

温湿度・気圧センサモジュールキット(秋月電子通商)

LCD(液晶ディスプレイ)モジュール(秋月電子通商)

これらの電子部品の説明を見ると「通信方式: I2C、SPI」や「I2C接続」などという言葉が出てきます。これらはデータ通信の方式(種類)を意味しています。

「I2C」や「SPI」という言葉の意味はこのシリーズの記事で詳しく説明していきますので、今は、何の略で、何を意味しているのか、さっぱりわからなくても大丈夫です。ここでは、データ通信にはいくつか種類があるんだな、という程度でご理解いただければ問題ありません。

イメージが湧かないようでしたら、例えばデスクトップPCとディスプレイを接続する場合を思い出してみてください。PCからディスプレイに映像データを送信するわけですが、接続するケーブルは何種類かありますよね。

一例を挙げると、HDMIケーブル接続やUSB Type-Cケーブル接続など、同じ映像データを送るのに、いくつか方式(種類)があります。I2C通信とSPI通信もこれに似ていて、データを送ることに変わりありませんが、接続形態やデータの送り方などが異なっています。

このようなセンサやモジュールは、マイコンに接続して「データ通信」を行うことより制御できるようになります。例えばマイコンに温湿度・気圧センサを接続した場合は、マイコンとセンサがデータ通信を行なって温度と湿度のデータをセンサから取得します。また、液晶ディスプレイモジュールを接続した場合は、データ通信を行うことにより、表示する内容などをマイコンから液晶ディスプレイモジュールに送信します。

データ通信でどの方式(SPIやI2Cなど)を使うかは、電子部品ごとに異なります。例えば上の温湿度・気圧センサはSPIかI2Cを選択できます。また、上の液晶ディスプレイモジュールはI2Cで通信を行います。

最近は、このようなデータ通信をして制御する電子部品が増えてきていますので、実践編では「データ通信」を中心に説明をすることにしました。

作るもの

実践編で製作するものを簡単にご紹介します。機能としては現在の気温、湿度、気圧の情報をセンサから読み取り、読み取った値をLCDモジュール(液晶ディスプレイモジュール)に表示する、という基本的な機能を持つ環境モニタみたいなものです。

Pic practice 1 completed

使用する主な部品を簡単にご紹介します。

Pic practice 1 parts

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色を天気予報の通知に使おうと考えています。

天気予報ってできるの?

実践編の最後に、天気予報のプログラムを作ってみる予定です。この記事を書いている段階では目処は立っていないのですが、何とか作れるのではないかと思っています。

とはいっても、プログラムで天気予報なんてできるのかな? と思いますよね。

このような製品があるのはご存知でしょうか。

Pic practice 1 analog weather forecast

超アナログお天気センサーキット

「超アナログ」とつけなくてもいいと思いますが、このキットでは、気圧の変化を検知して、現在地から半径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 新規投稿
通知の設定
通知タイミング
guest
4 コメント
新しい準
古い順 一番投票が多い
本文中にフィードバック
全てのコメントを見る
木下 健
木下 健
1 年 前

ツール・ラボ様、いつも大変お世話になっております。

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

そもそも、これだけの定義だけで事足りているのでしょうか?

何かヒントとなる事が有りましたらご教授お願い致します。

木下 健
木下 健
返信  管理者
1 年 前

御回答、ありがとうございました。

ただ、提案頂いた内容は、
1)はMCCで設定する項目を熟知していなければ正しい解が得られないような気がして試す事ができませんでした。
2)のMSSPモジュールを使用せずポートレジスタを読み書きするコード自体が全く思い浮かばずこれもまた試す事ができませんでした。

しかし、回答の「MSSPのレジスタの設定は問題ないように思います。」を信じてSPI通信(折り返し)だけのコードを試したところ、マスター(RaspberryPi)からの送信データがきれいに受信できました。

私の書いた元のソースコードには、実践編のI2CやLCDの制御コードも含まれているので、その部分と何か干渉しているのかと思われます。

とりあえず、SPI(スレーブ側)自体の機能の確認はできました。
ありがとうございました。

目次