лёгкий вопрос

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем Arduinщик, 21 июн 2014.

  1. Arduinщик

    Arduinщик Нерд

  2. видимо надеть сверху
     
  3. Arduinщик

    Arduinщик Нерд

    второй вопрос как мне заставить серву поворачивать влево или вправо?
     
  4. ANV

    ANV Гуру

  5. ANV

    ANV Гуру

    А в названии шилда на мастерките по Вашей ссылке что написано?
     
  6. Arduinщик

    Arduinщик Нерд

    в каком смысле?
     
  7. Arduinщик

    Arduinщик Нерд

    какие показание у джостика? В том смысле что он же может двигаться вверх и вниз в право в лево.
     
  8. Arduinщик

    Arduinщик Нерд

    У меня есть две ардуинки и два
    nRF24L01+
    мне надо чтобы всё работало как в этом скетче (скетч этот на одну ардуинку) т.е. к одной ардуинке прикреплён передатчик и кнопка на другой передатчик и светодиод.
    кнопка нажата светодиод горит второй раз нажали светодиод не горит.




    #define BUTTON_PIN 2 // кнопка
    #define LAMP_PIN 5 // светодиод

    bool lampState = false;
    bool wasButtonDown = false;

    void setup()
    {
    pinMode(BUTTON_PIN, INPUT);
    pinMode(LAMP_PIN, OUTPUT);
    }

    void loop()
    {
    bool isButtonDown = digitalRead(BUTTON_PIN);
    if (isButtonDown && !wasButtonDown) {
    lampState = !lampState;
    delay(10);
    }

    wasButtonDown = isButtonDown;
    digitalWrite(LAMP_PIN, lampState);
    }
     
  9. Megakoteyka

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

  10. Arduinщик

    Arduinщик Нерд

  11. acos

    acos Официальный гик Администратор

    Джойстик, это по-сути два переменных резистора, которые стоят под углом 90 градусов, и каждый из них отслеживает перемещение джойстика по своей оси. Один переменный резитор отвечает за ось X, а другой - за ось Y.

    Переменный резистор отдаёт аналоговый сигнал. Как превратить положение переменного резистора в поворот сервы описано здесь

    Про NRF24l01 http://forum.amperka.ru/threads/nrf24l01-побеждаем-модуль.3205/
     
    Последнее редактирование: 22 июн 2014
  12. Arduinщик

    Arduinщик Нерд

    Извините, но я эту тему смотрел и ничего для себя не нашёл я испольую библиотеку Mirf.
     
  13. Arduinщик

    Arduinщик Нерд

    Пожалуйста напишите мне скетч очень надо объясните мне. Я по правде в пятый класс перешёл.
     
  14. acos

    acos Официальный гик Администратор

    ОК. Раз вы перешли в пятый класс, начнём с простого. Надеюсь, эти вещи вы знаете?
    Текущая версия проекта будет находится здесь - https://github.com/acosinwork/arduino_projects/tree/new/Arduinshik

    Для начала приёмо-передаточные штуки, забудем на время про NRF24L01+
    и потренируемся на кошках:
    В нашей схеме передатчик и приёмник. К передатчику подключена кнопка, к приёмнику - светодиод.
    На ардуинах это значит TX одной присоединён к RX другой и наоборот. Ещё я бы земли объединил, но если запитаны от одного компа через USB - то не нужно.
    Нам надо как-то передать нажатие кнопки, а логику свечения сделаем на приёмнике.
    Отправлять будем раз в 100 мс .
    Передатчик: https://github.com/acosinwork/ardui...rduinshik/SendButtonState/SendButtonState.ino

    Код (Text):

    //Значит у нас две ардуины. Одна- приёмник со светодиодом,
    // а другая - передатчик с кнопкой.
    // допустим это у нас:

    //==== П Е Р Е Д А Т Ч И К ==========

    #define BUTTON_PIN 2 // кнопка

    void setup()
    {
      pinMode(BUTTON_PIN, INPUT);

      Serial.begin(9600);
    }

    void loop()
    {
      bool isButtonDown = digitalRead(BUTTON_PIN);

      Serial.print(isButtonDown);
      delay(100);

    }
     
    Приёмник: https://github.com/acosinwork/ardui...hik/RecieveButtonState/RecieveButtonState.ino

    Код (Text):

    //Значит у нас две ардуины. Одна- приёмник со светодиодом,
    // а другая - передатчик с кнопкой.
    // допустим это у нас:

    //==== П Р И Ё М Н И К ==========

    #define LAMP_PIN 5 // светодиод

    bool lampState = false;
    bool wasButtonDown = false;

    void setup()
    {
      pinMode(LAMP_PIN, OUTPUT);

      Serial.begin(9600);
    }

    void loop()
    {
      char c;

      if (Serial.available()) {
        c = Serial.read();

        bool isButtonDown = boolean(c);

        if (isButtonDown && !wasButtonDown) {
          lampState = !lampState;
          delay(10);
        }

        wasButtonDown = isButtonDown;

        digitalWrite(LAMP_PIN, lampState);
      }

    }

     

    В следующей серии нужно заменить Serial на что-то из примеров к библиотеке Mirf
     
    Последнее редактирование: 23 июн 2014
    Tomasina нравится это.
  15. Arduinщик

    Arduinщик Нерд

    БОЛЬШОЕ СПАСИБО, но на что?!
     
    Последнее редактирование: 24 июн 2014
  16. Arduinщик

    Arduinщик Нерд

    Может быть я кому-то покажусь тупым, но я незнаю на что
     
  17. ИгорьК

    ИгорьК Гуру

    Arduinщик, Вы скажите, пожалуйста, что вы хотите сделать в итоге? Разобраться с Ардуино или срочно сделать какой-то очень важный для Вас проект.
    В первом случае Вы просто обязаны неспеша и пошагово повторять все эксперименты, много читать и набираться знаний. Работа с беспроводным модулем не слишком простая вещь для новичка, чтобы браться сразу за нее с Вашим уровнем подготовки.
    Если Вам по каким-то причинам нужно срочно что-то сделать - так и напишите, нужно то-то и то-то для того чтобы...
    Тогда кто-нибудь, кто обладает временем и желанием просто напишет Вам код. И то, если кто-то действительно заинтересуется.

    Вы не кажетесь тупым, Вы просто еще в начале пути. Все так начинают. ;) Удачи!
     
    Последнее редактирование: 25 июн 2014
    Megakoteyka нравится это.
  18. Arduinщик

    Arduinщик Нерд

    Описываю. У меня есть машинка из-под знатка https://www.google.ru/search?q=везд...2Fgames%2F88661%2Fvezdehod-lider.html;450;293 пульт управления потерял (машину мне купили лет в 6 не позже). Хочу управлять машиной с помощью ардуино, мотор шилд не покупал. Вместо мотор шилд поставлю реле. К этой ардуино хочу подключить серву (серва это башня с пушкой (пушка для вида)) и nRF24L01+. Пульт ардуино + nRF24L01+ + джостик http://www.masterkit.ru/main/set.php?code_id=1288043 джостик управляет машиной кнопки башней.
    Срочно мне делать нечего не надо я вникаю в интересный но, сложный мир ардуино. Но я не хочу просто иметь два кода приёмник передатчик я хочу ещё в них разобраться.
     
  19. ИгорьК

    ИгорьК Гуру

    Ну тогда у Вас есть куча исходной информации в этой ветке для САМОСТОЯТЕЛЬНОГО изучения.
     
  20. acos

    acos Официальный гик Администратор

    Ух)
    Тогда давай так. Я всё ещё расчитываю, что вы уже прошли курс молодого бойца.
    Так же было бы отлично если вы прочли вот это http://wiki.amperka.ru/программирование:оглавление

    Далее, по библиотеке MIRF. Мне было бы любопытно самому с ней получше разобраться, поэтому можете посмотреть, как в этом буду пытаться разобраться я (тем более, нам очень повезло что с нами здесь @ИгорьК!).

    Имея перед собой задачу идём по кратчайшему пути: к папке проекта с библиотекой, Можно не сразу заглядывать в исходный код. Дело в том, что библиотеки (хорошие библиотеки) пишутся людьми для людей, поэтому, скорее всего у популярного проекта c понятностью кода всё в порядке.
    С помощью гугла ищу исходный код. Он скорее всего либо на https://bitbucket.org/ либо на https://github.com/ - это очень популярные сайты для разработки и хранения кода. Можно на arduino.cc заглянуть.
    https://github.com/aaronds/arduino-nrf24l01 - вот исходный код библиотеки mirf
    Заходим в папку examples https://github.com/aaronds/arduino-nrf24l01/tree/master/Mirf/examples
    Там несколько скетчей. Мы знаем, что нам нужен передатчик и приёмник.
    Вот эти скетчи вроде подходят под наши ожидания
    https://github.com/acosinwork/ardui...ies/Mirf/examples/ping_server/ping_server.pde
    https://github.com/acosinwork/ardui...ies/Mirf/examples/ping_client/ping_client.pde

    Открываем первый. Что видим?
    Видим там код. Прокомментированный на английском языке. Если знать английский язык (хотя бы представлять о чём идёт речь) то понять суть несколько проще.

    Код (Text):
    /**
    * A Mirf example to test the latency between two Ardunio.
    *
    * Pins:
    * Hardware SPI:
    * MISO -> 12
    * MOSI -> 11
    * SCK -> 13
    *
    * Configurable:
    * CE -> 8
    * CSN -> 7
    *
    * Note: To see best case latency comment out all Serial.println
    * statements not displaying the result and load
    * 'ping_server_interupt' on the server.
    */

    /*
    Там сверху написано, что этот пример просто показывает как
    проверить временную задержку при связи двух ардуин
    Пины для подключения:

    * встроенный SPI на Arduino Uno находится на этих пинах:
    * MISO -> 12
    * MOSI -> 11
    * SCK -> 13
    Тут нужно быть осторожным. Нпример на Arduino Leonardo
    SPI совсем не там. Единственное в чем можно быть уверенным
    SPI есть на ICSP пинах

    *
    Вот эти пины можно выбрать самостоятельно. Автор выбрал 7 и 8
    * Configurable:
    * CE -> 8
    * CSN -> 7


    */

    //вот эти все библиотеки нам понадобятся
    #include <SPI.h>
    #include <Mirf.h>
    #include <nRF24L01.h>
    #include <MirfHardwareSpiDriver.h>

    // Ну всё, далее стандартный setup()
    void setup(){

    //Включаем последовательный порт на 9600,
    // через него будем смотреть результаты работы ардуины на компьютере
      Serial.begin(9600);
    // сейчас будем конфигурировать SPI видимо
      /*
    * Setup pins / SPI.
    */
    //это похоже закладки автора для быстрой замены пинов в коде
      /* To change CE / CSN Pins:
    *
    * Mirf.csnPin = 9;
    * Mirf.cePin = 7;
    */
      /*
    Mirf.cePin = 7;
    Mirf.csnPin = 8;
    */
    //Инициализация SPI. Видимо библиотека очень старая (да и файл с расширением .pde намекает)
      Mirf.spi = &MirfHardwareSpi; //присваеваем какому-то объекту из библиотеки Mirf адрес объекта MirfHardwareSpi
    //Пока не очень хочется разбираться - что это, но нам и не всегда обязательно, библиотеки - для людей)
      Mirf.init(); // Пошла инициализация библиотеки

      /*
    * Configure reciving address.
    */

      Mirf.setRADDR((byte *)"clie1"); // тут мы обзываем себя клиентом и
                  //выставляем это как адрес нашего приёмопередатчика

      /*
    * Set the payload length to sizeof(unsigned long) the
    * return type of millis().
    *
    * NB: payload on client and server must be the same.
    */

      Mirf.payload = sizeof(unsigned long); // Тут выставляется размер того, что будем передавать
    // на той стороне этот размер должен быть таким же

      /*
    * Write channel and payload config then power up reciver.
    */

      /*
    * To change channel:
    *
    * Mirf.channel = 10;
    *
    * NB: Make sure channel is legal in your area.
    */

      Mirf.config(); // пошла конфигурация NRF24L01

      Serial.println("Beginning ... "); // пишем в комп "Начинаем"
    }

    void loop(){
      unsigned long time = millis(); // берём текущее время в миллисекундах в переменную time
    // её размер не зря совпадает с Mirf.payload, эту переменную мы будем передавать

      Mirf.setTADDR((byte *)"serv1"); // установили адрес той стороны, куда слать

      Mirf.send((byte *)&time); // Mirf кушает ссылку на нашу переменную,
                                //чтобы её потом выплюнуть в "ту сторону"

      while(Mirf.isSending()){ //тупо ждём пока NRF24 не отправит данные
      } // можно не ждать если использовать прерывания, но для них пока рано

      Serial.println("Finished sending"); //"Всё готово, Шеф!"
      delay(10); // обождём зачем-то

      while(!Mirf.dataReady()){ // тупо ждём ответа с той стороны
        //Serial.println("Waiting");
        if ( ( millis() - time ) > 1000 ) { //если ждем уже больше секунды
          Serial.println("Timeout on response from server!"); //то ждать вестей уже не имеет смысла
          return;
        }
      }

      Mirf.getData((byte *) &time); // а если данные пришли,
    //то запомним их обратно в переменную time (подсказка - в коде сервера можно увидеть
    //что тот просто передаёт нам обратно то же значение time, что мы ему отправляли ранее)

      Serial.print("Ping: ");            //Хозяин!
      Serial.println((millis() - time));  //Задержка в передаче составила
    // текущее время минус значение текущего времени в тот момент, когда мы отправляли сообщение

      delay(1000); // Теперь можно передохнуть, увидимся через секунду на следующем витке функции loop()
    }
     
    Так. время позднее, а завтра на работу. Всем спать, увидимся в следующий раз)
    ПС. Символично, что название темы "Лёгкий вопрос")
     
    Последнее редактирование: 25 июн 2014
    dreadfull и Megakoteyka нравится это.