void main() { unsigned char testdisplay[8]={'1','1','1','1','1','1','1','1'}; uchar i; //自己加的 // uchar datedisplay[7]; init_io(); P0=0x00;//屏蔽数码管 delay(10); //延时 // wela=0; // dula=0; // inte(); lcd_init2(); lcd12864(testdisplay); /******************自己加的**************************/ while(NRF_Check()); RX_Mode();// interface(); while(NRF24L01_RxPacket(RxBuf)!=0); while(1) { if(NRF24L01_RxPacket(RxBuf)==0) { for(i=0;i<8;i++) datedisplay[i]=RxBuf[i]; } checkbutton(); lcd12864(datedisplay); } }
//Send a packet and receive the ACK //Return true in case of success. //Polling implementation unsigned char NRF24L01_SendPacket(char *payload, char len, char *ackPayload, char *ackLen) { char status = 0; //Send the packet NRF24L01_TxPacket(payload, len); //Wait for something to happen while(((status=NRF24L01_Nop())&0x70) == 0); // Clear the flags NRF24L01_WriteReg(REG_STATUS, 0x70); //Return FALSE if the packet has not been transmited if (status&BIT_MAX_RT) { NRF24L01_FlushTx(); return 0; } //Receive the ackPayload if any has been received if (status&BIT_RX_DR) *ackLen = NRF24L01_RxPacket(ackPayload); else *ackLen = 0; NRF24L01_FlushRx(); return status&BIT_TX_DS; }
void lock() { u8 i=0; if(LOCK) { printf("locking\r\n"); if(NRF_flag == 1) { if(NRF24L01_RxPacket(tmp_buf)==0)//一旦接收到信息,则显示出来. { for(i=0;i<9;i++) { if(tmp_buf[i] != 0xff)break; UN_LOCK = 0; } if(i>=9) { UN_LOCK = 1;//解锁成功 LOCK = 0; //不需要继续解锁 first_unlock =1; i=0; } NRF24L01_Write_Reg(FLUSH_RX,0xff);//清除RX FIFO寄存器 } } NRF_flag = 0; TIM_Cmd(TIM4, ENABLE); Nrf_Star; LED2 =!LED2; } }
int main(void) { u8 rx_buf[10]; System_init(); TIM_Cmd(TIM3,ENABLE); TIM_Cmd(TIM4,ENABLE); while(1) { while(1) { if(NRF24L01_RxPacket(rx_buf) == 0) { break; } } switch(rx_buf[0]) { case '1': run1(); break; case '2': run2(); break; case '3': run3(); delay_ms(3000); PCout(0) = 0; break; case '4': run4(); delay_ms(3000); PCout(0) = 0; break; case '5': run5(); break; default: break; } rx_buf[0] = 0; } return 0; }
/******************************以下finsh中测试函数*****************************/ static void rt_rf_thread_entry(void* parameter) { rt_uint8_t buf[TX_ADR_WIDTH] = {0x00}; NRF24L01_Init(); if(NRF24L01_Check()==RT_EOK) { rt_kprintf("\r\n RF1 模块初始化成功!\r\n"); } else { rt_kprintf("\r\n RF1 模块不存在!\r\n"); return; } RX_Mode(); while (1) { if(NRF24L01_RxPacket(buf) == RT_EOK) { rt_kprintf("\r\n RF1 接收到数据:\r\n"); { rt_kprintf((char const*)buf); } } rt_thread_delay(RT_TICK_PER_SECOND/100); } }
__interrupt void PORT2_ISR(void) { if(P2IFG & 0x40) { LPM3_EXIT; NRF24L01_RxPacket(rece_buf); } P2IFG =0x00; }
void main() { uchar i; //自己加的 init_io(); P0=0x00;//屏蔽数码管 Delay400Ms(); //延时 /******************自己加的**************************/ RX_Mode(); while(NRF24L01_RxPacket(RxBuf)!=0); while(1) { if(NRF24L01_RxPacket(RxBuf)==0) { for(i=0;i<8;i++) datedisplay[i]=RxBuf[i]; } display(); } }
//主循环检测数据包 //返回是否成功处理包,0成功,1失败或无数据 u8 deal_wpan(void) //wpan检查是否有包,及处理 { if(NRF24L01_IRQ==0) { //收到包 NRF24L01_RxPacket((u8 *)&wpan_pkt); //170us读取 if(deal_pkt(&wpan_pkt)) { //返回1表示读信息,要返回数据//40us return send_pkt(&wpan_pkt); } return 0; } return 1; }
int main(void) { int dianya_fly = 0; SysTick_Init(); Tim3_Init(500); Nvic_Init(); LED_Init(); ADC1_Init(); USART1_Config(115200); KEY_Init(); NRF24L01_Init(); while (NRF24L01_Check()) //检查NRF24L01是否在位.要放在设置TX_MODE之前,否则设置的发送地址会变成check中的0XA5 ,将与原接收地址对不上 { LED2_ON; LED1_OFF; printf("no"); } LED1_ON; LED2_OFF; //TX mode //NRF24L01_TX_Mode(); //NRF24L01_Mode_Config(2); //RX mode NRF24L01_Mode_Config(3); while (1) { key = KEY_scan(); if (NRF24L01_RxPacket(tmp_buf) == 0) { NRF24L01_TxPacket_AP(rc_buf); LED1_ON; if(tmp_buf[0]==0x88 && tmp_buf[1]==0xAE && tmp_buf[2]==0x1C) { dianya_fly = tmp_buf[17]<<8|tmp_buf[18]; if(dianya_fly<36 && dianya_fly>20) { LED2_ON; } } send_wave(32,tmp_buf); } else { LED1_OFF; } } }
//接收数据包 //0,ok;1,err u8 rec_pkt(pkt_t * pkt) { u32 t; u8 res = 1; RX_Mode(&ch); //使用对端地址接收 t = systick; while(systick - t < 10 && NRF24L01_IRQ); //等待20ms,读取返回值 if(systick - t < 10) { NRF24L01_RxPacket((u8 *)pkt); //170us读取 res = 0; } RX_Mode(&mych);//最后返回本机接收模式 return res; }
void run2() { u8 ack[2]; float k; u8 run_flag = 0; // nove dir flag u8 tar2_flag; float tar2_angle[]={9.9,10.54,11.18,11.82,12.46,13.09,13.73,14.30,14.97,15.59,16.22,16.81,17.40,18.08,18.66,19.2}; u16 pwm_data[]= {10000,10000,10000,12000,12000,12000,13500,13500,13500,14000,14000,14000,14800,14800,14800,14800}; float tar2_angle_data[100],tar2_angle_data_max; float old_angle,new_angle; float x_angle; u8 rx_buf[10]; u8 long_data; u8 tar2_check = 1; int time_value; dc_moter_setspeed(2,65000); dc_moter_setspeed(4,65000); while(1) //rev data { if(NRF24L01_RxPacket(rx_buf) == 0) { break; } } LED1 = 0; long_data = rx_buf[0]*10+rx_buf[1]; if(long_data % 2) { long_data --; } //printf("long_data %d",long_data); x_angle = tar2_angle[(long_data-30)/2]; if(long_data >= 30 && long_data <35) { k = K30; } else if(long_data >= 35 && long_data <40) { k = K35; } else if(long_data >= 40 && long_data <45) { k = K40; } else if(long_data >= 45 && long_data <50) { k = K45; } else if(long_data >= 50 && long_data <55) { k = K50; } else if(long_data >= 55 && long_data <=60) { k = K55; } dc_cmd(2,1); delay_ms(780); dc_cmd(2,0); dc_cmd(4,1); delay_ms(780); dc_cmd(4,0); dc_cmd(2,1); delay_ms(780); dc_cmd(2,0); dc_cmd(4,1); delay_ms(780); dc_cmd(4,0); mpu6050_get(); old_angle = angle[1]; while(1) { delay_ms(10); //By QL 20150814 mpu6050_get(); new_angle = angle[1]; if((new_angle - old_angle)>0) { dc_cmd(2,1); dc_cmd(4,0); } else if((new_angle - old_angle)<0) { dc_cmd(4,1); dc_cmd(2,0); } if(new_angle > x_angle) { Beep(1); dc_cmd(2,0); break; } if(0 ==NRF24L01_RxPacket(ack)) { Beep(0); if(ack[0] == 's') { PDout(2)=1; dc_cmd(2,0); dc_cmd(4,0); return; } } } time_value = (int)(k * KbuChang); while(1) // 摆-----补偿循环 { mpu6050_get(); old_angle = angle[1]; delay_ms(10); //By QL 20150814 mpu6050_get(); new_angle = angle[1]; if((new_angle - old_angle)>0 && (run_flag == 0)) { dc_cmd(4,1); // start MT delay_ms(time_value); dc_cmd(4,0); // Stop MT run_flag = 1; } if((new_angle - old_angle)<0) { run_flag = 0; } if(0 ==NRF24L01_RxPacket(ack)) { Beep(0); if(ack[0] == 's') { PDout(2)=1; dc_cmd(2,0); dc_cmd(4,0); return; } } } }
void run3() { u8 tar3_time; int i; float old_angle,new_angle; int x1_pwm_data[20] = {65000,65000,60000,60000,65000,48000,45000,40000,30000,0}; int y1_pwm_data[20] = {0,35000,40000,55000,65000,60000,60000,60000,60000,60000}; int x2_pwm_data[20] = {45000,48000,65000,60000,60000,65000,65000,65000}; int y2_pwm_data[20] = {60000,60000,65000,55000,40000,35000,32000,30000}; u8 dir = 0; float x_max_angle,y_max_angle; float x_angle; float x_old_angle,x_new_angle,y_old_angle,y_new_angle; u8 tar3_flag = 0; int k = 0; int x_pwm,y_pwm; u8 rx_buf[10]; int long_angle; //printf("servlet3"); while(1) { if(NRF24L01_RxPacket(rx_buf) == 0) { break; } } LED1 = 0; long_angle = rx_buf[0]*100+rx_buf[1]*10+rx_buf[2]; if(long_angle > 180) { long_angle = 360 -long_angle; } printf("long_angle %d",long_angle); if(long_angle <= 90) { tar3_flag = 0; // xiang xian 1 } else if(long_angle > 90) { tar3_flag = 1; // xiang xian 2 } tar3_time = 12; if(long_angle > 45 && long_angle < 135) { tar3_time = 6; } if(tar3_flag == 0) // area 1 process { x_pwm = x1_pwm_data[(long_angle)/10]; y_pwm = y1_pwm_data[(long_angle)/10]; //printf("x_pwm %d y_pwm %d",x_pwm,y_pwm); dc_moter_setspeed(1,x_pwm); dc_moter_setspeed(2,y_pwm); dc_moter_setspeed(3,x_pwm); dc_moter_setspeed(4,y_pwm); i = 0; while(1) { i++; dc_cmd(1,0); // move to XX_1 dc_cmd(2,0); dc_cmd(3,1); dc_cmd(4,1); delay_ms(800); dc_cmd(3,0); // move to XX_3 dc_cmd(4,0); dc_cmd(1,1); dc_cmd(2,1); delay_ms(800); if((i*1.6)>tar3_time) { dc_cmd(3,0); // move to XX_3 dc_cmd(4,0); dc_cmd(1,0); dc_cmd(2,0); PCout(0) = 1; return ; } } } else if(tar3_flag == 1) { x_pwm = x2_pwm_data[(long_angle-100)/10]; y_pwm = y2_pwm_data[(long_angle-100)/10]; printf("x_pwm %d y_pwm %d",x_pwm,y_pwm); dc_moter_setspeed(1,x_pwm); dc_moter_setspeed(2,y_pwm); dc_moter_setspeed(3,x_pwm); dc_moter_setspeed(4,y_pwm); i = 0; while(1) { i++; dc_cmd(1,0); // move to XX_1 dc_cmd(4,0); dc_cmd(2,1); dc_cmd(3,1); delay_ms(800); dc_cmd(2,0); // move to XX_3 dc_cmd(3,0); dc_cmd(1,1); dc_cmd(4,1); delay_ms(800); if((i*1.6)>tar3_time) { dc_cmd(3,0); // move to XX_3 dc_cmd(4,0); dc_cmd(1,0); dc_cmd(2,0); PCout(0) = 1; //tar3_time_flag = 0; return ; } } } }
void run1() { u8 ack[2]; float old_angle,new_angle; //printf("servlet 1"); LED1 = 0; dc_moter_setspeed(2,65000); dc_moter_setspeed(4,65000); dc_cmd(2,1); delay_ms(780); dc_cmd(2,0); dc_cmd(4,1); delay_ms(780); dc_cmd(4,0); dc_cmd(2,1); delay_ms(780); dc_cmd(2,0); dc_cmd(4,1); delay_ms(780); dc_cmd(4,0); mpu6050_get(); old_angle = angle[1]; while(1) { delay_ms(10); //By QL 20150814 mpu6050_get(); new_angle = angle[1]; if((new_angle - old_angle)>0) { dc_cmd(2,1); dc_cmd(4,0); } else if((new_angle - old_angle)<0) { dc_cmd(4,1); dc_cmd(2,0); } if(new_angle > 15.5) { Beep(1); dc_moter_setspeed(3,50000); dc_cmd(1,0); } if(0 ==NRF24L01_RxPacket(ack)) { Beep(0); if(ack[0] == 's') { PDout(2)=1; dc_cmd(2,0); dc_cmd(4,0); return; } } } }
void un_lock() { u8 i=0; if(UN_LOCK) { // printf("moving\r\n"); if(NRF_flag == 1) { if(NRF24L01_RxPacket(tmp_buf)==0)//一旦接收到信息,则显示出来. { // while(tmp_buf[i]!= '\0') // { // printf("tmp_buf[%d] %x\r\n",i,tmp_buf[i]); // i++; // } i=0; NRF24L01_Write_Reg(FLUSH_RX,0xff);//清除RX FIFO寄存器 } // if( tmp_buf[0] != 0xff && tmp_buf[1] != 0xff ); if( tmp_buf[0] == 0xff && tmp_buf[1] == 0xff ) { if(first_unlock) { Rc_D.THROTTLE = 0; Rc_D.PITCH = 0; Rc_D.ROLL = 0; first_unlock = 0; } else { Rc_D.THROTTLE = (vs16)(tmp_buf[4]<<8)|(tmp_buf[5]); Rc_D.PITCH = (vs16)(tmp_buf[6]<<8)|(tmp_buf[7]); Rc_D.ROLL = (vs16)(tmp_buf[8]<<8)|(tmp_buf[9]); // printf("-- %d %d %d\r\n",Rc_D.THROTTLE,Rc_D.PITCH,Rc_D.ROLL); // if(Rc_D.THROTTLE != 2083)Power = Rc_D.THROTTLE / 5 -150; if(Rc_D.THROTTLE >3000)Power =Power + 100; if(Rc_D.THROTTLE <1000)Power =Power - 100; Power = Limit_Power(Power,0,999); if(Rc_D.ROLL == 2073 || fabs(Rc_D.ROLL - 2073)>20) { Target_y = ( Rc_D.ROLL - 2073 )/500; } else Target_y = 0; if(Rc_D.PITCH == 2116 || fabs(Rc_D.PITCH - 2116)>20) { Target_x = -( Rc_D.PITCH - 2116 )/500; } else Target_x = 0; NRF_flag = 0; // printf("%d\r\n",NRF_flag); TIM_Cmd(TIM4, ENABLE); Nrf_Star; LED2 =!LED2; } } } } }
//触摸画板功能演示函数 void Wireless_Play(void) { u8 err=0,i; u8 key; u8 mode;//24L01的模式设置 u8 tmp_buf[5];//低4个字节,传递坐标值,最高一个字节:0,正常画图,1清除;2,退出; mode=Wireless_Mode_Set(); if(mode==0) { SPIx_Init();//设置回原来的 SPIx_SetSpeed(SPI_SPEED_4);//18Mhz return;//24L01检测失败,直接退出 } if(mode==2) { Load_Gui_Show("清除","发送","返回");//加载界面 TX_Mode();//发送模式 }else { Load_Gui_Show("清除","接收","返回");//加载界面 RX_Mode();//接收模式 } LCD_Fill(0,0,240,296,LGRAY);//填充灰色 POINT_COLOR=BLUE;//设置字体为蓝色 while(1) { key=AI_Read_TP(20);//得到触点的状态 if(mode==1)//接收模式 { if(NRF24L01_RxPacket(tmp_buf)==0)//一旦接收到信息,则显示出来. { Pen_Point.X=tmp_buf[0]; Pen_Point.X=(Pen_Point.X<<8)+tmp_buf[1]; Pen_Point.Y=tmp_buf[2]; Pen_Point.Y=(Pen_Point.Y<<8)+tmp_buf[3]; switch(tmp_buf[4]) { case 0://正常画点 Draw_Big_Point(Pen_Point.X,Pen_Point.Y);//画点 break; case 1://清除 LCD_Fill(0,0,240,296,LGRAY);//填充灰色 break; case 2://退出 Pen_Point.Key_Reg=0;//清除笔状态 SPIx_Init();//设置回原来的 SPIx_SetSpeed(SPI_SPEED_4);//18Mhz return; } } } if(key)//触摸屏被按下 { Pen_Point.Key_Reg|=0x80;//标记按下了按键 if(Pen_Point.Y<296&&mode==2)//在画图区域内,且为发送模式 { tmp_buf[0]=Pen_Point.X>>8; tmp_buf[1]=Pen_Point.X&0xFF; tmp_buf[2]=Pen_Point.Y>>8; tmp_buf[3]=Pen_Point.Y&0xFF; tmp_buf[4]=0;//功能为0,正常画图 Draw_Big_Point(Pen_Point.X,Pen_Point.Y);//画点 err=0; while(NRF24L01_TxPacket(tmp_buf)!=TX_OK)//等待发送完成 { err++; if(err>10)return;//连续超过10次错误,则返回 } } }else if(Pen_Point.Key_Reg&0X80)//按键松开了
int main(void) { float q[4]; u8 tmp_buf[32] = {0}; float test = 0; static u8 led_on = 0; RCC_HSE_Configuration(); SysTick_Init(); NVIC_Configuration(); USART1_Config(115200); LED_Init(); LED3_Flash(2,100); ANO_TC_I2C2_INIT(0xA6, 400000, 1, 1, 3, 3); //硬实时 Tim3_Init(500);//0.005s TIM2_Init(999, 0); Mpu6050init(); MOT_GPIO_init(); MOT_PWM_init(); Set_PWM(0, 0, 0, 0); NRF24L01_Init(); while (NRF24L01_Check()) { LED2_Flash(2,500000); } //TX mode NRF24L01_Mode_Config(4); PID_Init(); ADC1_Init(); while (1) { if (getMpu6050Data == 1) { //0.01ms? Read_Mpu6050(); Mpu6050_Analyze(); getMpu6050Data = 0; } if (calculateAngle == 1)//2ms period { //0.2ms T //LED2_ON; //100us IMU_Quateration_Update((float)fGYRO_X , (float)fGYRO_Y , (float)fGYRO_Z , (float)fACCEL_X, (float)fACCEL_Y, (float)fACCEL_Z,ypr); //LED2_OFF; calculateAngle = 0; } if (sendData == 1)//2ms period { if(led_on) { LED2_OFF; led_on = 0; } else { LED2_ON; led_on = 1; } if (NRF24L01_RxPacket(tmp_buf) == 0) { //10us Rc_Data_Analyze(tmp_buf,&Rc_Data); } //if wait for the IRQ it need 9ms //if not wait for IRQ it runtime need 100us*1.2=0.12ms sendSenser((int16_t)fACCEL_X, (int16_t)fACCEL_Y, (int16_t)fACCEL_Z, (int16_t)fGYRO_X, (int16_t) fGYRO_Y, (int16_t)fGYRO_Z, (int16_t)(ypr[0] * 100), (signed short int)(ypr[1] * 100)); send_wave(32); //0.14ms run time sendPwmVoltage(&Rc_Data,(uint16_t)(motor0 / 1000.0 * 100), (uint16_t)(motor1 / 1000.0 * 100), (uint16_t)(motor2 / 1000.0 * 100), (uint16_t)(motor3 / 1000.0 * 100));//0.00003974s send_wave(32); sendData = 0; } //moveFilterAccData(fACCEL_X, fACCEL_Y, fACCEL_Z, AngleOut); if (!strcmp(Rc_Data.status, "stop")) { Set_PWM(0, 0, 0, 0); } else if (!strcmp(Rc_Data.status, "start")) { //LED2_ON; expRoll = Rc_Data.roll; expPitch = Rc_Data.pitch; expThro = Rc_Data.throttle; surRoll = ypr[2]; surPitch = ypr[1]; PID_Set(); Set_PWM(motor0, motor1, motor2, motor3); //LED2_OFF; } ////Uart1_Send_PID(320,PID_ROLL.KI,PID_ROLL.KD,1,0,0); ////send_wave(32); // if (STA == 1) // { // receive_Data(); // STA = 0; // p = 0; // } } }