Suche Hilfe für das Programmieren von 2 PWMshielden

Guten Tag Zusammen,ich habe ein Problem mit 2 PWMshielden.Es sind die PCA 9685 Shielde die ich gerne für ein Projekt zusammenschalten möchte. Bisher habe ich nur als Gast mitgelesen und schon einiges davon umsetzen aber jetzt bin ich leider mit meinen Latein am Ende.Habe auch schon versucht es selber zu lösen aber irgendwie scheint es nicht zu klappen. Die Shielde sollen nämlich bis zu 22 Servos ansteuern die über eine Umschaltung in 2 x 11 Servos aufgeteilt werden.Davon werden aber nicht immer alle gebraucht.Ich weiß nicht wo und wie ich die Verdopplung der Shielde einbinden kann. Ich stelle hier mal den bisherigen Sketch rein mit dem ich probiert habe.Für Eure Hilfe wäre ich sehr dankbar.

Big greetings

Dampflutz

#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40);
//Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x41);

int potpin = A0;
int val;

#define MIN_PULSE_WIDTH       650
#define MAX_PULSE_WIDTH       2250 //ueber diese Variable den Weg anpassen
#define DEFAULT_PULSE_WIDTH   1500
#define FREQUENCY             50

uint8_t servonum = 0;

void setup() 
{
  Serial.begin(9600);
  Serial.println("16 channel Servo test!");
  pwm.begin();
  pwm.setPWMFreq(FREQUENCY);

}
int pulseWidth(int angle)
{
  int pulse_wide, analog_value;
  pulse_wide   = map(val, 10, 130, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH); // die 13 und die 130 sind fuer die Weganpassung
  analog_value = int(float(pulse_wide) / 1000000 * FREQUENCY * 3950); // ueber die 3.Variable den Weg anpassen
  Serial.println(analog_value);
  return analog_value;
}

void loop() {

  val = analogRead(potpin);            
  val = map(val, 0, 1030, 15, 130); // die 13 und die 130 sind fuer die Weganpassung

pwm.setPWM(0, 0, pulseWidth(val));
 delay(50);
pwm.setPWM(1, 0, pulseWidth(val));
 delay(50);
pwm.setPWM(2, 0, pulseWidth(val));
 delay(50);  
pwm.setPWM(3, 0, pulseWidth(val));
 delay(50);
pwm.setPWM(4, 0, pulseWidth(val));
 delay(50);
pwm.setPWM(5, 0, pulseWidth(val));
 delay(50);
pwm.setPWM(6, 0, pulseWidth(val));
 delay(50);
pwm.setPWM(7, 0, pulseWidth(val));
 delay(50);
pwm.setPWM(8, 0, pulseWidth(val));
 delay(50);
pwm.setPWM(9, 0, pulseWidth(val));
 delay(50);
pwm.setPWM(10, 0, pulseWidth(val));
 delay(50);
}

hi,

einen "kleinen" ansatz dazu hast Du ja schon in Deinem sketch:

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40);
//Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x41);

ein PCA wird auf 0x40 gelassen, auf den anderen mußt Du bei den adress-pads einen lötpunkt anbringen, damit stellst Du ihn auf 0x41.

und Du nennst dann nicht beide pwm, sondern zb. pwm1 und pwm2. so kannst Du beide getrennt ansprechen.

wenn Dir das nicht als ansatz reicht. frag ruhig weiter...

gruß stefan

Eisebaer:
ein PCA wird auf 0x40 gelassen, auf den anderen mußt Du bei den adress-pads einen lötpunkt anbringen, damit stellst Du ihn auf 0x41.

Die Adresse von 40 auf 41 zu ändern mußt Du die beiden Lötpunkte A0 mit etwas Lötzinn verbinden.

Beispiel einer verlöteten Lötbrücke: http://www.can-digital-bahn.com/forum/attachments/loetbruecke.jpg

