基于Intel Edison的智能四驱车开发:从硬件集成到软件控制全解析 1. 从“玩具”到“智能平台”Edison与四驱车的跨界融合如果你和我一样是个从小看着《四驱兄弟》长大对马达的轰鸣和赛道的弯道充满执念的“老男孩”同时又恰好是个喜欢折腾代码的程序员那么“在Edison上为四驱车开发程序”这个想法绝对能让你兴奋得搓手。这听起来像是个极客的浪漫幻想但我要告诉你这不仅是可行的而且其背后的技术逻辑和实现路径远比单纯让小车跑起来要有趣得多。我们今天要聊的就是如何将一块小小的Intel Edison计算模块塞进一辆经典的四驱车底盘里让它从一个靠电池和齿轮驱动的“傻跑”玩具蜕变成一个能感知、能决策、甚至能和你“对话”的智能移动机器人平台。Edison是什么简单说它是一块邮票大小的超微型电脑。别看它体积小它内置了双核Atom处理器、1GB内存、支持Wi-Fi和蓝牙运行着一个完整的Linux系统。这意味着你可以在上面用Python、Node.js、C等高级语言编写程序处理复杂的逻辑连接各种传感器并通过网络与外界通信。而四驱车则提供了一个近乎完美的移动载体坚固的底盘、强劲的马达、灵活的转向结构如果是改装车以及我们童年时就无比熟悉的操控感。当这两者结合我们谈论的就不再是“遥控车”而是一个可以实践机器人学、嵌入式开发、物联网IoT甚至边缘计算概念的绝佳实验场。那么我们到底要“决战”什么在我看来这场“决战”有三个层面第一是硬件层面的决战如何将Edison及其外围电路精巧、稳固地集成到空间极其有限的车体内并解决供电、散热和信号干扰问题。第二是软件层面的决战如何为这个异构的硬件平台搭建稳定、高效的开发环境编写能够精准控制电机、实时读取传感器数据、并做出智能响应的核心程序。第三是创意与应用层面的决战当基础平台搭建好后我们能用它做什么是做一个自动循迹的赛车一个通过手势或语音遥控的展示品还是一个能通过微信小程序实时查看摄像头画面并远程操控的侦察车这正是本次项目最吸引人的地方。接下来的内容我将以一个完整项目从零到一的构建过程为线索为你拆解每一个技术环节。无论你是嵌入式开发的新手还是想寻找一个有趣硬件项目的老鸟我相信这些基于实际操踩作坑的经验都能给你带来直接的帮助。我们不仅会让车跑起来更要让它“聪明”地跑起来。2. 战前准备硬件选型、改造与集成方案在代码敲下第一行之前我们必须把硬件这摊子事彻底理清。用Edison驱动四驱车不是一个简单的“插上就用”而是一个系统工程。你需要考虑动力、控制、感知、通信和能源这五大模块。2.1 核心主控Intel Edison模块的选择与基础扩展Intel Edison本身是一个核心计算模块它需要通过一块扩展板Breakout Board来引出GPIO、电源等接口。市面上常见的有Intel官方的Edison Kit for Arduino扩展板以及一些第三方开发的更小巧的底板。对于四驱车项目我强烈推荐使用官方的Arduino扩展板原因有三第一它提供了标准的Arduino Uno形式的引脚布局兼容海量的Arduino传感器扩展板Shield极大降低了后续扩展的难度。第二它集成了USB OTG、Micro USB供电和电池管理芯片供电方案更成熟。第三资料和社区支持最为丰富。拿到Edison和扩展板后第一件事是烧录系统镜像并配置Wi-Fi。这个过程官方有详细指南但有个关键点务必使用高质量的Micro USB线连接电脑劣质线缆可能导致刷机失败或连接不稳定。系统启动后你可以通过SSH如使用PuTTY或终端连接到Edison它的默认地址是192.168.2.15用户名为root。至此你的微型Linux服务器就准备就绪了。2.2 动力与驱动电机、电调与供电系统的设计经典的四驱车通常使用130型碳刷电机由两节AA电池3V直接驱动。但Edison和驱动电路需要稳定的5V电压同时我们还需要对电机进行调速和正反转控制这是原车电路做不到的。因此我们必须彻底改造动力系统。电机选择原装130电机电流大、效率低、难以精确控制。我建议升级为N20微型减速电机或TT马达。它们工作电压通常是3-6V或6-12V自带减速箱扭矩更大速度可控性更好而且价格低廉。你需要根据车体空间和所需速度/扭矩来选择合适的减速比。电机驱动模块这是控制的核心。我们无法直接用Edison的GPIO输出电流仅几毫安驱动电机必须通过电机驱动芯片。最常用、最可靠的是L298N或TB6612FNG驱动模块。L298N经典、皮实、驱动能力强单路2A但发热较大需要散热片。它适合驱动功率较大的TT马达。TB6612FNG更现代的选择效率高、发热小驱动能力单路1.2A对于N20电机绰绰有余且体积更小巧。我优先推荐TB6612FNG因为它更省电体积小更适合集成到紧凑的车体内。它的接线也很清晰VCC接电机电源正极需外接GND接电源负极AIN1/AIN2和BIN1/BIN2分别接Edison的四个GPIO口用于控制转向PWMA/PWMB接两个PWM引脚用于调速。供电系统这是项目的“能源心脏”设计不好会导致系统重启、控制失灵。我们需要两路独立供电逻辑电源为Edison、扩展板、传感器供电。需要稳定的5V。最佳方案是使用一块7.4V 2S锂聚合物电池通过一个降压模块如LM2596降至5V后供给。锂电池容量大、放电能力强。动力电源为电机驱动模块和电机供电。可以直接使用上述7.4V锂电池接在驱动模块的VMOT端。电机在启动和堵转时会产生很大的瞬时电流和电压波动与逻辑电源分开可以避免干扰导致Edison重启。重要提示务必确保逻辑电源5V和动力电源电池电压的“地”GND连接在一起即共地。否则控制信号无法形成回路。2.3 感知与交互传感器的选型与接入让车“有感觉”是智能化的第一步。根据你的项目目标可以选择以下传感器循迹/避障最常用的是红外反射传感器TCRT5000。它发射红外光并接收反射光通过检测反射强度来区分黑白线循迹或判断前方是否有物体避障。通常需要多个如5个一字排开用于精确循迹。接线简单数字量输出接GPIO模拟量输出接模拟输入引脚。测速在轮子或传动轴上安装霍尔传感器如A3144和磁铁每转一圈产生一个脉冲通过Edison计数即可计算速度。这对于实现PID速度控制至关重要。环境感知可以添加超声波传感器HC-SR04测量前方障碍物距离或MPU6050陀螺仪加速度计模块感知车身姿态用于防倾覆或特技控制。交互添加一个WS2812B RGB LED灯环可以用不同颜色和灯效表示系统状态如电量、模式一个有源蜂鸣器用于发出提示音。所有这些传感器和外围设备都通过Edison扩展板的GPIO数字输入/输出、模拟输入、PWM输出、I2C、SPI进行连接。在规划时最好画一张接线图明确每个设备使用的引脚避免冲突。2.4 机械改造与总装在方寸之间做文章这是最考验动手能力的部分。你需要拆除原车电路移除原有的电池盒、开关和导片。设计安装位用亚克力板、3D打印件或甚至乐高积木为Edison扩展板、驱动模块、电池、传感器制作安装支架。核心原则重心低、布局稳、便于检修。电池尽量放在底盘低位。走线与固定使用杜邦线或更可靠的焊接方式连接各模块。线缆要用扎带或热熔胶固定防止在高速运动中脱落或缠绕。电机驱动模块的大电流线路尽量使用粗一点的导线。开孔与保护为传感器如超声波、红外在车壳上开孔确保探测面无遮挡。可以用热熔胶或橡皮泥固定传感器并保护其引脚。完成以上步骤一辆硬件上脱胎换骨的“智能四驱车”就初具雏形了。接下来我们将进入软件世界赋予它灵魂。3. 开发环境搭建与核心控制程序编写硬件是躯体软件是灵魂。在Edison上开发你有多种语言选择这里我以最快速上手的Python为例因为它库丰富、语法简洁非常适合原型开发。当然追求极致性能的话C是最终选择。3.1 环境配置让Edison“听懂”Python指令Edison默认系统可能没有安装Python或版本较旧。通过SSH连接后首先更新软件源并安装必要的工具opkg update opkg install python python-pip python-setuptools pip install --upgrade pip为了用Python控制GPIO我们需要安装相应的库。对于兼容Arduino引脚定义的扩展板mraa和upm库是官方推荐。pip install mraamraa提供了底层GPIO、PWM、I2C等接口的访问能力。你可以通过import mraa来使用它。3.2 核心驱动编写电机控制库控制电机无非是三个动作正转、反转、停止和调速。我们可以将这些封装成一个简单的类方便调用。假设我们使用TB6612FNG驱动模块连接方式为AIN1-GPIO44, AIN2-GPIO45, PWMA-GPIO46 (PWM)控制左侧电机BIN1-GPIO47, BIN2-GPIO48, PWMB-GPIO14 (PWM)控制右侧电机。import mraa import time class DCMotor: def __init__(self, in1_pin, in2_pin, pwm_pin): 初始化电机控制引脚 self.in1 mraa.Gpio(in1_pin) self.in2 mraa.Gpio(in2_pin) self.pwm mraa.Pwm(pwm_pin) self.in1.dir(mraa.DIR_OUT) # 设置为输出模式 self.in2.dir(mraa.DIR_OUT) self.pwm.period_us(2000) # 设置PWM周期为2000微秒500Hz self.pwm.enable(True) # 启用PWM self.speed(0) # 初始速度设为0 def forward(self): 正转 self.in1.write(1) self.in2.write(0) def backward(self): 反转 self.in1.write(0) self.in2.write(1) def stop(self): 停止刹车 self.in1.write(1) self.in2.write(1) # 也可以写成 self.in1.write(0); self.in2.write(0); 滑行停止 def speed(self, spd): 设置速度spd范围0.0到1.0 if spd 0.0: spd 0.0 elif spd 1.0: spd 1.0 self.pwm.write(spd) # 初始化两个电机对象 motor_left DCMotor(44, 45, 46) # 引脚号根据实际接线修改 motor_right DCMotor(47, 48, 14) # 示例让小车前进2秒然后左转1秒停止 motor_left.forward() motor_right.forward() motor_left.speed(0.6) # 60%速度 motor_right.speed(0.6) time.sleep(2) motor_left.speed(0.3) # 左轮减速实现差速转弯 motor_right.speed(0.6) time.sleep(1) motor_left.stop() motor_right.stop()这个类封装了基本操作。你可以通过调整speed值和两个电机的速度差来实现前进、后退、原地转弯、平滑弧线转弯等所有基本运动。3.3 感知输入读取传感器数据以红外循迹传感器数字输出为例假设接在GPIO 29上。class LineSensor: def __init__(self, pin): self.sensor mraa.Gpio(pin) self.sensor.dir(mraa.DIR_IN) # 设置为输入模式 def is_black_line(self): 检测到黑线返回True白底返回False逻辑取决于传感器安装和调节 # TCRT5000数字输出遇到黑线吸收红外光时输出高电平白线反射强时输出低电平 # 但具体逻辑可能因传感器型号和电位器调节而相反需要实测 return self.sensor.read() 1 # 初始化5个循迹传感器 sensors [LineSensor(29), LineSensor(30), LineSensor(31), LineSensor(32), LineSensor(33)] def read_line_position(): 读取5个传感器的状态返回一个代表当前位置的简单编码 values [s.is_black_line() for s in sensors] # 例如将True/False列表转换为一个二进制或加权值用于PID控制 # 简单处理如果中间传感器看到黑线则认为在线上 if values[2]: return on_line elif values[1] or values[3]: return slight_deviation elif values[0] or values[4]: return large_deviation else: return lost_line通过循环调用read_line_position()我们就可以知道小车相对于黑线的位置从而做出调整。3.4 大脑逻辑实现简单的自动循迹算法有了电机控制和传感器读取我们就可以将它们组合起来实现最经典的自动循迹功能。这里介绍一个简单的比例P控制算法。def line_following_p_control(): 简单的P控制循迹主循环 while True: pos read_line_position() base_speed 0.5 correction 0.0 kp 0.2 # 比例系数需要根据小车速度和赛道调试 if pos on_line: correction 0.0 elif pos slight_deviation_left: # 假设左边传感器看到线 correction kp * 1.0 # 向右修正 elif pos slight_deviation_right: correction kp * -1.0 # 向左修正 elif pos large_deviation_left: correction kp * 2.0 elif pos large_deviation_right: correction kp * -2.0 else: # lost_line # 丢失线路的处理策略例如原地旋转搜索或按上次偏差方向继续前进一小段 correction kp * -3.0 # 假设原地左转搜索 left_speed base_speed - correction right_speed base_speed correction # 限制速度在0-1之间 left_speed max(0.0, min(1.0, left_speed)) right_speed max(0.0, min(1.0, right_speed)) motor_left.speed(left_speed) motor_right.speed(right_speed) motor_left.forward() motor_right.forward() time.sleep(0.02) # 控制周期约50Hz这个算法非常基础实际应用中需要加入**积分(I)和微分(D)**项来形成PID控制以消除稳态误差并提高过弯的平滑性。调试PID参数Kp Ki Kd是一个“玄学”过程需要耐心地在实际赛道上反复测试。4. 进阶赋能网络通信与远程交互实现让小车在赛道上自己跑只是第一步。利用Edison内置的Wi-Fi和蓝牙我们可以让它与外部世界连接实现远程监控、控制甚至集群协作。这里我们探索两种最实用的方式基于Web的远程控制和与微信小程序的联动。4.1 构建一个本地Web控制服务器我们可以用Python的轻量级Web框架如Flask或Bottle在Edison上快速搭建一个控制服务器。这样在同一局域网内的手机或电脑打开浏览器就能控制小车。首先在Edison上安装Flaskpip install flask然后编写一个简单的Web应用web_control.pyfrom flask import Flask, render_template_string, request import threading import time app Flask(__name__) # 这里需要引入之前写好的电机控制类 DCMotor # from motor_control import motor_left, motor_right # 为了安全在实际部署时这些控制对象应该通过更安全的方式传递 # 此处为示例假设为全局变量 motor_left None motor_right None # 一个简单的HTML控制界面 CONTROL_HTML !DOCTYPE html html headtitle四驱车遥控器/title meta nameviewport contentwidthdevice-width, initial-scale1.0 style body {text-align:center; font-family:Arial;} .btn {width:100px; height:100px; font-size:24px; margin:10px;} #up {grid-area: up;} #left {grid-area: left;} #stop {grid-area: stop;} #right {grid-area: right;} #down {grid-area: down;} .controls { display: grid; grid-template-areas: . up . left stop right . down .; justify-content: center; gap: 10px; margin-top: 50px; } /style /head body h1智能四驱车遥控/h1 div classcontrols button classbtn idup ontouchstartsendCmd(forward) ontouchendsendCmd(stop) onmousedownsendCmd(forward) onmouseupsendCmd(stop)↑/button button classbtn idleft ontouchstartsendCmd(left) ontouchendsendCmd(stop) onmousedownsendCmd(left) onmouseupsendCmd(stop)←/button button classbtn idstop onclicksendCmd(stop)停/button button classbtn idright ontouchstartsendCmd(right) ontouchendsendCmd(stop) onmousedownsendCmd(right) onmouseupsendCmd(stop)→/button button classbtn iddown ontouchstartsendCmd(backward) ontouchendsendCmd(stop) onmousedownsendCmd(backward) onmouseupsendCmd(stop)↓/button /div p速度: input typerange idspeed min0 max100 value50 onchangeupdateSpeed() span idspeedVal50/span%/p script let currentSpeed 0.5; function sendCmd(cmd) { fetch(/cmd/ cmd, {method: POST}); } function updateSpeed() { let slider document.getElementById(speed); let val slider.value; document.getElementById(speedVal).textContent val; currentSpeed val / 100.0; fetch(/speed/ currentSpeed, {method: POST}); } /script /body /html app.route(/) def index(): return render_template_string(CONTROL_HTML) app.route(/cmd/command, methods[POST]) def handle_command(command): 处理控制命令 if motor_left and motor_right: if command forward: motor_left.forward() motor_right.forward() motor_left.speed(current_speed) motor_right.speed(current_speed) elif command backward: motor_left.backward() motor_right.backward() motor_left.speed(current_speed) motor_right.speed(current_speed) elif command left: motor_left.speed(current_speed * 0.3) # 差速转弯 motor_right.speed(current_speed) motor_left.forward() motor_right.forward() elif command right: motor_left.speed(current_speed) motor_right.speed(current_speed * 0.3) motor_left.forward() motor_right.forward() elif command stop: motor_left.stop() motor_right.stop() return OK app.route(/speed/float:s, methods[POST]) def set_speed(s): 设置全局速度 global current_speed current_speed s # 这里可以同步更新电机的当前速度 return OK if __name__ __main__: # 注意在生产环境中不要使用debugTrue并且要指定host0.0.0.0以允许网络访问 app.run(host0.0.0.0, port5000, debugFalse, threadedTrue)运行这个脚本后在电脑浏览器输入http://你的Edison IP:5000就能看到一个简单的方向键控制界面。按下按键发送命令松开即停止。这实现了最基本的远程遥控。4.2 与微信小程序联动的构想从你提供的热词来看你对微信小程序开发很感兴趣。让Edison四驱车与微信小程序联动是一个更酷、更实用的方向。完整的实现涉及小程序前端、后端服务器和Edison端三部分这里我勾勒出技术路径和关键点1. 架构设计小程序端提供UI界面虚拟摇杆、按钮、视频流显示等。后端服务器可选但推荐由于Edison可能位于内网且需要处理用户认证、消息转发等一个公网的云服务器如腾讯云、阿里云的小型主机作为中继是更稳定的方案。服务器运行WebSocket服务如使用Node.js的ws库或Python的websockets。Edison端作为WebSocket客户端连接到后端服务器接收控制指令并可以上传传感器数据或视频流如果接了摄像头。2. 关键技术点通信协议使用WebSocket实现全双工、低延迟的实时通信。相比HTTP轮询WebSocket更适合实时控制场景。内网穿透如果无公网服务器这是最大的挑战。可以让Edison主动连接到一个有公网IP的服务器反向连接或者使用内网穿透工具如frp、ngrok。注意必须使用合法合规的内网穿透服务绝对禁止使用任何违规手段访问网络。视频流传输如果Edison连接了USB摄像头可以使用MJPG-streamer或GStreamer在Edison上搭建一个视频流服务器。小程序端可以通过live-player组件拉取RTMP或HLS流或者通过WebSocket传输经过压缩的JPEG帧。小程序开发涉及canvas绘制虚拟摇杆、WebSocketAPI通信、live-player播放视频等。需要申请小程序相关权限如网络、多媒体。3. 一个简化的数据流示例用户在小程序上移动虚拟摇杆生成{x, y}坐标数据。小程序通过WebSocket将坐标数据发送到公网后端服务器。后端服务器将数据转发给已连接的Edison WebSocket客户端。Edison上的Python程序解析坐标将其转换为左右电机的速度指令例如x控制转向差速y控制前进速度。电机驱动模块执行指令小车运动。这个方案将项目提升到了物联网应用的层面涵盖了前端、后端、嵌入式全栈技术挑战很大但完成后的成就感也极高。5. 调试、优化与实战中的“坑”理论很美好现实很骨感。下面分享一些我在实际搭建和调试中遇到的典型问题及解决方案希望能帮你少走弯路。5.1 电源噪声与系统稳定性问题现象小车在电机启动或高速运行时Edison会无故重启或Wi-Fi断开连接。根因分析电机尤其是碳刷电机是巨大的噪声源。启动瞬间的浪涌电流和碳刷换向产生的电磁干扰会通过电源线和空间辐射两种途径干扰微控制器。解决方案电源隔离如前所述逻辑电源与动力电源分离是最有效的措施。使用独立的降压模块为Edison供电。电源滤波在电机驱动模块的电源输入端VMOT和GND之间并联一个大容量电解电容如470uF-1000uF/16V和一个小容量陶瓷电容0.1uF用于吸收低频和高频噪声。信号隔离在电机驱动模块的控制信号线AIN1 AIN2 PWMA等上串联一个100-220欧姆的电阻可以一定程度上抑制噪声回灌。更彻底的方法是使用光耦隔离模块但会复杂一些。物理隔离尽量让电机、驱动模块远离Edison和传感器。使用屏蔽线或双绞线连接电机。5.2 循迹传感器误判与PID参数整定问题现象小车在循迹时左右摇摆振荡或者冲出弯道。根因分析摇摆是比例系数Kp过大系统反应过激冲出去是Kp过小或积分系数Ki不足无法及时修正偏差。调试心得先P再I最后D这是PID调试的口诀。先将Kd和Ki设为0逐渐增大Kp直到小车出现轻微但稳定的振荡。此时Kp值为临界值Ku。经典Ziegler-Nichols法根据KuKp 0.6 * KuKi 2 * Kp / PuPu是振荡周期Kd Kp * Pu / 8。这是一个起点仍需微调。实战简化法对于四驱车这样的快速系统很多时候只用PD控制效果就很好。Kp负责快速响应偏差Kd抑制振荡和过冲。可以先调一个能基本循迹的Kp然后慢慢加入Kd观察过弯是否更平滑。传感器预处理对传感器读数进行软件去抖连续多次采样一致才确认和滑动平均滤波能有效减少因赛道污渍或光线变化导致的误判。5.3 机械结构与程序控制的耦合问题问题现象程序逻辑正确但小车跑不直或者转向不对称。根因分析世界上没有两个完全一样的电机和车轮。即使给左右轮相同的PWM占空比它们的实际转速也可能因为电机性能差异、轮子摩擦阻力不同、装配公差而不同。解决方案程序校准写一个校准程序让小车在光滑地面上直线前进一段距离测量其实际偏移。然后计算出一个电机补偿系数。例如如果总是右偏则在控制右轮速度时乘以一个略小于1的系数如0.95。left_speed_corrected target_speed * left_compensation_factor right_speed_corrected target_speed * right_compensation_factor增加编码器反馈这是终极解决方案。给电机加装编码器形成闭环控制。程序以编码器反馈的实际转速为目标进行PID控制可以精确保证两轮速度一致彻底解决跑偏问题。这需要更多的GPIO口用于读取编码器脉冲和更复杂的代码但控制精度有质的飞跃。5.4 无线控制的延迟与断连问题现象通过Wi-Fi控制时指令响应慢或者突然失控。根因分析家庭Wi-Fi环境复杂可能存在干扰TCP协议本身的握手和重传机制也会带来延迟Edison的Wi-Fi模块性能有限。优化建议使用UDP代替TCP对于实时控制这种允许少量丢包但对延迟敏感的场景UDP是更好的选择。你可以在Flask服务器中使用socket库创建UDP服务小程序端通过wx.sendSocketMessage发送UDP数据包。优化网络环境让Edison和控制器手机/电脑连接在同一个5GHz Wi-Fi频段下干扰较少。避免距离路由器过远或有厚墙阻隔。心跳与重连机制在Edison和小程序/服务器端实现心跳包机制。如果超过一定时间未收到心跳则触发安全停止程序并尝试重新建立连接。指令合并与预测在小程序端可以对控制指令进行适当的“节流”不是每个微小移动都发送而是以固定频率如每秒20次发送当前状态。在Edison端如果偶尔丢包可以基于上一包的数据进行短时预测保持运动连贯。6. 项目总结与无限可能的扩展回顾整个“决战四驱车”项目它远不止是让一个玩具车动起来。它是一次完整的嵌入式智能硬件开发实践涵盖了从硬件电路设计、机械结构改造、嵌入式Linux系统操作、传感器数据采集、电机控制算法PID、到网络通信应用Web服务器、WebSocket乃至前端交互的广泛领域。这个项目最宝贵的价值在于其高度的可扩展性。你现在拥有的是一个基于Linux的、可联网的、带有强大I/O能力的移动机器人平台。在此基础上你可以尽情发挥创意视觉导航添加一个USB摄像头使用OpenCV进行图像识别实现颜色跟踪、人脸跟随、手势识别控制。SLAM建图结合超声波、红外传感器甚至激光雷达如RPLidar A1尝试在室内进行简单的同步定位与地图构建。集群协作制作多辆小车让它们通过Wi-Fi相互通信实现编队行驶、协同搬运等。物联网数据采集在小车上安装温湿度、空气质量传感器让它成为一个移动的环境监测站将数据上传到云平台如阿里云IoT、ThingsBoard进行可视化。竞技与娱乐回归“四驱车”的竞技本质举办一场真正的“智能四驱车大赛”比试谁的循迹算法更快、更稳谁的避障逻辑更聪明。从我个人的实操体验来看最大的挑战往往不是代码本身而是硬件世界的“不完美”——电机的差异、传感器的噪声、供电的波动、机械的松动。这些都需要你放下纯软件的思维拿起万用表、电烙铁和螺丝刀耐心地测试、调整、迭代。每一次解决一个棘手的硬件问题看到小车按照你的指令稳健地跑起来那种跨越物理与数字世界的成就感是纯软件项目无法给予的。所以别再犹豫找出一辆尘封的四驱车入手一块Edison或类似的开发板如Raspberry Pi Zero 2 W开始你的“决战”吧。从让轮子转起来开始每一步都会遇到新的问题而每一个问题的解决都会让你离那个“智能移动平台”的梦想更近一步。这场决战没有终点只有不断延伸的、充满乐趣的技术前沿。

本月热点