プロトタイピング①
5/272024
カテゴリー:課題
班メンバー
企画案
今回、私たち3人は、現代人のスマホ依存症に注目し、進んで制限しようと思える制限ケースの作成を考えています。
現状考えている案は感圧センサーを使い、ケースにスマホを入れていた時間によって背面ライトの光が増していき、視覚的に自分がどれほど我慢したのかわかるようにしようとしています。
プロトタイピング②
6/32024
カテゴリー:課題
フィールドワーク
このケースの必要性を調べるために、「どのくらいスマホを使用しているか」、「スマホを触る時間を減らしたいか」について調査しました。
結果として、6時間以上スマホを触っている人が過半数を超えていることがわかりました。
そしてその時間を減らしたいと考えている人も70%弱いることが判明し、我々がその解決の糸口になる必要があると再確認しました。
設計図1
]
MDFで箱を作り、土台を完成させながら、光で時間を伝えられるようにその上からアクリルをかぶせるようなデザインを考えています。
動作確認
まず、手元に届いた圧力センサーがちゃんと動くのかを確認しました。
参考にしたサイトはこちらです
プロトタイピング③
6/102024
カテゴリー:課題
プロトタイプするぞ
まず初めに、スマホを入れるための箱を作りました。
毎度のごとく、MakerCaseを使用してデータを作成。
そのデータに充電コード用の穴などをつけています。
プロトタイピング④
6/172024
カテゴリー:課題
時間で光り方が変わるコード
先週、プロトタイプの箱が出来たので次は圧力を感知した時間によってLEDテープが光り方が変えられるコードを考えました。
完成形のイメージとしては、徐々に光が強くなり、スマホを触っていない時間が「感覚的」にわかるようにしたいのですが
とりあえず一定時間ごとに光が増えるようにコードを製作しました。
下記のコードは動画のものに、少し改良を加えたものです。
- #include <Adafruit_NeoPixel.h>
- // NeoPixelの設定
- #define NUM_PIXELS 5
- #define PIN_PIXELS 6
- Adafruit_NeoPixel pixels(NUM_PIXELS, PIN_PIXELS, NEO_GRB + NEO_KHZ800);
- // 圧力センサーのピン設定
- #define PRESSURE_SENSOR_PIN A0
- // LEDの色設定
- #define LED_COLOR_R 255, 0, 0
- #define LED_COLOR_Y 255, 255, 0
- #define LED_COLOR_O 255, 69, 0
- #define LED_COLOR_W 255, 255, 255
- #define LED_COLOR_B 0, 0, 255
- // 初期LEDの数
- int numLEDs = 0; // 最初はLEDはすべて消灯状態
- void setup() {
- pixels.begin(); // NeoPixelの初期化
- Serial.begin(9600); // シリアル通信の開始(デバッグ用)
- }
- void loop() {
- // 圧力センサーの値を読み込む
- int sensorValue = analogRead(PRESSURE_SENSOR_PIN);
- if (sensorValue < 200) { // 圧力センサーの閾値(例: 200)
- // 圧力がかかっている場合
- // LEDを点灯させる
- for (int i = 0; i < numLEDs; i++) {
- switch(i) {
- case 0:
- pixels.setPixelColor(i, pixels.Color(LED_COLOR_B));
- break;
- case 1:
- pixels.setPixelColor(i, pixels.Color(LED_COLOR_W));
- break;
- case 2:
- pixels.setPixelColor(i, pixels.Color(LED_COLOR_Y));
- break;
- case 3:
- pixels.setPixelColor(i, pixels.Color(LED_COLOR_O));
- break;
- case 4:
- pixels.setPixelColor(i, pixels.Color(LED_COLOR_R));
- break;
- }
- }
- pixels.show(); // LEDに色を表示
- // 5秒待つ
- delay(5000);
- // LEDの数を増やす(最大NUM_PIXELSまで)
- if (numLEDs < NUM_PIXELS) {
- numLEDs++;
- }
- } else {
- // 圧力がかかっていない場合、すぐにLEDを消灯させる
- pixels.clear(); // すべてのLEDを消灯
- pixels.show(); // LEDに反映
- // LEDの数を初期化
- numLEDs = 0;
- }
- delay(100); // 少し待つ
- }
置けば置くほど光る箱
私たちは、徐々に光が増えていき、1時間を視覚的にわかるように、dfLinkでグラフとしても可視化出来るようにプログラムを組みました。
前回のレポートでは出来ていなかった徐々光量が増えて、視覚的に時間がわかるプログラムも完成しています。
概要
下記のソースコードで徐々に光らせるプログラムは出来るのですが、授業で使ったコードでdfLinkにつなげようとするとうまくいきません。
pyファイルのコードには、圧力センサーが圧力数値を0と示した時に、信号を送れないという仕様があるようで、「0になったらスキップする」というプログラムをしてグラフ化することに成功しました。
箱の側面にアクリルを配置しているのは光を拡散させるための装飾です。
反省点
-
蓋の開け閉めがやりずらい
-
でかい
-
肉球しかデザインがない
-
パソコンにつなげないとdfLinkでグラフ化ができない
改良したかった点
もともと、dfLinkを介して置いた時間がLINEにメッセージとして送られるプログラムを作りたかったが
コードが複雑で頭がパンクしそうになり、惜しくも断念してしまった。
ソースコード
- #include <Adafruit_NeoPixel.h>
- #define NUM_PIXELS 5
- #define PIN_PIXELS 6
- Adafruit_NeoPixel pixels(NUM_PIXELS, PIN_PIXELS, NEO_GRB + NEO_KHZ800);
- #define PRESSURE_SENSOR_PIN A0
- #define LED_COLOR_R 255, 0, 0
- #define LED_COLOR_Y 255, 255, 0
- #define LED_COLOR_O 255, 69, 0
- #define LED_COLOR_W 255, 255, 255
- #define LED_COLOR_B 0, 0, 255
- unsigned long startTime = 0;
- unsigned long elapsedTime = 0;
- const unsigned long ONE_HOUR = 3600000; // 1時間のミリ秒
- const unsigned long LED_INTERVAL = ONE_HOUR / NUM_PIXELS; // 各LEDが点灯を開始する間隔
- int currentLED = 0;
- int ledBrightness[NUM_PIXELS] = {0}; // 各LEDの明るさ
- void setup() {
- pixels.begin();
- Serial.begin(9600);
- pixels.clear();
- pixels.show();
- }
- void loop() {
- int sensorValue = analogRead(PRESSURE_SENSOR_PIN);
- Serial.println(sensorValue);
- if (sensorValue >= 201) {
- // 圧力が201以上の場合、即座に消灯
- resetLEDs();
- } else if (sensorValue <= 200) {
- if (startTime == 0) {
- startTime = millis();
- }
-
- elapsedTime = millis() - startTime;
- unsigned long elapsedMinutes = elapsedTime / 60000;
-
- Serial.print("Elapsed time: ");
- Serial.print(elapsedMinutes);
- Serial.println(" minutes");
- updateLEDs();
- }
- }
- void resetLEDs() {
- startTime = 0;
- elapsedTime = 0;
- currentLED = 0;
- for (int i = 0; i < NUM_PIXELS; i++) {
- ledBrightness[i] = 0;
- }
- pixels.clear();
- pixels.show();
- }
- void updateLEDs() {
- for (int i = 0; i <= currentLED; i++) {
- if (i == currentLED) {
- // 現在のLEDの明るさを徐々に上げる
- unsigned long ledElapsedTime = elapsedTime % LED_INTERVAL;
- ledBrightness[i] = map(ledElapsedTime, 0, LED_INTERVAL, 0, 255);
- } else {
- // 既に点灯済みのLEDは最大輝度に設定
- ledBrightness[i] = 255;
- }
- // LEDの色を設定
- uint32_t color;
- switch (i) {
- case 0: color = pixels.Color(0, 0, ledBrightness[i]); break; // 青
- case 1: color = pixels.Color(ledBrightness[i], ledBrightness[i], ledBrightness[i]); break; // 白
- case 2: color = pixels.Color(ledBrightness[i], ledBrightness[i], 0); break; // 黄
- case 3: color = pixels.Color(ledBrightness[i], ledBrightness[i] * 69 / 255, 0); break; // オレンジ
- case 4: color = pixels.Color(ledBrightness[i], 0, 0); break; // 赤
- }
- pixels.setPixelColor(i, color);
- }
- pixels.show();
- // 次のLEDの点灯を開始するタイミングをチェック
- if (elapsedTime >= (currentLED + 1) * LED_INTERVAL && currentLED < NUM_PIXELS - 1) {
- currentLED++;
- }
- }