勝手な電子工作・・

勝手なオリジナル電子工作に関する記事を書きます

勝手な環境表示装置(Arduino+PIC)

f:id:a-tomi:20180927202056j:plain

この表示板は、3年前にバタバタと作ったものですが、まさか今でも使っているとは考えませんでした。額縁に薄黒いアクリルカバーをつけて中が見えにくくするのがよいですが、工作コーナー用なのでむき出しのままで恰好悪いですが。

PCの元電源を入れると点くようにしており、元電源の消し忘れを防ぐ用途ですが、ついでに環境を表示したもの。Arduinoにリアルタイムクロック、温湿度気圧センサー、照度センサーなどをつけて測ったデータを、離れたこのPICによるLED表示器に送信しているもの。

2018年の夏は暑い暑い、9月3日の今になってようやく少しだけ涼しくなってきました。

www.youtube.com

使っているRTC(リアルタイムクロック)は未だに3秒と狂わず正確に動いているので驚いていますし、CR2032電池をまだ取り替えたことがない状態です。

各7セグメントLEDの下に見えているのは、マイコンPIC12F1822です。これで信号を受けて、自分の受け持ち部分だけを表示する仕組み。そのために各マイコンにスレーブ・アドレスをつけてます(EEPROMに収容)。そして自分のアドレスに向けたデータがくると表示をするという単純なものです。

データは勝手に作った1線式プロトコルで受信します。離れた測定部(Arduino)のホスト(マスター)からは+電源、グランド、信号の細い3線だけをつなげばよいもの。

1線式プロトコルはたった1線で信号が送れるので大変重宝です。次の図のようなものです。一番上はホスト(マスター)が出す信号、下の6つはスレーブであるPIC1~6が信号を認識するタイミングです。

f:id:a-tomi:20180904104101j:plain

ホストが出す信号を見ていただくと分かりますが、1線式プロトコルでは、長いLとHの信号がスタート符号で、その後は、Hは符号間のアイドル状態、短いL信号が0、長いL信号が1を表します。最後にチェックバイトをつけますが、こういう用途では省略しても構いませんですね。

この例ではスタート信号の後、0000-0011 スペース 0000-0100 スペース という風にヘダー部が続いています。この例では約束事で最初のバイトはfromアドレス+toアドレスで、0=ホスト(マスター)から3=スレーブ3へ送るという意味です。

ですから、まずは全部のPIC(アドレス1~6)がこの部分(つまり1バイト目)を読み取り、続くデータの信号は自分宛てのスレーブ3だけが読んでいるのがグラフから分かると思います。なお、表示されている各PICの読み取りタイミングは、符号が長い(1)か短い(0)かを判別するタイミングです。

上のグラフは、調整時に実物を次のようにして7チャンネルのプローブにつないで計測したものです。

f:id:a-tomi:20180904104049j:plain

ホスト(マスター)つまり計測部のカレンダー時計やセンサー類は次のような名刺箱(開け放し)に入れています。表示板からは60センチほど離れています。

写真で左はRTC、真ん中はArduino-Nano互換機、右は照度計、気圧・温度・湿度計です。自作の基板につけたソケットに刺しています。ですので、取出してのプログラム書き換えなどが容易です。壊すときには部品を全部回収できますね^^

f:id:a-tomi:20180903151401j:plain

この自作基板の切削図は次です。

f:id:a-tomi:20180904104040j:plain

ソフトはArduino IDEで作ります。

f:id:a-tomi:20180903151344j:plain

これに対し、表示装置側は大きな基板です。大きいですがデザインはほぼコピペの繰り返し。

f:id:a-tomi:20180904104043j:plain

6つのスレーブのPICプログラムは、全部共通で完全に同じものです。開始時にボタンで指定下アドレスをEEPROMに書き込んで、以後はそれを自分のアドレスとします。

PICでは受け持つLED表示の明るさを変えたりデータをチェックしたり、色々なことをしますが、アセンブルすると全体で700ステップほどになります。

f:id:a-tomi:20180903151350j:plain

PICのアセンブラープログラムは、今後、徐々に別のエントリーに書いていきたいと思っています。生活の知恵により、自作の勝手なマクロを色々作って多用していますので、アプリケーション・プログラム作成が簡単で速くできます。

つまり面倒な命令をたった1行のソースを書けば済むようにしているわけです。そうすることでコーディングミスがなくなりますし、マクロをたくさん定義しても使わなければメモリーを消耗するわけではありません。

