部品の利用例

NeopixelやDHT11、サーボモーターなどの人気のある部品用の、すぐに使えるコードと回路の例です。


Author: Hannes Siebeneicher、Last revision: 2024/02/05


MicroPython入門コースの最後の章では、モーターやディスプレイ、センサーといった人気のある部品用の、すぐに使えるコードと回路の例です。これらの部品は、組み合わせることで面白いプロジェクトを作れます。また、Nano ESP32とMicroPythonで、そのまま使えます。

i
この章で使う外部モジュールはサードパーティのもので、Arduinoチームが開発したものではありません。モジュール開発者に謝意を示します。

モジュールをインストールする

これらのモジュールの多くは、MicroPythonのインストールには含まれていません。しかし、心配する必要はありません。インストールはとても簡単で、追加のソフトウェアを必要としません。

外部モジュールをインストールするには、以下のスクリプトを使います。スクリプト内では、URL変数を、モジュールに関連する有効なURLに置き換える必要があります。URLは、以下のような形式です。

i
WIFI_NETWORKWIFI_PASSWORDは、各自のWi-Fiネットワークとパスワードに置き換える必要があります。
"""
This script first connects to Wi-Fi,
then installs the module specified
in the URL variable.
"""

import network
import mip

WIFI_NETWORK='YOUR_NETWORK_NAME'
WIFI_PASSWORD='YOUR_NETWORK_PASSWORD'
URL = "github.com/example"

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(WIFI_NETWORK, WIFI_PASSWORD)

print()
print("Connected to ",WIFI_NETWORK)

mip.install(URL)

スクリプトを実行すると、ボードにモジュールが、libというフォルダに、インストールされます。MicroPythonエディタにボードを接続しているときに、“Files"以下を確認することができます。

i
モジュールのインストール方法は、MicroPythonの紹介で詳細を説明しています。

モジュールを削除する

モジュールをインストールしすぎたら、容量が不足します。ファイルを選択して、“Delete"アイコンをクリックすれば、エディタで直接ファイルを削除できます。

i
詳細は、モジュールを削除するを参照してください。

ボタン

この例は、MicroPythonで押しボタンを使う方法を示します。ボタンを以下のように接続してください。Groveケーブルは4本ですが、必要なのは3本(電源、GND、信号)です。

ボタンの回路

ボタンの回路

この回路を使うには、以下のスクリプトをmain.pyにコピー・ペーストします。そして、“Run"ボタンをクリックし、実行します。

# Import the Pin class from the machine module
from machine import Pin
# Import the sleep function from the time module
from time import sleep     

# Create a Pin object for pin 5 as an input with a pull-up resistor
button = Pin(9, Pin.IN, Pin.PULL_UP)   

# Start an infinite loop
while True:
    # Read the current state of the button    
    button_state = button.value()    
    # Check if the button state is LOW (0)
    if button_state == 0:    
        # If the button is not pressed, print a message
        print("Button not pressed")    
    else:
        # If the button is pressed, print a message
        print("Button pressed")    
    # Pause the program for 0.5 seconds
    sleep(0.5)

ボタンを押すと、Button pressedとREPLに表示されます。

LED

この例は、MicroPythonとGrove LEDを使った、よく知られているLEDの点滅の例です。

LEDの回路

LEDの回路

この回路を使うには、以下のスクリプトをmain.pyにコピー・ペーストします。そして、“Run"ボタンをクリックし、実行します。

# Import the Pin class from the machine module
from machine import Pin   
# Import the sleep function from the time module 
from time import sleep     

# Create a Pin object for pin 5 as an output
led = Pin(9, Pin.OUT)    

# Start an infinite loop
while True:    
    # Turn on the LED
    led.on()  
    # Pause the program for 1 second  
    sleep(1)   
    # Turn off the LED 
    led.off()  
    # Pause the program for 1 second 
    sleep(1)

LEDが点滅します。スピードを上げたり下げたりするよう、コードを変更してみてください。

サーボ

このコードは、PWMを使い、5番ピン(D2)に接続した、サーボモーターを制御します。モーターを動作させるのに必要な電流が非常に大きいモーターを使うと、ボードがリセットします。

i
サーボを使うときは、外部電源をいつも使うべきです。サーボモーターは、開始時に非常に多くの電流を消費します。これにより、ボードがリセットされたり破損したりする可能性があります。
サーボモーターの回路

サーボモーターの回路

この回路を使うには、以下のスクリプトをmain.pyにコピー・ペーストします。そして、“Run"ボタンをクリックし、実行します。

