マイコン初心者講座その4 LEDを点滅させてみる

とりあえずマイコンというものを実際に動かしてみましょう。マイコン界では一番最初にやることとしてLEDを点滅させるという風習があるのでここでも従うことにします。

プログラミング

まずは準備としてCドライブに演習用の「programming」というフォルダを作ります。さらにその中に「HelloWorld」というフォルダを作ってください。

次にmikroCを開きます。今後作るものは全てプロジェクトという単位で管理されます。Project -> New Projectを選択します。

すると新しいプロジェクトの作成画面が開きます。

まず使用するPICの選択画面になるので、一覧の中からPIC16F88を選択します。

次にクロックの設定です。ここでは8.00000MHzにしておきます。元々そうなっている場合は変更する必要はありません。

続いてプロジェクト名の設定です。先ほど作成したHelloWorldフォルダに移動し、その中にHelloWorldというプロジェクトファイルを作成します。


追加ファイルの読み込み画面です。今回は何も入力しません。

ライブラリの読み込みの選択ですが、ここも変更せず次に進みます。

これで設定完了です。このままデバイスの設定もしたいので、"Open Edit Project〜"にチェックを入れてFinishを押してください。

するとデバイスの設定画面が開きます。赤丸の付いた部分を図のように変更してください。

そしてOKを押すとようやくプログラムの編集画面が表示されます。


まず中身は理解しなくていいので以下のプログラムを入力してください。

void main() { 
     OSCCON = 0x70;
     ANSEL = 0x00;
     TRISA = 0x00;
     TRISB = 0x00;
     PORTA = 0x00;
     PORTB = 0x00;

     while(1) {
          PORTB = 0b00000001;
          Delay_ms(1000);
          PORTB = 0b00000000;
          Delay_ms(1000);
     }
}


入力し終わったらこのプログラムをマイコンが理解できる形式に変換する必要があります。それがビルドという作業です。Build -> Buildを押してください。

すると画面の下の方に青と水色の文字が並び始め、ビルドが実行されます。もしここで赤い文字が表示された場合はエラーが発生しています。もう一度プログラムに誤りが無いか確認して下さい。

これでプログラムは完成です。

回路の作製

次に回路を用意します。ブレッドボード上で以下の回路を組んでください。

赤・黒・白・青・緑の書き込み用の線を使いPICとPICkit2を接続します。

マイコンへ書き込み

接続が終わったらPICkit2 programmerを起動します。"PICkit2 found and connected.PIC Device Found."と表示されることを確認します。こう表示されないときは接続を確認して下さい。

次に赤丸で囲まれたボタンを押して先ほど作ったフォルダのまで移動します。すると先ほどのフォルダに"HelloWorld.hex"というファイルができています。これがC言語で書かれたプログラムがマイコンで読み込める形式に変換されたものです。
そのファイルを指定します。


すると自動でマイコンへ書き込みが行われます。正常に終了すると緑の背景に"Programming Successful.〜"と表示されます。

それではマイコンの電源を入れてみましょう。"5.0"と書かれていることを確認して赤丸のチェックボックスにチェックを入れてみてください。


これでLEDが点滅を始めたら成功です。

プログラミング詳細

以上がマイコンのプログラミングの一通りの流れです。
プログラム作成  回路作製
   ↓
  ビルド      ↓
   ↓
   マイコンへ書き込み
       ↓
     動作確認


また、プロジェクトの作成後の段階でデバイスの設定の変更をしました。

  • Oscillator

これはPICのクロック源の設定です。PICをはじめ、全てのマイコン、そしてパソコンに使われているような高性能なプロセッサまで全てのCPUはクロックという発振器の周期に合わせて演算をしています。パソコンのスペック表で見るような"2.4GHz"などという表示がそれです。一般にこの数字が大きいほど1秒間に多くの演算をすることができます。
今回PICの設定ではここを8MHzにしました。また、Oscillatorの設定で"INTRC-OSC2 as RA6"というものを選択しました。PICでは発振器を内蔵しているため、その内蔵発振器をクロック源として使用する設定にしました。今回使用したPIC16F88では内蔵の発振器で8MHz、外部に別の発振器を接続した場合には20MHzまで動作させることができます。

  • RA5 / MCLR Pin Function Select

PICにはMCLRという端子があります。これはPICのリセットを行うための端子です。PORTAの5bit目とピンを兼ねているため、そのピンをリセット端子として使うかRA5ピンとして使用するかを選択するものです。今回はRA5端子として使用しました。


次にプログラムの解説です。

