今日も知らない街を歩く

今日も知らない街を歩く

雑記に近い形でちまちま書いていきます。

RP人狼の役作りに悩むあなたに捧げるArduino奮闘記 -基礎実装・ボタンの改良とディスプレイ表示編-

前回の続きです。

 

ボタンの改良とモードチェンジ

10秒を測る機能を作ったので、さらなる改善と機能追加に取り組むことにしました。
主な改良ポイントは以下の3点です。

  1. 2つ目のボタンを追加し、モードチェンジを可能にする
  2. より視認性の高い、大きなボタンに変更する
  3. ディスプレイに現在のモードと経過秒数を表示する

ボタンの課題と解決策

  最低限の機能は動作するようになりましたが、現在使用しているボタンはブレッドボードに直接取り付ける小さなものです。舞台上で実際に使用するとなると、押しにくく、周りの演者や観客からも何が行われているのか分かりづらいのが問題でした。そこで、大きく目立つボタンを用意し、押したときに確実に反応するようにすることにしました。

  また、ボタンの種類には大きく分けて2種類あることが分かりました。

  • モーメンタリスイッチ:押している間だけオンになり、離すとオフになる
  • オルタネートスイッチ:押すごとにオン・オフが切り替わる

  スターターキットに入っていたのはモーメンタリスイッチでしたが、今回の用途にはオルタネートスイッチの方が適していると判断しました。たとえば、

  • 1回押すと10秒計測を開始
  • もう1回押すとリセット

という操作の方が、直感的で分かりやすいためです。
  モードチェンジ用のボタンについても、1回押すとモード変更、もう1回押すとリセット という仕様にすることで、操作ミスを防ぎやすくなると考えました。

スイッチを求めていざ秋葉原

  しかし、スターターキットにはオルタネートスイッチが入っていませんでした。
モノタロウやAmazonで探してみても、サイズ感が分からず、実際に触って確かめる必要があると感じました。そこで、秋葉原の 秋月電子通商へ足を運ぶことにしました。

 

akizukidenshi.com

  1階には様々な電子部品が並んでおり、店員さんに相談しながら必要なスイッチを探しました。*1

f:id:TownBeginner:20250224153704j:image

  オルタネートスイッチが手に入ればよかったのですが、購入するつもりだったオルタネートスイッチは、ブレッドボードに直接挿せるタイプではなくワイヤーをはんだ付けする必要がありました。そこで、はんだ付けに失敗した場合のことも考えて予備のスイッチも購入しました。

 

  帰宅後、早速オルタネートスイッチをArduinoとブレッドボードに接続します。はんだ付けはまだ行わず、クリップとワイヤーでボタンを繋げました。

  スイッチを押すと シリアルモニターに「1」が表示 されました。オルタネートスイッチの実装は問題なくできそうです。

 

ディスプレイ悪戦苦闘

  ボタンの問題が解決したので、次はいよいよ ディスプレイ の実装に進みます。
幸い、スターターキットにはディスプレイが付属していたので、まずはこれとサンプルプログラムを活用し、現在のモードや経過秒数を表示していきます。

   最初の問題:文字が表示されない

  ディスプレイを接続しスイッチオン、プログラムを動かしてみたところ、画面には 白い四角 が表示されるだけで、文字が出てきませんでした。

f:id:TownBeginner:20250224153653j:image

  最初からうまくいくわけ無い、とは思っていても実際に目の当たりにすると少し凹みます…。

  明らかにハードウェアの問題であることは分かったので、抵抗や接続方法、接続先を見直し、少しずつ接続方法を変えながら試してみることにしました。

f:id:TownBeginner:20250224153701j:image

f:id:TownBeginner:20250224153713j:image

想定通りではありませんが、文字が表示されるようにはなりました。

配線ミスも発見し、慎重に修正を加えながら進めることで、ついにディスプレイに期待していた文字が表示されるように なりました。

f:id:TownBeginner:20250224153657j:image

しかし、ここで 奇妙な現象 に遭遇しました。
なぜか アルファベットの「O」だけが表示されない のです。プログラムのミスかと思い、コードを見直しても問題は見当たりません。配線の問題と思われますが、どうやっても直りません。仕方がないので、 「O」の代わりに「0(ゼロ)」を使うことで対応 することにしました。まあこれも味があっていいかなと無理やり自分を納得させました。

 

実装の完了と新たな課題

  最後の課題は、緑のスイッチを押すことでモードチェンジを行う機能 の実装でした。
さらに、ディスプレイの表示にもこだわり、横スクロールや点滅 などの演出を加えたかったため、ChatGPTに相談しながら実装を進めました。

その結果、以下のプログラムが完成しました。


// ピン設定
const int switch1Pin = 3;    // スイッチ1(10秒タイマー開始・リセット用)
const int switch2Pin = 13;   // スイッチ2(モードチェンジ用)
const int redPin = 4;
const int greenPin = 12;
const int bluePin = 2;

// 状態管理用変数
unsigned long startTime = 0;
unsigned long blinkInterval = 100; 
unsigned long lastBlinkTime = 0;
bool timerActive = false;
bool ledState = LOW;
bool modeChangeActive = false;
unsigned long modeChangeStartTime = 0;
int scrollCount = 0;

// LCDライブラリ
#include 
LiquidCrystal lcd(6, 7, 8, 9, 10, 11);

void setup() {
  pinMode(switch1Pin, INPUT_PULLUP);
  pinMode(switch2Pin, INPUT_PULLUP);
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
  pinMode(LED_BUILTIN, OUTPUT);
  
  Serial.begin(9600);
  
  // 初期設定
  digitalWrite(redPin, LOW);
  digitalWrite(greenPin, LOW);
  digitalWrite(bluePin, LOW);
  digitalWrite(LED_BUILTIN, LOW);
  
  // LCD初期化
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(F("MODE:MAG=MELL"));
  lcd.setCursor(0, 1);
  lcd.print("Sec: 0         ");
}

void loop() {
  bool switch1State = digitalRead(switch1Pin) == LOW;
  bool switch2State = digitalRead(switch2Pin) == LOW;
  
  Serial.print(" | TimerActive: "); Serial.println(timerActive);
  Serial.print("Switch1: "); Serial.print(switch1State);
  Serial.print(" | Switch2: "); Serial.print(switch2State);

  if (modeChangeActive) {
    if (!switch2State) {
      modeChangeActive = false;
      lcd.clear();
      lcd.print(F("MODE:MAG=MELL"));
      lcd.setCursor(0, 1);
      lcd.print("Sec: 0         ");
    } else {
      handleModeChange();
      return;
    }
  }

  if (switch1State && !timerActive) {
    startTime = millis();
    timerActive = true;
    Serial.print("タイマー開始");
  }

  if (!switch1State) {
    timerActive = false;
    digitalWrite(redPin, LOW);
    digitalWrite(greenPin, LOW);
    digitalWrite(bluePin, LOW);
    ledState = LOW;
    startTime = 0;
    lastBlinkTime = 0;
    Serial.print("時間OFF");
    
    lcd.setCursor(0, 1);
    lcd.print(F("Sec: 0         "));
    return;
  }

  if (timerActive) {
    int currentSec = (millis() - startTime) / 1000;
    lcd.setCursor(5, 1);
    lcd.print("        ");
    lcd.setCursor(5, 1);
    lcd.print(currentSec);

    if (millis() - startTime >= 20000) {
      if (millis() - lastBlinkTime >= blinkInterval) {
        ledState = !ledState;
        digitalWrite(redPin, ledState);
        digitalWrite(LED_BUILTIN, ledState);
        lastBlinkTime = millis();
      }
      Serial.print("LED点滅");
    }
  }

  if (switch2State) {
    if (!modeChangeActive) {
      modeChangeActive = true;
      modeChangeStartTime = millis();
      lcd.clear();
      lcd.print("Mode change");
      lcd.setCursor(0, 1);
      lcd.print("processing...");
    }
  }
}

