Archive for the ‘大事记’ Category

3D打印的电滑板支架

最近在写电滑板的攻略,很多朋友问我那个带法兰盘的支架在哪里买的。不幸的是,那个淘宝卖家已经不生产了。
其实,电滑板的机械部分,最麻烦的就是固定那一对减速齿轮,解决方法有两种:
1. 找一家专门DIY电滑板的淘宝店,把同步轮、固定支架和滑板后桥一起买回来;
2. 使用轮毂电机,也就是把电机直接做到轮子里去。
其中第二种对机械的要求更高,有一位叫 David 的同学正在尝试制作,这里先不提。
对于第一种,目前淘宝上的支架很多需要对后桥进行加工才能安装,实际上并没有通用性。
前不久正好我最好用的支架断了,重新做一个非常麻烦,于是试着用3D打印了一个支架,没想到非常好用!

Step 1: 3D建模

3D打印模型 - 电动滑板支架

3D打印模型 - 电动滑板支架

因为常见的滑板后桥是铸造出来的,它的尺寸是逐渐过渡的,而且有两条加强筋。

这给3D建模量尺寸带来了很大的麻烦,只能量个大概,我试打了几次以后,才得到比较合适的尺寸。
模型文件有点儿大,请到百度云上下载:http://pan.baidu.com/s/1kTms88v

Step 2: 打印模型

电动滑板支架

电动滑板支架

因为这个支架需要承受高速旋转的电机,所以必须要结实。

我们平常打印东西的时候,填充率一般设置为 20% 左右,里面都是空心的。
对于这个件,我设置过100%(实心)、90%和80% 几种填充率,总的来说,貌似80%就足够结实了。为了安全起见,我还是最终使用了90%来打印。
另外需要注意的是,3D打印机是有一定误差的,尤其是需要精确装配的件来说,如果你的尺寸刚刚好,那么基本意味着会塞不进去。因为打印出来的孔常常会比设置的尺寸小一点点(0.2~0.4毫米)。所以对于这种要装配的连接支架,我把所有的孔直径都加大了0.5mm。

Step 3: 打印大齿轮裙边

有机玻璃切的裙边
有机玻璃切的裙边
3D打印的齿轮挡边

3D打印的齿轮挡边

效果对比,简直是高富帅对穷矮搓

效果对比,简直是高富帅对穷矮搓

在没有3D打印机之前,我最喜欢的东西是有机玻璃板、电转、锉刀等,因为可以加工简单的小件。

例如轮子上大齿轮盘的挡边,之前就是用有机玻璃板锯出来的。你可以看到它的边缘跟狗啃过的一样,非常糟糕。
使用3D打印之后,就可以简单的建个模型打印出来了。
只要尺寸量的没有问题,打出来就是刚刚好。这个模型打印大概需要1个小时,而以前则需要干几个小时的体力活。

Step 4: 安装

3d打印的电动滑板支架测试

3d打印的电动滑板支架测试

总装时间到……
看上去效果不错

看上去效果不错

支架跟后桥,不太容易做到完全没有缝隙。但是不要紧,有一种叫做环氧树脂的胶水,也叫金属胶或AB胶,据说粘好之后的强度跟焊接相当。我这里就用了AB胶来固定支架,总装效果看上去还不错吧!
大家可能非常担心3D打印件的强度和耐磨损情况,说实话我也不知道。
等我跑几天之后,再跟大家反馈它的性能 :)

电滑板攻略-手持遥控器

上周玩了几天无线供电的磁悬浮彩灯,耽误了一点儿时间,今天继续写滑板攻略 :)

说起遥控器,之前我们也提到过,目前市面上常见的电滑板遥控是这样滴:
枪型遥控器

枪型遥控器

这个就是所谓的“枪式遥控器”,它的操作是向后扣扳机加速、向前推扳机刹车。这种遥控器最早用于车模,跟航模遥控器相比,优点是可以单手操作(其实也不知道另一只手该干什么)
但是车模跟人在上面的滑板完全不一样,这种设计非常反人类。尤其是当遇到危险的时候,很多人下意识的会握拳,结果就是加速的更厉害。
据说某位清华美院的学生,毕设打算改进电滑板,结果启动滑板的瞬间一紧张,直接把扳机捏到了头,于是就骨折住院了……
所以我使用游戏手柄中常见的摇杆来作为手持遥控器,这个是我用洞洞板焊出来的手板:
摇杆式手持滑板遥控器

