ラベル ユニバーサル の投稿を表示しています。 すべての投稿を表示
ラベル ユニバーサル の投稿を表示しています。 すべての投稿を表示

2014年1月13日月曜日

MCU Gear をRaspberry Pi とPythonで使ってみる。

MCU Gear用の初心者向けPython サンプルプログラムを作りました。

Pythonを使うことで、Raspberry Pi の GPIOのピンアサインを見なくともモジュールに信号線を割り当てることができるようになりました。


インストール方法はこちら


ホームページからダウンロードしたファイルを解凍し、

点滅プログラムを見てみましょう。

BlinkLEDフォルダにあるsample.pyの解説です。



基本的な流れ

1、初期化部分(コピーアンドペーストして使ってください。)
2、モジュールの初設定 ピンはモジュール定義のカッコ内に追加すればモジュール端子の0番、1番、2番…と増やせます。
例えば
,p.outpin[0], p.outpin[1], p.inpin[0]....)など 1モジュールあたり最大8端子割り当てられます。 


出力ピンの最大値は6つ
p.outpin[0]、p.outpin[1]、p.outpin[2]、p.outpin[3]、p.outpin[4]、p.outpin[5]
入力ピンの最大値は2つ(何もつなげないと入力がLOWとなるので、スイッチなどを使う場合はHigh信号を与えてください)
p.inpin[0]、p.inpin[1]

SPIバスは import spidev を追加して

p.MISO、p.MOSI、p.SCLK、p.CE0


I2Cバスはモジュールには配線せずに、コネクタから出ているSDA SCLに直接接続してください。

ただしアドレスが競合しないように注意してください。
また、競合する場合はマルチファンクションモジュールで別系統のI2Cバスを増設できます。

UART端子は動作させるサンプルを用意していませんが、p.TX、p.RX で割り当てることができます。

設定、動作に関してはこちらを参考に設定できます。http://mcugear.blogspot.jp/2014/01/raspberry-pipython-uart.html


3、モジュールとの接続connect()と切断disconnect()で動作中に配線切替ができます。




#!/usr/bin/python このファイルがPythonの物と明示してください

import MCUGear MCU Gear のベースボードに関するプログラムが入っています
import MCUGearModule モジュールへの配線に関するプログラムが入っています
import p GPIOピン設定に関するプログラムが入っています

import RPi.GPIO as GPIO Raspberry Pi のGPIOを動かすプログラムが入っています

import time 時間に関するプログラムが入っています

if __name__=='__main__': メイン関数

#Start--------
try: とりあえず試しに以下のプログラムを動かしてみて、[ctrl]+ [C]を押して終了する
print("If you want to finish, press [ctrl]+ [C] \n")
#setup IOs-----
GPIO.setmode(GPIO.BCM) GPIOを使います
for var in range(0,len(p.inpin)-1): GPIOの入力を設定(通常このままコピペ)
GPIO.setup(p.inpin[var], GPIO.IN) 
for var in range(0,len(p.outpin)-1): GPIOの出力を設定(通常このままコピペ)
GPIO.setup(p.outpin[var], GPIO.OUT) #set outpin as a output
MCUGear.initBase() ベースボードの初期化

#Universal Module address & IO Setting-------------
UNI = MCUGearModule.MCUGearModule(MCUGear.N_VDD_VDD_VDD,p.outpin[0])
 1、好きな名前(ここではUNI)という名前でユニバーサル基板を定義します。
 2、ユニバーサルモジュール基板裏面のアドレス設定 (AD2=3.3V AD1=3.3V AD0=3.3V) N_VDD_VDD_VDD
 3、「モジュールの0番端子にp.out[0]出力を割り当てる。」という処理をしています。

#loop-----

while True: ループ

UNI.connect() Raspberry Piの端子 とモジュール端子とを接続
GPIO.output(p.outpin[0], True) 先ほど設定したp.out[0]を HIGH にします
time.sleep(0.5) 0.5秒待ちます
GPIO.output(p.outpin[0], False) 先ほど設定したp.out[0]を LOW にします
time.sleep(0.5) 0.5秒待ちます
UNI.disconnect() Raspberry Piの端子 とモジュール端子とを切断

except KeyboardInterrupt: tryから続いています[ctrl]+ [C]を押したら以下を実行して終了します。
print("detect key interrupt [ctrl]+ [C] \n")
UNI.disconnect() 念のためもう一度切断
GPIO.cleanup() Raspberry PiからGPIOの制御を一時無効にする
print("Program exit\n")

2013年12月6日金曜日

MCU Gear と Arduino 互換機との接続成功