void handleModeChange() {
  unsigned long elapsed = millis() - modeChangeStartTime;

  if (elapsed < 10000) {
    if (scrollCount < 40) {
      lcd.setCursor(0, 1);
      lcd.print("processing...   ");
      lcd.scrollDisplayLeft();
      scrollCount++;
      delay(100);
    }

    lcd.setCursor(0, 1);
    if ((elapsed / 500) % 2 == 0) {
      lcd.print("processing...   ");
    } else {
      lcd.print("              ");
    }
  } else if (elapsed < 12000) {
    lcd.setCursor(0, 1);
    if ((elapsed / 500) % 2 == 0) {
      lcd.print("Completed.   ");
    } else {
      lcd.print("              ");
    }
    delay(500);
  } else {
    lcd.clear();
    lcd.print("Undertaking the");
    lcd.setCursor(0, 1);
    lcd.print("Gray-Gnome   ");
    digitalWrite(redPin, LOW);
    digitalWrite(greenPin, HIGH);
    digitalWrite(bluePin, HIGH);
  }
}
    

あっという間に完成したように見えますが、実際にはもっと長い時間を費やしました。特に配線に関してはの部分では悪戦苦闘 し、何度も何度も配線を見直し、接続をやり直すという作業の繰り返しでした。

  電子工作のハードウェア部分は、「一発で動くことがまず無い」「原因の切り分けが難しい」「再現性が高いとは限らない」などの理由から苦手意識を持っていました。しかし、根気よく配線をチェックし続けた結果、最終的には正しく表示させることができました。この経験を通じて、電子工作に対する苦手意識を払拭することができたのは、大きな収穫だったと思います。

こうして、以下の2つの機能が完成しました。

  1. 20秒経過後にLEDを点灯する
  2. 緑ボタンを押すことでモードチェンジを行う

以下、実際のデモです。*2

www.youtube.com

www.youtube.com

 

しかし、実際に会場に持っていってそのまま動作できるのか、僕は不安でした。理由は、運用するにあたって懸念点を調べていたところ、以下の記事を発見したからです。

fumimaker.net

やらかし打線に

中:ブレッドボードのまま会場に持ってくるのやめろ

と、不動の4番に位置づけられていました。

  ブレッドボードはプロトタイピングには便利ですが、接触不良や衝撃で配線が抜けるリスクがあります。舞台上で使用するには、より安定した回路にする必要があるというのはよくわかります。

  しかし、問題は僕に電子工作の知識が不足していることです。回路図の読み方も分からず、購入した本もほぼ手つかずの状態でした。この時、RP人狼本番一週間前。なんとかならないかと調べたところ、どうやらユニバーサル基板の中でも、ブレッドボードと同じ回路をあらかじめ設計しているものがあり、これを用いればブレッドボードと同じように実装できる基板があることがわかりました。

note.com

「これなら自分でもできるかもしれない」と考え、早速ユニバーサル基板を購入しました。さらに、もう一度秋月電子通商へ足を運び、はんだごてスターターキットを購入。

 

  これで、安定した回路作りに必要な道具が揃いました。

  次のステップとして、僕は30年ぶりにはんだ付けに挑むことになったのです。

 

「はんだ付け討死編」へ続く。

*1:店員さんは非常に親切で、質問にも丁寧に答えてくれたため、とても助かりました。秋月電子が長年支持されている理由がよく分かりました。

*2:何回も配線を直した結果、前述の「O」がディスプレイに表示されないというバグが直っています。なぜ直ったのかは謎です。

RP人狼の役作りに悩むあなたに捧げるArduino奮闘記 -基礎実装 10秒経過編 -

前回の続きです。

 

ChatGPTにひたすら聞いて知識の補強

 

そもそもArduinoのスターターキットを購入した理由は、ChatGPTに問い合わたら以下の回答が返ってきたからです(以降、赤字は筆者の質問、斜字はChatGPTの回答)。

 

これまで質問してきたのですが、これらの制御についてM5Stackやraspberry piを使って代替することは可能でしょうか。プログラムを打ち込むことで制御ができて回路が簡単になるのであれば、それでチャレンジしたいです。

 

はい、M5StackやRaspberry Piを使用して、これまで質問されてきた制御を行うことは十分に可能です。これらのマイコンボードやシングルボードコンピュータを使うと、プログラムを通じて回路の制御が柔軟に行え、回路設計もシンプルになります。以下、具体的なポイントを説明します。

(以下略)

 

ありがとうございます。それではArduinoを使って以下のことをしたいので、どうすればよいか教えてもらえますか?
・スイッチ1(赤色のスイッチ)を押すと、10秒後にモーターを使った小型の風車が回る&LEDランプが点滅する
・スイッチ2(黄色のスイッチ)を押すとリセットされる(LEDランプの点滅がオフになる、モーターが回らなくなる、時間のカウントが0秒に戻ってカウントされなくなる)。スイッチ1を押して10秒立つ前にスイッチ2を押すと時計のカウントが0に戻りカウントされなくなる。

 

このプロジェクトをArduinoを使って実現するために、基本的な回路構成とプログラムの概要を説明します。2つのスイッチを使ってモーターとLEDランプの動作を制御する方法です。

 

必要な部品
  • Arduinoボード(Uno、Nanoなど)
  • スイッチ:赤色(スイッチ1)、黄色(スイッチ2)
  • モーター:小型DCモーター
  • トランジスタまたはリレー(モーター駆動用)
  • LEDランプ
  • 抵抗:LED用(220Ωなど)
  • ジャンパーワイヤー
  • ダイオード(モーター駆動用のフライバックダイオード)
  • 電源(必要に応じて、モーターに外部電源)
回路構成
  1. スイッチ

    • スイッチ1をArduinoのデジタルピンに接続。
    • スイッチ2を別のデジタルピンに接続。
    • スイッチの片方はGND、もう片方はプルアップ抵抗を経由してArduinoのピンに接続。
  2. モーター

    • モーターはトランジスタ(NPN)やリレーを使ってArduinoのデジタルピンで駆動します。モーターのプラス側は外部電源に、マイナス側はトランジスタのコレクタに接続。
    • トランジスタのベースは抵抗を経由してArduinoのデジタルピンに接続。
    • フライバックダイオードをモーターに並列に接続して逆電流を防ぎます。
  3. LED

    • LEDは抵抗を経由してArduinoのデジタルピンに接続。
Arduinoコード例

以下に、Arduinoのプログラム例を示します。

コードの説明
  • switch1Pinswitch2Pin はスイッチのピン番号です。プルアップ抵抗を使っているため、LOWになったときにスイッチが押されたと認識します。
  • startTime はタイマーを開始した時刻を記録します。
  • timerActive はタイマーが動作しているかどうかを管理します。
  • スイッチ1を押すと、タイマーがスタートし、10秒後にモーターとLEDが動作します。
  • スイッチ2を押すと、タイマーがリセットされ、モーターとLEDがオフになります。

このプログラムをArduino IDEにコピーして書き込み、回路を組み立てて動作を確認してください。

 

以下に回路の詳細を説明します。

接続図の概要
  • Arduinoのピン配置

    • デジタルピン2 に赤色スイッチを接続。
    • デジタルピン3 に黄色スイッチを接続。
    • デジタルピン8 にLEDを接続(抵抗を挟む)。
    • デジタルピン9 にトランジスタを介してモーターを接続。
  • 電源とGNDの接続

    • スイッチは片方がGND、もう片方がArduinoのデジタルピンに接続されます。
    • モーターは外部電源を使用する場合、GNDはArduinoのGNDと共有する必要があります。
図解の説明
  1. スイッチ1(赤色)
    • デジタルピン2 → スイッチ → GND
  2. スイッチ2(黄色)
    • デジタルピン3 → スイッチ → GND
  3. モーター
    • デジタルピン9 → 抵抗を介してトランジスタのベース → トランジスタのエミッタがGND、コレクタがモーターのマイナス端子へ
    • モーターのプラス端子 → 外部電源のプラス
    • フライバックダイオードをモーターに並列に接続(カソードが電源側)
  4. LED
    • デジタルピン8 → 抵抗 → LEDアノード
    • LEDカソード → GND

図解をテキストで表現するのは限界がありますが、プロジェクトの視覚的なサポートが必要であれば、回路シミュレーションツール(例:Tinkercad)を使用して図を描くことをお勧めします。もしさらに詳細な図を手に入れたい場合は、回路図エディタ(Fritzingなど)を使うと、配線が視覚的にわかりやすくなります。

 

  知識が無いのでとにかくChatGPTに質問しました。ハルシネーションの可能性はあるかもと思いましたが、どのみち今の自分の知識では正解に自力ではたどり着けないのでChatGPTを信じて概要を理解することにしました。わからない用語もChatGPTに質問します。

 

