精华内容
下载资源
问答
  • 树莓派代码

    2018-10-18 13:27:08
    树莓派代码压缩包,里面有各种项目的实战源代码,从基础到综合的各项应用。
  • 霍加皮 Okavango15 的树莓派代码
  • 电赛滚球控制系统树莓派代码 基础加发挥部分 图像二值化后,提取最大色块获得坐标即为小球坐标 只提取图像中间部分,避免外界非平板部分干扰 串口通信用的ttyUSB0口,直接一根数据线和stm32的串口1相连就可以了 连接...

    电赛滚球控制系统树莓派代码

    基础加发挥部分
    图像二值化后,提取最大色块获得坐标即为小球坐标
    只提取图像中间部分,避免外界非平板部分干扰
    串口通信用的ttyUSB0口,直接一根数据线和stm32的串口1相连就可以了
    连接屏幕可以展示效果,但也许有时候展示效果会耗时,建议到时候注释掉展示部分

    #获取圆圈坐标并用串口通信将坐标r送到stm32进行处理
    # -*- coding: utf-8 -*
    import serial
    import time
    import cv2 
    import numpy as np
    
    cap = cv2.VideoCapture(0)
    lower_red=np.array([156,43,46])
    upper_red=np.array([180,255,255])
    
    def DisBall(x,y,r,frame):
        cv2.circle(frame, (x,y) , r , (0, 255, 0), 2)
        cv2.circle(frame, (x,y) , 2 , (0, 0, 255), 3)
        return frame
    
    def Binary_Get_Ball(frame,show,area,thr):
        cropped = frame[area[0]:area[1], area[2]:area[3]]  #(上,下)(左,右)
        gray_img = cv2.cvtColor(cropped, cv2.COLOR_BGRA2GRAY)#图像灰度化
        ret,thresh=cv2.threshold(gray_img,thr[0],thr[1],cv2.THRESH_BINARY)
        thresh=255-thresh
    
        cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]  #轮廓检测
        #如果存在轮廓  
        if len(cnts) > 0:  
            #找到面积最大的轮廓  
            c = max(cnts, key = cv2.contourArea)  
            #确定面积最大的轮廓的外接圆  
            ((center_x, center_y), radius) = cv2.minEnclosingCircle(c)  
            if (show==True): 
                cv2.circle(cropped, (int(center_x), int(center_y)), int(radius), (0, 255, 255), 2)  
                cv2.circle(cropped, None, 5, (0, 0, 255), -1)
            print('红色色块的中心坐标',(int(center_x),int(center_y)))
        else:
            center_x=0
            center_y=0
            radius=0
        return center_x,center_y,radius,cropped
    
    if __name__=="__main__":
        # 打开串口
        ser = serial.Serial("/dev/ttyUSB0", 9600, timeout=0.2)
        #剪切区域(上,下)(左,右)
        area=[40,435,155,540]
        #二值化阈值
        thr=[80,255]
    
        time1=time.time()
        while(1):
            ret, frame = cap.read()
            #得到小球坐标
            x,y,r,frame=Binary_Get_Ball(frame,show=True,area=area,thr=thr)
    
            time_change=time.time()-time1
            time_change=int(time_change*1000)
            print('time:'+str(time_change).rjust(3,'0'))
    
            #展示画圆效果
            x=int(x)
            y=int(y)
            r=int(r)
            frame = DisBall(x,y,r,frame)
    
            send_data='#'+str(x).rjust(3,'0')+str(y).rjust(3,'0')+str(time_change).rjust(3,'0') #起始标志'#',圆心的x和y
            ser.write(send_data.encode("utf8"))
            print(send_data)
            if (x==0 and y==0 and r==0):
                pass
            else:
                time1=time.time()
    
            # 展示图片
            cv2.imshow("capture", frame)
            if cv2.waitKey(1) & 0xFF == ord('q'):
                # 存储图片
                cv2.imwrite("camera.jpg", frame)
                break
    
        if ser != None:
            ser.close()
        cap.release()
    cv2.destroyAllWindows()

    发挥题其他:追光者(追踪红色激光)

    #获取圆圈坐标并用串口通信将坐标r送到stm32进行处理
    # -*- coding: utf-8 -*
    import serial
    import time
    import cv2 
    import numpy as np
    
    cap = cv2.VideoCapture(0)
    lower_red=np.array([156,43,46])
    upper_red=np.array([180,255,255])
    
    def DisBall(x,y,r,frame):
        cv2.circle(frame, (x,y) , r , (0, 255, 0), 2)
        cv2.circle(frame, (x,y) , 2 , (0, 0, 255), 3)
        return frame
    
    def Binary_Get_Point(frame,show,area,thr,thr1):
        cropped = frame[area[0]:area[1], area[2]:area[3]]  #(上,下)(左,右)
        gray_img = cv2.cvtColor(cropped, cv2.COLOR_BGRA2GRAY)#图像灰度化
        ret,thresh=cv2.threshold(gray_img,thr[0],thr[1],cv2.THRESH_BINARY)
        ret,thresh1=cv2.threshold(gray_img,thr1[0],thr1[1],cv2.THRESH_BINARY)
        thresh=255-thresh
    
        cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]  #轮廓检测
        cnts1 = cv2.findContours(thresh1.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]  #轮廓检测
        #如果存在轮廓  
        if len(cnts) > 0:  
            #找到面积最大的轮廓  
            c = max(cnts, key = cv2.contourArea)  
            #确定面积最大的轮廓的外接圆  
            ((center_x, center_y), radius) = cv2.minEnclosingCircle(c)  
            if (show==True): 
                cv2.circle(cropped, (int(center_x), int(center_y)), int(radius), (0, 255, 255), 2)  
                cv2.circle(cropped, None, 5, (0, 0, 255), -1)
            print('小球的中心坐标',(int(center_x),int(center_y)))
        else:
            center_x=0
            center_y=0
            radius=0
        #如果存在轮廓  
        if len(cnts1) > 0:  
            #找到面积最大的轮廓  
            c1 = max(cnts1, key = cv2.contourArea)  
            #确定面积最大的轮廓的外接圆  
            ((center_x1, center_y1), radius1) = cv2.minEnclosingCircle(c1)  
            if (show==True): 
                cv2.circle(cropped, (int(center_x1), int(center_y1)), int(radius1), (0, 255, 255), 2)  
                cv2.circle(cropped, None, 5, (0, 0, 255), -1)
            print('激光的坐标',(int(center_x1),int(center_y1)))
        else:
            center_x1=0
            center_y1=0
            radius1=0
        return center_x,center_y,radius,center_x1,center_y1,radius1,cropped
    
    if __name__=="__main__":
        # 打开串口
        ser = serial.Serial("/dev/ttyUSB0", 9600, timeout=0.2)
        #剪切区域(上,下)(左,右)
        area=[40,435,155,540]
        #二值化阈值
        thr=[80,255]
        thr1=[200,255]
    
        time1=time.time()
        while(1):
            ret, frame = cap.read()
            x,y,r,x1,y1,r1,frame=Binary_Get_Point(frame,show=True,area=area,thr=thr,thr1=thr1)
                
    
            time_change=time.time()-time1
            time_change=int(time_change*1000)
            print('time:'+str(time_change).rjust(3,'0'))
    
            #展示画圆效果
            x=int(x)
            y=int(y)
            r=int(r)
            x1=int(x1)
            y1=int(y1)
            r1=int(r1)
    
            frame = DisBall(x,y,r,frame)
            frame = DisBall(x1,y1,r1,frame)
    
            send_data='#'+str(x).rjust(3,'0')+str(y).rjust(3,'0')+str(time_change).rjust(3,'0') #起始标志'#',圆心的x和y
            ser.write(send_data.encode("utf8"))
            print(send_data)
            send_data='$'+str(x1).rjust(3,'0')+str(y1).rjust(3,'0')+str(time_change).rjust(3,'0')
            ser.write(send_data.encode("utf8"))   
            print(send_data)     
    
            if (x==0 and y==0 and r==0):
                pass
            else:
                time1=time.time()        
            # 展示图片
            cv2.imshow("capture", frame)
            if cv2.waitKey(1) & 0xFF == ord('q'):
                # 存储图片
                cv2.imwrite("camera.jpg", frame)
                break
    
        if ser != None:
            ser.close()
        cap.release()
    cv2.destroyAllWindows()
    展开全文
  • 请先实现树莓派入门前三章内容,然后学习本章内容下载安装pycharm1:pycharm专业版下载,只有专业版有远程python解释器的功能。虽然收费,但这是在我国啊,哈哈。2:破解pycharm专业版配置远程python解释器1:打开...

    请先实现树莓派入门前三章内容,然后学习本章内容

    下载安装pycharm

    1:pycharm专业版下载,只有专业版有远程python解释器的功能。虽然收费,但这是在我国啊,哈哈。

    2:破解pycharm专业版

    配置远程python解释器

    1:打开pycharm,新建一个新项目,进入Create New Project, 点击解释器的小齿轮,如图所示:


    2:点击进入add Remote界面,配置ssh连接信息,如图所示:

    3:点击确定后,pycharm会上传一些文件,等待上传完只要几分钟时间,如图所示:


    4:点击图中红框按钮,设置代码在树莓派上的工作区:


    5:点击确定后,pycharm会上传工作目录文件至树莓派并且也会下载树莓派的文件资源至本地,如图所示:


    初次使用可能有个十几分钟,请耐心等待。

    6:完成后,进度条将消失,没有错误消息提示,可以在左侧项目栏查看树莓派相关实现的外部 libraries,如图所示:


    真的很方便,强大的ide!!!

    写个例子:

    1:写个打印的hello world,如图所示:


    每次写完代码,pycharm都会自动上传代码文件至树莓派工作区域(开始设置的工作目录)

    2:点击上述图片的红框处 运行代码,结果如下图所示:


    3:点击箭头所指可以调试代码,ide 断点调试不细说了。具体操作看GIF图:



    远程执行树莓派上需要root权限的python程序

    需要root权限的才能起的程序:flask服务,蓝牙ble

    1:新建sudo 脚本文件

    在树莓派上新建一个脚本文件命名为python_sudo.sh,输入以下内容:

    #!/bin/bash
    sudo /usr/bin/python "$@"

    2:让python_sudo.sh文件可执行,在控制台输入以下命令

    chmod +x python-sudo.sh

    3:配置pycharm

    进入到如图示界面File ->Settings  ->Project Interpreter


    点击右侧远程解释器的小齿轮的show all按钮,进入如图示界面:


    将解释器的地址换成刚才写好的脚本文件的路径,保存即可.


    展开全文
  • 这个项目小博将分为十个部分来介绍,其中有openrov,北路鹅绒女,自己鲁的系统的ROV ,大家不要心急,我承诺让每个人都可以组装出自己的ROV,其中主要为架子的安装,软件的调试,源代码的挂出,硬

    小博最近一直在从事ROV的研究,目前对这一块还是多少有一些了解的。先说一下我个人的整体看法吧!后期小编将结合图像处理技术,如何实现图像在线计算,检测以及博客前面文章谈到的网页控制电机,实时去雾算法等等。。。这个项目小博将分为十个部分来介绍,其中有openrov,bluerov,自己鲁的系统的ROV ,大家不要心急,我承诺让每个人都可以组装出自己的ROV,具体部分博客若来不及更新,资料请加入https://ru nsglob el.com/ (去掉空格,大家手动输入),群号618836913,也可以联系小编邮箱1039463596@qq.com 大家可以一起讨论如何改进,其中主要为架子的安装,软件的调试,源代码的挂出,硬件(电机电调桨)的选择,机械部分的结构,我都会统统他说明白,那下面开始吧,Rov这个东西其实不难,比较麻烦的是密封,防水等工作,而非一些技术性工作(所谓技术性工作就是算法,人工智能等)。现在供玩家玩的Rov,基本模式是这样的,Rov在水下跑,岸上有个电脑,电脑有个客户端,或者是用浏览器看水下的视频,同时,岸上还有手柄或者键盘控制Rov运动状态。总体来说,控制上比较简单,顶多是一个PID,但是,想要控制的特别好也不是一件简单的事情。lz想法是以Rov作为载体,做一些更高端的东西,比如说加上计算机视觉,路径规划,地形地貌探测等!OK!闲话先扯那么多,今天先讲讲它的构成部分和整体框架吧,直入正题–BlueRov!
    下面我们看一下特的构成:
    这里写图片描述

    国内对BlueRov教程不多,下面我分享一下,我的调试过程! BlueRov框架是树莓派+pixhawk+传感器!
    图示如下:
    硬件需要:树莓派,pixhawk,USB连接线(连接pixhawk和树莓派),网线一根,电脑一台(作为主 机),电池 手柄,三个电调以及三个电机(以便调试使用)等

    这里写图片描述

    软件需要:ardusub-raspbian.img(官方的树莓派镜像,我试图自己配环境,结果在bluerov论坛上,官方有人跟我讲直接用他们的就行,不要瞎搞了),QGroundControl(安装到主机上),ArduSub V3.5(烧到pixhawk的固件,专门针对rov的固件,rov模式可选,有三电机,四电机,六电机等)。
    大家看看我的成品吧,特别霸气哦。。。
    这里写图片描述
    正面图:
    这里写图片描述

    再来一张:
    这里写图片描述

    展开全文
  • 早期树莓派项目代码plm
  • mfrc522 树莓派C代码

    2018-07-27 21:32:25
    mfrc522 树莓派C代码 自己按代码链接设备或修改代码中的io
  • 树莓派实验代码Python.zip
  • 树莓派 树莓派相关代码项目
  • 树莓派人脸识别代码

    2018-04-22 20:50:12
    树莓派python人脸识别代码,通过树莓派命令行运行.py程序,从而识别出图片中的人脸并用框框出来
  • 树莓派人脸检测代码——gc
  • 树莓派
  • 手机蓝牙控制树莓派,文件包含树莓派代码以及手机端App(IOS和Android)
  • 树莓派io驱动代码

    2020-07-20 22:40:57
    树莓派io口驱动代码1.关于树莓派io口的寄存器2.寄存器地址问题3.驱动层编写4.应用层代码编写5.编译和验证驱动 1.关于树莓派io口的寄存器 GPFSEL0 GPIO Function Select 0 功能选择输出/输入 GPSET0 GPIO Pin Output...

    1.关于树莓派io口的寄存器

    在这里插入图片描述
    GPFSEL0 GPIO Function Select 0 功能选择输出/输入
    GPSET0 GPIO Pin Output Set 0 输出0
    GPSET1 GPIO Pin Output Set 1 输出1
    GPCLR0 GPIO Pin Output Clear 0 清0

    在这里插入图片描述
    GPFSEL0 gpio功能选择寄存器 32位每三位一起控制一个io口
    pin4就是GPFSEL0组的第四个12-14位为000 则为输入 001则为输出
    第0组为FSEL0-9 第1组为FSEL10-19
    在这里插入图片描述
    Pin4指的是BCM 而不是gpio4,在wiringPi库里是7脚
    在这里插入图片描述
    GPSET0 GPIO Pin Output Set 1 输出1
    0=no effect
    1=set gpio pin n
    在这里插入图片描述
    GPCLR0 GPIO Pin Output Clear 0 清0
    0=no effect
    1=clear gpio pin n
    可以用下边的网址查io对应的寄存器 但有些寄存器不对应0…0
    https://pinout.xyz/pinout/pin11_gpio17

    2.寄存器地址问题

    我们在编写驱动程序的时候,IO空间的起始地址是0x3f000000,加上GPIO的偏移量0x2000000,所以GPIO的物理地址应该是从0x3f200000开始的,然后在这个基础上进行Linux系统的MMU内存虚拟化管理,映射到虚拟地址上。
    在这里插入图片描述
    该图的尾部偏移是对的根据GPIO的物理地址0x3f200000可以知道:
    GPFSEL0 0x3f200000
    GPSET0 0x3f20001c
    GPCLR0 0x3f200028

    3.驱动层编写

    #include <linux/fs.h>
    
    #include <linux/module.h>
    
    #include <linux/init.h>
    
    #include <linux/device.h>
    
    #include <linux/uaccess.h>
    
    #include <linux/types.h>
    
    #include <asm/io.h>
    
    static struct class *pin4_class;
    
    static struct device *pin4_class_dev;      
    
    static dev_t devno;                                                                                                                                //设备号
    
    static int major =231;                                                                                                                            //主设备号
    
    static int minor =0;                                                                                                                                 //次设备号
    
    static char *module_name="pin4";                                                                                               //模块名
    
    volatile unsigned int* GPFSEL0=NULL;                                                                                        //不会因编译器的优化而省略,每次直接读值
    
    volatile unsigned int* GPSET0=NULL;
    
    volatile unsigned int* GPCLR0=NULL;
    
    static int pin4_read(struct file *file,char __user *buf, size_t size, loff_t *ppos)
    
    {
    
          printk("pin4_read\n");
    
          return 0;
    
    }
    
    static int pin4_open(struct inode *inode,struct file *file)
    
    {
    
          printk("pin4_open\n");
    
          *GPFSEL0 &=~(0x6<<12);                                                                                                              //0x6  0110左移12位    取反后1001与上 结果为把bit1314配置成0
    
          *GPFSEL0 |=(0x1<<12);                                                                                                                  //把第12位配置成1        14~12位001输出000为输入 其中一共0~31位 
    
           return 0;
    
    }
    
    static ssize_t pin4_write(struct file *file,const char __user *buf,size_t count, loff_t *ppos)
    
    {
    
          int userCmd;
    
          printk("pin4_write\n");
    
          copy_from_user(&userCmd,buf,count);                                                                               //从上层获取函数的值第一个参数是一个char类型的指针const char __user *buf,用int也行
    
          if(userCmd==1)
    
          {
    
             printk("set 1\n");
    
             *GPSET0 |=0x1<<4;                                                                                                                      //0组的第四引脚置一
    
          }else if(userCmd==0)
    
          {
    
             printk("set 0\n");
    
             *GPCLR0 |=0x1<<4;                                                                                                                      //第四位置一让清零寄存器把第四引脚清零
    
          }else
    
          {
    
             printk("undo\n");
    
          }
    
          return 0;
    
    }
    
    static struct file_operations pin4_fops = {
    
       .owner = THIS_MODULE,
    
       .open  = pin4_open,
    
       .write = pin4_write,
    
       .read  = pin4_read,
    
    };
    
    
    
    int __init pin4_drv_init(void)                                                                                                                // 真实驱动入口
    
    {
    
        int ret;
    
        printk("insmod driver pin4 success\n");
    
        devno = MKDEV(major,minor);                                                                                                          // 2.创建设备号 
    
        ret   = register_chrdev(major, module_name,&pin4_fops);                                                  //3.注册驱动 告诉内核,把这个驱动加入到内核的链表中
    
        pin4_class=class_create(THIS_MODULE,"myfirstdemo");                                                   // 让代码在dev自动生成设备
    
        pin4_class_dev =device_create(pin4_class,NULL,devno,NULL,module_name);       //创建设备文件
    
        GPFSEL0=(volatile unsigned int *)ioremap(0x3f200000,4);                                                  //第一个参数真正的物理地址,第二个参数映射的大小  一个寄存器4个字节 4*8=32bit
    
        GPSET0=(volatile unsigned int*)ioremap(0x3f20001c,4);                                                     //由于返回值是void*型需要强制转换  void __iomem * __ioremap(unsigned long phys_addr, size_t size, unsigned long flags)
    
        GPCLR0=(volatile unsigned int*)ioremap(0x3f200028,4);                                                    //物理地址转换成虚拟地址
    
        return 0;
    
    }
    
    void __exit pin4_drv_exit(void)
    
    {
    
       iounmap(GPFSEL0);                                                                                                                                   //iounmap函数用于取消ioremap()所做的映射
    
       iounmap(GPSET0);
    
       iounmap(GPCLR0);
    
       device_destroy(pin4_class,devno);
    
       class_destroy(pin4_class);
    
       unregister_chrdev(major, module_name);                                                                                     //卸载驱动
    
    
    
    }
    
    
    
    module_init(pin4_drv_init);                                                                                                                      //入口,  内核加载驱动的时候,这个宏会被调用
    
    module_exit(pin4_drv_exit);
    
    MODULE_LICENSE("GPL v2");
    

    4.应用层代码编写

    #include  <sys/types.h>
    #include  <sys/stat.h>
    #include  <fcntl.h>
    #include  <stdio.h>
    int main()
    {
    	int fd;
    	int cmd;
    	int data;                                                                                            //与驱动代码保持一致 int userCmd
    	fd=open("/dev/pin4",O_RDWR);
    	if(fd<0)
    	{
    		printf("open failed\n");
    		perror("reson:");
    	}else{
    		printf("open success\n");
    	}
    	printf("input commnd : 1/0 \n1: pin4 high\n0: pin4 low\n");
    	scanf("%d",&cmd);
    	if(cmd==1)
    	{
    		data=1;
    	}
    	if(cmd==0)
    	{
    		data=0;
    	}
    	printf("data=%d\n",data); 
    	//fd=write(fd,&data,1);                                                                   第二个参数是内容 一个指针类型  第三个参数是文件大小如果文件是char 则为1 如果是int 则为sizeof(int)
    	fd=write(fd,&data,sizeof(int));
    }
    

    5.编译和验证驱动

    1.Makefile修改

    添加obj-m +=pin5driver2.o 下图是之前的文章pin4driver2.0
    在这里插入图片描述

    2.返回内核源码linux文件件进行模块编译

    在/home/yqh/SYSTEM/linux-rpi-4.14.y/中 输入
    ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make modules
    会在 home/lh/SYSTEM/linux-rpi-4.14.y/drivers/char 生成一个pin4drver2.ko的文件
    对pin4test.c编译生成pin4test
    arm-linux-gnueabihf-gcc pin4test.c -o realtest
    在这里插入图片描述

    3.将生成的pin4driver2.ko和realtest拷贝到树莓派

    scp drivers/char/pin4driver2.ko pi@192.168.3.16:/home/pi
    scp realtest pi@192.168.3.16:/home/pi

    4.在树莓派下加载内核驱动

    sudo insmod pin4driver2.ko
    lsmod查看驱动

    在这里插入图片描述
    对文件访问权限修改sudo chmod 666 /dev/pin4让所有用户均可读写后运行realtest
    在这里插入图片描述
    使用dmesg检索内核的printk查看打印信息
    在这里插入图片描述
    然后使用gpio readall查看io口状态
    在这里插入图片描述
    树莓派4引脚设置为输出1,程序驱动编写验证成功

    展开全文
  • 树莓派目标跟踪代码,加油,预祝学业有成,哦哦哦哦哦
  • 树莓派小车专栏的附属文件,主要内容是代码,包括安卓客户端的代码,小车的代码(语言为python),还附带了一个生成好的apk文件,可以尝试直接安装,不适用的话可以重新生成一个适用自己手机的版本。
  • 树莓派自动浇水代码 这是在树莓派上运行的最终代码,实现的功能是自动浇水并把相关数据写入文件 文章来源于sogeisetsu的GitHub。 如果喜欢欢迎fork和star树莓派云灌溉系统设计 用python2运行 # coding=UTF-8 #!/usr/...
  • 1.下载若干依赖项  请依次安装以下依赖项,...其实在树莓派中build-essential已经默认安装,但是cmake等其他内容仍需要手动安装。 sudo apt-get install build-essential sudo apt-get install
  • 树莓派Pi账户的密码忘记之后… 方法一: 打开终端,执行 sudo passwd root 接下来输入一个你为root账户设置的密码,然后再次输入确认 下一步执行 sudo passwd --unlock root su #输入刚才设置的密码即可以root账户...
  • 文章目录手机控制树莓派前期准备编译运行代码蓝牙配对总结 手机控制树莓派 前期准备 环境: 树莓派系统版本:2017-07-05-raspbian-jessie.img 安装wiringPi库:教程地址 IOS App:走你 Android App:走你(GOBLE_V2....
  • 这个是树莓派魔镜项目的源代码,我从github下载下来的。
  • 基于FLASK的WEB控制树莓派小车程序!MJPEG视频监控
  • 树莓派仪表盘源代码

    2018-12-14 22:36:19
    这是树莓派仪表盘的源代码,我从github下载回来的,送给上不了github的朋友
  • 树莓派SPI从机主机代码,里面使用BCM2835芯片。有原理图代码等等 树莓派SPI从机主机代码,里面使用BCM2835芯片。有原理图代码等等

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,330
精华内容 1,332
关键字:

树莓派代码