Arduino互換機Seeeduino の少ないメモリー(SRAM)でもMCU Gearを6つ動かすことに成功しました。
Arduino IDE のシリアル通信を使うと、メモリーが非常に消費することがわかりましたので、今回はシリアル通信を使っていません。

他にもメモリーをあまり気にせずに使うには、モジュールのインスタンスを一つだけ生成して、PCに配線情報を保持してシリアルのコマンドインスタンスの配線情報を書き換えながら動作させる方法が考えられますが、それは後日試そうかと思います。


また、プログラムの使い方によってもモジュールの積層数は変動しますので、いろいろ試してみてください。

また、その他のファイルも大幅に削除したため、機能が単純になりました。
(5V系ボードを使う場合は電圧レベル変換基板を必ず使ってください。)
レベル変換基板のテストは前回のブログで紹介しました。
http://mcugear.blogspot.jp/2013/10/mcu-gear-5v-16mhz.html

レベル変換基板の販売準備をしようと思います。 サンプルプログラム





後日プログラムの詳しい解説をします。

2013年9月1日日曜日

MCU Gear のプログラム:その2 mbed FRDM KL25Z 編

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

MCUGear® のサンプルプログラムを参考に簡単な動作説明をします。
多少説明が間違っているかもしれません、その場合予告なく修正する可能性がありますのでご容赦ください。
かなり詳しく説明したつもりです。パッと見、分量が多い様ですが当たり前のことも多く書いています。気長に読んでみてください。
また、ここにも細かな注意点が書いてあります。

まずはスイッチを読んでLEDを光らせるというところをやりたいと思います。

目標は動画のような雰囲気です。
KL25Zはベースボードの下のマイコンボードに取り付けます。動画はイメージです


回路のイメージは以下のような雰囲気です。青い小さな四角は抵抗です。LEDに+3.3Vか+5V(ユニバーサルモジュールは5Vトレラント入力対応です)をかけて抵抗は220Ω、スイッチに1KΩ使ってます。LEDの種類によっては変化しますので適宜計算してみてください。

この回路を実現するための再配線をしてみましょう。




まず設定の確認をしましょう。
mbedのwebコンパイラはデバイスを選択できるようにコンパイラ画面右上にデバイス選択ボタンが用意されています。それを押してKL25Zを選んでください。

次にMCUGearライブラリのcommon.hを使いたいデバイスと合わせてください。
//select your mbed--------------------------------------------
//#define LPC1768_mbed
#define FS_KL25Z


最も基本的なユニバーサルモジュール2だけを使ってみましょう。
KL25Zのサンプルコードのmain.c を順番に見ていきましょう。

#include "MCUGearBase.h"

#include "MCUGear.h"
#include "common.h"
MCUGearのライブラリがあることを確認して、プログラムをインクルードしています。

MCUGear Uni2M(PTE0, PTE1, N_VDD_VDD_VDD,8);
これはMCUGearのモジュールを定義する部分です
MUCGear クラス(色々と設定情報などの塊と考えておいてください。)をUni2M という名前で定義して生成します。
かっこ内は
PTE0, PTE1 : I2Cの端子(専用のマイコンボードを使う限りはこのままです。)
N_VDD_VDD_VDD : はモジュールの下の設定したアドレスのを入れます。AD2 AD1 AD0 の順番に書き込んでください。VDD = +3V3、 VSS = GND と定義されているので覚えておいてください。また「N_」は コントロール用のI2CデバイスPCA9674、「A_」は  コントロール用のI2CデバイスPCA9674Aを表しています。
※A_VDD_VSS_VSSはベースボードのアドレスとかぶってしまうので設定できません。
8 :これはこのモジュールで使用するピン数を指定します。今回の回路では8ピン必要ですので8と入れてます。




DigitalOut Dout(PTA13);

DigitalOut Dout1(PTA1);
DigitalOut Dout2(PTA2);
DigitalOut Dout3(PTD4);
DigitalOut Dout4(PTA12);
DigitalOut Dout5(PTA4);
DigitalIn Din1(PTB0);
DigitalIn Din2(PTB1);
ここではKL25Z本来の端子の設定を行っています。

void IOUni2M(MCUGear *mcugear);    
プロトタイプ宣言 「こんな関数がここでは用意されてますよ」とあらかじめ宣言して浸透させておくというイメージで考えてください。

initBase(); //initialize Baseboard
これはベースボードの初期化をするところです。興味のある方は中身をのぞいてみてください。とりあえずおまじないだと思って通り過ぎてください。

