PIC16F84A で Lチカ


20150426_pic_device

PIC16F84A は、マイクロチップ社の8ビットマイコンです。
ひと昔前は、8ビットマイコンの定番的な存在でしたが。
現在では、同社の 18F シリーズや、アトメル社の ATmega が主流になっています。
今回は、無償でまとまった数を入手したので、久しぶりに PIC で遊んでみます。

スペック比較
Arduino Uno に使われているアトメル社の ATmega328P と比べると、かなり見劣りします。

ATmega328P PIC16F84A
外形 28ピン DIP 18ピン DIP
動作電圧 1.8 – 5.5V 2.0 – 5.5V
クロック 20 MHz 20 MHz
プログラム容量 32KB 1Kword ※1
EEPROM容量 2KB 64B
RAM容量 1KB 68B
AD変換 6個 なし
UART 1個 なし
SPI 1個 なし
I2C 1個 なし
IO電流 40mA 20mA
秋月価格 250円 250円

※1 PIC16F は14ビット命令長です。

開発環境
マイクロチップ社から MPLAB X IDE が無償で提供されています。
Cコンパイラも、8ビット(XC8)、16ビット(XC16)、32ビット(XC32) の無償版が提供されています。
それぞれ、Windows、MAC、Linux に対応しています。

PICライタ
秋月電子には、30種を超える PICライタ が販売されています。
ホビー用の定番は PICkit3 です。

C言語 プログラム
PICの開発環境が、この数年で大きく変わりました。
古い環境やアセンブラで書いた例はいろいろ見つかりましたが。
MPLAB X IDE + XC8 という新しい環境での例は少なかったです。

PIC特有の流儀は、3つくらいです。
(1) チップの品種ごとにマクロが用意されています。
レジスタのアドレスやビット配置などをさほど意識せずに、すっきり書けます。

#include <pic16f84a.h>

(2) config レジスタ用にマクロが用意されています。
main が実行される前に、初期設定を実行してくれます。

#pragma config WDTE = OFF, PWRTE = OFF, CP = OFF, FOSC = HS 

(3) 外部クロック用に周波数定義のマクロ定数が用意されています。
delay など正確な時間が必要な関数が使えます。

#define _XTAL_FREQ 16000000

Lチカのプログラムを書く。
TRISx は、IOポートの出力/入力を設定するレジスタです。
PORTx は、IOポートの値を設定するレジスタです。
今回は、RB4 に LED を付けます。

#include <xc.h>         /* XC8 General Include File */
#include <pic16f84a.h>  /* PIC16F84A */ 
#define _XTAL_FREQ 16000000     // 16MHz
#pragma config WDTE = OFF, PWRTE = OFF, CP = OFF, FOSC = HS 

void main(void)
{
    TRISA = 0x00;   // PortA all output
    TRISB = 0x00;   // PortB all output
    PORTA = 0x00;   // PortA all low
    PORTB = 0x00;   // PortB all low

    while(1)
    {
        PORTBbits.RB4 = 1;  // LED on
        __delay_ms(1000);   // 1sec
        PORTBbits.RB4 = 0;  // LED off
        __delay_ms(1000);   // 1sec
    }
}

MPLAB X IDE 上でコンパイル&ビルドする。
MPLAB X+XC8で__delay_ms関数にエラーマークが表示される問題の解決方法

プログラム転送
PICkit3 を使って、MPLAB X IDE から、PICマイコンにプログラムを転送する。
このとき、PICkit3 から5V電源を供給するようにすると、PICマイコン側は MCLK のプルアップ抵抗だけあればいいです。
20140426_picschematic_pickit3 20150426_pic_pickit3

最低限の回路
PICマイコンの周りに下記を追加します。
(1) 5V電源
(2) 電源コンデンサ
(3) MCLK のプルアップ抵抗
(4) セラミック発振子 ※2
(5) 動作確認用のLED

※2 クロック回路
PIC のクロック回路には、内部発振と、外部クロックの2つの方法があります。
内部発振では、外付けの抵抗とコンデンサが必要です。
外部クロックでは、水晶発振子、セラミック発振子、あるいはクロック源が必要です。
実装的には、セラミック発振子を使うのが簡単です。

20140426_pic_schematic_basic_led

動作確認
上記の回路で、電源を入れれば、LEDが点滅します。
20150426_pic_device

プログラムなどは、Github で公開しています。

参考
PIC 久しぶり – PIC16F84A XC8 LED
LEDを点滅させる - TMR0割込み -(PIC16F84A XC8)
16F84A XC8開発例 – カウンタ回路(7セグメントLEDの制御)
XC8:コンフィグレーションワード記述書式について
MPLAB X+XC8で__delay_ms関数にエラーマークが表示される問題の解決方法


Bluetooth シールドを Android から制御する


20150408_bt_system

前回作成した Bluetooth シールド を Android から制御します。

機能
(1) デジタル出力
Android のボタンを押すと、Arduino の LED が点灯します。
(2) PWM出力
Android のスライドバーを移動すると、Arduino の LED の明るさが変わります。
(3) デジタル入力
Arduino のボタンを押すと、Android で状態を表示します。
(4) アナログ入力
Arduino の可変抵抗を回すと、Android で可変抵抗の値をグラフに表示します。

ソースコード
Arduino 側
Android から Arduino を制御する で作成したスケッチを使用します。

Android 側
Android から Arduino を制御する で作成したアプリをベースにします。
通信部分を USBシリアルから Bluetooth シリアルに変更します。
UI は以前のものを流用します。
20150408_bt_android

