シリアル初心者:ワイヤーをつなぐことができないのはなぜですか?


14

私は、ほとんど何も理解せずに、USB-SerialコンバーターでArduino風のコードを使用してATtiny85からPCに送信しようとしています。私はショックを受け、うまくいかなかったことにthat然とした。

その小さなピンがピンの1つの電圧を点滅させていることを確認しましたが、そのピンをUSBシリアルケーブルで送信または受信に接続し、ターミナルプログラムを使用して試聴しようとしても、何も得られません。

どの部分が壊れているかをどのように判断するかわかりません。

シリアルを送信するには、VCC、GND、TXD以上のものが必要ですか?


詳細:

この小さなコードはArduino環境で書かれており、少なくともLEDによれば、同様のコードが4つの「PORTB」ピンすべてを正常に点滅させます。HLTとSaporettiのコードを使用して、C ++のArduino方言を使用してプログラミングします。プログラムはまだKの下にあります。

#include <SoftwareSerial.h>

SoftwareSerial s(0,1); //receive on "0", and transmit on "1" aka "PB1" aka pin 6

void setup() { s.begin(4800); } // assuming 1Mhz, 4800 baud
void loop() { s.println(millis()); } // transmit something at every opportunity

多くの翻訳が含まれますが、コードは非常に基本的です。ボーレートを設定するコードは1MHzを想定しているようですが、幸いなことに、私の設定には工場出荷時のデフォルトヒューズがあり、1MHzで動作します。いずれにしても、ピン6はLEDに応じて電圧が点滅しています。

そこで、FTDI USBシリアルコンバーターの「ftdi」端を小さなワイヤーに接続します。黒にGND、赤にVCC、オレンジに6。PCでプログラム「minicom」を開き、ボーを設定します。 4800まで評価して、何もしないで待ちます。Boarduinoと話をするとき、問題はありません。

FTDIコンバーターケーブルのピン配列は次のとおりです。黒はGND、茶色は「CTS」、赤はVCC(+ 4.98V)、オレンジは「TXD」、黄色は「RXD」、緑は「RTS」です。

小型からPCに送信したい場合、「TXD」または「RXD」の電圧を点滅させる必要がありますか?言い換えれば、スレーブからホストに送信する送信ワイヤですか、それともホストからスレーブに送信するワイヤですか?

私は実際に両方を試しましたが、どちらも機能しませんでした。これまでに1ドル未満の機器を揚げたところ、生意気になっているので、ケーブルにケーブルを差し込むだけです。「CTS」と「RTS」のワイヤを無視することはないのでしょうか?

他のワイヤを使用する必要がありますか?RTSとCTSは何をしますか?

ハードウェアは、4.98VのUSBで駆動されるATTiny85-PU(DIP-8パッケージ、1MHzで動作、定格20MHz)です。ホストPCはMacBookであり、ArduinoISPを使用してATtinyの小さなハートを点滅させるなど、arduinoのすべてを正常に実行します。

回答:


9

TXとGNDだけを使用してデータを確実に送信できます。

最初に、ATtiny85 TXラインをFTDI RXラインに接続します(TTL-232Rの黄色)。USBアダプターが5Vを処理できることを確認してください-3.3V TTL-232Rでも5Vに耐えられると確信しています。

SoftwareSerialのサンプルページによると、セットアップ関数でTXおよびRXラインの方向を設定する必要があります。

// include the SoftwareSerial library so you can use its functions:
#include <SoftwareSerial.h>

#define rxPin 2
#define txPin 3
#define ledPin 13

// set up a new serial port
SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);
byte pinState = 0;

void setup()  {
  // define pin modes for tx, rx, led pins:
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
  pinMode(ledPin, OUTPUT);
  // set the data rate for the SoftwareSerial port
  mySerial.begin(9600);
}

あなたの場合、ボーレートは4800です。SoftwareSerialライブラリーはCTSおよびRTSをサポートしていないようです。そのため、ホストソフトウェアでそれらを使用していないことを確認してください。

詳細についてはリファレンスページを参照してください。小型の内部発振器を使用して1MHzで動作している場合に悪化する可能性のある潜在的なタイミングの問題について説明しています。


ありがとう!リファレンスページでは、4800の速度が速すぎることが明らかになったので、300ボーに落としましたが、事態は「より良く」なりました。pinModeは送信には影響しませんが、わかりやすくするためにとにかく追加しました。何かが受信されるまで、ビット間の遅延を変更する速度を遅くしようとしています。Minicomはちょうど表示されていますか?今マークします。最悪の場合、私の16mhzと20mhzの発振器は金曜日に到着します。
ジャックシュミット

電圧の問題だと思いますか?タイミングの調整はまだ機能せず、多くの疑問符が表示されるため、何かが送信されています。Vccを小さな3Vに下げるだけで修正できますか?つまり、USBの代わりにいくつかのバッテリーに接続できますか?アースをUSBアースとバッテリーアースの両方に接続しますか?
ジャックシュミット

