Прошу помощи со скетчем.

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем Алексей_T, 23 сен 2019.

  1. Дело в следующем. У сына есть танчик на дешевом китайском управлении, которое накрылось. Механическая часть в полном порядке. Хочу его реанимировать. Компоненты в наличии. Драйвер для двигателей TB6612FNG. Не могу найти скетч с которым работал бы этот драйвер. Может у кого есть и не жалко поделиться? Ну или помогите подправить этот. Он почему-то перестает работать через секунд 10.
    Код (C++):
    #include <SPI.h>
    #include <nRF24L01.h>
    #include <RF24.h>
    const uint64_t pipe = 0xF0F1F2F3F4LL;
    int time;
    int rull1;
    int rull2;
    int gaz1;
    int gaz2;
    int bash;
    int fire;
    int firepin;
    int smoke;
    int flag;
    RF24 radio(9, 2);
    byte msg[8];
    void setup(){
      pinMode(7, OUTPUT); //подъем башни
      pinMode(3, OUTPUT);//~pwm //скорость поворота башни
      pinMode(8, OUTPUT); //опуск башни
      pinMode(5, OUTPUT);//~pwm //скорость гусеницы лев
      pinMode(6, OUTPUT);//~pwm //скорость гусеницы прав
      pinMode(10, OUTPUT); //привод башни влево
      pinMode(4, OUTPUT); //привод башни вправо
      pinMode(A0, OUTPUT); //привод гусениц лев вперед
      pinMode(A1, OUTPUT); //привод гусениц лев назад
      pinMode(A2, OUTPUT); //привод гусениц прав вперед
      pinMode(A3, OUTPUT); //привод гусениц прав назад
      pinMode(A4, OUTPUT); //дым
      pinMode(A5, OUTPUT); //выстрел
      pinMode(A6, OUTPUT); //концевик
      pinMode(A7, OUTPUT);  //пулемет

    radio.begin();
    radio.setChannel(9);
    radio.setPayloadSize(32);
    radio.setDataRate(RF24_1MBPS);
    radio.setPALevel(RF24_PA_MAX);
    radio.setAutoAck(1);
    radio.openReadingPipe(1,pipe);
    radio.startListening();
    Serial.begin(9600);
    delay(20);}
    void loop(){
    if (radio.available()){time = millis();
    radio.read(&msg, sizeof(msg));}
    if (millis() - time > 1000){
      msg[0] = 130;
      msg[1] = 130;
      msg[2] = 130;
      msg[3] = 130;
      msg[4] = 0;
      msg[5] = 0;
     
    }

    if (msg[3] > 132) //ТОРМОЗ правой гусеницы
    {
    rull2 = map(msg[3], 132, 255, 255, 0);
    }
    else
    {
    rull2 = 255;
    }

    if (msg[3] < 127) // тормоз левой гусеницы
    {
    rull1 = map(msg[3], 127, 0, 255, 0);
    }
    else
    {
      rull1 = 255;
    }
    if (msg[2] > 135) //движение назад
    {
    gaz1 = map(msg[2], 132, 255, 0, rull1);
    gaz2 = map(msg[2], 132, 255, 0, rull2);
      digitalWrite(A0, LOW);
      digitalWrite(A1, HIGH);
      digitalWrite(A2, LOW);
      digitalWrite(A3, HIGH);
      analogWrite(5, gaz1);
      analogWrite(6, gaz2);
    }
    if (msg[2] < 125)// движение вперед
    {
    gaz1 = map(msg[2], 128, 0, 0, rull1);
    gaz2 = map(msg[2], 128, 0, 0, rull2);
      digitalWrite(A0, HIGH);
      digitalWrite(A1, LOW);
      digitalWrite(A2, HIGH);
      digitalWrite(A3, LOW);
      analogWrite(5, gaz1);
      analogWrite(6, gaz2);
    }
    if(125 <= msg[2] && msg[2] < 135)
    {
      digitalWrite(A0, LOW);
      digitalWrite(A1, LOW);
      digitalWrite(A2, LOW);
      digitalWrite(A3, LOW);
      analogWrite(5, 0);
      analogWrite(6, 0);
    }

    if (msg[1] > 130) //поворот бвшни
    {
      bash = map(msg[1], 130, 255, 0, 255);
      digitalWrite(4, LOW);
      digitalWrite(2, HIGH);
      analogWrite(3, bash);
    }
    if (msg[1] < 124)
    {
      bash = map(msg[1], 124, 0, 0, 255);
      digitalWrite(4, HIGH);
      digitalWrite(2, LOW);
      analogWrite(3, bash);
    }
    if (124 < msg[1] && msg[1] < 130)
    {
       digitalWrite(2, LOW);
      digitalWrite(4, LOW);
    }
    if ( 135 < msg[0] && msg[0] < 255) {digitalWrite(8, HIGH);}
      else
      {
        digitalWrite(8, LOW);
      }

    if (0 <= msg[0] && msg[0] < 125) digitalWrite(7, HIGH);
    else
      {
        digitalWrite(7, LOW);
      }
    fire = msg[4]; // ВЫСТРЕЛ ПУШКИ

    if (fire == 1)
    {
      digitalWrite(A4, HIGH);
    }
    else
    {
    digitalWrite(A4, LOW);
    }

    smoke = msg[5]; // ДЫМ

    if (smoke == 1&&flag == 0)
    {
    digitalWrite(A5, !digitalRead(A5));
    flag=1;
    }
    if (smoke == 0&&flag == 1)
    {
      flag=0;
    }

    Serial.println(msg[3]);
    }
     
  2. parovoZZ

    parovoZZ Гуру

    Работать надо на прерываниях с радиотрансивера. И обязательно вычитывать всю очередь сообщений.
    Здесь косяк с millis.
     
  3. А как исправить этот косяк? Дело в том что скетч не мой, а я далек от программирования. Там где я этот скетч откопал решения данной проблемы не было. А от программирования я далек.
     
    Последнее редактирование: 23 сен 2019