2016年10月31日

Bluetoothモジュールでキーボード


今回はMicrochip社製のBluetoothモジュールRN-42を使用した
Bluetoothキーボードの動作確認を行ったため、
覚え書きとして紹介させて頂きます。



IMG_3826_.jpg


USBシリアルでそのまま簡単に通信できるよう、



microUSBをPCに接続するとシリアルデバイスとしてCOMポートが認識されます。
USBに接続すると緑色LEDがゆっくり点滅します。



teraterm等でボーレート115200bpsに設定します。


@下記の文字列を打ち込んでコマンドモードにすると
緑色LEDが速く点滅します。
 $$$

AiPhoneやタブレットからモジュールを検索する際に表示される
モジュール名を設定します。
 SN,KEY

Bペアリングモードを有効化します。
 SM,6

CシリアルプロファイルSSPでなく、入力デバイスHIDへ変更します。
 S~,6

DHIDデバイスの中のキーボードとして認識させます。
 SH,2

E設定有効化のために再起動させます。
 R,1

再起動後、iPhoneからBluetoothをONにして検索すると
先ほどモジュール名として設定した「KEY」が表示されます。

クリックして接続して、
teratermからキー入力すると、そのまま文字列が入力されました。

IMG_3827.PNG


他に便利なコマンドとして下記の設定パラメータ一覧表示があります。
 x 




注意点としてはBluetoothとしてiPhoneなどと接続中の場合は
一度、デバイス削除してからでないとコマンドモードに入れないようです。



今回はiPhoneSEで接続して実験しました。
RN-42はBluetooth 2.1+EDRのため、
少し古いBluetooth規格で最近のデバイスと接続できるのか心配でしたが、
iPhoneSEや手持ちのWindowタブレット(OSはWin10アップ済み)等でも接続できました。




posted by Crescent at 00:00| Comment(0) | TrackBack(0) | 電子部品 | このブログの読者になる | 更新情報をチェックする

2016年10月23日

複数chのAD変換

今回はSTM32でのDMAを使用したAD変換について紹介します。

環境はこれまで同様、
・STM32F303K8
 +SW4STM32(System Workbench for STM32)
 +STM32CubeMX(HAL ライブラリ、F3 ver. 1.60)
です。

複数chをAD変換する場合はDMA転送を前提とするようです。
STM32CubeMXは下記のように設定してコードを出力しました。

ADSetting.png

dma.png


コード例は下記の通り。
こちらのサイトのコード例を参考にさせて頂きました。

・変数系定義

uint32_t  ADCValue;
int Number;
enum{ LENGTH = 1024 };
uint16_t ADCBuffer[LENGTH];

・AD変換後処理関数
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* AdcHandle)
{
  //After AD Convert
}


・初期化後にADCの読み込みを開始させる
HAL_ADC_Start_DMA(&hadc1, ADCBuffer, LENGTH);


・AD変換の設定部分

  /**Configure Regular Channel
    */
  sConfig.Channel = ADC_CHANNEL_1;
  sConfig.Rank = 1;
  sConfig.SingleDiff = ADC_SINGLE_ENDED;
  sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
  sConfig.OffsetNumber = ADC_OFFSET_NONE;
  sConfig.Offset = 0;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }

    /**Configure Regular Channel
    */
  sConfig.Channel = ADC_CHANNEL_2;
  sConfig.Rank = 2;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }


コードを書いてAD変換したところ、
1ch目しか読み込めない不具合に遭遇。

自動生成されたConfigure Regular Channelの部分を確認すると、
赤文字のch2の設定が部分的に抜けていました。

自動生成後されたCubeMXのコードは1ch目の設定のみ
されている状況で、2ch目については何も書かれていませんでした。

赤文字部分を追加して、再度実行すると
2ch分、出力されることが確認できました。


F3 CubeMXの不具合かもしれません。
今回の不具合を回避するような設定方法があるかもしれませんが、
希望通りの動作でない場合は自動生成された部分含めて、
地道にコードを確認することが必要ですね。



また、AD変換の注意点として、
DMA転送のバッファ定義(上の例ではADCBuffer)は
変数定義をuint16_tかint16_tの16bit長にすることです。

DMA設定で
Memory Increment: Enable
Memory Data Width: Half Word (16bit)
では16bitずつバッファメモリをシフトさせるため、
uint32_tなどの32bit長にすると
バッファが破壊されてAD変換値が桁外れに大きな値になってしまいます...


