庭に勝手に生えた朝顔

こいつら、小学校の夏休み課題のお陰で葉っぱを覚えられているおかげで、

抜かれることは少ないのは、進化上有意だw

普通は、妙なツル草をはびこらすと面倒なので、速攻抜くのだ。

庭の緑化運動を始めてかれこれ11年。

当初は植物に寛容で可哀想なので何でも抜かなっかったが、最近は容赦しない。

甘い顔をすればはびこって、あとで泣きを見させられるのだ。

 

最近、レモンの枝芽吹きがすごくて、毎日何本か芽を摘んでいる。

ほうっておくと1ヶ月で1m程度徒長するので要注意

毎日30度超えが続いている。どうにかしろよと思う。

 

Googleのバカカメラがゲスすぎて、棄てた。撮ったふりして消しやがる。

代わりに入れたのは「シンプルなカメラ」と言うやつ。

課金もあるらしいが、どうなんかな。

 

で、やっと歯医者の話。

3ヶ月ほど前に右下の歯に引っ付いたグミの甘さが気が狂うほどシミた。

3週間ほど前から左奥歯が噛むと痛くて、今もまだ違和感

しょうがないので、イヤイヤやっと歯医者へ。

本日は歯科検診枠でチェックだけ。来週レントゲン撮って穴掘り状態を判断。

左上はそこそこの穴が開いてるらしい。

右も詰め物に隙間があって侵食されているとか。

軽ければ数回の通院でOKらしいが、長いと10月の車泊旅との兼ね合いが問題になりそう。

先生が若返ってた。かつてのセンセ引退したんかなぁ?

受付事務のオネーサンは新人らしく、要領悪すぎ。

 

JS勉強を開始したが、目が見えないんで辛い。

もうリアル本はダメだ。Surfaceの文字なんて豆粒レベル。どうしてもデスクトップ大画面じゃないと効率が上がらんのだ。

情けないねぇ

 

 

 

左の本ボツボツとお勉強開始した。

ボタンを押すとボタン名がカウントアップするっていうだけなんだが・・・

 

IDEじゃないんで結構面倒くさいねぇ

高齢者特有の打ち間違いが多いので、メモ帳は止めて早速VSCに切り替えました。

コード補完がなければ文法エラー多発し、意味わからんから全然進まん。

まるで50年前のN-BASIC時代に逆戻りした感じw

まあ、独習初回なのでそんなもんでしょう。

 

【Chapter4:関数の使用とオブジェクトの内容を変更する】

・名前「cntBtm」Buttonを生成し、クリックされたら関数onBtn()をCallする
・Scriptはhead/bodyどちらにあっても良い

・DOM内を参照する変数btnを作成
・参照先のvalue(buttonFace)を操作

<html>
<head>
<title>Lesson 3</title>
</head>
<body>
  <input type="button" id="cntBtn" value="カウントボタン 0" onclick="onBtn()">
  <script>  
     var cnt = 0;
     var btn = document.getElementById("cntBtn"); 
     function onBtn(){
      cnt++;
      btn.value = "カウントボタン " + cnt;  
    }
  </script>
</body>
</html>

 

【Chapter:4 自身の内包するHTMLをプログラムから書き換える】

idだけを持つ<div></div>の内容を生成する。

・ボタンを3個並べ、クリックされたら

 function changePic()を引数にファイル名を入れてCall

・受け取ったfunctionは、ファイル名を合成した<img・・>タグを作成

・変数「pDiv」に空のDivへのポインタを得て

・(空の)<div>の要素htmlを<img>タグで書き換える。

 結果、無かったimgタグが生まれ、指定したファイルが描画される

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Lesson3</title>
</head>
<body>
  <input type="button" value="pic1" onclick="changePic('pic1.jpg')">
  <input type="button" value="pic2" onclick="changePic('pic2.jpg')">
  <input type="button" value="pic3" onclick="changePic('pic3.jpg')">

  <div id="picdiv"></div>  
  
  <script>
    function changePic(filename){
      var pDiv = document.getElementById("picdiv");
      pDiv.innerHTML = "<img src=" + filename + ">";
    }
  </script>
</body>
</html>

 

 

サイバーパンク熱に浮かされて8月22日、OLEDにリサージュを描かせてみた。

毎回のことだけど、OLEDを固定するのに苦労する。
本体がチョー軽いので接続ケーブルのねじれに引きずり回される。

いつまでも机の上で主張し続けるのに耐えられず台座を創ろうとした。

thingiverse眺めるもなかなか実験用に適した台座がない。こんなの

Macintoshi型のはなかなか可愛い(日本製だったw)

3Dプリンタで創ろうかと思ったが、どっちにせよ設計しないとCAD設計もできない。

まずは紙工作になって、そこそこ使えるから、結局このまま運用で十分・・

いつものコース。紙工作は余りにも短時間で完成・効率的過ぎなのだよ。

紙はamazonでもらった何かの箱で固くてしっかりした箱。

こういう用途のために常時何種類かを在庫させてる。

ケーブルを台座に固定する部分。ここは力がかかるので構造がムズい。

