使用手柄遥控小车是经常要用到的,看到PS2手柄很6,就拿来尝试一下。
PS2手柄是索尼的PlayStation2游戏机的遥控手柄,因为这款手柄性价比较高,按键丰富,方便扩展到其它应用中,后来有人将其通讯协议破解,使得手柄可以用在遥控其他电器上,比如遥控控制机器人小车。

最主要的是这款手柄,拿来就可以用,有人已经将其通讯协议破解了。
具体可以参考极客工坊。 其PS2X_lib库,可以参见Github.
这种摇杆有无线的和有线的,都是连接到Arduino上,我用的是有线的。

1. 手柄测试

将库文件放入Arduino IDE的安装的libaries文件夹中。 然后可以使用其中的example 例程测试一下。
程序如下:

#include <PS2X_lib.h>  //for v1.6/******************************************************************* set pins connected to PS2 controller:*   - 1e column: original *   - 2e colmun: Stef?* replace pin numbers by the ones you use******************************************************************/
#define PS2_DAT        13  //14
#define PS2_CMD        11  //15
#define PS2_SEL        10  //16
#define PS2_CLK        12  //17/******************************************************************* select modes of PS2 controller:*   - pressures = analog reading of push-butttons *   - rumble    = motor rumbling* uncomment 1 of the lines for each mode selection******************************************************************/
//#define pressures   true
#define pressures   false
//#define rumble      true
#define rumble      falsePS2X ps2x; // create PS2 Controller Class//right now, the library does NOT support hot pluggable controllers, meaning
//you must always either restart your Arduino after you connect the controller,
//or call config_gamepad(pins) again after connecting the controller.int error = 0;
byte type = 0;
byte vibrate = 0;// Reset func
void (* resetFunc) (void) = 0;void setup(){Serial.begin(115200);delay(500);  //added delay to give wireless ps2 module some time to startup, before configuring it//CHANGES for v1.6 HERE!!! **************PAY ATTENTION*************//setup pins and settings: GamePad(clock, command, attention, data, Pressures?, Rumble?) check for errorerror = ps2x.config_gamepad(PS2_CLK, PS2_CMD, PS2_SEL, PS2_DAT, pressures, rumble);if(error == 0){Serial.print("Found Controller, configured successful ");Serial.print("pressures = ");if (pressures)Serial.println("true ");elseSerial.println("false");Serial.print("rumble = ");if (rumble)Serial.println("true)");elseSerial.println("false");Serial.println("Try out all the buttons, X will vibrate the controller, faster as you press harder;");Serial.println("holding L1 or R1 will print out the analog stick values.");Serial.println("Note: Go to www.billporter.info for updates and to report bugs.");}  else if(error == 1)Serial.println("No controller found, check wiring, see readme.txt to enable debug. visit www.billporter.info for troubleshooting tips");else if(error == 2)Serial.println("Controller found but not accepting commands. see readme.txt to enable debug. Visit www.billporter.info for troubleshooting tips");else if(error == 3)Serial.println("Controller refusing to enter Pressures mode, may not support it. ");type = ps2x.readType(); switch(type) {case 0:Serial.println("Unknown Controller type found ");break;case 1:Serial.println("DualShock Controller found ");break;case 2:Serial.println("GuitarHero Controller found ");break;case 3:Serial.println("Wireless Sony DualShock Controller found ");break;}
}void loop() {/* You must Read Gamepad to get new values and set vibration valuesps2x.read_gamepad(small motor on/off, larger motor strenght from 0-255)if you don't enable the rumble, use ps2x.read_gamepad(); with no valuesYou should call this at least once a second*/  if(error == 1){ //skip loop if no controller foundresetFunc();}if(type == 2){ //Guitar Hero Controllerps2x.read_gamepad();          //read controller if(ps2x.ButtonPressed(GREEN_FRET))Serial.println("Green Fret Pressed");if(ps2x.ButtonPressed(RED_FRET))Serial.println("Red Fret Pressed");if(ps2x.ButtonPressed(YELLOW_FRET))Serial.println("Yellow Fret Pressed");if(ps2x.ButtonPressed(BLUE_FRET))Serial.println("Blue Fret Pressed");if(ps2x.ButtonPressed(ORANGE_FRET))Serial.println("Orange Fret Pressed"); if(ps2x.ButtonPressed(STAR_POWER))Serial.println("Star Power Command");if(ps2x.Button(UP_STRUM))          //will be TRUE as long as button is pressedSerial.println("Up Strum");if(ps2x.Button(DOWN_STRUM))Serial.println("DOWN Strum");if(ps2x.Button(PSB_START))         //will be TRUE as long as button is pressedSerial.println("Start is being held");if(ps2x.Button(PSB_SELECT))Serial.println("Select is being held");if(ps2x.Button(ORANGE_FRET)) {     // print stick value IF TRUESerial.print("Wammy Bar Position:");Serial.println(ps2x.Analog(WHAMMY_BAR), DEC); } }else { //DualShock Controllerps2x.read_gamepad(false, vibrate); //read controller and set large motor to spin at 'vibrate' speedif(ps2x.Button(PSB_START))         //will be TRUE as long as button is pressedSerial.println("Start is being held");if(ps2x.Button(PSB_SELECT))Serial.println("Select is being held");      if(ps2x.Button(PSB_PAD_UP)) {      //will be TRUE as long as button is pressedSerial.print("Up held this hard: ");Serial.println(ps2x.Analog(PSAB_PAD_UP), DEC);}if(ps2x.Button(PSB_PAD_RIGHT)){Serial.print("Right held this hard: ");Serial.println(ps2x.Analog(PSAB_PAD_RIGHT), DEC);}if(ps2x.Button(PSB_PAD_LEFT)){Serial.print("LEFT held this hard: ");Serial.println(ps2x.Analog(PSAB_PAD_LEFT), DEC);}if(ps2x.Button(PSB_PAD_DOWN)){Serial.print("DOWN held this hard: ");Serial.println(ps2x.Analog(PSAB_PAD_DOWN), DEC);}   vibrate = ps2x.Analog(PSAB_CROSS);  //this will set the large motor vibrate speed based on how hard you press the blue (X) buttonif (ps2x.NewButtonState()) {        //will be TRUE if any button changes state (on to off, or off to on)if(ps2x.Button(PSB_L3))Serial.println("L3 pressed");if(ps2x.Button(PSB_R3))Serial.println("R3 pressed");if(ps2x.Button(PSB_L2))Serial.println("L2 pressed");if(ps2x.Button(PSB_R2))Serial.println("R2 pressed");if(ps2x.Button(PSB_TRIANGLE))Serial.println("Triangle pressed");        }if(ps2x.ButtonPressed(PSB_CIRCLE))               //will be TRUE if button was JUST pressedSerial.println("Circle just pressed");if(ps2x.NewButtonState(PSB_CROSS))               //will be TRUE if button was JUST pressed OR releasedSerial.println("X just changed");if(ps2x.ButtonReleased(PSB_SQUARE))              //will be TRUE if button was JUST releasedSerial.println("Square just released");     if(ps2x.Button(PSB_L1) || ps2x.Button(PSB_R1)) { //print stick values if either is TRUESerial.print("Stick Values:");Serial.print(ps2x.Analog(PSS_LY), DEC); //Left stick, Y axis. Other options: LX, RY, RX  Serial.print(",");Serial.print(ps2x.Analog(PSS_LX), DEC); Serial.print(",");Serial.print(ps2x.Analog(PSS_RY), DEC); Serial.print(",");Serial.println(ps2x.Analog(PSS_RX), DEC); }     }delay(50);
}

在IDE中编译后下载到Arduino中,打开串口监视器,如果顺利,会看到显示下列提示:

如果提示未发现控制器,那就需要检查自己的连线等是不是有问题了,我在用的时候,因为杜邦线的问题,一直提示找不到控制器,我还怀疑是不是买的手柄有问题,又拿Stm32的板子来测试,折腾了半天竟然是线的问题。

连接后,按下手柄上的各个键都会有相应提示,可以看出哪个按键定义的什么名字。
在上述代码中,左边的四个按键只是显示按键按下,不会根据力的大小输出相应数值的,如果想要,就需要修改下列代码:

上述程序第20行到23行将注释调换一下条改为:

#define pressures   true
//#define pressures   false
#define rumble      true
//#define rumble      false

这样就可以实现通过按左侧”上下左右“按键的力度,输出不同的模拟值。

2. 小车电机控制

电机:有刷直流电机
驱动器:L298n逻辑
控制器:Arduino Mega2560

程序功能实现:
- 按下START键,开始前进;
- 通过按PS2手柄左边的“上下左右”键实现前进 、后退、左转、右转。
- 按SELECT键停止;

#include <PS2X_lib.h>  //for v1.6/******************************************************************* set pins connected to PS2 controller:*   - 1e column: original *   - 2e colmun: Stef?* replace pin numbers by the ones you use******************************************************************/
//PS2手柄引脚;
#define PS2_DAT        13  //14
#define PS2_CMD        11  //15
#define PS2_SEL        10  //16
#define PS2_CLK        12  //17// 电机控制引脚;
#define IN1 4
#define IN2 5
#define IN3 6
#define IN4 7//PWM控制引脚;int speedPinA = 8;int speedPinB = 9;int speed;/******************************************************************* select modes of PS2 controller:*   - pressures = analog reading of push-butttons *   - rumble    = motor rumbling* uncomment 1 of the lines for each mode selection******************************************************************/
#define pressures   true
//#define pressures   false
#define rumble      true
//#define rumble      falsePS2X ps2x; // create PS2 Controller Class//right now, the library does NOT support hot pluggable controllers, meaning
//you must always either restart your Arduino after you connect the controller,
//or call config_gamepad(pins) again after connecting the controller.int error = 0;
byte type = 0;
byte vibrate = 0;void setup(){pinMode(IN1, OUTPUT);pinMode(IN2, OUTPUT);pinMode(IN3, OUTPUT);pinMode(IN4, OUTPUT);speed =200;Serial.begin(57600);delay(300) ; //added delay to give wireless ps2 module some time to startup, before configuring it//CHANGES for v1.6 HERE!!! **************PAY ATTENTION*************//setup pins and settings: GamePad(clock, command, attention, data, Pressures?, Rumble?) check for errorerror = ps2x.config_gamepad(PS2_CLK, PS2_CMD, PS2_SEL, PS2_DAT, pressures, rumble);if(error == 0){Serial.print("Found Controller, configured successful ");Serial.print("pressures = ");if (pressures)Serial.println("true ");elseSerial.println("false");Serial.print("rumble = ");if (rumble)Serial.println("true)");elseSerial.println("false");Serial.println("Try out all the buttons, X will vibrate the controller, faster as you press harder;");Serial.println("holding L1 or R1 will print out the analog stick values.");Serial.println("Note: Go to www.billporter.info for updates and to report bugs.");}  else if(error == 1)Serial.println("No controller found, check wiring, see readme.txt to enable debug. visit www.billporter.info for troubleshooting tips");else if(error == 2)Serial.println("Controller found but not accepting commands. see readme.txt to enable debug. Visit www.billporter.info for troubleshooting tips");else if(error == 3)Serial.println("Controller refusing to enter Pressures mode, may not support it. ");//  Serial.print(ps2x.Analog(1), HEX);type = ps2x.readType(); switch(type) {case 0:Serial.print("Unknown Controller type found ");break;case 1:Serial.print("DualShock Controller found ");break;case 2:Serial.print("GuitarHero Controller found ");break;case 3:Serial.print("Wireless Sony DualShock Controller found ");break;}
}void turnLeft(){digitalWrite(IN1,HIGH);digitalWrite(IN2, LOW);digitalWrite(IN3, LOW);digitalWrite(IN4,HIGH);
}void turnRight(){digitalWrite(IN1, LOW);digitalWrite(IN2, LOW);digitalWrite(IN3, HIGH);digitalWrite(IN4, LOW);
}void forward(){digitalWrite(IN1, HIGH);digitalWrite(IN2, LOW);digitalWrite(IN3, HIGH);digitalWrite(IN4, LOW);
}void back(){digitalWrite(IN1, LOW);digitalWrite(IN2, HIGH);digitalWrite(IN3, LOW);digitalWrite(IN4, HIGH);
}void loop(){/* You must Read Gamepad to get new values and set vibration valuesps2x.read_gamepad(small motor on/off, larger motor strenght from 0-255)if you don't enable the rumble, use ps2x.read_gamepad(); with no valuesYou should call this at least once a second*/  if(error == 1) //skip loop if no controller foundreturn; if(type == 2) {//Guitar Hero Controllerreturn;}else  { //DualShock Controllerps2x.read_gamepad(false, vibrate); //read controller and set large motor to spin at 'vibrate' speed//start 开始运行,电机初PWM为120;if(ps2x.Button(PSB_START))  {Serial.println("Start is being held");speed = 120;analogWrite(speedPinA, speed);analogWrite(speedPinB, speed);forward();                  }
// 电机正转;if(ps2x.Button(PSB_PAD_UP)){Serial.println("Up held this hard: ");speed= 200;analogWrite(speedPinA, speed);analogWrite(speedPinB, speed);forward();                  }// 电机反转;if(ps2x.Button(PSB_PAD_DOWN)){Serial.print("Down held this hard: ");speed= 200;analogWrite(speedPinA, speed);analogWrite(speedPinB, speed);back();                  }//左转;   if(ps2x.Button(PSB_PAD_LEFT)){Serial.println("turn left ");analogWrite(speedPinA, speed);analogWrite(speedPinB, 0);turnLeft();        }//右转;if(ps2x.Button(PSB_PAD_RIGHT)){Serial.println("turn right");analogWrite(speedPinA, 0);analogWrite(speedPinB, speed);turnRight();}
// Stopif(ps2x.Button(PSB_SELECT)){Serial.println("stop");speed = 0;analogWrite(speedPinA,speed);analogWrite(speedPinB,speed);}}
}

目前是拿来尝试一下,还是基于按键的实现,后面用摇杆来控制方向的速度。

3. 摇杆控制

功能实现:

  • 通过按PS2摇杆的“上下左右”移动实现前进 、后退、左转、右转。
  • 速度随摇杆位置变化而变化;
/* 功能:通过按PS2摇杆的“上下左右”移动实现前进 、后退、左转、右转。* * 作者:lcl;*/
#include <PS2X_lib.h>  //for v1.6
/******************************************************************* set pins connected to PS2 controller:*   - 1e column: original*   - 2e colmun: Stef?* replace pin numbers by the ones you use******************************************************************/
//PS2手柄引脚;
#define PS2_DAT        13  //14
#define PS2_CMD        11  //15
#define PS2_SEL        10  //16
#define PS2_CLK        12  //17
// 电机控制引脚;
#define IN1 4
#define IN2 5
#define IN3 6
#define IN4 7int speedPinA = 8;int speedPinB = 9;
int speed;
//speed =200;
/******************************************************************* select modes of PS2 controller:*   - pressures = analog reading of push-butttons*   - rumble    = motor rumbling* uncomment 1 of the lines for each mode selection******************************************************************/
#define pressures   true
//#define pressures   false
#define rumble      true
//#define rumble      false
PS2X ps2x; // create PS2 Controller Class
//right now, the library does NOT support hot pluggable controllers, meaning
//you must always either restart your Arduino after you connect the controller,
//or call config_gamepad(pins) again after connecting the controller.
int error = 0;
byte type = 0;
byte vibrate = 0;void setup(){pinMode(IN1, OUTPUT);pinMode(IN2, OUTPUT);pinMode(IN3, OUTPUT);pinMode(IN4, OUTPUT);Serial.begin(57600);delay(300) ; //added delay to give wireless ps2 module some time to startup, before configuring it//CHANGES for v1.6 HERE!!! **************PAY ATTENTION*************//setup pins and settings: GamePad(clock, command, attention, data, Pressures?, Rumble?) check for errorerror = ps2x.config_gamepad(PS2_CLK, PS2_CMD, PS2_SEL, PS2_DAT, pressures, rumble);if(error == 0){Serial.print("Found Controller, configured successful ");Serial.print("pressures = ");if (pressures)Serial.println("true ");elseSerial.println("false");Serial.print("rumble = ");if (rumble)Serial.println("true)");elseSerial.println("false");Serial.println("Try out all the buttons, X will vibrate the controller, faster as you press harder;");Serial.println("holding L1 or R1 will print out the analog stick values.");Serial.println("Note: Go to www.billporter.info for updates and to report bugs.");} else if(error == 1)Serial.println("No controller found, check wiring, see readme.txt to enable debug. visit www.billporter.info for troubleshooting tips");else if(error == 2)Serial.println("Controller found but not accepting commands. see readme.txt to enable debug. Visit www.billporter.info for troubleshooting tips");else if(error == 3)Serial.println("Controller refusing to enter Pressures mode, may not support it. ");//  Serial.print(ps2x.Analog(1), HEX);type = ps2x.readType();switch(type) {case 0:Serial.print("Unknown Controller type found ");break;case 1:Serial.print("DualShock Controller found ");break;case 2:Serial.print("GuitarHero Controller found ");break;case 3:Serial.print("Wireless Sony DualShock Controller found ");break;}
}void turnLeft() //左转{     digitalWrite(IN1,HIGH);digitalWrite(IN2, LOW);digitalWrite(IN3, LOW);digitalWrite(IN4,LOW);delay(20);
}void turnRight()//右转{digitalWrite(IN1, LOW);digitalWrite(IN2, LOW);digitalWrite(IN3, HIGH);digitalWrite(IN4, LOW);delay(20);
}void forward() // 前进{digitalWrite(IN1, HIGH);digitalWrite(IN2, LOW);digitalWrite(IN3, HIGH);digitalWrite(IN4, LOW);  delay(20);
}
void stop() // 停止;{digitalWrite(IN1, LOW);digitalWrite(IN2, LOW);digitalWrite(IN3, LOW);digitalWrite(IN4, LOW);delay(20);
}void back()  //后退{digitalWrite(IN1, LOW);digitalWrite(IN2, HIGH);digitalWrite(IN3, LOW);digitalWrite(IN4, HIGH);
}void loop(){/* You must Read Gamepad to get new values and set vibration valuesps2x.read_gamepad(small motor on/off, larger motor strenght from 0-255)if you don't enable the rumble, use ps2x.read_gamepad(); with no valuesYou should call this at least once a second*/ if(error == 1) //skip loop if no controller foundreturn;if(type == 2) {//Guitar Hero Controllerreturn;}else  { //DualShock Controllerps2x.read_gamepad(false, vibrate); //read controller and set large motor to spin at 'vibrate' speedif(ps2x.Button(PSB_L1) || ps2x.Button(PSB_R1)) { //print stick values if either is TRUESerial.print("Stick Values:");Serial.print(ps2x.Analog(PSS_LY), DEC); //Left stick, Y axis. Other options: LX, RY, RXSerial.print(",");Serial.print(ps2x.Analog(PSS_LX), DEC);Serial.print(",");Serial.print(ps2x.Analog(PSS_RY), DEC);Serial.print(",");Serial.println(ps2x.Analog(PSS_RX), DEC);int LY=ps2x.Analog(PSS_LY);int LX=ps2x.Analog(PSS_LX);int RY=ps2x.Analog(PSS_RY);int RX=ps2x.Analog(PSS_RX);if (LY<128)  //前进{speed = 2*(127-LY);//speed = LY;analogWrite(speedPinA, speed);analogWrite(speedPinB, speed);forward();   }//后退if (LY>128){speed=2*(LY-128);analogWrite(speedPinA, speed);analogWrite(speedPinB, speed);back();}//左转if (LX<128){speed = 2*(127-LX);analogWrite(speedPinA, speed);analogWrite(speedPinB, speed);turnLeft();}//右转if (LX>128){speed=2*(LX -128);analogWrite(speedPinA, speed);analogWrite(speedPinB, speed);turnRight();}//如果摇杆居中if (LY>=128 && LY<=128 && LX>=128 && LX<=128){stop();}}}

相关参考:
1. http://yfrobot.com/forum.php?mod=viewthread&tid=11561&highlight=ps2
2. Sony PS2游戏手柄遥控智能小车https://sanwen8.cn/p/375swwM.html
3. SONY PS2电玩手柄遥控乐高小车

PS2手柄遥控Arduino小车相关推荐

  1. PS2手柄遥控控制灯开关(arduino)

    PS2手柄遥控控制灯开关(arduino) 使用的材料 arduino板子: ps2遥控手柄; 一个5V供电的LDE: 连线 首先按照遥控手柄底座上的英文,你会发现一共有六根线,分别是GND,VCC, ...

  2. 小车主板哪家强?PS2手柄4路电机输出..火魔童主板了解一下?

    微信关注 "DLGG创客DIY" 设为"星标",重磅干货,第一时间送达. 最近收到了芯吧客邮寄的火魔童V1.0主板,今天简单给大家介绍一下 别的废话就不多说了, ...

  3. PS2无线遥控手柄与STM32单片机通信

    PS2无线遥控手柄 接下来要做一个小车玩玩,在网上淘了一个PS2无线遥控手柄,用于控制小车的前进.后退等功能. 实物图如下: 其中有两个PS2游戏摇杆,对应的驱动原理参见下文: PS2游戏摇杆原理及控 ...

  4. arduino ps2摇杆程序_PS2手柄在arduino上进行测试,可用,供喜欢diy的朋友借鉴

    #include //PS2手柄 PS2X ps2x; // create PS2 Controller Class //PS2引脚//一共4个信号引脚 #define PS2_DAT 26 // D ...

  5. 玩转X-CTR100 l STM32F4 l PS2无线手柄-4WD智能小车

    我造轮子,你造车,创客一起造起来!更多塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 前面已介绍X-CTR100控制器解码PS2无线手 ...

  6. c语言 数组放空自己,基于Arduino和Labview的无线遥控智能小车的设计与实现.docx

    PAGE V MACROBUTTON MTEditEquationSection2 SEQ MTEqn \r \h SEQ MTSec \r 1 \h SEQ MTChap \r 1 \h 中文摘要 ...

  7. 由简至难可以轻松无障碍自己学习的Arduino套件,学习各种传感器、执行器、电子元件等,制作Arduino小车,可以用来巡线、避障、无线遥控

    套件介绍 很多孩子从来没有接触过机器人,没有编程过(很害怕去接触,觉得很难),电子元件也没有接触过,不知道电阻.电容.二极管等,不知道电路知识! Arduino中级自学套件资料齐全,由浅至深,所有项目 ...

  8. 基于ESP32的蓝牙小手柄 | 附Arduino源码

    基于ESP32的蓝牙小手柄 | 附Arduino源码 在B站看到了UP主皇工小毒仔的的视频感觉很有意思,可以拿来打原神,于是把他复现了出来由于UP主并没有开源代码,于是我把我的代码和UP主开源的网址一 ...

  9. 亚博智能PS2手柄学习笔记

    一.PS2 手柄介绍: PS2 由手柄与接收器两部分组成,手柄主要负责发送按键信息.都接通电源并打开手柄开关时,手柄与接收器自动配对连接(这是由于手柄与接收器之间依靠2.4G进行通信),在未配对成功的 ...

最新文章

  1. C#命名规范 C#控件的缩写大全
  2. Java Jtree渲染叶子实现可以添加swing组件
  3. RadioButton加入DataGrid模板列引起的问题。
  4. 从零开始入门 K8s | Kata Containers 创始人带你入门安全容器技术
  5. java开发架构设计_跪了!阿里技术官出品:Java架构设计之完美,看完秒进大厂。...
  6. linux中安装cx_Oracle
  7. shellcraft新姿势
  8. 5000并发_彻底理解 jmeter 的线程数与并发数之间的关系
  9. GitBash和GitGui右键失效解决方法
  10. 同样磁盘数,不同raid级别的随机IO性能差异对比
  11. 【python初级】os.listdir返回目录中包含的文件以及文件夹的列表
  12. 我的测试图片vr(后前-上下-左右)
  13. 区块链开发如何选择底层平台和开发语言?
  14. Google 真的抄百度了吗?
  15. 我的博客搬家至blogbus.com
  16. Java collection集合截断
  17. 通过节流阀 前端防止重复提交事件
  18. 《社会调查数据管理——基于Stata 14管理CGSS数据》一1.4 数据伦理
  19. c语言中的单词的意思及作用,C语言实现单词助手功能
  20. 大众VASS、西门子SICAR...汽车行业控制标准之福特FAST

热门文章

  1. 树莓派魔镜php,手把手教你打造属于自己的树莓派魔镜
  2. vbScript中createobject大全
  3. 【图像融合】基于matlab对比度增强结合多尺度边缘保持分解红外与可见光图像融合【含Matlab源码 1886期】
  4. ModSecurity网站防火墙安装教程加WEB防御规则设置
  5. 2188万:2022年度5G+多网融合应急调度平台项目
  6. 【2021.01.04】事件
  7. 失传万年的PS致富经典(四)
  8. html自动调整间隔,点筋布置时的间距自动调整 - 应用技巧 - 常青藤软件工作室...
  9. 护理计算机基础试卷,09秋护理班计算机基础试题
  10. php 购物车存在那个地方,php添加购物车