Es gibt auch Erweiterungsmodule die extra für Servoansteuerung gebaut sind wie zB Pololu Pololu - RC Servo Controllers
Aber auch ein Arduino MEGA mit der servo Bibliothek kann bis zu 48 Servos ansteuern.

Grüße Uwe

Guten Tag Zusammen ,das mit den Lötbrücken habe ich schon durchgeführt.Werde das mit den PWMnennung mal probieren.für den Mega habe ich leider keinen Platz vorgesehen sondern nur für einen Nano.

Big greetings

Dampflutz

Dieser Post von 10:18 ist nicht von mir.werde es aber so machen.

Mit freundlichem Gruß
Nitroxuser
PS: ich kenne diesen Crazydiver nicht noch bin ich mit Ihm verwandt

Guten Tag Miteinander,ich habe jetzt alle Klippen in dem Sketch umschifft.Es mußten noch ein paar Anpassung durchgeführt werdenaber der Sketchläuft jetzt so wie er soll.Daher werde ich in hier mal reinstellen damit Andere den Sketch auch verwenden können.

Mit freundlichem Gruß
Nitroxuser

PS: Es ist Absicht das jeweils nur ein Servo angeschlossen ist

#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

Adafruit_PWMServoDriver pwm1 = Adafruit_PWMServoDriver(0x40);
Adafruit_PWMServoDriver pwm2 = Adafruit_PWMServoDriver(0x41);

int potpin = A0;
int val;

#define MIN_PULSE_WIDTH       650
#define MAX_PULSE_WIDTH       2250 //ueber diese Variable den Weg anpassen
#define DEFAULT_PULSE_WIDTH   1500
#define FREQUENCY             50

uint8_t servonum = 0;

void setup() 
{
  Serial.begin(9600);
  Serial.println("16 channel Servo test!");
  pwm1.begin();
  pwm1.setPWMFreq(FREQUENCY);
  pwm2.begin();
  pwm2.setPWMFreq(FREQUENCY);

}
int pulseWidth(int angle)
{
  int pulse_wide, analog_value;
  pulse_wide   = map(val, 10, 130, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH); // die 13 und die 130 sind fuer die Weganpassung
  analog_value = int(float(pulse_wide) / 1000000 * FREQUENCY * 3950); // ueber die 3.Variable den Weg anpassen
  Serial.println(analog_value);
  return analog_value;
}

void loop() {

  val = analogRead(potpin);            
  val = map(val, 0, 1030, 15, 130); // die 13 und die 130 sind fuer die Weganpassung

pwm1.setPWM(14,1, pulseWidth(val));
 delay(50);

pwm2.setPWM(14,2, pulseWidth(val));
 delay(50);
}

Nitroxuser:
…aber der Sketchläuft jetzt so wie er soll.Daher werde ich in hier mal reinstellen damit Andere den Sketch auch verwenden können.

Danke für die Rückmeldung.

Da wird sich Crazydiver aber freuen. :wink:

hi,

Da wird sich Crazydiver aber freuen.

sind sicher verwandt, die beiden dampflütze...

gruß stefan

Guten Tag Miteinander, so ich habe jetzt das Ganze noch auf 11 Servos erweitert und zusätzlich noch eine Umschaltung eingefügt.

Mit freundlichem Gruß
Nitroxuser

#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

Adafruit_PWMServoDriver pwm1 = Adafruit_PWMServoDriver(0x40);
Adafruit_PWMServoDriver pwm2 = Adafruit_PWMServoDriver(0x41);

int potpin = A0;
int val;

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

#define MIN_PULSE_WIDTH       650
#define MAX_PULSE_WIDTH       2240 //ueber diese Variable den Weg anpassen
#define DEFAULT_PULSE_WIDTH   1500
#define FREQUENCY             50

uint8_t servonum = 0;

const int LED1 = 13;

