ラベル 入門 の投稿を表示しています。 すべての投稿を表示
ラベル 入門 の投稿を表示しています。 すべての投稿を表示

2013年9月25日水曜日

Raspberry Pi 入門 6:MCU Gear を試してみる

RSコンポーネンツさん等で市販されている Raspberry Pi がMCU Gearと接続できるのかを検証してみようと思います。
(MCU Gear のモジュールが対応済みになりました)
MCU Gear で AD変換、DA変換できました

MCU Gear と Raspberry Pi を配線やブレッドボードを使って接続してみます。

最も基本的なLED点灯とボタン入力をMCU Gear、C言語は wiringpiを使ってテストしてみます。

I2Cの設定は1MHzで動かそうと思います。
sudo gpio load i2c 1000

これを~ディーノで使ったプログラムのI2C部分を改造しました。
試作なので配線がたくさんついていますが、基本動作は出来ました。
Raspberry PiにはI2Cのプルアップ抵抗がついていますので、MCU Gearのプルアップ抵抗を外せば直結できます。
しかし、基板の面実装部品を動かしたくないので、I2Cを分離するためI2C用のICを使って分離します。
実際に今回のテストで動かした動画です。
このままでも安定して動かせますが、専用基板を作る予定です。
テスト用のプログラムも基板の販売前に検証してから公開しようと思います。






2013年9月24日火曜日

Raspberry Pi 入門 5:C++ を試してみる

最新情報の目次はこれで、最終的に動画のような物も作れます。
Raspberry Pi Noobsで簡単リモートデスクトップ
WiringPiのセットアップ・・・C言語でGPIOを動かしてみる
Pythonのセットアップ・・・人気のPythonで動かしてみる

WebからPHPで簡単アクセス・・・PHP、Pythonで遠隔GPIO



                                        

以下、昔の記事です。



前回まではC言語でいろいろこなしてみました。

ラズベリーパイにはC言語以外にもC++が対応しています。基本的にはgccをg++と書けば動きます。

C++の簡単な使い方と wiringPi のC言語とC++を組み合わせたコンパイル方法を試してみます。
(MCU GearのLPC1114はC言語ですが、それ以外はC言語とC++を組み合わせた形で書かれています。)


まずはGeanyを使わない形でコンパイルしてみます。

テストプログラムは三つのファイルを用意します。



1、【MyTest.h】
class MyTest{//クラスの宣言
public:
int getData(void);//クラスの関数
};


2、【MyTest.cpp】
#include "MyTest.h"
int MyTest::getData(void){//クラスで定義された実際の関数の中身
return 9;
}


3、【cpptest.c】
#include <stdio.h>
#include "MyTest.h"

int main(void){

MyTest maintest;//MyTestクラスのインスタンス生成
//maintestという中にgetData()という関数が隠れていると考えると分かりやすい。
//インスタンスが実体でクラス宣言した中身を利用できるようになる。

int data = maintest.getData();//MyTestクラスのgetData()関数を呼び出して値を保存

//インスタンスの中身をいじるときは(インスタンス.クラスの中身)

printf("getData = %d\n",data);
}



これら三つのファイルを作り、一つのフォルダに入れます。
フォルダに入れたら.oファイルをコンパイルして作り、最後にビルドして実行ファイルを作ります。
ターミナルでls、cdコマンドを利用し移動して次の様なコマンドを入れます。

g++ -c MyTest.cpp -o Mytest.o
g++ -c cpptest.c -o cpptest.o
g++ cpptest.o MyTest.o -o cpptest
./cpptest

最後にgetData = 9
と出ていれば成功です。
次はGeanyの設定をしてみましょう。


ビルドコマンドを設定します。


gccと書いてあるところをg++にしておくと、とりあえず一つ一つのファイルをコンパイルして.oファイルを作れるようになります。

次にmakefileを作ってみましょう。


cpptest : cpptest.o MyTest.o

g++ -Wall cpptest.o MyTest.o -o cpptest



