2021年8月11日水曜日

MicroPython ESP32 Memo 〜Add micropython-ulab〜

■概要

MicroPythonで、FFTで周波数抽出したりしたい。
MicroPythonのデフォルトには、FFTを使ったりするモジュールは入っていないらしい。
調べると、ulabというモジュールが使えるらしい。

MicroPythonにulabを組み込んでビルドするまでの手順をまとめる。

■環境

  • PC : Mac OS Catalina
  • Board : ESP32-WROOM-32D 開発ボード ESP32-DevKitC-32
  • 開発環境 : ESP-IDF

■前提知識

■手順

基本的には、 micropython-ulab のREADMEに書いてある内容。(一部違う) とりあえず、できた手順を忘れないようにまとめる。

■ディレクトリ構成

MicroPython
    |- project
        |- esp-idf         // esp-idfのコードをクローンしたところ
        |- micropython     // micropythonのコードをクローンしたところ
        |- ulab            // ulabのコードをクローンしたところ
  

■ビルドディレクトリのexport

  1. 「project」ディレクトリを開く
    「cd project」
  2. ビルドディレクトリをexport
    「export BUILD_DIR=$(pwd)」

■micropython, esp-idfのclone

MicroPython ESP32 Memo 〜Build MicroPython〜 を参照。

■ulabのclone

  1. ビルドディレクトリを開く
    「cd $BUILD_DIR」
  2. ulab をcloneする。
    「git clone https://github.com/v923z/micropython-ulab.git ulab」

■esp-idfのビルドとパスを通す

  1. ビルドディレクトリを開く
    「cd $BUILD_DIR」
  2. esp-idfディレクトリに移動
    「cd esp-idf」
  3. esp-idfのインストールとパスを通す
    「./install.sh」
    「. ./export.sh」

■micropythonのクロスコンパイラとESP32のサブモジュールをビルドする

  1. ビルドディレクトリを開く
    「cd $BUILD_DIR」
  2. micropythonのクロスコンパイラをビルドする
    「cd $BUILD_DIR/micropython/mpy-cross」
    「make」
  3. ESP32のサブモジュールをビルドする
    「cd $BUILD_DIR/micropython/ports/esp32」
    「make submodules」

■micropythonのビルド設定を変更する

ulabモジュールをビルドに追加する

  1. makefileを開く
    「cd $BUILD_DIR/micropython/ports/esp32」
    「vi Makefile」
  2. ulabモジュールを追加する。
    「BOARD ?= GENERIC」となっているところを、以下のように変更する。
    # BOARD ?= GENERIC
    BOARD = GENERIC
    USER_C_MODULES = $(BUILD_DIR)/ulab/code/micropython.cmake
        
  3. Escを押してから、「:wq」を入力し、Enterを押して、ファイルを保存する。

パーティション(メモリ割り当て)の変更

ESP32のデフォルトのパーティション設定では、ulabを追加してビルドすると、サイズエラーが出る。
アプリケーション領域が小さいっぽい。そのため、パーティション設定を変更する。

パーティション設定は、デフォルトでは、partitions.csvが利用されている。
そのため、ulab用のパーティションファイル partition_ulab.csvを作成して、設定をpartition_ulab.csv に変更する。

ulab用パーティションファイルを作成する

  1. パーティションファイルを作成する。
    「cd $BUILD_DIR/micropython/ports/esp32」
    「vi partitions_ulab.csv」
  2. partitions_ulab.csv を以下のようにする。
    # Notes: the offset of the partition table itself is set in
    # $ESPIDF/components/partition_table/Kconfig.projbuild and the
    # offset of the factory/ota_0 partition is set in makeimg.py
    # Name,   Type, SubType, Offset,  Size, Flags
    nvs,      data, nvs,     0x9000,  0x6000,
    phy_init, data, phy,     0xf000,  0x1000,
    factory,  app,  factory, 0x10000, 0x200000,
    vfs,      data, fat,     0x220000, 0x180000,
        
  3. Escを押してから、「:wq」を入力し、Enterを押して、ファイルを保存する。
  4. パーティションファイルを作成する。

ulab用パーティションファイルを使用するように設定を変更する

  1. sdkconfig.base を開く
    「cd $BUILD_DIR/micropython/ports/esp32/boards」
    「vi sdkconfig.base」
  2. sdkconfig.base を変更する。
    「CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv"」となっているところを、以下のように変更する。
    #CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv"
    CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions_ulab.csv"
        
  3. Escを押してから、「:wq」を入力し、Enterを押して、ファイルを保存する。

