はじめに
タイトルの通りで,マイコン・ハードウェアの勉強をしようということで,カウントアップ人感センサ付きライト作ってみました.
作ったものは以下のような人感センサ付きライトで,手をかざすとライトが点灯し,さらに同時にセグメントLEDがカウントアップするというものです.これが何の役に立つかと言われるとわかりませんが,色々と勉強になったので,備忘録的に記録として残しておきたいと思います.
必要なもの
今回は人感センサからの信号を受信したらライトを点灯し,そのライトが点灯する度にセグメントLED(デジタルの数字を表示できるライト)をカウントアップする(謎)仕様のため,プログラム内で現在の数字の状態を保持する必要があります.そのため,PICマイコンを使用し,その辺りをプログラムで処理するようにしました.
ハードウェア
ハードウェアは以下のものを使用しました.
- PIC12F629
- マイコン
- 参考:超入門PICマイコンの使い方
- AMN34111
- 人感センサ
- TC4511BP
- セグメントデコーダ
- セグメントLED用のデコーダ.2進数を利用して4個のピンから0〜9を点灯させることができる.
- C-551SRD
- セグメントLED
- KSC1815YTA
- NPNトランジスタ
データシートは検索すれば出てきますが,念のためこちらにアップしました.
ちなみにAMN34111の検出範囲は10mでかなり広範囲です.価格も1,000円超で,明らかにオーバースペックですね...
回路図
回路図は以下のようにしました.
今回使用するマイコンのPIC12F629は合計で8つのピンがあり,VDD,VSSを除く6つがGPIOになります.GP0,1,2,4をセグメントデコーダへの出力,GP3を人感センサからの入力,GP5はライトへの出力になります.(GP5については,今回はVDDが共通なので,本来であればトランジスタは不要ですかね.)
人感センサからの入力は,データシートによるとOUTがVDD-0.5[V]が入ってきます.
PIC12F629の仕様では,この入力電圧であればHighとして認識してくれそうです.(データシートのこの部分かわからない.どこをみて良いかわからなかった.)
ソフトウェア
PIC12F629へのコーディング,書き込みは公式IDEであるMPLabXを使います.
インストール〜プロジェクト作成
MPLABX(IDE)インストール
公式サイトからIDEをインストールします.
※今のところ大人しく公式のIDEを使ったほうが良さげ.
参考:【備忘録】Visual Studio CodeでPICマイコン開発をする方法
コンパイラのインストール
公式サイトからCPUのbit数に応じたコンパイラをインストールします.特にPATH設定などはせず,Defaultのままで良さげです.
プロジェクトの作成
先にPicKitを接続しておきます.File > New Projectを選択すると,以下の画面になり,接続したPicKitが表示されていれば認識されます.書き込みたいマイコンを選び,Next.
Debugをするか否か?適宜選びます.
コンパイラを選びます.ここから選択できない場合は,正しくコンパイラをインストールされていない可能性が高いです.Tools > Options > Embbeded > Build Tools > Toolchainでコンパイラが選ばれているか要確認です.なければ,コンパイラのインストールを再度行います.
フォルダの場所を適宜設定します.
main.cファイルの作成
mainファイルをSource Files > New Filesをクリックすると,以下の画面になるので,コンパイラを適宜設定し,main.c
を選択しNext.
File Nameを適宜設定し,Finishでmain.c
を生成できます.
Bit(レジスタ)設定でソースコードを自動生成
Production > Set Configuration Bitsを選ぶと,下側のタブが生成されるので,適宜設定し,Generate Source Codfe to Outputをクリックします.
すると,コードが生成されるので,それをmain.c
にコピペします.
PICコーディング
最終的なコーディングは以下のようにしました.
/*
* File: main.c
* Author: Hoge
*
* Created on November 23, 2022, 12:23 AM
*/
// PIC12F629 Configuration Bit Settings
// 'C' source line config statements
// CONFIG
#pragma config FOSC = INTRCIO // Oscillator Selection bits (RC oscillator: CLKOUT function on GP4/OSC2/CLKOUT pin, RC on GP5/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = ON // Power-Up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = OFF // GP3/MCLR pin function select (GP3/MCLR pin function is GP3)
#pragma config BOREN = ON // Brown-out Detect Enable bit (BOD enabled)
#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 statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
#include <stdio.h>
#include <stdlib.h>
#include <pic.h>
#include <xc.h>
#define _XTAL_FREQ 4000000 // for delay
/**
* Initialize PIC
*/
void PIC_init(){
OSCCAL = 0x80; //oscillator center
PCON &= 0x00; //enable POR BOD
CMCON = 0x07; //disable comparator
TRISIO = 0b0001000; //Set 0001000. This means GP3 is input, the others are output.
return;
}
int main(int argc, char** argv) {
// Initialize PIC
PIC_init();
/*
* GP0: B
* GP1: C
* GP2: D
* GP4: A
* Comment: 2104 => DCBA => e.g) LLLL
*/
unsigned char gpio[10] = {
0b000000, // LLLL => 0
0b010000, // LLLH => 1
0b000001, // LLHL => 2
0b010001, // LLHH => 3
0b000010, // LHLL => 4
0b010010, // LHLH => 5
0b000011, // LHHL => 6
0b010011, // LHHH => 7
0b000100, // HLLL => 8 Note: GP3 is input
0b010100, // HLLH => 9
};
unsigned int counter = 0;
GPIO = gpio[counter];
while(1){
if (GP3 == 1){
counter = (counter + 1) % 10;
GPIO = gpio[counter];
GPIO += 0b100000; // Set GP5 = H means turn on the external light
// delay for the next detection
__delay_ms(5000);
}
else{
GPIO = gpio[counter];
__delay_ms(100);
}
}
return (EXIT_SUCCESS);
}
TRISIO = 0b0001000;
でGPIO3を入力に設定しています.コード自体は単純ですが,注意点として機能のバッティングがあります.PICは多機能なので,機能がバッティングして,意図した機能を実現できないことがあります.実際,私もここでハマり,入力電圧を読み込めないことに悩まされました.結論,Configuration Bitの定義部分で#pragma config MCLRE = ON
としていたのが原因で,GPIOとしてでなくMCLRとして機能していたようでした.やっぱりデータシートはしっかりと読まないといけないですね...
ブレットボードでの実装
まずは回路図をブレッドボードで実装しました.紆余曲折がありましたが,何とか実現できました.
PICへの書き込み
PICへの書き込みは,ブレッドボードに実装した段階でPICKit3を用いて書き込みました.接続は以下のようにして書き込みました(接続部分のみ抜粋).なお,今回は全てのピンを使用するので,プルダウンの10kΩは使用していません.
書き込み時にも何点か注意すべき点がありました.
- PicKitの接続
- PicKitを接続してからMPLABXを起動しないと
Failed to program device
と出るかも
- PicKitを接続してからMPLABXを起動しないと
- プログラムの修正・再書き込み
- 電圧が足りないと,プログラムの再書き込み時に
Failed to program device
と出る可能性がある.
- 電圧が足りないと,プログラムの再書き込み時に
- プログラムの規模によって,必要な電圧が変わるっぽい.
- PiCKitからの供給電圧を適宜探すしかなさそう...
- 外部電圧供給の方が安定するっぽい.今回は外部電圧供給するようにした.
基盤への実装
せっかくなので,基盤に実装することまで行いました.今回は以下のように15x25のユニバーサル基盤に実装しました.(グレーコードが裏側の配線になります.色付きはやむを得ず表側の配線になります.)ご覧のようにまあまあ複雑な回路になりました...もう少し大きいサイズの基盤に実装すれば良かったです.
完成
基盤に実装することでかなりスリムになりました.
裏側です.半田づけは不器用なのでまあまあ大変でした.いつショート等してもおかしくないですが,まあ動いたのでよしとします.
ちなみにコネクタ部分はEHのハウジングコネクタをしようしています.
おわりに
実用性は置いといて,初心者なりにそれなりのものができたかなと思います.この作成を通じて,データシートは必ず読むということと,確認できる部分はサボらず丁寧に確認する(ソフトウェアのデバッグと似ている)ことを徹底すべきということを学べたと思います.今回実装した知見を活かして,いろいろなものを作って行けたらなと思います.