摇杆式手持滑板遥控器

这个洞洞板其实手感挺不错的,由于到处都是飞线,必须用黑胶布包裹起来,不然很容易短路(比如扔到金属桌面上的时候)。
后来用这个板的原型,在网上找了一家工厂开了模,做了一些专业一点儿的小板子:
摇杆式手持滑板遥控器
摇杆式手持滑板遥控器
摇杆式手持滑板遥控器

摇杆式手持滑板遥控器

工厂做出来的小板子小巧多了,看上去也很精致,不过也有朋友吐槽说太小了手不好抓……好吧,兄弟,咱们可以粘一块长电池用来改进手感 :)
这个手持遥控器的功能包括:1. 向前推加速,向后拉刹车;
2. 按下按钮,会触发滑板上的某个开关,暂定为小喇叭;
3. 蓝牙连接成功后,Arduino的13号管脚灯会快速闪烁;
4. 检测电量,当电池亏电时,小喇叭会滴滴响;
5. 当滑板电量不足时,遥控器也会滴滴响;
电路图如下:
电滑板遥控器-电路原理图

电滑板遥控器-电路原理图

其中的Joystick就是摇杆,它可以前后左右的摇动,并且自带一个可以按下的按钮。注意这里要使用3.3V,8M的Arduino Pro Mini。因为锂电池供电的电压是4V左右,如果使用5V,16M的Arduino板可能会无法带动,还需要额外的一个升压芯片。
源代码如下,博客上的代码高亮显示不知道为什么不好用了,直接贴成图吧,文字版本的到这里看 http://www.chuangkoo.com/blog/42

电滑板遥控器-源代码

电滑板遥控器-源代码

其中的CruiseMode是巡航模式,请大家忽略吧,那是很久之前设想的一个功能:在一定速度的时候按下摇杆按钮,滑板就会保持当前的速度进行巡航,玩家可以松开遥控器了。在需要刹车的时候,再按一下摇杆按钮,或者直接刹车,都会退出这个巡航模式。
现在回想起来,这真是个“为用户着想”的反面教材,玩电滑板的时候,最主要的是安全,在此基础上是易操作。把手柄放开,在危险时又急急忙忙拿起来操作,这本身就够危险的了。
最近,这个遥控器又有了新的版本,手感好多了。这里先卖一个关子,等后续攻略写完之后再继续改进。
———————————–
回到目录点这里
———————————–
另外,我建了一个电动滑板的小组,如果有朋友想讨论的话,可以猛戳链接进行讨论,谢谢!

无线供电的磁悬浮灯

66f57921jw1esq7lq4eszg208o0684qr.gif (312×224)
上次发了一个磁悬浮的彩灯,好多人问我灯是怎么亮的,我只好很尴尬的解释“其实我是放了一块电池在里面”
现在终于可以体面的宣布:这个彩灯已经是无线供电的了。

Step 1: 无线供电模块

无线供电模块

无线供电模块

说起无线供电模块,其实没有那么神秘。大家在高中的时候,应该都做过电磁耦合的实验,变压器就是用的这个原理。

两组一样的线圈,其中一个如果加上了交变的电流,就会产生交变的磁场,从而在另外一组线圈里也产生出电流。
如果你觉得供电模块的效果不好,也可以自己重新绕一组线圈,绕的匝数适当多一点儿可以增加传输距离。
我小的时候,家附近有一做广播电台的发射塔。附近的居民有的在家里会接一种线圈,可以点亮灯泡用于照明,真是高手在民间!

Step 2: 继续打印灯座

悬浮灯的灯座

悬浮灯的灯座

由于要把一个线圈嵌入底座,所以这次的底座要比上次大一点儿,STL的图在附近中可以下载。

附件:

Step 3: 成功悬浮

无线供电的磁悬浮灯泡

无线供电的磁悬浮灯泡

最终效果就是最上面的GIF了。需要说明的是,这次使用的是一种非常简易的方案:在原有的磁悬浮之上叠加了一个无线供电模块,也就是说把两套系统简单的拼装在一起。

