FRDM-MCXN947でMicroPythonをアニメーションかす (日本语ブログ) MicroPython, FRDM-MCXN947, ZephyrMicroPython, FRDM-MCXN947, ZephyrMicroPython, FRDM-MCXN947, ZephyrMicroPython、FRDM-MCXN947、Zephyr
MicroPythonの主要ファミリーの研究開発、 Zephyr の Zephyr 、FRDM-MCXN947 の FRDM-MCXN947 設定。
Zephyr ポートと言っているのは、MicroPython をZephyr RTOSの上ですす移植版です。 MicroPython は通常、microPython で使用されます。その代わりに、Zephyr が対応しているボードなら動くこの士组みを使います (詳細はセクション1.3 )。
ビルド自体は、これまでもできました。ただしボード固有の設定が無かったため、がるのは最低制限のMicroPythonで、スクリプトを保存するファイルシステムも無し、I²CもSPIも使えませんでした。今回は、まず最初の一歩を踏み出します。
これでNXPのマイコンでMicroPythonを選択リムが広がりました。これまでは事実上、上のクロスオーバーMCUであるi.MX RTシリーズに限定されていましたが、そこにMCX Nシリーズという、より小さなスケールで手を出しやすい选選択リムがプラスされましたことになります。
このボードに有線のイーサネットがロードしている点も見ません。 MicroPython が安いボードの多くは、Wi-Fi や Bluetooth でネットワークにつなぎます。目的は電波と同じ、有線も有線、場面も同じです。この记事の後半では、ボードをWebサーバにしてブラウザからLEDを操作するところまでアニメーションかします。
一方では制限が一方にあります。 Zephyr ポートは、チップ専用のポートに比べて関数がツイストされます。同様に同じNXPのマイコンでも、i.MX RTけの ports/mimxrt には network.LAN() があってIPアドレスを実行時にSETできますが、Zephyrポートには network モジュール自体がありません。できるのは socket だけで、IP アドレスはビルド時にのみ決定められません。この记事では、それは制限と、実记にぶつかった問題の回避戦略も有って书いています(セクション 8.2を整理しました).
それ以来、MicroPython が始まり、LED を光らせ、スイッチを読み、I²C や SPI のデバイスを動かし、最後にイーサネットを作るところまでを一通り説明します。 「MicroPythonをタッチするのは初めて」という方を考えて、途中で手が滑らかになり、道が省略されました。
この记事の心構え
それは長い話だ、長い話だ、でもそれは必須だ。
Zephyrのオープン環境環境→ 2.1節から
すでにビルドと书き込みが出来ている方→第3章から
まず、どのように操作すればよいでしょうか? →セクション8.6 (LEDの操作方法の例)
第章ごとに必要なものは時のとおりです。
第1章~第5章:FRDM-MCXN947本体とUSBケーブル [課題時間:60分]
第6章 (I²C) : ジャンパライン 2冊 [課題時間: 20分]
第7章 (SPI) : ジャンパライン 1 [課題時間: 20 分]
第8章(イーサネット) :LANコントローラ1 [課題時間:20分]
0. カタログ
目次
MicroPythonって何なのか?
1.1 なんとなく使われているのか
1.2 MicroPythonのいいところ、悪いところ
1.3 MCXメンテナンス:「ZephyrPort」フォーム
1.4 今回の対応でできるようになったこと
1.5 ゼファーの弱点: ゼファーによって指定される
MicroPython Zephyrポートのビルド
2.1 Zephyrオープン環境
2.2 MicroPython のソースを入手する
2.3 ビルドする
2.4 ボードに书き込む
MicroPythonってみる — 基本エディター
3.1 トニーする
3.2 USB USB
3.3 確認を受け入れる
3.4 「REPL」とは
3.5 スクリプトを书いて見る:Lチカ
3.6 このボードで使えるピンをアニメーションべる
3.7 Lチカの色を変えてみる
編集者: ピン名を公夫する
4.1 わかりやすいスクリプトの中にPINS Dictionaryを书く
4.2 config.pyに切り出す
4.3 ステージに保存したユーザー: して共有する
4.4 config.pyった3色Lチカ
編集者:スイッチを読む
5.1 スイッチの状態を読む
5.2 杀されたことを切り込みで知る
ユーザーエディター: I²Cってみる
6.1 このボードのI²Cの件
6.2 ジャンパを2本つなぐ
6.3 バスをスキャンする
6.4 温度制御
編集者:SPIってみる
7.1 ループバックでトライアル
7.2 CS自動制御システム
編集者:イーサネットってみる
8.1 有線LAN接続
8.2 このポートのネットワークAPI
8.3 PC直接接続テスト
8.4 自己分割IPアドレス
8.5 ボードをWebサーバにする
8.6 LEDディスプレイの操作方法
8.7 電源装置が電源装置に接続されています。
8.8 ハマりやすいポイント
まとめ
参考文献
補足事項:LED動作システムの説明
11.1 ここまでのコンテンツが1まとめている
11.2コードの3つのしはんけ
11.3 例外が必要な理由
11.4 Connection: close について
11.5 その他気をつける点
11.6 未来の未来
1. MicroPython ってなんなの?
MicroPythonは、マイコンの上で直接動作するPython 3のインタープリタです。 Damien in 2013 George の Kickstarter 資金集めが開始されました。はオープンソース(MIT ライセンス)のプロジェクトとして开発が続いています。
「Python 3 処理システム」なんても、PC でアニメーションく CPython をそのまま保持できたのではありません。数百KBのROMと数十KBのRAMがあり、さまざまな方法で使用できる言語です。そのため文法はPython 3とほぼ同じですが、標準ライブラリは必要なものだけが目的になっています。
その代わりに、マイコンならではのモジュールが意されています。 GPIO、I²C、SPI、UART、PWM、ADC machine およびその他の機能。このブログでも machine モジュールを使っていきます。
なお、この章は背景説明です。
すぐに手を動かしたい方は第2章へ入ってください。
1.1 なんとなく使われているのか
MicroPythonはタスクを実行するために使用され、時間はシーンを実行するために使用されます。
教育用途: BBC micro:bitがMicroPythonを採用したことで、一気に知られるようになりました。 Raspberry Pi Pico も MicroPython を公式にサポっています。
プロトタイピング:センサーをとりあえず動かしてデータを見てみたい、というステージでは。
治具・測定器: ラインの検CHECK治具や、実験用の簡易測定器のメーカー、『少量でいいので早めに取り組みたい』ものに向いています。
ホビー:電子工作はさまざまな分野に分かれています。
いずれも 「sincecessous by早い作り」ここがMicroPythonのワンストップ自慢の部門といえます。
1.2 MicroPythonのいいところ、悪いところ
このセクションの内容は、特定のマイコンやポートに制限はなく、MicroPython の一般的なプロパティです。うかどうかをできるように判断して、並べておきます。
いいところ
コードが简限定できる:Python 3の文法がそのまま使えます。文字列処理は演算と同じ、C処理は行数と書き込みは同じです。
質問の答えは次のとおりです。ボードに与続して、1行のコマンドを大切にしながらアクションを正かめられます。 「このピンをHIGHにしたらLEDは点くのか、排除できるのか」といった確認が、そのフィールドで1行ヒットするだけで済みます。ハードウェアの挙動を手動検出りで真かめるとき、これは非常に強力です。 (対この情码ENVIREPLとHUびます。セクション3.4で詳しく説明します)
ビルドが要らない:スクリプトを书いて実行するだけです。コンパイル・リンク・书き込みのサイクルが不要なので、試行錯誤が早くなります。
Learn コストが低い: Python を知っていれば、マイコンの知識だけ足を少し开められます。
悪いところ
実行速度は、インタプリタなので、Cで书いたコードにすると、べるとの数十倍、いや100倍になります。必要な処理や高速信号処理を制御する必要があります。ちなみに対泽はあって,Guan Shu に @micropython.native や @micropython.viper のデコレータをペイけると、关数だけをネイティブコードにコンパイルできます。
メモリを食う:インタプリタ本体と標準ライブラリをマイコンにできる必要があります。数百 KB の RAM、数十 KB の RAM、時間の前に書籍を消費します。小さなさなマイコンでは現在ではありません。
ガベージコレクションがムーブメントの動作が完了し、制御が完了します。
MCXN947は2MBのフラッシュと512KBのSRAMをチップ上に保持しているので、メモリの点では余裕をもってMicroPythonを开せられます。
1.3 MCXメンテナンス:「ZephyrPort」フォーム
MicroPythonは、マイコンの種類ごとに「ポート」と呼ばれる移植版を保有しています。 ports/rp2 (Raspberry Pi Pico)、 ports/mimxrt (i.MX RT)、 ports/esp32 といったツール組み合わせです。これらはそれぞれのマイコンのレジスタやSDKを直接叩いて、そのチップ専用の実装です。
MCX シリーズについては、このような専用ポートは存在しません。その代わりに使えるのが ports/zephyr 、つまり Zephyr RTOS の上でアニメーションかすポートです。
Zephyrがサポートしているボードなら、「MicroPython」と同じZephyr Zephyrめの原理で、MicroPython側には独自かつ必要な機能があります。
FRDM-MCXN947 は Zephyr がサポー トしてるボードなのですが、この士组みに乗ります。
NXPのマイコンでMicroPythonを使用
ここで少し整理しておきます。
NXP のマイコンで MicroPython を起動したとき,これまで現実的な選択limb はi.MX RT シリーズでした。 ポートの ports/mimxrt が RT1010 から RT1170 までの EVK やTeensy 4を独占的に使用します。
Zephyrポートにも前からいくつかNXPボードのSETが入っていましたが、 mimxrt1020_evk や mimxrt685_evk_cm33 のようなクロスオーバーMCUをけか、 frdm_k64f / frdm_kw41z のようにかなり前のKinetisをけで、確実に後ではファイルシステムやI²C/SPIまで全部えられたものではありませんでした。
i.MX RTは高性能で、MCUはハイエンド製品群です。「MicroPythonのMicroPythonの使用」とその目的は次のとおりです。
今回は、FRDM-MCXN947の設定を行い、汎用MCUはMCX Nシリーズという、より手を出しやすい选選択limbs plusを行いました。これも今回の対応の意味の一つだと思います。
図1: MicroPython Zephyrクラス
この道には、强的道と無しの両方があります。 Changsuo、Zephyr、Zephyr、が対応しているボードに纃くできることを展開します。短い所、Zephyrの抽象化、すぶん、チップ専用ポートに比べて「そのボードらしい书きFlavour」が薄くなることです。具体的な内容については後述します。
1.4 今回の対応でできるようになったこと
Zephyr 自身の本体は以前使用しており、FRDM-MCXN947 で使用した設定がセットアップされています。そのままビルドすると、対语的にコマンドを打ち込むことはできても、ストレージもI²CもSPIも使えません、というSTATEでした。
今回は、以下の2つのファイルが本家 micropython/micropython のmasterにマージされました。
ports/zephyr/boards/frdm_mcxn947_mcxn947_cpu0.conf
ports/zephyr/boards/frdm_mcxn947_mcxn947_cpu0.overlay
これによって,時のことができるようになりました。
(1) オンボードのフラッシュをファイルシステムとして利用可能
FRDM-MCXN947 にいる 8 MiB の QSPIflash(Winbond W25Q64JV) の storage_partition を、LittleFS として /flash にマウントします。この本は、本いたスクリプトをボード上に待ってるようになる、という意味で、そしてこれは大きな変化です。
実界にマウントした状態で容量を確認するとその時のようになります。
>>> import os
>>> os.statvfs('/flash')
(4096, 4096, 2048, 2043, 2043, 0, 0, 0, 0, 255)
ブロックサイズ4096バイト × 2048 ブロック = 8 MiB のうち、LittleFS 管理領域を除いて約 7.98 MiB があります。
(2) MikroBusのSPIが使えるようになった
MikroBus コネクタの SPI( flexcomm6_lpspi6 ) を有効にしています。この SPI は、ボード通の devicetree ではピンDefinition まで意されているもの、 status = "disabled" のままになっていました。 MOSI/SCK は P3_20/P3_21 に使用され、SAI1 は他と共有されます。
SAIはシリアルオーディオインターフェースの若干、I²SやTDMといったデジタルオーディオのデータをやり出すための通常・インターフェースです。オーディオコーデックやマイクを行って使うもので、じピンをSPIとSAIの両四角に同時にカットすることはできません。そのためボード共通定義では、向いとも決定めずに無効にしてありました。
では、どうもに使うのか。今度はオーバーレイが有効で、SPI も有効で、判定も有効です。 Gen 存在は単正で,MicroPython の Zephyr ポートにはI²S /SAI をうわえても machine.I2S のようなクラスも存在しないからです。つまり SAI1 のピンとして半分待っていても, MicroPython からは作りようがありません。それならSPI として使えるようにしたほうが便利だろう、というわけです。
(3) I²CとSPIの意見が分かれるようになった
CONFIG_I2C=y と CONFIG_SPI=y しています。これがないと machine.I2C や machine.SPI を作ろうとしても失敗します。
1.5 ゼファーの弱点: ゼファーによって指定される
さて、ここでZephyrポートの「使いにくいところ」を前に说お待ちしておきます。
通常はMicroPythonが使用され、MicroPythonの名前は名前で指定されます。
# i.MX RTの専用ポート(ports/mimxrt)の場合
led = Pin('D9', Pin.OUT)
# Raspberry Pi Pico の場合
led = Pin(25, Pin.OUT)
# ESP32 の場合
led = Pin(2, Pin.OUT)
NXP のマイコンでも、i.MX RT の専用ポートでは 'D9' というボード上の表记そのままの名前が使えます。
なおZephyrポートでは、 GPIOポート名とビット位置のタプルで指定します。
# FRDM-MCXN947(Zephyrポート)の場合
led = Pin(("gpio0", 10), Pin.OUT)
("gpio0", 10) は「GPIO0ポートの10ビット目」、つまりデータシート上のP0_10を指します。違反の形態が踏切であり、時間が踏切である。
>>> Pin(25, Pin.OUT)
Traceback (most recent call last):
File " ", line 1, in
ValueError: Pin id must be tuple of ("GPIO_x", pin#)
「いつかこうなるという」と、Zephyr の devicetree では GPIO が gpio0 、 gpio1 、…というポート単位置のデバイスとして定義されていて、中のビット位置でピンを指しますからです。 MicroPython 側はオープンとクローズです。
問題は、デジタル回路が印刷され印刷されている ("gpio0", 10) です。 Arduinoヘッダーの D9 や、RGB LEDの 赤 といった名前は、MicroPythonはすべて見えないのです。
これはかなり不便です。第 4 章: この対 Ce を Step by Step を追いかけて紹介します。
コラム:Zephyrは「SDKの下注り」としても使われています
Zephyr み込みアプリケーションを书くためのRTOS" というイメージが强いと思います。実際记そのとおりなのですが、最近はもう一つの使われているほうがてきました。地上にプラットフォームをインストールするのに SDK を使用しないでください。
今回の MicroPython Zephyr ポートがそれです。ユーザーが书くのは Python のコードで、Zephyr の存在を意識することはほとんどありません。 MicroPy thonのインタプリタ自身も、Zephyrのスレッドのひとつとして実行されています。
同じ構造の例: ArduinoCore-zephyrがあります。これはArduinoのAPI( pinMode() , digitalWrite() , Wire , SPI ...)をZephyrの上に実装したもので, Arduino IDEから使う制限はZephyrは見れません。
このように「Zephyrを直接使う」に「Zephyrの上にしたものを使う」という選択肢 Limbが壗えてきています。 Zephyrのボードサポートを準備することが、そのままMicroPythonやArduinoの対応にもつながる、という関係です。
▲ カタログに戻る
2. MicroPython Zephyrポートのビルド
ここからは実记に手を動かしてみます。
2.1 Zephyrオープン環境
この记事のコマンド例は、macOSやLinuxのシェル(bashやzsh)を前提にしています。 Windowsも使いやすく、環境も使いやすいです。
コラム:Windowsが入らない状況
最初の結論は、本、 Windows PowerShell (cmd.exe)、Windows PowerShell、および PowerShellです。コマンドを书き変更してもだめです。
MicroPython の処理が行われ、UNIX の依存関係が維持されます。ビルドを設定している py/mkrules.cmake の中で、 cat ・ sed ・ touch が直接呼び出されています。同様に qstr (文字列テーブル) する箇所は、時のようなシェルのパイプライン 1 で书かれています。
cat … | sed … | (Cプリプロセッサ) | sed … > 出力ファイル
これらのコマンドはWindowsには存在しません。 cmd.exe cat sed 終わりはなく、終わりは終わりです。シェルを変えても解決しないのはこのためです。
実记、MicroPython の本家 CI でも、Zephyr ポートのビルドは ubuntu-latest でのみ実行されています。 Windows でのビルドは考えられていません。
风らわしいのですが、 Zephyr 独自のはネイティブの Windows でビルドできます。この节で紹介する Zephyr のスタート ガイドにも、winget でツールを入れる Windows のための手顺があります。 MicroPython をビルドするステップ初めて行き诘まる、ということが出てきます。
Windows環境に入り、UNIX環境の環境が良くなりました。どちらでも、この记事のコマンドはそのまま使えます。
WSL2 (Windows Subsystem for Linux) 。 Zephyr の入門ガイドでも、Ubuntu のアプリケーションはユーザーにとって使いやすいです。 Microsoft のインポート手順
Git for Windows (Git Bash) やMSYS2のbash環境
なお、ビルドと书き入れるだけをUNIX環境で行い、ThonnyでのMicroPython操作はWindows側から、という分け方もできます。 ThonnyもmpremoteもWindowsでそのまま動きますので、第3章以降はWindowsだけで入れられます。
MicroPython Zephyr の環境 (west、Zephyr SDK、Python の環境) は不要です
Zephyr 環境構築ガイド、NXP 日本語解説と説明 先に環境は作ってない方は、先にそれをしてくださいを指します。
Zephyrシリーズ 第2章 はじめてのビルドと実機アニメーション(日本语ブログ)
この记事で参考にしていただきたいのは、 Kailu 環境をインストールする部分です。物語の後半、Zephyr、Zephyr blinky など) をビルドしてアニメーションしますが、このブログでビルドするのは Zephyr のサンプルではなく MicroPython です。ビルドの対相を仕様する部分だけが違反をテストしてください。 west build パスのステータスは作業と同じであり、準備は完了しています。
ゼファーの公式は以下のとおりです。
Zephyr入門ガイド
環境があれば, ~/zephyrproject のようなディレクトリに西のワークスペースが目的されているはずです.以下、これを ~/zephyrproject とします。
2.2 MicroPython のソースを入手する
MicroPython のソースは、Zephyr のワークスペースとは別の場所にある構造になっています。ゼファーの作業場は汚いし、別の場所だ。
git clone https://github.com/micropython/micropython.git
cloneしたら、ディレクトリにアニメーションってサブモジュールを入手します。
cd micropython
git submodule update --init lib/micropython-lib
micropython-lib MicroPython は標準のライブラリグループとサブモジュールとして分離されています。これを入手するには準備がないとビルド時にエラーになるので、忘れて実行してください。
登場する本は本、FRDM-MCXN947の設定は本家の主人です。パッチを当てている必要はありません。
のためを読んで、のファイルがあることを使って確認してください。 micropython ディレクトリにあるSTATUSはそのまま実行します。
ls ports/zephyr/boards/ | grep mcxn947
frdm_mcxn947_mcxn947_cpu0.conf と frdm_mcxn947_mcxn947_cpu0.overlay の 2 つが意味すればOKです。
もしやファイル名が长いのか
Zephyrでは、じボードでもコアやアクションモードによって複数の構成をホールドすることがあります。 FRDM-MCXN947 Cortex-M33 Cortex-M33をデュアルで搭載しているため、 frdm_mcxn947/mcxn947/cpu0 のように「ボード名/SoC名/コア名」が指定されます。ボードクオリファイアー(board qualifier)とボードクォリファイアー。
MicroPython の Zephyr ポートは、この修飾子を含めた名前でconf/overlay を探索します。つまり frdm_mcxn947.conf という名前では読み込めません。 frdm_mcxn947_mcxn947_cpu0.conf として初めて見られます。自己分割した設定は設定に追加され、設定は設定に追加されます。
2.3 ビルドする
まずZephyrの仮 環境について考えるのが効果的です。
source ~/zephyrproject/.venv/bin/activate
Zephyrのバージョンを合わせます。
cd ~/zephyrproject/zephyr
git checkout v4.4.0
west update
MicroPython の Zephyr ポートが対応を明言しているのは、v3.7 (LTS) および v4.4、そして开発版です。本家のCIはv4.4でビルドを検査しています。のバージョンになっていると、ワークスペースの外に、通ってもアクションが違反になったりすることがあるので、ここでv4.4.0に揃えておきます。
west update HALやライブラリなどの関連モジュールを取り正すためのものです。 git checkout だけでは不統合が残っているため、必ずセットで実行してください。
準備ができたら west build を実行します。
cd ~/zephyrproject
west build -b frdm_mcxn947/mcxn947/cpu0 ~/micropython/ports/zephyr
-b がボードで指定する、最後の引数はがビルド対相のアプリケーション(MicroPythonのZephyrPort)です。 ~/micropython の部分は,実记にクローンした場所に読んでください。
ビルドが通ると build/zephyr/ 下に zephyr.bin , zephyr.hex , zephyr.elf が生成されます。
2 エピソード後、設定はストレートでストレートです。 --pristine (または -p ) 前回の戻りの結果は前回の戻りの結果です。
cd ~/zephyrproject
west build -p -b frdm_mcxn947/mcxn947/cpu0 ~/micropython/ports/zephyr
2.4 ボードに书き込む
FRDM-MCXN947にはMCU-Linkデバッガがオンボードで本は別の方法で書かれており、目的が必要であり、本は別の方法で書かれています。
USBケーブルはJ17 (MCU-Link側USBコネクタ)コネクタ
図2:USBコネクタJ17(MCUリンク側)コネクタ
続きを受け取ったら, west flash を実行するだけです。
cd ~/zephyrproject
west flash
本き込みが終わりわると、ボードは自動にリセットされてMicroPythonが始まります。
このJ17は书き込みだけでなく、MicroPythonと対语するための通常通信にも使います。詳細についてはセクション 3.2を参照してください。
▲ カタログに戻る
3. MicroPythonってみる—基本エディター
とりあえずが书き込めたら、いよいよMicroPythonをタッチっていきます。
3.1 トニーする
MicroPython は使いやすく、MicroPython の環境は必要ありません。ターミナルソフトでも構造化していませんが、ここではThonnyを作っています。
ThonnyはMicroPython初の関数型プログラミング言語であり、同時に統合開発環境(IDE)でもあります。無料で利用でき、Windows、macOS、Linuxに対応しています。
ソニー公式サイト
Thonny's のインストールとの基本操作が基本操作で、以下のアニメーションが該当部分です。
MicroPythonをi.MX RTクロスオーバーMCUでアニメーションかしてみた(YouTube) — Thonnyのインポート部分から再生成されます
トニーはポイントの利点であり、コミュニケーションは同じです。
本の上部、本の上部、本の上部、本の上部
ボードのファイルシステム( /flash ) の中の体をGUIで見られる
PCとボードのファイルをポータル&ドロップでコピーできる
という点です。第4章。
3.2 USB USB
FRDM-MCXN947にはUSB Type-Cのコネクタが複数あります。 MicroPython のコンソールにシステム ぐのはJ17 、MCU-Link 側のコネクタです (セクション 2.4の図 2 と同じ地です).
MicroPython のコンソールは、Zephyr のコンソール( zephyr,console ) に出力されます。 FRDM-MCXN947のcpu0では,これが flexcomm4_lpuart4 (P1_8 / P1_9) オリジナルのMCU-Link MCU-Link VCOM (仮愿COMポート) があります.
つまりJ17の1书で、一時の书き込みとコンソールの両方ができます。 MCXN947 の本体は本体の USB 方式であり、この章の構成は USB 方式です。
3.3 確認を受け入れる
ケーブルを行いましたThonnyをスタートします。
Thonnyの右下(またはメニューの「実行」→「インタプリタの選択」)から、インタプリタとして「MicroPython (generic)」を選択して、ポートニボードのVCOMを指定します。
Windows: COM3 のような名前
macOS: /dev/cu.usbmodem…
Linux: /dev/ttyACM0 など
図3:インタプリタに「MicroPython (generic)」を选ぶ
うまくいくシステムががると、下のシェル(Shell) ペインにプロンプトが出ます。 Ctrl-D (ソフトリセット)を試してみてください。
MicroPython v1.30.0-preview.17.g47e9329e51 on 2026-08-30; zephyr-frdm_mcxn947 with mcxn947
Type "help()" for more information.
>>>
図4: 続に成功すると、シェルペイン(ウィンドウ下)にバナーとプロンプトがされることを意味します
zephyr-frdm_mcxn947 with mcxn947 の最後の部分に注目してください。 zephyr-frdm_mcxn947 は Zephyr の CONFIG_BOARD 、 mcxn947 は CONFIG_SOC から作られる名前です。ここが楽しみになって進行していれば、スナイプしたボードを使用のバイナリが移動していると確認できます。
>>> まずは「Hello, world!」の式から出してみましょう。
>>> print("Hello, world!")
Hello, world!
MicroPython は Python なので、数式をヒットするだけでも結果が返ります.
>>> 1 + 2
3
>>> "MCX" * 3
'MCXMCXMCX'
ファイルシステムも確認しておきます。
>>> import os
>>> os.getcwd()
'/flash'
>>> os.listdir('/flash')
[]
ストレートバックを開始しますのカレントディレクトリが /flash になっています。これは今回はマージされたセットでLittleFSがマウントされているからです。まだ何も志していないので中体は空です。
3.4 「REPL」とは
今生きているこの対情码ENVIRONMENTをREPLとHUびます。 Read (読む)、 E val(評価価する)、 Print (式する)、 Loop (粲り返すす)の頭文字はありません。
1行の入力強制、MicroPythonはそれを読み、実行し、結果を表し、また時の強制入力を待ちます。これがREPLです。
コンパイルして书き真剣で実行して、という手顺を踏んで、分からないCの开発と比較的と、試行錯誤の回しかた一瞬が変わってきます。例えば「このピンをHIGHにしたらLEDは点くのか、排除できるのか」のような確認が、そのフィールドで1行ヒットするだけで済みます。ハードウェアの挙動を手動検出りで真かめるとき、REPLは非常に強力です小道具になります。
REPLは使いやすく、操作も簡単です。
キー
アクション
Ctrl-C
実行中のプログラムを中断する
Ctrl-D
MicroPython を再起動する
Ctrl-E
ペーストモードに入る
Ctrl-A
rawREPLモードに入る
Ctrl-B
通常のREPLモードに戻る
表1:REPL制御システム
Ctrl-Cは、無制限ループ発生したプログラムを停止してください。 Ctrl+D
Ctrl-Eのペーストモードは、複数行のコードをまとめてステッカーできる時に使います。通常 REPL は 1 行ごとにインデントを解釈しようと考えるので、 for 文のような複数行のコードをそのままにしてもうまくいかないことが起こります。 Ctrl-E してらコ-ドを貼り付けます、Ctrl-D で実行しますと、まとめられます。
3.5 スクリプトを书いて見る:Lチカ
ここまではREPLに1行ずつなんとかんできました。ちょっとした確認にはこれここ半分はいのですが、缲り回しや条件分岐が入ってきて当然に俫になります。
ではスクリプトを书いてみましょう。 LEDのLチカ(LEDチカチカ)です。
FRDM-MCXN947にはRGBのLEDがあります。まずは红を点杀させてみます。红のLEDはP0_10、つまり ("gpio0", 10) に式があります。
トニーの上半身は本の上半身であり、下半身は本そのものである。
import time
from machine import Pin
led = Pin(("gpio0", 10), Pin.OUT) # 赤LED (P0_10)
while True:
led.value(0) # 点灯
time.sleep(0.5)
led.value(1) # 消灯
time.sleep(0.5)
図5: 本の上面。下側がシェルペイン
书けたら、ツールバーの「実行」ボタン(緑色の三角形のアイコン。ショートカットはF5)を気をつけます。 Thonnyがious Generation ched in in in on in MicroPython今日のテストはテストと同じ、テストはテストと同じ。
赤色LEDが0.5秒で正常に点灯します。
やめて、やめて、やめて、やめて。シェルペインでCtrl-Cを気にしても同じように出ます。
ここで「あれ?」と思った方へ
コードをよく読んでください。 value(0) は照明をオンにすることを意味し、 value(1) は照明をオフにすることを意味します。直感は真実を見ることの反対であり、調和は真実です。
FRDM-MCXN947のRGB LEDは、アノードコモンで接続され続けています。 LED側電源方式、マイコンのピンがマイナス側をリードっ張る形です。つまりピンをLOW(0)にしたときに電流が流れて点灯します。
図6: FRDM-MCXN947回路のRGB LED部分。LED電源システム
Zephyr の devicetree には、この LED が GPIO_ACTIVE_LOW という情報がちゃんとあります。ただし MicroPython の machine.Pin は、devicetree のこのフラグを见ずにGPIO を生の値を読み続けます(内で gpio_pin_set_raw() をHU しています)。そのため、论理を反転してくれることはありません。 0 を书すればピンはLOWになり、LEDは点きます。
さて、 led.value(0) は led.off() とも书けます。つまり led.off() をハブとLEDは点灯します。ミンマオと実记の行動が逆になるので、カオスしそうなときは value(0) / value(1) で书くほうが安全かもしれません。
もうひとつ 注: toggle() はありません
彼のポートのMicroPythonにカスタムされていますと led.toggle() と来ましたが、Zephyrポートの Pin にはこのメソッドがありません。新しいものにしてください。
メソッド/固定数
説明
value([x])
引用はなしで読み出し、引用はありで书き込み
on()
HIGH(1)を出力
off()
LOW(0)を出力
init(...)
ピンの設定更新
irq(...)
カットり込みハンドラを設定
Pin.IN / Pin.OUT / Pin.OPEN_DRAIN
入力電力と出力電力
Pin.PULL_UP / Pin.PULL_DOWN
プルアップ / プルダウン
Pin.IRQ_RISING / Pin.IRQ_FALLING
カットり込みエッジ
表 2: ZephyrPort の machine.Pin で使えるもの
トグルしたいときは、読んで転んで书れば済みます。
led.value(not led.value())
3.6 このボードで使えるピンをアニメーションべる
さて、红のLEDが ("gpio0", 10) であることは、どこから来た値なのかを description しないまま使ってきました。では自分で调べるにはどうすればいいのでお願いします。
この节では、答えを探しにZephyrのSETファイルまでドロップしていきます。小さく入った说になるので、最初を急いでぐ方は読んで飞ばして4章に入って構造ではありません。第4章:では、ここで调べた対応表を一度作ってしまえば、その後ドロップしたは名前でピンを指定できる、という语をします。
Cannian ながら、 MicroPython の Zephyr ポートには「できるピンの一覧を作る」関数がありません。 machine モジュールの中身を見ても、ピンの名前は出てきません。
>>> import machine
>>> dir(machine)
Pin 、 I2C 、 SPI 、 UART 、 PWM 、 ADC 、 Timer 、 WDT のようなクラス名が和びます(実记に入るはビルド時のセットで変わるので、手元で実行して真かまってください)。 Pin というクラスがあることはわかりますが。
では、どこを見ればいいのか
答えへはZephyrのdevicetreeです。
デバイスツリーとは
(Zephyrのオリジナルコンテンツは「FRDM-MCXN947デバイスツリー」として知られており、「FRDM-MCXN947のデバイスツリーはオリジナルと同じである」)
devicetree(デバイスツリー)は、ボードにどんなハードウェアが在っていて、どうやって話しているテキストファイルです。当初はLinuxカーネルで使われていた士组みで、Zephyrもこれを採用しています。
「この SoC には I²C コントローラが何的にあって、それぞれのアドレスにあって、どのピンに出ていて、効果的なのか無いのか」 といった情報が、 .dts / .dtsi とい拡张子のファイルのストラタ構造で书かれています。 Zephyr にこれを読み取って、必要な方の初期化コードやピンの設定を自動で生成します。
ソースコードにピン番号をダイレクトブックの代わりに、ハードウェアの構成情報をコードから分離しておく、というテストえ方です。おかげで、じアプリケーションのソースを使うボードと同じでけにビルドすることができます。
MicroPython の Zephyr ポートが ("gpio0", 10) というタプルを要件とするのも、このdevicetree の構築をそのまま反映しているからです。 gpio0 のデバイス名はdevicetree、 10 はそのポート内のビット位置です。
FRDM-MCXN947のデバイスツリーを読む
FRDM-MCXN947 構成は、Zephyr のリポジトリ下のファイルに书かれています。
zephyr/boards/nxp/frdm_mcxn947/frdm_mcxn947.dtsi
この中の arduino_header というノードに、Arduinoヘッダーの各ピンがどのGPIOに部門があるかがわかります。
arduino_header: arduino-connector {
compatible = "arduino-header-r3";
gpio-map = ,
,
,
,
, /* RX */
, /* TX */
,
...
, /* SCK */
, /* SDA */
; /* SCL */
};
は「ヘッダーのD13は gpio0 の25ビット目」という意味です。これをMicroPythonのタップに正すと ("gpio0", 25) になります。
じファイルの中と同様に、LEDとスイッチの定義もあります。
leds {
compatible = "gpio-leds";
green_led: led_1 { gpios = <&gpio0 27 GPIO_ACTIVE_LOW>; ... };
blue_led: led_2 { gpios = <&gpio1 2 GPIO_ACTIVE_LOW>; ... };
red_led: led_3 { gpios = <&gpio0 10 GPIO_ACTIVE_LOW>; ... };
};
gpio_keys {
compatible = "gpio-keys";
user_button_2: button_0 { gpios = <&gpio0 23 ...>; }; /* SW2 */
user_button_3: button_1 { gpios = <&gpio0 6 ...>; }; /* SW3 */
};
红のLEDが &gpio0 10 、つまり ("gpio0", 10) であることがここで確認できます。 GPIO_ACTIVE_LOW と书かれているのも見ますね。最初の説明は根の根です。
毎回 devicetree を読むのか?
さて、これを曲に戻すたびに、べるのはは今ではありません。 「LEDを光らせたいだけなのにdevicetreeを読む」というのは、MicroPythonの手軽さを台無しにしています。
そこで4章では、この対応表現を一度だけ作って、その後は名前で书けるようにする方法を紹介します。
3.7 Lチカの色を変えてみる
対泽の前に、タップル指定の不便さをもう小さい身体感覚にしておきましょう。 3色LED光源。
devicetreeから読み取った値は時の正しくでした。
色
ピン
タップル
赤
P0_10
("gpio0", 10)
緑
P0_27
("gpio0", 27)
緑
P1_2
("gpio1", 2)
表3:RGB LED照明
import time
from machine import Pin
red = Pin(("gpio0", 10), Pin.OUT, value=1)
green = Pin(("gpio0", 27), Pin.OUT, value=1)
blue = Pin(("gpio1", 2), Pin.OUT, value=1)
while True:
for led in (red, green, blue):
led.value(0) # 点灯
time.sleep(0.5)
led.value(1) # 消灯
Pin() の value=1 は、ピンを出力に設定すると同時に初期値をHIGH(消灯)にする仕様です。これを払えないと、設定した瞬間に瞬間点灯することがあります。
赤→緑→緑とシュンファンに光れば成功です。
とりあえず、このコードを見てどう思いますか。
red = Pin(("gpio0", 10), Pin.OUT, value=1)
("gpio0", 10) という部分は「が読めません」という意味です。 red という変な数字の名前を払ったから書けるだけで、この数字だけを見て「赤いLED」だとわかる人はいないはずです。
まさか、この数字てもエラーにはなりません。 ("gpio0", 11) と书いたら、存在するピンなので Pin は正常にされ、LED だけないだけです。 「どこが悪いのか」を探すのに時に取られることになります。
この質問を、回の張で片払って下さい。
▲ カタログに戻る
4. 緊急編集者: ピン名を公夫する
Zephyr ポートがピン名を提供できないなら、それを分離することが目的です。それがこの章です。
Step by stepを追いかけて、3つのstep by stepで進めます。
スクリプトの中の辞書を书く
config.py という別れのファイルに切り出す
ボードのストレージに出ています,すべてのスクリプトから共有
4.1 わかりやすいスクリプトの中にPINS Dictionaryを书く
一番単くない、スクリプトの前头にPythonの辞書を书いてしまうメソッドです。
import time
from machine import Pin
PINS = {
"LED_RED": ("gpio0", 10),
"LED_GREEN": ("gpio0", 27),
"LED_BLUE": ("gpio1", 2),
}
red = Pin(PINS["LED_RED"], Pin.OUT, value=1)
while True:
red.value(0)
time.sleep(0.5)
red.value(1)
time.sleep(0.5)
Pin(PINS["LED_RED"], ...) これなら何をしているのか一目でわかります。
さらに良いのは、タイプミスがエラーになることです。
>>> Pin(PINS["LED_RD"], Pin.OUT)
Traceback (most recent call last):
File " ", line 1, in
KeyError: LED_RD
まず「数字や数値に違反する」ということ。 Dictionary のキーを间violation えれば KeyError で停止まってくれます。これだけでもデバッグの手间がかなりマイナスです。
4.2 config.pyに切り出す
しかし、スクリプトを书くたびにこの辞書をコピーするのは面流です。実记、LEDだけでなくArduinoヘッダーやMikroBusのピンも定義になったので、辞書はどんどん长になります。そのたびにすべてのスクリプトの头にステッカーりペイけるのは成実的ではありません。
Pythonらしく、不ファイルに切り出してインポートしましょう。 config.py というファイルを作ります。
PINS = {
# --- Arduinoヘッダー ---
"D0": ("gpio4", 3), # P4_3 (RX)
"D1": ("gpio4", 2), # P4_2 (TX)
"D2": ("gpio0", 29), # P0_29
"D3": ("gpio1", 23), # P1_23
"D4": ("gpio0", 30), # P0_30
"D5": ("gpio1", 21), # P1_21
"D6": ("gpio1", 2), # P1_2
"D7": ("gpio0", 31), # P0_31
"D8": ("gpio0", 28), # P0_28
"D9": ("gpio0", 10), # P0_10
"D10": ("gpio0", 27), # P0_27 (CS)
"D11": ("gpio0", 24), # P0_24 (MOSI)
"D12": ("gpio0", 26), # P0_26 (MISO)
"D13": ("gpio0", 25), # P0_25 (SCK)
"D14": ("gpio4", 0), # P4_0 (SDA)
"D15": ("gpio4", 1), # P4_1 (SCL)
"A2": ("gpio0", 14), # P0_14
"A3": ("gpio0", 22), # P0_22
"A4": ("gpio0", 15), # P0_15
"A5": ("gpio0", 23), # P0_23
# --- バス(Zephyrのデバイスノード名) ---
"I2C": "lpi2c@94800", # flexcomm2_lpi2c2 (arduino_i2c)
"SPI": "spi@93000", # flexcomm1_lpspi1 (D10〜D13)
"MIKROBUS_I2C": "lpi2c@95800", # flexcomm3_lpi2c3
"MIKROBUS_SPI": "spi@b6000", # flexcomm6_lpspi6
# --- MikroBusのGPIO ---
"MIKROBUS_RST": ("gpio1", 3),
"MIKROBUS_CS": ("gpio3", 23),
"MIKROBUS_SCK": ("gpio3", 21),
"MIKROBUS_MISO": ("gpio3", 22),
"MIKROBUS_MOSI": ("gpio3", 20),
"MIKROBUS_PWM": ("gpio3", 19),
"MIKROBUS_INT": ("gpio5", 7),
"MIKROBUS_RX": ("gpio1", 16), # GPIOとして使える.UARTのRXではない
"MIKROBUS_TX": ("gpio1", 17), # GPIOとして使える.UARTのTXではない
"MIKROBUS_SCL": ("gpio1", 1),
"MIKROBUS_SDA": ("gpio1", 0),
# --- エイリアス ---
"LED_RED": ("gpio0", 10), # = D9
"LED_GREEN": ("gpio0", 27), # = D10
"LED_BLUE": ("gpio1", 2), # = D6
"SW2": ("gpio0", 23), # = A5
"SW3": ("gpio0", 6), # P0_6
}
すべてdevicetreeから転记した値です。
いくつか補足します。
RGB LEDはArduinoと共有されています。
赤色LED(P0_10)はArduino D9 D9と同じです。緑D10、青D6と同じ。 Arduino シールドを挿入しますときは、これらのピンをうと LED も一丝に光ります。逆に言うと、シールドがD6やD9をしていると、LEDのつもりで動作するとシールド側への影響が出ます。
SDA/SCLはA4/A5ではありません。
Arduino UNO R3 のボードでは、I²C の SDA/SCL が A4/A5 と同じ配線になっていることが多く、「A4=SDA,A5=SCL」と覚えている方も多いと思います。 I²CはAREFのネイバーにある専用のSDA/SCLピン(Zephyrのdevicetree上ではD14/D15)に出ていて、これはP4_0/P4_1です。 A4 (P0_15) および A5 (P0_23)、I²C システム独立 GPIO。第 5 章: ジャンパを性ぐときになるので、覚えておいてください。
SW2はA5と同じピンです。
ユーザースイッチのSW2(P0_23)は、ArduinoヘッダーのA5と じピンにシステムがついています。 A5の出力も回路の影響も同じで、注意点も同じです。
バスは文字列を「します」で指定します。
machine.I2C と machine.SPI のidパラメータは、タプルではなくZephyrのデバイスノード名の文字列です。 "lpi2c@94800" の 94800 は、MCXN947のメモリマップ上のペリフェラルのアドレス(0x94800)です。ここもdevicetreeの原点の値です。
4.3 ステージに保存したユーザー: して共有する
config.py ができました。
スクリプトは「モジュール」として読み込む
最初のステップは最初のステップであり、 import ステップはステップを完了するための最初のステップです。
config.py は特別なフォームのファイルではありません。 PINS = { ... } と使える、ごく普通の Python のスクリプトです。 Lチカのスクリプトと同じ、ただのテキストファイルです。
Python では,そばスクリプトを彼のスクリプトから読み進め import 使えます。
from config import PINS
これは「 config.py を読み込んで実行し、その中でされた PINS .py config 」という意味になります。がそのままモジュール名になります。 config.py 中体が実行されるので PINS という辞書ができます、それをここで使えます、というわけです。
よく作る定義やオフ数を比ファイルにまとめて書いて、必要なスクリプトから読み込む。これはPythonでごく一般的なやり方で、MicroPythonでも同じように使えます。
どこに志せばよいか
config.py をボードのどこに出ても、すべてのスクリプトから import できるでお願いします。
MicroPython は、モジュールを sys.path に和んだディレクトリから探索します。確認。
>>> import sys
>>> sys.path
['', '.frozen', '/flash/lib']
/flash/lib これは今回マージされた設定は LittleFS がマウントされたときに、起動プロセス ( _boot.py ) は自動的に追加されますが通常です。
つまり /flash/lib/config.py として保存すれば、どのスクリプトからも from config import PINS でめるということです。
トニーの家
Thonnyのメニューから「式」→「ファイル」を选ぶと、画面左側に表示されます。上半分がPC側、下半分がMicroPython側です。
図7:トニー /flash/lib config.py
使いやすく、スムーズです。
後半(ボード側)が /flash を表現していることを確認する
ボード横のペインで右クリック→「新しいディレクトリ」を選択して、 lib を作ります
作られた lib をダブルクリックして中に入る
前半(PC側)で config.py を右クリック→「/flash/libへアップロード」を选ぶ
設定して確認してください。
>>> import os
>>> os.listdir('/flash/lib')
['config.py']
コマンドラインから操作時(リモート)
Thonnyは使いやすく、操作も簡単で、操作も簡単です。 mpremote pip install mpremote でインストールできます。
まず lib ディレクトリを作ります。
mpremote mkdir :/flash/lib
その中に config.py をコピーします。
mpremote cp config.py :/flash/lib/config.py
スクリプトを実行するだけなら、ボードに保存せずに実行することもできます。
mpremote run blink.py
4.4 config.pyった3色Lチカ
準備をしましょう。セクション 3.7 のコードを书き正してみましょう。
import time
from machine import Pin
from config import PINS
red = Pin(PINS["LED_RED"], Pin.OUT, value=1)
green = Pin(PINS["LED_GREEN"], Pin.OUT, value=1)
blue = Pin(PINS["LED_BLUE"], Pin.OUT, value=1)
while True:
for led in (red, green, blue):
led.value(0) # 点灯
time.sleep(0.5)
led.value(1) # 消灯
セクション 3.7 と比べてください。ないは、 Pin() に複数あるものだけです。
red = Pin(("gpio0", 10), Pin.OUT, value=1) # 3.7節
red = Pin(PINS["LED_RED"], Pin.OUT, value=1) # こちら
("gpio0", 10) のような数字はどこにも出てきません。 「赤・緑・青のLEDを瞬発に光る」という意味図が、そのままコードになりました。
これで、 1.5セクションで挙げたZephyrポートの弱点を、実際に使ってほぼ解消できました。 config.py かつては「もしよかったら」を設定することで行われていましたが、その後はずっと作成することで削減されました。
なお、ここで使っている config.py の全文は4.2に含まれていてあります。
トラブルシューティング:うまくインポートできないときは
config.py いたのに ImportError が出る機会を設定しています、時間を確認してください。
ソフトをリセットします。シェルペインでCtrl-Dを気になります。 MicroPython は一度インポートするので、ファイルを出して変更しても古いものが使われることがあります。これにはよくある理由があります。
購入場所を確認してください。 os.listdir('/flash/lib') で config.py が見れるか真かめます。 lib ディレクトリを作る前にアップロードして、 /flash/ の正下に式かれているケースがよくあります。
sys.path を確認します。 import sys; print(sys.path) に /flash/lib が入ります。入っていなければ、 /flash のマウントに失敗している可能性があります。
ファイル名を確認します。 from config import PINS で読めるのは config.py という名前のファイルだけです。保存する前に、名前を保存することを忘れないでください。
▲ カタログに戻る
5. 編集者:スイッチを読む
第3章ではLEDを光らせました。 GPIO の貢献は非常に重要です。今日は度数が逆転して力が入ります。
FRDM-MCXN947には,ユーザーが免費で使えるスイッチが2つついています. SW2とSW3は同じです。ここではSW2を使います。
図8:ユーザースイッチSW2とSW3の位置
この章に追加パーツは要りません。ボードとUSBケーブルだけで入ります。
5.1 スイッチの状態を読む
SW2はP0_23がいてて、 config.py に SW2 として入れてあります。
from machine import Pin
from config import PINS
sw = Pin(PINS["SW2"], Pin.IN, Pin.PULL_UP)
print(sw.value())
Pin.IN 力設定を入力してください。 Pin.PULL_UP 内部抵抗が有効です。
なぜプルアップが必要なのか
このスイッチは、おつすとピンがGNDに行く路になっています。その逆も真、その逆も真、その逆も真。電気の状態が安定しており、電圧も安定しています。
プルアップ耐性を効果的にすると、いないときはピンがパワーサイドに上げられてHIGHになります。おつしたきだけ GND にキューかれて LOW になります。これで両四角の状態が分かります。
つまり読み出される値は時のようになります。
大下していない→ 1
大下している → 0
ここでも 0 が です。
LEDのときと同じアクティブ・ローの考え方で(セクション3.5 ),このボードではよく出てくる形です.
実行して真かめてみましょう。
>>> print(sw.value())
1
杀していないので 1 が回りました。ながら実行すれば 0 になります。
粲り回し読む機会
ステータスを監視し続けるなら、こうなります。
import time
from machine import Pin
from config import PINS
sw = Pin(PINS["SW2"], Pin.IN, Pin.PULL_UP)
last = sw.value()
while True:
now = sw.value()
if now != last:
print("押された" if now == 0 else "離された")
last = now
time.sleep_ms(20)
前の章で、「の値と比べて」、「変化したときだけ」は「しています」を意味します。そのたびに、という意味であり、ずっと出力され続けているという意味です。
この法をポーリングと淳ます。公式グループは純粋で単純で、欠点は小さくて明らかです。 sleep_ms(20) の间にスイッチが阿されて里されると、见出してしまいます。かべき間隔を短くすると、その分だけCPUがこの確認に充電されます。
5.2 杀されたことを切り込みで知る
そこで使えるのが开り込みです。
「ピンの状態が変化したら,この关数をHUNDE」とログイン方法、対処方法、やり方が欲しいです。 「脱出」を参照してください。
machine.Pin irq() メソッドで登録します。
import time
from machine import Pin
from config import PINS
sw = Pin(PINS["SW2"], Pin.IN, Pin.PULL_UP)
n = 0
def pressed(pin):
global n
n += 1
print(" 割り込み %d 回目 value=%d" % (n, pin.value()))
sw.irq(handler=pressed, trigger=Pin.IRQ_FALLING)
print("SW2を数回押してください(30秒間)")
for i in range(30):
time.sleep(1)
sw.irq(handler=None)
print("合計 %d 回検出しました" % n)
実行してSW2を10回の返済結果です。
SW2を数回押してください(30秒間)
割り込み 1 回目 value=0
割り込み 2 回目 value=0
割り込み 3 回目 value=0
(中略)
割り込み 10 回目 value=0
合計 10 回検出しました
押された回数、呼び出された回数、呼び出された回数。
コードの読み方
trigger には、どのような変化でHUNDE欲しいと思いますか。
特定
平均
Pin.IRQ_FALLING
HIGH→LOWの変化(このボードでは「した」)
Pin.IRQ_RISING
LOW→HIGHの変化(「 」)
`Pin.IRQ_FALLING \
Pin.IRQ_RISING`
䡡方
表 4: irq() の trigger できるもの
ここでは誓約したインスタントだけ知りたいので Pin.IRQ_FALLING を指定しています .
handler にまたがるパス番号は、見積を1つ受け取りますようにきます。ばれるときは、切り込みの起きた Pin オブジェクトが多くなるためです。上記の例は pin.value() として、そのピンの値をお読みになります。
global n これはPythonの正常な決定まりで、MicroPythonでも同じです。
最後の sw.irq(handler=None) が最後です。元に戻して、手放してください。
ハンドラの中で print() してよいのか
カットり込みハンドラの中では、時間のかかるプロセスやメモリを確保するプロセスを避けるのが原則です。 print() はどちらにも道がありますので、元々は避けていました。
ただしMicroPythonの irq() には hard という引用があり、確立された値は hard=False です。このとき、ハンドラはカットり込みが出てきましたインスタントではなく、小し後の安全なタイミングにまわって実行されます。そのため print() を书いても質問はありません。
hard=True 応答応答は速度になりますが、 print() やメモリ確実はできなくなります。まずは確立されたままで構造はありません。
チャタリングについて
機械式接点スイッチ、接点接点は瞬時、接点は細かく細かくON/OFFがオンオフします。これをチャタリングと呼び出して、1周押すだけでカットり込みが多くも入る理由になります。
FRDM-MCXN947のSW2でわかりぎりでは、10回押しに対してカットり込みは10回、チャタリングは観尺されませんでした。ただしスイッチの個別しかたによってはRISEこりうるので、数が合わないときは、前回の時間が経過し、時間が経過し、短い時間が経過し、短い時間が経過し、時間が経過しました。
▲ カタログに戻る
6. 使い方エディター: I²Cを使ってみる
GPIOのサブI²C。温度は良好です。
6.1 このボードのI²Cの件
FRDM-MCXN947にはP3T1755という温度センサーがございます。 I²CとI3Cの両方に対応した、分解エネルギー12bit、精度±0.5℃のセンサーです。
ちなみに,これをMicroPythonからそのまま読むことはできません.その理由は次のとおりです。
MCXN947のI3C1は、デバイスツリー上にあります。
pinmux_i3c1: pinmux_i3c1 {
group0 {
pinmux = ,
;
...
};
};
つまりSDAがP1_16、SCLがP1_17です。
一方、MicroPython の Zephyr のポートにはI3C の意見がありません。 machine モジュールにあるのは I2C だけで、 I3C というクラスは存在しないのです。つまりMicroPythonからは、このセンサーには手が届きません。
しかしI3Cのターゲットデバイスは、I²CのカクテルからもI²Cデバイスとしてアクセスできるようになっています(レガシーI²Cモード)。 P3T1755もそうです。 I3C信号線
ここで、最初ほど config.py にあったMikroBusのDefinitionを思い出してください。
"MIKROBUS_RX": ("gpio1", 16), # GPIOとして使える.UARTのRXではない
"MIKROBUS_TX": ("gpio1", 17), # GPIOとして使える.UARTのTXではない
P1_16とP1_17です。 I3C1 の SDA/SCL はI3C1 と同じです。
FRDM-MCXN947では、このI3Cの信号線がMikroBusコネクタのRX/TXピンにもリードされています(devicetreeでは「GPIO, Not a RX」というコメント払いで、GPIOとして扱われる時期があります)。
コネクタに出ているのなら、ジャンパラインで彼のバスに回線げます。
6.2 ジャンパを2本つなぐ
Arduino I²C( flexcomm2_lpi2c2 ) の学科です。セクション 4.2 では、このバスが出ているのはAREF のネイバーにある専用の SDA/SCL ピンであることを強調しています。 A4/A5ではありません。
配線は配線ハーネスによって行われます。
MikroBusコネクタ
信号
先頭に立って (Arduinoヘッダー)
信号
RX (P1_16)
I3C1_SDA
SDA (P4_0)
LPI2C2 SDA
TX (P1_17)
I3C1_SCL
SCL(P4_1)
LPI2C2 SCL
表5:JB配線
図9:ジャンパラインの接続続行
留意すべき点
SDAとSCLを違反することは出来ませんのでご了承ください。逆系はもちろん通信系。 MikroBus 側には RX と SDA があり、TX には SCL があります。 1番目の名前は1番目の名前の画像であり、1番目の名前は2番目の名前と同じです。
プルアップ抵抗: I²C はオープンドレインなので、本来はプルアップ抵抗は必要ありません。ただし作者の環境ではあり、外部支払いはけの抵抗なしで通信できました。 I3C1 側のデバイスツリーは bias-pull-up として指定されており、内部デバイスは有効なので有効です。通信の場合、4.7kΩレベルの抵抗はSDA/SCL、3.3Vの抵抗は3.3V~3.3Vの間で4.7kΩとなります。
A4/A5系がベストです。このボードのA4/A5はI²Cバスではありません。
6.3 バスをスキャンする
配線が完了し、配線の確認と確認が行われます。 I2C.scan() は,7ビットアドレスの法囲(0x08~0x77)に久问い合わせを出して,濜答え(ACK)を回したアドレスの一覧を回します。
REPLは直接試すことはできません。
>>> from machine import I2C
>>> from config import PINS
>>> i2c = I2C(PINS["I2C"])
>>> [hex(a) for a in i2c.scan()]
['0x48']
0x48 これがP3T1755です。
freq= は指定できません
彼のポートのMicroPythonでは I2C(id, freq=400_000) のようにクロックサイクリック波数を指定できますが、Zephyrポートでは例外になります。
>>> i2c = I2C(PINS["I2C"], freq=100_000)
Traceback (most recent call last):
File " ", line 1, in
NotImplementedError: explicit choice of freq is not implemented
scl / sda / timeout も同様に指定できません。これらはすべてdevicetreeで決定まる値だからです。 FRDM-MCXN947のI²Cは、devicetreeで clock-frequency = 、つまり100kHzに設定されています。速度を変えたい機会はdevicetree(またはoverlay)を书き変更して、暫定を構築し正すことになります。
何も见つからないときは
そらのリスト [] その場に戻って時刻を確認します。
半分挿入 半分挿入 半分挿入
SDAとSCLがなくなったか
ボードの電源が入っている(たり前ですが、USBがかけていることがあります)
プルアップが効果があるか
ロジックアナライザやオシロスコープがあれば、SC Lにクロックが出ますを见るの一時実です。 scan() は相手がいなくてもウェーブフォーム自分は出ているので、「クロックが出ていない」のか「クロックは出ているが応答えがない」のかを切り分けられます。
I²C の信号が見えない場合は、第 10 章に挙げた I²C 関連のブログを参考にしてください。
6.4 温度制御
P3T1755の構造は、旧型のLM75と同じで、互換性があります。温度も同じです。
ポイントレジスタに 0x00 (温度レジスタ)を书く
2バイト読む
読んだ2バイトは16ビットの値ですが、有効なのは上位12ビットです。下位は4ビットは长に0です。上位ビットの記号12ビットは2の補数で整数、1LSBは0.0625℃に対応します。
コードにしたらこうなります。
import time
from machine import I2C
from config import PINS
ADDR = 0x48 # P3T1755のI2Cアドレス
REG_TEMP = 0x00 # 温度レジスタ
def read_temperature(i2c, addr=ADDR):
"""P3T1755から温度を読んで摂氏で返す."""
i2c.writeto(addr, bytes([REG_TEMP])) # ポインタレジスタを指定
data = i2c.readfrom(addr, 2) # 2バイト読む
raw = (data[0] << 8) | data[1] # 16ビットに合成
raw >>= 4 # 有効なのは上位12ビット
if raw & 0x800: # 12ビットの符号を展開
raw -= 0x1000
return raw * 0.0625 # 1LSB = 0.0625℃
i2c = I2C(PINS["I2C"])
print("found:", [hex(a) for a in i2c.scan()])
while True:
print("{:.4f} degC".format(read_temperature(i2c)))
time.sleep(1)
実行すると、1秒ごとに温度が与えられます。
found: ['0x48']
25.5000 degC
25.5625 degC
25.5000 degC
...
センサーにタッチできると、値が上がるのがわかります。 0.0625℃と刻まれているので、近くをづけるだけでもアニメーションが見られるはずです。
コードの補足
raw >>= 4 の一部です。 P3T1755がす2バイトは、時のようなビット構成になっています。
図10: 温度制御構成
12ビットのデータが左诘め(MSB側に公開して)がんなされているので、4ビット右にシフトして右诘めにストレートしています。
記号( if raw & 0x800 )の展開は氷点下で正である必要があります。 12ビットの2の補数、のビット11が1なら負の数の最大値です。 Python の整数は限られており、「12 個の負の数」と「Python の負の数」はストレートでストレートな 0x1000 です。 0℃以上の場合は試験を省略し、安全性試験に入ります。
MikroBus側I²Cを使用する場合
じセンサーをMikroBusのI²C( flexcomm3_lpi2c3 )から読むこともできます。その機会はジャンパの続きをMikroBusコネクタのSDA(P1_0)/SCL(P1_1)にして、コードの PINS["I2C"] を PINS["MIKROBUS_I2C"] に変えるだけです。
i2c = I2C(PINS["MIKROBUS_I2C"])
MikroBus、SCL/SDA、RX/TX、SCL/SDA、交差、配線、短絡配線と同様です。
▲ カタログに戻る
7. 編集者:SPIってみる
最後はSPIです。
7.1 ループバックでトライアル
I²C はルール違反であり、FRDM-MCXN947 は SPI の標準であり、システムはそれに基づいています。そこでループバックでテストします。
ループバックというのは、MOSI(送信)とMISO(受信)を直接接続してしまう方式です。自己分割発送、自己分割返送、社外部品できます。
Arduino SPI ( flexcomm1_lpspi1 )は、サブのピンに出ています。
信号
Arduinoヘッダー
ピン
タップル
CS
D10
P0_27
("gpio0", 27)
モシ
D11
P0_24
("gpio0", 24)
味噌
D12
P0_26
("gpio0", 26)
SCK
D13
P0_25
("gpio0", 25)
表6:Arduino SPIの切断機能
D11(MOSI)とD12(MISO)をジャンパラインでラインしてください。
図11:MOSIとMISOを正解してループバックにする
from machine import Pin, SPI
from config import PINS
spi = SPI(PINS["SPI"], baudrate=1_000_000, polarity=0, phase=0)
tx = bytes([0x00, 0xFF, 0xAA, 0x55, 0x01, 0x02, 0x04, 0x08])
rx = bytearray(len(tx))
spi.write_readinto(tx, rx)
print("送信:", [hex(b) for b in tx])
print("受信:", [hex(b) for b in rx])
print("一致:", tx == bytes(rx))
旅の結果はこうなります。
送信: ['0x0', '0xff', '0xaa', '0x55', '0x1', '0x2', '0x4', '0x8']
受信: ['0x0', '0xff', '0xaa', '0x55', '0x1', '0x2', '0x4', '0x8']
一致: True
送り返して送り返してください。 SPIが正しく動作しています。
ジャンパラインを外して実行すると、信頼できるデータが変わります。 MISOがどこにも组がっていない国(ハイ限界)になるので、 0x00 ばかりになったり。
お好きなギフトをお送りください
0x00 、 0xFF 、 0xAA 、 0x55 、そして 0x01 ~ 0x08 という与びには理由があります。
0x00 / 0xFF : すべてのビット 0 とすべてのビット 1。ラインは固定、ラインは固定
0xAA / 0x55 : 10101010 と 01010101 .ビットごとに成り上がるので、タイミングの窭炒见るのに向けて
0x01 , 0x02 , 0x04 , 0x08 ...:1のビットを1つずつずらしていく。ができる
ロジックアナライザで波形を見るときにも、この与びはジャッジしやすくて便利です。
SPIのモード
polarity と phase は SPI のモードを決定しますパラメータです。
モード
極性(CPOL)
フェーズCPHA
0
0
0
1
0
1
2
1
0
3
1
1
表 7: SPI のモード
ループバックでは自分が発信したものを自分で受け取っただけなので、どのモードでも満場一致でします。実记のデバイスに式ぐときは、そのデバイスのデータシートに合わせてください。
なお、I²Cと違反ってSPIでは baudrate が指定できます。
7.2 CS自動制御システム
今度こそ、実记のSPIデバイスを式ぐってCS(チップセレクト)が必要になります。
ここで、このポートならではのこだわりポイントがあります。
MicroPython Zephyr ポートの SPI には、CS を自動制御しません。
多くのMicroPythonのポートでは、 SPI オブジェクトにCSピンをたくさん待っていて、転刊のたびに自動でCSをLOWにして、最終的にわったらHIGHに戻ってきます。しかしZephyrポートの実装では、内部でZephyrに多すSPI設定のCS指定が空になっています。
したがって、 CS は machine.Pin 自分でコントロールする必要があります。
import time
from machine import Pin, SPI
from config import PINS
cs = Pin(PINS["D10"], Pin.OUT, value=1) # アイドル時はHIGH
spi = SPI(PINS["SPI"], baudrate=1_000_000, polarity=0, phase=0)
data = bytes([0x9F]) # 例:何かのコマンド
rx = bytearray(3)
cs.value(0) # CSをアサート(LOW)
spi.write(data)
spi.readinto(rx)
cs.value(1) # CSをデアサート(HIGH)
print([hex(b) for b in rx])
CSはアクティブ・ローなのが全般です。 value(0) は選択されていません。 value(1) は選択されていません。 LEDは 0 と同じ「有効」です。
CSを戻せないようご注意ください。
LOW のままにすると、時の転送信でデバイスがカオスになります。転発信のたびに cs.value(0) と cs.value(1) を対で书く、そして忘れないのが真実です。
MikroBusのSPIをご利用ください
MikroBus コネクタの SPI( flexcomm6_lpspi6 ) も同じように使えます。これが下の注のマージで新たに使えるようになったものです。
cs = Pin(PINS["MIKROBUS_CS"], Pin.OUT, value=1)
spi = SPI(PINS["MIKROBUS_SPI"], baudrate=1_000_000, polarity=0, phase=0)
MikroBusには豊富な種類のクリックボードが目的になっているので、そこをオンラインでテストするのも面白いと思います。
▲ カタログに戻る
8. 編集者:イーサネットってみる
最後はイーサネットです。
8.1 有線LAN接続
ヘッドの外観は小さく、タッチも小さく、有線イーサネットは強力で強力です。ここで、その理由を具体的に考えておきます。
電波が使用され、無線は禁止および制限されており、場所が使用されます。
期間の安定性は安定しており、決定のサイクルはサイクルの目的であり、その目的はそれを使用することです。
配線と配線、通信と通信、通信と配線
工場設備、有線ケーブル設備、環境設備
MCXN947 のイーサネット コンソール(ENET QoS) は Zephyr の意見で行われていて、MicroPython からサポートされている socket モジュールは常に使用できます。
8.2 このポートのネットワークAPI
まず第一に、できることとできないことをはっきりさせておきます。
できるのは socket モジュールだけです。
>>> import socket
>>> import network
Traceback (most recent call last):
File " ", line 1, in
ImportError: no module named 'network'
ここは、NXP のマイコンと同様にけであるi.MX RT の専用ポート( ports/mimxrt ) と比較的とわかりやすいと思います。あちらではイーサネットを時々のように扱えます。
import network
lan = network.LAN(0)
lan.active(True)
DHCP サーバがあればアドレスはそこから一致され、無ければ lan.ipconfig(addr4="...") で実行時にSET できます。インターフェイスを有効にするもの無効にするもの lan.active() ひとつです。
ZephyrPortには、この network モジュールがありません。 network.LAN() も ifconfig() も存在せずに、 IPアドレスのSETや確認をするための専用APIが無い、ということです。アドレスはビルド時のKconfigで決定します(後述)。
socket オブジェクトがホールドするメソッドも、一般的なMicroPythonより小さいです。
作る
作る
bind / listen / accept / connect
getsockname()
send / recv / recvfrom / sendto
getpeername()
read / write / readline / makefile
settimeout()
setsockopt / close
表8: Zephyrポートの socket ・
特殊効果は3点です。
getsockname() が無いので、自分のIPアドレスを直接は表現できません(セクション 8.4回避戦略を表示します)
settimeout() が無いので、通信は通信の目的のために待機します(詳細についてはセクション8.8の詳細な説明を参照)
accept() が回収开続元アドレスは长に None です.ポートのソースにコメントで // TODO と书かれている、の一部がアンインストールされています
IPアドレスはビルド時に決定します
このポートには、実行時に IP アドレスを設定するという意味がありません。
ports/zephyr/prj.conf の確立された価値は時代のようになっています。
CONFIG_NET_CONFIG_MY_IPV4_ADDR="192.0.2.1"
CONFIG_NET_CONFIG_MY_IPV4_NETMASK="255.255.255.0"
CONFIG_NET_CONFIG_MY_IPV4_GW="192.0.2.2"
CONFIG_NET_DHCPV4=y
DHCP は有効です、DHCP は有効ですワークに式げればそこからアドレスが开里道てられます。 DHCP サーバがいない環境では、の Quiet アドレス 192.0.2.1 が使われます。
なお 192.0.2.x は、RFC 5737 は文書の例です。 Zephyr のサンプルセットがそのまま入っているだけですので、実记のでは自分のネットワークに合わせた値に変更することになります。変更する機会はボードの .conf に上书きのセットを使って、ビルドしてください。
8.3 PC直接接続テスト
DHCP LAN LAN システム LAN システム DHCP LAN システム DHCP LAN LAN システム DHCP LAN システム DHCP LAN システム DHCP LAN システム DHCP LAN システム DHCP LAN システム DHCP システムボードがどのアドレスを受け取ったのかを知るのが面恧す( getsockname() が無いため).
ここでは、ボードとPCをLANケーブルでダイレクトノットしてテストします。これはボードのアドレスは静的設定の 192.0.2.1 に決定まるので真実です。
(下の写真では「ストレートノット」ですがコンピューターにイーサネットポートが無いのでUSB Type-C(イーサネット)
図12:ボードとPCを直接接続する(※このコンピュータの場合、デバイスの接続にはEthernetポートがないのでUSB Type-Cコンバータを使用します)
PC側の設定
PCのイーサネットはPCのイーサネットと同じです。
プロジェクト
価値
IPアドレス
192.0.2.2
サブネットマスク
255.255.255.0
無事ゲートウェイ
空欄
表9:PC側設定
192.0.2.2 はボードがゲートウェイとしてSETしているアドレスなので、これに合わせて保存と都合がいいです。
最近のPC自動MDI / MDI -
はたきで正かめる
MicroPython はタッチの手前にあり、PC は ping ゾーンにあります。 Zephyr IP スタックはMicroPython とはbie のスレッドで動いているので、 REPL に何も入力しなくてもping には応答します。
ping 192.0.2.1 PING 192.0.2.1 (192.0.2.1): 56 data bytes
64 bytes from 192.0.2.1: icmp_seq=0 ttl=64 time=1.088 ms
64 bytes from 192.0.2.1: icmp_seq=1 ttl=64 time=0.657 ms
64 bytes from 192.0.2.1: icmp_seq=2 ttl=64 time=1.938 ms
--- 192.0.2.1 ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
これが通れば、 PHYのリンク・イーサネットの意見・IPスタックまで動いていることになります。ここが通らないうちにMicroPythonのコードを书いても意味がないので、最初に確認してください。
通信に関しては、PC側のIP設定、PC側の電源、および電源供給の安定性を確認します。
8.4 自己分割IPアドレス
getsockname() がないので、ボードに「あなたのIPアドレスは?」と直接は文けません。
代表してわりに使えるが bind() の成不了です。自己 bind() 支持と失敗なので、候補者を従属テストか、どれをホールドしているかがわかります。
import socket
for ip in ("0.0.0.0", "192.0.2.1", "192.168.1.1"):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
s.bind((ip, 9999))
print(" bind OK ->", ip)
except Exception as e:
print(" bind NG ->", ip, type(e).__name__, e)
s.close()
実行するとこうなります。
bind OK -> 0.0.0.0
bind OK -> 192.0.2.1
bind NG -> 192.168.1.1 OSError [Errno 2] ENOENT
0.0.0.0 ここでは 192.0.2.1 だけが成功したので、ボードは静かな設定のアドレスを使っているとわかります。 DHCPはDHCPと同じです。
DHCPは必要なときだけ使用するものであり、単体でスタンバイとして使用することは困難です。それは機会です、それはDHCP プログラムと同じです。 「どの机にどのアドレスを貸していますか」の一覧が見られるので、そこからボードのアドレスを拾ってください。
8.5 ボードをWebサーバにする
ここまでで疎通は確認できました。最後に、ボードをWebサーバにしてみます。 PC側の目的は「するものはブラウザだけです」を使用することです。
import socket
srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
srv.bind(("0.0.0.0", 8080))
srv.listen(1)
print("listen 0.0.0.0:8080 接続待ち...")
cl, addr = srv.accept() # addr は常に None
print("接続あり:", addr)
req = cl.recv(256)
print("リクエスト先頭:", req.split(b"\r\n")[0])
body = " FRDM-MCXN947 MicroPython on Zephyr "
cl.send("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n" + body)
cl.close()
srv.close()
bind() に "0.0.0.0" を多しているのは、「このボードがホールドしているすべてのアドレスで治療できる」という意味です。アドレスを決定めヒットちしなくても大丈夫ですので、DHCPでもストレートノットでもそのままアニメーションきます。
「するとボード横はこう」は「して」を表し、その後実行を待ちます。
listen 0.0.0.0:8080 接続待ち...
このSTATEでPCのブラウザから http://192.0.2.1:8080/ を开いてください。
図13:ブラウザからボードにアクセスする
ボードラテラルにはリクエストがされます。
接続あり: None
リクエスト先頭: b'GET / HTTP/1.1'
接続あり: None となっているのが、セクション 7.2 に触れられた accept() の非実装组です。身体と身体のつながりも同様で、コミュニケーションが障害となります。
Python の数十行、マイコンが Web サーバになりました。ここから、センサーの値を HTML に埋めて無視すれば、第 6 章温度テスター 温度計 温度計 になります。
8.6 LED照明制御操作
最初のセクションは最初のセクション、最後のセクションは最後のセクションです。今日はブラウザからボードのLEDを操作できますようにみます。
第 3 章: で光らせた LED を、 /on と /off という URL で切り代えます。
import socket
from machine import Pin
from config import PINS
led = Pin(PINS["LED_RED"], Pin.OUT, value=1) # 1 = 消灯
srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
srv.bind(("0.0.0.0", 8080))
srv.listen(1)
print("http://192.0.2.1:8080/ を開いてください")
running = True
while running:
cl, _ = srv.accept()
try:
req = cl.recv(256)
path = req.split(b" ")[1] if b" " in req else b"/"
if path == b"/on":
led.value(0) # アクティブ・ロー: 0で点灯
elif path == b"/off":
led.value(1)
elif path == b"/quit":
running = False
state = "ON" if led.value() == 0 else "OFF"
cl.send("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n"
"Connection: close\r\n\r\n"
" FRDM-MCXN947 "
" RED LED: %s "
" ON / OFF "
"" % state)
except OSError as e:
print("接続エラー(無視):", e) # 後述.握りつぶして継続する
try:
cl.close()
except OSError:
pass
srv.close()
print("サーバを終了しました")
最初のセクションには 14 行の「が」と 38 行の「ここが」が含まれています。
ブラウザで http://192.0.2.1:8080/ を开くと、「ON」「OFF」のリンクが与ったページが出ます。クリックするたびに、ボードの红LEDが実界に点々出てきました。
図14:ブラウザからボードのLEDを操作する
http://192.0.2.1:8080/quit を开すればサーバが終わりになります、REPLに戻ります。
ここまで引っ越しなら成功です。コードの中の人、 try / except を入れてある理由については発行录にまとめました。
8.7 電源装置が電源装置に接続されています。
ここまでは,PCからスクリプトを実行していました。最後に、 PC ベースの電源装置には電源装置 40 によって電力が供給されます。
MicroPythonが起動すると、 /flash は起動時に自動的に使用されます。
_boot.py … ファイルシステムのマウントなど(ファームウェアに内蔵,変更不可)
boot.py … あれば実行される(起動時の設定用)
main.py … あれば実行される(アプリケーション用)
つまり /flash/main.py として保存したスクリプトは、電源を入れるだけで動きます。
セクション 7.6 LED オペレーション システム main.py LED オペレーションを保存します。 Thonnyなら,エディタで開いたSTATUSで「ファイル」→「名前を払って保存」を選択して、最初に「MicroPythonデバイス」を選択して main.py という名前にします。 mpremote なら時の正論です。
mpremote cp led_server.py :/flash/main.py
保存したらUSBケーブルを除いて、ACアダプターやモバイルバッテリーなど、電源システムにおいでください。 LANケーブルは組み立ててあります。
しばらく出てから PC のブラウザで http://192.0.2.1:8080/ を开くと、 PC ベースの LED ディスプレイ、LED ディスプレイ オペレーション システム。
Python の数十行をブックいて main.py という名前の前で設定しただけで、ネッ トワーク クロスしにできるマシンになりました。
「抜け道」のつもりで保存しなければならない
それに注意を払うことが重要です。
main.py はSTARTのたびに実行されます。もしその中文が accept() で出続けているんだったら, REPLは永久に戻ってきません。セクション 8.8 : べるとおり、このポートには settimeout() が無く、Ctrl-C でも抜けられないからです。
今後REPLに入れないということは,その main.py を抜くこともできないというSTATUSになります。
セクション 7.6 のコードに /quit を入れてあるのは、このためです。ブラウザで http://192.0.2.1:8080/quit を开ればスクリプトが終わり、REPL が来ます。ネットワーク経絡上のVERYKou というわけです。
main.py 仕事の順序は時間の順序であり、順序は時間の順序である。
まずは通常のスクリプトとして実行し、今後の行動を確認することを楽しみにしています
終わりは終わり、手段は終わり、終わりは確定した( /quit など)
それから main.py として保存する
いきなり main.py に书いて Try すのは避けてください。
8.8 ハマりやすいポイント
settimeout() がないので、ブロックすると戻ってきません
ご注意ください。
accept() や recv() は、手が来て待機が終わります。通常、MicroPython settimeout() 待機時間の上限は待機時間の上限です。
なお、これはC语のレベルで待っているのでCtrl-Cが効きません。状態が良くなるとREPLは力を入れて受けるのが得意です。
筆者も同様で、電源は必須です。リセットボタンでも戻らないことがあります。
対泽としては、
accept() を実行したら,すぐに与続しに行く(ブラウザのアドレスバーにURLを入れておき,実行後すぐ开けるようにしておく)
缲り回し受信けペイできるサーバには、 8.6の /quit のような抜け道を必ず覚悟しておく
アクション main.py セクション8.7 .
エラーで正に合ったあとは EADDRINUSE になります
サーバーのプログラムが途中でエラーが終了しました、待って受信けに使っていたソケットが开じられないまま残っています。そのSTATEでもう一度実行するとこうなります。
Traceback (most recent call last):
File " ", line 10, in __main__
OSError: [Errno 112] EADDRINUSE
「そのアドレスとポートはもう使われている」という意味です。 SO_REUSEADDR いても、以前のソケットが本道开いたままなら効果はありません。
Ctrl-D でソフトリセットすれば、MicroPython が再起動されてソケットがすべてliberate ます。サーバーを书いてテストしているときは、エラーが出たらまず Ctrl-D を取る、と覚えておくと楽です。
ネットワークはREPLが止まっていても動いています
これは知っておくと切り分けが楽になります。 Zephyr IP スタックはMicroPython とはbie のスレッドで移動可能であるため、 MicroPython がしっかりしていてもping には応答します。
つまり、「pingは通るのにREPLが抜き濜」というSTATUSは、Ethernetの失敗ではなくMicroPythonがブロックしていることを表示しています。逆に「pingも通らない」ならケーブルやSETを怪しいう、という切り分けができます。
DNS環境シーケンス
socket.getaddrinfo() 名前解決もできますが、DNS サーバーのアドレスは CONFIG_DNS_SERVER1 の確立された値が 192.0.2.2 になりました。 DHCP環境、DHCP、マッチング、DNSなど。 直接接続の構成は名前の前にソリューションがあり、IPは直接指定です。
▲ カタログに戻る
9. まとめ
FRDM-MCXN947でMicroPythonをアニメーションかすまでの一通りを見てきました。最後の重要なポイントは、それを整理することです。
今度はもう一度やってみます
ホーム micropython/micropython の master に FRDM-MCXN947 の設定があったことで、パッチを当てずに本家のソースからそのままビルドできるようになりました。 /flash
有線イーサネット接続
MicroPython がアニメーションく安いボードの多くは無線でネットワークにシステムぎますが、このボードは有線のイーサネットをホールドしてます。電波は使われる場所であり、電波の目的は電波の安定性と目的です。このメモはウェブページで確認されました。バ見てブラウザから見たところを実機で確認しました。
ゼファーの弱点、その弱点
ピンを ("gpio0", 10) のようなタプルで指定しなければならない点が、このポートの一盘の使いにくさです。これは config.py に PINS 辞書を意にして /flash/lib/ に志してで、実用上ほぼ解出できます。本の最初の名前は本です、名前は本です、名前は本です、名前は本です KeyError で検出ようできるという子的な効果もあります。
ひきこもり
ボード設定ファイルの名前は、ボード変更サブ組み込みの frdm_mcxn947_mcxn947_cpu0.conf で認められません
クローンしたあとに git submodule update --init lib/micropython-lib が必要です
RGB LEDはアクティブ・ロー。 value(0) で光る( off() を火ぶと光る)
Pin に toggle() はない
スイッチ入力は Pin.IN, Pin.PULL_UP で構成されます。大下 0 (LEDと同じアクティブ・ロー)
Pin.irq() が使えます。 hard=False を設立しましたのでハンドラ内で print() してよい
このボードのArduinoヘッダーのI²Cは、A4/A5ではなく専用のSDA/SCLピン(P4_0/P4_1)
machine.I2C に freq= / scl= / sda= / timeout= は指定できない(devicetree で決定まる)
SPIの自動制御システム、 machine.Pin 手動制御システム
MicroPyth には I3C がないため、ジャンパで I²C バスに引用する必要がある
os.uname() はこのポートでは组見受け入れられていない
ネットワークは socket のみ. network モジュールはありません
socket に getsockname() が無いので、自分の IP は bind() の成不でアニメーションべる
socket に settimeout() が無い。 accept() や recv() でブロックするとCtrl-Cでも抜けられず、電源の入れストレートしが必要になることがある
accept() が洗い合おう元アドレスは长に None
accept() は失敗しても例外を投票げない。無効なソケットが返されました、回の recv() が EBADF になるので、 try / except OSError で囲む
サーバがエラー終了するポートが洴まれたままになります。 Ctrl+D で解放します
IPアドレスは実行時に変更できません。 Kconfigで決意まるのでビルドしましょう
このビルドでは input() が使えません(関数レベルが BASIC_FEATURES のため。対言说ちが必要なときは time.sleep() (によるカウントダウンで代用します)
MicroPython は非常に強力で強力です。 FRDM-MCXN947 高性能なマイコンでも、MicroPython でづかして感情をつかんでから本片の実装を C で书く、という入り方は十に见実的だと思います。
ぜひお試ししてみてください。
▲ カタログに戻る
10.参考文献
MicroPython
MicroPython公式サイト
MicroPython ドキュメント
MicroPython GitHub リポジトリ
MicroPython Zephyrポートのreadme
今回はマージされたPull Request (#19573)
ゼファー
ゼファープロジェクト公式サイト
Zephyr入門ガイド
Zephyr FRDM-MCXN947 ボードドキュメント
Zephyrシリーズ 第2章 はじめてのビルドと実機アニメーション(日本语ブログ)
ツール
ソニー公式サイト
Thonnyのインストールとの基本操作(YouTube)
mpremote ドキュメント
ハードウェア
FRDM-MCXN947製品
MCX Nシリーズ 製品ページ
P3T1755 製品ページ
バス
NXPコミュニティ・ブログ:I²Cバスの概要 (日本语ブログ)
NXPカメラ
NXPコントローラ:I3Cプログラマの概要
NXPコミュニティ・ブログ:I²Cハードウェア・デバッグ (日本语ブログ)
▲ カタログに戻る
11. 補足事項:LED動作システムの説明
セクション 8.6のコードについて、中国語の说をここにまとめました。この記事の流れは 2 つの部分に分けられる唯一のものです。アニメーションかすだけなら考えなくても構築しない。
11.1 ここまでのコンテンツが1まとめている
このコードは小さいわりに、この记事で読んだことをほとんど使っています。
from config import PINS — 第4章の定義
Pin(PINS["LED_RED"], ...) — LEDの3章。 value(0) でLighting Upセクション 3.5説明したアクティブ・ローだからです
socket — 小説第7章
11.2コードの3つのしはんけ
(1) while True
セクション 8.5のサーバは 1 return で終了わりで一応、運用を続けるには缲り回しが要ります。 accept() 問題、セクション 8.8の問題のステータス、および問題のステータスを待っています。
そこ /quit しました。
elif path == b"/quit":
running = False
ブラウザで http://192.0.2.1:8080/quit を开くと、最後の応答答えしてからループをけ、REPLが来ます。たった2行ですが、これが無いとプログラムを止めるめる入れる手段が力のストレートししかなくなります。
(2) リクエストからパスをとり出す
ブラウザは、続くときのような文字列を受信して、まいりますを送信します。
GET /on HTTP/1.1
Host: 192.0.2.1:8080
...
このうち必要はない真ん中の /on の部分だけです。空白部分がカットされ、2つのアイテムが切り取られます。
path = cl.recv(256).split(b" ")[1]
b" " そうのように b が発行しているのは、コミュニケーションで受け取ったけたけるのが文字行ではなくバイト行だからです。比較する側も b"/on" と书く必要があります。
(3)現状の反映
led.value() 今の出力が読めます。アクティブ・ローなので 0 が軽いです。
state = "ON" if led.value() == 0 else "OFF"
これで、ページを开きまっすぐたびに現在の状態がされます。
11.3 例外が必要な理由
ナオの著書『 try / except 』は、その地方の歴史についての物語です。
cl, _ = srv.accept()
path = cl.recv(256).split(b" ")[1] # ← ここで落ちることがある
今度こう书くと、ブラウザで操作を缲りリターンすうちに必ずいつかのエラーで停止します。
Traceback (most recent call last):
File " ", line 16, in
OSError: [Errno 9] EBADF
EBADF は「無なファイル记子」という意味です。 accept() が回ってきたソケットが、まともに使える状態にはなりません。
理由は、はこのポートの実装にあります。 ports/zephyr/modsocket.c の accept は、こうなっています。
int ctx = zsock_accept(socket->ctx, &sockaddr, &addrlen);
socket_obj_t *socket2 = socket_new();
socket2->ctx = ctx; /* エラーチェックが無い */
じファイルの彼のオフ番号は RAISE_SOCK_ERRNO(res) で戻り値を検checkしているのと同じで、 accept だけが検checkをしていません。 zsock_accept() が失敗して -1 を返しても、それはそのままその中身としてホールドち戻ってしまいます。その結果、の recv() が EBADF になるとき、という流れです。
ではなぜ accept() が失敗するのか。 Zephyrに扱えるネットワーク开続の数に上限があるためです。
CONFIG_NET_MAX_CONTEXTS=6
CONFIG_NET_TCP_TIME_WAIT_DELAY=1500
同時に6チャンネルの通信が使用でき、通信終了時間は TIME_WAIT 秒です。ブラウザはページ本のほかに /favicon.ico なども取りに来るので、続けてクリックしていると、あっという間の6枚を作ります。
例外は例外です。これで.
except OSError as e:
print("接続エラー(無視):", e)
cl.close() も try で囲んであるのは、壊れたソケットを閉じようとして、そこまた例外が出るのを防ぐためです。
実记にどのくらい失敗するのか
著者の環境ではテストが行われていません。
作戦のペース
成功/トライアル
間隔を置いて連続して打撃を行う
32 / 40
1秒間隔
15 / 15
2秒間隔
10/10
表 10: クリックの快さと応答 りこぼし
人がブラウザをクリックする程度のスピードさであれば、とりこぼしは起きません。継続して最初のものと戦い、最初のものは最初のもの、例外は最初のもの、例外は最初のものです。もう一度言いますが、昼も夜も普通です。
11.4 Connection: close について
これは のです。急行に切れてもらうこで、枠の解放をはーいます。
11.5 その他気をつける点
ページの文字はASCIIにしてあります。日本語を入れる機会は Content-Type: text/html; charset=utf-8 としてください
req.split(b" ")[1] if b" " in req else b"/" としているのは、 recv() が空を回ったとき IndexError で流さないようにするためです
Connection: close 返却の理由は、記録の説明です。
11.6 未来の未来
accept() のエラーチェックが意味がありません、メインレポートの場合はされうる部分を修正しました。修正されれば accept() が正しく例外をげられるので、 try / except の书き方も素正になります。ここに书いたコンテンツは、2026 年 8 月時点で公開されました。
ここまで来れば、あは応用です。 led を 3 色 RGB 操作パネル、第 6 章: 温度、温度、温度、温度、温度、温度計、温度計
▲ カタログに戻る
最終更新日:2026年9月2日:初版
=========================
この投稿の「コメント」欄は作成者によって書かれており、返信レターは現在作成者によって書かれています。 (当社は同社のNXP代理店、NXPのNXP販売店、NXPのパートナーであり、ご質問の直接の担当者はNXPです。) MicroPythonの本家R&D、ZephyrのZephyr、FRDM-MCXN947のFRDM-MCXN947の設定。 NXP NXP MicroPython MicroPython i.MX RT MCX Nシリーズが続いたことになります。
この记事では、増設のビルドと书き込みから开みて、REPLでの対線操作、Lチカ、スイッチ入力とカットり込み、I²C温度センサー、SPI、有線イーサネット、Webセンサー、LEDを操作するところまでを、フォローして説明します。機械の動作は機械の動作によって確認されます。
「MicroPythonをタッチするのは初めて」という方を考えて、途中でつまずきやすい点や、このポート固有の制限と回避戦略も有って书きました。 MicroPython and FRDM-MCXN947MicroPython and FRDM-MCXN947MicroPython and FRDM-MCXN947MicroPythonとFRDM-MCXN947 イーサネット インタフェース 導入 MCX 日本語ブログ Re: FRDM-MCXN947でMicroPythonを動かす (日本語ブログ) 有料級の記事ですね。非常に興味深いです。 Re: FRDM-MCXN947でMicroPythonを動かす (日本語ブログ) ありがとうございます
View full article