clean:

rm -f *.o cpptest

と記述すると、プログラムを書き変えてもすぐにビルドボタン、実行ボタンで動くようになります。

次にwiringpi とC++を組み合わせてみましょう。
3回目にやったblink.cのmain関数に

#include "MyTest.h"

int main(void){
MyTest maintest;
int data = maintest.getData();
printf("getData = %d\n",data);

を加えてみましょう。
そして同じフォルダにMyTest.cpp とMyTest.h を入れてみましょう。

ターミナルを開いて
g++ -Wall -o blink.c MyTest.cpp -lwiringPi

sudo ./blink

と実行すればC++もC言語も動きます。


次回はMCU Gearがつながるかを検証してみます。

2013年9月16日月曜日

Raspberry Pi 入門 4:I2C通信をC言語で動かす

最新情報の目次はこれで、最終的に動画のような物も作れます。
Raspberry Pi Noobsで簡単リモートデスクトップ
WiringPiのセットアップ・・・C言語でGPIOを動かしてみる
Pythonのセットアップ・・・人気のPythonで動かしてみる

WebからPHPで簡単アクセス・・・PHP、Pythonで遠隔GPIO


                                        

以下、昔の記事です。

前回はC言語でLEDの点滅テストをしてみました。

※ラズベリーパイ側に I2C通信用のプルアップ抵抗が入っているため、MCU Gearを使う場合はI2Cの抵抗をMCU Gearのベースボードから半田で取り外す必要があります。しかし、ボードの回路自体を改造するとベースボードがサポート対象外になってしまうので、I2Cをバッファを介して使う方が無難かもしれません。そのためのボードも考えてみます。

まず、ラズベリーパイ単体でI2Cを動かしてみましょう。

(I2C通信はもう知ってるから、一気に飛ばしてAD変換、DA変換を知りたい方はこちらへ)


準備です。I2Cのバスが使えるようにします。
このサイトを参考にします。

ターミナルを開いて
sudo apt-get install libi2c-dev

次にカーネルにロードします。
sudo gpio load i2c

この時デフォルトでは100kbpsのI2Cなので1Mbpsなどにするときは

sudo gpio load i2c 1000とするそうです。ここでは一旦デフォルトの100kbpsにしておきます

プログラムはblink.cの適当な所に

#include <wiringPiI2C.h>

int main(void){
  int fd;
  int ID = 0x78;

  fd = wiringPiI2Csetup(ID>>1);  //1bit 動かしてみる。

  if((wiringPiI2CWrite(fd,0x13))<0){
    printf("error");
  }

  return 1;

}

ロジックアナライザに直接つなぐと図のような波形が出ます。




0x78 を 1bit 右にずらした値 (ID >> 1) が 0x3c なので問題なく動いています。
この wiringPi のC言語は~ディーノ系とよく似ているので、プログラムを流用して、実際に信号が出る部分を書き換えれば動きそうです。

次回はC++ と AD DA が使えうるMCU Gearをつなぐ準備をしてみようと思います
RSコンポーネンツさん等で市販されている Raspberry Pi がMCU Gearと接続できるのかを検証してみようと思います。

Raspberry Pi 入門 3:C言語でLED点滅編

最新情報の目次はこれで、最終的に動画のような物も作れます。
Raspberry Pi Noobsで簡単リモートデスクトップ
WiringPiのセットアップ・・・C言語でGPIOを動かしてみる
Pythonのセットアップ・・・人気のPythonで動かしてみる

WebからPHPで簡単アクセス・・・PHP、Pythonで遠隔GPIO


                                        

以下、昔の記事です。

前回は普通のC言語の使い方を試してみました。

今回はLEDを点滅させるプログラムを作ってみたいと思います。Rasberry Pi はマイコンのように端子が出ています。その端子をC言語で制御してみたいと思います。

LEDの点滅は知ってるから、一気に飛ばしてAD変換、DA変換を知りたい方はこちら

Raspberry Pi の端子(GPIO)を動かすには、いくつか方法があります。
Python
shellスクリプト

C言語だと
bcm2835 ・・・初心者にはちょっとややこしいかもしれませんが、中上級者には良さそうです。(参考:http://www.airspayce.com/mikem/bcm2835/

wiringPi・・・初心者向けに簡単な記述で動かせるようにした物のようです。
(参考:https://projects.drogon.net/raspberry-pi/wiringpi/

今回はwiringPiを使います。これはRasberry Pi を簡単なC言語で動かすというコンセプトの物のようです。

IOの番号はそれぞれ使うものによって違います。詳しくはこちらに掲載されている写真からwiringpi の IOの位置を確認してみてください。

まずはgitをインストールして、
sudo apt-get install git

wiringPiのコピーをビルドします。
git clone git://git.drogon.net/wiringPi
cd wiringPi
 ./build

次に前回helloworld.cを作ったように、blink.cを作ります。
中身をこのサイトにあるサンプルのようにします。

ピンアサインはターミナルでwiringpi readall と打ち込むと、ピン配置とプログラムの番号との対応が分かります。




最後に前回のようにターミナルから/Desktop/C_test/にls cdコマンドを使って移動し、
gcc -Wall -o blink blink.c -lwiringPi
sudo ./blink

とやれば動画のように動きます。動画は見やすいように、動きを1秒おきに改造しました。
止める時は [ctrl] + [c] をキーボードで押せば止まります。





最後にこのサイトのmakefileを使い、Geany側にwiringPiのリンクを貼ります。
Geanyの「ビルドコマンドの設定」をします。




クリックして「ビルド」と「実行」の部分に以下の青い文字を書き加えます。

ビルド gcc -Wall -o "%e" "%f"  -lwiringPi
実行   sudo "./%e"

ワンクリックでビルド、実行ができるようになります。

次回はI2C通信設定をします。





2013年9月15日日曜日

Raspberry Pi 入門 1:起動とVNC編

最新情報の目次はこれで、最終的に動画のような物も作れます。
Raspberry Pi Noobsで簡単リモートデスクトップ
WiringPiのセットアップ・・・C言語でGPIOを動かしてみる
Pythonのセットアップ・・・人気のPythonで動かしてみる

WebからPHPで簡単アクセス・・・PHP、Pythonで遠隔GPIO



                                        
以下古い記事です。

-------------------------------------------
1、Windows PCでの作業で説明します。

まずLinuxイメージをダウンロードして、2GB以上のSDカードに保存するところから始めます。
今回は4GBを使いました。

ページから色々なOSがダウンロードできるようになっています。
ここで、Raspberry Piに最適化されているという「RaspbianというLinuxで作ってみましょう。
今回は図の2013-02-09-wheezy-rasbian.zipを使ってみます。



そして次に、同じページにあるWin32DiskImagerというリンクをクリックしてダウンロードます。これを使ってWindows上でLinuxSDカードを作るとか、良くわかりませんがそういうソフトらしいです。

ダウンロードした二つのZipファイルを解凍して、Win32DiskImagerを使って先ほどのRaspbianをSDカードに展開します。


SDカードはG:ドライブとして認識されています。青いフォルダボタンで解凍したRaspbianの.imgファイルを選択してください。Writeボタンを押すと書き込んでくれます。
これでWindows PCでの作業は終わりです。

SDカードは数十MBと表示されるが、問題は無いようです。 ※もしも、SDカードを元に戻したいときはSDフォーマッター4.0を使うと直る。
・USBキーボード

・USBキーボード

起動すると画面に色々メニューが出ますので、以下のように設定してください。
起動すると画面に色々メニューが出ますので、以下のように設定してください。
起動すると画面に色々メニューが出ますので、以下のように設定してください。
(この設定はあとでraspi-configすれば開きます。)
最後に日本語化が必要な方には色々と方法がありますが、個人的に組込に関しては日本語化しない方が海外の情報を利用しやすくなるので英語もお勧めです。
最後に日本語化が必要な方には色々と方法がありますが、個人的に組込に関しては日本語化しない方が海外の情報を利用しやすくなるので英語もお勧めです。
再起動してiBusを左下のメニューボタンから設定します。
※Linuxターミナルの使い方は各種書籍が出ているので利用してみてください。


https://www.sdcard.org/jp/downloads/formatter_4/eula_windows/
参考
http://blog2.k05.biz/2012/01/blog-post_31.html

-------------------------------------------
Raspberry Pi での作業
まず各種機器を接続
・USBマウス
・5V 700mAのスマフォ用電源

・LANケーブルを接続しておく
・HDMIケーブル、HDMI端子があるデジタルテレビに接続してみる。
HDMIケーブルには方向があるので注意してほしい、TVと書いてある方をTVにつながないと全く動かないです。

最初にずらずら―っと色々でてきますがじっくり待ちます。






------------------------------------------




expand_rootfs
    rootfs を SD カードいっぱいに拡張してくれます。
overscan 
    画面いっぱいに表示してくれるのでEnableにしました
configure_keyboard
  Generic 105-key (Intl) PC
    Keyboard layout
      Other 
        Japanese
          [Japanese]
           [The default for the keyboard layout]
                      [No compose key]
                      Use Control+Alt+Backspace to terminate the X server?  [No]
change_pass
      パスワードを設定できます。
change_locale
    ja_JP.EUC-JP EUC-JP
    ja_JP.UTF-8 UTF-8
   Default locale for the system environment
     ja_JP.UTF-8
change_timezone
      Asia
         Tokyo
memory_split
    何もいじらないでOK
overclock
    何もいじらないでOK
ssh
    [YES]
boot_behaviour
        [YES]
update
    何もいじらないでOK

Finish で終了し再起動してください。


-------------------------------------------







LXTerminal で最新のアップグレード情報を更新
$sudo apt-get update
各種プログラム等を更新
$sudo apt-get upgrade

-------------------------------------------------------
必要な人は日本語化もできます。
日本語漢字フォントなどを手に入れる
$sudo apt-get install ttf-kochi-gothic xfonts-intl-japanese xfonts-intl-japanese-big xfonts-kaname
日本語入力ibus-anthyを手に入れる
$sudo apt-get install ibus-anthy

[設定]->[IBusの設定]をクリック
[インプットメソッドタブ]->[インプットメソッド選択]->[日本語-Anthy]->追加ボタンクリック

参考
http://www.designspark.com/jpn/nodes/view/type:knowledge-item/slug:JPN-raspberry-pi-Japanese-version
http://juncoffee.jp/?p=4095
http://ameblo.jp/mijyu-sakura/entry-11329029030.html
-------------------------------------------------------


次に遠隔操作出来るようにしましょう。

せっかく小さいRaspberry Piにモニター等をつなぐのでは面倒です。最悪ポータブルのアナログTVで見れれば良いかと思います。しかし、それでずっと作業するのは苦痛なのでLANを通して遠隔操作をしたいと思います。



VNCサーバーを使った遠隔操作についての説明です。
要するにノートPC等でRaspberry Piにリモートアクセス出来ると開発環境が非常にコンパクトになるというわけです。
まずは前回の構成で通常に起動してください。もちろんLANはつないでおいてください。
ターミナルで
 $sudo apt-get update
次に
 $sudo apt-get install tightvncserver と入力しましょう。
実行しますかと聞かれるのでYを入力します。
これでVNCが入ったので、次はRaspberry PiのIPアドレスを調べます。
ターミナルで
 $ifconfig
を入れます。たぶん、inetアドレス:192.168.0.9 などと表示されていると思います。
それをメモしておいてください。
次にVNCサーバーの起動をします。ターミナルで
 $tightvncserver 
と入力してください。パスワードを求められるので、VNCで遠隔ログインするときのパスワードを入力してください。
---------------------------------------
次にノートPCなどに遠隔ログインして操作できるクライアントソフトを入れます。
Windows用のソフトもあればJavaもあります。好きな方を使用してください。
個人的にはViewerだけダウンロードする方が安全かなと考えています。
今回はJavaで見てみようと思います。
tvnjviewer-2.6.2-bin.zip
をダウンロードして解凍
tightvnc-jviewer.jar
を実行します。Java1.6がインストールされてないと使えないので注意してください。普通は動くと思います。
ポート番号は5901を指定します。
[Connect] を押すと先ほどのパスワードが聞かれますので、同じものを入力。
以下のようにログインできれば完成です。
毎回VNCを立ち上げるのが面倒な場合-------------------
penguintutorというページにアクセスして、設定を簡単にインストールできる。
ターミナルから以下のコマンドを入れていく
まず、chkconfigをインストール
sudo apt-get install chkconfig
次に以下のコマンドを入れていく
wget http://www.penguintutor.com/otherfiles/tightvncserver-init.txt
sudo mv tightvncserver-init.txt /etc/init.d/tightvncserver
sudo chmod 755 /etc/init.d/tightvncserver
sudo chkconfig tightvncserver on
最後にスタート->アクセサリ->ファイルマネージャー でpiフォルダが表示されるので、右クリックで「隠しフォルダを表示」を押すと
.vncというフォルダが出る。
中にxstartupという歯車マークの付いたファイルがあるのでleafpadで開く
テキストの最後に
/etc/X11/Xsession -s LXDE &
と編集する。
---------------------------------------------------------------
VNCで起動しているとターミナルからシャットダウンするか、TVをつないてマウスで操作するしか方法が無いようです。
遠隔でシャットダウンするにはターミナルで
sudo shutdown -h now
とコマンドを入れれば終了できます。
最後に無線化などする場合は以下の方法がある。
現在公開されている Raspberry Pi だと以下のドングルがUSBポートに挿し込むだけで使えるようです。
他には小型ルーターを使って無線経由の有線接続もできる。
例えば、PLANEXポータブルWi-Fiポケットルータ MZK-RP150Nのコンバータモードを使う事もできる。
Raspberry Pi のUSBポートに負荷を与えたくない時に良いかもしれない。
参考サイト

2013年9月4日水曜日

MCU Gear のプログラム:その他プログラムで気を付ける点

MCU Gear ® を使ったプログラムの説明などを書いています


MCU Gearでも使っていますが、完全に同じプログラムで同じ動き、とはいかないようです。
MCU Gearで使うときに以下のような注意点があります。


1、クロック周波数
KL25Z はLPC1768の約半分なので、通信バス等のクロックを想定している値の倍にしないといけない。


2、KL25Z は通信バスのフォーマットが8ビットなので、SPIのフォーマットを任意で設定できない。
SPI通信は8ビットを複数回組み合わせて実現します。

ちなみに、LPC1114FN28 をLPCXpreaaso で動かす場合はSPIのフォーマットが変えられるようです。

3、KL25ZのUSBシリアル通信
KL25ZではPTA0、PTA1がPCとのシリアル通信で使われるので、PCのシリアル通信を使いたい場合は、他のデバイスとの接続に使ってはいけない。

mbedで従来のライブラリを使うときの注意点
mbedのLCDモジュールは、インスタンスを生成する時に初期化信号を出しています。
MCU Gearを使うときにはまずLCDに配線をしてからインスタンスを生成して初期化する必要があります。

サンプルプログラムではインスタンスの生成をLCDM.connectModule();の後に行っています。
mbed系は呼び出したときに初期化するものもあるので注意してください。

グローバルで定義するためには初期化関数を用意する必要があります。


Multifunction Module LPC1110FD20 のサンプルコードの説明 (3つのモード)

MCU Gear ® を使ったプログラムの説明などを書いています

Multifunction Module (マルチファンクションモジュール)はLPC1110マイコンを搭載したモジュールです。


PWM 機能も使えるので、動画のようにサーボモーターも動かせます。
動画は12bit 2ch ADモジュールに距離センサー(GP2Y0A21YK)を取り付け、LCDで値を表示しながらサーボを回してみました。もちろんモジュールを重ねても動きます。



サンプルソースではMCUGearを通して、SPI通信 16bitフォーマットでデータのやり取りをし、3つのモード(AD変換、PWM、I2C)のサンプルを用意しました。プログラムの中身を見ながらいろいろ楽しんでみてください。


マイコンとUARTも接続可能ですが、モジュールを切り替えるため単純なSPIを推奨します。SPI使用時は補助としてUARTピンを2つのデジタルIOとしても使えます。簡単な機能を分担させるために使用できますが、サンプルプログラムでは特に言及していません。


サンプルプログラムのI2C.hなどで通信速度設定の変更をしています。このプログラムはあくまでも動作確認用なので、ご自分のシステムで動作させる際はユーザーマニュアルなどを見ながら自作してください。

MCU Gear 側 (ベースボードに接続されている端子)

0pin PIO0_8/MISO/CT16B0_MAT0
1pin PIO0_9/MOSI/CT16B0_MAT1
2pin PIO0_6/SCK0
3pin PIO0_2/SSEL0/CT16B0_CAP0
4pin PIO1_6/RXD/CT32B0_MAT0
5pin PIO1_7/TXD/CT32B0_MAT1

モジュールの外部ピン(実際に出力ピンとして使えるもの)

0pin  R/PIO1_1/AD2/CT32B1_MAT0
1pin  R/PIO1_2/AD3/CT32B1_MAT1
2pin  SWDIO/PIO1_3/AD4/CT32B1_MAT2
3pin  SWCLK/PIO0_10/SCK0/CT16B0_MAT2
4pin  PIO0_5/SDA
5pin  PIO0_4/SCL

ピンの種類を見るとわかりますが、以下のような機能が使用可能である。

5つのデジタル入出力(内二つはオープンドレイン)
3つのAD変換
3つの32bitマッチタイマー出力
1つの16bitマッチタイマー出力
I2Cバス(MCUGearと別系統で使用可能、プルアップ抵抗が必要です)
デバッガ(SWDクロックポート、SWD入出力ポートが取り出せますが、この機能はテストしていません、興味のある方は試してみてください。)

以下にサンプルプログラムの使い方を説明します



・3ch 10bit ADC

main.c で

#define AD_MODE 1

#define PWM_MODE 0
#define I2C_MODE 0

とAD_MODEを選択してください。

3チャンネルの10bit AD変換モジュールとして動作します。


マイコン側では

mbed、KL25Z はMCUGear ライブラリのcommon.hを

//For Sample Mltifunction Mofdule-----------------------------

#define AD_MODE
//#define PWM_MODE
//#define I2C_MODE
//--------------------------------------------------------
としてください。
LPC1114FN28 のLPCXpressoの場合は main.c 内で

#define MultiFunctionModule 1

#define PWM_MODE 0
#define AD_MODE 1
#define I2C_MODE 0

と定義してください。



SPIの操作方法


1、まず、どのAD変換データが欲しいかを指定します。

16bit 1MHzで動作します。16bit なので cs を Low にしたまま 8bit を二回送っても良いです。

チャンネル指定データを送ります。順不同なので注意してください。

0x0001:AD4
0x0002:AD2
0x0003:AD3

2、次に16bitデータの受信を行います。

16bit 0x000を送ってください。ADCが 10bit なので、実際に使えるのは 10bit 分のみです。

KL25Zは16bit Format に対応していないので8bitで操作します。


FRDM-KL25Zの例

    getData = spi.write(0);
    getData = (getData<<8)+spi.write(0);



・3ch PWM 出力

Multifunction Module 側のmain.c で

#define AD_MODE  0

#define PWM_MODE  1
#define I2C_MODE  0

PWM_MODE  を選択してください。

3チャンネルのPWMモジュールとして動作します。


マイコン側では

mbed、KL25ZはMCUGear ライブラリのcommon.hを

//For Sample Mltifunction Mofdule-----------------------------

//#define AD_MODE
#define PWM_MODE
//#define I2C_MODE
//--------------------------------------------------------
としてください。
LPC1114FN28 のLPCXpressoの場合は main.c 内で

#define MultiFunctionModule 1

#define PWM_MODE 1
#define AD_MODE 0
#define I2C_MODE 0

と定義してください。



PWMは32bitタイマーマッチアウト(CT32B1_MAT0~2)を使用しています。


前方4bitがコマンド、後方12bitがデータという 16bit SPI フォーマットで動作します。




1、まず初期化します。

以下の順番にデータを送信してください。
Divider
Frequency
Duty0
Duty1
Duty2


これらのデータはモジュールのLPC1110内では以下のように扱われます。


LPC_SYSCON->SYSAHBCLKCTRL |= (1<<10);

LPC_IOCON->R_PIO1_1 |= 3;
LPC_IOCON->R_PIO1_2 |= 3;
LPC_IOCON->SWDIO_PIO1_3 |= 3;
LPC_TMR32B1->PR = Divider - 1; //プリスケールレジスタ
LPC_TMR32B1->PWMC |= (1<<0);
LPC_TMR32B1->PWMC |= (1<<1);
LPC_TMR32B1->PWMC |= (1<<2);
LPC_TMR32B1->MCR |= (1<<10);
LPC_TMR32B1->MR3 = Frequency-1;
LPC_TMR32B1->MR0 = Frequency*Duty0/100;
LPC_TMR32B1->MR1 = Frequency*Duty1/100;
LPC_TMR32B1->MR2 = Frequency*Duty2/100;
LPC_TMR32B1->TCR = 1;

簡単に説明しますと、タイマーの中にはプリスケールカウンター(PC)というカウンターが動いています。このカウンターがまずプリスケールレジスタの値(PR)と等しくなったときにタイマーカウンター(TC)が1つカウントされます。

TCの値とMR0~MR2の値が一致するときにvoid TIMER32_1_IRQHandler(void)にタイマー割り込みが発生して、そこに記述された動作をします。

さらに詳しい内容は、LPC111Xのユーザーマニュアルを参照してください。


日本語ユーザーマニュアル (15章)


Englich User Manual (Chapter 20)



2、PWM動作中には以下のような変更が可能です。



//data format

//15-12:setting(Header)
// 1 :stop PWM out
// 2 :Frequency setting
// 3 :Duty0 setting
// 4 :Duty1 setting
// 5 :Duty2 setting
// 6 :start PWM out
// other :Nothing
//11-0:Data


16bitのSPI信号で、15-12bit のコマンド部分は、上記の0~5を選択します。

settingと書いてあるところは12bitでデータを入れて調整することができます。
settingと書いていないところは12bit部分は0x000を入れて送信してください。

例えばDuty0 の値を 0x7FF に変えたいときは、16bit の 0x37FF (0011 0111 1111 1111)を送信すれば良いことになります。


実際にどのように動くかは以下の計算式で求められます。


4、RCサーボ用信号の設定

LPC1114FN28を例として、RCサーボ用の信号を想定して約20msecの周期を考えてみます。
そのうちHigh信号の期間が0~2msecの範囲を12bit分解能で調整できるようにしてみます。

初期化で initPWM(&MFM, 24, 40950, 0, 0, 0); と値を入れた場合、

(マイコンのクロック:48MHz)/(Divider:24) = 2MHz
これを(1/2MHz)*(Frequency 40950) ≒ 0.02sec=20msec
としています。

12bitの最大値は4095となります。Frequency 40950 としたので、最大でも周期の10%となります。そのため、サーボ用の信号は周期20msec その10%の範囲で設定できるようになり、0~2msecを12bit分解能で微調整できます。

(※注意:多少パルス幅に誤差があるので、場合によっては微調整が必要です)

    initPWM(&MFM, 24, 40950, 0, 0, 0);

    PWMDuty(&MFM, 1, 0x7FF);    //duty 1msec
    PWMDuty(&MFM, 2, 0x001);    //duty 500nsec
    PWMDuty(&MFM, 3, 0xFFE);    //duty 2msec

RCサーボモーターによって、最小パルスの大きさが違います。
その為サンプルプログラムの例では最小値を0x7FFとしています。最大値も物によっては差が出るかもしれませんので、微調整が必要になります。
モーターなので、電源はMCUGearからではなく、別系統で持ってきた方が安定します。GNDを共通にするのを忘れないでください。
また、マイコンのプログラム中は動きが不安定になるので、RCサーボモーターの電源を切ってから行って下さい。


5、通常のPWM信号の設定


例えば、12bit分解能で、0~100%を設定する場合は、Frequency を4095として、Dividerで同じ周期に調整します。20msecの周期のPWMを変化させる場合は以下のようになります。


    initPWM(&MFM, 240, 4095, 0, 0, 0);

    PWMDuty(&MFM, 1, 0x199);    //duty 10%
    PWMDuty(&MFM, 2, 0x7FF);    //duty 50%
    PWMDuty(&MFM, 3, 0xE65);    //duty 90%


6、応用として、PWM出力とローパスフィルターを利用したDA出力も可能です。




・I2Cテスト(SPI to I2Cデバイスとして動作します)


I2Cテストはユニバーサルモジュール2のゲート操作を行うことを前提に作られています。

別の通信速度のI2Cを動かしたり、アドレスがかぶってしまうようなデバイスを動作するときに使用します。

大まかな流れは

マイコンからMultifunction Module を通してI2Cでゲートを開き、ゲートの開閉状況をI2Cで読みとり、それをまたSPIでマイコン側に戻してシリアルポートから読み取る。
というものです。
これを一回だけ行われるようにしています。シリアルで取りこぼしたときは、パワーモジュールのリセットボタンを押すか、電源をOFF->ONすれば取れるはずです。

では、配線方法です。ユニバーサルモジュール2はベースボードから取り外した状態で使用します。


main.c で


#define AD_MODE  0

#define PWM_MODE  0
#define I2C_MODE  1

I2C_MODE を選択してください。


マイコン側では

mbed、KL25ZはMCUGear ライブラリのcommon.hを

//For Sample Mltifunction Mofdule-----------------------------

//#define AD_MODE
//#define PWM_MODE
#define I2C_MODE
//--------------------------------------------------------
としてください。
LPC1114FN28 のLPCXpressoの場合は main.c 内で

#define MultiFunctionModule 1

#define PWM_MODE 0
#define AD_MODE 0
#define I2C_MODE 1

と定義してください。


SPI通信は16bitで動作し、前半8bitがアドレス、後半8bitがコマンドです。



ここでは試しにユニバーサルモジュール2のゲートスイッチをモジュール単体で操作してみようと思います。

以下のように配線しました。

I2Cはベースボードに取り付けていない場合、MCOM1にしか信号が通りませんのでご注意ください。またユニバーサルモジュール2のアドレスはmcugear.com内の組み立て方を参考にしてください。




プルアップ抵抗は2.2KΩと書いてありますが、今回は3KΩでテストしました。

MCOM1の2番端子をGNDにつなぎ、赤いLEDを適切な抵抗を付けて+3.3Vとユニバーサルモジュール2の2番信号端子に接続してあります。
もしゲートが開くと、LEDの2番信号端子がGNDになるという動きです。

サンプルプログラムを実行してみてください。LEDがONになり、一回だけ送ったデータがLPC1114FN28のuartを通して確認できます。


uartの信号をPCに接続して表示する方法はブログ内の別の記事を見てください。