2017年06月23日

磁気エンコーダTLE5012B その2

紹介しました。

TLE5012Bの問題点はSPIインタフェース互換のSSCという通信方式で
MOSIとMISOが1つで双方向に通信を行います。

前回はMOSIとMISOに抵抗を挟んで通信しましたが、
STM32のHALライブラリにはSSCに対応したHalf Duplexモードがあるため、
そちらを使用して通信してみました。

CubeMXではHalf Duplex Masterとして設定します。
SPI.png


配線ではMISOは使用せず、
MOSIのみで双方向に通信します。
1本のみの通信のため、抵抗値を0にしています。

SPI-HalfDuplex.png



コードは下記の通りです。

uint16_t GetEncPos(){
 uint8_t    sData[6];
  uint8_t rData[6];
  uint8_t rCRCBuff[12];
  uint16_t res;

 HAL_GPIO_WritePin(ENC_CS1_GPIO_Port, ENC_CS1_Pin,0);//CS
 sData[0]=0x80;sData[1]=0x21;
 HAL_SPI_Transmit(&hspi1,sData,2,500);


 sData[0]=0x00;sData[1]=0x00;sData[2]=0x00;sData[3]=0x00;
 rData[0]=0;rData[1]=0;rData[2]=0;rData[3]=0;

 for(int i=0; i<1; i++)asm("nop");//Point

 HAL_SPI_Receive(&hspi1,(uint8_t*)&rData,4,500);

 HAL_GPIO_WritePin(ENC_CS1_GPIO_Port, ENC_CS1_Pin,1);//CS

 uint8_t rCRC;//CRC from Recieve data
  uint8_t dCRC;//Calc CRC from Data

   rCRCBuff[0]=0x80;
   rCRCBuff[1]=0x21;
   rCRCBuff[2]=rData[0];
   rCRCBuff[3]=rData[1];

   rCRC=rData[3];
   dCRC=GetCRC8(rCRCBuff, 4);//CRC check
   
    if(rCRC!=dCRC){
        ENC_Err_Count++;
        return 0;
    }
 
 res =(rData[0]<<8)+rData[1];
 return  0x7FFF&res;
}

uint8_t GetCRC8(uint8_t *buff, size_t size )
{
    uint8_t crc=0xFF;
    uint8_t i;

    while(size--){
        crc^= *buff++;
        for(i=0;i<8;i++){
            crc=crc&0x80?(crc<<1)^0x1d:crc<<1;
        }

    }
    return (~crc)&0xFF;
}

以前紹介したコードとの差はHalf Duplex Masterのため、
HAL_SPI_TransmitReceiveを使用せずに
HAL_SPI_ReceiveとHAL_SPI_Transmitを使用している点です。
自動的にMOSIの入出力がHALライブラリ内で切り替わります。
また、SafetyWordのCRCチェックを行っています。



実際に高速で通信した際に
角度読み出しコマンド実行後にすぐに角度を読み出すと、
正しい値を返さない現象が発生しました。
Infineonのフォーラムでも同じような不具合のディスカッションがされており、
角度読み出しコマンド実行後に10us待ってから読み出すことが重要なようです@2MHz


tle5012.jpg


実際にFullDuplexMasterで以前紹介したようなMOSIとMISOを使用する配線で
10us待つためには
sData[0]=0x80;sData[1]=0x21;
HAL_SPI_TransmitReceive(&hspi1,sData,rData,2,200);
sData[0]=0x00;sData[1]=0x00;sData[2]=0x00;sData[3]=0x00;
rData[0]=0;rData[1]=0;rData[2]=0;rData[3]=0;
HAL_SPI_Receive(&hspi1,(uint8_t*)&rData,4,200);
とすると丁度良い待ち時間になりました。


通信クロックに関して、
FullDuplexMasterではSPIクロック最大2MHz、
HalfDuplexMasterではSPIクロック最大4MHzという結果でした。
8MHzではビット読み違いが多発し、CRCチェックで値が落ちて通信できませんでした。



最終的に値取得周期は
TLE5012Bが2個、FullDuplexMaster@2MHzで約120us
TLE5012Bが2個、HalfDuplexMaster@4MHzで約100us
という結果となりました。


値読み出しコマンドとSafetyWord分の通信が必要なため、
1回の通信で8bit x 6回の通信が必要です。
SafetyWordを読み込まない場合でも8bit x 4回の通信が必要です。

TLE5012Bは内部更新周期42.7usで読み出すためには
SPIクロックを8MHzにしてなんとか実現可能なレベルということが分かりました。
AMS社のAS5048Aでは8bit x 2回の通信で済むため、
比べると通信量が多いことが分かります。



安さと15bit分解能、フィルタ内蔵というのは良いですが
SSCインタフェース、通信量の多さ、
角度読み出しコマンド後の待機時間の曖昧さには要注意です。


タグ:部品 STM32 HAL
posted by Crescent at 00:00| Comment(0) | TrackBack(0) | 電子部品 | このブログの読者になる | 更新情報をチェックする