一例ですが、AとBを比較してA<B、A=B、A>Bの場合の行先を、たった一命令で書くことができます。比較については同様にリテラル値との比較や、=と≠など、命令によるメモリー消耗が最少になるマクロを色々作ってあるわけです。次にそういう一例を少し示しておきます。これらのマクロはソースプログラムの前の方に入れておけばプログラムのどこでも使えます。

f:id:a-tomi:20180904112555j:plain

例えばファイル(レジスター)アドレスAとBの内容を比較して、A<BならSrtnへ、A=BならErtnへ、A>BならLrtnへ行きたい場合、次のようにCabSELという命令でかけばよいわけです。

          CabSEL     A,B,Srtn,Ertn
Lrtn      equ        $  

また、装置独立性のためのマクロやコーディングルールなどを含め、コンピュータのアセンブラー言語共通の保守容易性を保つ書き方をしています。こういうソース本体は今後別の記事で少しずつ順を追って掲載させていただきたいと思います。マイコン特有の処理目的(命令数でタイミングをとったりなど)に応じて、ストラクチャード・コーディングをしない場合も多々あります。アセンブラーのしくみは、どのコンピュータでも、初期汎用コンピュータIBM S/360アセンブラーから、今でもあまり変わっていませんね。

なお、この装置ではEEPROMのRead/Writeをしています。そのしかたなどは、PICの歴史をひきずっていますから、各モデルのデータシートに書かれている通りに素直に書くのが早道。パワーオフでリセットされては困る内容は、このEEPROMに書き込んでおけばよいものです。下に書き方と読み方を示しておきます。(この例で"MyadrB"にはスレーブアドレスを入れるところで、使用開始時にボタン操作でセットし、以後は読み込むだけの値です。もちろん電源投入時にいつでも設定ができるようにしてありますが。)

EEPadrv	equ	4		; EEPROM address to save Myadr
EEadrhv equ	H'F0'		; EEPROM addressH 21? 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;	Write my address to EEPROM 		 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MyadrWr	equ	$
	BANKSEL EEADRL
;
;	movlw	EEadrhv
;	movwf	EEADRH
;
	movlw	EEadrv		; Get EEP address value
	movwf	EEADRL		; Set the address to EEADRL
	BANKSEL 0
	movf	MyadrB,W	; Get my address specified
	BANKSEL	EEDATL		; Set it to EEDATL
	movwf	EEDATL
;	BANKSEL EECON1
	bcf	EECON1,CFGS	; Deselect Config space
	bcf	EECON1,EEPGD	; Point to Data memory
	bsf	EECON1,WREN	; Enable Write
;
;	BANKSEL	INTCON
;	bcf	INTCON,GIE	; Disable interruption
;Write sequence as described in the datasheet
;	BANKSEL EECON2
	movlw	H'55'
	movwf	EECON2
	movlw	H'AA'
	movwf	EECON2
	bsf	EECON1,WR	; Write to EEPROM
;
;	bsf	INTCON,GIE	; Enable interrupt **********
	bcf	EECON1,WREN	; Disable Write
	btfsc	EECON1,WR	; Wait for WR bit set off
	goto	$-2
;	bcf	INTCON,GIE	; Disable interrupt *********
	BANKSEL	0
	return
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;	Read my address from EEPROM		 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MyadrRr	movlw	EEadrv		; Get EEPROM address defined
	BANKSEL	EEADRL
	movwf	EEADRL
;Reading EEPROM sequence described in the datasheet
;	BANKSEL EECON1
	bcf	EECON1,CFGS	; Deselect Config space
	bcf	EECON1,EEPGD	; Point to Data Memory
	bsf	EECON1,RD	; Enable Read EEPROM
	movf	EEDATL,W	; Set data read to DATL
	bcf	EECON1,RD	; Disable Read EEPROM
;
	BANKSEL	0
	movwf	MyadrB		; Set data in W to MyadrB
	return
;

EEPADRHレジスターに値として何をいれるかはちゃんと確認していませんが、プロセッサーモデルで決まる値なのできっと設定は不要でしょう。放置しても大丈夫でした。

 

この表示器をいきなり作ったのではなく、事前に1線式インターフェイスをテストしました。これはその時の動画です。

www.youtube.com

以上、環境表示装置の例を簡単にご紹介してみました。PICやArduinoなど種々のマイコンのプログラミングについては、今後の記事で少しずつご紹介したいと思います。

 

(c) 2018 Akira Tominaga, All rights reserved.