树莓派从购买到基本输入输出

最近比较空 闲的没事 想搞搞硬件 因为是软件工程 硬件硬件相关的不太了解 虽然二级专业是信息工程 有dsp的课程 但是dsp太复杂了。。搞不懂。。。当时学的云里雾里 实验课拿到板子也完全不知道搞啥 而且板子也是相当专业的数字信号处理器 其实有点想学嵌入式专业的一些基础的课程 51开发板啊汇编语言啊什么的 可惜没有机会 于是心血来潮 最近想搞个板子玩玩 自己搞个智能玩具什么的

强烈建议没有linux使用经验先去研究一些linux相关的知识和操作再来 因为本文从安装到使用基本都是在命令行下进行的

购买

板子很多 但是对初学者来说 选择不多 树莓派相比51这些 算是比较容易学习使用的了 51开发板因为没有系统 所以代码写完之后需要编译然后导入到板子上 而且开发的语言选择也不多 而树莓派可以安装平时熟悉的操作系统 所以开发成本降低了非常多 但是树莓派还是有点贵 而且配件也贵 听说国产有个兼容树莓派的 orange pi的。。。 感兴趣的可以试试看 嗯嗯 还有国产龙芯的板子 也可以一试有机会 为了方便 还是直接买树莓派了 买的时候有坑 只有裸板 连电源都没有 另外的配件注意几个点

  1. 电源:可选,安卓充电头的输出是5V/1A的 树莓派3b需要5V/2A (具体的要求要看具体板子型号的信息) 实测直接使用没有问题 不过据说当板子接太多外设的时候可以会造成电量不足 一般情况下是没有问题的 初学者不买问题也不大 为了以防万一可以买
  2. tf卡:必须,板子的系统是安装在tf卡,建议8G以上,有的系统安装完之后可能会很大
  3. hdmi线:建议,因为非常意外,加粗一下,本来以为安装之后可以直接用了结果遇到坑了 结果系统安装完成之后打开板子连不上ssh 才意识到sshd服务是没有自动启动的 远程根本连不上 最后连上显示器搞定 不过我猜测是和系统相关的 可能有的系统是默认sshd服务打开的 官方的RASPBIAN是没有默认开启的 具体后面安装系统讲
  4. 开发用外设: 建议,购买开发者入门套件,买树莓派不搞硬件你买个卵子 最烦买树莓派安装了ubuntu 然后当作远程下载工具或者当站点用的了 那你tm别买树莓派啊 如果只是把树莓派当小型服务器用的建议把树莓派卖了吧 我买了一块集合了各种功能的板子 nxez 我买的板子官网上还没上线 不过差不多 有8个led 4位数字显示屏 一个2位开关 一个蜂鸣器 一个继电器 还有其他好几个东西 对初学来说非常棒
  5. 开发无关外设:随意,盒子,散热器,面包板,杜邦线等,看个人喜好和实际情况 因为安装了这些后会占用空间 如果板子接口没有做扩展的话 不一定能和开发用外设一起安上

安装系统

安装系统是个坑 系统挺多 官方的非官方的 本来想安装ubuntu的 结果ubuntu官网出问题了 就安装了官方的RASPBIAN JESSIE LITE 2016-11-25 这个是无桌面版本的 如果安装有桌面版本(RASPBIAN JESSIE WITH PIXEL)的话 上面的hdmi先就有用处了 无所谓

官方教程是使用dd命令进行刻盘 具体方法不多说 其实我挺不想用这个的

刻完之后会发现 tf卡只有几十兆 其他空间不可读 这个可读的部分是系统的配置文件

除了直接安装系统外 官网还给了NOOBS这个工具来安装系统 下载下来解压 把东西全复制到tf卡上 不需要刻录 插树莓派上就能直接打开 不过这个工具是GUI的 需要外接显示器 跟着它可以安装配置系统 但是这个安装的系统是要现场下载的 不方便 也有个带了raspbian的版本 看心情选择吧 挺大的 据说还可以用这个工具自己自定义一个系统 具体可以查一下其他资料

配置环境

系统是raspbian 基于debian的 软件安装非常方便 国内也有源http://mirrors.aliyun.com/raspbian/

这个系统默认不自启动ssh server 需要在运行rasp-config里设置开机启动 坑啊。。。以为默认开启的结果怎么也连不上 估计可以修改tf卡上的配置 让它能自启动 可惜我不知道 所以这时候就只能接显示器了

