熊おふし五郎が行く

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

Processing3(WinPC)とMicro:bitの文字データ送受信

概要

WinPCとMico:bitが、シリアル通信(UART)を介して制御します。WinPCは、processing3で開発したアプリケーションからMicro:bitを制御します。

f:id:bear_9973:20210209172601p:plain:w400
概要図

外部仕様

  • Micro:bitのAボタンを押すと、B画面が表示されます。
  • Bボタンを押すと、A画面が表示されます。
    f:id:bear_9973:20210209181922p:plain:w400
    A/B ボタン
  • A/B画面の各画像をマウスでクリックすると、Micro:bitのLEDディスプレイにクリックした画像と同じものが表示されます。
    f:id:bear_9973:20210209182100p:plain:w400
    A Display
    f:id:bear_9973:20210209182129p:plain:w400
    B Display

基本的な接続

UART-USB変換を使用して、以下のようにMicro:bitとWin PCとを接続します。

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

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

ProcessingとMicropython

ソフトウェアは、以下の順に説明します。

Processing

以下の順に説明します。

  • フロー
  • コード

フロー

2つの四角形を画面に表示し、右の四角形は、Micro:bitから受信したとき、色が変わります。左の四角形は、マウスを画面にクリックしたとき、色が変わりMicro:bitにコマンドを送信します。 フローを以下に示します。

  1. UARTポートを設定
  2. 1秒ごとに表示されるフレーム数を30に設定(シリアル通信の送受信は約33.3msに実施)
  3. フレーム(Processingのアプリ画面)を更新する毎に、シリアル通信の受信とマウスのクリックを確認
  4. Micro:bitからシリアル通信の受信があった場合、コマンドに応じてA画面またはB画面を表示
  5. マウスのクリックがあった場合、クリックされた画面をコマンドでMicro:bitに送信

コード

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

import processing.serial.*;
Serial serial;
int r; // 画面の表示状態 0:A display 1: B display

void setup(){
  size(400,400); //画面サイズ
  frameRate(30); //1秒ごとに30回表示
  
  textSize(60);       // テキストサイズの指定
  textAlign(CENTER);  // 文字配置
  serial = new Serial(this, "COM8", 9600); // シリアル通信の設定
  
  r = 0; // 画面の表示状態の初期化
}

void draw(){
  background(100); // 背景色の設定
  int idata;       // シリアル通信の受信データ数

  // シリアル通信制御部
  idata = serial.available();
  // println("rec:",idata);
  if (idata >= 1)
  {
    r = serial.read();
    // println("recdata:",r);
  }

  // 画面制御部
  if (r == 0){
     a_display();
  }else{
     b_display();
  }
}

void mousePressed()
{
  // マウスクリックした場合、マウスカーソルを検出
  int mouseposdata;
  if( 0 <= mouseX && mouseX < 200 && 0 <= mouseY && mouseY < 200){ // 左上
     mouseposdata = 1;
  }else if( 0 <= mouseX && mouseX < 200 && 200 <= mouseY && mouseY < 400){ // 左下
     mouseposdata = 2;
  }else if( 200 <= mouseX && mouseX < 400 && 0 <= mouseY && mouseY < 200){ // 右上
     mouseposdata = 3;
  }else if( 200 <= mouseX && mouseX < 400 && 200 <= mouseY && mouseY < 400){ // 右下
     mouseposdata = 4;
  }else{
     mouseposdata = 0; 
  }
  ctrl_write_serial(mouseposdata); // シリアル送信部へ
}

void ctrl_write_serial(int posdata){
  int i_senddata;
  
  i_senddata = r * 5 + posdata; // 送信データ生成
  serial.write(str(i_senddata));
  println("senddata:",i_senddata);

}

// A displayの表示
void a_display(){
  fill(135,206,250); // lightskyblue
  rect(0,0,200,200); // 左上
  fill(0);
  text("(^_^)", 100, 100); //HAPPY
   
  fill(135,206,235); // skyblue
  rect(0,200,200,200); // 左下
  fill(0);
  text("(>_<)", 100, 300); //SAD
 
  fill(127,255,212); // aquamarine
  rect(200,0,200,200); // 右上
  fill(0);
  text("('O')", 300, 100); //SURPRISED
 
  fill(64,224,208); // turqoise
  rect(200,200,200,200); // 右下
  fill(0);
  text("(-.-)", 300, 300); //SURPRISED
}

// B displayの表示
void b_display(){
  fill(240,255,255); // azure
  rect(0,0,200,200); // 左上
  fill(0);
  text("↑", 100, 100); // ARROW_N
  
  fill(240,255,240); // honeydew
  rect(0,200,200,200); // 左下
  fill(0);
  text("↓", 100, 300); // ARROW_S
  
  fill(240,248,255); // aliceblue
  rect(200,0,200,200); // 右上
  fill(0);
  text("→", 300, 100); // ARROW_E

  fill(224,255,255); // lightcyan
  rect(200,200,200,200); // 右下
  fill(0);
  text("←", 300, 300); // ARROW_W
}

MicropythonとMicro:bit

以下の順に説明します。

  • フロー
  • コード
  • 動作結果

フロー

フローを以下に示します。

  1. UARTポートを設定
  2. 100 ms毎に、受信状態とAボタン、Bボタンの状態を確認
  3. データを受信したときは、LEDスクリーンに画像を表示
  4. AボタンまたはBボタンが押されたときは、データを送信
  5. 2に戻る(ループ)

コード

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

from microbit import *
# シリアル通信の設定
uart.init(baudrate=9600, bits=8, parity=None, stop=1, tx=pin0, rx=pin1)

while True:
    if uart.any(): # シリアル通信を受信
        s = uart.read()
        s_str = str(s.strip(), 'UTF-8') # 文字列データに変換
        if s_str == "1": # A ディスプレイの左上をマウスクリック
            display.show(Image.HAPPY)
        elif s_str == "2": # A ディスプレイの左下をマウスクリック
            display.show(Image.SAD)
        elif s_str == "3": # A ディスプレイの右上をマウスクリック
            display.show(Image.SURPRISED)
        elif s_str == "4": # A ディスプレイの右下をマウスクリック
            display.show(Image.ASLEEP)
        elif s_str == "6": # B ディスプレイの左上をマウスクリック
            display.show(Image.ARROW_N)
        elif s_str == "7": # B ディスプレイの左下をマウスクリック
            display.show(Image.ARROW_S)
        elif s_str == "8": # B ディスプレイの右上をマウスクリック
            display.show(Image.ARROW_E)
        elif s_str == "9": # B ディスプレイの右下をマウスクリック
            display.show(Image.ARROW_W)
        else:
            display.show(Image.NO)

    if button_a.is_pressed():
        # Aボタンが押されたことをPCに知らせる
        uart.write(b'\x01')
    elif button_b.is_pressed():
        # Bボタンが押されたことをPCに知らせる
        uart.write(b'\x00')
    else:
        pass
    sleep(100) # Aボタン、Bボタン、シリアル通信の状況は、100 ms毎に確認

動作結果

  • Micro:bitのAボタンを押すと、B画面を表示できました。
  • Bボタンを押すと、A画面を表示できました。
  • A/B画面の各画像をマウスでクリックすると、Micro:bitのLEDディスプレイにクリックした画像と同じものを表示できました。

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