2021年07月31日

PS2/USB逆変換アダプタ V2

プログラミング専用こどもパソコンichigojamやサーバマシン等のPS2接続キーボード用として、2018年からPS2/USB逆変換アダプタを提供してきました。

現状のPS2/USB逆変換アダプタはUSB Host(Vinculum)とSTM32マイコンのダブル構成となっていましたが、昨今の半導体不足でSTM32マイコンが入手困難、在庫があった場合でも非常に高価な状況が続いています。STM32マイコンの在庫が戻るまで販売を一旦中止する予定でしたが、一定の強いニーズが多く、継続的な供給を求められている状況でSTM32マイコンを置き換えたV2を検討することになりました。STM32マイコンの代替としてどのマイコンも正直、同じ状況ではありますが、STM32マイコンに比べてPICマイコンの方が入手性が良い状況です。そのため、少しずつPICマイコンに実装し直していました。空き時間を見つけつつ、3か月程度で実装と従来と同様の機能が確認できたため、現状の在庫がなくなり次第、PICマイコン版のPS2/USB逆変換アダプタ V2に移行する予定です。

基本的な機能、使い方は同じですが、USBホスト処理の実装が異なるため、キーレスポンス等が若干異なる場合があります。

ps2usb_v2.jpg

PICマイコン版のPS2/USB逆変換アダプタ V2はPIC32マイコンでUSBホスト機能とPS2の処理を実装しました。また、300mAのリセッタブルヒューズを追加しています。現状の在庫がなくなる秋以降にV2に移行する予定です。
posted by Crescent at 00:00| Comment(0) | 電子部品 | このブログの読者になる | 更新情報をチェックする

2021年07月24日

光センサ基板

今回はBroadcom製 光センサAPDS-9008を用いた光センサ基板を紹介します。APDS-9008はアナログ出力の光センサで人の目に近いスペクトル応答性を持っています。また、外付けの抵抗によって感度の調整が可能です。一般的な光センサとして使用されるCdSセンサのカドミウムを使用していません。

APDS-9008は広い照明範囲の出力線形性を備えており、使いやすい光センサですが、非常に小さいため、光センサ基板として基板に実装してみました。アナログ出力に加えて、コンパレータ出力を実装することで様々な用途に使用できるようにしました。光センサの感度とコンパレータ閾値は2つの可変抵抗でそれぞれ調整できます。100lux前後から数1000luxまでの光量を測定することが可能です。


lightsensor_0.jpg

lightsensor_1.jpg

コネクタはGroveコネクタを使用することでM5Stack等にも簡単に接続できます。試作基板では問題なく動作を確認することができたため、量産版の製造を開始をしたいと思います。
posted by Crescent at 00:00| Comment(0) | 電子部品 | このブログの読者になる | 更新情報をチェックする

2021年07月17日

Eport E10

今回はシリアルイーサネットモジュールEport E10について紹介します。Eport E10はAliexpressで1個2000円前後で購入可能です。Eportシリーズは中国版Xportという感じでシリアル(UART)通信のコマンドで簡単にイーサネットのサーバやクライアントとして動作して他の機器と通信することが可能です。Eport E10はFreeRTOSベースですが、他にLinuxベースのEport Pro-EP10、Pro-EP20等があります。


E10-1.jpg

E10-3.jpg

Eport E10そのままでは扱いにくいため、Grove互換コネクタをつけた基板を設計して取り付けみました。


3.3Vの電源を供給してLANコネクタをLANケーブルでPCに接続するとDHCPで自動的にIPアドレスが割り当てられます。デフォルトではブラウザから169.254.173.207にアクセスすると詳細の設定をすることが可能です。ID admin PW adminでログインできます。


E10-2.jpg


また、UARTから文字を受けたり、コマンドを送ることもできます。デフォルトのボーレートは115200bpsです。なお、UARTからコマンド(Cliコマンド)に入るためにはデフォルトでは「+++」を入力する必要があります。ただ、teraterm等から入力する場合、キーボードからの文字入力ではなかなかCli環境に入れませんでした。teraterm等から入力する場合は事前に「+++」の文字列をメモ帳等からコピーしてteraterm上で右クリックで貼り付けして送信すると一括で+が連続送信されるため、Cli環境に入ることができることが分かりました。

Eport E10を使用して簡単かつ安価にイーサネット通信ができそうなことが分かったため、いろいろ試してみたいと思います。
posted by Crescent at 00:00| Comment(0) | 電子部品 | このブログの読者になる | 更新情報をチェックする

2021年07月10日

I2C/RS422-RS485コンバータ基板

今回はI2C/UARTプロトコルブリッジICのSC16IS740/750/760 を応用したI2C/RS422-RS485コンバータ基板について紹介します。I2C/UARTプロトコルブリッジICにRS422-RS485トランシーバICを組み合わせることでI2CからRS422-RS485の送受信をできるようにしました。

