Hello all
My robot now is using a mega2560.
It has 2 servos (both TowerPro 9g SG90), a relay and a GSM module.
I made my own power supply for the whole robot. Attached is the schema.
The problem I have is when the GSM gets ready and registers to network, my servos start shaking alone...
Here is the code:
#include <Servo.h>
extern char resp[28];
Servo servo_dir, servo_meat;
#define gsm Serial1
#define dbg Serial
#define SERVO_DIR_PIN 8
#define SERVO_MEAT_PIN 9
void setup() {
pinMode(35, OUTPUT);
pinMode(37, OUTPUT);
dbg.begin(19200);
gsm.begin(19200);
servo_dir.attach(SERVO_DIR_PIN);
servo_meat.attach(SERVO_MEAT_PIN);
servo_dir_move(0);
servo_meat_move(0);
}
void loop() {
gsm_read_resp();
gsm_read_resp();
gsm_read_resp();
gsm_read_resp();
if (strcmp(resp, "Call Ready") == 0) {
dbg.println("gsm rdy.");
while (true) {
delay(400);
gsm.print("AT+CREG?\r");
gsm_read_resp();
if (strcmp(resp, "+CREG: 0,1") == 0 || strcmp(resp, "+CREG: 0,5") == 0) {
gsm_read_resp();
break;
}
gsm_read_resp();
}
dbg.println("gsm registered.");
while (true) {
delay(400);
gsm.print("AT+CGATT?\r");
gsm_read_resp();
if (strcmp(resp, "+CGATT: 1") == 0) {
gsm_read_resp();
break;
}
gsm_read_resp();
}
dbg.println("gsm/gprs rdy.\r\n");
gsm.print("AT+CIPSHUT\r");
gsm_read_resp();
gsm.print("AT+CSTT=\"internet\",\"\",\"\"\r");
gsm_read_resp();
gsm.print("AT+CIICR\r");
gsm_read_resp();
gsm.print("AT+CIFSR\r");
gsm_read_resp();
gsm.print("AT+CIPSTART=\"TCP\",\"sorry_i_dont_show_this\",\"12345\"\r");
gsm_read_resp();
gsm_read_resp();
dbg.println(resp);
do {
gsm.print("AT\r");
gsm_read_resp();
delay(200);
} while (true);
}
}
char buf[32], resp[28];
unsigned char buf_len, resp_len;
char gsm_read() {
char b;
while (gsm.available() <= 0) {
delay(1);
}
b = gsm.read();
return b;
}
unsigned char gsm_read_until(char c, unsigned char off) {
char b;
buf_len = off;
do {
b = gsm_read();
buf[ buf_len ] = b;
buf_len ++;
} while (b != c);
return buf_len;
}
void gsm_read_resp() {
gsm_read_until('\r', 0);
gsm_read_until('\n', buf_len);
gsm_read_until('\r', buf_len);
gsm_read_until('\n', buf_len);
memcpy(resp, buf + 2, buf_len - 2);
resp_len = buf_len - 4;
resp [ resp_len ] = 0;
}
void servo_dir_move(char angle) {
int pulsewidth = map(angle, -100, 100, 544, 2400);
servo_dir.writeMicroseconds(pulsewidth);
}
void servo_meat_move(char angle) {
int pulsewidth = map(angle, -100, 100, 544, 2400);
servo_meat.writeMicroseconds(pulsewidth);
}
the relay coil is connected to +5V of Arduino.
Everything else is connected as the schema says.
Thanks.
