Dual USBアダプターHS 修理してみる

 

Dual USBアダプターHSは近藤科学のサーボとPCを通信するための製品↓です。サーボの設定や動作確認が可能です。値段は1つ約6,000円。

Dual USBアダプターHS | 近藤科学

 壊してしまったので修理しました。(逆挿ししたのか、電圧を上げすぎたのか、壊れた原因が分かってない。)

 

直す前の状態

アダプター単体で約350mAほど流れており、かなり発熱してしまう状態です。特におもて面に半田付けされているマルチプレクサが熱くなっていました。

f:id:sasapero:20200829235443j:plain
f:id:sasapero:20200829233909j:plainf:id:sasapero:20200829233948j:plain

シリアル変換のチップは特に問題ないようです。ICSマネージャでもアダプタ自体は認識されます。

USBtreeviewというソフトでも問題なく表示されました。

f:id:sasapero:20200829233612j:plain

 

用意した物

マルチプレクサADG734BRUZを購入しました。マルツで1つ581.82(税抜)円でした。(20/08/29)

他にdigkeyで購入するものが無かったので、マルツの店舗受け取りサービスを利用しました。便利。

IC SWITCH QUAD SPDT 20TSSOP ADG734BRUZ|電子部品・半導体通販のマルツ

※購入と修理は自己責任でお願いします。

 

 直した後の状態

元々ついていたチップを外して新品に取り替えました。電流は21mAになりました。

f:id:sasapero:20200829233841j:plain

f:id:sasapero:20200830000335j:plain

ICSマネージャでサーボが認識されるようになりました。

f:id:sasapero:20200829234708j:plain

※手元にあるKRS3204とKRS4034で動作確認がとれました。(両方とも通信規格はICS3.5)他のサーボで認識されるかどうか分かりません。

 

 

esp32でROBO-ONE用基板を作る

 

ROBO-ONE Lite用の基板がとりあえず動いたので、回路図とBOMを載せます。

esp32でコントローラーとKONDOサーボを動かす方法については別の記事に書いてみたので参考にどうぞ。

ROBO-ONE - Google ドライブ

f:id:sasapero:20200814125037j:plain 

BOMは以下のスプレッドシートにまとめました。電子部品の購入は自己責任でお願いします。

電子部品の購入先は秋月とdigkeyです。基板1枚作るのに必要な部品代は約2805円でした。基板本体はJLCPCBで発注しました。

ROBO-ONE Lite 基板BOM - Google スプレッドシート

 ご指摘&アドバイスあればお願いします!

 f:id:sasapero:20200815232735j:plainf:id:sasapero:20200818132843j:plain

 

搭載した機能は

 ・USBコネクタ→シリアル変換

・自動リセットで自動書き込み

・動作確認用LED2つ

・マシンを光らせるフルカラーLED1つ

コントローラー(VS-C3)と接続

KONDOサーボ用ICS変換回路×2

・ジャイロセンサで姿勢制御

・TOFセンサで距離測定

・USB電源とバッテリ電源自動切換え → うまくいってないので、ダイオードを介してUSBVCCを5Vに接続しました。

・バッテリ電源→7.4Vに降圧するDCDCコンバータ

・7.4V→5Vに降圧するレギュレータ

・5V→3.3Vに降圧するレギュレータ

 

マイコンをesp32にしたので、OTAでデバッグWiFiで無線書き込み)できますね。

 

 -------------------------------------------------------------------------

参考にしたサイトをまとめておきます。

 ・非常に制作意欲がかきたてられたブログ

https://blog.rogiken.org/blog/2019/03/29/szk2roboone/

 

Visual studio code の platform IOでOTAを行う方法

https://nombi.info/posts/esp8266/ota/

 

・esp32のGPIOについての解説

https://lang-ship.com/blog/work/esp32-gpio-output/

 

・esp32で滑らかにLEDを光らせる方法

https://wak-tech.com/archives/742

 

