n-hirokiのプログラミング軌跡

プログラミングのメモ

WebSocketメモ

WebSocket

webにおいて双方向通信を低コストで行うための仕組みです。WebSocketはTCP上で動くプロトコルです。

 

仕組み

1、HTTPでクライアントとサーバー間で情報をやり取りしてコネクションを確立します。

2、確立されたコネクション上で、双方向通信を行います。

 

サンプル

サンプルが公開されています。

https://www.sanwebe.com/downloads/50-websocket-example

ここで「WebSocket Example」をダウンロードします。

 

コード修正

1、Server.phpの2行目付近のhostをサーバーのIPに変更します。

$host = '192,168,**,**' ;

 

2、index.phpの43行目付近のアドレスをサーバーのIPとフォルダに変更します。

 

3、2つのファイルをサーバーの任意の場所に置きます。

 

4、コマンドラインかブラウザで「Server.php」を実行します。

ループしているので実行し続けます。

 

5、2つのブラウザでindex.phpを実行します。(例えば、「firefox」と「Chrome」で実行)

 

これで双方向通信のチャットができます。

 

もちろんローカルで動作確認はできるので、サーバーに置く前に試してみてください。

 

README.mdファイル

マークダウン記法

 

・「.md」・・・マークダウンの略

マークダウンとは

普通のテキストファイルをちょっとした法則にならって書くだけでHTMLを書かずに、自動的にHTMLコードとして変換して出力してくれるものをマークダウンと言います。

 

 

VB基礎メモ

メソッド

Math.Ceiling(k)

Mathの部分がクラスで、Ceilingの部分がメソッドです。

 

関数

すべての関数はメソッドです。ですが、すべてのメソッドが関数であるわけではありません。

メソッドと関数はほとんど同じ意味。その時によってニュアンスが使い分けて使います。簡単に言うと、値を返すメソッドが「関数」です。

 

メソッドの呼び出し方のまとめ

1、クラス名.メソッド名

クラスの共有メソッドを使う場合にこの呼び方を使います。

 

2、クラスのインスタンス名.メソッド名

クラスの共有していないメソッドを使う場合にこの呼び方を使います。

 

Dim rand As New Random

Dim num As Decimal

num = rand.Next(1,3)    など

 

3、値.メソッド名

StringやIntegerなどの基本型のメソッドはこの方法でも呼び出せます。

word = "もじれつからきりぬく".Substring(1,2)    など

 

4、メソッド名

特殊なクラスや標準モジュールなどに記述したメソッドを使う場合はこの呼び出し方を使います。

MsgBoxやMidなど。

 

いろいろな関数

・Trim・・・引数から前後のスペースだけ削除して返します。

・Len・・・引数の文字数を返します。

・Right・・・引数の右から指定した数だけ文字を取り出して返します。

・Left・・・引数の左から指定した数だけ文字を取り出して返します。

・Mid・・・引数の指定した位置から指定した数だけ文字列を取り出して返します。

・LCase・・・引数を大文字にして返します。

・Abs・・・絶対値を返す

 

Arduino DHT11を使ってみよう!

ArduinoでDHT11というセンサーを使って、温度と湿度を計ります!

 

1、GitHubからライブラリをダウンロード

 プログラムは公開されているライブラリがあるのでそれをダウンロードします!

 

github.com

 

・releases→好きなバージョンの「Source code(zip)」クリック→解凍

 

f:id:n-hiroki_zero:20160822213106p:plain

 

解凍したフォルダごとArduinoのフォルダに移動

 

2、ライブラリの追加

ダウンロードしたライブラリを追加します。

 

n-hiroki-prog.hatenablog.com

 

3、スケッチを少し修正 

DHT-sensor-library-1.2.3」→ examples → DHTtester → DHTtester.ino

 

コード上の方のセンサの種類を設定しているところの「DHT11」のコメントアウトを外し、他のセンサはコメントアウトする。

 

f:id:n-hiroki_zero:20160824213506p:plain

 

4、ArduinoとDHT11を接続

 f:id:n-hiroki_zero:20160825204730j:image

f:id:n-hiroki_zero:20160825204740j:image

 

5、テスト

