Управление машинкой при помощи arduino и apc220

Тема в разделе "Arduino & Shields", создана пользователем Sergey991, 8 янв 2013.

  1. Sergey991

    Sergey991 Нерд

    Всем доброго времени суток.
    Вот заказал недавно arduino UNO и arduino nano w3 и ещё модули apc220 ну и ещё кое-какую мелочевку думал сделать аппаратуру для управления моделью дрифт кара.
    c apc220 проблем не возникло, с дискретным обменом данными тоже,а вот
    с управлением серв что-то не сложилось.
    вот пример кода для приёмника с управлением одной серво (изначально хотел 4=(()
    #include <Servo.h>
    int b=0;
    Servo servo;
    void setup()
    {
    servo.attach(6); // серво подключено к пину 6
    Serial.begin(9600); // скорость поледовательного порта
    }

    void loop() {
    b = Serial.read(); //читаем данные
    servo.write(b); //и поворачиваем серву на нужный угол
    delay(15);
    }
    вот для передатчика

    int potpin = 0; // потенцометр подключён к аналог. входу
    int val;
    void setup()
    {
    Serial.begin(9600); // скорость
    }
    void loop(){
    val = analogRead(potpin); // читаем значение
    Serial.print(val); //отправляем значение на приёмник
    }


    Серва тупо дёргается и всё! помогите плизззз.
     
  2. Sergey991

    Sergey991 Нерд

    вот пример на арс220 http://dvrobot.ru/apc_220 у меня работает....
    а серва нифига =()
     
  3. Sergey991

    Sergey991 Нерд

    вот что ещё нарылл тоже чёт не пашет...
    #include <Servo.h> // включаем библиотеку Серво

    Servo myservo; // вводим myservo
    Servo myservo2; // вводим myservo2

    int val = 0; // variable to store the data from the serial port

    void setup()
    {
    myservo.attach(9); //присваиваем myservo 9-й пин
    myservo2.attach(10); //присваиваем myservo2 10-й пин
    Serial.begin(9600); // connect to the serial port
    }

    void loop ()
    {
    if (Serial.available() > 1)
    {
    byte a,b,c;
    a = Serial.read();
    b = Serial.read();
    c = Serial.read();
    if(a=='S')//управляем сервами
    {
    if(b==0) myservo.write(c);
    if(b==1) myservo2.write(c);
    }
    }
    }

    тоесть пишем в сериал монитор вот ето S090, где S включаем сервы 0 номер сервы 90 градус на который нужно повернуть но тоже по чемуто не пашет!
     
  4. nailxx

    nailxx Официальный Нерд Администратор

    Какая у вас серва, к каким пинам её подключаете и от чего питаете? Возможно просто просаживается питание.

    Когда серва дёргается, гляньте на светодиоды L и ON. Если L мигает, а ON подзатухает — это то самое.
     
  5. Sergey991

    Sergey991 Нерд

    серва подключена к шестому пину... питаю всю ардуино от никель-металгидридной батареи. с светодиодами всё норм, они затухали когда я питал ардуину от юсб. пробовол писать ужасный скетч, где высчитывал каждый градус из 180, с шагом 5 градусов - все символы клавы на ето кинул... всё работает, но ето не дело, чтобы одна серва всего работала..
    Если можеш напиши плиз прогу для приёмника и передатчика для 3 - х серв.. я ведь нуб ^_^ . .... пятые сутки сижу с етой ардуиной.... родители уже раз 100 пожалели что её подарили ^_^
     
  6. Sergey991

    Sergey991 Нерд

    пытался использовать Firmate: с ползунком всё норм управляется даже через мои apc220...
    но не от другой ардуины, а от компа..:confused:
     
  7. Sergey991

    Sergey991 Нерд

    тишина....
     
  8. Unixon

    Unixon Оракул Модератор

    Код (Text):
    if (Serial.available() > 1)
    {
    byte a,b,c;
    a = Serial.read();
    b = Serial.read();
    c = Serial.read();
    if(a=='S')//управляем сервами
    {
    if(b==0) myservo.write(c);
    if(b==1) myservo2.write(c);
    }
    Так не совсем корректно делать. Вы проверяете наличие не менее 2-х байт, а потом тут же считываете три. Либо запрашивайте нужное количество, либо вычитывайте их по одному. При этом, если где-то произошло смещение и управляющий символ 'S' попал в переменные b или c, то программа может никогда не получить правильную последовательность. Что и как вы посылаете в порт?
     
  9. Sergey991

    Sergey991 Нерд

    да я сам не знаю нашел эту прогу в нете, а сам не разобрался...
    посмотри плиз проги в первом посте... в чём там может быть проблема?
     
  10. Unixon

    Unixon Оракул Модератор

    Вы отправляете число как строку, а считываете как коды символов этой строки, а не как исходное число.
     
  11. Sergey991

    Sergey991 Нерд

    а каким оператором слать и принимать тогда???
     
  12. Sergey991

    Sergey991 Нерд

    Serial.printl(b); так что ли?
     
  13. Sergey991

    Sergey991 Нерд

    кажись разобрался... вот примеры скетчей. управление грубое, но всё-же.
    Вот для передатчика.
    Код (Text):
    int potpin = 0; // потенцометр подключён к аналог. входу
    int Buffer;
      void setup()
    {
    Serial.begin(9600); // скорость
    }
    void loop(){
      Buffer = analogRead(potpin); // читаем значение
      Buffer = map(Buffer, 300, 715, 1, 9);
      Serial.println(Buffer); //отправляем значение на приёмник
      delay(10);
     
    }
    Вот для приёмника.
    Код (Text):
    #include <Servo.h>
    int val;
    Servo  servo;
    void setup()
    {
      servo.attach(3); // серво подключено к пину 3
      Serial.begin(9600); // скорость поледовательного порта
    }
     
    void loop() {
      if(Serial.available()>0) {
      val = Serial.read(); //читаем данные
      //servo.write(Buffer);  //и поворачиваем серву на нужный угол        
      // delay(15);
      if (val=='1') servo.write(20);
      if (val=='2') servo.write(40);
      if (val=='3') servo.write(60);
      if (val=='4') servo.write(80);
      if (val=='5') servo.write(100);
      if (val=='6') servo.write(120);
      if (val=='7') servo.write(140);
      if (val=='8') servo.write(160);
      if (val=='9') servo.write(180);
      }
    }
     
     
  14. Sergey991

    Sergey991 Нерд

    Всем снова привет... вот по аналогии написал программу для четырёх серв, но ардуина жутко глючит насколько я понимаю из за постоянного и очень быстрого прихода данных.
    Помогите плиз вот с такой задачей: нужно сделать так, чтобы если значения, читаемые с патенцометров неменяются то ардуина ничего непередаёт, а если вдруг поменялось, то надо отправить одно значение и ожидать следуещего изменения..... Сам я недопру помогите пожалуйста..
     
  15. Sergey991

    Sergey991 Нерд

    и сново тихо....
     
  16. Lizard_2k1

    Lizard_2k1 Нерд

    Код (Text):
    #include <Servo.h>
    int val;
    int prevVal;
    Servo  servo;
    void setup()
    {
      servo.attach(3); // серво подключено к пину 3
      Serial.begin(9600); // скорость поледовательного порта
      prevVal = 0; // инициируем переменную
    }
     
    void loop() {
      if(Serial.available()>0) {
        val = Serial.read(); //читаем данные
        //servo.write(Buffer);  //и поворачиваем серву на нужный угол  
        // delay(15);
        if (val == prevVal) {
          return; // ничего не изменилось, ничего не делаем
        }
        prevVal = val; // сохраняем новое значение
        // далее по тексту...
        if (val=='x') servo.write(y);
      }
    }
     
    Sergey991 нравится это.
  17. Sergey991

    Sergey991 Нерд

    спасибо вроде разобрался. но сразу ещё вопрос всплыл вот у меня есть модуль GY80 http://www.dvrobot.ru/shop/i267.Modul_GY-80_Akse-Giro-Kompa-Barometr.htm
    с программированием разобрался там примеры есть^_^ а вот к каким пинам подключать модуль я недопер.. ткните пальцем плиз...
     
  18. Lizard_2k1

    Lizard_2k1 Нерд

    может это поможет? http://forumdvrobot.ru/forum/2-38-1
     
    Sergey991 нравится это.
  19. Sergey991

    Sergey991 Нерд

    спасибо лови спасибку.....