・USB電源とバッテリ電源を自動で切り替える回路について

http://radiopench.blog96.fc2.com/blog-entry-962.html

 

esp32でKONDOサーボを動かす

 

ROBO-ONEに出場するにはKONDOサーボを動かす必要があります。

esp32はSerial通信ポートを3つ持っています。UART0,UART1,UART2です。PCとマシンを接続して通信しながらKONDOサーボを動かしたい時があるかもしれないので、UART0は使わないようにします。

私の場合、11.1V系サーボ(KRS2552)と7.4Vサーボ(KRS3204)の2種類を使うので電圧が違うサーボごとにSerialを使い分けるようにしました。KONDOの公式は1つのUARTに接続できるサーボの推奨個数は9個と言っています。3kg級のマシンを作る時はサーボの数が19個を余裕で超えるため、UART0も使う必要がありそうです。四肢でSerialを分けた方が配線的には楽なので本当は4つ欲しいところ。

https://kondo-robot.com/faq/ics_board_-tutorial1

シリアルピン保護のため、ポリスイッチ↓をそれぞれ付けました。冷却されると導電性が戻って再び使用可能になります。

http://akizukidenshi.com/catalog/g/gP-11307/

11.1V系 → UART1

7.4V系  → UART2

f:id:sasapero:20200814125056p:plainf:id:sasapero:20200816021941p:plain

KONDOサーボを動かす通信規格をICS(Interactive Communication System)と言い、近藤科学独自のデータ通信規格です。PWMと違って、サーボを数珠つなぎ出来るのが特徴です。KONDO公式のライブラリはTXとRXを交互に切り替えることによってサーボに指令角度を送信するのと同時にサーボの温度や電流を受信できます。

そのTXとRXを切り替えるためのモジュール(ICS変換基板)が市販されている↓のですが、場所をとるので基板に実装しました。

https://kondo-robot.com/product/03121

ICS変換基板の自作についてはPONDAさんの記事↓を参考にしました。そちらの記事に記載されている回路図とほぼ同じですが、私が引いた回路図も載せておきます。使用している部品も購入先もPONDAさんと同じです。

 http://robooptions.blog.fc2.com/blog-entry-10.html

f:id:sasapero:20200816032511p:plainf:id:sasapero:20200816033529j:plain

 -------------------------------------------------------------------------

esp32のUART1は初期状態では内部フラッシュに接続されているため、UARTとしての使用はできません。UART1のピンアサインを変更することで使用可能になります。HardwareSerial.cppにあるTX1とRX1を定義しなおせば良いです。

Visual studio codeでプログラミングをする場合、以下のパスにHardwareSerial.cppがあります。

C:\Users\ユーザー名\.platformio\packages\framework-arduinoespressif32\cores\esp32\HardwareSerial.cpp

#ifndef RX1
#define RX1 14 //9
#endif

#ifndef TX1
#define TX1 12 //10
#endif

 -------------------------------------------------------------------------

KONDOサーボは通信速度が3種類から選べます(①)。esp32に書き込むプログラムで設定したBAUDRATEと合っていないとサーボは動きません。

私はプリメイドAIから拝借したサーボを使用したのですが、箱出しの状態では通信速度が115200と1250000が混合?しているのでICSマネージャーで設定し直してください。また、ストレッチやスピード、パンチ等も初期設定とは異なる状態のものが多いので、ICS Serial Managerの「②ファイル→開く→初期値(initial value)」から一括で書き込むと便利です。

//ICS関係
const long BAUDRATE = 115200; //115200
const int TIMEOUT = 10;     //通信できてないか確認用にわざと遅めに設定

f:id:sasapero:20200816035649p:plain

 

 -------------------------------------------------------------------------

プログラム

KONDOのライブラリは初期状態ではUARTが1つしか動かせないので、以下のように2つで動かせるようにします。BAUDRATEとTIMEOUTの設定は1つで良いです。ライブラリの説明書19Pにも同様の記述があります。

