MicroPythonリファレンス

MicroPython APIのリファレンスを一つの文書にしました。


Last revision: 2024/01/17


i
注意: リファレンスの一部は執筆中であり、今後更新されます。この記事は変更される可能性があります。

このリファレンスは、Arduinoリファレンスに記載されているArduino APIと、MicroPython APIの"翻訳"の役割を果たします。

このリファレンスの大きな目的は、MicroPythonスクリプトでの、例えば、digitalWrite()などの、Arduinoの一般的な概念の使い方を提供することです。

例えば、

  • digitalWrite(pin, HIGH) (Arduino/C++)
  • pin.value(1) (MicroPython)

見出しは、言語リファレンスと全く同じで、MicroPython文法と説明、コード例を記載しています。実装がボード・アーキテクチャにより異なるので、全てのボードがこのリファレンスと互換性があるというわけではありません。例えば、STM32ボードとESP32ボードとでは、PWMの使い方が異なります。

i
オリジナルのArduinoリファレンスのいくつかの見出しは、直接C++リファレンスを基にしています。同じように、このリファレンスの多くの関数は、Pythonリファレンスを基にしています。MicroPython特有のものではありません。

Digital I/O

MicroPythonで、デジタルGPIOにアクセスするには、Pinモジュールを使います。ピンを定義するには、Pin(pin, type)を使います。

pinMode()

  • output_pin = Pin(pin, Pin.OUT): 出力に設定
  • input = Pin(pin, Pin.IN): 入力に設定
  • input_pullup = Pin(pin, Pin.IN, Pin.PULL_UP): INPUT_PULLUPに設定
  • input_pulldown = Pin(pin, Pin.IN, Pin.PULL_DOWN): INPUT_PULLDOWに設定

引数

  • pin: 設定するピン
  • type: 入力もしくは出力
  • pullmode: プルアップもしくはプルダウンに設定(オプション)

1
2
3
4
from machine import Pin

output_pin = Pin(5, Pin.OUT) #define pin
input_pin = Pin(6, Pin.IN, Pin.PULL_UP) #define pin as an input pullup

digtalRead()

  • pin.value()

入力と定義されたデジタルピンの状態を読む。

引数

なし

戻り値

デジタルピンの値(0か1)

1
2
3
4
5
6
from machine import Pin

pin = Pin(5, Pin.PULL_UP) #define pin
reading = pin.value() #read pin

print(reading) #print state of pin to REPL

digitalWrite()

pin.value(state)

出力と定義されたデジタルピンに状態を書き込む。

引数

なし

戻り値

デジタルピンの値(0か1)

1
2
3
4
from machine import Pin

pin = Pin(5, Pin.PULL_UP) #define pin
pin.value(1) #set pin to high state

Analog I/O

入力設定(ADC)

アナログ入力ピンを読むには、ピンをADCに接続する必要があります。

  • adc_pin = machine.Pin(pin): ピンを作成する
  • adc = machine.ADC(adc_pin): ピンをADCに接続する

STM32ボード(GIGA R1、Portenta H7等)では、以下のように定義する必要があります。

  • pin1 = Pin("PC6", Pin.OUT_PP, Pin.PULL_NONE)
  • timer1 = Timer(3, freq=1000)
  • channel1 = timer1.channel(1, Timer.PWM, pin=pin1, pulse_width=0)

analogRead()

adc.read_u16()

ピンをADCに接続し、生の値を読む。

引数

なし

戻り値

16ビット(0-65535)の、生のアナログ値

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import machine
import time

adc_pin = machine.Pin("PC4") 
adc = machine.ADC(adc_pin)

while True:
    reading = adc.read_u16()    
    print("ADC: ",reading)

    time.sleep_ms(1000)

注意

16ビットの値を10ビットにするには、以下の公式を使えます。

1
2
3
# right-shifts the bits and discards the 6 most significant bits
# effectively changing the value range from 0-65535 to 0-1023
result = (reading >> 6) & 0x3FF

analogWrite()

pwm.duty_u16(duty)

デューティー比(0-65535)をPWMピンに書く。

引数

  • duty: デューティー比(0-65535)

戻り値

なし

1
2
3
4
5
6
7
8
9
from machine import Pin, PWM, ADC

pwm = PWM(Pin(15))
duty = 30000 #between 0-65535

pwm.freq(1000)

while True:
    pwm.duty_u16(duty)

analogWrite() (STM32)

channel1.pulse_width(duty)

デューティー比をパーセント(0-100)でPWMピンに書く。

引数

  • duty: デューティー比のパーセント(0-100)

戻り値

