连接树莓派

共享网络

电脑共享网络给树莓派的方式,经常会遇到树莓派连不上网的问题

解决方法:

  1. 将wifi断开,先将树莓派通过以太网口进行连接,然后在连接wifi
  2. 将wifi共享网络关闭,然后在打开,让树莓派重新连接

使用VNC连接

地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。

1
arp -a

可以查看所有的局域网ip和mac地址的对应关系。
1
hostname -I

查看本机的局域网ip地址。

远程桌面

树莓派安装远程桌面,并解决远程登录蓝屏的问题

首先需要安装xdrp,按照下面操作安装。

1
2
3
sudo apt-get update //更新一下
sudo apt-get install xrdp //建立远程桌面插件
sudo service xrdp restart //用来启动服务

安装完成后在windows上使用远程桌面连接就可以远程登录树莓派了。

1.执行下面代码,删除两个文件目录。

注意:pi 替换为自己的用户名!!!

1
2
sudo gpasswd -d pi video
sudo gpasswd -d pi render

2.执行命令,进行系统设置。

1
sudo raspi-config

依次选择进入System options -> Boot / Auto Login -> Desktop GUI, requiring user to login

注:记得断开显示屏连接。如果想切换回显示屏连接,请上述重复第二步,最后选择Desktop GUI, auto login

树莓派引脚编码

板载编码

  • BCM编码 - Python
  • WiringPi编码 - C语言

注: 使用T型拓展版采用的BCM编码,

终端串口查看引脚编号

方式一:查看板载编码

1
piuout

方式二:查看全部编码
1
gpio readall

实验一 点亮LED灯

发光二极管,长的引脚接正极,短的引脚接负极

方式1
直接通过终端命令进行控制
从内核空间找到引脚直接控制gpio引脚

1
2
3
4
5
6
7
8
9
10
11
# 步骤一:选定GPIO引脚
cd /sys/class/gpio # 进入gpio目录
ls
echo 引脚编码 > export # 执行之后该目录下会增加一个引脚文件

# 步骤二:使用GPIO开始控制
cd 新增的目录gpio目录中
echo out > direction # 设置输出方向
echo 1 > value # 输出高电平
echo 0 > value # 输出低电平


方式二:使用python语言和C语言进行代码控制

方式三:命令行控制

1
2
gpio -g write 4 1
gpio -g write 4 0 # 设置管脚为低电平

PWM调制

直流电机的无极调速,开关电源、逆变器,输出不同的模拟电压

  1. PWM的频率:在1秒钟内,信号从高电平到低电平再回到高电平的次数,也就是说一秒钟PWM有多少个周期,单位Hz
  2. PWM的周期:T=1/f,T是周期,f是频率。
  3. 占空比:是一个脉冲周期内,高电平的时间与整个周期时间的比例,单位是%

通过改变IO口输出的方波的占空比,从而获得使用数字信号模拟成的模拟电压信号。占空比为50%那就是高电平时间一半,低电平时间一半。在一定的频率下,就可以得到模拟的2.5V输出电压。那么75%的占空比,得到的电压就是3.75V

一般人眼睛对于80Hz以上刷新频率则完全没有闪烁感。由于频率很高时看不到闪烁,占空比越大LED越亮,占空比越小LED越暗。

在电机控制中,电压越大,电机转速越快,而通过PWM输出不同的模拟电压,便可以使电机达到不同的输出转速。

蜂鸣器

蜂鸣器是音频信号装置,蜂鸣器可分为有源蜂鸣器和无源蜂鸣器。有源蜂鸣器直接接上额定电源就可以连续发声;而无源蜂鸣器则和电磁扬声器一样,需要接在音频输出电路中才能周期性地振动发声。

有源蜂鸣器内置振荡源,所以通电时会发出声音。但无源蜂鸣器没有这种内置振荡源,所以如果使用直流信号,他不会发出轰鸣声;相反,你需要使用频率在2k到5k之间的方波来驱动它。由于有内置振荡电路,所以有源蜂鸣器通常比无源蜂鸣器昂贵。

将两个蜂鸣器的引脚朝上,你可以看到带有绿色电路板的引脚是一个无源蜂鸣器。而另一个带有黑色塑料外壳,而不是电路板的蜂鸣器是有源蜂鸣器。

buzzerkind.png

bluzzerCompose.png

无源蜂鸣器