ああ、黄色い線を指摘してくれてありがとう。オレンジ色の線が大きく点滅しているようです(PCからLEDに引っ掛けられています)。PCは送信中ですか、それともほとんど「オン」のままですか?
ジャックシュミット

はい、アイドル時にはHIのままで、送信時にはちらつきます-FTDIがLEDを駆動するのに十分な電流を供給できるかどうかはわかりません。AVRは問題ありませんが、LEDをFTDI-TXラインから取り外します。Crystalはタイミングの問題を修正する必要があります(ただし、内部発振器から切り替えるためにヒューズを設定する必要があります)。
ピーターギブソン

まだそれに取り組んでいますが、私はそれがタイミングの問題か恐ろしいArduino-on-ATTinyソフトウェアの問題だと確信しています。いくつかの中央の2〜3バイトが受信され(表示されません)、残りは0x80として文字化けします。クリスタルを待つ間に、独自の(簡単な)AVRソフトシリアル送信機能を作成します。送信されているものを確認する簡単な方法はありますか?私の古い目では、300ボーはまだかなり速いです。
ジャックシュミット

7

答えは、ように見えるんので:あなたができるだけでちょうどGND(黒)とRXD(黄色)確かに、ワイヤーをフックアップし、すべては限りソフトウェアが良いですとして動作します。

重要ではないこと:

  • 内部発振器は正常に動作します。私の制限テストでは比較的安定しているようです。9600ボーでは、どんな問題でも無視できます。

  • 信号にUSB電源を使用しても問題ありません。別の電圧源を使用することもできます(共通グランドを共有)が、FTDIケーブルは3Vと5Vの両方の信号を完全に読み取ります。バッテリーパックを-FTDIと小型の両方のGNDに、小型+のVCCに+接続しましたが、これは正常に機能しました。ただし、FTDI(USB電源5V)のVCC(赤)を使用する方がはるかに簡単で効果的です。

私が間違ったこと:

  • 黄色のFTDI「RXD」ラインは、マイクロコントローラーからビットを受信するため、マイクロコントローラーの送信に接続します。送信線と受信線(オレンジ色と黄色)をLEDまたはArduinoに接続し、PCから送信したときにどの電圧がちらつくかを確認することで、自分でこれを理解できました。

  • SoftwareSerialもNewSoftSerialもATtinyではすぐに使用できません。ATmega328pとATtiny85には多くの類似点がありますが、古いソフトウェアを新しいチップ用にコンパイルするだけでは不十分であるという十分な違いがあります。

  • ボーレートを遅くしても問題は解決しません。300ボーでは、ビット間のサイクル数が8ビットカウンターよりも大幅に多いため、より複雑な遅延ルーチンが必要です。9600ボーは正常に機能し、より高いボーレートが実行可能です。

  • 特にインライン関数では、Cでタイミングが重要なコードを書くことに注意してください。実行にかかる時間は、コンパイラが最適化する方法によって異なります。特に、遅延を上下に変更するだけで調整する場合、生成されるアセンブリはかなり異なる可能性があるため、(コンパイル時間を検出可能な)一定の遅延を使用する場合とは異なる答えが得られます。Cが「遅い」ということではなく、速すぎるということです。ある時点で、私は0よりも1を速く送信していました(おそらくより空力的です)。

  • 伝送を開始するには、ラインをLOW(開始ビット)にし、次の8つのサンプルポイントのそれぞれでラインが正しい電圧であることを確認し、9番目のサンプルで電圧がHIGHであることを確認する必要があります。 。NewSoftSerialは、スタートビットで半長の遅延を行うことに言及していますが、これは私にはうまくいきませんでした。開始時に75%の遅延を、終了時に125%の遅延を使用しました。

  • 電圧に関する本当の懸念は、一部の「シリアル」(特にRS232)が0V / 5Vではなく±12Vであることです。私は電圧を5Vから3.3Vに調整する方法を理解しようとして多くの時間を費やしましたが、それは完全に無関係であると思います。

いずれにせよ、シリアルの送信は簡単ですが、タイミングを「完璧」にすることは非常に重要です。私にとって、これはアセンブリで送信をコーディングするだけで、サイクルを数えることができました。


2
より空力的な1のために+1 :) FTDI TTL232Rは論理レベルのUART信号(0-5V)を出力します。標準シリアルポートと直接インターフェースする場合、電圧を変換するMAX232などのインターフェースICが必要です。両方の方法でレベルを設定します。
ピーターギブソン

動作するようになったおめでとうございます。詳細な投稿をありがとう、これが他の多くの人々のATtinyプロジェクトに役立つことを願っています。
-davidcary
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.