void main() { 
     OSCCON = 0x70;
     ANSEL = 0x00;
     TRISA = 0x00;
     TRISB = 0x00;
     PORTA = 0x00;
     PORTB = 0x00;

     while(1) {
          PORTB = 0b00000001;
          Delay_ms(1000);
          PORTB = 0b00000000;
          Delay_ms(1000);
     }
}

C言語では{〜}で囲まれた区間が1つのブロックになります。また、マイコンに限らずC言語のプログラムは全てmain関数から始まります。
つまり、1行目の"void main() {"から最後の行の"}"までがmain関数のブロックという意味です。
2行目から7行目はマイコンの設定です。ここではとりあえず必要なものという認識でOKです。
9行目からまた{〜}で囲まれたブロックが始まります。"while(1)"という文字がブロックの先頭に付いています。whileというのはループを作るためのもので、このブロック内を条件を満たすまでループします。その条件というのがwhileに続く括弧内に記述されたものです。括弧内が真の時、ループが実行されます。今回はその条件に"1"が指定されています。C言語では"0"が偽、それ以外が真というように定められています。そのため、この条件式は常に真となり、永遠にこのブロック内はループします。
パソコン向けのアプリケーションを作る際には無限ループは嫌われますが、マイコンではこのような無限ループを作ることがよくあります。


2行目の"OSCCON = 0x70;はクロックの設定です。"0x70"はPICを内蔵クロックで8MHzで動作させるための設定です。
3行目の"ANSEL = 0x00;"はPICの持つアナログ入力の機能を使わないという命令です。PIC16F88には8本のアナログ入力ができるピンがあり、デフォルトではこれらをアナログ入力ピンとして使用するように指定されています。アナログ入力として使うかディジタル入出力として使うかを指定するのがANSELというレジスタです。今回はディジタル入出力ピンとしてだけ使いたいので、ANSELを0にしてディジタル入出力ピンとして指定しています。
4、5行目のTRISA/TRISBはPORTA、PORTBそれぞれの入出力方向レジスタというものです。PORTというのはPICのピンを8本まとめたものです。以下のPIC16F88のピン配置図を見るとRA0〜RA7、RB0〜RB7と書かれたピンがあります。このRA0〜RA7をまとめてPORTA、RB0〜RB7をまとめてPORTBと呼びます。

それぞれのピンは入力端子、出力端子のどちらとしても使うことができます。それを指定してあげないとマイコンは出力していいのか入力として使えばいいのか分からないので、それを決めてあげるのがTRISというレジスタです。0を指定すると出力、1を指定すると入力ピンとして動作させることができます。「OUT」の頭文字Oを0、「IN」の頭文字のIを1として覚えると分かりやすいかもしれません。
今回は全て出力ピンとして設定します。
6、7行目はそれぞれのポートの出力を0にしています。
ここまでがPICの初期化処理です。


無限ループ内には4つの文が記述されています。
PORTB = 0b00000001;
この文はPICのPORTBの出力の状態を変更するものです。0b〜というのは2進数で表記するという意味なのでここではPORTBの0bit目だけを1にしています。こうすることでPICのPORTBの0bit目のピン状態が0(0V)から1(5V)となり、繋がっているLEDに電流が流れます。
次のDelay_msは指定時間待機する関数です。ここでは"1000"を指定しているため、1000ms、つまり1秒待機します。
次にまたPORTBへの出力の命令が書かれています。ここでは0bit目が0となっており、PORTBの0bit目を0(0V)にしています。
この次にまた待機の命令があり、それが終わるとまた"PORTB = 0b00000001;"の文にジャンプし、永遠にこの動作を繰り返します。こうすることで2秒の周期でLEDが点滅しているように見えます。


このように、マイコンはプログラムに応じて各ピンの状態を0Vか5Vに変化させることができます。また、その逆に各ピンの電圧を読み取ることもできます。これだけしかできないかと思うかもしれませんが、実に様々なことを実現することができます。

目次

マイコン初心者講座その3 マイコンで何ができる?

準備も終わったところで本題に入っていきましょう。

マイコンとは

まずマイコンについて簡単な説明です。


fig1 : マイコンPICマイコン


マイコン」はマイクロコントローラやマイクロコンピュータの略です。メーカによって前者と後者で使い分けていたりする違いはありますが、基本的には「小さい制御用コンピュータ」のような認識でOKです。
そのマイコンは身の回りの多くの場所で使われています。手元のパソコンのキーボードの中では押されたボタンに対応した信号を出力するためのマイコンが入っていますし、部屋で動いているエアコンの中では部屋の温度やリモコンの信号を受け取って機械を制御するマイコンが入っています。


