Physical Computing

Network and Information, Senshu Univ.

Menu
  • Home
  • Tips
  • About
  • admin

Month: November 2019

9 Unity Day 1

November 25, 2019
| No Comments
| Class materials

ここでは、Unityの基本的な使い方を学びます。Unityのバージョンは2018.x.xを使っています。また、OSはMac OSXを使うことを前提としています。Windowsの場合には、キーバインディング等が異なりますので注意してください。 この講義の目的は、Unityの使い方を勉強することではありません。Unityは、一般にはゲームエンジンと呼ばれるもので、非常に高度で複雑なツールです。説明している私も、全く使いこなせていません。この講義では、Unityを使って表現できる仮想空間とマイコンを繋げることによって何か面白いことができないだろうか、ということを考えたいと思っています。 目次 9.1 Unityのインストール 9.2 基本 9.3 オブジェクトの作成 9.4 画面操作 9.5 カメラ 9.6 ビルドと実行 9.7 Let’s Try 9.8 オブジェクトに動きを与える 9.9 シリアル通信 9.10 実習 9.1 Unityのインストール Unityをインストールしてはじめに起動すると、以下のようにログイン画面が出るはずです。 ここでアカウントを作成する必要があります。”create one”というところをクリックして必要な情報を入れてください。 アカウント作成して初めてログインする際に、Unityのライセンスを選ぶようになっているはずです。unity Personalを選びます。License agreementでは、一番下の”I don’t use Unity in a …”を選びます。 9.2 基本 Unityでのプログラミングは、GUIを使った画面の見た目を作る作業と、C#を使った動きを作る作業の2つに分かれています。Unityは、それらの2つの作業を統一的に行うことができるIDEです。 Unityのプログラムは、3Dモデルやサウンドファイル、画像、C#のプログラムなど様々なものから構成されていますが、それらはProjectという単位にまとまっています。早速新しいProjectを作ってみましょう。ここでは、Project名をStepByStepにしました。 Locationには、Projectを保存する場所を指定します。Enable Unity AnalyticsはOFFにしておきます。 Unityのメインウィンドウは、4つの部分に分かれています。以下はSceneを編集するための場所で、Sceneビューと呼ばれます。 これらの場所のレイアウトは自由に変更可能です。画面の右上にLayoutというメニュがあり、好みに応じて色々なレイアウトが選択できます。この資料では、とりあえずデフォルトのまま使います。 右にある場所はHierarchyウィンドウです。ここにはSceneに配置されたオブジェクトたちの名前が表示されています。新しいProjectを作った時には、Main CameraとDirection Lightという2つのオブジェクトが自動的に作られています。 試しにMain Cameraをクリックしてみましょう。Sceneに変化がありましたね。これはSceneに配置されているMain Cameraを選択したということです。 左上の方に並んでいる6つのアイコンのうち、左から2番目の十文字のようなものをクリックしておいてください。 […]

Read More »

Posted in Class materials

8 IoT

November 18, 2019
| No Comments
| Class materials