系统自带python2&3 自带了操作的库 如果使用python的话就不需要配置了 我用的是nodejs 之后的操作主要使用wiring-pi这个库 所以也没啥系统级的需要配置的 不过要注意的是 这个库需要root权限运行 所以node要安装到全局环境 如果使用其他库应该是不需要的

开发

基本知识 – gpio

gpio
就是那一排40pin的接口 具体其实只有两种 1. 电源: 3.3V,5V,接地(GND) 2. 可编程GPIO,

其中有几个口可以支持特殊的功能:(以下内容具体什么意思我也不懂,哈哈哈哈哈信息工程白学了)

  • TxD/RxD是一组,串口通讯用的,
  • SDA/SCL是一组,IIC协议通讯用的,
  • MOSI、MISO、SCLK, CE0, CE1, 是SPI通讯协议用的,
  • 某几个口支撑pwm,脉冲输入输入,没有特殊标记,不知道有哪些

因为各种说明图里都是把这几个单独标了功能名的 刚开始的时候误以为这几个特殊的不能用来普通的 如果只用来简单的输入输出 这些GPIO接口都是等价的

基本知识 – 接口编号

有三种接口编号方式,1. GPIO BCM 2. wiringPi 3. board: 物理编号 挺乱的 一般来说各种库都是支持三种编号的 自己统一使用一种就可以了 很少直接使用物理编号

基本操作 – 输出

有个坑,高电平不一定表示开,有可能低电位才表示开 具体要看情况

直接上代码好了

1
2
3
const wpi = require('wiring-pi');   // 使用这个库来操作GPIO
wpi.setup("gpio"); // 使用 GPIO BCM编码方式
wpi.digitalWrite(18, 1); // 端口18输出高电平

基本操作 – 输入

输入也有坑

1
2
3
4
5
6
const wpi = require('wiring-pi');
wpi.setup("gpio");
wpi.pinMode(18, wpi.INPUT); // 设置18端口为输入端口
wpi.pullUpDnControl(18, wpi.PUD_DOWN); // 设置18端口默认输入为低电平,关于pull-up 和 pull-down搞不太清楚 大概是设置一个初始状态的吧应该
// 在合适的地方,如果没有设置初始状态,直接读取数值是无法确定的
let input = wpi.digitalRead(18); // 从18端口读取电平状态

读取的时候坑来了 有输入的时候是没有事件通知的 所以唯一的办法就通过轮询不停地获取输入的状态 一旦有变化就向外通知 举个例子,比如这样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//随手写了一个 js 版循环。。。。  还挺好用
function whileTrue(fn, time = 0) {
let fnPro = new Promise(r => setTimeout(fn, time, r));
return fnPro.then(ret => ret && whileTrue(fn, time));
}
const pin = 18;
wpi.pullUpDnControl(pin, wpi.PUD_DOWN);
let lastInputRaw = 0;
whileTrue((next) => {
let inputRaw = wpi.digitalRead(pin);
if (lastInputRaw !== inputRaw) { // 如果有变化
// TODO
lastInputRaw = inputRaw;
}
next(true);
}, 10);

基本操作 – 其他

  1. PWM脉冲输出 自己研究吧 某几个端口可以直接硬件脉冲输出 对于其他不支持硬件直接输出的 可以用基本的输出来模拟的啊(Soft PWM)
  2. SPI, 不懂
  3. I2C/IIC,不懂
  4. 串口/Serial,不懂
  5. 其他

开发套件上手

研究完基本的输入输出 开发套件上的 小led灯啊 4位显示屏啊 蜂鸣器啊 开关啊 什么的 完全都不是问题了 因为几个都是基本的gpio输入输出的东西 大不了就是逻辑复杂一点 特别是4位显示屏 实际上用起来的时候才发现有坑 (之前学逻辑电路学过 但是忘了) 建议可以先看一下它的电路结构 因为它一次只能显示一个数字 要显示不同的数字的话 得非常快的不停循环 让人眼以为是同时显示的


大概两三天后续:不要买开发套件了,非常坑,功能太少,价格还贵,建议自己直接买小元件,直接买十几个LED,买个面包板,开关,杜邦线,数字显示屏,还可以买一些传感器,温度距离之类的,都非常便宜,一个元件就三四块钱,比开发套件性价比高太多了,led几分钱一个,杜邦线和开关几毛钱一个。开发套件买了之后功能太少太少了,基本的输入输出会了之后就没什么用了。