github で公開しています。
Arduino_SerialControl
Android_Bluetooth


Bluetooth シールドの基板を作る


概要
Eagle と Sevenmini を使って、Arduino の Bluetooth シールドの基板を作ります。
Bluetooth は、JY-MCU BT BOARD を使用します。
動作確認のために、LEDやスイッチや半固定抵抗も搭載します。
基板作成の手順は、Eagle と Sevenmini を使って電子基板を作る を参照してください。

データは GitHub で公開しています。

Eagle 側の作業
(1) 回路図 (sch) とボード図 (brd) を作成します。
20150408_bt_sch 20150408_bt_brd

(2) Mirror にして、ガーバーデータを出力します。
20150408_bt_gerber

FLASH 側の作業
(1) ガーバーデータを読み込みます。
ハンダ面データ (sol) を「フォト表」に、
ドリルデータ (drd) を「穴」に、
外形データ (out) を「外形表」にします。
(2) 輪郭線抽出を行います。
20150408_bt_flash

Sevenmini 側の作業
(1) 配線の加工
基板を両面テープで固定します。
ミリング用のエンドミルを取り付けます。
CAM-Circuit2 アプリから加工を指示します。
(2) 穴の加工
ドリル用のエンドミル 0.6mm に交換します。
CAM-Circuit2 アプリから加工を指示します。
(3) 外形の加工
今回は基板をそのまま使い、加工せず。
20150408_bt_sevenmini 20150408_bt_pcb

ハンダ付け
(1) 表面の配線を行います。
(2) 部品をつけて、裏面をハンダ付けします。
20150408_bt_front 20150408_bt_rear

動作確認
(1) Arduino にエコーバックのスケッチを書きます。
(2) 通信相手は Android の BT terminal を使用します。
(3) Androidで入力した文字がエコーバックすれば、OKです。

課題
(1) タクトスイッチが USBコネクタ の上にあり接触しそう。
(2) BT BOARD のピンソケットの足が長くなり、機械強度が心配。
こういう実装になったのは、BT BOARD がL型ピンヘッダを使っているため。


CentOS で node.js を自動起動する


node.js を自動起動するツールはいくつかあるようです。
今回は forever を使います。

インストール

# npm install forever -g
/usr/local/node-v0.12.2/bin/forever

パスを通す

# ln -s /usr/local/node-v0.12.2/lib/node_modules/forever/bin/forever /usr/local/bin/forever

自動起動
起動スクリプトを書いて、/etc/rc.local に追加する

#!/bin/bash/
/usr/local/bin/node /usr/local/bin/forever start \
  -p /var/run/forever \
  --pidfile /var/run/node-app.pid \
  -l /var/log/node-app.log -a \
  /home/node/app.js

参考
Node.js 自動再起動モジュール
node.js node.jsスクリプトをforeverでデーモン化する


CentOS5 に node.js をインストールする


Node.js はサーバーサイドの JavaScript 環境です。

CentOS5 ではレポジトリが用意されていないので、ソースから入れます。
Node.js のコンパイルには、Python 2.6 以上が必要です。

インストール

# cd /usr/local/src/
# wget http://nodejs.org/dist/v0.12.2/node-v0.12.2.tar.gz
# tar xvzf node-v0.12.2.tar.gz
# cd node-v0.12.2
# ./configure --prefix=/usr/local/node-v0.12.2
# make 
# make install

ディレクトリ構造は、下記のようになります

/usr/local/node-v0.12.2
- bin
-- node
-- npm
- etc
- include
-- node
- lib
-- node_modules
- share
-- man
-- systemtap

バージョンを確認する

# /usr/local/node-v0.12.2/bin/node -v
v0.12.2

リンクを張って、パスを通す

ln -s /usr/local/node-v0.12.2/bin/node /usr/local/bin/node
ln -s /usr/local/node-v0.12.2/bin/npm /usr/local/bin/npm

パスを通ったことを確認する

# node -v
v0.12.2

動作確認
サンプルコードを書く
example.js

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');

起動する

$ node example.js
Server running at http://127.0.0.1:1337/

WEBブラウザからアクセスする。
「Hello World」が表示されれば、OK

注意
Node.js のコンパイルには、bz2 が含まれた Python 2.6 以上が必要です。
bz2 がないと、下記のエラーが出て、コンパイルが終了します。
ImportError: No module named bz2


CentOS5 に Python 2.7 をインストールする


CentOS5 の Python は 2.4 なので、ソースから入れます。
CentOS では yum に Python が使われいるので、2.4 と 2.7 が共存するようにします。
/usr/bin/python2.4
/usr/local/bin/python2.7

bz2 が使いたいので、事前にインストールしておきます。

# yum install bzip2-devel

インストール

# cd /usr/local/src/
# wget https://www.python.org/ftp/python/2.7.9/Python-2.7.9.tgz
# tar xvzf Python-2.7.9.tgz
# cd Python-2.7.9
# ./configure --prefix=/usr/local
# make
# make altinstall

バージョンを確認する

# python2.7 -V
Python 2.7.9

共存の設定
PATH が下記の順番になっていることを確認する

# set
PATH=...:/usr/local/bin:/usr/bin:...

リンクを設定する

# cd /usr/local/bin/
# ln -s -i python2.7 python
# ln -s -i python2.7-config python-config

起動されるバージョンの確認

# python -V
Python 2.7.9

yum が動くことを確認する

$ yum update