как подружить arduino uno и радиоуправление от детской машинки

Тема в разделе "Проводная и беспроводная связь", создана пользователем ga2bi, 26 июн 2014.

  1. ga2bi

    ga2bi Нерд

    что то лудше чем 27MGZ с радиусом 10-15м
     
  2. ANV

    ANV Гуру

    А чем не нравится 2.4ГГц аппаратура? Если взять совместимую со Spektrum, то можно даже данныепо serial получать, если купить не сам приемник, а сателлит
     
  3. Morales

    Morales Нерд

    ga2bi, интересует еще радиоуправление на RX-2/TX-2 ? А то нашел у себя игрушку на аналогичном РУ.
     
    ga2bi нравится это.
  4. ga2bi

    ga2bi Нерд

    ну на будущие пригодится если можешь подключить и детально разжевать то буду благодарен.
     
    Последнее редактирование: 11 июл 2014
  5. Morales

    Morales Нерд

    эксперимент удался, arduino отлично принимает сигналы с RX-2 :) попробую завтра сфотографировать.
     
  6. ga2bi

    ga2bi Нерд

    вот это хорошо, жду фото и схемку.

    а я щяс пытаю RF 433mhz модуль, как тут хочу сделать
    http://iamzxlee.wordpress.com/2013/11/09/rf-controlled-robot-car/

    передатчик подключил к нано, вроде все по картинке, а вот с приёмником куда он там подключил на своей самоделке невидно :( буду к уно подключать
     
  7. aqis

    aqis Нуб

    А можно поподробнее? Есть аппа FlySky gt3b, пробовал её к ардуине и так и сяк подключать, считывать данные с неё получается, и на дисплей вывести и в консоль, но вот управлять подключенной к ардуине сервой не получается:(
     
  8. ИгорьК

    ИгорьК Гуру

    А Вы не пытались серву подключить напрямую к аппе подключать, мимо ардуино? Насколько мне помнится, основное назначение такой аппаратуры и есть управление сервами?
     
  9. aqis

    aqis Нуб

    Конечно пробовал, с этим всё ок. Мне интересен момент через ардуину. Чтобы машинка ездила сама, но при необходимости я мог перейти на ручное управление. Аппа 3 канальная, 2 пропорциональных канала и 1 дискретный.
     
  10. ANV

    ANV Гуру

    У вас должны получиться ширины сигналов для каждого канала, что-то в районе 1100-2000 мкс.
    Дальше делаете функцией map преобразование из ширины импульса в угол для сервы
     
  11. ИгорьК

    ИгорьК Гуру

    Все проще и сложнее, исходя из задачи.
    Нужно получить ШИМ с передатчика и точно такой же ШИМ выдать на ногу - то есть повторить его.
     
  12. aqis

    aqis Нуб

    Да. Но чтобы при условии что нажат 3 канал, управление переходит на автоматическое.

    Код (Text):
    void setup()
    {
      // Все пины порта D кроме нулевого(TX) устанавливаем как входы
      DDRD = 1;
      // Настраиваем таймер 1 на отсчет 0.5 мкс
      TCCR1B  =  0;
      TCCR1A  =  0;
      TCNT1  =    0;
      TCCR1A  =  0;
      TCCR1B  =  0<<CS12 | 1<<CS11 | 0<<CS10;//0x1A; //start timer with 1/8
      // Разрешаем прерывания порта D по изменению уровня
      PCICR |= (1 << PCIE2);
      // настраиваем маску прерывания - пины 2-7
      PCMSK2 = 0xFC;
      // открываем UART для вывода результата
      Serial.begin(9600);
    }

    typedef struct {
      unsigned long riseTime; // время перехода 0->1
      unsigned int  lastWidth; // ширина импульса
    } tPinTimingData;
    volatile static tPinTimingData pinData[6]; //массив каналов
    volatile static uint8_t PCintLast;

    uint8_t bit;
    uint8_t curr;
    uint8_t mask;
    uint16_t currentTime;
    uint16_t time;

    // обработчик прерывания порта D
    ISR(PCINT2_vect)
    {
      // текущее время по таймеру 1 в мкс
      currentTime = TCNT1>>1;
      // Получаем состояние интересующих нас пинов
      curr = PIND & 0xFC;
      // пины, изменившие состояние
      mask = curr ^ PCintLast;
      PCintLast = curr;
      // в цикле просматриваем каждый пин
      for (uint8_t i=0; i < 3; i++) {
        // маска текущего пина цыкла
        bit = 0x04 << i;
        if (bit & mask) {
          // если 0->1
          if (bit & PCintLast)
            // сохраняем текущее время для канала
            pinData[i].riseTime = currentTime;
          else {
            // рассчитываем ширину импульса
            time = currentTime - pinData[i].riseTime;
            // и сохраняем ее, если таймер не наврал
            if ((time >= 800) && (time <= 2200)) {
              pinData[i].lastWidth = time;
            }
          }
        }
      }
    }

    void loop()
    {
      // Вывод результата в UART каждые 0.5 сек.
      Serial.println();
      for (byte i = 0; i < 3; i++) {
        Serial.print("Ch");
        Serial.print((int)i + 1);
        Serial.print(": ");
        Serial.print(pinData[i].lastWidth);
        Serial.print(", ");
      }
      delay(500);
    }
    Вот я нашёл скетч, который считывает сигналы, но с 6 каналов, а мне надо 3. И даже при наличии описания я не шибко понял как он работает(
    На выходе мы имеем
     
  13. aqis

    aqis Нуб



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

    aqis Нуб

    Подключил, но всё равно есть небольшой дребезг и быстрота рекации отсутствует, люс залипание, если например рулём вправо-влево сделать резко.
     
  15. Вот ана-логичная задача. Через ОДИН "лишний канал", вместо резистора крутилки передаётся шесть сигналов ШИМ. Переделка пульта сводиться к "одной шт." пайке. Пульт до 500 метров.


    На модели , с приёмника уходит в "мозг".
    Интересно, а как сделать "дешифратор", что бы можно было и светодиоды зажигать и сервами рулить ?