Beste leden,
Ik probeer enkele servo's aan te sturen gekoppeld aan een Arduino UNO vanuit processing met behulp van
de controlP5 bibliotheek. Dit is een Graphical User Interface. (zie processing GUI, controlP5).
De 5 servo's kan ik zonder problemen besturen vanuit processing met behulp van sliders (en in de arduino
code case 1 tot case 5). De bedoeling is dat ik de servo's vanuit processing ook aan en uit kan zetten met
behulp van de functies attach() en detach() die ik gebruik in de arduino code.
Het aanzetten van de servo's lukt altijd zonder enig probleem (dit is case 6 in de arduino code, en in processing
vanuit de functie void ON_OFF(boolean btnEnabled)).
Het uitzetten m.b.v. de detach() functie in de arduino code vanuit processing lukt nooit (in de arduino
code is dat case 7 en ook via de zelfde functie in processing).
Heeft er iemand enig idee wat er fout is?
De arduino code ziet er als volgt uit:
#include <Servo.h>
Servo servo_robot_1;
Servo servo_robot_2;
Servo servo_robot_3;
Servo servo_grijper_rotatie;
Servo servo_grijper_hand;
int Servo_1_Pin = 9;
int Servo_2_Pin = 10;
int Servo_3_Pin = 11;
int Servo_4_Pin = 5;
int Servo_5_Pin = 6;
int minPulse = 544;
int maxPulse = 2400;
int t;
int pos;
int servo;
int startbyte;
int userInput[5];
boolean enableServos = false;
void setup(){
Serial.begin(19200);
}
// Oneindige loop
void loop(){
if (Serial.available() > 3){
startbyte = Serial.read();
if (startbyte == 255){
for (t = 0; t<2; t++){
userInput[t] = Serial.read();
}
servo = userInput[0];
pos = userInput[1];
if (pos == 255){
servo = 255;
}
switch(servo){
case 1:
servo_robot_1.write(pos + 12); // Plus de offset van de servo's en de software
break;
case 2:
servo_robot_2.write(pos + 16);
break;
case 3:
servo_robot_3.write(pos + 22);
break;
case 4:
servo_grijper_rotatie.write(pos);
break;
case 5:
servo_grijper_hand.write(pos);
break;
case 6:
if (pos == 180){
attach_Servos();
}
break;
case 7:
if (pos == 0){
detach_Servos();
}
break;
}
}
}
}
void attach_Servos(){
servo_robot_1.attach(Servo_1_Pin, minPulse, maxPulse);
servo_robot_2.attach(Servo_2_Pin, minPulse, maxPulse);
servo_robot_3.attach(Servo_3_Pin, minPulse, maxPulse);
servo_grijper_rotatie.attach(Servo_4_Pin, minPulse, maxPulse);
servo_grijper_hand.attach(Servo_5_Pin, minPulse, maxPulse);
enableServos = true;
}
void detach_Servos(){
servo_delta_robot_1.detach();
servo_delta_robot_2.detach();
servo_delta_robot_3.detach();
servo_grijper_rotatie.detach();
servo_grijper_hand.detach();
enableServos = false;
}
Een deel van de processing code:
void sendSerialData() {
if (servosEnabled) {
sendMove(1, serialAngle0 = (int)map(dRobot.servoAngles[0], radians(-90), radians(90), 0, 180));
sendMove(2, serialAngle1 = (int)map(dRobot.servoAngles[1], radians(-90), radians(90), 0, 180));
sendMove(3, serialAngle2 = (int)map(dRobot.servoAngles[2], radians(-90), radians(90), 0, 180));
sendMove(4, gripRot);
sendMove(5, gripWidth);
}
}
void ON_OFF(boolean btnEnabled) {
if (btnEnabled==true) {
sendMove(6, 180);
servosEnabled = true;
println("Servos enabled");
}
else if (btnEnabled==false) {
sendMove(7, 0);
servosEnabled = false;
println("Servos not enabled");
}
}
void sendMove(int servo, int val) {
myPort.write(255);
myPort.write(servo);
myPort.write(val);
}