GNDとは何ですか?

GND(Ground)とは、電気回路における基準電位、または回路の共通の基準点を指します。GNDは日本語で「接地」とも呼ばれ、回路内の電位をゼロボルトと見なします。電気が流れるためには、電圧の高い場所から低い場所への経路が必要ですが、GNDはその「低い場所」に相当します。

GNDの役割
  1. 基準電位

    • 回路の電圧の基準点として使われます。電源のプラス端子が5Vや12Vなどであれば、それに対してGNDは0Vです。
  2. 電流の戻り経路

    • 電気が流れるには出発点と戻る場所が必要です。GNDは電流が戻る経路として機能し、回路を閉じることで電流を流すことができます。
  3. 安全性

    • 家庭用電気製品では、GNDはしばしば大地に接続されており、漏電時に電流を大地に逃がして安全性を保ちます。電子工作の場合は回路内の基準電位として機能します。
電子工作でのGND

Arduinoやその他の電子回路では、GNDは一般的に回路の負極(マイナス)に相当します。たとえば、Arduinoで以下のような接続をする際にGNDが使われます:

  • スイッチ:スイッチの一方の端子をGNDに接続し、もう一方をArduinoのデジタルピンに接続して入力信号を受け取る設定。
  • LED:LEDのカソード(短い端子)をGNDに接続し、アノード(長い端子)をArduinoの出力ピンに接続する。
  • モーターや外部電源:外部電源を使う場合は、GNDをArduinoのGNDと共通にすることで、電気が正しく流れるようになります。
まとめ

GNDは、電気回路における「0Vの基準点」であり、回路内のすべての電圧はこの基準点に対して測定されます。電流の戻り経路として必要であり、回路内の各デバイスが正しく動作するためにGNDは重要な役割を果たします。

 

