1: 2018-12-03 (月) 22:03:00 takaboo ソース 現: 2023-07-02 (日) 09:39:14 takaboo ソース
Line 10: Line 10:
※本製品は半田付け作業を要求します。~ ※本製品は半田付け作業を要求します。~
-※旧バージョンの[[BTE074]]に対してジャンパの追加やI/F部分のモジュール化などの仕様変更がなされています。+※旧バージョンの[[BTE074]]に対してジャンパの追加やI/F部分のモジュール化などの仕様変更がなされています。
 +※文中でUNOとだけ記述している場合はArduino UNO R3未満を指します。
**仕様 [#w1fc9eab] **仕様 [#w1fc9eab]
Line 168: Line 169:
****CN12 [#m09c89fc] ****CN12 [#m09c89fc]
-BPJ-047AHを実装して使用。[[CN1>#f7942cf7]]を同時に実装する事はできない。+PJ-047AHを実装して使用。[[CN1>#f7942cf7]]を同時に実装する事はできない。
#ref(CN12.png) #ref(CN12.png)
-[[CUI PJ-047AH>https://www.cui.com/product/res​ource/pj-047ah.pdf]] -[[CUI PJ-047AH>https://www.cui.com/product/res​ource/pj-047ah.pdf]]
Line 218: Line 219:
***対応するデバイス [#r3b9fa50] ***対応するデバイス [#r3b9fa50]
| I/F |  Device Name |h | I/F |  Device Name |h
-|TTL|Dynamixel AX・MX(TTL版)・XLシリーズ全般・XM(TTL版), DXMIO(TTL版), ToFセンサ(TTL版) +|TTL|Dynamixel AX・MX・Xシリーズ全般, DXMIO, ToFセンサ | 
-|RS-485|Dynamixel DX・RX・EX・MX(RS-485版)・XM(RS-485版)・XH・PROシリーズ全般, UD3, UD3.5, UD4, USS3, DXMIO(RS-485版), ToFセンサ(RS-485版) |+|RS-485|Dynamixel DX・RX・EX・MX・X・PROシリーズ全般, UD3, UD3.5, UD4, USS3, DXMIO(RS-485版), ToFセンサ(RS-485版) |
要求される電源電圧と対応するプロトコルが同じであれば、I/Fを問わず同時に使用できます。 要求される電源電圧と対応するプロトコルが同じであれば、I/Fを問わず同時に使用できます。
Line 225: Line 226:
ここでは予めJP1~JP4に同梱のピンソケットが実装され、CN1ないしCN12には電源供給用のコネクタないしジャックが実装され、U1にTTL2DXIFが装着されているものとします。~ ここでは予めJP1~JP4に同梱のピンソケットが実装され、CN1ないしCN12には電源供給用のコネクタないしジャックが実装され、U1にTTL2DXIFが装着されているものとします。~
+JP1~JP4の実装~ +JP1~JP4の実装~
-ピンソケットはリードが長くて弱いた。他のArduino用シールドをスタックして使用しないのであれば、場合によっては市販の2.54mmピッチの1列ピンヘッダを使用しても構わない。+付属のピンソケットはリードが長くて弱い。他のArduino用シールドをスタックして使用しないのであれば、市販の2.54mmピッチの1列ピンヘッダを使用しても構わない。
+CN1もしくはCN12の実装~ +CN1もしくはCN12の実装~
-熱容量の大きいベタパターンに対して行う必要があるため、高い容量の半田ごてを使用すると良い。その際に予めフラックスを塗布したり基板側を半田ごてで温めながら半田を流すと濡れが良くなる。+熱容量の大きいベタパターンに対して行う必要があるため、高い容量の半田ごてを使用すると作業性が上がる。また予めフラックスを塗布したり基板側を半田ごてで温めながら半田を流すと濡れが良くなる。
+TTL2DXIFへピンヘッダの実装~ +TTL2DXIFへピンヘッダの実装~
TTL2DXIFに同梱のピンヘッダを2分割して半田付けし、DXSHIELDのU1(J1,J2)に装着する。ランド近傍に小さい部品があるので、半田の盛り過ぎや半田くずに注意が必要。 TTL2DXIFに同梱のピンヘッダを2分割して半田付けし、DXSHIELDのU1(J1,J2)に装着する。ランド近傍に小さい部品があるので、半田の盛り過ぎや半田くずに注意が必要。
Line 244: Line 245:
***モード選択 [#c8763faf] ***モード選択 [#c8763faf]
-Arduinoの種類に依存する部分が多々ありますが、ここではDXSHIELDを[[Arduino UNO>https://www.arduino.cc/en/Main/Ardui​noBoardUno]]に装着して使用する前提として3つのモードを説明します。+Arduinoの種類に依存する部分が多々ありますが、ここではDXSHIELDを[[Arduino UNO R3>https://www.arduino.cc/en/Main/ArduinoB​oardUno]]に装着して使用する前提として3つのモードを説明します。
****ソフトウェアシリアルモード[#ee08b548] ****ソフトウェアシリアルモード[#ee08b548]
Line 263: Line 264:
****USBパススルーモード [#c1027f1a] ****USBパススルーモード [#c1027f1a]
-Arduinoに搭載されたUSBシリアル通信機能を用いてPCなどからDXSHIELDを[[DXHUB>BTE068B]]ライクに直接使用するモードです。Dynamixelの内部パラメータの変更や制御をPCから行う場合は本設定を行います。~+Arduinoに搭載されたUSBシリアル通信機能を用いてPCなどからDXSHIELDを[[DXHUB>BTE068C]]ライクに直接使用するモードです。Dynamixelの内部パラメータの変更や制御をPCから行う場合は本設定を行います。~
まずArduino IDEにてデフォルトで生成されるコード(コードとしては意味を持たない無限ループするだけのスケッチ)をコンパイルし、予めArduinoに書き込んでおきます。このほぼ空のスケッチはDigital I/Oやシリアル通信を使用しないため、PCとDynamixel間の通信を阻害しません。なお、これに該当する独自スケッチであればこの限りではありません。 まずArduino IDEにてデフォルトで生成されるコード(コードとしては意味を持たない無限ループするだけのスケッチ)をコンパイルし、予めArduinoに書き込んでおきます。このほぼ空のスケッチはDigital I/Oやシリアル通信を使用しないため、PCとDynamixel間の通信を阻害しません。なお、これに該当する独自スケッチであればこの限りではありません。
 +#html{{
 +<pre class="brush: c;">
 +void setup() {
 +  // put your setup code here, to run once:
 +}
- void setup() { +void loop() { 
-  // put your setup code here, to run once+  // put your main code here, to run repeatedly
-&nbsp;}+}&lt;/pre> 
 +}}
- void loop() { 
-   // put your main code here, to run repeatedly: 
- } 
DXSHIELDをソフトウェアシリアルモードに設定してこの何もしないスケッチを書き込んだ後、USBパススルーモードにします。~ DXSHIELDをソフトウェアシリアルモードに設定してこの何もしないスケッチを書き込んだ後、USBパススルーモードにします。~
[[JP2>#weaf917b]]と[[JP3>#sf2421be]]はいずれもショートさせ、[[SW1>#g3d6a682]]を図の位置(THROUGH)に切り替えます。 [[JP2>#weaf917b]]と[[JP3>#sf2421be]]はいずれもショートさせ、[[SW1>#g3d6a682]]を図の位置(THROUGH)に切り替えます。
Line 278: Line 282:
なお、ArduinoのUSBシリアルを担うマイコンに書き込まれているファームウェアの都合で、大きなデータを連続で送受信する事ができません。プロトコルV1を装備するDynamixelシリーズであれば概ね問題はありませんが、プロトコルV2を装備するDynamixelシリーズではコントロールテーブルの拡大に伴いこの問題が露見します。~ なお、ArduinoのUSBシリアルを担うマイコンに書き込まれているファームウェアの都合で、大きなデータを連続で送受信する事ができません。プロトコルV1を装備するDynamixelシリーズであれば概ね問題はありませんが、プロトコルV2を装備するDynamixelシリーズではコントロールテーブルの拡大に伴いこの問題が露見します。~
-また、ArduinoのUSBシリアルとRoboPlusとの相性もよろしくないので、本モードを積極的に使用する事は推奨しません。+また、ArduinoのUSBシリアルとRoboPlusやDYNAMIXEL Wizard 2.0との相性もよろしくないので、本モードを積極的に使用する事は推奨しません。
***ソフトウェア [#v2bf51a5] ***ソフトウェア [#v2bf51a5]
Line 315: Line 319:
Serial1ならJP3-2とIO19(RX1)、JP2-2とIO18(TX1)をつなぐ。 Serial1ならJP3-2とIO19(RX1)、JP2-2とIO18(TX1)をつなぐ。
#ref(E133C_mega_hard.png,80%) #ref(E133C_mega_hard.png,80%)
--使用するSerial??に合わせてクラスの初期化を変更(DXLIB v1.2以降でサポート)。 +-使用するSerial??に合わせてavr_uno_hardserial.ht中のSerialとある部分を変更(DXLIB v1.5以降)。
- DXLIB dxif (false, &Serial3); +
- +
- DX2LIB dxif (false, &Serial3);+
****ソフトウェアシリアルモード [#b9557fa4] ****ソフトウェアシリアルモード [#b9557fa4]
Line 324: Line 325:
-[[JP2>#weaf917b]]と[[JP3>#sf2421be]]はオープンにする。 -[[JP2>#weaf917b]]と[[JP3>#sf2421be]]はオープンにする。
-[[SW1>#g3d6a682]]はどの位置にあっても構わない。 -[[SW1>#g3d6a682]]はどの位置にあっても構わない。
--接続した端子に合わせてクラスの初期化を変更。~ +-接続した端子に合わせてavr_uno_softserial.h中のMY_RX_PINとMY_TX_PINのマクロを変更(DXLIB v1.5以降)
- DXLIB dxif (true, NULL, 10, 9); // rxpin IO10, txpin IO9 +
- +
- DX2LIB dxif (true, NULL, 10, 9); // rxpin IO10, txpin IO9+
****USBパススルーモード [#f2ca6d5c] ****USBパススルーモード [#f2ca6d5c]
[[UNOのUSBパススルーモード>#c1027f1a]]と同様です。 [[UNOのUSBパススルーモード>#c1027f1a]]と同様です。
 +
 +***Arduino UNO R4での使用 [#jf6785e3]
 +[[Arduino UNO R4>https://store-usa.arduino.cc/pages/un​o-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 <stdint.h>
 +
 +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 <dx2lib.h>
 +#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 <stdint.h>
 +#include <SoftwareSerial.h>
 +
 +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\arduin​o\hardware\renesas_uno\1.0.1\cores\ardui​no\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() && 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(&p_cdc->tx_ff, !dtr);
 ++//        tu_fifo_set_overwritable(&p_cdc->tx_ff, !dtr);
 + 
 +         TU_LOG2("  Set Control Line State: DTR = %d, RTS = %d\r\n", dtr, rts);
 + 
 +</pre>
 +}}
 +また「%LOCALAPPDATA%\Arduino15\packages\arduin​o\hardware\renesas_uno\1.0.1\cores\ardui​no\Serial.h」に宣言されているSERIAL_BUFFER_SIZEの値を大きくしておくことで、巨大なパケットの送受信においても取りこぼしが軽減されます。
***注意事項 [#o2f97e11] ***注意事項 [#o2f97e11]
-いずれの端子も絶縁されていない。そのためArduinoとPCをUSBケーブルで活線接続した際に、突入電流などでPCがArduinoを認識しない問題が生じる事がある。そういった場合は、[[USBISO]]でPCのUSBポートを絶縁する事で解消する。 -いずれの端子も絶縁されていない。そのためArduinoとPCをUSBケーブルで活線接続した際に、突入電流などでPCがArduinoを認識しない問題が生じる事がある。そういった場合は、[[USBISO]]でPCのUSBポートを絶縁する事で解消する。
-Dynamixelシリーズがサポートする2M[bps]を超えるボーレートは、Arduino UNOの機能に依存するため使用できない。必ず2M[bps]以下で運用する事。 -Dynamixelシリーズがサポートする2M[bps]を超えるボーレートは、Arduino UNOの機能に依存するため使用できない。必ず2M[bps]以下で運用する事。
--[[USBパススルー>#c1027f1a]]を積極的に使用したいのであれば、Arduino UNO互換の[[NerOモジュール>https://brtchip.com/m-nero/]]をお勧めする。~+-[[USBパススルー>#c1027f1a]]を積極的に使用したいのであれば、Arduino UNO互換の[[NerOモジュール>https://www.ftdichip.com/old2020/Products/Modules/NerO.htm]]をお勧めする。~
USBシリアル変換チップにATmega16U2ではなくFT231Xが搭載されているので、バッファフローの問題解消や最大通信速度の向上が期待できる。 USBシリアル変換チップにATmega16U2ではなくFT231Xが搭載されているので、バッファフローの問題解消や最大通信速度の向上が期待できる。


トップ   差分 リロード印刷に適した表示   全ページ一覧 単語検索 最新ページの一覧   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom