Управление сервой через GSM Shield
- Войдите на сайт для отправки комментариев
Втр, 16/10/2012 - 21:55
include <SoftwareSerial.h>
#include <Servo.h>
SoftwareSerial gprsSerial(7, 8);
Servo myservo;
int pos = 0;
//для зелёного светодиода будем использовать второй цифровой вход,
//а для жёлтого - третий
int greenPin = 2;
int yellowPin = 3;
void setup()
{
gprsSerial.begin(19200);
pinMode(greenPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
myservo.attach(9);
// Настраиваем приём сообщений с других устройств
// Между командами даём время на их обработку
gprsSerial.print("AT+CMGF=1\r");
delay(300);
gprsSerial.print("AT+IFC=1, 1\r");
delay(300);
gprsSerial.print("AT+CPBS=\"SM\"\r");
delay(300);
gprsSerial.print("AT+CNMI=1,2,2,1,0\r");
delay(500);
}
String currStr = "";
// Переменная принимает значение True, если текущая строка является сообщением
boolean isStringMessage = false;
void loop()
{
if (!gprsSerial.available())
return;
char currSymb = gprsSerial.read();
if ('\r' == currSymb) {
if (isStringMessage) {
//если текущая строка - SMS-сообщение,
//отреагируем на него соответствующим образом
if (!currStr.compareTo("Green on")) {
digitalWrite(greenPin, HIGH);
} else if (!currStr.compareTo("Green off")) {
digitalWrite(greenPin, LOW);
} else if (!currStr.compareTo("Yellow on")) {
digitalWrite(yellowPin, HIGH);
} else if (!currStr.compareTo("Yellow off")) {
digitalWrite(yellowPin, LOW);
} else if (!currStr.compareTo("Servo")){
for(pos = 0; pos < 180; pos += 1)
{
myservo.write(pos);
delay(15);
}
for(pos = 180; pos>=1; pos-=1)
{
myservo.write(pos);
delay(15);
}
isStringMessage = false;
} else {
if (currStr.startsWith("+CMT")) {
//если текущая строка начинается с "+CMT",
//то следующая строка является сообщением
isStringMessage = true;
}
}
currStr = "";
} else if ('\n' != currSymb) {
currStr += String(currSymb);
}
}
}
Помогите пожалуйста разобраться с кодом.
После према СМСки с текстом: "Servo" сервомашинка вместо отработки своей программы
просто дергается и после этого GPRS/GSM Shield v1.1 отключается.
include <SoftwareSerial.h> #include <Servo.h> SoftwareSerial gprsSerial(7, 8); Servo myservo; int pos = 0; //для зелёного светодиода будем использовать второй цифровой вход, //а для жёлтого - третий int greenPin = 2; int yellowPin = 3; void setup() { gprsSerial.begin(19200); pinMode(greenPin, OUTPUT); pinMode(yellowPin, OUTPUT); myservo.attach(9); // Настраиваем приём сообщений с других устройств // Между командами даём время на их обработку gprsSerial.print("AT+CMGF=1\r"); delay(300); gprsSerial.print("AT+IFC=1, 1\r"); delay(300); gprsSerial.print("AT+CPBS=\"SM\"\r"); delay(300); gprsSerial.print("AT+CNMI=1,2,2,1,0\r"); delay(500); } String currStr = ""; // Переменная принимает значение True, если текущая строка является сообщением boolean isStringMessage = false; void loop() { if (!gprsSerial.available()) return; char currSymb = gprsSerial.read(); if ('\r' == currSymb) { if (isStringMessage) { //если текущая строка - SMS-сообщение, //отреагируем на него соответствующим образом if (!currStr.compareTo("Green on")) { digitalWrite(greenPin, HIGH); } else if (!currStr.compareTo("Green off")) { digitalWrite(greenPin, LOW); } else if (!currStr.compareTo("Yellow on")) { digitalWrite(yellowPin, HIGH); } else if (!currStr.compareTo("Yellow off")) { digitalWrite(yellowPin, LOW); } else if (!currStr.compareTo("Servo")){ for(pos = 0; pos < 180; pos += 1) { myservo.write(pos); delay(15); } for(pos = 180; pos>=1; pos-=1) { myservo.write(pos); delay(15); } isStringMessage = false; } else { if (currStr.startsWith("+CMT")) { //если текущая строка начинается с "+CMT", //то следующая строка является сообщением isStringMessage = true; } } currStr = ""; } else if ('\n' != currSymb) { currStr += String(currSymb); } } }П
include <SoftwareSerial.h> #include <Servo.h> SoftwareSerial gprsSerial(7, 8); Servo myservo; int pos = 0; //для зелёного светодиода будем использовать второй цифровой вход, //а для жёлтого - третий int greenPin = 2; int yellowPin = 3; void setup() { gprsSerial.begin(19200); pinMode(greenPin, OUTPUT); pinMode(yellowPin, OUTPUT); myservo.attach(9); // Настраиваем приём сообщений с других устройств // Между командами даём время на их обработку gprsSerial.print("AT+CMGF=1\r"); delay(300); gprsSerial.print("AT+IFC=1, 1\r"); delay(300); gprsSerial.print("AT+CPBS=\"SM\"\r"); delay(300); gprsSerial.print("AT+CNMI=1,2,2,1,0\r"); delay(500); } String currStr = ""; // Переменная принимает значение True, если текущая строка является сообщением boolean isStringMessage = false; void loop() { if (!gprsSerial.available()) return; char currSymb = gprsSerial.read(); if ('\r' == currSymb) { if (isStringMessage) { //если текущая строка - SMS-сообщение, //отреагируем на него соответствующим образом if (!currStr.compareTo("Green on")) { digitalWrite(greenPin, HIGH); } else if (!currStr.compareTo("Green off")) { digitalWrite(greenPin, LOW); } else if (!currStr.compareTo("Yellow on")) { digitalWrite(yellowPin, HIGH); } else if (!currStr.compareTo("Yellow off")) { digitalWrite(yellowPin, LOW); } else if (!currStr.compareTo("Servo")){ for(pos = 0; pos < 180; pos += 1) { myservo.write(pos); delay(15); } for(pos = 180; pos>=1; pos-=1) { myservo.write(pos); delay(15); } isStringMessage = false; } else { if (currStr.startsWith("+CMT")) { //если текущая строка начинается с "+CMT", //то следующая строка является сообщением isStringMessage = true; } } currStr = ""; } else if ('\n' != currSymb) { currStr += String(currSymb); } } }[/quote]
Дело не в коде, а нехватке питания.
Другими словами - попытайтесь запитатся не от USB, а от внешнего блока питания.
Запитался от внешнего блока 12В.Никаких изменнеий,разве что серва начала дергаться сильнее.
Потому что вы серву запитываете от дуины, а нужно запитать от отдельного источника, НО на серву можно давать небольше 6 вольт.
А точнее можно и от того же блока питания, но питание на серву нужно подавать через отдельный стабилизатор.
Запитал от отдельного источника серву 6В,дал общий минус. Дергается , но перестала выключаться GSM-Shield.
А что за источник на 6 вольт? Попробуйте так, если тоже дергается , то ваш источник питания не тянет и кстати, а что за серва?
#include <Servo.h> Servo myservo; // create servo object to control a servo void setup(){ myservo.attach(9); // attaches the servo on pin 9 to the servo object } void loop(){ for(int pos = 0; pos < 180; pos ++){ myservo.write(pos); delay(15); } for(int pos = 180; pos>=0; pos--){ myservo.write(pos); delay(15); } }Изменил код по Вашему совету. Изменений нет. Источник питания сервы-акумулятор 6В, 4,5Ah.
Серва маломощная - Hextronik HXT900. Эта серва работает и от USB питания на обычном скетче из базы примеров IDE 1.0.1
Надо было не изменять, а просто попробовать этот код. Серва у вас действительно маленькая, но вместе с GSM-шилдом может давать просадки, по этому от USB может не работать. Если она у вас дергается с этим кодом (не надо его менять просто копируйте и залейте), то либо у вас разряжен аккум, либо что-то с проводами, либо с сервой, либо вы что-то не так подключаете.
С Вашим кодом серва работает и c акумулятором и от USB.
А GSM-шилд при этом подключен?
GSM-шилд включен в разъем Уно ,но при нажатии кнопки "SIM900-POWER" пытается включиться , мигают индикаторы "STATUS" и "NET", а затем выключаетя. Серва же продолжает отрабатывать скетч.
Вопрос к топикстартеру и всем кто может помочь.
Вы своим кодом хотя бы светодиод смогли зажечь? Я совсем еще начинающий и играюсь с приемом смсок. Есть ощущение что Ваш код совершенно не рабочий в плане распарсенья данных с СОМ порта. Я им не то что серву, диод зажечь не могу. Это не критика, просто я совсем еще чайник и может что то не то делаю.
НЕ могли бы Вы обяснить, как именно у Вас идет "чтение" СМСки? Я все выходные сижу - понять не могу.
Зачем Вы используете АТ+IFC?
Почему Вы анализируете весь поток СОМ порта, а не ждете
+СМТ сначала?Спасибо за ответы
Вот мой код (с частью Вашего кода)для отсылания СМС по превышению температурного порога и отправки СМС, по приему входящей СМС, запрашивающий статус. Отправка по превышению работает, остальное нет.
#include <SoftwareSerial.h> #include "DHT.h" SoftwareSerial mySerial(10, 11); // RX, TX #define DHTPIN 2 #define DHTTYPE DHT11 // DHT 11 DHT dht(DHTPIN, DHTTYPE); #define HOT 1 #define COLD 0 int LastStatusOfTheTemp=COLD; int count = 0; int countMessages = 1; void setup (){ dht.begin(); mySerial.begin(9600); mySerial.flush(); mySerial.print("\r"); mySerial.println("AT"); delay(100); int i=0; char commandbuffer[100]; if(mySerial.available()){ delay(100); while( mySerial.available() && i< 99) { commandbuffer[i++] = mySerial.read(); } commandbuffer[i++]='\0'; } if(i>0) { mySerial.println(commandbuffer); delay(500); mySerial.print("AT+CMGF=1\r"); delay(500); mySerial.print("AT+CPBS=\"SM\"\r"); delay(500); mySerial.print("AT+CNMI=1,2,2,1,0\r"); delay(500); } } String currStr = ""; // Переменная принимает значение True, если текущая строка является сообщением boolean isStringMessage = false; void loop () { if (!mySerial.available()) return; float t = dht.readTemperature(); if (t>=30) { if (LastStatusOfTheTemp==COLD) { while (count < countMessages) { delay(1000); mySerial.print("AT+CMGS="); // отправляем смс mySerial.print((char)34); mySerial.print("89xxxxxxxxx"); // номер получателя mySerial.print((char)34); // символ кавычки " mySerial.print((char)13); // символ <cr> (ASCII character 13) delay(1500); mySerial.print("VERY HOT! - "); mySerial.print(t); // текст смс delay(500); mySerial.print((char)26); // символ <ctrl-z> (ASCII character 26) delay(30000); count++; LastStatusOfTheTemp=HOT; } } else { if (LastStatusOfTheTemp==HOT) { LastStatusOfTheTemp=COLD; } } char currSymb = mySerial.read(); if ('\r' == currSymb) { if (isStringMessage) { //если текущая строка - SMS-сообщение, //отреагируем на него соответствующим образом if (!currStr.compareTo("Status")) { mySerial.print("AT+CMGS="); // отправляем смс mySerial.print((char)34); mySerial.print("89xxxxxxxxx"); // номер получателя mySerial.print((char)34); // символ кавычки " mySerial.print((char)13); // символ <cr> (ASCII character 13) delay(1500); mySerial.print("Temperatura - "); mySerial.print(t); // текст смс delay(500); mySerial.print((char)26); // символ <ctrl-z> (ASCII character 26) delay(300); isStringMessage = false; } else { if (currStr.startsWith("+CMT")) { //если текущая строка начинается с "+CMT", //то следующая строка является сообщением isStringMessage = true; } } currStr = ""; } else if ('\n' != currSymb) { currStr += String(currSymb); } } } }У Вас проверка получения смс идет только в случае, если температура выше 30 градусов. вынесите код проверки получения смс за пределы if (t>=30){}
Хм. Странно. Я руководствовался такой логикой:
1. Если Т-ра больше 30, то шлем смс сами.
2. Если меньше, то проверяем наличие смс и если оно есть и со словом "Статус", то шлем текущую температуру.
И все это должно быть именно под If (t>30)...
Может я чего неправильно понимаю?
Если я не ошибаюсь, то с 57 строки по 112 это строки которые под if(t>30) заключены, поэтому - это отличается от Вашей логики, описанной только что. Если хотите совет - ставьте скобки либо так:
if(..) { .. } либо так: if(..) { .. }И старайтесь выдерживать уровни, у вас текст гуляет как попало. Если не ошибаюсь, Ctrl-F - делает выравнивание.
Иначе Вы постоянно будете в этом хаосе путаться.
Так что lexa217 Вам правильно говорит.
Извините, что встреваю. А каким шилдом пользуетесь? Посоветуйте новичку плз. Задача практически ваша.