PIC18F26K22で作るPICduinoシールド編

製作編) (ソフトウエア編)   〔PICの動かせ方入門に戻る〕


前前ページで、PICduinoきむ茶工房バージョン(PICduinoSK)を製作しました。
前ページでは、"PICduinoSK"に載せる基本のソフトウエア部分の記事を記載しました。
このページでは、Arduino用のシールドを"PICduinoSK"に挿して動作するか確かめて見ようと思います。
新しくシールドを手に入れたらここに載せようとは思いますがぁ....

《microSD Shield》

microSDシールド図 このシールドは、スイッチサイエンスのこちらで販売して
いますが、私の物は旧タイプのシールドを使用しています。
SPI ピンはSDO(D11)/SDI (D12)/SCK(D13)を使い、
SDを選択するSS(CS)はD8番ピンに其々接続されています。

シールドの電源はPICduinoSKの3.3Vから供給されます。
PICduinoSKは3.3V電源を使用する場合、外部電源を利用
しないとダメな所に注意しましょう。

このシールドは動作しました。 (*^ー^)V

5V<->3.3V変換にはSDO/SCK/SSのみ"74HC4050D"を通して、SDIはSDと直接配線されています。

(サンプルプログラムについて)

↓ここからプログラムファイルをダウンロードして下さい。
SDshield.zip

ダウンロードファイルを解凍すると下記の様なファイル構成です。
 SDshield.c・・・・・・・・・ microSDから読み込むメインプログラム
 skSDlib.c・・・・・・・・・・ MMC/SDカードアクセス関数ライブラリソースファイル
 skSDlib.h・・・・・・・・・・ MMC/SDカードアクセス関数ライブラリのヘッダファイル

前ページ(ソフトウエア編)で作成のプロジェクトに取り込んで利用します。
SPI を使用するので"PICduinoSK.h"に記述している"#define SHIELD_USE_SPI"のコメントを外す。
"skSDlib.h"の"#define CS"にSDを選択するピンの指定を行う必要が有ります、
このSDシールドはSS(CS)はD8番ピンなので、D8に接続しているPICピンは"RA1"ですから
"#define CS LATAbits.LATA1"と書き換えます。

skSDlib.c
skSDlib.h

この内容は”MMC/SDカードを接続し読書きを行って見ます”を参照下さい。

SDshield.c

まず準備として、
PCのメモ帳辺りでmicroSD内に"TEST.TXT"のファイル名でテキスト文章を数行作成します。
そして、microSDをmicroSDシールドに挿しましょう。
次にPCとPICduinoSKをUSBで繋ぎ、シリアル端末(TerTerm)を起動させて置きます。
でぇ、PICduinoSKに外部電源を接続します。
するとぉ、シリアル端末に"TEST.TXT"の内容が1秒毎に1行ずつ表示されると思います。

注意として、SD初期化エラー等が出て上手く行かない場合は、
 // SPIの通信ライン(SDO/SDI)を内部プルアップする
 SPIPullUP(SDO_MOSI_PULLUP | SDI_MISO_PULLUP) ;
の行を挿入したら安定的にうまく動作したとさ。

《SDカードシールド》

SDカードシールド図 このシールドは、スイッチサイエンスのこちらで販売して
います。秋月通商ならこちらです。
SPI ピンはSDO(D11)/SDI (D12)/SCK(D13)を使い、
SDを選択するSS(CS)はD4番ピンに其々接続されています。

電源は、PICduinoSKの5Vを使用し電圧レギュレータで
3.3Vを作っています、5V<->3.3V変換は抵抗を介しSDO/SDI/SCK/SS全て"74VHC125PW"を通している様です

このシールドは動作しませんでした。 (┳◇┳;)

動作させるとSD初期化が上手く行かず、あれやこれや試したのですがぁ...
microSDシールドと比べるとぉ、5V<->3.3V変換辺りが少々異なっているのでこの辺が微妙に影響
しているのだろうか?

《16-Channel 12-bit PWM/Servo Shield》

microSDシールド図 このシールドは、秋月通商のこちらで買いました。
スイッチサイエンスならこちらです。
I2C接続でプルアップはシールド内にて施されています。
尚、PICduinoSKではI2C用プルアップは出来ないので、
シールドにて行われている物でないと動作しないでしょう。


このシールドに関する詳しい記事は、
"PWM/サーボシールドを動かしてみます"を参照下さい。

このシールドは動作しました。 (v^ー°)


(サンプルプログラムについて)

