API collection of Ukifune. Initial publish. Documents are not ready.
ukifuneはUI基板『浮舟』のAPIモジュールです。 浮舟はNucleo F746ZGに接続して使うUI基板で、以下のような特徴を持っています。
- ピアノ鍵盤を模した13個のタクトスイッチ
- 3個のモード切り替えスイッチ
- 12個のLED
- 2ポートのI2Cを通して使える計8個のボリューム。
以下にukifuneモジュール及び浮舟について解説します。
ハードウェア
浮舟基板は、Nucleo F746ZGのCN12ヘッダーに接続して使うUI基板です。 この写真では中央下の緑の基板が浮舟です。上の白い基板はNucleo F746ZGで、その上には、変換基板桐壺を介してアクアシグナルのUMB-ADAU1361-Aが接続されています。また、浮舟の両側にはやはりアクアシグナルのTPOL-POT4-Aが接続されています。
Nucleo F746ZGのCN12は非常に多くのピンが用意されていますが、そのうち最初の50ピンのみを使っています。使用している機能はGPIO機能のほか、I2C3およびI2C4ポートです。I2C2ポートは、CN11で使えるように手付かずであけてあります。
プッシュボタンはアンチ・チャタリング回路を入れていますが、簡易型であるためあまり効きがよくありません。現時点ではキャパシタの無駄です。追試してみたい方は時定数を大きくするか、いっそアンチ・チャタリング回路をやめてもいいでしょう。
LEDもプッシュボタンも、アクティブHです。すなわち、LEDは論理状態1で点灯し、プッシュボタンを押すと論理状態が1になります。
I2Cポートは基板でプルアップした後、外部に開放しています。これらはアクアシグナルのTOL-POT4-Aに直結できるピン配置になっています。 浮舟基板にはテストポイントが3本出ています。うち1本はGNDで、残りの2本は割り込み処理時間と信号処理時間を測定するためのステータスピンです。
ソフトウェア
ukifuneモジュールは浮舟基板制御用のAPI群です。これらは名前空間ukifuneでラップされており、ukifune.hを読むことで利用できます。 APIの一覧については、このページのAPI Documentationタブを参照してください。APIドキュメントには、LEDおよびプッシュ・ボタン・スイッチをプログラムから参照するための識別子も列挙してあります。
ukifuneモジュールのAPIを使用するためには、事前にukifune::init() APIを一度だけ呼ぶ必要があります。このAPIは内部変数を初期化するほか、雲仙オーディオフレームワークへのポインタを受け取り、フレームワークに対してテストピンを駆動するためのコールバック群を登録します。
ボリュームを使う場合には、周期的に ukifune::tick() を呼んでください。このAPIは呼ばれるたびにI2C経由でADCにアクセスしてアナログ値を読み取り、ukifuneモジュールの内部変数を更新します。呼び出し周期はおおむね50mS以内であれば十分でしょう。周期の精度については適当でかまいません。
プッシュボタンの状態を知りたい場合には、ukifune::get_button_state() を呼び出します。このAPIは3つのビットマスクを返します。
pushing 引数は、前回のAPI呼び出し時からどのボタンが押し込まれたかを返します。言い換えると、前回押されていなかったにもかかわらず、今回のAPI呼び出しで押されていることが検出されたボタンがこの変数から返されます。pushing引数はビットマップであり、ビット位置は enum ukifune::SWITCHの要素の値に対応します。対応するビットが1であるようなスイッチが、押し込まれたスイッチです。
releasing 引数は、前回のAPI呼び出し時からどのボタンが戻されたかを返します。言い換えると、前回押されていたにもかかわらず、今回のAPI呼び出しで押されていないことが検出されたプッシュボタンがこの変数から返されます。releasing引数はビットマップであり、ビット位置は enum ukifune::SWITCHの要素の値に対応します。対応するビットが1であるようなスイッチが、戻されたスイッチです。
pushed 引数は、どのボタンが押されているかを返します。pushed引数はビットマップであり、ビット位置は enum ukifune::SWITCHの要素の値に対応します。対応するビットが1であるようなスイッチが、押されているスイッチです。
ukifune::get_volume()は、ボリュームの状態を返します。引数は0から7の整数で、ボリュームに対応します。返り値の範囲は0から1.0です。
基板設計情報およびパーツリスト
ukifuneの 基板設計情報をアップロードしておきます( 2017/01/28, ver 2 )。
この基板はKiCad 4.0.2 で設計し、出力したgerberデータをスイッチサイエンスの基板製造サービスで製造し、動作を確認しています(写真)。万に一つのことがありますので、基板を外注に出す方は、くれぐれも事前の注意を払ってください。また、この基板は実験用に作成したものであり、民生、産業、医療などの用途に耐えるような設計ではありません。どのような理由であれ、この基板によって発生した問題については責任を取りません。
部品表は以下の通りです。C1の脚の幅にご注意ください。LEDやプッシュボタン・スイッチの色は任意です。なお、U1だけは表面実装部品です。ご注意ください。 以下の部品の他に、Nucleo側のピンヘッダおよび、基板接続用のフラットケーブル(圧接コネクタ付き)が必要です。
Reference | Value | Footprint | 注釈 |
---|---|---|---|
C1 | 0.1u | Capacitors_ThroughHole:C_Disc_D3_P2.5 | 0.1uF ピン幅2.54mm |
C2 | 10u | Capacitors_ThroughHole:C_Radial_D5_L6_P2.5 | 10uF ピン幅2.54mm |
C3 | 0.1u | Capacitors_ThroughHole:C_Disc_D6_P5 | 0.1uF ピン幅5.08mm |
C4 | 0.1u | Capacitors_ThroughHole:C_Disc_D6_P5 | 0.1uF ピン幅5.08mm |
C5 | 0.1u | Capacitors_ThroughHole:C_Disc_D6_P5 | 0.1uF ピン幅5.08mm |
C6 | 0.1u | Capacitors_ThroughHole:C_Disc_D6_P5 | 0.1uF ピン幅5.08mm |
C7 | 0.1u | Capacitors_ThroughHole:C_Disc_D6_P5 | 0.1uF ピン幅5.08mm |
C8 | 0.1u | Capacitors_ThroughHole:C_Disc_D6_P5 | 0.1uF ピン幅5.08mm |
C9 | 0.1u | Capacitors_ThroughHole:C_Disc_D6_P5 | 0.1uF ピン幅5.08mm |
C10 | 0.1u | Capacitors_ThroughHole:C_Disc_D6_P5 | 0.1uF ピン幅5.08mm |
C11 | 0.1u | Capacitors_ThroughHole:C_Disc_D6_P5 | 0.1uF ピン幅5.08mm |
C12 | 0.1u | Capacitors_ThroughHole:C_Disc_D6_P5 | 0.1uF ピン幅5.08mm |
C13 | 0.1u | Capacitors_ThroughHole:C_Disc_D6_P5 | 0.1uF ピン幅5.08mm |
C14 | 0.1u | Capacitors_ThroughHole:C_Disc_D6_P5 | 0.1uF ピン幅5.08mm |
C15 | 0.1u | Capacitors_ThroughHole:C_Disc_D6_P5 | 0.1uF ピン幅5.08mm |
C16 | 0.1u | Capacitors_ThroughHole:C_Disc_D6_P5 | 0.1uF ピン幅5.08mm |
C17 | 0.1u | Capacitors_ThroughHole:C_Disc_D6_P5 | 0.1uF ピン幅5.08mm |
C18 | 0.1u | Capacitors_ThroughHole:C_Disc_D6_P5 | 0.1uF ピン幅5.08mm |
D1_1 | LED | LEDs:LED-3MM | LED ピン幅2.54mm |
D1_2 | LED | LEDs:LED-3MM | LED ピン幅2.54mm |
D1_3 | LED | LEDs:LED-3MM | LED ピン幅2.54mm |
D1_4 | LED | LEDs:LED-3MM | LED ピン幅2.54mm |
D2_1 | LED | LEDs:LED-3MM | LED ピン幅2.54mm |
D2_2 | LED | LEDs:LED-3MM | LED ピン幅2.54mm |
D2_3 | LED | LEDs:LED-3MM | LED ピン幅2.54mm |
D2_4 | LED | LEDs:LED-3MM | LED ピン幅2.54mm |
D3_1 | LED | LEDs:LED-3MM | LED ピン幅2.54mm |
D3_2 | LED | LEDs:LED-3MM | LED ピン幅2.54mm |
D3_3 | LED | LEDs:LED-3MM | LED ピン幅2.54mm |
D3_4 | LED | LEDs:LED-3MM | LED ピン幅2.54mm |
P1 | CONN_02X25 | Pin_Headers:Pin_Header_Straight_2x25 | ピンヘッダ 2x25 2.54mm |
P2 | CONN_02X05 | Pin_Headers:Pin_Header_Straight_2x05 | ピンヘッダ 2x5 2.54mm |
P3 | CONN_02X05 | Pin_Headers:Pin_Header_Straight_2x05 | ピンヘッダ 2x5 2.54mm |
R1 | 660 | Resistors_ThroughHole:Resistor_Horizontal_RM7mm | 660Ω 炭素皮膜 |
R2 | 660 | Resistors_ThroughHole:Resistor_Horizontal_RM7mm | 660Ω 炭素皮膜 |
R3 | 660 | Resistors_ThroughHole:Resistor_Horizontal_RM7mm | 660Ω 炭素皮膜 |
R4 | 660 | Resistors_ThroughHole:Resistor_Horizontal_RM7mm | 660Ω 炭素皮膜 |
R5 | 660 | Resistors_ThroughHole:Resistor_Horizontal_RM7mm | 660Ω 炭素皮膜 |
R6 | 660 | Resistors_ThroughHole:Resistor_Horizontal_RM7mm | 660Ω 炭素皮膜 |
R7 | 660 | Resistors_ThroughHole:Resistor_Horizontal_RM7mm | 660Ω 炭素皮膜 |
R8 | 660 | Resistors_ThroughHole:Resistor_Horizontal_RM7mm | 660Ω 炭素皮膜 |
R9 | 660 | Resistors_ThroughHole:Resistor_Horizontal_RM7mm | 660Ω 炭素皮膜 |
R10 | 660 | Resistors_ThroughHole:Resistor_Horizontal_RM7mm | 660Ω 炭素皮膜 |
R11 | 660 | Resistors_ThroughHole:Resistor_Horizontal_RM7mm | 660Ω 炭素皮膜 |
R12 | 660 | Resistors_ThroughHole:Resistor_Horizontal_RM7mm | 660Ω 炭素皮膜 |
R13 | 330k | Resistors_ThroughHole:Resistor_Horizontal_RM7mm | 330kΩ 炭素皮膜 |
R14 | 330k | Resistors_ThroughHole:Resistor_Horizontal_RM7mm | 330kΩ 炭素皮膜 |
R15 | 330k | Resistors_ThroughHole:Resistor_Horizontal_RM7mm | 330kΩ 炭素皮膜 |
R16 | 330k | Resistors_ThroughHole:Resistor_Horizontal_RM7mm | 330kΩ 炭素皮膜 |
R17 | 330k | Resistors_ThroughHole:Resistor_Horizontal_RM7mm | 330kΩ 炭素皮膜 |
R18 | 330k | Resistors_ThroughHole:Resistor_Horizontal_RM7mm | 330kΩ 炭素皮膜 |
R19 | 330k | Resistors_ThroughHole:Resistor_Horizontal_RM7mm | 330kΩ 炭素皮膜 |
R20 | 330k | Resistors_ThroughHole:Resistor_Horizontal_RM7mm | 330kΩ 炭素皮膜 |
R21 | 330k | Resistors_ThroughHole:Resistor_Horizontal_RM7mm | 330kΩ 炭素皮膜 |
R22 | 330k | Resistors_ThroughHole:Resistor_Horizontal_RM7mm | 330kΩ 炭素皮膜 |
R23 | 330k | Resistors_ThroughHole:Resistor_Horizontal_RM7mm | 330kΩ 炭素皮膜 |
R24 | 330k | Resistors_ThroughHole:Resistor_Horizontal_RM7mm | 330kΩ 炭素皮膜 |
R25 | 330k | Resistors_ThroughHole:Resistor_Horizontal_RM7mm | 330kΩ 炭素皮膜 |
R26 | 330k | Resistors_ThroughHole:Resistor_Horizontal_RM7mm | 330kΩ 炭素皮膜 |
R27 | 330k | Resistors_ThroughHole:Resistor_Horizontal_RM7mm | 330kΩ 炭素皮膜 |
R28 | 330k | Resistors_ThroughHole:Resistor_Horizontal_RM7mm | 330kΩ 炭素皮膜 |
R29 | 2.2k | Resistors_ThroughHole:Resistor_Horizontal_RM7mm | 2.2kΩ 炭素皮膜 |
R30 | 2.2k | Resistors_ThroughHole:Resistor_Horizontal_RM7mm | 2.2kΩ 炭素皮膜 |
R31 | 2.2k | Resistors_ThroughHole:Resistor_Horizontal_RM7mm | 2.2kΩ 炭素皮膜 |
R32 | 2.2k | Resistors_ThroughHole:Resistor_Horizontal_RM7mm | 2.2kΩ 炭素皮膜 |
SWM1 | SPST | Buttons_Switches_ThroughHole:SW_PUSH_6mm | タクトスイッチ |
SWM2 | SPST | Buttons_Switches_ThroughHole:SW_PUSH_6mm | タクトスイッチ |
SWM3 | SPST | Buttons_Switches_ThroughHole:SW_PUSH_6mm | タクトスイッチ |
SWK1 | SPST | Buttons_Switches_ThroughHole:SW_PUSH_6mm | タクトスイッチ |
SWK2 | SPST | Buttons_Switches_ThroughHole:SW_PUSH_6mm | タクトスイッチ |
SWK3 | SPST | Buttons_Switches_ThroughHole:SW_PUSH_6mm | タクトスイッチ |
SWK4 | SPST | Buttons_Switches_ThroughHole:SW_PUSH_6mm | タクトスイッチ |
SWK5 | SPST | Buttons_Switches_ThroughHole:SW_PUSH_6mm | タクトスイッチ |
SWK6 | SPST | Buttons_Switches_ThroughHole:SW_PUSH_6mm | タクトスイッチ |
SWK7 | SPST | Buttons_Switches_ThroughHole:SW_PUSH_6mm | タクトスイッチ |
SWK8 | SPST | Buttons_Switches_ThroughHole:SW_PUSH_6mm | タクトスイッチ |
SWK9 | SPST | Buttons_Switches_ThroughHole:SW_PUSH_6mm | タクトスイッチ |
SWK10 | SPST | Buttons_Switches_ThroughHole:SW_PUSH_6mm | タクトスイッチ |
SWK11 | SPST | Buttons_Switches_ThroughHole:SW_PUSH_6mm | タクトスイッチ |
SWK12 | SPST | Buttons_Switches_ThroughHole:SW_PUSH_6mm | タクトスイッチ |
SWK13 | SPST | Buttons_Switches_ThroughHole:SW_PUSH_6mm | タクトスイッチ |
TP1 | TEST_1P | Pin_Headers:Pin_Header_Straight_1x01 | |
TP2 | TEST_1P | Pin_Headers:Pin_Header_Straight_1x01 | |
TP3 | TEST_1P | Pin_Headers:Pin_Header_Straight_1x01 | |
U1 | TA48M033F | TO_SOT_Packages_SMD:TO-252-2Lead | SMD 3.3V レギュレータ |
Nucleo F746ZGの改造
Nucleo F746ZGは非常に多機能なSoCマイコンを使っています。多くの機能がピンに多重化されているものの、一部は基板外の複数の信号がピンを奪い合う形になっています。これを解決するために、Nucleo F746ZGには多くのショート・ブリッジがあります。
浮舟基板を使うためにはNucleo F746ZGの以下のショート・ブリッジを取り去ってください。
- SB125
- SB132
- SB133
- SB178
- SB181
また、以下のジャンパー・ピンはオープンにしてください。
- JP6
- JP7
以上の改造によって、Nucelo F746ZGのEthernetポートおよび、USB OTGポートが使用できなくなります(ホストと接続しているmbed用USBポートには影響はありません)。
既知の問題
- アンチ・チャタリング回路は見直した方がいいです。現状でチャタリングが残っています。
- C1は他のキャパシタと異なり、2.54mmピッチです。
参考リンク
- 『雲仙』 オーディオ・フレームワーク : フレームワークの全体像の解説。CODEC基板アダプタの設計情報
- skeleton_unzen_nucleo_f746 Nucleo F746ZGおよびUI基板を使う場合のスケルトンプログラム。F746を使う方はここから読み始めると良いでしょう。
ukifune.h
- Committer:
- shorie
- Date:
- 2017-01-27
- Revision:
- 6:482c7c12ef76
- Parent:
- 5:31b355cb7364
- Child:
- 7:e2a690a654ff
File content as of revision 6:482c7c12ef76:
/** * \file ukifune.h * \brief header file for the ukifune UI module. * \arthur Seiichi Horie * \date 22/Jan/2017 * \details * First of all, call init() API before calling other API. */ #ifndef _UKIFUNE_H_ #define _UKIFUNE_H_ #include <cstdint> #include "unzen.h" /** * \brief API to control UI board "Ukifune" */ namespace ukifune { /** * \brief LED accessing names. */ enum LED{ led1_1 = 0, ///< LED1_1 led1_2, ///< LED1_2 led1_3, ///< LED1_3 led1_4, ///< LED1_4 led2_1, ///< LED2_1 led2_2, ///< LED2_2 led2_3, ///< LED2_3 led2_4, ///< LED2_4 led3_1, ///< LED3_1 led3_2, ///< LED3_2 led3_3, ///< LED3_3 led3_4 ///< LED3_4 } ; /** * \brief Buttun Switch accesing names. */ enum SWITCH{ swm1 = 0, ///< button switch SWM1 swm2, ///< button switch SWM2 swm3, ///< button switch SWM3 swk1, ///< button switch SWK1 swk2, ///< button switch SWK2 swk3, ///< button switch SWK3 swk4, ///< button switch SWK4 swk5, ///< button switch SWK5 swk6, ///< button switch SWK6 swk7, ///< button switch SWK7 swk8, ///< button switch SWK8 swk9, ///< button switch SWK9 swk10, ///< button switch SWK10 swk11, ///< button switch SWK11 swk12, ///< button switch SWK12 swk13 ///< button switch SWK13 } ; /** * \brief Initialize internal variable of module. Have to call once before all other processing of Ukifune. * \pram audio Pointer to the unzen audio framework. Test points are registered as interrupt / process status flag. */ extern void init( unzen::Framework *audio); /** * \breif get the state of the button switches. * \param pushing [out] Bit map of the switch which is changing state from released to pushed. "1" is pushed. * \param releasing [out] Bit map of the switch which is changing state from pushed to released. "1" is releasing. * \param pushed [out] Bit map of the switch which is pushed. "1" is pushed. * \details * The bit position in the bit map are represented by enum SWITCH. */ extern void get_button_state( uint32_t & pushing, uint32_t & releasing, uint32_t & pushed ); /** * \brief Turn the specific LED ON. * \param LED The LED to be on. */ extern void turn_led_on( enum LED ); /** * \brief Turn the specific LED off. * \param LED The LED to be off. */ extern void turn_led_off( enum LED ); /** * \brief Toggle the specific LED. * \param LED The LED to be toggled. */ extern void toggle_led( enum LED ); /** * \brief Get the state of LED. * \param LED The LED to be checked. * \return "non-zero" On. * \return 0 Off. */ extern int get_led_state( enum LED ); /** * \brief get the level of volume. * \param number the numver of volueme [0,7] * \return the volume level. [0.0, 1.0] */ extern float get_volume( int number ); /** * \brief Update the internal. state of ukifune module. Have better to call around every 30mS * */ extern void tick(void); } #endif // _UKIFUNE_H_