しかも時折外すこともある。こういう時は剥離可能なテープで固定。これで十分。

3Dプリンタでこういう箇所を作り込むってかなり試行錯誤。

紙なら切って貼って簡単に試せる。

本日もダンボール工作の勝利でした。

実戦配置ではちゃんとしたケースを印刷しないとよくないけど、実験レベルではこれで必要十分です。

 

【以前の記事】

OLED[SSD1306]のArduino接続記事 こちら こちら

micro:bit接続は こちら

 

【単純8の字1個デモ】

//==================================================
// Ver1.00
// SSD1315 OLED リサージュデモ
// U8g2ライブラリ使用
//==================================================

#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>
#include <math.h>

// SSD1315(動かなければSSD1306版へ変更)
U8G2_SSD1312_128X64_NONAME_F_HW_I2C
  u8g2(U8G2_R0, U8X8_PIN_NONE);
const int CX = 64;
const int CY = 32;
const int RX = 61;
const int RY = 29;

float phase = 0.0;

void setup() {
  u8g2.begin();
  u8g2.print("Hello World!");
  delay(2000);
}

void loop() {

  u8g2.clearBuffer();

  const int POINTS = 180;

  int px = 0;
  int py = 0;

  for (int i = 0; i <= POINTS; i++) {

    float t = TWO_PI * i / POINTS;

    // 8の字(1:2)
    float x = sin(t);
    float y = sin(2 * t + phase);

    // 全画面へ拡大
    int sx = CX + x * RX;
    int sy = CY + y * RY;

    if (i > 0)
      u8g2.drawLine(px, py, sx, sy);

    px = sx;
    py = sy;
  }

  u8g2.sendBuffer();

  phase += 0.20;      // 回転速度 org:0.03

  delay(25);
}

 

【7種類のデモ】

//==================================================
// リサージュ図形デモ
// Ver1.10
// 2026/8/22
// Arduino UNO
// SSD1315 OLED 128x64
// U8g2ライブラリ
//
// 3.3V/GNDへ接続 
// A4 へ SCK (オレンジ)
// A5 へ 黄色(SDA)
// 10秒ごとに7種のリサージュパターンを自動切替
//==================================================

#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>
#include <math.h>

//--------------------------------------------------
// OLED
//--------------------------------------------------
// 実機はSSD1315だが、U8g2ではSSD1312ドライバを使用
//--------------------------------------------------

U8G2_SSD1312_128X64_NONAME_F_HW_I2C
  u8g2(U8G2_R0, U8X8_PIN_NONE);


//--------------------------------------------------
// 画面サイズ
//--------------------------------------------------

const int CX = 64;
const int CY = 32;

const int RX = 61;
const int RY = 29;


//--------------------------------------------------
// アニメーション
//--------------------------------------------------

float phase = 0.0;

const unsigned long PATTERN_TIME = 10000;

unsigned long patternStart = 0;

int pattern = 0;

const int PATTERN_COUNT = 7;


//--------------------------------------------------
// 描画点数
//--------------------------------------------------

const int POINTS = 180;


//==================================================
// setup
//==================================================

void setup() {

  u8g2.begin();

  patternStart = millis();
}


//==================================================
// loop
//==================================================

void loop() {

  //------------------------------------------------
  // 10秒ごとにパターン変更
  //------------------------------------------------

  if (millis() - patternStart >= PATTERN_TIME) {

    pattern++;

    if (pattern >= PATTERN_COUNT) {
      pattern = 0;
    }

    patternStart = millis();
  }


  //------------------------------------------------
  // OLEDバッファをクリア
  //------------------------------------------------

  u8g2.clearBuffer();


  //------------------------------------------------
  // リサージュ描画
  //------------------------------------------------

  int px = 0;
  int py = 0;

  for (int i = 0; i <= POINTS; i++) {

    float t = TWO_PI * i / POINTS;

    float x;
    float y;


    //------------------------------------------------
    // パターン選択
    //------------------------------------------------

    switch (pattern) {


      //------------------------------------------------
      // 0 : 8の字
      //------------------------------------------------

      case 0:

        x = sin(t);

        y = sin(2.0 * t + phase);

        break;


      //------------------------------------------------
      // 1 : 楕円
      //------------------------------------------------

      case 1:

        x = sin(t);

        y = 0.65 * sin(t + phase);

        break;


      //------------------------------------------------
      // 2 : 円
      //------------------------------------------------

      case 2:

        x = sin(t);

        y = sin(t + phase);

        break;


      //------------------------------------------------
      // 3 : 3:2
      //------------------------------------------------

      case 3:

        x = sin(3.0 * t);

        y = sin(2.0 * t + phase);

        break;


      //------------------------------------------------
      // 4 : 4:3
      //------------------------------------------------

      case 4:

        x = sin(4.0 * t);

        y = sin(3.0 * t + phase);

        break;


      //------------------------------------------------
      // 5 : 5:4
      //------------------------------------------------

      case 5:

        x = sin(5.0 * t);

        y = sin(4.0 * t + phase);

        break;


      //------------------------------------------------
      // 6 : 花形
      //------------------------------------------------

      case 6:

        x = sin(5.0 * t);

        y = sin(6.0 * t + phase);

        break;
    }


    //------------------------------------------------
    // OLED座標へ変換
    //------------------------------------------------

    int sx = CX + x * RX;
    int sy = CY + y * RY;


    //------------------------------------------------
    // 線を描く
    //------------------------------------------------

    if (i > 0) {

      u8g2.drawLine(
        px,
        py,
        sx,
        sy
      );
    }


    px = sx;
    py = sy;
  }


  //------------------------------------------------
  // OLEDへ転送
  //------------------------------------------------

  u8g2.sendBuffer();


  //------------------------------------------------
  // 位相を進める
  //------------------------------------------------

  phase += 0.20;


  //------------------------------------------------
  // 表示速度
  //------------------------------------------------

  delay(25);
}

