Помогите со скетчем пожалуйста
- Войдите на сайт для отправки комментариев
Втр, 21/02/2017 - 18:27
Нужно написать скетч для управления корабликом и скетч для пульта ду. В кораблике будет 2 двигателя и один сервопривод. Нужно реализовать движение вперед, повороты за счет того, что один двигатель будет отключаться, а другой работать. В наличие имеются 2 arduino nano, 2 nrf24, 2 стика, l298n, 2 двигателя.
Есть скетч очень похожий на то что мне нужно.
#include <Servo.h> #include <SPI.h> #include "RF24.h" Servo servo1; Servo servo2; RF24 radio(9,10); const uint64_t pipe = 0xE8E8F0F0E1LL; int msg[1]; int data; int pos; int fspeed; // движение в перед int bspeed; // движение назад const int in1 = 2; // управление двигателем 1 const int in2 = 4; // управление двигателем 1 const int ena = 5; // ШИМ для пропорциональной скорости машинки void setup() { pinMode(in1, OUTPUT); // подключаем к L298n pinMode(in2, OUTPUT); // подключаем к L298n pinMode(ena, OUTPUT); // подключаем к L298n servo1.attach(6); servo2.attach(3); delay(50); radio.begin(); radio.openReadingPipe(1,pipe); radio.startListening(); } void loop() { if (radio.available())radio.read(msg, 1); if (msg[0] <63 && msg[0] >-1)data = msg[0], pos = map(data, 0, 62, 10, 50),servo1.write(pos); if (msg[0] <=127 && msg[0] >=64)data = msg[0], pos = map(data, 64, 127, 0, 80),servo2.write(pos); if (msg[0] >=128 && msg[0] <=189)data = msg[0], bspeed = map(data, 255, 201, 0, 255), backward(bspeed); if (msg[0] >=201 && msg[0] <=255)data = msg[0], fspeed = map(data, 189, 128, 0, 255), forward(fspeed); if (msg[0] >190 && msg[0] <200)data = msg[0], stop(); } void stop() { analogWrite(ena, 0); digitalWrite(in1, LOW); digitalWrite(in2, LOW); } void forward(int fspeed) { digitalWrite(in1, HIGH); digitalWrite(in2, LOW); analogWrite(ena, fspeed); } void backward(int bspeed) { digitalWrite(in1, LOW); digitalWrite(in2, HIGH); analogWrite(ena, bspeed); }Он написан под эту схему
моя же отличается наличием еще одного двигателя и отсутствием одной сервы.
Вот что пытался сделать я
#include <PS2X_lib.h> // Необходимо установить библиотеку для радиомодуля nRF24 #include <Servo.h> #include <SPI.h> #include "RF24.h" Servo servo1; RF24 radio(9,10); const uint64_t pipe = 0xE8E8F0F0E1LL; int msg[1]; int data; int pos; int lspeed; int fspeed; // движение в перед int bspeed; // движение назад const int in1 = 2; // управление двигателем 1 const int in2 = 4; // управление двигателем 1 const int ena = 5; // ШИМ для пропорциональной скорости машинки const int in3=7; const int in4=8; const int enb=6; void setup() { pinMode(in1, OUTPUT); // подключаем к L298n pinMode(in2, OUTPUT); // подключаем к L298n pinMode(ena, OUTPUT); // подключаем к L298n pinMode(in3, OUTPUT); pinMode(in4, OUTPUT); pinMode(enb, OUTPUT); servo1.attach(3); delay(50); radio.begin(); radio.openReadingPipe(1,pipe); radio.startListening(); } void loop() { if (radio.available())radio.read(msg, 1); if (msg[0] <63 && msg[0] >-1)data = msg[0], lspeed = map(data, 0, 62, 10, 50),povorot(lspeed); if (msg[0] <=127 && msg[0] >=64)data = msg[0], pos = map(data, 64, 127, 0, 80),servo1.write(pos); if (msg[0] >=128 && msg[0] <=189)data = msg[0], bspeed = map(data, 255, 201, 0, 255), backward(bspeed); if (msg[0] >=201 && msg[0] <=255)data = msg[0], fspeed = map(data, 189, 128, 0, 255), forward(fspeed); if (msg[0] >190 && msg[0] <200)data = msg[0], stop(); } void stop() { analogWrite(ena, 0); analogWrite(enb, 0); } void forward(int fspeed) { digitalWrite(in1, HIGH); digitalWrite(in2, LOW); analogWrite(ena, fspeed); digitalWrite(in3, HIGH); digitalWrite(in4, LOW); analogWrite(enb, fspeed); } void backward(int bspeed) { digitalWrite(in1, LOW); digitalWrite(in2, LOW); analogWrite(ena, 0); digitalWrite(in3, HIGH); digitalWrite(in4, LOW); analogWrite(enb, bspeed); } void povorot(int lspeed) { digitalWrite(in1, HIGH); digitalWrite(in2, LOW); analogWrite(ena, lspeed); digitalWrite(in3, LOW); digitalWrite(in4, LOW); analogWrite(enb, 0); }Но к сожалению это не заработало
Здесь никто не будет выполнять Ваши хотелки.
Возможно только два варианта:
1. Вы изучаете программирование и самы выполняете свои хотелки. Постепенно. И в этом Вам помогут.
2. Вы ничего не хотите изучать, обращаетесь в раздел "Ищу исполнителья", где Вам все делают за деньги.
Определитесь, чего именно Вы хотите.
Я вас понял. Можете хотя бы посмотреть мой скетч и сказать что на первый взгляд там не правильно.
igorek874, Если у нас есть словесное описание алгоритма и скетч, то можно посмотреть их и сказать, чем одно отличается от другого. Но когда есть только скетч, то как прикажете выяснять, в чем разница между ним и тем, что Вам хочется?
Любая программа работает в точности так, как ее написал программист. Но не всегда так, как программист хотел ее написать. Мы можем узнать только первое, но ничего не можем сказать о втором.
Для начала строки с 55 по 92 перенести со строки 23 и не хватает одного пина, придётся использовать аналоговый в цифровом режиме
У меня возникли проблемы с передачей координат перемещения джойстика через модуль nrf24l01. Просто числа передаются без проблем.
#include <SPI.h> #include "nRF24L01.h" #include "RF24.h" RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно int address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб const int PIN_ANALOG_X = 0; const int PIN_ANALOG_Y = 1; int x,y; int transmit_data[3]; // массив, хранящий передаваемые данные void setup() { Serial.begin(9600); //открываем порт для связи с ПК radio.begin(); //активировать модуль 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() { x=analogRead(PIN_ANALOG_X); y=analogRead(PIN_ANALOG_Y); delay(30); Serial.println(x); Serial.println(y); transmit_data[0] = 0; transmit_data[1] = x; transmit_data[2] = y; radio.write(&transmit_data, sizeof(transmit_data)); delay(30); }Вот код передатчика. В переменные х и у значиения нормально записываются.
#include <SPI.h> #include "nRF24L01.h" #include "RF24.h" #include <Servo.h> RF24 radio(9, 10); // byte x_position; byte y_position; byte recieved_data[3]; // массив принятых данных byte servo = 3; // сервопривод на 3 цифровом Servo myservo; byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб void setup() { Serial.begin(9600); //открываем порт для связи с ПК myservo.attach(servo); radio.begin(); //активировать модуль 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) ); // чиатем входящий сигнал x_position = recieved_data[1]; Serial.println( recieved_data[1]); y_position = recieved_data[2]; Serial.println( recieved_data[2]); delay(30); } }Код приемника
Помогите пожалуйста, что не так?
Когда пробовал передавать не изменяющиеся данные а просто цифры, все работало, но вот передать координаты перемещения джойстика никак не получается.
А чем по-вашему координаты отличаются от "просто чисел"?
PS. Да, посмотрел: в начале сообщения указаны "просто числа", а в концк "просто цифры". Вы уж определитесь, числа Вы передаете или цифры?
Ничем, я про то что изменяющиеся значения не передаются, но если я х присваю например 1, то все нормально передается
Я из Вашего пояснения ничего не понял, но, навеное, Вам видней.