电滑板攻略 - 主控板程序

动力老男孩发布于 2015-05-21 22:22


这一部分内容也许会有点儿枯燥,对Arduino了解不多的同学,可能要先去预习一下。如果大家有需要的话,我也可以考虑发一系列Arduino的入门教程 :)

主控板是指的装在滑板上的那一部分电路板,首先贴一下电路原理图:

对着原理图,说说电滑板的几个功能:
1. JP1用来连接电调,这部分电路的供电也是从电调来来。说到这里顺便说一句,很多电调自带BEC功能,可以提供5V或6V的电压给单片机用。
   电流可以支持到1A以上,带动各种传感器完全无压力。但是如果要点亮灯带或者响个大喇叭的话,就需要从电池直接引电压。
2. 标记SPK是个无源小喇叭,通过一定频率的方波来发出声音。
3. 中间那个方块就是Arduino pro mini,选用的是5V 16M的版本,它就是整个控制系统的“神经中枢”
4. Bluetooth就是蓝牙的插座,我们选用的蓝牙模块一共有6根针,我们用了最简的四根针方案,如果你需要修改蓝牙设置,得手动用夹子给Key针脚接高电平
5. LDR和4k7,是一个光敏电阻和一个4k7的电阻。一般的光敏电阻,电阻值随着光线的增大而减小,我们通过测量获取的电压,就可以评估当前的环境亮度。这样晚上天黑的时候,滑板的夜行灯就可以自动亮起来了
6. 那4个圆圈,它的目标是当主板需要采电时,把电池的正负极接到这里,然后再引出去。因为电压比较高电流比较大,所以一共4个大圆圈。
7. 圆圈边上的JP3,是用来接灯带的,因为我们用的是6S的电池,电压平时在24V左右,所以可以选用两条12V的灯带串联一下。
  灯带边上是场效应管,你可以理解为一个电子开关,通过输入0或者1来关闭或打开灯带。
8. 左下角的JP2 是个独立的东西,它的作用是把原来电调的开关引到这个板子上来,避免甩着一个小尾巴(这个功能不用也可以)

