「心理サイエンス」カテゴリーアーカイブ

フルカラーLEDを使う

フルカラーLED(NeoPixel)の使い方を学びます。

パーツの組立
 フルカラーLEDのGND端子に黒線を、VDD端子に赤線を、DI端子に白線をハンダ付けします。裏面にあらかじめハンダをのせておくとやりやすい。端子の反対側にピンヘッダーをハンダ付けして完成。収縮チューブで補強しておくと折れにくい。
マイコン内蔵RGBLEDモジュール

フルカラーLEDの接続
 下記のようにLEDを接続します。
フルカラーLED R→Arduino 3.3V
フルカラーLED B→Arduino GND
フルカラーLED W→Arduino 13

プログラム:ColorLED
 カラーLEDの制御には、Adafruit_NeoPixelライブラリを用います(ライブラリのインストール方法は動画をご覧ください)。プログラム冒頭で、デジタルポートの13番を制御用に使うこと、LEDの数が1個であることを定義しています。プログラムは、setup関数で初期化を行い、loop関数でLEDの点灯を処理しています。色のセットは、pixels.clear→pixels.setPixelColor→pixels.showの順で行います。pixels.Color(R, G, B)の形式で、色の強さは0~255で指定します。

 

//カラーLEDを用い、赤・緑・青色を点灯
#include <Adafruit_NeoPixel.h>
#define PIN 13        //制御用ピン
#define NUMPIXELS 1   //LEDの数
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
 
void setup() {
  pixels.begin();     //LEDを初期化
}
 
void loop() {
  pixels.clear();
  pixels.setPixelColor(0, pixels.Color(20, 0, 0));  //赤
  pixels.show();
  delay(1000);    //1000ms停止
 
  pixels.clear();
  pixels.setPixelColor(0, pixels.Color(0, 20, 0));  //緑
  pixels.show();
  delay(1000);    //1000ms停止
 
  pixels.clear();
  pixels.setPixelColor(0, pixels.Color(0, 0, 20));  //青
  pixels.show();
  delay(1000);    //1000ms停止
}

プログラム:SmoothR
 プログラムを使い、赤色のみをスムースに点滅させます。

//カラーLEDを用い赤色をスムースに点滅
#include <Adafruit_NeoPixel.h>
#define PIN 13        //制御用ピン
#define NUMPIXELS 1   //LEDの数
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
  
void setup() {
  pixels.begin();     //LEDを初期化
}
  
void loop() {
  int t=5;

  for(int i=0;i<256;i++){ 
    pixels.setPixelColor(0, pixels.Color(i,0,0)); //Red 
    pixels.show(); 
    delay(t); 
  } 

  for(int i=0;i<256;i++){ 
    pixels.setPixelColor(0, pixels.Color(255-i,0,0)); //Red 
    pixels.show(); 
    delay(t); 
  } 
}

プログラム:VRLED
可変抵抗を使ってLEDの色を変えます。その際、接続は下記の通り。

可変抵抗R→Arduino 5V
可変抵抗B→Arduino GND
可変抵抗W→Arduino A0
フルカラーLED R→Arduino 3.3V
フルカラーLED B→Arduino GND
フルカラーLED W→Arduino 13

 

//可変抵抗でカラーLEDの色を変える
#include <Adafruit_NeoPixel.h>
#define PIN 13        //制御用ピン
#define NUMPIXELS 1   //LEDの数
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
int vr1;

void setup() {
  pixels.begin();     //LEDを初期化
}
  
void loop() {
  vr1= analogRead(0);
  
  pixels.setPixelColor(0, pixels.Color(vr1/4,0,255-vr1/4));
  pixels.show();
  delay(10); 

}

WS190827-28

WS

付属高校サイエンスコースで,2日にわたりワークショップを行った。内容は下記PPTファイルのとおり。
10:00-16:00を2日やったため,ややコンテンツ不足気味であった。そのため,二日目は前日のArduino入門を復習するという内容を追加した(みんな全然できなかった,明日復習するよと前日に伝えると良い)。Arduino入門のLED点滅のところをブザーに置き換えて,音をならしたりするのが楽しそうであった。二日目は,LM35DZで温度を測るだけでなく,クレヨンしんちゃんなどを書いて,皮膚温低下を観測し,データをエクセルに移す実習も行った。加藤・徳永・寺内の3名が補助に参加してくれた。ありがとうございました。

WSで用いるプレゼンテーション:WS190827-8P

WSで使用するページのリンク

皮膚温計測装置のページ(TP07)

実験結果:TEMP190827

Arduino入門

可変抵抗のはんだ付け

Arduino応用編(LM35DZ)

Arduino応用編(NeoPixel)

