55章:Arduino-UNOとAE-USBPIC44基板のシリアル通信(1)

    作成2015.09.24

     Arduino-UNOとAE-USBPIC44基板のシリアル通信について検討してみました。

  1. Arduino(アルドゥイーノ)演習参照アドレス
     Arduino(アルドゥイーノ)演習は下記のアドレスを参照します。
    https://www.arduino.cc/en/Tutorial/HomePage


  2. 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)は何も動作しません。(動作すると誤動作の原因となるため空のプログラムを書込みます。)


  3. Arduino-UNOのシリアル・USB変換機能のみを使用した回路外観
     Arduino-UNOのシリアル・USB変換機能のみを使用した回路外観を以下に示します。





  4. Arduino-UNOのスケッチ
     空のスケッチとなります。
    void setup() {}
    void loop() {}
    


  5. AE-USBPIC44基板のソースプログラム
     MPLAB_X_IDE_v2.25とPIC18F4553マイコンの復習
     26章:AE-USBPIC44基板使用シリアル-USB変換モジュール
    (3)シリアル-USB変換モジュールソースプログラム(送信側)
    と同一となります。
    [../f41/26-1.zip]をダウンロードする。
    解凍するとMy-CDC-Basic.Xフォルダーがあります。



  6. ボーレートの変更
     以下のコードで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();
        }
    }
    


  7. 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);のリストナンバーは環境に応じて変更します。


  8. 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);のリストナンバーは環境に応じて変更します。


  9. 使用方法と評価結果
    (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側からの同時受信があるとエラー率が上昇する可能性があります。


  10. 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側からの同時受信があるとエラー率が上昇する可能性があります。




56章:Arduino-UNOとAE-USBPIC44基板のシリアル通信(2)に行く。

トップページに戻る。