Hallo!
Ich habe mir letztens eine Kommunikation über nur eine Leitung überlegt, und zwar so:
Arduino 1 sendet über einen x-belibigen Pin:111001.
Arduino 2 sendet auch über irgendeinen Pin:111010
Arduino 1 senddet:1
Das hat folgenden Sinn: Arduino 1 sendet in Schleife 111001 und verwendet dann den Pin als Input und schaut, ob Strom anliegt. Wenn Arduino 2 auch über diese Leitung angeschlossen wird, wird er erst warten, bis er 111 empfängt und liest anschließend die 3 folgenden Bit, also 001. Denn sobald ein Arduino außer Arduino 1 111 und dann die Zahl unter der eigenen liest (in 3 Bit), sendet er nach dem letzten Zahlen-Bit 111, seine eigene Zahl und liest dann wieder einmal. Dadurch merkt der Arduino davor, dass HIGH anliegt und hört auf, seine Sache zu senden. Der Arduino 1 weiß als einziger, wieviel Arduinos sonst noch dran sind und beim letzten Arduino sendet er einfach 111111. Die anderen Arduinos merken, dass nach dem 111 wieder 111 gekommen ist und wissen, dass alle Arduinos angeschlossen und eingeschaltet sind. Dann können Daten übertragen werden:
Arduino 1 möchte "AT" senden
Arduino 1: 001101000001
Arduino 2: 0100
Arduino 3: 0110
...
Arduino 1: 001101010101
Arduino 2: 0100
Arduino 3: 0110
...
Also senden die Arduinos immer erst ihre ID (001, 010, 011, ...), ob sie Daten haben und dann, wenn sie Daten haben noch ein Byte ihrer Daten. Der Sinn dabei ist, dass ein Arduino nicht dauerhaft die Leitung blockiert.
Jetzt zu meinem Problem: Ich möchte das Ganze so programmieren, dass es wie bei Serial im Hintergrund arbeitet, also immer, wenn in einem festgelegten Interval geschaut wird, ob der Arduino sowas wie 0010 senden muss. Aber ich weiß nicht genau, wie ich das machen soll, denn problematisch wird es bei delay, da es blockierd und eventuell brauche ich es in meinem Programm und meine Eine-Leitungsgeschichte soll ja trotzdem weiterlaufen, so wie es auch mit Serial ist. Und ich weiß nicht, wie das geht. Könnt ihr mir helfen?
Kommunikation über nur eine Leitung
Schonmal nach OneWire gegoogelt ?
Oder dir SoftwareSerial angesehen, wie da halbwegs zuverlässiges Timing erreicht wird?
michael_x:
Schonmal nach OneWire gegoogelt ?
Oder dir SoftwareSerial angesehen, wie da halbwegs zuverlässiges Timing erreicht wird?
Das war auch meine erste Idee, nach SoftwareSerial zu schauen. Da bin ich also zu Programme/Arduino/libraries gegangen. Da waren zig andere Libraries, aber nicht SoftwareSerial. Da habe ich dann eine Durchsuchung aller Festplatten gemacht und tatsächlich kam nach einer Weile ein Ordner mit dem Namen SoftwareSerial (im Ordner /Lokale Einstellungen/Temp/build1255-irgendwas) und er enthielt zwei Dateien, eine namens SoftwareSerial.cpp.d und eine andere namens SoftwareSerial.cpp.o. Die d-Datei enthielt irgendwelche Links, die o-Datei nur tausende kryptische Zeichen. Kann mir jemand das erklären??
Kann mir jemand das erklären?
Ja, hast du falsch geguckt.
Das sind Kompilier-Ergebnisse.
In \hardware\arduino\avr\libraries sollte ein Ordner SoftwareSerial sein.
( Jedenfalls bei mir ( = Arduino 1.8.1 ) )
michael_x:
Ja, hast du falsch geguckt.
Das sind Kompilier-Ergebnisse.
In \hardware\arduino\avr\libraries sollte ein Ordner SoftwareSerial sein.
( Jedenfalls bei mir ( = Arduino 1.8.1 ) )
Ahhh, das, was da steht, sieht schon viel besser aus. Danke!
michael_x:
Oder dir SoftwareSerial angesehen, wie da halbwegs zuverlässiges Timing erreicht wird?
Ja, jetzt habe ich mir SoftwareSerial mal angeguckt, und, wenn ich ehrlich binn, nichts davon verstanden. Kennst du dich da ein bisschen aus und kannst mir helfen?
HTML-Fan:
Oder jemand anderes?
Wie du SoftwareSerial verwendest, kannst du doch in den Beispielen genau erkennen.
Allerdings brauchst du da zwei Leitungen zu, mit einer reicht es nicht.
HotSystems:
Wie du SoftwareSerial verwendest, kannst du doch in den Beispielen genau erkennen.
Allerdings brauchst du da zwei Leitungen zu, mit einer reicht es nicht.
Ich weiß, und mein Ziel ist es ja, nur eine Leitung zu benutzen. Wie SoftwareSerial angewendet wird, weiß ich. Nur eben auf dieses Arbeiten im Hintergrund kommt es mir an.
HTML-Fan:
Ich weiß, und mein Ziel ist es ja, nur eine Leitung zu benutzen. Wie SoftwareSerial angewendet wird, weiß ich. Nur eben auf dieses Arbeiten im Hintergrund kommt es mir an.
Ok....aber was genau verstehst du unter "Hintergrund" ?
Mit einer Software-Lösung wird das sicher nicht so funktionieren, wie bei Serial-Hardwarelösung.
Mit einer Software-Lösung wird das sicher nicht so funktionieren, wie bei Serial-Hardwarelösung
Ja.
I ch dachte auch eher, dass man an den Innereien von SoftwareSerial sehen kann, wo die Grenzen eines rein softwaregesteuerten asynchronen Protokolls liegen könnten.
Und was spricht gegen OneWire? Da gibt es auch eine Library, mit dem du einen OneWire Device (Slave) realisieren kannst.
Die OneWire Library ist aber eigentlich eher dafür gedacht, mit Sensoren die nichts besseres können, reden zu können. Wenn diese Einschränkung nicht besteht, ist man anderen Lösungen besser dran.
Arduinos untereinander haben da ausreichend Hardwareunterstützung für eine Kommunikation.
Um etwas besseres zu erfinden als Sachen die es schon gibt, sollte man das Bestehende zumindest kennen (und verstehen).
Oder Leute mit solcher Meinung erst gar nicht fragen. 
HotSystems:
Ok....aber was genau verstehst du unter "Hintergrund" ?
Ich meine, dass man, wie bei SoftwareSerial, nicht ständig in Schleife irgendwelche Methoden aufrufen muss, damit Daten gelesen werden können.
michael_x:
Und was spricht gegen OneWire? Da gibt es auch eine Library, mit dem du einen OneWire Device (Slave) realisieren kannst.
Gegen OneWire spricht nichts, aber ich dachte mir, dass es sinnvoll ist, etwas eigenes zu haben, was man auch selber versteht und ausbauen kann für verschiedene Zwecke, zum Beispiel so, dass mehrere Bytes statt nur einem mit einem Mal übertragen werden.
HTML-Fan:
Ich meine, dass man, wie bei SoftwareSerial, nicht ständig in Schleife irgendwelche Methoden aufrufen muss, damit Daten gelesen werden konnen.
......
Dann geht das meines Wissens nur mit Hardware, oder du verwendest einen IRQ.
kann man erst mal das Grundübel diskutieren? Warum muss es EINE Leitung sein?
Wie Lange ist die Leitung?
Auch One-Wire braucht etwas irreführend GND. Sind also auch schon zwei Leitungen.
Bei zwei Drähten kann man aber gleich über 485 nachdenken, nur A/B ist zwar nicht ganz konform, aber das bekommt man ziemlich stabil zu laufen.
Also ich würde eher noch mal die Aufgabenstellung hinterfragen, bevor ich versuchen würde mit aller Gewalt ein SoftSerial auf einem Draht zu bringen.
noiasca:
kann man erst mal das Grundübel diskutieren? Warum muss es EINE Leitung sein?
Wie Lange ist die Leitung?
Auch One-Wire braucht etwas irreführend GND. Sind also auch schon zwei Leitungen.
Bei zwei Drähten kann man aber gleich über 485 nachdenken, nur A/B ist zwar nicht ganz konform, aber das bekommt man ziemlich stabil zu laufen.
Also ich würde eher noch mal die Aufgabenstellung hinterfragen, bevor ich versuchen würde mit aller Gewalt ein SoftSerial auf einem Draht zu bringen.
Stimmt, mir fällt auch gerade ein, dass natürlich auch GND benötigt wird. Es soll eine Übertragungsleitung sein, damit ich nur einen Pin benötige. Die Leitung ist nur kurz, also jedenfalls ist sie nicht länger als ein Meter oder so und wird das auch nicht werden.
ok dann gehts um PINs nicht um Leitungen. Dann zähl mal genau auf was hängt an welchen PIN ... vieleicht gibts ja da doch noch einfachere Möglichkeiten als einen Selbstentwickelten Bus.
noiasca:
ok dann gehts um PINs nicht um Leitungen. Dann zähl mal genau auf was hängt an welchen PIN ... vieleicht gibts ja da doch noch einfachere Möglichkeiten als einen Selbstentwickelten Bus.
Also momentan hängen an der Leitung ein Arduino Uno über D2 und ein Arduino Due über Pin 20, aber die Pins lassen sich noch ändern, nur würde ich am liebsten PWM-unfähige Pins nehmen. Da beide Arduinos am selben Computer sind, kann ich mir auch eine gemeinsame Masseleitung sparen.
HTML-Fan:
.....
Da beide Arduinos am selben Computer sind, kann ich mir auch eine gemeinsame Masseleitung sparen.
Welche Pins du dafür verwendest, ist dir überlassen.
Allerdings solltest du eine zusätzliche GND Verbindung herstellen.
Die Verbindung über den PC kann zwar funktionieren, ist aber keine saubere Lösung.
HotSystems:
Welche Pins du dafür verwendest, ist dir überlassen.
Allerdings solltest du eine zusätzliche GND Verbindung herstellen.
Die Verbindung über den PC kann zwar funktionieren, ist aber keine saubere Lösung.
Danke schonmal für diesen Tipp. Ok, zurück zu der im-Hintergrund-laufen-Geschichte. Hat da irgendeiner eine Idee?
HTML-Fan:
Danke schonmal für diesen Tipp. Ok, zurück zu der im-Hintergrund-laufen-Geschichte. Hat da irgendeiner eine Idee?
Hatte ich schon geschrieben. Per Software direkt nicht möglich. Mit IRQ dann schon.