IOUni2M(&Uni2M);
ここでは、先ほど生成したUni2M のIOの設定をしています。
では、IOUni2M 関数内部を見てみましょう。

void IOUni2M(MCUGear *mcugear){

    uint8_t fio[12];

    // detect SHM
    mcugear->detect_module(fio);
    
    //PTA1, PTA2, PTD4, PTA12, PTA4, PTA5, PTC8
    mcugear->savePinSetting(0, IO_MBED_PTB0, IO_REG_IN_DIR, fio[0]);
    mcugear->savePinSetting(1, IO_MBED_PTB1, IO_REG_IN_DIR, fio[1]);
    mcugear->savePinSetting(2, IO_MBED_PTA13, IO_REG_OUT_DIR, fio[2]);
    mcugear->savePinSetting(3, IO_MBED_PTA1, IO_REG_OUT_DIR, fio[3]);
    mcugear->savePinSetting(4, IO_MBED_PTA2, IO_REG_OUT_DIR, fio[4]);
    mcugear->savePinSetting(5, IO_MBED_PTD4, IO_REG_OUT_DIR, fio[5]);
    mcugear->savePinSetting(6, IO_MBED_PTA12, IO_REG_OUT_DIR, fio[6]);
    mcugear->savePinSetting(7, IO_MBED_PTA4, IO_REG_OUT_DIR, fio[7]);

#ifdef BOOST_MODE
    mcugear->makeCircuit();
#endif

}


オリジナルの設定を作るときは、以下の手順を順番に行ってください。

1、mcugear->detect_module(fio); を使ってモジュールの位置を把握し登録します。配列は8bit のuint8_t 12個の配列を使います。

2、mcugear->savePinSetting(0, IO_MBED_PTB0, IO_REG_IN_DIR, fio[0]);  //input
   ・・・
     mcugear->savePinSetting(2, IO_MBED_PTB1, IO_REG_OUT_DIR, fio[2]);
   ・・・
 は指定したモジュールの0番ピンにKL25Zのどの端子番号を割り振ったかを入れます。最後の IO_REG_OUT_DIR はどの出力ピンを割り振りますという意味です。これが入力ピンであれば IO_REG_IN_DIR と記載してください。
ここでは0と1番にinput 残りはoutputに設定しています。

3、
 #ifdef BOOST_MODE
    mcugear->makeCircuit();
#endif

オーバーヘッドを極力減らし自動化したモードです。(慣れてきてから試してみてください)
MCUGearにはバンクというレイヤーのようなものが存在しています。これは再配線する祭に、あらかじめ決まった配線をベースボードに登録しておき、レイヤーの切り替え命令だけで高速に配線を切り替えるためのものです。Bankは0~7まで設定できます。KL25Zのサンプルプログラムでは自動的に動作させることができますが、多くのモジュールを使うとバンクが足りなくなるので通常モードのモジュールそして動作します。
common.h
#define BOOST_MODE //if you want use BANK System, define this.
を定義すると動きます。
また、バンク部分のプログラムを作り替えるときは、複雑な動きをするので上級者向けです。(「マイコン端子の分岐は出来ない」ということを考えながら使ってください。)



int SW1,SW2;
タクトスイッチの入力信号を一旦保存するための変数です。

