ソフトウェアシリアルを使ったマイコンのデバッグ
ATtiny85単体を使うことがあった。マイコン単体利用なので、Arduinoなどのボードように直接PCに接続し、シリアルコンソールにログ表示(デバッグ)をすることができない。ここでは、ATtiny85とArduinoを接続し、Arduino経由でPCにログ表示する方法を記載。
ソフトウェアシリアル
ソフトウェアシリアルを使って、ATtiny85とArduinoとを接続する。要は、GPIO上でシリアル通信を実現するもの。ここなど、ソフトウェアシリアルについては多数の情報が見つかる。
ATtiny85開発環境
話はそれるかもしれないが、ATtiny85の開発環境も本記事に記述。
データシート
ここで見つかる。ピンアサインは次のとおり。
USBasp
Arduino IDEを使って、ATtiny85へのプログラムの書き込みが可能である。書き込み装置として、USBaspを使う。ここに、書き込みのための配線やコネクタのピン配置について記載あり。
ブレッドボードの真ん中にあるものがATtiny85。
プログラムの書き込み
Arduino IDEでは、「書込装置を使って書き込む」を選択する。
ループバックでテスト
まずは、ループバックで確認。
PC - Arduino - ATtiny85
と接続し、PCのコンソールから入力した文字が、ATtiny85からPCへ戻ることを実施。
Arduino側コードはこちら(美しくないコードであるが勘弁)。
# 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側コードはこちら。
# 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のボード選択後のオプションメニューで選択。
デバッグ時には1MHzを、通常は8MHz、、とするのも手であろう。
ソフトシリアル通信速度
あまりに速度が大きいと、文字化けしてしまった。例えば、9600bpsの時の結果は、次のようなもの。
「123」と入力したが、「1.3」とループバックしている。ここでは、4800bpsを選択している。
ログ表示(本題)
PC - Arduino - ATtiny85
と接続する。Arduino側コードは次のようなもの。
# 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側のサンプルコードは次のようなもの。
# 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側で次のような出力となる。
終わりに
UARTを持たないマイコンのデバッグに有効であろう。入力を考えなければ、GPIO1つですむ。