2019年05月25日

マイコン内蔵フルカラーLED DotStar

マイコン内蔵フルカラーLEDといえば、WS2811、WS2812といったNeopixelが有名です。
今回、紹介するのはDotStarというマイコン内蔵フルカラーLEDです。

ざっくりと比較すると、通信方式とリフレッシュレートが異なるようです。


 通信方式
リフレッシュレート
NeopixelUart互換400Hz
DotStarSPI互換19.2kHz


NeopixelではUartに近い通信のため、貧弱なマイコンでは処理が間に合わない場合や間に合わせるために機械語で記述するなど工夫が必要でした。
一方、DotStarはSPIで通信できるため、クロック入力があり、比較的マイコンに合わせて処理できます。
この点では非常に扱いやすいマイコン 内蔵フルカラーLEDです。


実際に動かしてみると簡単に制御することができました。

dotstar.JPG

Neopixcelに比べるとまだ種類は少ないものの、SPI通信で簡単に制御できるDotStarはなかなか魅力的です。
リフレッシュレートが高いメリットを活かして遊んでみたい思います。

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

2019年05月18日

PCB電磁石

簡単なアクチュエータを作りたいと思い、PCBを使って電磁石を設計してみました。

約35mm x 約35mmのサイズで配線幅0.3mmで両面配線しました。多層基板等使えば、磁力は強められますが、コストの兼ね合いで両面基板を選択しました。基板厚を一般的な1.6mmでなく、0.6mmを使用することで軽く重ねても使用できるようにしてみました。


IMG_7514.JPG


配線幅0.3mmにつき、最大電流約300mA
両面で約60回巻、抵抗値10.2Ωとなりました。


5v印加で500mAの電流が流れるため、流れ過ぎな感じですが、ほんのり温かくなる程度で電磁石としての機能を確認することができました。
PWMでマイコン制御できそうです。電磁石は部品として購入すると入手性やコスト面で難がありますが、PCB基板で実装できれば解決できます。これらの電磁石を組み込んで小型なロボット?的なものを考えてみたいと思います。

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

2019年05月11日

STM32 Cube.AI 試食 その2 XOR

前回はSTM32 Cube.AIの紹介動画をベースに使い方を紹介しました。

前回は学習済モデルを使用したため、あまりAIやってる感がありませんでしたが、今回は実際の開発フローと同じように学習から推論まで行ってみました。

TensorflowとKeras、STM32Cube.AIを使って、XORの論理演算を学習させ、STM32マイコンで推論させてみました。
ターゲットマイコンとしてSTM32F747G-Discoveryを使用しました。

【準備物】

・STM32F747G-Discovery
・KerasとTensorflowインストール済みのPython3環境
・STMCubeMX5.1& Cube.AIパッケージv3.4
・SW4STM32やTrue Studioなどの開発環境


■PCでXOR論理演算学習
@XOR論理演算を学習させます。
 KerasとTensorflowインストール済みの環境でXOR.pyコードを実行します。
 「python XOR.py」
 学習させた結果、accが最終的に1になっていることを確認してください。
 0.75といったように1になっていない場合は何度か実行し直してください。

 また、最後に学習モデルを使って推論を実行しています。
 [0,0]、[0,1]、[1,0]、[1,1]をテストデータとしてそれぞれ与えており、
 0,1,1,0と表示されれば、XORの推論ができていることが分かります。


A学習モデルの保存
 コード実行後はコードと同じディレクトリにモデルがXOR.h5として保存されます。後でCubeMXで取り込んで使用します。

■CubeMXを使ったCube.AIプロジェクト作成
CubeMXにCube.AIのパッケージを追加する方法は前回の記事を参考にしてください。
@ターゲットボードの選択
 「Access to Board Selector」からSTM32F746G-Discoveryを選択します。


Aペリフェラル設定
 ボード選択後のペリフェラル設定はデフォルトモードyesを選択します。

 target-2.jpg



 「Computing」項目の「CRC」を有効化します。


 STM32F746DiscoはUSART1でPA9、PB7でSTLinkで接続されています。
 推論結果等をシリアルコンソールで表示するため、
 Connectivity→Usart1を有効化し、ボーレートを設定します。


 また、必要に応じてデバッグ用のSTLinkを有効化します。


CORTEX_M7をクリックし、IとDのCacheを有効化します。

 cubeAI-12.jpg

Bクロック設定
デフォルトは16MHzのため、最大の216MHzを入力します。
他の欄をクリックするとクロックウィザード確認がでるため、
OKボタンを押して他のクロックも合わせて自動設定します。


CCube.AIパッケージ追加
「Additional Softwares」をクリックして、X-Cube-AI/Application内の設定を有効化します。
 Coreライブラリにチェックを入れ有効化し、Applicationは「Application template」を選択して「OK」ボタンで画面を閉じます。



Dライブラリ設定
「Additional Software」に「X-CUBE.AI」が追加されます。
「X-CUBE.AI」をクリックして、「Artificial Intelligence Core」、「Artificial Intelligence Application」にチェックを入れて有効化します。


ECube.AI設定
「Additional Software」の「X-CUBE.AI」をクリックします。
「Add network」をクリックし、「XOR」モデルを追加します。
ライブラリに「Keras」、「Saved model」を選択し、先ほど学習させたModel「XOR.h5」を選択します。「Analyze」ボタンをクリックします。


 今回はXOR論理演算で簡単な処理のため、RAM40Byte、Flash:132Byteと圧縮なしでも非常に小さく実装できることが分かります。選択した学習済モデルで正常に推論できるか確認します。

 今回はXOR論理演算のため、ランダムを入力するよりも論理演算として想定されるデータを入れて確かめた方がよいため、「Validation from」からカスタムデータai_inputs.csv を選択します。
 「Validation on desktop」をクリックし、「Validation status」がSuccessとなれば正常に処理が終了したことを示します。

 下記のフォルダにアクセスして、ai_valid_outputs_model.csv、ai_valid_outputs_c_model.csvを確認してください。正常に処理が終了すると処理結果がcsvファイルとして出力されているはずです。