使用无源蜂鸣器,只要输出不同频率的PWM波,即可发出不同的音符。不同的音符组合起来就是一个曲子了。

音阶是音乐必不可少的要素,主要由声音的频率决定。通过给蜂鸣器不同频率的音频脉冲,可以产生不同的音阶,而要产生某频率的音频脉冲,最简单的办法是以该音频的频率除以2的值,函数ChangeFrequency(Frequency)使用该值为参数改变蜂鸣器输入方波信号的频率,蜂鸣器上就可发出该频率的声音。

若想改变音阶,只需要改变频率即可。下表为各音调音符频率对照表,据此可产生不同音阶的音符。“#”表示半音,用于上升或下降半个音,乘以2就提升该声音一个8度音阶,减半则降一个8度。

节拍:若要构成音乐,光有音阶是不够的,还需要节拍,也就是音符持续时间的长短,一般用拍数表示。至于1拍是多少秒,没有严格的规定,只要节拍适宜,声音悦耳即可。假如某首歌曲的节奏是每分钟120拍,那么1拍为0.5 s,1/4拍为0.125 s,以此类推可得到其他节拍对应的时长。这样,利用不同的频率,加上与拍数对应的延时,就构成了乐曲。

串口(UART)

采用串行通信方式的扩展接口

数据位一位一位的按照顺序传送

优点:

  • 通信线路简单,只要一对传输线就可以实现双向通信能够大大降低了成本,适
    用于远距离通信。

缺点:

  • 传送速度较慢。

树莓派3/4b的外设一共包含两个串口:

1
2
一个称是硬件串口(/dev/ttyAMAO)
一个是mini串口(/dev/ttyS0)

硬件串口由硬件实现,有单独的波特率时钟源,性能高、可靠;

mini串口性能低,功能也简单

在树莓派上,引脚8(发送)和引脚10(接收)是作为主串口的收发端,

引脚8,被叫做TXD(Transmit Data)

脚10,被称为RXD(Receive Data)

树莓派串口:

  • 主串口———>可以通过引脚实现通讯
  • 辅助串口—>不能使用GP1O引脚通信默认被分配给蓝牙端

注意:默认情况下,mini串口是禁用的,无论将它指定为主UART还是辅助UART。

1
2
3
4
5
Linux device      Description
/dev/ttyS0 mini UART mini串口
/dev/ttyAMA0 first PL011 (UARTO) 硬件串口
/dev/serial0 primary UART 主串口
/dev/serial1 secondary UART 辅助串口

步骤:

  1. 使用命令ls /dev -al查看串口打开情况

  2. 打开mini URAT

    miniurat.png

    在首选项-interfaces将serial port设置为开启,将serial console 设置为关闭,重启,这样mini串口就打开了

    serialport.png

  3. 将硬件串口设置为主串口

    1
    sudo nano /boot/config.txt

    在文件末尾添加上

    1
    2
    dtoverlay=pi3-miniuart-bt
    force_turbo=1

    主串口.png

  4. 安装minicom串口助手 sudo apt-get install minicom,电脑使用XCOM串口调试软件

  5. 连接杜邦线——1.接地引脚连接 2. USB转TTL的RXD引脚与树莓派的第八个引脚连接 3.将USB转TTL的TXD引脚与树莓派第十个引脚连接 4.插入电脑

  6. 运行minicom minicom -D /dev/ttyAMA0 -b 9600

  7. 打开电脑串口助手,选择串口,波特率为9600,就可以发送了

继电器

继电器的工作原理很简单。当继电器供电时,电流开始流经控制线圈,结果电磁体开始通电。然后衔铁被吸引到线圈上,将动触点向下拉,从而与常开触点连接,所以带负载的电路通电。然后断开电路会出现类似的情况,因为在弹簧的作用下,动触头将被拉到常闭触点。这样,继电器的接通和断开可以控制负载电路的状态。

relay.png

将SIG连接到Raspberry Pi,发送一个高电平给SIG,晶体管通电,并且继电器的线圈通电,因此,继电器的常开触点闭合,继电器的常闭触点将脱离公共端口。向SIG发送低电平的信息,晶体管将断开,继电器将恢复到初始状态。

relayprinciple.png

开关按键

有多种方式将GPIO的输入导入到程序中,polling( 轮询 )式 和 interrupt( 中断 )式( edge detection 边缘检测 ),“轮询”式如果程序在错误的时间读取值,可能会错过输入。我们这里采用中断式。