代码如下,有些地方我写了注释,不好理解的地方请大家留言,我在后续的攻略里会继续介绍。

  1. #include <EEPROM.h>  
  2. #include <Servo.h>  
  3. #include <SoftwareSerial.h>  
  4.   
  5. SoftwareSerial mySerial(11, 5); //Product board  
  6.   
  7. int motorPin = 12;    // The pin output PWM to control motor  
  8. int motorPin2 = 0;   // For the new board with 2 motors, if motorPin2 < 0, then ignore it   
  9.   
  10. int hornPin = 10;  
  11. int hornOffTime = 1000; // Cannot use horn too long, must less than 1s  
  12. int hornStartTime = 0;  
  13.   
  14. int power = 50;       // Control pow value, from 0 to 100;  
  15. long lastRecvTime = 0; // If cannot recv control info in 0.2s, stop the moto  
  16. int shutDownTimeRange = 200;  
  17. int powerScale = 100;  //if set the power scale by mobile  
  18. int testingValue = 0;  
  19.   
  20. int lightMode = 2;   // 1: on; 2:off; 3: auto  
  21. int lightCtrlPin = 10;  
  22. int envLightSensorPin = 1;  
  23. boolean lightStatus = false;  // shutdown ligth by default  
  24.   
  25. Servo powerServo;  
  26. Servo powerServo2;  
  27.   
  28. // The Led pin for debug  
  29. int ledPin = 13;  
  30. int light = 1;  
  31. int counter = 0;  
  32.   
  33. // Beep pin  
  34. int beepPin = 6;  
  35. boolean beepStatus = false;  
  36.   
  37. // Connect to speaker  
  38. int tonePin = 6;  
  39.   
  40. // battery pin  
  41. int batteryPin = 0;  
  42. float batteryScale = 11;  
  43. float batteryAlert = 3.5;  
  44.   
  45. void setup()  
  46. {  
  47.   pinMode(ledPin,OUTPUT);  
  48.   pinMode(beepPin,OUTPUT);  
  49.   pinMode(lightCtrlPin,OUTPUT);  
  50.   pinMode(hornPin,OUTPUT);  
  51.       
  52.   powerScale = EEPROM.read(0);  
  53.   if (powerScale <= 0 || powerScale > 100) powerScale = 100;  
  54.   lightMode = EEPROM.read(1);  
  55.   if (lightMode <= 0 || lightMode > 3) lightMode = 2; // default light off  
  56.     
  57.   Serial.begin(9600);   
  58.   mySerial.begin(9600);   
  59.   powerServo.attach(motorPin);  
  60.   if (motorPin2 > 0) powerServo2.attach(motorPin2);  
  61. }  
  62.   
  63. void checkBattery()  
  64. {  
  65.   if (counter == 0 || counter == 200) {  
  66.     int readValue = analogRead(batteryPin);  
  67.     if (readValue > 5 && batteryScale * readValue / 1024 * 5 < batteryAlert * 6) {  
  68.         digitalWrite(beepPin, beepStatus);  
  69.         beepStatus = !beepStatus;  
  70.     } else {  
  71.         digitalWrite(beepPin, 0);  
  72.     }  
  73.   }  
  74. }  
  75.   
  76. void updateCounter() {  
  77.   counter++;  
  78.   if (counter >= 400) counter = 0;  
  79. }  
  80.   
  81. void switchLight()  
  82. {  
  83.   if (counter == 0) {  
  84.     digitalWrite(ledPin, light);  
  85.     light = 1 - light;  
  86.     //Serial.println(testingValue);  
  87.   }  
  88. }  
  89.   
  90. void sendPowerInfo()  
  91. {  
  92.   if (counter == 0) {  
  93.       mySerial.write((byte)(analogRead(batteryPin) / 4));  
  94.   }  
  95. }  
  96.   
  97. void loop()  
  98. {    
  99.   long t0 = micros();  
  100.   
  101.   int readPower = -1;  
  102.   while(mySerial.available()) {  
  103.     readPower = mySerial.read();  
  104.     lastRecvTime = micros();  
  105.     digitalWrite(ledPin, light);  
  106.     light = 1 - light;  
  107.     //counter = 0;  
  108.     if (readPower > 100) {  
  109.       break;  
  110.     }  
  111.   }  
  112.   if (readPower > -1 && readPower <= 100) {  
  113.     // Normal status  
  114.     power = readPower;  
  115.   }  
  116.   if (readPower == 255 || (lastRecvTime > 0 && (t0-lastRecvTime)/1000 > shutDownTimeRange)) {  
  117.     power = 50; // 松手默认滑行  
  118.   }  
  119.   if (readPower > 100 && readPower <= 200) {  
  120.     powerScale = readPower - 100;  
  121.     EEPROM.write(0, (byte) powerScale);    
  122.   }  
  123.   if (readPower > 200 && readPower <= 203) {  
  124.     lightMode = readPower - 200;  
  125.     EEPROM.write(1, (byte) lightMode);    
  126.   }  
  127.   if (readPower == 204) {  
  128.     digitalWrite(hornPin, 1);  // start horn  
  129.     hornStartTime = t0;  
  130.     tone(tonePin, 4000);  
  131.   }  
  132.   //if (readPower == 205 || (hornStartTime > 0 && (t0 - hornStartTime) / 1000 > hornOffTime)) {  
  133.   if (readPower == 205) {  
  134.     digitalWrite(hornPin, 0);  // stop horn  
  135.     hornStartTime = 0;  
  136.     noTone(tonePin);  
  137.   }  
  138.   // light control  
  139.   if (lightMode == 1) {  
  140.     // light on  
  141.     digitalWrite(lightCtrlPin, 1);  
  142.     lightStatus = true;  
  143.   } else if (lightMode == 2){  
  144.     // light off  
  145.     digitalWrite(lightCtrlPin, 0);  
  146.     lightStatus = false;  
  147.   } else {  
  148.     //auto   
  149.     int envLight = analogRead(envLightSensorPin);  
  150.     testingValue = envLight;  
  151.     if (!lightStatus && envLight < 800) {  
  152.       lightStatus = true;  
  153.     }  
  154.     if (lightStatus && envLight > 900) {  
  155.       lightStatus = false;  
  156.     }  
  157.     digitalWrite(lightCtrlPin, lightStatus);  
  158.   }  
  159.   updateCounter();  
  160.   switchLight();  
  161.   checkBattery();  
  162.     
  163.   double T = 2500;  
  164.   // if has power scale  
  165.   double scaledPower = power;  
  166.   if (power > 50) {  
  167.     scaledPower = 50 + (power - 50) * powerScale / 100;  
  168.   }  
  169.   double len = 900 + scaledPower * 12; //(0~100对应总周期0.9ms~2.1ms)    
  170.   powerServo.writeMicroseconds(len);  
  171.   if (motorPin2 > 0) powerServo2.writeMicroseconds(len);  
  172.   
  173.   int leftMs = (int) (t0 + T - micros());  
  174.   if (leftMs > 1500 && (t0-lastRecvTime)/1000 < shutDownTimeRange) {  
  175.     sendPowerInfo();  
  176.     leftMs = (int) (t0 + T - micros());  
  177.   }  
  178.   if (leftMs < 1) leftMs = 1;  
  179.   delayMicroseconds(leftMs);  
  180. }  