なし

1
2
3
4
5
6
7
8
9
import pyb
import time
from pyb import Pin, Timer

pin1 = Pin("PC6", Pin.OUT_PP, Pin.PULL_NONE)
timer1 = Timer(3, freq=1000)
channel1 = timer1.channel(1, Timer.PWM, pin=pin1, pulse_width=0)

channel1.pulse_width(50) #duty cycle at 50%

時間

タイミングや遅延を使うには、timeモジュールを使います。

delay()

time.sleep(seconds)

指定した秒だけ遅延を発生させる。

引数

  • seconds: 秒

戻り値

なし

1
2
3
import time

time.sleep(1) #freeze program for 1 seconds

millis()

スクリプトを開始してからの時間を秒単位で返す。

引数

なし

戻り値

秒(float)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
'''
"Blink Without Delay" script.
Blinks an LED attached to pin 5 every second,
without freezing the program.
'''

import time
from machine import Pin

ledPin = Pin(5, Pin.OUT) 

interval = 1
previousTime = 0
switch = False

while True:
    currentTime = time.time()
    
    if currentTime - previousTime >= interval:
        previousTime = currentTime
        
        switch = not switch
        ledPin.value(switch)

ビットとバイト

bitRead()

bit_value = (variable >> bit_index) & 1

整数変数の特定のビットを読む。

引数

  • variable: 数値を表す整数型変数。例: 12345
  • bit_index: 読みたいビット。例: 5

戻り値

  • 指定したビットの値

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
'''
This example prints out each bit of an 8-bit variable
It stops after 255 (the max value an 8-bit variable can hold)
'''
import time
counter = 0

bit_length = 8 # 8 bits
while True:
    bits = []
    for bit_index in range(bit_length - 1, -1, -1):
        bit_value = (counter >> bit_index) & 1
        bits.append(bit_value)
    print("Binary: ", bits, " DEC: ", counter)

    counter += 1
    time.sleep(0.01)
    if counter > 255:
        break

bitSet()

variable = variable | (1 << bit_index)

整数変数の特定のビットを設定する。

引数

  • variable: 数値を表す整数型変数。例: 12345
  • bit_index: 読みたいビット。例: 5

戻り値

なし

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# Example variable
variable = 12345

# Set the third bit
bit_index = 2

print()
print("Before setting a bit: ",bin(variable))
print("Before setting a bit: ",variable)
variable = variable | (1 << bit_index)

# Print the result
print("After setting a bit: ",bin(variable))
print("After setting a bit: ",variable)

highByte()

leftmost_bit = (variable >> leftmost_bit_index) & 1

変数の上位(一番左)のビットを読む。

引数

  • variable: 数値を表す整数型変数。例: 255
  • leftmost_bit_index: 一番左のビット。例: 8ビット変数での7

戻り値

leftmost_bit: 一番左のビットの値

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# Example variable
variable = 255

bit_length = 8
# Extract the leftmost bit
leftmost_bit_index = bit_length - 1
leftmost_bit = (variable >> leftmost_bit_index) & 1

# Print the result
print("Leftmost bit: ", leftmost_bit)

lowByte()

rightmost_bit = variable & 1

変数の下位(一番右)のビットを読む。

引数

  • variable: 数値を表す整数型変数。例: 255
  • rightmost_bit_index: 一番右のビット。例: 8ビット変数での0

戻り値

rightmost_bit: 一番右のビットの値。例: variableが255(255は、2進数で11111111)ならば、1

1
2
3
4
5
6
7
8
# Example variable
variable = 255

# Extract the rightmost bit
rightmost_bit = variable & 1

# Print the result
print("Rigthmost bit: ", rightmost_bit)

拡張I/O

tone() / noTone()

  • tone(pin,frequency,volume,duration)
  • noTone(pin,duration)

tone()noTone()を使うには、これらの関数を定義する必要があります。現状実装されていないからです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
from machine import Pin, PWM
import time
    
def tone(pin,frequency,volume,duration=None):
    speaker = PWM(Pin(pin))
    speaker.freq(frequency)
    speaker.duty_u16(volume)
    if duration is not None:
        time.sleep(duration)

def noTone(pin,duration=None):
    speaker = PWM(Pin(pin))
    speaker.deinit()
    if duration is not None:
        time.sleep(duration)

while True:
    tone(5,500,1000,1)
    noTone(5,1)

数学

abs()

abs(value)

数値の値の絶対値を返す

1
2
result = abs(-5)
print(result)

constrain()

constrain(value, min, max) 値を、指定した範囲に制限する

