-
Notifications
You must be signed in to change notification settings - Fork 0
/
071-Robot-Arm-Kit-Potentiometers.ino
186 lines (176 loc) · 4.66 KB
/
071-Robot-Arm-Kit-Potentiometers.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
//add servo library
#include <Servo.h>
#include <string.h>
#include <stdio.h>
#include <string.h>
//define our servos
Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
int delayTime=25;
//define our potentiometers
int pot1 = A0;
int pot2 = A1;
int pot3 = A2;
int pot4 = A3;
//variable to read the values from the analog pin (potentiometers)
int valPot1;
int valPot2;
int valPot3;
int valPot4;
String separator=", ";
String serialResponse="";
char delimiter[]=",\n ";
int valueList[]={0,0,0,0};
/*set the state:
1-use only potentiometer values:potentioRead
2-send the servo state to serial port:SerialSend
3-read data from Serial port :SerialRead
*/
enum RobotStateEnum{Potentiometer=1,SerialSend=2,SerialRead=3,RelativeTranslation=4};
RobotStateEnum RobotState=SerialRead;
//set the initial settings
void setup()
{
//attaches our servos on pins PWM 11-10-9-6 to the servos
servo1.attach(11);
servo2.attach(10);
servo3.attach(9);
servo4.attach(6);
Serial.begin(9600);
Serial.println("Serial port connected!");
}
//Repeating part of the code
void loop()
{
readSerialPortSetState();
switch (RobotState)
{
case Potentiometer:
usePotentiometerValues();
break;
case SerialSend:
usePotentiometerValues();
sendDataToSerialPort();
break;
case SerialRead:
useSerialportValues();
break;
case RelativeTranslation:
useSerialportValues();
relativeTranslate();
break;
}
setServoMotos();
//
//Serial.println((is_number("2000"))?"Dorost":"Ghalat");
Serial.flush();
}
void setServoMotos(){
servo1.write(valPot1);//set the servo position according to the scaled value
delay(delayTime);
servo2.write(valPot2);
delay(delayTime);
servo3.write(valPot3);
delay(delayTime);
servo4.write(valPot4);
delay(delayTime);
serialResponse="";
//Serial.flush();
}
// Sets the value of the servos according to potentionmeter values
void usePotentiometerValues(){
//reads the value of potentiometers (value between 0 and 1023)
valPot1 = analogRead(pot1);
valPot1 = map (valPot1, 0, 1023, 0, 180); //scale it to use it with the servo (value between 0 and 180)
valPot2 = analogRead(pot2);
valPot2 = map (valPot2, 0, 1023, 0, 180);
valPot3 = analogRead(pot3);
valPot3 = map (valPot3, 0, 1023, 0, 180);
valPot4 = analogRead(pot4);
valPot4 = map (valPot4, 0, 1023, 0, 180);
}
//Reads the data from the serial port, process them and set the servo position values based on them
void readSerialPortSetState(){
if ( Serial.available()) {
serialResponse = String(Serial.readStringUntil('\r\n'));
if ((serialResponse==NULL)||(serialResponse.length()>1)) return;
if(serialResponse=="1")
RobotState=Potentiometer;
else if(serialResponse=="2")
RobotState=SerialSend;
else if(serialResponse=="3")
RobotState=SerialRead;
else if (serialResponse=="4")
RobotState=RelativeTranslation;
else
return;
Serial.println(RobotState);
}
serialResponse="";
}
bool error=false;
// use serial port values to set servo motors
void useSerialportValues(){
if (serialResponse.length()==0||serialResponse.length()<7) return;
char buf[serialResponse.length()+1];
int index = 0;
//Serial.println(serialResponse);
serialResponse.toCharArray(buf, sizeof(buf));
char *p = buf;
char *str;
error=false;
while ((str = strtok_r(p, delimiter, &p)) != NULL&&index<4)
{
if(is_number(str)){
valueList[index]=atoi(str);
Serial.println(valueList[index]);
index++;
}
else
{
error=true;
break;
}
}
if(index!=4){ error =true;}
if (error) return;
valPot1=valueList[0];
valPot2=valueList[1];
valPot3=valueList[2];
valPot4=valueList[3];
/*Serial.println("----");
for(int i=0;i<=3;i++){
Serial.print(valueList[i]);
Serial.print(",");
}
Serial.println("----");
*/
serialResponse="";
}
// Reads the servo position and send them to the serial port
void sendDataToSerialPort(){
usePotentiometerValues();
Serial.println(valPot1 + separator+valPot2+separator+valPot3+separator+valPot4);
delay(delayTime*4);
}
void relativeTranslate(){
valPot1+=servo1.read();
valPot2+=servo2.read();
valPot3+=servo3.read();
valPot4+=servo4.read();
}
bool is_number(const char* str)
{
bool result=true;
for(size_t i=0; i<strlen(str);i++) {
if(!isdigit(str[i]))
{
//Serial.println(str[i]+ "is not digit");
result=false;
break;
}
}
return result;
}