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

2014年3月11日火曜日

Arduino互換機 chipKIT UNO32をMCU Gearで使ってみる


普通のArdunoの接続テストでは、一度に多くのデバイスを取り付けるとSRAMが足りなくなるという問題がありました。AVRの32bit版もあるのですが、少しコストが高いので安くてSRAMが大きな Arduino互換機chipKIT Uno32 (80Mhz, 32-bit MIPS, 128K Flash, 16K SRAM)をMCU Gear に使用してみようと思います。






Arduino互換機とは言われていますが、IDEはMPIDEという少し特殊な物を使用します。使い方は基本的に同じです。スケッチの書き方はI2Cのwriteをsendに、readをrecieveにするだけで、他の違いは今のところ違いは見当たりません。
正確にはArduinoではなく、Arduinoに似せた32bitPICマイコンボードです。もちろんブートローダーなども手に入るので自作できます。
chipKITには色々な種類が出ていますが、今回はchipKIT UNO32 Rev.Cという物を使いました。

参考サイト(http://www.digilentinc.com/Products/Detail.cfm?NavPath=2,892,893&Prod=CHIPKIT-UNO32
今回の購入先(http://strawberry-linux.com/catalog/items?code=21208


操作手順

1、まず、電源を入れる前にchipKIT UNO32のジャンパーの設定を変更しておきます。
JP4 : RD4
JP6 : RG3
JP8 : RG2
にしてください、これでSPIマスターとI2Cが設定されます。




2、MPIDEをダウンロードしてください。 http://chipkit.net/started/
今回はmpide-0023-windows-20130715を使用しました。


3、各種モジュールごとのサンプルプログラムです。
サンプルプログラム(自動モード)のダウンロード
http://www.mcugear.org/download/KIT/A_SamplePrograms.zip
自動モードは一つのモジュールごとに配線をやり直して接続してくれます。

4、マイコンボードAでMCU Gearと接続します。
マイコンボードAのジャンパーの設定を
SCL : PTC1
SDA : PTC2
他は何も設定しないでください。


5、プログラムの書き込み
サンプルプログラムをMPIDEからUSBケーブルでchipKIT UNO32 Rev.Cに書き込みます。四角い枠に右矢印のボタンを押して書き込んでください。(MCU Gearのパワーモジュールを接続せずに行ってください。リセットボタンのチャタリング防止用のC5コンデンサの影響で書き込み時の自動リセットに失敗するためです。)



サンプルプログラムの使い方は次のサイトが参考になります。
http://mbed.org/users/Info/code/MCUGearA/ (英語版の下に日本語版があります)

6、使用したいモジュールを取り付けてから電源を入れる

電源は2系統から入れてください。
MCUGearのパワーモジュールを取り付け電源を入れます。
chipKIT UNO32のUSBコネクタから電源を入れると動きます。



その他、
chipKIT UNO32 Rev.CのI2Cの特徴をいくつか挙げておきます。


1、通信速度アップができる。
MPIDEのファイルを書き換えると、I2Cの周波数を変えることができます。
\mpide-0023-windows-20130715\hardware\pic32\libraries\Wire\utility
ディレクトリのtwi.h部分を以下のように変更すると400KHzで動作します。
(1MHzでも送信できますが、chipKITの受信がうまくいかないようでした。)

#ifndef TWI_FREQ
#define TWI_FREQ 400000
#endif


2、注意点

I2Cのアドレス0番から7番まではIDEの問題で使えないそうです。
サンプルプログラムのmasterwireで動作確認するときは、アドレスを4から10に変更する必要があります。今後MPIDEの細かなバグが消えることを願っています。



2014年2月11日火曜日

Raspberry Pi の超簡単設定4 遠隔操作ApacheサーバーとPHPから操作する

目次
Raspberry Pi Noobsで簡単リモートデスクトップ
WiringPiのセットアップ・・・C言語でGPIOを動かしてみる
Pythonのセットアップ・・・人気のPythonで動かしてみる

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

                                      

update こちらのサイトに新型があります。
mille-feuille(ミルフィーユ)


前回までにPythonまでインストールしました。今回はwebからのアクセスです。
リモートデスクトップでも遠隔操作が可能ですが、HTMLやPHPなどを組み合わせて簡単にアクセスしたいときがあります。
今回のサンプルではタブレットから簡単にブラウザからアクセスできるように、PHPを使うことにしました。
(PHPからPythonのプログラムを叩きますが、C言語でも同じことができるはずです。)




そのためにはRaspberry Pi にサーバーを用意して動かします。
Pythonだけの簡易サーバーもありますが、ハードを動かすGPIOを動かすにはApacheとPHPを組み合わせて動かした方が簡単でストレスなく動かせます。

ブラウザが動作する端末でプログラムを動かすことができるので、利用価値は高いと思います。
他のwebアプリを組み合わせると使いやすくなると思います。
また、Pythonコード内のprintもHTMLに反映させることができるので、Pythonでwebページを記述することも簡単にできるはずです。

まずApatchとPHPをインストールします。


sudo apt-get update

sudo apt-get upgrade
sudo apt-get install apache2 php5
sudo chown pi -R /var/www
sudo update-rc.d apache2 defaults

この時点で/var/www/フォルダにHTMLファイルを入れると閲覧できます。

sudo nano /etc/sudoers

テキストエディタが起動するので、sudoersの最後の行に

www-data ALL=(root) NOPASSWD: ALL
と入れます。
ctrl + x で保存するか尋ねて来るので、Yを押し、最後にファイル名を確認してきますが上書き保存するのでそのままエンターを押して終了します。



これでWebでアクセスした人もsudoコマンドが必要なプログラムを使用できます。外部に公開するときはセキュリティ等に気を付けてください。(最低でもアクセスにパスワードで制限を付けるなどしてください)


sudo wget http://mcugear.org/RPitest/MCUGear.tar

tar xvf MCUGear.tar
sudo mv -f MCUGear /usr/lib/cgi-bin

一旦再起動します。

sudo reboot

基本的にcgi-binフォルダでroot権限は変えたくない場合は、/home/pi/フォルダ以下で編集してから

sudo mv [filename] /usr/lib/cgi-bin/[folder] と移動させてください。
削除するときは
sudo rm -rf /usr/lib/cgi-bin/[folder]/[filename]
とすると消せます。
権限を変えると簡単に編集ができます。

手持ちのパソコンやタブレットのブラウザに
http://raspberrypi.local/cgi-bin/MCUGear/index.php
または
http://[IPアドレス]/cgi-bin/MCUGear/index.php
と入れるとアクセスできるはずです。





操作方法

1、MCU Gearの電源を入れる。
2、Init Baseboardボタンを押して、ベースボードを初期化します。

以下のsystem関数を組み合わせてPHPを操作すると、ハードウェアをPHPから動かすことができます。PHPのfor やif 等と組み合わせることで複雑な連続動作ができるはずです。


・Read Input Pins はUniversal Moduleのすべての端子を読みます。


・Write Output Pins はSignal Hold Moduleから出力します。


・Read AD 2ch はAD2chモジュールから信号を受け取ります。(HTML5が対応しているブラウザから動かすとメーターが表示されます。)


・Read AD 8ch はAD8chモジュールから信号を受け取ります。・Read DA はDAモジュールから信号を受け取ります。(HTML5が対応しているブラウザから動かすとメーターが表示されます。)


・Move RC Servo はマルチファンクションモジュールにPWMモードのプログラムを書き込んで使用します。



仕組み等

一番下ではPythonがハードを動かしています。
PHP側からsysteコマンドでPythonファイルを動かす仕組みになっているので、Pythonの中でprint するとその内容もすべて表示されます。表示したくないときはprintをコメントアウトするか、PHPのsystem関数周辺をHTMLのコメントアウト<!--  -->で囲ってください。

PHPからはsystem関数で

sudo python ~.py [address] [command]
という順番で実行しています。
モジュールアドレスはモジュール基板裏面の設定と、ゲート開閉に利用しているPCA9674のデータシートを見てください。

オリジナルの基板などで複雑な処理が必要なときは、取り付ける場合はハードに合わせてPython側を書き換えてください。


2013年12月3日火曜日

MCU Gear を高速化させる(概要)

MCU Gearにはマイコンの配線情報をベースボードに8つ記憶できるBANKというものを持っています。(レイヤーのような物だと考えておいてください)

モジュール複数を同時に接続状態にしておき、配線の切り替え頻度を減らすことで高速化できます。BANKを切り替える命令だけで、あらかじめ作っておいた配線情報が再現できます。





※BANKを使って動かすときの利点・注意点

1、同じBANKのモジュール同士が縦に積まれると、混線する可能性が出てくるため同じモジュール同士を縦に積層しないようにする必要があります。(プログラムのやり方によっては、モジュールの接続位置情報から自動的に危険を回避することも可能)

2、「配線は分岐できない」ので、たとえばSPIを一つのBANKで複数使いたいときは、同じ配線のSPIモジュールを縦に積み上げて、モジュールのゲート信号だけ変更して使います。(Raspberry Piのように、自動で動くチップセレクトピンが少なくても、1つのチップセレクトピンで複数積層できるのが利点です。)

3、パソコンのPCIバスのような物との違いは、基板(BANK)ごとに回路と配線情報が後から自由に入れ替え可能だということです。

EX)
 a、移動時はこの回路構成でマイコンに接続、定点観測時にはモータ部分の回路のみ切り他の回路は流用する等
 b、故障しやすいモジュールを見越してあらかじめ搭載しておき、壊れたら遠隔地から切替
 c、回路のリサイクル性が高いので、別の回路構成に切替可能


現状のサンプルプログラムではユーザーにとって安全のために一つのモジュールごとに配線しなおしていますが改造可能です。

また、mbedでは自動的に高速化するための #define boost というものが用意されています。積層の仕方によって、配線が混戦しないように自動的にBANKを使い分けてくれます。
(上記注意点2、に関しては自動的には行っていません)


2013年10月22日火曜日

MCU Gear:接続検証レポート ~ディーノ系 5V 16MHz編

今回はレベル変換基板を作ったので試してみました。
 これで5V系のマイコンもMCU Gearで扱えるようになります。





ブレッドボードやユニバーサル基板接続しやすいようにmbed と同じピン配置にしました。

これを~ディーノとつなぐには以下のような改造が必要です。
MCU Board TypeAのmbedコネクタをTOP面に取り付け、裏面にはピンヘッダを付けるとうまくつながりました。










では実際に複数のモジュールを動かそうと試みたところ、どうやらモジュールの数によってSRAMがいっぱいになってしまうようです。
今回使用したテストプログラムでは4個のモジュールが限界でした。単純に5個のモジュールを定義すると最初に定義したクラスのモジュールのアドレス設定が消えてしまうなど、うまく動かなくなりました。

恐らく~ディーノ系でもSRAMの大きい物(MEGA?など)を使用するか、PCと接続して分散処理(PC側にモジュールの定義を書き込んでおき、コマンドを送って動かす仕組み。クラスでモジュールを定義しなければ問題なさそうです。)で動作させる方法がよさそうです。

まだ検証は続けますが、今のところ~ディーノ系はサポート対象外です。

2013年10月19日土曜日

Raspberry Pi で多くのモジュールを接続してみる(LCDモジュールは対象外)

RSコンポーネンツさん等で市販されている Raspberry Pi がMCU Gearと接続できましたので報告です。

今回は2013年10月19日に用意できているモジュール類を複数個
接続して見ようと思います。
・12bit 2ch ADモジュール(距離センサー)
・12bit 8ch ADモジュール(ボリューム抵抗)
・12bit DAモジュール(黄色LED出力)
・ユニバーサルモジュール(スイッチ入力と赤LED出力)
・出力信号保持モジュール(モジュールを切り替えても出力信号を保持できます)
・マルチファンクションモジュール(PWMモード)

SPIのモジュールを複数接続していますが、CE0番ピンは一つしか使っていないのが特徴です。


サンプルプログラムはこちら


プログラムの基本動作はこちらの説明を参考にしてください。










2013年10月16日水曜日

Raspberry Pi でC言語 ADコンバーター(ADC) と DAコンバーター(DAC) を簡単に使ってみる

最新情報の目次はこれです
Raspberry Pi Noobsで簡単リモートデスクトップ
WiringPiのセットアップ・・・C言語でGPIOを動かしてみる
Pythonのセットアップ・・・人気のPythonで動かしてみる

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

                                        

以下、昔の記事です。

RaspberryPiで簡単にADC、DACを使ってみたいと思います。

MCU Gearを使うと、例えば8chADモジュールを10個積めば80chのAD変換基板になるお化けな拡張ボードです。

RaspberryPi用接続ボードとMCU Gearを使用します。

MCU Gear にはSPI通信による 12bit ADC、12bit DACを簡単に複数構成することができるモジュールが存在します。

サンプルプログラムではCE0 1つで、複数のSPIデバイスを動かしています





サンプルプログラムの説明です。
12bit 2ch ADの0chから距離センサーの信号を読み取り、それを12bit DAから出力しています。
またユニバーサルモジュールからスイッチの読み取り、LEDの出力(LOWでLEDがONになる)を行っています。

main.cファイルを見てください。
まず、wiringPiをセットアップしたりSPI通信のセットアップなどを行います。

1、initBase(); はMCU Gear の丸い基板、ベースボードを初期化しています。

2、拡張モジュール基板(扇形の基板)の設定をします。
MCUGear AD2chM = MCUGear(N_SCL_SCL_SCL, 4);

 AD2chM :モジュールに好みの名前を付けます
 N_SCL_SCL_SCL : 拡張モジュール裏面にあるアドレス設定回路の任意設定値を入れます。
 (AD2、AD1、AD0の順番に並んでいます。)
 4:はADモジュールの場合はSPIの4ピンを使いますという予告です。(MISO,MOSI,SCK,CE0)

3、IOSimpleSPI(&AD2chM);
 好みの名前を付けたADモジュールにSPIの端子を割り振ります。IOSimpleSPI関数はmain関数の下に記述しておきました。

中身は
unsigned char fio[12];
detect_module(fio);
これはモジュールの位置情報を取ってこいという命令です。
この情報により、モジュールをどの位置に取り付けても自動的に探し出すことができます。

savePinSetting(0, IO_13, IO_REG_IN_DIR, fio[0]);

これはwiringpi の設定で拡張モジュールの0番端子に、IOの13番をRaspberry Pi 側に入力する方向に割り振れ という命令を記録しています。

BOOST_MODE は追々説明しますが、配線の切り替え処理を高速化するためのものです。

4、main関数のwhile(1)ループ内では、拡張モジュールにアクセスするには

AD2chM.connectModule();
とすると回路が再構築されます。

AD2chM.disconnectModule();
とすると、回路が切断されます。

これを連続的に繰り返して、様々なデバイスを少ピンでもたくさん取り付けることができるようになります。

サンプルプログラムを動かすにはターミナルで
gpio load i2c 1000
gpio load spi
を事前に実行する必要があります。

コンパイルは作業ディレクトリに移動して

g++ Wall -o main main.c MCUGear.cpp MCUGearBase.cpp -lwiringPi
 コンパイルに成功したら

sudo ./main

で実行できます。


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月12日木曜日

MCU Gear:接続検証レポート ~ディーノ系 3.3V 16MHz編

前回は3.3V 8MHzとの接続テストを行い、 リセットボタンに問題があることがわかりました。

今回はSeeeduinoという基板を手にいれたのでテストしてみました。


この基板は5V 16MHzでの動作が推奨ですが、実は3.3V 16MHzでも動くそうです
どうやらマイコンの仕様では3.3Vでは13MHz程度が安定してるという事ですが、若干オーバークロック気味で動かせるようです。
(※スイッチが5V側に動かないように、3.3V側に固定しないと危険かもしれません、そこだけは注意する必要がありそうです。)


「3.3V 16MHz・・・本当かな?」っと思いちょっと調べてみました。




単純にIOのHigh、Lowの動きに変化が出るか、ロジックアナライザで確認してみました。

5V  : 8.62~8.63usec
3.3V: 8.62~8.63usec

という結果になり、どちらも同じ速度で動いているようです。(水晶が16MHzなので当たり前なのでしょうけど)
ただ、データシート的には、安全ではないという事なので、推奨はできません。リセットボタンの問題もそのままでした。







次にMCU Gear のパワーモジュールのリセットボタンからC5コンデンサを取り外し、テストプログラム(Test Program)を動かしてみました。一応16MHzで動きましたが、やはりオーバークロックはマイコンの仕様を満たしていないので推奨はできません。

※推奨マイコン以外のマイコンでは、MCU Gearの初期化動作が失敗することがあります。~ディーノ系を使うときはリセットボタンは使わずに
①MCU Gearの電源を入れる。
②マイコンの電源を入れる。
という手順で行う必要があるようです。また、コンデンサを外した後の動作については保証やサポートはできません。


【電圧対クロックのグラフから、近似曲線を求めてみました】
※近似曲線はあくまでも「近似値」を出すための式なので、実際のマイコンには当てはまらない可能性があるため、参考程度にしてください。特にこれで動作保障するものでもありません。また、計算ミスなどあったらコメントください。


データシートの 28.3 Speed Grades グラフを見ると、3.3Vが微妙なラインに見えます。

ここで一つ、気になるところがあります。「これって直線なの?」

では(4.5V, 20MHz) (1.8V, 4MHz) グラフの傾きから1次関数を求めると。

Y = (16MHz/2.7V) X + b

となります。

(4.5V, 20MHz)を代入して b を求めると b = -6.66666....となります。

つまり

Y ≒ (16MHz/2.7V) X - 6.67

となります。

ここで途中にある(2,7V, 10MHz)を確認するためにXに2.7Vを代入すると
Y ≒9.34MHz

10MHzよりも小さい、つまりこのグラフは直線ではなくて若干膨らんでいることになります。
エクセルで二次の近似曲線を出してみました。
その式が正しいと仮定して求めると、3.3Vで約13.63MHzまではSafe Zoneのようです。
仮にこの線に合っていると仮定して16MHz出すには、約3.73Vは必要になる計算になります。
やっぱりちょっと不安なので推奨はできませんでしたが、前回のテストプログラムは一応動きました。




2013年9月11日水曜日

MCU Gear:接続検証レポート ~ディーノ系 I2Cレベル変換テスト

前回は~ディーノ系のDTR信号回路とリセットボタンのコンデンサに問題があることが分かりました。
この部分は5Vレベル変換ボードを作るときに、フォトカプラやバッファIC等、色々考えました。回路がハイパス的な動きなので、あまり妙な回路入れると動かなくなると判断し、一番簡単にリセットボタンの回路とはスライドスイッチで切れるようにしようと思います。
これが出来れば一応~ディーノ系でも動くはずです。

次に問題なのはI2Cのレベル変換です。通常のIOはとても簡単ですが双方向のバスなので、みなさん「難しいよ」と口をそろえて言うのですが、最近はそこをさっくりクリアできるICが出ているので、試してみました。まだこのICに決定したわけではないので型番などは伏せておきます。

ICが面実装なのでDIPに変換してブレッドボードに置いてみました。ブレッドボードは一見ごちゃごちゃしていますが、基板に載せるとすっきりします。



実際にロジックアナライザで見てみましたが、大きな遅延もなさそうです。下の2つがマイコン側、上の2つが出てきた信号です。





2013年9月8日日曜日

MCU Gear:接続検証レポート ~ディーノ 3.3V 8MHz編

MCU Gear で ~ディーノ系は一応動きますがサポート対象外です。
派生版も多く、とても検証しきれませんでした。

3.3V 16MHz のオーバークロックでも動作させることができました。 


以下、3.3V系の~ディーノで検証した時様子を説明しています。5V系は直接つなぐと壊れますので、PICやH8等と同様に、レベル変換ボード(開発中)、ICなどと組み合わせて使ってください。

また、以下の内容は技術的に取り付けることができるのかという参考であって、推奨されるやり方ではありません。あくまでも自己責任で行って下さい、サポートや保証も対象外となってしまいます。

※推奨マイコンとは、本来の回路を変更せずに、回路やプログラムを検証した結果しっかり動いたという物を指します。それが難しかった物、検証していないものを非推奨と呼んでいます。



また、RAMが小さいので、たくさんのモジュールを付ける場合はより性能の良いDuo、ADKなどとレベル変換ICを組み合わせたハードを選ぶと良いかもしれません。

検証に使った時の写真


まず回路設定とリセット用コンデンサの取り外しが必要になります。

1、マイコンボードからは電源供給しないようにジャンパを外してください。(スタンドアロンの時は供給できますが、お勧めはしません。対象の~ディーノ内でどういう回路になっているのかによって異なると思います)

2、I2Cピンの設定を自分が使うものと合っているかよく確認してください。マイコンボードのKL25Zの設定を参考にしてください。

3、パワーモジュールのリセットボタンの横にある、チャタリング防止用のC5のコンデンサを取り外してください。(他のマイコンを使う場合はこれがないとチャタリングしてしまうので注意してください)これを取らないとプログラムの書き込み時の自動リセット(DTR信号)が利かなるようです。
http://labo-section9.blogspot.jp/2010/04/arduino3.html


次にプログラムですが、mbed版のプログラムでIO部分を書き換えて使いました。
中身の動きはこちらの説明を参考にするとわかりやすいと思います。

細かくテストしていないプログラムなので、何かのタイミングによっては動かないこともあるかもしれません。使うときは組込電子回路に知識のある方が自己責任でお願いします。

Test Program

一旦ユニバーサルモジュールの入出力プログラムが動画のように動きます。




※パワーモジュールのリセットボタンの回路に手を加えなければ直接つながらないという結果になり、上記1、2、3を行うとサポート対象外になりますので、基本的には行わないでください。



※推奨マイコン以外のマイコンでは、MCU Gearの初期化動作が失敗することがあります。~ディーノ系を使うときはリセットボタンは使わずに
①MCU Gearの電源を入れる。
②マイコンの電源を入れる。
という手順で行う必要があるようです。また、コンデンサを外した後の動作については保証やサポートはできません。

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に接続して表示する方法はブログ内の別の記事を見てください。