Re: The history of "M&Y"

Team "M&Y" and "花鳥風月"
the soliloquy of the father
毎日更新!

NXTねた その76 Aruduinoとの接続続き

2011-11-03 | NXTねた

じゃあ、肝心のArduino側の値をNXTに送るほうのサンプルです。

NXC

#define I2C_PORT    IN_1

int getData()
  {
  byte Wbuf[]={ 0x62,0x20 };
  byte Rbuf[2];
  short status_code;
  int i=2;
  int d;
 
  while(I2CCheckStatus(I2C_PORT) == STAT_COMM_PENDING);
  status_code = I2CBytes(I2C_PORT, Wbuf, i , Rbuf);
  d=Rbuf[0]+(Rbuf[1]<<8)  ;
  return (d);
  }

task main()
  {
  SetSensorLowspeed(I2C_PORT);
 
  ClearScreen();
  NumOut(40,LCD_LINE4,getData());
  Wait( 2000 );
  }

Arduino

#include <Wire.h> 
#define I2C_SLAVE_ADDRESS 0x31
byte requestRegister, requestCommand;

void requestEvent()
  {
  byte d[2];
  int j=-30000;
 
  d[0]=j&0xff;
  d[1]=j>>8; 
  if (requestRegister == 0x20)
     {
     Wire.send(d,2);
     }
  }

void receiveEvent(int howMany)
  {      
  requestRegister = Wire.receive();
  }

void setup()
  { 
  pinMode(LED_RED, OUTPUT);
  digitalWrite(LED_RED, LOW);

  Serial.begin(9600);
  Wire.begin(I2C_SLAVE_ADDRESS);
  Wire.onReceive(receiveEvent);   
  Wire.onRequest(requestEvent);                
  }

void loop() { }

これで、requestEvent() の中で定義した変数 j の値がNXT側に転送されます。

ちょっと以外だったのは・・・

  Wire.onReceive(receiveEvent);

を定義しなければならないことです。

Arduino側はリクエストを受けるだけなので、

  Wire.onRequest(requestEvent);

があれば、良いのではないか・・・と思うのですが、両方が揃っていないとただしく転送されません。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

NXTねた その75 Aruduinoとの接続

2011-11-03 | NXTねた

題名だけ見ると、特に新しいネタでは無いのですが・・・

これまでは、Arduino側はソフト的なI2C接続をしていました。

でも、やっと本来のI2Cインタフェースでの接続ができました。

そう、Wireってやつです。


ネットをいろいろ俳諧しても、NXTとArduinoの接続例があまり無かったので、すっかり諦めていたのですが・・・

ひょんなことから中国語のサイトを見つけて・・・そこに載っていたサンプルプログラムを打ち込んでみたら・・・あっさりと動きました。


いやぁ、何でこれまでできなかったの?

というくらい、単純なプログラムです。

これで、I2C接続でNXTとArduinoが通信できる・・・ハズです。


ちなみに、見つけたHPの記事の題名は

Mindstorms NXT與Arduino之間的I2C通訊


先ずは、NXTの指示でArduinoを制御するサンプル

ポート13のLEDを点滅させます。


NXC

#define LED_ON      0x10
#define LED_OFF     0x11

#define I2C_PORT    IN_1

void sendCom(const byte cmd)
  {
  byte Wbuf[3]={0x62,0x42,0x00};

  Wbuf[2]=cmd;
  while(I2CCheckStatus(I2C_PORT) == STAT_COMM_PENDING);
  LowspeedWrite(I2C_PORT, 0, Wbuf);
  }

task main()
  {
  SetSensorLowspeed(I2C_PORT);

  while (TRUE)
    {
    sendCom(LED_ON);
    Wait(200);
    sendCom(LED_OFF);
    Wait(800);
    }
  }


Arduino

#include <Wire.h> 
#define I2C_SLAVE_ADDRESS 0x31
#define LED_RED   13
#define RED_ON     0x10
#define RED_OFF   0x11

byte requestRegister, requestCommand;
void receiveEvent(int howMany)
  {      
  requestRegister = Wire.receive();
  if (Wire.available() > 0)
    {
    requestCommand  = Wire.receive();
    if (requestRegister == 0x42)
      if (requestCommand == RED_ON)
        digitalWrite(LED_RED, HIGH);
      else if (requestCommand == RED_OFF)
        digitalWrite(LED_RED, LOW);
    }   
  }

void setup()
  { 
  pinMode(LED_RED, OUTPUT);
  digitalWrite(LED_RED, LOW);

  Serial.begin(9600);
  Wire.begin(I2C_SLAVE_ADDRESS);
  Wire.onReceive(receiveEvent);   
  }

void loop() { }

NXTからは3バイトのデータを送ります。

最初の0x62 は送り先のアドレス・・・Arduino側の0x31 に対応します。

次の0x42 は送り先のレジスタ番号

3バイト目は送る命令で、上の例では 0x10 がLED発光、0X11がLED消灯です。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

レスキューAのコース !?

2011-11-03 | うんちく・小ネタ

2010年ルールから、レスキューAの競技は、タイルを使うことになりました。

で、このタイル・・・普通には手に入らないですよね。

実際には、ジャパンオープンでもタイルを使って無いのですが・・・

ネットをさまよっていて、こんなのを見つけました。

Rescue93

特にロボカップジュニア用ではなさそうなのですが、大きさもちょうど30cm×30cmなので、練習用には良いかと・・・

デザインは5種類ありましたが・・・

あれ、練習用だったら、別にこれまで通りカレンダーの裏紙に黒テープを貼っても同じか!

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする