BLOG > Arduino > 机器人EarthRunner一号开跑了~~~

机器人EarthRunner一号开跑了~~~

谭总最近搞了个自制直升飞机,虽然试飞以坠机收尾,但是足足成功升空20秒之多,总的来说第一步是非常成功的。谭总迈出第一步后,我也被这所谓的“电子艺术”所吸引,研究了三天,终于没能抵挡住诱惑,掉进了arduino的陷阱。

arduino是一个开源的硬件平台,从硬件电路图到软件都是开源的。基于arduino,可以非常快速的开发出一系列的“电子艺术”交互产品,从感应输入器到自主机器人,到智能家电,真是无所不能。看了谭总的“谭氏四旋翼飞行器”(我命名的),再想到“坠机”的一刹那,想想飞机成本太高,风险太大,摔一次咱钱包里的花纸头就少几张,还是跟谭总配合,他搞空军我搞陆军吧。联合大作战,多么美好的童年时光啊。

我比较懒,花了1000多买了现成的电路板,还有一个比赛用四驱机器人底盘,就不用自己烂电路板,用有机玻璃做外壳了……哈哈,淘宝真是好东西。

过程以后慢慢说吧,还是看看今天一天的成果吧。整整一天,从硬件安装测试到代码设计,遇到了n个问题,解决了n个问题,终于我的机器人 EarthRunner一号 能够自主运行啦,目前可以根据传感器来自主避开障碍前进,根据环境光线自主开灯,虽然功能不强,但基础已经打好,下一步就要加上无线遥控了。

DSC_3897
DSC_3898
EarthRunner 一号


自主避障代码如下:

C代码:
  1. int E1 = 5;
  2. int M1 = 4;
  3. int E2 = 6;
  4. int M2 = 7;
  5. int LightSensorPin = 0;
  6. int LeftDistanceSensorPin = 9;
  7. int RightDistanceSensorPin = 8;
  8. int LEDPin = 13;
  9. int spd = 200;
  10.  
  11. void stop(void) {
  12.   analogWrite(E1,0);
  13.   analogWrite(E2,0);
  14. }
  15.  
  16. void forward(char a,char b) {
  17.   analogWrite (E1,a);
  18.   digitalWrite(M1,HIGH);
  19.   analogWrite (E2,b);
  20.   digitalWrite(M2,HIGH);
  21. }
  22.  
  23. void backward(char a,char b) {
  24.   analogWrite (E1,a);
  25.   digitalWrite(M1,LOW);
  26.   analogWrite (E2,b);
  27.   digitalWrite(M2,LOW);
  28. }
  29.  
  30. void turn_L(char a,char b) {
  31.   analogWrite (E1,a);
  32.   digitalWrite(M1,HIGH);
  33.   analogWrite (E2,b);
  34.   digitalWrite(M2,LOW);
  35. }
  36.  
  37. void turn_R(char a,char b) {
  38.   analogWrite (E1,a);
  39.   digitalWrite(M1,LOW);
  40.   analogWrite (E2,b);
  41.   digitalWrite(M2,HIGH);
  42. }
  43.  
  44. void checkEnv(){
  45.   int light,R_dist,L_dist;
  46.  
  47.   Serial.println("--- checkEnv ---");
  48.  
  49.   light=analogRead(LightSensorPin)//Read Light Sensor
  50.   Serial.print("Light Sensor: ");
  51.   Serial.println(light, DEC); //Print result to serial
  52.  
  53.   L_dist=digitalRead(LeftDistanceSensorPin); //Read Distance Sensor
  54.   Serial.print("LeftDistance Sensor: ");
  55.   Serial.println(L_dist, DEC); //Print result to serial
  56.  
  57.   R_dist=digitalRead(RightDistanceSensorPin); //Read Distance Sensor
  58.   Serial.print("RightDistance Sensor: ");
  59.   Serial.println(R_dist, DEC); //Print result to serial
  60.  
  61.   //If Light Sensor great than 400, light the LED
  62.   if (light > 400) digitalWrite(LEDPin, HIGH);
  63.     else digitalWrite(LEDPin, LOW);
  64.    
  65.   if (!L_dist && R_dist) // turn right
  66.     move(1);
  67.   else if (L_dist && !R_dist) //turn left
  68.     move(0);
  69.   else if (!L_dist && !R_dist) //random turn
  70.     move(random(2));
  71. }
  72.  
  73. int clearPath(){
  74.   int R_dist,L_dist;
  75.   Serial.println("--- clearPath ---");
  76.   L_dist=digitalRead(LeftDistanceSensorPin); //Read Distance Sensor
  77.   R_dist=digitalRead(RightDistanceSensorPin); //Read Distance Sensor
  78.   return (L_dist && R_dist);
  79. }
  80.  
  81.  
  82. void move(int dir) {
  83.   int flag;
  84.  
  85.   Serial.println("--- move ---");
  86.   flag = clearPath();
  87.   while (!flag) {
  88.     if (dir) //right
  89.       turn_R(spd,spd);
  90.     else
  91.       turn_L(spd,spd);
  92.     delay (50);
  93.     flag=clearPath();
  94.   }
  95. }
  96.  
  97. void setup() {
  98.   pinMode(E1, OUTPUT);
  99.   pinMode(E2, OUTPUT);
  100.   pinMode(M1, OUTPUT);
  101.   pinMode(M2, OUTPUT);
  102.   pinMode(LeftDistanceSensorPin, INPUT);
  103.   pinMode(RightDistanceSensorPin, INPUT);
  104.   pinMode(LEDPin, OUTPUT);
  105.   Serial.begin(9600);
  106. }
  107.  
  108. void loop() {
  109.   Serial.println("*** Main ***");
  110.   forward(spd,spd);
  111.   checkEnv();
  112.   delay(100);
  113. }


今天比较懒,下次再详细讲解机器人的设计和制作过程吧。

如果您喜欢这篇文章,您可以点击下列链接收藏
Del.icio.us Yahoo书签 365Key网摘 天极网摘 我摘 POCO网摘 YouNote网摘 和讯网摘 博啦网
发布时间 发布于 2010-05-29 22:17:39 | 阅读次数 阅读过445次 | 分类 Arduino | 评论 4条评论