熊おふし五郎が行く

主にマイコンボードを動かした記録を書いています

Tera Teamマクロで10秒間にTera Teamの端末にログを表示する

概要

Tera Teamは、シリアル通信に対応しているターミナルエミュレーターです。このTera TeamでWinPCとMicro:bitとのUART通信ができます。
また、Tera Teamはマクロで送受信のタイミング、受信したデータなどに応じて、データを送信することができます。ここでは、マクロを使った簡単なサンプルを示します。

サンプルマクロ

ここで説明するマクロは、Tera Teamの端末に10秒間に1回ログを表示します。 以下の順にTera Teamのマクロを説明します。

  1. フロー
  2. コード

フロー

サンプルマクロのフローを以下に示します。

  1. スタートメッセージを表示
  2. 端末にログを表示
  3. 10秒間マクロを停止
  4. 2~3を10回繰り返す
  5. 完了メッセージを表示

コード

サンプルマクロのコードを以下に示します。

dispstr 'Test Start'#13#10 ; スタート
i = 10
while i>0
  dispstr 'Waiting for reception'#13#10 ; 端末にログを表示
  pause 10 ; 10秒停止
  i = i - 1 ; 10回繰り返す
endwhile
dispstr 'Test End'#13#10 ; 終了

マクロの実行方法

以下の手順でマクロを実行します。

  1. Tera Teamを起動
  2. 「新しい接続」ダイアログでシリアルを選択し、「OK」ボタンをクリック
    f:id:bear_9973:20210106204021p:plain:w350
    シリアルの選択
  3. 「設定」→「端末の設定」メニューボタンで「端末の設定」ダイアログをひらく
  4. 「改行コード」→「受信」を「AUTO」に設定し、「OK」ボタンをクリック
    f:id:bear_9973:20210106204032p:plain:w350
    改行コードの設定
  5. 「コントロール」→「マクロ」メニューボタンでマクロファイルを選択し、マクロを実施開始

マクロの実行結果

Tera Teamのマクロの実行結果を以下に示します。Tera Teamの端末に10秒間に1回ログを表示できました。

f:id:bear_9973:20210106204342p:plain:w350
Tera Teamマクロの実行結果

※購入するときは、乾電池ボックス、USBケーブルが付いているか確認することをおすすめします。

受信データの仕様によるUARTの受信方法

概要

UARTの受信フローは、受信データの仕様によって変わることがあります。受信データは以下の2つに分けられます。

  • 固定長
  • 可変長

固定長と可変長の特長と受信フローを説明します。

基本的な接続

以下のようにMicro:bitとWin PCとを接続します。なお、WIn PCはRS232Cテストツールをあらかじめインストールします。

f:id:bear_9973:20210105172523p:plain:w350
基本的な接続

受信フロー

受信フローは、以下の3つを示します。

  • 固定長
    • あるバイト数のデータを受信したら、受信したデータをそのまま送信する
  • 可変長
    • データを受信したら、受信したデータをそのまま送信する
    • 改行までのデータを受信したら、受信したデータをそのまま送信する

固定長の受信データ

以下の順に説明します。

  • 固定長の受信フロー
  • コード
  • 動作結果

固定長の受信フロー

4バイトのデータを受信したら、受信したデータをそのまま送信します。

コード

コードを以下に示します。

from microbit import *

uart.init(baudrate=9600, bits=8, parity=None, stop=1)

while True:
    if uart.any():
        s = uart.read(4)
        uart.write(s)
    sleep(100)

動作結果

RS232Cテストツールの操作手順を以下に示します。

  1. RS232Cテストツールの[送信TEXT]に9バイトの電文を入力して、[TEXT送信]ボタンをクリック
  2. RS232Cテストツールの下の部分にMicro:bitからの電文が表示

UART送受信の結果を以下に示します。

f:id:bear_9973:20210105180016p:plain:w350
固定長データのUART送受信の結果

Micro:bitは4バイト分の電文を受信してそのまま送信したこと、受信バッファが空っぽになるまで送受信を繰り返していたことがわかります。

可変長(改行なし)の受信データ

以下の順に説明します。

  • 可変長(改行なし)の受信フロー
  • コード
  • 動作結果

可変長(改行なし)の受信フロー

データを受信したら、受信したデータをそのまま送信します。

コード

コードを以下に示します。

from microbit import *

uart.init(baudrate=9600, bits=8, parity=None, stop=1)

while True:
    if uart.any():
        s = uart.read()
        uart.write(s)
    sleep(100)

動作結果

