Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.11.2016, 15:56   #1
Jumper9691
Новичок
Джуниор
 
Регистрация: 12.04.2016
Сообщений: 1
По умолчанию PHP + Arduino Uno и COM-порт

Всем привет, возникла такая проблема:
Нужно сделать с виду простецкую штуку - аля "турникет", суть в которой: оператор нажимает на кнопочку на сайте, ардуинка подхватывает и поворачивает серво-привод на 90 градусов, ждет 2 секунды и возвращает его обратно. Конкретно проблема - не могу передать значения (всего лишь цифру 1) с php-скрипта через COM-порт. Вернее они передаются, но ардуинка отказывается адекватно принимать их. Сначала она только двигала серво на 90 градусов, и отказывалась его возвращать, а после некоторых правок вообще ничего не делает. Для общения через COM использую библиотеку php_serial.class
Код скрипта
Код:
if (isset($_GET['test'])) {
$serial = new phpSerial;
$serial->deviceSet("COM4"); //com порт модема
$serial->confBaudRate(9600);
$serial->confCharacterLength(8);
$serial->confParity("none");
$serial->confStopBits(1);
$serial->confFlowControl("xon/xoff");
$serial->deviceOpen();
$serial->sendMessage(intval(1));
$serial->deviceClose();*/
}
Скетч ардуинки
Код:
#include <Servo.h>
int command;
Servo servo;
void openT() {
  servo.write(90); 
}
void closeT() {
  servo.write(180);
}
void setup() {
  Serial.begin(9600); 
  servo.attach(9);
  servo.write(180);
}
void loop()
{
 if(Serial.available()>0){
    command = Serial.parseInt();
    switch (command){
    case 0:
        closeT();
        break;
    case 1:
        openT(); 
        delay(2000);
        closeT();
        break;
    }
  }   
}
Jumper9691 вне форума Ответить с цитированием
Старый 06.11.2016, 18:27   #2
kutani
Форумчанин
 
Регистрация: 23.01.2016
Сообщений: 608
По умолчанию

1- в цикл проверки данных в буфере задержки пихать не следует.
2- delay() лучше заменить на проверку через millis().
3- чего реально шлет скрипт - можно проверить снифером (portmon например, wireshark например), может он в пакет пихает нечитаемые символы.

Код:
#include <Servo.h>
Servo servo;
int command;
int tmp=1;

void openT() {
  servo.write(90); 
}

void closeT() {
  servo.write(180);
}

 
void setup() { 
  Serial.begin(9600);
  Serial.setTimeout(5);

  servo.attach(9);
  closeT();
}


void loop()
{
  if (Serial.available() > 0) { // обработчик при наличии данных в буфере UART
      command = Serial.parseInt();
      Serial.print(command); // контроль себя
  }
  

  // если предыдущее значение <> новому
  if (command!= tmp){          

     if (command==0) {
      closeT();
     } 

     if (command==1) {
      openT();
      delay(2000);
      closeT();
     } 

     tmp = command; // запоминаем новое для последующего сравнения
  }
}
kutani вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
установил phpstorm, он занял порт 80, и не запускается openserver " Невозможно занять порт 80 поскольку он уже используется victorshkoda PHP 5 07.04.2016 10:04
код arduino kirex Фриланс 7 20.03.2014 17:24
Скетч Arduino -> C++ Skitalec Общие вопросы C/C++ 1 09.11.2012 19:36
Карточная игра UNO marales Помощь студентам 1 08.11.2012 11:00
php curl proxy порт gunsoy PHP 1 31.10.2012 18:42