1
2
3
4
5
def constrain(value, lower, upper):
    return max(min(value, upper), lower)

result = constrain(10, 0, 5)  # Result will be 5
print(result)

map()

map(value, in_min, in_max, out_min, out_max)

値を、ある範囲から別の範囲に写像する

1
2
3
4
5
def map(value, in_min, in_max, out_min, out_max):
    return (value - in_min) * (out_max - out_min) / (in_max - in_min) + out_min

result = map(50, 0, 100, 0, 255) # Result is 127.5
print(result)

max()

max(value1, value2, value3, valueX)

引数に与えられた数値の中から最も大きい値を返す。コンマで区切ることで多くの数値を指定できる。

1
2
result = max(5, 10, 3)  # Result will be 10
print(result)

min()

min(value1, value2, value3, valueX)

引数に与えられた数値の中から最も小さい値を返す。コンマで区切ることで多くの数値を指定できる。

1
2
result = min(5, 10, 3)  # Result will be 3
print(result)

pow()

pow(base, exponent)

数値の、別の数値のべき乗を計算する

1
2
result = pow(2, 3)  # Result will be 8
print(result)

sq()

sq(value)

数値の二乗を返す

1
2
result = sq(4)  # Result will be 16
print(result)

sqrt()

math.sqrt(value)

数値の平方根を返す

1
2
3
4
import math

result = math.sqrt(16)  # Result will be 4.0
print(result)

三角関数

cos()

math.cos(angle_in_radians)

角度(ラジアン)の余弦を計算する。結果は、-1と1の間。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import math

# Specify the angle in radians
angle_in_radians = math.radians(45)

# Calculate the cosine of the angle
cos_value = math.cos(angle_in_radians)

# Print the result
print(f"The cosine of {angle_in_radians} radians is: {cosine_value}")

sin()

math.sin(angle_in_radians)

角度(ラジアン)の正弦を計算する。結果は、-1と1の間。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import math

# Specify the angle in radians
angle_in_radians = math.radians(30)

# Calculate the sine of the angle
sine_value = math.sin(angle_in_radians)

# Print the result
print(f"The sine of {angle_in_radians} radians is: {sine_value}")

tan()

math.tan(angle_in_radians)

角度(ラジアン)の正接を計算する。結果は、-無限大と∞の間。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import math

# Specify the angle in radians
angle_in_radians = math.radians(60)

# Calculate the tangent of the angle
tangent_value = math.tan(angle_in_radians)

# Print the result
print(f"The tangent of {angle_in_radians} radians is: {tangent_value}")

文字

isAlpha()

char.isalpha()

文字がアルファベットか調べる

1
2
3
4
5
char = 'a'
if char.isalpha():
    print(f"{char} is alphabetic.")
else:
    print(f"{char} is not alphabetic.")

isAlphaNumeric()

char.isDigit()char.isAlpha()

文字が数値かアルファベットかを調べる

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# Function to check if a character is alphanumeric
def is_alphanumeric(char):
    return char.isalpha() or char.isdigit()

# Example usage
test_char = 'a'

if is_alphanumeric(test_char):
    print(f"{test_char} is alphanumeric.")
else:
    print(f"{test_char} is not alphanumeric.")

isAscii()

ord(char) < 128

文字の10進表現が128未満かを調べて、ASCII文字かどうかを判断する。128以上のときは、ASCII文字ではない。

1
2
3
4
5
6
char = 'Ö'

if 0 <= ord(char) < 128:
    print(f"{char} is an ASCII character.")
else:
    print(f"{char} is not an ASCII character.")

isControl()

ord(char) < 32 or ord(char) == 127

文字の10進表現が32未満か、127かを調べて、制御文字かどうかを判断する。

1
2
3
4
5
6
char = '\t'  # Example: Tab character

if 0 <= ord(char) < 32 or ord(char) == 127:
    print(f"{char} is a control character.")
else:
    print(f"{char} is not a control character.")

isDigit()

char.isDigit()

1
2
3
4
5
char = '5'
if char.isdigit():
    print(f"{char} is a digit.")
else:
    print(f"{char} is not a digit.")

isGraph()

1
2
3
4
5
6
char = 'A'

if char.isprintable() and not char.isspace():
    print(f"{char} is a graph character.")
else:
    print(f"{char} is not a graph character.")

isLowerCase()

isLowerCase()

1
2
3
4
5
6
char = 'a'

if char.islower():
    print("Is lower case.")
else:
    print("Is not lower case.")

isPrintable()

isPrintable()

文字が表示可能か調べる。例: 空白文字を含む任意の文字、ただし、制御文字は含めない。