//ICS関係
const long BAUDRATE = 115200;
const int TIMEOUT = 10; //通信できてないか確認用にわざと遅めに設定

const byte EN_PIN1 = 15;
IcsHardSerialClass krs1(&Serial1EN_PIN1BAUDRATETIMEOUT); 

const byte EN_PIN2 = 13;
IcsHardSerialClass krs2(&Serial2EN_PIN2BAUDRATETIMEOUT); 

  -------------------------------------------------------------------------

HeartToHeart4やRobovie-MakerなどのGUIなソフトウェアは使わず、サーボIDや指令角度を手打ちしてモーション作成を行います。以下↓は「ID1のサーボを0度まで動かす」プログラムです。

krs1.setPos(1,3500); //サーボの角度を3500へ 

IDは0~31、指令角度は3500~11500が有効で、ありえないIDや角度が入力してしまい実行されると、予期しない動きをする可能性があります。

サーボを壊したくないので、範囲外の数値が入力され、実行されるとサーボが脱力するようにライブラリを変更しました。更に、この関数は指令角度を3500~11500で指定する必要があり、直観的に何度なのか分かりづらいため、degreeで指定できるように変更しました。

「IcsBaseClass.h」を以下のように変更し、

//    int setPos(byte id,unsigned int pos);    //目標値設定
      int setPos(byte id,int deg);    //目標値設定 0801 pos → deg にするために型をintに変更

 

「IcsBaseClass.cpp」にある「setPos(byte id, int deg)」を以下のように変更します。 