RS232Cテストツールの操作手順を以下に示します。

  1. RS232Cテストツールの[送信TEXT]に9バイトの電文を入力して、[TEXT送信]ボタンをクリック
  2. RS232Cテストツールの下の部分にMicro:bitからの電文が表示

UART送受信の結果を以下に示します。

f:id:bear_9973:20210105180714p:plain:w350
改行なしの可変長データのUART送受信の結果

Micro:bitはすべての電文を受信してそのまま送信したことがわかります。

可変長(改行あり)の受信データ

以下の順に説明します。

  • 可変長(改行あり)の受信フロー
  • コード
  • 動作結果

可変長(改行あり)の受信フロー

データを受信したら、受信したデータをそのまま送信します。

コード

コードを以下に示します。

from microbit import *

uart.init(baudrate=9600, bits=8, parity=None, stop=1)

while True:
    if uart.any():
        s = uart.readline()
        uart.write(s)
    sleep(100)

動作結果

RS232Cテストツールの操作手順を以下に示します。

  1. RS232Cテストツールの[送信TEXT]に改行コードを入れた10バイトの電文を入力して、[TEXT送信]ボタンをクリック
  2. RS232Cテストツールの下の部分にMicro:bitからの電文が表示

UART送受信の結果を以下に示します。

f:id:bear_9973:20210105181445p:plain:w350
改行なしの可変長データのUART送受信の結果

Micro:bitは改行までの電文を受信してそのまま送信したこと、受信バッファが空っぽになるまで送受信を繰り返していたことがわかります。

※購入するときは、乾電池ボックス、USBケーブルが付いているか確認することをおすすめします。

Micro:bit、Micropythonで液晶ディスプレイに文字を表示する(GPIOを利用)

液晶ディスプレイ

液晶ディスプレイ(LCD)は、液晶の性質で光を制御し、文字、記号、図形を表示する画面装置です。

ドットマトリックスLCD

ここでは、HD44780コントローラー互換のSD1602ディスプレイを使用します。

f:id:bear_9973:20201124204101j:plain:w300
SD1602ディスプレイ

他メーカーのSD1602ディスプレイを購入するときは、 ドライバ回路にご留意してください。

インターフェース

Micro: bitから本モジュールへデジタル信号を入力します。

MicropythonとMicro:bit

SD1602ディスプレイに「クマオフシゴロウ」を表示するサンプルソフトを以下に説明します。

フロー

サンプルプログラムはSD1602ディスプレイに初期設定をして、文字を表示します。初期設定と文字の表示方法は、HD44780コントローラーまたはSD1602ディスプレイのデータシートを参考にしてください。

f:id:bear_9973:20201124205134p:plain:w200
フロー図

接続

接続表と接続図(写真)を示します。

Micro Bit LCD
ピン番号 機能 ピン番号 機能
P7 DigitalOut 14 D7
P6 DigitalOut 13 D6
P5 DigitalOut 12 D5
P4 DigitalOut 11 D4
- 10 D3
- 9 D2
- 8 D1
- 7 D0
P3 DigitalOut 6 E
GND GND 5 R/W
P2 DigitalOut 4 RS
(可変抵抗) 3 Vo
3V3 3V3 2 V+
GND GND 1 GND
GND GND 16 LED-
3V3 3V3 15 LED+

SD1602ディスプレイのピン番号は端から順番になっていませんので、接続にはご注意ください。

f:id:bear_9973:20201124205427p:plain:w400
構成図

コード

from microbit import *

# pinの定義
# P7 -> D7
# P6 -> D6
# P5 -> D5
# P4 -> D4
# P3 -> E
# P2 -> RS

# pin connections
# かならず、LEDディスプレイをOFFにする
rs = pin2
enable = pin3
datapins = [pin4, pin6, pin7, pin8]
# Read/Wrire pin は常に0にしてWriteモードにする

def pin_init():
    rs.write_digital(0)
    enable.write_digital(0)
    for i in range(0, 4):
        datapins[i].write_digital((0))
    sleep(1)

def pulseEnable():
    enable.write_digital(0)
    sleep(1)
    enable.write_digital(1)
    sleep(1)
    enable.write_digital(0)
    sleep(1)

def write4bits(value):
    for i in range(0, 4):
        datapins[i].write_digital((value >> i) & 0x01)
    pulseEnable()

display.off()
pin_init()

sleep(30)  # wait longer than 15 ms
write4bits(0x03)
sleep(5)  # wait longer than 4.1 ms
write4bits(0x03)
sleep(1)  # wait longer than 10 um
write4bits(0x03)
write4bits(0x02)  # interface 4 bits longer

