Помогите с кодом на Arduino mega 2560

palagnyukvovan
Offline
Зарегистрирован: 12.11.2013

Помогите с кодом на Arduino mega 2560

Хотельсь бы реализовать управление роботом по Wi FI.

Управление едет через роутер WR702N, теперь надо разобратся с дуиной.

Прошу вашей помощи......

Есьть код под Arduino Mini Pro :

int led = 13;
boolean laight = 0;
int incomingByte = 0;
int action = 0;

void setup() {
  Serial.begin(115200);
 
  pinMode(13, OUTPUT);
  pinMode(4, OUTPUT); //light
  pinMode(5, OUTPUT); // шим 1
  pinMode(6, OUTPUT); // шим 2
  pinMode(7, OUTPUT); // 11
  pinMode(8, OUTPUT); // 12
  pinMode(11, OUTPUT); // 21
  pinMode(12, OUTPUT); // 22
}

void loop() {
 
  //Serial.print("1");
 
  if (Serial.available() > 0) {  //если есть доступные данные// считываем байт
        incomingByte = Serial.read();
        // отсылаем то, что получили
        digitalWrite(13, HIGH);
        
        if(incomingByte == 97) // A
          action = 7;
        if(incomingByte == 100) // D
          action = 8;
        if(incomingByte == 115) // S
          action = 11;
        if(incomingByte == 119) // W
          action = 12;
        if(incomingByte == 108) // L
          laight=!laight;  
                                  
        digitalWrite(4, laight);
                   
        //analogWrite(8, 255);
        //analogWrite(9, 255);
               
        digitalWrite(5, HIGH);
        digitalWrite(6, HIGH);
               
        digitalWrite(action, HIGH);
        delay(250);
        digitalWrite(action, LOW);
        
        action = 0;
        
        digitalWrite(5, LOW);
        digitalWrite(6, LOW);
        
        digitalWrite(13, LOW);
                          
        Serial.print("250: ");
        Serial.println(incomingByte, DEC);
    }
               
}
Подключаю дуину к L298N.
Зашивал етот код в Arduino mega 2560, - шим работает а 7. 8. 11. 12. нет. помогите.

и еще хотелось бы добавить управление серво - камерой и прочие.

Прошу вашей помощи...

com
Offline
Зарегистрирован: 06.09.2013

а что такое 7.8.11.12 ?

palagnyukvovan
Offline
Зарегистрирован: 12.11.2013

com пишет:

а что такое 7.8.11.12 ?

Выводы на дуине...   Arduino mega 2560

pinMode(7, OUTPUT); // 11
  pinMode(8, OUTPUT); // 12
  pinMode(11, OUTPUT); // 21
  pinMode(12, OUTPUT); // 22

com
Offline
Зарегистрирован: 06.09.2013

palagnyukvovan пишет:

com пишет:

а что такое 7.8.11.12 ?

Выводы на дуине... 

да это-то очевидно.....

я наверно слишком тонко намекал про отсутствие телепатических способностей, и намеки остались непонятны. к черту экивоки, спрашиваю в лоб : что подключено к этим ногам и почему вы решили, что "оно не работает"? digitalWrite(action, HIGH), контроллер должен подать на вывод 5 вольт. он это делает? если да, то какие к нему претензии? если нет, то значит брак, меняйте контроллер или пробуйте на других выводах

вы код сами писали?

      incomingByte = Serial.read();
        // отсылаем то, что получили
        digitalWrite(13, HIGH);

это не то, что вы написали


  pinMode(5, OUTPUT); // шим 1
  pinMode(6, OUTPUT); // шим 2
...
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);

это не шим

palagnyukvovan
Offline
Зарегистрирован: 12.11.2013

Вот тут нашол проект, есть код но надо переделать под мой. WI FI

com пишет:

palagnyukvovan пишет:

com пишет:

а что такое 7.8.11.12 ?

Выводы на дуине... 

да это-то очевидно.....

я наверно слишком тонко намекал про отсутствие телепатических способностей, и намеки остались непонятны. к черту экивоки, спрашиваю в лоб : что подключено к этим ногам и почему вы решили, что "оно не работает"? digitalWrite(action, HIGH), контроллер должен подать на вывод 5 вольт. он это делает? если да, то какие к нему претензии? если нет, то значит брак, меняйте контроллер или пробуйте на других выводах