void setup() 
{
  Serial.begin(9600);
  Serial.println("16 channel Servo test!");
  pwm1.begin();
  pwm1.setPWMFreq(FREQUENCY);
  pwm2.begin();
  pwm2.setPWMFreq(FREQUENCY);
  pinMode(LED1,OUTPUT);

}
int pulseWidth(int angle)
{
  int pulse_wide, analog_value;
  pulse_wide   = map(val, 10, 130, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH); // die 13 und die 130 sind fuer die Weganpassung
  analog_value = int(float(pulse_wide) / 1000000 * FREQUENCY * 3940); // ueber die 3.Variable den Weg anpassen
  Serial.println(analog_value);
  return analog_value;
}

void loop() {

  val = analogRead(potpin);            
  val = map(val, 0, 1030, 13, 130); // die 13 und die 130 sind fuer die Weganpassung

umschalten = digitalRead(umschalterPin);
 if (umschalten == LOW){
  digitalWrite(LED1,LOW);

pwm1.setPWM(0,1, pulseWidth(val));
 delay(50);
pwm1.setPWM(1,1, pulseWidth(val));
 delay(50);
pwm1.setPWM(2,1, pulseWidth(val));
 delay(50);
pwm1.setPWM(3,1, pulseWidth(val));
 delay(50);
pwm1.setPWM(4,1, pulseWidth(val));
 delay(50);
pwm1.setPWM(5,1, pulseWidth(val));
 delay(50);
pwm1.setPWM(6,1, pulseWidth(val));
 delay(50);
pwm1.setPWM(7,1, pulseWidth(val));
 delay(50);
pwm1.setPWM(8,1, pulseWidth(val));
 delay(50);
pwm1.setPWM(9,1, pulseWidth(val));
 delay(50);
pwm1.setPWM(10,1, pulseWidth(val));
 delay(50);
}

 else if (umschalten == HIGH){
   digitalWrite(LED1,HIGH);

pwm2.setPWM(0,2, pulseWidth(val));
 delay(50);
pwm2.setPWM(1,2, pulseWidth(val));
 delay(50);
pwm2.setPWM(2,2, pulseWidth(val));
 delay(50);
pwm2.setPWM(3,2, pulseWidth(val));
 delay(50);
pwm2.setPWM(4,2, pulseWidth(val));
 delay(50);
pwm2.setPWM(5,2, pulseWidth(val));
 delay(50);
pwm2.setPWM(6,2, pulseWidth(val));
 delay(50);
pwm2.setPWM(7,2, pulseWidth(val));
 delay(50);
pwm2.setPWM(8,2, pulseWidth(val));
 delay(50);
pwm2.setPWM(9,2, pulseWidth(val));
 delay(50);
pwm2.setPWM(10,2, pulseWidth(val));
 delay(50);

 }}

Eisebaer:
sind sicher verwandt,...

Das tut mir aber leid.

Guten Tag Miteinander, ich möchte das ganze jetzt auf 11 Fernsteuerungskanäle umstellen damit ich es für den Modellbau nutzen kann.Leider habe ich da irgendwie einen Fehler drin denn es fuktioniert nicht so wie es soll.Anbei habe ich mal den fehlerhaten Sketch angehängt.
Mit freundlichem Gruß
Nitroxuser

int ch1;

#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

Adafruit_PWMServoDriver pwm1 = Adafruit_PWMServoDriver(0x40);
Adafruit_PWMServoDriver pwm2 = Adafruit_PWMServoDriver(0x41);

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

#define MIN_PULSE_WIDTH       650
#define MAX_PULSE_WIDTH       2250 //ueber diese Variable den Weg anpassen
#define DEFAULT_PULSE_WIDTH   1500
#define FREQUENCY             50

uint8_t servonum = 0;

const int LED1 = 13; //LEDkennung zwischen a und b