Arduino応用編(BME280)

LM35DZを使う

温度センサーであるLM35DZをArduinoに接続する。

IMG-0230IMG-0231IMG-0232

赤ラインを5Vに,黒ラインをGNDに,白ラインをA0に接続する。

プログラム一式

注:現在LM35DZは入手性が悪くなっています。代替品(TMP36GT9Z)を使用する際は、「電圧を温度に変換(TMP36GT9Z)」行のコメントアウトを外して利用してください。


LM35DZ1
単純に温度を表示する。シリアルモニタ,シリアルプロッタで表示してみよう。

double vol,temp,gain;

void setup() {
  Serial.begin(9600);             // シリアル通信の初期化
  analogReference(INTERNAL);      //参照電圧を1.1vVに設定し感度拡大
  gain=(double)1.1/(double)1024;  //1.1Vリファレンス用のゲイン;
}

void loop() {
  vol = analogRead(0)*gain;
  temp=vol*100;        //電圧を温度に変換(LM35DZ)
  //temp=vol*100-50;     //電圧を温度に変換(TMP36GT9Z)
  Serial.print(vol);   //電圧表示
  Serial.print(",");
  Serial.print(temp);  //温度表示
  Serial.println();
  delay(100);
}

LM35DZ2
1000サンプルの平均温度を表示する。

double vol,temp,gain;
double sum,average;

void setup() {
  Serial.begin(9600);        // シリアル通信の初期化
  analogReference(INTERNAL);    //参照電圧を1.1vVに設定し感度拡大
  gain=(double)1.1/(double)1024;  //1.1Vリファレンス用のゲイン;
}

void loop() {
  sum=0;
  for(int i=0;i<1000;i++)
  {
      vol = analogRead(0)*gain;
      sum=sum+vol;
  }
  average=sum/(double)1000;  //1000回計測し平均を計算
  temp=average*100;        //電圧を温度に変換(LM35DZ)
  //temp=average*100-50;     //電圧を温度に変換(TMP36GT9Z)
  Serial.print(average);  //電圧表示
  Serial.print(",");
  Serial.print(temp);  //温度表示
  Serial.println();
  delay(50);
}

LM35DZ3
1秒間隔でできるだけ多くサンプルし平均温度を表示する。

double vol,temp,gain;
double sum,average;
long t,t0,cnt;

void setup() {
  Serial.begin(9600);             // シリアル通信の初期化
  analogReference(INTERNAL);      //参照電圧を1.1vVに設定し感度拡大
  gain=(double)1.1/(double)1024;  //1.1Vリファレンス用のゲイン;
  cnt=sum=0;
}

void loop() {
  t0=t;
  t=millis(); //現在時刻をms単位で取得
  vol = analogRead(0)*gain;
  sum=sum+vol;
  cnt++;
  if(t0/1000 !=t/1000){       //1秒(1000ms)毎に平均算出
    average=sum/(double)cnt;  //平均を計算
    temp=average*100;         //電圧を温度に変換(LM35DZ)
    //temp=average*100-50;      //電圧を温度に変換(TMP36GT9Z)
    Serial.print(cnt);        //サンプル数表示
    Serial.print(",");
    Serial.print(average);    //電圧表示
    Serial.print(",");
    Serial.print(temp);       //温度表示
    //Serial.print(",35,25");   //25度と35度を表示
    Serial.println();
    sum=0;cnt=0;
  }
}

ステージセレクト

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class stage : MonoBehaviour {

    // Use this for initialization
    void Start () {
       
    }
   
    // Update is called once per frame
    void Update () {

        if (Input.GetKey (KeyCode.F1)) {
            SceneManager.LoadScene ("s1");     
        }

        if (Input.GetKey (KeyCode.F2)) {
            SceneManager.LoadScene ("s2");     
        }
    }
}

Unity Asset 注文表 V.T.ちゃんチーム

<トイレ>

・Japanese School Restroom  $19.99

日本風の学校トイレ、トイレ空間、個室、夜バージョン、和式トイレしか無いので他のアセットで洋式トイレが必要。

・Japanese Apartment  $29.99

日本のアパート、洋式トイレがある。その他アパートの小道具がある。トイレ以外にも使用可能。

・Sinister Props Packs 1  $4.99

ホラー感を演出するための小道具。

(・Forest Pack  $4.99)

メインで使う森アセットが使えなかった時用の予備アセット。

 

合計 $59.96 (約6675円)

ジェンガで皮膚温を計測する

心理サイエンスコースより、佐藤唯人がお届けします。

Clipboard01img_3598.jpg

ジェンガをしながら皮膚温を測る方法を下記にまとめます。

