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) | 電子部品 | このブログの読者になる | 更新情報をチェックする

2019年04月27日

STM32CubeIDE

先日、STからSTM32CubeIDEという純正の開発環境が発表されました。
今回はSTM32CubeIDEを紹介させて頂きます。


今までSTM32の開発環境はSW4STM32、TrueStudioといったパートナー企業が開発したIDEを使用することが一般的でした。
STM32マイコンをワンストップで開発できるようにCubeMXにTrueStudioを統合したSTM32CubeIDEが開発されました。


cubeide1.jpg


SW4STM32、TrueStudioと比べると、
CubeMXで設定して生成したプロジェクトを開発環境にインポートする手間が減っています。

早速、ダウンロードして試食してみました。



cubeide2.jpg

起動するとワークスペース選択画面がでます。
デフォルトのままで「Launch」をクリックします。

cubeide3.jpg

起動するとプロジェクトの新規作成、or 開くボタンが表示されます。

今回は最初なので新規作成から行いました。
「Start new STM32 Project」をクリックします。

cubeide4.jpg

CbeMX同様にマイコン選択画面が表示されます。
今回は手持ちのSTM32F401Nucleoを選択しました。

cubeide5.jpg

続いてプロジェクト設定画面が表示されます。
ここでC,C++で記述するのかといった設定ができます。
プロジェクト名のみ設定して「Next」をクリック。

cubeide6.jpg

コード生成に際して、CubeMXのファームバージョン等の選択画面が表示されます。
デフォルトのままで「Finish」をクリック。


cubeide7.jpg

ピンアサイン、クロック、ペリフェラル設定の画面が表示されます。
一通り設定を行ったあとはコード生成を行います。


cubeide8.jpg

Project→Generate Codeをクリックしてコードを生成します。
CubeMXがすでにインストールされている場合、CubeMXのファームパッケージのディレクトリから自動で読み込まれるようです。
CubeMXのファームパッケージがない場合や古い場合は自動でダウンロードが開始されます。


cubeide9.jpg
コードが生成された後はCtrl+Bでプロジェクトのビルドをします。
デフォルトではデバッグ用のelfファイルのみ生成されます。
必要に応じてプロジェクトウインドウのプロジェクト名を右クリックして、プロパティからbin or hexファイルを生成するように設定します。
Alt+Enterでもプロパティを表示できます。

cubeide10.jpg

C/C++ Build→Settings→MCU Post Build outputsから「Convert to binary file/ Intel Hex file」にチェックを入れます。
これでビルドするとbinファイルが生成され、STLink UtilityやCube Programmer等から書き込みできます。


またデバッグ等を行う場合もこれまでのSW4STM32やTrue studio同様です。

cubeide11.jpg

Debug Configurationからデバッグ設定を行います。

cubeide12.jpg

Search Projectからelfファイルを選択してDebugボタンを押すことでオンラインデバッグが可能です。

SW4STM32やTrueStudioの開発環境にCubeMXのプラグインを予め導入したものがSTM32CubeIDEという感じです。

cubeide13.jpg

TrueStudioの機能かもしませんがビルド後にメモリの空きスペースが表示される機能は便利だと思いました。
今回のSTM32CubeIDE発表に伴い、残念ながらSW4STM32、TrueStudioの開発環境はNRND、つまり新規開発には非推奨になっています。
今後はSTM32CubeIDEがメインになるようです。
デフォルトでbin、hexが生成されない設定や通常の書き込みボタンやツールがないようなので初心者には少し戸惑う点があると思いました。

sw4stm32.jpg


SW4STM32ではデフォルトでbinが生成され、上記のような書き込みボタンがありました。
これからの発展に期待しましょう。
posted by Crescent at 00:00| Comment(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする

2019年04月20日

Digital Video Shield 応用編

今回は以前に紹介したDigital Video Shieldの応用について紹介します。

Digital Video Shieldで使用しているビデオエンジンBT816はCo-Processorエンジンを搭載しており、コマンドで内蔵Widgetsを簡単に表示することができます。

内蔵Widgetsの種類としては、テキスト、ボタン、時計、プログレスバー、スライダー、トグルボタンなどがあります。
数行のC/C++コードの記述で任意の表示をすることができます。
なお、ボタン、スライダー等の入力イベントを使用する場合はDigital Video Shieldの基板上のピンと抵抗膜方式パネルの配線、タッチパネルキャリブレーション、入力イベント設定が必要になります。


・色を変更する場合
EveSendCmd(COLOR_RGB(180, 180, 240));

・数字を表示する場合
 文字位置、フォント、フォントオプション、数字を設定します。
EveWriteNumberData(220,200,EVE_FONT_B_size6,0,120);

・時計を表示する場合
 位置、サイズ(半径)、何時何分何秒か設定します。
EveWriteClock(120,120,100,0,10,10,20,3);

・文字列を表示する場合
 文字位置、フォント、フォントオプション、文字列
EveWriteStringData(200,350,EVE_FONT_B_size6,0,"Digital Video Shield");

・ゲージを表示する場合
 位置、サイズ(半径)、最大値、最小値、現在値等を設定します。
EveWriteGauge(400,120,100,0,80,0,10,100);

・ボタン/トグルボタンを表示する場合
 文字位置、フォント、フォントオプション、文字列
EveWriteButton(550,50,80,40,EVE_FONT_B_size4,0,"ON");
EveWriteToggle(550,120,50,EVE_FONT_B_size4,0,1,"ON");

・プログレスバー
 位置、サイズ、最大、最小、現在値等を設定します。
EveWriteProgress(550,200,50,30,0,20,100);

・スピナー(処理待ち等の表示)
 位置、オプション等を設定します。
EveWriteSpinner(700, 150, 0, 0);


実際に800x480のディスプレイに表示してみました。

img4.JPG

予めよく使う表示についてWidgetsとして内蔵しているため、数行で任意の表示をすることができます。
フォントや各WidgetsはBT816内に内蔵されているため、一般的なTFT液晶をピクセル毎に処理する場合に比べてマイコンのメモリ消費を大幅に抑えることができます。
上記サンプルはArduinoUNOで実装しています。
Githubに上がっているコードをアップデートし、内蔵Widgetsのコードを追加しました。
Digital Video Shieldを活用してArduino、センサを組み合わせてIoTディスプレイといったことも簡単に実現可能です。
posted by Crescent at 00:00| Comment(0) | 電子部品 | このブログの読者になる | 更新情報をチェックする