void setup() 
{
  pinMode(LED1,OUTPUT);
  pinMode(5,INPUT);
  
  Serial.begin(9600);
  Serial.println("16 channel Servo test!");
  pwm1.begin();
  pwm1.setPWMFreq(FREQUENCY);
  pwm2.begin();
  pwm2.setPWMFreq(FREQUENCY);
 

}
int pulseWidth(int angle)
{
  int pulse_wide, analog_value;
  pulse_wide   = map(ch1, 10, 130, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH); // die 13 und die 130 sind fuer die Weganpassung
  analog_value = int(float(pulse_wide) / 1000000 * FREQUENCY * 3950); // ueber die 3.Variable den Weg anpassen
  Serial.println(analog_value);
  return analog_value;
}

void loop() {

  ch1 = pulseIn(5, HIGH, 25000);
  ch1 = map(ch1,1030,2003,0,170);

umschalten = digitalRead(umschalterPin);
 if (umschalten == LOW){
  digitalWrite(LED1,LOW);

pwm1.setPWM(14,1, pulseWidth(ch1));
 delay(50);
 }

 else if (umschalten == HIGH){
   digitalWrite(LED1,HIGH);

pwm2.setPWM(14,2, pulseWidth(ch1));
 delay(50);
 }}

Guten Tag Miteinander,irgendwie findet die Fernsteuerung nicht zu den PWMshielden,egal wie ich die einbinde.Im vorherigen Post hat es nicht geklappt und im folgendem Sketch auch nicht.

Mit freundlichem Gruß
Nitroxuser

#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

Adafruit_PWMServoDriver pwm1 = Adafruit_PWMServoDriver(0x40);
Adafruit_PWMServoDriver pwm2 = Adafruit_PWMServoDriver(0x41);

int ch1; // Anschluß vom Empfänger erst nur mit einem Kanal

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

#define MIN_PULSE_WIDTH       650
#define MAX_PULSE_WIDTH       2250 //ueber diese Variable den Weg anpassen
#define DEFAULT_PULSE_WIDTH   1500
#define FREQUENCY             50

uint8_t servonum = 0;

const int LED1 = 13; //LEDkennung zwischen a und b

void setup() 
{
  pinMode(LED1,OUTPUT);
  pinMode(5,INPUT);
  
  Serial.begin(9600);
  Serial.println("16 channel Servo test!");
  pwm1.begin();
  pwm1.setPWMFreq(FREQUENCY);
  pwm2.begin();
  pwm2.setPWMFreq(FREQUENCY);
 

}
int pulseWidth(int angle)
{
  int pulse_wide, analog_value;
  pulse_wide   = map(ch1, 10, 130, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH); // die 13 und die 130 sind fuer die Weganpassung
  analog_value = int(float(pulse_wide) / 1000000 * FREQUENCY * 3950); // ueber die 3.Variable den Weg anpassen
  Serial.println(analog_value);
  return analog_value;
}

void loop() {

  ch1 = pulseIn(5, HIGH, 25000);
 
umschalten = digitalRead(umschalterPin);
 if (umschalten == LOW){
  digitalWrite(LED1,LOW);

 ch1 = map(ch1,1023,2003,0,170);
 pwm1.setPWM(14,1, pulseWidth(ch1));
 delay(50);
 }

 else if (umschalten == HIGH){
   digitalWrite(LED1,HIGH);

 ch1 = map(ch1,1023,2003,0,170);
 pwm2.setPWM(14,2, pulseWidth(ch1));
 delay(50);
 }}

Nitroxuser:
Guten Tag Miteinander,irgendwie findet die Fernsteuerung nicht zu den PWMshielden,egal wie ich die einbinde.Im vorherigen Post hat es nicht geklappt und im folgendem Sketch auch nicht.

Welche Fernsteuerung meinst du ?
Ich kann im Sketch nichts davon erkennen.

Guten Tag Miteinander, millerweilen läuft der folgende Sketch auch auf einen Nano ohne irgenwelche Anpassung mit 2 x 11 Servos.Leider habe ich noch nicht das Problem mit der Fernsteuerung gelöst.Bald bin ich in dieser Richtung mit meinem Latein am Ende.

Mit freundlichem Gruß
Nitroxuser

