Servo.h

Moin Miteinander, ich brauchte mal Hilfe beim Umschreiben der Servo.h Datei. Diese Datei kann bisher nur maximal 16 Servos ansteuern (2 x 8 Servos ).Für ein anderes Modell brauche ich aber die Möglichkeit das ich 24 Servos ansteuern kann ( 2 x 12 Servos ). Wie muß ich das jetzt anstellen da ich mich auf diesem Gebiet nicht so auskenne.

MfG
Crazydiver

2 * PCA9685

Umschreiben von Servo.h dürfte nicht erfolgreich sein. Soweit ich das verstehe, kann ein 16 Bit Timer nur maximal 12 Servos ansteuern, für 24 Servos wären also zwei Timer notwendig. Die Anzahl der verfügbaren Timer hängt vom Controller ab, mit einem Mega sollte das also funktionieren, ohne daß man irgendwas an der Bibliothek ändern müßte.

Bekommst Du denn irgendeine Fehlermeldung, wenn Du einfach mehr Servos im Code angibst?

Moin DrDiettrich, ich habe es mit einen Mega 2560 probiert.An dem lassen sich nur maximal 16 Servos anschliessen.Es kommen auch keine Fehlermeldungen dabei zurück wen mehr als 16 angeschlossen werden.
MfG
Crazydiver

Moin Combie,was habe ich unter dem Begriff: 2 * PCA9685 zu verstehen!
MfG
Crazydiver

Mit einer Handvoll PCA9685 gehen 992 Servos am UNO

Hallo,

mal als Anregung Adafruit 16-Channel 12-bit PWM/Servo Driver - I2C interface [PCA9685] : ID 815 : $14.95 : Adafruit Industries, Unique & fun DIY electronics and kits
und wenn du dann noch lernst was man mit I2C alles machen kann ...

In Servo.h steht

#define SERVOS_PER_TIMER 12

womit 24 Servos bei 2 Timern möglich sein sollten. Steht bei Dir was anderes drin?

womit 24 Servos bei 2 Timern möglich sein sollten

Bei mir sind 4 Timer für den Mega vorgesehen.
Damit sind es 48 mögliche Servos

Deshalb verstehe ich auch nicht, warum es schon bei 16 Servos Schwierigkeiten geben sollte.

Moin Miteinander, sobald ich die Teile werde ich es erstmal beim Mega 2560 ausprobieren.Für den Fall das es dann funktioniert wird es dann auf den Nano gelegt.Anbei stelle ich noch den 2 x 8 servosketch hier rein.
MfG
Crazydiver

PS: Der läuft bisher auf einem Mega 2560

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

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(5,INPUT);
pinMode(6,INPUT);
pinMode(7,INPUT);
pinMode(8,INPUT);
pinMode(9,INPUT);
pinMode(44,INPUT);
pinMode(45,INPUT);
pinMode(46,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(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);
  ch6 = pulseIn(44, HIGH, 25000);
  ch7 = pulseIn(46, 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(5, HIGH, 25000);
  ch2 = pulseIn(6, HIGH, 25000);
  ch3 = pulseIn(7, HIGH, 25000);
  ch4 = pulseIn(8, HIGH, 25000);
  ch5 = pulseIn(9, HIGH, 25000);
  ch6 = pulseIn(44, HIGH, 25000);
  ch7 = pulseIn(46, 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,zu meinem aktuellen Projekt will noch einiges schreiben. In diesem Modell wird neben der Hydraulikautomatik, eine Achssteuerung, eine Displaysteuerung und eine Akkuwache mit Betriebsstundenzähler jeweils über einen Arduino Nano gesteuert. Dadurch habe 4 getrennte MCU im Einsatz.Davon habe ich jetzt schon 3 MCU fertig. Jetzt fehlt nur noch die Akkuwache und Betriebsstundenzähler.
MfG
Crazydiver

PS: Die Achssteuerung und die Displayanzeige waren davon noch die leichten Übungen

Moin Miteinander, hier kommt jetzt der Sketch von der Displaysteuerung.DEr angeschlossene Display läuft schon mit einem I2C Bus und ist eine LCD mit 20 x 4 Zeichen.Die Umschaltung wird über einen digitalen Schalter ausgeführt welocher schon entprellt ist.
MfG
Crazydiver

#include <Wire.h>
#include <LiquidCrystal_I2C.h>       // LCD-Bibliothek einbinden

LiquidCrystal_I2C lcd(0x26, 20, 4);     // Display initialisieren

const int LED1 = 13;
const int pin = 8;

int schalterPin = 8;       // Signal PIN 8 für textumschaltung
int textumschalter = 0;      // Signal textumschaltung

void setup() {

  lcd.backlight();  // Display Beleuchtung an
  lcd.init();  // Display löschen

 pinMode(LED1, OUTPUT);
 pinMode(pin, INPUT);
}

void loop() {
lcd.init(); // Display löschen
 
  textumschalter = digitalRead(schalterPin);
  if (textumschalter == LOW)
  {
digitalWrite(LED1, LOW);
                             
lcd.setCursor(6,0);
lcd.print("bla");
lcd.setCursor(3,1);
lcd.print("blablablabla");
lcd.setCursor(8,2);
lcd.print("blabla");
lcd.setCursor(4,3);
lcd.print("blablabla");
}

// Umschaltung zum englischen Text

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


lcd.setCursor(5,0);
lcd.print("bla");
lcd.setCursor(0,1);
lcd.print("Blablablabla");
lcd.setCursor(8,2);
lcd.print("blabla");
lcd.setCursor(4,3);
lcd.print("blablabla");
}
}

Moin Miteinander,hier habe ich jetzt noch den Sketch für eine Achssteuerung. Diese wird zum einem von einer Fernsteuerung so wie über einen weiteren Nano gesteuert.
MfG
Crazydiver

/* Schalter1 HIGH = selststeuern PIN 10
*/
// Servo Library einbinden

#include<Servo.h>
// Neues Servo Object erstellen
Servo lenkung;
//Wert des Potentiometers hier speichern
const int LED1 = 13;
int schalterPin = 2;  //signal PIN 2 für selbststeuern
int selbststeuern = 0;  // signal selbststeuern

int pin = 6;
int val;
int potPin = 7;
unsigned long duration;
void setup() {
// Servo an PIN 1 anlegen
    
lenkung.attach(16);
pinMode(LED1,OUTPUT);
pinMode(pin,INPUT);
}
void loop() {
 
selbststeuern = digitalRead(schalterPin);
if (selbststeuern == HIGH){

  digitalWrite(LED1,HIGH);
  duration=pulseIn(6,HIGH,25000);
  duration = map(duration,1023,2003,30,150); // 10-bit Wert des Analogeingangs (0-1023) in Winkel 0-160 umrechnen
 
  lenkung.write(duration);// Einstellwinkel in Grad an das Servo-objekt schicken
  // Kurze Pause,damit das Servo die neue Position anfahren kann
  delay(5);
  
 }
  
 
else if (selbststeuern == LOW){
  digitalWrite(LED1,LOW); // Stellung des Potis am Analogeingang A7 auslesen
  val = analogRead(7);
   val = map(val,0,1023,0,260);

  // Einstellwinkel in Grad an das Servo-objekt schicken
  lenkung.write(val);
    delay (5);
     
  return;
  }}