write4bits(0x02)  # interface 4 bits longer
write4bits(0x08)  # DL:0(4 bits) N:1(2 lines) F:0(5*11 dots)

write4bits(0x00)  # display off
write4bits(0x08)  # D:0(off) C:0(off) B:0(off)

write4bits(0x00)  # display clear
write4bits(0x01)

write4bits(0x00)  # entry mode setting
write4bits(0x06)  # I/D:1(Address increment) S:0(Not display shit)

write4bits(0x00)  # display on
write4bits(0x0C)  # D:1(on) C:0(off) B:0(off)

rs.write_digital(1)  # ク 0x0B 0x08
write4bits(0x0B)
write4bits(0x08)

rs.write_digital(1)  # マ 0x0C 0x0F
write4bits(0x0C)
write4bits(0x0F)

rs.write_digital(1)  # オ 0x0B 0x05
write4bits(0x0B)
write4bits(0x05)

rs.write_digital(1)  # フ 0x0C 0x0C
write4bits(0x0C)
write4bits(0x0C)

rs.write_digital(1)  # シ 0x0B 0x0C
write4bits(0x0B)
write4bits(0x0C)

rs.write_digital(1)  # コ 0x0B 0x0A
write4bits(0x0B)
write4bits(0x0A)

rs.write_digital(1)  # ゛ 0x0D 0x0E
write4bits(0x0D)
write4bits(0x0E)

rs.write_digital(1)  # ロ 0x0D 0x0B
write4bits(0x0D)
write4bits(0x0B)

rs.write_digital(1)  # ウ 0x0B 0x03
write4bits(0x0B)
write4bits(0x03)

結果

SD1602ディスプレイに「クマオフシゴロウ」が表示されました。

f:id:bear_9973:20201124205513j:plain:w300
動作状況

Micro:bit、Micropythonで、マイクロサーボを動かす

マイクロサーボ

マイクロサーボは、受信したパルスのデューティ比で回転角度を制御するモーターです。マイコンがマイクロサーボを動かすとき、PWMを使うのが一般的です。

f:id:bear_9973:20201116185754p:plain:w500
マイクロサーボの動かし方

用意するマイクロサーボ

ここでは、KEYESTUDIO製BBC Micro: bitのスターターキットにあるマイクロサーボを使用します。

f:id:bear_9973:20201116185543j:plain:w300
マイクロサーボ

他メーカーのキーパッドを購入するときは、 周辺回路にご留意してください。

インターフェース

マイクロサーボは、アナログ信号(PWM)を入力します。

MicropythonとMicro:bit

サンプルソフトを以下に説明します。

フロー

サンプルプログラムのフローを以下に示します。

  1. Micro:bitの初期化
  2. サーボの初期化、1秒待ち
  3. 45°に移動、1秒待ち
  4. 90°に移動、1秒待ち
  5. 135°に移動、1秒待ち
  6. 180°に移動、1秒待ち
  7. 0°に移動、1秒待ち
  8. 3~7を繰り返す

接続

接続表と接続図(写真)を示します。

Micro:bit リレー
P0 PWM(オレンジ色線)
5V +(赤色線)
GND -(茶色線)

f:id:bear_9973:20201116190459p:plain:w400
構成図

コード

MicroPythonのwrite_analogは、デューティ比に応じて1~1023の数値(write_analog入力値)を入力します。 ここでは、角度からwrite_analog入力値に変換する関数を使用しています。 この関数は、次のように求めます。

  • マイクロサーボの仕様からPWMのパルス幅(ms)を確認
  • PWMのパルス幅(ms)から、パルス幅÷20(周期)でデューティ比を求める
  • デューティ比から、1023×デューティ比でwrite_analog入力値を求める

こうして以下の表ができます。さらに、角度とwrite_analog入力値で一次方程式関数を作成します。この一次方程式関数が、コードのconv1関数になります。

サーボの角度(°) PWMのパルス幅(ms) デューティ比 write_analog入力値
0 0.5 0.025 26
180 2.5 0.125 128
from microbit import *

def conv1(kakudo):
    k = 23 + 0.566666*kakudo
    return(k)

# Micro:bitを初期化
pin0.set_analog_period(20)  # PWMの周期を20 msに設定
# LEDディスプレイを初期化
display.clear()
# サーボの初期化
up_kakudo = 0t
pin0.write_analog(conv1(up_kakudo))
sleep(1000)