# Import the Pin and PWM classes from the machine module
from machine import Pin, PWM   
# Import the time module
import time                    

# Create a PWM object named 'servo' on pin 5 configured as an output
servo = PWM(Pin(9, mode=Pin.OUT))    
# Set the frequency of the PWM signal to 50Hz
servo.freq(50)                      

# Start an infinite loop
while True:    
    # Set the duty cycle of the PWM signal to 26 (position 1 of the servo)
    servo.duty(26)  
    # Pause the program for 1 second  
    time.sleep(1)     
    # Set the duty cycle of the PWM signal to 123 (position 2 of the servo)
    servo.duty(123)  
    # Pause the program for 1 second 
    time.sleep(1)

サーボが、右回転・左回転し続けます。

NeoPixel

この例は、10個のRGB LEDのついたNeoPixelストリップの使い方を示します。10個のLEDの位置を一度に指定しますが、1本のピンしか必要なく、設定はとても簡単です。RGBストリップを以下の図のように接続してください。

NeoPixelの回路

NeoPixelの回路

この回路を使うには、以下のスクリプトをmain.pyにコピー・ペーストします。そして、“Run"ボタンをクリックし、実行します。

# Import the Pin class from the machine module
from machine import Pin
# Import the sleep class from the time module
from time import sleep
#Import the neopixel module
import neopixel

# Set the number of pixel on the RGB strip
PIXEL_NUMBER = 10
# Create a NeoPixel object with 24 pixels connected to pin 21
np = neopixel.NeoPixel(Pin(9), PIXEL_NUMBER)   

# Define colors
purple = (200, 0, 200)
black = (0, 0, 0)

# Fill the entire strip with black color (turn off all pixels)
np.fill(black)   
# Update the NeoPixel strip to reflect the changes
np.write()       

# Function for turning on all pixels on after the other
def ringUp():
    #loop through all pixels
    for i in range(0, PIXEL_NUMBER):
        # Set the i-th pixel to purple color
        np[i] = purple   
        # Update the NeoPixel strip to reflect the changes
        np.write()   
        # Pause for 0.1 seconds    
        sleep(0.1)       
        
# Function for turning on all pixels off after the other
def ringDown():
    for i in range(0, PIXEL_NUMBER):
        np[i] = black  
        np.write()     
        sleep(0.1)     
        
# Function for turning on all pixels off
def ringOff():
    for i in range(0, PIXEL_NUMBER):
        np[i] = black  
    np.write()         
    
# Function looping through ringUp() and ringDown()
def runPixelRun():
    while(1):             
        ringUp()        
        ringDown()      
    
# Start running the pixel animation
runPixelRun()

LED RGBストリップが点滅します。

DHT11

この例は、Arduino Nano ESP32で、DHT11の使い方を示します。DHTセンサーは、温度・湿度センサーで、内蔵のdhtモジュールを利用します。

DHT11の回路

DHT11の回路

この回路を使うには、以下のスクリプトをmain.pyにコピー・ペーストします。そして、“Run"ボタンをクリックし、実行します。

#import dht module
import dht
#import Pin class from machine module
from machine import Pin
# Import sleep_ms class from time module
from time import sleep_ms

# Define sensor pin
SENSOR_PIN = 9

# Create a DHT11 object with the specified pin number
TEMP_SENSOR = dht.DHT11(Pin(SENSOR_PIN))  
# Pause for 500 milliseconds to allow the sensor to stabilize 
sleep_ms(500)                             

# Loop indefinitely
while(1):   
    # Trigger a measurement from the DHT11 sensor                              
    TEMP_SENSOR.measure()               
    # Print the measured temperature   
    print("Temperature:",TEMP_SENSOR.temperature())   
    print("Humidity:",TEMP_SENSOR.humidity())          
    # Pause for 1 second before taking the next measurement
    sleep_ms(1000)

毎秒、温度と湿度がREPLに表示されます。

OLEDディスプレイ

この例では、I2C経由で、OLEDを使う方法を示します。

OLEDの回路

OLEDの回路

このモジュールは、MicroPythonをインストールしただけではインストールされないので、以下のコマンドでインストールする必要があります。

import mip
mip.install("https://raw.githubusercontent.com/micropython/micropython-lib/master/micropython/drivers/display/ssd1306/ssd1306.py")

インストールすると、“Run"ボタンをクリックすれば、以下のスクリプトを実行できます。

i
異なるOLEDディスプレイを使うときは、コンテンツを正しく表示するために、コード内のスクリーンサイズを調整してください。
# Import the Pin class and SoftI2C class (for using I2C) form the machine module
from machine import SoftI2C, Pin
# Import Oled module
import ssd1306
# Import the sleep_ms class from the time module
from time import sleep_ms

