プログラミングの合間に

マイコンのプログラミング奮闘記です。

3つのLEDを点滅させる(2)

MicroPythonのPinクラスを使う

前回に引き続きLEDを点灯させます。今回は3つのLEDを順に点灯させたいと思います。

Pinクラスは前回も当たり前のように使用していましたが、今回は少し深掘りしたいと思います。まずは、以下のプログラムを見てください。

import machine
import time

pin13 = machine.Pin(13, machine.Pin.OUT)
pin27 = machine.Pin(27, machine.Pin.OUT)
pin33 = machine.Pin(33, machine.Pin.OUT)

while True:
    pin13.on()
    time.sleep_ms(500)
    pin13.off()
    pin27.on()
    time.sleep_ms(500)
    pin27.off()
    pin33.on()
    time.sleep_ms(500)
    pin33.off()

f:id:sawayaka_e1:20200830141456j:plain

非常に幼稚なプログラムです。まず、プログラム自身には大きな影響はないのですが、少し見やすくするためにimportを少し変更します。先程のプログラムではモジュールのインポートを
import machineからfrom machine import Pinに書き換えます。このようにするとモジュールの中のクラスをインポートすることができます。これで毎回Pinの前にmachineを書かなくても良くなります。プログラムも少し見やすくなります。

pin13 = Pin(13, Pin.OUT)
pin27 = Pin(27, Pin.OUT)
pin33 = Pin(33, Pin.OUT)

こんな感じです。 ですが、根本的には解決していませんね。

Pinクラス

Pinクラスですが、使い方はPin(<GPIOのピン番号>, Pin.OUT)のようにGPIOのピン番号を指定して初期化を行いオブジェクトで値を操作します。
つまり、こんな感じです。

pin13 = Pin(13, Pin.OUT)
pin13.on() または pin13.off()

でも、これではGPIOのピンの一本一本にオブジェクトを作りアクセスするしか無いのかと思いました。AVRなどのマイコンC言語でポートアクセスする場合にはレジスタにアクセスすることで複数本のピンを制御できたのになぁ〜

それは昔の話、現代はオブジェクト指向!由緒正しくPython流のプログラミングをしましょう。
では、どうやって複数のピンを効率よく操作するかを考えているとこれしか無いかなーと思っています。オブジェクトの配列ですね。
これなら添字で個別にアクセスしたり、for文で一塊に制御できるのでは無いかと思います。

from machine import Pin
import time

pin_no = [13, 27, 33]
led = {}

led[0] = Pin(pin_no[0], Pin.OUT)
led[1] = Pin(pin_no[1], Pin.OUT)
led[2] = Pin(pin_no[2], Pin.OUT)

while True:
    for i in [0, 1, 2]:
        led[i].on()
        time.sleep(1)
        led[i].off()
        time.sleep(1)

かなり幼稚で横着なプログラムですが、オブジェクト配列を思いつくまではこんなプログラムを書いていました。

from machine import Pin
import time

pin_no = [13, 27, 33]

while True:
    for i in pin_no:
        Pin(i, Pin.OUT).on()
        time.sleep(1)
        Pin(i, Pin.OUT).off()
        time.sleep(1)

お恥ずかしいプログラムを今回はお見せしましたが、次回はLEDの点滅を順番に点滅させるだけでなく、色々な点滅パターンを考えたいと思います。また繰り返しの構文も解説します。

3つのLEDを点滅させる(1)

MicroPythonでのLチカを解説する

以下のようにブレッドボードに3つのLEDをESP32に接続した回路を作成しました。これを題材にMicroPythonのプログラミングを解説します。

f:id:sawayaka_e1:20200830141456j:plain

ESP32のGPIOの13,27,33番にLEDが接続されています。この中から13番に接続したLEDを点灯させましょう。

以下がプログラムです。

import machine
import time

pin13 = machine.Pin(13, machine.Pin.OUT)

while True:
    pin13.on()
    time.sleep_ms(500)
    pin13.off()
    time.sleep_ms(500)

これは前回のプログラムとほぼ同じと思います。
では、1行目から見ていきましょう。

import machine

このimportpythonのライブラリを呼び出す命令になります。現代のプログラミングではライブラリがとても重要です。pythonではライブラリをモジュールと呼ぶので、machineモジュールをインポートするという事になります。
2行目も同様にtimeモジュールのインポートになります。

では、このmachinetimeモジュールはどのような機能をプログラムに追加しているのでしょうか?

ESP32用のMicroPythonを使用しているので、このmachineモジュールはESP32のハードウェア固有の機能にアクセスできるようになっています。今回のプログラムもLEDを点灯させるだけならmachineモジュールだけのインポートで良かったのですが、点滅させてみたかったので、もう一つモジュールが必要になりました。それが、timeモジュールです。これは時間に関するライブラリです。今回は処理の時間待ちの機能を使っています。

では、3行目
pin13 = machine.Pin(13, machine.Pin.OUT)
の解説ですが、ここから概念的なこともありますので、継続してお話しする事もあります。今回は、ESP32のピンに電流を流しLEDを点滅させることが目的なので、13番ピンに電流を流せる準備を行なっているのが3行目と思ってください。

ここからが、抽象的な話になります。まず、pin13に何かが代入されています。このpin13インスタンスと呼ばれ、特定の機能とデータを保存します。つまり、13番ピンに電流を流す準備をして、電流を流したり、状態を調べたりの機能です。だから、pin13.on()とすると電流が流れます。つまりLEDを点灯させることができます。

while True:は制御文で無限に繰り返す処理をしています。では、何を無限に繰り返しているのかと言うと、

    pin13.on()
    time.sleep_ms(500)
    pin13.off()
    time.sleep_ms(500)

