2017年10月08日

イーサネットモジュール

今回は簡単にイーサネット通信できるモジュールを紹介します。

STM32マイコンでは内蔵のイーサネットも使用可能ですが、
メモリや割り込み処理など多くのリソースを要します。

今回紹介するW5500モジュール
SPIで外付けで簡単にイーサネットが実現できるモジュールです。

LANポートとW5500チップが一体になったモジュールです。

IMG_0001.JPG


W5500チップ自体に32kBバッファも内蔵されています。
最大8ソケットまで対応しています。

また、単にTCP、UDPだけでなく、
DHCP client、DNS client、FTP client、FTP server、SNMP agent/trap、
SNTP client、TFTP client、HTTP serverの他に
MQTT Clientまで対応しています。

MQTTまで対応しているとは驚きです。
ライブラリもこちらで公開されています。
Arduino版はこちら


イーサネットを使用する=raspberryPIを使う
という以外の有力な選択肢となりそうです。
簡単という意味ではraspberryPIに劣りますが、
SDカード耐久性やOS起動時間など考えると、
メリットは大きいと思います。



ただ、W5500の他にW5100、W5200など姉妹品があり、
W5500はちょっと癖があるようなので、
今後、STM32マイコンで実際に使用して評価してみたいと思います。

他の注意点としては
モジュールによってMACアドレスが付属していないものがあるようです。
その場合はMACアドレスEEPROM等を購入して、
MACアドレスを入手してから使用する必要があります。
ラベル:部品 IoT
posted by Crescent at 00:00| Comment(0) | 電子部品 | このブログの読者になる | 更新情報をチェックする

2017年09月24日

ソフトリセット

今回はSTM32マイコンでソフトリセットの使用方法について紹介します。


I2Cのデバイスが検出できない場合や何かしらの異常が発生した場合に
電源投入時の状態に初期化したい場合があります。

その場合に便利な機能がソフトリセットです。



使用するSTM32マイコンのコアに応じて、
ヘッダが異なります。

CortexM0の場合は#include "core_cm0.h"
CortexM3の場合は#include "core_cm3.h"
CortexM4の場合は#include "core_cm4.h"
必要に応じて、変更します。

ソフトリセットを行う関数は
NVIC_SystemReset();
です。

何かしらの異常が発生した後に
上記の関数を入れておくと、
ソフトリセットが掛かります。

異常が連続して起きた場合に変な挙動にならないように
ソフトリセットの使い方には要注意ですが、
比較的簡単に実装できました。

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

2017年09月15日

BOOT0切替なし書き換え

今回はSTM32マイコンでBOOT0切替なしで
書き換えを行う方法を紹介します。

CubeMXでNucleo等を選択すると
BOOT0切替なしでファームの書き換えができます。

一方で、マイコン単体を選択して
最低限の設定でCubeMXで生成したコードを一度書き込むと、
次回の書き換え等でBOOT0をHighにして電源を入れないと
SWD端子に接続したSTLinkからマイコンが認識されず、
ファームの書き込みや削除ができない現象が発生しました。


原因としてはシリアルデバッグを有効化せずにCubeMXで生成したコードを書き込むと、
シリアルが無効化されてプログラムが動いてしまうことです。
書き換える場合はBoot0をHighにして電源を入れて
bootをシステムメモリに変更することで書き換えできます。

意図しない書き換え防止やセキュリティ強化になりますが、
Boot0のジャンパやスイッチの切り替えが面倒です。


ここで、BOOT0切替なしで書き換えを行う方法を紹介します。
CubeMXの設定でシリアルデバッグを有効化します。

serial-debug.jpg


この状態で生成したファームを書き込むと次回以降の書き換えは
BOOT0切替なしで書き換えできます。


製品としてファームを書き込む以外の実験用途では
意図しない書き換え防止やセキュリティ強化が不要なため、
CubeMXの設定でシリアルデバッグを有効化するのが
Boot0切替の手間がなく便利です。



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

2017年09月04日

直交エンコーダ読込(Quadrature encoder)

今回はSTM32マイコンで直交エンコーダを読み込む方法をご紹介します。



秋月で販売しているロータリーエンコーダを使用しました。
1kΩより大きい抵抗ではインピーダンスが大きすぎるようで
330Ωでプルアップすると読み込めました。

CubeMXの設定は下記の通りです。

Combined ChannelsをEncoder Modeに設定すると
A相、B相を接続するポートが自動的に割り当てられます。

tim-encoder.jpg



詳細設定は次の通りです。
Periodに設定した値までカウントすると0にリセットされます。
また、EncoderModeをTI1とTI2に設定することで
4逓倍となります。

この設定の場合、
今回のエンコーダは1回転24パルスですが、
4逓倍で1回転96パルスとなります。


tim-encoder2.jpg


CubeMXで自動で生成されたコードから下記のコードを追加しました。



 HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);
  printf("Initialized Success!!\n");

  while (1)
  {
    HAL_Delay(300);
    int8_t uwDirection = __HAL_TIM_IS_TIM_COUNTING_DOWN(&htim3);
    uint16_t cnt=TIM3->CNT;//htim3.Init.Period;
    printf("CNT:%d, Drc:%d \n",cnt,uwDirection);
  }

__HAL_TIM_IS_TIM_COUNTING_DOWN関数で回転方向を取得できます。
エンコーダの値はTIM3->CNTで取得します。


実際にコードを実行してエンコーダを回転させてみました。

result.jpg


実際のロボットなどの位置取得では、
1回転で0に戻ると制御できないため、
0で割り込みを発生させて繰り上がり、繰り下がり処理等を行うのが一般的です。

また、他にチャタリング防止等のフィルタ機能もあるようなので、
必要に応じて使ってみると良いと思いました。



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

2017年08月16日

OpenMV試食

今回は単体で画像認識等の処理が可能な
OpenMVという部品を紹介します。

通常は画像処理はraspberryPIやBeagleboneなど
ARMでもAシリーズとOpenCVが動くOS上で処理を行うことが一般的です。

ただ、OSを積むとOSのバージョンによる差や電源断によるシステムイメージ破壊など
色々考えることが増えて大変です。

OpenMVはSTM32F7マイコンにmicroPythonを組込んで、
組込マイコン単体で処理できるデバイスです。

他のマイコンに組込んで画像処理を行うことができます。

スイッチサイエンスでも扱い始めたようですが、
それより1か月前にロボットショップで発注したものが届いたため、
ちょっと試食した様子を紹介します。


まずはUSBをPCへ繋ぐ前に
開発環境をインストールします。
QTベースのソフトでなかなか良くできています。
インストールと一緒にドライバもインストールされます。

USBを接続するとカメラ横のLEDが眩しく点灯します。

openmv-photo.JPG



ただ、ソフトを起動して、左下の接続ボタンを押しても
ソフト上でOpenMV本体を操作できない不具合がありました。


良く見るとソフトウェアの右下に「Firmware out of date」と表示されており、
クリックして内部ファームのバージョンを更新するとしっかり認識できました。

openmv.jpg

最初はフォーカスがずれているため、
レンズを外に出す方向にひたすら回してピントを調整します。
調整できると右上にOpenMVのカメラで撮影したLEDのリングが映りました。

ということでポイントはまずはファームのアップデートということのようです。

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