16 PWM-Eingänge und 48 ADC-Ausgänge

Moin Miteinander, ich habe da mal eine Frage in bezug auf eine Servoumschaltungfür 48 Servos ( 4 Modelle).Diese Modell sollen unabhängig mit 2 Umschaltern so geschaltet werden das ich immer ein Modell aktulle über eine Modellfunke steuern kann.Meine Modellfunke hat 12 Kanal im 2,4 Ghzbereich.Ich weiß das die Servo.h nicht so viele Servos unterstütz.Ich besitze schon 2 PCA 9685,die werden bestimmt dafür nicht reichen.Damit bekomme ich nur 32 PWM-Ausgänge hin ,können die restlichen PWM´s als weitere Eingänge genutzt werden und wenn ja wie.Achso weiß jemand wo ich eine Einstellungsliste für den I2C-Bus finde die auch verständlich ist und mehr als 3 Adresse ausweißt. MfG Crazydiver

Deine Frage verstehe ich nicht, drei PCA 9685 haben zusammen 48 Ausgänge, paßt doch.

"PWM´s als weitere Eingänge" verstehe ich auch nicht, PWM sind doch Ausgänge.

Was verstehst Du unter einer "Einstellungsliste für den I2C-Bus"?

Aus der hervorgeht welche I2C-Adresse zu welcher Steckbrücke bei den Adressen von A0 bis A5 gehört.Als Eingänge brauche ich aber 12 Stück und 2 für Umschalter bei einer 12 Kanalmodellfunke.

MfG Crazydiver

Crazydiver: Aus der hervorgeht welche I2C-Adresse zu welcher Steckbrücke bei den Adressen von A0 bis A5 gehört.

Meinst Du das: Addressing the Boards

Damit kann ich schon mal was anfangen.

Ich habe hier noch einen Sketch mit dem ich 8 Kanal auf 2 x 8 Servos umschalte,also insgesamt 16 Servo mit einem Umschalter an einen 2560.Aber ich möchte das ganze auf 12 Kanal machen und zwar an einem Nano mit HIlfe der PCA 9685 über I2C für räumlich getrennte 4 Modelle und 2 Umschalter und einer zusätzlichen LED.Daraus kannst Du ersehen das ich die PWM´s auch als Eingang nutze für die Kanalansteuerung und Umschaltung von a nach b

/*Dieser Umschalter geht maximal nur fuer 8 Servos da pro Kanal 3 Anschluesse gebraucht werden am 2560 
*/

int ch1;
int ch2;
int ch3;
int ch4;
int ch5;
int ch6;
int ch7;
int ch8;

#include <Servo.h>

int umschalterPin = 2; // umschalten zwischen a und b an Pin 2 angeschlossen
int umschalten = 0;

Servo myservo;
Servo myservo1;
Servo myservo2;
Servo myservo3;
Servo myservo4;
Servo myservo5;
Servo myservo6;
Servo myservo7;
Servo myservo8;
Servo myservo9;
Servo myservo10;
Servo myservo11;
Servo myservo12;
Servo myservo13;
Servo myservo14;
Servo myservo15;
const int LED1 = 13;

void setup () {
pinMode(LED1,OUTPUT);
pinMode(3,INPUT);
pinMode(4,INPUT);
pinMode(5,INPUT);
pinMode(6,INPUT);
pinMode(7,INPUT);
pinMode(8,INPUT);
pinMode(9,INPUT);
pinMode(10,INPUT);

myservo.attach(A0);
myservo1.attach(A1);
myservo2.attach(A2);
myservo3.attach(A3);
myservo4.attach(A4);
myservo5.attach(A5);
myservo6.attach(A6);
myservo7.attach(A7);
myservo8.attach(A8);
myservo9.attach(A9);
myservo10.attach(22);
myservo11.attach(23);
myservo12.attach(25);
myservo13.attach(27);
myservo14.attach(29);
myservo15.attach(31);
}