вы код сами писали?

      incomingByte = Serial.read();
        // отсылаем то, что получили
        digitalWrite(13, HIGH);

это не то, что вы написали


  pinMode(5, OUTPUT); // шим 1
  pinMode(6, OUTPUT); // шим 2
...
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);

это не шим

palagnyukvovan
Offline
Зарегистрирован: 12.11.2013

Код писал не я...

Вот тут нашол проект, есть код но надо переделать под мой. WI FI

http://cxem.net/uprav/uprav46.php

#include "EEPROM.h"
 
#define D1 2          // направление вращение двигателя 1
#define M1 3          // ШИМ вывод для управления двигателем 1 (левый)
#define D2 4          // направление вращение двигателя 2
#define M2 5          // направление вращение двигателя 2  (правый)
#define HORN 13       // доп. канал 1 подключен к 13 пину
//#define autoOFF 2500  // кол-во миллисекунд через которое робот останавливается при потери связи
 
#define cmdL 'L'      // команда UART для левого двигателя
#define cmdR 'R'      // команда UART для правого двигателя
#define cmdH 'H'      // команда UART для доп. канала 1 (к примеру сигнал Horn)
#define cmdF 'F'      // команда UART для работы с EEPROM памятью МК для хранения настроек
#define cmdr 'r'      // команда UART для работы с EEPROM памятью МК для хранения настроек (чтение)
#define cmdw 'w'      // команда UART для работы с EEPROM памятью МК для хранения настроек (запись)
 
char incomingByte;    // входящие данные
 
char L_Data[4];       // строковый массив для данных левого мотора L
byte L_index = 0;     // индекс массива
char R_Data[4];       // строковый массив для данных правого мотора R
byte R_index = 0;     // индекс массива
char H_Data[1];       // строковый массив для доп. канала
byte H_index = 0;     // индекс массива H
char F_Data[8];       // строковый массив данных для работы с EEPROM
byte F_index = 0;     // индекс массива F
char command;         // команда: передача координат R, L или конец строки
 
unsigned long currentTime, lastTimeCommand, autoOFF;
 
void setup() {
  Serial.begin(9600);       // инициализация порта
  pinMode(HORN, OUTPUT);    // дополнительный канал
  pinMode(D1, OUTPUT);      // выход для задания направления вращения двигателя
  pinMode(D2, OUTPUT);      // выход для задания направления вращения двигателя
  /*EEPROM.write(0,255);
  EEPROM.write(1,255);
  EEPROM.write(2,255);
  EEPROM.write(3,255);*/
  timer_init();             // инициализируем программный таймер
}
 
void timer_init() {
  uint8_t sw_autoOFF = EEPROM.read(0);   // считываем с EEPROM параметр "включена ли ф-ия остановки машинки при потере связи"
  if(sw_autoOFF == '1'){                 // если таймер останова включен
    char var_Data[3];
    var_Data[0] = EEPROM.read(1);
    var_Data[1] = EEPROM.read(2);
    var_Data[2] = EEPROM.read(3);
    autoOFF = atoi(var_Data)*100;        // переменная автовыкл. для хранения кол-ва мс
  }
  else if(sw_autoOFF == '0'){        
    autoOFF = 999999;
  }
  else if(sw_autoOFF == 255){
    autoOFF = 2500;                      // если в EEPROM ничего не записано, то по умолчанию 2.5 сек
  }
  currentTime = millis();                // считываем время, прошедшее с момента запуска программы
}
 
