树莓派串口编程

树莓派串口编程

简单做个笔记记录一下串口编程的方法。

  1. 树莓派需要释放蓝牙所占用的的串口。
  2. 编辑/boot/config.txt 或者通过raspi-config启用串口(serial) ,编辑文件的话直接加入enable_uart=1 然后重启。
  3. 添加 dtoverlay = pi3-miniuart-bt 或者:dtoverlay = pi3-disable-bt

    基本思路

    操作示例代码

    • C 语言
      #include <stdio.h>
      #include <string.h>
      #include <errno.h>
      #include <wiringPi.h>
      #include <wiringSerial.h>
      int main ()
      {
      int serial_port ;
      char dat;
      if ((serial_port = serialOpen ("/dev/ttyS0", 9600)) < 0) /* open serial port */
      {
      fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno)) ;
      return 1 ;
      }
      if (wiringPiSetup () == -1)                   /* initializes wiringPi setup */
      {
      fprintf (stdout, "Unable to start wiringPi: %s\n", strerror (errno)) ;
      return 1 ;
      }
      while(1){   
      if(serialDataAvail (serial_port) )
      { 
      dat = serialGetchar (serial_port);      /* receive character serially*/ 
      printf ("%c", dat) ;
      fflush (stdout) ;
      serialPutchar(serial_port, dat);        /* transmit character serially on port */
        }
      }
      }

      编译测试

      gcc -o serialtest -lwiringPi serialtest.c 
      ./serialtest

      结果:

ESP32测试脚本

ESP32 测试脚本

Micropython

from machine import Pin
from time import sleep

leds = [13, 12, 14, 27, 26, 25, 33, 32, 23, 22, 21, 19, 18, 5, 16, 17, 4, 0, 2, 15 ]
try:
    while True:
        for i in range(len(leds)):
            print(leds[i])
            i = Pin(leds[i], Pin.OUT)
            i.on()
except KeyboardInterrupt:
    print("\nCtrl-C pressed.")

树莓派超声波测距

树莓派超声波测距

超声波传感器

就是传说中的Ultrasonic传感器,学名:HC-SR04 , 某宝上非常cheap, 自己搜.

测距原理

  • 超声波距离传感器设计为使用超声波来测量源与目标之间的距离。
  • 我们之所以使用超声波,是因为超声波在短距离内相对准确,并且不会引起人耳无法听到的干扰。

特性说明

HC-SR04是用于2cm至400cm距离非接触距离测量的常用模块。
它使用声纳(如蝙蝠和海豚)以高精度和稳定的读数来测量距离。
它由超声波发射器,接收器和控制电路组成。
发射器发射短脉冲,该短脉冲被目标反射并被接收器拾取。
计算超声波信号的发送和接收之间的时间差。
使用声速和“ 速度=距离/时间 ”等式,可以轻松计算源与目标之间的距离。

引脚说明

HC-SR04超声波距离传感器模块具有四个引脚:

  • VCC – 5V,输入电源

  • TRIG –触发输入

  • 回声 –回声输出

  • GND –接地

    实际工作原理

  • 1.向TRIG输入提供触发信号,它需要至少10μS持续时间的高电平信号。

  • 2.这使模块能够发送八个40KHz超声波脉冲串。

  • 3.如果模块前面有障碍物,它将反射那些超声波

  • 4.如果信号返回,则模块的ECHO输出将在发送和接收超声信号所花费的时间内保持为高电平。脉冲宽度的范围为150μS至25mS,具体取决于障碍物与传感器之间的距离,如果没有障碍物,则脉冲宽度约为38ms。

    接线方式

    非常关键的分压步骤

    ECHO输出为5v而Raspberry Pi GPIO的输入引脚的额定电压为3.3V,因此,无法将5V直接提供给不受保护的3.3V输入引脚,除非你想把树莓派干掉...
    因此,我们得使用分压电路,使用适当的电阻将电压降至3.3V。

    以下公式可用于计算电阻值,
    “ Vout = Vin x R2 /(R1 + R2)”
    这里我用的是常用的4.7K和10K电阻做的分压电路,中间抽头给树莓派GPIO引脚,安全可靠。

    连接实物模拟图

    画图软件是frizing, 不要再私信问我了...

    计算方法

  • 距离计算
    脉冲所花费的时间实际上是超声波信号往返的时间,而我们只需要一半的时间。因此,时间被视为时间/ 2。

  • 距离=速度时间/ 2
    而海平面声速= 343 m / s或34300 cm / s
    因此,距离= 17150
    时间(单位厘米)

