树莓派刷机
1.下载镜像树莓派的镜像
2.下载SDFormatter
若你的SD卡是使用过的,建议需进行格式化(使用 SDFormatter),然后再使用。
3.安装Win32 Disk Imager
可选择1.0的版本,有显示镜像安装需多少时间。选择write,进行写入,时间显示5-10分钟,说明你的镜像文件是好的,若显示是四五十分钟说明你的文件是损坏的,需重新下载。
树莓派登录
2.1 HDMI视频线 连接到显示器
2.2 串口
2.2.1设备破解
默认情况,树莓派的串口和蓝牙连接。
想办法断开蓝牙连接,把串口用来数据通信
参考文章:https://blog.csdn.net/syjsxxjy/article/details/80774262
主要修改下面两处地方:
2.3
默认账号:pi
默认密码:raspberry
2.4 通过网络登录树莓派(ssh)
参考文章:https://blog.csdn.net/qq_36760780/article/details/82016711
2.4.1.sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
Nano是文档编辑器,已进入便可以编写。
Ctrl+o 保存,会有提示是否写入。我们按回车。Ctrl+x退出
2.4.2.添加下面代码,ssid为wifi名称,psk为密码
sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
network={
ssid="wifipig"
psk="123456789"
}
2.4.3.固定树莓派的ip地址
1.sudo nano /etc/rc.local
2.添加ifconfig wlan0 固定的IP
3.树莓派打开ssh功能
sudo raspi-config
4.用终端工具登陆树莓派(推荐Xshell)
2.5图形方式登录树莓派
sudo apt get install xrdp
windows用“远程桌面连接”自带软件登录
树莓派换源
因为树莓派默认的源是国外的,使用apt-get 安装会失败,我们换成国内的源
参考文章:https://blog.csdn.net/Liu_959185/article/details/86636906
1.编辑sources.list
sudo nano /etc/apt/sources.list
用#注释或直接删除原有的内容(也可以自己换其他的源),新增两条:
deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi
#deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi
ctrl+x 保存并退出。
2. sudo apt-get update更新源
树莓派Wiringpi库
参考文章:https://www.cnblogs.com/lulipro/p/5992172.html
Wiringpi库API大全:http://t.csdn.cn/b9vhF
wiringPi是树莓派IO控制库,使用C语言开发,提供了丰富的接口:GPIO控制,中断,多线程,等等
在使用wiringPi库时,需要包含头文件 #include<wiringPi.h>
查看版本: gpio -v(没有的话需要安装)
查看GPIO:gpio readall
硬件初始化函数:(选择一种函数初始化即可)
int wiringPiSetup (void) 返回:执行状态,-1表示失败
**当使用这个函数初始化树莓派引脚时,程序使用的是wiringPi 引脚编号表。引脚的编号为 0~16,需要root权限**
int wiringPiSetupGpio (void) 返回执行状态,-1表示失败
**当使用这个函数初始化树莓派引脚时,程序中使用的是BCM GPIO 引脚编号表。需要root权限**
使用wiringPi库编译要加-lwiringPi
树莓派超声波使用
超声波测距原理:是在超声波发射装置发出超声波,它的根据是接收器接到超声波时的时间差,与雷达测距原理相似。 超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。
以上时序图表明你只需要提供一个10uS以上脉冲触发信号,该模块内部将发出8个40KHz周期电平并检测回波。一旦检测到有回波信号则输出回响信号。回响信号的脉冲宽度与所测的距离成正比。由此听过发射信号到的回响信号时间间隔可以计算得到距离。
- 公式:uS/58=厘米或者uS/148=英寸
- 距离=高电平时间*声速(340M/S)/2
- 建议测量周期为60 ms以上,以防止发射信号对回响信号的影响。 `
该结构体是Linux系统中定义,struct timeval结构体在time.h中的定义为
struct timeval
{
__time_t tv_sec; /* Seconds. */
__suseconds_t tv_usec; /* Microseconds. */
};
tv_sec为Epoch到创建struct timeval时的秒数,tv_usec为微秒数,即秒后面的零头。比如当前我写博文时的tv_sec为1244770435,tv_usec为442388,即当前时间距Epoch时间1244770435秒,442388微秒。
超声波测距源代码
#include <wiringPi.h>
#include <stdio.h>
#include <sys/time.h>
#define Trig 4 //触发
#define Echo 5 //回应
void ultrasonic_wave_Init(void)
{
pinMode(Echo, INPUT);//检测波什么时候发什么时候回来设置端口为输入
pinMode(Trig, OUTPUT);//触发脉冲设置端口为输出
}
float disMeasure(void)//测距原理
{
struct timeval tv1;
struct timeval tv2;
long start, stop;
float dis;
digitalWrite(Trig, LOW);//先让脉冲处于低平稳
delayMicroseconds(2);
digitalWrite(Trig, HIGH);//再拉高
delayMicroseconds(10); //发出超声波脉冲,脉冲在空气中传播1过程中,Echo会维持高电平,所以我们只需要Echo变上升沿的时间(start)和下降沿的时间(stop)即可
digitalWrite(Trig, LOW);//拉低至平稳
while ((digitalRead(Echo) != 1)); //Echo低电平啥也不做,变高电平时获取开始时间
gettimeofday(&tv1, NULL); //获取当前时间,开始接收到返回信号的时候
while (!(digitalRead(Echo) == 0)); //当Echo高电平时啥也不做,变低电平时获取结束时间
gettimeofday(&tv2, NULL); //获取当前时间,最后接收到返回信号的时候
start = tv1.tv_sec * 1000000 + tv1.tv_usec; //微秒级的时间,开始发波的时间
stop = tv2.tv_sec * 1000000 + tv2.tv_usec;//波返回来的时间
dis = (float)(stop - start) / 1000000 * 34000 / 2; //计算时间差求出距离
return dis;
}
int main(void)
{
float dis;//用来存放测试的距离
if (wiringPiSetup() == -1) { //硬件端口初始化
printf("setup wiringPi failed !");
return -1;
}
ultrasonic_wave_Init();//调用超声波函数
while (1) {//不断地测距
dis = disMeasure();
printf("distance = %0.2f cm\n", dis);
delay(1000);
}
return 0;
}
树莓派串口通信与语言模块的使用
参考:https://www.cnblogs.com/lulipro/p/5992172.html
串口通信部分
注意:初次使用树莓派串口编程,需要配置
/* 修改 cmdline.txt文件 */
>cd /boot/
>sudo vim cmdline.txt
删除【】之间的部分
dwc_otg.lpm_enable=0 【console=ttyAMA0,115200】 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
/*修改 inittab文件 */ 这步没有这个文件就不需要做
>cd /etc/
>sudo vim inittab
注释掉最后一行内容:,在前面加上 # 号
#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
sudo reboot 重启
demo:简单的树莓派与PC的通信
#include <stdio.h>
#include <wiringSerial.h>
#include <stdlib.h>
int main()
{
int cmd;
int fd; //Linux 的思想是:将一切IO设备,都看做 文件,fd就是代表串口抽象出来的文件
if((fd = serialOpen("/dev/ttyAMA0",9600))==-1) //初始化串口,波特率9600
{
printf("open serial error\n");
exit(-1);
}
serialPuts(fd,"hello\n");
while(1){
if(serialDataAvail(fd) >= 1){ //如果串口缓存中有数据
cmd = serialGetchar(fd);
if(cmd == '1'){
serialPuts(fd,"get 1\n");
printf("111111\n");
}
if(cmd == '2'){
serialPuts(fd,"get 2\n");
printf("222222\n");
}
}
}
return 0;
}