void loop() {
  if (Serial.available() > 0) {          // если пришли UART данные
    incomingByte = Serial.read();        // считываем байт
    if(incomingByte == cmdL) {           // если пришли данные для мотора L
      command = cmdL;                    // текущая команда
      memset(L_Data,0,sizeof(L_Data));   // очистка массива
      L_index = 0;                       // сброс индекса массива
    }
    else if(incomingByte == cmdR) {      // если пришли данные для мотора R
      command = cmdR;
      memset(R_Data,0,sizeof(R_Data));
      R_index = 0;
    }
    else if(incomingByte == cmdH) {      // если пришли данные для доп. канала 1
      command = cmdH;
      memset(H_Data,0,sizeof(H_Data));
      H_index = 0;
    }   
    else if(incomingByte == cmdF) {      // если пришли данные для работы с памятью
      command = cmdF;
      memset(F_Data,0,sizeof(F_Data));
      F_index = 0;
    }
    else if(incomingByte == '\r') command = 'e';   // конец строки
    else if(incomingByte == '\t') command = 't';   // конец строки для команд работы с памятью
    
    if(command == cmdL && incomingByte != cmdL){
      L_Data[L_index] = incomingByte;              // сохраняем каждый принятый байт в массив
      L_index++;                                   // увеличиваем текущий индекс массива
    }
    else if(command == cmdR && incomingByte != cmdR){
      R_Data[R_index] = incomingByte;
      R_index++;
    }
    else if(command == cmdH && incomingByte != cmdH){
      H_Data[H_index] = incomingByte;
      H_index++;
    }   
    else if(command == cmdF && incomingByte != cmdF){
      F_Data[F_index] = incomingByte;
      F_index++;
    }   
    else if(command == 'e'){                       // если приняли конец строки
      Control4WD(atoi(L_Data),atoi(R_Data),atoi(H_Data));
      delay(10);
    }
    else if(command == 't'){                       // если приняли конец строки для работы с памятью
      Flash_Op(F_Data[0],F_Data[1],F_Data[2],F_Data[3],F_Data[4]);
    }
    lastTimeCommand = millis();                    // считываем текущее время, прошедшее с момента запуска программы
  }
  if(millis() >= (lastTimeCommand + autoOFF)){     // сравниваем текущий таймер с переменной lastTimeCommand + autoOFF
    Control4WD(0,0,0);                             // останавливаем машинку
  }
}
 
void Control4WD(int mLeft, int mRight, uint8_t Horn){
 
  bool directionL, directionR;      // направление вращение для L298N
  byte valueL, valueR;              // значение ШИМ M1, M2 (0-255)
  
  if(mLeft > 0){
    valueL = mLeft;
    directionL = 0;
  }
  else if(mLeft < 0){
    valueL = 255 - abs(mLeft);
    directionL = 1;
  }
  else {
    directionL = 0;
    valueL = 0;
  }
 
  if(mRight > 0){
    valueR = mRight;
    directionR = 0;
  }
  else if(mRight < 0){
    valueR = 255 - abs(mRight);
    directionR = 1;
  }
  else {
    directionR = 0;
    valueR = 0;
  }
   
  analogWrite(M1, valueL);            // задаем скорость вращения для L
  analogWrite(M2, valueR);            // задаем скорость вращения для R
  digitalWrite(D1, directionL);       // задаем направление вращения для L
  digitalWrite(D2, directionR);       // задаем направление вращения для R
  
  digitalWrite(HORN, Horn);           // дополнительный канал
}
 
void Flash_Op(char FCMD, uint8_t z1, uint8_t z2, uint8_t z3, uint8_t z4){
 
  if(FCMD == cmdr){           // если команда чтения EEPROM данных
    Serial.print("FData:");       // посылаем данные с EEPROM
    Serial.write(EEPROM.read(0));     // считываем значение ячейки памяти с 0 адресом и выводим в UART
    Serial.write(EEPROM.read(1));
    Serial.write(EEPROM.read(2));
    Serial.write(EEPROM.read(3));
    Serial.print("\r\n");         // маркер конца передачи EEPROM данных
  }
  else if(FCMD == cmdw){          // если команда записи EEPROM данных
    EEPROM.write(0,z1);               // запись z1 в ячейку памяти с адресом 0
    EEPROM.write(1,z2);
    EEPROM.write(2,z3);
    EEPROM.write(3,z4);
    timer_init();             // переинициализируем таймер
    Serial.print("FWOK\r\n");         // посылаем сообщение, что данные успешно записаны
  }
}
 
Заливал в свою дуину но не работает...

 

palagnyukvovan
Offline
Зарегистрирован: 12.11.2013
com
Offline
Зарегистрирован: 06.09.2013

