Computer-zu-Arduino-Schnittstellenoptionen

Ich muss alle 20 ms (ungefähr) 800 Byte Daten von einem Computer an ein Arduino-Board senden. Ich begann mit der seriellen Bibliothek, die gut funktioniert, aber selbst bei der höchsten Rate (115200 Baud) zu langsam ist, um mit einem Computer verbunden zu werden.

Welche anderen Schnittstellen sind verfügbar, die schneller senden können? Kann ich USB oder Spi verwenden? Ich kann anscheinend keine Bibliotheken dafür finden. Ich brauche etwas mit etwa 320 kBaud.

bearbeiten

Gibt es Schilder, die das können? Bluetooth oder WLAN?

Was machen Sie mit diesen Daten? Der AVR ist nicht dafür ausgelegt, eine riesige Datenmenge zu verarbeiten, wenn Sie Ihre Kommunikation optimieren könnten, wäre dies vorzuziehen, unabhängig davon, wie Sie mit dem Ding sprechen. Das Puffern von 800 Bytes ist möglicherweise nicht einmal möglich.
800 Bytes ist das Minimum, das ich glaube ich senden kann. Ich habe 400 LEDs an ein Arduino angeschlossen und jede hat ihre eigene 15-Bit-Farbe. Ich komprimiere die 800 Bytes noch nicht, ich denke, ich könnte das tun, wenn ich einen effizienten Weg hätte, dies zu tun. Gibt es dafür eine Arduino-Bibliothek?
Also ein 20x20 RGB-Array bei 50 Hz?
Genau, aber ich könnte wahrscheinlich auf etwa 30 ms (~ 33 Hz) herunterfallen, wenn 50 Hz zu ambitioniert sind.
Wenn Sie während des Datenempfangs nichts anderes mit AVR machen, dann kann AVR damit problemlos umgehen, wenn er mit Daten über eine serielle Verbindung mit 921600 oder 460800 bps gespeist wird.

Antworten (5)

Wie wäre es, nur geänderte Bytes alle 20 ms zu senden? Sie würden zusätzliche 9 Bits für die Adressierung benötigen, aber wenn Sie dieses Bit in das leere Bit in Ihren 15-Bit-Farbdaten stecken, könnten Sie dies mit nur einem zusätzlichen Byte pro LED tun. Je nachdem, wie schnell Ihr Display die Farben ändert, könnte das gut funktionieren. Sie könnten einen Schwellenwert festlegen. Wenn sich die Farbe also um weniger als X ändert, warten Sie auf die nächste Runde, um diese Daten zu senden.

Oder versuchen Sie vielleicht, die Daten zu verschachteln? Gerade Reihen und ungerade Reihen abwechselnd senden?

Oder 4 Arduinos parallel verwenden?

Oder die LEDs über ein Schieberegister steuern und dann 15 Bit über einen parallelen Anschluss an 15 Arduino-Pins senden (vorausgesetzt, Sie finden einen PC mit parallelem Anschluss)?

Der einschränkende Faktor ist wahrscheinlich der serielle Anschluss, die Treiber und/oder die Arduino-Bibliothek Ihres Computers. Wenn ich mich richtig erinnere, kann der AVR-UART bis zu seiner Taktrate geteilt durch 8 oder 16 gehen, und ein FTDI-Chip kann bei beliebigen Baudraten gleich hoch sein (3 MBaud für diesen FT232RL auf meinem Schreibtisch).

Die meisten Schilde werden über den AVR UART kommunizieren. Wenn die Arduino-Bibliothek Sie also einschränkt, helfen sie nicht.