1
2
3
4
5
6
char = '\t'

if char.isprintable():
    print("Is printable.")
else:
    print("Is not printable.")

isPunct()

Pythonには、区切り文字を調べる内蔵関数がない。その代わり、全ての区切り文字を含む変数を定義し、指定した値がその変数に含まれるか調べる関数を定義する。

1
2
3
4
5
def isPunct(char):
    punctuation_chars = "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"
    return char in punctuation_chars

print(isPunct("."))

isSpace()

char.isspace()

1
2
3
4
5
6
char = ' '

if char.isspace():
    print(f"{char} is a space character.")
else:
    print(f"{char} is not a space character.")

isUpperCase()

char.isupper()

1
2
3
4
5
6
char = 'A'

if char.isupper():
    print(f"{char} is an uppercase letter.")
else:
    print(f"{char} is not an uppercase letter.")

乱数

random()

random.random()

指定した範囲内の乱数を生成する

1
2
3
4
import random

random_integer = random.randint(1, 10)
print("Random integer between 1 and 10:", random_integer)

randomSeed()

seed_value = int(time.time())random.seed()

乱数の種を生成するには、まず、time()モジュールを使い、一意の値を生成します。その値を、random.seed()生成器に与えます。結果、一位の乱数値を常に取得できます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import random
import time

# Seed the random number generator with the current time
seed_value = int(time.time())
random.seed(seed_value)

# Generate random numbers using the seeded generator
random_number = random.randint(1,100)
print(random_number)
i
time.time()は、毎秒新しい値を生成します。例えば、random.seed()を1秒以内に2回実行すると同じ値を返します。random.seed()は繰り返して使ってはいけません。

外部割込み

attachInterrupt()

interrupt_pin.irq(trigger=mode, handler=function)

ピンに、指定したモードで、割り込みを結びつけます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
from machine import Pin
import time

# Define a callback function to be called when the interrupt occurs
def interrupt_callback(pin):
    print("Interrupt occurred on pin", pin_name)

# Pin name
pin_name = "PA3"

# Define the pin to which you want to attach the interrupt
interrupt_pin = Pin(pin_name, Pin.IN, Pin.PULL_UP)  # Replace 2 with the actual pin number you are using

# Attach the interrupt to the pin, specifying the callback function and trigger type
interrupt_pin.irq(trigger=Pin.IRQ_FALLING, handler=interrupt_callback)

while True:
    print("hello world")
    time.sleep(1)

detachInterrupt()

interrupt_pin.irq(handler=None)

ピンから有効な割り込みを削除します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
from machine import Pin
import time

# Define a callback function to be called when the interrupt occurs
def interrupt_callback(pin):
    print("Interrupt occurred on pin", pin_name)
    # Detaches the interrupt from the pin
    interrupt_pin.irq(handler=None) 

# Pin name
pin_name = "PA3"

# Define the pin to which you want to attach the interrupt
interrupt_pin = Pin(pin_name, Pin.IN, Pin.PULL_UP)  # Replace 2 with the actual pin number you are using

# Attach the interrupt to the pin, specifying the callback function and trigger type
interrupt_pin.irq(trigger=Pin.IRQ_FALLING, handler=interrupt_callback)

while True:
    print("hello world")
    time.sleep(1)

シリアル(USB)

Arduino APIでは、Serial.begin()Serial.print()を使い、ボードからPCにデータを送ることになれています。

Serial1を使い、同じAPIで、UART上でデータを送受信することができます。UARTについては、Serial1 (UART)を参照してください。

MicroPythonで、USB経由でデータを送信するには、print()関数を使います。これは、内容をREPLに表示します。MicroPythonは、少し違った実装なので、REPLでもコマンドを書くことができます。REPLには多くの方法があり、Arduino IDEで使うシリアルモニタとは異なっています。

Serial.print()

print(content)

この関数は内容をREPLに表示します。

1
2
3
4
5
6
variable = 5

print("I am a string!") # prints a string
print(variable) # prints value of variable
print(58) # prints a numeric value
print(f"The value is {variable}") # prints a string with a value inserted

Serial1 (UART)

UART通信は、machineモジュールのUARTオブジェクトを使い初期化されます。

i
ArduinoのハードウェアUARTポート上でデータを送受信するとき、Serial1クラスを使います。

Serial1.begin()

machine.UART(port, baudrate=baud)

指定したポート(デフォルトは1)でのUART通信を初期化し、ボーレートを指定します。

1
2
3
4
import machine
import time

uart = machine.UART(1, baudrate=57600)
i
Arduino IDEのシリアルモニタと通信するときは、ボーレートとして一般的な、1152009600に加え、57600も使われます。