while True:
    pin0.write_analog(conv1(45))
    sleep(1000)

    pin0.write_analog(conv1(90))
    sleep(1000)

    pin0.write_analog(conv1(135))
    sleep(1000)

    pin0.write_analog(conv1(180))
    sleep(1000)

    pin0.write_analog(conv1(0))
    sleep(1000)

結果

サーボホーンが、0°を基準に45°、90°、135°、180°、0°の移動を繰り返しました。

他メーカーのキーパッドを購入するときは、 周辺回路にご留意してください。

Micro:bit、Micropython、リレーで、異常ランプを点灯する

リレー

リレーとは、制御信号、電気をつなぐデバイスです。日本語では「継電器」ともいいます。電気信号によって接点を切替えるスイッチで構成されています。リレーは4極リレーと5極リレーがあります。ここでは、5極リレーを使います。

f:id:bear_9973:20201112205057p:plain:w400
5極リレーの仕組み

用意するリレーモジュール

ここでは、KEYESTUDIO製BBC Micro: bitのスターターキットにあるリレーモジュールを使用します。

f:id:bear_9973:20201112205143j:plain:w200
リレーモジュール

他メーカーのリレーモジュールを購入するときは、 周辺回路にご留意してください。

インターフェース

リレーモジュールは、デジタル信号を入力します。

MicropythonとMicro:bit

サンプルソフトを以下に説明します。

フロー

サンプルプログラムのフローを以下に示します。リレーがOFFのときは、白LEDが点灯し、赤LEDは消灯します。リレーがONのときは、赤LEDが点灯し、白LEDは消灯します。

  1. Micro:bitのAボタンが押されていないときは、リレーをOFF
  2. Micro:bitのAボタンが押されたときは、リレーをON

接続

接続表と接続図(写真)を示します。

Micro:bit リレー
P0 S
3V +
GND -

f:id:bear_9973:20201112205701p:plain:w400
構成図

コード

from microbit import *

# LEDディスプレイを初期化
from microbit import *

# Micro:bitを初期化
display.clear()  # LEDディスプレイを初期化

pin0.set_pull(pin0.NO_PULL)  # cピンの状態

while True:
    # ボタンAが押されているか?
    if button_a.is_pressed():
        pin0.write_digital(1)  # リレーをON
    else:
        pin0.write_digital(0)  # リレーをOFF
    sleep(500)

結果

Micro:bitのAボタンが押されていない(通常の状態)ときは、白LEDが点灯します(赤LEDは消灯中)。Aボタンが押されたときは、白LEDは消灯して赤LEDが点灯します。

f:id:bear_9973:20201112205727j:plain:w500
動作状況

他メーカーのリレーモジュールを購入するときは、 周辺回路にご留意してください。

Micro:bit、Micropython、キーパッドでキー入力して、LDEディスプレイに数値、記号を表示する

キーパッド

