月曜日, 11月 17, 2025

RP2040 Zero で MicroPython を使う

 

埋め込み用マイコンでも Python を動かせる MicroPython というものがあります。

リアルタイムでコマンドラインからマイコンを動かせる画期的なシステムなので、ちょっとした感動が味わえます。

使い方としては、まずファームウエアをアップロードしてドライブとして認識させます。ここで code.py を走らせてもいいし、コマンドラインから動かすこともできます。

ここでは Waveshare RP2040-Zero (の互換ボード)を例に、基本的な使い方をまとめます。


 MicroPython の特徴

  • 組み込みマイコン(ESP32, ESP8266, RP2040 など)で Python を実行可能

  • REPL(Read-Eval-Print Loop)を通じてコマンドラインから直接操作できる

  • code.pymain.py を書き込むことで自動実行も可能


RP2040-Zero に MicroPython を導入する方法


1. ファームウェアの入手

2. ボードをブートローダーモードで起動

  • RP2040-Zero の BOOT ボタンを押しながら USB ケーブルで PC に接続します。

  • 「RPI-RP2」という名前の USB ドライブが認識されます。

3. ファームウェアの書き込み

  • ダウンロードした RPI_PICO-latest.uf2 を「RPI-RP2」ドライブにドラッグ&ドロップします。

  • 数秒後に自動的に再起動し、MicroPython が有効になります(ドライブは表示されません)。

4. REPL の利用

  • USB シリアル経由で REPL(対話型プロンプト)にアクセスできます。

  • Linux では screen /dev/ttyACM0 115200、Windows では PuTTY や Thonny IDE を利用可能です。

  • Thonny を使うのがおすすめです。

    1. ダウンロード: https://thonny.org

    2. Windows / macOS / Linux に対応しています。

    3. 初回起動時に「ツール → オプション → インタープリタ」で MicroPython (Raspberry Pi Pico/RP2040) を選択すると、RP2040‑Zero を自動認識します。

    4. 「REPL」ウィンドウが開き、対話型プロンプトで直接 Python コードを入力して実行できます。

    5. さらに、ファイルをボードに保存する機能が使えます。File → Save As… → MicroPython device を選び、ファイル名を main.py にすると、RP2040‑Zero の内部フラッシュに保存され、リセット後に自動実行されます。

  • Mu Editor も使えます。

    1. ダウンロード: https://codewith.mu

    2. Windows / macOS / Linux に対応

    3. 初回起動時に「モード選択」で MicroPython を選択すると、RP2040-Zero を自動認識します。

    4. 「REPL」ボタンを押すと、対話型プロンプトが開き、直接 Python コードを入力して実行できます。

5. スクリプトの配置

  • RP2040-Zero 上のファイルシステムに main.pycode.py を保存すると、起動時に自動実行されます。


実行例

REPL 上で NeoPixel を点灯させることができます。

>>> from machine import Pin
>>> from neopixel import NeoPixel
>>> pin = Pin(16)
>>> led = NeoPixel(pin, 1)
>>> led[0]=(0,0,255)
>>> led.write()


月曜日, 10月 06, 2025

I2S プロトコル

I²S(Inter-IC Sound)は、マイコンやオーディオ機器間で音声データをやり取りするために設計された、シリアル通信プロトコルです。I²CやSPIと名前は似ていますが、I²Sは音声専用のプロトコルです。

I²Sは、以下の3つの主要な信号線を使って通信します。

  • BCLK (SCK) ビットクロック。データ転送の同期
  • LRCLK (WS) ワードセレクト。左右チャンネルの切り替え。データ線が一本なのでマイク側でも左右を指定します。LOW で左側となります。
  • SD (SDATA) シリアルデータ。音声データ本体

利点
  • 高音質:16〜32ビットのPCM(Pulse-Code Modulation/パルス符号変調)音声に対応。つまりデジタル。

  • ステレオ対応:1本のデータ線で左右チャンネルを送信

  • 低レイテンシ:リアルタイム処理に最適

  • シンプルな配線:3本の信号線で完結


ESP32 C3 supermini と INMP441 互換モジュールを使ってマイクから音声データを得る回路を示します。

INMP441 Pin ESP32-C3 GPIO Signal Role
VDD 3.3V Power
GND GND Ground
SCK GPIO2 I²S BCLK (Bit Clock)
WS GPIO3 I²S LRCLK (Word Select)
SD GPIO1 I²S Data In
L/R GND Mono mode (Left channel only)

コードは以下の通りです。PlatformIo を使っているので Ardunino.h を読み込んでいます。

