0
0

More than 3 years have passed since last update.

ソフトウェアシリアルを使ってマイコンのデバッグを考える

Posted at

ソフトウェアシリアルを使ったマイコンのデバッグ

ATtiny85単体を使うことがあった。マイコン単体利用なので、Arduinoなどのボードように直接PCに接続し、シリアルコンソールにログ表示(デバッグ)をすることができない。ここでは、ATtiny85とArduinoを接続し、Arduino経由でPCにログ表示する方法を記載。

ソフトウェアシリアル

ソフトウェアシリアルを使って、ATtiny85とArduinoとを接続する。要は、GPIO上でシリアル通信を実現するもの。ここなど、ソフトウェアシリアルについては多数の情報が見つかる。

ATtiny85開発環境

話はそれるかもしれないが、ATtiny85の開発環境も本記事に記述。

データシート

ここで見つかる。ピンアサインは次のとおり。
image.png

USBasp

Arduino IDEを使って、ATtiny85へのプログラムの書き込みが可能である。書き込み装置として、USBaspを使う。ここに、書き込みのための配線やコネクタのピン配置について記載あり。

ブレッドボードの真ん中にあるものがATtiny85。

プログラムの書き込み

Arduino IDEでは、「書込装置を使って書き込む」を選択する。
image.png

ループバックでテスト

まずは、ループバックで確認。
  PC - Arduino - ATtiny85
と接続し、PCのコンソールから入力した文字が、ATtiny85からPCへ戻ることを実施。

Arduino側コードはこちら(美しくないコードであるが勘弁)。

ArduinoSoftwareSerial.ino
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX

void setup()
{
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(9600);
  mySerial.begin(4800);
  Serial.println("Setup is done.");
}

void loop()
{
  if (Serial.available()) {
    String data = Serial.readStringUntil('\n');
    for (int i = 0; i < data.length(); i++) {
      mySerial.write(data.charAt(i));
    }
  }
  if (mySerial.available()) {
    digitalWrite(LED_BUILTIN, HIGH);
    delay(500);
    Serial.write(mySerial.read());
    digitalWrite(LED_BUILTIN, LOW);
    delay(400);
  }
}

ATtiny85側コードはこちら。

ATtiny85SoftwareSerial.ino
#include <SoftwareSerial.h>
SoftwareSerial mySerial(3, 4); // RX, TX

#define LED 0

void setup()
{
  pinMode(LED, OUTPUT);
  mySerial.begin(4800);
}

void loop()
{
  if (mySerial.available()) {
    digitalWrite(LED, HIGH);
    delay(300);
    mySerial.write(mySerial.read());
    digitalWrite(LED, LOW);
    delay(200);
  }
}

ポイントは以下。
- SoftwareSerial mySerial(): ソフトシリアルの宣言
- Arduinoのピン10とATtiny85のピン4、Arduinoのピン11とATtiny85のピン3とを接続
なお、通信されていることを視覚化するため、LEDを用いている。

ATtiny85のクロック

標準の8MHzではソフトウェアシリアルがうまく動作しなかっため(文字化け)、1MHzを用いた。Arduino IDEのボード選択後のオプションメニューで選択。
image.png
デバッグ時には1MHzを、通常は8MHz、、とするのも手であろう。

ソフトシリアル通信速度

あまりに速度が大きいと、文字化けしてしまった。例えば、9600bpsの時の結果は、次のようなもの。
9600.png
「123」と入力したが、「1.3」とループバックしている。ここでは、4800bpsを選択している。
4800bps.png

ログ表示(本題)

PC - Arduino - ATtiny85
と接続する。Arduino側コードは次のようなもの。

ArduinoSoftwareSerial-r1.ino
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX

void setup()
{
  Serial.begin(9600);
  mySerial.begin(4800);
  Serial.println("Setup is done.");
}

void loop()
{
  if (mySerial.available()) {
    Serial.write(mySerial.read());
  }
}

ATtiny85から受けたデータをシリアルコンソール(PC)に送る。ATtiny85側のサンプルコードは次のようなもの。

ATtiny85SoftwareSerial-r1.ino
#include <SoftwareSerial.h>
SoftwareSerial mySerial(3, 4); // RX, TX

void setup()
{
  mySerial.begin(4800);
}

void loop()
{
  char buf[16];
  static uint32_t num = 0;

  sprintf(buf, "Debug %d\n", num++);
  for (int i = 0; i < strlen(buf); i++) {  
    mySerial.write(buf[i]);
  }
  delay(1000);
}

1秒毎にデバッグメッセージをArduinoに送るサンプル。PC側で次のような出力となる。
Debug.png

終わりに

UARTを持たないマイコンのデバッグに有効であろう。入力を考えなければ、GPIO1つですむ。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0