# Set the display width to 128 pixels
DISPLAY_WIDTH = 128   
# Set the display height to 64 pixels
DISPLAY_HEIGHT = 64   

class Point():
    def __init__(self, x, y):
        # Initialize the x-coordinate of the point
        self.x = x   
        # Initialize the y-coordinate of the point
        self.y = y   

# Create a Point object with initial coordinates (64, 32)
old_coords = Point(64, 32)   
# Create a Point object with initial coordinates (64, 32)
new_coords = Point(64, 32)  

# Create a SoftI2C object for I2C communication with the specified pins and frequency
i2cbus = SoftI2C(scl=Pin(12), sda=Pin(11), freq=100000)   
print(i2cbus)

# Create an SSD1306 OLED object with the specified width, height, and I2C bus
oled = ssd1306.SSD1306_I2C(DISPLAY_WIDTH, DISPLAY_HEIGHT, i2cbus)   
# oled.fill(0)
oled.show()

# Display the text "Hello" at the specified coordinates
oled.text('Arduino', 40, 12)      

# Display the text "World" at the specified coordinates        
oled.text('MicroPython', 23, 45)     

# Update the OLED display to reflect the changes
oled.show()

Hello Worldと画面に表示されます。

OLEDの出力

OLEDの出力

ブザー

この例は、Groveブザーの使い方を示します。以下の図のように接続してください。

ブザーの回路

ブザーの回路

この回路を使うには、以下のスクリプトをmain.pyにコピー・ペーストします。そして、“Run"ボタンをクリックし、実行します。

from machine import Pin, PWM
import time

# Pin connected to the Grove Speaker
SPEAKER_PIN = 9

# Frequency and duration of the sound
FREQUENCY = 220  # Hz
DURATION = 2  # seconds

# Create a controllable Pin for the speaker
speaker = PWM(Pin(SPEAKER_PIN))

# Function to play a sound
def play_sound(frequency, duration):
    speaker.freq(frequency)
    speaker.duty(512)
    time.sleep(duration)
    speaker.duty(0)

# Play the sound
play_sound(FREQUENCY, DURATION)

加速度センサー

この例では、I2C経由で、加速度センサーを使う方法を示します。このセンサーは加速度と空間内の位置を測定します。I2Cを使っているので、以下の図のように、4本すべての線が必要です。

加速度センサーの回路

加速度センサーの回路

このモジュールは、MicroPythonをインストールしただけではインストールされないので、以下のコマンドでインストールする必要があります。

import mip
mip.install("https://raw.githubusercontent.com/tinypico/tinypico-micropython/master/lis3dh%20library/lis3dh.py")

インストールすると、“Run"ボタンをクリックすれば、以下のスクリプトを実行できます。

# Import lis3dh, time, and math classes
import lis3dh, time, math
# Import Pin and SoftI2C class from the machine module
from machine import Pin, SoftI2C

i2c = SoftI2C(scl=Pin(12), sda=Pin(11)) # I2C
imu = lis3dh.LIS3DH_I2C(i2c, address=0x19)

last_convert_time = 0
convert_interval = 100 #ms
pitch = 0
roll = 0


# Convert acceleration to Pitch and Roll
def convert_accell_rotation( vec ):
    x_Buff = vec[0] # x
    y_Buff = vec[1] # y
    z_Buff = vec[2] # z

    global last_convert_time, convert_interval, roll, pitch

    # We only want to re-process the values every 100 ms
    if last_convert_time < time.ticks_ms():
        last_convert_time = time.ticks_ms() + convert_interval

        roll = math.atan2(y_Buff , z_Buff) * 57.3
        pitch = math.atan2((- x_Buff) , math.sqrt(y_Buff * y_Buff + z_Buff * z_Buff)) * 57.3

    # Return the current values in roll and pitch
    return ( roll, pitch )

# If we have found the LIS3DH
if imu.device_check():
    # Set range of accelerometer (can be RANGE_2_G, RANGE_4_G, RANGE_8_G or RANGE_16_G).
    imu.range = lis3dh.RANGE_2_G

    # Loop forever printing values
    while True:
        # Read accelerometer values (in m / s ^ 2).  Returns a 3-tuple of x, y,
        # z axis values.  Divide them by 9.806 to convert to Gs.
        x, y, z = [value / lis3dh.STANDARD_GRAVITY for value in imu.acceleration]
        print("x = %0.3f G, y = %0.3f G, z = %0.3f G" % (x, y, z))

        # Convert acceleration to Pitch and Roll and print values
        p, r = convert_accell_rotation( imu.acceleration )
        print("pitch = %0.2f, roll = %0.2f" % (p,r))

        # Small delay to keep things responsive but give time for interrupt processing.
        time.sleep(0.1)