本日の成果

 ・ブレッドボードに乗ってるMP3サウンド基板 [JQ6500] を、

 ・micro:bitにシリアル接続(9600bps)し、

 ・格納ファイル番号でMP3ファイルを演奏させた。

 ・A+Bボタンで演奏途中でも停止させることも出来るようになった(昨年はムリ)

 ・プログラムは こちら

 ・番号指定で再生するプログラムは こちら

  Aでーー、Bで++、A+B送信、ロゴ長タッチで順番演奏

 

先に作成したGPT対話のメモ記事を元に、回路を作リ直して

micro:bit側の送信をP12、受信をP2 にして演奏させてみた。

一発で動きました。感動するとともにGPT頼りになるなぁと改めて見直した1日でした。

次の写真が 昨年の苦労の成果 。その差歴然

昨年はまだChatGPTで ここまでは実現できなかった。

AIすごい進化です。

 

ところで、GPTがまたまた宿題を出してきた

Busy端子をmicro:bitの入力ピンへ繋ぐと、
 「音が鳴り終わったら次の演出へ」

ができる。

例えば、
 1 「ゲームスタート!」音声。
 2 BUSYがOFFになる。
 3 その瞬間にターゲットが動き出す。

という、ゲームセンターっぽい演出が作れる。

駅の自動アナウンスとかに使うと、ますますウケ狙いが可能になるw

 

ただし、レベルシフタあるいは次のような分圧回路があったほうが吉

JQ6500 BUSY ──10kΩ──┬──→ micro:bit P8
                    │
                  20kΩ
                    │
                   GND

GPT君、この件を言い忘れていたようだ。アブねぇ

 

ところで、

※この基盤内臓のプログラムは、PC側に複写しプロパティから「Win7互換モード」設定にしたら、動き出した。

なお、書き込みボタンを押して数十秒してからプログレスバーが伸びだすので、ゆっくり待ちましょう

なので、以前のWin7機導入は不要です。

海外からアプデされたExeを入手するまでもなかった。

JQ6500_English_MusicDownload_V1_2a.zip)

 

ソース

// JQ6500 サウンド基板制御 2026/8/23
// 
// micro:bit
// 
// Pin1(TX) をJQ6500の RX へ
// 
// Pin2(RX) をJQ6500の TX へ
// 
// クロス接続する。
input.onButtonPressed(Button.A, function () {
    演奏(1)
    basic.showNumber(1)
})
input.onButtonPressed(Button.AB, function () {
    JQ6500.stop()
basic.showIcon(IconNames.No)
})
input.onButtonPressed(Button.B, function () {
    演奏(3)
    basic.showNumber(3)
})
function 演奏 (曲番号: number) {
    JQ6500.playFile(曲番号)
}
/**
 * // JQ6500 サウンド基板制御 2026/8/23
 * 
 * // 
 * 
 * // micro:bit
 * 
 * // 
 * 
 * // Pin12 をJQ6500の RX へ
 * 
 * // 
 * 
 * // Pin2  をJQ6500の TX へ
 * 
 * // 
 * 
 * // (TX/RX クロス接続する。)
 * 
 * Share
 * 
 * https://makecode.microbit.org/_6mvR8H8WHUeM
 */
basic.showIcon(IconNames.EighthNote)
serial.redirect(
SerialPin.P12,
SerialPin.P2,
BaudRate.BaudRate9600
)
namespace JQ6500 {
    export function play() {
        serial.writeBuffer(hex`7E020DEF`)
    }
    export function stop() {
        serial.writeBuffer(hex`7E020EEF`)
    }
    export function next() {
        serial.writeBuffer(hex`7E0201EF`)
    }
    export function volume(v: number) {
        let b = pins.createBuffer(5)
        b[0] = 0x7E
        b[1] = 0x03
        b[2] = 0xA7
        b[3] = v
        b[4] = 0xEF
        serial.writeBuffer(b)
    }
    export function playFile(n: number) {
        let c = pins.createBuffer(6)
        c[0] = 0x7E
        c[1] = 0x04
        c[2] = 0x03
        c[3] = (n >> 8) & 0xFF
        c[4] = n & 0xFF
        c[5] = 0xEF
        serial.writeBuffer(c)
    }
}
basic.pause(500)

外気温は12時現在で34度。

結果、安芸太田町で39.2度を記録した。

もう立秋から2週間なのに。