Archive for the ‘大事记’ Category
电滑板攻略-手持遥控器
由 动力老男孩 发表于 2015/06/08 23:58:07上周玩了几天无线供电的磁悬浮彩灯,耽误了一点儿时间,今天继续写滑板攻略
无线供电的磁悬浮灯
由 动力老男孩 发表于 2015/06/03 01:09:39Step 1: 无线供电模块
Step 2: 继续打印灯座
Step 3: 成功悬浮
炫酷的磁悬浮彩灯
由 动力老男孩 发表于 2015/05/26 00:03:26Step 1: 磁悬浮的底座
Step 2: 量尺寸,准备3D打印一个底座
Step 3: 3D模型和打印出来的结果
Step 4: 焊接彩灯
Step 5: 大功告成
电滑板攻略 – 主控板程序
由 动力老男孩 发表于 2015/05/21 22:57:41这一部分内容也许会有点儿枯燥,对Arduino了解不多的同学,可能要先去预习一下。如果大家有需要的话,我也可以考虑发一系列Arduino的入门教程
- #include <EEPROM.h>
- #include <Servo.h>
- #include <SoftwareSerial.h>
- SoftwareSerial mySerial(11, 5); //Product board
- int motorPin = 12; // The pin output PWM to control motor
- int motorPin2 = 0; // For the new board with 2 motors, if motorPin2 < 0, then ignore it
- int hornPin = 10;
- int hornOffTime = 1000; // Cannot use horn too long, must less than 1s
- int hornStartTime = 0;
- int power = 50; // Control pow value, from 0 to 100;
- long lastRecvTime = 0; // If cannot recv control info in 0.2s, stop the moto
- int shutDownTimeRange = 200;
- int powerScale = 100; //if set the power scale by mobile
- int testingValue = 0;
- int lightMode = 2; // 1: on; 2:off; 3: auto
- int lightCtrlPin = 10;
- int envLightSensorPin = 1;
- boolean lightStatus = false; // shutdown ligth by default
- Servo powerServo;
- Servo powerServo2;
- // The Led pin for debug
- int ledPin = 13;
- int light = 1;
- int counter = 0;
- // Beep pin
- int beepPin = 6;
- boolean beepStatus = false;
- // Connect to speaker
- int tonePin = 6;
- // battery pin
- int batteryPin = 0;
- float batteryScale = 11;
- float batteryAlert = 3.5;
- void setup()
- {
- pinMode(ledPin,OUTPUT);
- pinMode(beepPin,OUTPUT);
- pinMode(lightCtrlPin,OUTPUT);
- pinMode(hornPin,OUTPUT);
- powerScale = EEPROM.read(0);
- if (powerScale <= 0 || powerScale > 100) powerScale = 100;
- lightMode = EEPROM.read(1);
- if (lightMode <= 0 || lightMode > 3) lightMode = 2; // default light off
- Serial.begin(9600);
- mySerial.begin(9600);
- powerServo.attach(motorPin);
- if (motorPin2 > 0) powerServo2.attach(motorPin2);
- }
- void checkBattery()
- {
- if (counter == 0 || counter == 200) {
- int readValue = analogRead(batteryPin);
- if (readValue > 5 && batteryScale * readValue / 1024 * 5 < batteryAlert * 6) {
- digitalWrite(beepPin, beepStatus);
- beepStatus = !beepStatus;
- } else {
- digitalWrite(beepPin, 0);
- }
- }
- }
- void updateCounter() {
- counter++;
- if (counter >= 400) counter = 0;
- }
- void switchLight()
- {
- if (counter == 0) {
- digitalWrite(ledPin, light);
- light = 1 - light;
- //Serial.println(testingValue);
- }
- }
- void sendPowerInfo()
- {
- if (counter == 0) {
- mySerial.write((byte)(analogRead(batteryPin) / 4));
- }
- }
- void loop()
- {
- long t0 = micros();
- int readPower = -1;
- while(mySerial.available()) {
- readPower = mySerial.read();
- lastRecvTime = micros();
- digitalWrite(ledPin, light);
- light = 1 - light;
- //counter = 0;
- if (readPower > 100) {
- break;
- }
- }
- if (readPower > -1 && readPower <= 100) {
- // Normal status
- power = readPower;
- }
- if (readPower == 255 || (lastRecvTime > 0 && (t0-lastRecvTime)/1000 > shutDownTimeRange)) {
- power = 50; // 松手默认滑行
- }
- if (readPower > 100 && readPower <= 200) {
- powerScale = readPower - 100;
- EEPROM.write(0, (byte) powerScale);
- }
- if (readPower > 200 && readPower <= 203) {
- lightMode = readPower - 200;
- EEPROM.write(1, (byte) lightMode);
- }
- if (readPower == 204) {
- digitalWrite(hornPin, 1); // start horn
- hornStartTime = t0;
- tone(tonePin, 4000);
- }
- //if (readPower == 205 || (hornStartTime > 0 && (t0 - hornStartTime) / 1000 > hornOffTime)) {
- if (readPower == 205) {
- digitalWrite(hornPin, 0); // stop horn
- hornStartTime = 0;
- noTone(tonePin);
- }
- // light control
- if (lightMode == 1) {
- // light on
- digitalWrite(lightCtrlPin, 1);
- lightStatus = true;
- } else if (lightMode == 2){
- // light off
- digitalWrite(lightCtrlPin, 0);
- lightStatus = false;
- } else {
- //auto
- int envLight = analogRead(envLightSensorPin);
- testingValue = envLight;
- if (!lightStatus && envLight < 800) {
- lightStatus = true;
- }
- if (lightStatus && envLight > 900) {
- lightStatus = false;
- }
- digitalWrite(lightCtrlPin, lightStatus);
- }
- updateCounter();
- switchLight();
- checkBattery();
- double T = 2500;
- // if has power scale
- double scaledPower = power;
- if (power > 50) {
- scaledPower = 50 + (power - 50) * powerScale / 100;
- }
- double len = 900 + scaledPower * 12; //(0~100对应总周期0.9ms~2.1ms)
- powerServo.writeMicroseconds(len);
- if (motorPin2 > 0) powerServo2.writeMicroseconds(len);
- int leftMs = (int) (t0 + T - micros());
- if (leftMs > 1500 && (t0-lastRecvTime)/1000 < shutDownTimeRange) {
- sendPowerInfo();
- leftMs = (int) (t0 + T - micros());
- }
- if (leftMs < 1) leftMs = 1;
- delayMicroseconds(leftMs);
- }
电动滑板攻略 – 蓝牙控制原理
由 动力老男孩 发表于 2015/05/19 00:27:50- #include <SoftwareSerial.h>
- SoftwareSerial mySerial(12, 11);
- void setup()
- {
- mySerial.begin(9600); //设置波特率
- }
- void loop()
- {
- int readValue = 50; //这里会换成从摇杆得到的读数
- mySerial.write((byte)readValue);
- delay(100);
- }
mySerial就是软件串口,你可以看到就用简单的 mySerial.write(xxx) 就可以从遥控器向滑板发送数据了。
- #include <SoftwareSerial.h>
- SoftwareSerial mySerial(12, 11);
- int powerValue = 50; //摇杆默认位于0~100的中点
- void setup()
- {
- mySerial.begin(9600); //设置波特率
- }
- void loop()
- {
- while(mySerial.available()) {
- powerValue = mySerial.read();
- }
- // 此处用powerValue来控制电机
- delay(2500);
- }
其中两个主要的函数 mySerial.available() 用于判断当前蓝牙模块是否有数据进来;mySerial.read() 用于读一个字节的数据。
电动滑板攻略 – 无刷电机控制原理
由 动力老男孩 发表于 2015/05/14 18:23:13机械部分就绪之后,就是各种软件和电子的工作了,首先我们看看怎么控制一个无刷电机。我们用的电机是外转子无刷电机,型号是5065。
PWM是“怕玩命”的缩写,英文写法是“Pulse-width modulation”,也有些外行人士把它翻译成“脉冲宽度调制”。对于没有听说过PWM的同学,请先参考一下我的另一篇博客Arduino的模拟输入和输出。
简单的说,对于传统的控制信号,假设最高速的时候控制电压是1,那么可以输出0.5来表示一般的速度。但是对于单片机来说,输出0和1是方便的,输出0.5会比较麻烦。这种情况了,可以快速的在0和1之间切换,达到的效果就和0.5很相似了。
电调的控制,就是使用了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是刹车区域。
好盈的电调一般都支持很多模式,另外还有很多可选的参数。如果想修改它的模式,可以按住小按钮后接通电源,然后按照说明书的提示进行设置。
不差钱的同学可以买一个编程器,插上电调之后可以直接设置。
滑板小科普
由 动力老男孩 发表于 2015/04/29 17:48:27我的DIY主要是基于现成的滑板来改装,所以在介绍电滑板之前,先简单介绍一下滑板。内容相当基础,已经是滑板圈内的朋友请无视。以前没有玩过滑板的同学请务必仔细看,以后忽悠妹子的时候用得上。
1. 千奇百怪的方案
我最早的一版电滑板是用活力板改装的,它其实不算是真正的滑板,前后各有一个万向轮,没有动力的时候靠身体扭动来前进。
当初选用两轮的方案,是因为还不知道滑板的原理,觉得四个轮子的小车,在没有差速器的情况下很难转弯。而两轮的小车,靠重心偏移就可以转弯了。后来才知道滑板使用了一种叫做海鸥架的东西,受力时会向一侧偏移,同样靠重心就可以转弯了。
还有的朋友前轮使用了海鸥架,后轮使用了独立驱动轮,一共是3个轮,例如诸葛小新同学的电滑板。小新同学的3轮板没有试过不好说,从我的经验来看,四轮板比两个轮的好学多了,一分钟就可以上路,大力推荐!
2. 选择你的滑板
下面我们讲的都是普通的四轮滑板,常见的滑板根据长度和功能不同,可以分为小鱼板、双翘板、长板。
其中小鱼板最短、塑胶轮、非常轻,一般是一头尖一头翘,主要用于代步,需要时可以翘头转向;
双翘板大多是硬轮,速度快,用于做各种花式动作,有时也叫街式滑板;
长板最长(废话啊),也是塑胶轮,一般用于刷街,所以也叫公路板。
据说滑板界的鄙视链是:双翘板->小鱼板->长板->电滑板。如果你选择了电滑板,那么恭喜你成为鄙视链的最底端。其中玩双翘板的人群水平最高,跟他们千万别说是“玩电滑板”,要说“用电滑板代步”,否则会遭到无情的羞辱 ^_^
话说回来,这三种板我都组装过。总体来说,长板非常稳,跑的飞快,而且底部空间很大,加装LED灯带、大喇叭啥的都很方便。它的问题在于太大太重,提着上地铁会有点儿累。所以我一般把它放后备箱,停车比较远的时候用。小鱼板确实非常轻便,对应的缺点就是功能比较单一,就是跑。另外,由于轮距比较近,启动的时候容易摔。我一般坐地铁的时候带上它,比骑自行车方便多了。双翘板在两者之间,在我看来兼具了两者的缺点。当然如果你臂力较强、平衡能力也不错,可以认为它兼具了两者的优点。
3. 前驱还是后驱?
前驱后驱是指,电动滑板的动力轮是在前轮还是后轮。小汽车里前驱后驱都很常见,但是电动滑板一般都是后驱。
前驱的设计相当于是“狗拉雪橇”,向前跑的时候比较稳,但是刹车的时候由于惯性很容易甩尾;
后驱的设计就像超市里推购物车(差点儿写上“老汉推车”),加速或自重较大时,车身很容易抖动,但刹车的时候相当于从后面拽,比较安全。
所以比较好的组合应该是前轮驱动,后轮刹车。可惜电动滑板一般不是通过刹车片,而是用电机的电磁阻力来刹车,也就是驱动轮和刹车轮是同一个。
权衡之后,一般都选择后驱的方式,因为启动的时候,你可以控制慢慢加速,但是刹车的时候一般都是紧急情况,必须快速制动。
4. 单驱、双驱还是四驱
现在的电调、电机性能都非常好了,所以单个电机足以带动一个100公斤的胖子(阿弥陀佛,如果你超过100公斤,请谨慎考虑是否要上滑板)。单驱的问题在于只有一个轮子是动力轮,磨损会比较厉害,过一段时间之后需要跟其他的轮子换一下;另外遇到地面湿滑的时候,单个驱动轮的滑板很有可能打滑。
双驱的滑板能够比较好的解决这个问题,虽然可以选用小一点儿的电机和电调组合,但是成本还是会高不少;而且两个电机转速不会完全匹配,耗电也会相对较高。
四驱的滑板甚至把前后驱的问题也解决了,四个轮子都是动力,都可以刹车,这就纯属有钱任性的类型。
5. 还有什么电动滑板?
其实市面上比较常见的是“电动滑板车”,是两个轮子带扶手的。很多人建议我改做这个滑板,比较好操作。
但是我觉得这个东西不够酷,而且重量并不轻,上地铁的时候有可能被拦下。但从商业价值来说,这种滑板车的市场应该会大很多。
前不久kickstart上出现了一款特别火叫Hendo的“磁悬浮滑板”。它是利用了抗磁性的原理来实现悬浮,可惜只能运行在铜质的跑道上,而且价格死贵。当然人类的创意是无限的,迈出第一步,后续才有可能不断的改进。
电动滑板详细攻略来啦
由 动力老男孩 发表于 2015/04/28 16:33:05最近有一位网友给我留了言“我是看着您的博客长大的,受您的影响爱上了电子制作……非常感谢!”我心头一惊,这到底是什么情况,我觉得自己还挺年轻啊?!
仔细算了一下,当年的小读者如果是初中生的话,现在也该上大学了,我也从老男孩变成了两个娃的孩子爹。
这么多年来,我换了好几次工作,几乎有一半的工作日是在加班中度过(IT民工你们都懂的)。做过的项目很多随着互联网的风起云涌销声匿迹了,没有留下太多的回忆。反而是这些业余的小制作,让我觉得生命没有浪费。帮助很多人的同时也得到了很多帮助,结交了不少热心的朋友。
惭愧的是这几年更新的非常少,还有很多的烂尾项目。这次下决心重新开始写攻略,欢迎大家监督!
言归正传,关于电滑板其实我已经做了很久了。制作电滑板的起因是公司搬到了中关村,这个“天下第一村”开车爆堵,停车死贵,坐地铁的话差不多要步行两公里 T_T
于是我想起了柯南小朋友的电动滑板,打算做一个来玩玩。谁知道这玩意儿实在太好玩了,一发不可收拾。最初是用两轮的活力板改装,后来陆陆续续又改成了双翘板、长板、小鱼板;遥控方式也从手机遥控到手持遥控器;此外还加了蓝色的夜行灯,低电量提醒等功能;愚人节的时候搞了个汽车大喇叭来吓唬人……
DIY出来的电滑板,时速可以达到30Km/小时,在公路上轻松超越电动自行车;5200mAh的锂电池,续航超过10公里;载重最大可以到90公斤;目测爬坡可以上15度左右。
按照习惯,我会先把目录放出来,然后定期更新这篇文章里的链接地址。另外,我还打算把代码放到Github上,有兴趣增加或改进功能的朋友,欢迎到时添砖加瓦!
1. 选择滑板
2. 器件清单
3. 传动和连接
4. 无刷电机控制原理
5. 蓝牙控制原理
6. 主控板程序
7. 手持遥控器
8. 手机端遥控程序
9. 夜行灯
10. 关于测速
11. 汽车大喇叭
12. 低电量报警
13. 记住功能设置