トップページへ戻る       ものに関わってのメニューへ戻る


LiLaCプロトタイプ製作(pic131)

先日来取り組んでいるエネルギー変換回路設計(選択??)用教材。
前回のココナッツからちょうど10年が経ち、新しいものとして名前も考えた。
「LiLaC」 ライラック
(Learn intelligence of Logic and Circuitry)

~論理と電気回路の理解力や思考力を身につけよう~みたいな感じでしょうか。
本校の英語の先生と、その旦那さん(native英国人)にみてもらって決めました。
電気回路はcircuitだと思ってたら、違っていたのを始めて知りました。

年末年始休みは時間が取れるから頑張ってみようと思っていたのですが、終業式数日前から体が痛くて動かなくなってしまい、久しぶりの医者通いとなってしまいました。
50年間使ってきた体なので、ガタも出ると言うことでしょう。休みの半分は寝込んでいて終わってしまった。

それでも、夢の中で回路や設計について考えることができたのは救いでした。
今回の内容はおよそ2週間分くらいかけて進めたものです。

今回は全てをフリーにしたいので、回路もプログラムも一から勉強し直しです。参考にしたのはCQ出版社「8ピンPICではじめてのマイコン工作を始めよう」です。
昔はどうだったか忘れてしまったけれど、一つ一つを理解するのに時間がかかって、何度も同じページを見つめているのは仕方の無いことでしょうね。



PICは12F683 というタイプ(本で取り扱っていたのがこれだった)で、書き込み機も以前の物は使えず、最新のpickit3(マイクロチップ純正品)を使う。


ブレッドボードを使って回路を作るのだけれど、pickit3はピンヘッダと抵抗の足を使って接続部分を自作する必要があった。

ここで、大きな決断を迫られたのは、開発環境をどうするかと言うこと。
10年前はMPLABというマイクロチップの提供する統合環境とアセンブラでスタートしていた。

ところが、割と最近?マイクロチップは「MPLAB X IDE」と言う新しい環境をリリースしており、残念ながら書籍で探してもこれに対応した物が見当たらなかった。
もちろんweb上にはいろんな情報が公開されているのだけれど、なかなか思うように行かない。
本の通り進めようとしても、まずアセンブラがエラーを起こしてしまって先に進めなかった。

結局行きつ戻りつしながら、最新環境+C言語という方法に決めた。と言うのも、マイクロチップ社は2009年にHI-TECH社を買収した結果、現在はXCというC言語の開発環境を無料で提供していたため。
無料版は最適化ができないので、スピードやプログラムの行数に制限が出るけれど、自分がやろうとしている範囲では問題がなさそうだと判断した。

これによって、C言語の勉強という新たなハードルが加わったけれど、アセンブラだって分かっていないし、進めればC言語の方が簡単にプログラムできるだろうからこれで進めることにした。

いろいろいじっているうちに、「あ、こうなっていたのか」と言うことも数多く、50の手習いを進めていく。


ブレッドボードで進めながら、8ピンの機能割り当てについての案を固めた。
●スイッチにより4種類の論理回路を選ぶ( and 、or 、xor、 予備 )
●入力はアナログ(AD変換)で2系統
●出力は2系統(教材としては1系統で良いかと考えているが、消費電流の大きい物を取り扱う場合を考えてこのようにした。


毎度のごとく、①ソースを直す、②コンパイルする、③書き込みをするという手順なのだけれど、そのたびにブレッドボードにpickit3からの線を抜き差しするのは面倒なので、万能基板でプロトタイプを作ることにした。

それほど難しい回路ではないので、回路図を書く前に配線していった。(やっぱり汚い仕上がりになってしまった)

それでも、書き込みと動作が簡単にできるので、プログラムを開発していく上では良い感じなものになった。

最終的なプロトタイプ完成版。右側の上下にスイッチなどを差し替えるコネクタ。ここに各種センサーを取り付ける。
3列になっているので、上の列が電源+、真ん中がAD変換ポートへ、下の列が電源-。

左側は出力。出力2は赤のLEDで固定。出力1はFETをかませて大電流が流せるようにした。

超高輝度の照明用LEDや振動モータをドライブすることができた。

書き込み中の様子、現在は切り替えスイッチによって違うルーチンを走らせることができるようになった。
この後はAD変換を使えるようにしてセンサーの入力で出力をコントロールできるプログラムにしたいところ。
まだまだ、先は長そうだなぁ。


最終的には全てを公開するつもりですが、途中のプログラムを載せておきます。誰にも聞けないまま進めているのですが、こんなので良いのやら??

■プログラムここから■


/* File: LiLaC-v1main.c
* Author: ●●●●
*
* Created on 2017/01/08, 8:35
*/

// PIC12F683 Configuration Bit Settings
// 'C' source line config statements
// CONFIG
#pragma config FOSC = INTOSCIO // Oscillator Selection bits (INTOSCIO oscillator: I/O function on RA4/OSC2/CLKOUT pin, I/O function on RA5/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = OFF // MCLR Pin Function Select bit (MCLR pin function is digital input, MCLR internally tied to VDD)
#pragma config CP = OFF // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = OFF // Brown Out Detect (BOR disabled)
#pragma config IESO = OFF // Internal External Switchover bit (Internal External Switchover mode is disabled)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)

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

#include <xc.h>
#include <stdio.h>
#define _XTAL_FREQ 1000000

/*ピンの定義をしておく*/
#define OUTPUT1 GP5
#define OUTPUT2 GP4
#define SW1 GP3
#define SW2 GP2
#define INPUT1 AN0
#define INPUT2 AN1


/*切り替えスイッチの値はSW_fとして 2=and 1=or 3=xor */
unsigned int SW_f=0;

void main(void) {
/*内部クロックの設定 1MHzに設定 データシート19Pより*/
OSCCON = 0b01001000;
/*ポートの入出力の設定 4と5を出力 2と3を機能切り替えスイッチ 0と1をアナログ入力 データシート36pより
1が入力、0が出力*/
TRISIO =0b00001111;
/*アナログ入力ピンの設定 0と1をアナログ入力 データシート36pより*/
ANSEL = 0b01000011;
/*コンパレータはオフ*/
CMCON0 = 0b00000111;
/*切り替えスイッチはポートを内部でプルアップに設定(オプションレジスタを0で有効に)*/
OPTION_REGbits.nGPPU = 0;
/*切り替えスイッチはSW1=GP3 SW2=GP2 なのでそこをプルアップする >どうやらGP3は内部プルアップができないらしい>10KΩで*/
WPUbits.WPU2=1;

/*起動時にスイッチの値を確認する*/

while(1)
{
/*元々プルアップしている(SWn=1)のが、アースされてプルダウン(SWn=0)になる*/
SW_f = SW1 + SW2 * 2;
switch(SW_f){
case 1:
/*スイッチ真ん中、sw2がプルダウン*/
OUTPUT1 = 1;
OUTPUT2 = 0;
break;
case 2:
/*スイッチ一番左、sw1がプルダウン*/
OUTPUT1 = 0;
OUTPUT2 = 1;
break;
case 3:
/*スイッチ一番右、全てプルアップ*/
OUTPUT1 = 1;
OUTPUT2 = 1;
break;
}
}
return;
}

■プログラムここまで■

その後、回路の接続ミスを見つけて(FET周りが逆だったり、直接電源につながっていたり等)やり直し、なんとかここまでの所は上手くいっている状態と思われる。





トップページへ戻る       ものに関わってのメニューへ戻る