マイコンはパソコンと何が違うか。パソコンはインターネットから文章や動画の作成、ゲームまで様々な用途に使えます。しかしその分性能を高くしていろいろなことができるようにしているために非常に高価で数万円はします。
一方でマイコンは低性能ですが安価(数十円〜)です。例えばエアコンの制御であれば、温度やリモコンの信号を監視しつつモータなどの機械を制御しているだけです(実際はもっと複雑ですがここでは簡略化)。つまり予め決められた動作だけできればよく、動作の内容も非常に簡単なものです。そのためそういった用途にマイコンを使うことでコストも安く簡単に目的が達成できます。


そのマイコンは書かれたプログラムに忠実に従って動きます。プログラミングは難しいかと思うかもしれませんが、マイコンは様々な機能が簡単に扱えるようになっており手軽に所望の動作をさせることができます。
LEDを光らたりすることはもちろん、音を鳴らしたり時計を作ったり緊急地震速報通報機侵入者検知機を作ることもできます。


現代では一般の人でも安価で簡単にマイコンの開発環境を入手して扱うことができます。インターネットに接続したりすることも非常に簡単になりました。また、インターネットの普及で何か面白いものを作ったときにはすぐにそれを公開して批評をもらうということもできます。
近年電子工作が再びブームになってきているようですし、ぜひマイコンを使った電子工作に挑戦してみてはいかがでしょうか。

マイコンを使った作品

マイコンを使うとこんな面白いものが作れるよというものをいくつか紹介しておきます。

目次

内蔵発振器を使うときはOSCCONの設定を忘れずに

mikroCを使ってC言語でLED点滅の簡単なプログラムを書いてみたところDelay_ms()が指定通りに動かないという問題が発生しました。


以下がソースコードです。

void main() { 
     ANSEL = 0x00;
     TRISA = 0x00;
     TRISB = 0x00;
     PORTA = 0x00;
     PORTB = 0x00;

     while(1) {
          PORTB = 0b00000001;
          Delay_ms(1000);
          PORTB = 0b00000000;
          Delay_ms(1000);
     }
}

プロジェクト作成の段階でちゃんと内蔵発振器で8MHzで動かすように設定したはずなのになぁ・・・と悩んでいました。
ビルドは問題なく通りますがこれで実行するとLEDは点滅せずずっと点灯したままになりました。
そこでいろいろと試し、"Delay_ms(1)"と指定してみたところ250ms程度の待機がかかることが分かりました。
クロック周波数の設定がうまくいってないのかと思い、いろいろ調べてみたら初歩的なミスでOSCCONの設定をしていなかったことに気付きました。


OSCCONは内蔵発振器の設定を行うレジスタで、4〜6bit目で周波数を決定します。今回は8MHzで動作させたかったので0x70を指定しました。
するとDelay_ms(1000);で正しく1秒待機するようになりました。


正しいプログラム

void main() { 
     OSCCON = 0x70;     // 追加
     ANSEL = 0x00;
     TRISA = 0x00;
     TRISB = 0x00;
     PORTA = 0x00;
     PORTB = 0x00;

     while(1) {
          PORTB = 0b00000001;
          Delay_ms(1000);
          PORTB = 0b00000000;
          Delay_ms(1000);
     }
}

これまでセラロックばかりで動作させていたためOSCCONの存在をすっかり忘れていました^^;


あともう1点気になったのですが、PIC16F88ではOSCCONはバンク1に存在します。アセンブラで記述する際にはバンクを切り替えて、戻してという処理が必要でしたがmikroCでは単純にOSCCONに代入しているだけでちゃんと動きました。
アセンブラソースコードを見ても特にバンクを切り替えているような記述はありませんでした。バンク切り替えってしなくてもいいのかなとちょっと不思議に思いました。

;HelloWorld.c,2 :: 		OSCCON = 0x70;
	MOVLW      112
	MOVWF      OSCCON+0

jQuery iPhone UIを使ってみた

webアプリでiPhoneアプリのようなUIを使おうと思い、調べてみたらjQuery iPhone UIというものがあったので使ってみました。


jQuery iPhone UIのライブラリはhttp://iphone.hohli.com/から入手することができます。
今回は回転させて選択肢を選ぶUI(正式名称が思い出せません。下図参照)を使いました。

fig1 : 使いたいUI


このUIはjQuery iPhone UIではiSelectという名前になっています。入手したライブラリのdocsにあるelements.htmlを元に作りました。

このライブラリを使うと、PCから見ると下のようにiPhoneの画面上にあるように表示されます。

fig2 : PCのブラウザから確認した様子



fig3 : サンプルページ


ところがelements.htmlを使おうとしたところ、iPhonesafariから閲覧してもPCから見たのと同様に画面上にiPhoneが表示され、その中に作成したページが表示されてしまいました。そこでソースコードに以下の1文を追加しました。

