树莓派配置 vim 支持 python 代码补全

首先在树莓派中安装vim:

sudo apt-get update
sudo apt-get install vim  

克隆rkulla 的pydiction项目到本地:

mkdir -p ~/.vim/bundle
cd ~/.vim/bundle
git clone https://github.com/rkulla/pydiction.git
cp -r ~/.vim/bundle/pydiction/after/ ~/.vim   # 这步非常关键

如果有新的软件包想要支持补全.例如 RPi.GPIO
那么先安装包

sudo apt-get -y install RPi.GPIO

然后进入目录
cd ~/.vim/bundle/pydiction/
python3 pydiction.py RPi.GPIO
就可以生成全新的 complete-dict 了.

配置.vimrc文件:
" 启用文件类型插件

filetype plugin on

" 配置pydiction插件路径

let g:pydiction_location = '~/.vim/bundle/pydiction/complete-dict'

" 设置pydiction补全菜单的高度,默认是8

let g:pydiction_menu_height = 20
set syntax on

wiringPi updated to 2.52 for the Raspberry Pi 4B

前言

不知道你卖树莓派4B了么?不知道你们是否尝试在树莓派4b上用wiringpi的库,反正是官方的不好用。
那么你该怎么办?

场景展示

  • 如果你用sudo apt -y install wiringpi, 然后执行gpio readall的时候,提示你OPPS, the libararies is fucked.
    那么你就赶紧卸载掉吧!

    sudo apt -y purge wiringpi
    hash -r 

    下载软件包并且安装

    cd /tmp
    wget https://project-downloads.drogon.net/wiringpi-latest.deb
    sudo dpkg -i wiringpi-latest.deb

    检查:

    gpio readall 
    gpio -v 

    正常显示

树莓派安装google拼音和录屏软件