C:\Users\(ユーザー名)\STM32Cube\Repository\Packs\STMicroelectronics\X-CUBE-AI\(バージョン)\Utilities\windows

[1,1]の入力に対して約0.06
[1,0]の入力に対して約0.94
[0,1]の入力に対して約0.95
[1,0]の入力に対して約0.04



値を丸めると
[1,1]の入力に対して0
[1,0]の入力に対して1
[0,1]の入力に対して1
[1,0]の入力に対して0

ということでXOR論理演算の推論ができていることが分かります。

Fプロジェクト設定とコード生成
 HEAPサイズを0x200から0x2000に設定して、
他の設定は使用する開発環境等に合わせて設定し、
「Generate Code」をクリックします。

cubeAI-15.jpg

 なお、学習済データ等はMiddlewares\ST\AI\AI\data、Middlewares\ST\AI\AI\src
 Cube.AIライブラリ等はMiddlewares\ST\AI\AI\include、Middlewares\ST\AI\AI\lib
 ユーザーが呼び出す関数群はsrc\app_x-cube-ai.cに入っています。

 また、学習済モデルXOR.h5から推論の入力数、出力数は自動で設定されます。

Gprintf設定
CubeMXで生成したプロジェクトを開発環境にプロジェクトを追加します。
floatの結果を出力するため、プロジェクトのプロパティからいつも通り下記を追加して設定します。
-u_printf_float


ビルドします。

Hコード追記
main.c内に推論を行うための関数、コードを記述します。
今回はmain.cのみ手を加えました。
他のコードは自動生成されたコードです。
コードはこちらを参照してください。

code.jpg

aiTest()を呼び出して推論機能の初期化と実行をしています。
XORの学習モデルに合わせて入力に2次元の配列、出力に1次元の配列を与えています。
なお、自動で生成されるMX_X_CUBE_AI_Process()は空です。

Iマイコンへ書き込みと推論実行

xor-result.jpg

シリアルUartで出力させ、teratermでデバッグ表示させてみました。
学習させたXOR.h5モデルを使用してSTM32マイコン上で入力に対してXORの推論ができていることが分かります。


XOR論理演算を学習させてSTM32マイコンで推論させてみました。
XORモデルは非常に小さいため、ターゲットマイコンがSTM32F3シリーズでも実現できそうです。

今回はマイコン側のXORの入力は固定値ですが、スイッチ入力やセンサ、ADCなど変化する値にするとAIがより機能的だと実感できると思います。
例えば、入力を1x2でなく、もう少し大きな配列にしてアナログ値やセンサ入力等を学習させて、それに応じて音や光といった結果を返すことも実現可能です。

今回作成したコードとプロジェクトはこちらにアップしてあります。
今回はSTM32F7-Discoveryのディスプレイを全く使用していないため、今後はタッチパネルを活用して推論させたりしてみたいと思いました。
posted by Crescent at 00:00| Comment(0) | 組込ソフト | このブログの読者になる | 更新情報をチェックする

2019年05月04日

64Mbit大容量Serial SRAM

IoTやAIと謳われる中、組込系で問題になるのはRAMの容量です。

無線が不安定な場合にデータを一時保存したり、AIで大量のデータを保持したりとマイコン内蔵のRAMでは足りないと感じることが多々あります。そのような場合には一般的にはパラレル接続の外部RAMを搭載することが多いです。


パラレルSRAM、DRAMは100pin相当の大規模マイコンが必要で回路設計や等長配線等の処理が非常に大変です。
一方、Serial RAMはSPI、QSPI等で4本程度の通信配線のみで済みます。また、フットプリントもSOP8のため、最小限のスペースで済みます。


ただ、現状、日本国内で入手できるSerial RAMはISSIやCypress等では4Mbit(512kByte)が最大です(19年5月現在)。
それ以上はSerial Flashで一部あるのみとなっています。
Serial Flashでは書き込み速度や書き換え回数が制限されるため、やはりRAMが望ましいです。
ひと昔前はSPI接続のPRAMという128MbitのRAMも出ていましたが現在は生産終了で入手できません。


そんな中、入手性や供給安定を無視すると中国で実は64Mbit(8MByte)以上のSerial RAMが製造されています。

例えば、
vilsion製SRAMVTI7064MSM
vilsion製PsudoSRAM IPS6404LSQ
APMEMORY製SRAM APS6404
Lyontek製SRAM LY68L6400
があります。

海外等ではESP32等に搭載して高速に処理する際に上記の大容量RAMを設定して使っている例が議論されています。

なお、PsudoSRAMは、安価だがリフレッシュが必要なDRAMに専用コントローラを内蔵することでマイコン側からはSRAMのように扱うことができるRAMです。使う側からすれば安く使い勝手のよいSRAMとして使用することができます。


大手では大容量RAMはパラレルで満足しているようで、大容量版のSerial RAMの発売はまだ先のようです。
日本国内で上記の大容量Serial RAMを取り扱ってくれればよいのですが。。。
Aliexpress等でも扱いがなく、入手性や供給安定を無視して海外輸出対応しているこちらのサイトで買って試食してみるつもりです。
posted by Crescent at 00:00| Comment(0) | 電子部品 | このブログの読者になる | 更新情報をチェックする