Помогите немного переделать скеч, пожалуйста.

Тема в разделе "Arduino & Shields", создана пользователем Женя., 6 фев 2018.

  1. Женя.

    Женя. Нуб

    Есть скеч для танка, но он поворачивает одной гусиницей, а нужно двумя.


    Передачик:
    Код (C++):



    #include <SPI.h>
    #include "nRF24L01.h"
    #include "RF24.h"

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

    byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб

    #define aX  A0
    #define aY  A1
    #define aX1 A5


    boolean butt_flag = 0;   // часть обработки значения с кнопки (начало)
    boolean butt;
    boolean led_flag = 0;
    unsigned long last_press;
    unsigned long last_press1;
    boolean butt_flag2 = 0;
    boolean butt2;
    boolean led_flag2 = 0;   // часть обработки значения с кнопки (конец)

    byte B2;    // переменая хранящая значения кнопки


    byte x;   //переменая для направления вращения гусеницы
    byte x1;  //переменая для направления вращения гусеницы
    byte y;   //переменая для направления вращения гусеницы
    byte y1;  //переменая для направления вращения гусеницы

    int BL;  //переменая для направления вращения башни
    int BR;  //переменая для направления вращения башни

    int aBL;
    int aBR;

    int ENA;  //переменая для хранения величини скорости мотора правой гусеницы
    int ENB;  //переменая для хранения величини скорости мотора правой гусеницы

    boolean butt_flag1 = 0;
    boolean butt1;
    boolean led_flag1 = 0;

    byte transmit_data[8]; // массив, хранящий передаваемые данные
    byte latest_data[8];// массив, хранящий последние переданные данные
    boolean flag; // флажок отправки данных

    void setup() {
      Serial.begin(9600);
      pinMode(17, INPUT_PULLUP);
      pinMode(18, INPUT_PULLUP);
      pinMode(15, INPUT_PULLUP);

      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()
    {
    butt = !digitalRead(17);   //кнопка смени режима
    butt1 = !digitalRead(18);  // кнопка поворота башни влево
    butt2 = !digitalRead(15);  // кнопка поворота башни вправо

    int Xa = analogRead(aX);   //читаем значение из оси джостика
    int Ya = analogRead(aY);   //читаем значение из оси джостика
    int X1a = analogRead(aX1); //читаем значение из оси джостика
    int X;
    int Y;
    int X1;

    int R;

    X = map(Xa, 0, 1023, 0, 510);
    constrain(X, 0, 510);
    Y = map(Ya, 0, 1023, 0, 510);
    constrain(Y, 0, 510);
    X1 = map(X1a, 0, 1023, 0, 510);
    constrain(X1, 0, 510);
    //////////////////////////////////////////////////////////////////////////////////////
      if (butt == 1 && butt_flag == 0 && millis() - last_press > 50) {
        butt_flag = 1;
        B2 = !B2;
        last_press = millis();                      // смена режима из одной
      }                                             // оси (джостика), на другую    
      if (butt == 0 && butt_flag == 1) {            // X1 или X
        butt_flag = 0;
      }

      if(B2 == 1) {  R = X1;  }  //тут можно поменять перемение Х и Х1 на которое будет
    if(B2 == 0) {  R = X;   }    //менятся (замикатся) переменая R
                                        // R = Х или R = X1
    ///////////////////////////////////////////////////////////////////////////////////
    if (butt1 == 1 && butt_flag1 == 0 && millis() - last_press > 50) {
        butt_flag1 = 1;
        aBL = 1;
        aBR = 0;
        last_press = millis();                     // поворот башни влево
      }
      if (butt1 == 0 && butt_flag1 == 1) {
        butt_flag1 = 0;
        aBL = 0;
      }
    ///////////////////////////////////////////////////////////////////////////////////
      if (butt2 == 1 && butt_flag2 == 0 && millis() - last_press1 > 50) {
        butt_flag2 = 1;
        aBR = 1;
        aBL = 0;
        last_press = millis();                      // поворот башни вправо
      }
      if (butt2 == 0 && butt_flag2 == 1) {
        butt_flag2 = 0;
        aBR = 0;
      }
    ///////////////////////////////////////////////////////////////////////////////////
    Serial.print("A X  ");      // Вывод даних в монитор порта ПК по оси Х
    Serial.print(X);
    Serial.print("   A Y  ");  // по оси Y
    Serial.print(Y);
    Serial.print("   A X1  "); // по оси Х1
    Serial.print(X1);
    Serial.print("   ENA  ");  // значение переменой ENA (правой гусеници)
    Serial.print(ENA);
    Serial.print("   ENB  ");  // значение переменой ENВ (левой гусеници)
    Serial.print(ENB);
    Serial.print("   BR  ");   // включен ли мотор башни в правую сторону
    Serial.print(aBR);
    Serial.print("   BL  ");   // включен ли мотор башни в левую сторону
    Serial.println(aBL);

    int abc;
    int z;
    if( R > 300) // танк едет вперед
    {
      x=1;
      x1=0;
      y=1;
      y1=0;
      ENA = R-255;
      ENB = R-255;
      int abc = R-255;
      int z = 0;
    }
    if( R < 200 ) // танк едет назад
    {
      x=0;
      x1=1;
      y=0;
      y1=1;
      ENA = 255-R;
      ENB = 255-R;
      int abc = 0;
      int z = 205-R;
    }
    if(R < 300 && R > 200) // танк стоит
    {
      x=0;
      x1=0;
      y=0;
      y1=0;
      ENA = 0;
      ENB = 0;
      int abc = 0;
      int z = 0;
    }
    ///////////////////////////////////////////////////////
    if(Y > 300 && R > 350) //влево, во время движения танка вперед
    {
      x=1;
      x1=0;
      y=0;
      y1=0;
      ENA + abc;
    }
    if(Y > 300 && R < 350 && R > 150) //влево, когда танк стоит на месте
    {
      x=1;
      x1=0;
      y=0;
      y1=0;
      ENA = Y-255;
    }
    if(Y > 300 && R < 150) // влево, если танк едет назад
    {
      x=0;
      x1=1;
      y=0;
      y1=0;
      ENA - z;
    }
    //////////////////////////////////////////////////////////

    if(Y < 200 && R > 350) //вправо, во время движения танка вперед
    {
      x=0;
      x1=0;
      y=1;
      y1=0;
      ENB + abc;
    }
    if(Y < 200 && R < 350 && R > 150) //вправо, когда танк стоит на месте
    {
      x=0;
      x1=0;
      y=1;
      y1=0;
      ENB = 255-Y;
    }
    if(Y < 200 && R < 150) // вправо, если танк едет назад
    {
      x=0;
      x1=0;
      y=0;
      y1=1;
      ENB - z;
    }




    ////////////////////////////////////////////////////////////////
      transmit_data[0] = x ;   //2  in1
      transmit_data[1] = x1 ;  //3  in2
      transmit_data[2] = y ;   //4  in3
      transmit_data[3] = y1 ;  //7  in4
      transmit_data[4] = ENA ; //5  ENA
      transmit_data[5] = ENB;  //6  ENB
      transmit_data[6] = aBR;  //8
      transmit_data[7] = aBL;  //0

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      for (int i = 0; i < 8 ; i++) { // в цикле от 0 до числа каналов
        if (transmit_data[i] != latest_data[i]) { // если есть изменения в transmit_data
          flag = 1; // поднять флаг отправки по радио
          latest_data[i] = transmit_data[i]; // запомнить последнее изменение
        }
      }
      if (flag == 1) {
        radio.powerUp(); // включить передатчик
        radio.write(&transmit_data, sizeof(transmit_data)); // отправить по радио
        flag = 0; //опустить флаг
        radio.powerDown(); // выключить передатчик
        }}
     
    Последнее редактирование: 8 фев 2018
  2. Женя.

    Женя. Нуб

    Приёмник:
    Код (C++):

    #include <SPI.h>
    #include "nRF24L01.h"
    #include "RF24.h"


    RF24 radio(9, 10);

    byte recieved_data[8]; // массив принятых данных

    #define in1  15 // номер 2 порта ардуино, который подключать надо к драйверу
    #define in2  16 // номер 3 порта ардуино, который подключать надо к драйверу
    #define in3  17 // номер 4 порта ардуино, который подключать надо к драйверу
    #define in4  18 // номер 7 порта ардуино, который подключать надо к драйверу
    #define ENA  3 // номер 5 порта ардуино, который подключать надо к драйверу
    #define ENB  5 // номер 6 порта ардуино, который подключать надо к драйверу
    #define BL   8 // номер 8 порта ардуино, который подключать надо к драйверу
    #define BR   0 // номер 0 порта ардуино, который подключать надо к драйверу

    byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб


    void setup() {

      pinMode(in1, OUTPUT); // к пину in1 драйвера L298N
      pinMode(in2, OUTPUT); // к пину in2 драйвера L298N
      pinMode(in3, OUTPUT); // к пину in3 драйвера L298N
      pinMode(in4, OUTPUT); // к пину in4 драйвера L298N
      pinMode(ENA, OUTPUT); // к пину ENA драйвера L298N
      pinMode(ENB, OUTPUT); // к пину ENB драйвера L298N
      pinMode(BL, OUTPUT);  // к пину 1 драйвера для башни
      pinMode(BR, OUTPUT);  // к пину 2 драйвера для башни

      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) );    
           digitalWrite(in1, recieved_data[0]);   //pin 2  in1
           digitalWrite(in2, recieved_data[1]);   //pin 3  in2
           digitalWrite(in3, recieved_data[2]);   //pin 4  in3
           digitalWrite(in4, recieved_data[3]);   //pin 7  in4
           analogWrite(ENA , recieved_data[4]);   //pin 5  ENA
           analogWrite(ENB, recieved_data[5]);    //pin 6  ENB
           digitalWrite(BL, recieved_data[6]);    //pin 8  к драйверу мотора для башни 1
           digitalWrite(BR, recieved_data[7]);    //pin 0  к драйверу мотора для башни 2
           }}