真正高性能的磁悬浮+无线供电,应该是把用于无线发电的高频交变电磁场,叠加在用于平衡的四个大线圈之上。类似于电话和宽带可以使用同一个线路。这个等之后有空再继续做 :)

炫酷的磁悬浮彩灯

之前做过磁悬浮的陀螺和鸡蛋,其实原理都一样,只要是带磁铁的底座,加上想悬浮的东西就可以了。
如果想看制作磁悬浮的详细攻略,可以看之前的博客:http://www.diy-robots.com/?page_id=685
这次要悬浮的是一个LED的彩灯,之所以做这个东西,是因为kickstarter上有一款悬浮灯(名字就不说了)居然众筹到了61万美元!
啊,美国的同学们哪,你们有空真应该多上上淘宝……
磁悬浮的LED彩灯

磁悬浮的LED彩灯

Step 1: 磁悬浮的底座

首先,你得有个磁悬浮的底座。有了底座,上面的东西基本只要别太重就好了:

悬浮状态的盗梦陀螺截图

Step 2: 量尺寸,准备3D打印一个底座

自从有了3D打印机,妈妈再也不用担心我用电锯切到手了!

为了做悬浮灯,我买了一个LED的灯泡,把它拆了。阿弥陀佛,真是作孽啊。
量量尺寸,用3D做一个模型,然后把剩下的事情交给打印机……
买回来的LED灯泡,还没发挥余热就被拆解了

买回来的LED灯泡,还没发挥余热就被拆解了

量悬浮磁铁的尺寸

量悬浮磁铁的尺寸

量灯泡内部空间的尺寸

量灯泡内部空间的尺寸

Step 3: 3D模型和打印出来的结果

3D打印的灯座

3D打印的灯座

看上去效果不错 :)

其实强度也挺好

附件:

灯座的3D打印模型:megfloat.stl

Step 4: 焊接彩灯

焊接好的LED彩灯们

焊接好的LED彩灯们

为了简单起见,我直接买了那种会变色的LED灯。

通电之后,这个LED就会按一定的顺序变幻彩色,很好看。
这里焊了3个,连成金字塔形。需要注意的是,我这里使用了锂电池来供电,电压一般超过3.7V。而这种LED大多是3V的电压。
所以需要把3个灯并联之后,再串联一个小电阻,我用的是27欧的。
最下面还留了一个电源插口,用来插上电池。电池的部分忘了拍照,由于灯泡内的空间较小,所以选用了16340锂电池。

Step 5: 大功告成

悬浮灯效果1

悬浮灯效果1

悬浮灯效果2

悬浮灯效果2

看看效果吧,贴了两张不同颜色的状态。
如果看视频的话,你会发现这个灯还是一直旋转的。
这个功能其实是“不小心”设计出来的,如果一个悬浮物的磁力中心和它的重心不重合,那么磁场为了纠正重心位置,就会不断的向悬浮物施加电磁力。这个悬浮的东西就会慢慢的跟随程序调节的频率旋转起来。
如果是非常对称的悬浮物,则不会保持旋转。

电滑板攻略 – 主控板程序

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

电动滑板攻略 – 蓝牙控制原理

目前市面上的电动滑板,大多都是用的车模的2.4G遥控器,基本上都是单向控制。在我的改装里,把遥控换成了蓝牙通讯(其实蓝牙的波段也是2.4G,不过是制定了数据通讯协议),改用蓝牙之后有很多好处:

