1. #define speeds 50 //宏定义speeds
    2. byte GLevel[22]={0}; //灰度储存
    3. short Condition = 0; //定义前进时为Condition = 0;
    4. //---------------------------------------------------目前没有改变Condition的语句,调试时只能改变这里的值----------------------//
    5. //-1~4依次为停止-1,前进0,后退1,左2,右3,原地旋转4
    6. const short GrayPin[22] = {40, 41, 42, 43, 44, 45,46, 47, 48, 49, 50, 51, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39};
    7. //40-45为前接口,46-51为后接口,30-34为左接口,35-39为右接口。;
    8. //---------------------------------灰度部分------------------------------//
    9. void Gray_Init() //灰度初始化
    10. { for (short i = 0; i <22; i++)
    11. { pinMode(GrayPin[i], INPUT);
    12. }
    13. }
    14. void GrayGet_value(byte value[])
    15. { int j = 0;
    16. for (j = 0; j < 22; j++)
    17. value[j] = digitalRead(GrayPin[j]);
    18. }
    19. //--------------------------------电机部分------------------------------//
    20. //23左前,45右前,67左后,89右后
    21. void _M_Init() { //电机初始化
    22. for (int i = 2; i <= 9; i++)
    23. {
    24. pinMode(i, OUTPUT);
    25. analogWrite(i, 0);
    26. }
    27. }
    28. void _M_Front(int pin1, int pin2, int _speed) {
    29. analogWrite(pin1, _speed);
    30. analogWrite(pin2, 0);
    31. }
    32. void _M_Back(int pin1, int pin2, int _speed) {
    33. analogWrite(pin2, _speed);
    34. analogWrite(pin1, 0);
    35. }
    36. /*void _M_Stop() {
    37. for (int i = 2; i <= 9; i++)
    38. analogWrite(i, 255);
    39. Condition = -1;
    40. }*/
    41. void _M_Stop(int pin1,int pin2) {
    42. analogWrite(pin1,255);
    43. analogWrite(pin2,255);
    44. }
    45. //-----------------------------前进---------电机全部正转-----------------------//
    46. void _M_GoFront(int _speed) { //直行时四个轮子全部正转
    47. _M_Front(7, 6, _speed + 0);//左前
    48. _M_Front(4, 5, _speed +0 );//右前
    49. _M_Front(8, 9, _speed + 0);//左后
    50. _M_Front(2, 3, _speed + 0);//右后
    51. }
    52. //-----------------------------后退---------电机全部反转------------------------//
    53. void _M_GoBack(int _speed) {
    54. _M_Back(7, 6, _speed + 0);
    55. _M_Back(4, 5, _speed + 0);
    56. _M_Back(8, 9, _speed + 0);
    57. _M_Back(2, 3, _speed + 0);
    58. }
    59. //--------------------------------------左横行-------------------------------//
    60. void _M_GoLeft(int _speed){
    61. _M_Back(7, 6, _speed +0 );
    62. _M_Front(4, 5,_speed +0);
    63. _M_Front(8, 9,_speed +0);
    64. _M_Back(2, 3,_speed +0);
    65. }
    66. //--------------------------------------右横行-------------------------------//
    67. void _M_GoRight(int _speed){
    68. _M_Front(7, 6, _speed +0);
    69. _M_Back(4, 5, _speed +0);
    70. _M_Back(8, 9, _speed +0);
    71. _M_Front(2, 3, _speed +0);
    72. }
    73. //--------------------------------------右前走------------------------------//
    74. void _MGo_youqian(int _speed){
    75. _M_Front(7, 6, _speed +0);
    76. _M_Stop(4,5);
    77. _M_Front(8, 9, _speed +0);
    78. _M_Stop(2,3);
    79. }
    80. //---------------------------------------左前走-----------------------------//
    81. void _MGo_zuoqian(int _speed){
    82. _M_Stop(7,6);
    83. _M_Front(4, 5, _speed +0);
    84. _M_Stop(8,9);
    85. _M_Front(2, 3, _speed +0);
    86. }
    87. //---------------------------------------左后走----------------------------//
    88. void _MGo_zuohou(int _speed){
    89. _M_Back(7, 6, _speed +0);
    90. _M_Stop(4,5);
    91. _M_Back(8, 9, 255);
    92. _M_Stop(2,3);
    93. }
    94. //--------------------------------------右后走----------------------------//
    95. void _MGo_youhou(int _speed){
    96. _M_Stop(7,6);
    97. _M_Back(4, 5,_speed +0 );
    98. _M_Back(8, 9,_speed +0);
    99. _M_Stop(2,3);
    100. }
    101. void setup() {
    102. Gray_Init();
    103. }
    104. void loop()
    105. {
    106. GrayGet_value(GLevel);
    107. //0 1 2 3 4 5
    108. switch(Condition)
    109. {
    110. case 0:
    111. //前进
    112. {
    113. unsigned a;
    114. a=(GLevel[0]<< 5)|(GLevel[1] << 4) | (GLevel[2] << 3) | (GLevel[3] << 2) | (GLevel[4]<<1) | (GLevel[5]);
    115. switch( a ){
    116. case 0x0C://直行不偏转 //001100
    117. _M_GoFront(speeds);
    118. break;
    119. //--------------------------------前---小偏--------------//
    120. case 0x08://右小偏 //001000
    121. _MGo_zuoqian(speeds) ;
    122. break;
    123. case 0x04://左小偏 //000100
    124. _MGo_youqian(speeds);
    125. break;
    126. //------------------------------前-----中偏---------------//
    127. case 0x18://右中偏 //011000
    128. _MGo_zuoqian(speeds) ;
    129. break;
    130. case 0x06://左中偏 //000110
    131. _MGo_youqian(speeds);
    132. break;
    133. //----------------------------前-------大偏---------------//
    134. case 0x30://右大偏 //110000
    135. _MGo_zuoqian(speeds) ;
    136. break;
    137. case 0x03://左大偏 //000011
    138. _MGo_youqian(speeds);
    139. break;
    140. default:
    141. _M_GoFront(speeds);
    142. break;
    143. }
    144. }
    145. case 2:
    146. //车左横行时
    147. {
    148. unsigned b=0;
    149. b=(GLevel[16]<< 4)|(GLevel[15] << 3) | (GLevel[14] << 2) | (GLevel[13] << 1) | (GLevel[12]);
    150. switch(b){
    151. case 0x04://直行//00100
    152. _M_GoLeft(speeds);
    153. break;
    154. //-------------------------------左---小偏--------------//
    155. case 0x06://小左后偏//调用左前走函数//00110
    156. _MGo_zuoqian(speeds+0);
    157. break;
    158. case 0x0C://小左前偏//调用左后走函数01100
    159. _MGo_zuohou(speeds+0);
    160. break;
    161. //------------------------------左---中偏----------------//
    162. case 0x02://中左后偏//调用左前走函数00010
    163. _MGo_zuoqian(speeds-1);
    164. break;
    165. case 0x08://中左前偏//调用左后走函数01000
    166. _MGo_zuohou(speeds-1);
    167. break;
    168. //------------------------------左---大偏----------------//
    169. case 0x03://大左后偏//调用左前走函数00011
    170. _MGo_zuoqian(speeds-2);
    171. break;
    172. case 0x18://大左前偏//调用左后走函数11000
    173. _MGo_zuohou(speeds-2);
    174. break;
    175. default:
    176. _M_GoLeft(speeds);
    177. break;}
    178. }
    179. case 3:
    180. //车右横行时
    181. {
    182. unsigned c=0;
    183. c=(GLevel[17]<< 4)|(GLevel[18] << 3) | (GLevel[19] << 2) | (GLevel[20] << 1) | (GLevel[21]) ;
    184. switch(c){
    185. case 0x04://直行//00100
    186. _M_GoRight(speeds);
    187. break;
    188. //-------------------------------左---小偏--------------//
    189. case 0x06://小右前偏//00110
    190. _MGo_youhou(speeds+0);
    191. break;
    192. case 0x0C://小右后偏01100
    193. _MGo_youqian(speeds+0);
    194. break;
    195. //------------------------------左---中偏----------------//
    196. case 0x02://中右前偏00010
    197. _MGo_youhou(speeds-1);
    198. break;
    199. case 0x08://中右后偏01000
    200. _MGo_youqian(speeds-1);
    201. break;
    202. //------------------------------左---大偏----------------//
    203. case 0x03://大右前偏00011
    204. _MGo_youhou(speeds-2);
    205. break;
    206. case 0x18://大右后偏11000
    207. _MGo_youqian(speeds-2);
    208. break;
    209. default:
    210. _M_GoRight(speeds);
    211. break;}
    212. }
    213. }
    214. delay(2000);
    215. }

    在最后delay(2000)的原因:
    Mega2560性能不够,时间太短无法调整轮子的转动方向和速度;
    void loop(){
    switch(){
    case 0:
    ···
    case 1:
    ···
    ···
    }
    delay(2000);
    }
    //原理:等待2000ms再进行下一次判断~