Arduino智能小车随笔(一)
看到小孩的各种STEM课程很火,收费又老贵,就想着不如自己和小孩一起学着做个arduino智能小车,即能让女儿学点编程,又能省了智商税,一举两得。然而到了后面女儿基本上只帮我接线,arduBlock实在无法支持她和我完成这个小目标。最后就是我做她玩>__<
目标:
做一个小车:
基本功能(已基本实现):
- 可遥控
- 可自(sui)主(ji)移动
- 可调速
- 会避障(不会撞墙)
- 会探测前方悬空(不会跳楼)
进阶功能(计划中):
- 会知道各个轮子转速
- 探测轮子卡壳
- 保持四轮匀速
- 控制转弯角度
高级功能(在热情熄灭前不知道能不能开始):
- 视觉识别+跟踪
硬件方面(只实现基本功能):
智能小车车架+编码电机+电池组
Arduino mega 一块 (uno主要考虑中断口不够难以测速)
L298N两块 (一块可以驱动两个电机)
某宝电源模块一个(提供多个电源针口,3路直接输出,3路5V输出,3路3V输出)
超声波测距HC-SR04四个
蓝牙HC-06模块一个,用于遥控
亚克力板
杜邦线
基本功能
智能小车首先得有个底盘,摆着要么不做要做就做个霸气的,先去某宝淘了个看起来很NB的底盘+电机+电池,花了600大洋,就冲着这不明觉厉的麦轮四驱和悬挂,值了 (某方机器人,广告费免了)
这个底盘跟了四个编码电机,每个电机两个霍尔输出可用于测速,可用于进阶中的测速和实现相关功能。板上空间目测也够大,能够放很多智(dian)能(zi)元(wan)件(ju)。
车架到手之后,迅速搭好。麦轮放了X型,可以通过调整电机方向来达到不同的运动状态。麦轮好处明显,往哪个方向运动都行,但有个问题是轮子的受力方向也比普通轮子多。尤其是运动导致轮子受水平方向向外的力较大时,减速电机输出轴和联轴器的连接如果不够牢固,轮子容易飞脱。这个问题还在解决中。另外麦轮不同方向运动所需的转速不同,实测我这个电机pwm 120时,前进后退都正常,左右位移就很困难,要差不多180的时候才顺畅。
电池用铜柱和两片车架的副翼固定住,放在了底盘下面,把充电线绕到了车屁股上,突然觉得很有赛车的感觉哈。
arduino mega用铜柱固定在车架上,在上方也用铜柱架起来,以后可以在顶上放块亚克力板,继续堆个树莓派搞视觉识别。
L298N的放置花了好久才想好。如果水平放置的话,占空间太大,而且需要四根铜柱固定,放两个基本上这车上就没位置放别的了。最后发现散热片上有个m3螺丝和螺纹孔,就换了个16mm的m3螺丝,把它垂直固定在了板上。
电源模块没有固定孔,没啥好的固定方法,只好弄了那种宝宝防撞条的双面贴纸(很厚的)贴在下面。自行裁剪了一小块亚克力板,用铜柱架起来,用来粘电源模块。自己加工螺丝孔的精度真是惨不忍睹。
这个车架前后左右都有一个副翼,用了塑料束带把超声波模块HC-SR04固定在上面。蓝牙直接插在了后副翼的孔里。
至此各个元件的位置基本固定了。然后就是用杜邦线连起来,深深地感受到了集成电路的必要性。在基本功能和进阶功能完成后,我要把线扎起来,用洞洞板焊起来 =.=。
基本功能程序篇
L298N来控制电机的原理:用使能端连pwm调速,两个逻辑输入控制旋转方向,就可实现各个电机转向和速度的控制。这个小车由于四轮驱动和麦轮运动状态的多样性,导致编程时容易混乱,用有意义的常量名来代替实际端口和运动状态是个比较好的做法。顺便鄙视下arduino的IDE。除了关键词变色其他代码补全啥的全都没有,简直是对21世纪编程环境的侮辱。。。
定义各路端口(使能端用pwm端口):
// Define motor control pins
int LEFT_FRONT_MOTOR_ENABLE = 9;
int LEFT_FRONT_MOTOR_IN1 = 26;
int LEFT_FRONT_MOTOR_IN2 = 27;
int LEFT_REAR_MOTOR_ENABLE = 8;
int LEFT_REAR_MOTOR_IN1 = 24;
int LEFT_REAR_MOTOR_IN2 = 25;
int RIGHT_FRONT_MOTOR_ENABLE = 10;
int RIGHT_FRONT_MOTOR_IN1 = 28;
int RIGHT_FRONT_MOTOR_IN2 = 29;
int RIGHT_REAR_MOTOR_ENABLE = 11;
int RIGHT_REAR_MOTOR_IN1 = 30;
int RIGHT_REAR_MOTOR_IN2 = 31;
定义电机转动方向:
// Define motor rotate direction
int MOTOR_ROTATE_FORWARD = 1;
int MOTOR_ROTATE_BACKWARD = -1;
int MOTOR_ROTATE_STOP = 0;
定义小车运动状态:
// Define Car State
int CAR_MOVE_STOP = -1;
int CAR_MOVE_FORWARD &#