作成2015.09.24
Arduino-UNOとAE-USBPIC44基板のシリアル通信について検討してみました。
- Arduino(アルドゥイーノ)演習参照アドレス
Arduino(アルドゥイーノ)演習は下記のアドレスを参照します。
https://www.arduino.cc/en/Tutorial/HomePage
- Arduino-UNOのシリアル・USB変換機能のみを使用した概略回路図
Arduino-UNOのシリアル・USB変換機能のみを使用した概略回路図は以下となります。
*Arduino-UNOはシリアル・USB変換モジュール(ATMG16U2-MU(R))とマイコン(ATMEGA328R-PU)が分離しています。
*このため、シリアル・USB変換モジュール(ATMG16U2-MU(R))のみの機能を使用できます。
*反面、マイコン(ATMEGA328R-PU)では、USB通信なのか?USART通信なのか?判別できません。
*これに対して、AE-USBPIC44基板はUSB通信とUSART通信が独立して動作します。
*上記の概略回路図において、マイコン(ATMEGA328R-PU)は何も動作しません。(動作すると誤動作の原因となるため空のプログラムを書込みます。)
- Arduino-UNOのシリアル・USB変換機能のみを使用した回路外観
Arduino-UNOのシリアル・USB変換機能のみを使用した回路外観を以下に示します。
- Arduino-UNOのスケッチ
空のスケッチとなります。
void setup() {}
void loop() {}
- AE-USBPIC44基板のソースプログラム
MPLAB_X_IDE_v2.25とPIC18F4553マイコンの復習
26章:AE-USBPIC44基板使用シリアル-USB変換モジュール
(3)シリアル-USB変換モジュールソースプログラム(送信側)
と同一となります。
[../f41/26-1.zip]をダウンロードする。
解凍するとMy-CDC-Basic.Xフォルダーがあります。
- ボーレートの変更
以下のコードでUART_Init(9600);→UART_Init(115200);に変更します。
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();
}
}
- Windows送信側のスケッチ
processingを使用します。送信側は以下のスケッチとなります。
//USB-シリアル変換テスト用(送信側)
import processing.serial.*;
Serial myPort;
void setup()
{
println(Serial.list());
myPort = new Serial(this, Serial.list()[4],115200);
myPort.bufferUntil('\n');
}
void draw()
{
char i;
for(i=0x61;i<=0x7A;i++)
{
myPort.write(i);
//delay(1);
}
myPort.write('\n');
delay(100);
}
void serialEvent(Serial myPort)
{
String inString = myPort.readStringUntil('\n');
if (inString != null)
{
print(inString);
}
}
* myPort = new Serial(this, Serial.list()[4],115200);のリストナンバーは環境に応じて変更します。
- Windows受信側のスケッチ
processingを使用します。受信側は以下のスケッチとなります。
//USB-シリアル変換テスト用(受信側)
import processing.serial.*;
Serial myPort;
void setup()
{
println(Serial.list());
myPort = new Serial(this, Serial.list()[5],115200);
myPort.bufferUntil('\n');
}
void draw()
{
}
void serialEvent(Serial myPort)
{
String inString = myPort.readStringUntil('\n');
if (inString != null)
{
print(inString);
}
}
* myPort = new Serial(this, Serial.list()[4],115200);のリストナンバーは環境に応じて変更します。
- 使用方法と評価結果
(1)Arduino-UNOとAE-USBPIC44基板にそれぞれプログラムを書込みます。
(2)processingのウインドウを2個開き、Windows送信側のスケッチとWindows受信側のスケッチをペーストします。
(3)myPort = new Serial(this, Serial.list()[4],115200);のリストナンバーは環境に応じて変更します。
(4)Windows送信側のスケッチとWindows受信側のスケッチをそれぞれRunします。
(5)以下のような画面となります。
*myPort = new Serial(this, Serial.list()[4],115200);のリストナンバーを入れ替えると受信側と送信側を入れ替えることができます。
*ボーレート115200bpsにおいて、いずれの送信方向についてもエラー率はゼロでした!!
*この事例では、USB側からとUART側からの同時受信を避けるようにしました。
*USB側からとUART側からの同時受信があるとエラー率が上昇する可能性があります。
- Arduino-UNOとAE-USBPIC44基板のシリアル通信(1)まとめ
(1)Arduino-UNOはシリアル・USB変換モジュール(ATMG16U2-MU(R))のみの機能を使用できます。
(2)AE-USBPIC44基板はUSB通信とUSART通信が独立して動作します。
(3)Arduino-UNOは空のプログラム書込みでシリアル・USB変換機能を使用できます。
(4)AE-USBPIC44基板でシリアル・USB変換機能を使用するには、プログラムの書込みが必要となります。
(5)Arduino-UNOはUSB通信とUSART通信を独立に操作しようとすると無理が生じます。
(6)ボーレート115200bpsにおいて、いずれの送信方向についてもエラー率はゼロでした!!
(7)この事例では、USB側からとUART側からの同時受信を避けるようにしました。
(8)USB側からとUART側からの同時受信があるとエラー率が上昇する可能性があります。