Hallo Leute,
ich würde gerne ein Ausgangssignal vom Arduino invertieren.
Das Ganze könnte man mit einem Transistor + 2 Widerstände oder mit einem LL Mosfet + einem Widerstand lösen (hab ich beides getestet und funktioniert auch wuderbar).
Dennoch fänd ich eine softwareseitige Lösung etwas eleganter und es spart auch etwas Platz ein (soll alles in ein kleines Gehäuse).
Das Signal das invertiert werden soll ist das Ausgangssignal an Pin1/Tx.
Serial.write(ZuInvertierendesSignal);
Da es anscheinend nichts gibt, was das "normale" Signal vom Hardware Serial invertiert, hatte ich zuerst die Idee, dass ich das über das SoftwareSerial machen könnte
#include <SoftwareSerial.h>
SoftwareSerial softSerial(10, 11, true);
Der 3. Parameter setzt hier das Signal als invertiert.
Problem dabei:
Ich muss 8 kontinuierliche PWM Signale schnell auslesen können.
Das mache ich mit Interrupts der PinChangeInt library
#include <PinChangeInt.h>
// "PWM" input pins
uint8_t PWM_Channel_1_Pin = 2;
// storage for PWM values and time
volatile uint16_t PWM_Channel_1_Value = 0;
volatile uint16_t PWM_Channel_1_prev_time = 0;
uint8_t latest_interrupted_pin;
//Interrupt functions
void PWM_1_rising()
{
latest_interrupted_pin=PCintPort::arduinoPin;
PCintPort::attachInterrupt(latest_interrupted_pin, &PWM_1_falling, FALLING);
PWM_Channel_1_prev_time = micros();
}
void PWM_1_falling() {
latest_interrupted_pin=PCintPort::arduinoPin;
PCintPort::attachInterrupt(latest_interrupted_pin, &PWM_1_rising, RISING);
PWM_Channel_1_Value = micros()-PWM_Channel_1_prev_time;
}
void setup()
{
pinMode(PWM_Channel_1_Pin, INPUT); digitalWrite(PWM_Channel_1_Pin, HIGH);
PCintPort::attachInterrupt(PWM_Channel_1_Pin, &PWM_1_rising, RISING);
Serial.begin(115200);
}
void loop()
{
ZuInvertierendesSignal = PWM_Channel_1_Value;
Serial.write(ZuInvertierendesSignal);
}
Am Serial-Ausgang dieses Beispiels sollte dann "irgendwie" alles invertiert ausgegeben werden.
Hat jemand eine Idee, wie sich PinChangeInt.h und SoftwareSerial.h nicht in die Quere kommen?
Aktuell bekomme ich so etwas als Fehler:
C:\Users\X\AppData\Local\Temp\arduino_build_480967\libraries\SoftwareSerial\SoftwareSerial.cpp.o (symbol from plugin): In function `SoftwareSerial::read()':
(.text+0x0): multiple definition of `__vector_3'
C:\Users\X\AppData\Local\Temp\arduino_build_480967\sketch\PWM2SBUS.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here
C:\Users\X\AppData\Local\Temp\arduino_build_480967\libraries\SoftwareSerial\SoftwareSerial.cpp.o (symbol from plugin): In function `SoftwareSerial::read()':
(.text+0x0): multiple definition of `__vector_5'
C:\Users\X\AppData\Local\Temp\arduino_build_480967\sketch\PWM2SBUS.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here
C:\Users\X\AppData\Local\Temp\arduino_build_480967\libraries\SoftwareSerial\SoftwareSerial.cpp.o (symbol from plugin): In function `SoftwareSerial::read()':
(.text+0x0): multiple definition of `__vector_4'
C:\Users\X\AppData\Local\Temp\arduino_build_480967\sketch\PWM2SBUS.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here
collect2.exe: error: ld returned 1 exit status
Vielen Dank und liebe Grüße!