main.cpp – ESP32-C3 I²S Microphone Reader

#include <Arduino.h>
#include 
#include 

#define SAMPLE_RATE     16000
#define BUFFER_SIZE     512
#define I2S_WS          3
#define I2S_SCK         2
#define I2S_SD          1

void setup() {
  Serial.begin(115200);
  delay(1000);

  i2s_config_t i2s_config = {
    .mode = i2s_mode_t(I2S_MODE_MASTER | I2S_MODE_RX),
    .sample_rate = SAMPLE_RATE,
    .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,
    .communication_format = I2S_COMM_FORMAT_STAND_I2S,
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
    .dma_buf_count = 4,
    .dma_buf_len = BUFFER_SIZE,
    .use_apll = false,
    .tx_desc_auto_clear = false,
    .fixed_mclk = 0
  };

  i2s_pin_config_t pin_config = {
    .bck_io_num = I2S_SCK,
    .ws_io_num = I2S_WS,
    .data_out_num = I2S_PIN_NO_CHANGE,
    .data_in_num = I2S_SD
  };

  i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL);
  i2s_set_pin(I2S_NUM_0, &pin_config);
}

void loop() {
  uint8_t buffer[BUFFER_SIZE];
  size_t bytesRead;
  i2s_read(I2S_NUM_0, &buffer, BUFFER_SIZE, &bytesRead, portMAX_DELAY);
  Serial.write(buffer, bytesRead);  // Send raw bytes over serial
}

月曜日, 7月 28, 2025

PHP: 定数を扱う

プロジェクトごとの定数を扱うクラス Config\Constants の紹介です。



<?php

namespace Config;

class Constants
{
    public const DB_USER = "linguist";



呼び出す場合はcomposer を使って use でクラスを読み込みます。


use Config\Constants;

$loader = new \Twig\Loader\FilesystemLoader(Constants::TEMPLATE_DIR);


定数クラスは静的であるため、どこからでも呼び出し可能です。

composer.json で読み込みを指定します。