今天在树莓派使用过程中要用到中文,以前都是全英文操作,现在突然要用中文,措手不及,赶紧装个软件。

  • 命令方式非常简单,打开一个终端然后输入:
    sudo apt-get install fcitx fcitx-googlepinyin fcitx-module-cloudpinyin fcitx-sunpinyin
    sudo reboot
    接着就可以看到桌面菜单上的键盘图标了,右击选择google输入法就好了。
    因为要做个视频,所以希望录下来桌面的操作情况,本来想用VNC,然后再电脑上录制,但是觉得直接在树莓派上录像也不是没有软件,遂尝试之。
    GOOGLE后发现各种软件太多了。
    这里逐一列出5个,共勉。

    Kazam

    Kazam可从Ubuntu存储库获得,支持ARM和PowerPC设备以及32位和64位,是一种高效的桌面视频捕获工具。
    Kazam能够录制全屏,所有桌面屏幕,单个窗口和桌面区域,还可以从扬声器和麦克风中捕获音频。

  • 安装方法:
    sudo apt-get install kazam

    然后kazam -f 试试,需要桌面环境才可以用。然而并不好用。
    继续尝试换了一个:

    Vokoscreen

    名字真TM怪,倭寇屏。。vokoscreen,发音难道是: "哇靠死可rain?" ????
    说明一下,这个是我用过的最好用的录屏软件没有之一。。。
    凭借简单的用户界面和丰富的功能,Vokoscreen是Linux的另一种屏幕录制选项。
    能够录制和流式传输您的桌面,您将需要一个高端游戏装备,以获得高清流媒体的好处。
    通过GitHub可以通过添加PPA通过命令行安装Vokoscreen。

  • 安装方法:
    sudo add-apt-repository ppa:vokoscreen-dev/vokoscreen
    sudo apt-get update
    sudo apt-get install vokoscreen

    Vokoscreen一旦安装完成就可以立即使用了。可以从整个桌面,窗口,区域或指针周围的指定放大率进行录制。
    这对于特写视频录制非常有用。可以选择视频和音频编解码器,同时还可以更改音频驱动程序,视频格式和帧速率。
    还可以在屏幕录制中包含网络摄像头中的素材,易于使用的按钮让您可以录制,停止,暂停和播放屏幕截图。
    唯一的缺陷是:需要密切关注文件大小!Vokoscreen总体上来说是一款非常方便的屏幕录制工具,易于设置和使用,老李在这里强烈
    最后一个是我不想尝试的,你们如果尝试了请告诉我好用不。

    SimpleScreenRecorder

    它可能称自己为“简单”,但这个应用程序实际上比这里列出的其他一些功能更多。
    启动后,您将看到一个屏幕,有很多选项。这些包括预期的全屏录制,录制选择,跟随光标,以及录制视频游戏录制GL的选项。
    为了节省时间,你还可以创建适合不同屏幕录制任务的配置文件。还可以录制音频,并通过“ 继续”按钮找到的后续屏幕更改视频类型。
    准备就绪后,点击开始录制 - 默认情况下,生成的视频将保存在你当前用户的主目录中。
    同样,如果您使用的是基于Ubuntu的发行版,则需要先安装PPA存储库,然后才能安装Simple Screen Recorder。

    sudo add-apt-repository ppa:maarten-baert/simplescreenrecorder
    sudo apt-get update
    sudo apt-get install simplescreenrecorder

    如果您正在运行64位系统并想要记录32位OpenGL应用程序,请安装:

    sudo apt-get install simplescreenrecorder-lib:i386

  • 差点儿忘记一个,老牌子的屏幕录制工具

    RecordMyDesktop

    适用于Linux的原始屏幕捕获工具RecordMyDesktop几乎可以在任何系统上运行,包括Raspberry Pi。
    虽然您可以通过命令行使用基本版本,但使用以下命令安装:

    sudo apt-get install recordmydesktop

    还可以使用该工具选择两个GUI前端,gtk-recordmydesktop和qt-recordmydesktop。

    安装完成后,这个简单的工具在高级菜单中提供了一些附加选项,以及选择整个窗口或仅选择部分的功能
    请记住在捕获后给它时间对视频进行编码。
    视频将输出到当前用户的主目录。

    结束语

    好了,到这里应该你已经有了自己的选择,那么就这样吧,我是骑驴玩儿漂移,青山常在,绿水长流,白了个白~

用树莓派制作gif动画

1. 安装树莓派摄像头,得是官方的。

2.更新系统安装imagemagick软件包:

sudo apt-get -y install imagemagick

 

然后;

raspistill -w 800 -h 600 -t 10000 -tl 2000 -o image%02d.jpg
convert -delay 10 -loop 0 image*.jpg animateMe.gif

默认情况下,相机拍摄的分辨率为3280×2464像素,分辨率为72 ppi(p ixels p er inch )。这非常大,因此图像处理时间会更长。在Raspistill中,可以通过说明宽度和高度来调整图像的大小。

  • -w -h 用于将图像大小调整为800 x 600像素
  • -t 表示整个过程花费的总时间(以毫秒为单位)
  • -tl  拍照的频率
  • -o 输出文件名
  • image%02d.jpg自动为带有图像的照片命名,并在右侧为生成的计数器添加两个空格例如:

    • image00.jpg
    • image01.jpg
    • image02.jpg

如果您觉得可拍摄超过99张照片,则可以创建3个甚至4个空格,这样您就可以使用图像%03d.jpg图像%04d.jpg保存数千张图像

convert 是来自ImageMagick的命令。此行将所有已保存的jpeg带有图像前缀,并将它们转换为动画GIF,延迟(-delay)为10/100秒。

-loop 0 表示GIF将永远循环。

树莓派结合ADC做个光敏感应的灯

其实没有什么想法,就是想把ADC用熟练了,这些小案例都是自己杜撰的,实际上没有那么多场景需要用,但是最近真的用在了智能浇花设备上,土壤湿度采样的传感器是模拟的,所以,可以用ADC秀一波操作。

