PIC18F26K22で作るPICduinoシールド編
(製作編)
(ソフトウエア編)
〔PICの動かせ方入門に戻る〕
前前ページで、PICduinoきむ茶工房バージョン(PICduinoSK)を製作しました。
前ページでは、"PICduinoSK"に載せる基本のソフトウエア部分の記事を記載しました。
このページでは、Arduino用のシールドを"PICduinoSK"に挿して動作するか確かめて見ようと思います。
新しくシールドを手に入れたらここに載せようとは思いますがぁ....
このシールドは、秋月通商のこちらで買いました。
(2020/03現在、秋月では販売されていない、
スイッチサイエンスこちらに新バージョンがある様です。)
このシールドの話はこちらのArduino編を見ましょう。
このシールドは動作しました。 (v^ー°)
但し、"skSDlib"を使用しているのでBMPファイルの表示は
すご〜くぅ遅いです。
あれ、表示が"Arduino"のままやん! 変更してへんちゅうねん、ボケてもうたわぁ。
(サンプルプログラムについて)
↓ここからプログラムファイルをダウンロードして下さい。
TFT_LCDshield.zip BMPファイルが速く読み込める様に改良したバージョンに変更した。(2019/06/08)
ダウンロードファイルを解凍すると下記の様なファイル構成です。
TFT_LCDshield1.c・・・・・・TFT LCD(ST7735)の表示テストサンプルプログラム
TFT_LCDshield2.c・・・・・・TFT LCD(ST7735)の表示テストサンプルプログラム(BMPファイルを表示)
TFT_LCDshield3.c・・・・・・TFT LCD(ST7735)の表示テストサンプルプログラム(10キーの入力を行う)
skST7735x.c・・・・・・・・・・・ST7735チップのTFT-LCD用関数ライブラリファイル(基本編)
skST7735x.h・・・・・・・・・・・ST7735チップのTFT-LCD用関数ライブラリのヘッダファイル
skST7735x_img.c・・・・・・ST7735チップのTFT-LCD用関数ライブラリファイル(イメージデータ出力編)
skST7735x_img.h・・・・・・ST7735チップのTFT-LCD用関数ライブラリのヘッダファイル
skST7735x_10key.cpp・・ST7735チップのTFT-LCD用関数ライブラリ(10キー入力編)
skST7735x_10key.h・・・・ST7735チップのTFT-LCD用関数ライブラリのヘッダファイル
skSDlib.c・・・・・・・・・・・・・・・MMC/SDカードアクセス関数ライブラリ
skSDlib.h・・・・・・・・・・・・・・・MMC/SDCのアクセスを行う関数のヘッダファイル
font.h・・・・・・・・・・・・・・・・・・キャラクタ文字(5x8)フォントファイル
(以前、こちらで使用したファイルを使用しています)
// 以下はSDカードに入れて使用します、コンパイルには使いません。
Shinome.pdb・・・・・・・・・・・12x12漢字フォントファイル(実際のファイル名は"Shinonome_12.pdb")
("CJKOS Japanese Fonts"サイトの"東雲"をそのまま利用しています)
ebine.bmp・・・・・・・・・・・・・ 160x107 24bit ビットマップファイルのサンプル
前ページ(ソフトウエア編)で作成のプロジェクトに取り込んで利用します。
SPIを使用するので"PICduinoSK.h"に記述している"#define SHIELD_USE_SPI"のコメントを外す。
ライブラリの使い方はこちらを参照してください。
このシールドは、スイッチサイエンスのこちらで販売して
いますが、私の物は旧タイプのシールドを使用しています。
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カードシールド》
このシールドは、スイッチサイエンスのこちらで販売して
います。秋月通商ならこちらです。
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変換辺りが少々異なっているのでこの辺が微妙に影響
しているのだろうか?
このシールドは、秋月通商のこちらで買いました。
スイッチサイエンスならこちらです。
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配線の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を設定する事。
リンクの見直し(*1) 2020/03/26
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.