この部分は、インデントと言うのですが、行の頭に空白が挿入されています。いわゆる、字下げなのですがpythonではオフサイドルールという字下げしている部分をひとつの塊と考えます。カッコなどで塊を表さないので、タイプミスが原因のエラーになりにくく、見やすいことが利点です。

time.sleep_ms(500)は500ミリ秒間の時間稼ぎを行う関数です。 そして、pi13に対してon()off()で電流を流したり、止めたりできます。

駆け足で説明しましたが、次回はこのプログラムからどうやって3つのLEDを点滅させるのか解説します。

ESP32でLチカ

ブレッドボードで回路を組む

回路をブレッドボードで組みます。その方が、何度でも変更が簡単にできます。このブログで使用するESP32はDOIT社のDevKit V1と呼ばれるものです。筆者は2枚持っていますが、1枚はリセットがうまく動作しないのでMuエディタ等で通信に難がありますが、プログラミングには当面支障がないので問題が出るまで使い続けます。

f:id:sawayaka_e1:20200824214446j:plain

この写真のような回路でLEDを点滅させます。ESP32の基盤はいろいろなメーカーが販売していますが、どれも幅がありブレッドボードに差すともう電線を差すところが無いことがあります。写真のようにサンハヤトのブレッドボードは何とか3本分は電線を差す穴が見えます。

MicroPythonでプログラムを作成しますが、まずは細かい事に拘らずに動作を楽しむために今回はプログラムの説明はしません。解説は次回という事で、では下のコードを入力しましょう。

import machine
import time

pin = machine.Pin(27, machine.Pin.OUT)

while True:
    pin.on()
    time.sleep(1)
    pin.off()
    time.sleep(1)  

入力が終わると、保存ボタンを押してファイル名をつけて保存してください。そして、基盤をマイクロUSBケーブルで接続して実行ボタンを押します。

f:id:sawayaka_e1:20200824220527p:plain

すると、LEDが1秒間隔で点滅するはずです。

MicroPythonのファームウェア

ダウンロード

MicroPythonのプログラムをESP32で実行するには、マイコン自身にファームウェアと呼ばれるMicroPythonのインタプリタを起動しておく必要があります。(筆者は勝手に、Muエディタが全て実行環境を全て用意してくれると思っていました。)
以下にダウンロードサイトを記します。

https://micropython.org/download/

ここでESP32のファームウェアをダウンロードすれば良いのですが
どれをダウンロードすれば良いか迷うと思います。

f:id:sawayaka_e1:20200823162602p:plain

筆者は、esp32-idf3-20191220-v1.12.binをダウンロードしました。

ファームウェアをESP32に書き込む方法はダウンロードページに記載があるのですが、あえてWindowsで書き込みをしてみます。

WindowsではMacOSとは違い、GUIでの書き込みになります。
ダウンロードは以下のサイトです。

Tools | Espressif Systems

ESPRESSIF社の本家サイトです。純正のツールなので安心感があります。

f:id:sawayaka_e1:20200823164543p:plain

ダウンロードするのはFlash Download Toolsです。
解凍して実行すると

f:id:sawayaka_e1:20200823164759p:plain

こう聞かれるので、DeveloperModeでいきます。
次はマイコンは何か聞かれるのでESP32 Downlode Toolのボタンを押します。
すると、以下のように立上がると思います。

f:id:sawayaka_e1:20200823165526p:plain

それでは、先ほどダウンロードしたファームウェアを選択しESP32の0x1000番地にダウンロードしましょう(?)。

f:id:sawayaka_e1:20200823165921p:plain

無事にFINISHが出れば成功です。

Muエディタ

MicroPython

MicroPythonは様々なハードウェアで動作します。
その中でも、今回はESP32での動作です。

まず、MicroPythonはインタプリタなのでマイコンファームウェアを入れる必要があります。このファームウェアマイコン上で動作して、通信することでプログラムの実行が可能になります。

マイコンとMicroPython

MicroPythonと通信してソースコードを入力や、転送をするにはエディタが必要になりますが一般的には以下のいずれかが使われているようです。
1.ターミナルからコマンドプロンプトでアップロード
2.uPyCraft
3.Muエディタ

本ブログでは、ネットでの情報の少ないMuエディタを使ってみようと思います。

ダウンロードからインストール

ダウンロードはここから codewith.mu

その際に、ESP32で使用するためアルファ版のv1.1.0-ALPHAを選んでください。それ以前のバージョンではESP32はサポートされていません。

f:id:sawayaka_e1:20200820221629p:plain

無事インストールができれば以下のように起動できます。

f:id:sawayaka_e1:20200820221853p:plain

対象のボードも以下のように選択できれば、ESP32との通信までもう一歩です。

f:id:sawayaka_e1:20200820222103p:plain

それでは、次回はマイコンプログラミングの定番Lチカをやってみましょう。

はじめに

MicroPythonとESP32

MicroPythonは現在、筆者が最も注目している言語です。
WEBサイトは以下のリンクを参照してください。
https://micropython.org/
もともとはpyboradのために開発されたpython環境であったものが他のマイクロコントローラーでも使用できるように移植が進み、現在に到るようです。

このブログではESP32をMicroPythonで使いまくろうと、日々格闘する記録として残します。
話が前後しましたが、ESP32もこのマイコンも筆者の注目しているチップです。
巷では、Arduinoの情報が溢れていて電子工作では困ることがないのですが、IoTも見据えて開発したいので決めました。また価格も魅力的です。

このような、バタバタ開発を記録していきたいと思います。