・1 デスクトップのファイル名「temp6a151111」を開く。

・2 中の「temp6」を開き、「temp6.vi」を起動する。

・3 「LabVIEWを起動」をクリック。評価期間の延長については「いいえ」を選択。

・4 COM portの▼をクリックし、使用する物に変更。縦軸の数値の上限下限、時間、名前は各自で設定する。

・5 左上のファイルタブ下の→(実行)をクリックして起動。

※プロジェクターで映す場合、HDMI端子をつなぎ「Source Search」ボタンを押す。

 

img_3597.jpg

BME280で気温・湿度・気圧を測る

スライド1 スライド2 スライド3

スライド4 スライド5 スライド6

スライド7 スライド8

ArduinoにSCL/SDAが見当たらない場合は,
Arduino SCL —> A5
Arduino SDA —> A4
のように読み替えて下さい。

BME280を動かすには,以下の2つのライブラリが必要です。
Adafruit Unified Sensor
Adafruit BME280

ファイル一式:SSH180217-1


bme280test1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme; // I2C
unsigned long delayTime;

void setup() {
    Serial.begin(9600);

    bool status;
    // default settings
    status = bme.begin(0x76); //read I2C address 0x76
    if (!status) {
        Serial.println("Could not find a valid BME280 sensor, check wiring!");
        while (1);
    }
    delayTime = 1000;
    Serial.println();
}

void loop() {
    printValues();
    delay(delayTime);
}

void printValues() {
    Serial.print("Temperature = ");
    Serial.print(bme.readTemperature());
    Serial.println(" *C");

    Serial.print("Pressure = ");
    Serial.print(bme.readPressure() / 100.0F);
    Serial.println(" hPa");

    Serial.print("Approx. Altitude = ");
    Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
    Serial.println(" m");

    Serial.print("Humidity = ");
    Serial.print(bme.readHumidity());
    Serial.println(" %");

    Serial.println();
}

bme280test2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme; // I2C
unsigned long delayTime;

void setup() {
    Serial.begin(9600);
    bool status;
    // default settings
    status = bme.begin(0x76); //read I2C address 0x76
    if (!status) {
        Serial.println("Could not find a valid BME280 sensor, check wiring!");
        while (1);
    }
    delayTime = 1000;
    Serial.println();
}

void loop() {
    printValues();
    delay(delayTime);
}

void printValues() {
    Serial.print(bme.readTemperature());
    Serial.print(",");
    Serial.print(bme.readPressure() / 100.0F-1000);
    Serial.print(",");
    Serial.print(bme.readHumidity());
    Serial.println();
}

Arduinoで皮膚温度計を作成する

温度センサーLM35DZを用いて、4人同時皮膚温度計測器を作成する。

0img_3413.jpgimg_3414.jpg

LM35DZに赤白黒の線をハンダ付けする。線の長さは50cmくらい。センサーを正面(型番が記入してある面)に見て、左足に赤右足に黒真ん中の足に白をハンダ付けし、内部で混線しないよう収縮チューブをつける。反対側にはピンヘッダーをはんだ付けする。次にブレッドボードの赤青線部分のみをカッターで切り離し、両面テープでArduinoに固定する。

img_3417.jpgimg_3416.jpglog

ブレッドボードの赤ラインにArduinoの5Vを、青ラインにAdrduinoのGNDを接続する。各センサーの赤線はブレッドボードの赤ライン、黒線は青ラインに接続する。白線はArduinoのA0~A3に接続する。下記ソフトウェアをArduinoに転送すると、シリアルモニタに開始秒数と4本ぶんのセンサー値が表示される。カット&ペーストでエクセルにコピーしてグラフを作成する。

Arduino用皮膚温計測プログラム:temp4

graph

 

フルカラーLEDを使う

フルカラーLED(NeoPixel)の使い方を学びます。
img_3390.jpg

フルカラーLEDのGND端子に黒線を、VDD端子に赤線を、DI端子に白線をハンダ付けします。裏面にハンダ付けするとやりやすい。反対側にピンヘッダーをハンダ付けして完成。収縮チューブも忘れずに。

img_3387.jpgimg_3388.jpg img_3389.jpg

完成したら、黒線をArduinoのGNDに、赤線を5Vに、白線をD6につなぐ。

img_3391.jpg

下記のプログラムで、赤、緑、青に1秒ずつ光る。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include
#define PIN 6
#define NUMPIXELS 1
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
pixels.begin();
}

void loop() {
pixels.setPixelColor(0, pixels.Color(5,0,0)); //Red
pixels.show();
delay(1000);

pixels.setPixelColor(0, pixels.Color(0,5,0)); //Green
pixels.show();
delay(1000);

pixels.setPixelColor(0, pixels.Color(0,0,5)); //Blue
pixels.show();
delay(1000);
}