今週はIoTの演習です。 準備として、gmailのアカウントを作成しておいてください。この演習では大学のgmailアカウントではない、gmailアカウントが必要です。 目次 8.1 IoTとは? 8.2 mbedをインターネットに接続する 8.3 シリアル通信 8.4 HTTP通信 8.5 Examples 8.6 実習 8.1 IoTとは? 最近は、普通の新聞等でもIoTという言葉をよく聞きますね。これはInternet Of Thingsの略で、モノとモノがインターネットを通じて通信することで構築されるシステムのことです。ここでいうモノとは、コンピュータと通信機能が搭載された物であればなんでもよくて、家電製品や監視カメラ、センサーを搭載したデバイスなどのことです。 少し前までは、インターネットといえば電子メールやWeb、SNS、電子商取引であり、人と人、あるいは人とモノの間のネットワークというイメージが強かったのですが、モノとモノもインターネットにつなげると色々な可能性があるよ、ということです。 IoTは、概念としては全く新しいものではないのですが、マイコンや無線通信のデバイスが安価で小型になったこと、大量のデータを処理することがクラウドコンピューティング技術の進歩によって容易になったこと、AIが進歩したことなどにより、様々な応用分野が現れ広く認知されたというべきでしょう。語呂が良かったことも流行った一因だと思います。 所詮は流行り言葉なので、IoTという言葉自体はすぐに消えていく運命にありますが、技術それ自体とそれがどのように応用可能であるかは、きちんと理解しておく必要があります。この演習では特に、IoTがどのように応用可能であるかに焦点を当てて学修していきます。 IoTで何が実現できるのか IoTを活用すると、どんなことができるのでしょうか。製品をベルトコンベア式に生産する工場を考えてみましょう。工場には生産目標があり、そのための生産計画があります。順調に生産が行われていれば利益が出るのですが、ベルトコンベアや生産設備に故障が起こると生産がストップして損が出ます。最適解は故障が起こる直前で生産設備の部品を交換することですが、これはなかなか難しいです。また、問題が発生した時に、どこが壊れたのかが即座にわかると嬉しいです。そのために、生産設備にセンサーをつけて、機器の状態をサーバに逐一送ることが考えられます。例えば、機器の温度を測ったり、機器から発生する音を録音したりして、そのデータを蓄積するわけです。蓄積されたデータを解析することによって、温度が何度になったら故障の前兆であるとか、機器からどんな音がし始めたら故障の前兆であるかなどのことが分かるかもしれません。 要するにIoTは、監視作業や計測作業の自動化、少し面倒な作業の単純化などをやる仕組みということですね。監視作業や計測作業の自動化をすれば、当然膨大なデータが蓄積されます。これを世の中ではビックデータなどと呼んでいて、そのデータを解析し問題の最適化を行うためにAIを使ったりするというわけです。そいういう文脈では、IoTとビックデータとAIはセットで語られることが多くなっています。 この演習では、データの分析・解析及び最適化については扱いません。モノとモノとが通信するというところだけを取り出して演習をしてみたいと思います。 8.2 mbedをインターネットに接続する それでは、この演習で使う基本的な仕組みについて説明しましょう。以下の図を見てください。 上記の図のIoTデバイスと書かれた水色の点線で囲まれた範囲が、今回演習で作る部分です。この部分がIoTの”モノ”に対応します。 一部、MacBook Airにかかっていますね。この部分は学内無線LANに接続する機能で、本来であればMacBook Airに依存せずに独立のWiFiモジュールを使いたいところなのですが、そこはかなり面倒なことになりますので、今回はこのような形で妥協しています。しかし、本質的にはなんら変わりありませんから、基本はしっかりと学修できるものと思います。 Node.js この仕組みでは、Node.jsを使ってmicro:bitとMacBook Airの間の通信を行い、データをインターネットへ送ります。Node.jsとは、WebブラウザではなくサーバでJavaScriptを動かすためのプログラムです。 まずはNode.jsをMacBook Airにインストールしましょう。既にNode.jsをインストールしている人もいると思います。バージョン10.x.x以上であれば、それをそのまま使ってもらって大丈夫です。その際には、以下の手順の1、2、3は飛ばしてください。 手順1. nvmをインストールする nvmはNode.jsのバージョン管理をしてくれるプログラムです。まずはnvmをインストールし、その後nvmからNode.jsをインストールします。Terminalを起動して、以下の1行をコピペしてエンターキーを押します。

1
2
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.1/install.sh | bash
 

手順2. Terminalを再起動する Terminalを一度終了して立ち上げなおします 手順3. Node.jsをインストールする Terminalに以下の1行をコピペしてエンターキーを押します。

1
2
nvm install v12.13.0
 

これでNode.jsが使えるようになったはずです。確認するには以下のようにします。先頭の$はプロンプトを表していますから入力しません。以降、頭に$がついているのはTerminalでの入力だと思ってください。

1
2
$ node -v
 

バージョン番号であるv12.13.0が出力されれば成功です。 Example どこか適当なところにEx01というディレクトリ(フォルダ)を作成します。Ex01の下にex01.jsというファイルを作成して以下の1行を保存します。テキストエディタとしては何を使っても良いのですがAtomを推奨しておきます。 […]

