map(val, 0, 1023, 0, 179)
servo.wissel1int pot = 0;int val#include <Wire.h>void setup(){ Wire.begin wissel1.attach(6);}void loop(){ AnalogRead(pot, val); map(val, 0, 1023, 0, 179) Servo.write(val) Wire.write(val)}
#include <EEPROM.h>#include <Servo.h> struct servoItem { byte angle; byte setpoint; byte Langle; byte Hangle; Servo pin;};servoItem Servos;int pin;boolean Valid;String inString = "";byte Command;char CmdLH;char Cmd;unsigned long previousMillis;boolean LED13state = true;//========================= Setup ===============void setup() { // initialize serial communication: Serial.begin(9600); // initialize the LED pin as an output: pinMode(LED_BUILTIN,OUTPUT); digitalWrite (LED_BUILTIN,LOW);}//========================= Loop ================void loop() {GetPin(); //Ask for pindo{ Cmd = GetCmd(); switch (Cmd) { case 'S': // Save settings EEPROM.write(100+2*pin,Servos.Langle); EEPROM.write(101+2*pin,Servos.Hangle); Servos.pin.detach(); Serial.print("\nAngles saved for pin "); Serial.println(pin); break; case '?': Serial.println("9 = set servo to 90 degrees"); Serial.println("+ or - = increment or decrement selected angle"); Serial.println("C = change selected angle"); Serial.println("S = store current angles"); break; case '9': //Angle to 90 degrees Servos.angle=90; break; case '+': //Increment angle if (CmdLH == 'H') { Servos.Hangle++; Servos.angle=Servos.Hangle; } else if (CmdLH == 'L' && Servos.Langle < Servos.Hangle-5) { Servos.Langle++; Servos.angle=Servos.Langle; } else Serial.println("LOW angle may not higher then HIGH angle -5"); break; case '-': //Decrement angle if (CmdLH == 'L') { Servos.Langle--; Servos.angle=Servos.Langle; } else if (CmdLH == 'H' && Servos.Hangle > Servos.Langle+5) { Servos.Hangle--; Servos.angle=Servos.Hangle; } else Serial.println("HIGH angle may not be lower then LOW angle +5"); break; case 'C': if (CmdLH == 'L') CmdLH='H'; else CmdLH ='L'; if (CmdLH == 'L') { Serial.println("Angle changed to LOW"); Servos.angle=Servos.Langle; } if (CmdLH == 'H') { Serial.println("Angle changed to HIGH"); Servos.angle=Servos.Hangle; } break; default: Serial.println ("Invalid input!!"); } // Set Servo if (Servos.setpoint != Servos.angle) SetAngle(); } while (Cmd != 'S'); } // end loop//------------------------- SetAngle ----------void SetAngle() { while (Servos.angle > Servos.setpoint) { Servos.setpoint++; Servos.pin.write(Servos.setpoint); // Set Servo to new angle delay (30); } while (Servos.angle < Servos.setpoint) { Servos.setpoint--; Servos.pin.write(Servos.setpoint); // Set Servo to new angle delay (30); } Serial.print("Servo set to angle: "); Serial.print(Servos.angle); Serial.print(", LOW angle: "); Serial.print(Servos.Langle); Serial.print(", HIGH angle: "); Serial.println(Servos.Hangle); Servos.setpoint = Servos.angle; }//------------------------- GetCmd ------------char GetCmd(){ if (CmdLH =='L') Serial.print("\nPlease specify action for angle LOW"); if (CmdLH =='H') Serial.print("\nPlease specify action for angle HIGH"); Serial.println(" (9/+/-/C/S/?)"); FlushWait(); Command = Serial.read(); if (Command == 's') Command = 'S'; if (Command == 'c') Command = 'C';// if (Command == '9' || Command == '+' || Command == '-' || Command == 'S' || Command == 'C' || Command == '?') Valid=true; return Command;}//------------------------- FlushWait --------void FlushWait(){ while(Serial.available()) //Empty inputbuffer { Serial.read(); } while (!Serial.available()) //Wait for new input { // Flash(); delay (100); }}//------------------------- GetPin ------------void GetPin(){Valid = false;while (!Valid){ Serial.println("\nPlease specify pin number"); Serial.println("For A0 to A5 specify 14 to 19 !"); FlushWait(); while (Serial.available() > 0) { int inChar = Serial.read(); if (isDigit(inChar)) { // convert the incoming byte to a char // and add it to the string: inString += (char)inChar; } if (inChar == '\n') { pin=inString.toInt(); Serial.print("The current pin number is "); Valid=true; if (pin>2 && pin<13) Serial.println(pin); if (pin==14) Serial.println("A0"); if (pin==15) Serial.println("A1"); if (pin==16) Serial.println("A2"); if (pin==17) Serial.println("A3"); if (pin==18) Serial.println("A4"); if (pin==19) Serial.println("A5"); if (pin<3 || pin==13 || pin>19) { Serial.println("invalid"); Valid=false; } inString = ""; } }}pinMode(pin, OUTPUT);Serial.println("Pin OK");Servos.pin.attach (pin);Servos.Langle=EEPROM.read(100+2*pin);Servos.Hangle=EEPROM.read(101+2*pin);if (Servos.Langle==255) Servos.Langle = 75;if (Servos.Hangle==255) Servos.Hangle = 105;Servos.angle=Servos.Langle;Servos.setpoint=Servos.Langle+1;SetAngle();Serial.println("Angle set to LOW angle");Serial.print("Current values for servo on this pin are LOW ");Serial.print(Servos.Langle);Serial.print(" and HIGH ");Serial.println(Servos.Hangle);CmdLH='L';}//------------------------------------------------ Flash LED --------void Flash(){ unsigned long currentMillis = millis(); digitalWrite(LED_BUILTIN, LED13state); if (currentMillis - previousMillis >= 200) { LED13state = !(LED13state); previousMillis = currentMillis; }}
Johan,Je wilt de standen weten omdat dat de twee hoeken zijn waartussen de servo heen en weer gaat?Dan kun je die twee standen in de code opnemen voor de servo aansturing. Klopt dat?Oftewel: de servo moet 'getuned' worden.
Dat kan ook simpeler. Momenteel ben ik juist bezig met een programmaatje hiervoor.Dat vraagt eerst een pinnummer waar de te tunen servo aanhangt. Daarbij worden de twee hoeken op 75 (LOW) en 105 (HIGH) graden gezet, 15 graden om de 90 dus.Vervolgens kun je, in de serial monitor door op + en - te drukken de waarde van LOW met één graad verhogen of verlagen.Met 'C' wissel je van de ene hoek naar de ander.Met 'S' sla je de waardes op in het EEPROM en kun je een nieuw pinnummer opgeven.Code: [Selecteer]...
...