1. 可以双向通讯,滑板可以通知遥控器电量、速度或者未来还可以有载重等信息;
2. 大量的蓝牙设备可以用来当遥控器,最常见的就是手机,还可以有游戏柄、手环、指环,以后没准还可以脑波控制;
3. 开发简单,蓝牙配对之后可以模拟成串口,直接发送数据就可以了;
说起蓝牙,这个名字真是够怪的。它的起名来源是一位国王,据说爱吃蓝莓以至于牙真的是蓝色的,所以有个绰号叫Bluetooth。可能是因为这个家伙比较擅长沟通,所以发明蓝牙的科学家就用它来命名最新的通讯协议了。我们常见的无线通讯协议还有WIFI和ZigBee,分别应用于不同的场景。
蓝牙模块
蓝牙设备都是成对儿使用的,以电动滑板为例,其中一个是主设备,另外一个是从设备。就像相亲一样,总得其中一个主动点儿才能成功配对。
我们选用的蓝牙模块是 HC-05 主从一体的蓝牙模块,也就是同样的一个蓝牙模块,你可以把它设置成主设备,也可以把它设置为从设备。你在淘宝购买的时候,可能会发现长的不一样的蓝牙模块,有的边缘有锯齿,我们一般叫“邮票板”;还有的是带底板的,用插针连出来。
邮票板的每个缺口都是一个引脚,有很多功能其实是我们用不上的。插针板其实就是给邮票板加上了一个底板,一般还会用热缩管套起来。它把我们最常用的一些引脚引出来,方便开发和调试。相对的来说体积就会大一点儿。不管是什么板,大多数蓝牙模块都包含下面的这些引脚:
蓝牙模块

蓝牙模块

其中GND表示电源地;VCC是电源正极,需要看好是3.3V还是5V;TX(Transmit)用于发送数据;RX(Receive)用于接受数据。这4个引脚是所有蓝牙模块都会有的,其他的一些常见的引脚包括:Key(或EN),设置为高电平才能进入AT设置模式;State(或LED),通常用于连接一个闪烁的灯,表示蓝牙的状态。
需要注意的是,不管是蓝牙还是别的什么串口,RX和TX都是对换着接的。例如蓝牙模块的RX需要对应Arduino的TX,蓝牙模块的TX对应Arduino的RX。这也很好理解,一方的发送端肯定是要连到对方的接收端嘛。
AT指令
前面提到了用Key或EN可以让蓝牙进入AT模式,所谓的AT模式是指蓝牙的设置模式,在这个模式下,可以设置蓝牙的名字、密码、配对信息等等。
如果要用电脑调试蓝牙,你需要一个USB转串口的模块(请在某宝搜 USB+串口+UART+模块 ),这种模块一般带有USB插头直接可以接电脑,另一头则是一些插针用于连接设备。设置蓝牙的话,请按下图连线:
usb转串口

usb转串口

连接之后在电脑上就会发现新硬件,比尔盖子会帮你找到驱动,完事儿之后你会在设备里看到一个新硬件,并映射出一个COM端口。
这时候你可以用Arduino的串口监视器来测试AT指令,在输入框输入AT后回车,你会发现蓝牙给你返回了一个OK,这就表示AT指令是可用的。不同厂家的AT指令并不完全相同,所以最好要找卖家要说明文档,不过一些常见的AT指令应该都支持。
其中AT指令包括查询和设置,以蓝牙的名称为例:
AT+NAME=ChuangKoo  这个命令把蓝牙模块的名字设置成ChuangKoo,蓝牙返回OK
AT+NAME? 这个命令蓝牙返回ChuangKoo
还有一些常见的命令包括:
AT+ROLE=M  设置蓝牙为主(Master)模式,等号后面是S的话则表示从(Slave)模式
AT+DEFAULT  还原为默认设置
AT+RESTART  软件复位(重启)
AT+ADDR?    查询本模块的Mac地址
AT+BIND=0002,0a,01eea7   自动绑定对方的Mac地址,只对主模式有效
其中我们主要就是靠AT+BIND来实现遥控器和电滑板的配对的。
Arduino程序
我的遥控器和电滑板上,都各自有一块Arduino Pro Mini和一个蓝牙模块。蓝牙模块设置了自动配对之后,它们只要加了电就会自动连接,这时候它们就进入“透传”状态,也就是说两个Arduino之间就像直接连上了一样。
在硬件上,Arduino有两种方式可以连接蓝牙,一种是直连,就是把Arduino板子上的RX、TX分别和蓝牙模块的TX、RX相连,在代码里用Serial类来操作;
这种方式据说会比较稳定,但是令人烦躁的是,当我们需要烧录程序的时候,需要把Arduino的RX、TX和烧写器相连;一旦接上蓝牙之后,烧程序就没法用了。
另外一种是软件串口的方式,随便选Arduino上的两个数字输出口,例如11和12,用它们来连接蓝牙的RX和TX,在代码里用SoftwareSerial类来操作。
这样烧代码的时候,就不需要把蓝牙拔下来了,而且一个Arduino板子可以控制好几个软件串口。
接线示意图如下:
电动滑板蓝牙连接示意图