*校准
为了获得准确的距离读数,可以使用尺子校准输出。在下面的程序中,添加了0.5 cm的校准。
你如果不想校准也可以尝试不加,就是大致有点儿偏移量。

测试代码:

import RPi.GPIO as GPIO                    #Import GPIO library
import time                                #Import time library
GPIO.setmode(GPIO.BCM)                     #Set GPIO pin numbering 

TRIG = 23                                  #Associate pin 23 to TRIG
ECHO = 24                                  #Associate pin 24 to ECHO

print "Distance measurement in progress"

GPIO.setup(TRIG,GPIO.OUT)                  #Set pin as GPIO out
GPIO.setup(ECHO,GPIO.IN)                   #Set pin as GPIO in

while True:

  GPIO.output(TRIG, False)                 #Set TRIG as LOW
  print "Waitng For Sensor To Settle"
  time.sleep(2)                            #Delay of 2 seconds

  GPIO.output(TRIG, True)                  #Set TRIG as HIGH
  time.sleep(0.00001)                      #Delay of 0.00001 seconds
  GPIO.output(TRIG, False)                 #Set TRIG as LOW

  while GPIO.input(ECHO)==0:               #Check whether the ECHO is LOW
    pulse_start = time.time()              #Saves the last known time of LOW pulse

  while GPIO.input(ECHO)==1:               #Check whether the ECHO is HIGH
    pulse_end = time.time()                #Saves the last known time of HIGH pulse 

  pulse_duration = pulse_end - pulse_start #Get pulse duration to a variable

  distance = pulse_duration * 17150        #Multiply pulse duration by 17150 to get distance
  distance = round(distance, 2)            #Round to two decimal points

  if distance > 2 and distance < 400:      #Check whether the distance is within range
    print "Distance:",distance - 0.5,"cm"  #Print distance with 0.5 cm calibration
  else:
    print "Out Of Range"                   #display out of range

测试

python3 ultrasonic_distance_detect.py

效果很明显。

总结

反射角度如果大于15度有可能会出现值不准,如果附近噪声很大也许会有干扰,其他的没啥,很简单的一个模块,可以结合树莓派或者别的设备做一个超声波控制音量的玩意儿,树莓派爬音乐网站,播放音乐,由超声波传感器来进行检测,距离小于多少就降低音量,否则就开大音量, 自己想办法玩儿吧! 转载记得标识出处!
谢谢观看,我是骑驴玩儿漂移,甩你三条街~ 白了个白~

Live555直播

树莓派上用 Live555 直播摄像头数据

最近在群里听到有朋友推荐使用 live555 来在树莓派上进行rtsp 服务器的搭建,非常简单做个记录防忘记.
Live555是一个开源的 C++源码编写的流媒体推流软件合集,功能好多,还咩有玩儿透彻,但是你也看得懂源码的.非常激动人心.

软件包下载

链接: http://www.live555.com/liveMedia/public/

通过命令解压并执行 makefile 的生成.

tar -xf live555-latest.tar.gz
cd live/
./genMakefiles linux

编辑当前目录下面的live/testProgs/testOnDemandRTSPServer.cpp

修改这部分内容:

树莓派上创建一个 fifo 文件,先进先出管道.

mkfifo /tmp/rpicam

然后编译并安装.

make 
sudo make install

进入 testProgs 目录执行二进制文件.

./testOnDemandRTSPServer &

树莓派开启摄像头并执行:

raspivid -rot 180 -o /tmp/rpicam -f -t 0

VLC 测试或者 opencv 测试:

  1. vlc 在打开网络流的URL 里面输入设备流地址: rtsp://192.168.3.20:8554/liv0 就可以观看了.
  2. 使用 opencv 打开,自己创建一个文件:
    如图,截图中缩进层级有点儿变化,主要看后面的代码.
    图为:

    代码走一波

    # get streaming video via opencv
    import cv2
    import numpy as np
    cap = cv2.VideoCapture("rtsp://192.168.3.20:8554/liv0")
    try:
    while True:
        ret, frame = cap.read()
        if ret == True:
            smallFrame = cv2.resize(frame, (480, 240))
    
            key = cv2.waitKey(1)
            if key == 27:
                break
            cv2.imshow("small size Frame", smallFrame)
    except KeyboardInterrupt:
    print("quit")
    cap.release()
    cv2.destroyAllWindows()

    执行查看:

    python3 streaming_get_from_opencv.py

    效果如图:

    好了,还有一个我在蘑菇云参加一个 piday4fun 的活动地址在: https://github.com/piday4fun

    还楞啥,燥起来吧!!!

    转发记得标明出处, 否则小心菊花万人捅~