продолжаю свой блог. сегодня отличный день, на улице 40 тепла. сходил накупался). спасибо что помогли решить загвоздку с вычислением енергии) . частично понял причину. с этим я уже сталкивался, здесь то же самое. комплилятору нужно явно указвать тип и разрядность переменных, иначе он начинает вычислять количиство осадков на марсе. тут конечно перебор с объявлением float, но лучше уж наверняка. (хотя может лучше double?) Код (C++): Energy =(float( bullets_weight* float sq(Speed))*0.5);// Страуструп рулит!. Все!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! игрушку закончил и отладил!!! Сбоев и ложных срабатываний нет! чуйка отменная, уверенно ловит частички 1.5 мм в диаметре! адекватно вычисляет скорость и энергию и сохраняет их. отлично тестируется. убрал все delay из индикации. точность измерения 0,1 м/с (тут странно микросекунды при захвате события с датчиков явно кратны 8) пришли нормальные фототранзисторы L-53P3C. это что то! посли китайской каки прямо сказка, разброс характеристик минимален. чувствительность тоже в широком диапазоне. Но пока менять не буду, все подстроил уже под китайские и тревожить не хочу. как будет появлятся время выложу в основной теме рамочного хронографа. Всем спасибо! с рамочным хроном ВСЕ!!! (или почти все)
каk ни странно но похоже что да. хотя int должно было вполне хватать. но дело скорее всего в arduino IDEне так, как в книжке про С++ "нописоно", что если хоть однин член математического выражения число с запятой. все остальные автоматом становятся, того же типа. а в компиляторе ардуиновском, видно надо насильно компилятор тыкать носом что все члены выражения имеют тип float или double иначе получается всякая ерунда ИМХО. про Авиагоризонт, почитал посмотрел про электронные гироскопы. что то печаль. они все равно уходят с горизонта после нескольких вращений. нашел вот такой ADIS16405BMLZ с самотестирование и калибровкой, но это другая ценовая категория). а вообще для этих целей лучше старого механического гироскопа сложно что то придумать.
Арифметические операторы левоассоциативны. Тип оператора ( целочисленный или float) определяется левым операндом. В большом выражении накладывается приоритет операций и скобки.
тут думаю над следующим интересным проектом. параллельно решил выполнить " обязательную" программу Ардуинщика. Замок на RFID метках. От него возможна практическая польза, в виде электронного замка входной двери? или максимум удел такой поделки, закрытие ящичка с носками). доверили бы вы квартиру такому замку?
Привет всем. Соединил две ардуино через nrf24l01 . К одной подключил серву к другой джойстик. При включении системы серву начинает колбасить. В чем может быть проблема? #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> RF24 radio(7, 8); // CSN, CE const byte address[6] = "00001"; int x_key = A1; int y_key = A0; int x_pos; int y_pos; void setup() { radio.begin(); radio.openWritingPipe(address); radio.setPALevel(RF24_PA_MIN); radio.stopListening(); pinMode (x_key, INPUT) ; pinMode (y_key, INPUT) ; } void loop() { x_pos = analogRead (x_key) ; y_pos = analogRead (y_key) ; radio.write(&x_pos, sizeof(x_pos)); delay(100); } Код для приемника #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include <Servo.h> Servo servo; RF24 radio(7, 8); // CSN, CE const byte address[6] = "00001"; int servo_pin = 6; void setup() { Serial.begin(9600); radio.begin(); servo.attach (servo_pin ) ; radio.openReadingPipe(0, address); radio.setPALevel(RF24_PA_MIN); radio.startListening(); } void loop() { if (radio.available()) { int x_pos ; radio.read(&x_pos, sizeof(x_pos)); Serial.println(x_pos); x_pos = map(x_pos, 0, 1023, 0, 180); if (x_pos>400 && x_pos<600) { } else{ servo.write (x_pos) ; } } }
Пожалуйста оформите код кнопочкой <>. Вызывать расколбас сервомашинки могут: Выход угла подаваемого функцию write за диапазон 0-180. Но у вас скорее всё в этом деле нормально. Слишком частый вызов функции write, чаще чем каждые две с половиной миллисекунды. Постоянно меняющаяся углы это может быть вызвано никуда не подключённым аналоговым входом на передающей стороне.
Код (C++): #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> RF24 radio(7, 8); // CSN, CE const byte address[6] = "00001"; int x_key = A1; int y_key = A0; int x_pos; int y_pos; void setup() { radio.begin(); radio.openWritingPipe(address); radio.setPALevel(RF24_PA_MIN); radio.stopListening(); pinMode (x_key, INPUT) ; pinMode (y_key, INPUT) ; } void loop() { x_pos = analogRead (x_key) ; y_pos = analogRead (y_key) ; radio.write(&x_pos, sizeof(x_pos)); delay(100); } Код для приемника #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include <Servo.h> Servo servo; RF24 radio(7, 8); // CSN, CE const byte address[6] = "00001"; int servo_pin = 6; void setup() { Serial.begin(9600); radio.begin(); servo.attach (servo_pin ) ; radio.openReadingPipe(0, address); radio.setPALevel(RF24_PA_MIN); radio.startListening(); } void loop() { if (radio.available()) { int x_pos ; radio.read(&x_pos, sizeof(x_pos)); Serial.println(x_pos); x_pos = map(x_pos, 0, 1023, 0, 180); if (x_pos>400 && x_pos<600) { } else{ servo.write (x_pos) ; } } }
привет. есть две ардуино соединенные NRF24L01, для того чтобы управлять серво и L298N. Проблема: двигатель, подключенный к драйверу не крутится. В чем может быть причина? Код (C++): //ПРИЕМНИК #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 fspeed; int bspeed; const int in1 = 2; const int in2 = 4; const int ena = 5; void setup(){ pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); pinMode(ena, OUTPUT); servo1.attach(3); radio.begin(); radio.openReadingPipe(1,pipe); radio.startListening(); } void loop(){ if (radio.available())radio.read(msg, 1); if (msg[0] <128 && msg[0] >-1)data = msg[0], pos = map(data, 0, 127, 7, 177),servo1.write(pos); if (msg[0] >129 && msg[0] <189)data = msg[0], fspeed = map(data, 189, 129, 0, 255); forward(fspeed); if (msg[0] >201 && msg[0] <255)data = msg[0], bspeed = map(data, 255, 201, 0, 255); backward(bspeed); 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 <SPI.h> #include "RF24.h" RF24 radio(9,10); const uint64_t pipe = 0xE8E8F0F0E1LL; int msg[1]; int potpin_1 = A0; int val_1; int potpin_2 = A2; int val_2; void setup(void){ radio.begin(); radio.openWritingPipe(pipe); } void loop() { val_1 = analogRead(potpin_1),val_1 = map(val_1, 0, 1023, 0, 127),msg[0] = val_1,radio.write(msg, 1); val_2 = analogRead(potpin_2),val_2 = map(val_2, 0, 1023, 128, 255),msg[0] = val_2,radio.write(msg, 1); }
Причин может быть столько, что лучше обзавестись диагностическим оборудованием и выяснить самому, что да как. Действовать лучше поэтапно: выяснить сперва работает ли самостоятельно двигатель при управлении им с МК. Далее отладить связь по радиоканалу. А уже потом отлаживать протокол взаимодействия по радио. Для инициализации nRF24l01 на стороне приёмника и передатчика я использую такую рыбу: Код (C++): //.. Инициализация трансивера void nRF_Init(void) { uint8_t Buf[5]; //.. CONFIG Buf[0] = (0<<nRF_MASK_RX_DR) | (0<<nRF_MASK_TX_DS) | (0<<nRF_MASK_MAX_RT) | // маски прерываний от событий #if (!DIMMER) (0<<nRF_PRIM_RX) | // Режим передатчика #else (1<<nRF_PRIM_RX) | // Режим приемника #endif (1<<nRF_EN_CRC) | (0<<nRF_CRCO) | // Проверка CRC разрешена, 1 байт CRC (1<<nRF_PWR_UP); // Запускаем трансивер SPI_WriteArray(nRF_WR_REG(nRF_CONFIG), 1, Buf); // Отправляем команду. Пин CSN удерживается внутри функции //.. RF_CH Настройка канала Buf[0] = nRF_channel; // Установка частоты канала передачи SPI_WriteArray(nRF_WR_REG(nRF_RF_CH), 1, Buf); // см. Global_Settings.h //.. RF_SETUP Настройки радиоканала Buf[0] = (0<<nRF_RF_DR) | ((0x03)<<nRF_RF_PWR0); // Скорость передачи 1 Mbps, мощность: 0dbm SPI_WriteArray(nRF_WR_REG(nRF_RF_SETUP), 1, Buf); Buf[1] = RX_ADDR_msb; Buf[2] = RX_ADDR_msb; Buf[3] = RX_ADDR_msb; Buf[4] = RX_ADDR_msb; #if (DIMMER) // Если приемник //.. RX_ADDR_P0 Адрес канала 0 приемника Buf[0] = RX_ADDR_P0; SPI_WriteArray(nRF_WR_REG(nRF_RX_ADDR_P0), 5, Buf); /* //.. RX_ADDR_P1 Адрес канала 1 приемника Buf[0] = RX_ADDR_P1; SPI_WriteArray(nRF_WR_REG(nRF_RX_ADDR_P1), 5, Buf); //.. RX_ADDR_P2 Адрес канала 2 приемника Buf[0] = RX_ADDR_P2; SPI_WriteArray(nRF_WR_REG(nRF_RX_ADDR_P2), 1, Buf); //.. RX_ADDR_P3 Адрес канала 3 приемника Buf[0] = RX_ADDR_P3; SPI_WriteArray(nRF_WR_REG(nRF_RX_ADDR_P3), 1, Buf); //.. RX_ADDR_P4 Адрес канала 4 приемника Buf[0] = RX_ADDR_P4; SPI_WriteArray(nRF_WR_REG(nRF_RX_ADDR_P4), 1, Buf); //.. RX_ADDR_P5 Адрес канала 5 приемника Buf[0] = RX_ADDR_P5; SPI_WriteArray(nRF_WR_REG(nRF_RX_ADDR_P5), 1, Buf); */ //.. FEATURE Опции Buf[0] = (1<<nRF_EN_DPL) | (1<<nRF_EN_ACK_PAY); // Разрешаем данные SPI_WriteArray(nRF_WR_REG(nRF_FEATURE), 1, Buf); // переменной длины //.. EN_AA Автоматическая отправка ACK о приеме данных по каналу Buf[0] = (1<<nRF_ENAA_P0); SPI_WriteArray(nRF_WR_REG(nRF_EN_AA), 1, Buf); //.. DYNPD Прием данных переменной длины Buf[0] = (1<<nRF_DPL_P0); SPI_WriteArray(nRF_WR_REG(nRF_DYNPD), 1, Buf); //.. EN_RXADDR Используемые каналы приемника Buf[0] = (1<<nRF_ERX_P0); SPI_WriteArray(nRF_WR_REG(nRF_EN_RXADDR), 1, Buf); /* //.. Длина принимаемых данных по каналам Buf[0] = nRF_SEND_LEN; SPI_WriteArray(nRF_WR_REG(nRF_RX_PW_P0), 1, Buf); SPI_WriteArray(nRF_WR_REG(nRF_RX_PW_P1), 1, Buf); SPI_WriteArray(nRF_WR_REG(nRF_RX_PW_P2), 1, Buf); SPI_WriteArray(nRF_WR_REG(nRF_RX_PW_P3), 1, Buf); SPI_WriteArray(nRF_WR_REG(nRF_RX_PW_P4), 1, Buf); SPI_WriteArray(nRF_WR_REG(nRF_RX_PW_P5), 1, Buf);*/ #endif #if (!DIMMER) // Если кнопка //.. RX_ADDR_P0 Адрес канала 0 приемника Buf[0] = RX_ADDR; // На этот адрес будут приходить ACK пакеты SPI_WriteArray(nRF_WR_REG(nRF_RX_ADDR_P0), 5, Buf); //.. TX_ADDR Адрес канала удаленного приемника SPI_WriteArray(nRF_WR_REG(nRF_TX_ADDR), 5, Buf); // Адрес канала премника, на который будут уходить пакеты //.. EN_RXADDR Используемые каналы приемника. На канале 0 принимается пакет автоподтверждения Buf[0] = (1<<nRF_ERX_P0)|(0<<nRF_ERX_P1)|(0<<nRF_ERX_P2)|(0<<nRF_ERX_P3)|(0<<nRF_ERX_P4)|(0<<nRF_ERX_P5); SPI_WriteArray(nRF_WR_REG(nRF_EN_RXADDR), 1, Buf); /* //.. Длина принимаемых данных по каналам Buf[0] = nRF_ACK_LEN; SPI_WriteArray(nRF_WR_REG(nRF_RX_PW_P0), 1, Buf); */ //.. SETUP_RETR Настройка автоподтверждения Buf[0] = nRF_REPEAT_INTERVAL | nRF_REPEAT_MAX; // Автоподтверждение и интервал повтора SPI_WriteArray(nRF_WR_REG(nRF_SETUP_RETR), 1, Buf); // смотреть Settings.h //.. FEATURE Опции Buf[0] = (1<<nRF_EN_DPL) | (1<<nRF_EN_ACK_PAY); // Разрешаем прием данных SPI_WriteArray(nRF_WR_REG(nRF_FEATURE), 1, Buf); // переменной длины //.. DYNPD Прием данных переменной длины Buf[0] = (1<<nRF_DPL_P0)|(0<<nRF_DPL_P1)|(0<<nRF_DPL_P2)|(0<<nRF_DPL_P3)|(0<<nRF_DPL_P4)|(0<<nRF_DPL_P5); SPI_WriteArray(nRF_WR_REG(nRF_DYNPD), 1, Buf); //.. EN_AA Автоматическая отправка ACK о приеме данных по каналу // Buf[0] = (1<<nRF_ENAA_P0)|(0<<nRF_ENAA_P1)|(0<<nRF_ENAA_P2)|(0<<nRF_ENAA_P3)|(0<<nRF_ENAA_P4)|(0<<nRF_ENAA_P5); // SPI_WriteArray(nRF_WR_REG(nRF_EN_AA), 1, Buf); #endif Работает сразу.
Выглядеть он может так: Код (C++): #ifndef GLOBAL_SETTINGS_H_ #define GLOBAL_SETTINGS_H_ //.. Настройки трансивера #define RX_ADDR_msb 0xC2 // Значения адреса для BYTE4..1 #define RX_ADDR_P0 0xC1 // Значение младшего байта для PIPE0 #define RX_ADDR_P1 0xC2 // Значение младшего байта для PIPE1 #define RX_ADDR_P2 0xC3 // Значение младшего байта для PIPE2 #define RX_ADDR_P3 0xC4 // Значение младшего байта для PIPE3 #define RX_ADDR_P4 0xC5 // Значение младшего байта для PIPE4 #define RX_ADDR_P5 0xC6 // Значение младшего байта для PIPE5 #if (DrumStick == 1) // Настройки адресов передатчика на палке №1 #define TX_ADDR RX_ADDR_P0 // Адрес, на который будут отправляться пакеты #define RX_ADDR RX_ADDR_P0 // Адрес. на который будут приниматься ACK пакеты #elif (DrumStick == 2) #define TX_ADDR RX_ADDR_P1 #define RX_ADDR RX_ADDR_P1 #elif (DrumStick == 3) #define TX_ADDR RX_ADDR_P2 #define RX_ADDR RX_ADDR_P2 #elif (DrumStick == 4) #define TX_ADDR RX_ADDR_P3 #define RX_ADDR RX_ADDR_P3 #elif (DrumStick == 5) #define TX_ADDR RX_ADDR_P4 #define RX_ADDR RX_ADDR_P4 #elif (DrumStick == 6) #define TX_ADDR RX_ADDR_P5 #define RX_ADDR RX_ADDR_P5 #endif #define nRF_channel 83 // Канал приемо-передачи #define nRF_SEND_LEN 1 // Длина пакета данных от палочки к MIDI контроллеру #define nRF_ACK_LEN 3 // Длина ACK пакета от MIDI контроллера к палочке //.. Для возможности выбора передатчика или приемника #define no 0 #endif /* GLOBAL_SETTINGS_H_ */ Эти два файла лежат в корневой директории для того, чтобы изменения применялись сразу для всех проектов в solution. Таким образом, исключается ошибка, когда для передатчика и приёмника применяются разные настройки. Ключевые слова заношу в глобальные символы:
здарова.Подскажите пожалуйста как дописать программную часть на L298N, чтобы управлять двигателем через джойстик по NRF24l01,а то я тут намудрил что то... Код (C++): //ПРИЕМНИК #include <Servo.h> #include <SPI.h> #include "RF24.h" Servo servo1; RF24 radio(9,10); const uint64_t pipe = 0xE8E8F0F0E1LL; int massiv[2]; int enA = 5; int in1 = 2; int in2 = 4; int fspeed; int bspeed; void setup() { pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); pinMode(enA, OUTPUT); servo1.attach(3); delay(50); radio.begin(); radio.openReadingPipe(1,pipe); radio.startListening(); } void loop(){ if (radio.available()){ radio.read(&massiv,sizeof (massiv));} servo1.write(map(massiv[0], 0, 126, 7,177 )); fspeed = map(massiv[1],189,129,0,255); bspeed = map(massiv[1],255,201,0,255); if(massiv[1]>52 && massiv[1]<76){ digitalWrite(enA, 0); digitalWrite(in1, LOW); digitalWrite(in2, LOW);} if(massiv[1]>77 && massiv[1]<128){ digitalWrite(in1, HIGH); digitalWrite(in2, LOW); digitalWrite(enA, fspeed); } if(massiv[1]>1 && massiv[1]<51){ digitalWrite(in1, LOW); digitalWrite(in2, HIGH); digitalWrite(enA, bspeed); } } //ПЕРЕДАТЧИК #include <SPI.h> #include "RF24.h" RF24 radio(9,10); const uint64_t pipe = 0xE8E8F0F0E1LL; int massiv[2]; void setup(void){ radio.begin(); radio.openWritingPipe(pipe); } void loop() { massiv[0] = map (analogRead(A0),0,1023,0,127); massiv[1] = map (analogRead(A2),0,1023,128,255); radio.write(&massiv, sizeof(massiv)); }
Привет. У меня две ардуино подключены через нрф24. На одной джойстик на другой л298н с двигателем. Проблема при наклоне джойстика мотор стоит, кода джойстик в обычном положении двигатель крутится. когда наклонён в другую сторону движок ускоряется. Нужно чтобы он крутился вперёд назад при наклоне , а в обычном положении стоял. Помогите разобраться. Код (C++): //ПЕРЕДАТЧИК #include<SPI.h> #include "RF24.h" RF24 radio(9,10); const uint64_t pipe = 0xE8E8F0F0E1LL; int massiv[2]; void setup(void){ radio.begin(); radio.openWritingPipe(pipe); } void loop() { massiv[0] = map (analogRead(A1),0,1023,0,255); massiv[1] = analogRead(A2); radio.write(&massiv, sizeof(massiv)); } //ПРИЕМНИК #include <Servo.h> #include<SPI.h> #include "RF24.h" #define JOY_DEADZONE 10 #define MOTOR1_IN 5 #define MOTOR1_PWM 6 Servo servo1; RF24 radio(9,10); const uint64_t pipe = 0xE8E8F0F0E1LL; int massiv[2]; int joyMiddle; void setup(){ pinMode(MOTOR1_IN, OUTPUT); pinMode(MOTOR1_PWM, OUTPUT); joyMiddle = massiv[1]; servo1.attach(3); delay(50); radio.begin(); radio.openReadingPipe(1,pipe); radio.startListening(); } void loop(){ if (radio.available()){ radio.read(&massiv,sizeof (massiv));} servo1.write(map(massiv[0], 90, 180, 0,255)); motorControl(massiv[1],MOTOR1_IN,MOTOR1_PWM);} void motorControl(int val, byte pinIN, byte pinPWM){ if (val > joyMiddle + JOY_DEADZONE){ val = map (val,joyMiddle,1023,0,255); analogWrite (pinPWM, val); digitalWrite (pinIN, 0);} else if (val < joyMiddle - JOY_DEADZONE){ val = map(val,joyMiddle,0,255,0); analogWrite (pinPWM, val); digitalWrite (pinIN,1);} else { digitalWrite (pinIN, 0); digitalWrite (pinPWM, 0);}
А какой джойстик используете? Попробуйте так: Код (C++): massiv[0] = map (analogRead(A1)-500,0,1023,0,255);
Jester, вы скока будете по разным форумам спамить? На сколько форумов вы уже выложили этот вопрос? - вам отвечают. а вы совершенно не читаете ответов. Нафига тогда выкладывать?