<link rel="stylesheet" href="../css/iphone-480.css" type='text/css' media='only screen and (max-device-width: 480px)' />

これでiPhoneから確認したときはそのままページが表示されるようになりました。


今回はアラームの設定画面を作りました。ホーム画面に登録し全画面で表示されるようにしています。

fig4 : 作成したページ


スクロールで時刻を選択した後に下のボタンをタッチするとAjaxによりサーバで動いてるPHPに対して時刻を送信するような動作です。
ボタンの作成にはAs Button Generator(http://jirox.net/AsButtonGen/)を利用しました。


しかしネイティブアプリと違い、ページ全体がスクロールしてしまうため操作性はいいとは言えませんでした。スクロールを抑止するような対策が必要になると思います。


jQuery iPhone UIには様々なUIが用意されているため、iPhone向けのwebアプリを作る際には大いに役立ちそうだと思いました。

マイコン初心者講座その2 必要なソフトのインストール(mikroC PRO for PICとPICkit2 Programmer)

PICのプログラムを作り、それをPICに書き込むために使うソフトのインストール方法です。ここではmikroC PRO for PICとPICkit2 Programmerの2つのソフトのインストールを行います。いずれも無償で入手可能ですが日本語版は無いのであしからず。

mikroC PRO for PIC(以下mikroCと略)

mikroCはPICのプログラムを書くためのソフトであり、C言語でPICのプログラムを作成することができるIDE(統合開発環境)です。提供元はMikroElektronika社です。


mikcoCの提供元のMikroElektronikaのmikroC PRO for PICダウンロードページ(http://www.mikroe.com/eng/products/view/7/mikroc-pro-for-pic/)にアクセスします。
上記のページの上から少しずつ見ていくと途中に赤丸で示したようなダウンロードへのリンクがあるので「Download mikroC PRO for PIC [21.76MB] (current build v4.60)」をクリックしてダウンロードし、解凍後にインストーラを実行します。このエントリーを書いた時点ではバージョンは4.60でした。

インストーラを実行すると以下のような画面が表示されます。ここからは特に変更を加えず、"Next >"で進んでいけばOKです。

途中で以下のような同意画面が表示されるので、"I accept〜"を選択し、次へ進んでください。

最後まで進むとインストールが始まります。

しばらくするとインストールが完了し、以下ようなの表示になります。"Finish"で終了してください。

この後3つダイアログが表示されますが、全て"いいえ"で大丈夫です。


ここまで完了するとデスクトップに以下のようなアイコンが増えているはずです。

このアイコンからmikroCを起動します。起動してみるとこのような画面になります。

これでmikroCのインストールはおしまいです。

PICkit2 Programmer

PICkit2 ProgrammerはPICに作成したプログラムを書き込む時に使用するソフトです。提供元はPICを販売しているMICROCHIP社です。
同社が販売している書き込み器PICkit2が無いと使えません。


PICkit2 Programmer提供元のMICROCHIPのPICkit2 Programmerダウンロードページ(http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en023805)にアクセスします。
上記ページの一番下辺りにダウンロードリンクがあるので「PICkit 2 V2.61 Install」をクリックしてダウンロード(画像参照)し、解凍後にインストーラを実行します。このエントリーを書いた時点ではバージョンは2.61でした。

インストーラを実行すると以下のような画面が表示されます。ここからは特に変更を加えず、"Next >"で進んでいけばOKです。

ここでも同意画面が表示されますので、"I agree"を選択し、"Next >"で進みます。

最後まで進むとインストールが始まります。

しばらくするとインストールが完了し、以下ようなの表示になります。"Close"で終了してください。

ここまで完了するとデスクトップに以下のようなアイコンが増えているはずです。

このアイコンからPICkit2 Programmerを起動します。起動してみるとこのような画面になります。

これでPICkit2 Programmerのインストールは完了です。

目次

マイコン初心者講座 目次

マイコン初心者講座その1 必要な部品・機器の準備

マイコン初心者講座の教材として秋月電子通商で以下のようなものを揃えました。1人に1セットずつ配布します。
内容はマイコン、書き込み器、センサ、表示器、その他の部品などで一通りいろいろなことが試せるようにしました。

計5,080円ほどです。

また、導線とピンヘッダを使って10cmのジャンパワイヤを5本、書き込み用のジャンプワイヤを1本作りました。
書き込み用のジャンプワイヤは以下のような配色にしました。

  • 1.VPP/nMCRL -> white
  • 2.VDD Target -> red
  • 3.VSS (ground) -> black
  • 4.ICSPDAT/PGD -> blue
  • 5.ICSPCLK/PGC -> green