Websocketのソフトウェア(mugbot_server)のコード解説

Websocketのソースコード(mugbot_server)の解説です。
このソースコードはRubyで書かれており、拡張子は「rb」になっています。
HTML(mugbot_web)から送られてきた内容をArduino(mugbot_arduino)がわかるコマンドに変換して送信しています。HTMLとArduinoの仲介役をしています。

Ruby
1
2
#! /usr/bin/ruby
# -*- coding: utf-8 -*-

一行目で「Ruby」の場所を定義し、二行目でコーディングが「UTF-8」であることを定義してしています。二行目のことをマジックコメントといい、Ruby2.0では不必要になりましたが、Ruby1.9が現在も多く使われているため、マジックコメントを利用しています。

Ruby
1
2
3
4
5
#Mugbot Project Tokyo City University Koike Lab. 2014
#Mugbot System ver. 1.0.0.
require'em-websocket'
require'serialport'

マグボットプロジェクトの内容とソースコードのバージョンが「1.0.0」であることを記しています。
「require」というのは「’ ’」で囲まれた名前のライブラリを探し出し、読み込んでくれます。
「require ‘em-websoket’」はEventMachineをベースにしたRuby上で動作するWebSocketサーバである「em-websoket」を読み込んでいます。
「require ‘serialport’」はシリアル通信を行うためのライブラリ「serialport」を読み込んでいます。

Ruby
1
2
3
4
#シリアルポート設定
port="/dev/ttyACM0"
#/dev/ttyACM0はRaspberry Piから見たArduinoのポート
sp=SerialPort.new(port,9600,8,1,SerialPort::NONE)

「port」で、シリアル通信をするポートを設定しています。
「/dev/ttyACM0」というのはRaspberry PiからみたArduinoのポート番号です。
「SerialPort.new」でシリアル通信を開始します。

Ruby
1
2
#WebSocket設定
EventMachine::WebSocket.start(:host=>"0.0.0.0",:port=>51234)do|ws|

「WebSocket.start」でホスト名(0.0.0.0)とポート番号(51234)を設定し、 「ws」でWebSocketを使えるようにします。

Ruby
1
2
3
4
5
6
7
8
9
ws.onmessage{|msg|
ifmsg[0,2]=="@x"
msg.slice!(0,2)
putsmsg
sp.writemsg+"x"
sleep0.01
#目の上下のアクション
#最初の2文字が@xであればその2文字を取り除いてxの値をArduinoに送信

WebSocketで「msg」というデータを受信し、if文の中身を実行します。
「if msg[0,2]==”@x”」というのは「msg」の1番目から2文字分が「@x」だったら以下の内容を実行するということです。
「msg.slice!(0,2)」というのは1番目から2文字分を削除するということです。
「puts」というのは文字列に変換するということです。
(例 @x50という値が送られてきたら、@xを取り除き、50にして、文字列に変換した50にxをつけて50xとしてシリアル通信で書き込む(送信する)ということです。)
「sleep」というのはその時間の分だけ待つということです。

Ruby
1
2
3
4
5
6
7
8
elsifmsg[0,2]=="@y"
msg.slice!(0,2)
putsmsg
sp.writemsg+"y"
sleep0.01
#首の左右のアクション
#最初の2文字が@yであればその2文字を取り除いてyの値をArduinoに送信

msgの1番目から2文字分が「@y」だったら、xと同じ内容をyでも行っています。

Ruby
1
2
3
4
5
6
7
8
elsifmsg[0,2]=="@z"
msg.slice!(0,2)
putsmsg
sp.writemsg+"z"
sleep0.01
#目の明るさ変調のアクション
#最初の2文字が@zであればその2文字を取り除いてzの値をArduinoに送信

msgの1番目から2文字分が「@z」だったら、xと同じ内容をzでも行っています。

Ruby
1
2
3
4
5
elsifmsg[0,1]=="@"
sp.putcmsg[1,1]
sleep0.01
#最初の1文字が@であれば@を取り除いてアクションを指示するアルファベット1文字をArduinoに送信

msgの1文字目が「@」だったら、msgの1文字目を飛ばして、2文字目から1文字をAruduinoに送信しています。

Ruby
1
2
3
4
5
6
7
8
9
else
sp.putc"t"
system(`jsay #{msg}`)
sp.putc"n"
# tをArduinoに送って口の点滅開始、発話させ、nを送って点滅終了
end
}
end

上記以外の場合は「t」というコマンドを送り、「jsay」という音声合成システムを使って「msg」の内容を発話させ、最後に「n」というコマンドを送ります。

Websocketのソースコード(mugbot_server)の解説を終了します。