Serial1.available()

uart.any()

UARTポートにデータがあるか確認する

1
2
3
4
5
6
7
8
import machine
import time

uart = machine.UART(1, baudrate=57600)

while True:
    if uart.any():
        print("data available")

Serial1.read()

uart.read(1)

バッファから1バイト読む

この例では、バッファから最初の1バイトを読み、文字列received_dataに格納します。改行文字(\n)を検出すると、受信したメッセージをREPLに表示します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import machine
import time


uart = machine.UART(1, baudrate=57600) 
received_data = ""

while True:
    if uart.any():
        data = uart.read(1)
        received_data += data
    
    if received_data and received_data[-1] == '\n':
        print("Received:", received_data[:-1])  # Print the accumulated data (excluding the newline character)
        received_data = ""  # Reset the string after printing
    
    time.sleep(0.1)

Serial1.write()

uart.write(message)

UARTでデータを書き込む/送信する

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import machine
import time


uart = machine.UART(1, baudrate=57600)  

while True:
    data_to_send = "Hello World!\n"
    uart.write(data_to_send)
    
    time.sleep(1)

SPI

SPI通信は、machineモジュールのSPIオブジェクトを使い初期化します。

SPI.begin()

spi = machine.SPI(port, baudrate, polarity, phase)

SPIは、machineモジュールをインポートし、ボーレートや極性などの、多くのパラメータを指定することで初期化します。

1
2
3
import machine

spi = machine.SPI(0, baudrate=1000000, polarity=0, phase=0)

SPI.read()

i
SPI.read()は、Arduino APIにはなく、SPI.transfer()が送受信データを扱います。

spi.readinto(data_in)

入力データを読み、配列に格納します。配列の大きさは、入力されるデータサイズに合わせて調整する必要があります。

1
2
3
4
5
6
7
8
9
import machine
import time

spi = machine.SPI(0, baudrate=1000000, polarity=0, phase=0)
data_in = bytearray(3)

spi.readinto(data_in)

print("Received Data:", data_in)

SPI.write()

i
SPI.write()は、Arduino APIにはなく、SPI.transfer()が送受信データを扱います。

SPIバスにデータを書き込みます。

1
2
3
4
5
6
7
import machine
import time

spi = machine.SPI(0, baudrate=1000000, polarity=0, phase=0) 
data_out = b'\x01\x02\x03'

spi.write(data_out)

SPI.transfer()

spi.write_readinto(data_out, data_in)

データの送受信を同時に行います。入力データはバッファに格納されます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import machine
import time

spi = machine.SPI(0, baudrate=1000000, polarity=0, phase=0)

data_to_send = b'\x01\x02\x03'

data_received = bytearray(len(data_to_send))

spi.write_readinto(data_to_send, data_received)

print("Received Data:", data_received)

spi.deinit()

Bit Size

spi.bits = 8

1ワードのビット数を設定します。

1
spi.bits = 8

Wire/I2C

Wire.begin()

i2c = I2C(port, scl, sda, freq)

指定したポートとピンのI2C通信を初期化します。portfreqはオプションの引数です。指定しなかった場合は、デフォルト値が設定されます。

1
2
3
from machine import I2C

i2c = I2C(0, scl=Pin(SCL_PIN), sda=Pin(SDA_PIN), freq=100000)

Wire.available()

i2c.in_waiting()

読み込み可能なバイト数を確認する

1
2
3
available_bytes = i2c.in_waiting()

print("Available bytes to read: ", available_bytes)

Wire.read()

i2c.readfrom(address, num_bytes)

指定したアドレスのデバイスから、指定したバイト数のデータを読む

1
2
3
data_in = i2c.readfrom(address, num_bytes)

print("I2C data: ", data_in)

Wire.write()

i2c.writeto(address, data_out)

指定したアドレスにデータを書く

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
from machine import I2C, Pin

# Initialize I2C anc configure device & reg addresses
i2c = I2C(0, scl=Pin(22), sda=Pin(21), freq=100000)  # Adjust pins and frequency as needed
device_address = 0x68
register_address = 0x00

# The array of bytes to be send out
# This buffer simply stores 1,2,3,4
data_out = bytearray([0x01, 0x02, 0x03, 0x04])

# Send the device address with the write bit to indicate a write operation
i2c.writeto(device_address, bytearray([register_address]))

# Finally, send data to the device
i2c.writeto(device_address, data_out)

Wire.setClock()

クロック周波数は初期化時に設定します。詳細はWire.begin()を参照。