posted by Crescent at 00:00| Comment(0) | TrackBack(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする

2016年10月19日

Eclipse ビルド前自動保存設定

SW4STM32(System Workbench for STM32)は
Eclipseベースの開発環境となっています。

MPLABIDEやVisualStudioなどを頻繁に使用するユーザーからすると、
ビルド時に勝手に変更点が保存されない設定にイラつくことがあるかと思います。

設定を変更するだけで、ビルド時に変更点を保存するようにできたため、
設定について紹介します。



デフォルトの英語版の場合

saveworkspace-en.png




Eclipse Mars を Babel Language Packs で日本語化した場合

saveworkspace -ja.png


これでだいぶ開発もしやすくなります。
もっと設定を弄ってVisualStudioと同じショートカットにしたいところですが、
自分用のスペシャル設定に慣れてしまうと、
他の環境で戸惑うのでスペシャル設定はほどほどにしたいと思います笑

posted by Crescent at 00:00| Comment(0) | TrackBack(0) | 組込ソフト | このブログの読者になる | 更新情報をチェックする

2016年10月13日

SPI/I2C シリアル通信

今回はSTM32でのSPI/I2C シリアル通信について紹介します。

環境はこれまで同様、
・STM32F303K8
 +SW4STM32(System Workbench for STM32)
 +STM32CubeMX
です。


◆HALライブラリを使用したI2C通信
HALライブラリを使用したI2C通信でSTM32側がマスタの場合、
PICマイコンなどのようにACKとかRepeatStartなど考える必要はありません。
下記の読み込みか書き込みかの関数を使い分けるだけです!

HAL_I2C_Mem_Read( I2C_HandleTypeDef *hi2c,
                  uint16_t DevAddress,
                  uint16_t MemAddress,
                  uint16_t MemAddSize,
                  uint8_t *pData,
                  uint16_t Size,
                  uint32_t Timeout);

HAL_I2C_Mem_Write( I2C_HandleTypeDef *hi2c,
                  uint16_t DevAddress,
                  uint16_t MemAddress,
                  uint16_t MemAddSize,
                  uint8_t *pData,
                  uint16_t Size,
                  uint32_t Timeout);



非接触赤外線センサMLX90614を読みだした場合
#define DevAddress  (0xB4)
⇒0x5A
として読み書きされます。
R/Wを含めてアドレスを指定するようです。

環境温度読み込み時の例は下記の通り。


HAL_I2C_Mem_Read( hi2c,
                  (uint16_t)DevAddress,
                  0x06,
                  I2C_MEMADD_SIZE_8BIT,
                  (uint8_t*) ret,
                  3,
                  100);

res=(float)(ret[0]+(ret[1]<<8))/100.0;
resに環境温度が格納されます。

MLX90614_i2c-STM32.png

LabToolを使用してデータ通信状態。
直接LabToolをI2Cラインへ接続するとインピーダンスが変わってしまうため、
1k~10kの抵抗を挟んでロギングしました。

I2Cはアドレスの表記が7bitアドレスでR/Wを含めるか、含めないか
チップメーカによってまちまちなのでそこがいつも引っかかるところです。

また、マイコンがいつもと違うと同様にまちまちなので
今回のような地味な検証が後々役立ちます。


思った以上にすんなり動いてくれました。



◆HALライブラリを使用したSPI通信
I2C同様、SPIも思った以上にシンプルでした。
デバイスのデータシートと睨めっこしながら、
main.c内のMX_SPI1_Initの設定を確認してください。
通信できない時はSPIのクロック極性やサンプル位置設定が
間違っていることがほとんどです。

hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;//SPI_POLARITY_HIGH//?!
hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;//SPI_PHASE_1EDGE//?!


HAL_SPI_TransmitReceive( SPI_HandleTypeDef *hspi,
                      uint8_t *pTxData,
                      uint8_t *pRxData,
                      uint16_t Size,
                      uint32_t Timeout);

実際にあるデバイスで通信した場合
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4,0);//CS
HAL_SPI_TransmitReceive(&hspi1,sData,rData,1,100);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4,1);//CS


送受信を想定してTransmitReceiveを使用していますが、
受信専用の関数
HAL_SPI_Receive( SPI_HandleTypeDef *hspi,
               uint8_t *pData,
               uint16_t Size,
               uint32_t Timeout);
送信専用関数
HAL_SPI_Transmit( SPI_HandleTypeDef *hspi,
                uint8_t *pData,
                uint16_t Size,
                uint32_t Timeout);
もあります。
ただ、実際に実験してみてはいませんが、
どちらかの場合でも送受信関数TransmitReceiveで
空データを使うことで同じ関数でいけそうな気がします。



SPIについても思った以上にすんなり動いてくれました。

PICの時はRepeatStartのタイミングなど色々苦労させられましたが、
STM32のHALライブラリのシリアル通信は思った以上に考えることが少なく、
すんなり動いてくれました。



posted by Crescent at 00:00| Comment(0) | TrackBack(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする

2016年10月09日

10月と11月のイベント紹介


今月から来月にかけて参加予定のイベントについて紹介させて頂きます。

◆デジタルコンテンツEXPO
デジタルコンテンツEXPOが日本本科学未来館で開催されます。
コンテンツ分野で活躍する研究者やクリエイター、企業関係者等が参加し、
最新の情報を交換しながら、デジタルコンテンツ産業の5年後、10年後の将来像を描き出します。

最新の大学や企業の技術展示やガジェット展示などがあります。

ProjectionBallの展示を行う予定です。

日付: 2016.10.27(木)-30(日)
時間: 10:00 - 17:00
場所:日本科学未来館

入場料無料



◆スマートイルミネーション横浜2016
スマートイルミネーション横浜2016は横浜みなとみらい周辺で開催される
LED 照明や太陽光発電などの省エネルギー技術と、
アーティストの創造性を融合させ、新たな夜景の創造を試みる国際アートイベントです。

Crescentとしては初めてアートイベントに
ProjectionBallを応用したインスタレーションとして展示を行います。
横浜市開港記念会館地下で展示予定です。

日付: 2016.11.5(土)-6(日)
時間: 17:00〜22:00 
場所: 象の鼻パーク、横浜市開港記念会館

入場料無料


芸術の秋、ぜひお越しください。
posted by Crescent at 00:00| Comment(0) | TrackBack(0) | イベント | このブログの読者になる | 更新情報をチェックする