-----------------------------------
回到目录点这里

 
小米2018-06-10 03:14:46
问一下你的电路板锂电池那地方要如何接还是要焊接
动力老男孩2018-06-11 10:15:15
现在买的锂电池,应该有那种两针的小插口,插一下就好了
ayong58882017-09-26 12:51:37
求遥控和接收器的图纸和您的联系方式                  693377149@qq.com,谢谢
‭‭‭‭‭‭‭‭2016-10-31 20:03:11
求遥控和接收器的图纸,1565481748@qq.com,谢谢
维尼熊2016-07-22 09:32:08

avrdude: usbdev_open(): did not find any USB device "usb"
烧录的时候出这个怎么回事啊
维尼熊2016-07-22 09:32:59
遥控器的能烧上,主板这块就烧不上了
未来的爱因斯坦2017-06-04 20:18:00
回复 维尼熊 : 你USB没连好把
小两白//_//2016-07-05 23:45:41

大哥  你的微信或者QQ是多少?


卷发放冰箱2016-06-12 23:07:13
动力哥 同求一份遥控器PCB图纸!1334263926@qq.com 谢谢!
冰清的理想乡2015-11-16 21:23:01
动力哥,想请教下,
您画的板子上A0~A3是指模拟口 2~13是指数字口是吗? 我记得数字口是不是只能输出高低电频吧,那为什么电调的信号线要接在12口上? 
 还有那个无源小喇叭是怎么控制的呢?高电平就叫低电平就不叫是吗?
还有一个,蓝牙那个四针的就是rxtx接两个模拟口模拟板子的rxtx是吗?
冰清的理想乡2015-10-18 21:42:14
有个特别不好意思的问题……电调玩爆了 啪的一声就不亮了  情况是开着电调 然后同学在板子上面空滑动  请问这是什么情况呢?  然后还想问下QAQ遥控器的接收器坏了找谁能修修呀  卖家不管QAQ
动力老男孩2015-10-22 19:49:49
反向电压太高烧了……
估计是电调的做工不太好,具体的可能需要看你用的是什么电调了。如果你用航模的电调,它本来就不是为滑板设计的,就特别容易烧。
%偏~风&2015-09-08 13:15:30
我也想要手持遥控器和接收板的电路图可以发一下吗 1030709627@qq.com
- 。-2015-08-03 13:41:49
动力哥 你确实需要发一些Arduino入门教程了
动力老男孩2015-08-03 23:07:07
我倒是想发一些,但是想了一下,现在的arduino教程已经非常多了啊
- 。-2015-08-04 08:58:01
回复 动力老男孩 : 对于小白来的我 遥控器那块 太难做了
 你遥控器有成品吗
