arduino, servo, монитор порта, php

rokka.max
Offline
Зарегистрирован: 07.08.2012

 Проект хотелось бы через php управлять сервоприводами

скрипт ПХП

	<?
$fp =fopen("com3", "w");
fwrite($fp, chr(1));
fclose($fp);
?>

скетч

#include <Servo.h> 
Servo myservo1; // 1 сервопривод
Servo myservo2; // 2 сервопривод
int resultInt; // переменная которая будет приходить из вне
int x; // переменная котороя будет хранить положения 1 сервопривода
int y; // переменная котороя будет хранить положения 2 сервопривода
void setup(){
  myservo1.attach(9); 
  myservo2.attach(10); 
  Serial.begin(9600);
}
void loop() {
  if (Serial.available()>0) { 
    resultInt = serReadInt(); 
    Serial.println(resultInt); 
    x=myservo1.read();
    y=myservo2.read();
      }
    switch (resultInt) {
    case 1: myservo1.write(x+=20); break;
    case 2: myservo1.write(x-=20); break;
    case 49: myservo2.write(y+=20); break;
    case 50: myservo2.write(y-=20); break;
    }
  delay(1000);
}
int serReadInt()
{
  int i, serAva;
  char inputBytes [7]; // массив для хранения байтов
  char * inputBytesPtr = &inputBytes[0]; // указатель на первый элемент массива

  if (Serial.available()>0) // проверяем есть ли данные
 {
    delay(7);//чутка ждем, чтобы все данные прошли
    serAva = Serial.available(); // получаем количество доступных байт
    
    for (i=0; i<serAva; i++) // загружаем байты в массив
      inputBytes[i] = Serial.read();

    inputBytes[i] = '\0'; // дописываем NULL в конец массива
    
    return atoi(inputBytesPtr); // Вызываем atoi функцию, стандартная функция С
   
  }
  else
    return -1; // Возвращаем -1, если ничего не получили
    
}

Через монитор порта когда отправляешь данные приводы крутятся как надо, но через php не хотят...

Подскажи те добрые люди что делать?

 

rokka.max
Offline
Зарегистрирован: 07.08.2012

 Извиняюсь скинул код без проверки, есть ошибка

вот рабочий 

#include <Servo.h> 
Servo myservo1; // 1 сервопривод
Servo myservo2; // 2 сервопривод
int resultInt; // переменная которая будет приходить из вне
int x; // переменная котороя будет хранить положения 1 сервопривода
int y; // переменная котороя будет хранить положения 2 сервопривода
void setup(){
  myservo1.attach(9); 
  myservo2.attach(10); 
  Serial.begin(9600);
}
void loop() {
  if (Serial.available()>0) { 
    resultInt = serReadInt(); 
    Serial.println(resultInt); 
    x=myservo1.read();
    y=myservo2.read();
      
    switch (resultInt) {
    case 1: myservo1.write(x+=20); break;
    case 2: myservo1.write(x-=20); break;
    case 49: myservo2.write(y+=20); break;
    case 50: myservo2.write(y-=20); break;
    }
  delay(1000);
}}
int serReadInt()
{
  int i, serAva;
  char inputBytes [7]; // массив для хранения байтов
  char * inputBytesPtr = &inputBytes[0]; // указатель на первый элемент массива

  if (Serial.available()>0) // проверяем есть ли данные
 {
    delay(7);//чутка ждем, чтобы все данные прошли
    serAva = Serial.available(); // получаем количество доступных байт
    
    for (i=0; i<serAva; i++) // загружаем байты в массив
      inputBytes[i] = Serial.read();
    inputBytes[i] = '\0'; // дописываем NULL в конец массива
    return atoi(inputBytesPtr); // Вызываем atoi функцию, стандартная функция С
  }
  else
    return -1; // Возвращаем -1, если ничего не получили
    
}

 

 

 

rokka.max
Offline
Зарегистрирован: 07.08.2012

 Извиняюсь еще раз, разобрался только нужна не большая подсказка...

4 файла php каждый посылает цифру от 1 до 4

	<?
$fp =fopen("com3", "w");
fwrite($fp, 1);
fclose($fp);
?>

	<?
$fp =fopen("com3", "w");
fwrite($fp, 2);
fclose($fp);
?>

	<?
$fp =fopen("com3", "w");
fwrite($fp, 3);
fclose($fp);
?>

	<?
$fp =fopen("com3", "w");
fwrite($fp, 4);
fclose($fp);
?>

Arduino ловит их и обрабатывает

1, 2 - вперед назад первый сервопривод

2, 3 - вперед назад второй сервопривод

#include <Servo.h> 
Servo myservo1; // 1 сервопривод
Servo myservo2; // 2 сервопривод
int resultInt; // переменная которая будет хранить команду из PHP
int x; // переменная котороя будет хранить положения 1 сервопривода
int y; // переменная котороя будет хранить положения 2 сервопривода
int z;
void setup(){
  myservo1.attach(9); 
  myservo2.attach(10); 
  Serial.begin(9600);
}
void loop() {
  if (Serial.available()>0) {
   delay(7); 
    resultInt = serReadInt();
    Serial.println(resultInt);
    z=char(resultInt);
    Serial.println(resultInt);
    x=myservo1.read();
    y=myservo2.read();
      
    switch (resultInt) {
    case 1: myservo1.write(x+=20); break;
    case 2: myservo1.write(x-=20); break;
    case 3: myservo2.write(y+=20); break;
    case 4: myservo2.write(y-=20); break;
    }
  delay(1000);
}}
int serReadInt()
{
  int i, serAva;
  char inputBytes [7]; // массив для хранения байтов
  char * inputBytesPtr = &inputBytes[0]; // указатель на первый элемент массива

  if (Serial.available()>0) // проверяем есть ли данные
 {
    delay(7);//чутка ждем, чтобы все данные прошли
    serAva = Serial.available(); // получаем количество доступных байт
    
    for (i=0; i<serAva; i++) // загружаем байты в массив
      inputBytes[i] = Serial.read();
    inputBytes[i] = '\0'; // дописываем NULL в конец массива
    return atoi(inputBytesPtr); // Вызываем atoi функцию, стандартная функция С
  }
  else
    return -1; // Возвращаем -1, если ничего не получили
    
}

Все работает но, в коде есть не нужные строчки которые ни как не трогают логику, если их убрать сервы не двигаются((

почему так ?

Вот эти строчки не нужны так же как и описанная переменная Z

    Serial.println(resultInt);
    z=char(resultInt);
    Serial.println(resultInt);