int IcsBaseClass::setPos(byte idint deg) //0803 pos → degに変換
{
  byte txCmd[3];
  byte rxCmd[3];
  unsigned int rePos;
  bool flg;

  //0803 deg→posに変換するために追加
  long pos = deg * 29.633;
  pos = pos + 7500;

  txCmd[0= 0x80 + id;             // CMD
  txCmd[1= ((pos >> 7& 0x007F); // POS_H
  txCmd[2= (pos & 0x007F);        // POS_L

  if (deg > MAX_DEG || deg < MIN_DEG)
  {
    txCmd[0= 0x80 + id; // CMD
    txCmd[1= 0;
    txCmd[2= 0;
    //    return ICS_FALSE;
  }

  //送受信

  flg = synchronize(txCmd, sizeof txCmdrxCmd, sizeof rxCmd);
  if (flg == false)
  {
    return ICS_FALSE;
  }

  rePos = ((rxCmd[1<< 7& 0x3F80+ (rxCmd[2& 0x007F); //フリー

  return rePos;
}

※ posからdegに変換する関数がデフォルトで入っているので、その関数をsetPos()内で呼び出すという方法でも同じことは出来ます。

 

また、いちいちサーボのIDを調べながらモーション作成するのは時間がかかるため、IDとマシンの部位を関連付けました。

  name_set(L_arm_1, -45);  name_set(R_arm_1, 45);
  name_set(L_arm_2, -130); name_set(R_arm_2, -130);

部位の名前はご自身で分かりやすく命名してください。

//      name   ID

#define BODY_1 1
#define BODY_2 2
#define L_leg_1 3
#define L_leg_2 4
#define L_leg_3 5
#define L_leg_4 6
#define R_leg_1 7
#define R_leg_2 8
#define R_leg_3 9
#define R_leg_4 10
#define R_arm_1 11
#define R_arm_2 12
#define L_arm_1 13
#define L_arm_2 14

int name_set(int nameint deg_2)
{

  if (name == BODY_1)
  {
    krs1.setPos(BODY_1deg_2);
  }
  else if (name == BODY_2)
  {
    krs2.setPos(BODY_2deg_2);
  }
  else if (name == L_leg_1)
  {
    krs1.setPos(L_leg_1deg_2);
  }
  else if (name == L_leg_2)
  {
    krs1.setPos(L_leg_2deg_2);
  }
  else if (name == L_leg_3)
  {
    krs1.setPos(L_leg_3deg_2);
  }
  else if (name == L_leg_4)
  {
    krs2.setPos(L_leg_4deg_2);
  }
  else if (name == R_leg_1)
  {
    krs1.setPos(R_leg_1deg_2);
  }
  else if (name == R_leg_2)
  {
    krs1.setPos(R_leg_2deg_2);
  }
  else if (name == R_leg_3)
  {
    krs1.setPos(R_leg_3deg_2);
  }
  else if (name == R_leg_4)
  {
    krs2.setPos(R_leg_4deg_2);
  }
  else if (name == R_arm_1)
  {
    krs2.setPos(R_arm_1deg_2);
  }
  else if (name == R_arm_2)
  {
    krs1.setPos(R_arm_2deg_2);
  }
  else if (name == L_arm_1)
  {
    krs2.setPos(L_arm_1deg_2);
  }
  else if (name == L_arm_2)
  {
    krs1.setPos(L_arm_2deg_2);
  }
}

 

 ご指摘&アドバイスあればお願いします!

esp32でVS-C3を使用する

 

ROBO-ONEに出場するためにはマシンを遠隔で操作する必要があります。

esp32はBluetoothモジュールを搭載しているのでスマホ等をコントローラーにすることが出来ますが、格闘用途としては使いにくいため物理ボタンのコントローラーを使用することとしました。

最新のPSのコントローラーはBluetooth接続が可能らしいので、接続がスムーズなら使ってみてもいいと思います。

 

Vstoneのコントローラーの製品名は「VS-C3」、受信機の名前は「VS-RCV3」です。

このコントローラーは双方向通信が可能で、以下のように↓マシンのバッテリー低下をバイブレーションで知らせることが出来るようです。(そういう基板を作ってとプログラムをすれば)

f:id:sasapero:20200815124411p:plain

https://www.vstone.co.jp/products/vs_c3/index.html

 

f:id:sasapero:20200815124902j:plain f:id:sasapero:20200430173733p:plain

 

-------------------------------------------------------------------------

回路


VS-C3の基本的な使い方はこちら↓を参考にしました。VS-C3はPSのコントローラーと殆ど中身は同じらしく、ライブラリの名前がPS2となっています。

https://nakkye.at.webry.info/201411/article_1.html

http://robototakutdu.blog33.fc2.com/blog-entry-343.html

このブログ↓はノイズ除去的なことをしているみたいです。すごい。

https://www.atelier-yu.co.jp/wireless-software/

 

VS-RCV3を使用するにはSPI通信をする必要があります。esp32で使用する場合、公開されているarduino用のライブラリのままでは動かなかったので気を付けてください。

esp32のSPIにはHSPIとVSPIの2種類あるらしいですが、どう違うのかはわかりません。私はVSPIを使いました。配線は以下の通りです。

SEL(CS,CEと同等) → IO5

CLK (SCLK,SCKと同等)→ IO18

DAT(SDO,MISOと同等?) → IO19

CMD(SDI,MOSIと同等?) → IO23

  f:id:sasapero:20200814125056p:plain f:id:sasapero:20200814125059p:plain

過去の記事↓にも書きましたが、基板に直接VS-RCV3用のピンヘッダを半田付けする場合、VS-RCV3を上下反転するため配線に気を付けてください。間違えると基板からはみ出ます。

https://sasapon.hatenablog.com/entry/2020/04/30/174348

 

各通信ピンにプルアップ抵抗を付けました。抵抗4つだと狭い基板を占領してしまうので集合抵抗を使用しました。秋月で売っているチップ抵抗アレイ10kΩ*4↓です。手ハンダは難しいので頑張ってください。

http://akizukidenshi.com/catalog/g/gP-04664/

f:id:sasapero:20200815233004j:plain f:id:sasapero:20200815232735j:plain

 

※VS-RCV3を基板にピンヘッダで直接取り付ける場合、しっかり固定されません。グラグラするためペアリングボタンが押しにくいうえ、衝撃に弱いためマシンが倒れたときに通信が途切れることがあるかもしれません。正解はフレームにネジ固定だと思います。

※esp32のアンテナ部分の上下にVS-RCV3が被さらないように注意が必要です↓。esp32のミアンダ型アンテナの放射パターンがどのような感じなのかはわかりませんが、なるべく離したほうがいいですよね、きっと。

https://www.espressif.com/sites/default/files/documentation/esp32_hardware_design_guidelines_en.pdf

 

-------------------------------------------------------------------------

プログラム

Vstoneの公式?ライブラリを使用しているのでどこまで公開していいのかわかりません。SPI通信の初期設定は共通だと思うので載せます。 上記の配線の場合です。

 
 uint8_t pad_buf[30];      //PAD入力データ用バッファ
 spi_t* spi_pad;
  
 spi_pad = spiStartBus(VSPI2500000SPI_MODE2SPI_LSBFIRST);
  pinMode(19INPUT);
  pinMode(5OUTPUT);//SPI通信のss(スレーブをセレクト)
  digitalWrite(5HIGH); //→ SEL
   
  spiAttachSCK(spi_pad18); //VSPICLK → CLK
  spiAttachMISO(spi_pad19); //VSPIQ DAT →→ 
  spiAttachMOSI(spi_pad23); //VSPID CMD ←←

  int i = 0;
  for(i = 0i < sizeof(pad_buf); i++){
    pad_buf[i= 0x00;
  }
  delay(50);
 

 

  ご指摘&アドバイスあればお願いします!

 

 

ROBO-ONE当日の荷物

備忘録として、ROBO-ONE当日に持っていくもの/持っていくと便利なものをまとめます。

 

必須

  • バッテリー(延長戦があるので3個以上あるとよい)
  • バッテリー充電器
  • バッテリーチェッカー
  • 配線予備
  • 基板予備
  • サーボ、サーボホーン予備
  • コントローラー
  • コントローラー用乾電池
  • PC
  • 通信用USBケーブル
  • 延長コード、電源タップ(なるべく長いもの)
  • 基本的な工具(+ドライバ、六角ドライバ、ラジオペンチ、ニッパー、ハサミ)
  • ネジ類
  • ネジロック剤
  • テーブルマット(控室のテーブルでマシン調整をする場合)
  • ROBO-ONEのIDを印刷した紙、認定大会参加に必要なもの
  • 移動手段のチケット、交通系IC

 

念のために必要かも / あったら便利なもの

  • マシン用電源(ALINCOなど)
  • マシン用の電源ケーブル
  • 予備フレーム
  • 予備ケーブル用圧着端子、ハウジング
  • 養生テープ、両面テープ
  • 瞬間接着剤
  • ケーブルタイ
  • 工具(ワイヤーストリッパー、圧着工具、やすり、ホットボンド
  • はんだこて、こて台、はんだ
  • テスター
  • icsマネージャ
  • 小型ファン(延長戦時の機体冷却に便利。)

 

 究極に心配性な場合

  • M2、M3ねじ切りタップ
  • ドリル
  • ドリル用電動ドライバ
  • 基板に使われている電子部品の予備
  • サーボ修理キット(バイス、グリス、パーツクリーナー、キムワイプなど)
  • 計り
  • お守り

 

宿泊する場合

  • 首枕
  • スマホ充電器
  • 着替え
  • パジャマ(浴衣式の寝巻きが嫌な場合)
  • 汗拭きシート
  • 宿泊ホテルのメンバーズカード
  • ティッシュ、ウェットティッシュ
  • 常備薬
  • スキンケア系
  • 髭剃り
  • イヤホン
  • ビニール袋

 

深夜バス、満喫で宿泊する場合

 

 

何か抜けてるもの、他にあると便利なものがあれば教えてください!

ケーブル自動カットマシンver.1

AWG32のケーブルを4000本、自動でカットする機械をつくりました。

 

f:id:sasapero:20200514011820j:plain

1本を40㎜の長さにカットするので、写真の10mタイプでは250本程度しか切り出せません。マルツでボビンタイプを購入しました。

   

使用した物

・ギヤードモータ https://amzn.to/2Ww02UZ

メカナムのキットからとってきました。本当はステッピングモーターで回転数を正確に制御できた方がいいと思います。

この商品のギヤードモータには元々ポテンションメータがついていたのですが、届いた時は壊れていました。友人も同じ物を購入して同じく壊れていたので訳アリだったから安かったのかと思います。

 ・arduino nano https://amzn.to/3cA4Uhr

ミニ四駆の車輪

・ニッパー

3dプリンター anycubic Mega-s

 

完成した物

f:id:sasapero:20200516010116j:plain
f:id:sasapero:20200516010103j:plain
f:id:sasapero:20200516010109j:plain

 

  

ケーブルを送り出す部分の動作。

https://www.youtube.com/watch?v=vqTYrHOV-F0&feature=youtu.be

 

ケーブルをカットする部分はニッパーを直付けしてサーボモータで閉じたり開いたりしています。長時間可動させているとサーボモータがニッパーのバネに負けて発熱が原因で壊れました。バネを外して稼働させると電流は0.3A程に収まり長時間の動かせそうです。

https://www.youtube.com/watch?v=Rt-avlemA7M&feature=youtu.be

 

5本連続でカットしてみました。

 f:id:sasapero:20200514022033j:plain

0.5mm~1mmほどのズレが出ています。実はこの程度の誤差ならいい方で、使用する安定化電源を変えたり、電圧を変えたりすると誤差が最大2㎜程に跳ね上がります。

 

f:id:sasapero:20200516010134j:plain f:id:sasapero:20200516010128j:plain f:id:sasapero:20200516010122j:plain

基本一定方向にしか回さないので問題なし?と思っていましたが、ニッパーでケーブルをカットする時に少し影響を受けているみたいです。

 

 

3dプリンターだけでつくれて誤差が出ない機構を探してます。

 

------------------------------------------------------------------------------------

 

ケーブルをカットした後は、両端1㎜の被膜を剥き、予備ハンダします。この作業はパット見ると3工程しかありませんが、実際に手作業してみると

①ケーブルを定規にあててカットする位置を定める。

②ケーブルをカット。

③両端1mm程の被膜を剥く。

④ワイヤーをひねる。(ハンダを浸透させるため。)

⑤予備ハンダをする。

のように、複数の作業が隠れていることが分かりました。

 

あまり関係ない話ですが、今回のように大量生産する場合はなるべく同じ作業をまとめて行うことが大事だと思っています。というのも、いちいち作業を切り替えいると、切り替え時の初期の立ち上がり時間が無駄になりその時間が積み重なると非常にもったいないからです。(工具を持ち替えたり、物を移動させたり。)

ただし、大量生産に入る前に一連の流れを通しで試しておかなければなりません。全て完成した後にまとめて修正は地獄なので。

 

まずは①~②の工程を自動化してみました。ワイヤーをカットする産業用の機械は結構あるみたいです。それらを参考にしつつ設計してみました。

最終的には①~⑤全ての工程を自動化したいと思っております。

 

 

VS-RCV3のSTEPデータを公開してみました

VS-RCV3のSTEPデータをgrabcadで公開しました。

https://grabcad.com/library/vstone-vs-rcv3-1

f:id:sasapero:20200430173733p:plain

多少の寸法のズレはあると思います。

 

amazon商品ページ

受信機単体 : https://amzn.to/3d0tXK9

コントローラーセット : https://amzn.to/2KIzqcF

 

kicad用、表面実装用の3dデータ(拡張子はwrl)で良ければグーグルドライブからダウンロードしてください。

※メイン基板に対してVS-RCV3が反転して取り付けられるので、配線も反転してください。

VS-RCV3 - Google ドライブ

f:id:sasapero:20200430173842p:plain