STM32 F103C8T6を使う(1:開発環境構築編)
はじめに
これまでは専らArduino(ATMEGA328P)を使って工作を行ってきたが、いかんせん速度とリソース面において不満が出てきた。
そこで、巷で話題の低価格Maple Mini互換ボードを使用することでお安く性能を稼ごうと思い立った。今回は開発環境の解説のみを行う。
なお、STM32シリーズのプログラミングに関して、SPLというライブラリが主流であったが、学習も兼ねて新参のHALライブラリを選択した。ネット上の情報は少ないが、I/Oやシリアル通信など、私が使用する範囲でペリフェラルの使用法を掲載していきたい。
今後はひとまずLチカを目標とする。
・開発環境の構築 ←今回の内容
・CubeMXの使用法 ←次回以降の内容
・SW4STM32の起動とプロジェクト読み込み
・書き込み
各種環境説明
PC環境
・Windows7 64bit (Mac Bootcamp) おそらくPCでも影響なし。
マイコン関連のハードウェア
・STM32F103C8T6 ボード (Banggoodで購入) ¥400
・ST-Link V2 Programmer (ebayで購入) ¥250
どちらも安さを優先した結果、海外から購入している。PayPalアカウントを持っていればある程度は安全な取引が可能と思われる。
導入予定のソフトウェア
・GNU ARM Embedded ToolChain(コンパイラ)
・OpenOCD (ライタ、デバッガ)
・ST-Link Utility (ライタ)
・STM32CubeMX(便利グッズ)
導入するソフトウェアはすべてフリーソフトを使用している。一部STからダウンロードする際にメールアドレスを要求されるので、素直に入力してダウンロードリンクを貰いましょう。
環境構築と各種ツール導入
SW4STM32をメインの開発環境(IDE)として使用することにした。このIDE上でプログラミングから書き込み、デバッグまで行う。
私が参考にしたブログはこちら。この手順を守れば環境構築は完了する。
HAL Driverが使えるSTM32系開発環境を作る - 鳥の巣箱
上記のブログではNucleoを使用しているため、比較的スムーズにLED点滅まで終えているが、こちらはやっっすい中華ボード・プログラマを使用するため書き込みにやや手間がかかる結果となっている。
続きは次回...。
STM32F4 Discovery 開発環境構築 備忘録
最近、高性能なマイコンが欲しくなったためにSTM32シリーズを真面目に使おうとしている。具体的にはSTM32シリーズのMBED環境から脱出してSTMicro推奨の環境でプログラミングをしたいと考えている。
DAC内蔵のマイコンを探していたところ、たまたま手持ちのマイコン(STM32F4 Discovery)にDACが内蔵されていたため、今回は意地でもその機能を使おうとするのが目的である。
(DMAやホワイトノイズジェネレータもあるらしい。あら便利。)
今回は以下の3項目を終えたところである。
1.開発環境のインストール
2.プログラムとビルド(Lチカ)
3.STM32F4本体への書き込み
4.気になった点
1.開発環境のインストール
開発環境としては System Workbench for STM32 を使用した。
STMicroのサイトでも紹介されているので、怪しいものではないはず。
マルチプラットフォームである点と、何よりインストールが簡単そうなのでこれに決定。
ダウンロードに際してはユーザ登録(メールアドレスとパスワード)が必要となるので注意されたし。
インストールには別段難しい手順は必要ないが、インストーラの実行にはJRE( Java Runtime Environment )のver.7以上が必要となるため、予め導入しておく必要がある。
また、今回はUbuntu14.04環境下でインストールを行ったが、64bit版のみ以下を実行しないとプログラムビルドの際にコンパイラが働かない。
$ sudo apt-get install libc6:i386 lib32ncurses5
2.プログラムとビルド
プロジェクトの作成に関しては他所で詳しい解説があるため言及しないが、STMicro推奨だけあってDiscoveryはじめNucleoなど多くのマイコンボードに対応している。プロジェクト作成の時点でボードに必要なライブラリが読み込まれる。
今回はLチカでプログラムとビルドを確認している。ソースは以下の通り
/*****************************************************/
//main.cpp
#include "stm32f4xx.h"
#include "stm32f4_discovery.h"
int main(void)
{
//ライブラリ読み込み
HAL_Init();
//光らせるLEDをイニシャライズ
BSP_LED_Init(LED3);
//チカチカを無限に繰り返す
for(;;)
{
//上で指定したLEDの状態をトグル
BSP_LED_Toggle(LED3);
//1000ms保持
HAL_Delay(1000);
}
}
/*****************************************************/
たったこれだけである。
ビルドに関しては、メニューバーの「Project」→「Build Project」で行う。(またはかなづちマーク)エラーがある場合はワークスペース下部の「Problems」や「Console」に表示される。
3.STM32F4本体への書き込み
ビルドが終了したら「Project Explorer」から「プロジェクト名」を右クリックして「Debug As」 → 「Ac6 STM32 C/C++ Application」 を選択すると、マイコンへの転送が始まる。(LED1が赤・緑と点滅)
一度上記の手順を踏むと、あとはメニューバー(アイコン)の再生ボタンから転送ができるようになる。
4.気になった点
今回納得行かなかった点としては、ビルドの時点で
「HAL_Delay()」が認識されておらずエラーになる→デバッグしてみる→動作に問題なし、Delayが効いている
以上の流れである。
よく使ってるArduinoではエラーが出た時点でコンパイルがストップするので安心だったが...感覚的に少々気持ち悪い。いずれ解決するか慣れるかのどちらかを期待しておこう。
次はDACの仕様確認と実際の動作まで行う...つもり。
あと、ソースコードの載せ方も考えないと...。
自作シンセの構造について (3)
さて、自作シンセの簡単な紹介もこれで最後である。
最後はフィルタ・アンプについての解説となる。
1. フィルタについて
DSP(Digital Signal Processor)としての機能が必要となることから、高性能なマイコンを選定した。STM32F303K8である。これはmbedとしても使用可能であり、¥1,600とりぃぃぃずなぶるな価格である。
世の中にはあらゆるデジタルフィルタがあるが、移動平均をとったりする単純な方式はメモリを食う割にフィルタの効きが悪い。そこで以下のフィルタを参考にした。
BiQuadフィルタの料理法 | g200kg Music & Softwares
双2次フィルタと呼ばれるモノであり、音声に関して記憶する配列を5,6個(うろ覚え)用意するだけでフィルタリングが可能となる!その代償として演算が増えるが、今回はSTM32の性能に頼ることにした。なお、上記のサイトではフィルタリングのパラメータは固定であるため、フィルタリング周波数を可変にするためにはパラメータを配列に格納してボリュームの値に応じて呼び出すといった工夫をしなければならない。
兎に角、これでフィルタリングができるようになった。続いてアンプについてである。
2. アンプについて
デジタル信号処理における音量調節とは、何ぞや?
答えは単純、かけ算で実現できる。ただ単にボリュームを下げたいのであれば、ある音声データに対して所望のゲインを乗じてやればよい。しかし、それだけでは面白くないので、今回はEG(Envelope Generator)も一緒に実装する。
EGとは、時系列的な変化(Envelope)を生み出すしくみであり、これをアンプに適用すると音量の時系列変化が起きる。則ち、ピアノのような減衰音だったり、オルガンのような持続音をシンセでも再現できるのである。また、エンベロープをフィルタに適用したりしても面白いが、今回はアンプのみとした。
以上のようなコンポーネントを組み合わせて、とりあえずモノフォニックシンセの習作を作ったのが今回のプロジェクトである。次はアナログフィルタ等も交えて4ボイス程度のデジアナシンセを作ってみたいと考えている。
ではもう一度、最後に。
自作シンセの構造について (2)
今回はMIDIインターフェイスマイコンとDCO(下図参照)について解説する。
MIDIとは、現代の電子楽器において実装していない製品はないと断言してよいほど普及しているI/Oである(USB-MIDIとかもあるけど)。登場してもう30年以上が経過しており、こなれたインターフェイスとして処理能力の低いマイコンでも手軽に送受信ができるため、Arduinoなどでも手軽にMIDI楽器が作れたりする。
しかし、枯れた技術である反面、ボーレートは"31500bps"とかなり遅めである。しかも送信される情報は音程を表すNOTE信号や鍵盤のON/OFFを表すGATE信号の他にもピッチベンドやらモジュレーションやら多くの演奏情報も付加されるため、DCOに直接MIDIが入るとシリアル割り込みだらけになって本業に差し障る!
というわけで、MIDIを受信してNOTE信号とGATE信号のみを濾過してくれるマイコンを置くことにした。MIDIインターフェイスマイコンからはDCOへノート情報のみがUART通信で送信される。また、鍵盤のON/OFFであるGATE信号はフィルタとアンプを司るマイコンに入力される仕様となっている。
実際に使用したマイコンはATMega 328P(Arduino)である。買うところを選べば¥300程度で入手できるのでお手軽です。以前はこれでDCO作ったりもしたけど、またの機械に...。
2. DCOについて
DCOボード(1Voice)
続いて波形を発生させるDCOボードについての解説である。2系統x3波形(後述)を自由に混ぜられるProphet-600のVCOを参考にした。ノイズは入ってない。多分あとで入れる...かも。波形は三角波・矩形波・ノコギリ波がメインとなっているウェーブテーブル方式を採用している。デチューンも可能である。
これは1Voice分の回路なので、一音しか発することはできないが、並列で増設ができるような仕様(形状?)としたため、将来のポリフォニック化も容易である。実は内部のプログラム的には16波形のミックスが可能なので、SuperSawなどのトランス系の音色も出せるが、いかんせんモノフォニックなので説得力に欠けるという...。
3. コンソール類
これは2系統x3波形を体現したモジュールである。スイッチのON/OFFにより3波形(三角波・矩形波・ノコギリ波)を自由に混ぜることができる。つまみはデチューン用のものである。とは言いつつもDCOでソフトウェア的に読み込んでいるため特に制限はなく、波形もテーブルの内容を書き換えれば良いため、テスト用のスイッチといったところか。
次の投稿ではフィルタとアンプについて解説する。
自作シンセの構造について (1)
以下の投稿について、実際のシンセがどのような構造であるかを記録しておく。
これから数回にわけて各コンポーネント毎に解説をしていく。
1. 全体の構造
全体の構造としてはオーソドックスなものとした。具体的には以下の図を参照願いたい。DCOで波形を発生し、フィルタで削り、アンプで音量を時系列的に変化させるというアナログシンセを模したものとなっている。
2. 使用コンポーネントについて
今回はプロトタイピングの速さから、全てマイコンを使用して構成している。しかし、将来的にはアナログのVCFやVCAも適用したいとの思いから、フィルタ・アンプ部は別回路としている。
マイコンには開発環境の手軽さと実行速度(クロック)の優位性からmbedシリーズを選定し、プログラミングを行っている。また、上図には書き忘れたが、MIDIインターフェイスマイコンとしてArduino(ATMega-328P)を使用している。
次回の投稿では、MIDIインターフェイスマイコンとDCOについての解説を行う。
自作シンセでRydeenを録音した話
クソ忙しい大学の研究室の作業のあいまにチマチマとシンセを作っていた成果が今年の4月にできていた。
とりあえずは成果物を貼付けておく。
Rydeenのリズムなしバージョンである。
演奏したシンセの仕様については次の記事に記載予定であるが、 単音しか出ないモノシンセを作ったため、和音は一音ずつレコーディングしたものをガレージバンドで重ねて再現した。エフェクタは持ってないのでほとんど生音に近い...と思う。
演奏に関してはシーケンス音を含めPC上のシーケンサでプレイしているMIDIデータを受信して発音している。個人的には前奏の馬蹄の音がお気に入りである。
惜しむらくは先の震災で演奏したシンセが研究室の隅っこに吹き飛ばされていたことである。再構成する気力がないのでほったらかしであるが、いつかはモジュールを増やしてポリシンセとして再生できたらいいね!
次は本体の構成について記事を書く予定。
おうちからRasPiのファイルを編集したい
RaspberryPi 上では主にC言語でプログラミングをする予定であるため、下手なGUIを持つエディタなんぞ不要である。しかしエディタは手元のSublimeを使いたいという需要からssh接続でファイルを操作することを決意した。
以下のサイトを参考におおよその設定は済んでおり、configの書き換えまでは行っている。
https://github.com/henrikpersson/rsub
しかしどうもつながってくれない。“遠隔地”のLAN内ならばすんなりいった設定であるのだが...
原因がさっぱり不明であるので、手当たり次第に試してみることにした。 接続するポートを指定する操作を“フォワーディング”というらしく、複数の方法が存在した。 ssh接続をする際にポートを指定する方式で成功したため、今回はそれを記載しておく。
$ ssh -R 52698:localhost:52698 user@ip_address
むろん“user”はログイン時のユーザ名である。 “ip_address”は接続先のグローバルipを入力すればよい。目的のファイルが存在するディレクトリに移動して次を入力
$ rsub -f filename.c
するとローカルのSublime textに対象ファイルが表示される。保存もCtrl+Sのみであるため非常に便利である。