ページへ戻る

− Links

 印刷 

BTE074B DXSHIELD のソース :: Besttechnology

knowledge:BTE074B DXSHIELDのソース

« Prev[3]  
TITLE:DXSHIELDマニュアル
#norelated
#contents
[[ショップページへ>https://www.besttechnology.co.jp/modules/onlineshop/index.php?fct=photo&p=220]]

#ref(E133C_3D.png)
**概要 [#i9b1c92f]
DXSHIELDはDynamixelシリーズと通信するためのI/F(RS-485・TTL)をArduinoに増設するシールドです。両I/Fのコネクタに電源を分配する機能も合わせ持ちます。~
また、DXSHIELDのI/Fで通信できるデバイスであれば、Dynamixel以外のサーボモータにも適用できます。

※本製品は半田付け作業を要求します。~
※旧バージョンの[[BTE074]]に対してジャンパの追加やI/F部分のモジュール化などの仕様変更がなされています。~
※文中でUNOとだけ記述している場合はArduino UNO R3未満を指します。

**仕様 [#w1fc9eab]
***同梱内容 [#t8074694]
| 型式等 | 数量 | 備考 |h
|本体 | 1|E133C |
|I/F変換ボード | 1|[[TTL2DXIF]] |
|電源コネクタキット | 1式|ハウジング [[JST VHR-2N>https://www.jst-mfg.com/product/pdf/jpn/VH.pdf]] x1&br;コンタクト [[JST SVH-21T-P1.1>https://www.jst-mfg.com/product/pdf/jpn/VH.pdf]] x2&br;ベース付ポスト [[JST B2P-VH-B>https://www.jst-mfg.com/product/detail.php?series=262]] x1&br;ジャック [[CUI PJ-047AH>https://www.cui.com/product/resource/pj-047ah.pdf]] x1|
|シールド用ピンソケット| 1式|6P x1, 8P x2, 10P x1 |
|ジャンパ| 3個| |

***基本仕様 [#k2975a33]
|BGCOLOR(#d0d8e0):CENTER:|LEFT:|LEFT:|c
|品番|BTE074B |<|
|PCBリビジョン|E133C (2層) |<|
|動作温度範囲|0~60℃ 結露なきこと|<|
|外形寸法|約52x53mm |<|
|重量| |<|
|電源|CN1/CN12:DC6~24V (Dynamixelが要求する電源)&br;内部ロジック:DC5V±5% (Arduinoより供給) |<|
|コネクタ等|JST B4B-EH x5&br;JST B3B-EH x5 |<|
|各I/F仕様|[[TTL2DXIF]]に準拠 |<|

***内部簡略ブロック [#gbb4d2b7]
#ref(E133C_block.png,60%)

***外観・レイアウト [#k37b8ee0]
| top | side |h
| #ref(E133C_TOP.png,27%) | #ref(E133C_SIDEp.png,27%) |
| 3D |<|h
| [[E133C 3D pdf>https://www.besttechnology.co.jp/download/3D/E133C_3D.pdf]]&br;※ダウンロードした上でAcrobat Readerで閲覧の事 |<|
※出荷時にピンソケット・電源用コネクタ・TTL2DXIFは未装着

#ref(E133C_LAYOUT.pdf,100%)

***回路図 [#k1a3e31b]
#ref(E133B_SCH.pdf)

※D1・D2・U1・J1~8・CN1・CN12・CN13~16・C2は未装着

***各機能詳細 [#r071b4b9]
****J1,J5 [#j5c9c0ef]
#ref(E133C_J1_5.png)
-2.54mmピッチ 10ピンシングルラインヘッダ用ランド
-J1とJ5の各端子は相互に接続
-Arduinoと接続する際はJ1に任意のピンソケット等を装着
| Pin No. | Name | Used in DXSHIELD |h
| 1 |IO8| ''yes'' |
| 2 |IO9| ''yes'' |
| 3 |IO10/SS| no |
| 4 |IO11/MOSI | no |
| 5 |IO12/MISO | no |
| 6 |IO13/SCK | no |
| 7 |GND| ''yes'' |
| 8 |AREF| no |
| 9 |AD4/SDA| no |
| 10 |AD5/SCL| no |

****J2,J6 [#o639f73a]
#ref(E133C_J2_6.png)
-2.54mmピッチ 8ピンシングルラインヘッダ用ランド
-J2とJ6の各端子は相互に接続
-Arduinoと接続する際はJ2に任意のピンソケット等を装着
| Pin No. | Name | Used in DXSHIELD |h
| 1 |IO0/RX| ''yes'' |
| 2 |IO1/TX| ''yes'' |
| 3 |IO2| no |
| 4 |IO3| no |
| 5 |IO4| no |
| 6 |IO5| no |
| 7 |IO6| no |
| 8 |IO7| no |

****J3,J7 [#l3a39046]
#ref(E133C_J3_7.png)
-2.54mmピッチ 8ピンシングルラインヘッダ用ランド
-J3とJ7の各端子は相互に接続
-Arduinoと接続する際はJ3に任意のピンソケット等を装着
| Pin No. | Name | Used in DXSHIELD |h
| 1 | - | no |
| 2 |IOREF | no |
| 3 |RESET | no |
| 4 |3V3 | no |
| 5 |5V | ''yes'' |
| 6 |GND | ''yes'' |
| 7 |GND | ''yes'' |
| 8 |Vin | ''yes'' |

****J4,J8 [#b2714017]
#ref(E133C_J4_8.png)
-2.54mmピッチ 6ピンシングルラインヘッダ用ランド
-J4とJ8の各端子は相互に接続
-Arduinoと接続する際はJ4に任意のピンソケット等を装着
| Pin No. | Name | Used in DXSHIELD |h
| 1 |AD0 | no |
| 2 |AD1 | no |
| 3 |AD2 | no |
| 4 |AD3 | no |
| 5 |AD4/SDA | no |
| 6 |AD5/SCL | no |

****U1 [#gc6655a5]
[[TTL2DXIF]]装着前のDXSHIELD~
#ref(E133C_U1.png)
[[TTL2DXIF]]装着後のDXSHIELD~
#ref(E133C_E150.png)
-向きを間違えないように[[TTL2DXIF]]のJ1とJ2の全てのランドを実装
-[[TTL2DXIF]]のCN1とCN2にコネクタが実装されている場合でも、それらを使用する事は可能
-[[TTL2DXIF]]をDXSHIELD以外で使用する場合は、J1とJ2に着脱式のコネクタを装備すると良い

****JP1 [#a37455c9]
#ref(E133C_JP1.png)
-DXSHIELDの電源をArduinoの外部電源として供給する場合に使用
-ショート:[[CN1>#f7942cf7]]もしくは[[CN12>#m09c89fc]]から供給された電源をArduinoのVinに分配~
[[CN1>#f7942cf7]]もしくは[[CN12>#m09c89fc]]に供給する電圧はArduinoのVinが許容する電圧範囲を守る事
-オープン:[[CN1>#f7942cf7]]もしくは[[CN12>#m09c89fc]]から供給された電源とArduinoのVinを切断~
[[CN1>#f7942cf7]]もしくは[[CN12>#m09c89fc]]とArduinoのVin各々に電源を供給するか、USBバスパワーで動作するArduinoであればPCとArduinoをUSBケーブルで常時接続する事

|CENTER:BGCOLOR(red): :idea:|JP1をショートした状態でArduinoのVinから電源を供給してはならない。&br;CN2~CN11の電源がJP1を介してArduinoより供給されるため、使用デバイスの負荷条件によってはJP1等の許容電流を超え基板が損傷する。|

|CENTER:BGCOLOR(red): :idea:|JP1をショートした状態でCN1もしくはCN12とArduinoの外部電源に各々個別の電源を供給してはならない。&br;両電源が短絡するため、電源や負荷の条件によってはJP1や基板のみならず電源までが損傷する。|

****JP2 [#weaf917b]
#ref(E133C_JP2_3.png)
-[[SW1>#g3d6a682]]で選択された送信端子と[[TTL2DXIF]]のRXDを接続
-ショート:I/FボードのRXD端子にDXSHIELD上の信号を接続~
[[SW1>#g3d6a682]]の機能が利用可能
-オープン:I/FボードのRXD端子をDXSHIELD上の信号から切断~
[[SW1>#g3d6a682]]は一切機能しない
-2ピン側に[[TTL2DXIF]]のRXD端子が接続

****JP3 [#sf2421be]
#ref(E133C_JP2_3.png)
-[[SW1>#g3d6a682]]で選択された受信端子と[[TTL2DXIF]]のTXDを接続
-ショート:I/FボードのTXD端子にDXSHIELD上の信号を接続~
[[SW1>#g3d6a682]]の機能が利用可能
-オープン:I/FボードのTXD端子をDXSHIELD上の信号から切断~
[[SW1>#g3d6a682]]は一切機能しない
-2ピン側に[[TTL2DXIF]]のTXD端子が接続

****SW1 [#g3d6a682]
#ref(SW1.png)
-3Tスライドスイッチ
-シリアル通信に使用するArduinoの送受信端子を3パターンから選択~
詳細は[[こちら>#c8763faf]]
-SW1の機能を使用する場合は[[JP2>#weaf917b]]及び[[JP3>#sf2421be]]はいずれもショート状態である事

****CN1 [#f7942cf7]
B2P-VH-Bを実装して使用。[[CN12>#f7942cf7]]を同時に実装する事はできない。
#ref(CN1.png)
-[[JST B2P-VH-B>https://www.jst-mfg.com/product/detail.php?series=262]]
-[[JP1>#a37455c9]]をショートするとArduinoのVin端子へ本電源が接続~
その場合はArduinoのVinが許容する電圧範囲である事
-[[CN2~6>#w4e5b4bc]],[[CN7~11>#q21ef0ec]]のVDD/GND端子へ接続
#ref(PWR_connector.png)

|CENTER:BGCOLOR(red): :idea:|電源の逆接続は電源回路の即時破壊・全損扱いとなる。|

****CN12 [#m09c89fc]
PJ-047AHを実装して使用。[[CN1>#f7942cf7]]を同時に実装する事はできない。
#ref(CN12.png)
-[[CUI PJ-047AH>https://www.cui.com/product/resource/pj-047ah.pdf]]
-対応プラグ外形5.5mm, 内径2.1mm
-極性 センタープラス
#ref(E133C_CN12Pole.png)
-[[JP1>#a37455c9]]をショートするとArduinoのVin端子へ本電源が接続~
その場合はArduinoのVinが許容する電圧範囲である事
-[[CN2~6>#w4e5b4bc]],[[CN7~11>#q21ef0ec]]のVDD/GND端子へ接続

****CN2~CN6 [#w4e5b4bc]
#ref(E133C_CN2_6.png)
-[[JST B3B-EH>https://www.jst-mfg.com/product/detail.php?series=58]]
-TTL I/Fを搭載したDynamixelシリーズ用のコネクタ
-5つのコネクタの各端子はいずれも内部で並列に接続
-TTL I/Fと電源は以下の端子に接続
#ref(DXLSHARE/jst_B3B-EH.png,100%)
| 端子番号 | 信号名 |h
| 1 |GND |
| 2 |VDD |
| 3 |SIGNAL(BIDIRECTION) |

****CN7~CN11 [#q21ef0ec]
#ref(E133C_CN7_11.png)
-[[JST B4B-EH>https://www.jst-mfg.com/product/detail.php?series=58]]
-RS-485 I/Fを搭載したDynamixelシリーズ用のコネクタ
-5つのコネクタの各端子はいずれも内部で並列に接続
-RS-485 I/Fと電源は以下の端子に接続
#ref(DXLSHARE/jst_B4B-EH.png)
| 端子番号 | 信号名 |h
| 1 |GND |
| 2 |VDD |
| 3 |RS-485 D+ |
| 4 |RS-485 D- |

****ユーザランド [#jfa751e7]
#ref(URAND.png)
-2.54mmピッチランド
-工作用
-5V0のシルクの囲みはArdunioから供給される5V、GNDのシルクの囲みはGNDに接続済~
それ以外のランドはフリー
****C2 [#vfde0bbb]
#ref(E133C_C2.png)
-必要に応じてデカップリングコンデンサを装備~
100uF以上の容量を推奨

**使用方法 [#be654865]

***対応するデバイス [#r3b9fa50]
| I/F |  Device Name |h
|TTL|Dynamixel AX・MX・Xシリーズ全般, DXMIO, ToFセンサ |
|RS-485|Dynamixel DX・RX・EX・MX・X・PROシリーズ全般, UD3, UD3.5, UD4, USS3, DXMIO(RS-485版), ToFセンサ(RS-485版) |
要求される電源電圧と対応するプロトコルが同じであれば、I/Fを問わず同時に使用できます。

***接続方法 [#g7d8744a]
ここでは予めJP1~JP4に同梱のピンソケットが実装され、CN1ないしCN12には電源供給用のコネクタないしジャックが実装され、U1にTTL2DXIFが装着されているものとします。~
+JP1~JP4の実装~
付属のピンソケットはリードが長くて弱い。他のArduino用シールドをスタックして使用しないのであれば、市販の2.54mmピッチの1列ピンヘッダを使用しても構わない。
+CN1もしくはCN12の実装~
熱容量の大きいベタパターンに対して行う必要があるため、高い容量の半田ごてを使用すると作業性が上がる。また予めフラックスを塗布したり基板側を半田ごてで温めながら半田を流すと濡れが良くなる。
+TTL2DXIFへピンヘッダの実装~
TTL2DXIFに同梱のピンヘッダを2分割して半田付けし、DXSHIELDのU1(J1,J2)に装着する。ランド近傍に小さい部品があるので、半田の盛り過ぎや半田くずに注意が必要。
+C2の実装~
必要に応じてデカップリングコンデンサを実装するが、こちらも熱容量が大きい事と極性に注意が必要。

半田付けを終えたらDXSHIELDをArduinoに装着します。
+ArduinoにDXSHIELDをスタックさせる。その際に両基板のピンソケット以外が物理的に接触していない事。他のシールドを同時に使用する際は、DXSHIELDが使用している端子に十分配慮する事。
#ref(E133C_uno.png,70%)
+Dynamixelのコネクタと同じDXSHIELD上のコネクタ同士を接続する。DXSHIELDにはTTL・RS-485 I/F共に各々5個のコネクタが装備されているが、I/Fの種類が一致してさえいればどのコネクタを使用しても構わない。
+DXSHIELDのCN1ないしCN12からDynamixelが要求する仕様の電源を供給する。この時絶対に電源の極性を間違えてはならない。
+DXSHIELDのJP1がオープンの場合はArduino本体への電源供給が必要なため、別途USBケーブルやACアダプタをArduinoへ接続して電源供給する。~
DXSHIELDのJP1がショートの場合はCN1からの電源がArduinoへも分配される。この状態でDXSHIELDとArduinoの両方からACアダプタ等を使って給電すると、電源が衝突して故障の原因となる。

#ref(E133C_ASM.png,60%)

***モード選択 [#c8763faf]
Arduinoの種類に依存する部分が多々ありますが、ここではDXSHIELDを[[Arduino UNO R3>https://www.arduino.cc/en/Main/ArduinoBoardUno]]に装着して使用する前提として3つのモードを説明します。

****ソフトウェアシリアルモード[#ee08b548]
ArduinoのIO8・IO9ピンをソフトウェアシリアルで構成しDynamixelと通信するモードです。ArduinoのUSBシリアル通信機能(ハードウェアシリアル)はDynamixelの制御以外の目的に使用できます。~
Arduinoには任意の端子をシリアル通信の送受信端子として使用するSoftwareSerialライブラリが用意されています。最大57600bps程度であれば概ね実用レベルです。~
[[JP2>#weaf917b]]と[[JP3>#sf2421be]]はいずれもショートさせ、[[SW1>#g3d6a682]]を図の位置(SOFT)に切り替えます。
#ref(E133C_SW1_SOFT.png)
本設定によりArduinoのデジタル入出力端子のうちIO8とIO9をソフトウェアシリアル用の端子として使用するため、この2つの端子は他の目的で使用してはなりません。~
また、Arduinoにユーザのスケッチを転送する際は、無条件に本モードに変更しておかないと転送に失敗します。

****ハードウェアシリアルモード [#ce79cebb]
ArduinoのIO0・IO1ピンをハードウェアシリアル(Serial0)で構成しDynamixelと通信するモードです。ArduinoのIO0・IO1に接続されたUSBシリアル通信機能を犠牲にしても高速かつ安定した通信を要求する場合にの設定です。~
予めソフトウェアシリアルモードにおいてライブラリによる制御の理解が得られ、スケッチの書き込み時以外にUSBシリアルによる通信を必要としない場合に本設定を選択します。~
[[JP2>#weaf917b]]と[[JP3>#sf2421be]]はいずれもショートさせ、[[SW1>#g3d6a682]]を図の位置(HARD)に切り替えます。
#ref(E133C_SW1_HARD.png)
本設定を行った場合は、自身のスケッチでSerialライブラリを使用してはなりません。また、IO0・IO1ピンとUSBシリアル通信機能は他の目的で使用する事ができません。~
なお、スケッチをコンパイルして描き込む際は、本設定が電気的にUSBシリアル通信機能に影響を及ぼすため、その都度ソフトウェアシリアルモードに切り替える必要があります。

****USBパススルーモード [#c1027f1a]
Arduinoに搭載されたUSBシリアル通信機能を用いてPCなどからDXSHIELDを[[DXHUB>BTE068C]]ライクに直接使用するモードです。Dynamixelの内部パラメータの変更や制御をPCから行う場合は本設定を行います。~
まずArduino IDEにてデフォルトで生成されるコード(コードとしては意味を持たない無限ループするだけのスケッチ)をコンパイルし、予めArduinoに書き込んでおきます。このほぼ空のスケッチはDigital I/Oやシリアル通信を使用しないため、PCとDynamixel間の通信を阻害しません。なお、これに該当する独自スケッチであればこの限りではありません。
#html{{
<pre class="brush: c;">
void setup() {
  // put your setup code here, to run once:
}

void loop() {
  // put your main code here, to run repeatedly:
}</pre>
}}

DXSHIELDをソフトウェアシリアルモードに設定してこの何もしないスケッチを書き込んだ後、USBパススルーモードにします。~
[[JP2>#weaf917b]]と[[JP3>#sf2421be]]はいずれもショートさせ、[[SW1>#g3d6a682]]を図の位置(THROUGH)に切り替えます。
#ref(E133C_SW1_THROUGH.png)

なお、ArduinoのUSBシリアルを担うマイコンに書き込まれているファームウェアの都合で、大きなデータを連続で送受信する事ができません。プロトコルV1を装備するDynamixelシリーズであれば概ね問題はありませんが、プロトコルV2を装備するDynamixelシリーズではコントロールテーブルの拡大に伴いこの問題が露見します。~
また、ArduinoのUSBシリアルとRoboPlusやDYNAMIXEL Wizard 2.0との相性もよろしくないので、本モードを積極的に使用する事は推奨しません。

***ソフトウェア [#v2bf51a5]
****DYNAMIXEL Wizard 2.0[#va576864]
DXSHIELDを[[USBパススルー>#c1027f1a]]に設定にする事で、Dynamixelのコントロールテーブルの状態をモニタしたりパラメータの変更や動作確認を簡便に行うソフトウェアである[[DYNAMIXEL Wizard 2.0>https://emanual.robotis.com/docs/en/software/dynamixel/dynamixel_wizard2/]]が一部利用できます。~
#ref("BTE068C DXHUB/wizard2_main_001.png",40%)
一部というのは、ArduinoのUSBシリアル通信機能は過度なトラフィックがかかるとデータがドロップするのと、RoboPlusにおいて検索を行わせている最中にボーレートの切り替えが発生するとArduinoが再起動する場合がある事がわかっているためです。[[注意事項>#o2f97e11]]に記載したNerOを使用する事で回避できます。

****Dynamixel Library for PC [#x91df052]
DXSHIELDを[[USBパススルー>#c1027f1a]]にする事で、Dynamixel Libraryを併用してシリアル通信やプロトコルを意識せずにPCから制御する事ができます。

詳細は[[DYNAMIXEL Protocol 1.0 Library>Dynamixel Library]]と[[DYNAMIXEL Protocol 2.0 Library>Dynamixel Protocol 2 Library]]にて。

なお、ArduinoのUSBシリアル通信機能は過度なトラフィックがかかるとデータがドロップするため、運用には予め十分な検証を行っておくべきです。

****Dynamixel Library for Arduino [#t98a44bc]
#include(DXLIB_Arduino,notitle)

**その他 [#w7e62a68]
***DXSHIELDのTTL・RS-485 I/Fについて [#k759b64e]
-送信はTTL・RS-485の両I/Fに対して同時に行われ、受信はTTL・RS-485の両I/FがOR接続されているため同時に受信できない。
-Arduino側では送受信の切り替えタイミングを意識する必要はないが、半二重通信である事は十二分に意識する必要がある。
-TTL・RS-485のいずれのI/Fにかかわらず同じIDを持ったDynamixelが存在してはならない。
-TTLとRS-485のI/F間をまたいだ送受信はできないため、TTL・RS-485の両I/FにDynamixelが接続された環境において一部のインストラクションが正常動作しない。

***Arduino MEGAでの使用 [#z23d4b7d]
少しの改造でDXSHIELDをArduino MEGAで使用する事ができます。DXSHIELDは次の図の位置に装着します。
#ref(E133C_mega.png,80%)

****ハードウェアシリアルモード(Serial0以外) [#aaf5bd9a]
Serial0を利用する限り[[UNOと同様の運用>#ce79cebb]]になります。MEGAに備わっているSerial1~Serial3のハードウェアシリアルポートを利用する際は以下に従います。
-[[JP2>#weaf917b]]と[[JP3>#sf2421be]]はオープンにする。
-[[SW1>#g3d6a682]]はどの位置にあっても構わない。
-Serial3を利用する際は、DXSHIELDのJP3-2とMEGAのIO15(RX3)、JP2-2とMEGAのIO14(TX3)を各々ジャンパ線等でつなぐ。~
Serial2ならJP3-2とIO17(RX2)、JP2-2とIO16(TX2)をつなぐ。~
Serial1ならJP3-2とIO19(RX1)、JP2-2とIO18(TX1)をつなぐ。
#ref(E133C_mega_hard.png,80%)
-使用するSerial??に合わせてavr_uno_hardserial.ht中のSerialとある部分を変更(DXLIB v1.5以降)。

****ソフトウェアシリアルモード [#b9557fa4]
MEGAの仕様上IO8がソフトウェアシリアルとして使用する事ができないため、[[UNOで想定するソフトウェアシリアルモード>#ee08b548]]で運用する事ができません。それでもソフトウェアシリアルで使用する場合は、[[MEGAのハードウェアシリアルモード>#aaf5bd9a]]と同様にJP2-2とJP3-2を直接MEGAのソフトウェアシリアルとして利用できる任意の端子に直結します。~
-[[JP2>#weaf917b]]と[[JP3>#sf2421be]]はオープンにする。
-[[SW1>#g3d6a682]]はどの位置にあっても構わない。
-接続した端子に合わせてavr_uno_softserial.h中のMY_RX_PINとMY_TX_PINのマクロを変更(DXLIB v1.5以降)。

****USBパススルーモード [#f2ca6d5c]
[[UNOのUSBパススルーモード>#c1027f1a]]と同様です。

***Arduino UNO R4での使用 [#jf6785e3]
[[Arduino UNO R4>https://store-usa.arduino.cc/pages/uno-r4]]はCPUがARMに変わり、メモリ容量や動作スピードが大幅にUPしています。使わないのが勿体ない程の恩恵に与れます。minimaは形状やGPIOの割り当てに互換性があるので、DXSHIELDはそのまま利用できます。

''※現状ではArduinoライブラリに問題があるため、解消するまで適用は控えてください。それでも115.2kbps以下であれば使えない事もありません。''

****ハードウェアシリアルモード [#c79aa251]
SCI(AVRで言うUART)とUSBポートが分離しているため、ハードウェアシリアルモードで使用しても書き込みやデバッグ用に用いるUSBポートが同時に使用できます。~
ハードウェアシリアル通信に用いられるSCI2はライブラリによってSerial1に割り当てられているので、DXLIB用に以下の通信用のサブルーチンを用意します。
#html{{
<style type="text/css">
	.syntaxhighlighter {
		overflow-y: auto !important;
		overflow-x: auto !important;
		max-height: 900px;
		-webkit-text-size-adjust: 100%;
	}
</style>
<pre class="brush: c;"; title="uno_r4_hardserial.h">
#pragma once

#include &lt;stdint.h&gt;

uint32_t us_init (uint32_t baud) {
  Serial1.begin (baud);
  Serial1.setTimeout (20);
  return baud;
}

void us_deinit (void) {
  Serial1.end();
}

uint32_t us_setbaudrate (uint32_t baud) {
  us_deinit();
  return us_init (baud);
}

void us_rxpurge (void) {
  while (Serial1.available()) Serial1.read();
}

void us_putc (uint8_t c) {
  Serial1.write (c);
}

void us_puts (const uint8_t *buf, int len) {
  Serial1.write (buf, len);
}

int us_gets (uint8_t *buf, int len) {
  return Serial1.readBytes (buf, len);
}

void us_flush (void) {
  Serial1.flush();
}
</pre>
}}
ARM用のGCCはコードを厳密に評価するため、クラスの宣言時の引数は型変換して渡します。
#html{{
<pre class="brush: c; highlight:[8];">
#include &lt;dx2lib.h&gt;
#include "uno_r4_hardserial.h"

const DX2LIB::TDXHost_ConfParam param {
  us_init, us_deinit, us_setbaudrate, us_rxpurge, us_putc, us_puts, us_gets, us_flush
};

DX2LIB dx2 ((DX2LIB::TDXHost_ConfParam *)& param);
</pre>
}}

****ソフトウェアシリアルモード [#x5cc4ff8]
ソフトウェアシリアル通信に用いられる端子用いた以下の通信用のサブルーチンを用意し、クラスを初期化します。
#html{{
<pre class="brush: c;"; title="uno_r4_softserial.h">
#pragma once

#include &lt;stdint.h&gt;
#include &lt;SoftwareSerial.h&gt;

SoftwareSerial *mysoftuart = NULL;

#define MY_RX_PIN 8
#define MY_TX_PIN 9

uint32_t us_init (uint32_t baud) {
  mysoftuart = new SoftwareSerial (MY_RX_PIN, MY_TX_PIN);
  mysoftuart->begin (baud);
  mysoftuart->setTimeout (20);
  return baud;
}

void us_deinit (void) {
//  mysoftuart->end();
  mysoftuart = NULL;
}

uint32_t us_setbaudrate (uint32_t baud) {
  us_deinit();
  return us_init (baud);
}

void us_rxpurge (void) {
  while (mysoftuart->available()) mysoftuart->read();
}

void us_putc (uint8_t c) {
  mysoftuart->write (c);
}

void us_puts (const uint8_t *buf, int len) {
  mysoftuart->write (buf, len);
}

int us_gets (uint8_t *buf, int len) {
  return mysoftuart->readBytes (buf, len);
}

void us_flush (void) {
  mysoftuart->flush();
}
</pre>
}}
AVRよりも高いボーレートが使用できます。

****ブリッジモード [#rdfd4fe4]
上記の通りSCIとUSBが電気的に分離しているため、MPUを介在させないで通信するパススルーモードは使えません。DXSHIELDをハードウェアシリアルモードにし、以下のスケッチにてUSBにて提供される仮想シリアルポートとSCIの間をブリッジさせUSBシリアルコンバータとして機能させることができます。
#html{{
<pre class="brush: c;"; title="uno_r4_bridge.ino">
#define _LED_TX   BSP_IO_PORT_00_PIN_12
#define _LED_RX   BSP_IO_PORT_00_PIN_13

uint32_t baud;
uint8_t b_usb[4096], b_uart[4096];

void setup() {
  R_IOPORT_PinCfg(NULL, _LED_TX, IOPORT_CFG_PORT_DIRECTION_OUTPUT);
  R_IOPORT_PinCfg(NULL, _LED_RX, IOPORT_CFG_PORT_DIRECTION_OUTPUT);
  R_IOPORT_PinWrite(NULL, _LED_TX, BSP_IO_LEVEL_HIGH);
  R_IOPORT_PinWrite(NULL, _LED_RX, BSP_IO_LEVEL_HIGH);
  baud = 115200;
  Serial.begin (baud);
  Serial1.begin (baud);
}

void loop() {
  uint32_t l;

  if ((l = Serial.available()) > 0) {
    if (l > sizeof(b_usb)) l = sizeof(b_usb);
    R_IOPORT_PinWrite(NULL, _LED_TX, BSP_IO_LEVEL_LOW);
    Serial.readBytes (b_usb, l);
    Serial1.write (b_usb, l);
    R_IOPORT_PinWrite(NULL, _LED_TX, BSP_IO_LEVEL_HIGH);
  }
  if ((l = Serial1.available()) > 0) {
    if (l > sizeof(b_uart)) l = sizeof(b_uart);
    R_IOPORT_PinWrite(NULL, _LED_RX, BSP_IO_LEVEL_LOW);
    Serial1.readBytes (b_uart, l);
    Serial.write (b_uart, l);
    Serial.flush ();
    R_IOPORT_PinWrite(NULL, _LED_RX, BSP_IO_LEVEL_HIGH);
  }
  if (Serial.baud() != baud) {
    Serial1.end();
    baud = Serial.baud();
    Serial1.begin (baud);
  }
}
</pre>
}}
なおUSBポート側の仮想シリアルポートがハードフローを要求するため、利用できるホスト側のアプリケーションは限定的です。一応以下のように「%LOCALAPPDATA%\Arduino15\packages\arduino\hardware\renesas_uno\1.0.1\cores\arduino\tinyusb\class\cdc\cdc_device.c」に手を加えれば、ハードフローなしで通信できます。
#html{{
<pre class="brush: diff">
--- cdc_device.c.org
+++ cdc_device.c
@@ -113,7 +113,7 @@
 bool tud_cdc_n_connected(uint8_t itf)
 {
   // DTR (bit 0) active  is considered as connected
-  return tud_ready() &amp;&amp; tu_bit_test(_cdcd_itf[itf].line_state, 0);
+  return true;
 }
 
 uint8_t tud_cdc_n_get_line_state (uint8_t itf)
@@ -388,7 +388,7 @@
         p_cdc->line_state = (uint8_t) request->wValue;
         
         // Disable fifo overwriting if DTR bit is set
-        tu_fifo_set_overwritable(&amp;p_cdc->tx_ff, !dtr);
+//        tu_fifo_set_overwritable(&amp;p_cdc->tx_ff, !dtr);
 
         TU_LOG2("  Set Control Line State: DTR = %d, RTS = %d\r\n", dtr, rts);
 
</pre>
}}
また「%LOCALAPPDATA%\Arduino15\packages\arduino\hardware\renesas_uno\1.0.1\cores\arduino\Serial.h」に宣言されているSERIAL_BUFFER_SIZEの値を大きくしておくことで、巨大なパケットの送受信においても取りこぼしが軽減されます。

***注意事項 [#o2f97e11]
-いずれの端子も絶縁されていない。そのためArduinoとPCをUSBケーブルで活線接続した際に、突入電流などでPCがArduinoを認識しない問題が生じる事がある。そういった場合は、[[USBISO]]でPCのUSBポートを絶縁する事で解消する。
-Dynamixelシリーズがサポートする2M[bps]を超えるボーレートは、Arduino UNOの機能に依存するため使用できない。必ず2M[bps]以下で運用する事。
-[[USBパススルー>#c1027f1a]]を積極的に使用したいのであれば、Arduino UNO互換の[[NerOモジュール>https://www.ftdichip.com/old2020/Products/Modules/NerO.htm]]をお勧めする。~
USBシリアル変換チップにATmega16U2ではなくFT231Xが搭載されているので、バッファフローの問題解消や最大通信速度の向上が期待できる。

« Prev[3]