void loop(){
  
umschalten = digitalRead(umschalterPin);
 if (umschalten == LOW){
  digitalWrite(LED1,LOW);
  
  ch1 = pulseIn(3, HIGH, 25000);
  ch2 = pulseIn(4, HIGH, 25000);
  ch3 = pulseIn(5, HIGH, 25000);
  ch4 = pulseIn(6, HIGH, 25000);
  ch5 = pulseIn(7, HIGH, 25000);
  ch6 = pulseIn(8, HIGH, 25000);
  ch7 = pulseIn(9, HIGH, 25000);
  ch8 = pulseIn(10, HIGH, 25000);
  
  ch1 = map(ch1,1030,2003,0,170);
   myservo.write(ch1);
  ch2 = map(ch2,1030,2003,0,170);
   myservo1.write(ch2);
  ch3 = map(ch3,1030,2003,0,170);
   myservo2.write(ch3);
  ch4 = map(ch4,1030,2003,0,170);
   myservo3.write(ch4);
  ch5 = map(ch5,1030,2003,0,170);
   myservo4.write(ch5);
  ch6 = map(ch6,1030,2003,0,170);
   myservo5.write(ch6);
  ch7 = map(ch7,1030,2003,0,170);
   myservo6.write(ch7);
  ch8 = map(ch8,1030,2003,0,170);
   myservo7.write(ch8);
  }
  
  else if (umschalten == HIGH){
   digitalWrite(LED1,HIGH);
 
  ch1 = pulseIn(3, HIGH, 25000);
  ch2 = pulseIn(4, HIGH, 25000);
  ch3 = pulseIn(5, HIGH, 25000);
  ch4 = pulseIn(6, HIGH, 25000);
  ch5 = pulseIn(7, HIGH, 25000);
  ch6 = pulseIn(8, HIGH, 25000);
  ch7 = pulseIn(9, HIGH, 25000);
  ch8 = pulseIn(10, HIGH, 25000);
  
  ch1 = map(ch1,1030,2003,0,170);
   myservo8.write(ch1);
  ch2 = map(ch2,1030,2003,0,170);
   myservo9.write(ch2);
  ch3 = map(ch3,1030,2003,0,170);
   myservo10.write(ch3);
  ch4 = map(ch4,1030,2003,0,170);
   myservo11.write(ch4);
  ch5 = map(ch5,1030,2003,0,170);
   myservo12.write(ch5);
  ch6 = map(ch6,1030,2003,0,170);
   myservo13.write(ch6);
  ch7 = map(ch7,1030,2003,0,170);
   myservo14.write(ch7);
  ch8 = map(ch8,1030,2003,0,170);
   myservo15.write(ch8);
delay(100);
}}

Welche Adressen Du verwendest, kannst Du mit einem I2C_Scanner testen.

In der endgültigen Version soll das ganze auf einem Nano laufen

https://www.arduino.cc/en/Reference/Servo:
The Servo library supports up to 12 motors on most Arduino boards and 48 on the Arduino Mega. On boards other than the Mega, use of the library disables analogWrite() (PWM) functionality on pins 9 and 10, whether or not there is a Servo on those pins. On the Mega, up to 12 servos can be used without interfering with PWM functionality; use of 12 to 23 motors will disable PWM on pins 11 and 12.

Der Mega kann 48 Servo ansteuern.
Grüße Uwe

Wenn ich Dein Programm für den Mega2560 richtig interpretiere, dann nutzt Du den als Umschalter. Da frage ich mich, warum Du nicht 48 Relais nimmst, die in vier Gruppen vom Nano geschaltet werden, da Du die Signale offensichtlich nicht veränderst. Anstelle mechanischer Relais kannst Du natürlich auch elektronische Schalter verwenden.

Was hältst Du von diesem Ansatz?

Und hier nochmal das selbe für einen Nano.Zur besseren Verständnis.

/*Dieser Umschalter geht maximal nur fuer 5 Servos da pro Kanal 3 Anschluesse gebraucht werden bei einem Nano
*/

int ch1;
int ch2;
int ch3;
int ch4;
int ch5;

#include <Servo.h>

int umschalterPin = 2; // umschalten zwischen a und b an Pin 2 angeschlossen
int umschalten = 0;

Servo myservo;
Servo myservo1;
Servo myservo2;
Servo myservo3;
Servo myservo4;
Servo myservo5;
Servo myservo6;
Servo myservo7;
Servo myservo8;
Servo myservo9;
const int LED1 = 13;

void setup () {
pinMode(LED1,OUTPUT);
pinMode(5,INPUT);
pinMode(6,INPUT);
pinMode(7,INPUT);
pinMode(8,INPUT);
pinMode(9,INPUT);

myservo.attach(A0);
myservo1.attach(A1);
myservo2.attach(A2);
myservo3.attach(A3);
myservo4.attach(A4);
myservo5.attach(A5);
myservo6.attach(12);
myservo7.attach(11);
myservo8.attach(10);
myservo9.attach(4);
}

