AndroidとWi-Fi接続を使用してスイッチをオンまたはオフにするにはどうすればよいですか?
SparkFunsIOIOを使用してリレーを制御しました。しかし、どうすればワイヤレスでそれを行うことができますか?
イーサネットシールド付きのArduino、または場合によってはNetduinoを使用できます。基本的に、ワイヤレスインターネット機能を備えたデバイスは、Androidが使用する唯一のワイヤレスプロトコルであるため、Bluetooth(またはNFC)を除きます。ユーザーがボタンを押すと、Socket
またはBluetoothSocket
を開いて、スイッチを開く必要があることを2番目のデバイスに通知できます。Androidデバイスとマイクロプロセッサが同じネットワーク上にある限り、かなり単純です。ワイヤレスホームネットワークを使用している場合は、デバイスを物理的なワイヤでルーターに接続できます。使用できる他のワイヤレスオプションがあるかもしれません-これらは私ができる最も単純なものです。お役に立てれば!
そのため、iPhoneでそれを行った方法(Androidでも同じである必要があります):
私はこのようなプロジェクトを持っています。鉱山はステアリングシステムの位置データを送信していますが、考え方は同じです。間もなくGoogleCodeへのアップロードを終了します。PowerWheelinoで確認できます。
基本的な構造は次のとおりです。
シリアル経由(IDEシリアルインターフェース外)でデータを受信すると、Arduinoは自動的にリセットされることに注意してください。このトピックとそれを回避する方法については、こちらの私の投稿を参照してください。これを以前に知っていれば、トラブルシューティングの多くを節約できたでしょう。
免責事項:
このコードは、OPによって要求されたことを達成するためにいくつかのマイナーな変更を必要とします。IOIOとArduinoスケッチを使用して動作するAndroidプログラムをすでに作成しているので、これはあなたの能力の範囲内であると思います。
AndroidUDPクライアントコードは次のとおりです。
UdpClient::sendData()
タッチイベントまたはボタンを押すと実行します。
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import android.util.Log;
public class UdpClient {
String messageStr;
DatagramSocket s;;
int server_port;
InetAddress local;
int msg_length;
byte[] message;
public UdpClient (String ipAddress, int port){
server_port = port;
try {
local = InetAddress.getByName(ipAddress);
s = new DatagramSocket();
}
catch (Exception e) {
e.printStackTrace();
Log.d("Powerwheelino",e.getStackTrace() + "error");
}
}
public boolean sendData(byte drive, byte steering){
byte drvByte = (byte) (drive & 0xFF);
byte steerByte = (byte) (steering & 0xFF);
message = new byte[2];
message[0] = drvByte;
message[1] = steerByte;
msg_length = message.length;
//message = messageStr.getBytes();
try {
DatagramPacket p = new DatagramPacket(message, msg_length,local,server_port);
s.send(p);
}
catch (Exception e) {
// TODO Auto-generated catch block
Log.d("Powerwheelino", e.getStackTrace() +"ERROR ");
e.printStackTrace();
return false;
}
return true;
}
}
これがリスニングUDPサーバー(C ++)コードです
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <string>
#include <SerialStream.h>
using namespace std;
class udp_server {
int sock;
int bytes_read;
socklen_t addr_len;
struct sockaddr_in server_addr , client_addr;
public:
udp_server(int portNum)
{
if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
perror("Socket");
exit(1);
}
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(portNum);
server_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(server_addr.sin_zero),8);
if (bind(sock,(struct sockaddr *)&server_addr,
sizeof(struct sockaddr)) == -1)
{
perror("Bind");
exit(1);
}
addr_len = sizeof(struct sockaddr);
printf("\nUDPServer Waiting for client on port %d", portNum);
fflush(stdout);
}
int listen(char recv_data[]) {
while (1)
{
bytes_read = recvfrom(
sock,
recv_data,
1024,
0,
(struct sockaddr *)&client_addr,
&addr_len
);
recv_data[bytes_read] = '\0';
printf("\n(%s , %d) said : ",inet_ntoa(client_addr.sin_addr),
ntohs(client_addr.sin_port));
printf("%s", recv_data);
string drive;
string direction;
int speed, angle;
if ((recv_data[0] & 128) > 0) {
drive = "Fwd";
}
else {
drive = "Rev";
}
if ((recv_data[1] & 128) > 0) {
direction = "Left";
}
else {
direction = "Right";
}
speed = recv_data[0] & 127;
angle = recv_data[1] & 127;
printf("\t %s @ %d and %s @ %d",
drive.c_str(),
speed,
direction.c_str(),
angle);
fflush(stdout);
}
return 0;
}
};
LibSerialを使用したArduinoへのシリアル通信のスニペットは次のとおりです。
LibSerial::SerialStream myss;
SerialComm(int argc, char** argv) {
myss = new LibSerial::SerialStream("/dev/ttyS0", ios_base::out);
myss.SetBaudRate(LibSerial::SerialStreamBuf::BAUD_57600);
myss.SetCharSize(LibSerial::SerialStreamBuf::CHAR_SIZE_8);
myss.SetFlowControl(LibSerial::SerialStreamBuf::FLOW_CONTROL_NONE);
myss.SetParity(LibSerial::SerialStreamBuf::PARITY_NONE);
myss.SetNumOfStopBits(1);
const int Dsize = 2;
char buffer[1];
buffer[0] = 125; //0b00000001;
buffer[1] = '\0';
bitset(buffer[0]);
//myss << buffer;
myss.write(buffer,1);
//myss.Close();
}
RuggedCircuitsYellowjacketを使用することもできます。Wifiが搭載されており、簡単なWebページを提供し、入力/出力を制御できます。