ATtiny13Aでシリアル通信(UART)を行う
Attiny13Aでシリアル通信をしてパソコンとの連携をしたい今日この頃、
探しに探してやっと見つけ実現出来ました。
Nerd Ralphさんが「AVR half-duplex software UART supporting single pin operation」で
ATtinyで利用できるソフトウェアUARTを公開しています。
早速、ATtiny13Aで試してみました。ソースコードは上記HPからダウンロードできます。
かなり良いです。Nerd Ralphさんに感謝!! です。
概要
これは何?
シリアル通信(UART)をビットバンディング(エミュレーション)で実装したソフトです。
半二重通信でI/O用に1ピンのみ利用、消費フラッシュメモリはわずか62バイトです。
バッファリングは行っていないのでSRAMの消費は無しです。
16Mhzだと460.8kbpsの速度まで対応できるそうです(デフォルトは115.2kbps)。
送信・受信を同時に行うことはないのでこれで半二重通信も問題なしですね。
回路作成
1ピンで入出力に使う場合、ダイオード、トランジスタでTxとRxを分離する回路が必要です。
TxとRxを別ピンに割り当てればこれは不要です(ただし、ソース内のdefine文を修正)。
8ピンATtiny13A的には1ピンだけで済ませたいので、回路も作成しました。
特に部品説明はなかったので、トランジスタとダイオードは手持ちのありふれた
2SC1815、1N4148を利用しました。
実際はこんな感じ。
シリアル通信用にはPB3(D3)を割り当てました。
ライブラリのインストール
ダウンロードしたファイルを解凍しBasicSerial3フォルダをlibrariesフォルダに入れます。
ライブラリソースの修正
利用ピンがPB3(D3)なので、BasicSerial3.SのUART_Tx、UART_Rxの定義を修正します。
#define UART_Tx 3
#define UART_Rx 3
さらに、通信速度が115200に固定されているので、
//#define BAUD_RATE 115200
#if !defined(BAUD_RATE)
#define BAUD_RATE 115200
#endif
こんな感じに修正して、スケッチ(ソースコード)作成時にも設定できるようにしました。
動作確認のスケッチを作成して動かしてみます。
ATtiny13Aの9.6MHzだと57600bps,115200bpsではタイミング的に
微妙にエラーが発生します。
通信速度は38400bpsにて利用しました。
#define BAUD_RATE 38400 #include <BasicSerial3.h> // sketch to test Serial void setup() { } void serOut(const char* str) { while (*str) TxByte (*str++); } void loop(){ byte c; c = RxByte(); switch(c) { case '1': for (uint8_t i=0;i<10;i++) serOut("埼玉"); serOut("\n\r"); break; default: TxByte(c); } }
プログラムサイズは426バイトでした。標準のSerialと比べると小さいですね。
TeraTermで確認すると、双方向の通信が出来ました。
1を押すと"埼玉"を10個表示します。他はそのまま文字を表示します。
十分使えますね。通信速度 38400bps なら十分な速度です。
考察
念のため、ロジックアナライザで通信データを見てみました。
実は57600bps,115200bpsでもそれなりに通信できるのですが、微妙にエラーがでました。
微妙にフレームエラー発生です。パルス幅が規定どおり出てないみたいです。
38400bpsの場合はかなり良好です。
38400bpsの場合、1ビット当たり26.04マイクロ秒の時間幅なのですが、
生成している波形幅は25.5、26.0マイクロ秒で2%程度のずれでおさまっているようです。
検証時に使った、必要パルス幅とディレイに必要なサイクル数のメモ
検証用データ 通信速度と1ビット幅・必要ディレイサイクル数
※サイクル数換算は ATTiny13A 9.6MHzの場合
(57600,115200bpsのタイミングを合わせようとソースのTXDELAYを調整したがだめでした)
実際に、記事のコメント&感想でもATtiny13では38400bpsを使うと良いみないな
投稿がありました。
ということで、 38400bps なら十分利用できます。
このUARTライブラリはかなりの戦力として使えそうです。
ちなみに、2線でで利用する場合は
BasicSerial3.SのUART_Tx、UART_Rxに別ポートを割り当てればよいです。
#define UART_Tx 3
#define UART_Rx 4
この場合は、トランジスタ、ダイオード、抵抗は不要でピンに直接接続で利用出来ます。
今回の調査で参考にしたサイト
・福福電子工房 「RS-232Cとは?」 - 通信書式
・たろの部屋 月刊ソフト作り! 「通信ソフトを作る!(その1)」
・秋月電子 スイッチング・ダイオード 1N4148 、トランジスタ2SC1815GR
« ATtiny13AでI2C接続キャラクタLCDを利用する(2) | トップページ | AVRのアセンブラプログラミングを勉強しています »
「arduino」カテゴリの記事
- Arduino IDE+Arduino STM32環境で指定と異なるgccが使われてしまう(2025.01.23)
- Zorin OSでArduino Uno互換機(CH340)が認識しない(2025.01.19)
- Arduino IDE 2.3.4でArduino STM32を利用する(2025.01.12)
- Arduino用 SKK日本語変換ライブラリの開発 その1(2024.12.28)
- NeoPixel(WS2812B)の制御 その5(2024.09.15)
「AVR」カテゴリの記事
- NeoPixel(WS2812B)の制御 その5(2024.09.15)
- Arduino用SJIS漢字フォントライブラリ SDカード版を作成しました(2018.10.30)
- ATtiny13AでI2C接続キャラクタLCDを利用する(4)(2018.04.16)
- ATtiny13Aで赤外線リモコン受信センサーを使う(2)(2018.04.15)
- ATtiny13AでHC-SR04を使った距離計測(2018.04.14)
「ATtiny13A」カテゴリの記事
- ATtiny13AでI2C接続キャラクタLCDを利用する(4)(2018.04.16)
- ATtiny13Aで赤外線リモコン受信センサーを使う(2)(2018.04.15)
- ATtiny13AでHC-SR04を使った距離計測(2018.04.14)
- Arduino 1.8.5環境でATtiny13Aを利用する(2018.04.14)
- Arduino IDEを使ったATtiny13用スケッチの開発について(2016.08.30)
コメント
« ATtiny13AでI2C接続キャラクタLCDを利用する(2) | トップページ | AVRのアセンブラプログラミングを勉強しています »
ご無沙汰しています 今更ですが Digi sparkで1ピンシリアルを行いたいのですが
クロックが16.5MHzのようです このままつかえるでしょうか?
よろしくおねがいします
投稿: abe | 2018年2月 9日 (金) 09時52分
abeさん
クロックが異なるとタイミングも異なるので利用出来ないと思います。
同じクロックのArduino UNO(Atmega328)では利用できました。
Digisparkでのシリアル通信はDigisparkSoftSerialライブラリを使えば
1線でのシリアル通信が可能なようです。
結線方法はDigi_1io_SerialDbgあたりのサンプルソースが参考になると思います。
https://github.com/digistump/DigistumpArduino/blob/master/digistump-avr/libraries/DigisparkSoftSerial/examples/Digi_1io_SerialDbg/Digi_1io_SerialDbg.ino
投稿: たま吉さん(管理者) | 2018年2月 9日 (金) 10時59分
了解 明日実験してみます
ありがとうございました
投稿: abe | 2018年2月 9日 (金) 13時21分