void loop(){
  
umschalten = digitalRead(umschalterPin);
 if (umschalten == LOW){
  digitalWrite(LED1,LOW);
  
  ch1 = pulseIn(5, HIGH, 25000);
  ch2 = pulseIn(6, HIGH, 25000);
  ch3 = pulseIn(7, HIGH, 25000);
  ch4 = pulseIn(8, HIGH, 25000);
  ch5 = pulseIn(9, HIGH, 25000);
  
  ch1 = map(ch1,1030,2003,0,170);
   myservo.write(ch1);
  ch2 = map(ch2,1030,2003,0,170);
   myservo1.write(ch2);
  ch3 = map(ch3,1030,2003,0,170);
   myservo2.write(ch3);
  ch4 = map(ch4,1030,2003,0,170);
   myservo3.write(ch4);
  ch5 = map(ch5,1030,2003,0,170);
   myservo4.write(ch5);
  }
  
  else if (umschalten == HIGH){
   digitalWrite(LED1,HIGH);
 
  ch1 = pulseIn(5, HIGH, 25000);
  ch2 = pulseIn(6, HIGH, 25000);
  ch3 = pulseIn(7, HIGH, 25000);
  ch4 = pulseIn(8, HIGH, 25000);
  ch5 = pulseIn(9, HIGH, 25000);
  
  ch1 = map(ch1,1030,2003,0,170);
   myservo5.write(ch1);
  ch2 = map(ch2,1030,2003,0,170);
   myservo6.write(ch2);
  ch3 = map(ch3,1030,2003,0,170);
   myservo7.write(ch3);
  ch4 = map(ch4,1030,2003,0,170);
   myservo8.write(ch4);
  ch5 = map(ch5,1030,2003,0,170);
   myservo9.write(ch5);
  delay(100);
return;
}}

Sehe ich das so richtig?

Du hast 4 Modelle dastehen, die alle an den Arduino angeschlossen werden.

Dazu kommt eine Fernsteuerung, von der der Arduino die Steuersignale bekommt. Der schickt die Signale dann an die Servos des gerade ausgewählte Modells.

Genau so

Moin Agmue,die Geschichte mit den Relais habe ich schon hinter mir dabei ist mir schon mal ein Empfängermodul abgeraucht.Die Signal für die Servos müssen auf die Modelle angepasst werden da alle Modelle nicht die gleichen Servoeinstellungen haben.

Du brauchst also einen Eingang pro Kanal, und 48 Servo-Ausgänge.

Ich bin mir allerdings nicht sicher, wieviele Servos ein Controller tatsächlich gleichzeitig ansteuern kann. Da könnte bei 8-10 Ausgängen eine magische Grenze erreicht sein. Die Servos der inaktiven Modelle müssen ja weiterhin ihre Signale erhalten, damit sie nicht davonlaufen, können also nicht einfach (per Multiplexer...) abgeschaltet werden. Da müßten dann tatsächlich mehrere Controller oder Servo-Treiber verwendet werden.

Ich will erstmal das ganze mit 2 x 12 Servos probieren sowie 2 PCA9685 und einem PCF 8574

Crazydiver: Die Signal für die Servos müssen auf die Modelle angepasst werden da alle Modelle nicht die gleichen Servoeinstellungen haben.

Die Anpassung kann ich den Programmen in #5 und #10 nicht entnehmen, wo findet die statt? Aber wenn es so ist, dann nimmt das Programm eine Veränderung vor, womit ein einfacher Umschalter aus dem Rennen ist.

DrDiettrich: Die Servos der inaktiven Modelle müssen ja weiterhin ihre Signale erhalten, damit sie nicht davonlaufen, können also nicht einfach (per Multiplexer...) abgeschaltet werden.

Das kommt etwas auf die Anwendung an, da ein Servo ein Getriebe enthält, was eine mehr oder minder gute Selbsthaltung hat. Aber der Umschalter ist ja eh keine Option.

DrDiettrich: Ich bin mir allerdings nicht sicher, wieviele Servos ein Controller tatsächlich gleichzeitig ansteuern kann.

Durch die Verwendung von PCA 9685 sollte das etwas entspannter sein, da die ja unabhängig vom Arduino werkeln. Begrenzend kommt die Geschwindigkeit des I2C-Busses ins Spiel, da muß man mal Erfahrungen sammeln.

Bin gespannt, ob das Vorhaben erfolgreich wird :)

Hier ist nochmal der korrigierte Sketch

/*Dieser Umschalter geht maximal nur fuer 8 Servos da pro Kanal 3 Anschluesse gebraucht werden am 2560 
*/

int ch1;
int ch2;
int ch3;
int ch4;
int ch5;
int ch6;
int ch7;
int ch8;

#include <Servo.h>

int umschalterPin = 2; // umschalten zwischen a und b an Pin 2 angeschlossen
int umschalten = 0;

Servo myservo;
Servo myservo1;
Servo myservo2;
Servo myservo3;
Servo myservo4;
Servo myservo5;
Servo myservo6;
Servo myservo7;
Servo myservo8;
Servo myservo9;
Servo myservo10;
Servo myservo11;
Servo myservo12;
Servo myservo13;
Servo myservo14;
Servo myservo15;
const int LED1 = 13;

