ARDUINO Помогите с скетчем пожалуйста.

Arhat109

★★★★✩✩✩
9 Июн 2019
473
203
C:
void loop() {
  msg[0] = !digitalRead(BTN0_PIN) + !(digitalRead(BTN1_PIN) << BTN1_BIT) + !(digitalRead(BTN7_PIN) << BTN7_BIT);
  val_1 = analogRead(potpin_1)[B][COLOR=rgb(209, 72, 65)],[/COLOR][/B] val_1 = map(val_1, 0, 1023, 0, 127)[B][COLOR=rgb(209, 72, 65)],[/COLOR][/B] msg[1] = val_1;
  val_2 = analogRead(potpin_2)[COLOR=rgb(209, 72, 65)][B],[/B][/COLOR] val_2 = map(val_2, 0, 1023, 128, 254)[COLOR=rgb(209, 72, 65)][B],[/B][/COLOR] msg[2] = val_2,radio.write(msg, sizeof(msg));
}
Почто ребенка учишь плохому - пользовать операцию "запятая", там где оно не требуется и только путает? :)

Можно жеж и так записать:
C:
struct _msg_ {
  struct _btns_ {
    uint_8t btn1 : 1;
    uint_8t btn2 : 1;
    uint_8t unused : 5;
    uint_8t tbn7 : 1;
  } btns;
  uint8_t potpin1, potpin2;
} msg;

void loop() {
  msg.bnts.btn1 = !digitalRead(BTN0_PIN);
  msg.btns.bnt2 = !digitalRead(BTN1_PIN);
  msg.btns.btn7 = !digitalRead(BTN7_PIN);
  msg.potpin1 = map( analogRead(potpin_1), 0, 1023, 0, 127);
  msg.potpin2 = map( analogRead(potpin_2), 0, 1023, 128, 254);

  radio.write(msg, sizeof(msg));
}

// не помню, позволяет ли С/С++ такой вариант присваивания:
msg = {
  { !digitalRead(BTN0_PIN), !digitalRead(BTN1_PIN), 0, !digitalRead(BTN7_PIN) },
    map( analogRead(potpin_1), 0, 1023, 0, 127),
    map( analogRead(potpin_2), 0, 1023, 128, 254)
};
Не проверял, но кажется как-то так можно. Сдвиги к нужным битикам компилятор способен добавить и самостоятельно.
:)
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,267
1,303
Москва
Понял.Ещё вопрос,библиотеку сервы мы не используем?Кнопки подключаем на (-) и на нужный пин,а серву (+) (-) и пин?
+,-, pwm ПИН, ну и надо написать сценарий при нажатии и отпускании, при нажатии установить такой то угол , при отпускании такой
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,267
1,303
Москва
Не, тут 2 варианта, Servo1.write(0); или Servo1.write(180); угол отрегулировать
У меня в машинке в setup стоит такой код:
C++:
Servo1.attach(6); 
Servo1.write(35);
delay(300);
Servo1.write(135);
delay(300);
Servo1.write(90);
Серву подключаю к 6-му пину,
потом шевелю ее в 2 крайних положения (у меня на таких углах) и выставляю прямо
 

Лёха ювелир

✩✩✩✩✩✩✩
21 Ноя 2019
19
0
Не, тут 2 варианта, Servo1.write(0); или Servo1.write(180); угол отрегулировать
У меня в машинке в setup стоит такой код:
C++:
Servo1.attach(6);
Servo1.write(35);
delay(300);
Servo1.write(135);
delay(300);
Servo1.write(90);
Серву подключаю к 6-му пину,
потом шевелю ее в 2 крайних положения (у меня на таких углах) и выставляю прямо
Для меня это высшая математика.Перепробовал кучу вариантов и облом.Спасибо за твои усилия.Буду чёто мутить,авось получиться.
 

Лёха ювелир

