sc_boolean sMCIfaceRF_sendReq(const sc_integer cmd, const sc_integer id) { unsigned char num; unsigned char mod; //clear buffer for(uint8_t i=0; i<sizeof(bufferout); i++) bufferout[i] = 0; //Lenh cho data: 1-xong mon an, 2-huy mon bufferout[0]=cmd+'0'; //Doi cmd tu so sang chu so //So thu tu mon an bufferout[1]=id+'0'; //Set Address for Data nrf24l01_settxaddr(nrf24l01_addrtx); uint8_t writeret = nrf24l01_write(bufferout); _delay_ms(1); if(writeret == 1) { return true; } else { return false; } }
sc_boolean sMCIfaceRF_sendCheck() { //set all buffer for(uint8_t i=0; i<NRF24L01_PAYLOAD; i++) bufferout[i] = 1; //Set Address for check nrf24l01_settxaddr(nrf24l01_addr5); uint8_t writeret = nrf24l01_write(bufferout); _delay_ms(1); if(writeret == 1) { return true; } else { return false; } }
sc_boolean sMCIfaceRF_sendData(const sc_integer cmd, const sc_integer id, const sc_integer dish_id, const sc_integer amount) { unsigned char num; unsigned char mod; //clear buffer for(uint8_t i=0; i<sizeof(bufferout); i++) bufferout[i] = 0; //Lenh cho data: 1-goi mon, 2-huy mon, 3-thanh toan, 4-goi boi ban bufferout[0]=cmd+'0'; //Doi cmd tu so sang chu so //Chuyen doi ma ban an hoac nha bep num=id; for (int i=1;i>=0;i--) { mod=num % 10; num/=10; bufferout[i+1]=mod+'0'; } //Chuyen doi ma mon an num=dish_id; for (int i=2;i>=0;i--) { mod=num % 10; num/=10; bufferout[3+i]=mod+'0'; } //Chuyen doi so luong mon an num=amount; for (int i=1;i>=0;i--) { mod=num % 10; num/=10; bufferout[6+i]=mod+'0'; } //Set Address for Data nrf24l01_settxaddr(nrf24l01_addrtx); uint8_t writeret = nrf24l01_write(bufferout); _delay_ms(1); if(writeret == 1) { return true; } else { return false; } }
int main(void) { #ifdef DEBUGPRINT uart_init(UART_BAUD_SELECT_DOUBLE_SPEED(57600, F_CPU)); #endif char* node_address = "OWRF1"; node_address[4] += NODENUM; OWInit(5); nrf24l01_init(); nrf24l01_settxaddr((uint8_t*) node_address); nrf24l01_setrxaddr(0, (uint8_t*) node_address); nrf24l01_setrxaddr(1, (uint8_t*) "OWRF0"); sei(); for (;;) { uint8_t pipe; if (nrf24l01_readready(&pipe)) { int len = owrf_read(transfer_buf); if (len != -1) { #ifdef DEBUGPRINT debugPrint("channel=%d command=%X datalen=%d\r\n", transfer_buf[0], transfer_buf[1], transfer_buf[2]); for (int i = 0; i < transfer_buf[2]; i++) { debugPrint(">%02X", transfer_buf[i+3]); } debugPrint("\r\n"); #endif if (transfer_buf[0] == NODENUM) { len = doSlave(transfer_buf + 1) + 3; #ifdef DEBUGPRINT debugPrint("retval=%X datalen=%d\r\n", transfer_buf[1], transfer_buf[2]); for (int i = 0; i < transfer_buf[2]; i++) { debugPrint("<%02X", transfer_buf[i+3]); } debugPrint("\r\n"); #endif _delay_ms(5); owrf_write(transfer_buf, len); } } } } }
sc_boolean sMCIfaceRF_sendMsg(const sc_string msg) { //clear buffer for(uint8_t i=0; i<NRF24L01_PAYLOAD; i++) { if (i<strlen(msg)) bufferout[i]=msg[i]; else bufferout[i] = 0; } //Set Address for Data nrf24l01_settxaddr(nrf24l01_addrtx); uint8_t writeret = nrf24l01_write(bufferout); _delay_ms(1); if(writeret == 1) { return true; } else { return false; } }
//main here int main(void) { uint8_t i = 0; char *wheel = "|/-\\"; //sending buffer addresses uint8_t sendpipe = 0; uint8_t addrtx0[NRF24L01_ADDRSIZE] = NRF24L01_ADDRP0; #if defined(TX) long *ptr = 0; double qw = 1.0f; double qx = 0.0f; double qy = 0.0f; double qz = 0.0f; double roll = 0.0f; double pitch = 0.0f; double yaw = 0.0f; //nrf24l01 variables uint8_t bufferout[NRF24L01_PAYLOAD]; #elif defined(RX) uint8_t bufferin[NRF24L01_PAYLOAD]; #endif //init uart uart_init(UART_BAUD_SELECT(UART_BAUD_RATE, F_CPU)); mpu6050_init(); nrf24l01_init(); sei(); uart_puts("\r\nUART initialized... \r\n"); _delay_ms(50); uart_puts("nrf24l01+ initialized... \r\n"); //init nrf24l01 _delay_ms(50); #if defined(TX) mpu6050_dmpInitialize(); mpu6050_dmpEnable(); _delay_ms(10); uart_puts("mpu6050 initialized... \r\n"); #endif //init interrupt uart_puts("interrupts enabled... \r\n"); for(i=0; i<100; i++) { uart_putc(wheel[i%4]); _delay_ms(10); uart_putc('\b'); } uart_puts("\r\n"); #if defined(TX) uart_puts("starting as tx...\r\n"); #elif defined(RX) uart_puts("starting as rx...\r\n"); #endif //setup buffer #if defined(TX) for(i=0; i<sizeof(bufferout); i++) bufferout[i] = ' '; #elif defined(RX) for(i=0; i<sizeof(bufferin); i++) bufferin[i] = 0; #endif #if NRF24L01_PRINTENABLE == 1 nrf24l01_printinfo(uart_puts, uart_putc); #endif //main loop nrf24l01_settxaddr(addrtx0); #if defined(TX) for(;;) { //tx char pipebuffer[5]; itoa(sendpipe, pipebuffer, 10); if(mpu6050_getQuaternionWait(&qw, &qx, &qy, &qz)) mpu6050_getRollPitchYaw(qw, qx, qy, qz, &roll, &pitch, &yaw); _delay_ms(10); //quaternion ptr = (long *)(&qw); for (i=0; i<4; i++) *(bufferout+i) = *ptr>>(i*8); ptr = (long *)(&qx); for (i=0; i<4; i++) *(bufferout+i+4) = *ptr>>(i*8); ptr = (long *)(&qy); for (i=0; i<4; i++) *(bufferout+i+8) = *ptr>>(i*8); ptr = (long *)(&qz); for (i=0; i<4; i++) *(bufferout+i+12) = *ptr>>(i*8); // roll pitch yaw ptr = (long *)(&roll); for (i=0; i<4; i++) *(bufferout+i+16) = *ptr>>(i*8); ptr = (long *)(&pitch); for (i=0; i<4; i++) *(bufferout+i+20) = *ptr>>(i*8); ptr = (long *)(&yaw); for (i=0; i<4; i++) *(bufferout+i+24) = *ptr>>(i*8); nrf24l01_write(bufferout); } #elif defined(RX) for(;;) { //rx uint8_t pipe = 0; if(nrf24l01_readready(&pipe)) { //if data is ready //read buffer nrf24l01_read(bufferin); for (i=0; i < 4*7; i++) uart_putc(*(bufferin+i)); uart_putc('\n'); } _delay_ms(10); } #endif }
//main here int main(void) { uint8_t txrxrole = 0; // 1 transmitter 0 receiver uint8_t i = 0; //nrf24l01 variables uint8_t bufferout[NRF24L01_PAYLOAD]; uint8_t bufferin[NRF24L01_PAYLOAD]; #if DEBUGENABLED == 1 //init uart USART_Init(103); #endif //LCD init lcd_init(); lcd_gotoxy1(0); //init nrf24l01 nrf24l01_init(); //init interrupt sei(); txrxrole = ROLERX; ///////////////////////////////////////////////// #if DEBUGENABLED == 1 if(txrxrole == ROLETX) uart_putc('T'); else if(txrxrole == ROLERX) uart_putc('R'); #endif //setup buffer for(i=0; i<sizeof(bufferout); i++) bufferout[i] = i+'a'; for(i=0; i<sizeof(bufferin); i++) bufferin[i] = 0; //sending buffer addresses uint8_t sendpipe = 0; uint8_t addrtx0[NRF24L01_ADDRSIZE] = NRF24L01_ADDRP0; uint8_t addrtx1[NRF24L01_ADDRSIZE] = NRF24L01_ADDRP1; uint8_t addrtx2[NRF24L01_ADDRSIZE] = NRF24L01_ADDRP2; uint8_t addrtx3[NRF24L01_ADDRSIZE] = NRF24L01_ADDRP3; uint8_t addrtx4[NRF24L01_ADDRSIZE] = NRF24L01_ADDRP4; uint8_t addrtx5[NRF24L01_ADDRSIZE] = NRF24L01_ADDRP5; #if DEBUGENABLED == 1 && NRF24L01_PRINTENABLE == 1 nrf24l01_printinfo(uart_puts, uart_putc); #endif //main loop for(;;) { if(txrxrole == ROLETX) {//Tx #if DEBUGENABLED == 1 char pipebuffer[5]; uart_puts("sending data, on pipe "); itoa(sendpipe, pipebuffer, 10); uart_puts(pipebuffer); uart_puts("... "); #endif if(sendpipe == 0){ //set tx address for pipe 0 nrf24l01_settxaddr(addrtx0); } else if(sendpipe == 1) { //set tx address for pipe 1 nrf24l01_settxaddr(addrtx1); } else if(sendpipe == 2) { //set tx address for pipe 2 nrf24l01_settxaddr(addrtx2); } else if(sendpipe == 3) { //set tx address for pipe 3 nrf24l01_settxaddr(addrtx3); } else if(sendpipe == 4) { //set tx address for pipe 4 nrf24l01_settxaddr(addrtx4); } else if(sendpipe == 5) { //set tx address for pipe 5 nrf24l01_settxaddr(addrtx5); } //write buffer uint8_t writeret = nrf24l01_write(bufferout); #if DEBUGENABLED == 1 if(writeret == 1) uart_puts("ok\r\n"); else uart_puts("failed\r\n"); #endif sendpipe++; sendpipe%=6; #if DEBUGENABLED == 0 } #endif #if DEBUGENABLED == 1 _delay_ms(1000); #endif } else if(txrxrole == ROLERX)
/* * init nrf24l01 */ void nrf24l01_init() { uint8_t activate[] = {ACTIVATE, ACTIVATE_ARG}; uint8_t dynPd[] = {DYNPD, 0x01}; uint8_t feature = 0; //setup port NRF24L01_CSN_DDR |= (1<<NRF24L01_CSN); //output NRF24L01_CE_DDR |= (1<<NRF24L01_CE); //output spi_init(); //init spi nrf24l01_CElo; //low CE nrf24l01_CSNhi; //high CSN _delay_ms(5); //wait for the radio to init nrf24l01_writeregister(FEATURE, NRF24L01_FEATURE_EN_DPL | NRF24L01_FEATURE_PAYLOAD_WITH_ACK); feature = nrf24l01_readregister(FEATURE); if (((feature & NRF24L01_FEATURE_EN_DPL) == 0) || ((feature & NRF24L01_FEATURE_PAYLOAD_WITH_ACK) == 0)) { nrf24l01_command(activate, 2); nrf24l01_writeregister(FEATURE, NRF24L01_FEATURE_EN_DPL | NRF24L01_FEATURE_PAYLOAD_WITH_ACK); } //tx address nrf24l01_settxaddr(nrf24l01_addrtx); //rx address nrf24l01_setrxaddr(0, nrf24l01_addr0); //nrf24l01_setrxaddr(1, nrf24l01_addr1); //nrf24l01_setrxaddr(2, nrf24l01_addr2); //nrf24l01_setrxaddr(3, nrf24l01_addr3); //nrf24l01_setrxaddr(4, nrf24l01_addr4); //nrf24l01_setrxaddr(5, nrf24l01_addr5); //auto ack #if NRF24L01_ACK == 1 //nrf24l01_readregister(NRF24L01_REG_EN_AA) | nrf24l01_writeregister(NRF24L01_REG_EN_AA, (1<<NRF24L01_REG_ENAA_P0)); //nrf24l01_writeregister(NRF24L01_REG_EN_AA, nrf24l01_readregister(NRF24L01_REG_EN_AA) | (1<<NRF24L01_REG_ENAA_P1)); //nrf24l01_writeregister(NRF24L01_REG_EN_AA, nrf24l01_readregister(NRF24L01_REG_EN_AA) | (1<<NRF24L01_REG_ENAA_P2)); //nrf24l01_writeregister(NRF24L01_REG_EN_AA, nrf24l01_readregister(NRF24L01_REG_EN_AA) | (1<<NRF24L01_REG_ENAA_P3)); //nrf24l01_writeregister(NRF24L01_REG_EN_AA, nrf24l01_readregister(NRF24L01_REG_EN_AA) | (1<<NRF24L01_REG_ENAA_P4)); //nrf24l01_writeregister(NRF24L01_REG_EN_AA, nrf24l01_readregister(NRF24L01_REG_EN_AA) | (1<<NRF24L01_REG_ENAA_P5)); #else //nrf24l01_writeregister(NRF24L01_REG_EN_AA, nrf24l01_readregister(NRF24L01_REG_EN_AA) & ~(1<<NRF24L01_REG_ENAA_P0)); //nrf24l01_writeregister(NRF24L01_REG_EN_AA, nrf24l01_readregister(NRF24L01_REG_EN_AA) & ~(1<<NRF24L01_REG_ENAA_P1)); //nrf24l01_writeregister(NRF24L01_REG_EN_AA, nrf24l01_readregister(NRF24L01_REG_EN_AA) & ~(1<<NRF24L01_REG_ENAA_P2)); //nrf24l01_writeregister(NRF24L01_REG_EN_AA, nrf24l01_readregister(NRF24L01_REG_EN_AA) & ~(1<<NRF24L01_REG_ENAA_P3)); //nrf24l01_writeregister(NRF24L01_REG_EN_AA, nrf24l01_readregister(NRF24L01_REG_EN_AA) & ~(1<<NRF24L01_REG_ENAA_P4)); //nrf24l01_writeregister(NRF24L01_REG_EN_AA, nrf24l01_readregister(NRF24L01_REG_EN_AA) & ~(1<<NRF24L01_REG_ENAA_P5)); #endif //enable pipe nrf24l01_writeregister(NRF24L01_REG_EN_RXADDR, 0); #if NRF24L01_ENABLEDP0 == 1 nrf24l01_writeregister(NRF24L01_REG_EN_RXADDR, nrf24l01_readregister(NRF24L01_REG_EN_RXADDR) | (1<<NRF24L01_REG_ERX_P0)); #endif #if NRF24L01_ENABLEDP1 == 1 nrf24l01_writeregister(NRF24L01_REG_EN_RXADDR, nrf24l01_readregister(NRF24L01_REG_EN_RXADDR) | (1<<NRF24L01_REG_ERX_P1)); #endif #if NRF24L01_ENABLEDP2 == 1 nrf24l01_writeregister(NRF24L01_REG_EN_RXADDR, nrf24l01_readregister(NRF24L01_REG_EN_RXADDR) | (1<<NRF24L01_REG_ERX_P2)); #endif #if NRF24L01_ENABLEDP3 == 1 nrf24l01_writeregister(NRF24L01_REG_EN_RXADDR, nrf24l01_readregister(NRF24L01_REG_EN_RXADDR) | (1<<NRF24L01_REG_ERX_P3)); #endif #if NRF24L01_ENABLEDP4 == 1 nrf24l01_writeregister(NRF24L01_REG_EN_RXADDR, nrf24l01_readregister(NRF24L01_REG_EN_RXADDR) | (1<<NRF24L01_REG_ERX_P4)); #endif #if NRF24L01_ENABLEDP5 == 1 nrf24l01_writeregister(NRF24L01_REG_EN_RXADDR, nrf24l01_readregister(NRF24L01_REG_EN_RXADDR) | (1<<NRF24L01_REG_ERX_P5)); #endif nrf24l01_writeregister(NRF24L01_REG_SETUP_RETR, NRF24L01_RETR); // set retries nrf24l01_writeregister(NRF24L01_REG_RF_CH, NRF24L01_CH); //set RF channel //payload size #if NRF24L01_ENABLEDP0 == 1 nrf24l01_writeregister(NRF24L01_REG_RX_PW_P0, NRF24L01_PAYLOAD); #endif #if NRF24L01_ENABLEDP1 == 1 nrf24l01_writeregister(NRF24L01_REG_RX_PW_P1, NRF24L01_PAYLOAD); #endif #if NRF24L01_ENABLEDP2 == 1 nrf24l01_writeregister(NRF24L01_REG_RX_PW_P2, NRF24L01_PAYLOAD); #endif #if NRF24L01_ENABLEDP3 == 1 nrf24l01_writeregister(NRF24L01_REG_RX_PW_P3, NRF24L01_PAYLOAD); #endif #if NRF24L01_ENABLEDP4 == 1 nrf24l01_writeregister(NRF24L01_REG_RX_PW_P4, NRF24L01_PAYLOAD); #endif #if NRF24L01_ENABLEDP5 == 1 nrf24l01_writeregister(NRF24L01_REG_RX_PW_P5, NRF24L01_PAYLOAD); #endif nrf24l01_setpalevel(); //set power level nrf24l01_setdatarate(); //set data rate nrf24l01_setcrclength(); //set crc length //nrf24l01_writeregister(NRF24L01_REG_DYNPD, 1); //enable dynamic payloads nrf24l01_command(dynPd, 2); //set rx mode nrf24l01_setRX(); }