Помогите с кодом для приемника и передатчика пожалуйста?
- Войдите на сайт для отправки комментариев
Втр, 19/07/2016 - 13:52
Привет всем разбирающимся. Помогите пожалуйста, код не компилируется, ошибка в 57 строке пункта СТАТУС. Но почему он ему не нравится японять не могу..
Приемник:
/******************************************************************************** * RC boat transmitter using nRF24L01+ * * * * * * The following links proved helpful in using the nrf24L01 * * NRF24L01 With Arduinios SPI Library http://www.elecfreaks.com/480.html * * NRF24L01 Module Demo For Arduino http://www.elecfreaks.com/203.html * * * * * * CS - Arduino digital pin 8, nRF24L01 pin 3 (CE) * * CSN - Arduino digital pin 9, nRF24L01 pin 4 (CSN) * * MOSI - Arduino digital pin 11, nRF24L01 pin 6 (MOSI) * * MISO - Arduino digital pin 12, nRF24L01 pin 7 (MISO) * * CLK - Arduino digital pin 13, nRF24L01 pin 5 (SCK) * * * /*******************************************************************************/ #include <SPI.h> #include "nRF24L01.h" #define TX_ADR_WIDTH 5 #define TX_PLOAD_WIDTH 9 #define CE 8 #define CSN 9 #define IRQ 10 int ledPin = 2; //LED int speed_x; int speed_y; int potPin_x = 0; //potentiometer to control the speed of motor 1 int potPin_y = 1; //potentiometer to control the speed of motor 2 // Define a static TX address unsigned char TX_ADDRESS[TX_ADR_WIDTH] = { 0x34, 0x43, 0x10, 0x10, 0x01 }; unsigned char rx_buf[TX_PLOAD_WIDTH] = { 0 }; // initialize value unsigned char tx_buf[TX_PLOAD_WIDTH] = "UUU/XY*$"; //************************************************** void setup() { Serial.begin( 9600 ); pinMode( ledPin, OUTPUT ); pinMode( CE, OUTPUT ); pinMode( CSN, OUTPUT ); pinMode( IRQ, INPUT ); pinMode(potPin_x, INPUT); pinMode(potPin_y, INPUT); SPI.begin(); delay( 50 ); init_io(); // Initialize IO port unsigned char status = SPI_Read( STATUS ); Serial.println( "*** Get Status ***" ); Serial.print( "status = " ); Serial.println( status, HEX ); // read the modes status register, //the default value should be 'E' Serial.println( "******************" ); TX_Mode(); // set TX mode /* String helloWorld = "hello world\n"; for ( int i = 0; i < helloWorld.length(); i++ ) tx_buf[i] = (unsigned char)helloWorld[i]; */ blink(ledPin, 10, 200); //indicate start/restart } //************************************************** void loop() { int k = 0; speed_x = analogRead(potPin_x)/4; speed_y = analogRead(potPin_y)/4; //if ( speed_x < 50 ) speed_x = 50; //if ( speed_y < 50 ) speed_y = 50; tx_buf[4] = speed_x; tx_buf[5] = speed_y; Serial.print("Speed: "); Serial.print(speed_x); Serial.print(", "); Serial.println(speed_y); /* Serial.print(" "); Serial.write(tx_buf, sizeof(tx_buf)); Serial.println(" |"); */ unsigned char status = SPI_Read( STATUS ); // read register STATUS's value // Data Sent TX FIFO interrupt, packet transmitted on TX, ACK received if( status & TX_DS ) { SPI_RW_Reg( FLUSH_TX, 0 ); // write playload to TX_FIFO SPI_Write_Buf( W_TX_PAYLOAD, tx_buf, TX_PLOAD_WIDTH ); } //Maximum number of TX retransmits occurred // if receive data ready (MAX_RT) interrupt, this is retransmit than SETUP_RETR if( status & MAX_RT ) { SPI_RW_Reg( FLUSH_TX, 0 ); SPI_Write_Buf( W_TX_PAYLOAD, tx_buf, TX_PLOAD_WIDTH ); // disable standy-mode } // clear RX_DR or TX_DS or MAX_RT interrupt flag SPI_RW_Reg( W_REGISTER + STATUS, status ); delay( 600 ); } //************************************************** void blink(int whatPin, int howManyTimes, int milliSecs) { for ( int i = 0; i < howManyTimes; i++) { digitalWrite(whatPin, LOW); delay(milliSecs/2); digitalWrite(whatPin, HIGH); delay(milliSecs/2); } } //************************************************** void init_io(void) { digitalWrite( IRQ, 0 ); digitalWrite( CE, 0 ); // chip enable digitalWrite( CSN, 1 ); // SPI disable } //************************************************** unsigned char SPI_Read( unsigned char reg ) { unsigned char reg_val; digitalWrite( CSN, 0 ); // CSN low, initialize SPI communication... SPI_RW( reg ); // Select register to read from.. reg_val = SPI_RW( 0 ); // ..then read register value digitalWrite( CSN, 1 ); // CSN high, terminate SPI communication return( reg_val ); // return register value } //************************************************** unsigned char SPI_RW( unsigned char Byte ) { return SPI.transfer( Byte ); } //************************************************** unsigned char SPI_Read_Buf( unsigned char reg, unsigned char *pBuf, unsigned char bytes ) { unsigned char status, i; digitalWrite( CSN, 0 ); // Set CSN low, init SPI tranaction status = SPI_RW( reg ); // Select register to write to and read status unsigned char for( i = 0; i < bytes; i++ ) { pBuf[i] = SPI_RW( 0 ); // Perform SPI_RW to read unsigned char from nRF24L01 } digitalWrite( CSN, 1 ); // Set CSN high again return( status ); // return nRF24L01 status unsigned char } //************************************************** unsigned char SPI_Write_Buf( unsigned char reg, unsigned char *pBuf, unsigned char bytes ) { unsigned char status, i; digitalWrite( CSN, 0 ); // Set CSN low, init SPI tranaction status = SPI_RW( reg ); // Select register to write to and read status unsigned char for( i = 0; i < bytes; i++ ) // then write all unsigned char in buffer(*pBuf) { SPI_RW( *pBuf++ ); } digitalWrite( CSN, 1 ); // Set CSN high again return( status ); // return nRF24L01 status unsigned char } //************************************************** unsigned char SPI_RW_Reg( unsigned char reg, unsigned char value ) { unsigned char status; digitalWrite( CSN, 0 ); // CSN low, init SPI transaction status = SPI_RW( reg ); // select register SPI_RW( value ); // ..and write value to it.. digitalWrite( CSN, 1 ); // CSN high again return( status ); // return nRF24L01 status unsigned char } //************************************************** void TX_Mode( void ) { digitalWrite( CE, 0 ); SPI_Write_Buf( W_REGISTER + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH ); // Writes TX_Address to nRF24L01 SPI_Write_Buf( W_REGISTER + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH ); // RX_Addr0 same as TX_Adr for Auto.Ack SPI_RW_Reg( W_REGISTER + EN_AA, 0x01 ); // Enable auto acknowledgement data pipe 0 SPI_RW_Reg( W_REGISTER + EN_RXADDR, 0x01 ); // Enable data pipe 0 SPI_RW_Reg( W_REGISTER + SETUP_RETR, 0x1a ); // auto retransmit delay = 500us, retransmit count = 10 SPI_RW_Reg( W_REGISTER + RF_CH, 40 ); // Select RF channel 40 SPI_RW_Reg( W_REGISTER + RF_SETUP, 0x07 ); // TX_PWR:0dBm, Datarate:2Mbps, LNA:HCURR SPI_RW_Reg( W_REGISTER + CONFIG, 0x0e ); // POWER UP, enable 2-byte CRC & PTX as RX/TX control // RX_DR, TX_DS & MAX_RT interrupts enabled SPI_Write_Buf( W_TX_PAYLOAD, tx_buf, TX_PLOAD_WIDTH ); digitalWrite( CE, 1 ); }
Передатчик:
/******************************************************************************** * RC Boat receiver using nRF24L01+ * * * * * * The following links proved helpful in using the nrf24L01 * * NRF24L01 With Arduinios SPI Library http://www.elecfreaks.com/480.html * * NRF24L01 Module Demo For Arduino http://www.elecfreaks.com/203.html * * * * * * CS - Arduino digital pin 8, nRF24L01 pin 3 (CE) * * CSN - Arduino digital pin 9, nRF24L01 pin 4 (CSN) * * MOSI - Arduino digital pin 11, nRF24L01 pin 6 (MOSI) * * MISO - Arduino digital pin 12, nRF24L01 pin 7 (MISO) * * CLK - Arduino digital pin 13, nRF24L01 pin 5 (SCK) * * * /*******************************************************************************/ #include <SPI.h> #include "nRF24L01.h" #define TX_ADR_WIDTH 5 #define TX_PLOAD_WIDTH 9 #define CE 8 #define CSN 9 #define IRQ 10 #define MOSI 11 #define MISO 12 int EN_A = 5; // to 1,2EN of L293D int EN_B = 6; // to 3,4EN of L293D int IN_A1 = 2; // to 1A of L293D int IN_A2 = 3; // to 2A of L293D int IN_B1 = 4; // to 3A of L293D int IN_B2 = 7; // to 4A of L293D int speed = 100; boolean dir = 1; // 1 (true) indicates forward, 0 indicates reverse // Define a static TX address unsigned char TX_ADDRESS[TX_ADR_WIDTH] = { 0x34, 0x43, 0x10, 0x10, 0x01 }; unsigned char rx_buf[TX_PLOAD_WIDTH] = { 0 }; // initialize value unsigned char tx_buf[TX_PLOAD_WIDTH] = { 0 }; int x_val = 0; int y_val = 0; int left_speed = 0; int right_speed = 0; unsigned long time = 0; //************************************************** void setup() { Serial.begin( 9600 ); init_motors(); pinMode( CE, OUTPUT ); pinMode( CSN, OUTPUT ); pinMode( IRQ, INPUT ); pinMode( MOSI, OUTPUT ); pinMode( MISO, INPUT ); SPI.begin(); delay( 50 ); init_io(); // Initialize IO port unsigned char status = SPI_Read( STATUS ); Serial.println( "*** Get Status ***" ); Serial.print( "status = " ); Serial.println( status, HEX ); // read the modes status register, // the default value should be 'E' Serial.println( "******************" ); RX_Mode(); // set RX mode } //************************************************** void loop() { int k = 0; int i = 0, j = 0, fail = 0, found = 0; int lim = TX_PLOAD_WIDTH; unsigned char value[lim]; for( i = 0; i < lim; i++ ) { rx_buf[i] = 0; } unsigned char status = SPI_Read( STATUS ); // read register STATUS's value if( status & RX_DR ) // if receive data ready (TX_DS) interrupt { SPI_Read_Buf( R_RX_PAYLOAD, rx_buf, TX_PLOAD_WIDTH ); // read playload to rx_buf SPI_RW_Reg( FLUSH_RX, 0 ); // clear RX_FIFO for ( i = 0; i < lim ; i++ ) value[i] = 0; i = 0; j = 0; while( (rx_buf[i++] != '/') && !fail ) { if ( i > lim ) { fail = 1; break; } if ( rx_buf[i] == '/' ) found = 1; } if ( found == 1 && !fail ) { while( (rx_buf[i] != '*') && !fail ) { if ( i > lim ) { fail = 1; break; } value[j++] = rx_buf[i++]; if ( rx_buf[i] == '*' ) found = 2; } if ( found == 2 && !fail ) { x_val = value[0]; y_val = value[1]; time = millis(); if ( y_val < 130 || y_val > 140 ) { if ( y_val < 130 ) { y_val = map( y_val, 130, 0, 0, 255 ); dir = 0; } else if ( y_val > 140 ) { y_val = map( y_val, 140, 255, 0, 255 ); dir = 1; } left_speed = y_val; right_speed = y_val; if ( x_val < 120 || x_val > 130 ) { if ( x_val < 120 ) { // turn left x_val = map( x_val, 120, 0, 0, y_val ); left_speed -= x_val; } else if ( x_val > 130 ) { // turn right x_val = map( x_val, 130, 255, 0, y_val ); right_speed -= x_val; } } } else { left_speed = 0; right_speed = 0; } set_left_motor(left_speed, dir); set_right_motor(right_speed, dir); Serial.print("speed: "); Serial.print(left_speed); Serial.print(", "); Serial.print(right_speed); Serial.print(", direction:"); Serial.println(dir); x_val = 0; y_val = 0; left_speed = right_speed = 0; } } if ( fail ) { Serial.println("FAIL"); stop_motors(); } /* for( i=0; i < strlen((char *)rx_buf); i++ ) { //Serial.print( rx_buf[i], HEX ); // print rx_buf as HEX Serial.write( rx_buf[i] ); // print rx_buf as Ascii Characters } //Serial.println( " " ); */ } SPI_RW_Reg( W_REGISTER+STATUS, status ); // clear RX_DR or TX_DS or MAX_RT interrupt flag if ( millis() - time > 2000 ) { // stop stop_motors(); //Serial.println("timeout"); } // delay( 1000 ); } //************************************************** void init_io (void ) { digitalWrite( IRQ, 0 ); digitalWrite( CE, 0 ); // chip enable digitalWrite( CSN, 1 ); // SPI disable } //************************************************** unsigned char SPI_Read( unsigned char reg ) { unsigned char reg_val; digitalWrite( CSN, 0 ); // CSN low, initialize SPI communication... SPI_RW( reg ); // Select register to read from.. reg_val = SPI_RW( 0 ); // ..then read register value digitalWrite( CSN, 1 ); // CSN high, terminate SPI communication return( reg_val ); // return register value } //************************************************** unsigned char SPI_RW( unsigned char Byte ) { return SPI.transfer( Byte ); } //************************************************** unsigned char SPI_Read_Buf( unsigned char reg, unsigned char *pBuf, unsigned char bytes ) { unsigned char status, i; digitalWrite( CSN, 0 ); // Set CSN low, init SPI tranaction status = SPI_RW( reg ); // Select register to write to and read status unsigned char for( i = 0; i < bytes; i++ ) { pBuf[i] = SPI_RW( 0 ); // Perform SPI_RW to read unsigned char from nRF24L01 } digitalWrite( CSN, 1 ); // Set CSN high again return( status ); // return nRF24L01 status unsigned char } //************************************************** unsigned char SPI_Write_Buf( unsigned char reg, unsigned char *pBuf, unsigned char bytes ) { unsigned char status, i; digitalWrite( CSN, 0 ); // Set CSN low, init SPI tranaction status = SPI_RW( reg ); // Select register to write to and read status unsigned char for( i = 0; i < bytes; i++ ) // then write all unsigned char in buffer(*pBuf) { SPI_RW( *pBuf++ ); } digitalWrite( CSN, 1 ); // Set CSN high again return( status ); // return nRF24L01 status unsigned char } //************************************************** unsigned char SPI_RW_Reg( unsigned char reg, unsigned char value ) { unsigned char status; digitalWrite( CSN, 0 ); // CSN low, init SPI transaction status = SPI_RW( reg ); // select register SPI_RW( value ); // ..and write value to it.. digitalWrite( CSN, 1 ); // CSN high again return( status ); // return nRF24L01 status unsigned char } //************************************************** void RX_Mode( void ) { digitalWrite( CE, 0 ); SPI_Write_Buf( W_REGISTER + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH ); // use same address as transmitting device SPI_RW_Reg( W_REGISTER + EN_AA, 0x01 ); // Enable auto acknowledgement data pipe 0 SPI_RW_Reg( W_REGISTER + EN_RXADDR, 0x01 ); // Enable data pipe 0 SPI_RW_Reg( W_REGISTER + RF_CH, 40 ); // Select RF channel 40 SPI_RW_Reg( W_REGISTER + RX_PW_P0, TX_PLOAD_WIDTH );// Select same RX payload width as TX Payload width SPI_RW_Reg( W_REGISTER + RF_SETUP, 0x07 ); // TX_PWR:0dBm, Datarate:2Mbps, LNA:HCURR SPI_RW_Reg( W_REGISTER + CONFIG, 0x0f ); // POWER UP, enable 2-byte CRC & PRX as RX/TX control // RX_DR, TX_DS & MAX_RT interrupts enabled digitalWrite( CE, 1 ); } void init_motors() { // set output modes pinMode(IN_A1, OUTPUT); pinMode(IN_A2, OUTPUT); pinMode(IN_B1, OUTPUT); pinMode(IN_B2, OUTPUT); pinMode(EN_A, OUTPUT); pinMode(EN_B, OUTPUT); // initialize ports to safely turn off the motors stop_motors(); } void stop_motors(){ set_left_motor( 0, dir); set_right_motor( 0, dir); } void set_left_motor(int speed, boolean dir) { speed = constrain(speed, 0, 255); analogWrite(EN_A, speed); // PWM on enable lines digitalWrite(IN_A1, dir); digitalWrite(IN_A2, ! dir); } void set_right_motor(int speed, boolean dir) { speed = constrain(speed, 0, 255); analogWrite(EN_B, speed); digitalWrite(IN_B1, dir); digitalWrite(IN_B2, ! dir); }
Не могу ничего сделать..
Помогите пожалуйста, код не компилируется, ошибка в 57 строке пункта СТАТУС. Но почему он ему не нравится японять не могу..
Вообще-то в ошибке как раз и написано, что ему не нравится. Или Вы думаете, что английские буковки (из которых состоят слова и предложения) там просто так написаны? Предлагаете нам самостоятельно угадывать, какое сообщение об ошибке выдал компилятор?
[/quote]
Вообще-то в ошибке как раз и написано, что ему не нравится. Или Вы думаете, что английские буковки (из которых состоят слова и предложения) там просто так написаны? Предлагаете нам самостоятельно угадывать, какое сообщение об ошибке выдал компилятор?
[/quote]
нет тут ошибки
написано по англ мол идет чтение регистра СТАТУС
нет тут ошибки
Серъезно? А это что? - error: 'STATUS' was not declared in this scope
написано по англ мол идет чтение регистра СТАТУС
Это Вы сами придумали, там написано совсем другое. Хоть бы гугл переводчиком воспользовались, он бы Вам перевёл - Ошибка: "СТАТУС" не был объявлен в этой области.
Чувствую, там подобных ошибок много будет. У Вас установлена библиотека nRF24L01? Догадываюсь, что нет. Качаете zip архив, распаковываете оттуда папку "RF24-master". Переименовываете, убираете из названия слово master, чтобы получилось просто "RF24". Перемещаете эту папку в "Мои документы\Arduino\libraries\". Перезагружаете Arduino IDE. Строку 19 меняете с #include "nRF24L01.h" на #include <nRF24L01.h> После этого код должен скомпилироваться без ошибок.
Жека! Там проблема глубже. ТС библиотеку nRF24L01.h подключает в кавычках. Константа STATUS определена там. Следовательно библиотека не подключена.
Но ТС этого не заметил, что любопытно....
--------------------------
ТС, уважаемый! Разберись с подключением библиотек!
И запомни - в "кавычках" подключение файла из текущего каталога. в <уголках> - из стандартых каталогов библиотек. Используя библиотеку, сперва подключи ее в систему - прямо в среде есть пункт "подключить библиотеку".
================================
пока писал, опоздал, но стирать не стану! ;)
спасибо сейчас попробую
Чувствую, там подобных ошибок много будет. У Вас установлена библиотека nRF24L01? Догадываюсь, что нет. Качаете zip архив, распаковываете оттуда папку "RF24-master". Переименовываете, убираете из названия слово master, чтобы получилось просто "RF24". Перемещаете эту папку в "Мои документы\Arduino\libraries\". Перезагружаете Arduino IDE. Строку 19 меняете с #include "nRF24L01.h" на #include <nRF24L01.h> После этого код должен скомпилироваться без ошибок.
извените, мы не правильно поняли друг друга. ошибка то есть, просто я перевел то, что написано в коменте а не в ошибке
Жека! Там проблема глубже. ТС библиотеку nRF24L01.h подключает в кавычках. Константа STATUS определена там. Следовательно библиотека не подключена.
Но ТС этого не заметил, что любопытно....
--------------------------
ТС, уважаемый! Разберись с подключением библиотек!
И запомни - в "кавычках" подключение файла из текущего каталога. в <уголках> - из стандартых каталогов библиотек. Используя библиотеку, сперва подключи ее в систему - прямо в среде есть пункт "подключить библиотеку".
================================
пока писал, опоздал, но стирать не стану! ;)
Подключил все и исправил все пункты. Все равно он ругается на статус..
Подключил все и исправил все пункты. Все равно он ругается на статус..
Чудес не бывает. Я проверил у себя - установил библиотеку и скомпировал Ваш код - у меня всё скомпилировалось без единой ошибки. Проверил на двух версиях Arduino IDE - 1.0.5-r2 и 1.6.6
Ещё раз внимательно прочитайте сообщение #5 и в точности выполните все рекомендации. Библиотеку подключать рекомендую всё же вручную, а не через пункт "подключить библиотеку" в среде. Убедитесь, что в папке с библиотеками только одна RF24 и других больше нет (типа RF24-master и т.д.)
Сделал в точности как вы сказали, попробывал так и попробывал без 4 верхних строчек..
и в ручную подключил и через "подключить библиотеку, ничего не выходит
может в моих кривых руках дело?
Я не уверен, но попробуйте STATUS заменить на NRF_STATUS.
STATUS был в более старой версии библиотеки
Сделал в точности как вы сказали, попробывал так и попробывал без 4 верхних строчек..
4 верхних строчки точно не нужны. Да же не знаю, в чём проблема, вроде всё правильно сделали. Попробуйте скачать более старую версию Arduino IDE, например 1.6.6 - https://www.arduino.cc/en/Main/OldSoftwareReleases
Я не уверен, но попробуйте STATUS заменить на NRF_STATUS.
STATUS был в более старой версии библиотеки
Выше я давал ссылку на гитхаб. Не знаю, какая там версия, но у меня нормально скомпилировалось со STATUS.
Zip оттуда не качается. С библиотекой по первой ссылке не компилируется. с NRF_STATUS все нормально.
У Вас походу более старая версия. Она в архивах лежит.
Zip оттуда не качается. С библиотекой по первой ссылке не компилируется. с NRF_STATUS все нормально.
Странно, у меня качается. ОК, вот страница проекта - https://github.com/maniacbug/RF24
В файле nRF24L01.h в строке 33: #define STATUS 0x07
У Вас походу более старая версия. Она в архивах лежит.
Вот нашел другую библиотеку, тоже на гитхабе - https://github.com/tmrh20/RF24
Здесь в файле nRF24L01.h в строке 34: #define NRF_STATUS 0x07
Да, так что Вы правы, проблема из-за разных версий библиотеки.
спасибо всем, скомпилировалось. но реакции 0. возможно дело в том что у меня не просто джойстик а шилд от ROBODYN и выходы не подходят