■micropython(ulab入り)のビルド

  1. 「cd $BUILD_DIR/micropython/ports/esp32/」
  2. 「make clean」 (過去にmicropython のビルド等をしている場合、必要かも?エラーが出ることがある?)
  3. 「make」

■動作確認

ESP32にダウンロードして、REPLで動かし、 「import ulab」として、エラーが出なかったらOK! 「help(ulab)」で、numpyやscipyが使えるのがわかる。

ダウンロード

  1. 「cd $BUILD_DIR/micropython/ports/esp32」
  2. 「make erase PORT=/dev/tty.usbserial-xxxx」
  3. 「make deploy PORT=/dev/tty.usbserial-xxxx」

動作確認

  1. 「screen /dev/tty.usbserial-xxxx 115200」
  2. MicroPythonのREPLが実行されたら
    「import ulab」
    「help(ulab)」

■参考URL

2021年4月30日金曜日

ESP32 Memo 〜 LED Blink 〜

■概要

今まででMicroPythonをDL、Buildして、ESP32で動かすことはできた。
( URL:MicroPython ESP32 Memo 〜Run Python Script〜 )
今度は、ESP32の電源をONして、どんな処理が行われて、MicroPythonが動くようになるのかを知りたい。

公式HPによると、MicroPythonは、4種類のモジュールに分けて作られているらしい。
(MicroPython libraries)

  • 標準的なPythonサブセットを実装しており、ユーザーによって拡張されることを想定していないモジュール
    (Modules which implement a subset of standard Python functionality and are not intended to be extended by the user. )
  • Pythonのサブセットを実装しており、ユーザーによって拡張されることを想定しているモジュール
    (Modules which implement a subset of Python functionality, with a provision for extension by the user (via Python code).)
  • Python標準ライブラリにMicroPython拡張機能を実装しているモジュール
    (Modules which implement MicroPython extensions to the Python standard libraries.)
  • 特定のMicroPythonポートに固有であり、移植生のないモジュール
    (Modules specific to a particular MicroPython port and thus not portable.)

上記のうち、4つ目の、移植性のないモジュールのところで、MicroPythonが動くまでの処理を知りたい。 この部分は、マイコンに固有の処理を行うところで、ここを知れば、他のマイコンにMicroPythonを移植することも可能だと思う。

最終的には、他のマイコンにMicroPythonを移植できるようになりたい。

現在、ESP32でMicroPythonを動かすことはできたものの、中身がどうなってるのかは不明。 というか、プログラムがどこから始まるのかもわかっていない。

そこで、まずはESP32の基本的な知識を学ぶ必要がある!
というわけで、プロジェクトを初めから作成して、Lチカまでできるようになるぞー!

■環境

  • PC : Mac OS Catalina
  • Board : ESP32-WROOM-32D 開発ボード ESP32-DevKitC-32
  • 開発環境 : ESP-IDF

■前提知識

なし?

■手順

ESP-IDF Programming Guide を参考に作業を行う。
また、LEDの接続は、MicroPython ESP32 Memo 〜Run Python Script〜 と同じにする(32番ピンにLEDを接続)。 まずは開発環境の構築から。 と思ったけど、すでにやってたので、こちらを参照。
(URL: MicroPython ESP32 Memo 〜Build MicroPython〜)
環境変数の設定からはやっていないので、そこから始める。 ちなみに、ファイル構成は以下の通り。

MicroPython
    |- project
        |- esp-idf         // esp-idfのコードをクローンしたところ
        |- esp32_practice  // ここにLチカのプロジェクトを作る
        |- micropython     // micropythonのコードをクローンしたところ(今回は関係ない)
  

terminalでは、最初にMicroPythonフォルダにいるものとする。 というわけで、環境変数を設定する。

  1. 環境変数を設定する。
    「. $HOME/・・・/Micropython/project/esp-idf/export.sh」
    (※・・・ は割愛)
  2. エイリアスを設定する。(よく使う人向け)
    「alias get_idf='. $HOME/・・・/Micropython/project/esp-idf/export.sh'」
    これをすることで、「get_idf」だけで、環境変数の設定(esp-idf/export.sh)を実行できるようになるため、 esp-idfの環境の設定やリセットを簡単にできるようになる。