↓ここからプログラムファイルをダウンロードして下さい。
PWMshield.zip

ダウンロードファイルを解凍すると下記の様なファイル構成です。
 PWMshield.c・・・・・・・・・ PWM/サーボを動作させるメインプログラム
 skPWMServo.c・・・・・・・ PWM/サーボ(PCA9685)用関数ライブラリソースファイル
 skPWMServo.h・・・・・・・ PWM/サーボ(PCA9685)用関数ライブラリのヘッダファイル

前ページ(ソフトウエア編)で作成のプロジェクトに取り込んで利用します。
I2Cを使用するので"PICduinoSK.h"に記述している"#define SHIELD_USE_I2C"のコメントを外す。

※ "skPWMServo"ライブラリは、他のPICでも動作可能ですがその際は"skI2Clib"のI2C用ライブラリを
  インクルードして下さい。

PWMshield.c

LEDを使った配線図 左の如くサーボモータを使っての実験ではなく、
LED配線のPWM点灯実験です。
電源は、PICduinoSKからの5.0Vです。
LEDは10mA以上流さない様にしましょう。

起動させるとLEDが点灯(段々明るくなるを繰返す)します。
プログラムはチャンネル0のみ出力しています。


skPWMServo.h

SetServoOnTime( )/SetServoAngle( ) 関数を使う場合は必ず使用するサーボの回転範囲を設定します。
#define SERVOMIN_US			660		// パルスの最小幅時間us
#define SERVOMAX_US			2320		// パルスの最大幅時間us

skPWMServo.c

PWM/サーボ(PCA9685)の制御を行う為の関数集です。
まず利用する場合は下記2行をスケッチの最初に記述します。
#include "skPWMServo.h" ;

関数の使い方を説明します。

ans=PWM_Init(address)
 デバイスの初期化を行う処理。

 int address:デバイス(スレーブ)のI2Cアドレスを指定します(デフォルトは0x40)
 int        ans:戻り値、0=正常終了 1=異常(相手からACKが返ってこない)
                         -1 = 他のマスターとのバス衝突が発生してリトライオーバー

 ※ 初期化はMODE1レジスタのみ行っています、MODE2レジスタを変更する場合は御自分で追加
   しましょう。

ans=PWM_SetFrequency(val)
 PWMの出力周波数設定を行う処理。

 float val:出力する周波数値を指定します(24Hz〜1526Hz)
 int   ans:戻り値、0=正常終了 それ以外 PWM_Init( ) のans値を参照

 ※ 50Hzと指定しても実際は、 計測すると50.11Hz程出ています。
   SetFrequency(val) 関数内で
   val *= 0.95 ;
   で調整しています。

ans=PWM_SetDutyRatio(channel,on_val,off_val)
 PWMの出力デュティ比設定で回転させる処理。
 デュティ比(0-4095)がレジスタに設定された後、I2CのSTOP信号で実際にPWM出力が開始されます。

 int channel:PWM出力するチャンネル(0〜15)を指定します
                        0                  4095
                         __| ̄ ̄ ̄|___|_ 
 unsigned int  on_val: ---->|                  出力波形の立上げ開始タイミング(0-4095)を指定します
 unsigned int off_val: ------------>|          出力波形の立下げ開始タイミング(0-4095)を指定します
 int        ans:戻り値、0=正常終了 それ以外 PWM_Init( ) のans値を参照

 ※ 今回はサーボモータの制御を行うので、出力波形は"on_val=0"で0から立ち上げます。

PWM_SetServoAngle(channel,angle)
 サーボの回転を角度で指定する処理。

 int             channel:PWM出力するチャンネル(0〜15)を指定します
 unsigned int angle:角度(0-180°)を指定します(90°で水平位置)

 ※ SetFrequency(50)と周波数を設定している事。
 ※ "skPWMServo.h"にてSERVOMIN_US/SERVOMAX_USを設定する事。

PWM_SetServoOnTime(channel,t_us)
 サーボの回転を出力デュティ比のONパルス幅で指定する処理。

 int           channel:PWM出力するチャンネル(0〜15)を指定します
 unsigned int t_ua:ONパルス幅の時間(us)を指定します

 ※ SetFrequency(50)と周波数を設定している事。
 ※ "skPWMServo.h"にてSERVOMIN_US/SERVOMAX_USを設定する事。





【きむ茶工房ガレージハウス】
Copyright (C) 2006-2018 Shigehiro Kimura All Rights Reserved.