スムースに光らせるにはforループを使う

1
2
3
4
5
6
7
8
9
10
11
12
13
#include
#define PIN 6
#define NUMPIXELS 1
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
pixels.begin();
}

void loop() {
int t=5;

for(int i=0;i&lt;255;i++){ pixels.setPixelColor(0, pixels.Color(i,0,0)); //Red pixels.show(); delay(t); } for(int i=0;i&lt;255;i++){ pixels.setPixelColor(0, pixels.Color(255-i,0,0)); //Red pixels.show(); delay(t); } }

次は可変抵抗と組み合わせて明るさを換えてみる。
接続は以下のとおり。
1.Arduinoの5Vをブレッドボードの+に、GNDをブレッドボードの-につなぐ。
2.フルカラーLEDの赤線をブレッドボードの+に、黒線を-に、白線をArduinoのD6につなぐ。
3.可変抵抗の赤黒線をブレッドボードにつなぎ、白線をArduinoのA0につなぐ。
img_3392.jpg

下記のプログラムで、可変抵抗の値におうじて明るさが変化する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include
#define PIN 6
#define NUMPIXELS 1
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
int vr1;

void setup() {
pixels.begin();
}

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

pixels.setPixelColor(0, pixels.Color(vr1/4,0,0));
pixels.show();
delay(10);
}

可変抵抗のはんだ付け

img_3384.jpg

材料は、可変抵抗(10kΩ)、赤白黒のサーボ線、収縮チューブ、ピンヘッダーです。

img_3370.jpg img_3371.jpg img_3373.jpg img_3372.jpg

まず最初に線の両端をワイヤストリッパーで露出させます。露出させた芯にハンダを染み込ませます。次に、ピンヘッダーにもハンダをつけておきます。温めすぎるとピンヘッダーが溶けるので注意します。

img_3374.jpg img_3375.jpgimg_3376.jpg

線とピンヘッダーをハンダ付けしてつなぎます。収縮チューブを予め通しておくことを忘れずに。はんだ付けが終わったら、バーナーで収縮チューブを収縮させます。3本終わったら、プラスチック部分を除去します。

img_3377.jpg img_3378.jpg img_3382.jpg

可変抵抗の端子部分にハンダをのせておきます。ピンヘッダー側と同様に、ワイヤストリッパーで線を露出させ、ハンダを染み込ませ、可変抵抗にはんだ付けします。左から赤白黒の順序ではんだ付けします。

img_3380.jpgimg_3381.jpgimg_3383.jpg

これで可変抵抗モジュールの完成です!

 

Arduino入門

HSSC_Arduino01

プレゼンテーションファイル等一式:HSSC180821

1.LEDを点滅させます。
LED3
Blink


1
2
3
4
5
6
7
8
9
10
11
12
13
//LEDを点滅させる
void setup()
{
  pinMode(13, OUTPUT); //13番のピンを出力モードに
}

void loop()
{
  digitalWrite(13, HIGH); //13をONにする
  delay(1000); //1000ms待つ
  digitalWrite(13, LOW); //13をOFFにする
  delay(1000); //
}

2.可変抵抗(ボリューム)の値を読み取ります。
可変抵抗の黒線をArduinoのGNDに,赤線を5Vに,白線をA0に接続します。
vr1
READ1


1
2
3
4
5
6
7
8
9
10
11
12
13
int value= 0; // アナログ値を格納する変数

void setup(){
  Serial.begin(9600); // シリアルポートを9600bpsで開く
}

void loop(){
  value= analogRead(0); // アナログピン0から読み取る
 
  Serial.print(value); //読んだ値をPCへ送る
  Serial.println(); // 改行を送信
  delay(100); // 100ミリ秒停止
}

3.可変抵抗(ボリューム)の値をLEDの明るさに反映させます。
LEDの長い足をArduinoのD11に,短い足をGNDに接続します。
可変抵抗の黒線をArduinoのGNDに,赤線を5Vに,白線をA0に接続します。
img_3289.jpg
analogLED


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int value= 0; // アナログ値を格納する変数

void setup(){
  pinMode(11, OUTPUT); //11番ピンを出力モードに
  Serial.begin(9600); // シリアルポートを9600bpsで開く
}

void loop(){
  value= analogRead(0); // アナログピン0から読み取る
  analogWrite(11,value/4); // アナログ値を1/4してLEDに入れる
 
  Serial.print(value/4); //LEDの値をPCへ送る
  Serial.println(); // 改行を送信
  delay(100); // 100ミリ秒停止
}