次に、プロジェクトを作成してビルドする。
(プロジェクトを作成すると言っても、サンプルプロジェクトをコピーするだけ。)

  1. プロジェクトを作成する。
    (サンプルのプロジェクト(hello_world)をコピーする)
    「cd project/esp32_practice」
    「cp -r ../esp-idf/examples/get-started/hello_world .」
  2. プロジェクトフォルダに移動する。
    「cd hello_world」
  3. ターゲットCPUを設定する。
    「idf.py set-target esp32」
    (※ この操作は、プロジェクトを作成してから1回だけ実行すべきらしい。)
  4. コンフィグレーションを設定する。
    「idf.py menuconfig」
    このmenuconfigで、Wifiの名前やパスワードなどを設定できるらしい。
    ただ、今回のhello_worldではデフォルトのままでいいので、何もいじらなくていいため、即閉じる。 (※ ESP32-DevKitC の ESP32-SOLO-1 が載っているのを使用している場合は、CONFIG_FREERTOS_UNICORE のパラメータを変更して、シングルコアモードをEnableにしないといけないらしい。)
  5. プロジェクトをビルドする。
    「idf.py build」

最後に、ビルドしたイメージをボードにダウンロード、動作を確認する。

  1. ボードをPCと接続する。
  2. ビルドしたイメージをボードにダウンロードする。
    「ls /dev/tty.usb*」
    (接続されたポートをチェックする。
     /dev/tty.usbserial-xxxx につながっていたと仮定する)
    「idf.py -p /dev/tty.usbserial-xxxx -b 460800 flash」
  3. 動作確認する。screenコマンドでシリアルをモニタする。
    カウントダウンと「Hello world!」が表示されれば成功!
    「screen /dev/tty.usbserial-xxxx 115200」

というわけで、プロジェクト作成(サンプルをコピーしただけ)とビルド、書き込みまではできたが、、、
LED、光らせてない。。。
というか知りたい情報はこれじゃない感。。。
とりあえず、LEDを光らせるまではやろうと思う。

サンプルの中に、LEDを点滅させるプロジェクトが実は用意されているので、これを利用する。

  1. LED点滅のプロジェクトをコピーする。 「cd ../」
    ( MicroPython/project/esp32_practice ディレクトリに移動)
    「cp -r ../esp-idf/examples/get-started/blink .」
  2. blinkプロジェクトフォルダに移動。
    「cd blink」
  3. ターゲットCPUを設定。 「idf.py set-target esp32」
  4. コンフィグレーションを設定する。
    今回は、LEDを点滅させるポートを変更するため、menuconfigを開く。
    「idf.py menuconfig」
  5. menuconfigが開いたら、LEDを点滅させるポートを変更する。 menuconfigの「Example Configuration」->「Blink GPIO number」を選択してEnter。
    LEDを接続しているポート(32番ピン)を入力してEnter。
    「S」を押して、Saveして、「Q」を押してQuit。
    menuconfigが閉じる。
  6. プロジェクトをビルドする。
    「idf.py build」
  7. ビルドしたイメージをボードにダウンロードする。
    「idf.py -p /dev/tty.usbserial-xxxx -b 460800 flash」
  8. LEDが1秒おきに点滅したら成功!
LEDの点滅までできた。
が、これではESP32の起動とか、どんなコード書いたらこうなるとか、全くわからん。

LED点滅のblink.cをみたが、void app_main(void) 関数のみが書いてあり、 その中で、FreeRTOSの vTaskDelay(1000 / portTICK_PERIOD_MS); を使って、1秒おきにGPIOのHigh/Lowを切り替えているだけだった。
一般的に、Bootloaderの実行が終わったら、main()関数が実行されるが、ESP32は、void app_main(void) 関数が実行されるようになっているらしい。
しかも、vTaskDelay()関数が実行されているということは、app_main()関数が実行されるまでに、 FreeRTOSの初期化関数等の実行もすでに完了されている。

知りたいのは、MicroPythonの実行のされ方。
ESP32の場合、MicroPythonは、FreeRTOSの上で動いているらしい。
つまり、FreeRTOSの初期設定が終わって、app_main()が実行されてから、MicroPythonの初期化を行って、REPLなどが実行されるようになっている?

とりあえず、ESP32は、bootloader実行後、app_main()関数が実行されることは分かったので、 MicroPythonのソースコードでapp_main()があるかどうかをみて、それを起点にMicroPythonのコードの中身を見ていきたい。
ちなみに、bootloaderで、ドライバやFreeRTOSなど、どんな設定をしているのかも知りたい。
・・・気が向いたら・・・。

2021年4月29日木曜日

MicroPython ESP32 Memo 〜Run Python Script〜

 ■概要

作成したMicroPythonファームウェアに、Python Scriptファイル(.pyファイル)をダウンロード、実行する。
やる内容は、main.pyファイルを作成し、ボードにダウンロード、main.pyを実行するまで。
main.pyには、LEDを点滅するコードを書く。

シリアルプロンプトによるREPL(Read Evaluate Print Loop)でのプログラム?はいろんなところに載っているので、書かなくてもいいかな。
ただ、作成したPython Script(.pyファイル)を実行するやり方はあんまり書かれてない気がするので、メモに残しておく。