#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

Adafruit_PWMServoDriver pwm1 = Adafruit_PWMServoDriver(0x40);
Adafruit_PWMServoDriver pwm2 = Adafruit_PWMServoDriver(0x41);

int potpin = A0;
int val;

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

#define MIN_PULSE_WIDTH       650
#define MAX_PULSE_WIDTH       2215 //ueber diese Variable den Weg anpassen
#define DEFAULT_PULSE_WIDTH   1500
#define FREQUENCY             50

uint8_t servonum = 0;

const int LED1 = 13;

void setup() 
{
  Serial.begin(9600);
  Serial.println("16 channel Servo test!");
  pwm1.begin();
  pwm1.setPWMFreq(FREQUENCY);
  pwm2.begin();
  pwm2.setPWMFreq(FREQUENCY);
  pinMode(LED1,OUTPUT);

}
int pulseWidth(int angle)
{
  int pulse_wide, analog_value;
  pulse_wide   = map(val, 10, 130, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH); // die 13 und die 130 sind fuer die Weganpassung
  analog_value = int(float(pulse_wide) / 1000000 * FREQUENCY * 3915); // ueber die 3.Variable den Weg anpassen
  Serial.println(analog_value);
  return analog_value;
}

void loop() {

  val = analogRead(potpin);            
  val = map(val, 0, 1030, 13, 130); // die 13 und die 130 sind fuer die Weganpassung

umschalten = digitalRead(umschalterPin);
 if (umschalten == LOW){
  digitalWrite(LED1,LOW);

pwm1.setPWM(0,1, pulseWidth(val));
 delay(50);
pwm1.setPWM(1,1, pulseWidth(val));
 delay(50);
pwm1.setPWM(2,1, pulseWidth(val));
 delay(50);
pwm1.setPWM(3,1, pulseWidth(val));
 delay(50);
pwm1.setPWM(4,1, pulseWidth(val));
 delay(50);
pwm1.setPWM(5,1, pulseWidth(val));
 delay(50);
pwm1.setPWM(6,1, pulseWidth(val));
 delay(50);
pwm1.setPWM(7,1, pulseWidth(val));
 delay(50);
pwm1.setPWM(8,1, pulseWidth(val));
 delay(50);
pwm1.setPWM(9,1, pulseWidth(val));
 delay(50);
pwm1.setPWM(10,1, pulseWidth(val));
 delay(50);
}

 else if (umschalten == HIGH){
   digitalWrite(LED1,HIGH);

pwm2.setPWM(0,2, pulseWidth(val));
 delay(50);
pwm2.setPWM(1,2, pulseWidth(val));
 delay(50);
pwm2.setPWM(2,2, pulseWidth(val));
 delay(50);
pwm2.setPWM(3,2, pulseWidth(val));
 delay(50);
pwm2.setPWM(4,2, pulseWidth(val));
 delay(50);
pwm2.setPWM(5,2, pulseWidth(val));
 delay(50);
pwm2.setPWM(6,2, pulseWidth(val));
 delay(50);
pwm2.setPWM(7,2, pulseWidth(val));
 delay(50);
pwm2.setPWM(8,2, pulseWidth(val));
 delay(50);
pwm2.setPWM(9,2, pulseWidth(val));
 delay(50);
pwm2.setPWM(10,2, pulseWidth(val));
 delay(50);

 }}

Guten Tag HotSystems,schau nochmal in den Sketch auf den sich Deine letzte Nachricht bezieht.

Mit freundlichem Gruß

Nitroxuser

Hotsystems ich brauche für jeden der 11 Servos eine Kanalzuweisung ob bei a oder b

Moin Uwefed deine Empfehlung von Pololu kann ich so nicht so gebrauchen.

Moin Uwefed, da ich mir die Shielde ( einständige MCU) mal genauer angeschaut habe und dabei festgestellt habe das nicht genügende IO drauf sind frage ich mich wie das gehen kann !