电动滑板蓝牙连接示意图

遥控器端的代码是这样的:
  1. #include <SoftwareSerial.h>
  2. SoftwareSerial mySerial(12, 11);
  3. void setup()
  4. {
  5. mySerial.begin(9600);  //设置波特率
  6. }
  7. void loop()
  8. {
  9. int readValue = 50;  //这里会换成从摇杆得到的读数
  10. mySerial.write((byte)readValue);
  11. delay(100);
  12. }

mySerial就是软件串口,你可以看到就用简单的 mySerial.write(xxx) 就可以从遥控器向滑板发送数据了。

接收端的代码是这样的:
  1. #include <SoftwareSerial.h>
  2. SoftwareSerial mySerial(12, 11);
  3. int powerValue = 50;  //摇杆默认位于0~100的中点
  4. void setup()
  5. {
  6. mySerial.begin(9600);  //设置波特率
  7. }
  8. void loop()
  9. {
  10. while(mySerial.available()) {
  11. powerValue = mySerial.read();
  12. }
  13. // 此处用powerValue来控制电机
  14. delay(2500);
  15. }

其中两个主要的函数 mySerial.available() 用于判断当前蓝牙模块是否有数据进来;mySerial.read() 用于读一个字节的数据。

所以蓝牙配对之后,两个设备之间有什么想说的悄悄话,只需要其中一个用Serial.write 写入,另一个就可以用Serial.read 来读取了,真是超级方便!
———————————–
回到目录点这里

电动滑板攻略 – 无刷电机控制原理

机械部分就绪之后,就是各种软件和电子的工作了,首先我们看看怎么控制一个无刷电机。我们用的电机是外转子无刷电机,型号是5065。

外转子无刷电机

外转子无刷电机

这种电机和常见的直流电机不同,它的线圈是不动的,周围是一圈磁瓦。工作的时候,三条电线里面的电流方向会不断的切换,这个切换是通过电子方式实现的,所以不需要传统电机的电刷。
跟它必须同时提到的就是电调,全称是电子调速器。它的作用就是在这3条电线里,不断的切换电流状态,从而控制电机转速。
电调

电调

至于调试方式,传动的直流电机,可以通过电压调节,转速随着电压增大而增大。而无刷电机是通过可编程控制器来调速,一般是用一种叫做PWM的方式。

PWM是“怕玩命”的缩写,英文写法是“Pulse-width modulation”,也有些外行人士把它翻译成“脉冲宽度调制”。对于没有听说过PWM的同学,请先参考一下我的另一篇博客Arduino的模拟输入和输出

简单的说,对于传统的控制信号,假设最高速的时候控制电压是1,那么可以输出0.5来表示一般的速度。但是对于单片机来说,输出0和1是方便的,输出0.5会比较麻烦。这种情况了,可以快速的在0和1之间切换,达到的效果就和0.5很相似了。

pwm1.gif (601×197)

电调的控制,就是使用了PWM的方式。不过它不是通过占空的比例来控制转速,而是用1的脉冲宽度来判断:
输出高电平2.1ms左右,表示最大值;

输出高电平0.9ms左右,表示最小值。

下面这段代码,用蓝牙发送0~100的数值给单片机,就可以模拟航模摇杆从油门最小推到最大的情况:

#include <Servo.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(11, 5);

int motorPin = 12;    // 用于控制电机的管脚
Servo powerServo;

void setup()
{
  mySerial.begin(9600);
  powerServo.attach(motorPin);
}

void loop()
{
  double T = 2500; // 脉冲周期2.5ms,相当于400Hz
  long t0 = micros();  // 记录当前时间

  int readPower = 50; //默认是中点位置50
  while(mySerial.available()) {
    // 从蓝牙输入一个0~100的值
    readPower = mySerial.read();
  }

  double len = 900 + readPower * 12; //(0~100对应总周期0.9ms~2.1ms)
  powerServo.writeMicroseconds(len);

  int leftMs = (int) (t0 + T - micros());  //休眠到下一个周期继续循环
  delayMicroseconds(leftMs);
}