palagnyukvovan пишет:

Вот тут нашол проект, есть код но надо переделать под мой. WI FI

стоп-стоп, не так быстро

погодите минутку, мы пока определимся, кто именно будет ваш код переделывать, а то желающих-то полно, прямо рвут друг у друга. того и гляди подерутся. придется наверно жребий бросать.

не каждый день ведь такое счастье приваливает, да еще и даром....

palagnyukvovan
Offline
Зарегистрирован: 12.11.2013

Я особо в програмировании не разбираюсь.

Вот набросал скетч ля управление  ботом, гляньте плиз....  может что упростить, переделать.

Управление камарой надо както сгладить.Что поворот бил плавний ане сразу с 90 га 180градусав.

Скетч:

  #include <Servo.h>
   Servo servo1;
   Servo servo2;
   const int SERVO1_PIN = 8;
   const int SERVO2_PIN = 9;
   const int MAX_POS = 1023;
   const int MAX_ANGLE = 180;
 
   int incomingByte;
    void setup()
 {
  servo1.attach(SERVO1_PIN);
  servo2.attach(SERVO2_PIN);
 
                    
    pinMode(2, OUTPUT);
    pinMode(3, OUTPUT);
    pinMode(4, OUTPUT);
    pinMode(5, OUTPUT);
    pinMode(6, OUTPUT);
    pinMode(7, OUTPUT);
    Serial.begin(115200);
    }

    void loop()                     
    {
    if (Serial.available() > 0) {
        incomingByte = Serial.read();
      // Установка серво 1 в среднее положение
      if (incomingByte == '5') {
      servo1.write(90);
     }
     // Установка серво 2 в среднее положение
      if (incomingByte == '5') {
      servo2.write(90);
     }  
      // При нажатой 8 повернуть серво 1 на 180 и при отсуствии возвратить в середину  
      if (incomingByte == '8') {
      servo1.write(180);
      delay(150);
      servo1.write(90);
     }  
      // При нажатой 2 повернуть серво 1 на 10 и при отсуствии возвратить в середину
      if (incomingByte == '2') {
      servo1.write(10);
      delay(150);
      servo1.write(90);
     }
      // При нажатой 4 повернуть серво 2 на 180 и при отсуствии возвратить в середину     
     if (incomingByte == '4') {
      servo2.write(180);
      delay(150);
      servo2.write(90);
     }  
      // При нажатой 6 повернуть серво 2 на 10 и при отсуствии возвратить в середину
      if (incomingByte == '6') {
      servo2.write(10);
      delay(150);
      servo2.write(90);
     }
    // При нажатой 7 повернуть серво 1 на 180 и при отсуствии возвратить в середину
    // При нажатой 7 повернуть серво 2 на 180 и при отсуствии возвратить в середину  
      if (incomingByte == '7') {
      servo1.write(180);
      servo2.write(180);
      delay(150);
      servo1.write(90);
      servo2.write(90);
      }
     // При нажатой 9 повернуть серво 1 на 180 и при отсуствии возвратить в середину
    // При нажатой 9 повернуть серво 2 на 10 и при отсуствии возвратить в середину  
      if (incomingByte == '9') {
      servo1.write(180);
      servo2.write(10);
      delay(150);
      servo1.write(90);
      servo2.write(90);
      }
      // При нажатой 1 повернуть серво 1 на 10 и при отсуствии возвратить в середину
    // При нажатой 1 повернуть серво 2 на 180 и при отсуствии возвратить в середину
     if (incomingByte == '1') {
      servo1.write(10);
      servo2.write(180);
      delay(150);
      servo1.write(90);
      servo2.write(90);
      }
     // При нажатой 3 повернуть серво 1 на 10 и при отсуствии возвратить в середину
    // При нажатой 3 повернуть серво 2 на 10 и при отсуствии возвратить в середину
      if (incomingByte == '3') {
      servo1.write(10);
      servo2.write(10);
      delay(150);
      servo1.write(90);
      servo2.write(90);
      }
      // При нажатой Q двигатся влево передним ходом
   if (incomingByte == 'Q') {
      digitalWrite(2, HIGH);
      digitalWrite(5, HIGH);
      delay(120);
      digitalWrite(2, LOW);
      digitalWrite(5, LOW);
     }
    // При нажатой W двигатся вперед
   if (incomingByte == 'W') {
      digitalWrite(2, HIGH);
      digitalWrite(3, HIGH);
      delay(120);
      digitalWrite(2, LOW);
      digitalWrite(3, LOW);   
    }
    // При нажатой E двигатся вправопередним ходом
    if (incomingByte == 'E') {
      digitalWrite(3, HIGH);
      digitalWrite(4, HIGH);
      delay(120);
      digitalWrite(3, LOW);
      digitalWrite(4, LOW);
    }
    // При нажатой A двигатся влево задним ходом
    if (incomingByte == 'A') {
      digitalWrite(4, HIGH);
      digitalWrite(3, HIGH);
      delay(120);
      digitalWrite(4, LOW);
      digitalWrite(3, LOW);
    }
    // При нажатой S двигатся назад
    if (incomingByte == 'S') {
      digitalWrite(4, HIGH);
      digitalWrite(5, HIGH);
      delay(120);
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);
    }
    // При нажатой D двигатся вправо задним ходом
    if (incomingByte == 'D') {
      digitalWrite(5, HIGH);
      digitalWrite(2, HIGH);
      delay(120);
      digitalWrite(5, LOW);
      digitalWrite(2, LOW);
    }
    // При нажатой R посигналить
    if (incomingByte == 'R') {
      digitalWrite(6, HIGH);
      delay(120);
      digitalWrite(6, LOW);
    }
    // При нажатой F включить фари
    if (incomingByte == 'F') {
      digitalWrite(7, HIGH);
    }
    // При нажатой G виключить фари
    if (incomingByte == 'G') {
      digitalWrite(7, LOW);
    }
    }
    }
    