步骤1:从https://www.raspberrypi.org/downloads/下载最新镜像,然后选择Raspbian。

步骤2:烧录镜像然后启动树莓派。 

步骤3:通过在终端中键入以下命令连接到Internet并更新系统:

sudo apt-get update 

sudo apt-get upgrade

Step4:将所有东西连接在一起然后打开你的树莓派,不知道为啥网上给树莓派起名字叫覆盆子,太tm难听了。raspberry就改成树莓不行么?

手绘电路图,看懂了就过,看不懂就自己学习一下再过。

接驳示意图,ADC的AIN1 通道采样。 

中间抽头给树莓派,采集信号信息。

下面的内容就是开始编程了,如果你喜欢用C,那么就这样,写个源码:

#include <stdio.h>      //include  system standard io header file

#include <stdlib.h>     // include system standard libraries header file

#include <linux/i2c-dev.h>   //include  i2c-dev header file

#include <sys/ioctl.h>          // include ioctl  header file 

#include <fcntl.h>                // include fcntl header file

#include <wiringPi.h>  // It's very important when you control GPIO, wiringPi header file

void main()

{

         wiringPiSetup();   // initializing the wiringPi's function

         // Define the pin's mode ,pinMode(PIN, DIRECTION); PIN refer to the GPIO name in wPi when you typing "gpio readall" you can find out the pin's name, usring the wPi column's data, direction can be INPUT and OUTPUT and so on, more information please read the /usr/include/wiringPi.h file.

         pinMode(29, OUTPUT);  // Physical Pin = 40, name is GPIO.29 and wPi name is 29, BCM 21.

       // Create I2C bus
        int file;
        char *bus = "/dev/i2c-1";
        if ((file = open(bus, O_RDWR)) < 0)
            {
                  printf("Failed to open the bus. n");
                  exit(1);
             }
       // Get I2C device, ADS1115 I2C address is 0x48(72)
       ioctl(file, I2C_SLAVE, 0x48);

      // Select configuration register(0x01)
      // AINP = AIN0 and AINN = AIN1, +/- 2.048V
      // Continuous conversion mode, 128 SPS(0x84, 0x83)
       char config[3] = {0};
       config[0] = 0x01;
       config[1] = 0xD4;
       config[2] = 0x83;
       write(file, config, 3);
       sleep(1);

       // Read 2 bytes of data from register(0x00)
       // raw_adc msb, raw_adc lsb
       char reg[1] = {0x00};
       write(file, reg, 1);
       char data[2]={0};
       if(read(file, data, 2) != 2)
          {
                printf("Error : Input/Output Error n");
           }
       else
           {
        // Convert the data
               int raw_adc = (data[0] * 256 + data[1]);
               if (raw_adc > 32767) 

                 {
                       raw_adc -= 65535;
                  }

          // Output data to screen
                 printf("Analog Data is: %d n", raw_adc);
                 if ( raw_adc > 3200 )
                    {
                         printf("Turn on LEDn");
                         digitalWrite(29, LOW);  // turn on the LED 
                     }
                 else
                     {
                         printf("Turn off LEDn");
                         digitalWrite(29, HIGH);  //turn off the LED
                      }
             }

}

然后编译和测试:

gcc -o adc   -lwiringPi  adc.c 

注意:gcc是编译工具,-o表示定义输出文件名,-lwiringPi表示需要使用wiringPi的库来完成编译代码。

编译后,您将在工作目录中获得名为sensor的二进制文件。 

只需使用此命令执行它:

while true

do

     ./adc 

done

如果你喜欢用python好吧,那么就更简单了。

直接用adafruit的ads1x15的代码改改就能用。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: Jacky.Li
# License: Public Domain

# Import the time module.
import time

# Import the ADS1x15 module.
import Adafruit_ADS1x15

# import the OS module
import os


# Create an ADS1115 ADC (16-bit) instance.
adc = Adafruit_ADS1x15.ADS1115()