スケッチをアップロードし、シリアルモニタを立ち上げる。

 

このような表示になっていればOK !!

f:id:n-hiroki_zero:20160824214012p:plain

Arduino ライブラリをアンインストール

ライブラリのアンインストール方法です。

アンインストールする場合は十分に注意しながら行ってください。

 

ライブラリのインストール後、Arduinoの保存用フォルダ内に「libraries」というフォルダが作成されています。このフォルダ内に、インストールしたライブラリのフォルダが作成されています。

そのフォルダのみを削除すればライブラリをアンインストールすることができます。

 

・フォルダを削除してArduinoを再起動する。

 

このArduinoの保存用フォルダはArduinoの環境設定から確認できます。

Macであれば、Arduino→環境設定とクリックし、「スケッチブックの保存場所」と書いてある欄にPathが記載されています。

 

 

削除後にArduinoを再起動することで、アンインストールが反映されます。

 

 

Arduinoに新規ライブラリを追加

今回はArduinoの新規ライブラリを追加する方法ですが、すでにライブラリが用意されていることが前提です。

 

1、Arduinoのライブラリの中身を確認

 

f:id:n-hiroki_zero:20160824203551p:plain

ライブラリはこのような内容になっていると思います。

ライブラリは一般的に以下の4つの要素が必要です。

1、ライブラリの中身を格納するフォルダ

2、C++のヘッダファイル(.h)

3、C++のソースファイル(.cpp)

4、キーワードファイル(keywords.txt)

 

2と3はファイル名は同一のものになります。

ヘッダファイル(.h)及びソースファイル(.cpp)とふたつのファイルがあるのはC++の習慣で通常ヘッダファイルにクラス宣言、ソースファイルにクラスの実装がまとめられています。

 

2〜4のファイルは1のフォルダ直下に保存しておきます。

 

2、ライブラリの追加

Arduinoにライブラリをインストールする。

 

IDE スケッチ→ライブラリを使用→ライブラリをインストール

 

追加したいライブラリを選択。

 

3、ライブラリを使用できるかチェック

スケッチ→ライブラリを使用

 

メニューの下部にインストールしたライブラリが追加されているか確認。

 

ライブラリが正しくインストールされていれば、スケッチに

「#include〜」から始まる行が追加されています。

このinclude文は、ライブラリのヘッダファイルをスケッチ内にインポートするものです。

 

これでライブラリの追加は完了です!

 

Arduino 光センサを使おう!

光センサを使った簡単なプログラミングを行います。

 

1、光センサの値によりLEDを点滅させる感覚を制御

  Cord

  //アナログ入力の値に応じてLEDの点滅レートが変化

const int LED = 13;
int val = 0;

void setup() {
  pinMode(LED, OUTPUT); //LEDにアウトプット設定
  //注:アナログピンは自動的に入力として設定される
}

void loop() {
  val = analogRead(0);

  digitalWrite(13, HIGH); //LEDをオン
  delay(val); //少しの間、プログラムを停止

  digitalWrite(13, LOW); //LEDをオフ
  delay(val);
}

 

ジャンパー線の色が限られていて規則性がないですm(_ _)m

回路写真(実行) 

 f:id:n-hiroki_zero:20160820065816j:image

 

 実際に光センサに手を近づけて光を遮り試してみてください。

 

2、光センサの値によりLEDを点滅させる感覚を制御

Cord

 //アナログ入力の値に応じてLEDの明るさを変える

const int LED = 9;
int val = 0;

void setup() {
  pinMode(LED, OUTPUT);
}

void loop() {
  val = analogRead(0);

  analogWrite(LED, val/4); //センサの値を明るさとしてLED点灯
  delay(10);
}

 

f:id:n-hiroki_zero:20160820065100j:image

f:id:n-hiroki_zero:20160820065125j:image

 

valの値を4で割るのは、センサーから返ってくる値が最大で1023で、analogWrite()が受け付ける値が最大で255だからです。 

 

 

CdSセルは明るさを抵抗値に変えてくれる便利なセンサーです。ですが、Arduinoは抵抗値を読み取ることはできないので、回路でArduinoが読み取れる電圧に変換させる必要があります。