SoftI2C

MicroPythonには、SoftI2C(ソフトウェアI2)と呼ばれる内蔵クラスがあります。ソフトウェアI2Cは、専用のI2C周辺機器ハードウェアを使わず、クロック信号や通信プロトコルの取り扱いは、CPUが行います。

SoftI2Cmachineモジュールから利用でき、ハードウェアI2Cと同じAPIと、追加のメソッドがあります。

  • softi2c = machine.SoftI2C(scl,sda,freq,timeout): 指定したピン、周波数、タイムアウトで、softi2cオブジェクトを生成する。
  • softi2c.start(): I2C通信の初期化の開始条件を作成する(SCLがHIGHのときSDAがLOWになる)。
  • softi2c.stop(): I2C通信の終期化の停止条件を作成する(SCLがHIGHのときSDAがHIGHになる)。

USB HID

Human Interface Device (HID)は、現状、全てのArduinoボードでサポートしていません。

USB HIDをサポートするArduinoボード(多くの最近のボード)でHID機能を使うには、ArduinoのC++リファレンスを参照してください。

データ型

MicroPython/Pythonで変数を宣言するときは、データ型を指定する必要はなく、自動で行われます。

以下に、変数の宣言の例を示します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
var_array = [1, 2, 3]
var_bool = True/False
var_unsigned_byte = 255
var_signed_byte = -128
var_char = 'A'
var_double = 3.14
var_float = 29.231232
var_int = 2147483647
var_long = 2147483647
var_short = 32767
var_string = "This is a string"
var_unsigned_int = 4294967295
var_unsigned_long = 4294967295

size_t

len(my_array)

size_tと全く同じものはありません。len()関数を使うと、オブジェクトの大きさを返します。

1
2
3
4
5
my_array = [1,2,3,4,5]

array_size = len(my_array)

print("Size of array is: ", array_size)

void

def my_func():

voidと全く同じものはありません。戻り値のない関数を定義すると、“void"関数と同等になります。

1
2
def my_function():
    print("Function executed, nothing returned though!")

変換

byte()

bytes(value)

値をbyteに変換する

1
2
my_byte = bytes([255])
print(my_byte) # prints \xff which in hex is 255

char()

chr(value)

値をcharに変換する

1
2
3
value = 65  # 65 is "A" in ASCII code
char_value = chr(value) # converts a value to char (65 to "A")
print("Char value:", char_value) # prints "A"

float()

float(value)

例1

整数をfloatに変換する

1
2
3
value = 25
float_value = float(value)
print("Float value:", float_value) # prints 25.0

例2

文字列をfloatに変換する

1
2
3
value = "3.14"
float_value = float(value)
print("Float value:", float_value) #prints 3.14

int()

int(value)

値をintに変換する

例1

floatをintに変換する。数値は四捨五入される。例: 42.232 = 42

例2

文字列をintに変換する

1
2
3
value = "42"
int_value = int(value)
print("Int value:", int_value)

ローカル/グローバル変数

変数は、ローカル変数化もしくはグローバル変数として宣言できます。

  • グローバル変数は、プログラムのどこからでもアクセスできます。
  • ローカル変数は、変数を宣言した関数の中でだけアクセスできます。

プログラムを作るときに、ある変数をどこからでもアクセスしたいのか、関数の中からだけアクセスしたいのか決める必要があります。

ローカル変数を宣言する利点は、メモリ使用量を抑えられる点です(関数の中でだけ割り当てられるので)

ローカル変数を宣言する欠点は、プログラムの任意の場所からアクセスできない点です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
global_var = 0 #initial value

def my_function():
    local_var = 10 # declare local variable
    print()
    print("(inside function) local_var is: ", local_var)

    global_var = local_var + 25
    print("(inside function) global_var is updated to: ", global_var)

    return global_var

global_var = my_function() + 25
print("(outside function) global_var is finally: ", global_var)

'''
The line below will cause the script to fail
because it is not declared globally.
'''
#print(local_var)

スケッチ

MicroPythonは、void loop()void setup()関数を必要とする、いつも使うスケッチとは異なり、スクリプトを使います。

スクリプトは、1行で"Hello World!“と表示するような、単純なものでも構いません。

1
print("Hello World!")

loop()

while True:

MicroPythonスクリプトでは、loop()は必要ありません。しかし、ボードで連続的にスクリプトを実行する場合は、必要となります。プログラム内でループを使うときは、while loopを使います。

以下の例は、ループ内でvalue変数を1ずつ増加するループを実行します。REPLに値を表示し、1秒待ちます。

1
2
3
4
5
6
7
import time
value = 0

