машинка на ардуино

Тема в разделе "Arduino & Shields", создана пользователем Алексей Схоменко, 8 июн 2013.

  1. хочу собрать машинку управляемую с ик пульта. что касается механики то это я собрал в качестве рулевого механизма использовал серву. а вот программу написать не могу задумка такая при нажатии кнопки в перед серва ставила угол 90 а на транзистор подавался сигнал малого уровня потом нажав другую кнопку которая будет увеличивать сигнал на транзистор. и так 3 передачи а при повороте хотел чтоб серва выворачивалась на 45 или 135 а скорость при этом оставалась заданной а задний ход хотел сделать через рле чтоб сменить полярность на двигателе а задний ход был со стабильным сигналом шим чтоб его раз отрегулировал и все. и еще думал сделать. и свет включать хотелось бы) помогите написать программу. заранее спасибо! я не сильно шарю в программирование если не сложно то можно и подробные пояснения
     
  2. Mitrandir

    Mitrandir Гуру

    Шим с реле лучше не испольозовать, ибо реле выйдет из строя.
    Для управления моторами лучше использовать мотор шилд. он и скорость и направление может задавать по шим.
     
  3. Unixon

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

    Реле для изменения полярности ШИМ сигнала, а не для его усиления.
     
    Mitrandir нравится это.
  4. Mitrandir

    Mitrandir Гуру

    значит не так понял
     
  5. Recoshet

    Recoshet Нерд

    Вот тут посмотри, я всё подробно описал.

    P.S. только я не использовал сервы. Ну думаю там проблем с этим не будет)
     
  6. я чет не понял. можно по подробней объяснить программу
     
  7. Recoshet

    Recoshet Нерд

    Код (C):

    #include <IRremote.h>    //импорт библиотеки для ИК приёмника (устанавливается отдельно)

    int RECV_PIN = 26;        //пин подключения ИК приёмника
    IRrecv irrecv(RECV_PIN); //указываем библиотеке пин подключения ИК приёмника

    decode_results results;   // Какая то хрень для ИК приёмника (декодим коды, так как у нас ИК приёмник, а не ИК передатчик)

    //---------------------------------------------
    // указываю пины для управления двигателям

    int leftPin = 22;            //лева руля
    int rightPin = 24;         //права руля

    int goPin = 53;           //Вперёд!!!
    int nazadPin = 51;       //задний ход

    int gazPin = 7;           //Аналоговый пин для управления мощностью главного двигателя
    int power = 150;           //Значение мощности двигателя (до 255)

    int led1 = 30;             //Эт светодиод (Включить, выключить фары)

    char command = '0';   //Переменная для обработки команд через Serial соединение

    int rByte = 0;             //Переменная для алгоритма корректной работы serial содинения

    boolean stateSvet = LOW;    //Значение света (true включён false выключен. P.S. LOW==FALSE, HIGH==TRUE эт на заметку)

    //------------------------------------------------
    void setup()               //функция настройки, выполняется в самом начале 1 раз
    {
      //Устанавливаем выходы
      pinMode(leftPin, OUTPUT);
      pinMode(rightPin, OUTPUT);
      pinMode(goPin, OUTPUT);
      pinMode(nazadPin, OUTPUT);
      pinMode(gazPin, OUTPUT);
     
      pinMode(led1, OUTPUT);   //свет тоже выход))

      Serial.begin(9600);         // Открываем Serial соединение для обмена данными по USB
     
      irrecv.enableIRIn();        // Start the receiver */* для ик приёмника запуск режима приёма
    }

    //-------------------------------------------------
    // функия включения фар. Если выключены, включить, иначе выключить
    void svet()                    
    {
      if (stateSvet == LOW)
        stateSvet = HIGH;
      else
        stateSvet = LOW;
      digitalWrite(led1, stateSvet);
    }

    //Функция стоп мотор. Чтобы не подавать одновременно 2 сигнала на передний и задний ход. Ну и для остановки
    void sMotor()
    {
      digitalWrite(goPin, LOW);
      digitalWrite(nazadPin, LOW);
    }

    //Функция движения вперёд
    void go()
    {
      sMotor();     //сбрасываем все значения
      digitalWrite(goPin, HIGH); //подаём нужный сигнал
    //  digitalWrite(led1, HIGH);  //Когда то включался свет при движении вперёд
    }

    // Функция движения назад
    void nazad()
    {
      sMotor();
      digitalWrite(nazadPin, HIGH);
    //  digitalWrite(led1, LOW); //Свет выключить
    }


    //Функция стоп руля
    void sRul()
    {
      digitalWrite(leftPin, LOW);
      digitalWrite(rightPin, LOW);
    }

    //лева руля
    void leftRul()
    {
      sRul();                                //если до этого куда то поворачивали, то сбросить значение
      digitalWrite(leftPin, HIGH);  //и рулить на лево
    }

    void rightRul()
    {
      sRul();
      digitalWrite(rightPin, HIGH);
    }

    //Сценарий разворота влево beta test v0.00.0.0.001 :D
    void razvorotLeft()
    {
      rightRul();
      nazad();
      delay(500);
     
      leftRul();
      go();
      delay(700);
     
        rightRul();
      nazad();
      delay(100);

      sMotor();
      sRul();
    }

    //=========================================================+++++++++++++++++++++
    void loop()  //Ну а теперь понеслась

    //\\//\\//\\
    {/*  старый метод, теперь он интегрирован в алгоритм ниже
      if (irrecv.decode(&results))
      {
        Serial.println(results.value, HEX);
        irrecv.resume(); // Receive the next value
      }*/

    //\\//\\//\\
     
    if (rByte = Serial.available() != 0 || irrecv.decode(&results))  //Если есть данные переданные через USB serial или ИК датчик, то
    {
    command = Serial.read(); //читаем команду
    Serial.println(command); //отсылаем эту команду братно

        Serial.println(results.value, HEX);       //отсылаем код кнопки от ИК приёмника
        irrecv.resume();                                   // Receive the next value */* продолжаем работать с ИК приёмником

      if (command == '2' || results.value == 0xFF22DD) //Если была пришла по Serial COM порту цифра 2 или была нажата кнопка на пульте с кодом FF22DD, значит надо ехать вперёд
        go();
      else if (command == '3' || results.value == 0xFF12ED) //всё аналогично, команда, выполняем
        nazad();
      else if (command == '1' || results.value == 0xFF609F)
        sMotor();  
      else if (command == '5' || results.value == 0xFF32CD)
        leftRul();
      else if (command == '6' || results.value == 0xFF02FD)
        rightRul();
      if (command == '4' || results.value == 0xFF609F)
        sRul();
      else if (command == 'a')      //Запустить сценарий разворота
        razvorotLeft();
      else if (command == 's')      // Вкл\Выкл свет
        svet();
      if (command == 'z' || results.value == 0xFFB04F)      //Установка мощности двигателя 1ая скорость
        power = 100;
      else if (command == 'x' || results.value == 0xFF906F)  //Установка мощности двигателя 2ая скорость
        power = 200;
      else if (command == 'c' || results.value == 0xFFA05F)  //Максимальная скорость
        power = 255;
       
    analogWrite(gazPin, power);  //Установит значение мощности двигателя
    //а теперь повторим в бесконечно послушно слушаем команды и выполняем
    }

    }
    Есть вопросы ещё?