NXT - Arduino間の通信プログラム例

NXTに自作電子機器を接続するには、いくつか方法があります。
今回は、i2c通信を使ったArduino-NXTの通信例を紹介します。

1)接続図
NXTのポート1とArduino間をi2Cで接続します。

NXTのポート1のピン情報は、こちらで紹介しましたが、i2c通信で使用する場合、ピンアサインは、pin5:CLK, pin6:Dataです。
Arduinoのピンアサイン情報は、A4 pinがData, A5 pinがCLKです。

2)NXT側のプログラム
   1 import lejos.nxt.*;
   2 
   3 public class I2CDevices {
   4    
   5    
   6    public static void main(String[] args) throws Exception {
   7            int addr = 0x2;
   8            int reg = 0x2;
   9            byte val = 0x10;
  10            
  11            
  12            I2CSensor[] sensors = {
  13                            new I2CSensor(SensorPort.S1)};
  14            
  15            while (!Button.ESCAPE.isPressed()) {
  16                    if(Button.RIGHT.isPressed()){
  17                            lsendData(sensors[0], addr, reg, val);
  18                    }
  19 //                       val++;
  20            }
  21    }
  22    
  23    static void lsendData(I2CSensor sensor, int addr1, int reg1, byte val1) {
  24            sensor.setAddress(addr1);
  25            
  26            //Executes an I2C write transaction.
  27            sensor.sendData(reg1, val1);
  28    }
  29 }

3)Arduino側のプログラム
   1 #include <Wire.h>
   2 
   3 byte command[10];
   4 byte val = 0;
   5 int lengthofdata = 0;
   6 
   7 void setup()
   8 {
   9   Serial.begin(9600);
  10   
  11   //Wireライブラリを初期化し、I2Cバスにマスタかスレーブとして接続
  12   //address: 7ビットのスレーブアドレス。省略した場合は、マスタとしてバスに接続します。 
  13   Wire.begin(1);               // join i2c bus with address #2
  14   
  15   /*スレーブデバイスで、マスタからデータのリクエストが来たときに呼ばれる関数を登録します。 */
  16   Wire.onRequest(requestEvent); // register event
  17   
  18   /*スレーブデバイスで、マスタからデータが送られてきたときに呼ばれる関数を登録します。 */
  19   Wire.onReceive(receiveEvent);
  20 }
  21 
  22 void loop()
  23 {
  24   int i;
  25   if(lengthofdata !=0){
  26 //    Serial.print("a");
  27     for(i=0; i< lengthofdata; i++){
  28       Serial.print(command[i], HEX);
  29     }
  30   }
  31   
  32   lengthofdata = 0;
  33   delay(100);
  34 }
  35 
  36 /*-------------------------------------------------------
  37 interrupt handler. don't execute too much. execute in loop.
  38 --------------------------------------------------------*/
  39 void receiveEvent(int gotbytes)
  40 {
  41    /*マスタデバイスでは、requestFrom()を実行したあと、
  42    スレーブから送られてきたデータを読み取るときに使用します。
  43    スレーブがマスタからのデータを受信するときにも使用します。*/
  44   int i;
  45   
  46   for(i=0; i<gotbytes; i++){
  47    command[i] = Wire.receive(); 
  48   }
  49   
  50   lengthofdata = gotbytes;
  51 }
  52 
  53 /*-----------------------------------------------------------
  54 interrupt handler. don't execute too much. execute in loop.
  55 -----------------------------------------------------------*/
  56 void requestEvent()
  57 {
  58    /*スレーブデバイスがマスタからのリクエストに応じてデータを送信するときと、
  59    マスタがスレーブに送信するデータをキューに入れるとき使用します。
  60    マスタではbeginTransmission()とendTransmission()の間で呼ばれます。 */
  61   Wire.send(val);    //ack = 0
  62 }
  63


4)NXTの左ボタンを押すたびにArduinoに2, 0x10を送信します。
受信したArduinoは、COMポートに0x2, 0x10を送信します。


コメント

こんにちは。
今、NXTとarduinoをI2C通信させようと頑張っていたのですがなかなかプログラムがうまくいかず、あなた様のページを発見し、今に至ります。
よろしければご教授いただけませんか?

  • ポセイドン
  • 2016/07/23 18:37
トラックバック
この記事のトラックバックURL