この方法は他のセンサーにも応用が可能で、圧力センサー、サーミスタなどが今回の回路で使えます。

CdSセルをサーミスタに変えれば、温度変化によってLEDの明るさが変化します。

 

 

今回はこの2点で終わりですが、これ以外にも様々なプログラムの可能性がたくさんあります。なのであなたも色々試してみたください!!

Arduino LEDとボタン

n-hirokiです。

ボタンとLEDを使った簡単なプログラミングを行います。

 

用意するもの

  ・ブレッドボード

  ・ジャンパー線

  ・10kΩの抵抗

  ・発光ダイオード(LED)

  ・タクトスイッチ

  ・Arduino UNO

  ・ArduinoとPCをつなぐUSBケーブル

 

 

1、ボタンを押した時にLEDを点灯させる

  Cord

  //ボタンが押されている間、LEDを点ける

  const int LED = 13; //LEDが接続されているPIN番号
  const int BUTTON = 7; //ボタンが接続されているピン番号

  int val = 0; //入力ピンの状態の記憶用変数

  void setup() {
    // put your setup code here, to run once:
    pinMode(LED, OUTPUT); //LED(13番ピン)の出力設定
    pinMode(BUTTON, INPUT); //BUTTON(7番ピン)の入力設定
  }

  void loop() {
    // put your main code here, to run repeatedly:
    val = digitalRead(BUTTON); //入力の状態を読み取り、変数valに格納

    //ボタンが押されているか?
    if(val == HIGH){
      digitalWrite(LED, HIGH); //LEDを点灯させる
    }else{
      digitalWrite(LED, LOW); //LEDをオフ
    }

  }

 

ジャンパー線の色が限られていて規則性がないですm(_ _)m

回路写真(実行) 

f:id:n-hiroki_zero:20160817182043j:image

f:id:n-hiroki_zero:20160817182042j:image

 

ただスイッチを押している時だけだとあまり使用用途がないかもしれないので、次はスイッチを押したら点灯が切り替わるプログラミングをやります。

 

 

2、ボタンを押した時にLED切り替え

Cord

  const int LED = 13; //LEDが13番ピンに接続されている
  const int BUTTON = 7; //ボタンが7番ピンに接続されている

  int val = 0; //入力の状態を格納する変数
  int old_val = 0; //valの一つ前の状態を格納する変数
  int state = 0; //LEDの状態を格納する変数(0・・オフ、1・・オン)

  void setup() {
    // put your setup code here, to run once:
    pinMode(LED, OUTPUT); //LED(13番ピン)の出力設定
    pinMode(BUTTON, INPUT); //BUTTON(7番ピン)の入力設定
  }

  void loop() {
    // put your main code here, to run repeatedly:
    val = digitalRead(BUTTON); //BUTTONの入力読み取り、valに格納

    //変化チェック
    if*1{
      state = 1 - state;
      delay(10);
    }
    old_val = val; //val更新
    if(state == 1){
      digitalWrite(LED, HIGH); //LEDオン
    }else{
      digitalWrite(LED, LOW); //LEDオフ
    }
  }

 

回路は先ほどと同じで大丈夫です!

実行してみたらわかりますが、LEDがオフの時にボタンを押すとLEDがオンになり、LEDオンの時にボタンを押すとLEDがオフになります。

部屋の電気を点ける時と同じような動きですね!

 

ただ、連打したりするとあまりうまく動かないかもしれません。

「バウンシング」という現象が原因です。

 

バウンシングとは、

ボタンの仕組みはバネの力で離れている2つの金属片が、ボタンが押された時に接触して電気が流れる仕組みです。その金属片がぶつかった瞬間わずかに跳ね返って不安定な状態になることをバウンシングという。

 

 

プログラム中のdelayを長めに使うとバウンシングを解消できます。

バウンシングは10〜50ミリ秒間程度発生するケースが多いのでその分delayをかけてあげればバウンシングは解消します。

なので、delayの時間を変えて試してみてください。

 

 

今回はこの2点で終わりですが、これ以外にも様々なプログラムの可能性がたくさんあります。なのであなたも色々試してみたください!!

*1:val == HIGH) && (old_val == LOW