# Choose a gain of 1 for reading voltages from 0 to 4.09V.
# Or pick a different gain to change the range of voltages that are read:
# - 2/3 = +/-6.144V
# - 1 = +/-4.096V
# - 2 = +/-2.048V
# - 4 = +/-1.024V
# - 8 = +/-0.512V
# - 16 = +/-0.256V
# See table 3 in the ADS1015/ADS1115 datasheet for more info on gain.
GAIN = 1

print('Reading ADS1115 values, press Ctrl-C to quit...')
# Main loop.
while True:
# Read all the ADC channel values in a list.
    values = [0]*4
    for i in range(4):
# Read the specified ADC channel using the previously set gain value.
        values[i] = adc.read_adc(i, gain=GAIN)
# Note you can also pass in an optional data_rate parameter that controls
# the ADC conversion time (in samples/second). Each chip has a different
# set of allowed data rate values, see datasheet Table 9 config register
# DR bit values.
#values[i] = adc.read_adc(i, gain=GAIN, data_rate=128)
# Each value will be a 12 or 16 bit signed integer value depending on the
# ADC (ADS1015 = 12-bit, ADS1115 = 16-bit).
# Print the ADC values.
    print(values[1]) # print analog data which detected via ADC's AIN1 port.

    if values[1] < 3000:
        os.system("gpio mode 29 out") # Change pin's direction as output.
        os.system("gpio write 29 1") # make pin 29 high level
    else:
        os.system("gpio mode 29 in") # Change pin's direction as input.
        os.system("gpio write 29 0") # make pin 29 low level
# Pause for half a second.

    time.sleep(0.25)

注意缩进。

运行看看效果;

python sensor.py 

 

嗯,就这样吧,开开脑洞就可以玩儿得更愉快。。哈哈, 白了个白~

 

 

树莓派ADC采样光敏电阻来做智能家居控制雏形

又是ADC,还是ADS1115的模块,16bit采样率,很适合做模拟采样。接驳方式:

原理图:

然后,刻录最新的raspbian镜像,可以从官方下载:https://www.raspberrypi.org/downloads/ 并将TF卡插回Raspberry Pi并打开电源。

请记住打开ssh服务并将你的Pi连接到互联网,以便我们可以下载并安装必要的软件包。

打开终端编辑一个文件:

sudo  vim.tiny   adc.c 

然后用下面的代码:

#include <stdio.h>                      // some header file, offer the function libs.

#include <stdlib.h>

#include <linux/i2c-dev.h>

#include <sys/ioctl.h>

#include <fcntl.h>

#include <unistd.h>        // very important, offer "read() and "write()" function

 

void main()               

