作成2015.09.23
AE-USBPIC44基板を使用して、シリアル-USB変換モジュールを製作します。
- シリアル-USB変換モジュール回路図
シリアル通信USART(非同期)評価回路図と同一となります。
- シリアル-USB変換モジュール回路外観
シリアル通信USART(非同期)評価回路外観と同一となります。
*USBから電源を供給しますが、USB通信は使用しません。
- シリアル-USB変換モジュールソースプログラム
(1)3章:サンプルプログラムのファイル構造の変更とカスタマイズ
[41-34zip]をダウンロードする。
をベースに修正します。
(2)シリアル通信USART(非同期)機能の追加
「USART(非同期)評価用ソースプログラム(送信側)」にいく。
「USART(非同期)評価用ソースプログラム(受信側)」にいく。
を参考にMy-CDC-Basicプロジェクトを修正します。
11:49 2015/09/23
(3)シリアル-USB変換モジュールソースプログラム(送信側)
[26-1.zip]をダウンロードする。
解凍するとMy-CDC-Basic.Xフォルダーがあります。
(4)シリアル-USB変換モジュールソースプログラム(受信側)
[26-2.zip]をダウンロードする。
解凍するとMy-CDC-Basic.Xフォルダーがあります。
- 送信側MAIN_RETURN main(void))概要
送信側MAIN_RETURN main(void)を以下に示します。
MAIN_RETURN main(void)
{
ADCON1 = 0b00001111;
TRISA = 0b00000000;
TRISB = 0b00000000;
TRISC = 0b00110000; //D-,D+
TRISD = 0b00000000;
TRISE = 0b11000011; //SW1,2=INPUT LED=OUTPUT
LATA = 0b00000000;
LATB = 0b00000000;
LATC = 0b00000000;
LATD = 0b00000000;
LATE = 0b00000000;
SYSTEM_Initialize(SYSTEM_STATE_USB_START);
USBDeviceInit();
USBDeviceAttach();
UART_Init(9600);
RCIF = 0; //reset RX pin flag
RCIP = 1; //high priority
RCIE = 1; //Enable RX interrupt
PEIE = 1; //Enable pheripheral interrupt (serial port is a pheripheral)
INTCONbits.GIE = 1;
int i;
uint8_t Buffer[256];
while(1)
{
LED=0;
if(gN>=1)
{
if( USBUSARTIsTxTrfReady() == true)
{
uint8_t iN=gN;
gN=0;
LED=1;
for(i=0;i<iN;i++)
{
Buffer[i]=UARTreadBuffer[i];
}
putUSBUSART(Buffer,iN);//USB送信
}
}
SYSTEM_Tasks();
#if defined(USB_POLLING)
USBDeviceTasks();
#endif
if( USBGetDeviceState() < CONFIGURED_STATE ){continue;}
if( USBIsDeviceSuspended()== true ) {continue;}
MyCDCBasicTasks();
}
}
(1)ボーレイト9600で初期設定します。
(2)受信文字列はUSB側に送信します。
- 受信側MAIN_RETURN main(void))概要
受信側MAIN_RETURN main(void)を以下に示します。
MAIN_RETURN main(void)
{
ADCON1 = 0b00001111;
TRISA = 0b00000000;
TRISB = 0b00000000;
TRISC = 0b00110000; //D-,D+
TRISD = 0b00000000;
TRISE = 0b11000011; //SW1,2=INPUT LED=OUTPUT
LATA = 0b00000000;
LATB = 0b00000000;
LATC = 0b00000000;
LATD = 0b00000000;
LATE = 0b00000000;
SYSTEM_Initialize(SYSTEM_STATE_USB_START);
USBDeviceInit();
USBDeviceAttach();
UART_Init(9600);
RCIF = 0; //reset RX pin flag
RCIP = 1; //high priority
RCIE = 1; //Enable RX interrupt
PEIE = 1; //Enable pheripheral interrupt (serial port is a pheripheral)
INTCONbits.GIE = 1;
int i;
uint8_t Buffer[256];
while(1)
{
LED=0;
if(gN>=1)
{
if( USBUSARTIsTxTrfReady() == true)
{
uint8_t iN=gN;
gN=0;
LED=1;
for(i=0;i<iN;i++)
{
Buffer[i]=UARTreadBuffer[i];
}
UART_Write(Buffer[i]);//UART送信
}
}
SYSTEM_Tasks();
#if defined(USB_POLLING)
USBDeviceTasks();
#endif
if( USBGetDeviceState() < CONFIGURED_STATE ){continue;}
if( USBIsDeviceSuspended()== true ) {continue;}
MyCDCBasicTasks();
}
}
(1)ボーレイト9600で初期設定します。
(2)受信文字列はUART側に送信します。
- パソコン(Windows)用プログラム
使用頻度の少ない評価用のプログラムはProcessing(プロセシング)が便利であることに気づきました。
Processing(プロセシング)の環境設定に関しては、Processing(プロセシング)1章:Processing(プロセシング)開発環境を参照願います。
シリアル-USB変換モジュールスケッチは以下となります。
//USB-シリアル変換テスト用
import processing.serial.*;
Serial myPort;
void setup()
{
println(Serial.list());
myPort = new Serial(this, Serial.list()[4],9600);
myPort.bufferUntil('\n');
}
void draw()
{
char i;
for(i=0x61;i<=0x7A;i++)
{
myPort.write(i);
}
myPort.write('\n');
delay(100);
}
void serialEvent(Serial myPort)
{
String inString = myPort.readStringUntil('\n');
if (inString != null)
{
print(inString);
}
}
- 使用方法
(1)AE-USBPIC44基板の送信側と受信側にそれぞれプログラムを書き込みます。
(2)回路の配線を行います。
(3)Processing(プロセシング)を起動して、USB-シリアル変換テスト用のスケッチをペーストします。
(4)Runボタンを押すと最初にCOMポートリストが表示されます。
(5)myPort = new Serial(this, Serial.list()[4],9600);のリストNoを実際に接続しているポートにあわせます。
(6)接続が成功するとコンソールに"abcdefghijklmnopqrstuvwxyz"が0.1s毎に表示されます。
- 設定ボーレートと文字列送受信エラー率の関係
設定ボーレートと文字列("abcdefghijklmnopqrstuvwxyz")送受信エラー率の関係について調査した結果を以下に示します。
*パソコンから送信した文字列がパソコンに戻るまでのエラー率を測定しました。
*115200片道は受信側のAE-USBPIC44基板から送信した文字列がパソコンに戻るまでのエラー率を測定しました。
*57600bpsまではエラー率はゼロでした。
*76800bpsからは、エラー率が上昇します。
*往復のエラー率よりも、片道のエラー率が上昇するのは、タイミング的な影響と思われます。
*おそらく、USBの受信側でエラーが発生していると思われます。
- 信号波形の確認
(1)ボーレート9600bps、時間スケール500ms/divで観察した信号波形を以下に示します。
*黄色が送信側から受信側へのUSART信号です。
*緑色が受信側から送信側へのUSART信号です。
*時間スケール500ms/divです。
*黄色が送信側から受信側へのUSART信号間隔が一定でないことが確認できます。
*送信側から受信側へのUSART信号と受信側から送信側へのUSART信号はほぼ一致します。
(2)ボーレート9600bps、時間スケール500μs/divで観察した信号波形を以下に示します。
*黄色が送信側から受信側へのUSART信号です。
*緑色が受信側から送信側へのUSART信号です。
*時間スケール500μs/divです。
*文字コード間の間隔は狭く、ほぼ連続した送信になっています。
*受信側で文字コードを受信すると次のコードが来る前の送信側へ送信していることが確認できます。
(3)ボーレート115200bps、時間スケール500ms/divで観察した信号波形を以下に示します。
*黄色が送信側から受信側へのUSART信号です。
*緑色が受信側から送信側へのUSART信号です。
*時間スケール500ms/divです。
*黄色が送信側から受信側へのUSART信号間隔が一定でないことが確認できます。
*送信側から受信側へのUSART信号と受信側から送信側へのUSART信号はほぼ一致します。
(4)ボーレート115200bps、時間スケール50μs/divで観察した信号波形を以下に示します。
*黄色が送信側から受信側へのUSART信号です。
*緑色が受信側から送信側へのUSART信号です。
*時間スケール50μs/divです。
*文字コード間の間隔が大きく、間欠した送信になっています。
*受信側で文字コードを受信すると次のコードが来る前の送信側へ送信していることが確認できます。
- AE-USBPIC44基板使用シリアル-USB変換モジュールまとめ
(1)AE-USBPIC44基板を使用してシリアル-USB変換モジュールを製作できました。
(2)AE-USBPIC44基板使用シリアル-USB変換モジュールは、ボーレート57600bpsまでエラー率がゼロで動作することが確認できました。
(3)ボーレート76800bps以上では、エラー率の増加が確認されました。
(4)信号波形確認では、文字列が一定間隔で送信されないことが確認されました。
(5)受信側で受信側で文字コードを受信すると次のコードが来る前の送信側へ送信していることが確認できました。
(6)また、ボーレート115200bpsで、受信側のAE-USBPIC44基板から送信した文字列がパソコンに戻るまでのエラー率が往復通信のエラー率よりも大きくなることが確認さえました。
(7)以上の結果から推論するとUSART信号をUSB信号に変換する部分で時間がかかるため、ボーレート115200bpsでエラーが発生するとおもられます。
(8)AE-USBPIC44基板使用シリアル-USB変換モジュールはボーレート57600bps以下で安定動作します。
- USB無しの場合のソースプログラム
USB無しの場合、ソースプログラムは以下のように単純化できます。
「USART(USB無し)評価用ソースプログラム(受信側)」にいく。