入力不足に対する論理回路の構築3 ~ マイコン編 ~
概要
前回、『入力不足に対する論理回路の構築2 ~ 動作確認編 ~』でブレッドボード上に回路を組みました。
現在はタクトスイッチを論理回路に入力していますが、スイッチをマイコンに置き換えます。
準備物
PICを開発するにあたり以下のソフトウェアやハードウェアを使用しました。
インストールや使い方については本記事では割愛します。
- MPLAB X IDE(開発環境)
- PIC Kit(書込みツール)
- PIC 10F200
- 前回組んだ論理回路
MPLAB PICkit5インサーキットデバッガ/プログラマ【PG164150】[マイクロチップ マイコン プログラミング PICkit PICkit4 PICkit5 Microchip ] 価格:20567円 |
プログラム
PICには「Bit Settings」で使用する機能を設定する必要があります。
MPLAB X IDEにはコードを生成する機能があるのでヘッダファイルを作成(bit_setting.h)してコードをコピーします。
逆引きPIC電子工作やりたいこと事典 LED・液晶・スイッチ・モータ・センサ・音・通信・ [ 後閑哲也 ] 価格:3058円 |
bit_setting.h
// PIC10F200 Configuration Bit Settings
// 'C' source line config statements
// CONFIG
#pragma config WDTE = OFF // Watchdog Timer (WDT disabled)
#pragma config CP = OFF // Code Protect (Code protection off)
#pragma config MCLRE = OFF // Master Clear Enable (GP3/MCLR pin fuction is digital I/O, MCLR internally tied to VDD)
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
#include <xc.h>
次にメインの処理を書いていきます。コメントが英語なのはテキストエディタの言語設定が英語となっているため、日本語で書いて再度ファイルを開くと日本語が文字化けしてしまいすべて「?」となり読めなくなります。
設定すれば日本語を使用できると思いますが、現状そのまま使用しています。
main.c
#include "bit_setting.h"
#include <xc.h>
#define _XTAL_FREQ 4000000
#define DELAY_TIME 500
void main(void) {
// settings
OPTION = 0x00;
TRISGPIO = 0xF0; // I/O Settings
OSCCAL = 0x00;
const char val[] = {0x00, 0x03, 0x02, 0x06, 0x05}; // Output Data
const char len = 4; // Data len
char loop = 1;
while(1) {
GPIO = val[loop];
loop = loop % len + 1;
__delay_ms(DELAY_TIME);
}
return;
}
動作確認
動作確認を行います。上の4つのLEDはモータへの出力、下の3つのLEDはマイコンの出力となります。
Inがマイコンの出力、Outがモータへの出力となります。
| In0 | In1 | In2 | Out0 | Out1 | Out2 | Out3 |
|---|---|---|---|---|---|---|
| 0 | 1 | 0 | 0 | 1 | 1 | 0 |
| 0 | 1 | 1 | 0 | 0 | 1 | 1 |
| 1 | 0 | 1 | 1 | 0 | 0 | 1 |
| 1 | 1 | 0 | 1 | 1 | 0 | 0 |
動作として問題なさそうなのでモータにつないでみます。
接続については「PIC ⇒ 論理回路 ⇒ モータドライバ ⇒ モータ」の順位接続しています。
動画では信号が送られる速度が遅くモータが回っているのかわからない状態ですね(微動はしています)。
信号を送る速度をプログラム変更によって早くしてみます。変更箇所は赤字で示しました。
main.c
#include "bit_setting.h"
#include <xc.h>
#define _XTAL_FREQ 4000000
#define DELAY_TIME 5
void main(void) {
// settings
OPTION = 0x00;
TRISGPIO = 0xF0; // I/O Settings
OSCCAL = 0x00;
const char val[] = {0x00, 0x03, 0x02, 0x06, 0x05}; // Output Data
const char len = 4; // Data len
char loop = 1;
while(1) {
GPIO = val[loop];
loop = loop % len + 1;
__delay_ms(DELAY_TIME);
}
return;
}
プログラムを変更したのでPICにプログラムを書込んで動作を確認します。
速度が速くなったのでモータが回っていることが確認できますね。
送る信号を逆にすると回転も逆になります。
最後に
初心者ながら設計から動作確認までどうにか行うことができました。
使用したモータはステッピングモータですので1信号当たりどのくらい動くのかが決まっています。
その特性を生かして何らかの作品に応用できそうですね。