需要注意的是,航模和车模的电调操控方式是不同的。航模的油门是从最低点开始,推到头是最大值;而车模的电调平时处于中点位置,向上推到头表示加速,向下拉到头表示刹车。滑板就是使用的车模电调模式,也就是说高电平从 1.5ms~2.1ms是加速区域、从1.5ms~0.9ms是刹车区域。

好盈的电调一般都支持很多模式,另外还有很多可选的参数。如果想修改它的模式,可以按住小按钮后接通电源,然后按照说明书的提示进行设置。

不差钱的同学可以买一个编程器,插上电调之后可以直接设置。

———————————–
回到目录点这里

滑板小科普

我的DIY主要是基于现成的滑板来改装,所以在介绍电滑板之前,先简单介绍一下滑板。内容相当基础,已经是滑板圈内的朋友请无视。以前没有玩过滑板的同学请务必仔细看,以后忽悠妹子的时候用得上。

1. 千奇百怪的方案
我最早的一版电滑板是用活力板改装的,它其实不算是真正的滑板,前后各有一个万向轮,没有动力的时候靠身体扭动来前进。

活力板改装的滑板

活力板改装的滑板

当初选用两轮的方案,是因为还不知道滑板的原理,觉得四个轮子的小车,在没有差速器的情况下很难转弯。而两轮的小车,靠重心偏移就可以转弯了。后来才知道滑板使用了一种叫做海鸥架的东西,受力时会向一侧偏移,同样靠重心就可以转弯了。

海鸥架

海鸥架

滑板转弯示意图

滑板转弯示意图

滑板转弯原理

还有的朋友前轮使用了海鸥架,后轮使用了独立驱动轮,一共是3个轮,例如诸葛小新同学的电滑板。小新同学的3轮板没有试过不好说,从我的经验来看,四轮板比两个轮的好学多了,一分钟就可以上路,大力推荐!

2. 选择你的滑板

下面我们讲的都是普通的四轮滑板,常见的滑板根据长度和功能不同,可以分为小鱼板、双翘板、长板。
其中小鱼板最短、塑胶轮、非常轻,一般是一头尖一头翘,主要用于代步,需要时可以翘头转向;
双翘板大多是硬轮,速度快,用于做各种花式动作,有时也叫街式滑板;
长板最长(废话啊),也是塑胶轮,一般用于刷街,所以也叫公路板。

不同尺寸的滑板

不同尺寸的滑板

据说滑板界的鄙视链是:双翘板->小鱼板->长板->电滑板。如果你选择了电滑板,那么恭喜你成为鄙视链的最底端。其中玩双翘板的人群水平最高,跟他们千万别说是“玩电滑板”,要说“用电滑板代步”,否则会遭到无情的羞辱 ^_^

话说回来,这三种板我都组装过。总体来说,长板非常稳,跑的飞快,而且底部空间很大,加装LED灯带、大喇叭啥的都很方便。它的问题在于太大太重,提着上地铁会有点儿累。所以我一般把它放后备箱,停车比较远的时候用。小鱼板确实非常轻便,对应的缺点就是功能比较单一,就是跑。另外,由于轮距比较近,启动的时候容易摔。我一般坐地铁的时候带上它,比骑自行车方便多了。双翘板在两者之间,在我看来兼具了两者的缺点。当然如果你臂力较强、平衡能力也不错,可以认为它兼具了两者的优点。

3. 前驱还是后驱?
前驱后驱是指,电动滑板的动力轮是在前轮还是后轮。小汽车里前驱后驱都很常见,但是电动滑板一般都是后驱。
前驱的设计相当于是“狗拉雪橇”,向前跑的时候比较稳,但是刹车的时候由于惯性很容易甩尾;
后驱的设计就像超市里推购物车(差点儿写上“老汉推车”),加速或自重较大时,车身很容易抖动,但刹车的时候相当于从后面拽,比较安全。
所以比较好的组合应该是前轮驱动,后轮刹车。可惜电动滑板一般不是通过刹车片,而是用电机的电磁阻力来刹车,也就是驱动轮和刹车轮是同一个。
权衡之后,一般都选择后驱的方式,因为启动的时候,你可以控制慢慢加速,但是刹车的时候一般都是紧急情况,必须快速制动。