Read More »

Posted in Class materials

7 State Transition

November 11, 2019
| No Comments
| Class materials

組込みシステムのプログラミングでは状態遷移を管理することが重要となります。 7.1 状態と遷移 システムとは、関連しあう複数の要素から構成され、要素の持つデータや関連の仕方が変化するようなもののことを言います。この変化はイベントや時間経過によって引き起こされます。 信号機をシステムの例として考えてみましょう。信号機は、赤、青、黄の信号灯と、タイマ、3つのスイッチによって構成されています。タイマが時間を計測して、信号灯毎に決められた時間が経過すると次の信号灯を点灯するためにスイッチの切り替えを行います。 この信号機の状態は3つだと考えられます。 赤が点灯している 青が点灯している 黄が点灯している 信号機に組み込まれるプログラムには、赤の信号灯を光らせるための変数redSignal、青の信号灯を光らせるためのblueSignal、黄の信号灯を光らせるためのyellowSignalの3つの変数があるとしましょう。それぞれtrueを代入すると点灯、falseを代入すると消灯とします。 赤が点灯しているという状態は、3つの変数で考えると以下の場合です。 redSignalがtrue blueSignalがfalse yellowSignalがfalse 同様に青が点灯しているという状態は以下の場合です。 redSignalがfalse blueSignalがtrue yellowSignalがfalse 同様に黄が点灯しているという状態は以下の場合です。 redSignalがfalse blueSignalがfalse yellowSignalがtrue 信号機の状態はこの3つの変数に代入されている値がどのような組み合わせになっているかによって決まります。この単純な信号機は赤と青が同時に点灯することを許しませんから、上記の3つの組み合わせ以外の組み合わせになってはいけません。 プログラム中ではこの3つの変数以外にも様々な変数が使われるでしょうが状態遷移を考える際には除外します。 ここまでで分かったことを状態遷移図で表現してみましょう。 状態遷移図では、状態は楕円、遷移は矢印で表されます。楕円の中に書かれているのは状態名です。遷移を引き起こすイベントや条件は矢印の近くに書きます。上記の図ではそれ以外に、状態を決定する変数とその値を状態の近くに書き入れています。 システムの状態とは何かという定義は色々と考えられますが、ここでは、システムを構成する要素に含まれるデータから、システムを特徴付けていると考えるものを抽出し、そのデータを分類したものであるとします。 ここで注意しなければならないのは、抽出される状態は、システムを観測する抽象度によって変わるということです。例えば、抽象度が高すぎると、信号機の状態は「稼働している」と「稼働していない」の2状態になるかもしれません。逆に抽象度が低すぎると、1秒経過するごとに別の状態に分類するということが起こります。 状態遷移図はシステムの全体像を把握し、どういうロジックでそのシステムが動くのかを考えるために描きます。その作業に資する情報でなければ意味がありません。最初は戸惑うかもしれませんが、状態遷移図を描いてプログラムに落とし込むという作業を何回か経験する内に慣れてくるはずです。 7.2 例題 今度は電源のオンオフボタンがあり、電源が入っている時にだけ、何かの操作をすることができるような機械を考えます。我が家にある洗濯機も、こういう機械の一種です。洗濯をする際には、まず電源ボタンを押して操作可能にしてから、洗濯ボタンや洗濯乾燥ボタンなどを押して洗濯を開始します。電源がオンになっていない時に洗濯ボタンを押しても何も起こりません。 この機械の状態は以下の3つです。 電源オフ 操作中(電源はオン) 操作していない(電源はオン) この機械をコントロールするためのプログラムを書いた時、システムを特徴付けている変数は何かを考えます。 powerLed: 電源オンのときON(true)、電源オフのときOFF(false) operationLed: 操作中のときON(true)、操作していないときOFF(false) 今度は、状態を決定するための変数が2つあります。複数ある変数の取り得る値全ての組み合わせを考え、それぞれに状態を対応させていきます。 powerLedがON、operationLedがON→ 操作中 powerLedがON、operationLedがOFF → 操作していない powerLedがOFF、operationLedがON → ? powerLedがOFF、operationLedがOFF → 電源オフ 3の組み合わせに対する操作が見当たらないですね。これは、このシステムが3の状態にならない、あるいはなってはいけないということを意味します。 ここでは電源ボタンが押されたというイベント、操作ボタンが押されたというイベントの2つのイベントを考えます。どのイベントがどの遷移に相当するかを考えて状態遷移図を描きます。 […]