while True:
    value += 1
    print(value)
    time.sleep(1)

setup()

MicroPythonでは、setup()関数に相当するものはありません。この関数内で行われるいつもの設定は、単にプログラムの先頭で宣言します。

このスクリプトでは、ピンのモードを宣言します(pinMode()参照)。

1
2
3
4
5
6
from machine import Pin

output_pin = Pin(5, Pin.OUT)

while True:
    #loops forever

制御構造

制御構造は、プログラムの流れを制御するために使われます。すなわち、どのコードを実行し、どのコードを実行しないかということです。条件を満たしたら、指定したコードブロックを実行します。

if

if文は、条件を満たすかを調べ、次のコードのブロックを実行します。

1
2
3
x = 10
if x > 5:
    print("x is greater than 5")

else

else文は、例えば、if文の後に使われます。直前の条件を満たさなかったとき、else文に続くコードのブロックを実行します。

1
2
3
4
5
6
7
x = 5
y = 10

if x > y:
    print("x is greater")
else:
    print("y is greater")

for

forループは、数値の範囲、リスト、文字列などの純烈を繰り返し実行するのに使われます。

例1 数値の範囲

1
2
for number in range(5):
    print(number)

例2 リスト

1
2
3
my_list = [10, 20, 30, 40, 50]
for item in my_list:
    print(item)

例3 文字列

1
2
3
my_string = "Hello World!"
for char in my_string:
    print(char)

while

whileループは、指定した条件がTrueである限り、コードのブロックを繰り返し実行します。

例1

1
2
3
4
i = 0
while i < 5:
    print(i)
    i += 1

例2

MicroPythonで、whileループは、無限ループを作るときに必要になるので、重要です。すなわち、ボードに電源が入っている間実行されるループです。

1
2
while True:
    # your program

break

break文は、ループが終了する前にループから抜け出します。

1
2
3
4
for i in range(5):
    if i == 3:
        break
    print(i)

continue

continue文は、コードブロックの終わりまでとばすときに使います。効率的に、次の繰り返しに移ります。特定のデータをとばすときなどに有用です。

この例は、数値のリストを繰り返します。数値が0未満の場合、スキップします。

1
2
3
4
5
my_list = [0, -5, -3, 8, 9 , 11]
for num in my_list:
    if num < 0:
        continue
    print(num)

return

関数を終了して、呼び出した関数に、関数の戻り値をreturnします。

この例では、2つの引数を持つadd_numbers()という名前の関数を呼びます。この関数は、処理した値を、return文で返します。

1
2
3
4
5
def add_numbers(a, b):
    result = a + b
    return result

print(add_numbers(5,5))

演算子

数値演算子

数値演算子はプログラムと数式内で使われる記号で、数値の基本的な演算を行います。

任意の変数に新しい値を代入するには、代入演算子(一つの=)を使います。

1
my_variable = 5 # the value of my_variable is now 5

以下の数値演算子が使えます。

  • %(剰余)
  • *(乗算)
  • +(加算)
  • -(減算)
  • /(除算)
  • **(累乗)

以下のスクリプトはデモします。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
remainder = 5 % 10 # remainder is 5
multiplication = 10 * 5 # result of multiplication is 50
addition = 10 + 5 # result of addition is 15
subtraction = 10 - 5 # result of subtraction is 5
division = 10 / 5 # result of division is 2
exponentiation = 10 ** 5 # result of exponentiation is 10000 (10*10*10*10*10)

print("remainder:", remainder)
print("multiplication:", multiplication)
print("addition:", addition)
print("subtraction:", subtraction)
print("division:", division)
print("exponentiation:", exponentiation)

比較演算子

比較演算子は、2つの値や四季を比較するのに使い、ブール値(TrueFalse)の結果を返します。

  • ==(等価)
  • !=(非等価)
  • <(小なり)
  • <=(小なりイコール)
  • >(大なり)
  • >=(大なりイコール)

以下のスクリプトは、xyを比較し、結果をREPLに表示します。

==

1
2
3
4
5
6
7
x = 10
y = 5

if x == y:
    print("x is equal to y")
else:
    print("x is not equal to y")

!=

1
2
3
4
5
6
7
x = 10
y = 5

if x != y:
    print("x is not equal to y")
else: 
    print("x is equal to y")

<

1
2
3
4
5
6
7
x = 10
y = 5

if x <  y:
    print("x is smaller than x")
else:
    print("x is not smaller than y")

<=

1
2
3
4
5
6
7
x = 10
y = 5

if x <= y:
    print("x is smaller or equal to y")