■環境

  • PC : Mac OS Catalina
  • Board : ESP32-WROOM-32D 開発ボード ESP32-DevKitC-32

■前提知識

ESP32は、ESP8266と大体同じ使い方ができるらしいので。。。

デバイスが 1Mbyte 以上のストレージを持っているなら、ファイルシステムを含むように(最初の起動時に)設定されます。このファイルシステムは FAT フォーマットを使用し、MicroPython ファームウェアの後にフラッシュに保存されます。
ESP32にも同じことが言える。
ESP32-WROOM-32D 開発ボード ESP32-DevKitC-32の仕様は以下の通り。
  • Product Description
    • ESP32 general-purpose development board, embeds ESP32- WROOM-32D, 4 MB flash, with pin header
  • Flash Size
    • 4MB
  • Antenna Type
    • Internal PCB on- board antenna
  • Temperature
    • –40 °C ~ +85 °C
  • Dimensions (mm)
    • 54.4×27.9
Flash Sizeは4MBなので、ファイルシステムが構築される。

で、このファイルシステムの中に、実行するPython Script(.pyファイル)をおけば、実行することができる。ただ、どんな名前でも良いわけではない。
MicroPythonは、起動時、最初にboot.pyを実行する。
boot.pyの実行が終了すると、次にmain.pyを実行する。(なければ実行されない)
というようになっているので、boot.py or main.pyを作成すれば、とりあえず動かすことができる。

ただ、デフォルトでは、REPLがされるっぽいので、ソフトリセットをすることで、Python Scriptを実行するモードにしなければならない。

以上を踏まえて、
  • main.pyを作成する。
  • main.pyをボードにダウンロードする。
  • Python Scriptが実行されるモード?にする。
の手順を行えば、作成したPython Scriptが起動後実行されるようになる。

■手順

ボードにLEDと抵抗を配線をする。
以下のように配線する。
  • ESP32ボードの32番ピン - LEDのアノード
  • LEDのカソード - 抵抗 47Ωの片方
  • 抵抗47Ωのもう片方 - ESP32ボードのGNDピン

