4: 2023-03-18 (土) 23:04:29 takaboo |
現: 2023-07-02 (日) 09:39:14 takaboo |
| | | |
| ※本製品は半田付け作業を要求します。~ | | ※本製品は半田付け作業を要求します。~ |
- | ※旧バージョンの[[BTE074]]に対してジャンパの追加やI/F部分のモジュール化などの仕様変更がなされています。 | + | ※旧バージョンの[[BTE074]]に対してジャンパの追加やI/F部分のモジュール化などの仕様変更がなされています。~ |
| + | ※文中でUNOとだけ記述している場合はArduino UNO R3未満を指します。 |
| | | |
| **仕様 [#w1fc9eab] | | **仕様 [#w1fc9eab] |
| ここでは予め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)に装着する。ランド近傍に小さい部品があるので、半田の盛り過ぎや半田くずに注意が必要。 |
| | | |
| ***モード選択 [#c8763faf] | | ***モード選択 [#c8763faf] |
- | Arduinoの種類に依存する部分が多々ありますが、ここではDXSHIELDを[[Arduino UNO>https://www.arduino.cc/en/Main/ArduinoBoardUno]]に装着して使用する前提として3つのモードを説明します。 | + | Arduinoの種類に依存する部分が多々ありますが、ここではDXSHIELDを[[Arduino UNO R3>https://www.arduino.cc/en/Main/ArduinoBoardUno]]に装着して使用する前提として3つのモードを説明します。 |
| | | |
| ****ソフトウェアシリアルモード[#ee08b548] | | ****ソフトウェアシリアルモード[#ee08b548] |
| | | |
| ***Arduino UNO R4での使用 [#jf6785e3] | | ***Arduino UNO R4での使用 [#jf6785e3] |
- | [[Arduino UNO R4>https://store-usa.arduino.cc/pages/uno-r4]]はCPUがARMに変わり、メモリ容量やスピードが大幅にUPしたのがR4です。使わないのは勿体ない程の恩恵に与れます。 | + | [[Arduino UNO R4>https://store-usa.arduino.cc/pages/uno-r4]]はCPUがARMに変わり、メモリ容量や動作スピードが大幅にUPしています。使わないのが勿体ない程の恩恵に与れます。minimaは形状やGPIOの割り当てに互換性があるので、DXSHIELDはそのまま利用できます。 |
- | ***ハードウェアシリアルモード [#c79aa251] | + | |
- | UARTがUSBポートと分離しているため、態々ハードウェアシリアルモードをコンソールと排他的に運用するような配慮は一切不要です。~ | + | ''※現状ではArduinoライブラリに問題があるため、解消するまで適用は控えてください。それでも115.2kbps以下であれば使えない事もありません。'' |
| + | |
| + | ****ハードウェアシリアルモード [#c79aa251] |
| + | SCI(AVRで言うUART)とUSBポートが分離しているため、ハードウェアシリアルモードで使用しても書き込みやデバッグ用に用いるUSBポートが同時に使用できます。~ |
| + | ハードウェアシリアル通信に用いられるSCI2はライブラリによってSerial1に割り当てられているので、DXLIB用に以下の通信用のサブルーチンを用意します。 |
| #html{{ | | #html{{ |
- | <pre class="brush: c;"; title="avr_uno_hardserial.h"> | + | <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> | | #include <stdint.h> |
| | | |
| </pre> | | </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\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() && 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\arduino\hardware\renesas_uno\1.0.1\cores\arduino\Serial.h」に宣言されているSERIAL_BUFFER_SIZEの値を大きくしておくことで、巨大なパケットの送受信においても取りこぼしが軽減されます。 |
| | | |
| ***注意事項 [#o2f97e11] | | ***注意事項 [#o2f97e11] |