Read More »

Posted in Class materials

6 Analog Input

November 4, 2019
| No Comments
| Class materials

今週は、アナログ入力について学習します。 目次 6.1 アナログ入力 6.2 可変抵抗器 6.3 光センサ 6.4 実習 6.1 アナログ入力 デジタル入力は、端子に一定以上の電圧がかかっているか、かかっていないかという2状態を入力として識別することでした。アナログ入力は、端子にかかる電圧の変化を連続的な値として識別します。 ここでは例として、部屋の明るさを光センサーで測定している場面を考えましょう。部屋の明るさは、太陽の位置等によって滑らかに変化していきます。光センサーは、その変化を電圧の変化に変換してマイコンに伝えます。 しかし、マイコンの中では、受け取った電圧の値をデジタルデータとして保持することになります。音楽データも、写真データも、動画データも、コンピュータの中では全てデジタルデータですよね。それと同じことです。つまり、アナログからデジタルへの変換が必要になるということです。マイコンの中でそれを行なってくれるのが、Analog to Digital Convertor(ADC)と呼ばれるデバイスです。一般的には、ADコンバータと呼ばれます。 ADコンバータは、標本化(サンプリング)、量子化、符号化という3つのプロセスでアナログデータをデジタルデータに変換します。 センサーからマイコンへと入力されるアナログデータ(あるいはアナログ信号)は時間とともに変化する電圧です。この電圧を短い時間間隔で計測して、電圧の列に変換します。これを標本化と言います。計測する時間の間隔をサンプリング周期と呼び、1秒間に何周期あるのかをサンプリング周波数という言葉で表現します。 電圧の列は、実数の列です。これを整数の列に直すのですが、この時、どのくらい細かい範囲で整数に近似するかを解像度と言います。例えば、解像度が2ビットの場合には、2の2乗の4段階で近似しますから、かなり大雑把な値になります。解像度が16ビットの場合には、2の16乗で65,536段階となります。この変換を量子化と言います。 量子化されたデータは、決められた形(フォーマット)で記録されるのですが、これを符号化と言います。一番簡単な符号化は、量子化されたデータをそのまま2進表現にして並べることです。 音楽データを保存したCDの場合には、44.1kHzというサンプリング周波数でサンプリングし、16ビットで量子化しています。最終的にはエラー訂正用のデータなどを入れて符号化しています。44.1kHzでサンプリングするということは、1秒間に44,100回、値を読むということです。 約44kHzでサンプリングしているのには理由があります。人間の可聴領域(耳で聞こえる範囲)は20Hzから20kHzと言われています。20Hzが低い音、20kHzが高い音です。サンプリング定理と呼ばれる法則があって、サンプリングをする際にはデジタルデータとして再現したい周波数の2倍以上の周波数でなければいけません。CDは人の耳を基準にサンプリング周波数を決めているわけです。 マイコンでアナログ入力といったときには、端子から入力されるアナログデータをADコンバータを使ってデジタルデータへ変換して、それを入力として扱うということを意味します。micro:bitに乗っているNordic nRF51822は10ビットの解像度を持つADコンバータを備えているので、1024段階で電圧の変化を表現します。 アナログ入力として受け付けられる電圧の最大値は3.3Vです。3.3Vが入力された時にADCから返される値は1.0、0Vが入力された時には0となります。10ビットの解像度ですから、3.3v / 1024 = 0.0032となり、1段階は約0.003Vです。 micro:bitのアナログ入力 それでは、実際にmicro:bitを使って実験してみましょう。アナログ入力として使用できるピンは、P0、P1、P2、P3、P4、P10です。 まず、以下のような回路を作ります。3.3Vから抵抗を介して直接P4に接続しています。3.3Vは、micro:bitの3Vと印字されているピンを使います。こうすることで、P4に3.3Vかかった時にアナログ入力で得られる値が実験できるはずです。 以下に示すプログラムを転送しましょう。