キーパッドは、数値(0~9)または記号(#、、.、,など)を入力する入力機器です。このキーパッドは、複数のキースイッチの端子を格子状に配線しています(キーマトリックス方式)。キースキャンでボタンの状態を読み取ります。キースキャンとは、Row1~Row4の行ごとにHighまたはLowを出力して、Col1~Col4の入力でキーの状態を検出する方法です。例えば、Row1~Row4を出力、Col1~Col4を入力として、Row1がLow、Row2~Row4がHighの場合、Col1~Col4の入力で、1、4、7、キーが押された状態がわかります。

f:id:bear_9973:20201111205244p:plain:w300
キーパッドの仕組み

用意するキーパッド

ここでは、とても薄いキーパッドを使用します。

f:id:bear_9973:20201111205406j:plain:w300
キーパッド

他メーカーのキーパッドを購入するときは、 周辺回路にご留意してください。

インターフェース

キーパッドMicro:bitは、デジタル信号で入力/出力します。ここでは、Micro:bitの入力端子にプルアップ設定をしています。

MicropythonとMicro:bit

サンプルソフトを以下に説明します。

フロー

サンプルプログラムのフローを以下に示します。

  1. キーパットのボタン配置の定義
  2. 検出したキーデータを格納するバッファを設定
  3. キーパッドの接続ピンの初期化
  4. キースキャンの実行
  5. キースキャン結果の検証(チャタリング防止)
  6. キースキャン結果をLEDディスプレイに表示

接続

接続表と接続図(写真)を示します。

Micro:bit キーパッド
P0 Row1
P1 Row2
P2 Row3
P8 Row4
P12 Col1
P13 Col2
P14 Col3
P15 Col4

f:id:bear_9973:20201111210047p:plain:w400
構成図

コード

from microbit import *

# LEDディスプレイを初期化
display.clear()

rowNum = 4
colNum = 4

# キーパッドのボタン配置
keymap = [["1", "2", "3", "A"], ["4", "5", "6", "B"],
          ["7", "8", "9", "C"], ["*", "0", "#", "D"]]

# 検出したキーデータを格納するバッファ、2つ用意しチャタリングを防止
beforeKey = [[True for col_loop in range(4)] for row_loop in range(4)]
currentKey = [[True for col_loop in range(4)] for row_loop in range(4)]

# キーパッドに接続するピン
rowPin = (pin0, pin1, pin2, pin8)
colPin = (pin12, pin13, pin14, pin15)

# キーパッドの接続ピンの初期化
for pin_loop in range(0, 4, 1):
    rowPin[pin_loop].write_digital(1)
    colPin[pin_loop].set_pull(colPin[pin_loop].PULL_UP)

key_active = False

while True:
    for row_loop in range(0, 4, 1):
        rowPin[row_loop].write_digital(0)
        for col_loop in range(0, 4, 1):
            beforeKey[row_loop][col_loop] = currentKey[row_loop][col_loop]
            currentKey[row_loop][col_loop] = colPin[col_loop].read_digital()
        rowPin[row_loop].write_digital(1)

    for row_loop in range(0, 4, 1):
        for col_loop in range(0, 4, 1):
            if currentKey[row_loop][col_loop] != beforeKey[row_loop][col_loop]:
                if currentKey[row_loop][col_loop] == 0:
                    key_data = keymap[row_loop][col_loop]
                    key_active = True
                    break
        if key_active:
            break

    if key_active:
        print("get_key:%s" % key_data)
        display.show(key_data)
        key_active = False

    sleep(100)

結果

押したキーの数値または記号がLEDディスプレイに表示できました。以下は、5キーを押したときLEDディスプレイは5を表示しています。

f:id:bear_9973:20201111210123j:plain:w500
動作状況

他メーカーのキーパッドを購入するときは、 周辺回路にご留意してください。

Micro:bit、Micropython、ジョイスティックでLDEディスプレイのカーソルを移動する

ジョイスティック

ジョイスティックは、操作レバーの傾きで方向を入力する入力機器です。操作レバーの傾きは、可変抵抗で角度を検出します。また、操作レバーはスイッチになっている場合もあります。

f:id:bear_9973:20201111203310p:plain:w300
ジョイスティックの仕組み

ジョイスティックモジュール

ここでは、KEYESTUDIO製BBC Micro: bitのスターターキットにあるジョイスティックモジュールを使用します。

f:id:bear_9973:20201111203416j:plain:w200
ジョイスティックモジュール

他メーカーのジョイスティックモジュールを購入するときは、 周辺回路にご留意してください。

インターフェース

操作レバーの傾きで方向は、本モジュールからMicro: bitへのアナログ信号で入力します。また、ボタンはデジタル信号で入力します。

MicropythonとMicro:bit

サンプルソフトを以下に説明します。

フロー

サンプルプログラムのフローを以下に示します。

  1. レバーの傾きを入力
  2. レバーの押した状況を入力
  3. レバーの傾きの角度をLEDディスプレイの座標に変換
  4. もしレバーが押されているとき、LEDディスプレイに「YES」を表示
  5. そうでないとき、LEDディスプレイの座標にカーソルを表示

接続

接続表と接続図(写真)を示します。

Micro:bit モジュール
P0 X
P1 Y
P2 B
3V +
GND -

f:id:bear_9973:20201111203705p:plain:w400
構成図

コード

from microbit import *

# Micro:bitを初期化
display.clear()  # LCEディスプレイを初期化.
pin2.set_pull(pin2.NO_PULL)  # ピンの状態

while True:
    x_data = pin0.read_analog()
    y_data = pin1.read_analog()
    z_data = pin2.read_digital()

    led_x = x_data // 200
    led_y = y_data // 200

    if led_x >= 5:
        led_x = 4

    if led_y >= 5:
        led_y = 4

    print('x:%d y:%d z:%d' % (led_x, led_y, z_data))
    display.clear()
    if z_data:
        display.show(Image.YES)
    else:
        display.set_pixel(led_x, led_y, 9)

    sleep(500)

結果

レバーを傾けた方向にあわせて、LEDディスプレイのカーソルが移動します。また、レバーを押したとき、YES(チェックマーク)が表示します。

f:id:bear_9973:20201111203909j:plain:w300
動作状況

他メーカーのジョイスティックモジュールを購入するときは、 周辺回路にご留意してください。