以前に開発したI2C/Uartコンバータと同様にマイコンのメインクロックに依存せずにボーレートを設定可能なことやソフトウェアUARTのような高負荷にならずに通信できる等の特徴があります。RS422-RS485のトランシーバICを搭載することでRMD Servoモータ等のRS485対応のデバイスをI2Cから制御することができます。

実際に基板を設計してみました。

rs4XX_img1.jpg

rs4XX_img2.jpg


マイコンからはSC16IS740/750/760 をI2Cデバイスとして制御し、RS422-RS485のボーレート設定、半二重の送信/受信処理をすることができます。64 bytesのバッファを内蔵しているため、通信速度が遅いI2Cでも一旦、バッファで受けて後から受信したデータを読み出すといったことが可能です。

SC16IS740/750/760の電源は3.3Vですが、信号の各ピンは5V耐圧のためArduino UNOなどに接続してそのまま使用することも可能です。基板上に3.3Vレギュレータを搭載しているため、5Vもしくは3.3V電源の両方で動作します。

I2CはGrove互換コネクタ、RS422-RS485の接続は供給電源のV(Groveの電源そのまま直結)、RS422-RS485の+、RS422-RS485の-、共通GNDのGを4ピンターミナルにしました。基板上でRS422-RS485の+と-はそれぞれプルアップ、プルダウンしています。なお、終端抵抗は4ピンターミナルに配線と一緒に接続することが可能なため、基板パターンのみの未実装にしました。

手元にSO-ICのトランシーバICがなかったため、無理にDIP8をSO-ICにハンダしましたが、問題なく動作を確認することができました。サンプルコードを作成して設計に問題なければ、量産版の製造と販売開始をしたいと思います。
posted by Crescent at 00:00| Comment(0) | 電子部品 | このブログの読者になる | 更新情報をチェックする

2021年07月03日

STM32 RTC初期化注意点

今回はSTM32マイコンのRTC初期化の注意点について紹介します。STM32マイコンの多くはVBAT端子を備えており、CR2032といった電池と32.768kHzといった水晶発振子を取り付けることでマイコンのメイン電源OFFでも時刻を保持することができます。また、ファームウェアの書き換え等を行っても時刻情報を保持することができるため、非常に便利です。

基本的な使い方としてはSTM32CubeMXで自動生成されるコードそのままで問題ありませんが、頻繁にマイコンのON/OFFを繰り返す場合、RTC初期化HAL_RTC_Init関数で時刻の遅延が発生する厄介なバグがあります。STフォーラムでもディスカッション(リンク切れ?)されています。HAL_RTC_Init関数内のクロック設定で既にRTCの初期化が完了している場合に再度、クロックが設定される際にクロックが一時的に停止して遅延が発生します。電源投入後に外部から時刻を取得して電源ONのまま永続的に使用する場合には問題ありませんが、頻繁に電源をON、OFFする場合、初期化HAL_RTC_Init関数によって毎回、遅延が発生するため、時刻の遅れが無視できなくなります。

初期化HAL_RTC_Init関数によって発生する遅延を防止するため、既にRTC設定がされている場合に初期化HAL_RTC_Init関数を実行しないという分岐処理を入れることで遅延を回避する設定が必要です。

■修正前
static void MX_RTC_Init(void)
{
  ~~~
  HAL_RTC_Init(&hrtc)!=HAL_OK)
  {
     Error_Handler();
  }
  ~~~
}

■修正後
static void MX_RTC_Init(void)
{
~~~
  if((RCC->BDCR & RCC_BDCR_RTCEN)==0)//RTC初期化されていない場合
  {
     if(HAL_RTC_Init(&hrtc)!=HAL_OK)
     {
        Error_Handler();
      }
  } 
  else//RTC初期化済の場合
  {
     HAL_PWR_EnableBkUpAccess();
     __HAL_RCC_BKP_CLK_ENABLE();//シリーズによっては不要
     __HAL_RCC_RTC_ENABLE();
     HAL_NVIC_SetPriority(RTC_IRQn, 0, 0);
     HAL_NVIC_EnableIRQ(RTC_IRQn);
  }

~~~
}

上記の設定で初期化HAL_RTC_Init関数によって発生する遅延を防止することが可能です。最近のSTM32マイコンのシリーズでは遅延がほぼ無視できますが、比較的歴史の長いF0やF1シリーズ等では遅延が1秒程度と大きいようです。今後のHALライブラリのバージョンアップで遅延防止の処理を入れ込んでほしいですね。
posted by Crescent at 00:00| Comment(0) | 組込ソフト | このブログの読者になる | 更新情報をチェックする