2017年06月05日

STM32F746DISCO筺体ケース

今回はSTM32マイコンと3Dプリンタの活用例を紹介します。



STM32F746DISCOはROM1MByte、RAM340kByte、
静電容量タッチパネル付4.3インチLCD、
外部SDRAM8MByte(LCDバッファ共用で実際に使用できるのは7MB程度)、
Ethernetポート、Arduino端子、
microSDスロットなどが最初から搭載しており、
STM32F7シリーズの入門機種として最適です。

スイッチサイエンス秋月電子で取扱があります。




ただ、基板に足のみしか付属していないため、
開発中の不意の落下で壊れてしまう可能性もあります。

今回は3Dプリンタを活用してケースを設計、作成してみました。

LCDプロテクタ

top.jpg

筺体ケース


case.jpg




実際に3Dプリンタで印刷してみました。
筺体サイズ幅が12cm超のため、
家庭用の3Dプリンタでは印刷できない機種も多いかもしれません。

設計はRS DesignSpark Mechanical 2015で設計を行い、
プロジェクトデータ及びSTLデータはgithubで公開しております。



disco.JPG


上記の写真は3Dプリンタで出力した筺体と
STM32F746DISCOに友人が開発した
SerialPlotterのファームを書き込んだ例です。

uGUIという組込マイコン向けのフリーのGUIライブラリを活用したSerialPlotterです。
uGUIはフリーでコードまで完全に公開されているGUIライブラリで
LCDや有機EL、電子ペーパーなどにも使用可能で
汎用性や移植性が非常に高く、優れたGUIライブラリです。
この辺は後日、詳細について紹介します。



また、今回、幅10cm、厚さ2cmを超えるものを初めてABS樹脂で印刷しましたが、
印刷中の反りに悩まされました。
この反りの回避方法についても後日、紹介します。


___________________
LCDプロテクタと筺体ケース提供のお知らせ
STM32F746DISCO用ケースセット 
2,500円(送料込)
※3Dプリンタ印刷のため、
角の反りなど個体差があります。
※在庫無くなり次第提供終了します。
※メールもしくはメッセージにて承ります。
___________________
posted by Crescent at 00:00| Comment(0) | TrackBack(0) | 電子部品 | このブログの読者になる | 更新情報をチェックする

2017年05月07日

圧電マイクロブロア

先日から秋月電子で取扱を始めた
圧電マイクロブロアについて紹介します。


モータや電磁石等を使用するブロアと異なり、
圧電素子を使用しているため、
消費電力かつ動作音がほぼ無音です。

piezo_pump.png



村田製作所のwebサイトでは
圧電マイクロブロアの応用例が色々紹介されていました。


空気やシリンジ等を動かすポンプ以外にも
ホバークラフトのエア駆動源など思った以上にパワフルです。


駆動回路としては
初期の仕様書にはオペアンプで発振回路を作成し、
PNPとNPNのトランジスタで切り替えするような回路でしたが、
秋月電子のサイトにN555で駆動させる回路例があったため、
N555で実際に回路を作成して実験してみました。

N555.jpg


駆動回路と関係ない部品も一部ありますが、
N555は電圧も最大15V程度まで、電流も200mA程度取り出せるため、
PNP、NPN等のトランジスタは不要でそのまま駆動できます。


共振周波数が約26kHz前後なようで、
駆動回路の周波数を共振周波数に合わせる必要があります。


実際に上記の回路に9V電源を最初に供給したところ、
駆動回路の周波数が10kHz程度だったため、
完全に「ピー」というブザーのような音が鳴り驚きました。

考えたら駆動源は圧電素子なので、
ブザーになるのは当たり前ですが...

駆動回路の可変抵抗を調整し、
周波数を上げていくと、
超音波となり、
あるところで急に「シー」という
エアの音が出ます。

丁度、その点が共振周波数約26kHzなようです。

共振周波数に一致して「シー」という音が鳴ると
穴の部分からエアが出ていることが唇等に近付けることで分かりました。

指先では少し分かりずらい感じでした。
電圧を上げればはっきり分かると思います。


それ以外の周波数では、共振周波数に一致しないため、
穴からはエアは全く出ず、単なるスピーカという感じです笑


熱収縮チューブを加工して、
繋いでコップの水にエアを供給してみました。




電圧が9Vと少し低いことと、
熱収縮チューブに少し隙間があるため、
弱いですが、エアが連続して出ていることが確認できました。


エアの出る部分の突起が小さいため、
チューブ等の取り付けが少し面倒です。


ただ、これまでのポンプやブロアに比べ、
消費電力が少なく、無音なため、
簡単な昇圧回路とマイコンを組み合わせて、
PWMでパワーの調整ができれば、
ON/OFFではできないような面白い制御ができそうです。


簡単に使えることが分かったので、
今後は圧電マイクロブロアを使って
何かしらの面白いデバイスを考えてみたいと思います。

タグ:部品
posted by Crescent at 00:00| Comment(0) | TrackBack(0) | 電子部品 | このブログの読者になる | 更新情報をチェックする

