Управление сервой через 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 отключается.
П
[/quote]
Дело не в коде, а нехватке питания.
Другими словами - попытайтесь запитатся не от USB, а от внешнего блока питания.
Запитался от внешнего блока 12В.Никаких изменнеий,разве что серва начала дергаться сильнее.
Потому что вы серву запитываете от дуины, а нужно запитать от отдельного источника, НО на серву можно давать небольше 6 вольт.
А точнее можно и от того же блока питания, но питание на серву нужно подавать через отдельный стабилизатор.
Запитал от отдельного источника серву 6В,дал общий минус. Дергается , но перестала выключаться GSM-Shield.
А что за источник на 6 вольт? Попробуйте так, если тоже дергается , то ваш источник питания не тянет и кстати, а что за серва?
Изменил код по Вашему совету. Изменений нет. Источник питания сервы-акумулятор 6В, 4,5Ah.
Серва маломощная - Hextronik HXT900. Эта серва работает и от USB питания на обычном скетче из базы примеров IDE 1.0.1
Надо было не изменять, а просто попробовать этот код. Серва у вас действительно маленькая, но вместе с GSM-шилдом может давать просадки, по этому от USB может не работать. Если она у вас дергается с этим кодом (не надо его менять просто копируйте и залейте), то либо у вас разряжен аккум, либо что-то с проводами, либо с сервой, либо вы что-то не так подключаете.
С Вашим кодом серва работает и c акумулятором и от USB.
А GSM-шилд при этом подключен?
GSM-шилд включен в разъем Уно ,но при нажатии кнопки "SIM900-POWER" пытается включиться , мигают индикаторы "STATUS" и "NET", а затем выключаетя. Серва же продолжает отрабатывать скетч.
Вопрос к топикстартеру и всем кто может помочь.
Вы своим кодом хотя бы светодиод смогли зажечь? Я совсем еще начинающий и играюсь с приемом смсок. Есть ощущение что Ваш код совершенно не рабочий в плане распарсенья данных с СОМ порта. Я им не то что серву, диод зажечь не могу. Это не критика, просто я совсем еще чайник и может что то не то делаю.
НЕ могли бы Вы обяснить, как именно у Вас идет "чтение" СМСки? Я все выходные сижу - понять не могу.
Зачем Вы используете АТ+IFC?
Почему Вы анализируете весь поток СОМ порта, а не ждете
+СМТ сначала?
Спасибо за ответы
Вот мой код (с частью Вашего кода)для отсылания СМС по превышению температурного порога и отправки СМС, по приему входящей СМС, запрашивающий статус. Отправка по превышению работает, остальное нет.
У Вас проверка получения смс идет только в случае, если температура выше 30 градусов. вынесите код проверки получения смс за пределы if (t>=30){}
Хм. Странно. Я руководствовался такой логикой:
1. Если Т-ра больше 30, то шлем смс сами.
2. Если меньше, то проверяем наличие смс и если оно есть и со словом "Статус", то шлем текущую температуру.
И все это должно быть именно под If (t>30)...
Может я чего неправильно понимаю?
Если я не ошибаюсь, то с 57 строки по 112 это строки которые под if(t>30) заключены, поэтому - это отличается от Вашей логики, описанной только что. Если хотите совет - ставьте скобки либо так:
И старайтесь выдерживать уровни, у вас текст гуляет как попало. Если не ошибаюсь, Ctrl-F - делает выравнивание.
Иначе Вы постоянно будете в этом хаосе путаться.
Так что lexa217 Вам правильно говорит.
Извините, что встреваю. А каким шилдом пользуетесь? Посоветуйте новичку плз. Задача практически ваша.