次に、事前準備として、ampyをインストールしておく。
ampyは、Adafruit社が開発したツールで、シリアル回線経由でPCとボードとの間でファイル転送ができる。(参考 : ampy: MicroPythonマイコンとPCとのファイル転送ツール
  1. ターミナルで、以下のコマンドでampyをインストールする。
    「sudo pip install adafruit-ampy」

次に、Python Scriptファイル main.pyファイルを作成する。
main.pyはこんな感じ。

from machine import Pin
import time

p32 = Pin(32, Pin.OUT)

while True:
    print("LED ON")
    p32.on()                 # set pin to "on" (high) level
    time.sleep(1)
    print("LED OFF")
    p32.off()                # set pin to "off" (low) level
    time.sleep(1)

次に、作成したmain.pyをボードにダウンロードする。
先ほどインストールしたampyを使ってダウンロードする。
こちらのサイト(URL : ampy: MicroPythonマイコンとPCとのファイル転送ツール)を参考にした。
  1. PCとボードをUSBで接続する。
  2. ターミナルでmain.pyを保存した場所に移動する。
    (scriptsフォルダに保存している場合)
    「cd scripts」
  3. 接続されたポートをチェックする
    「ls -l /dev/tty.usb*」
    /dev/tty.usbserial-xxxx (xは数字?)が接続ポート。
  4. ボード(のFlash)に保存されているファイルを表示する。
    「ampy --port=/dev/tty.usbserial-xxxx ls」
    (※ デフォルトでは、boot.py だけが表示された。)
  5. 作成したmain.pyをボードにダウンロード(保存)する。
    「ampy --port=/dev/tty.usbserial-xxxx put main.py」
  6. main.pyがボードに保存されたかどうかを確認する。
    「ampy --port=/dev/tty.usbserial-xxxx ls」
    boot.pyに加えて、main.pyが追加されていれば成功!
ダウンロードしただけでは、ボードはREPLで動いている。
そのため、最後に、ソフトウェアリセットして、REPLで動くモードから、Scriptで動くモードにして、main.pyを実行させる。
LEDがチカチカするはず!
  1. ターミナルでREPLの画面を出す。
    「screen /dev/tty.usbserial-xxxx 115200」( ※ 115200bps )
    (※REPLが動いているので、Enterを押すと「>>>」が表示されるはず。)
  2. ボードをソフトウェアリセットする。
    screenで接続している時に、「Ctrl+D」でソフトウェアリセットできる。
    ソフトウェアリセットされて、REPLでなく、ただのシリアル通信として繋がり、
    「LED ON」「LED OFF」が表示されつづけ、LEDが点滅していれば成功!
ちなみに。。。
ampyでもリセットできるっぽい。
「ampy --port=/dev/tty.usbserial-xxxx reset」
これでも、ソフトウェアリセットがかかって、Scriptが実行されるはず。

終わり!

2021年4月11日日曜日

MicroPython ESP32 Memo 〜Build MicroPython〜

 ■概要

MicroPythonのbinaryファイルダウンロードしてを書き込んだら動いた!
ので、今度はMicroPythonをビルドしたい!

ので、MicroPythonをgitから持ってきて、ビルドして、binaryファイル作って、ボードで動かすまで。

■環境

  • PC : Mac OS Catalina
  • Board : ESP32-WROOM-32D 開発ボード ESP32-DevKitC-32

■手順

基本的に、MicroPythonの公式の通り。

まず、Gitからソースコードを取得する。
Git Hubのアカウントを持ってなかったら、作成しておく必要あり。
PCにgitをインストールしておく必要あり。
  1. 公式のmicropythonリポジトリをforkする。
    1. Git Hubにログイン(ブラウザから)
    2. ログインしたら、Search or Jump to... で「micropython/micropython」を検索して、公式のMicroPythonリポジトリにアクセス。
    3. 「fork」ボタンを押して、自分のリポジトリに公式のMicroPythonリポジトリをforkする。
    4. 自分のアカウントにmicropythonリポジトリができていることを確認する。
      自分のmicropythonリポジトリURL :
      https://github.com/<your-user-name>/micropython」
  2.  ローカルにプロジェクト(ソースコード etc.)をcloneする。
    1. terminalでmicropythonのソースコードを保存するところに移動する。
      「cd project」(projectフォルダに入れる場合)
    2. 自分のmicropythonリポジトリからプロジェクトをcloneする。
      「git clone https://github.com/<your-user-name>/micropython」
  3. 公式のmicropythonリポジトリを自分のmicropythonリポジトリの上流ブランチに設定する
    (公式のMicroPythonリポジトリで更新された内容を、自分のmicropythonリポジトリが追従できるようにする設定)
    (※ 上流ブランチと追跡ブランチの説明
    1. terminalで、cloneしたmicropythonフォルダに移動
      「cd micropython」
    2. 公式のMicroPythonリポジトリを自分のmicropythonリポジトリの上流ブランチに設定する
      「git remote add upstream https://github.com/micropython/micropython」
      (※ 多分、upstream xxxx で、xxxxが上流ブランチであることを教えてる?)
      (※ この設定で、「git pull」により公式のMicroPythonリポジトリの変更を反映できるようになる?気がする。ちなみに、pullは、fetchしてmergeするのと同じことらしい(fetchとpullの違い)。)
    3. 上流ブランチを設定できたか確認。
      「git remote -v」
      以下のような表示が出るはず。
      「origin       https://github.com/<your-user-name>/micropython (fetch)
      origin       https://github.com/<your-user-name>/micropython (push)
      upstream     https://github.com/micropython/micropython (fetch)
      upstream     https://github.com/micropython/micropython (push)」
  4. 作業用branchを作成する。
    1. terminalで、cloneしたmicropythonフォルダに移動
    2. 作業用branchを作成して、作業用branchに切り替える。
      (develop-branch というbranchを作成して、master→develop-branch に切り替え)
      「git checkout -b develop-branch」
次に、クロスコンパイルに必要なソフトウェアパッケージをインストールする。
公式のMicro Python on MacOSを参考にした。
  1. Xcodeが入ってなければ入れる。(clang コンパイラを入れるため)
  2. 必要なソフトウェアパッケージをインストール。
    「brew install libffi」
    「brew install pkgconfig」
    Pythonをインストールしてなければ、Python3.3以上をインストール。
    Gitもインストールしてなければインストール。
次に、クロスコンパイラをビルドする。
  1. terminalで、cloneしたmicropythonフォルダに移動。
    (すでにいる気がするなぁ)
    「cd micropython」
  2. クロスコンパイラをビルドする。
    「export PKG_CONFIG_PATH=/usr/local/Cellar/libffi/3.2.1/lib/pkgconfig/」
    「make -C mpy-cross」
    (※ home brewでlibffiを入れたので、export PKG_CONFIG・・・が必要。)
  3. クロスコンパイラのビルドが成功したら、
    micropython/mpy-crossフォルダの中に、
    mpy-cross.map, build, mpy-cross ができてる。
そしてついに、micropythonをビルドする!
が、まずは手始めに、unix用をビルドする。
Mac上で動かすことが可能なmicropythonが出来上がるはず。
  1. 「cd micropython/ports/unix」
  2. 「make axtls」
    (※ axtlsは、少量のメモリフットプリントの高度な設定インターフェイスで組み込みデバイス向けに設計されたTLSv1 SSLライブラリ。)
    結構時間かかる。
  3. micropython (unix用)をビルドする
    「make」
    結構時間かかる。
  4. ビルドが完了すると、micropython/ports/unix 以下に、build-standard, micropython フォルダなどが追加されている。
  5. micropython (unix用)を動かす。
    「./micropython」
    実行すると、以下のように、>>> が表示されて、おなじみのpythonっぽい表示が!

    「unix % ./micropython 

     MicroPython v1.14-152-g6f06dcaee on 2021-04-12; darwin version

     Use Ctrl-D to exit, Ctrl-E for paste mode

     >>>        」


ほんとについに!micropython ESP32用をビルドする。
が、今までのはunix用の環境設定+ビルド方法だったみたい。
ESP32用をビルドするためには、ESP32に合わせた環境設定からはじめないといけない。
公式のmicropython ESP32のREADMEにしたがって進める。

というわけで、micropython ESP32用の環境設定を行う。
まずは、esp32の開発環境のEspressif IDF version 4 をインストールする。
Espressif IDFを略して ESP-IDF と言ってるっぽい?
ESP-IDF のプログラミングガイドに、MacOSの場合のインストールの方法が書いてあったので、これ参考にする。micropython ESP32のREADMEよりも詳しく書かれてるし。
(pip, python, homebrew はインストールずみとする。)
  1. 事前準備として必要なパッケージをインストール
    「brew install cmake ninja dfu-util」
    「brew install ccache」
  2. ESP-IDFをclone
    (※ micropythonをcloneしたディレクトリと同じ階層にclone)
    (※ 2021/04/14現在、安定版の最新がv4.2)
    「git clone -b v4.2 --recursive htps://github.com/espressif/esp-idf.git」
  3. ESP-IDFをインストール
    「cd esp-idf」
    「./install.sh」
    → エラーが出た。。。Python2.7がカレントバージョンになってるのがダメらしい。
     Python3をカレントバージョンにして実行するとよい。(参考 : macOS Catalina zsh環境でpyenvを使ってPython 3.9.0をインストール)
    「source export.sh」
    (※ idf.py が使えるようになったよ!と表示されるが、よくわからん)
  4. micropythonをビルド
    1. cloneしたmicropythonフォルダに移動
      「cd ../micropython」
    2. クロスコンパイラをビルド
      「make -C mpy-cross」
    3. ESP32のソースコードが置いてあるところに移動
      「cd ports/esp32」
    4. サブモジュールをビルド
      (サブモジュールをアップデートしているだけ?)
      「make submodules」
    5. ESP32 micropythonをビルド
      「make」
    6. ESP32 micropythonがビルドてきたかどうかを確認する
      「ls」で、「build-GENERIC」フォルダができていることを確認。
      「ls build-GENERIC」で、firmware.bin ができていることを確認。
      できてればOK !!!
バイナリファイル ができたので、動作確認をする。
MicroPython ESP32 Memo 〜FW書き込み〜 に書いた方法で、作成したfirmware.bin を書き込むことができる。
MicroPythonの公式(MicroPython Internals Getting Started)には、idf.pyを使った書き込み方法が書かれているので、こちらの方法を試してみる。
(ただ、idf.pyは、中でesptool.pyを使って書き込んでいるだけなので、やっていることは同じはず?)
  1. cloneしたmicropythonフォルダのports/esp32に移動
    (上から続けてれば何も操作はいらないはず?)
  2. ESP32ボードをUSBでPCと繋ぎ、接続されたポートを調べる。
    「ls -l /dev/tty.usb*」
    (/dev/tty.usbserial-xxxx につながっていたと仮定する)
  3. ESP32ボードのflashをクリアする。
    「make erase PORT=/dev/tty.usbserial-xxxx」
    (※ 引数にPORT=xxxxをつけることで、ターゲットのポートを設定できる。
       デフォルトは/dev/ttyUSB0 となっているため、ちゃんとポート指定しないとエラーになる。)
  4. EPS32ボードにファームウェアを書き込む
    「make deploy PORT=/dev/tty.usbserial-xxxx」
    (※ make と実行すると、idf.pyが実行されるようになっている。
       idf.pyを直接使い方法もMicroPythonの公式HPに書かれている)
(※ [補足]
idf.pyで書き込む時、書き込まれるバイナリファイルは、build-GENERICフォルダ内の、partition_table/partition-table.bin(WriteAddress:0x8000〜)、bootloader/bootloader.bin(WriteAddress:0x1000〜)、micropython.bin(WriteAddress:0x10000〜)の3つ。
firmware.binはこの3つを合わせたバイナリファイルとなっている。 )

書き込んだら、「screen <USBport> 115200」で接続し、Pythonおなじみの
>>> 
が表示されることを確認した。

やった!できたよ!

2021年4月9日金曜日

MicroPython ESP32 Memo 〜FW書き込み〜

■概要

MicroPython を始める時の覚書。
ボードに出来上がりのMicroPythonを書き込んで動作確認するまで。

■環境

  • PC : Mac OS Catalina
  • Board : ESP32-WROOM-32D 開発ボード ESP32-DevKitC-32

■手順

基本的に、MicroPythonの公式ページの通り
公式はpipだが、brewでもできた気がする
  1. MicroPythonのFWをダウンロード
    (Firmware with ESP-IDF v3.x のSPIRAMじゃないほうの最新を使った)
    (URL : Firmware for Generic ESP32 module)
  2. PCとボードをUSBで接続する
  3. terminalを開き、FWを保存したディレクトリにcd コマンドで移動
  4. epstoolをインストールする
    「pip3 install esptool」
  5. 接続されたポートをチェックする
    「ls -l /dev/tty.usb*」
    /dev/tty.usbserial-xxxx (xは数字?)が接続ポート。
  6. フラッシュを消去する
    「esptool.py --port /dev/tty.usbserial-xxxx erase_flash」
  7. フラッシュにFWを書き込み
    「esptool.py --chip esp32 --port /dev/tty.usbserial-xxxx write_flash -z 0x1000 esp32-idf3-20210202-v1.14.bin」
    (esp32-idf3-20210202-v1.14.bin が最新でした @2021/04/09 )
  8. 終わり!

動作確認する。
デフォルトでは、シリアル通信でREPLを利用できる。
  1. PCとボードをUSBで接続する
  2. terminal を開く。
  3. 接続されたポートをチェックする
    「ls -l /dev/tty.usb*」
    /dev/tty.usbserial-xxxx (xは数字?)が接続ポート。
  4. 「screen /dev/tty.usbserial-xxxx 115200」( ※ 115200bps )
    適当にEnterを押すと、「>>>」が表示され、Pythonのインタプリタが使える。はず。

■参考

2018年11月25日日曜日

Raspberry Pi3 Redmine導入 エラーからの復活 まとめ

[背景]
https://chuchulabo.blogspot.com/2018/11/raspberry-pi3-redmine.html
でRedmine入れて,他のPCからRedmineのページが見れることを確認した。
浮かれた気分でRaspberry Pi3 を「sudo reboot」で再起動!

もう一度,Redmineのページが見れるかどうかを確認。
・・・見れなくなってた・・・
これが出るようになった。

We're sorry, but something went wrong.

We've been notified about this issue and we'll take a look at it shortly.
なーんーでーやー!

[目的]
Redmineのページを見れるように修復

[内容]
----- 現象 -----
いろいろいじってると,postgresqlにログインできないなくなっていることに気が付いた。
pi@raspberrypi:/ $ psql
psql: サーバに接続できませんでした: そのようなファイルやディレクトリはありません
ローカルにサーバが稼動していますか?
Unixドメインソケット"/var/run/postgresql/.s.PGSQL.5432"で通信を受け付けていますか?
----- 修正方法 -----
postgresqlを再インストールすれば直った。
再インストールの方法
  1. postgresqlを削除 「sudo apt-get --purge remove postgresql」
  2. postgresqlが削除できているか確認 「dpkg -l | grep postgres」
  3. 何も出てこなければOK。
    そうでなければ,
    「sudo apt-get --purge remove postgresql postgresql-doc postgresql-common」
    といった形で,出てきたものを一つずつスペースで区切って削除する。
  4. 「dpkg -l | grep postgres」で,何も表示されなくなるまで繰り返し。
  5. 再起動 「sudo reboot」 (別にいらないかも)
たとえば,「dpkg -l | grep postgres」で,つぎのように表示された場合,
pi@raspberrypi:/ $ dpkg -l | grep postgres
ii  postgresql-client-9.6                 9.6.10-0+deb9u1                   armhf        front-end programs for PostgreSQL 9.6
ii  postgresql-client-common              181+deb9u2                        all          manager for multiple PostgreSQL client versions
「sudo apt-get --purge remove postgresql postgresql-client-9.6 postgresql-client-common」
を実行して削除する。
最終的に,「dpkg -l | grep postgres」を実行して,何も表示されなくなればOK。
参考 : https://askubuntu.com/questions/32730/how-to-remove-postgres-from-my-installation

次に,postgresqlのインストールと初期設定を行う。 Redmineの公式の通りにしただけでは,おそらく同じようにRaspiを再起動したら使えなくなると思ったため。
  1. postgresqlをインストール 「sudo apt install postgresql」
  2. postgresqlサーバをインストール 「sudo apt install postgresql-server-dev-9.6」
  3. postgresqlユーザで,postgresqlのターミナルに入る。 「sudo -u postgres psql postgres」 ("postgres=#" が表示される。)     
    • 「CREATE ROLE redmine LOGIN ENCRYPTED PASSWORD 'your_password' NOINHERIT VALID UNTIL 'infinity'; CREATE ROLE」
    • 「CREATE DATABASE redmine WITH ENCODING='UTF8' OWNER=redmine;」
    • 「\q」(postgresqlからquit)
  4. postgresユーザのパスワード変更 「sudo passwd postgres」
  5. postgresユーザでログイン 「su - postgres」
    piユーザから,posgtresユーザに切り替わる。(postgres@raspberrypi:~$ が表示される。)
    • postgresqlのターミナルに入る。 「psql」
      • データベースロールの確認 「\du」
      • 「\q」(postgresqlからquit)
    • postgresユーザからログアウト 「exit」
  6. ディレクトリ移動 「cd /etc/postgresql/9.6/main/」
  7. pg_hba.confを編集 「sudo nano pg_hba.conf」
    ・・・(省略)・・・
    # Database administrative login by Unix domain socket
    # local   all             postgres                                peer
    local   all             postgres                                trust 
    
    # TYPE  DATABASE        USER            ADDRESS                 METHOD
    
    # "local" is for Unix domain socket connections only
    # local   all             all                                     peer
    local   all             all                                     trust
    ・・・(省略)・・・
    
  8. postgresqlを再起動 「sudo service postgresql reload」
  9. ここから先は,公式の操作の6.からを再度トレースする https://www.redmine.org/projects/redmine/wiki/HowTo_Install_Redmine_on_Debian_9
調べながらの作業では,実際に,上述の手順では行なっていないが,見直すと,こんな感じになっていた。

[結論]
大体の流れとして,psqlを再インストールして,postgresユーザの設定をして,公式の通りに操作すればOK。

[参考URL]

2018年11月20日火曜日

Raspberry Pi3 Redmine導入 仕切り直し


Raspberry Pi3 Redmine導入 仕切直し

[背景]
Redmineの導入に前失敗したし,
このままやと負けた気がするし,
とにかくRedmine入れたい!
いじりたい!

[目的]
Rasperry Pi3 Raspbian stretch にRedmineを入れる

[内容]
まず,前回で,設定がぐちゃぐちゃになっていたので,クリーンインストール。
NOOBで,Raspbianを入れて,クリーンな状態に。

  1. Raspbianの初期設定。
    https://chuchulabo.blogspot.com/2018/09/raspberry-pi-3.html
  2. Redmineのインストール。
    前回日本語で調べてたら出てこなかったけど,「redmine howto install」で調べたら,Redmineの公式のマニュアルが出てきた。
    RaspbianはDebian系なので,Debian Stretchへのインストール方法をそのまま実行。
    http://www.redmine.org/projects/redmine/wiki/HowTo_Install_Redmine_on_Debian_9
  3. 終わり!
「redmine howto install」でトップに出てくるリンク先は,上に貼ったリンクとは違う。
が出てくる。
このページに,
Redmine should run on most Unix, Linux, macOS, macOS Server and Windows systems as long as Ruby is available on this platform. See specific installation HowTos here.
と書いてある。
OS毎のインストール方法を見たい場合は,"here"のリンク先を参照してね。とのこと。
このリンク先から,Debian Stretchへのインストール方法のページに移動する。
ちなみに,"here"のリンク先は,以下。
http://www.redmine.org/projects/redmine/wiki/HowTos

[注意事項]
Redmineのインストールで,bundleをインストールするところがある。
"bundle install"コマンドを実行する前に,
"cd /opt/redmine/redmine-3.4.6/"コマンドで,ディレクトリを移動しておくこと。
理由としては,"bundle install"コマンドは,Gemfileがあるところでやらないと失敗するから。
できなくても,出てきたエラーでググったら簡単にどうすればいいかがわかる。
確か,GemFileがあるところをfindで探して,・・・的なHPがあるので,見たらわかる。

また,Redmineのインストールのマニュアルにある,
your_ip_addressとか,your_password とかは,適宜自分のraspberry piの設定に合わせる。

[まとめ]
公式あるなら,初めから見てればよかった・・・。
気づかなかった・・・そりゃ公式あるよね・・・。