{

    // Create I2C bus

    int file;

    char *bus = "/dev/i2c-1";   

    if ((file = open(bus, O_RDWR)) < 0)

    {

        printf("Failed to open the bus. n");

        exit(1);

    }

    // Get I2C device, ADS1115 I2C address is 0x48(72)

    ioctl(file, I2C_SLAVE, 0x48);

 

    // Select configuration register(0x01)

    // AINP = AIN1 and AINN = GND, +/- 2.048V

    // Continuous conversion mode, 128 SPS(0x84, 0x83)

    char config[3] = {0};

    config[0] = 0x01;

    config[1] = 0xD4;

    config[2] = 0x83;

    write(file, config, 3);

    sleep(1);

 

    // Read 2 bytes of data from register(0x00)

    // raw_adc msb, raw_adc lsb

    char reg[1] = {0x00};

    write(file, reg, 1);

    char data[2]={0};

    if(read(file, data, 2) != 2)

    {

        printf("Error : Input/Output Error n");

    }

    else

    {

        // Convert the data

        int raw_adc = (data[0] * 256 + data[1]);

        if (raw_adc > 32767)

        {

            raw_adc -= 65535;

        }

 

        // Output data to screen

        printf("Data: %d n", raw_adc);

       }


保存退出后编译:

gcc  -o adc  adc.c  -O3   &&  ./adc

执行后可以读取一次,用shell脚本简单调用一下,间隔0.2秒刷新,看看数据状态。

然后简单写个脚本检测抓拍并上传到我的博客后台的服务器,当然了,现在已经关闭了,怕不法分子看到乱上传东西,就这么个意思吧,你们理解了操作步骤就好。

然后把光敏电阻放在门夹缝的位置上,如果你没有回家,你家人没有回家,但是光敏电阻值发生了变化, 你就会收到一份邮件,拍到一个尝试盗窃的贼? 或者是一个不明飞行物?

有兴趣就试试看吧,白了个白~

 

 

树莓派通过ADC采样音量大小触发告警提示

有一个问题困扰我,当我制作视频时,如果被噪音干扰会导致失败,失败就得重新录,非常痛苦。

我想,如果有一个设备可以帮助我避免这个问题就好了,手里一堆很早以前买的树莓派,一堆。真的是一堆。

所以突然想到用ADC模块用语音传感器模块进行语音采样,然后通过调整阈值来显示文字或语音提示,让大家保持安静。 


首先,您需要这些组件来构建它。

1. Raspberry Pi 3B 或者3B+

2. 8GB Class 10 TF卡 

3. 5v / 2.5A电源 

4. 4CH 16位ADC For RPi (52pi.taobao.com有售)

5.面包板 没有就焊接~

6.语音传感器(模拟) 淘宝上几块钱可以买一堆。

7.大屏幕(电视机) 

8.跳线

步骤1:

下载最新Raspbian的镜像并将其刻录在TF卡上,建议用etcher这个工具,各种平台上都有它的安装包。

步骤2: 接线,语音采样的模块很便宜,所以基本上没有什么芯片在上面帮我做转换,但是我看到了比较器芯片,我这里不要数字信号,因为只有0和1的信号我无法判断音量的大小。

所以我选择了模块的模拟引脚,A0。 

然后因为AIN0 上面接了NTC,所以避开了AIN0 ,直接接在了AIN1 通道上面,就是黄色的线缆,然后供电用的是树莓派的3.3v, GND接树莓派。一切都很自然就搞定了。

当然为了方便展示我开专门插了一个0.91英寸的OLED,虽然这个项目里面没有用到。但是真的很好用,芯片就是ssd1306. 简单粗暴的很~

就像这样连接起来,上面有两个跳线帽,记得要接,一个是I2C地址的跳线帽,就是0x48的哪个, 还有一个是NTC接到AIN0通道的跳线帽,如果接通就可以通过NTC读取模拟的温度值了,实际上并不是温度,而是电压,要通过电压来进行换算的,后面再说这问题。

第3步:

将Raspberry Pi连接到互联网并更新软件,并安装名为“figlet”的软件, 当噪音等级的数量达到一个值的时候,它将被调出并显示“请TM安静!”,当然是显示在你的屏幕上,我觉得可以扩展的东西很多,可以加个超级功放, 然后搞个大功率的喇叭,提前录好声音,猛猛的一嗓子,直接让闹腾的家伙瞬间安静下来。

 

然后编写一个代码来采用adc:

编译一下:  

gcc -o adc adc.c

sudo cp adc  /bin/adc   为了方便使用,我就没有去修改PATH变量的内容,直接将编译出来的工具放在/bin下面了,方便我调用。

然后写个shell脚本,开机自动加载也比较方便。

vim.tiny  notify.sh

保存退出后,给文件执行权,然后测试一下。

chmod +x notify.sh

./notify.sh

对着麦克风来一嗓子,屏幕上应该是这样:

你还可以搞点儿别的什么,反正能够采集声音了,就达到了让树莓派采集ADC的消息的功能,非常方便弄别的项目,你可以自己看看,开开脑洞。

白了个白~