✩✩✩✩✩✩✩
21 Ноя 2019
19
0
Не, тут 2 варианта, Servo1.write(0); или Servo1.write(180); угол отрегулировать
У меня в машинке в setup стоит такой код:
C++:
Servo1.attach(6);
Servo1.write(35);
delay(300);
Servo1.write(135);
delay(300);
Servo1.write(90);
Серву подключаю к 6-му пину,
потом шевелю ее в 2 крайних положения (у меня на таких углах) и выставляю прямо
Ты не мог бы показать свой код на машинку.(пульт и приёмник)
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,267
1,303
Москва
Могу конечно, мне не жалко, но вариант сильно черновой, без пометок. Разобраться будет сложнее чем с твоим. Сейчас поздно, объяснять идею не буду, уже завтра.

C++:
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
//#include <Battery_Shield.h>              // Подключаем библиотеку Battery_Shield , если пульт сборка с шилдом. иначе убрать!


const int chanel=125;

// Battery_Shield pwrBank;
RF24 RC_Pult(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"};


byte trans_data[] = {0, 0, 0, 0};
void trans_out()
{ Serial.print(trans_data[0]);
  Serial.print(" ");
  Serial.print(trans_data[1]);
  Serial.print(" ");
  Serial.print(trans_data[2]);
  Serial.print(" ");
  Serial.println(trans_data[3]);
};

void setup() {
  // put your setup code here, to run once:
  pinMode(A0, INPUT);
  pinMode(A1, INPUT);


  Serial.begin(9600);
  digitalWrite(3,HIGH);
  RC_Pult.begin();
  RC_Pult.setAutoAck(1);
  RC_Pult.setRetries(0, 15);
  RC_Pult.enableAckPayload();
  RC_Pult.setPayloadSize(32);
  RC_Pult.openReadingPipe(1, address[0]);
  RC_Pult.setPALevel (RF24_PA_MAX);
  RC_Pult.setDataRate (RF24_2MBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
  RC_Pult.setChannel(chanel);
  RC_Pult.powerUp();
  RC_Pult.stopListening();
  //Serial.println(true);
//  Serial.println(pwrBank.begin(0.0128f));    
}

void loop() {


  byte gotByte;
  // put your main code here, to run repeatedly:
   
  if (analogRead(A1)>500)
    {trans_data[0] = map(analogRead(A1), 514, 1019, 100, 0);  }
  else
    {trans_data[0] = map(analogRead(A1), 10, 514, 200, 100);};

  if (analogRead(A0)>500)
    {trans_data[1] = map(analogRead(A0), 500, 1023, 100, 200);}
  else
  {trans_data[1] = map(analogRead(A0), 0, 500, 0, 100);};

  if (RC_Pult.write(&trans_data, sizeof(trans_data)))
    {
      while (RC_Pult.available() ) {                  
          RC_Pult.read( &gotByte, 1 );                
      };
    };
  delay(20);
//  trans_out();
}

C++:
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <Servo.h>

const int chanel = 125;
int rul, gaz;

Servo Servo1;

RF24 RC_Car(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"};

byte trans_data[] = {0, 0, 0, 0};
void trans_out()
{ Serial.print(trans_data[0]);
  Serial.print(" ");
  Serial.print(trans_data[1]);
  Serial.print(" ");
  Serial.print(trans_data[2]);
  Serial.print(" ");
  Serial.println(trans_data[3]);
};


void setup() {
  RC_Car.begin();
  RC_Car.setAutoAck(1);
  RC_Car.setRetries(0, 15);
  RC_Car.enableAckPayload();
  RC_Car.setPayloadSize(32);
  RC_Car.openReadingPipe(1, address[0]);
  RC_Car.setPALevel (RF24_PA_MAX);
  RC_Car.setDataRate (RF24_2MBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
  RC_Car.setChannel(chanel);
  RC_Car.powerUp();
  RC_Car.startListening();

  Servo1.attach(6);
  pinMode(5, OUTPUT);
  pinMode(3, OUTPUT);
  Servo1.write(35);
  delay(300);
  Servo1.write(135);
  delay(300);
  Servo1.write(90);


  Serial.begin(9600);

}

void loop() {
  delay(30);
  int Newrul, Newgaz;
  byte pipeNo;
  // Serial.println(RC_Car.available(&pipeNo));
  while (RC_Car.available(&pipeNo)) {   // слушаем эфир со всех труб
    RC_Car.read(&trans_data, sizeof(trans_data) );         // чиатем входящий сигнал
   // trans_out();
    Newrul = map(trans_data[0] / 5, 0, 40, 9, 27);
    //Serial.println(rul);
    if (Newrul != rul) {
      Servo1.write(Newrul * 5);
      rul = Newrul;
    };

    Newgaz = map(trans_data[1] / 5, 0, 40, -20, 20);
   
    if (abs(Newgaz)<2){Newgaz=0;};
   
    if (gaz != Newgaz)
    {
      gaz = Newgaz;
      if (gaz < 0)
      {
        analogWrite(3, 0);      
        analogWrite(5, map(abs(gaz),1,20,60,200));
        Serial.println(map(abs(gaz),1,20,60,200));      
      }
      else if (gaz > 0)
      {
        analogWrite(3, map(gaz,1,20,60,200));
        analogWrite(5, 0);
        //Serial.println(map(abs(gaz),1,20,60,200));
      }
      else
      {
        analogWrite(3, 0);
        analogWrite(5, 0);
      };
    }

  }
}

Мой код предназначен для управления "с пуотиа" 1 сервой и 1 двигателем, на пульте джойстик. есть возможность передать нажатия кнопок, но как таковых кнопок я не подключал.
Значения угла поворота и "педали" газа передается в процентах от максимума ,-100% до 100%;
 
Изменено:
  • Лойс +1
Реакции: Лёха ювелир

Лёха ювелир

✩✩✩✩✩✩✩
21 Ноя 2019
19
0
Могу конечно, мне не жалко, но вариант сильно черновой, без пометок. Разобраться будет сложнее чем с твоим. Сейчас поздно, объяснять идею не буду, уже завтра.

C++:
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
//#include <Battery_Shield.h>              // Подключаем библиотеку Battery_Shield , если пульт сборка с шилдом. иначе убрать!


const int chanel=125;

// Battery_Shield pwrBank;
RF24 RC_Pult(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"};


byte trans_data[] = {0, 0, 0, 0};
void trans_out()
{ Serial.print(trans_data[0]);
  Serial.print(" ");
  Serial.print(trans_data[1]);
  Serial.print(" ");
  Serial.print(trans_data[2]);
  Serial.print(" ");
  Serial.println(trans_data[3]);
};

void setup() {
  // put your setup code here, to run once:
  pinMode(A0, INPUT);
  pinMode(A1, INPUT);


  Serial.begin(9600);
  digitalWrite(3,HIGH);
  RC_Pult.begin();
  RC_Pult.setAutoAck(1);
  RC_Pult.setRetries(0, 15);
  RC_Pult.enableAckPayload();
  RC_Pult.setPayloadSize(32);
  RC_Pult.openReadingPipe(1, address[0]);
  RC_Pult.setPALevel (RF24_PA_MAX);
  RC_Pult.setDataRate (RF24_2MBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
  RC_Pult.setChannel(chanel);
  RC_Pult.powerUp();
  RC_Pult.stopListening();
  //Serial.println(true);
//  Serial.println(pwrBank.begin(0.0128f));   
}

void loop() {


  byte gotByte;
  // put your main code here, to run repeatedly:
  
  if (analogRead(A1)>500)
    {trans_data[0] = map(analogRead(A1), 514, 1019, 100, 0);  }
  else
    {trans_data[0] = map(analogRead(A1), 10, 514, 200, 100);};

  if (analogRead(A0)>500)
    {trans_data[1] = map(analogRead(A0), 500, 1023, 100, 200);}
  else
  {trans_data[1] = map(analogRead(A0), 0, 500, 0, 100);};

  if (RC_Pult.write(&trans_data, sizeof(trans_data)))
    {
      while (RC_Pult.available() ) {                 
          RC_Pult.read( &gotByte, 1 );               
      };
    };
  delay(20);
//  trans_out();
}

C++:
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <Servo.h>

const int chanel = 125;
int rul, gaz;

Servo Servo1;

RF24 RC_Car(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"};

byte trans_data[] = {0, 0, 0, 0};
void trans_out()
{ Serial.print(trans_data[0]);
  Serial.print(" ");
  Serial.print(trans_data[1]);
  Serial.print(" ");
  Serial.print(trans_data[2]);
  Serial.print(" ");
  Serial.println(trans_data[3]);
};


void setup() {
  RC_Car.begin();
  RC_Car.setAutoAck(1);
  RC_Car.setRetries(0, 15);
  RC_Car.enableAckPayload();
  RC_Car.setPayloadSize(32);
  RC_Car.openReadingPipe(1, address[0]);
  RC_Car.setPALevel (RF24_PA_MAX);
  RC_Car.setDataRate (RF24_2MBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
  RC_Car.setChannel(chanel);
  RC_Car.powerUp();
  RC_Car.startListening();

  Servo1.attach(6);
  pinMode(5, OUTPUT);
  pinMode(3, OUTPUT);
  Servo1.write(35);
  delay(300);
  Servo1.write(135);
  delay(300);
  Servo1.write(90);


  Serial.begin(9600);

}

void loop() {
  delay(30);
  int Newrul, Newgaz;
  byte pipeNo;
  // Serial.println(RC_Car.available(&pipeNo));
  while (RC_Car.available(&pipeNo)) {   // слушаем эфир со всех труб
    RC_Car.read(&trans_data, sizeof(trans_data) );         // чиатем входящий сигнал
   // trans_out();
    Newrul = map(trans_data[0] / 5, 0, 40, 9, 27);
    //Serial.println(rul);
    if (Newrul != rul) {
      Servo1.write(Newrul * 5);
      rul = Newrul;
    };

    Newgaz = map(trans_data[1] / 5, 0, 40, -20, 20);
  
    if (abs(Newgaz)<2){Newgaz=0;};
  
    if (gaz != Newgaz)
    {
      gaz = Newgaz;
      if (gaz < 0)
      {
        analogWrite(3, 0);     
        analogWrite(5, map(abs(gaz),1,20,60,200));
        Serial.println(map(abs(gaz),1,20,60,200));     
      }
      else if (gaz > 0)
      {
        analogWrite(3, map(gaz,1,20,60,200));
        analogWrite(5, 0);
        //Serial.println(map(abs(gaz),1,20,60,200));
      }
      else
      {
        analogWrite(3, 0);
        analogWrite(5, 0);
      };
    }

  }
}

Мой код предназначен для управления "с пуотиа" 1 сервой и 1 двигателем, на пульте джойстик. есть возможность передать нажатия кнопок, но как таковых кнопок я не подключал.
Значения угла поворота и "педали" газа передается в процентах от максимума ,-100% до 100%;
Правду говорят-старую обезьяну новым фокусам не научишь!Целый день пытался что то слепить - хрен что вышло.Буду просить дописать код полностью,а не учить меня программированию (бесполезно).Если нет-то буду плакать :) и скорей всего оставлю как есть.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,267
1,303
Москва
Скетч надо писать под схему подключения, рисуй схемы и приемника и передатчика. Подключение NRF можно опустить, просто бум считать что оно подключено
 

Лёха ювелир

✩✩✩✩✩✩✩
21 Ноя 2019
19
0
Так там ничего и не подключено.На передатчике-джойстик(А0 и А1),на приёмнике регулятор оборотов двигателя (l298n) на пинах (2.3.4.5.6.7) Скорей всего как я понял нужно освободить шим пин для сервы.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,267
1,303
Москва
Ну без схем как то не то..
Я вот у себя L298N подключил по 2-м проводам , вместо 3-х. 2 шима. в коде 5 и 3, серва на 6-ом. Но у меня 1 мотор, без но если 2 сервы ставить, то все равно безбожно не хватает их.. придется прикручивать PCA9685.
 
  • Лойс +1
Реакции: Лёха ювелир

Лёха ювелир

✩✩✩✩✩✩✩
21 Ноя 2019
19
0
Ну без схем как то не то..
Я вот у себя L298N подключил по 2-м проводам , вместо 3-х. 2 шима. в коде 5 и 3, серва на 6-ом. Но у меня 1 мотор, без но если 2 сервы ставить, то все равно безбожно не хватает их.. придется прикручивать PCA9685.
У кого то видел код и у него четыре выхода L298N на аналоге а два на шим.Может и мне так переписать?
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,267
1,303
Москва
аналоговые работают только на вход. на выход как простые цифровые. на а4 а5 можно поставить ту же PCA9685 и получить 16 шим по i2c. я как созрею буду именно так быть, что бы на модельку повесить разных лампочек