Mit der richtigen Hardware kann Windows die serielle Kommunikation mit bis zu 921600 bps (115200 x2, x4, x8) verarbeiten. Es gibt PCI-Kommunikationskarten, die diese Baudrate unterstützen, aber beliebter sind USB<>RS232-Konverter. Wenn ich mich recht erinnere, können alle FTDI-basierten Konverter damit umgehen. Das größere Problem ist die AVR-Seite, wo Sie nichts anderes tun können, während Daten empfangen werden. RX sollte der einzige Interrupt sein, der auf AVR-Seite erlaubt ist. Sie müssen Ihren AVR wahrscheinlich auch so hoch wie möglich takten (16 oder 20 MHz, je nach Modell, 14,746 MHz, wenn Sie genau 921600 haben möchten). Dann senden Sie vom PC das gesamte Kommunikationspaket, AVR erledigt die Arbeit nach dem Empfang und sendet ein Bestätigungsbyte, dass es für das nächste Paket bereit ist. Wenn der PC eine Bestätigung erhält, kann er ein weiteres Paket senden. Und so weiter... Einfache Timer auf PC-Seite sind (aufgrund von Multitasking in Windows) sehr schlecht im Umgang mit einer Auflösung von 10 ms und sie sind überhaupt nicht genau (außer Multimedia-Timer, wenn sie richtig gehandhabt werden), daher ist die Verwendung eines einfachen Bestätigungsbytes bereits beschrieben eine viel bessere Option.

Ich weiß nicht, welche Schilde verfügbar sind, ich bin im Allgemeinen nur ein Mikrocontroller-Typ.

Wenn Ihre Baudrate höher wird, macht ein synchrones Protokoll sehr viel Sinn. SPI ist sehr einfach und ermöglicht sehr einfach Baudraten von mehr als 1 Mbps.

Wenn Sie jedoch nur 300 kBaud oder sogar 1 MBaud erreichen müssen und mit UART einverstanden sind, ist die FTDI-Chiplinie das einzig Wahre .

Einer der Chips, der dies speziell kann, ist der FT2232H . Diese unterstützen kein SPI, können aber mit sehr schnellem UART umgehen. Aus ihren Spezifikationen:

RS232/RS422/RS485 UART Übertragungsdatenrate bis zu 12 MBaud. (RS232-Datenrate durch externen Pegelumsetzer begrenzt).

Hmmm interessant, den Chip muss ich mir mal anschauen. Leider kann ich SPI nicht verwenden, weil ich es bereits verwende, um die LEDs zu steuern, die an das Arduino angeschlossen sind (über Pins 11 und 13).
Entschuldigung, ich habe mich verfehlt. Der FT2232H-Chip ist UART. Ich korrigiere meinen Beitrag.
Verwenden Sie programmierbare Treiber, um die LEDs tatsächlich zu steuern, oder verwenden Sie Schieberegister? Wie viel Prozessorzeit verbrauchen Sie, um nur die Daten zu manipulieren, um den SPI zu versenden?
@NickT, ich bin sehr verwirrt von deinem Kommentar. Er kann UART verwenden, um die Daten abzurufen und die LEDs einzustellen, ich bin mir sicher, dass es eine volle Arbeitslast ist.
Ich war neugierig, wie er die 1200 LEDs antreibt; Ich kann mir nicht vorstellen, dass dies mit einem AVR ohne zusätzliche Controller möglich ist. Er sagte, er verwende das SPI zur Kommunikation, also könnte es sich um einen Controller handeln, aber möglicherweise um ein oder mehrere einfache Schieberegister.
@NickT, ich denke, Sie könnten es missverstehen, er sagte, er könne SPI nicht verwenden, und Sie führen die Diskussion über eine Antwort, nicht über die Frage. Ihr Kommentar ist für die Frage, nicht für meine Antwort.
Es war relevant für Informationen, die früher im Kommentarthread zu dieser Antwort auf die Frage aufgetaucht sind.
@NickT, wo hat er gesagt, dass er SPI verwendet?

Arduinos sind großartig, aber sie haben ihre Grenzen. Wenn Sie nicht in C programmieren und nur den Arduino-Bootloader verwenden, laufen sie tendenziell viel langsamer. Ich bin kein großer Guru in Bezug auf Datenraten usw., aber ich würde erwarten, dass Sie bei 50 Hz für die Arduino-Fähigkeiten an die Wand stoßen würden. Ich würde vorschlagen, sich die Programmierung in C anzusehen (hackaday.com hat gerade eine großartige Reihe von Tutorials dazu erstellt) oder einen anderen Mikrocontroller auszuprobieren. Mein Favorit für Projekte wie dieses ist der Parallax-Propellor, im Wesentlichen 8 Mikrocontroller in einem.