如果您没有将输入引脚连接到任何东西,它将“浮动”。换句话说,读取的值是未定义的,因为它没有连接到任何东西,直到你按下按钮或开关。它可能会由于接收电源干扰而改变很大的值。

为了解决这个问题,我们使用一个向上拉或向下拉电阻器。这样,就可以设置输入的默认值。可以使用硬件或者软件实现上下拉电阻。在硬件方式中,常常在输入通道与3.3V(上拉)或0V(下拉)之间使用10K电阻。GPIO模块允许您在编程中这样配置:

1
2
3
GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_UP)
# or
GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

我们很多时候并不关心电平值, 而关心电平从低到高,或从高到低的变化(如编码器测速/按键按下弹开等), 为避免主程序忙于其它事情错过引脚的电平改变, 有两种方式:

1
2
wait_for_edge() 函数 
event_detected() 函数

wait_for_edge()函数是为了阻止程序的执行,直到检测到边缘为止。换句话说,等待按钮按下的示例可以改写成:

1
GPIO.wait_for_edge(channel, GPIO.RISING)

注意检测的边缘参数有 GPIO.RISING, GPIO.FALLING , GPIO.BOTH (上升沿, 下降沿 或 升降沿), 这样用几乎不占用CPU,如果你只希望在确定的时间段内查询,可以使用 timeout 参数:

1
2
3
4
5
6
# wait for up to 5 seconds for a rising edge (timeout is in milliseconds)
channel = GPIO.wait_for_edge(channel, GPIO_RISING, timeout=5000)
if channel is None:
print('Timeout occurred')
else:
print('Edge detected on channel', channel)

event_detected()函数被设计用来与其他事物一起在循环中使用, 不同于polling轮询, 它不会在CPU忙于处理其他事物时错过输入状态的变化。 这使得使用Pygame 或 PyQt 时非常有用,因为其中有一个主循环监听和及时响应GUI事件的基础。

只要检测到指定参数的边缘事件(上升沿, 下降沿 或 升降沿)发生时,调用GPIO.event_detected(channel)的值就为”ture”(真)。

1
2
3
4
5
#Note that you can detect events for GPIO.RISING, GPIO.FALLING or GPIO.BOTH.
GPIO.add_event_detect(channel, GPIO.RISING) # add rising edge detection on a channel
do_something()
if GPIO.event_detected(channel):
print('Button pressed')

不过需要自己新建一个线程去循环检测event_detected()的值,还算是比较麻烦的。

可采用另一种办法轻松检测状态,这种方式是直接传入一个回调函数:GPIO通过在add_event_detect()函数中添加callback参数,RPI.GPIO为回调函数运行第二个线程。这意味着回调函数可以与主程序同时运行,以立即响应边缘。

1
2
3
4
5
6
def my_callback(channel):
print('This is a edge event callback function!')
print('Edge detected on channel %s'%channel)
print('This is run in a different thread to your main program')
GPIO.add_event_detect(channel, GPIO.RISING, callback=my_callback)
# 这里添加了回调函数callback这个参数,就不需要GPIO.event_detected(channel)函数了

如果你想要不止一个回调函数:

1
2
3
4
5
6
7
def my_callback_one(channel):
print('Callback one')
def my_callback_two(channel):
print('Callback two')
GPIO.add_event_detect(channel, GPIO.RISING)
GPIO.add_event_callback(channel, my_callback_one)
GPIO.add_event_callback(channel, my_callback_two)

请注意,在这种情况下,回调函数是按顺序运行的,而不是并发的。这是因为只有一个线程用于回调,其中每个回调都按照它们被定义的顺序运行。

由于存在开关抖动(用示波器可以看到),每次按下开关会调用多次回调函数,这不是我们希望的,有两种方式处理开关抖动:

  1. 在开关两个引脚之间添加一个0.1uF的电容
  2. 软件消抖
  3. 二者结合使用
    使用软件消抖时, 给回调函数添加一个弹跳时间的参数( bouncetime= ), 弹跳时间(参照单片机可以为10~20ms)在ms级别, 下面的程序用200ms来消抖:
    1
    2
    # add rising edge detection on a channel, ignoring further edges for 200ms for switch bounce handling
    GPIO.add_event_detect(channel, GPIO.RISING, callback=my_callback, bouncetime=200)

你的程序可能不希望用边缘检测了,可以停止它们:

1
GPIO.remove_event_detect(channel)