Нужен совет по ардуино и светодиодам

Тема в разделе "Arduino & Shields", создана пользователем vovchik001, 17 июн 2015.

  1. vovchik001

    vovchik001 Нерд

    А не подскажите, как в этот код встроить работу с сервоприводом, чтобы при получении из сериал порта цифры от 1 до 180 серва становилась на этот угол? Как подключить библиотеку я понял а дальше ступор. Заранее благодарен.
    Код:
    Код (Text):

    #include <Servo.h>
    Servo myservo;
    int val;
    int LED = 10;
    int LED1 = 11;
    void setup()
    {
    myservo.attach(9);
    Serial.begin(9600);
    pinMode(LED, OUTPUT);
    pinMode(LED1, OUTPUT);

    }
    void loop()
    {
    if (Serial.available())
    {
    val = Serial.read();

    // При символе "q" включаем светодиод
    if (val == 'Q')
    {
    digitalWrite(LED, HIGH);
    }

    // При символе "w" выключаем светодиод
    if ( val == 'W')
    {
    digitalWrite(LED, LOW);
    }

    if (val == 'E')
    {
    digitalWrite(LED1, HIGH);
    }

    if (val == 'R')
    {
    digitalWrite(LED1, LOW);
    }
    }
    }
     
     
    Последнее редактирование: 17 июн 2015
  2. Unixon

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

    Они и так должны гореть постоянно. Arduino часом не сбрасывается?
     
  3. vovchik001

    vovchik001 Нерд

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

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

    Тащите фотку, поглядим на подключения.
     
  5. vovchik001

    vovchik001 Нерд

    Благодарю, уже разобрался. Ардуино уходила в ребут по питанию... Блок все же оказался совсем преклонного возраста, заменил и все стало нормально.
     
  6. vovchik001

    vovchik001 Нерд

    А с сервоприводом подскажете?
     
  7. Megakoteyka

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

    Что именно?
     
  8. andriano

    andriano Нерд

    #include <Servo.h>
    Servo myservo; // в блоке переменных описываешь объект, которым будешь управлять

    void setup()
    {
    ...
    myservo.attach(5); // "прикрепляешь" объект myservo к 5-й ноге
    }

    управляешь:
    myservo.write(90); // поворачиваешь в центральное положение (угол поворота в градусах)

    Вот только в твоей программе пока считывается и анализируется только один символ, а если ты хочешь, чтобы диапазон был от 1 до 180, то нужно считывать от 1 до трех цифр. Тут есть два варианта:
    1. Посылаешь ВСЕГДА 3 цифры, т.е. ввод осуществляется с ведущими нулями: "001", "090", "180". Программа, обнаружив "0" или "1" довводит еще 2 символа и преобразует все три цифры в число, примерно так:

    Код (Text):

    // При цифре - читаем число полностью и поворачиваем сервопривод
    if ((val  >= '0' ) && (val <= '9'))
    {
    val -= '0';  // преобразуешь цифру в число
    if (Serial.available())  // ждешь вторую цифру
    {
    val = val*10 + (Serial.read() - '0');  // вводишь вторую цифру и пересчитываешь число
    if (Serial.available())
    {
    val = val*10 + (Serial.read() - '0');  // вводишь третью цифру и пересчитываешь число
    myservo.write(val);
    }
    }
    }
     
    2. Вводишь символ-ограничитель (например, точку), получаешь и разбираешь строку до этого символа:
    "1.", "90.", "180.".

    В любом случае видимая реакция наступает только после окончания ввода - всех трех цифр в первом случае и точки - во втором.

    PS. По-хорошему, надо бы еще проверять, что введены именно цифры, а не произвольные символы (не вычитать тупо из кода символа код нуля).
     
    Последнее редактирование: 18 июн 2015
  9. Megakoteyka

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

    3. Отправлять вместо символов 1 байт. Байт принимает значения от 0 до 255.
     
  10. andriano

    andriano Нерд

    А кто и куда отправляет символы?
    val - целое число.
     
  11. Megakoteyka

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

    В вашем примере val собирается из символов, которые приходят из порта. Вместо этого можно передавать сразу значение val в виде байта.
     
  12. andriano

    andriano Нерд

    Если Вы предлагаете посылать в serial байты вместо символов, такое решение не подходит: нельзя различить, когда Вы хотите зажечь светодиод символом 'Q' и когда вы хотите повернуть серво на угол ((byte)'Q') градусов, т.к. все управляющие светодиодом символы находятся в диапазоне кодов от 1 до 180.
     
  13. Megakoteyka

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

    Было бы желание.
    0..180 - серва, 181 и 182 - вкл/выкл первый светодиод, 183 и 184 - вкл/выкл второй светодиод.
    Но для управления таким способом удобнее не использовать монитор, а потратить 10 минут на написание программки-пульта.
     
  14. andriano

    andriano Нерд

    Ну да, вопрос только с какой стороны усложнять код - со стороны Arduino или со стороны PC.
    Как-то интуитивно кажется, что первое немного проще.
     
  15. Megakoteyka

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

    Первое проще, второе удобней. Управлять чем-либо при помощи монитора порта - то еще извращение. Гораздо удобней тыкать кнопки в окошке или жать клавиши на клавиатуре.