Жду вашых советов.

Спасибо!

 

palagnyukvovan
Offline
Зарегистрирован: 12.11.2013

Помогите...

Пожалуйста...

Чтобы плавно управлять камерой.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012
sva1509
Offline
Зарегистрирован: 07.12.2012

Для плавного поворота нужен цикл. Пример:

if (incomingByte == '3') {
   for (uint8_t i1 = 10; i1<90; i1++) {
        servo1.write(i1);
        servo2.write(i1);
        delay(100);
   }
}

А вообще прежде чем что либо спросить необходимо дать схему устройства, схему подключения к контроллеру, код и только после задавать вопрос. Вам выше правильно сказали digitalWrite(action, HIGH); подаст на ногу action 5Вольт, но правильно это или нет не известно.

palagnyukvovan
Offline
Зарегистрирован: 12.11.2013

sva1509 пишет:

Для плавного поворота нужен цикл. Пример:

if (incomingByte == '3') {
   for (uint8_t i1 = 10; i1<90; i1++) {
        servo1.write(i1);
        servo2.write(i1);
        delay(100);
   }
}

А вообще прежде чем что либо спросить необходимо дать схему устройства, схему подключения к контроллеру, код и только после задавать вопрос. Вам выше правильно сказали digitalWrite(action, HIGH); подаст на ногу action 5Вольт, но правильно это или нет не известно.

 

 

Значит с камерой разобрался.
Поворот медленный и плавный...

Вот:
int pos=90;
void loop()
{
if (Serial.available() > 0) {
incomingByte = Serial.read();

if (incomingByte == '5') {
pos = 90;
servo1.write(pos);
servo2.write(pos);
}
else if (incomingByte == '8') {
pos--;
servo1.write(pos);
}
else if (incomingByte == '2') {
pos++;
servo1.write(pos);
}
else if (incomingByte == '4') {
pos++;
servo2.write(pos);
}
else if (incomingByte == '6') {
pos--;
servo2.write(pos);
}
}
Подскажыта как реализовать ШИМ управление двигателями........ ? плавный старт...

pinMode(6, OUTPUT); // ШИМ
pinMode(7, OUTPUT); // ШИМ

pinMode(2, OUTPUT); // L298N пин 1
pinMode(3, OUTPUT); // L298N пин 2
pinMode(4, OUTPUT); // L298N пин 3
pinMode(5, OUTPUT); // L298N пин 4