Moin habe mal ne frage habe das Arduino Uno und will 4 servos über pwm ansteuern aber auf pwm 11 geht der nicht der servo wo ran kann es ligen
Mit der servo.h Bibliothek braucht es keinen PWM Pins für die Angesteuerung der Servos. Die Bibliothek kann auf dem ATmega328 des UNO 12 Servos ansteuern.
Da Du den Sketch nicht zeigst, kann ich keine Lösung anbieten.
Grüße Uwe
//letzter Stand: 30.01.2014
//Lars Jobst - Pulle - www.omsiDeluxe.de 1 - based on Nick Gammon code
#include <Servo.h>
typedef enum { NONE, GOT_A1, GOT_A2, GOT_A3, GOT_A4, GOT_A5, GOT_A6, GOT_A7, GOT_A8, GOT_A9, GOT_A10, GOT_A11, GOT_A12, GOT_A13, GOT_A14, GOT_A15, GOT_A16,GOT_A17, GOT_A18, GOT_A19, GOT_A20, GOT_A21, GOT_A22, GOT_A23, GOT_A24, GOT_A25, GOT_A26, GOT_A27, GOT_A28, GOT_A29, GOT_A30, GOT_A31, GOT_A32, GOT_t, GOT_u, GOT_v, GOT_w, GOT_x, GOT_y, GOT_z } states;
states state = NONE;
unsigned int aktueller_wert;
//Hier bitte einstellen ob 0=an und 1= aus oder 0=aus und 1=an
//Eventuell bei verschieden Relaiskartentypen notwendig.
unsigned int wert_fur_an = 0;
//Servos benennen
Servo geschwindigkeit;
Servo oldruck;
Servo tank;
Servo mototemp;
Servo wasser;
Servo luft;
void setup ()
{
Serial.begin (115200);
state = NONE;
pinMode(22, OUTPUT);
pinMode(23, OUTPUT);
pinMode(24, OUTPUT);
pinMode(25, OUTPUT);
pinMode(26, OUTPUT);
pinMode(27, OUTPUT);
pinMode(28, OUTPUT);
pinMode(29, OUTPUT);
pinMode(30, OUTPUT);
pinMode(31, OUTPUT);
pinMode(32, OUTPUT);
pinMode(33, OUTPUT);
pinMode(34, OUTPUT);
pinMode(35, OUTPUT);
pinMode(36, OUTPUT);
pinMode(37, OUTPUT);
pinMode(38, OUTPUT);
pinMode(39, OUTPUT);
pinMode(40, OUTPUT);
pinMode(41, OUTPUT);
pinMode(42, OUTPUT);
pinMode(43, OUTPUT);
pinMode(44, OUTPUT);
pinMode(45, OUTPUT);
pinMode(46, OUTPUT);
pinMode(47, OUTPUT);
pinMode(48, OUTPUT);
pinMode(49, OUTPUT);
pinMode(50, OUTPUT);
pinMode(51, OUTPUT);
pinMode(52, OUTPUT);
pinMode(53, OUTPUT);
mototemp.attach(6);
wasser.attach(5);
geschwindigkeit.attach(9);
oldruck.attach(10);
tank.attach(11);
luft.attach(3);
}
// Lights
void Melder1(const unsigned int value)
{
if (value == wert_fur_an)
{
digitalWrite(22,HIGH);
}
else
{
digitalWrite(22,LOW);
}
}
void Melder2(const unsigned int value)
{
if (value == wert_fur_an)
{
digitalWrite(23,HIGH);
}
else
{
digitalWrite(23,LOW);
}
}
void Melder3(const unsigned int value)
{
if (value == wert_fur_an)
{
digitalWrite(24,HIGH);
}
else
{
digitalWrite(24,LOW);
}
}
void Melder4(const unsigned int value)
{
if (value == wert_fur_an)
{
digitalWrite(25,HIGH);
}
else
{
digitalWrite(25,LOW);
}
}
void Melder5(const unsigned int value)
{
if (value == wert_fur_an)
{
digitalWrite(26,HIGH);
}
else
{
digitalWrite(26,LOW);
}
}
void Melder6(const unsigned int value)
{
if (value == wert_fur_an)
{
digitalWrite(27,HIGH);
}
else
{
digitalWrite(27,LOW);
}
}
void Melder7(const unsigned int value)
{
if (value == wert_fur_an)
{
digitalWrite(28,HIGH);
}
else
{
digitalWrite(28,LOW);
}
}
void Melder8(const unsigned int value)
{
if (value == wert_fur_an)
{
digitalWrite(29,HIGH);
}
else
{
digitalWrite(29,LOW);
}
}
void Melder9(const unsigned int value)
{
if (value == wert_fur_an)
{
digitalWrite(30,HIGH);
}
else
{
digitalWrite(30,LOW);
}
}
void Melder10(const unsigned int value)
{
if (value == wert_fur_an)
{
digitalWrite(31,HIGH);
}
else
{
digitalWrite(31,LOW);
}
}
void Melder11(const unsigned int value)
{
if (value == wert_fur_an)
{
digitalWrite(32,HIGH);
}
else
{
digitalWrite(32,LOW);
}
}
void Melder12(const unsigned int value)
{
if (value == wert_fur_an)
{
digitalWrite(33,HIGH);
}
else
{
digitalWrite(33,LOW);
}
}
void Melder13(const unsigned int value)
{
if (value == wert_fur_an)
{
digitalWrite(34,HIGH);
}
else
{
digitalWrite(34,LOW);
}
}
void Melder14(const unsigned int value)
{
if (value == wert_fur_an)
{
digitalWrite(35,HIGH);
}
else
{
digitalWrite(35,LOW);
}
}
void Melder15(const unsigned int value)
{
if (value == wert_fur_an)
{
digitalWrite(36,HIGH);
}
else
{
digitalWrite(36,LOW);
}
}
void Melder16(const unsigned int value)
{
if (value == wert_fur_an)
{
digitalWrite(37,HIGH);
}
else
{
digitalWrite(37,LOW);
}
}
void Melder17(const unsigned int value)
{
if (value == wert_fur_an)
{
digitalWrite(38,HIGH);
}
else
{
digitalWrite(38,LOW);
}
}
void Melder18(const unsigned int value)
{
if (value == wert_fur_an)
{
digitalWrite(39,HIGH);
}
else
{
digitalWrite(39,LOW);
}
}
void Melder19(const unsigned int value)
{
if (value == wert_fur_an)
{
digitalWrite(40,HIGH);
}
else
{
digitalWrite(40,LOW);
}
}
void Melder20(const unsigned int value)
{
if (value == wert_fur_an)
{
digitalWrite(41,HIGH);
}
else
{
digitalWrite(41,LOW);
}
}
void Melder21(const unsigned int value)
{
if (value == wert_fur_an)
{
digitalWrite(42,HIGH);
}
else
{
digitalWrite(42,LOW);
}
}
void Melder22(const unsigned int value)
{
if (value == wert_fur_an)
{
digitalWrite(43,HIGH);
}
else
{
digitalWrite(43,LOW);
}
}
void Melder23(const unsigned int value)
{
if (value == wert_fur_an)
{
digitalWrite(44,HIGH);
}
else
{
digitalWrite(44,LOW);
}
}
void Melder24(const unsigned int value)
{
if (value == wert_fur_an)
{
digitalWrite(45,HIGH);
}
else
{
digitalWrite(45,LOW);
}
}
void Melder25(const unsigned int value)
{
if (value == wert_fur_an)
{
digitalWrite(46,HIGH);
}
else
{
digitalWrite(46,LOW);
}
}
void Melder26(const unsigned int value)
{
if (value == wert_fur_an)
{
digitalWrite(47,HIGH);
}
else
{
digitalWrite(47,LOW);
}
}
void Melder27(const unsigned int value)
{
if (value == wert_fur_an)
{
digitalWrite(48,HIGH);
}
else
{
digitalWrite(48,LOW);
}
}
void Melder28(const unsigned int value)
{
if (value == wert_fur_an)
{
digitalWrite(49,HIGH);
}
else
{
digitalWrite(49,LOW);
}
}
void Melder29(const unsigned int value)
{
if (value == wert_fur_an)
{
digitalWrite(50,HIGH);
}
else
{
digitalWrite(50,LOW);
}
}
void Melder30(const unsigned int value)
{
if (value == wert_fur_an)
{
digitalWrite(51,HIGH);
}
else
{
digitalWrite(51,LOW);
}
}
void Melder31(const unsigned int value)
{
if (value == wert_fur_an)
{
digitalWrite(52,HIGH);
}
else
{
digitalWrite(52,LOW);
}
}
void Melder32(const unsigned int value)
{
if (value == wert_fur_an)
{
digitalWrite(53,HIGH);
}
else
{
digitalWrite(53,LOW);
}
}
// Servo Port11 Druckluft
void Servo1(const unsigned int value)
{
luft.write(aktueller_wert);
}
// Servo Port5 Mototemp
void Servo2(const unsigned int value)
{
mototemp.write(aktueller_wert);
}
// Servo Port9 Geschwindigkeit
void Servo4(const unsigned int value)
{
geschwindigkeit.write(aktueller_wert);
}
// Servo Port10 Öldruck
void Servo5(const unsigned int value)
{
oldruck.write(aktueller_wert);
}
// Servo Port11 Tank
void Servo6(const unsigned int value)
{
tank.write(aktueller_wert);
}
// Servo Port12 Drehzal
void Servo8(const unsigned int value)
{
//Drehzahl.write(aktueller_wert);
}
// Servo Port6 Wasser
void Servo3(const unsigned int value)
{
wasser.write(aktueller_wert);
}
void aktion_ausfuhren()
{
switch (state)
{
case GOT_A1:
Melder1(aktueller_wert);
break;
case GOT_A2:
Melder2(aktueller_wert);
break;
case GOT_A3:
Melder3(aktueller_wert);
break;
case GOT_A4:
Melder4(aktueller_wert);
break;
case GOT_A5:
Melder5(aktueller_wert);
break;
case GOT_A6:
Melder6(aktueller_wert);
break;
case GOT_A7:
Melder7(aktueller_wert);
break;
case GOT_A8:
Melder8(aktueller_wert);
break;
case GOT_A9:
Melder9(aktueller_wert);
break;
case GOT_A10:
Melder10(aktueller_wert);
break;
case GOT_A11:
Melder11(aktueller_wert);
break;
case GOT_A12:
Melder12(aktueller_wert);
break;
case GOT_A13:
Melder13(aktueller_wert);
break;
case GOT_A14:
Melder14(aktueller_wert);
break;
case GOT_A15:
Melder15(aktueller_wert);
break;
case GOT_A16:
Melder16(aktueller_wert);
break;
//Q
case GOT_A17:
Melder17(aktueller_wert);
break;
case GOT_A18:
Melder18(aktueller_wert);
break;
case GOT_A19:
Melder19(aktueller_wert);
break;
case GOT_A20:
Melder20(aktueller_wert);
break;
case GOT_A21:
Melder21(aktueller_wert);
break;
case GOT_A22:
Melder22(aktueller_wert);
break;
case GOT_A23:
Melder23(aktueller_wert);
break;
case GOT_A24:
Melder24(aktueller_wert);
break;
case GOT_A25:
Melder25(aktueller_wert);
break;
case GOT_A26:
Melder26(aktueller_wert);
break;
case GOT_A27:
Melder27(aktueller_wert);
break;
case GOT_A28:
Melder28(aktueller_wert);
break;
case GOT_A29:
Melder29(aktueller_wert);
break;
case GOT_A30:
Melder30(aktueller_wert);
break;
case GOT_A31:
Melder31(aktueller_wert);
break;
case GOT_A32:
Melder32(aktueller_wert);
break;
case GOT_u:
Servo1(aktueller_wert);
break;
case GOT_v:
Servo2(aktueller_wert);
break;
case GOT_w:
Servo5(aktueller_wert);
break;
case GOT_x:
Servo6(aktueller_wert);
break;
case GOT_y:
Servo4(aktueller_wert);
break;
case GOT_z:
Servo3(aktueller_wert);
break;
case GOT_t:
Servo8(aktueller_wert);
break;
}
aktueller_wert = 0;
}
void processIncomingByte (const byte c)
{
if (isdigit (c))
{
aktueller_wert *= 10;
aktueller_wert += c - '0';
}
else
{
aktion_ausfuhren ();
switch (c)
{
case 'A':
state = GOT_A1;
break;
case 'B':
state = GOT_A2;
break;
case 'C':
state = GOT_A3;
break;
case 'D':
state = GOT_A4;
break;
case 'E':
state = GOT_A5;
break;
case 'F':
state = GOT_A6;
break;
case 'G':
state = GOT_A7;
break;
case 'H':
state = GOT_A8;
break;
case 'I':
state = GOT_A9;
break;
case 'J':
state = GOT_A10;
break;
case 'K':
state = GOT_A11;
break;
case 'L':
state = GOT_A12;
break;
case 'M':
state = GOT_A13;
break;
case 'N':
state = GOT_A14;
break;
case 'O':
state = GOT_A15;
break;
case 'P':
state = GOT_A16;
break;
case 'Q':
state = GOT_A17;
break;
case 'R':
state = GOT_A18;
break;
case 'S':
state = GOT_A19;
break;
case 'T':
state = GOT_A20;
break;
case 'U':
state = GOT_A21;
break;
case 'V':
state = GOT_A22;
break;
case 'W':
state = GOT_A23;
break;
case 'X':
state = GOT_A24;
break;
case 'Y':
state = GOT_A25;
break;
case 'Z':
state = GOT_A26;
break;
case 'a':
state = GOT_A27;
break;
case 'b':
state = GOT_A28;
break;
case 'c':
state = GOT_A29;
break;
case 'd':
state = GOT_A30;
break;
case 'e':
state = GOT_A31;
break;
case 'f':
state = GOT_A32;
break;
case 'u':
state = GOT_u;
break;
case 'v':
state = GOT_v;
break;
case 'w':
state = GOT_w;
break;
case 'x':
state = GOT_x;
break;
case 'y':
state = GOT_y;
break;
case 'z':
state = GOT_z;
break;
case 't':
state = GOT_t;
break;
default:
state = NONE;
break;
}
}
}
void loop()
{
if (Serial.available())
processIncomingByte (Serial.read());
}
So einen Spaghetticode weigere ich mich zu lesen.
Wozu brauchst Du über 20 Funktionen die das gleiche machen?
Informiere Dich was arrays sind und wie man die verwenden kann. Dann schreibst Du den Sketch um und kommentierst ihn ordentlich.
Dann schauen wir weiter.
Grüße Uwe
Das ist für ein Bus Spiel gedacht namens Komsi und wie ich es umschreiben habe ich keine Ahnung die ganzen Funktion werden mittels Software gesteuert die ganzen gleichen beliebigen sind für kontrollruchten die ich per plugin uns Software Steuer aber die brauche ich beim Uno nicht aber keine Ahnung wie mann es für ein Uno umschreiben kann
Dass ist die Seite dazu http://pulle76.de/
Setzt deinen Code bitte in Code-Tags.
Du hast Pin 11 nicht als Output gesetzt.
Und beim Uno gibt es die Pins 22-53 nicht.
Und noch viel schlimmer.
Ok, es ist nicht auf Deinem Mist gewachsen.
Wie bereits gesagt hat der UNO nur die Pins von 0 bis 19.
Ich denke dieser Sketch ist für einen Arduino MEGA 2560 geschrieben (der hätte genug pins).
Versuch mal die Pins zweier Servos zu vertauschen. Zuerst physisch und dann im Sketch. Was ändert sich?
Laut https://docs.arduino.cc/learn/electronics/servo-motors braucht es keine Definition des Pins als Ausgang.
Zur Verbreitungslimitierung.
Die Seite funktioniert nicht.
Der Code basiert auf der Arbeit eines anderen der sie als Open Source veröffentlicht hat und laut der Lizenz muß das Ergebnis mit der gleichen Lizenz weitergegeben werden.
"//Lars Jobst - Pulle - www.omsiDeluxe.de 1 - based on Nick Gammon code"
Grüße Uwe
Jo wenn ich den pin 11 zumbeispiel auf pin 8 änder geht es auch nicht habe keine Ahnung wie es geht die omsideluxe Seite wurde aufgegeben es gibt nur noch den zum download die seite von Pulle ist der original download und wie ich es auf ein Uno umschreibe habe ich auch keine ahnung
Das fängt damit an, dass du alles raus wirfst, was mit Pins größer 13 zu tun hat.
Einigen wir uns auf Pin 19. Die Pins A0 bis A5 sind 14 bis 19.
Grüße Uwe
Ja, Nee!
Die Pins sind mit A0 usw. auf dem Board beschriftet, dann sollte man sie auch so verwenden!
UNO A0 == 14 , das stimmt.
Aber das stimmt nicht für den Mega, und auch nicht für Andere.
Bedenke, wir haben hier schon die UNO zu Mega Verwirrung.
Die sollte man nicht durch exotische Benennungen optimieren.
Also: Ja, fachlich hast du Wahr!
Also: Nee, für optimal halte ich das nicht.
2 irgendwie korrekte Sichtweisen auf das "Problem"!
Welche ist richtig?
Kann mir da inventuell ja d bei helfen das umz schreiben
Richtig oder nicht richtig. Nehmen wir mal an D0 und D1 reservieren wir uns für die Serielle Verbindung wobei die Daten nur in eine Richtung gehen und darum ein Pin frei sein könnte. Aber lassen wir das sonst könnte man auch darüber Nachdenken das Resetpin wegzurationalisieren um mehr Pins zu haben.
Bleiben dann 18 Digitale Ein/Ausgänge am Arduino UNO.
Wie die heißen beunruhigt mich wenig. Wenn man mehr als 12 Pins braucht, kann man leicht über die Bezeichnung hinwegsehen.
Sie als Pin 14 bis Pin 19 im Sketch Anzusprechen funktioniert ja ohne Probleme und Verrenkungen.
Grüße Uwe
Dazu müßtest du wissen auf was du alles verzichten kannst. Du weißt ja jetzt das du weniger Pins zur Verfügung hast wie im Sketch vorkommen. Außer du kaufst dir einen Arduino Mega2560.
Brauche nur die pwm Eingänge für die servos die ale was mir kontrolleichten und Melder zutun hat kann raus
Also müsste es so richtig sein oder
//letzter Stand: 30.01.2014
//Lars Jobst - Pulle - www.omsiDeluxe.de - based on Nick Gammon code
#include <Servo.h>
typedef enum { NONE, GOT_t, GOT_u, GOT_v, GOT_w, GOT_x, GOT_y, GOT_z } states;
states state = NONE;
unsigned int aktueller_wert;
//Hier bitte einstellen ob 0=an und 1= aus oder 0=aus und 1=an
//Eventuell bei verschieden Relaiskartentypen notwendig.
unsigned int wert_fur_an = 0;
//Servos benennen
Servo geschwindigkeit;
Servo oldruck;
Servo tank;
Servo mototemp;
Servo wasser;
Servo luft;
void setup ()
{
Serial.begin (115200);
state = NONE;
mototemp.attach(6);
wasser.attach(5);
geschwindigkeit.attach(9);
oldruck.attach(10);
tank.attach(13);
luft.attach(3);
}
// Servo Port3 Druckluft
void Servo1(const unsigned int value)
{
luft.write(aktueller_wert);
}
// Servo Port5 Mototemp
void Servo2(const unsigned int value)
{
mototemp.write(aktueller_wert);
}
// Servo Port9 Geschwindigkeit
void Servo4(const unsigned int value)
{
geschwindigkeit.write(aktueller_wert);
}
// Servo Port10 Öldruck
void Servo5(const unsigned int value)
{
oldruck.write(aktueller_wert);
}
// Servo Port13 Tank
void Servo6(const unsigned int value)
{
tank.write(aktueller_wert);
}
// Servo Port12 Drehzal
void Servo8(const unsigned int value)
{
//Drehzahl.write(aktueller_wert);
}
// Servo Port6 Wasser
void Servo3(const unsigned int value)
{
wasser.write(aktueller_wert);
}
void aktion_ausfuhren()
{
switch (state)
{
case GOT_u:
Servo1(aktueller_wert);
break;
case GOT_v:
Servo2(aktueller_wert);
break;
case GOT_w:
Servo5(aktueller_wert);
break;
case GOT_x:
Servo6(aktueller_wert);
break;
case GOT_y:
Servo4(aktueller_wert);
break;
case GOT_z:
Servo3(aktueller_wert);
break;
case GOT_t:
Servo8(aktueller_wert);
break;
}
aktueller_wert = 0;
}
void processIncomingByte (const byte c)
{
if (isdigit (c))
{
aktueller_wert *= 10;
aktueller_wert += c - '0';
}
else
{
aktion_ausfuhren ();
switch (c)
{
case 'u':
state = GOT_u;
break;
case 'v':
state = GOT_v;
break;
case 'w':
state = GOT_w;
break;
case 'x':
state = GOT_x;
break;
case 'y':
state = GOT_y;
break;
case 'z':
state = GOT_z;
break;
case 't':
state = GOT_t;
break;
default:
state = NONE;
break;
}
}
}
void loop()
{
if (Serial.available())
processIncomingByte (Serial.read());
}
PWM sind Ausgänge.
Wie ich bereits geschrieben habe braucht Du keine PWM Ausgänge zum Ansteuern der Servo; Funktioniert mit allen Pins.
Wieso baust Du Funktinen um die nur von einer Stelle aufrufst.
zB
Zuerst brauchst Du keine Funktion und außerdem wird der Funktion übergebene Wert nicht verwendet.
So ist es besser und einfacher.
case GOT_v:
mototemp.write(aktueller_wert);
break;
[/quote]
Verstehe auch nicht wieso die Funktionen const Vatiablen sein sollen.
Grüße Uwe
Hallo,
@ TO:
Etwas umgebaut. Kannste testen. Ansonsten nochmal das Servo Bsp. der IDE anschauen.
Die Zuordnung der Servos solltest du auch nochmal kontrollieren.
Da habe ich nicht ganz durchgeblickt.
//letzter Stand: 30.01.2014
//Lars Jobst - Pulle - www.omsiDeluxe.de - based on Nick Gammon code
#include <Servo.h>
enum States { NONE, GOT_t, GOT_u, GOT_v, GOT_w, GOT_x, GOT_y, GOT_z };
States state = NONE;
unsigned int aktueller_wert;
//Hier bitte einstellen ob 0=an und 1= aus oder 0=aus und 1=an
//Eventuell bei verschieden Relaiskartentypen notwendig.
unsigned int wert_fur_an = 0;
//Servos benennen
Servo geschwindigkeit;
Servo oldruck;
Servo tank;
Servo motorTemp;
Servo wasser;
Servo luft;
void setup ()
{
Serial.begin (115200);
// state = NONE; // hast du oben schon initialisiert !
motorTemp.attach(6);
wasser.attach(5);
geschwindigkeit.attach(9);
oldruck.attach(10);
tank.attach(13);
luft.attach(3);
}
void setServo(auto &obj, const unsigned int value)
{
obj.write(value);
}
void aktion_ausfuhren()
{
switch (state)
{
case GOT_u:
setServo(oldruck, aktueller_wert);
break;
case GOT_v:
setServo(motorTemp, aktueller_wert);
break;
case GOT_w:
setServo(wasser, aktueller_wert);
break;
case GOT_x:
setServo(tank, aktueller_wert);
break;
case GOT_y:
setServo(luft, aktueller_wert);
break;
case GOT_z:
setServo(geschwindigkeit, aktueller_wert);
break;
case GOT_t:
//
break;
default: break;
}
aktueller_wert = 0;
}
void processIncomingByte (const byte c)
{
if (isdigit (c))
{
aktueller_wert *= 10;
aktueller_wert += c - '0';
}
else
{
aktion_ausfuhren ();
switch (c)
{
case 'u':
state = GOT_u;
break;
case 'v':
state = GOT_v;
break;
case 'w':
state = GOT_w;
break;
case 'x':
state = GOT_x;
break;
case 'y':
state = GOT_y;
break;
case 'z':
state = GOT_z;
break;
case 't':
state = GOT_t;
break;
default:
state = NONE;
break;
}
}
}
void loop()
{
if (Serial.available())
processIncomingByte (Serial.read());
}
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.