M5stamp PICO UDP相互通信テスト

引き続きUDP通信のテストです。これEthernet2ライブラリのUDPSendReceiveの応用です。特別な問題は無く動作してます。

このソース的に悩んだのは、本筋とは関係が無いですけどIPアドレスやMacAddressを配列化して一つのソースで複数台に使いやすくしたところです。IPアドレスは元々はIPAddressに (192,168,12,177) “,"区切りで書いて入力するため文字変数からの転換がストレートには難しいのですが、.fromString でString文字列から代入できるようになってました。ここでの注意は文字列から入力する場合は一般的な”.”区切りにしないと認識されないところでした。当然と言えば当然ですね。

Macアドレスの方はbyte配列に入れれば良いため、sscanfで文字列の切り出しをしてByte配列に入れてあげれば良いだけですが、実例があまり無かったので悩みました。なので記録してきました。解説するほどの実力ではないので、とりあえず動いているソースを見てください。

17-18行を2台のPICOでhostとlocalの0と1をひっくり返して書き込めばOK

#include <SPI.h>  // needed for Arduino versions later than 0018
#include <Ethernet2.h>
#include <EthernetUdp.h>  // UDP library from: bjoern@cs.stanford.edu 12/30/2008

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:

byte mac[6];
//親機・子機IP,Mac Addressを設定しておく
const char* mac_addr[] = { "DE:AD:BE:EF:FE:EE", "DE:AD:BE:EF:FE:EA" };
String ip_addr[] = { "192.168.12.177", "192.168.12.178", "192.168.12.2" };//.2のIPはwindowsマシン
IPAddress host_ip;
IPAddress local_ip;
//親機・子機port addressを設定しておく
unsigned int UDP_Port[] = { 8888, 8889, 8890 };
//初期接続子機番号 2台のPICOでhostとlocalの0と1をひっくり返して書き込めばOK
int host_no = 1;
int local_no = 0;
int i = 97;

// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];  //buffer to hold incoming packet,

// An EthernetUDP instance to let us send and receive packets over UDP
EthernetUDP Udp;

void setup() {
  Serial.begin(115200);
//mac address IPを生成
  sscanf(mac_addr[host_no], "%2hhx:%2hhx:%2hhx:%2hhx:%2hhx:%2hhx", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]);
  host_ip.fromString(ip_addr[host_no]);
  Ethernet.begin(mac, host_ip);
  Udp.begin(UDP_Port[host_no]);
}

void loop() {

  // if there's data available, read a packet
  int packetSize = Udp.parsePacket();
  if (packetSize > 0) {
    Serial.print("\nReceived packet of size ");
    Serial.println(packetSize);
    Serial.print("From ");
    IPAddress remote = Udp.remoteIP();
    //print out the remote connection's IP address
    Serial.print(remote);

    Serial.print(" on port : ");
    //print out the remote connection's port
    Serial.println(Udp.remotePort());


    // read the packet into packetBufffer
    Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
    Serial.print("Contents:");
    for (int t = 0; t < packetSize; t++) {
      Serial.print(packetBuffer[t]);
    }
    Serial.println("");
  }

  local_ip.fromString(ip_addr[local_no]);
  // send a reply, to the IP address and port that sent us the packet we received
  if (Udp.beginPacket(local_ip, UDP_Port[local_no]) == 0) {
    Serial.println("Remort truble:");
  };
  if (i < 122) {
    i = i + 1;
  } else {
    i = 97;
  }
  int u;
  u = i - 32;
  Udp.write(u);
  Udp.endPacket();

  Serial.print("\nSend packets:");
  Serial.print(local_ip);
  Serial.print(" : ");
  Serial.print(UDP_Port[local_no]);
  Serial.print(" Send :");
  Serial.println((char)u);
  //  local_ip.fromString(ip_addr[2]);
  //  Udp.beginPacket(local_ip, UDP_Port[2]);
  //  Udp.write(u);
  //  Udp.endPacket();
  delay(1000);
}
MP-101ワイヤレスリモコンの作成 シリーズ

その1 その2 その3 その4 その5  その6 その7 その8

関連

ESP32でBluetooth(BLE)で相互通信 その1 

ESP32でBluetooth(BLE)で相互通信 その2

M5stamp PICO UDP相互通信テスト

 

電子工作

Posted by akiba