1
2
3
4
5
6
7
8
9
10
11
12
#include "mbed.h"
 
AnalogIn myInput(P4);
Serial pc(USBTX, USBRX);
 
int main() {
    while(1) {
        pc.printf("%f\n", myInput.read());
        wait(1);
    }
}
 

PCに出力を送っていますから、MacのTerminalを開きcatコマンドでシリアルポートを開いてください。結果は1.0になるはずです。これがアナログピンで計測できる最大の電圧です。micro:bitのピンには3.3Vよりも大きな電圧をかけてはいけません。 それでは、プログラムの説明をしましょう。AnalogInは、端子をアナログ入力として使うためのクラスです。アナログピンP4を指定しています。 pc.printf()の中で、myInput.read()というAnalogInのread()メソッドが呼び出されていますね。このread()メソッドを呼び出すと、端子の状態を読み取ってくれます。返値は実数で、0.0から1.0の範囲です。micro:bitの場合、アナログ入力で読み取れる最大の電圧は3.3Vまでなので、もし、P4に3.3Vがかかっていれば理論値としては1.0になります。回路を良く見て、実際に3.3VがP4にかかっていることを確認しましょう。 AnalogInには、端子の状態を読み取るためのメソッドがread()の他にもう1つ用意されています。read_u16()を使うと、端子の状態を16ビット符号なし整数として読み取ります。こちらも試しておきましょう。

1
2
3
4
5
6
7
8
9
10
11
12
#include "mbed.h"
 
AnalogIn myInput(P4);
Serial pc(USBTX, USBRX);
 
int main() {
    while(1) {
        pc.printf("%d\n", myInput.read_u16());
        wait(1);
    }
}
 

結果は、1023くらいになったのではないかと思います。しかし、この出力はmbedOSのリファランスに説明されている値とは大きくずれています。リファランスに説明されている通りだと、16ビットで表現できる最大値、すなわち65535に近い値になるはずなのです。おそらくmicro:bit用の実装では最小0で最大2の10乗(10ビット解像度)で返ってきているのだと思います。 6.2 可変抵抗器 可変抵抗(potentiometer) とは、抵抗値を変えることができる抵抗器です。典型的なものとしては、以下の写真に示すようなボリュームつまみのようなものが挙げられます。 このつまみを、回すことによって、抵抗値を小さくしたり大きくしたりすることができます。通常、可変抵抗には3つの端子があります。両端がVccとGNDで、真ん中の端子をその先の電子部品に繋ぎます。 可変抵抗の原理は、抵抗の分圧則によって説明されます。以下の回路図を見てください。 2つの抵抗はそれぞれxΩ、yΩです。このとき、アナログピン(P4)にかかる電圧はyΩの抵抗にかかる電圧と等しくなります。yΩにかかる電圧は以下のように計算されます。 Vout = (y / x + […]

Read More »

Posted in Class materials

Recent Posts

  • NE22の学生さんたちへ
  • 13 発表会
  • 12 発表準備
  • 11 実装
  • 10 要素テスト

Archives

  • July 2022
  • January 2022
  • December 2021
  • November 2021
  • October 2021
  • September 2021
  • January 2021
  • December 2020
  • November 2020
  • October 2020
  • September 2020
  • January 2020
  • December 2019
  • November 2019
  • October 2019
  • September 2019
  • August 2019
  • January 2019
  • December 2018
  • November 2018
  • October 2018
  • September 2018
  • January 2018
  • December 2017
  • November 2017
  • October 2017
  • September 2017
  • July 2017
  • January 2017
  • December 2016
  • November 2016
  • October 2016
  • September 2016

Categories

  • Announcement
  • Class materials
  • Tips
  • Uncategorized

Meta

  • Log in
  • Entries RSS
  • Comments RSS
  • WordPress.org

Physical Computing 2023 | Powered by WordPress.