REPLに表示される数字が変化するように、センサーを動かしてください。これは、記録された加速度データです。特定の動作がおこったときに、特定のことを開始するのに利用できます。

音センサー

この例では、音センサーの使い方を示します。これは、アナログ信号を出力する単純なマイクです。

音センサーの回路

音センサーの回路

この回路を使うには、以下のスクリプトをmain.pyにコピー・ペーストします。そして、“Run"ボタンをクリックし、実行します。

# Import Pin and ADC class from the machine module
from machine import Pin, ADC
# Import the time module
import time

# Create an ADC object and associate it with pin 5
pin_adc = ADC(Pin(9))      
# Set the attenuation level to 11dB, which allows for a wider input voltage range
pin_adc.atten(ADC.ATTN_11DB)   

while True:
    sum_value = 0

    for i in range(32):
        # Read the ADC value and add it to the sum
        sum_value += pin_adc.read()   

    # Right shift the sum by 5 bits (equivalent to dividing by 32) to get the average value
    sum_value >>= 5   

    # Print the average value   
    print(sum_value)   
    # Pause for 100 milliseconds
    time.sleep_ms(100)

スクリプトを実行後、センサーの近くで手をたたいたり、大きい音を立ててみてください。REPLで、出力が変化するのがわかります。

4桁ディスプレイ

この例は、Grove 4-digit displayの使い方をしめします。

4桁ディスプレイは、0-9までの任意の数字を表示できるので、アラームクロックなどでよく見られる、基本的な形式のディスプレイです。このデバイスは、I2Cを使うので、図に示すように、4本すべて必要です。

4桁ディスプレイの回路

4桁ディスプレイの回路

このモジュールは、MicroPythonをインストールしただけではインストールされないので、以下のコマンドでインストールする必要があります。

import mip
mip.install("https://raw.githubusercontent.com/mcauser/micropython-tm1637/master/tm1637.py")

インストールすると、“Run"ボタンをクリックすれば、以下のスクリプトを実行できます。

from machine import Pin
from time import sleep
import tm1637

tm = tm1637.TM1637(clk=Pin(12), dio=Pin(11))

tm.write([63, 191, 63, 63])  # Write a specific pattern of segments to the TM1637 display
sleep(1)

tm.numbers(17, 23)  # Display the numbers 17 and 23 on the TM1637 display
sleep(1)
tm.show('abcd')  # Display the characters 'abcd' on the TM1637 display
sleep(1)
tm.show('bcde')  # Display the characters 'bcde' on the TM1637 display
sleep(1)
tm.show('cdef')  # Display the characters 'cdef' on the TM1637 display
sleep(1)

tm.temperature(20)  # Display the temperature value 20 on the TM1637 display

異なる数字が表示されます。最後のフレームは、シミュレート値の温度(20)です。

4桁ディスプレイ

4桁ディスプレイ

湿度センサー

この例は、湿度センサー之使い方を示します。

このセンサーは、2つのプローブ間の抵抗を測定することで湿度を測定します。乾いた土は、湿った土よりも電導率が低く、Arduinoによって測定した電圧が、下がったり、上がったりします。

湿度センサーの回路

湿度センサーの回路

この回路を使うには、以下のスクリプトをmain.pyにコピー・ペーストします。そして、“Run"ボタンをクリックし、実行します。

# Import machine module
import machine
# Import time module
import time

# Define sensor pin
adc_pin = machine.Pin(4)
# Create ADC object and associate it with sensor pin
adc = machine.ADC(adc_pin)

#function mapping sensor values from 0 to 100.
def map_value(value, in_min, in_max, out_min, out_max):
    return (value - in_min) * (out_max - out_min) / (in_max - in_min) + out_min

# Infinite loop
while True:
    # Read sensor values
    reading = adc.read_u16()
    # Map sensor readings from 0 - 100 for improved user experience
    mapped_reading = map_value(reading, 0, 65535, 0, 100)
    # Print values in REPL
    print("Moisture: ", reading, " Mapped Moisture: ", mapped_reading)
    # Add short sleep timer for improved readability
    time.sleep_ms(500)

スクリプトを実行すると、湿度センサーの値がREPLに表示されます。

オリジナルのページ

https://docs.arduino.cc/micropython/micropython-course/course/examples/

最終更新日

April 14, 2024

inserted by FC2 system