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基板です。 /media/uploads/shorie/imgp2217.jpg この写真では中央下の緑の基板が浮舟です。上の白い基板は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側のピンヘッダおよび、基板接続用のフラットケーブル(圧接コネクタ付き)が必要です。

ReferenceValueFootprint注釈
C10.1uCapacitors_ThroughHole:C_Disc_D3_P2.50.1uF ピン幅2.54mm
C210uCapacitors_ThroughHole:C_Radial_D5_L6_P2.510uF ピン幅2.54mm
C30.1uCapacitors_ThroughHole:C_Disc_D6_P50.1uF ピン幅5.08mm
C40.1uCapacitors_ThroughHole:C_Disc_D6_P50.1uF ピン幅5.08mm
C50.1uCapacitors_ThroughHole:C_Disc_D6_P50.1uF ピン幅5.08mm
C60.1uCapacitors_ThroughHole:C_Disc_D6_P50.1uF ピン幅5.08mm
C70.1uCapacitors_ThroughHole:C_Disc_D6_P50.1uF ピン幅5.08mm
C80.1uCapacitors_ThroughHole:C_Disc_D6_P50.1uF ピン幅5.08mm
C90.1uCapacitors_ThroughHole:C_Disc_D6_P50.1uF ピン幅5.08mm
C100.1uCapacitors_ThroughHole:C_Disc_D6_P50.1uF ピン幅5.08mm
C110.1uCapacitors_ThroughHole:C_Disc_D6_P50.1uF ピン幅5.08mm
C120.1uCapacitors_ThroughHole:C_Disc_D6_P50.1uF ピン幅5.08mm
C130.1uCapacitors_ThroughHole:C_Disc_D6_P50.1uF ピン幅5.08mm
C140.1uCapacitors_ThroughHole:C_Disc_D6_P50.1uF ピン幅5.08mm
C150.1uCapacitors_ThroughHole:C_Disc_D6_P50.1uF ピン幅5.08mm
C160.1uCapacitors_ThroughHole:C_Disc_D6_P50.1uF ピン幅5.08mm
C170.1uCapacitors_ThroughHole:C_Disc_D6_P50.1uF ピン幅5.08mm
C180.1uCapacitors_ThroughHole:C_Disc_D6_P50.1uF ピン幅5.08mm
D1_1LEDLEDs:LED-3MMLED ピン幅2.54mm
D1_2LEDLEDs:LED-3MMLED ピン幅2.54mm
D1_3LEDLEDs:LED-3MMLED ピン幅2.54mm
D1_4LEDLEDs:LED-3MMLED ピン幅2.54mm
D2_1LEDLEDs:LED-3MMLED ピン幅2.54mm
D2_2LEDLEDs:LED-3MMLED ピン幅2.54mm
D2_3LEDLEDs:LED-3MMLED ピン幅2.54mm
D2_4LEDLEDs:LED-3MMLED ピン幅2.54mm
D3_1LEDLEDs:LED-3MMLED ピン幅2.54mm
D3_2LEDLEDs:LED-3MMLED ピン幅2.54mm
D3_3LEDLEDs:LED-3MMLED ピン幅2.54mm
D3_4LEDLEDs:LED-3MMLED ピン幅2.54mm
P1CONN_02X25Pin_Headers:Pin_Header_Straight_2x25ピンヘッダ 2x25 2.54mm
P2CONN_02X05Pin_Headers:Pin_Header_Straight_2x05ピンヘッダ 2x5 2.54mm
P3CONN_02X05Pin_Headers:Pin_Header_Straight_2x05ピンヘッダ 2x5 2.54mm
R1660Resistors_ThroughHole:Resistor_Horizontal_RM7mm660Ω 炭素皮膜
R2660Resistors_ThroughHole:Resistor_Horizontal_RM7mm660Ω 炭素皮膜
R3660Resistors_ThroughHole:Resistor_Horizontal_RM7mm660Ω 炭素皮膜
R4660Resistors_ThroughHole:Resistor_Horizontal_RM7mm660Ω 炭素皮膜
R5660Resistors_ThroughHole:Resistor_Horizontal_RM7mm660Ω 炭素皮膜
R6660Resistors_ThroughHole:Resistor_Horizontal_RM7mm660Ω 炭素皮膜
R7660Resistors_ThroughHole:Resistor_Horizontal_RM7mm660Ω 炭素皮膜
R8660Resistors_ThroughHole:Resistor_Horizontal_RM7mm660Ω 炭素皮膜
R9660Resistors_ThroughHole:Resistor_Horizontal_RM7mm660Ω 炭素皮膜
R10660Resistors_ThroughHole:Resistor_Horizontal_RM7mm660Ω 炭素皮膜
R11660Resistors_ThroughHole:Resistor_Horizontal_RM7mm660Ω 炭素皮膜
R12660Resistors_ThroughHole:Resistor_Horizontal_RM7mm660Ω 炭素皮膜
R13330kResistors_ThroughHole:Resistor_Horizontal_RM7mm330kΩ 炭素皮膜
R14330kResistors_ThroughHole:Resistor_Horizontal_RM7mm330kΩ 炭素皮膜
R15330kResistors_ThroughHole:Resistor_Horizontal_RM7mm330kΩ 炭素皮膜
R16330kResistors_ThroughHole:Resistor_Horizontal_RM7mm330kΩ 炭素皮膜
R17330kResistors_ThroughHole:Resistor_Horizontal_RM7mm330kΩ 炭素皮膜
R18330kResistors_ThroughHole:Resistor_Horizontal_RM7mm330kΩ 炭素皮膜
R19330kResistors_ThroughHole:Resistor_Horizontal_RM7mm330kΩ 炭素皮膜
R20330kResistors_ThroughHole:Resistor_Horizontal_RM7mm330kΩ 炭素皮膜
R21330kResistors_ThroughHole:Resistor_Horizontal_RM7mm330kΩ 炭素皮膜
R22330kResistors_ThroughHole:Resistor_Horizontal_RM7mm330kΩ 炭素皮膜
R23330kResistors_ThroughHole:Resistor_Horizontal_RM7mm330kΩ 炭素皮膜
R24330kResistors_ThroughHole:Resistor_Horizontal_RM7mm330kΩ 炭素皮膜
R25330kResistors_ThroughHole:Resistor_Horizontal_RM7mm330kΩ 炭素皮膜
R26330kResistors_ThroughHole:Resistor_Horizontal_RM7mm330kΩ 炭素皮膜
R27330kResistors_ThroughHole:Resistor_Horizontal_RM7mm330kΩ 炭素皮膜
R28330kResistors_ThroughHole:Resistor_Horizontal_RM7mm330kΩ 炭素皮膜
R292.2kResistors_ThroughHole:Resistor_Horizontal_RM7mm2.2kΩ 炭素皮膜
R302.2kResistors_ThroughHole:Resistor_Horizontal_RM7mm2.2kΩ 炭素皮膜
R312.2kResistors_ThroughHole:Resistor_Horizontal_RM7mm2.2kΩ 炭素皮膜
R322.2kResistors_ThroughHole:Resistor_Horizontal_RM7mm2.2kΩ 炭素皮膜
SWM1SPSTButtons_Switches_ThroughHole:SW_PUSH_6mmタクトスイッチ
SWM2SPSTButtons_Switches_ThroughHole:SW_PUSH_6mmタクトスイッチ
SWM3SPSTButtons_Switches_ThroughHole:SW_PUSH_6mmタクトスイッチ
SWK1SPSTButtons_Switches_ThroughHole:SW_PUSH_6mmタクトスイッチ
SWK2SPSTButtons_Switches_ThroughHole:SW_PUSH_6mmタクトスイッチ
SWK3SPSTButtons_Switches_ThroughHole:SW_PUSH_6mmタクトスイッチ
SWK4SPSTButtons_Switches_ThroughHole:SW_PUSH_6mmタクトスイッチ
SWK5SPSTButtons_Switches_ThroughHole:SW_PUSH_6mmタクトスイッチ
SWK6SPSTButtons_Switches_ThroughHole:SW_PUSH_6mmタクトスイッチ
SWK7SPSTButtons_Switches_ThroughHole:SW_PUSH_6mmタクトスイッチ
SWK8SPSTButtons_Switches_ThroughHole:SW_PUSH_6mmタクトスイッチ
SWK9SPSTButtons_Switches_ThroughHole:SW_PUSH_6mmタクトスイッチ
SWK10SPSTButtons_Switches_ThroughHole:SW_PUSH_6mmタクトスイッチ
SWK11SPSTButtons_Switches_ThroughHole:SW_PUSH_6mmタクトスイッチ
SWK12SPSTButtons_Switches_ThroughHole:SW_PUSH_6mmタクトスイッチ
SWK13SPSTButtons_Switches_ThroughHole:SW_PUSH_6mmタクトスイッチ
TP1TEST_1PPin_Headers:Pin_Header_Straight_1x01
TP2TEST_1PPin_Headers:Pin_Header_Straight_1x01
TP3TEST_1PPin_Headers:Pin_Header_Straight_1x01
U1TA48M033FTO_SOT_Packages_SMD:TO-252-2LeadSMD 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ピッチです。

