1.4L

Arduinoでローストビーフを作る(基礎研究9(再検討))

2024.12.16
PIDのオートマチック制御は、ヒーター加熱の場合、冷却機能が無くて電源オフの放熱に任せなくてはならないのに、冷却機能有り/無しにかかわらず無頓着に動くのが気持ちが悪い。
「対象は加熱に対してこのように温度変化をするよ。」と言う事前情報があれば、より制御しやすいのではないだろうか?という気持ちが拭いきれない。
よって、「振り出し」に戻って考え直すことにした。

【方法】
ある長さの均質な棒状の物質があるとする。一端を加熱点、途中の任意の点をP、他端を最終端点としたときの、P点の経時的温度変化をシミュレーションする。

【仮定】
1.温度は熱量に比例する。
2.ある点から隣の点へ流れる熱量は温度差(傾き)に比例する。
3.最終端点では、その点の温度と外気温の差に比例する熱量が放出される。
4.加熱点において、単位時間に単位量の熱量を加えた場合の点Pにおける経時的温度変化パターンをfp(t)とする場合、単位熱量を ti 時間与えたときの点Pにおける温度変化パターンは「fp(t)のゼロからti までの積分」となる、とする。
5.また、加熱量をK 倍したときの温度変化パターンは「K・fp(t)」となる、とする。
★ 要するに、全くの線形事象とする。

【課題】
このような事象に対して、点Pを外気より高い所定温度にしてそれを維持する加熱制御方法を考える。

以上、乞うご期待。

Arduinoでローストビーフを作る(基礎研究8(中休み))

2024.12.14 。自分が何をしているのか分からなくなったので、整理します。
1. ローストビーフを作るためには、湯煎温度を58℃で3時間キープしなければならない。
2. 温度制御を Arduino にさせよう。
3. 600mLの湯煎の場合は、58℃未満で加熱・58℃以下で電熱器オフで、±0.5℃の単純制御ができた。
4. 2000mLにスケールアップしたところ、オーバーシュート(過剰昇温)が80℃程度までに達した。
5. 60℃を超えると「タンパク変性」を起こして肉が硬くなるので、これはダメだ。
6. 「PID制御」を利用しよう。
7. ネットで勉強して色々試したが、結局、「温度が上がり過ぎたら積極的に冷ます」機能が必要だけど、「ヒーターの電源オフ」に対応するパラメータ設定が分からなかった。
8. 原始的な方法として、「単位時間の加熱による『温度変化のパターン』の積み重ね」で、検討することにした。

【温度変化のパターン】(シミュレーション)
下図は、厚さ10の固体の端に1000J/s☓1secを与えた時、厚さ2番目の面の温度変化を10倍した時の温度変化と、同じパルスを10秒間与えた時の、同じ場所の温度変化を示す。
(赤線:1秒間加温、後放熱。青線:10秒間加熱、後放熱。横軸:時間(秒)、縦軸:温度(℃))

波形はほぼ同じだった。
グラフのピークは、1秒間加熱時(赤)に比べ、10秒間加熱(青)では約6秒遅れたが、高さには差がなかった。

【仮定】(これから検証予定)
1. 今回、1000J/sの加熱でシミュレーションしたが、温度推移は相似的に電力に比例するとする。
3. 10秒間の温度推移は、単位時間(1秒)のパターン(1000パルス☓1000)を時間に沿って単純に積み重ねたもの。

【これからの予定】
今年中にはローストビーフを作る温度制御アルゴリズムを開発したい。
ネット検索が不得意なので、自力開発せざるを得ない。

Arduinoでローストビーフを作る(基礎研究8の2)

2024年11月22日。「ArduinoでPID温度制御」のつづき(その2)です。
スケッチは昨日と同じ「PWM_PID_Heater_v1_241120.ino」ですが、P, I, D のうちの I の値を変えています。
P=D=1 として、I の値を 0.5, 1 ,2 の3種類に変えた場合の温度制御グラフを下に示します。
横軸:経過時間(分)、縦軸:温度(℃)、目標温度:63℃ です。

【結果】
★ I=0.5 のグラフの初期温度が少し低いですが、3分程度左にスライドさせてると他のグラフと立ち上がりの領域が重なります。
★ I の値が大きいほど、ピークに達する時間は短くなり、オーバーシュートは小さくなるようです。
★ ハンチングは、I の値が大きいほど、周期が短くなっているようです。
★ ハンチングの上下幅はあまり変わりないようですが、良く分かりません。
★ ハンチングの始まり時期は、オーバーシュートが小さいほど当然早くなっていますね。

Arduinoでローストビーフを作る(基礎研究8の1)

2024年11月21日。ArduinoでPID温度制御。
2リットルの鍋にしてから、温度調節がうまくいきません。以前600mLの鍋でPID制御をしてみたことがあったけど、オーバーシュート(上がりすぎ)やハンチング(上がり下がり)がひどくて、単純な「設定温度未満ならON、設定温度以上ならOFF」だけで変動幅±0.5℃程度の正確さが得られたことに比べて見劣りがしたので、利用検討をやめた経緯があります。
手さぐりで、水温が45℃まで温まったらヒーターをOFFにすると、約20分遅れで約60℃に達することが分かりました。この調子で、「47℃くらいでヒーターOFF → ピークに達した後 → 63℃以上ならヒーターOFF → 63℃未満なら最弱(Duty比=0.4%;PWMで1)でON」という制御をしようとしたら、どうしてもArduinoに定期的温度モニタリングと温度制御のマルチタスクをさせなければならない、と思うようになりました。
そのことを知り合いに話すと、「それこそPID制御ですれば良いよ。」とのこと。
で、反省を込めて、改めてPIDで温度制御を検討することにしました。
自作300Wニクロム線ヒーターが熱で壊れたので、AliExpressで怪しげな電気コンロを買ったところ、回路の5Aのフューズが飛んだ(多分1000W)ので、ArduinoのDuty比を最大50%までとして使っています。
以下にArduinoのスケッチを示します。

// file name: PWM_PID_Heater_v1_20241120.ino
// 0.2秒ごとにAnalog出力をしています。
// 設定温度は変更可能です。
// P、I、D の係数も変更可能です。各々0.5〜2 の範囲で変えてみてください。
// オーバーシュートやハンチングのパターンが変わります。
// Iを小さくすると、オーバーシュートが小さくなります。
// 対応するPythonコードは"Data_from_Arduino_vF.py"です。
// 温度の経時的変化を120分までグラフ化します。
// 2024.07.31    by Kero
// 2024.11.20    改訂 by Kero

// 温度センサDS18B20の設定(以下のサイトからもらいました。感謝)
// https://github.com/matmunk/DS18B20?tab=readme-ov-file

#include <PID_v1_bc.h>
#include <DS18B20.h>  // センサからの読み込み値はセ氏温度です
DS18B20 ds18(2);  // センサの黄線はArduinoの端子2につなぎます

// PID制御の設定。Google Gemini に教えてもらいました。
double Setpoint, Input, Output;
PID myPID(&Input, &Output, &Setpoint, 1, 1, 1, DIRECT); // P=1, I=1, D=1

// ディスプレイLCDの設定
#include <LiquidCrystal_I2C.h> 
LiquidCrystal_I2C lcd(0x27,16,2); 

// 変数割り当て
int SSR = 6;   // SSRのアドレス
float sett = 63; // 設定温度
float Duty;  // Duty比

// Duty比からアナログ用値に変換は「ヒーターの出力」で

// 変数宣言

String ds18C;  // センサからの読込は文字列変数「ds18C」に入ります
float ds18CV;  // その文字列を実数に変換して入れる変数です

void setup() {
  Serial.begin(9600);  // 通信速度セットアップ

  // PIDの初期化
  Setpoint = sett; // 設定温度
  myPID.SetOutputLimits(0, 127); // 出力範囲を0から127に設定
  myPID.SetMode(AUTOMATIC); // Google Gemini の言う通り。

  // LCDディスプレイ用セットアップ
  lcd.init();
  lcd.backlight();

  // ピンモードを「出力」に設定(不要かも?)
  pinMode(SSR,OUTPUT); 
}

void loop() {
// DS18センサから読み込み(とにかくこう書くようです)
  while (ds18.selectNext()) {
    ds18C = ds18.getTempC();  // 文字列でds18Cに読み込み
    ds18CV = ds18C.toFloat();  // 文字列を実数に変換
    Serial.println(ds18C);  //シリアルモニタに温度を文字列として出力
  }

  // PIDの計算
  Input = ds18CV;
  myPID.Compute(); // Dのための前値はどうなっているの?

  // ヒーターの出力
  analogWrite(SSR, Output);
  Duty = map(Output, 0, 127, 0, 49);

  // LCDへADT温度とDuty比の表示
  lcd.setCursor(0,0); 
  lcd.print("TempSD18= ");
  lcd.print(ds18C);
  lcd.setCursor(15,0);
  lcd.print("C");
  lcd.setCursor(0,1); 
  lcd.print("Duty = "); 
  lcd.setCursor(10,1); 
  lcd.print(Duty);
  lcd.setCursor(15,1); 
  lcd.print('%'); 

  delay(200);  // 0.2秒そのまま
}

Arduinoで、ライブラリ「PID_v1_bc」のPID係数を 1,1,1 にして、SetMode = AUTOMATICで動かしています。
P、I、D の各パラメータを1、1、1 にした場合の温度変化グラフを下に示します。
対象:水が2L入っている金属鍋。撹拌のために、熱帯魚水槽用のエアポンプを投入。
制限:ArduinoのPWMは0〜255の整数値で指定。Duty比は0〜100%に対応。今回は49%までに制限。
グラフの横軸は経過時間(分)、縦軸は温度(℃)。

図1 Arduinoでライブラリ「PID_v1_bc」のPID係数=1,1,1 でAutomatic 制御。目標:63℃。

【結果】
★ 65℃くらいまでヒーターON。
★ 最初のピークは30分で78℃。15℃のオーバーシュート。
★ 以降、だんだん落ち着いては来ている。

Arduinoでローストビーフを作る(基礎研究7訂正)

ArduinoのPWMでAC100Vを降圧します。
ArduinoからPWMを発生させ、SSR(ソリッド・ステート・リレー)を介して、AC100Vの平均電圧(平均電力)を下げます。
SSRには何種類かあります。
ここでは「非ゼロクロスタイプ」と「ゼロクロスタイプ」を説明します。
その前に、ArduinoのPWMを説明します。
「PWM」は「Pulse Width Modulation」の略で、その信号はこんな感じです。

(出典:mathworks)

Arduinoでは標準で490HZ周期の5V信号を出します。

Duty比 = オン期間 / 周期T

Duty比は、%で表示することもあります。

【非ゼロクロスタイプ】
このタイプのSSRにArduinoからPWM信号を送ると、例えばAC100V、60Hzの正弦波1周期の出力波形は以下のようになります。横軸は時間(ミリ秒)、縦軸は電圧(V)です。

Duty比 = 20%
Duty比 = 50%
Duty比 = 80%

これらの電圧変化をならすと(時間軸に沿って絶対値を積分?)、「見かけの電圧降下」が得られます。

【ゼロクロスタイプ】
例えば、秋月電子で売られていたSSR「シャープ製S108T02モジュール」は、以下の姿です。

(出典:秋月電子通商)
(出典:秋月電子通商)

なお、後方の黒い板(SSR本体)は非常に熱くなるので、大きめのヒートシンクの設置をお勧めします。

ゼロクロスタイプのSSRは、入力信号がオンの時、交流電圧がゼロになった時から交流を流します。また、入力信号がオフの時は、交流電圧がゼロになった時から交流を止めます。低い電圧の時点でONすることによってスイッチングノイズの発生や突入電流の発生を抑えることができるそうです。
このSSRにArduinoからPWM信号を送ると、例えばAC100V、60Hzの正弦波の出力波形は以下のようになります。横軸は時間(1秒まで)、縦軸は電圧(V)です。