10秒経過したら警告としてLEDランプを点滅させる機能の実装

 

  概要はなんとなく分かったので、続いてArduinoに書き込むためのプログラムを尋ねます。

  まず作るべきは、10秒経過した事を知らせるプログラムです。ボタンを押したら10自分学校で伝えること(ここはキャラクター作りという意味でも自分で口頭です。知らせ方が良い(閉じるので、最低限2番の実装ができれば良いことになります。そこでまずは2番の自走することにしました。

 

  電子工作についてほとんど素人のため、まずはスターターキットに入っていたLEDを点灯することから自作し、問題なく点灯させることができました。ここから、スイッチのオンオフでLEDの点滅やリセットを制御していきます。

  一応(C言語はほとんど未経験とはいえ)ITエンジニアの端くれなので、自力でプログラムは書くことも検討しましたが、ChatGPTを使い倒すことにして聞くことにしました。

 

Arduinoを使って電子工作をすることにしました。スイッチを押して10秒経ったらLEDランプを点灯する、別のスイッチを押したらリセットするという仕組みを作りたいのですが、どのようなプログラムを書けばいいですか?

 

Arduinoを使って、1つ目のスイッチを押してから10秒後にLEDランプを点灯し、2つ目のスイッチを押すとリセットするプログラムの例を紹介します。

必要な接続
  1. スイッチ1:10秒のカウントをスタートするためのスイッチをデジタルピンに接続。
  2. スイッチ2:リセット用のスイッチを別のデジタルピンに接続。
  3. LED:Arduinoのデジタル出力ピンに接続し、カウントが完了したら点灯。
Arduinoコード例

以下のコードでは、スイッチ1を押すと10秒のカウントが始まり、10秒後にLEDが点灯します。スイッチ2を押すと、カウントがリセットされ、LEDが消灯します。

// ピン設定
const int switch1Pin = 2;    // スイッチ1(10秒タイマー開始用)
const int switch2Pin = 3;    // スイッチ2(リセット用)
const int ledPin = 8;        // LEDのピン

// 状態管理用変数
unsigned long startTime = 0; // タイマーの開始時間
bool timerActive = false;    // タイマーがアクティブかどうかのフラグ

void setup() {
  // ピンの設定
  pinMode(switch1Pin, INPUT_PULLUP); // スイッチ1のピン(プルアップ抵抗)
  pinMode(switch2Pin, INPUT_PULLUP); // スイッチ2のピン(プルアップ抵抗)
  pinMode(ledPin, OUTPUT);           // LEDのピン

  // 初期状態
  digitalWrite(ledPin, LOW);         // LEDを消灯
}

void loop() {
  // スイッチの状態を読み取る
  bool switch1State = digitalRead(switch1Pin) == LOW; // スイッチ1が押されたとき
  bool switch2State = digitalRead(switch2Pin) == LOW; // スイッチ2が押されたとき

  // スイッチ1が押されてタイマーが動作していない場合
  if (switch1State && !timerActive) {
    startTime = millis();  // 現在の時間を取得
    timerActive = true;    // タイマーをアクティブに設定
  }

  // スイッチ2が押されたとき(リセット動作)
  if (switch2State) {
    timerActive = false;        // タイマーを無効化
    digitalWrite(ledPin, LOW);  // LEDを消灯
    return;                     // リセット後に次の処理をスキップ
  }

  // タイマーがアクティブな場合、経過時間をチェック
  if (timerActive) {
    // 10秒経過したか確認
    if (millis() - startTime >= 10000) {  // 10000ミリ秒 = 10秒
      digitalWrite(ledPin, HIGH);         // LEDを点灯
    }
  }
}
コードの説明
  1. ピン設定

    • switch1Pinswitch2Pin にそれぞれのスイッチを接続し、プルアップ抵抗を使用しているため、LOWになったときにスイッチが押されたと認識します。
    • ledPin にLEDを接続し、LEDを点灯・消灯します。
  2. タイマー開始

    • スイッチ1が押され、タイマーがまだ動作していない場合、startTimeに現在の時刻を記録し、timerActivetrueに設定します。
  3. リセット機能

    • スイッチ2が押されたら、timerActivefalseに設定し、LEDを消灯してタイマーをリセットします。
  4. タイマーの経過確認

    • タイマーがアクティブな場合、millis()関数で経過時間をチェックします。10秒(10000ミリ秒)が経過したらLEDを点灯します。

  このコードをArduinoにアップロードし、回路を正しく接続することで、10秒後にLEDを点灯し、リセットスイッチでタイマーとLEDをリセットする機能が実現できます。

 

  サンプルプロラムに解説も提供してもらったので、早速このプログラムをコピペしてArduinoに書き込み実行しました。しかし、(予想はしていましたが)うまく動作しませんでした。

  スイッチを押してないのに、10秒経過するとLEDが点滅しました。リセットボタンを押したらLEDが消えますが、しばらくするとまたLEDは点滅しました。おかしいと思いましたが、回路がおかしいのかプログラムがおかしいのか判別ができません。

  ChatGPTに「動かないんだけど」と聞いても、なかなか正しいプログラムが返ってこないことを聞いた記憶があります。プログラムを見る限りでは、おかしなところは見当たらないので、ハードウェアの問題の可能性が高いです。だとしたらお手上げです。どうやって原因を突き止めればいいのかわかりません。

  わからないのでChatGPTに聞きました。

 

   問題の切り分けとして、まず(スイッチオンオフにかかわらず)10秒経ったらランプが点灯するようにして、リセットボタンの動作確認をしてみたのですが、押してもリセットされませんでした。
  こういう場合、どうやって原因の切り分けをすればよいのでしょうか。ブレッドボードの差込口はサンプルの教材をチェックして、サンプルと同一であることを確認しましたが、他にどうやって原因の切り分けをすればいいのかわからず途方に暮れています。

 

Arduinoのプログラムが期待通りに動作しない場合、問題を切り分けるために、以下の手順でトラブルシューティングを進めると原因が特定しやすくなります。


1. 基本的な動作確認

まずは、ハードウェアとソフトウェアの基本的な動作が正しいかを確認しましょう。

(1) スイッチが正しく動作しているか確認

Arduinoのスイッチが正しく認識されているかを、シリアルモニターを使って確認します。以下の簡単なコードを実行し、スイッチを押したときに「スイッチ1 ON」や「スイッチ2 ON」と表示されるかチェックしてください。

const int switch1Pin = 2; // スイッチ1
const int switch2Pin = 3; // スイッチ2

void setup() {
  pinMode(switch1Pin, INPUT_PULLUP);
  pinMode(switch2Pin, INPUT_PULLUP);
  Serial.begin(9600);
}

void loop() {
  if (digitalRead(switch1Pin) == LOW) {
    Serial.println("スイッチ1 ON");
  }
  if (digitalRead(switch2Pin) == LOW) {
    Serial.println("スイッチ2 ON");
  }
  delay(100); // 少し遅延を入れる
}

期待する動作

  • スイッチを押すと「スイッチ1 ON」または「スイッチ2 ON」がシリアルモニターに表示される
  • 押していないときは何も表示されない

問題がある場合

  • スイッチを押しても何も表示されない → 配線ミスの可能性
  • 何も押していないのにONになる → プルアップ抵抗が正しく機能していない可能性(GNDとショートしていないか確認)

(2) LEDが正常に点灯するか確認

スイッチの問題ではなく、LEDの接続や制御に問題があるかもしれません。次のコードを使って、LEDが正常に点灯するか確認します。

const int ledPin = 8;

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

void loop() {
  digitalWrite(ledPin, HIGH); // LEDを点灯
  delay(1000);
  digitalWrite(ledPin, LOW);  // LEDを消灯
  delay(1000);
}

期待する動作

  • LEDが1秒ごとに点灯・消灯を繰り返す。

問題がある場合

  • LEDが点灯しない → 配線が間違っているか、LEDや抵抗が不適切な可能性。
  • 常に点灯しっぱなし → 配線がショートしている可能性。

2. スイッチ1とLEDだけを使って動作確認

スイッチ1を押すと10秒後にLEDが点灯するシンプルなコードを試してみましょう。

const int switch1Pin = 2;
const int ledPin = 8;
unsigned long startTime = 0;
bool timerActive = false;

void setup() {
  pinMode(switch1Pin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  if (digitalRead(switch1Pin) == LOW && !timerActive) {
    startTime = millis();
    timerActive = true;
    Serial.println("スイッチ1が押されました - タイマー開始");
  }

  if (timerActive && millis() - startTime >= 10000) {
    digitalWrite(ledPin, HIGH);
    Serial.println("10秒経過 - LED点灯");
  }
}

期待する動作

  • スイッチを押すと「スイッチ1が押されました - タイマー開始」と表示。
  • 10秒後にLEDが点灯し、「10秒経過 - LED点灯」と表示。

3. スイッチ2でリセットできるか確認

スイッチ2でLEDを消灯し、タイマーをリセットできるか確認する。

const int switch1Pin = 2;
const int switch2Pin = 3;
const int ledPin = 8;
unsigned long startTime = 0;
bool timerActive = false;

void setup() {
  pinMode(switch1Pin, INPUT_PULLUP);
  pinMode(switch2Pin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  if (digitalRead(switch1Pin) == LOW && !timerActive) {
    startTime = millis();
    timerActive = true;
    Serial.println("スイッチ1が押されました - タイマー開始");
  }

  if (timerActive && millis() - startTime >= 10000) {
    digitalWrite(ledPin, HIGH);
    Serial.println("10秒経過 - LED点灯");
  }

  if (digitalRead(switch2Pin) == LOW) {
    timerActive = false;
    digitalWrite(ledPin, LOW);
    Serial.println("リセットボタンが押されました - タイマーリセット");
  }
}

期待する動作

  • スイッチ1を押すと10秒後にLEDが点灯する。
  • スイッチ2を押すと「リセットボタンが押されました - タイマーリセット」と表示され、LEDが消灯する。

4. それでも動作しない場合
  1. 配線ミスをチェック

    • スイッチの片方がGNDに正しく接続されているか確認
    • スイッチがINPUT_PULLUP設定になっているため、GNDにつながることでLOWと判定されることを理解
    • LEDの極性を確認(アノードをArduinoの出力ピン、カソードをGNDに接続)
  2. ジャンパーワイヤーの接触不良

    • 一度抜いて、差し直してみる。
    • 別のジャンパーワイヤーを試してみる。
  3. スイッチが壊れている可能性

    • スイッチの代わりにワイヤーをGNDに直接接続して動作を確認(スイッチの代わりにワイヤーを短絡すると、スイッチが押されたと同じ動作をする)。
  4. Arduinoのピンが故障している可能性

    • switch1Pinswitch2Pin のピン番号を別の未使用ピンに変えて試してみる。

まとめ

  1. スイッチが正しく認識されているか → シリアルモニターを使って確認
  2. LEDが正しく点灯するか → テストコードでチェック
  3. スイッチ1だけで10秒後にLEDを点灯できるか確認
  4. スイッチ2のリセット機能が動作するか確認
  5. 配線ミス・接触不良・ジャンパーワイヤーの不良をチェック

上記の手順で原因を特定していけば、問題の解決につながるはずです。何か追加で分からないことがあれば、気軽に聞いてください!

 

f:id:TownBeginner:20250223202537j:image

  Serial.printというデバッグに役立つコマンドを知れたのは大きかったです。早速埋め込み書き込みました。すると常にボタンが押された状態になっていることがわかりました。ボタンの回線などをよくよく辿ってみると、pinで指定した数字と実際にArduinoのポートに差し込んでいる番号があっていませんでした。

   これか…!!とため息を付いて接続を直しました。結果、無事動作するようになりました。

 

  原因わかりました!pinの数字が違っていて直したら動作しました!ありがとうございます!

 

  「10秒経過したら警告を行う」という最低限の実装ができました。

   後はこれを機能拡張していきます。

 

-基礎実装 ボタンの改良とディスプレイ表示編- に続く。

RP人狼の役作りに悩むあなたに捧げるArduino奮闘記 -要件定義編-

  先日RP人狼をしたのですが、役作りをするにあたって電子工作の知識が必要になってしまいました。だいぶ苦戦はしたものの、ChatGPTをひたすら使い倒してArduinoを用いた役作りができました。

  RP人狼をやるにあたって、同じように役作りに悩んでいる人が少なからずいるだろうと思料しました。そこで本記事ではRP人狼で役作りをするにあたって、ChatGPTを用いてどのようにArduinoを用いて役作りをしていったのか書きます。

 

Xavier Reboot Project

 きっかけは、身内でやってたRP人狼のオールスター公演でした。これまでの公演のキャラクターを集めたフェスに近い公演です。それぞれの出演者がこれまで演じてきたキャラクターから投票で決めたのですが、僕が選ばれたキャラクターは、「深海」という公演のキャラクターでした*1。投票前に話題として僕の深海のキャラクターの話がトピックとして出てきたのですが、まさか本当に選ばれると思いませんでした。

 

 

  しかし、このキャラクターをやるにあたっては、以下の問題点がありました。

  • 深海の公演は6、7年前。公演を続けていく中で皆のキャラクターの作り込みや演技力がレベルアップしており、当時のキャラクターをそのまま持ってきただけでは通用しない可能性が高い。
  • キャラクター投票で決まったと言っても、他の人の選出理由が「あのキャラクターをもう一度見たい』という理由に対し、僕のキャラクターについては「見たことないけど噂がすごいから一度見てみたい」という期待先行型による投票で、明らかに期待値と実状とのギャップが生じている。

 

  つまり、6年前のキャラクターをそのまま持ってきて演じるだけでは、「特にぱっとしないキャラクターがそのまま舞台に出るだけ」となり、失敗することが目に見えてしまっています。これはまずい。

  そこで、この際キャラクターを作り直してしまおうということで「Xavier Reboot Project」を立ち上げキャラクターの再設定を行うことにしました。公演が6年前てあること、(後述しますが)鍵なくロボに近い人間であると言う特性を生かして、キャラクターのアップデートを行うという立て付けで役作りを進めることにしました。

  まずはどんなキャラクターにするのか、要件定義から始めます。

 

要件定義:ザビエルのキャラクターについて

  ザビエルのキャラクター設定です。「キャラクターを変える」とは言っても過去作からの設定で外してはいけない要素があります。まずはそれをリストアップします。

  • 人類が絶滅する未来を回避するために、深海の研究所で研究の手伝いをしているメカニック
  • ロボのような喋り方をする
  • 投票時、10秒が経ったら「10秒経過10秒経過」と警告をする

  リストアップしたところで「これさえ守ればあとは他に何をやっても押し切れる」と確信しました。深海ザビエルの話が話題に出た際、三番目の「10秒経過」以外の話が一切なく、どんな姿だったか思い出せないというコメントもあったからです。

 

  まずは追加したい設定を洗い出します。これまでの公演を踏まえてのフェス公演なので、フェスらしい設定を練り込む必要があります。

  • 妻と息子は地上にいるが、生死は不明。彼らを救いたいと信念を持って研究の手伝いをしている。
  • しかし、「妻と息子は無事か」という不安が消えず、不眠症に悩まされる。MAG-MELLのドクターに提案を受けて、感情の大部分を削除する・人格の大半を削る手術を受けている(喋り方が機械的なのはそれが理由)。
  • ドクターが言うには、「人間の人格」という器があり、ザビエルのその器はほぼ空っぽな状態。裏を返せば、この器に何らかの形で人格を注入すれば、別人格のザビエルが起動する。
  • 現在のザビエルは、ドクターによってMAG-MELLモードとして動作しているが、ドクターにより「MODE-G」が用意され、人格の注入が可能。ただし、どのような人格が注入されるかは、ドクターもわからない。
  • 別の人格が注入されると、GUILDの世界のザビエルやHEROの世界のザビエル、公安警察世界のザビエルなどが注入されたMODE-G (Gray-Gnome)としてミックスされた人格が発現する。

 

 キャラクターの概要はあらかたできましたが、実際に演じるにあたって大きな障壁があります。それは「10秒を測る」という行動です。以前のザビエルは体感で10秒を測り手動で単三電池の電源を繋き風車を回して「10秒経過」と口に出すシンプルなRPでした。しかしリブートと銘打つ以上は、ここもアップデートしないと説得力が生まれません。また、前述の設定を追加することを考えると、身一つで演技を行うのは限界がありそうでした。

  少し悩んだ結果、一度電子工作にチャレンジしようと決めました。そこで、上記のRPを実現するために電子工作として実装すべき要件を洗い出しました。

  • スイッチを押したら時間が経過し、10秒経過したら10秒経過したと知らせる。もう一度押したらリセットがされる。
  • スイッチ2を押したら、モードが変わったことをお知らせする。もう一度押したらリセットされて元に戻る。

 内容的にそれほど難しくはなさそうですが、なにぶん電子工作は初めてのため、どこから着手すれば良いのかが見当がつきませんでした。Arduinoを使えばこの辺の機能は実装できそうですが、どのように回路をつなげれば良いのか、全くわかりません。

 手がかりがなく悩んでいたのですが、ChatGPT使えば良いじゃんと思い至りました。

 

 ChatGPTと電子工作を始めるにあたって、まずはKindleにあった電子工作の本と電子工作の入門キットを買いました。

 

 

 

  ChatGPTに一から教わるよりは、まずは最低限、自分で教材等の入門書や入門キットを購入し、実際に読んで触って、その過程で生じた疑問をChatGPTに聞けば、少なくとも最初の一歩は間違えないのではないかと考えました。

 

  要件をあらあら出せたので、これをもとに電子工作を始めることにしました。

  -基礎実装 10秒経過編- に続く。

*1:カンの良い方はこれで大体察すると思いますが、あまり深く突っ込まないでいただけますと幸いです

日常の味わいをくっきりと浮かび上がらせる観光小説 - ヤン・フォッセ「朝と夕」 -

  和泉宏隆のアルバム「AMOSHE」を聴いた時のことを思い出した。

AMOSHE

AMOSHE

  • Sony Music Direct (Japan) Inc.
Amazon

  以前にブログで書いたが、AMOSHEの表紙ジャケットがすごく好きだ。雪に覆われた山岳地帯の雲1つない青空(写真は加工しているが、雲一つない青空だったと思える)。ひんやりと、と言うには少し冷たい空気が頬にあたるが、体内には静かな力が満ちていてその空気も心地よく、薪を割ったり火を起こして料理をしたり、そんな心象風景を思い描きながら聴いていた。

 

  ヤン・フォッセ「朝と夕」を読んでる途中、そんな気分になっていた。

朝と夕

朝と夕

Amazon

  朝と夕は表紙にこそ雪山が描かれているが、実際の物語はヨハネスが生まれたシーン、ヨハネスが漁に出て「旅立ちを迎えて見送られる」シーンであり、雪山・山岳地帯が特別に意味を持っているわけではない。なのに、読んでいくうちにAMOSHEのジャケットを見た時と似た感想を抱いていた。第一部では、産婆が忙しなく動いて、そしてヨハネスが生まれる。

(以降の引用はすべてヤン・フォッセ「朝と夕」(国書刊行会,2024年)からのもの)

 

よしよし とマルタが言った

親父の名をとって、ヨハネスと名付けるんだ、とオーライが言った

そう名前はヨハネス、とマルタが言った

マルタは目を開け、今度ははっきり二人の方を見た、オーライと産婆のアンナを

いい名前だ、と産婆のアンナが言った

(朝と夕 P.21)

  「朝と夕」の文体は大体こんな感じである。登場人物の会話にはカギカッコが無く、すべて地の文で書かれている。そのためか、「人物が会話をしている」という意識が向かなくなり、人も風景の一部のような錯覚を覚えた。人は動いているのだが、人が風景画の一部として捉えている、という書き方が正確なのかどうかあまり自信が無い。

  例えば絵画の人物像であれば、視線は自然と人間に向かい、どのような表情をしているのか、どんな状況なのか、どんな心境なのか、人物についてあれこれ考え出す。しかし風景画の場合はそういったことは考えない。もしそこに自分がいたら、というところから思考が始まる。目に見える光はどうだ、肌に感じる温度はどうだ、顔に当たる風はどうだ、息をすると何か匂いは感じるか。(もちろん実際に感じるわけではないけど)そういった身体感覚に訴えかけるものがある。少なくとも僕はそういう風に風景画を見ている。朝と夕は、自分とってはそんな小説である。

  いや、「そんな小説」と言っていいのかどうかは自信がない。ヨハネスは生まれて、いつものようにベーテルと沖に漁に行って、そして残された家族を背にして死ぬ。ストーリーとしてはこういうことだ。

  これは小説なのだろうか?小説なのだろう。しかし普段小説を読んだときに抱く感想は、朝と夕には無い。ストーリーがどうだとか、登場人物のこの言動に腹がたった、公正が絶妙だった、そういった感想は別にない。

シグネは牧師が棺に土をかけるのを見ながら、ヨハネス父さん、あなたは大した人だったわ、大好きな父さん、ちょっぴり変わっていたけど、でもいい人だった、父さん辛かったね、毎朝起きる度に吐いているのを私は知っていたよ、いい人だった、とシグネは思い、見上げると空には白い雲が浮かび、今日は海もよく凪いて青く光っている、とシグネは思った、ヨハネス父さん、ねえヨハネス父さん (朝と夕 P.141)

  ヨハネスが生まれて死ぬまでの小説。ただし大河ドラマのようななにか出来事がおこるわけではなく、書かれるのは生まれた日の描写と死んで埋葬される描写だけだ。ほとんどの人間はそうやって生まれて死んでいく。ヨハネスは朝起きでコーヒーを沸かしパンを食べて向かう。なんということは無い暮らしだ。それでも、特別でなくてもそれで十分である、ということが感じられた。  AMOSHEのジャケットを見た時の心象風景として「冷たい空気の心地よさ」「薪割り・火起こし、温かい飲み物を淹れる」という風景が浮かんだのは、それが「日常」というものの味わいをよりくっきりと浮かび上がらせてくれたからだと、「朝と夕」の感想を書きながら考えた。

   もし自分が透明人間になったら、自分とは関わりのない人の近くに居て、その人が何をするのかずっと観察をしていたいと考えたことがある。ヨハネスはなにか複雑なことやためになることを考えたり為したりするわけではない。それでもヨハネスの「一生」を読んで、僕は満足できた。「観光」という言い方はあまり適切ではないのだろうけど、「朝と夕」は良い観光小説だと思う。今後「朝と夕」を読み返す時、適当なページから開始して読み返すと思うし、小説としてそれができるのはなかなか無い。

  訳者あとがきによると、キリスト教の表象や暗喩が散りばめられているらしい。そういう意味では僕は本小説について理解しているとも、よく読んだとも言えない。しかし、チーズをナイフで薄く削ってその切れ端をちょっと味わえるくらいでも、本書は読む価値があったと思う。

 

f:id:TownBeginner:20250130231425j:image

 

銀座ナイルレストランのマトンカレー。

最近再びカレーブームが来ている。よく行くのはナンを出すタイプの店だが、ライスカレーもやっぱり良いものだとしみじみ思いながら食べた。 

2025年1月1日の記録

  例年は年が明けた直後におみくじを引きに出かけるのだが、今年は疲れていたのか眠気がすごかったので、おとなしく就寝。予定よりも少し遅く起床し、おみくじを引きに向かう。

f:id:TownBeginner:20250101141822j:image

  おみくじは吉。「Regular fortune」という割には、記載内容に加えて各項目も良いことばかり書かれており、吉にしては出来過ぎだと思いつつ、顔を綻ばせる。
f:id:TownBeginner:20250101141814j:image

  しかし、帰りの屋台で買ったじゃがバターは全然熱くなかったため、バターが溶けないまま食べざるを得ず、だいぶテンションが下がる。屋台の場所は去年と同じだったけど、店が変わったのだろうか、来年は一度屋台を巡ってから温かいジャガバターを探してから買おうと決める。でもどうせ今年の年末になったら忘れてるんだろうなと思い直す。

f:id:TownBeginner:20250101141818j:image

  帰宅後、仕込んでいた小豆をホットクックで煮込みつぶあんを大量生産。味は問題なし。早速お汁粉を作って食べる。ちょっと塩を入れ過ぎたけど許容範囲。

   届いた年賀状の整理を済ませてから高田馬場へ向かう。電車の中でワールドトリガーを読み返す。

f:id:TownBeginner:20250101150413j:image

  ベルサール高田馬場のJOPT会場。出場するのはH・O・R・S・E。ポーカーを始めてからMIXゲーム、特にStudゲームにハマっている、JOPTの大会でStudゲームをメインでプレイできるイベント数は少なく、この日のH・O・R・S・Eしか参加できる日程が無かった、今回のJOPT参加は見送る予定だった。ただ、去年末のガットショットで開催されたKOIDE POKER TOUR 10game mixで準優勝をした結果、参加費の手当ができるようになってしまった。大きな支障が無くなったので、それであればと少し迷った末に参加を決意。

 

f:id:TownBeginner:20250103121525j:image

   H・O・R・S・Eの開始前に書いた今年の願望。しかしおみくじの結果は凶。あまり期待しないほうが良さそうだなと思いながら札と壁に貼って卓に着席。

 

f:id:TownBeginner:20250101150409j:image

  着席した卓は、ATさんを始めMIXで有名なプレイヤーが多く苦しい展開になりそうだなと予想。序盤は果たして苦しい展開。ポジション活かしたプレイも満足にできず、チップをジリジリと減らす展開に。まだ序盤だから、焦らずにやろうと自分に言い聞かせながら耐える。

 

  耐えてるうちに、徐々にハンドとボードが絡み始めた。特にオマハハイロー・スタッドハイローで高額ポットをスクープすることができ、チップが一気に増えた。

f:id:TownBeginner:20250103121512j:image

  2nd break後にチップリーダーとなり、JOPTに写真を撮られる。どんな顔していいのかよくわからなかったので、とりあえず構えのポーズを取って写真に映る。後ほど公式アカウントでツイートされた顔写真を見て「取られ慣れていない人の顔だ」と自覚する。

 

  その後、オマハハイローで大きなポットを取ることができたため、オーバーフォールド気味であることを自覚しつつ、タイトアグレッシブを心がけて進める。いくらチップリーダーといってもそんなに甘い卓では無く、油断したら一瞬でチップが無くなるため神経を尖らせながら、Registration Close後もプレイを続ける。プレイヤーが飛んでいき徐々に人数が減ったところで3rd break。f:id:TownBeginner:20250103121521j:image

  まさかの2連続チップリーダー。再びJOPTに写真を撮られる。今度はちょっと慣れてきたかなと思ったが、ツイートされた写真を見てみたら、「前の方が良かった」と思ってしまった。変わらず写真を撮ることに慣れていない。

 

  残り9人となり2時間位膠着状態が続く。自分の卓は4人、もう1卓が5人。チップ量を確認したところ全員がアベレージ上。もう1卓を確認したところショートが2人。だから焦らず待てば良いはずなのだけれど、なかなかショートの2人が飛ばない。こちらから仕掛けた方が良いのかと、しびれを切らしてプレイしてしまい、チップを減らしてしまう。 24時を過ぎて、もう終電は諦めよう、とにかくチップを下手に減らさないようにと再度心がけてプレイをしてると、ついにもう1卓のショート2人が飛び、ファイナルテーブルへ。この時点でインマネ確定。同卓していた他の3名とお互いの健闘を称え合い、別の卓でプレイしていた友人たちにFT行ってきますと言い残し、FT卓へ。

 

  自分を含めた7名のチップ量を確認。チップリーダーではなくなったものの、アベレージより上はキープしており、ショートが2人ほど。引き続きチップを減らさないようにタイトを心がけながらプレイし、大きなぶつかりを避けるようポットコントロールをしながらプレイ。1人、また1人と飛んでいき、少しずつ順位を上げていく。残り3人になったところで、チップ量はチップレーダーが1人で4割、もう1人とは互いに3割でほぼ均衡状態であることを確認。しかし時間は午前1時、ストラクチャーLVも高くなっており、少し大きなポットになるだけで大きく失ってしまう状態。集中力が切れたのか、リミットホールデムとオマハハイローでチップを崩してしまう。Razzで刈り取られ、最後はStudで8の3カードを作られて飛び。f:id:TownBeginner:20250103123915j:image

  3位でフィニッシュ。もっと頑張れたんじゃないか、3人の戦いでのミスプレイが痛かったなど、色々悔しい想いが湧き上がる反面で、自分の今の実力はここまでなので、それでこれだけできているのであれば上出来であるという納得も、同時に湧き起こった。不思議な感情を抱きながら手続きを行いメダルを受け取る。

  Studが好きでようやく得られた勲章である。優勝はできなくても、銅メダルでも手にしたことが本当に嬉しい。友人たちに挨拶をした後、松屋で遅い夕飯を食べてネカフェに向かう。

 

  就寝前にTwitter*1でお祝いの言葉をくれた人々のことを思いながら、信頼貯金という言葉と貯金を使うことの意味を考えて横になった。去年は特に金銭的な貯蓄、信頼貯金を両方とも使っていろいろなことをさせてもらったと振り返って感じる。結果は満足のいくものだったし総じて良い方向に向かっているが、2025年は、

  • 使った信頼・金銭を使って何をするのか
  • それをやって信頼・金銭をどうやって貯めるのか

をもっと考える年になりそうだとぼんやり思う。それはプレッシャーというよりは、少し冒険に出る前のウキウキ感にも似た感覚があり、悪いものではなかった。

  爽健美茶を一口飲んで就寝。

 

  1月1日の記録として、「何をやったのか」「どんなことを思ったのか」を記録しておきたく、何かするたびに音声入力を使いながら記録していた。当初はやったことに対する軽い感想を書く程度を想定していたが、JOPTが思った以上に走れてしまい、こんな記録になった。本当は年末年始にやることを計画立てていたが、これを書いている今も完全に計画から外れている。あまり計画通りなにかやることを考えるよりは、その時に大事なことをきちんとやれるように準備をするのが大事なのかもしれない。一方で毎日やって訓練しないと身につかないようなスキルを身に着けたいとも思っているので、それは「習慣をどうやってつけるか」というテーマとして盛り込んでいく。

f:id:TownBeginner:20250102220846j:image

  早朝の帰宅後に作った小倉バタートースト。

  大量生産したつぶあんはしばらくお世話になると思う。お汁粉を食べたくて作ったけど、他の使い道を探すのも楽しいかもしれない。

*1:Xとは呼ばない。

【年末振り返り】2024年買って良かったものベスト10

  今年を振り返るための「買って良かったもの」ベスト10です。

 

番外編:ピュアレストQR 便器

  いきなり番外編です。これは「買ってよかったもの」には違いないのですが、自分の意思で購入を決意したというより半ば仕方なく買ったものなので、番外にしました。

 

  今年、長いこと使っていたトイレが故障してしまいました。水を流したらタンクに注水されるのですが、その注水を制御するための浮き袋が壊れてしまい、絶えず注水がされる状態となってしまいました。排水穴から余分な水は排水されるので、タンクから水が溢れ出してしまうという最悪の状態にはならなかったのですが、水道代も余分にかかる悩ましい状態になってしまいました。業者さんを呼んで確認してもらったところ、トイレの型番が古くもう同じ型は手に入らないことに加え、排水管の周辺にも異常が見つかってしまう有り様。それならば仕方ないと、便器の買換だけでなく、トイレの排水管・床・壁の張替も含めてリフォームをしました。

 

  リニューアルされたトイレは非常にきれいで感動しました。

  これまではどんなに掃除をしても、床の一部のタイルが剥がれてそこにホコリが溜まってしまったり、便器の水垢などの曇が取れないため、あまり掃除をする気力が湧きませんでした。それが、一度完璧な状態にしてもらえると、それを維持しようという気持ちが働き、最近ではこまめにトイレ掃除をするようになり、意欲も維持できています。

 一度完璧な状態に持っていって、そこから維持管理に努めるという方式は、いろいろ応用できそうだなと思いました。いくらメンテナンスしても限界が近い部分が少なからずあるので、リフォーム・リニューアルは計画を立ててやっていきます。

  間違いなく買ってよかったブツなのですが、「トイレの故障」という外的要因に由来するやむ無しの買い物だったため、番外編としました。

 

というわけで、本編です。

 

第10位:北斗の拳 世紀末ドラマ撮影伝

「もしも北斗の拳が80年代の金曜22時に放映されているドラマだったとしたら?」

  というコンセプトで始まる、北斗の拳のパロディー漫画。北斗の拳はだいぶ前にマンガ喫茶で読んだことがあるだけで、そこまで深く覚えていない&理解してはいないのだけど、それでも(原作で突っ込まれたであろう矛盾を力技で解決する)原口監督や武藤さんの奮闘に笑うのは、「北斗の拳」というコンテンツの強さのなせるからだと思います。

 

コミックゼノンのサイトで序盤と最新話が無料公開されていますので、是非どうぞ。

comic-zenon.com

 

第9位:nishikawa [エアーSX]マットレス/HARD

  布団を10年以上使っていることに気づき、そろそろ新調してもいいかなと思い探していたところ、出会った布団です。他のより明らかに高いので、どれだけ違うのだと試しに松屋銀座にあるふとんの西川へ行って試寝(?)しました。

  びっくりするくらい寝心地がよかったです。身体の圧力のかかり方が無理しないかかりかたで、これならば間違いなく身体の休息が取れると確信し、毎日、数年間の暮らしが保証されるのであれば買う価値はあると勢いもあって購入しました。

  寝心地の良さは間違いなかったのですが、誤算がありました。あまりにも寝心地が良い上に、冬場で寒く布団から出たくないという思いが強くなってしまい、今までより起床時間が遅くなってしまいました。布団自体はとても良かったのですが、快適な生活を送るはずが裏目に出てしまったのでこの順位です。「大谷翔平も愛用している」というキャッチコピーがついているのですが、この寝心地の良い布団から抜き出せる位の強靭な精神力があるからこそ、大谷翔平は成功を収めているのだなということがよくわかりました。

第8位:龍が如く7

store.steampowered.com

  去年からSteamを本格的に利用するようになったのですが、ちょうど龍が如くシリーズがセールになっていたので、その関連で買いました。

  龍が如くシリーズは1と2しかやっておらず、いろいろ飛ばしていきなり7をプレイしても大丈夫なのかとちょっと不安でしたが、蓋を開けてみると何の心配も要りませんでした。もちろん、これまで登場したキャラクターや場所も少なからず出てくるので、既シリーズをプレイしていたほうがより楽しめるのですが、戦闘がアクションからコマンド式に変わったこともあり、これまでとは全く別ゲームとして楽しむことができました。

  僕の中で「龍が如く」とは、基本的に桐生一馬一人単独の物語で、戦いも一人で戦うというイメージでした。それが7になってからはコンセプトががらりと変わり、主人公の春日一番を軸としているものの、一番をめぐる仲間も含めた「チームとしての物語」「はみ出し者の物語」としての面がより強調されて見えるようになりました。ゲームとしても、職業によって攻撃方法が変わるのが思った以上に飽きが来なく、だれずに最後まで楽しめました。ストーリーも個人的に好みで、特にナンバのストーリーは普通の人がはみ出し者に落ちてからのストーリーとして秀逸です(反面、ホームレスとして戦うのは笑うけど。強いからいいや)。

  100時間飽きずにプレイできたので、文句なしに面白い作品だったと言っていいと思います。

 

第7位:NEO

NEO

NEO

Amazon

  今年になってからDIMENSIONをよく聴いているのですが、Apple Musicで勝田一樹のソロアルバムも配信されていたので、合わせて聴くようになりました。本アルバムは勝田一樹の4thソロアルバム。サックスと打ち込み中心の、これまでと違う異色の構成でしたが、実際に聴いてみると、よりサックスの楽しさや面白さ、ジャズ・フュージョンという枠にも囚われない自由なアルバムという印象を抱きました。どちらかといえばゲームミュージックを聴いているときの楽しさに近いかもしれません。

 

  ちなみにこちらはゲームミュージックとして演奏されているマリオカート8の「ビックブルー」ですが、NEOの曲よりもジャズ・フュージョンに近いと感じています。

www.youtube.com

  あいにく年末のライブはいけませんでしたが、来年はもっと勝田一樹とDIMENSIONを聴きたいと思えるアルバムでした。

 

第6位:ドカ食いダイスキ!もちづきさん

  21歳の事務員、もちづきさんがひたすら食べ物をドカ食いする「邪悪な孤独のグルメ」とでも言うべき漫画。ただ、ドカ食いを同僚から見られるのを避けるという行為を考えると孤独感はこちらのほうが強いのかもしれません。
  カロリーのオーバードーズで「至る」までの展開が毎回笑えます。健康診断で食べては行けないのを我慢するために、水と麦茶で「カレーライスじゃん!!」と自分を必死で誤魔化したり、「あるのがいけない!!」とコンビニで食料をカゴに放り込むのはもはや狂気ですが、だからこそ大笑いできます。大笑いできるギャグ漫画には狂気が必要なのだと正面から攻める良い漫画です。

 

  こちらもヤングアニマルのサイトで第一話と最新話が無料公開されていますので、ぜひどうぞ。

younganimal.com

 

第5位: 龍が如く8

store.steampowered.com

  龍が如く7の続編です。ストーリー的にはちょっと無理があるんじゃないかと、腑に落ちない点はあったものの、それを補ってあまりあるシステム面の改良、バトルの改善による戦闘の楽しさ、何より桐生一馬のエンディングノートを追うのがとても良かったです。歴代の龍が如くシリーズをプレイしてきたプレイヤーへの感謝の気持ちが伝わってきました。前日の龍が如くシリーズは1・2だけしかプレイしていませんが、それでも胸にグッとくるものがあったので、歴代ファンはもっと感じ入るところがあったと思います。時間を見つけて龍が如くシリーズは履修していきたいです。ただ、来年1月には龍が如く8外伝も発売が予定されているので、時間を作るのはなかなか難しいかもしれませんが。

第4位:ChillPulse

store.steampowered.com

   Steamで買ったのですが、ゲームというよりはタスク集中アプリです。ポモドーロタイマー(25分間集中して、5分休む)を繰り返すことでコインが貯まり、そのコインで画面に出ている女の子の衣服やアクセサリー、脇にいるペットなどを買って飾り替えができるという仕組みのアプリ。飲み物を作ることもでき、組み合わせによってポモドーロ時の上昇率や効果時間が変わったりします。

  特に良かったのはシーンとBGM。流せる曲をプリセットから選択できるのですが、Lo-fiミュージックとサイバーパンクのBGMが非常に心地よく集中しやすい曲が多かったです。来年も仕事や書き物など作業に集中したいときは、このアプリを使うと思います。

  惜しむらくは日本語の翻訳が全然こなれていないことです。各シーンごとに女の子がチャットで友人たちを会話するのを読むことができるのですが、その内容がお世辞にも翻訳が上手とは言えず、雰囲気を阻害してしまっています。有志による翻訳の差し替えができたら良いのですが。

 

第3位:ワールドトリガー

  Kindle集英社の漫画半額セールがやっていたので、一気買いした漫画です。

 

舞台は、28万人が暮らす三門市。ある日、突如として異世界への「門(ゲート)」が開き、近界民(ネイバー)と呼ばれる怪物が出現する。地球上の兵器が効かない彼らの侵攻に対し、謎の組織「ボーダー」が現れ、近界民を撃退。その後、ボーダーは近界民に対する防衛体制を整え、三門市の人々は日常を取り戻す。 

 

主人公はボーダーのC級隊員である中学生・三雲修。

彼が通う中学校のクラスに、空閑遊真と名乗る転校生がやってくる。遊真は実は近界民であり、亡き父の友人を探すためにこちらの世界に来ていた。修は、遊真や幼馴染の雨取千佳、ボーダーのS級隊員・迅悠一らと出会い、共に近界民との戦いに身を投じていく。

  SFアクション漫画として序盤こそ王道的な展開だったのですが、大規模侵攻、そしてB級ボーダーランク戦に入ってから面白さが加速しています。バトルをしている最中メインストーリーは進まないのはよくあるのですが、本作についてはメインストーリー以外のサブストーリーも無駄がなく、今後メインストーリーに繋がりうる(と思わせられる)内容が多く、かつそのサブストーリーでキャラクターの魅力も増しているため、読むごとに面白いと思える漫画でした。来年2月に28巻が出る予定なので楽しみです。非常に面白く、RP人狼の素材として使えるのではというアイデアが浮かんだ結果持ち込みプレゼンまでやりました。それだけの原動力を持たせられたのでこの順位です。

 

  こちらは少年ジャンププラスで79話まで無料公開されています。2025/1/6までの期間限定なのでぜひどうぞ。

shonenjumpplus.com

第2位:象印炊飯器 5.5合 炎舞炊き 圧力IHタイプ NW-FC10-BZ

  我が家の炊飯器は、もう15年以上経っており、特に不便と感じる事はなかったのですが、ちゃんと美味しい米が食べたいと思うようになりました。そこで炊飯器を調べたところ、十万円以上もする高級炊飯器がありました。存在だけは知っていたもの、いままでだったらスルーしていたこの炊飯器が気になって仕方が無くなり、我慢できずに買いました。

  実際に炊いてみると、明らかに今までの炊飯器で炊いた米より美味しく驚きました。米の硬さや粘り気も指定できるので、なんの料理にどの米を合わせるのか選択肢が増えて楽しくなっています。普段は硬めの炊き方、炒め物のときは気分で柔らかめにしてみよう、など自分の食の好みも知れてよかったです。炊き込みご飯も美味しかったので来年以降も使い倒すつもりでいます。

  買ってよかったものとしては間違いなく第1位に匹敵するのですが、後述する理由でこちらは第2位になっています。

 

第1位:天穂のサクナヒメ

  今年の第一位です。ゲームとしての発売は4年前ですが、買ったのは今年です。噂で「米の育成がガチ」と聴いており気になったのと、アニメが始まるので良い機会と思いプレイすることにしました。実際にやってみると、アクションゲームとして楽しい上に、「米を作る」ことが想像以上に楽しく設計されていることに唸りました。攻略サイトの一つとして農林水産省のページが挙げられていたのは笑いましたが、この米作りをきちんとすることでサクナヒメがパワーアップし、アクションパートの攻略が進むので、真面目にやる甲斐があります。途中のボスや掲げられるミッションには難易度の高いものもあるので、その場合はとりあえずアイテム素材を集めて武器など作りつつ、米をせっせと作ってサクナヒメをパワーアップさせて再チャレンジ、というサイクルで攻略ができるので最後まで諦めずにプレイができました。

  ストーリー自体も、ヒノエ島に追いやられたサクナヒメたちが、最初はお互い不平不満を言いながらも、田植えを通して少しずつ絆を作りあげていく様や、因縁の敵である石丸に対する恨みと復讐を乗り越えるシーンなど、見どころが多くストーリーにも没入できました((アニメはストーリーの後半部分がオリジナルになっていますが、良い改変でした。)。

  本作を第一位にしたのは、ゲームとしての評価に加えて、第二位で紹介した炎舞炊きを買う原動力となったからです。優れたコンテンツとは、「それを味わうことで、何か次に繋げられる原動力を持てること」であることと僕は思っているのですが、そういった意味では、「米は力だ」と深く感じさせ、十万円以上もする炎舞炊きを僕に買わせるだけの力がサクナヒメにはありました。ですので、文句なしの一位です。もっと早くプレイすれば良かったと思いましたが、今年に味わえただけでも良しとします。

 

 

  今年を振り返ると、特にインフラ周りの出費が多かったです。ただその分、生活が確実に快適・満足するものに変わっていたので、今後もインフラ周りへの投資は適宜見直して怠らないようにしようと思う一年でした。

  2025年も良い買い物ができますように。良いお年を。

Calvin Kleinのパンツを買った

  酒の場の勢いでCalvin Klienのパンツを買った。

japan.calvinklein.com

 

  もともとファッションには疎く、ファッションブランドについても何がどう違うのか、特徴については何も知らない。だから酒の場でCalvin Klienという名前が出たときも、そういうファッションブランドの名前は知っていたが、具体的にどんなブランドなのかは何も知らなかった。

 

  どういった流れでパンツを買う流れになったのかは失念してしまったが、その場で話していたのは「いま、人生が淀んでいる感じがするのでなんとかしたい」ということだった。何か新しいことや変わったことと言った突破口があればと思い話をしたので、多分下着に関するトピックが出た時に、カルバン・クラインのパンツを買うという案が出たのかもしれない。いずれにしても、酒の勢いと淀んだ人生をなんとかしなければという焦りから、僕は帰り道にカルバン・クラインのオンラインストアでボクサーパンツを購入した。

 

  翌々日に注文した3着が届いたので、試しに履いてみた。

 

  いつものパンツよりも締めつけが少しきつい気がする。とはいえ決して不愉快な締めつけではなく、身が締まる感じを覚える締めつけな感じの締め付けだと思った。その日はトイレに行った時も、ふと下着について意識が向いたのを覚えている。パンツに意識が向くのは、「Calvin Klienのパンツを履いてるから」なのか、それとも実際に下着の締めつけがあるからなのか。多分両方ともだろう。

 

  1ヵ月履いてみた。普段、下着とは本当に何も意識しないで着るものなのだなと改めてわかった。当たり前の話かもしれない。ただ、だからこそ「Calvin Klienのパンツを履く」ことには、締めつける感覚も相俟って特別な感情が出て来た。たまたま仕事でピンチだった状況の時に履くことが多かったからかもしれないが、「Calvin Klienを履いているからなんとかなる」という謎の決めつけをして乗り切ったので、いわゆる「勝負パンツ」というよりは「護衛パンツ」とでも言いたくなった。どちらにしても、何か事を立て直す時にCalvin Klienのパンツはブーストとして有効に作用はしていたことになる。

 

  多分、今後もCalvin Klienのパンツを買うかといえば、おそらく無い。ただ、このパンツを買って思い出したことがある。今でこそリモートワークで作業しているが、会社にスーツを着て出勤していた頃は、靴にこだわりを持っていたことだ。実家が靴関連の家業だったこともあり、革靴には興味を持てたし、社会人になって少し経ってから、革靴が欲しくなって革靴のムックを買ってあちこちのお店を回っていた。

scotchgrain.co.jp

  スコッチグレインが好きで、ストレートチップやモンクストラップ、チャッカブーツ、いろんな靴を調べて買っては丁寧に磨いてメンテナンスをしていた。特にストレートチップは正式な時に履ける靴なので、大事な仕事の日には必ず履くと決めて出勤していた。

  ファッションにはどんどん無頓着になっていたが、Calvin Klienのパンツを買って履いたことで、生活にリズムをつけるためのファッションが存在していることを思い出した。ずっと靴でブーストをかけていたし、今回はパンツでブースト(正確にはガードに近いけど)をかけていた。次にどんな服を買うのか何もアイデアは無いが、買うときは普段着るだけでなく、ブーストをかけられるような服を買いたいなと思い始めている。

f:id:TownBeginner:20241014213116j:imagef:id:TownBeginner:20241014213121j:image

  件の酒の席でウイスキーを飲んだ時、「これは絶対ウイスキーと合う」と確信して作ったガトーショコラ。ホットクックのおかげで思った以上に簡単にできた。今後も折に触れて作るつもりでいる。