2016年

3月

19日

Arduino iPhone Ethernet シールド Lチカ

ArduinoにEthernet シールドを取り付けてiPhoneで Lチカしてみました。

Arduinoのサイトによれば、デジタルI/Oピンの11、12、13番ピンはSPI通信に使われているようなので、それらのピンにはセンサなどを接続しないことにします。

今回は、Arduino 0012に含まれている「Web Server」というサンプル(File>Sketchbook>Examples>Library-Ethernet>Web Server)を参考にブラウザで閲覧可能なWebベージをアクセスさせます。
基本的な入力情報として、

・MACアドレス
・サーバのIPアドレス
・ポート番号

が必要となります。尚、ローカルネットワーク内から閲覧できる設定にします。

iOS Swift

import UIKit

 

class ViewController: UIViewController {

 

    @IBOutlet weak var myWebView: UIWebView!

    

    override func viewDidLoad() {

        

        super.viewDidLoad()

        

    }

 

    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

        // Dispose of any resources that can be recreated.

    }

 

    @IBAction func switchPressed(sender: UISwitch) {

        if sender.on {

            

            // turn the LED on

            // URLを設定する.

            let url = NSURL( string: "http://192.168.1.5/$1" )

            // リクエストを作成する.

            let req = NSURLRequest(URL: url!)

            // リクエストを実行する.

            myWebView.loadRequest(req)

            

        } else {

            

            // turn the LED off

            // URLを設定する.

            let url = NSURL( string: "http://192.168.1.5/$2" )

            // リクエストを作成する.

            let req = NSURLRequest(URL: url!)

            // リクエストを実行する.

            myWebView.loadRequest(req)

        }

    }

 

}

Arduinoスケッチ ethernetLED01

// イーサネットライブラリを読み込み
#include <SPI.h>
#include <Ethernet.h>

// スイッチでLEDのオンオフ trueかfalse
// 初期値「0」
boolean incoming = 0;

// Arduino Ethernet ShieldのMACアドレスをセット
byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDA, 0x02 };

// サーバーとなるArduinoのIPアドレス
IPAddress ip(192,168,1,5);

// HTTP通信をするのでサーバーのポートは80でセット
EthernetServer server(80);

// LEDライト用PIN番号
int ledPin = 2;

void setup()
{
  pinMode(ledPin, OUTPUT);

  // LEDの明かりは初期状態では切っておく
  digitalWrite(ledPin, LOW);

  //イーサネット通信開始
  Ethernet.begin(mac, ip);
  
  //サーバ開始
  server.begin();
  
  // デバッグログ用
  Serial.begin(9600);
}

void loop()
{
  
  // クライアントからのデータ受信
  EthernetClient client = server.available();
  
  // クライアントからの受信がある場合
  if (client) {
    
    // ブラウザからのHTTPリクエストの空白行の有無のフラグ
    boolean currentLineIsBlank = true;
    
    // クライアントとの接続中の処理
    while (client.connected()) {
      
      // 接続状態だったら
      if (client.available()) {
        
        // HTTPリクエスト(受信データ)を一つずつ読み込む
        char c = client.read();

        /*
         * 行の最後に得ている場合(改行文字を受け取った)およびラインは、
         * httpリクエストが終了した空白ですので、
         * あなたは応答を送信することができます
        */

        // URL文字列を読み込みデータが「incoming:初期値「0」」

        // そして「c」が' '空白だとincoming に「0」を代入
        if(incoming && c == ' '){ 
          incoming = 0;
        }

        // URL文字列を読み込みCが'#39;だとincoming に「1」を代入
        if(c == '$'){ 
          incoming = 1; // LED ON
        }
        
        // URL文字列をチェックします$1、$2 「incoming:true」
        if(incoming == 1){

          // シリアルポートデータ
          Serial.println(c);
          
          if(c == '1'){
            Serial.println("ON");
            // LEDの明かりを入れる
            digitalWrite(ledPin, HIGH);
          }
          if(c == '2'){
            Serial.println("OFF");
            // LEDの明かりを切る
            digitalWrite(ledPin, LOW);
          }
        }

        // 読み込んだ文字がラインフィードの場合
        if (c == '\n') {
          //現在の行を空白行とみなす
          currentLineIsBlank = true;
        } 
        else if (c != '\r') { // 読み込んだ文字がキャリッジリターン以外の場合
          // 現在の行を空白行としない
          currentLineIsBlank = false;
        }
      }
    }
    
    // サーバーがコネクションを早く閉じ過ぎる為、
    // プロトコル違反を報告、ここでdelay(1)を入れておく
    delay(1);
    client.stop();
  }
}

 

目 次