Vol.936 13.Feb.2026

Clipchamp M5)LiteにOLEDを接続 Pythonあれこれ

C Clipchamp

by fjk

 Clipchampは、Microsoftが提供するオンライン動画編集ツールで、初心者でも簡単に動画を作成・編集できるプラットフォームです。
 Windows10/11に標準で付属するツールで、無料版と有料版があります。無料版でも動画編集に必要な基本機能が一通り揃っています。
 Clipchampは、「スタート/すべて」、または、「スタート/創造性」からMicrosoft_Clipchampをクリックすると起動できます(マイクロソフトアカウントの登録が必要です)。


スタート/すべて

スタート/創造性

Clipchamp起動画面
(新規作製は「新しいビデオを作製」をクリック)

【使用例】  (abc935で「動画の不要部分を削除」した例)


@「新しいビデオを作製」画面

A左の画面にファイルをドロップ

B右下のタイムラインにドロップ

C有効範囲を選択しエクスポート

D格納場所とファイル名を入力

EONE_Driveに保存(ローカルにも保存可)

【参考】


M M5_Atomシリーズ (2)  〜AtomLiteにOLEDを接続

by fjk

 前報(abc935)で、M5_Atomの開発環境の構築とデモテストを行ったが、AtomLite本体ではカラーLED表示のみで、チョット使い勝手が悪い。そこで、外部にI2C接続OLEDディスプレーを接続した。OLEDの接続には、ロジカラさんのページを参考にさせていただいた。
 テストに用いたOLEDは、SSD1306を使用した128x64ドット(秋月#112031[白],秋月#115870[青]、@580)と128x32ドット(秋月#114686[白],@600)を用いた。なお、ロジカラさんと異なり、どちらのOLEDもGrove端子ではなくAtomの背面4ピン端子に接続した(Grove端子に他のI2Cデバイスを接続したいので、OLEDのデュアルモードはテストしていない)。

【ハード】


128x64ドットOLED(青)

128x32ドットOLED

【ソフト】  abc935で構築したVSCode上のplatformIOで、以下の5つのライブラリーを追加した。
  • M5Atom
  • FastLED
  • Adafruit_BusIO
  • Adafruit_GFX_Library
  • Adafruit_SSD1306

 なお、プログラムはロジカラさんのオリジナルから、メインOLEDの記述部分を削除した。
 また、画面の縦サイズが32ドットのOLEDの場合は、SCREEN_HEIGHT1を32に設定して下さい。

AtomLSSD1306.cpp(zip)

/*************************************(AtomLSSD1306.cpp)**********
 *	AtomLite + SSD1306 test
 *****************************************************************/

#include <M5Atom.h>                     // Arduino.h / Wire.h / FastLED.h含む
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>           //「Adafruit BusIO」ライブラリ必要

//OLED設定
#define SCREEN_WIDTH 128                // OLED 幅指定(メイン、サブ共通)
#define SCREEN_HEIGHT1 64               // OLED 高さ指定(H=64)
//#define SCREEN_HEIGHT1 32             // OLED 高さ指定(H=32)

#define OLED_RESET -1                   // リセット端子(未使用-1)

// I2Cに接続されたSSD1306用 displayとdisplay1の宣言
Adafruit_SSD1306 display1(SCREEN_WIDTH, SCREEN_HEIGHT1, &Wire1, OLED_RESET);

//ASCII文字 0x21〜0x7e(94文字)
char str[] = "!\"#$%&'()*+,-./0123456789:;<=>?"
             "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`"
             "abcdefghijklmnopqrstuvwxyz{|}~";

// 初期設定 --------------------------------------------------
void setup() {
  // 本体初期化(UART有効, I2C有効, LED有効)
  M5.begin(true, true, false);
  Serial.begin(9600);

  Wire1.begin(21, 25);                  //サブ画面接続端子のI2C設定(SDA,SDL)

  // OLED1初期表示(サブ)
  if (!display1.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306:1 allocation failed"));
    for (;;);                           //エラーなら無限ループ
  }
  // OLED表示(サブ画面)
  display1.clearDisplay();              // 表示クリア
  display1.setTextSize(2);              // 文字サイズ
  display1.setTextColor(SSD1306_WHITE); // 文字色
  display1.setCursor(0, 0);             // 表示開始位置左上角(X,Y)
  display1.println(str);                // 表示内容
  display1.display();                   // 表示実行
}

// メイン -------------------------------------------------
void loop() {
  delay(500);
}

【Atom回路の改良】
 AtomLiteにOLEDを接続し、文字等の表示ができるようになったが、OLEDを背面に差し込むとスイッチが反対面になり、使いずらいので、小さなブレッドボード(EIC-1501-0、@341)と両端ロングピンヘッダー(秋月#109056,@50)を使って、OLED画面とスイッチが同じ面に来るようにした。


ブレッドボード配線とピンヘッダー

ATOM+OLED(白)テスト画面

 プログラムは、ロジカラさんのオリジナルと同じく、スイッチを押すとその状態と押された回数を表示する。
 なお、OLEDの画面高さの表示サイズは #define文でH64を「設定する/しない」で変更可能。

AtomLOLED.cpp(zip)

/***************************************(AtomLOLED.cpp)************
 *	AtomLite + OLED test
 *****************************************************************/

#include <M5Atom.h>                 //Arduino.h / Wire.h / FastLED.h含む
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>       //別途「Adafruit BusIO」ライブラリ必要

#define H64                         // HEIGHT=32ならコメントに

// OLED設定
#define SCREEN_WIDTH 128            //OLED 幅指定

#ifdef H64
  #define SCREEN_HEIGHT 64          //OLED 高さ64指定
#else
  #define SCREEN_HEIGHT 32          //OLED 高さ32指定
#endif

#define OLED_RESET -1               //リセット端子(未使用-1)

// I2Cに接続されたSSD1306用「display」の宣言
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire1, OLED_RESET);

// 変数宣言
int cnt = 0;                        //ボタンを押した回数カウント用

// FastLED(CRGB構造体)設定
CRGB dispColor(uint8_t r, uint8_t g, uint8_t b) {
  return (CRGB)((r << 16) | (g << 8) | b);
}

// 初期設定 --------------------------------------------------
void setup() {
  // 本体初期化(UART無効, I2C有効, LED有効)
  M5.begin(true, true, true);

  Wire1.begin(21, 25);              //背面端子をI2C設定(SDA,SDL)
  Serial.begin(115200);
  
  // OLED初期設定
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306:0 allocation failed"));
    for (;;);                       //エラーなら無限ループ
  }

// OLED表示設定
  display.setTextColor(SSD1306_WHITE);  //文字色
}