2017年04月07日

OLED試食

Amazonで販売されているOLED(有機EL液晶)を試食してみました。




sIMG_4342.png

画面サイズは人差し指程度ですが、
思った以上にはっきりと表示され、
遠くからの視認性も良さそうです。



sIMG_4341.png

上の部分が一部黄色に表示され、
それ以外が青色表示なようです。
そのため、表示位置によっては黄色と青色の中途半端な表示になってしまいます。


R3を開放、R1、R8の抵抗を追加します。


配線はD0をSCL、D1をSDAに接続します。
RESをHigh、CSをGNDに接続することです。
解放では動作しませんでした...



RESは場合によっては電源投入後にLOWからHIGHにする必要があるようですが、
今回は常にHIGHでも動作しました。

全体が一色の方が使い勝手が良さそうだと思いました。



0.91インチI2C有機ELディスプレイ128x32の方が大きさが小さく、
RESやCS等の配線、チップ抵抗変更も不要なため、
基板上に邪魔にならずに簡単に実装でき、
情報表示用途には最適だと思いました。



posted by Crescent at 00:00| Comment(0) | TrackBack(0) | 電子部品 | このブログの読者になる | 更新情報をチェックする

2017年03月12日

ハードボタンやNTPを使わない時刻設定方法

次世代のProjectionBallの開発で時計を
プロジェクションできる機能の実装で
時刻の設定方法の工夫について今回は紹介します。



次世代のProjectionBallでは
遠隔での操作やスマートフォンからの操作を実現するため、
Wifiモジュール、ESP-WROOM-02を搭載する予定です。



また、ESP-WROOM-02では
時刻をプロジェクションするためのRTCを搭載していないため、
ProjectionBall側の本体マイコンでRTC機能を実装し、時刻を管理します。


この場合、どこから本体マイコンRTCの時刻設定をするか悩む点です。


一般的な方法としては
@本体に時刻設定ボタンを作る
  ×→ボタン数が増え、表示インタフェースが必要
AESP-WROOM-02経由でブラウザから時刻を打ち込んでもらう
  ×→時刻を打ち込むのが面倒
BESP-WROOM-02経由でNTPを使用して時刻を取得
  ×→インターネットに接続されていない場合の時刻設定ができない、海外対応が面倒

といった感じでどれもProjectionBallでは非現実的な感じです。


そこで工夫した点として、
「Aブラウザ経由で時刻を打ち込む」の方法を改良し、
「端末上のブラウザ画面でブラウザから時刻を取得する」という方法です。
つまり、javascriptで端末の時刻取得を行い、
ESP-WROOM-02へ時刻文字列を送信する方法です。


この場合、時刻設定のハードボタンが不要、
NPTサーバから取得する必要もありません。
また、ESP-WROOM-02自体が
インターネットに接続されていなくても時刻設定可能です。


ほとんどのユーザーがスマートフォンやPCからアクセスするため、
スマートフォンやPCの時刻をブラウザ経由で取得してしまえば、
夏時間でも海外でもスムーズに時刻取得できます。



自動的にブラウザから取得した時刻が表示されるため、
ユーザーは設定ボタンを押すだけです。



wifi.png

スマートフォンやPCのブラウザ画面から
ESP-WROOM-02へアクセスする画面に
時刻取得のスクリプトが書かれており、
自動的に時刻や日付の文字列が更新されます。



「Send」ボタンを押すことで
時刻や日付が文字列としてESP-WROOM-02へ送信されます。


ESP-WROOM-02は時刻情報を受けると、
そのままProjectionBall側の本体マイコンへ時刻情報を送り、
本体マイコンがRTCを設定します。



実際に表示される画面に入れたスクリプトは下記の通り。


  t=0;           
  function dsptime() {
     DD = new Date();
     Year = ('00'+ DD.getFullYear()).slice(-2);
     Month =('00'+ (DD.getMonth() + 1)).slice(-2);
     Day    = ('00'+ DD.getDate()).slice(-2);
     Hours = ('00'+ DD.getHours()).slice(-2);
     Minutes = ('00'+ DD.getMinutes()).slice(-2);
     Seconds = ('00'+ DD.getSeconds()).slice(-2);               
     document.getElementById("settimetext").value
                    = ""+Hours + Minutes + Seconds;
   document.getElementById("setdatetext").value
                    = ""+Year + Month + Day;
 }
 t = setInterval("dsptime()", 500);

0.5秒ごとに自動的に時刻や日付の欄を更新する。


実際にESP-WROOM-02へ組込んで使用しているプログラム例は
Githubへアップしてあります。



このような工夫で低コストで汎用的な時刻設定が実現できました。
ウェブアプリ、ブラウザベースならではの設定方法だと思います。
ぜひ、WifiモジュールとRTCを使用した機器の組み合わせの場合に活用してみてください。
posted by Crescent at 00:00| Comment(0) | TrackBack(0) | 電子部品 | このブログの読者になる | 更新情報をチェックする