Простая машинка с разными вариантами управления

Тема в разделе "Глядите, что я сделал", создана пользователем 3f(x), 27 сен 2019.

  1. 3f(x)

    3f(x) Нерд

    нее, ее тогда надо буд еще оснащать 3 сервами, или 1 и 2 моторами для башни с обзором на 360, и электрошокером, чтоб доехала обратно
     
  2. 3f(x)

    3f(x) Нерд

    ну тут не 3 провода)
     
  3. NikitOS

    NikitOS Король шутов Администратор

    И что? :)

    Желание человека есть, код и схема есть
    Не можешь сопоставить?
    Хм... Тогда не знаю, как ты в роли исполнителя выступаешь...
     
  4. 3f(x)

    3f(x) Нерд

    я то думал как написать код что бы он управлялся с помощью 3 проводов от ардуинки)
     
  5. NikitOS

    NikitOS Король шутов Администратор

    Это не соответствует ТЗ
     
  6. b707

    b707 Гуру

    10 спосбов ? что-то мало :) если не ставить никаких условий, то любой код можно переписывать бесконечно...
    Слабо уложить этот скетч в 15 строк? - на строке один оператор?
     
  7. parovoZZ

    parovoZZ Гуру

    один оператор в строке на сях? impossible
     
  8. b707

    b707 Гуру

    я не знаю, что ты имел в виду, я говорил что законченные операторы с точной запятой в конце типа
    digitalWrite(pin, LOW); my_func(x);
    должны записываться на отдельных строчках, иначе требование "скетч в 15 строк" просто теряет смысл, я весь код в строку запишу
     
  9. parovoZZ

    parovoZZ Гуру

    это же вызов функции.
     
  10. b707

    b707 Гуру

    да? впервые слышу :)
     
  11. 3f(x)

    3f(x) Нерд

    как сделать машинку на радио и ардуино, увидел что инфы уже много в сети, решил делать самолет) купил NRF24L01+PA+LNA и Адаптер для NRF24L01 решил сначала попробовать поуправлять моторами через библиотеку servo,(такое возможно!) но в итоге серво вообще никак не реагирует) по 2-3 раза перепроверил подкл. все правильно, сделал отдельное питание результата 0, совсем отчаявшись по лез за готовыми скетчами, и тот же результат) вот пример немного переделанного приемник
    Код (C++):

    #include <SPI.h>
    #include "nRF24L01.h"
    #include "RF24.h"
    #include <Servo.h>
    RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно
    byte recieved_data[2]; // массив принятых данных
    byte servo2 = 2;
    byte servo = 3;
    Servo myservo, myservo2;
    byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб
    const int axisX = recieved_data[0];
    const int axisY = recieved_data[1];
    int angleS1 = 0;
    int valX, valY = 0;

    void setup() {
      Serial.begin(9600); //открываем порт для связи с ПК
      myservo.attach(servo);
      myservo2.attach(servo2);
      radio.begin(); //активировать модуль
      radio.setAutoAck(0);         //режим подтверждения приёма, 1 вкл 0 выкл
      radio.setRetries(0, 15);    //(время между попыткой достучаться, число попыток)
      radio.enableAckPayload();    //разрешить отсылку данных в ответ на входящий сигнал
      radio.setPayloadSize(32);     //размер пакета, в байтах
      radio.openReadingPipe(1, address[0]);     //хотим слушать трубу 0
      radio.setChannel(0x60);  //выбираем канал (в котором нет шумов!)
      radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
      radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
      radio.powerUp(); //начать работу
      radio.startListening();  //начинаем слушать эфир, мы приёмный модуль
    }

    void loop() {
      valX = analogRead(axisX); // значение оси Х
      valY = analogRead(axisY); // значение оси Y
      byte pipeNo;
      while ( radio.available(&pipeNo)) {  // слушаем эфир со всех труб
        radio.read( &recieved_data, sizeof(recieved_data) );         // чиатем входящий сигнал
        myservo.write(angleS1); // повернуть серво на угол 0..180
        myservo2.write(angleS1); // повернуть серво на угол 0..180
      }
    }

     
    передатчик
    Код (C++):
    #include <SPI.h>
    #include "nRF24L01.h"
    #include "RF24.h"
    RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно
    byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб
    byte X = A0;
    byte Y = A1;
    byte transmit_data[2]; // массив, хранящий передаваемые данные
    byte latest_data[2]; // массив, хранящий последние переданные данные
    int angleS1 = 0;
    int valX, valY = 0;

    void setup() {
      Serial.begin(9600); //открываем порт для связи с ПК
      radio.begin(); //активировать модуль
      radio.setAutoAck(0);         //режим подтверждения приёма, 1 вкл 0 выкл
      radio.setRetries(0, 15);    //(время между попыткой достучаться, число попыток)
      radio.enableAckPayload();    //разрешить отсылку данных в ответ на входящий сигнал
      radio.setPayloadSize(32);     //размер пакета, в байтах
      radio.openWritingPipe(address[0]);   //мы - труба 0, открываем канал для передачи данных
      radio.setChannel(0x60);  //выбираем канал (в котором нет шумов!)
      radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
      radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
      radio.powerUp(); //начать работу
      radio.stopListening();  //не слушаем радиоэфир, мы передатчик
    }

    void loop() {
      valX = analogRead(X); // значение оси Х
      valY = analogRead(Y);
      transmit_data[1] = map(analogRead(X), 0, 1023, 0, 180); // получить значение
      transmit_data[2] = map(analogRead(Y), 0, 1023, 0, 180);
      radio.write(&transmit_data, sizeof(transmit_data)); // отправить по радио
      }
     
    или вот еще
    Код (C++):
    #include <SPI.h>
    #include "nRF24L01.h"
    #include "RF24.h"
    #include <Servo.h>
    RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно
    byte recieved_data[2]; // массив принятых данных
    byte servo2 = 2; // реле на 2 цифровом
    byte servo = 3; // сервопривод на 3 цифровом
    Servo myservo, myservo2;
    byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб

    void setup() {
      Serial.begin(9600); //открываем порт для связи с ПК
      myservo.attach(servo);
      myservo2.attach(servo2);
      radio.begin(); //активировать модуль
      radio.setAutoAck(1);         //режим подтверждения приёма, 1 вкл 0 выкл
      radio.setRetries(0, 15);    //(время между попыткой достучаться, число попыток)
      radio.enableAckPayload();    //разрешить отсылку данных в ответ на входящий сигнал
      radio.setPayloadSize(32);     //размер пакета, в байтах
      radio.openReadingPipe(1, address[0]);     //хотим слушать трубу 0
      radio.setChannel(0x60);  //выбираем канал (в котором нет шумов!)
      radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
      radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
      radio.powerUp(); //начать работу
      radio.startListening();  //начинаем слушать эфир, мы приёмный модуль
    }

    void loop() {
      byte pipeNo;
      while ( radio.available(&pipeNo)) {  // слушаем эфир со всех труб
        radio.read( &recieved_data, sizeof(recieved_data) );         // чиатем входящий сигнал
        myservo.write(recieved_data[1]); // повернуть серво на угол 0..180
        myservo2.write(recieved_data[2]); // повернуть серво на угол 0..180
      }
    }
     
    Код (C++):
    #include <SPI.h>
    #include "nRF24L01.h"
    #include "RF24.h"
    RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно
    byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб
    byte X = A0;  // кнопка на 3 цифровом
    byte Y = A1; // потенциометр на 0 аналоговом
    byte transmit_data[2]; // массив, хранящий передаваемые данные
    byte latest_data[2]; // массив, хранящий последние переданные данные

    void setup() {
      Serial.begin(9600); //открываем порт для связи с ПК
      radio.begin(); //активировать модуль
      radio.setAutoAck(1);         //режим подтверждения приёма, 1 вкл 0 выкл
      radio.setRetries(0, 15);    //(время между попыткой достучаться, число попыток)
      radio.enableAckPayload();    //разрешить отсылку данных в ответ на входящий сигнал
      radio.setPayloadSize(32);     //размер пакета, в байтах
      radio.openWritingPipe(address[0]);   //мы - труба 0, открываем канал для передачи данных
      radio.setChannel(0x60);  //выбираем канал (в котором нет шумов!)
      radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
      radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
      radio.powerUp(); //начать работу
      radio.stopListening();  //не слушаем радиоэфир, мы передатчик
    }

    void loop() {
      transmit_data[1] = map(analogRead(X), 0, 1023, 0, 180); // получить значение
      transmit_data[2] = map(analogRead(Y), 0, 1023, 0, 180);
      radio.write(&transmit_data, sizeof(transmit_data)); // отправить по радио
      }
     
    загрузил пример-работает
    Код (C++):
    #include <SPI.h>
    #include "nRF24L01.h"
    #include "RF24.h"

    RF24 radio(9,10); // инициализировать модуль на пинах 9 и 10 Для Уно
    //RF24 radio(9,53);// Для Меги

    const uint8_t num_channels = 128;
    uint8_t values[num_channels];
    void setup(void)
    {
      Serial.begin(9600);
      printf_begin();
      radio.begin();
      radio.setAutoAck(false);
      radio.startListening();

      radio.printDetails();  // Вот эта строка напечатает нам что-то, если все правильно соединили.
      delay(5000);              // И посмотрим на это пять секунд.

      radio.stopListening();
      int i = 0;    // А это напечатает нам заголовки всех 127 каналов
      while ( i < num_channels )  {
        printf("%x",i>>4);
        ++i;
      }
      printf("\n\r");
      i = 0;
      while ( i < num_channels ) {
        printf("%x",i&0xf);
        ++i;
      }
      printf("\n\r");
    }
    const int num_reps = 100;

    void loop(void)
    {
      memset(values,0,sizeof(values));
      int rep_counter = num_reps;
      while (rep_counter--) {
        int i = num_channels;
        while (i--) {
          radio.setChannel(i);
          radio.startListening();
          delayMicroseconds(128);
          radio.stopListening();
          if ( radio.testCarrier() )
            ++values[i];
        }
      }
      int i = 0;
      while ( i < num_channels ) {
        printf("%x",min(0xf,values[i]&0xf));
        ++i;
      }
      printf("\n\r");
    }
    int serial_putc( char c, FILE * ) {
      Serial.write( c );
      return c;
    }

    void printf_begin(void) {
      fdevopen( &serial_putc, 0 );
    }
     
    а серво так и не управляются) кроме установки библиотеки RF24-master надо еще что устанавливать ? ошибки в коде есть ? оборудование не дорогое чтоб с ардуино использовать посоветуете (что бы связь по радио на 1км мин.)? пайка не решит проблему, по подкл. думаю понятно, позже еще выложу к каким пинам что идет
     
    Последнее редактирование: 5 окт 2019
  12. parovoZZ

    parovoZZ Гуру

    LoRa на 433 МГц. Можно и на 868/869, но эффективность пониже.
    nRF на 2.4 ГГц километр не пробьет.
     
  13. akl

    akl Гуру

    а если подключить только одну серву (без всяких радиомодулей и прочего) и загрузить какой-нибудь тестовый скетч из примеров к библиотеке серво - тогда шевелится?
     
  14. 3f(x)

    3f(x) Нерд

    да, и джойстик , и радиомодули, и серво, все отдельно проверял, все рабочее
    nRF на 2.4 ГГц -

    пробьет, эт еще антенна слабая, посмотрел обзорчик блин, повелся, в принципе работает, ток не серва, подправил первый скеч
     
    Последнее редактирование: 5 окт 2019
  15. akl

    akl Гуру

    тогда надо дебагировать скетч. всовывать в разные места вывод в ком-порт и выводить туда всякие переменные, смотреть где че происходит.

    Теоретически еще может быть конфликт библиотек если кто-то кроме серво использует тот же таймер например. но вроде не должно такого быть если это готовые скетчи из интернета, которые у кого-то работали
     
  16. parovoZZ

    parovoZZ Гуру

    в смысле слабая? Если речь про самолеты, которые в пространстве могут занять абсолютно любое положение, то антенна нужна всенаправленная, а не штырь. Всенаправленная антенна, как тут высказались, слабая по определению. Усиление антенны достигается за счет сужения направленности. Чудес нет.