Ich habe nun ein kleines Problem bei der Verwendung von SoftwareSerial.h und VarSpeedServo.h. Mit Verwendung dieser zwei Libs zucken die Servos beim Senden über Software Serial. Kann man dies verhindern? Ich habe gelesen dass die Interrupts/Timer da hineinspielen da sie von beiden Libs verwendet werden. Was kann man hier machen, wenn man keine Hardware Serial zur Verfügung hat?
Ich habe mal versucht mit dem detach Befehl vor dem Senden die Servos zu deaktivieren und dann nach dem Senden wieder mit dem Befehl attach zu verbinden, aber ohne Erfolg.
Kann man hierfür vielleicht ein Hardware-Bauteil bei den Servos einbauen um das Störsignal zu unterbinden und nur die Impulse zur Servosteuerung durchzulassen?
Hat AltSoftSerial auch die Möglichkeit von lesen von Strings mit readString()?
Ist ja im Prinzip nur die Bibiothek hinzuzufügen und von SoftwareSerial zu AltSoftSerial zu wechseln. Versuche ich sonst gerne mal, ob dies geht!
"C:\Users\Stef\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7/bin/avr-gcc" -Wall -Wextra -Os -g -flto -fuse-linker-plugin -Wl,--gc-sections,--relax -mmcu=atmega2560 -o "C:\Users\Stef\AppData\Local\Temp\arduino_build_874820/Receiver_RX_Dome_Mega_V1.2test.ino.elf" "C:\Users\Stef\AppData\Local\Temp\arduino_build_874820\sketch\Receiver_RX_Dome_Mega_V1.2test.ino.cpp.o" "C:\Users\Stef\AppData\Local\Temp\arduino_build_874820\libraries\VarSpeedServo-master\VarSpeedServo.cpp.o" "C:\Users\Stef\AppData\Local\Temp\arduino_build_874820\libraries\AltSoftSerial-1.4.0\AltSoftSerial.cpp.o" "C:\Users\Stef\AppData\Local\Temp\arduino_build_874820/..\arduino_cache_153283\core\core_arduino_avr_mega_cpu_atmega2560_46dd384c7861ed81eae88c5a7dcd129b.a" "-LC:\Users\Stef\AppData\Local\Temp\arduino_build_874820" -lm
C:\Users\Stef\AppData\Local\Temp\arduino_build_874820\libraries\AltSoftSerial-1.4.0\AltSoftSerial.cpp.o (symbol from plugin): In function `AltSoftSerial::read()':
(.text+0x0): multiple definition of `__vector_47'
C:\Users\Stef\AppData\Local\Temp\arduino_build_874820\libraries\VarSpeedServo-master\VarSpeedServo.cpp.o (symbol from plugin):(.text+0x0): first defined here
c:/users/stef/appdata/local/arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/../lib/gcc/avr/7.3.0/../../../../avr/bin/ld.exe: Disabling relaxation: it will not work with multiple definitions
collect2.exe: error: ld returned 1 exit status
Using library VarSpeedServo-master in folder: B:\Programme\Arduino\libraries\VarSpeedServo-master (legacy)
Using library AltSoftSerial-1.4.0 at version 1.4 in folder: B:\Programme\Arduino\libraries\AltSoftSerial-1.4.0
exit status 1
Error compiling for board Arduino Mega or Mega 2560.
Dann habe ich aber nur einen hardware seriellen Anschluss frei. Wenn ich dort zwei Empfängergeräte an den einen TX Pin hänge, gibt es da Probleme/Konflikte weil zwei Geräte dran sind? Es sollen ohnehin beide Geräte dieselben seriellen Daten empfangen. Dies habe ich direkt nacheinander per SoftwareSerial gesendet, aber eben bis jetzt auf zwei unterschiedlichen Pins. Dann würde ich da einfach beide zusammenfassen und an den einen TX Pin hängen. Die Arduinos untereinander dann per I2C. Das ist eine gute Idee!
Ich habe mal einen Testsketch geschrieben. Da soll per SoftwareSerial von einem Bluetooth Empfänger Daten empfangen werden. Diese gehen dann per hardware Serial raus und steuern zwei Leuchten mit demselben Pin TX0.
Per I2C geht gleichzeitig immer ein Buchstabe und ein Wert raus an den zweiten Arduino, bei dem dies dann per switch/case empfangen werden soll. Zur Kontrolle lasse ich mir beim zweiten Arduino welcher über I2C die Daten empfängt, per seriellem Monitor am PC anzeigen was er empfängt und einteilt. Kann dies so funktionieren?
Ich werde morgen bei Gelegenheit mal testen:
Sende Arduino I2C:
#include <Wire.h>
#include <SoftwareSerial.h>
const unsigned long BaudrateBT = 19200; //starts serial port for the Bluetooth module with a baudrate by 19200 b/s
const unsigned long BaudrateTC = 2400; //starts serial port for the TC with a baudrate by 2400 b/s
const byte Bluetooth = 11; //Bluetooth Module connected to pin D11
int x = 1;
int y = 20;
int z = 300;
String BT_RX; //reads the letter from Bluetooth serial
SoftwareSerial BT(Bluetooth, 20); //RX, TX pin from Bluetooth module
void setup() {
// Start the I2C Bus as Master
Wire.begin();
Serial.begin(BaudrateTC); //starts serial port with a baudrate by "BaudrateTC" (b/s)
BT.begin(BaudrateBT); //starts serial port with a baudrate by "BaudrateBT" (b/s)
}
void loop() {
Wire.beginTransmission(9); // transmit to device #9
Wire.write('G'); //sends character G to I2C
Wire.write(x); // sends x
Wire.write('H');
Wire.write(y);
Wire.write('I');
Wire.write(z);
Wire.endTransmission(); // stop transmitting
//read software serial and send it via software serial xx to the device
while (BT.available() > 0) { //while serial is available, make...
BT_RX = BT.readString(); //store received string from serial to BT_RX
Serial.print(BT_RX); //send string from BT_RX to the MP
Serial.print('\r'); //send carriage return to the MP
}
}
Empfämger Arduino I2C:
#include <Wire.h>
const unsigned long Baudrate = 38200; //starts serial port for the Bluetooth module with a baudrate by 38200 b/s
char var = 0;
int DP1 = 0;
int DP2 = 0;
int DP3 = 0;
void setup() {
// Start the I2C Bus as Slave on address 9
Wire.begin(9);
// Attach a function to trigger when something is received.
Wire.onReceive(receiveEvent);
Serial.begin(Baudrate);
}
void loop() {
void receiveEvent(int bytes) {
while(Wire.available() > 0){
var = Wire.read(); // read one character from the I2C
switch(var){
case 'G' : DP1 = Wire.read();
break;
case 'H' : DP2 = Wire.read();
break;
case 'I' : DP3 = Wire.read();
break;
}
}
}
Serial.print("DP1 = ");
Serial.println(DP1);
Serial.print("DP2 = ");
Serial.println(DP2);
Serial.print("DP3 = ");
Serial.println(DP3);
}
Wie oben schon geschrieben, ich habe alle hardware Serial für verbundene Geräte und Arduinos verwendet. Einen Arduino kann ich per I2C verbinden, diese Idee war gut, gibt mir aber nur einen seriellen Port frei. Den Bluetooth Empfänger lasse ich per SoftwareSerial angeschlossen, der hat nur beim Senden mit den Servos das Zucken verursacht. Da ich aber an zwei angebundene serielle Geräte senden muss, und dies aber bei Beiden das gleiche ist, kann ich diese vielleicht zusammenschliessen und gemeinsam an diesen einen TX Pin hängen.
Die andere Frage wäre, der Mega hat ja 3 Timer soviel ich weiss!? Kann man dann nicht irgendwie die Timer der Lib ändern oder zuweisen, damit sich die SoftwareSerial und Servo Lib nicht beissen?
Ich habe versucht dies zu ändern, habe das aber noch nie gemacht und verstehe nicht genau wo was alles angepasst werden müsste, um auf Timer 5 zu laufen. Wie soll ich da vorgehen?
softwareSerial wird immer Probleme haben, weil es so gestaltet ist
Sie müssen über alle Bibliotheken und ihre Anforderungen sowie über das Design Ihres Projekts nachdenken.
Könnten Sie mehr über die Architektur und die Notwendigkeit der seriellen Kommunikation mit anderen Arduinos erzählen? Könnten alle Arduino auf SPI oder I2C sein?
I2C braucht wie Serial auch nur die Clock und Data Leitung oder? Dann könnte ich einfach von Serial auf I2C wechseln, wenn ich die switch/case Funktion mit dem korrekten Einordnen von empfangenen Buchstaben und Zahlenwerten nacheinander hinbekomme. Mit Serial funktioniert es mit Serial.read() das in die switch Funktion geht und dann entsprechend mit parseInt zugeteilt wird.
I2C ist eine total andere Technik mit einem komplett anderen Protokoll.
Du kannst nicht einfach innerhalb des Programmes von I2C auf serial und zurück wechseln.
Du musst schon bei einer Einstellung bleiben.