参考リンク

Committer:
shorie
Date:
Sat Jan 28 12:50:04 2017 +0000
Revision:
7:e2a690a654ff
Parent:
6:482c7c12ef76
Refactor the name of parameter of the get_button_state() API.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
shorie 1:6253da3ab855 1 /**
shorie 6:482c7c12ef76 2 * \file ukifune.h
shorie 1:6253da3ab855 3 * \brief header file for the ukifune UI module.
shorie 1:6253da3ab855 4 * \arthur Seiichi Horie
shorie 1:6253da3ab855 5 * \date 22/Jan/2017
shorie 1:6253da3ab855 6 * \details
shorie 1:6253da3ab855 7 * First of all, call init() API before calling other API.
shorie 1:6253da3ab855 8 */
shorie 1:6253da3ab855 9
shorie 1:6253da3ab855 10
shorie 0:bb828a2c4208 11 #ifndef _UKIFUNE_H_
shorie 0:bb828a2c4208 12 #define _UKIFUNE_H_
shorie 0:bb828a2c4208 13
shorie 0:bb828a2c4208 14 #include <cstdint>
shorie 0:bb828a2c4208 15 #include "unzen.h"
shorie 0:bb828a2c4208 16
shorie 3:fbfb87c5e0fe 17 /**
shorie 5:31b355cb7364 18 * \brief API to control UI board "Ukifune"
shorie 3:fbfb87c5e0fe 19 */
shorie 0:bb828a2c4208 20 namespace ukifune
shorie 0:bb828a2c4208 21 {
shorie 1:6253da3ab855 22 /**
shorie 1:6253da3ab855 23 * \brief LED accessing names.
shorie 1:6253da3ab855 24 */
shorie 0:bb828a2c4208 25 enum LED{
shorie 2:dcaea5f9d9a7 26 led1_1 = 0, ///< LED1_1
shorie 2:dcaea5f9d9a7 27 led1_2, ///< LED1_2
shorie 2:dcaea5f9d9a7 28 led1_3, ///< LED1_3
shorie 2:dcaea5f9d9a7 29 led1_4, ///< LED1_4
shorie 2:dcaea5f9d9a7 30 led2_1, ///< LED2_1
shorie 2:dcaea5f9d9a7 31 led2_2, ///< LED2_2
shorie 2:dcaea5f9d9a7 32 led2_3, ///< LED2_3
shorie 2:dcaea5f9d9a7 33 led2_4, ///< LED2_4
shorie 2:dcaea5f9d9a7 34 led3_1, ///< LED3_1
shorie 2:dcaea5f9d9a7 35 led3_2, ///< LED3_2
shorie 2:dcaea5f9d9a7 36 led3_3, ///< LED3_3
shorie 2:dcaea5f9d9a7 37 led3_4 ///< LED3_4
shorie 0:bb828a2c4208 38 } ;
shorie 0:bb828a2c4208 39
shorie 1:6253da3ab855 40 /**
shorie 1:6253da3ab855 41 * \brief Buttun Switch accesing names.
shorie 1:6253da3ab855 42 */
shorie 0:bb828a2c4208 43 enum SWITCH{
shorie 2:dcaea5f9d9a7 44 swm1 = 0, ///< button switch SWM1
shorie 2:dcaea5f9d9a7 45 swm2, ///< button switch SWM2
shorie 2:dcaea5f9d9a7 46 swm3, ///< button switch SWM3
shorie 2:dcaea5f9d9a7 47 swk1, ///< button switch SWK1
shorie 2:dcaea5f9d9a7 48 swk2, ///< button switch SWK2
shorie 2:dcaea5f9d9a7 49 swk3, ///< button switch SWK3
shorie 2:dcaea5f9d9a7 50 swk4, ///< button switch SWK4
shorie 2:dcaea5f9d9a7 51 swk5, ///< button switch SWK5
shorie 2:dcaea5f9d9a7 52 swk6, ///< button switch SWK6
shorie 2:dcaea5f9d9a7 53 swk7, ///< button switch SWK7
shorie 2:dcaea5f9d9a7 54 swk8, ///< button switch SWK8
shorie 2:dcaea5f9d9a7 55 swk9, ///< button switch SWK9
shorie 2:dcaea5f9d9a7 56 swk10, ///< button switch SWK10
shorie 2:dcaea5f9d9a7 57 swk11, ///< button switch SWK11
shorie 2:dcaea5f9d9a7 58 swk12, ///< button switch SWK12
shorie 2:dcaea5f9d9a7 59 swk13 ///< button switch SWK13
shorie 0:bb828a2c4208 60 } ;
shorie 0:bb828a2c4208 61
shorie 1:6253da3ab855 62 /**
shorie 1:6253da3ab855 63 * \brief Initialize internal variable of module. Have to call once before all other processing of Ukifune.
shorie 1:6253da3ab855 64 * \pram audio Pointer to the unzen audio framework. Test points are registered as interrupt / process status flag.
shorie 1:6253da3ab855 65 */
shorie 0:bb828a2c4208 66 extern void init( unzen::Framework *audio);
shorie 1:6253da3ab855 67
shorie 1:6253da3ab855 68 /**
shorie 1:6253da3ab855 69 * \breif get the state of the button switches.
shorie 1:6253da3ab855 70 * \param pushing [out] Bit map of the switch which is changing state from released to pushed. "1" is pushed.
shorie 7:e2a690a654ff 71 * \param releasing [out] Bit map of the switch which is changing state from pushed to released. "1" is releasing.
shorie 7:e2a690a654ff 72 * \param holding [out] Bit map of the switch which is kept pushed. "1" is holding.
shorie 1:6253da3ab855 73 * \details
shorie 1:6253da3ab855 74 * The bit position in the bit map are represented by enum SWITCH.
shorie 1:6253da3ab855 75 */
shorie 0:bb828a2c4208 76 extern void get_button_state(
shorie 1:6253da3ab855 77 uint32_t & pushing,
shorie 1:6253da3ab855 78 uint32_t & releasing,
shorie 7:e2a690a654ff 79 uint32_t & holding
shorie 0:bb828a2c4208 80 );
shorie 0:bb828a2c4208 81
shorie 1:6253da3ab855 82 /**
shorie 1:6253da3ab855 83 * \brief Turn the specific LED ON.
shorie 1:6253da3ab855 84 * \param LED The LED to be on.
shorie 1:6253da3ab855 85 */
shorie 0:bb828a2c4208 86 extern void turn_led_on( enum LED );
shorie 1:6253da3ab855 87
shorie 1:6253da3ab855 88 /**
shorie 1:6253da3ab855 89 * \brief Turn the specific LED off.
shorie 1:6253da3ab855 90 * \param LED The LED to be off.
shorie 1:6253da3ab855 91 */
shorie 0:bb828a2c4208 92 extern void turn_led_off( enum LED );
shorie 1:6253da3ab855 93
shorie 1:6253da3ab855 94 /**
shorie 1:6253da3ab855 95 * \brief Toggle the specific LED.
shorie 1:6253da3ab855 96 * \param LED The LED to be toggled.
shorie 1:6253da3ab855 97 */
shorie 0:bb828a2c4208 98 extern void toggle_led( enum LED );
shorie 1:6253da3ab855 99
shorie 1:6253da3ab855 100 /**
shorie 1:6253da3ab855 101 * \brief Get the state of LED.
shorie 1:6253da3ab855 102 * \param LED The LED to be checked.
shorie 2:dcaea5f9d9a7 103 * \return "non-zero" On.
shorie 2:dcaea5f9d9a7 104 * \return 0 Off.
shorie 1:6253da3ab855 105 */
shorie 0:bb828a2c4208 106 extern int get_led_state( enum LED );
shorie 0:bb828a2c4208 107
shorie 1:6253da3ab855 108 /**
shorie 1:6253da3ab855 109 * \brief get the level of volume.
shorie 1:6253da3ab855 110 * \param number the numver of volueme [0,7]
shorie 2:dcaea5f9d9a7 111 * \return the volume level. [0.0, 1.0]
shorie 1:6253da3ab855 112 */
shorie 0:bb828a2c4208 113 extern float get_volume( int number );
shorie 0:bb828a2c4208 114
shorie 1:6253da3ab855 115 /**
shorie 1:6253da3ab855 116 * \brief Update the internal. state of ukifune module. Have better to call around every 30mS
shorie 1:6253da3ab855 117 *
shorie 1:6253da3ab855 118 */
shorie 0:bb828a2c4208 119 extern void tick(void);
shorie 0:bb828a2c4208 120
shorie 0:bb828a2c4208 121 }
shorie 0:bb828a2c4208 122
shorie 0:bb828a2c4208 123 #endif // _UKIFUNE_H_