Duty比 = 20%
Duty比 = 50%
Duty比 = 80%

これらの電圧変化をならすと(時間軸に沿って絶対値を積分?)、「見かけの電圧降下」が得られます。
ゼロクロスタイプのSSRモジュール(S108T02)でAC100Vを制御した実測値を再掲します。
横軸:Duty比(%)、縦軸:AC(V)です。テスターの針が振れるので、最低・最高・平均をプロットしています。

Arduinoでローストビーフを作る(基礎研究6)

ローストビーフの特徴は「肉が生に近くて柔らかい。でもちゃんと殺菌されている。」です。
今回は、どうして「58℃で3時間」の加熱が必要か?」 を解説します。(大雑把です。悪しからず。)
内閣府/ 食品安全委員会では、「雑菌が死滅する安全な」食肉低温調理方法を指導しています。
(ご参照:内閣府/ 食品安全委員会「肉を低温で安全においしく調理するコツをお教えします!」
(令和6年3月5日更新)https://www.fsc.go.jp/foodsafetyinfo_map/shokuhniku_teionchouri.html
厚生労働省は、ローストビーフなどの特定加熱食肉製品に関し、その中心部分が下図の曲線の上側に位置するように加熱しなければならない、と規定しています。そうしないと肉の内部に潜んでいるばい菌が死にません。しかし、温度を60℃以上に上げるとタンパク質が変性して肉が固くなったり変色したりするそうです。だから、下図の曲線の60℃以下を狙って調理することになります。
この曲線はかなりキビシイもので、例えば設定温度を60℃にしていたのに、何かの拍子に「たった2℃低いだけの」58℃になっちゃった、とすると、必要な持続時間は12分から28分へ、2倍以上も時間が必要になります。57℃なら、約4倍の43分も必要です。
なので、最初から安全を見込んで「中心温度の設定温度:60℃、持続時間:30分」としておきましょう。

Screenshot

次に考慮しなければならないのは、「肉の中心部を60℃にしようと思ったら、肉の外側から60℃で温めないと、それ以上の温度だったら肉の外側がタンパク質変性を起こして固くなる」、ということです。
では、肉の中心温度が外側と同じ温度になるまで、どのくらいの時間がかかるのか?というのが、下図です。これは「加熱殺菌や低温調理で食肉の中心温度が設定温度になるまでの所要時間」(https://foods-plus.jp/sanitation/heating-times/)のデータを参考にさせていただきました。感謝。
このグラフでは、肉の形状をビフテキのような「平板状」(無限に広い)、ブロック肉のような「円柱状」(ただ厚みと底面直径は同じらしい)、および「球状」に分けてプロットしています。
ローストビーフに用いるブロック肉は、中央部直径が50mmから60mm、長さ100mmから150mmくらいでしょうか。長軸側の両端は紡錘形になってしぼまっていますので、大雑把に考えて「厚さ・直径60mmの円柱状」と見なそうと思います。であれば、150分かかって中心部の温度が外側の温度と同じになることになります。

Screenshot

この150分と中心温度持続時間の30分を合計すると、180分=3時間になります。
それでこれまで、私は「60℃を3時間」で、Arduinoでローストビーフ(正しくはポーク)を作ってきました。ただ、常温から肉を湯煎するのではなく、一度沸騰させたお湯を湯煎器に移し、それにプラスチックバッグに入れた肉を浸して温度制御していました。

【後日談】
大変なことが分かりました! 
「ローストポーク」はローストビーフより設定温度を上げなければならないそうです。
E型肝炎ウイルスが居たり、有害寄生虫が居たりするので、63℃で 30 分間以上加熱するかこれと同等以上の加熱殺菌をするよう厚労省が定めていました。
しょうがないから、これから気をつけます。

Arduinoでローストビーフを作る(基礎研究5)

今回は、これまでの「まとめ」。
左図は、PWMのDuty比50%で熱し、60℃以上になったら止める、を繰り返し。
右図は、PID_v1_bcの「オートマチック」でPWMの出力を自動調整した結果。
設定温度は60℃、横軸は時間(分)、縦軸は水温(℃)

  PWMのDuty比50%で熱し、60℃以上でオフ
   PID_v1_bcで設定を60℃にして自動運転

【結 果】=【結 論】
1.どう見てもPIDの「自動」は荒い。PIDの各パラメータを調整して左図程度にするのも面倒くさい。
2.で、左図の「Duty比50%のPWMで熱し、60℃未満までオン、それ以上でオフ」を繰り返すのが良策。

Arduinoでローストビーフを作る(基礎研究4)

今回はライブラリ「PID_v1_bc」を盛り込んでPIDのオートマチック制御をさせてみた。
やり方は「Google Gemini」に教えてもらった。
以下、Arduinoのスケッチ。Python の受けは、これまで通りの「Data_from_Arduino_vF.py」。

// 0.2秒ごとにAnalog出力をしています。
// Duty比(%)と設定温度だけ変えてください。
// 対応するPythonコードは"Data_from_Arduino_vF.py"です。
// 2024.07.31    by Kero

// 温度センサDS18B20の設定(以下のサイトからもらいました。感謝)
// https://github.com/matmunk/DS18B20?tab=readme-ov-file

#include <PID_v1_bc.h>
#include <DS18B20.h>  // センサからの読み込み値はセ氏温度です
DS18B20 ds18(2);  // センサの黄線はArduinoの端子2につなぎます

// PID制御の設定。Google Gemini に教えてもらいました。
double Setpoint, Input, Output;
PID myPID(&Input, &Output, &Setpoint, 2, 5, 1, DIRECT); // P=2, I=5, D=1

// ディスプレイLCDの設定
#include <LiquidCrystal_I2C.h> 
LiquidCrystal_I2C lcd(0x27,16,2); 

// 変数割り当て
int SSR = 6;   // SSRのアドレス
float sett = 60; // 設定温度
float Duty;  // Duty比

// Duty比からアナログ用値に変換

// 変数宣言

String ds18C;  // センサからの読込は文字列変数「ds18C」に入ります
float ds18CV;  // その文字列を実数に変換して入れる変数です

void setup() {
  Serial.begin(9600);  // 通信速度セットアップ

  // PIDの初期化
  Setpoint = sett; // 設定温度
  myPID.SetOutputLimits(0, 255); // 出力範囲を0から255に設定
  myPID.SetMode(AUTOMATIC); // Google Gemini の言う通り。

  // LCDディスプレイ用セットアップ
  lcd.init();
  lcd.backlight();

  // ピンモードを「出力」に設定
  pinMode(SSR,OUTPUT); 
}

void loop() {
// DS18センサから読み込み(とにかくこう書くようです)
  while (ds18.selectNext()) {
    ds18C = ds18.getTempC();  // 文字列でds18Cに読み込み
    ds18CV = ds18C.toFloat();  // 文字列を実数に変換
    Serial.println(ds18C);  //シリアルモニタに温度を文字列として出力
  }

  // PIDの計算
  Input = ds18CV;
  myPID.Compute(); // Dのための前値はどうなっているの?

  // ヒーターの出力
  analogWrite(SSR, Output);
  Duty = map(Output, 0, 255, 0, 99);

  // LCDへADT温度とDuty比の表示
  lcd.setCursor(0,0); 
  lcd.print("TempSD18= ");
  lcd.print(ds18C);
  lcd.setCursor(15,0);
  lcd.print("C");
  lcd.setCursor(0,1); 
  lcd.print("Duty = "); 
  lcd.setCursor(10,1); 
  lcd.print(Duty);
  lcd.setCursor(15,1); 
  lcd.print('%'); 

  delay(200);  // 0.2秒そのまま
}

【結 果】
以下のグラフのようになりました。横軸:時間(分)、縦軸:温度(℃)です。

Arduino で、設定温度を60℃にして、PID_v1_bcのAUTOMATICモードでPWM出力した結果

1.30℃あたりから60℃になるまでに15分程度かかる。
2.残念ながら、オーバーシュート(最初の過剰温度上昇)やハンチング(凸凹振動)が大きすぎる。
これまでにPIDを使わないやり方に比べ、オーバーシュートは大きすぎ、ハンチングの振幅はアナログ(PWM)出力の場合より大きく、デジタル出力(デジタルOUTPUT)の場合と同程度と思われる。
3.オートマチックにしないで、パラメータを変えてみる必要がある。
今日はこれまで。

Arduinoでローストビーフを作る(基礎研究3)

今回は、AC100Vをフルで通電し、水温の立ち上がりがどうなるかを調べた。
後から気がついたんだけど、ヒーターとArduinoを全く独立に通電すれば良かったかも知れない。
でも気がつくのが遅く、Arduinoのスケッチを以下のように最速化して走らせた。
ヒーターは「setup」内で、OUTPUTをHIGHにしてフル通電した。
「loop」には、温度測定とそのデータをシリアルモニタに送信することのみを記述した。
水温が60℃になったら、AC100Vのスイッチを切った。

// setupで、300WのヒーターにSSRを介してAC100Vを通電し、
// 29度の水が60度になるまで、熱しました。
// loopでは、温度を測ってシリアルモニタに送るだけです。
// 対応するPythonコードは"Data_from_Arduino_vF.py"です。
// 2024.07.23    by Kero

// 温度センサDS18B20の設定(以下のサイトからもらいました。感謝)
// https://github.com/matmunk/DS18B20?tab=readme-ov-file
#include <DS18B20.h>  // センサからの読み込み値はセ氏温度です
DS18B20 ds18(2);  // センサの黄線はArduinoの端子2につなぎます
String ds18C;  // センサからの読込は文字列変数「ds18C」に入ります

int SSR = 6;   // SSRのアドレス

void setup() {
  Serial.begin(9600);  // 通信速度セットアップ
  pinMode(SSR,OUTPUT); 
  digitalWrite(SSR, HIGH); 
}

void loop() {
  while (ds18.selectNext()) {
    ds18C = ds18.getTempC();
    Serial.println(ds18C);
  }
}

【結 果】
1.ヒーターは継続的(continuous)に通電された。loop 内だったら、必ず断続的になる。
2.AC100Vフル通電と、これまでの温度変化グラフ(loop内に入れたAC100V版、及びPWM_Duty比50%版)とを比べてみた。以下の図ご参照。(横軸:時間(分)、縦軸:温度(℃))

左側:AC100Vフル通電、右側:PWM Duty50%
loop内にAC100Vを入れて100%で熱した場合

左図では、AC100Vフル通電(左側)とPWMのDuty比50%(右側)の温度変化を比べているけど、出だし(左29℃、右25℃)を揃えると、若干PWMの方が遅いけど、ほぼ同等の速度で加熱されているようだ。
一方、右図では、loop内に “digitalWrite(SSR, HIGH)” を入れているので、loopが回るたびに必ず1秒弱ごとに電気の遮断が生じ、加熱速度が遅くなっている。loop内に “analogWrite(・・・)” を入れた場合は、「電気の遮断は起きず、継続的(continuous)にPWM通電される。」と、言われている。
3.loop 内の処理は、温度センサから温度を読み取り、PCへデータ転送するだけだけど、約1.8回/ 秒の速度だった。温度センサが遅いのかArduinoが遅いのか分からないが、これが限界らしい。
4.今回のAC100Vフル通電では、SSRが恐ろしく熱くなり今にも発火しそうだった。ヒートシンクをつけているんだけど、焼け石に水。なので、ティシュに水を含ませ、ヒートシンクのひだの間に挟み入れたり、濡れティシュでシンクの板を挟んだりして、60℃になるまで耐えるように祈った。PWMの場合はこれほどではなかったと思う。
5.現実的な「Arduinoでローストビーフを作る」方法は、電熱器とArduinoを電気的に接続せず、Arduino には温度を測らせ、設定温度未満なら、サーボモータか何かで、電熱器のスイッチを物理的に押して「オン」にし、設定温度以上になったら、そのスイッチを「オフ」にする、ってやり方の方が良いみたい。

Arduinoでローストビーフを作る(基礎研究2)

ArduinoのPWMについて調べている。今日はDC12Vがどうなるか試してみた。
Arduinoのスケッチは「基礎研究1」と同一。
ACアダプタは、品名:JOD-1972 入力:AC100V 27VA、出力:DC12V 1200mA。
結果は下図のとおり。横軸:Duty比、縦軸:DC12V(公称値)からのPWM変換値(V)。

【結 果】
1.「基礎研究1」のAC100Vの変換でも同様だったけど、テスタの値がふらつく。
2.Duty比10%で一旦0.6Vにバウンドして、20%で平均0.14Vになり、それから91%までほぼリニアに電圧が上がり、92%から急に跳ね上がって93%では100%と同様な16.5V程度の値になった。
3.ArduinoのPWMは、Duty比「20%〜90%」の間で使うのが良さそう。
4.上図は、前回のAC100Vの変換図が2次曲線ぽっかったのとは違う。交流をPWMすると、直流とは違う現象が生じるようだ。

Arduinoでローストビーフを作る(基礎研究1)

ArduinoでPWMを出す時、「Duty比と『見かけの電圧』」がリニアになっているのかどうか、調べた。
Arduinoのスケッチは以下のとおり。
Duty比(%)を0から100まで10刻みに定め、アナログ出力をSSRに通し、AC100Vが何Vになるか、テスターで測った。

int SSR = 6;   // SSRのアドレス(アナログ出力)
float Duty = 60;  // Duty比(ここをゼロから100まで10刻みに変える)
// Duty比からアナログ用値に変換
int anaON = (int) 255 * Duty / 100 + 0.5;

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

void loop() {
  analogWrite(SSR, anaON);
}

その結果、下図のように、「AC100V」に関しては、リニアではなく、ゆるい2次曲線のようになった。
横軸:Duty比、縦軸:AC100Vからの変換値(V)

直流電源ではどうなるか、次回検討。

Arduinoでローストビーフを作る(14: 最終回)

・予算の関係で、100g250円の豚ブロック290gを供試しました。
・下ごしらえから説明すると、まずヤカンでお湯を沸かします。同時にキッチンペーパーで肉塊のドリップを拭い、適量の塩・コショウで表面をくまなく揉み、ファスナー付きプラスチック・バッグ(以降「肉バッグ」と言います)に入れて空気を抜きます。肉バッグを、ガラス鍋(これまで実験で使ったヤツ)に入れ、熱湯をヒタヒタになるまで注ぎます。それをニクロム線ヒーターにかけます。
・Arduinoスケッチの設定温度を60℃にして、それ以下になるとDuty比=40/255でアナログ(PWM)出力を出し、SSRを介してAC100Vでニクロム線ヒーターを加熱しました。温度センサーが60℃になった時から、3時間稼働させました。

【結果】

図1 肉バッグを熱湯に入れ、設定60℃で加熱
      横軸:分、縦軸:温度(℃)

・最初、肉塊を冷蔵庫から出して前処理していたので、肉バッグと熱湯を一緒にしたら、お湯は70℃くらいに冷め、温度測定はそこからとなりました。この下がり具合は肉バッグとお湯の体積関係によります。
・Python側のグラフは時間軸を3.5時間まで延長したのですが、処理時間を60分のままにしておいたので、60分のモニタリングで切れました。Arduinoによるヒーターへの通電は継続しています。
・測定スタートから温度がぐぐっと下がり、約10分で60℃に達したところで1回やや大きなリバウンドを起こしましたが、以降はほぼ定常的にオン・オフを繰り返し、60±1℃あたりで安定しています。Arduinoの温度センサーにくっつけている棒状温度計は、ずーっと「58℃」のままです。
・60℃になってからちょうど3時間経って肉塊を取り出し、ニンニクのすりおろし適量をオリーブオイルで炒めていたフライパンに肉汁ごと投入して、表面をくまなく軽く焼いて出来上がりです。薄切りにして冷蔵庫でしばらく冷やしたのが右の写真です。切り口にはほんのりとピンク色が残っています。
・食べる時は、そのままでもステーキソースを少しかけても良いです。食感は、非常に柔らかく。美味しい肉の味を味わえます。
・正式のローストビーフは、家族が帰って来るお盆に作ろうと思います。
・とりあえず「Arduinoでローストビーフを作る」シリーズはこれでおしまいにします。
・正しくは「ローストポーク」になってしまいましたが、お許しください。
・これまでのシリーズをまとめておこうと思います。
・PID制御については、また別途勉強します。
・お疲れ様でした。

Arduinoでローストビーフを作る(13)

PWMを復活しました。

【スケッチ】
・「Arduinoでローストビーフを作る(9)」のスケッチを、ほんの少し改良しています。
・温度設定機能を持たせました。Value =40にして、設定温度(Temp0)を60℃にしました。
・測定温度(ds18CV)が設定温度以内であればオン、超えたらオフ、にしました。
・他は以前と同じです。(Python 側は、変更ありません。)

// 温度設定機能を持たせました。
// Value は40にして、
// 設定温度(Temp0)を60度にしました。
// 測定温度(ds18CV)が設定温度以内であればオン
// 超えたらオフ、にしました。他は06.05版と同じです。
// 2024.06.28 by Kero

// AC100Vを加工してニクロム線ヒーターに通電し加熱します。
// ADT7410はやめて、DS16B20を1-Wire接続し、温度を測り、表示します。
// 2024.06.05 by Kero

// 最初の宣言です
#include <Wire.h>  //I2C通信のライブラリ(忘れていました。でもLCDは動いた?)

// 温度センサDS18B20の設定(以下のサイトからもらいました。感謝)
// https://github.com/matmunk/DS18B20?tab=readme-ov-file
#include <DS18B20.h>
DS18B20 ds18(2);  // センサの黄線はArduinoの端子2につなぎます
String ds18C;  // センサからの読込は文字列変数「ds18C」に入ります
float ds18CV = 0.0;  // その文字列を実数に変換して入れる変数です

// ディスプレイLCDの設定
#include <LiquidCrystal_I2C.h> 
LiquidCrystal_I2C lcd(0x27,16,2); 

// 変数割り当て
int LED = 3;   // LEDのアドレス
int SSR = 6;   // SSRのアドレス
int Value = 40;  // ヒーター電力の強さ(<255の整数)
float Duty = 0.0;  // Value / 255 * 100 (%) = Duty比の初期値
float Temp0 = 60.0; // 設定温度
 
void setup(void) {
  Serial.begin(9600);  // 通信速度セットアップ

  // DS18センサ用セットアップは不要です

  // LCDディスプレイ用セットアップ
  lcd.init();
  lcd.backlight();

  // ピンモードを「出力」に設定
  pinMode(LED,OUTPUT);
  pinMode(SSR,OUTPUT); 
}
 
void loop(){

  // DS18センサから読み込み(とにかくこう書くようです)
  while (ds18.selectNext()) {
    ds18C = ds18.getTempC();  // 文字列でds18Cに読み込み
    ds18CV = ds18C.toFloat();  // 文字列を実数に変換
    Serial.println(ds18C);  //シリアルモニタに文字列として出力
  }
  if(ds18CV <= Temp0){
  // LEDとSSRへValue値を出力
    analogWrite(LED, Value); 
    analogWrite(SSR,Value); 
  }else {
    analogWrite(LED, 0); 
    analogWrite(SSR, 0);  
  }

  // LCDへADT温度とDuty比の表示
  lcd.setCursor(0,1); 
  lcd.print("Duty = "); 
  lcd.setCursor(10,1); 
  Duty = (float)Value * 0.392 + 0.5;
  lcd.print((int)Duty);
  lcd.setCursor(15,1); 
  lcd.print('%'); 
  lcd.setCursor(0,0); 
  lcd.print("TempSD18= ");
  lcd.print(ds18C); 
  lcd.setCursor(15,0);
  lcd.print("C");

  delay(10000);  // 10秒休み
}

【実行】

図1  Duty比= 40 / 255 でPWM出力し、60℃を超えたらオフにしたときの温度変化

・今回の初期水温は29℃でした。
・Value=20では60℃に達するのに約30分かかりましたが、Value=40では17分で到達しました。
・60℃を超えたらオフなので、ジャスト60℃ではまだ通電しています。
・開始から17分後以降、だいたい60℃付近でオン・オフを繰り返しています。
・最高値は最初に60℃を超えた時の値で61.06℃でした。最低値はその直後の値で59.81℃でした。
・それからオン・オフを繰り返していると、だんだん最高値・最低値の幅が小さくなってきました。
・SSRは、20分を過ぎたらあまり熱くならなくなりました。約40℃くらいでしょうか。
・温度制御は、「60℃未満ならオン、60℃以上ならオフ」にした方が、より60℃に近くなりそうです。
・「58℃を3時間キープ」という当初の目的は、実用的にはこれで達成できたと言って良いでしょう。
・でも、何だかあっけないので、もっと凸凹を少なくするとか、PID制御を少し勉強してみます。
・ローストビーフは、200gくらいの肉塊で早速作ってみます。

Arduinoでローストビーフを作る(12)

PWMをやめてみた。
SSRへの出力を「アナログ」から「デジタル」(端子No.7)に変え、「100ミリ秒中に50ミリ秒」と「1000ミリ秒中に500ミリ秒」の通電をloopで繰り返した。
初期水温は23.25℃。
前者はいくら待っても温度が全く上がらない。
後者は3分間で0.5℃くらい上がった。遅い!
どちらも、ニクロム線は熱くなり、SSRはガンガンに熱い。

どういう現象か良く分からないけど、アナログのPWM出力と大違いなことが分かった。
再び、着実に温度が上がるPWM出力に戻ることにした。

Arduinoでローストビーフを作る(11)

割れた陶製皿の裏側にセロハンテープを貼ってつなぎ合わせ、ヒーターを復元しました。
今度はブロックを接着剤で固定してません。
このブロックとお皿の熱膨張率が違っていたためにお皿が割れたのではないかと思っています。
今回はブロックをただ置いているだけです。
ガラス鍋を持ち上げると、ニクロム線がびょよよ~んと跳ね上がります。
ニクロム線を這わせる形状が変わったので、Value=20のデータ(グラフ)は取り直しです。
ついでにValue=1でも実験しました。(Arduino
スケッチの22行目を “int Value=1;” に変更)
温度変化グラフは以下のとおりです。
(横軸:分、縦軸:セ氏温度)

     図1 Value=1 での温度変化
     図2 Value=20 での温度変化

これらのグラフの解釈ですが、
1.Value=1(Duty比= 1 / 255)では60分で80℃以下までしか温度が上がらなかった。
2.Value=20(Duty比= 20 / 255)では60分で80℃以上の温度になった。
3.いずれも当初の予想どおり「S字カーブ」となった。
4.60℃付近で自動温度制御をする場合、最小PWM出力(Value=1)でも温度が上がるので、困ったな。
5.Arduino のPWM周波数は約490Hzとのこと。と言うことは、約2m秒ごとに、その時間を255等分してそのうち何個のコマ数にオン(通電)するか、で出力電力が決まってくる。Value=1 はコマ数=1。これでも通電時間が長いので、もっと短くする必要がある。Arduino のPWMに頼るわけにはいかない。

というわけで、自力で自動温度制御アルゴリズムを考えることにする。
バイチャ。

Arduinoでローストビーフを作る(10)

前回のArduinoのスケッチの22行目を “int Value = 255;” に書き換えて、ヒーター出力を最大にしました。

5分くらいで、ニクロム線を載せていたダイソーの陶製皿が「バシッ」という音と共に割れました。
あわててガラス製鍋を撤去し、温度センサーを外し、AC100Vのスイッチを切り、テーブルが焦げないようにニクロム線をテーブル表面から離しました。SSRは今にもバクハツしそうに熱かったです。
何が悪かったんだろう??

温度変化のグラフを前回のと比較しました。以下のとおりです。

     図1 Value=20 での温度変化
     図2 Value=255 での温度変化

これらのグラフから以下のことが分かりました。
1.温度の立ち上がりは、図2の方が速い。PWMによる電力制御が効いている!
2.ヒーターに一定出力をかけた場合、ほぼ直線的に温度が上がる。
3.ヒーターの電源を切ったら、お湯の中ではほぼ直線的にゆっくり温度が下がるが、空中にセンサーを置くとエクスポネンシャルで急速に温度降下が起きる。
4.SSRは非常に熱くなる。ヒートシンクをつけてみよう。バクハツしたら、また考えよう。

明日からは、ヒーター部分を再建して、PID制御に進もうと思います。
今日はこれまで。

AIが嫌いなわけ

私はAIがきらいだ。
なぜって、誰でも人類の英知を手軽に入手できるのが、面白くないからだ。
新しい知識や体験はそれなりの努力が必要だったのではないのか?
努力もしない凡人がいきなり偉くなったように振る舞うのは止めてほしい。
子供が銃を持って、誰でも殺せるようになるみたいに、恐ろしい。
なお話は変わるが、現在ブームのAIは、これまでコマギレだった人類の英知を、縦横無尽のネットワークで有機的に結びつけている点が評価できるが、それから新規に発生するものごとは、太陽のフレアのように、太陽の重力圏に取り込まれ、再び太陽に戻るのではないか? 太陽系から逸脱するものごとは、かえって出にくくなって来るのではないだろうか?と思う。

Arduinoでローストビーフを作る(9)

温度変化をPythonのグラフで見ます。
ADT7410温度センサーモジュール・スケッチは取っ払いました。
最後に現状写真を載せています。

【材料】
・なし

【つなぎ方】
・ADT7410温度センサーモジュールを取っ払います。
・その他は手をつけません。

【Arduinoのライブラリのインストール】
・なし。

【スケッチ】
・Arduino IDEのスケッチ画面に以下のスケッチを書きます。
・ADT7410温度センサー関連のスケッチは削除しています。

// AC100Vを加工してニクロム線ヒーターに通電し加熱します。
// ADT7410はやめて、DS16B20を1-Wire接続し、温度を測り、表示します。
// 2024.06.05 by Kero

// 最初の宣言です
#include <Wire.h>  //I2C通信のライブラリ(忘れていました。でもLCDは動いた?)

// 温度センサDS18B20の設定(以下のサイトからもらいました。感謝)
// https://github.com/matmunk/DS18B20?tab=readme-ov-file
#include <DS18B20.h>
DS18B20 ds18(2);  // センサの黄線はArduinoの端子2につなぎます
String ds18C;  // センサからの読込は文字列変数「ds18C」に入ります
float ds18CV = 0.0;  // その文字列を実数に変換して入れる変数です

// ディスプレイLCDの設定
#include <LiquidCrystal_I2C.h> 
LiquidCrystal_I2C lcd(0x27,16,2); 

// 変数割り当て
int LED = 3;   // LEDのアドレス
int SSR = 6;   // SSRのアドレス
int Value = 20;  // ヒーター電力の強さ(<255の整数)
float Duty = 0.0;  // Value / 255 * 100 (%) = Duty比の初期値
 
void setup(void) {
  Serial.begin(9600);  // 通信速度セットアップ

  // DS18センサ用セットアップは不要です

  // LCDディスプレイ用セットアップ
  lcd.init();
  lcd.backlight();

  // ピンモードを「出力」に設定
  pinMode(LED,OUTPUT);
  pinMode(SSR,OUTPUT); 
}
 
void loop(){

  // DS18センサから読み込み(とにかくこう書くようです)
  while (ds18.selectNext()) {
    ds18C = ds18.getTempC();  // 文字列でds18Cに読み込み
    ds18CV = ds18C.toFloat();  // 文字列を実数に変換して表示
    Serial.println(ds18C);  //シリアルモニタに文字列として出力
  }
  
  // LEDとSSRへValue値を出力
  analogWrite(LED, Value); 
  analogWrite(SSR,Value); 

  // LCDへADT温度とDuty比の表示
  lcd.setCursor(0,1); 
  lcd.print("Duty = "); 
  lcd.setCursor(10,1); 
  Duty = (float)Value * 0.392 + 0.5;
  lcd.print((int)Duty);
  lcd.setCursor(15,1); 
  lcd.print('%'); 
  lcd.setCursor(0,0); 
  lcd.print("TempSD18= ");
  lcd.print(ds18C); 
  lcd.setCursor(15,0);
  lcd.print("C");

  delay(10000);  // 10秒休み
}

【Pythonのプログラミング】
・予め以下のライブラリ(モジュール?)をインストールしておきます。
・numpy、matplotlib、pyserial、(timeは標準で入っています。)
・このプログラムを実行するときは、Arduino IDEのシリアルモニタは消しておいてください。

# Arduino からの温度データをPythonで受け取ります。
# 当面の目標は時系列のグラフ化です。
# 2024.06.05   by Kero

import numpy as np
import matplotlib.pyplot as plt
import serial
import time

xdata = [] # 時間データを入れる配列
ydata = [] # 温度データを入れる配列

# 温度データの読み込み設定
data1 = serial.Serial('/dev/cu.usbmodem142401',9600,timeout=None)
tim = 0.0 # これは10秒単位の値です

while tim < 360: # 3600秒(=1時間)計測します
    plt.cla() # グラフをクリア
    
    # Arduinoから10秒に1回データが送信されます。
    text = data1.readline() # Arduinoからのデータ読み込み
                            
    degf = float(text[0:5]) # 文字列で入ってくるので最初の5文字を摘出
    minf = tim / 6 # 時間単位を「分」に変換
    print(minf, degf) # とりあえず標準出力しときます
    
    xdata.append(minf) # 配列に新しい分データを追加
    ydata.append(degf) # 配列に新しい温度データを追加
    plt.xlim(0, 60) # 横軸を0から60分に固定
    plt.ylim(0, 100) # 縦軸を0から100℃に固定
    plt.plot(xdata, ydata) # 折れ線グラフ描画
    plt.pause(9.0) # 9秒そのまま
    
    tim += 1.0 # 10秒分加算します

【実行】
・温度センサーを水の中に入れます。
・Arduinoの方を先に実行(IDEの「→」)します。
・PythonプログラムをRUNさせます。
・Pythonの方にグラフが出てきて、折れ線が段々伸びて行き、1時間経つと以下のようになります。
・これは、30分ヒーターに通電し、残り30分はヒーターをOFFにした温度変化です。
・予想ではS字カーブで温度上昇し、エクスポネンシャルで温度降下が起きるものと思っていました。
・ONでほぼ直線的に温度が上がり、OFFで同じく直線的に温度が下がっています。

Screenshot

Arduinoでローストビーフを作る(8)

温度センサーをつなぐ(その2)
アリババに頼んでおいた防水型DS18B20温度センサーが忘れた頃に届いたので、急遽つないでみます。
Pythonでの温度グラフは次回で取り組みます。
最後に写真を載せています。

【材料】
・防水型DS18B20温度センサー(AliExpress)
・ブレッドボード用ジャンパ線(オス・オス)数本(前回既出)

【つなぎ方】
・私が買った防水型DS18B20温度センサーは3本線です。赤線は5V、黒線はGND、黄線は「2」へつなぎます。信号線が1本で済むので、このセンサーの接続方式は「1-Wire」接続というのだそうです。
・このセンサーには「プルアップ抵抗」(4.7kΩ〜5kΩ)なるものが必要で、黄線と赤線の間をこの抵抗で繋ぐ必要があるそうです。手元には10kΩしかなかったので、ブレッドボード上でこれを2個並行につなぎました。
・このセンサーのアドレスは分かりません。1個の場合は意識しなくても良いようです。

【ライブラリのインストール】
・この温度センサーを使うには、ライブラリのインストールが必要です。
・Arduino IDE画面最上段メニュー「ツール」→「ライブラリを管理」を選ぶと、左カラムにライブラリマネージャーが現れます。そのタイトルの直ぐ下に検索欄があるので「DS18B20」と入力します。同一名のライブラリが最初にヒットするので、それを「インストール」します。同類のライブラリ(CheckDS18B20など)もありますが無視してください。
・出力画面に「インストールは成功しました。」という言葉が一瞬表示されればオッケーです。

【スケッチ】

Arduino IDEのスケッチ画面に以下のスケッチを書きます。
温度センサーをつなぐ(その1)のスケッチをベースに、DS18B20用のスケッチを追記しています。(その他の部分も若干変更している箇所があります。ゴメンナサイ。)

// AC100Vを加工してニクロム線ヒーターに通電し加熱します。
// ADT7410をI2C接続、DS16B20を1-Wire接続し、温度を測り、表示します。
// 2024.06.04 by Kero

// 最初の宣言です
#include <Wire.h>  //I2C通信のライブラリ(忘れていました。でもLCDは動いた?)

// 温度センサADT7410の設定
#include <Adafruit_ADT7410.h>  // ADT7410のライブラリ読み込み
Adafruit_ADT7410 Temp1 = Adafruit_ADT7410();  // ADT温度センサーをTemp1と名付けます

// 温度センサDS18B20の設定(以下のサイトからもらいました。感謝)
// https://github.com/matmunk/DS18B20?tab=readme-ov-file
#include <DS18B20.h>
DS18B20 ds18(2);  // センサの黄線はArduinoの端子2につなぎます
String ds18C;  // センサからの読込は文字列変数「ds18C」に入ります
float ds18CV = 0.0;  // その文字列を実数に変換して入れる変数です

// ディスプレイLCDの設定
#include <LiquidCrystal_I2C.h> 
LiquidCrystal_I2C lcd(0x27,16,2); 

// 変数割り当て
int LED = 3;   // LEDのアドレス
int SSR = 6;   // SSRのアドレス
int Value = 20;  // ヒーター電力の強さ(<255の整数)
float Duty = 0.0;  // Value / 255 * 100 (%) = Duty比の初期値
 
void setup(void) {
  Serial.begin(9600);  // 通信速度セットアップ
  // ADTセンサ用セットアップ
  Wire.begin(); // I2C通信開始(忘れていました。)
  Temp1.begin(0x48);  // ADTセンサのアドレスは0x48(デフォルト)
  Temp1.reset();  // ソフトウェア・リセット
  Temp1.setResolution(ADT7410_16BIT);  // 解像度=16bitを設定
  delay(250);  // タイミング調整用?

  // DS18センサ用セットアップは不要です
  Serial.println("DS18B20");  // シリアルモニタに名前表示

  // LCDディスプレイ用セットアップ
  lcd.init();
  lcd.backlight();

  // ピンモードを「出力」に設定
  pinMode(LED,OUTPUT);
  pinMode(SSR,OUTPUT); 
}
 
void loop(){
  // LDTセンサから読み込み
  float Cdeg = Temp1.readTempC();  // セ氏で温度(実数)を読み込む
  //Serial.println(Cdeg); // LDT温度の表示はLCDだけにしました

  // DS18センサから読み込み(とにかくこう書くようです)
  while (ds18.selectNext()) {
    ds18C = ds18.getTempC();  // 文字列でds18Cに読み込み
    ds18CV = ds18C.toFloat();  // 文字列を実数に変換して表示
    Serial.println(ds18CV);  //シリアルモニタに出力
  }
  
  // LEDとSSRへValue値を出力
  analogWrite(LED, Value); 
  analogWrite(SSR,Value); 

  // LCDへADT温度とDuty比の表示
  lcd.setCursor(0,1); 
  lcd.print("Duty = "); 
  lcd.setCursor(10,1); 
  Duty = (float)Value * 0.392 + 0.5;
  lcd.print((int)Duty);
  lcd.setCursor(15,1); 
  lcd.print('%'); 
  lcd.setCursor(0,0); 
  lcd.print("TempADT= ");
  lcd.print(Cdeg,2); 
  lcd.setCursor(15,0);
  lcd.print("C");

  delay(10000);  // 10秒休み
}

【実行】
・DS18B20温度センサーをビーカーの水の中に入れます。棒状温度計の近くが良いでしょう。
・スケッチ画面の上段にある「→」アイコンをクリックすると、スケッチのコンパイル(機械語翻訳)が行われ、Arduinoにダウンロードされます。Arduinoは直ちにそれを実行します。
・1602ディスプレイに「TempADT= ◯◯.◯◯ C」と、「Duty ratio = 8 %」という表示が出ます。
・TempADTの値は10秒ごとに変化します。
・Arduino IDEの「シリアルモニタ」(窓右上の虫メガネみたいなのをクリック)に、DS18B20で測定した温度が表示されます。
・棒状温度計と、DS18B20と、ADT7410とでは、測定値が皆違っています。棒状温度計よりDS18B20の方が若干(大きくて2℃程度)高いです。それは、棒状温度計の「正しい測り方」は、アルコールの先端までお湯に漬けるのだそうで、今回空中に出ている部分のアルコールが熱膨張しなかったためと考えられます。
・一方、通電している間中、DS18B20よりADT7410の方が10℃以上高い値を示しました。それは、ADT7410はビーカーの外壁に貼り付けていたのですが、ヒーターによる熱上昇気流でお湯以上に加熱され、高温になったためと考えられます。ヒーターのスイッチを切ると、急速にお湯の温度以下に下がりました。
・従って、DS18B20を水中に放り込んで水温を測定する方法が一番妥当であると考えました。
・次回はArduinoからmacに送られたデータを元に、温度変化のグラフをPythonで描いてみます。
・なお、ADT7410温度センサーは、以降、ハード・スケッチともに削除します。

Arduinoでローストビーフを作る(7)

温度センサーをつなぐ(その1)
温度センサー(ADT7410のI2Cモジュール)を設置します。

【材料】
・温度センサー(ADT7410のI2C接続モジュール)(秋月)
・ブレッドボードとブレッドボード用ジャンパ線(オス・オス)数本(前回既出)

【つなぎ方】
・ArduinoのA4とA5は、複数接続できるようにブレッドボード(例えば使っていない方の「+」と「―」)に取り出し、そこからLCDと温度センサーにつなぎます。
・温度センサーモジュールから4本の線が出ています。以下、温度センサー側の表示とArduino側の接続先を示します。すべてブレッドボードを介して接続します。
・GND → GND
・VCC → 5V
・SDA → A4
・SCL → A5
・I2C接続デバイスにはI2Cアドレスが必要です。この温度センサーはデフォルトアドレス”0x48”を用いることにします。

【ライブラリのインストール】
・この温度センサーを使うには、ライブラリのインストールが必要です。
・Arduino IDE画面最上段メニュー「ツール」→「ライブラリを管理」を選ぶと、左カラムにライブラリマネージャーが現れます。そのタイトルの直ぐ下に検索欄があるので「ADT7410」と入力します。「Adafruit ADT7410 Library」というライブラリがヒットするので、それを「インストール」します。窓「ライブラリの依存関係をインストール」が表示されるので、「全てをインストール」をクリックします。出力画面に「インストールは成功しました。」という言葉が一瞬表示されます。

【スケッチ】
Arduino IDEのスケッチ画面に以下のスケッチを書きます。
ヒーターをつなぐ(その3)のスケッチに、「コメント付き行」を追加します。

// 最初の宣言です
#include <Wire.h>  //I2C通信のライブラリ(忘れていました。でもLCDは動いた?)
#include <Adafruit_ADT7410.h>  // ADT7410のライブラリ読み込み
Adafruit_ADT7410 Temp1 = Adafruit_ADT7410();  // ADT温度センサーをTemp1と名付けます
#include <LiquidCrystal_I2C.h> 
LiquidCrystal_I2C lcd(0x27,16,2); 
int LED = 3; 
int SSR = 6; 
int Value = 20;  // ヒーターへの出力を少し強めました
float Duty = 0.0; 
 
void setup(void) {
  Serial.begin(9600);
  Wire.begin(); // I2C通信開始(忘れていました。)
  Temp1.begin(0x48);  // アドレスは0x48(デフォルト)
  Temp1.reset();  // ソフトウェア・リセット
  Temp1.setResolution(ADT7410_16BIT);  // 解像度=16bitを設定
  delay(250);  // タイミング調整用?

  lcd.init();
  lcd.backlight();
  pinMode(LED,OUTPUT);
  pinMode(SSR,OUTPUT); 
  // ここにあった「Danger!」表示は削除しました
}
 
void loop(){
  float Cdeg = Temp1.readTempC();  // セ氏で温度(実数)を読み込む
  Serial.println(Cdeg);  // Arduino IDEのシリアルモニタに温度を出力
  analogWrite(LED, Value); 
  analogWrite(SSR,Value); 
  lcd.setCursor(0,1); 
  lcd.print("Duty = "); 
  lcd.setCursor(10,1); 
  Duty = (float)Value * 0.392 + 0.5;
  lcd.print((int)Duty);
  lcd.setCursor(15,1); 
  lcd.print('%'); 
  lcd.setCursor(0,0);  // カーソルを左上に移動
  lcd.print("TempADT= ");  // 温度=
  lcd.print(Cdeg,2);  // Cdeg を小数点2桁で表示
  lcd.setCursor(15,0);  // カーソルを右上に移動
  lcd.print("C");  // セ氏温度の単位表示

  delay(10000);  // 10秒間隔で温度測定・表示
}

【実行】
・スケッチ画面の上段にある「→」アイコンをクリックすると、スケッチのコンパイル(機械語翻訳)が行われ、Arduinoにダウンロードされます。Arduinoは直ちにそれを実行します。
・1602ディスプレイに「TempADT= ◯◯.◯◯ C」と、「Duty ratio = 8 %」という表示が出ましたでしょうか?
・TempADTの値は10秒ごとに変化します。
・Arduino IDEの「シリアルモニタ」(窓右上の虫メガネみたいなのをクリック)で、温度がPCの方にも表示されます。
・ブレッドボード上のLEDが更に明るくなりましたでしょうか?
・お疲れ様です。
・次回はArduinoからmacに送られたデータを元に、温度変化のグラフをPythonで描いてみます。

Arduinoでローストビーフを作る(6)

ヒーターをつなぐ(その3)
液晶ディスプレイ(2行✕16文字)を設置します。

【材料】
・1602LCDディスプレイI2C接続モジュール(秋月)
・ブレッドボードとブレッドボード用ジャンパ線(オス・オス)数本(前回既出)

【つなぎ方】
・LCDモジュールから4本の線が出ています。以下、LCD側の表示とArduino側の接続先を示します。
・GND → GND
・VCC → 5V
・SDA → A4
・SCL → A5
なお、Arduino側のGNDと5Vは他のデバイスでも使うので、ジャンパ線でブレッドボードに取り出し、そこから配線することをお勧めします。
また、I2C接続デバイスにはI2Cアドレスが必要ですが、この液晶ディスプレイはデフォルトアドレス”0x27”を用いることにします。

【ライブラリのインストール】
・この液晶ディスプレイを使うには、ライブラリのインストールが必要です。
・Arduino IDE画面最上段メニュー「ツール」→「ライブラリを管理」を選ぶと、左カラムにライブラリマネージャーが現れます。そのタイトルの直ぐ下に検索欄があるので「LiquidCrystal I2C」と入力します。ヒットした同一名記事の「インストール」をクリックすると、出力画面に「インストールに成功しました。」という言葉が一瞬表示されます。

【スケッチ】
Arduino IDEのスケッチ画面に以下のスケッチを書きます。
ヒーターをつなぐ(その2)のスケッチにコメント付きの行を追加しています。

// 最初の宣言です
#include <LiquidCrystal_I2C.h>  // LCD(ディスプレイ)用のライブラリを読み込む
LiquidCrystal_I2C lcd(0x27,16,2);  // LCDのアドレス、文字数、行数を指定します
int LED = 3;
int SSR = 6;
int Value = 10; // 値を10とします(必ず255以下の整数にしてください)
float Duty = 0.0;  // Dutyという実数変数を設定します
 
void setup(void) {
  Serial.begin(9600);  //シリアル通信初期化
  lcd.init();  // LCDの初期化
  lcd.backlight();  // LCDのバックライトです
  pinMode(LED,OUTPUT); // LEDをつないだ端子のモードは「出力」です
  pinMode(SSR,OUTPUT); // SSRをつないだ端子のモードは「出力」です
  lcd.setCursor(0,0);  // LCDのカーソル位置を左上に
  lcd.print("Danger! HeaterON");  // 警告表示
}
 
void loop(){
  analogWrite(LED, Value);
  analogWrite(SSR,Value);
  lcd.setCursor(0,1);  // LCDのカーソル位置を左下に
  lcd.print("Duty = ");  // PWM のデューティー比のことです 
  lcd.setCursor(12,1);  // カーソル位置指定
  Duty = (float)Value * 0.392 + 0.5;  // Valueを実数に直しDuty比を計算します
  lcd.print((int)Duty);  // Duty比を整数表示します
  lcd.setCursor(15,1);  // カーソル位置指定
  lcd.print('%');  // %はシングルコーテーションで囲まないとエラーになります
}

【実行】
・スケッチ画面の上段にある「→」アイコンをクリックすると、スケッチのコンパイル(機械語翻訳)が行われ、Arduinoにダウンロードされます。Arduinoは直ちにそれを実行します。
・1602ディスプレイに「Danger! Heater ON」と、「Duty ratio = 4%」という表示が出ましたでしょうか?
・ここで言う「Duty ratio(デューティー比)」とは、高速でオン/オフを繰り返して通電量を制御する方法であるPWM(Pulse Width Modulation)において、一定時間内の「オンの数 / (オン+オフの数)✕ 100 (%)(オンの状態の割合)です。
・今回のヒーターは、なぜかデューティー比を上げても、温度の上がり方があまり変わりません。考え中です。

Arduinoでローストビーフを作る(5)

ヒーターをつなぐ(その2)
通電モニタのLEDを取り付けてArduinoを動かしてみます。
最後に写真を添付しています。

【材料】
・LED1個
・抵抗(330Ω)1個
・ブレッドボードとブレッドボード用ジャンパ線(オス・オス)数本(前回既出)

【つなぎ方】
・(その1)でSSRモジュールの3連青からArduinoへの接続を「黒線で『GND』、赤線で『5V』へ」と書きましたが、LEDにも5Vを供給するため、ブレッドボードを利用します。
・ブレッドボードを横長に置いた時、上端と下端に横に赤線と青線が引いてあります。上端の青線端子列は全てつながっています。上端の赤線端子列も全てつながっています。同様に下端の赤線端子列・青線端子列も同じ構造です。ただし、上端の赤線列と下端の赤線列はつながっていません。青線列も同様です。それらより内側の端子は、縦にAからEまで、及びFからJまでつながっています。これらの構造を利用して数少ないArduinoの端子接続を増やすことができます。
・ArduinoのGND端子と、ブレッドボードの任意の青線端子をつなぎます。
・同様にArduinoの5V端子と、ブレッドボードの任意の赤線端子をつなぎます。
・LEDの+極(脚の長い方)は、ブレッドボードを利用してArduinoの「−3」とつなぎ、―(マイナス)極(脚の短い方)は、330Ωの抵抗を介してブレッドボードの任意の青色端子(=ArduinoのGND)につなぎます。

【スケッチ】
Arduino IDEのスケッチ画面に以下のスケッチを書きます。

// 最初の宣言です
int LED = 3; // Arduinoの端子「3」へLED(の+側)をつないでいます
int SSR = 6; // 同じく端子「6」へSSRの白線をつないでいます
int Value = 1; // 値を1とします(必ず255以下の整数にしてください)

void setup(void) {
pinMode(LED,OUTPUT); // LEDをつないだ端子のモードは「出力」です
pinMode(SSR,OUTPUT); // SSRをつないだ端子のモードは「出力」です
}

void loop(){
analogWrite(LED, Value); // LEDへValue値をアナログ出力しなさい
analogWrite(SSR,Value); // SSRへValue値をアナログ出力しなさい
}

【実行】
・スケッチ画面の上段にある「→」アイコンをクリックすると、スケッチのコンパイル(機械語翻訳)が行われ、Arduinoにダウンロードされます。Arduinoは直ちにそれを実行します。
・LEDがほのかに灯り、ヒーターがだんだん熱くなってきて、約60℃に達します。
・実行を止めるには、PCからのUSBを引っこ抜きます。
・次に、スケッチの「int Value = 1」を「int Value = 10」に書き改めて、USBを再び差して、「→」をクリックしてみてください。LEDの灯火がやや大きくなります。
・でも、ヒーターの温まり方が10倍になったかどうか良く分かりません。水を沸かそうとしても水の温度は約60℃止まりです。
・どうなっているのか?どうしたら良いか?考えます。

Arduinoでローストビーフを作る(4)

ヒーターをつなぐ(その1)

【材料】(まだまだ出てきますので、直ぐ買わないでください)
・300Wのニクロム線(ホームセンターで購入)
・ニクロム線を配線する陶器製小皿(百均)
・ニクロム線をクネクネさせる杭用珪藻土プレート(百均)
・ニクロム線と普通のコードを接続する(普通の)端子台(ホームセンター)
・普通のコード数十cm(ホームセンター)
・AC100V用のプラグ、スイッチ、匕ューズケースとヒューズ(250V5A)、電線少々
・ソリッドステートリレーモジュール(シャープのSSR-IC “S108T02″使用、秋月電子)
・ブレッドボードとブレッドボード用オスオスコード数本(秋月電子)(ブレッドボードは後で使用)

【つなぎ方】

・右上のブレッドボードとディスプレイは後で説明します。
・右下の青いのがSSRモジュールです。
 左の3連青はArduinoへつなぎます。
 左から白線で「-6」、黒線で「GND」、赤線で「5V」へ、ブレッドボード用コードでつなぎます。
・右の2連青はAC100Vをつなぎます。ACプラグ、匕ューズ、スイッチ、端子台、ニクロム線をつなぎ、
 スイッチを入れたらここに100Vが流れるようにします。一口コンセントは無視してください。
・珪藻土プレートをノコギリでさいの目切りにして、陶器皿の上に接着剤で貼り付け、ニクロム線を
 クネクネします。線同士が接触してショートしないように注意してください。
・ニクロム線の熱がコードに移らないように端子台を介しています。本当はセラミック製が良いです。

Arduinoでローストビーフを作る(3)

1.Arduinoのセットアップと動作確認(できている人はスキップ・オッケーです)
(1) 解説: ArduinoはPCからUSBで電気が供給されます。PCでプログラミング(スケッチ)し、それを機械語翻訳(コンパイル)してArduinoにダウンロードすると、Arduinoが勝手に動きます。止めるには電気を供給しているUSBケーブルを引っこ抜きます。
(2) 材料
・ PC本体(私の場合はMacBook Air (13-inch, Early 2015, OS:12.7.4)
・ Arduino UNO R3
・ USBケーブル(Arduino側:Type B、PC側:Type A)
(3) 接続
・ USBケーブルでArduino UNOとPC(Mac)をつなぎます。
(4) Arduino開発環境(IDE; Integrated Development Environment)の導入
・Arduino IDEをhttps://www.arduino.cc/en/softwareからダウンロード(要option選択)。Zipファイルです。Safariなら自動的に展開、その他のブラウザでは手動で開きます。下のような窓が出てきたら、左のArduinoのアイコンを右のアプリケーション・フォルダのアイコンにドラッグします。以降、ArduinoIDEというアイコン名で使えます。

(5) Arduinoの動作確認(本体のLチカ)
・Arduino IDEを立ち上げ、画面最上段のメニューから、「ファイル」→「スケッチ例」→「01.Basics」→「Blink」を選ぶと別窓でスケッチ(プログラム)が表示されます。随分長いスケッチですが、必要箇所は、
void setup() {・・・}
void loop() {・・・}
だけです。
・スケッチ窓上段の「→」アイコンをクリックすると、スケッチがコンパイルされArduinoにダウンロードされます。ダウンロードが完了すると、Arduinoは稼働し始め、「L」と表示されているオレンジ色のLEDが1秒毎に点滅を繰り返します。これで動作確認完了です。

次回は、「2.ヒーターをつなぐ」です。

Arduino で ローストビーフを作る(2)

材料:
Arduino UNO
ディスプレイ:LCD1602モジュール
温度センサ:ADT7410モジュール (DS18B20に替えるつもり)
ソリッドステートリレー:S108T02モジュール
ヒーター:300W ニクロム線 1本

スケッチはまた今度。

Arduino で ローストビーフを作る(1)

義母の形見の陶器製低温調理器(1975年製)を魔改造しようとして壊したので、マイクロコンピュータのArduino で後継機を作ることにした。おいしいローストビーフを作るには、58℃を3時間キープしなければいけないらしい。その制御をArduino にさせるつもり。

eラーニング教育論(書きかけ2)

「人を賢くする道具」(ちくま学芸文庫)は450頁超で、なかなか読み進めない。「体験的認知」と「内省的認知」があるんだって。前者はテレビ・コマーシャルでいつも学習させられていること。後者は、「食べたものが血となり肉となる。」過程のようなものらしい。
でも、私の最重要課題は、「モチベーションの持続」なんです。
道具立てがどうであろうと、環境がどうであろうと、先生が居ようが居まいが、「ヤル気」(「点数取りたい」などという貨幣経済理論に毒された気持ちではなく、純粋で強い興味)があれば、イイところまで行けるのではないかと思う。また、
eラーニングが、「ニュートンさんの家庭教師」のような感じだったら、皆んなニュートンのように偉くなれたのではないか?
eラーニングが、「ヘレン・ケラーさんの家庭教師」のような感じだったら、皆んなヘレン・ケラーのように偉くなれたのではないか?
そのようなeラーニングであれば、カエルのケロも、「自来也(じらいや)の大蝦蟇(大ガマ)」のように偉く(?)なれたのではないか? と思う。
さて、まだ情報収集・考察は続く。

eラーニング教育論(書きかけ1)

生命の本質を「増えて遺伝する物理現象」と捉えると、「教育」も、「文化」の継承という意味で「生命の進化」の類推が成り立つかも知れない。生物学的な「遺伝」は、特定の父母の遺伝子の継承である。なお、父母が生殖する前に、生殖細胞の遺伝子の一部が、宇宙線やその他の外因により変異する可能性がある。私たちはそのような遺伝子を受け継ぎ、また子に託す。ただ、継承する遺伝子によらず、遺伝子への「エピジェネティック」な修飾により、当事者には必ずしも継承した遺伝子どおりの発現にはならないこともある。
さて、話を「教育」に戻そう。
「教育」とは? ってやっているとラチがあかないので、やめることにするが、本質は、「教える立場」と「教わる立場」があり、「伝達される内容」と「伝達方法」が在ることに尽きる。
「教わる立場」または「伝達方法」に問題があれば、「伝達される内容」は、良し悪しは別にして段々ジリ貧となり途絶える。
「教わる立場」の者は、かつて(今も)は「みな同じように集団で教わるもの」と思って、学校に通っていた。ただ、学校教育は昔から「(現政権が目論む)富国(強兵)」を目的として、出る釘は潰し、落ちこぼれは陣地の土塁とするような優生学的な淘汰をしてきた。
しかし、新型コロナ禍を契機として「eラーニング」が脚光を浴びてきた。
eラーニングの目指すことは「教わる各個人の能力を効率的かつ最大限に発揮できるような、一人ひとりへの最適教育」ではないかと思う。
でも、そんなことをどうやって実現するの?
色々なLMSを見たけど、いずれも対象者(生徒)への提示は、「説明、テスト、解答、正解であればご褒美、誤答であれば再テスト」のセットだった。
成績や達成度で「ヤル気」を持続できるものであろうか?
それよりも、興味の連続でヤル気が継続するようにできないか?
「日本のオンライン教育最前線」(編集:石戸奈々子、出版:明石書店、2020)と「すぐにできる!双方向オンライン授業」(編集:福村裕史他、出版:化学同人、2020)を読んでも、よく分からない。
「人を賢くする道具-インターフェース・デザインの認知科学-」(著:D.A.ノーマン、監訳:佐伯胖、ちくま学芸文庫、2022)にヒントがあるかもしれない。

興福寺の阿修羅像

40年ぶりだろうか、2024年3月16日、奈良の興福寺国宝館で久しぶりに阿修羅像を拝顔した。
正面のお顔をよく見ると、右の口角が少し上がっているではないか?!
こんなの初めて!! 大発見だ!! まるで不敵に微笑んでいるような感じ。
「阿修羅像」って、「憂いをたたえた凛とした美顔」ではなかったか?
でも、少なくとも眼の前にある阿修羅像は、仏像一般の無難な無表情ではない。
あの微笑みは、ちょっと怖い。そう感じるのは、私のような地獄に落ちる人たちだけなのだろうか?
悪者を懲らしめるだけでなく、普通の人たちもやっつけられそう。
阿修羅像を作った仏師は何を意図したのだろうか?
5分くらい見つめていたけど、分からない。
ネットで調べてみたけど、分からない。

マン・マシンの難しさ

40年ほど前、研究所のシステム開発をしたけど、マン・マシン・インターフェースに手こずった。当時は、「お客様は神様」という呪縛が私のアタマの中にあり、エンドユーザである研究員の文句・要望を聴きながら、できるだけそれらに沿えるように対話画面を設計・構築していた。無理難題に対しては「技術的に無理」と言って勘弁してもらっていた。全員の要望を全部盛り込むことは不可能だった。当時、私の心はボロ雑巾のようになっていた。で、理想的な「モノ」は「人の手に馴染むもの」であり、そのようなソフトを作りたい、と夢見るようになった。
最初は無骨・無粋で痒いところに手が届くシロモノなんだけど、使っているうちにウザいところが消え、無意識に自分の体の一部みたいになっているモノ。そんなマン・マシン・インターフェースができれば良いのになー、っと思っていた。
ところが現在一体どうなっているのか?! いろいろな対話画面があるけど、どれもこれも不親切極まりない。私が生きているうちに何とかしてくれー! 特にJRの新幹線乗換口にあるキカイ。在来線の駅からICOCAで入って別の駅で新幹線に乗ろうとしたら、ICOCAでのぞみ料金が払えない。係員に尋ねると、一旦外に出てからICOCAで新幹線の切符を買ってください、と。だったら、在来線でここまで来た料金はどうなるの?と訊き返すと、それはそれで払ってもらいます、と。バカ言ってんじゃないよ!怒るよ!本当に!

進化=環境変化への適応 2024.02.24

「進化」とは、環境変化に対する生存戦略の最適化適応の連なり、と要約できよう。だから3億年前に出現したゴキブリといえど、現代までにそれなりの進化を経ているはずだ。「進化が止まってゴキブリのままでいる」わけでは決してないだろう。進化の本質は、「不完全なコピーによる遺伝的増殖」である。「ある存在」が在り、それが「自分自身のコピー」を作る性質を持っているとしよう。でもそのコピー作業は必ずしも完璧ではなく、原本とは若干違う写本が出来てしまう。その写本がその時代の環境に合っていなければ死滅するし、適応していれば存続し、適応度がもっと高ければ更に繁茂する可能性が生ずる。
3億年前のゴキブリの形態は、現代のゴキブリとほとんど変わらないと言われている。でも、外観だけ見て「進化が止まっている」、とは決して言えないであろう。代謝、神経系、体の微小な形態等、絶え間なく環境適応のための進化が進んでいたと考えるのが妥当であろう。
翻って、人間って何だろう?どうなるのだろう?
ただ言えるのは、「不完全なコピーによる遺伝的増殖」は、天命ではない。たまたま「そんな物質が出来てしまった」にすぎないことだ。ここから考え始めよう。

表情がこわい 2024.02.21

私は人嫌いです。
他人の1.4リッターの脳が何を考えているのか分からないので、こわいです。
他人の表情やしぐさを見ると不安になります。
幼児の表情は無垢でホッとしますが、それを通り越して、自分がサイテーの人間であって、見てはいけない神々しいものを見たような恥ずかしい気になります。
成人の表情は、バケモノに見えてきます。妻子も友も知人も、通りをすれ違う全くの他人も、表情を見ると怖いです。
他人の顔を見ないようにしても、他人の気配だけで気が安まりません。
私は何だか非常に恥ずかしいことをし続けて永らえてきたような気持ちになってきました。
どうなっちゃったんだろう?
私はちょっと心の暗黒時期に入りかけているみたいです。
しばらく心を閉ざして、この時期が通り過ぎるのを待ちます。
日記や随筆は続けます。

文化の進化(その1の繰り言)

「増えるものたちの進化生物学」では、「生命」の定義を「同じ性質を持つモノの数量が増える物理現象」としている。その物理現象には「環境」が影響する。ある環境では、その環境に対して最適な性質のモノが増えるであろう。環境が変わると、またその新たな環境に適した性質のモノが増える。その連なりが「進化」と呼ばれていて、その末裔の一端が「ヒト」ということになる。
一方、「文化」はどうだろう?
「文化」は物理現象ではなく、担い手とする物理現象(生命)があってこそ成立する。だから、「環境」が影響する。その「環境」は物理的な環境だけではなく、過去から自身が引きずっている「文化」や、外部の「文化」や人為的圧力(戦争など)も包含されている。また、文化の変遷や多様化はあっても、必ずしも「増えて蔓延する」というわけでもない。そこが「生命」とはちがう。
科学技術的文化に関しては、以前、台湾の故宮博物院で秦時代の弩弓(クロスボウ)の「引き金(トリガー)」モジュールの出土品を見たが、16世紀の火縄銃のトリガーよりももっと精巧にできているようなのには本当に驚嘆した。2000年近く経過していても全然進歩していないじゃん!と思った。
人文科学的文化は紙と筆で出来るので、もっと変遷・多様化が多いのではないだろうか? でも「進化」と言えるのかどうか?

文化の進化

「増えるものたちの進化生物学」では、生命の本質を「増えて遺伝する物理現象」と捉えている。更に、「文化」も「遺伝する情報」と考えている。それで、「文化の進化」もあるわけだけど、併読した「絵でわかるカンブリア爆発」では、捕食者と被捕食者の著しい軍拡競争によって、爆発的に多様な形態が現れたそうだ。それが「進化」と言えるのかどうか知らんけど、「遺伝する情報」も単に継承されるだけでなく、複数の文化が互いに競り合って変化して来たということになる。ただ、「文化」における「捕食者と被補足者」のような関係は、「情報」の良し悪しではなく、それを担っている生体の強弱や戦闘的優劣によって定まるのであろう。なお、「文化」が「生命」と違うのは、後者が「増える」という本質を抱えていることに対し、前者は必ずしもそれを持っていないことだと思う。それにしても「文化」は今や多様を極めて併存しているし、他方、テクノロジーの進歩で画一的になりつつあるとも感じられる。また、最近ではフェイクも多く、何が何だか分からない様相を呈している。翻って私はと言うと、老化のせいか無感動・無関心になりつつある。これから先、一体どうなることか?

「絵でわかるカンブリア爆発」

という本(更科功著、講談社)を読んでいる。地球が出来てから約46億年だけど、カンブリア期というのは古生代で、5億2900万年前から1500万年続いた期間。考古学的に多様な形態の「動物」が一斉に出現したので「爆発」と呼ばれている。しかし、DNAレベルではその1億年前あたりから多様性が蓄積されていたという。じゃあなぜ「爆発」なのか? それは「捕食者」の出現だそうだ。それまでの動物はすべて、植物や水中・水底に漂っている非生物を摂取しながら穏やかに生きていたけど、ある時、「生きている動物」を摂取する「プレデター」が初めて出現したそうな。喰われる者は防御に勤しみ、喰う者は更に破壊力を増し、被捕食者と捕食者が軍拡競争に陥り、動物形態多様性発現の「爆発」となったんだって。
市橋さんの「増えるものたちの進化生物学」の「増えて遺伝するもの」という執着と考え合わせると、「動物の業」って何だかいやだなーと思う。

第1章 なぜ生きているのか?

著者の市橋さん曰く、「この世界には極めてまれに、増えて遺伝する性質を持つ物質、あるいは物質の集まりが出現します。そのような存在は、増えるにしたがって自らの増える能力を強化させていくことができます。これが『進化』と呼ばれる現象です。・・・私たち生物は『増えて遺伝するもの』がもたらしたひとつの物理現象です。・・・人間もその末裔です。」と。したがって、この本はマクロな「物理現象」を論じたものであり、「私はなぜ生きるのか?」という1.4リッターだけどマジな問のこたえには必ずしも貢献しないであろうと予測できるが、まあ、参考になるかもしれないので読み進んでみよう。

すべての生命は物理現象

ちくまプリマー新書「増えるものたちの進化生物学」(市橋伯一著)を読んだ。「生命とは『増えて遺伝する』物理現象であり、人間はその末裔である。」、「人間の業もその物理現象に由来する。」、「生きていることに目的や使命はない。」とのこと。もっと解説したい。乞うご期待。

気の迷い

たった1.4リッターのちっぽけなアタマは弱いもので、クスリでいかような気分にでもなれるらしい。
気分がすぐれないなら、心療内科へ行って何か処方してもらうのが良い。ベンゾジアゼピン系の抗不安薬でダメなら、「選択的セロトニン再取込み阻害剤(略して”SSRI”)」が良いと思う。
ある研究者はうつ病について、「遺伝的素質より、発症までの環境・経験などによる『脳細胞DNAのメチル化』が大きな要因ではないか」という研究をしている。それが正しいなら、「DNAの『脱メチル化』をすれば、うつ病が治る」ということになる。
私は「レクサプロ」というSSRIを服用して10年近くなる。大学病院からかかりつけ医にバトンタッチされても、処方は継続されている。服用をやめたらどうなるか不安なので自ら止める申し出もしない。
であればずーっと正常か?と言うわけでもない。波がある。大抵の波は日常生活に紛れてうっちゃれる。そうでない場合がたまに訪れ、文字通り布団をかぶって寝込む。自分では「冬眠」と言っている。冬眠してヤバい気持ちが通り過ぎるのを待つ。2〜3週間かかる。
気分が晴れても「躁状態」になるわけではない。外に出て陽にあたりたくなる。日常に戻る。



2024年の抱負ってゆーか

新しい年を迎え、自分のライフプランを思い直してみた。
かつては、「65歳までに仕事を終え、70歳までに好きなことをし、75歳までに旅行をしまくり、75歳になったら別世界へ行こう。」と思っていた。
今、何を思う?
母親が長生きをしてくれたことと、新型コロナで旅行へ行けなくなったために、好きなこともできていないし、旅行もしまくってはいない。
そもそも、まだ「旅行の楽しみ」が解らない。何が楽しいんだろう?
どこへ行っても日常の意識が付き纏って吹っ切れない。
「盆も正月もない毎日闘争と心得よ(日常闘争)」のトラウマ?
「盆も正月もない」って言うのは、特別な儀礼をせずに済むってーことなので大賛成なんだけどなー。
とにかく、過去はご破算にして今後はどうしよう?
1.孫娘が可愛いので、75歳で別世界へ行くのはやめて、80歳に変更しよう。その時、孫娘は12歳。
2.基本的には相棒の要望どおりに旅行に行こう。プラス、身勝手な小旅行をしよう。例えば四国八十八ヶ所バイクでお遍路+石鎚山登頂。旧友と奈良散策。他。
3.好きなこと?やりたいこと? 何だったっけ? 
(1)オリジナルの紙飛行機を全世界に普及させること。(空力抵抗がありそうなので若干弱腰)
また、その紙飛行機をスケールアップしてラジコン機を作り、トンビのように上昇気流で自動飛翔させること。
(2−1)多くの演歌のメロディーを取り込んで自動「演歌」生成装置を作ること。(AIだね。)
(2−2)多くのモーツアルトのメロディーを取り込んで自動「モーツアルト曲」生成装置を作ること。
(3)多様性への寛容。(まだ寛容できていない。死ぬ前に達成したい。)
(4)生きる価値のさとり。(別世界へ行きたいと思う気持ちが薄らぐかもしれない。)

いずれも、しらんけど。
てゆーか、せいぜい1.4リッターの脳内の妄想だけど。

AIにできないことってないかな? その2 遺伝

市橋伯一さんは「生物の本質は遺伝と増殖」と言っている。生存する環境が変化したとき、生物は「いい加減な遺伝」によって生じた「たまたま環境変化に適応できる増殖体」が淘汰から免れ、生き延び、こんにちに至っている。AI はどうであろうか? AI にとって「環境の変化」とはどんなものだろう? 例えば「ハードウェアに供給される電力が不安定になった」あるいは「電圧が段々下がってきた」のような事態に対して、AI が採る対応は、「電源の安定化」や「定常電圧の確保」と言ったハード的対策ではないだろうか? 人類も「寒くなったら凍死しないようにセーターを着る」であろう。でも一般的な生物はセーターもダウンジャケットも持ち合わせていず、ホッキョクグマやオットセイのように裸でも寒さに耐えることができる者たちが生き延びる。このような「遺伝的変化」はAI にとっては「コード(プログラム)の変化」であって、AI には無理ではないだろうか? 人類も環境変化に対してそれに順応する進化よりも自分の周りの環境変化をなくす方向の対策を採ってきた。その先の限界を感じる。
あ、それからもうひとつ。
環境変化を生き延びた生物たちは、それなりの適応のひとつとして、「環境変化に対する鈍感さ」もDNAの変異で獲得していたのではないだろうか?
これは正論であろうか? 知らんけど。

AI にできないことってないかな? その1 ピカ新

AI には「芸術品や装飾品の価値」が理解できるだろうか? 生成AIの本質である「帰納的理解」で、AI は分かったように振る舞い、これまでの知識の寄せ集めで新作を作ることはできるだろうけど、全くの創作はまだ無理だろうな。
AI に期待することは、「芸術品や装飾品や儀礼や『しきたり』の価値」に対して「何やこんなモンありがたがって、アホちゃうか?」と、「童話『裸の王様』の最後に登場する少年」のような指摘を全人類に対してしてもらうこと。
「既得権益的価値への疑問提起」。デキルカナ〜?

鳶を眺める

久しぶりに思索した。(クマのプーさん程度だけど)
青空に鳶がクルリと輪をかくのを眺めた。
それで気がついた。私は「単に、鳶が滑空する姿を気持ち良く感じている」のだろうか?
それとも、「自分も空を飛びたい」と思っているのだろうか?
正直言って、概ね前者であるらしい。
要するに、「自分で飛ぶより、飛んでいるのを眺めるのが好き」だ。
これは自分が臆病・いくじなしだからかな?
これは基本的な性格の一つの傾向のような気がする。
音楽を聴くのは好きだけど、自ら奏でるのはちょっとね、とか、
絵画を見るのは好きだけど、自らえがくのはちょっとね、などと同じパターンかな?
それは「やる気なさ」や「才能なし」とはちょっと違うと思う。
見ただけで、あるいは聴いただけで心地よく感じる、ということはそれだけ楽しみが多いわけだから、非常に良いことではないかと、改めて思う。
紙ヒコーキを飛ばそうとしているのも、飛んでいる姿を見たいだけ。
でも、もっと長く滑空して欲しい。
それからモノ作りが始まっている。

AI はきらいです。

孫娘に送った九九暗唱シートはどうなったかな?まあいいや。
さて、小林秀雄の「考えるヒント」の冒頭の「常識」を読んだ。「人工頭脳」のことが書いてある。50年以上経っても相変わらず何が言いたいのやら意味不明。おぼろげながら感じるのは、小林氏は「科学は演繹である。人工知能は結局決まったルールからの演繹で結果を出すしかできない。」と思っているようだ。
ほぼ同時に、日経サイエンス2023年10月号の「大規模言語モデル – 科学を変えるAI – 」を読んだ。人工知能分野で、何をもって「大規模言語モデル」と称しているのかが書いてあった。由来は「自然言語処理」にあるようだ。入力(ネットで自動的に収集)されたテキストを単語に分解し、各単語それぞれに「数千億パラメータ」(パラメータは学習によって自動的に増える)のベクトルを与える。一つの単語のパラメータ値は、そのテキスト(段落を跨ぐことも可)内に出てくる他の単語との遠近性により数値が決まるらしい。どこかで既出の単語なら、その単語が既に持っていたパラメータ値が微調整される。そのようにして、Wikipedia とかその他のネット上の膨大なテキストを勉強して AI は偉くなっている、と。だから「大規模言語モデル」って言うんだって。
ということは、今の ChatGPT なんかの AI は、これまでの人類の叡智(ネット上にテキストとして存在する)の集大成でもって、質問に答えてくれている、ということになろうか。
でも、日経サイエンスにはもっとスゴイことが書いてあって、「AI の学習がある段階を越えると、いきなり格段に賢くなって、(開発者には予想できない)突拍子もない独創的な意見を言うようになる。」そうだ。
ああ恐ろしや。

孫娘への贈り物

「九九を覚えるシート」が完成した。2のだんから9のだんまで各だんごとに、少々破れないように厚手のA4ケント紙にプリントアウトした。裏側が真っ白なのが気になる。何かトランプの裏模様のような絵柄を入れた方が良かったかな? 疲れたのでやめた。明日、郵送しよう。息子夫婦は「時期尚早」として却下するかもしれない。孫娘にしても、2歳の誕生日にフェルトで自作したサイコロをプレゼントしたけど、今ではガラクタおもちゃ箱の隅の方に冬眠しているみたい。今回の九九シートもお蔵入りかな?

初めての算数

地獄からワープして、近所のオジサンの話を聴いた。「小中学生向けの算数・数学オンライン授業」をしたいとのこと。それで、5歳の私の孫娘のことを思った。口は達者だけど、落ち着きがない。どうなることか。
小学校に入る前に、九九を覚えさせたい。
「ににんがし」(以下同文)を覚えるシートを独自開発中。
「じいじ、きらい!」と言われないようにしたいけど。

六道から「解脱」へのトランスワープ

人間道(現世)からでも地獄道でも、そこからワープ(おさらば)したら、その他の五道のどこかに生まれ変わって、そこでもまたひたすら生活しなければならない。そんな人生を無限に送りたいと思う流浪好きのSM人間がいても否定はしないが、私は目まぐるしいのよりは「永遠の安寧」を得たい。そのためにはどうすればよいか?
教えによると、仏教が理解できるのは「人間道」に居る時だけだって。その他の道(界)では必死に何かやっていて(例えば地獄道では、煮たり焼いたりミンチにされたりして、常に痛がって苦しむ)、考えることすらできない。誰かが何かを教えてくれることもない。
「人間道」で「仏の教え」を学び実践して、さて「解脱」となるには、どういうことが起きるんだろう?
まず、その人が「解脱した!」と、誰が判断するのだろうか?「天網恢恢疎にして漏らさず(てんもうかいかいそにしてもらさず)」の仏さんかな、やっぱり?
それでまた、「解脱の世界」へワープする方法は、通常のワープ航法と違わなきゃ、「解脱」も「第七道」になってしまうので、もっとすごいワープ技術が使われているに違いない。
西暦24世紀の「スタートレック」が活躍する時空では、通常のワープを遥かに凌駕する「トランスワープドライブ」という新技術をいまだに開発中と聞くけど、仏さんの世界では既に開発済み・実用使用中なんだな、これは。「解脱」したら、結局「人間道」から「トランスワープ」(形態は「おさらば」)しなければならないんだね、やっぱり。
で、「永遠の安寧」状態になるって、こう言う寸法なんだな。

地獄からのワープ

少なくとも1兆6千億年の刑期を終えて「地獄」からワープ(おさらば)する先は、餓鬼道・畜生道・修羅道・人間道・天上道の5つのうちのどれかとなっており、これらは地獄道と合わせて「六道」と呼ばれる世界なんだって。人は「おさらばする前の世界」の因果応報により、死後もこの六道を輪廻転生するそうな。悦楽の「天上道」というところも「永遠の安寧」の世界ではなく、年老いて死んで、またどこかに輪廻転生するんだって。目まぐるしいなあー。うざいなー。何とか成らんのかねー?
本当の「永遠の安寧」を得る唯一の方法は、「解脱」なんだって。
「解脱」するにはどうしたらいいの? それには「仏の教え(=仏教)」を修得しなければならないって。
それができるのは、学ぶことができる「人間道」の世界に居るときだけなんだそうな。なるほど、やっと分かった。「地獄道」は痛めつけられるだけで、もともと「改心して仏性に近づく世界」ではなかったんだ。

地獄への道のり その6「三途の川」のあっち側。(おわり)

「等活地獄」より下の階は7つもあって、罪深い亡者ほど下の階に連れて行かれて、よりひどい折檻(例えば、逆さにされ肛門から溶けた銅を流し込まれる、など)をされるそうだけど、どこもみな同じように「地獄は亡者の肉体を痛めつけるだけで、考察・反省・改心させる場ではない。」という本質が分かったので、地獄に関する興味が失せた。刑期は「等活地獄」が最短で1兆6千億年だそうな。150億年前の「宇宙のはじまり(ビッグバン)」よりもっと前だな、これは。他は推して知るべし。
以上、地獄はおしまい。 あれ? 「閻魔大王」は出てこないの? もう、どうでも良い。
刑期を終えると、ワープする。どこへ? 次回、乞うご期待。

地獄への道のり その5「三途の川」のあっち側。(地下1階②)

「地獄」には長期間に及ぶ刑期はあるが、反省や改心の機会はないらしい。亡者はただただ獄卒に煮たり焼いたりミンチにされたりしても、休むことなく再び生き返って(?)また苦痛を味わうことになっている。刑期が終われば、「輪廻転生」ということで「別界」(別世界)へワープする。(ワルはワルのままか?)
亡者はどこの階の地獄でも獄卒にいたぶられることになっているが、唯一「等活地獄」では、獄卒ではなく亡者同士が、相手が白骨化するまで戦いをさせられる、という説もある。もちろん骨と化しても、また生き返って亡者同士(同じ相手かどうか知らんけど)の戦いが続くそうな。
なお、各階の地獄にはエレベータの扉があるメインホールの他に「十六小地獄」と呼ばれるテーマランドがあり、それぞれ亡者の嗜好に応じて趣向を凝らした「お仕置き」が待っているらしい。

地獄への道のり その4「三途の川」のあっち側。(地下1階①)

とにかく、やっとのことで三途の川を渡ると、一説によると、そこには「どこでもドア」みたいなエレベータがあるそうな。
もちろん、地階行きしかない。しばらく粘土層を下って、地下8階建になっている。現世での罪の深さに相関して、各階で降ろされる。
地下1階は「等活(とうかつ)地獄」と言って、「一番軽い罪の『殺生(せっしょう)の罪』を犯した者」が降ろされる。仏教の罪の中で最も重いのが「殺生」だって(何か矛盾しているような?)。とにかく「命あるもの」を殺しちゃいけないってんで、台所にゴキブリが出て、母ちゃんが「キャーッ! ゴキブリ! 殺してー!」と叫んで、父ちゃんがスリッパで叩き殺すと、父ちゃんは「自ら殺す」罪となり、母ちゃんは「他人に殺させた」罪となる。それを見て喜んだボクは「随喜同業」の罪となり、一家そろって「殺生罪」で、皆地獄に堕ちるんだって。トンカツを食べる人や養豚業・精肉業はもとより、ベジタリアンも、葉っぱにつくイモムシを殺した農家から仕入れた野菜を食べるので、「殺生罪」は免れない。
なーんだ、みんな「等活地獄」へ堕ちるんじゃないか!

地獄への道のり その3「三途の川」のこっち側(続き)

一説によると、「三途の川」の渡り場の手前に「衣領樹(いりょうじゅ)」という樹があり、その木陰で「おじいさんとおばあさん」が待ち構えているそうな。おばあさんは「脱衣婆(だつえば)」といって立膝座り(韓国セレブの座り方)で亡者を恫喝して身ぐるみ裸にする係、おじいさんは「懸衣翁(けんえおう)」といって脱がせた衣服を衣領樹の枝に引っ掛けて干す係だと。収奪され浄化された衣服は、乾いた洗濯物を取り入れるようにおばあさんが集め、現世の貧しい人たちに再配分するんだって。
また一説によると、「早死は親不孝」という考え方から、幼くして死んだ子どもたちが集うコミュニティ「賽の河原」が三途の川のこっち側にあるそうな。そこには「ワルイほう」の獄卒と「イイほう」の地蔵菩薩がいる。子どもたちは怖い獄卒に四六時中いじめられながら、罪滅ぼしのために河原の石で仏塔を作って救済を祈るんだけど、獄卒は「オメーたちが作る塔は歪んでて見苦しいわい!こんなのじゃ屁の足しにもなるかい!作り直してまた拝めや!」と言って、持っていた鉄杖で塔をことごとく打ち壊すんだって。子どもたちは泣く泣くまた石を拾っては塔を作るのを繰り返さなければならないそうな。地蔵菩薩さんはその中の「良い子」を見つけては極楽へ瞬間移動させているらしい。親たちがする供養がその支援になるとか。

地獄への道のり その2「三途の川」のこっち側

三途の川を渡るには、名前のとおり3つのルートがあるそうな。善人(あれ?直に極楽へ行かなかったの?こんなところに来るの?)は、金ピカの橋を渡れる。普通の人々は、膝くらいまでの深さのところを歩いて渡る。悪人は激流の中を渡らなくてはならない。そこでは大蛇が噛みつき、巨岩が流れ落ちてきて体を砕き、もがき苦しまなくてはならない。沈めば大蛇に食べられ、浮かべばバケモノが弓で襲う。死んではまた生き返り、この責め苦を7日7晩受けてやっと向こう岸にたどり着ける、と。
別の説話が興味深い。
こっち側の川岸で、男が女を待っているそうな。死んだ女がやって来ると、初体験した男が声をかけてくる。
「かのじょーっ。 覚えているかい? オレだよ。」、「手を引いて、川を渡してあげるよ。」
なんなんだろう? これは?


地獄への道のり その1「死の山」

大抵の人は、死んだら地獄に堕ちる。
じゃあなくて、まず、八百里(3200km;日本列島全長程度)もある「死の山」を、獄卒(地獄のチンピラ役人)に追い立てられながら越えなくてはならない。
山は単鋒か連山か知らないけど、急峻で息も絶え絶え、岩角で裸足は痛いし、山風がビュービュー吹き下ろして凍えるように寒いらしい。
急かす獄卒に鉄棒で殴り殺されても(?)、また生き返って(?)つらい目に遭いながら歩き続けなければならない。
歩くスピードを八里(32km)/日とすると、約100日かかる。
死の山を越すと、「三途の川」のほとりにたどり着く。

はじめに

ホモ・サピエンスの脳容積は平均で1350mLらしい。それを「1.4リッター」としておく。
Googleで「1.4L」を検索すると、オートバイばかりが出てくる。
「人生=オートバイ」か? それも良い。
老いの繰り言になるかもしれないけど、「1.4リッターの妄想」というエッセイを始める。