void setup () {
pinMode(LED1,OUTPUT);
pinMode(4,INPUT);
pinMode(5,INPUT);
pinMode(6,INPUT);
pinMode(7,INPUT);
pinMode(8,INPUT);
pinMode(9,INPUT);
pinMode(44,INPUT);
pinMode(45,INPUT);

myservo.attach(A0);
myservo1.attach(A1);
myservo2.attach(A2);
myservo3.attach(A3);
myservo4.attach(A4);
myservo5.attach(A5);
myservo6.attach(A6);
myservo7.attach(A7);
myservo8.attach(A8);
myservo9.attach(A9);
myservo10.attach(22);
myservo11.attach(23);
myservo12.attach(25);
myservo13.attach(27);
myservo14.attach(29);
myservo15.attach(31);
}

void loop(){
  
umschalten = digitalRead(umschalterPin);
 if (umschalten == LOW){
  digitalWrite(LED1,LOW);
  
  ch1 = pulseIn(4, HIGH, 25000);
  ch2 = pulseIn(5, HIGH, 25000);
  ch3 = pulseIn(6, HIGH, 25000);
  ch4 = pulseIn(7, HIGH, 25000);
  ch5 = pulseIn(8, HIGH, 25000);
  ch6 = pulseIn(9, HIGH, 25000);
  ch7 = pulseIn(44, HIGH, 25000);
  ch8 = pulseIn(45, HIGH, 25000);
  
  ch1 = map(ch1,1030,2003,0,170);
   myservo.write(ch1);
  ch2 = map(ch2,1030,2003,0,170);
   myservo1.write(ch2);
  ch3 = map(ch3,1030,2003,0,170);
   myservo2.write(ch3);
  ch4 = map(ch4,1030,2003,0,170);
   myservo3.write(ch4);
  ch5 = map(ch5,1030,2003,0,170);
   myservo4.write(ch5);
  ch6 = map(ch6,1030,2003,0,170);
   myservo5.write(ch6);
  ch7 = map(ch7,1030,2003,0,170);
   myservo6.write(ch7);
  ch8 = map(ch8,1030,2003,0,170);
   myservo7.write(ch8);
  }
  
  else if (umschalten == HIGH){
   digitalWrite(LED1,HIGH);
 
  ch1 = pulseIn(4, HIGH, 25000);
  ch2 = pulseIn(5, HIGH, 25000);
  ch3 = pulseIn(6, HIGH, 25000);
  ch4 = pulseIn(7, HIGH, 25000);
  ch5 = pulseIn(8, HIGH, 25000);
  ch6 = pulseIn(9, HIGH, 25000);
  ch7 = pulseIn(44, HIGH, 25000);
  ch8 = pulseIn(45, HIGH, 25000);
  
  ch1 = map(ch1,1030,2003,0,170);
   myservo8.write(ch1);
  ch2 = map(ch2,1030,2003,0,170);
   myservo9.write(ch2);
  ch3 = map(ch3,1030,2003,0,170);
   myservo10.write(ch3);
  ch4 = map(ch4,1030,2003,0,170);
   myservo11.write(ch4);
  ch5 = map(ch5,1030,2003,0,170);
   myservo12.write(ch5);
  ch6 = map(ch6,1030,2003,0,170);
   myservo13.write(ch6);
  ch7 = map(ch7,1030,2003,0,170);
   myservo14.write(ch7);
  ch8 = map(ch8,1030,2003,0,170);
   myservo15.write(ch8);
delay(100);
}}

Moin Miteinander, ich habe jetzt erstmal einen Testsketch für die PWMpins geschrieben und getestet. Wie ich schon vermutet habe kann man die PWM`s sowohl als Eingang wie auch als Ausgang an fast allen Arduinos nutzen. Anbei stelle ich den Sketch hier rein.
MfG
Crazydiver

int ch1;

#include <Servo.h>

int umschalterPin = 2; // umschalten zwischen a und b an Pin 2 angeschlossen
int umschalten = 0;

Servo myservo;
Servo myservo1;
const int LED1 = 13;

void setup () {
pinMode(LED1,OUTPUT);
pinMode(5,INPUT);

myservo.attach(6);
myservo1.attach(7);
}

void loop(){
  
umschalten = digitalRead(umschalterPin);
 if (umschalten == LOW){
  digitalWrite(LED1,LOW);
  
  ch1 = pulseIn(5, HIGH, 25000);
  
  ch1 = map(ch1,1030,2003,0,170);
   myservo.write(ch1);
   }
   
   else if (umschalten == HIGH){
    digitalWrite(LED1,HIGH);
    
    ch1 = pulseIn(5, HIGH, 25000);
    
    ch1 = map(ch1,1030,2003,0,170);
     myservo1.write(ch1);
    delay(100);
return;
}}

Moin Miteinander , ich suche gerade die Anschlußkennung für Die PWMausgänge beim PCA 9685 Shield damit ich erstmal einen Testsketch dafür schreiben kann. Bisher habe ich in der Richtung noch nichts gefunden. MfG Crazydiver