4. 单驱、双驱还是四驱
现在的电调、电机性能都非常好了,所以单个电机足以带动一个100公斤的胖子(阿弥陀佛,如果你超过100公斤,请谨慎考虑是否要上滑板)。单驱的问题在于只有一个轮子是动力轮,磨损会比较厉害,过一段时间之后需要跟其他的轮子换一下;另外遇到地面湿滑的时候,单个驱动轮的滑板很有可能打滑。
双驱的滑板能够比较好的解决这个问题,虽然可以选用小一点儿的电机和电调组合,但是成本还是会高不少;而且两个电机转速不会完全匹配,耗电也会相对较高。
四驱的滑板甚至把前后驱的问题也解决了,四个轮子都是动力,都可以刹车,这就纯属有钱任性的类型。

5. 还有什么电动滑板?
其实市面上比较常见的是“电动滑板车”,是两个轮子带扶手的。很多人建议我改做这个滑板,比较好操作。

电动滑板车的原型

电动滑板车的原型

但是我觉得这个东西不够酷,而且重量并不轻,上地铁的时候有可能被拦下。但从商业价值来说,这种滑板车的市场应该会大很多。

前不久kickstart上出现了一款特别火叫Hendo的“磁悬浮滑板”。它是利用了抗磁性的原理来实现悬浮,可惜只能运行在铜质的跑道上,而且价格死贵。当然人类的创意是无限的,迈出第一步,后续才有可能不断的改进。

磁悬浮滑板

磁悬浮滑板

返回目录

电动滑板详细攻略来啦

最近有一位网友给我留了言“我是看着您的博客长大的,受您的影响爱上了电子制作……非常感谢!”我心头一惊,这到底是什么情况,我觉得自己还挺年轻啊?!

仔细算了一下,当年的小读者如果是初中生的话,现在也该上大学了,我也从老男孩变成了两个娃的孩子爹。
这么多年来,我换了好几次工作,几乎有一半的工作日是在加班中度过(IT民工你们都懂的)。做过的项目很多随着互联网的风起云涌销声匿迹了,没有留下太多的回忆。反而是这些业余的小制作,让我觉得生命没有浪费。帮助很多人的同时也得到了很多帮助,结交了不少热心的朋友。

惭愧的是这几年更新的非常少,还有很多的烂尾项目。这次下决心重新开始写攻略,欢迎大家监督!

言归正传,关于电滑板其实我已经做了很久了。制作电滑板的起因是公司搬到了中关村,这个“天下第一村”开车爆堵,停车死贵,坐地铁的话差不多要步行两公里 T_T

中关村火车站

中关村火车站

于是我想起了柯南小朋友的电动滑板,打算做一个来玩玩。谁知道这玩意儿实在太好玩了,一发不可收拾。最初是用两轮的活力板改装,后来陆陆续续又改成了双翘板、长板、小鱼板;遥控方式也从手机遥控到手持遥控器;此外还加了蓝色的夜行灯,低电量提醒等功能;愚人节的时候搞了个汽车大喇叭来吓唬人……

各种版本的电滑板

各种版本的电滑板

手持遥控器

手持遥控器

蓝色夜行灯

蓝色夜行灯

DIY出来的电滑板,时速可以达到30Km/小时,在公路上轻松超越电动自行车;5200mAh的锂电池,续航超过10公里;载重最大可以到90公斤;目测爬坡可以上15度左右。

按照习惯,我会先把目录放出来,然后定期更新这篇文章里的链接地址。另外,我还打算把代码放到Github上,有兴趣增加或改进功能的朋友,欢迎到时添砖加瓦!

1. 选择滑板
2. 器件清单
3. 传动和连接
4. 无刷电机控制原理
5. 蓝牙控制原理
6. 主控板程序
7. 手持遥控器
8. 手机端遥控程序
9. 夜行灯
10. 关于测速
11. 汽车大喇叭
12. 低电量报警
13. 记住功能设置

创酷的注册已经放开,不需要邀请码了 :)

注册地址 http://www.chuangkoo.com/ucenter/register