动力老男孩2015-08-04 19:55:27
回复 - 。- : 没有啊,做一个太费劲了,那个鸡腿花了我好几天时间
- 。-2015-08-29 20:51:29
回复 动力老男孩 : 那有没有那个遥控和接收器的pcb的图纸?
动力老男孩2015-08-31 10:08:47
回复 - 。- : 有用eagle做的文件
- 。-2015-09-01 14:14:26
回复 动力老男孩 : 发我邮箱 行么 1356585513@qq.com
- 。-2015-09-01 14:14:42
回复 动力老男孩 : 谢了 动力哥
yunshang4252016-02-29 10:09:17
回复 动力老男孩 : 动力哥,我用您的电路搭好,程序也烧进去了,用了手机app控制。但是电机不动!
潇听啸2016-05-09 13:40:26
回复 动力老男孩 : 同求一份遥控器PCB图纸!h568018728@gmail.com  谢谢!
sunshine1232019-09-07 12:55:17
回复 动力老男孩 : 你可以帮我调一个程序吗?出错:redefinition of 'void setup()'
达达_shshn2015-07-19 23:19:43
arduinoIDE上传时出现了这样的错误:
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x9c
在网上找了很多方法都还是有这个问题。。
请问下你有没有出现这样的问题啊?
达达_shshn2015-07-20 00:14:20
不知道怎么滴。。试了好多次之后突然就成功了
动力老男孩2015-07-20 09:03:17
回复 达达_shshn : 经常遇到这种情况,貌似是windows下的驱动有问题,我严重怀疑是微软有自动升级驱动的机制
达达_shshn2015-07-19 18:25:21
在45行那里:redefinition of 'void setup()'
不知道出了什么问题
达达_shshn2015-07-19 21:55:20
又试了一次,没有error了
莫克丁2015-05-25 17:16:52
等这几天闲下来就跟着开始捣鼓。
动力老男孩2015-05-25 17:28:11
热烈欢迎!
sailsmoon2015-05-23 23:09:54
什么时候张罗一起定制一下吧?
动力老男孩2015-05-24 22:04:08
不知道怎么宣传,人太少 :)
稀奇2015-06-21 00:34:38
有不少人的呢~
- 。-2015-08-30 13:12:30
回复 稀奇 :对啊 有不少人呢
Mrsails2015-05-22 11:24:33
动力哥,能先把手机端app传给我下嘛?已经自己打板完成硬件电路了,想测试一下
动力老男孩2015-05-22 11:55:11
你的邮箱?
动力老男孩2015-05-22 11:55:34
给我发站内信哈
Mrsails2015-05-22 14:31:22
回复 动力老男孩 : 已发送,嘻嘻,等待更新中
Mrsails2015-05-24 10:08:19
回复 动力老男孩 : 动力哥,pcb已经画好了,坐等修复bug,实在没这个能力
动力老男孩2015-05-24 22:04:19
回复 Mrsails : 好的,我看看
动力老男孩2015-05-24 22:28:14
回复 Mrsails : 手头没有安卓手机,看了下代码,设置灯带常亮的时候,输出是201,感觉应该是对的。
你的电路是怎么设计的?灯带的场效应管(或继电器)是否接在D10上?
Mrsails2015-05-25 10:52:24
回复 动力老男孩 : 现在两个问题,第一个是电机低速会卡顿(很严重),第二个是喇叭关不上。还有动力哥,最好加上一个12864液晶屏显示电池电压和行驶里程。我手里没有场效应管,所以用的是三极管代替,可能是这个问题
动力老男孩2015-05-25 17:29:39
回复 Mrsails : 三极管虽然跟场效应管差不多,但是这个24V的电压,恐怕搞不定吧?
诸葛小新2015-05-22 08:59:35
电路图漂亮,收藏慢慢研究。

作者

动力老男孩

北京,海淀

195粉丝 11作品 14随笔
  关注 私信

作者的最新随笔


阅读数: 21249

提示信息χ