OLED(I2C)に表示しつつ、内蔵DACから波形出力しました。Nucleoボードは、F446REだとサンプリング・レート100kHzではだめで50kHzぐらいまで下げないと追いつかなかったので、F767ZIを使用しました。them.u8g2-mbedから以下のファイルをプロジェクトディレクトリにコピーu8g2.lib.mbedignoresrc/*src/main.cppはu8g2-mbedを使ったプログラムの雛形として使えます。.mbedignoreu8g2/cppsrc/*u8g2/doc/*u8g2/sys/*u8g2/tools/*となっていて、mbedのBUILD対象外とするファイルを指定するようです。deployコンパイルです。fpsはおおよそ10.9になりました。OLEDの表示はメイン・ループ内で行っていて1秒間に10.9回のループです。操作子からの入力もメイン・ループ内で行うと思うので、fpsはもっと下がると思います。出力波形ch1:PA_4Ticker割り込みの処理時間ch2:D4Hになっている時間(PW)が波形出力の割り込み処理に要した時間で、1.2マイクロ秒です。いわゆるプロダクト・アウト」)720ナノ秒だったので、処理時間が増えました。5に移行したためなんじゃなかな~と思います。F767でもいろいろやろうと思うと48kHzのサンプリング・レートがキープできるかどうかちょっと心配です。u8g22018年8月28日火曜日NucleoF446RE(mbed-cli)でu8g2を使う。Arduinoの汎用モノクロディスプレイ用ライブラリのu8g2をmbedにPortしたライブラリが公開されています。https://github.com/domantascibas/u8g2-mbedmbed-cliで使うようになっています。mbed-cliのインストール、使い方は前回の「NucleoF446REでmbed-cliを使う。(メモ)」にあります。「Github:u8g2-mbed」からZipファイルを入手して作業ディレクトリに展開します。作業ディレクトリD:\Users\gizmo\Documents\mbed\u8g2-mbed-master展開したディレクトリに移動してmbedプロジェクトを作成。them..続いてデプロイします。128x32でテストしました。ブレッドボード配線図src/main.cppを以下のように書き換えました。compileするとfonts/以下の*.cファイル(フォント・データ)はコンパイルされるようです。XLargeFont.oオブジェクトファイルは生成されますが、「XLargeFont」や「LargeFont」はmain.cppで宣言されていなくてコンパイル・エラーになるのでexternで宣言しました。U8G2_FONT_SECTION("LargeFont");変数名のあとに付いている「U8G2_FONT_SECTION()」はメモリ空間を指定するマクロのようです。128x32のものを使うように初期化関数を変更。u8x8_gpio_and_delay_mbed);「u8g2_font_f16_t_japanese1」というフォントはu8g2.hで宣言されています。一覧は「olikraus/u8g2」の「fntlistall」にあります。.\BUILD\NUCLEO_F446RE\GCC_ARM\u8g2-mbed-master.binピンをアサインピン名はPinNames.hで定義されています。PB_9,と定義されています。u8g2のピンアサインはu8g2-mbed-master\u8g2\cppsrc\U8g2lib.hで定義されています。}};「u8g2-mbed-master\u8g2\cppsrc\」下はArduino用のラッパーで、そのままではmbedで使えません。i2c_sda(PB_9);とI2Cに使うピン名がハードコーディングされていました。(しかもSTM32のピン名)u8g2-mbedは、u8g2の全体を移植したものではなく、STM32でI2CのSSD1306を使うためのものと考えたほうが良さそうです。u8g22018年8月26日日曜日NucleoF446REでmbed-cliを使う。(メモ)だいぶ前になりますが、以下のサイトを参考にしてmbed-cliの環境を構築しました。Xの場合は専用のインストーラーがあるようですが、もろもろのツールを手動インストールしていました。以下、PowerShellで作業しました。others本製品はフリーソフトウェアです。頒布条件に関しては同梱されるライセンス条項をお読みください。6をmbed-cliの環境設定で指定して使用しました(後述)。mbed-cliとUpdateするオプションの「-U」を省いてやればだいじょうぶだと思います。念の為ですが、パスの「gizmo」はWindowsのUser名で「D:\Users\gizmo\Documents\mbed\」をmbedの作業フォルダとしています。mbed-cliはPythonスクリプトでPythonのインストール・フォルダ下にあります。C:\Python27\ScriptsExampleのインポートまずはLチカです。mbed-os-example-blinkyをインポートしました。インポートにまずまず時間はかかりますが、インポート完了時に反応がないので適当にEnterキーを押します。6のパスを指定します。F446RE)をUSBでパソコンに繋ぎ、確認します。.\BUILD\NUCLEO_F446RE\GCC_ARM\mbed-os-example-blinky.bin出来上がった「.\BUILD\NUCLEO_F446RE\GCC_ARM\mbed-os-example-blinky.bin」をオンラインコンパイラと同じようにNucleoF446REのフォルダにDrag&Dropすれば実行されます。Boardにバイナリが書き込まれます。-f</追記>プロジェクトの新規作成Lチカ・プログラムを新規作成します。プログラム名はblink2としてExampleより素早くチカチカするようにしました。空のプロジェクトを作成します。作成したプロジェクト・ディレクトリに移動して環境を確認。.\BUILD\NUCLEO_F446RE\GCC_ARM\blink2.bin出来上がった「.\BUILD\NUCLEO_F446RE\GCC_ARM\blink2.bin」をDrag&Dropです。下記のドキュメントを参考にすれば、mbed-osをダウンロードする時間とディスクスペースを節約できそうです。表示器を考える(メモ)中華製のOLEDのSSD1306はArduinoだとうまく表示できましたが、Nucleo(mbed)で簡単に試すと動作が怪しくなりました。OLEDを動作テストAdafruit_GFXのライブラリの中をいじったり、まじめにやるのも辛いので表示器をどうするか考えます。SSD1306視認性が良くてサイズがコンパクト。u8g2で動作確認済みです。Mode(400kHz)で動作させてみた。128X32をu8g2で使ってみる。OLED(I2C)を使う。」u8g2(https://github.com/domantascibas/u8g2-mbed)ローカルのmbed-cliでやらなければだめそう。フォント生成にLinux環境が必要とかなんとかで、ちょっとめんどい。Adafruit_GFXでは動作不良。SPIだと表示が乱れるようです。I2Cならだいじょうぶか?フォントも用意する必要があります。LCDST7565はベースマシンのBSM02のNucleo(mbed)で使っていて実績あり。F401RE(mbed)で動かす。LCDのCH12864F-SPIを使ってみる。一回り小さいUC1701のLCDも簡単にテストしたことがあります。LCD(F12864G25412P1701)をArduinoのUC1701ライブラリで動作させてみる。LCDaitendoのSPLC792-I2C、秋月のAQM1602、AQM0802はコマンドコンパチで使用経験あり。mbedでは使ったことはなかったと思いますが、コマンドを生書きしているので移植は可能だと思います。LCDとかLEDとかUARTとかこれは動くだろうと思います(^q^;mbedはオンラインコンパイラが手軽すぎて今まで使っていなかったmbed-cliの環境を整えるあたりから手をつけようかなと思います。LFOと同じような仕組みでハイスペックなNucleoF767でDCOを試作したいと思います。VCA、トランジスターラダーLPFのTLF01とアナログ回路で組んできたので、VCOもアナログ回路で組みたいところですが、一度、音源として汎用的に使えそうなデジタル・オシレーターを作ってみようと思います。F767をコアとして試作することにしました。F767は2ch分のDACが内蔵されていますが、1つはオンボードのLEDと接続されていて出力波形が汚いので1chのみとします。最低でも48kHzとします。12bit/48kHzなので20年ぐらい前のサンプラー相当です。I2Sならオーディオ品質のDACを使えますが、とりあえず楽をする方向で考えます。5LPで使ったことがありますが、NucleoやESP32で使ったことがないので後々。出力波形SQR、SAWUP、SAWDOWN、TRI、SIN、NOISE。LFOでは計算時間が足りなくてNoiseは出力できませんでしたがNucleoならできそうです。3オシレーター1オシレーターだと音が薄いので、3オシレーターをプログラム上でMIXして出力します。サンプリングレートを下げていけばできそうな気がしますが、問題は操作子が増えることです。1オシレーターで妥協するかもしれません。1~2オクターブ下の周波数を出力するサブオシレーターにするかも?出音を比較しつつ。出力周波数ピアノの音階の27.5Hz~4,186Hzより広くするつもりです。POTの解像度が10bit(1024)程度しかないので、レンジ切り替えで対応すると思います。±2.5V程度で考えています。DC成分のない両電源波形です。LFOと同じ構成ですが、両電源波形にするためDAC出力をACカップリングしています。プッシュスイッチを使ってレンジ、波形を切り替えると、フィードバックが必要になるので表示器としてLCDかOLEDを使うつもりです。ロータリースイッチを使えば表示器は不要ですが、線数が増えまくります。POTは位相を可変するもので、1オシレーターだとあまり意味はがないんですが、複数あればオシレーターごとに位相をずらしてうねりをつくれます。外観案1オシレーターならこれぐらいのサイズで収まりそうです。PizzaBoxぐらいの規模になりそうです。内蔵DACからの出力波形1kHzのサイン波を出力するプログラムを書いて出力波形を見てみました。サンプリングレートはとりあえず100kHzにしました。DDSにつかうWaveテーブルは32,768要素にしました。簡単に出力テストしてみると、これ以上要素数を増やしてもあんまり効果はなさそうでしたが、メモリーが潤沢なので要素数は増やせます。ch2:D5ch1:D4はメインループ内で1マイクロ秒のWaitをかけてH/Lしていて、ch2:D5はサンプリング周期毎の割り込み処理の最初と最後でH/Lしています。サンプリングレートが100kHzなのでch2の周波数は100kHzになっています。Hになっている時間(PW)は720.0nsでまずまず計算する時間の余裕はありそうです。オシロで見ると、ch2の波形が多少ブルブル震えています。ch1は、ch2の割り込みのタイミングで1マイクロ秒より引き伸ばされる場合があります。以下、電源ノイズを避けるために、NucleoのUSB電源を電池使用の安定化電源にして測定しました。普通に内蔵DACで出力すると波形の上下でクリップするので、ファームウェアで小細工して3Vp-p弱の振幅にしました。ファームウェアの以下の部分です。14;出力波形(拡大)ガタガタの幅は10usで、逆数は100kHzなのでサンプリングレートと合致します。FFT横軸は25kHz/DIVで100kHzと200kHz付近にエイリアスが現れています。0.19748%出力にLPFをかけるにしても可聴帯域の20kHzあたり以下の帯域は通過域です。F767のZIOヘッダは、Arduinoのシールドを使うと内側の穴が隠れてしまって使いづらい。サンプリングレートを決めてからLPFを設計する。MIDI対応できるように考えておく。OLED表示(u8g2)と波形出力のテストNucleoF446RE(mbed-cli)でu8g2を使う。NucleoF446REでmbed-cliを使う。OLED(I2C)を使う。