    "autoload": {
        "psr-4": {
            "Config\\": "src/Config/",
            ...


 git には載せたくない場合でも .gitignore で指定すれば除外できます。


水曜日, 7月 23, 2025

PHP: Composer の使い方

PHP には Composer という優れたパッケージ管理ツールがあります。最近、PHP サイトを Composer を使って再構築する作業を行いましたので、方法を書いておきたいと思います。

Composerとは?

ComposerはPHPのパッケージ管理ツールです。PythonにおけるPoetryに似ており、依存関係の管理とプロジェクトの構造化を支援してくれます。

  • composer.json によってすべての依存情報を一元管理

  • Packagistというリポジトリから多くのパッケージをインストール可能

  • Composerの最大の魅力のひとつが、オートローディング機能です。PSR-4準拠の設定を行えば、名前空間に応じてクラスファイルが自動的に読み込まれます。


インストール方法はこちら⇒公式サイト


プロジェクトの初期化

プロジェクトフォルダで以下のコマンドを実行して composer.json を生成します:

composer init

オートローディング設定

composer.json に以下を追加してクラスを読み込みます。

"autoload": {
        "psr-4": {
            "Pages\\": "src/Pages/"
        }
    }

追加後は以下のコマンドを実行して、オートロード情報を更新します。

composer dump-autoload

使用法

EditPage というクラスを作るなら、src/Pages/EditPage.php ファイルで namespace を指定し、クラスを定義します。

namespace Pages;

class EditPage {
    public static function hello() {
        return "EditPage::hello() が呼ばれました。";
    }
}

EditPage を使うファイルで以下を設定します。

require 'vendor/autoload.php';

use Pages\EditPage;

echo EditPage::hello();

火曜日, 7月 22, 2025

Python: Poetry の使い方

 Python のパッケージ管理で便利なツールがあります。pip や venv などもいいですが、ここでは poetry の使い方を説明したいと思います。


インストール


PoetryはPython 3.7以上で動作します。
curl -sSL https://install.python-poetry.org | python3 -


使い方


まず新規プロジェクトを作成します。
 
poetry new <proj>

このコマンドで以下のファイルが作成されます。

proj/
├── pyproject.toml
├── README.md
├── proj/
│   └── __init__.py
└── tests/
    └── __init__.py


Python モジュールの追加


add コマンドを使ってモジュールを追加します。

poetry add requests


追加されたモジュールは pyproject.toml を見ると確認できます。


仮想環境の管理


run コマンドを使って作成した仮想環境下でプログラムを実行します。

poetry run py script.py


仮想環境の構築


GitHub からプロジェクトをダウンロードしたら、install コマンドを使ってモジュールをインストールします。

poetry install

poetry は仮想環境を管理するための分かりやすい・使いやすい優れたツールです。

水曜日, 7月 02, 2025

Laravel サイトのアップグレード

 Laravel のサイトをアップグレードする機会がありましたので、その方法をここで書いておきたいと思います。かなり構成というか書き方が変わってきているので注意が必要です。

1. 新しいLaravelプロジェクトの作成

まずはクリーンなLaravel環境を作成します。

composer create-project laravel/laravel new-site

2. 既存コードの移行

必要なファイルを新しいプロジェクトにコピーします:

  • コントローラapp/Http/Controllers

  • モデルapp/Models

  • ビューresources/views

  • ルーティングroutes/web.php または routes/api.php

  • ミドルウェア、サービス、ジョブなど → 必要に応じて

3. Composerのオートロードを更新

クラスのオートロードを再生成します。

composer dump-autoload

4. 必要なパッケージの再インストール

Spatieの権限管理パッケージを使っている場合なら

composer require spatie/laravel-permission

5. Apacheの設定に注意

重要なのが、Apacheの mod_rewrite モジュールを有効化することです。これはひっかかりました。これを忘れるとルーティングが正しく機能せず、トップページしか表示できません。

LoadModule rewrite_module modules/mod_rewrite.so

6. ルーティングの見直し・更新

Laravelのバージョンアップに伴い、ルーティングの記述方法や構文が変更されていることがあります

  • クロージャベースのルートやコントローラルートにおける名前空間の指定方法

  • Route::controller()Route::middleware() を使用したグルーピング構文

  • Web/APIルートファイルでのミドルウェアやプレフィックスの指定

Laravel 8以降では、RouteServiceProvider が変更されましたので変更が必要な場合があります。web.php の記述はこれで動きます。

use App\Http\Controllers\CaseController;

Route::resource('case', CaseController::class);

土曜日, 11月 11, 2023

Qt: 外部プログラムを起動する

 

Qt/C++ のアプリは、外部へ直接アクセスできます。これはネットアプリでは不可能な Qt のメリットです。

外部プログラムを起動することもできます。QProcess::startDetached() を使うと独立したプロセスを立ち上げることができます。

この QProcess::startDetached が Qt5.10 から使用方法がアップデートされたようなので、ご報告まで。引数は外部プログラムへのパスではなく、プロセスIDをとります。

外部プログラムは QProcess::setProgram() で設定します。

金曜日, 11月 10, 2023

QTreeWidget アイテムの追加・削除

 

QTreeWidget はそのまま使えるツリー構造用のコンポーネントです。そのまま、というのは QTreeView 派生クラスなど作らなくても備え付けのデータクラスが使えるという意味です。

QTreeWidget へアイテムを追加するコードはヘルプにもありますが、ここではルート要素へも追加できるコードを置いておきます。



アイテムを削除する方法はこちらです。ルート要素の削除もできます。

水曜日, 11月 08, 2023

QTableWidget: ヘッダーのフォントをボールド化する

 

QTableWidget のヘッダーを設定し、フォントをボールド化する方法です。

QTableWidget のヘッダーは setHorizontalHeaderLabels() を呼び出し QStringList を渡すことで設定できます。

設定後、フォントを取得し、setBold() でボールドを設定します。


QTableWidget で右クリックメニュー(コンテキストメニュー)

 

QTableWidget で右クリックメニューを出す方法です。

まずQTableWidget でコンテキストメニューを有効化する必要があります。


呼び出したメソッドでメニューを作り、popup() メソッドで表示します。


アクションを設定し、実行したいメソッドを connect() で設定します。

セルの位置はマウスクリックの位置から itemAt() で計算します。

位置情報はクラス変数で保存すると使いやすいかもしれません。

あと、QTableWidgetItem が設定されていないセルではメニューを表示しない設定もできます。

木曜日, 10月 12, 2023

Qt6: アイコンを設定する(Windows)

Qt はまってます。Mac でも書いたアプリがコンパイルできて、しっかり動くのを確認しました。このあいだ Chitubox が Qt 使ってるのを知ってうれしかったです。

Mac でもそのまま動くんですが、アプリのアイコンの設定はプラットフォーム依存です。

公式マニュアルでも設定が分かりにくかったのでここでは Windows でのアイコンの設定を説明します。

アイコンの設定方法

1.ICO ファイルを作成します。https://realfavicongenerator.net/ などで作成できます。

2.プロジェクトからアクセスできる場所を選んで保存します。/images 下など。

3.Qt Creator でリソースファイル resource.qrc を作成します。プロジェクト名で右クリックメニューから Add New ... で作成できます。




4.メインウィンドウの初期化時などで、ウィンドウのアイコンを設定します。

setWindowIcon(QIcon("://images/phrases.ico"));

これでコンパイルすればウィンドウのアイコンが設定できているのが確認できます。



5.アプリの実行ファイルのアイコンは、icon.rc ファイルを作成することで設定できます。

右クリックメニューから Add New ... をクリック、Empty File を作成し、icon.rc など名付けます。


6.icon.rc へ以下の内容を書き込みます。

IDI_ICON1   ICON    "images/phrases.ico"

これで設定は完了です。コンパイルすれば出来上がった実行ファイルのアイコンが設定されているのが確認できます。

windeployqt コマンドでデプロイが終了です。

ViFlash のソースコードはこちらです。参考まで。

https://github.com/easai/ViFlash


火曜日, 9月 19, 2023

Qt6 の日本語化 (CMake, QtLinguist)

 Qt5 の日本語化の記事はあるようですが、Qt6 CMake を使っての方法が探してもなかったので書いておきます。

プロジェクト作成時、言語を設定してもそのままでは日本語化できません。

手順は以下の通りです。

  1. 空の TS ファイルを作る
  2. CMakeLists.txt を更新する
  3. CMake を用いて単語を抽出する
  4. QtLinguist で日本語化する
  5. アプリ側で QM ファイルを読み込む


空のTSファイルを作る


このファイルはプロジェクト作成時、言語を指定すると自動生成されます。指定していなければ作成します。

ファイル名は任意ですが、 <アプリ名>_ja_JP.ts などするとわかりやすいかもしれません。

空といっても骨格は記述します。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="ja_JP">
<context>
</context>
</TS>

CMakeLists.txt を更新する


以下のコマンドを追加します。
find_package(Qt6 REQUIRED COMPONENTS LinguistTools)

qt6_add_translations(I18n
    TS_FILES I18n_ja_JP.ts
    QM_FILES_OUTPUT_VARIABLE qm_files)
install(FILES ${qm_files} DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}


CMake を用いて単語を抽出する


以下のコマンドをビルドのディレクトリで走らせると単語が抽出されます。
cmake --build . --target update_translations

QtLinguist で日本語化する


QtCreator で TS を右クリックすると Open With メニューから Qt Linguist を起動できます。

コマンドラインからも起動できます。


アプリ側で QM ファイルを読み込む


TS ファイルは QM ファイルへ変換されます。

アプリ側でファイルを読み込むと作業は完成です。標準コンポーネントのため、標準 QM ファイルも読み込みます。

以下のコードではロケールの設定で言語を指定します。

  QTranslator translator;
  const QStringList uiLanguages = QLocale::system().uiLanguages();
  for (const QString &locale : uiLanguages) {
    const QString baseName = "I18n_" + QLocale(locale).name();
    if (translator.load(baseName)) {
      a.installTranslator(&translator);
      break;
    }
  }
  QTranslator stdTranslator;
  for (const QString &locale : uiLanguages) {
    const QString baseName = "qt_" + QLocale(locale).name();
    if (stdTranslator.load(baseName,QLibraryInfo::path(QLibraryInfo::TranslationsPath))) {
      a.installTranslator(&stdTranslator);
      break;
    }
  }

上記の方法で作成したプロジェクトです。参考まで。
https://github.com/easai/I18n.git

木曜日, 9月 07, 2023

Qt キュート(C++ GUI フレームワーク)

 Qt キュート って GUI フレームワークがあります。案件が降ってくるとかで手を出したんですが(来なかった)書きやすいので引っかかったところとか書いておきたいと思います。C++です。

最新版が Qt6 で、CMake が標準です。ポータブルなのが売りですが Windows で使ってます。使えます。

画面を見たら分かるかと思いますが、Qt では画面のデザインが標準化されていて楽です。きっちり並んだ部品は感動です。

縦横並べるコマンドがあって、隙間をそろえる部品があります。

Qt オープンソース・ダウンロード

水曜日, 2月 17, 2021

Flask/wtform/SelectField フォームで入力チェックがうまくいかないとき

 Flask の wtform は入力値の自動チェックを行うので便利なんですが、自動チェックさせるとときどき引っかかるので面倒です。

SelectField を使うなら値はしっかり設定しておかねば入力値はすべてはじいてくれます。選択肢をデータベースからひいてきて自動設定している場合なぞ要注意です。

SelectField を設定する関数を書けば便利です。

Form をインスタンス化しただけで form.validate() をついかけてしまうような間違いを防ぐことができます。

月曜日, 2月 15, 2021

Flask/url_for() で引数を省略

Flask ではルートを指定して動作を指定します。動作は関数で記述します。Flask は指定された関数を起動します。

引数を指定することもできます。引数は<引数>の形で指定、関数の引数で受け継ぎます。この引数を省略できるのか、っていう問題です。

Python の関数はデフォルト値を持つ引数は省略できます。そのノリでそのまま引数のデフォルト値を指定してもルートは判別しません。

ここは引数なしのルートを指定してやります。関数のほうはデフォルト値を指定することで対処します。ここでルートの最後の/(スラッシュ)を指定します。

これで url_for() で引数を省略できます。


水曜日, 8月 21, 2019

Jinja (Flask/SQLAlchemy) で日付をフォーマットする

Flask/SQLAlchemy 使ってる方、jinja で困ってませんか?

本体で Python の関数を書いてもいいんですが、テンプレートでも関数が呼べます。

日付を出したい場合、フォーマットなら strftime() が使えます。


わざわざ文字列を作って渡す必要はありません。



月曜日, 7月 22, 2019

PyMongo で内部結合

PyMongo を使った内部結合の実装です。classics テーブル、baroque テーブルの内部結合を キー composer_id で照らし合わせたものです。

外部結合なら $match の部分なしで結果がとれます。

_id で照らし合わせる場合、ObjectId(id) で合わせるか文字列へ変換するか気を付ける必要があります。

土曜日, 6月 29, 2019

Python: 指数分布のグラフを書く

Python の使いやすさはただごとじゃありません。

ユーザーの層が厚いのはユーザーが多いから。人気が人気を呼ぶパターンですね。ドキュメント類の豊富さ(本家じゃなくても)が質を変えているわけです。民主主義ですよこれは。

使いにくさなんてユーザーが変えていくもんです。多くの人たちが使っていればですね。意見を取り入れる柔軟さはピカイチです。もとからかなり特色ある言語ですが、ライブラリの豊富さでも群を抜いてます。

グラフを書くのもお手の物です。使い慣れた言語で思いのままってのは数式が近く感じられていいもんです。そのままシェルからグラフが書けます。

以下のスクリプトは指数分布を描きます。




日曜日, 1月 27, 2019

Scala: BigInt で階乗を計算する

Java の BigInteger の扱いは面倒です。すべての演算が関数形式で引数を指定しなければならないのでとても不便です。オペレータ演算子を定義できない安全志向 Java の弱みでもあります。

Scala ならその心配はありません。何の躊躇もなく演算子を書き換えれば独自の世界が展開します。BigInt の扱いも自然です。オペレータ演算子をほぼすべてそのまま使えます。いわゆる中置記法(infix)で書けるので読みやすくデバッグしやすいコードが書けます。

Java: BigInteger で階乗を計算する では Java の BigInteger で階乗を計算するコードを載せました。Scala で書いたのがこれです。これだとなんか特記すべきこともないです。



比べてみれば利点は明らかです。言語設定がプログラミングの効率をどこまで上げるのか、現場を顧みない世迷いごとは「プログラミング言語はどれもC言語が基本だから(!)、基本構造が同じなら書けることは同じ」これで論破できますね。

金曜日, 9月 21, 2018

型破りな Python

Python でもっとも特徴的なのは抽象化が徹底していること。抽象化ってのはつまりパラメタ化できるってことですね。属性で値(本質)を得ることができるわけです。

変数やメンバ変数などそのものを配列で扱えます。しかも値を文字列で取得できます。これは便利ですね。グローバル、ローカル変数そのものが配列でアクセスできます。

globals()
locals()

型でさえ抽象されてます。同じ変数名で型を変えることが Python なら可能です。なんか抵抗があるようなところが型破りな Python なわけです。

a = 0  # int
a *= 1.0   # float
a = str(a)  # string

ここで型は変数の属性、変えることのできる属性の一種です。

これができるってことはつまり静的型チェックがないわけなんですが、そもそも Python はコンパイラなんてもたないんですよね。

有名どころでは、True/False がそのまま数です。


if False + 1:
    print('???')

Flask の Blueprint のテンプレート問題

  Flask の Blueprint は、ルート、静的ファイル、テンプレートをまとめて管理できます。しかし、テンプレートが指定できません。 ここでは、Blueprint の template_folder の問題点と回避策を説明します。 Blueprint のテンプレート問題...