// メイン -------------------------------------------------
void loop() {
  M5.update();                      //ボタン状態更新
  display.clearDisplay();           //表示クリア

  // タイトル表示
  display.setTextSize(1);           //文字サイズ(1)
  display.setCursor(4, 0);          //表示開始位置左上角(X,Y)
  display.println("OLED");          //表示内容
  display.setCursor(4, 10);         //表示開始位置左上角(X,Y)
  display.println("TEST");          //表示内容

  display.setTextSize(2);           //文字サイズ(2)
  display.setCursor(39, 2);         //表示開始位置左上角(X,Y)
  display.println("SSD1306");       //表示内容

  // 本体ボタンON/OFF状態表示
  display.setTextSize(1);           //文字サイズ(1)
  display.setCursor(5, 24);         //表示開始位置左上角(X,Y)
  if (M5.Btn.isPressed()) {         //ボタンが押されていれば(ずっと)
    M5.dis.drawpix(0, dispColor(0, 0, 100));  //本体LED青
    display.println("BTN = ON");              //表示内容
    Serial.println(F("BTN = ON"));
  } else {                          //ボタンが押されてなければ
    M5.dis.drawpix(0, dispColor(20, 20, 20)); //本体LED白
    display.println("BTN = OFF");             //表示内容
  }
  // 本体ボタンON回数カウント表示
  if (M5.Btn.wasPressed()) {            //ボタンが押されていたら
    cnt++;                              //カウント+1
  }
  display.setCursor(72, 24);            //座標を指定
  display.printf("CNT=%04d\n", cnt);    //カウント数

  // 図形表示
  display.drawLine(0, 20, 128, 20, WHITE);   //線(始点終点指定)
  display.drawFastVLine(64, 22, 17, WHITE);  //線(垂線)
  display.drawFastHLine(0, 38, 128, WHITE);  //線(平行線)
#ifdef H64
  display.drawCircle(10, 55, 8, WHITE);      //円
  display.fillCircle(30, 55, 8, WHITE);      //円(塗り潰し)

  display.drawTriangle(46, 62, 54, 48, 62, 62, WHITE); //三角
  display.fillTriangle(66, 62, 74, 48, 82, 62, WHITE); //三角(塗り潰し)

  display.drawRect(90, 47, 16, 16, WHITE);   //四角
  display.fillRect(110, 47, 16, 16, WHITE);  //四角(塗り潰し)
#endif
  display.display();                  //表示実行

  delay(500);
}


P Pythonあれこれ

by fjk

 色々なプログラム言語を使っていると、言語規則(文法)を間違えることがよくあります。
 C(++)言語を使っていて、Pythonで特に間違えやすいところは、[備忘録として]

・インデント: ブロック認識のため「インデント」(4スペース推奨)が必要
・演算子: べき乗 **
      整数割り算//
・コメント: インラインコメント #・・・
       ブロックコメント"""・・・"""

【参考】

※Python のバージョンを確認するには、--version オプションまたは -V オプション(大文字)を用いる。
  python -V

【括弧の呼び方】                          <Python>
丸括弧 ( ) パーレン(parentheses、round brackets) タプル(tupls、不変リスト)
角括弧 [ ] ブラケット([square] brackts)  リスト(lists)
波括弧 { } ブレース(curly braces、cruly brackets) セット(set、集合、辞書)
山括弧  <> アングル・ブラケット(angle brackets) (演算子)


※プログラムのリストをハイライト無しのスタイルで見る場合はここをクリック


※ 本レポートの参考・利用は、あくまでも自己責任でお願いします。


Clipchamp M5)LiteにOLEDを接続 Pythonあれこれ