else:    
    print("x is not smaller or equal to y")

>

1
2
3
4
5
6
7
x = 10
y = 5

if x >  y:
    print("x is greater than y")
else:
    print("x is not greater than y")

>=

1
2
3
4
5
6
7
x = 10
y = 5

if x >= y:
    print("x is greater than or equal to y")
else:
    print("x is not greater than or equal to y")

論理演算子

ブール演算子は、ブール値(TrueFalse)間の論理演算を行うのに使います。

ブール演算子は、Arduino/C++ような他のプログラミングフレームワークとは異なり、記号(!, &&, ||)ではなく、文字で表現されます。

  • not(論理否定)
  • and(論理積)
  • or(論理和)

以下のスクリプトは、論理演算子の使い方を示します。

論理not

1
2
3
4
5
6
x = True

if not x:
    print("False")
else:
    print("True")

論理and

1
2
3
4
x = 7

if x > 5 and x < 10:
    print("x is greater than 5 AND smaller than 10")

論理or

1
2
3
4
5
x = 5
y = 10

if x == 3 or y == 10:
    print("One condition matched!")

ビット演算子

ビット演算子は、バイナリレベルで、個々のビットの操作を行うのに使います。例えば、15を保持している整数変数は、2進数では、1111です。ビット演算子では、例えば、1111(15)を、1011(11)に変更したりできます。

以下のビット演算子が利用できます。

  • &(ビット単位論理積)
  • <<(左ビットシフト)
  • >>(右ビットシフト)
  • ^(ビット単位排他的論理和)
  • |(ビット単位論理和)
  • ~(ビット反転)

以下のスクリプトは、ビット演算子の使い方を示します。

&(ビット単位論理積)

1
2
3
4
5
a = 5   # 101 in binary
b = 3   # 011 in binary

result = a & b
print(result)  # Output: 1 (001 in binary)

<<(左ビットシフト)

1
2
3
4
x = 3   # 11 in binary

result = x << 2
print(result)  # Output: 12 (1100 in binary)

>>(右ビットシフト)

1
2
3
4
y = 16  # 10000 in binary

result = y >> 2
print(result)  # Output: 4 (100 in binary)

^(ビット単位排他的論理和)

1
2
3
4
5
p = 12  # 1100 in binary
q = 7   # 0111 in binary

result = p ^ q
print(result)  # Output: 11 (1011 in binary)

|(ビット単位論理和)

1
2
3
4
5
m = 10  # 1010 in binary
n = 5   # 0101 in binary

result = m | n
print(result)  # Output: 15 (1111 in binary)

~(ビット反転)

1
2
3
4
z = 7   # 0111 in binary

result = ~z
print(result)  # Output: -8 (1000 in two's complement binary)

複合演算子

複合演算子は算術演算やビット単位演算と代入を組み合わせたものです。例えば、x = x + 3と書く代わりに、加算代入演算子を使い、x += 3と書くことができます。

以下の複合演算子が使えます。

  • %=(剰余代入)
  • &=(論理積代入)
  • *=(乗算代入)
  • +=(加算代入)
  • -=(減算代入)
  • /=(除算代入)
  • ^=(排他的論理和代入)
  • |=(論理和代入)

インクリメント(++)とデクリメント(--)は、Python言語では利用できないことに注意してください。同等のものは、x += 1x -= 1です。

以下のスクリプトは、複合演算子の使い方を示します。

%=(剰余代入)

1
2
3
4
5
a = 15
b = 7

a %= b
print(a)  # Output: 1 (15 % 7)

&=(論理積代入)

1
2
3
4
5
x = 5
y = 3

x &= y
print(x)  # Output: 1 (5 & 3)

*=(乗算代入)

1
2
3
4
num = 8

num *= 3
print(num)  # Output: 24 (8 * 3)

+=(加算代入)

1
2
3
4
total = 10

total += 5
print(total)  # Output: 15 (10 + 5)

-=(減算代入)

1
2
3
4
result = 20

result -= 8
print(result)  # Output: 12 (20 - 8)

/=(除算代入)

1
2
3
4
value = 30

value /= 6
print(value)  # Output: 5.0 (30 / 6)

^=(排他的論理和代入)

1
2
3
4
5
m = 12
n = 7

m ^= n
print(m)  # Output: 11 (12 ^ 7)

|=(論理和代入)

1
2
3
4
5
p = 10
q = 5

p |= q
print(p)  # Output: 15 (10 | 5)

オリジナルのページ

https://docs.arduino.cc/micropython/basics/reference/

最終更新日

April 14, 2024

inserted by FC2 system