while(1){
次にmain関数のループ部分に入ります。
まずモジュールに接続前にIOの状態をどうしたいのかを常に考えましょう。
そのまま接続すると、仮に別のモジュールで同じピンを使っていたら、そのままデバイスに伝えてしまうことになります。事前にIOの状態はHighにしたいので以下のように記述しておきます。

       Dout = 1;
       Dout1 = 1;
       Dout2 = 1;
       Dout3 = 1;
       Dout4 = 1;
       Dout5 = 1;

次にモジュールと接続してみましょう。


 Uni2M.connectModule();
モジュールとマイコンを配線する関数です。先ほどのUni2Mと定義したものを使います。
この処理が終わるとすでにマイコンとユニバーサルモジュールの接続が確立されています。
通常のデジタル回路だと考えてください。

       SW1 = Din1.read();
       SW2 = Din2.read();

まずは0番、1番ピンにスイッチを押すとグランドに落ちるような回路ををブレッドボードにつないでください。GNDで落とすときは適当な抵抗を挟みましょう。

ここでは、0番にP9 と 1番にP10がつながっていて、結果をwhile(1)の前で定義したSW1 とSW2に保存しています。

出力確認のLEDは+3.3Vから抵抗とLEDを取り付け、最後にIOにつなげます。IOがLowになると光る仕組みです。





スイッチ0がGNDに落ちるとLEDが光ります。



       if(SW1 == 1){
            Dout = 1;
            Dout2 = 1;
            Dout3 = 1;
       }else{
            Dout = 0;
            Dout2 = 0;
            Dout3 = 0;
       }


       if(SW2 == 1){
            Dout1 = 1;
            Dout4 = 1;
            Dout5 = 1;
       }else{
            Dout1 = 0;
            Dout4 = 0;
            Dout5 = 0;
       }

wait(1000);等を途中途中に入れると処理の様子をじっくり見れます。


Uni2M.disconnectModule();
最後にモジュールのゲートを閉じる処理をします。


後は同様に
Uni2M.connectModule();

従来のデジタル回路の処理

Uni2M.disconnectModule();





という動きを繰り返すだけです。

MCU Gearのプログラム:その2 mbed LPC1768編

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

MCUGear® のサンプルプログラムを参考に簡単な動作説明をします。
多少説明が間違っているかもしれません、その場合予告なく修正する可能性がありますのでご容赦ください。
かなり詳しく説明したつもりです。パッと見、分量が多い様ですが当たり前のことも多く書いています。気長に読んでみてください。

まずはスイッチを読んでLEDを光らせるというところをやりたいと思います。

目標は動画のような雰囲気です。
mbedはベースボードの下のマイコンボードに入れます。





回路のイメージは以下のような雰囲気です。青い小さな四角は抵抗です。LEDに+3.3Vか+5V(ユニバーサルモジュールは5Vトレラント入力対応です)をかけて抵抗は220Ω、スイッチに1KΩ使ってます。LEDの種類によっては変化しますので適宜計算してみてください。

この回路を実現するための再配線をしてみましょう。



まず設定の確認をしましょう。
mbedのwebコンパイラはデバイスを選択できるようにコンパイラ画面右上にデバイス選択ボタンが用意されています。それを押してLPC1768を選んでください。

次にMCUGearライブラリのcommon.hを使いたいデバイスと合わせてください。
//select your mbed--------------------------------------------
#define LPC1768_mbed

//#define FS_KL25Z


最も基本的なユニバーサルモジュール2だけを使ってみましょう。
mbedのサンプルコードのmain.c を順番に見ていきましょう。

#include "MCUGearBase.h"

#include "MCUGear.h"
#include "common.h"
MCUGearのライブラリがあることを確認して、プログラムをインクルードしています。

MCUGear Uni2M(p28, p27, N_VDD_VDD_VDD,8);
これはMCUGearのモジュールを定義する部分です
MUCGear クラス(色々と設定情報などの塊と考えておいてください。)をUni2M という名前で定義して生成します。
かっこ内は
p28, p27 : I2Cの端子(専用のマイコンボードを使う限りはこのままです。)
N_VDD_VDD_VDD : はモジュールの下の設定したアドレスのを入れます。AD2 AD1 AD0 の順番に書き込んでください。VDD = +3V3、 VSS = GND と定義されているので覚えておいてください。また「N_」は コントロール用のI2CデバイスPCA9674、「A_」は  コントロール用のI2CデバイスPCA9674Aを表しています。
※A_VDD_VSS_VSSはベースボードのアドレスとかぶってしまうので設定できません。
8 :これはこのモジュールで使用するピン数を指定します。今回の回路では8ピン必要ですので8と入れてます。





DigitalOut Dout(p15);
DigitalOut Dout1(p16);
DigitalOut Dout2(p21);
DigitalOut Dout3(p22);
DigitalOut Dout4(p23);
DigitalOut Dout5(p24);
DigitalIn Din1(p9);
DigitalIn Din2(p10);
ここではmbed本来の端子の設定を行っています。

void IOUni2M(MCUGear *mcugear);    
プロトタイプ宣言 「こんな関数がここでは用意されてますよ」とあらかじめ宣言して浸透させておくというイメージで考えてください。

initBase(); //initialize Baseboard
これはベースボードの初期化をするところです。興味のある方は中身をのぞいてみてください。とりあえずおまじないだと思って通り過ぎてください。

IOUni2M(&Uni2M);
ここでは、先ほど生成したUni2M のIOの設定をしています。
では、IOUni2M 関数内部を見てみましょう。

oid IOUni2M(MCUGear *mcugear){

    uint8_t fio[12];
    // detect
    mcugear->detect_module(fio);

    mcugear->savePinSetting(0, IO_MBED_P9, IO_REG_IN_DIR, fio[0]);  //input
    mcugear->savePinSetting(1, IO_MBED_P10, IO_REG_IN_DIR, fio[1]); //input
    mcugear->savePinSetting(2, IO_MBED_P15, IO_REG_OUT_DIR, fio[2]);
    mcugear->savePinSetting(3, IO_MBED_P16, IO_REG_OUT_DIR, fio[3]);
    mcugear->savePinSetting(4, IO_MBED_P21, IO_REG_OUT_DIR, fio[4]);
    mcugear->savePinSetting(5, IO_MBED_P22, IO_REG_OUT_DIR, fio[5]);
    mcugear->savePinSetting(6, IO_MBED_P23, IO_REG_OUT_DIR, fio[6]);
    mcugear->savePinSetting(7, IO_MBED_P24, IO_REG_OUT_DIR, fio[7]);

#ifdef BOOST_MODE
    mcugear->makeCircuit();
#endif

}

オリジナルの設定を作るときは、以下の手順を順番に行ってください。

1、mcugear->detect_module(fio); を使ってモジュールの位置を把握し登録します。配列は8bit のuint8_t 12個の配列を使います。

2、mcugear->savePinSetting(0, IO_MBED_P9, IO_REG_IN_DIR, fio[0]);  //input
   ・・・
     mcugear->savePinSetting(2, IO_MBED_P15, IO_REG_OUT_DIR, fio[2]);
   ・・・
 は指定したモジュールの0番ピンにmbedのどの端子番号を割り振ったかを入れます。最後の IO_REG_OUT_DIR はどの出力ピンを割り振りますという意味です。これが入力ピンであれば IO_REG_IN_DIR と記載してください。
ここでは0と1番にinput 残りはoutputに設定しています。

3、
 #ifdef BOOST_MODE
    mcugear->makeCircuit();
#endif

オーバーヘッドを極力減らし自動化したモードです。(慣れてきてから試してみてください)
MCUGearにはバンクというレイヤーのようなものが存在しています。これは再配線する祭に、あらかじめ決まった配線をベースボードに登録しておき、レイヤーの切り替え命令だけで高速に配線を切り替えるためのものです。Bankは0~7まで設定できます。mbedのサンプルプログラムでは自動的に動作させることができますが、多くのモジュールを使うとバンクが足りなくなるので通常モードのモジュールそして動作します。
common.h
#define BOOST_MODE //if you want use BANK System, define this.
を定義すると動きます。
また、バンク部分のプログラムを作り替えるときは、複雑な動きをするので上級者向けです。(「マイコン端子の分岐は出来ない」ということを考えながら使ってください。)



int SW1,SW2;
タクトスイッチの入力信号を一旦保存するための変数です。

while(1){
次にmain関数のループ部分に入ります。
まずモジュールに接続前にIOの状態をどうしたいのかを常に考えましょう。
そのまま接続すると、仮に別のモジュールで同じピンを使っていたら、そのままデバイスに伝えてしまうことになります。事前にIOの状態はHighにしたいので以下のように記述しておきます。

       Dout = 1;
       Dout1 = 1;
       Dout2 = 1;
       Dout3 = 1;
       Dout4 = 1;
       Dout5 = 1;

次にモジュールと接続してみましょう。


 Uni2M.connectModule();
モジュールとマイコンを配線する関数です。先ほどのUni2Mと定義したものを使います。
この処理が終わるとすでにマイコンとユニバーサルモジュールの接続が確立されています。
通常のデジタル回路だと考えてください。

       SW1 = Din1.read();
       SW2 = Din2.read();

まずは0番、1番ピンにスイッチを押すとグランドに落ちるような回路ををブレッドボードにつないでください。GNDで落とすときは適当な抵抗を挟みましょう。

ここでは、0番にP9 と 1番にP10がつながっていて、結果をwhile(1)の前で定義したSW1 とSW2に保存しています。

出力確認のLEDは+3.3Vから抵抗とLEDを取り付け、最後にIOにつなげます。IOがLowになると光る仕組みです。





スイッチ0がGNDに落ちるとLEDが光ります。



       if(SW1 == 1){
            Dout = 1;
            Dout2 = 1;
            Dout3 = 1;
       }else{
            Dout = 0;
            Dout2 = 0;
            Dout3 = 0;
       }


       if(SW2 == 1){
            Dout1 = 1;
            Dout4 = 1;
            Dout5 = 1;
       }else{
            Dout1 = 0;
            Dout4 = 0;
            Dout5 = 0;
       }

wait(1000);等を途中途中に入れると処理の様子をじっくり見れます。


Uni2M.disconnectModule();
最後にモジュールのゲートを閉じる処理をします。


後は同様に
Uni2M.connectModule();

従来のデジタル回路の処理

Uni2M.disconnectModule();

という動きを繰り返すだけです。